1
0

feat: improve store and model typing

This commit is contained in:
Dominik Pschenitschni
2022-07-21 00:42:36 +02:00
parent c9e85cb52b
commit 3766b5e51b
98 changed files with 1050 additions and 507 deletions

View File

@ -2,7 +2,11 @@ import {objectToCamelCase} from '@/helpers/case'
import {omitBy, isNil} from '@/helpers/utils'
import type {Right} from '@/models/constants/rights'
export default class AbstractModel {
export interface IAbstract {
maxRight: Right | null
}
export default class AbstractModel implements IAbstract {
/**
* The max right the user has on this object, as returned by the x-max-right header from the api.

View File

@ -1,12 +1,21 @@
import AbstractModel from './abstractModel'
import UserModel from './user'
import FileModel from './file'
import UserModel, {type IUser} from './user'
import FileModel, {type IFile} from './file'
import type {IAbstract} from './abstractModel'
export default class AttachmentModel extends AbstractModel {
export interface IAttachment extends IAbstract {
id: number
taskId: number
createdBy: UserModel
file: FileModel
createdBy: IUser
file: IFile
created: Date
}
export default class AttachmentModel extends AbstractModel implements IAttachment {
declare id: number
declare taskId: number
createdBy: IUser
file: IFile
created: Date
constructor(data) {

View File

@ -1,9 +1,13 @@
import AbstractModel from './abstractModel'
import AbstractModel, { type IAbstract } from './abstractModel'
export type AVATAR_PROVIDERS = 'default' | 'initials' | 'gravatar' | 'marble' | 'upload'
export type AvatarProvider = 'default' | 'initials' | 'gravatar' | 'marble' | 'upload'
export default class AvatarModel extends AbstractModel {
avatarProvider: AVATAR_PROVIDERS
export interface IAvatar extends IAbstract {
avatarProvider: AvatarProvider
}
export default class AvatarModel extends AbstractModel implements IAvatar {
declare avatarProvider: AvatarProvider
defaults() {
return {

View File

@ -1,6 +1,6 @@
import AbstractModel from './abstractModel'
import AbstractModel, { type IAbstract } from './abstractModel'
export default class BackgroundImageModel extends AbstractModel {
export interface IBackgroundImage extends IAbstract {
id: number
url: string
thumb: string
@ -9,6 +9,17 @@ export default class BackgroundImageModel extends AbstractModel {
authorName: string
}
blurHash: string
}
export default class BackgroundImageModel extends AbstractModel implements IBackgroundImage {
declare id: number
declare url: string
declare thumb: string
declare info: {
author: string
authorName: string
}
declare blurHash: string
defaults() {
return {

View File

@ -1,17 +1,31 @@
import AbstractModel from './abstractModel'
import UserModel from './user'
import TaskModel from './task'
import AbstractModel, { type IAbstract } from './abstractModel'
import UserModel, { type IUser } from './user'
import TaskModel, { type ITask } from './task'
export default class BucketModel extends AbstractModel {
export interface IBucket extends IAbstract {
id: number
title: string
listId: number
limit: number
tasks: TaskModel[]
tasks: ITask[]
isDoneBucket: boolean
position: number
createdBy: UserModel
createdBy: IUser
created: Date
updated: Date
}
export default class BucketModel extends AbstractModel implements IBucket {
declare id: number
declare title: string
declare listId: number
declare limit: number
declare tasks: ITask[]
declare isDoneBucket: boolean
declare position: number
createdBy: IUser
created: Date
updated: Date

View File

@ -1,8 +1,13 @@
import AbstractModel from './abstractModel'
import AbstractModel, { type IAbstract } from './abstractModel'
export default class CaldavTokenModel extends AbstractModel {
id: number
created: Date
export interface ICaldavToken extends IAbstract {
id: number;
created: Date;
}
export default class CaldavTokenModel extends AbstractModel implements ICaldavToken {
declare id: number
declare created: Date
constructor(data? : Object) {
super(data)

View File

@ -1,8 +1,13 @@
import AbstractModel from './abstractModel'
export default class EmailUpdateModel extends AbstractModel {
interface IEmailUpdate {
newEmail: string
password: string
}
export default class EmailUpdateModel extends AbstractModel implements IEmailUpdate {
declare newEmail: string
declare password: string
defaults() {
return {

View File

@ -1,11 +1,19 @@
import AbstractModel from './abstractModel'
export default class FileModel extends AbstractModel {
export interface IFile {
id: number
mime: string
name: string
size: number
created: Date
}
export default class FileModel extends AbstractModel implements IFile {
declare id: number
declare mime: string
declare name: string
declare size: number
created: Date
constructor(data) {
super(data)

View File

@ -1,19 +1,33 @@
import AbstractModel from './abstractModel'
import UserModel from './user'
import UserModel, { type IUser } from './user'
import {colorIsDark} from '@/helpers/color/colorIsDark'
const DEFAULT_LABEL_BACKGROUND_COLOR = 'e8e8e8'
export default class LabelModel extends AbstractModel {
export interface ILabel {
id: number
title: string
hexColor: string
description: string
createdBy: UserModel
createdBy: IUser
listId: number
textColor: string
created: Date
updated: Date
}
export default class LabelModel extends AbstractModel implements ILabel {
declare id: number
declare title: string
declare hexColor: string
declare description: string
declare createdBy: IUser
declare listId: number
declare textColor: string
created: Date
updated: Date
constructor(data) {
super(data)

View File

@ -1,9 +1,15 @@
import AbstractModel from './abstractModel'
export default class LabelTask extends AbstractModel {
interface ILabel {
id: number
taskId: number
labelId: number
}
export default class LabelTask extends AbstractModel implements ILabel {
declare id: number
declare taskId: number
declare labelId: number
defaults() {
return {

View File

@ -1,18 +1,31 @@
import AbstractModel from './abstractModel'
import UserModel from './user'
import AbstractModel, { type IAbstract } from './abstractModel'
import UserModel, { type IUser } from './user'
import {RIGHTS, type Right} from '@/models/constants/rights'
export default class LinkShareModel extends AbstractModel {
export interface ILinkShare extends IAbstract {
id: number
hash: string
right: Right
sharedBy: UserModel
sharedBy: IUser
sharingType: number // FIXME: use correct numbers
listId: number
name: string
password: string
created: Date
updated: Date
}
export default class LinkShareModel extends AbstractModel implements ILinkShare {
declare id: number
declare hash: string
declare right: Right
sharedBy: IUser
declare sharingType: number // FIXME: use correct numbers
declare listId: number
declare name: string
declare password: string
created: Date
updated: Date
constructor(data) {
// The constructor of AbstractModel handles all the default parsing.

View File

@ -1,28 +1,49 @@
import AbstractModel from './abstractModel'
import TaskModel from './task'
import UserModel from './user'
import type NamespaceModel from './namespace'
import {getSavedFilterIdFromListId} from '@/helpers/savedFilter'
import SubscriptionModel from '@/models/subscription'
import AbstractModel, { type IAbstract } from '@/models/abstractModel'
import TaskModel, { type ITask } from '@/models/task'
import UserModel, { type IUser } from '@/models/user'
import SubscriptionModel, { type ISubscription } from '@/models/subscription'
import type { INamespace } from '@/models/namespace'
export default class ListModel extends AbstractModel {
import {getSavedFilterIdFromListId} from '@/helpers/savedFilter'
export interface IList extends IAbstract {
id: number
title: string
description: string
owner: UserModel
tasks: TaskModel[]
namespaceId: NamespaceModel['id']
owner: IUser
tasks: ITask[]
namespaceId: INamespace['id']
isArchived: boolean
hexColor: string
identifier: string
backgroundInformation: any
isFavorite: boolean
subscription: SubscriptionModel
subscription: ISubscription
position: number
backgroundBlurHash: string
created: Date
updated: Date
}
export default class ListModel extends AbstractModel implements IList {
declare id: number
declare title: string
declare description: string
owner: IUser
tasks: ITask[]
declare namespaceId: INamespace['id']
declare isArchived: boolean
declare hexColor: string
declare identifier: string
declare backgroundInformation: any
declare isFavorite: boolean
declare subscription: ISubscription
declare position: number
declare backgroundBlurHash: string
created: Date
updated: Date
constructor(data) {
super(data)

View File

@ -1,11 +1,17 @@
import AbstractModel from './abstractModel'
import ListModel from './list'
import NamespaceModel from './namespace'
import ListModel, { type IList } from './list'
import type { INamespace } from './namespace'
export default class ListDuplicateModel extends AbstractModel {
export interface ListDuplicate {
listId: number
namespaceId: NamespaceModel['id']
list: ListModel
namespaceId: INamespace['id']
list: IList
}
export default class ListDuplicateModel extends AbstractModel implements ListDuplicate {
declare listId: number
declare namespaceId: INamespace['id']
list: IList
constructor(data) {
super(data)

View File

@ -1,17 +1,31 @@
import AbstractModel from './abstractModel'
import ListModel from './list'
import UserModel from './user'
import SubscriptionModel from '@/models/subscription'
import AbstractModel, { type IAbstract } from './abstractModel'
import ListModel, { type IList } from './list'
import UserModel, { type IUser } from './user'
import SubscriptionModel, { type ISubscription } from '@/models/subscription'
export default class NamespaceModel extends AbstractModel {
export interface INamespace extends IAbstract {
id: number
title: string
description: string
owner: UserModel
lists: ListModel[]
owner: IUser
lists: IList[]
isArchived: boolean
hexColor: string
subscription: SubscriptionModel
subscription: ISubscription
created: Date
updated: Date
}
export default class NamespaceModel extends AbstractModel implements INamespace {
declare id: number
declare title: string
declare description: string
owner: IUser
lists: IList[]
declare isArchived: boolean
declare hexColor: string
declare subscription: ISubscription
created: Date
updated: Date

View File

@ -1,10 +1,10 @@
import AbstractModel from '@/models/abstractModel'
import {parseDateOrNull} from '@/helpers/parseDateOrNull'
import UserModel from '@/models/user'
import TaskModel from '@/models/task'
import TaskCommentModel from '@/models/taskComment'
import UserModel, { type IUser } from '@/models/user'
import TaskModel, { type ITask } from '@/models/task'
import TaskCommentModel, { type ITaskComment } from '@/models/taskComment'
import ListModel from '@/models/list'
import TeamModel from '@/models/team'
import TeamModel, { type ITeam } from '@/models/team'
export const NOTIFICATION_NAMES = {
'TASK_COMMENT': 'task.comment',
@ -15,32 +15,32 @@ export const NOTIFICATION_NAMES = {
} as const
interface Notification {
doer: UserModel
doer: IUser
}
interface NotificationTask extends Notification {
task: TaskModel
comment: TaskCommentModel
task: ITask
comment: ITaskComment
}
interface NotificationAssigned extends Notification {
task: TaskModel
assignee: UserModel
task: ITask
assignee: IUser
}
interface NotificationDeleted extends Notification {
task: TaskModel
task: ITask
}
interface NotificationCreated extends Notification {
task: TaskModel
task: ITask
}
interface NotificationMemberAdded extends Notification {
member: UserModel
team: TeamModel
member: IUser
team: ITeam
}
export default class NotificationModel extends AbstractModel {
export interface INotification {
id: number
name: string
notification: NotificationTask | NotificationAssigned | NotificationDeleted | NotificationCreated | NotificationMemberAdded
@ -48,6 +48,16 @@ export default class NotificationModel extends AbstractModel {
readAt: Date | null
created: Date
}
export default class NotificationModel extends AbstractModel implements INotification {
declare id: number
declare name: string
declare notification: NotificationTask | NotificationAssigned | NotificationDeleted | NotificationCreated | NotificationMemberAdded
declare read: boolean
readAt: Date | null
created: Date
constructor(data) {
super(data)

View File

@ -1,9 +1,15 @@
import AbstractModel from './abstractModel'
export default class PasswordResetModel extends AbstractModel {
export interface IPasswordReset {
token: string
newPassword: string
email: string
}
export default class PasswordResetModel extends AbstractModel implements IPasswordReset {
token: string
declare newPassword: string
declare email: string
constructor(data) {
super(data)

View File

@ -1,8 +1,13 @@
import AbstractModel from './abstractModel'
import AbstractModel from '@/models/abstractModel'
export default class PasswordUpdateModel extends AbstractModel {
export interface IPasswordUpdate {
newPassword: string
oldPassword: string
}
export default class PasswordUpdateModel extends AbstractModel implements IPasswordUpdate {
declare newPassword: string
declare oldPassword: string
defaults() {
return {

View File

@ -1,7 +1,7 @@
import AbstractModel from '@/models/abstractModel'
import UserModel from '@/models/user'
import UserModel, { type IUser } from '@/models/user'
export default class SavedFilterModel extends AbstractModel {
export interface ISavedFilter {
id: 0
title: string
description: string
@ -15,7 +15,26 @@ export default class SavedFilterModel extends AbstractModel {
filterIncludeNulls: boolean
}
owner: any
owner: IUser
created: Date
updated: Date
}
export default class SavedFilterModel extends AbstractModel implements ISavedFilter {
declare id: 0
declare title: string
declare description: string
declare filters: {
sortBy: ('done' | 'id')[]
orderBy: ('asc' | 'desc')[]
filterBy: 'done'[]
filterValue: 'false'[]
filterComparator: 'equals'[]
filterConcat: 'and'
filterIncludeNulls: boolean
}
owner: IUser
created: Date
updated: Date

View File

@ -1,11 +1,20 @@
import AbstractModel from '@/models/abstractModel'
import UserModel from '@/models/user'
import UserModel, { type IUser } from '@/models/user'
export default class SubscriptionModel extends AbstractModel {
export interface ISubscription {
id: number
entity: string // FIXME: correct type?
entityId: number // FIXME: correct type?
user: UserModel
user: IUser
created: Date
}
export default class SubscriptionModel extends AbstractModel implements ISubscription {
declare id: number
declare entity: string // FIXME: correct type?
declare entityId: number // FIXME: correct type?
user: IUser
created: Date

View File

@ -1,12 +1,14 @@
import AbstractModel from './abstractModel'
import UserModel from './user'
import LabelModel from './label'
import AttachmentModel from './attachment'
import type { Priority } from '@/models/constants/priorities'
import AbstractModel from '@/models/abstractModel'
import UserModel, { type IUser } from '@/models/user'
import LabelModel, { type ILabel } from '@/models/label'
import AttachmentModel, {type IAttachment} from '@/models/attachment'
import SubscriptionModel, { type ISubscription } from '@/models/subscription'
import type { IList } from '@/models/list'
import SubscriptionModel from '@/models/subscription'
import {parseDateOrNull} from '@/helpers/parseDateOrNull'
import type ListModel from './list'
import type { Priority } from './constants/priorities'
import type { IBucket } from './bucket'
const SUPPORTS_TRIGGERED_NOTIFICATION = 'Notification' in window && 'showTrigger' in Notification.prototype
export const TASK_DEFAULT_COLOR = '#1973ff'
@ -24,15 +26,15 @@ export interface RepeatAfter {
amount: number
}
export default class TaskModel extends AbstractModel {
export interface ITask {
id: number
title: string
description: string
done: boolean
doneAt: Date | null
priority: Priority
labels: LabelModel[]
assignees: UserModel[]
labels: ILabel[]
assignees: IUser[]
dueDate: Date | null
startDate: Date | null
@ -41,26 +43,64 @@ export default class TaskModel extends AbstractModel {
repeatFromCurrentDate: boolean
repeatMode: TaskRepeatMode
reminderDates: Date[]
parentTaskId: TaskModel['id']
parentTaskId: ITask['id']
hexColor: string
percentDone: number
relatedTasks: { [relationKind: string]: TaskModel } // FIXME: use relationKinds
attachments: AttachmentModel[]
relatedTasks: { [relationKind: string]: ITask } // FIXME: use relationKinds
attachments: IAttachment[]
identifier: string
index: number
isFavorite: boolean
subscription: SubscriptionModel
subscription: ISubscription
position: number
kanbanPosition: number
createdBy: UserModel
createdBy: IUser
created: Date
updated: Date
listId: ListModel['id'] // Meta, only used when creating a new task
listId: IList['id'] // Meta, only used when creating a new task
bucketId: IBucket['id']
}
constructor(data: Partial<TaskModel>) {
export default class TaskModel extends AbstractModel implements ITask {
id: number
title: string
declare description: string
declare done: boolean
doneAt: Date | null
declare priority: Priority
labels: ILabel[]
assignees: IUser[]
dueDate: Date | null
startDate: Date | null
endDate: Date | null
declare repeatAfter: number | RepeatAfter
declare repeatFromCurrentDate: boolean
declare repeatMode: TaskRepeatMode
reminderDates: Date[]
declare parentTaskId: ITask['id']
declare hexColor: string
declare percentDone: number
declare relatedTasks: { [relationKind: string]: ITask } // FIXME: use relationKinds
attachments: IAttachment[]
declare identifier: string
declare index: number
declare isFavorite: boolean
declare subscription: ISubscription
declare position: number
declare kanbanPosition: number
createdBy: IUser
created: Date
updated: Date
listId: IList['id'] // Meta, only used when creating a new task
constructor(data: Partial<ITask>) {
super(data)
this.id = Number(this.id)
@ -120,6 +160,7 @@ export default class TaskModel extends AbstractModel {
this.listId = Number(this.listId)
}
bucketId: number
defaults() {
return {

View File

@ -1,11 +1,17 @@
import AbstractModel from './abstractModel'
import type UserModel from './user'
import type TaskModel from './task'
import type { ITask } from './task'
import type { IUser } from './user'
export default class TaskAssigneeModel extends AbstractModel {
export interface ITaskAssignee {
created: Date
userId: UserModel['id']
taskId: TaskModel['id']
userId: IUser['id']
taskId: ITask['id']
}
export default class TaskAssigneeModel extends AbstractModel implements ITaskAssignee {
created: Date
declare userId: IUser['id']
declare taskId: ITask['id']
constructor(data) {
super(data)

View File

@ -1,12 +1,22 @@
import AbstractModel from './abstractModel'
import UserModel from './user'
import type TaskModel from './task'
import UserModel, { type IUser } from './user'
import type { ITask } from './task'
export default class TaskCommentModel extends AbstractModel {
export interface ITaskComment {
id: number
taskId: TaskModel['id']
taskId: ITask['id']
comment: string
author: UserModel
author: IUser
created: Date
updated: Date
}
export default class TaskCommentModel extends AbstractModel implements ITaskComment {
declare id: number
declare taskId: ITask['id']
declare comment: string
author: IUser
created: Date
updated: Date

View File

@ -1,6 +1,6 @@
import AbstractModel from './abstractModel'
import UserModel from './user'
import type TaskModel from './task'
import UserModel, { type IUser } from './user'
import type { ITask } from './task'
export const RELATION_KIND = {
'SUBTASK': 'subtask',
@ -19,13 +19,23 @@ export const RELATION_KINDS = [...Object.values(RELATION_KIND)] as const
export type RelationKind = typeof RELATION_KINDS[number]
export default class TaskRelationModel extends AbstractModel {
export interface ITaskRelationModel {
id: number
otherTaskId: TaskModel['id']
taskId: TaskModel['id']
otherTaskId: ITask['id']
taskId: ITask['id']
relationKind: RelationKind
createdBy: UserModel
createdBy: IUser
created: Date
}
export default class TaskRelationModel extends AbstractModel implements ITaskRelationModel {
declare id: number
declare otherTaskId: ITask['id']
declare taskId: ITask['id']
declare relationKind: RelationKind
createdBy: IUser
created: Date
constructor(data) {

View File

@ -1,16 +1,28 @@
import AbstractModel from './abstractModel'
import UserModel from './user'
import TeamMemberModel from './teamMember'
import UserModel, { type IUser } from './user'
import TeamMemberModel, { type ITeamMember } from './teamMember'
import {RIGHTS, type Right} from '@/models/constants/rights'
export default class TeamModel extends AbstractModel {
id: 0
export interface ITeam {
id: number
name: string
description: string
members: TeamMemberModel[]
members: ITeamMember[]
right: Right
createdBy: UserModel
createdBy: IUser
created: Date
updated: Date
}
export default class TeamModel extends AbstractModel implements ITeam {
declare id: number
declare name: string
declare description: string
members: ITeamMember[]
declare right: Right
createdBy: IUser
created: Date
updated: Date

View File

@ -1,8 +1,12 @@
import TeamShareBaseModel from './teamShareBase'
import type ListModel from './list'
import type { IList } from './list'
export default class TeamListModel extends TeamShareBaseModel {
listId: ListModel['id']
export interface ITeamList {
listId: IList['id']
}
export default class TeamListModel extends TeamShareBaseModel implements ITeamList {
declare listId: IList['id']
defaults() {
return {

View File

@ -1,9 +1,14 @@
import UserModel from './user'
import type ListModel from './list'
import type { IList } from './list'
export default class TeamMemberModel extends UserModel {
export interface ITeamMember {
admin: boolean
teamId: ListModel['id']
teamId: IList['id']
}
export default class TeamMemberModel extends UserModel implements ITeamMember {
declare admin: boolean
declare teamId: IList['id']
defaults() {
return {

View File

@ -1,8 +1,12 @@
import TeamShareBaseModel from './teamShareBase'
import type NamespaceModel from './namespace'
import type { INamespace } from './namespace'
export default class TeamNamespaceModel extends TeamShareBaseModel {
namespaceId: NamespaceModel['id']
export interface ITeamNamespace {
namespaceId: INamespace['id']
}
export default class TeamNamespaceModel extends TeamShareBaseModel implements ITeamNamespace {
declare namespaceId: INamespace['id']
defaults() {
return {

View File

@ -1,14 +1,22 @@
import AbstractModel from './abstractModel'
import type TeamModel from './team'
import {RIGHTS, type Right} from '@/models/constants/rights'
import type { ITeam } from './team'
export interface ITeamShareBase {
teamId: ITeam['id']
right: Right
created: Date
updated: Date
}
/**
* This class is a base class for common team sharing model.
* It is extended in a way so it can be used for namespaces as well for lists.
*/
export default class TeamShareBaseModel extends AbstractModel {
teamId: TeamModel['id']
right: Right
export default class TeamShareBaseModel extends AbstractModel implements ITeamShareBase {
declare teamId: ITeam['id']
declare right: Right
created: Date
updated: Date

View File

@ -1,9 +1,15 @@
import AbstractModel from './abstractModel'
export default class TotpModel extends AbstractModel {
export interface ITotp {
secret: string
enabled: boolean
url: string
}
export default class TotpModel extends AbstractModel implements ITotp{
declare secret: string
declare enabled: boolean
declare url: string
defaults() {
return {

View File

@ -1,7 +1,7 @@
import AbstractModel from './abstractModel'
import UserSettingsModel from '@/models/userSettings'
import UserSettingsModel, { type IUserSettings } from '@/models/userSettings'
export default class UserModel extends AbstractModel {
export interface IUser {
id: number
email: string
username: string
@ -9,7 +9,18 @@ export default class UserModel extends AbstractModel {
created: Date
updated: Date
settings: UserSettingsModel
settings: IUserSettings
}
export default class UserModel extends AbstractModel implements IUser {
declare id: number
declare email: string
declare username: string
declare name: string
created: Date
updated: Date
settings: IUserSettings
constructor(data) {
super(data)
@ -28,6 +39,7 @@ export default class UserModel extends AbstractModel {
email: '',
username: '',
name: '',
created: null,
updated: null,
settings: null,

View File

@ -1,8 +1,13 @@
import UserShareBaseModel from './userShareBase'
import type ListModel from './list'
import type { IList } from './list'
export interface IUserList {
listId: IList['id']
}
// This class extends the user share model with a 'rights' parameter which is used in sharing
export default class UserListModel extends UserShareBaseModel {
listId: ListModel['id']
export default class UserListModel extends UserShareBaseModel implements IUserList {
declare listId: IList['id']
defaults() {
return {

View File

@ -1,9 +1,13 @@
import UserShareBaseModel from './userShareBase'
import type NamespaceModel from './namespace'
import type { INamespace } from './namespace'
export interface IUserNamespace {
namespaceId: INamespace['id']
}
// This class extends the user share model with a 'rights' parameter which is used in sharing
export default class UserNamespaceModel extends UserShareBaseModel {
namespaceId: NamespaceModel['id']
export default class UserNamespaceModel extends UserShareBaseModel implements IUserNamespace {
declare namespaceId: INamespace['id']
defaults() {
return {

View File

@ -1,16 +1,27 @@
import AbstractModel from './abstractModel'
import type ListModel from './list'
import type { IList } from './list'
export default class UserSettingsModel extends AbstractModel {
export interface IUserSettings {
name: string
emailRemindersEnabled: boolean
discoverableByName: boolean
discoverableByEmail: boolean
overdueTasksRemindersEnabled: boolean
defaultListId: undefined | ListModel['id']
defaultListId: undefined | IList['id']
weekStart: 0 | 1 | 2 | 3 | 4 | 5 | 6
timezone: string
}
export default class UserSettingsModel extends AbstractModel implements IUserSettings {
declare name: string
declare emailRemindersEnabled: boolean
declare discoverableByName: boolean
declare discoverableByEmail: boolean
declare overdueTasksRemindersEnabled: boolean
declare defaultListId: undefined | IList['id']
declare weekStart: 0 | 1 | 2 | 3 | 4 | 5 | 6
declare timezone: string
defaults() {
return {

View File

@ -1,13 +1,21 @@
import AbstractModel from './abstractModel'
import type UserModel from './user'
import {RIGHTS, type Right} from '@/models/constants/rights'
import type { IUser } from './user'
export default class UserShareBaseModel extends AbstractModel {
userId: UserModel['id']
export interface IUserShareBase {
userId: IUser['id']
right: Right
created: Date
updated: Date
}
export default class UserShareBaseModel extends AbstractModel implements IUserShareBase {
declare userId: IUser['id']
declare right: Right
created: Date
updated: Date
constructor(data) {
super(data)