Compare commits
33 Commits
5198e6b06e
...
8a5017b2d6
Author | SHA1 | Date |
---|---|---|
Dominik Pschenitschni | 8a5017b2d6 | |
Dominik Pschenitschni | 1a11b43ca8 | |
renovate | 61427987c2 | |
Dominik Pschenitschni | 7b398f73f6 | |
renovate | 64726a6421 | |
renovate | 53858e0c31 | |
renovate | 2f0f648d28 | |
renovate | 6e026cc7cc | |
renovate | d0fefd3c08 | |
renovate | 4dd397e3d2 | |
drone | 2a41ccb980 | |
renovate | 38d72b59df | |
drone | add080d214 | |
renovate | 65f9def438 | |
drone | f1a726550e | |
kolaente | 63f5f446fd | |
kolaente | b8d77a617b | |
kolaente | d822709991 | |
renovate | 86a04da470 | |
renovate | e6fbf1cb50 | |
renovate | 4fe6186ee6 | |
kolaente | 6bf5f6efd4 | |
renovate | 03f448457a | |
konrad | 7f6f8963e7 | |
kolaente | 65fd2f14a0 | |
renovate | 2e84c27d1e | |
renovate | ee79a1d604 | |
renovate | d17428d4d0 | |
renovate | bca53ec8ae | |
renovate | fef1af6ce7 | |
renovate | 3209206260 | |
kolaente | d819b9b0ba | |
kolaente | e95904351f |
|
@ -42,3 +42,7 @@ yarn run build
|
||||||
```shell
|
```shell
|
||||||
yarn run lint
|
yarn run lint
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Sponsors
|
||||||
|
|
||||||
|
[![Relm](https://vikunja.io/images/sponsors/relm.png)](https://relm.us)
|
||||||
|
|
46
package.json
46
package.json
|
@ -18,19 +18,24 @@
|
||||||
"browserslist:update": "npx browserslist@latest --update-db"
|
"browserslist:update": "npx browserslist@latest --update-db"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@fortawesome/fontawesome-svg-core": "6.2.0",
|
||||||
|
"@fortawesome/free-regular-svg-icons": "6.2.0",
|
||||||
|
"@fortawesome/free-solid-svg-icons": "6.2.0",
|
||||||
|
"@fortawesome/vue-fontawesome": "3.0.1",
|
||||||
"@github/hotkey": "2.0.1",
|
"@github/hotkey": "2.0.1",
|
||||||
"@kyvg/vue3-notification": "2.4.1",
|
"@kyvg/vue3-notification": "2.4.1",
|
||||||
"@sentry/tracing": "7.12.1",
|
"@sentry/tracing": "7.12.1",
|
||||||
"@sentry/vue": "7.12.1",
|
"@sentry/vue": "7.12.1",
|
||||||
"@types/is-touch-device": "1.0.0",
|
"@types/is-touch-device": "1.0.0",
|
||||||
"@types/lodash.clonedeep": "^4.5.7",
|
"@types/lodash.clonedeep": "4.5.7",
|
||||||
"@types/sortablejs": "1.13.0",
|
"@types/sortablejs": "1.13.0",
|
||||||
"@vueuse/core": "9.2.0",
|
"@vueuse/core": "9.2.0",
|
||||||
"@vueuse/router": "9.2.0",
|
"@vueuse/router": "9.2.0",
|
||||||
"blurhash": "1.1.5",
|
"axios": "0.27.2",
|
||||||
|
"blurhash": "2.0.0",
|
||||||
"bulma-css-variables": "0.9.33",
|
"bulma-css-variables": "0.9.33",
|
||||||
"camel-case": "4.1.2",
|
"camel-case": "4.1.2",
|
||||||
"date-fns": "2.29.2",
|
"date-fns": "2.29.3",
|
||||||
"dompurify": "2.4.0",
|
"dompurify": "2.4.0",
|
||||||
"easymde": "2.17.0",
|
"easymde": "2.17.0",
|
||||||
"flatpickr": "4.6.13",
|
"flatpickr": "4.6.13",
|
||||||
|
@ -46,7 +51,7 @@
|
||||||
"ufo": "0.8.5",
|
"ufo": "0.8.5",
|
||||||
"v-tooltip": "4.0.0-beta.17",
|
"v-tooltip": "4.0.0-beta.17",
|
||||||
"validator": "^13.7.0",
|
"validator": "^13.7.0",
|
||||||
"vue": "3.2.38",
|
"vue": "3.2.39",
|
||||||
"vue-advanced-cropper": "2.8.3",
|
"vue-advanced-cropper": "2.8.3",
|
||||||
"vue-drag-resize": "2.0.3",
|
"vue-drag-resize": "2.0.3",
|
||||||
"vue-flatpickr-component": "9.0.6",
|
"vue-flatpickr-component": "9.0.6",
|
||||||
|
@ -61,41 +66,36 @@
|
||||||
"@cypress/vite-dev-server": "3.1.1",
|
"@cypress/vite-dev-server": "3.1.1",
|
||||||
"@cypress/vue": "4.2.0",
|
"@cypress/vue": "4.2.0",
|
||||||
"@faker-js/faker": "7.5.0",
|
"@faker-js/faker": "7.5.0",
|
||||||
"@fortawesome/fontawesome-svg-core": "6.2.0",
|
|
||||||
"@fortawesome/free-regular-svg-icons": "6.2.0",
|
|
||||||
"@fortawesome/free-solid-svg-icons": "6.2.0",
|
|
||||||
"@fortawesome/vue-fontawesome": "3.0.1",
|
|
||||||
"@types/flexsearch": "0.7.3",
|
"@types/flexsearch": "0.7.3",
|
||||||
"@types/validator": "^13.7.5",
|
"@types/validator": "^13.7.5",
|
||||||
"@typescript-eslint/eslint-plugin": "5.36.2",
|
"@typescript-eslint/eslint-plugin": "5.37.0",
|
||||||
"@typescript-eslint/parser": "5.36.2",
|
"@typescript-eslint/parser": "5.37.0",
|
||||||
"@vitejs/plugin-legacy": "2.1.0",
|
"@vitejs/plugin-legacy": "2.1.0",
|
||||||
"@vitejs/plugin-vue": "3.1.0",
|
"@vitejs/plugin-vue": "3.1.0",
|
||||||
"@vue/eslint-config-typescript": "11.0.0",
|
"@vue/eslint-config-typescript": "11.0.1",
|
||||||
"@vue/test-utils": "2.0.2",
|
"@vue/test-utils": "2.0.2",
|
||||||
"@vue/tsconfig": "0.1.3",
|
"@vue/tsconfig": "0.1.3",
|
||||||
"autoprefixer": "10.4.8",
|
"autoprefixer": "10.4.9",
|
||||||
"axios": "0.27.2",
|
|
||||||
"browserslist": "4.21.3",
|
"browserslist": "4.21.3",
|
||||||
"caniuse-lite": "1.0.30001390",
|
"caniuse-lite": "1.0.30001397",
|
||||||
"cypress": "10.7.0",
|
"cypress": "10.7.0",
|
||||||
"esbuild": "0.15.7",
|
"esbuild": "0.15.7",
|
||||||
"eslint": "8.23.0",
|
"eslint": "8.23.1",
|
||||||
"eslint-plugin-vue": "9.4.0",
|
"eslint-plugin-vue": "9.4.0",
|
||||||
"express": "4.18.1",
|
"express": "4.18.1",
|
||||||
"happy-dom": "6.0.4",
|
"happy-dom": "6.0.4",
|
||||||
"netlify-cli": "11.5.1",
|
"netlify-cli": "11.7.1",
|
||||||
"postcss": "8.4.16",
|
"postcss": "8.4.16",
|
||||||
"postcss-preset-env": "7.8.0",
|
"postcss-preset-env": "7.8.1",
|
||||||
"rollup": "2.79.0",
|
"rollup": "2.79.0",
|
||||||
"rollup-plugin-visualizer": "5.8.1",
|
"rollup-plugin-visualizer": "5.8.1",
|
||||||
"sass": "1.54.8",
|
"sass": "1.54.9",
|
||||||
"typescript": "4.8.2",
|
"typescript": "4.8.3",
|
||||||
"vite": "3.1.0",
|
"vite": "3.1.0",
|
||||||
"vite-plugin-pwa": "0.12.6",
|
"vite-plugin-pwa": "0.12.7",
|
||||||
"vite-svg-loader": "3.5.1",
|
"vite-svg-loader": "3.6.0",
|
||||||
"vitest": "0.23.1",
|
"vitest": "0.23.2",
|
||||||
"vue-tsc": "0.40.9",
|
"vue-tsc": "0.40.13",
|
||||||
"wait-on": "6.0.1",
|
"wait-on": "6.0.1",
|
||||||
"workbox-cli": "6.5.4",
|
"workbox-cli": "6.5.4",
|
||||||
"zod": "3.18.0"
|
"zod": "3.18.0"
|
||||||
|
|
|
@ -19,6 +19,12 @@
|
||||||
"matchPackagePrefixes": [
|
"matchPackagePrefixes": [
|
||||||
"@vueuse/"
|
"@vueuse/"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"matchDepTypes": ["devDependencies"],
|
||||||
|
"automerge": true,
|
||||||
|
"automergeStrategy": "squash",
|
||||||
|
"automergeType": "pr"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,8 +6,9 @@
|
||||||
>
|
>
|
||||||
<div class="container has-text-centered link-share-view">
|
<div class="container has-text-centered link-share-view">
|
||||||
<div class="column is-10 is-offset-1">
|
<div class="column is-10 is-offset-1">
|
||||||
<Logo class="logo"/>
|
<Logo class="logo" v-if="logoVisible"/>
|
||||||
<h1
|
<h1
|
||||||
|
:class="{'m-0': !logoVisible}"
|
||||||
:style="{ 'opacity': currentList.title === '' ? '0': '1' }"
|
:style="{ 'opacity': currentList.title === '' ? '0': '1' }"
|
||||||
class="title">
|
class="title">
|
||||||
{{ currentList.title === '' ? $t('misc.loading') : currentList.title }}
|
{{ currentList.title === '' ? $t('misc.loading') : currentList.title }}
|
||||||
|
@ -31,6 +32,7 @@ import PoweredByLink from './PoweredByLink.vue'
|
||||||
const store = useStore()
|
const store = useStore()
|
||||||
const currentList = computed(() => store.state.currentList)
|
const currentList = computed(() => store.state.currentList)
|
||||||
const background = computed(() => store.state.background)
|
const background = computed(() => store.state.background)
|
||||||
|
const logoVisible = computed(() => store.state.logoVisible)
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
|
|
@ -156,8 +156,8 @@ import {calculateItemPosition} from '@/helpers/calculateItemPosition'
|
||||||
import {getNamespaceTitle} from '@/helpers/getNamespaceTitle'
|
import {getNamespaceTitle} from '@/helpers/getNamespaceTitle'
|
||||||
import {getListTitle} from '@/helpers/getListTitle'
|
import {getListTitle} from '@/helpers/getListTitle'
|
||||||
import {useEventListener} from '@vueuse/core'
|
import {useEventListener} from '@vueuse/core'
|
||||||
import type { IList } from '@/models/list'
|
import type {IList} from '@/modelTypes/IList'
|
||||||
import type { INamespace } from '@/models/namespace'
|
import type {INamespace} from '@/modelTypes/INamespace'
|
||||||
|
|
||||||
const drag = ref(false)
|
const drag = ref(false)
|
||||||
const dragOptions = {
|
const dragOptions = {
|
||||||
|
@ -250,9 +250,14 @@ async function saveListPosition(e: SortableEvent) {
|
||||||
const newNamespaceIndex = parseInt(e.to.dataset.namespaceIndex as string)
|
const newNamespaceIndex = parseInt(e.to.dataset.namespaceIndex as string)
|
||||||
|
|
||||||
const listsActive = activeLists.value[newNamespaceIndex]
|
const listsActive = activeLists.value[newNamespaceIndex]
|
||||||
const list = listsActive[e.newIndex]
|
// If the list was dragged to the last position, Safari will report e.newIndex as the size of the listsActive
|
||||||
const listBefore = listsActive[e.newIndex - 1] ?? null
|
// array instead of using the position. Because the index is wrong in that case, dragging the list will fail.
|
||||||
const listAfter = listsActive[e.newIndex + 1] ?? null
|
// To work around that we're explicitly checking that case here and decrease the index.
|
||||||
|
const newIndex = e.newIndex === listsActive.length ? e.newIndex - 1 : e.newIndex
|
||||||
|
|
||||||
|
const list = listsActive[newIndex]
|
||||||
|
const listBefore = listsActive[newIndex - 1] ?? null
|
||||||
|
const listAfter = listsActive[newIndex + 1] ?? null
|
||||||
listUpdating.value[list.id] = true
|
listUpdating.value[list.id] = true
|
||||||
|
|
||||||
const position = calculateItemPosition(
|
const position = calculateItemPosition(
|
||||||
|
|
|
@ -16,14 +16,29 @@
|
||||||
<p class="has-text-centered has-text-grey is-italic my-5" v-if="showPreviewText">
|
<p class="has-text-centered has-text-grey is-italic my-5" v-if="showPreviewText">
|
||||||
{{ emptyText }}
|
{{ emptyText }}
|
||||||
<template v-if="isEditEnabled">
|
<template v-if="isEditEnabled">
|
||||||
<ButtonLink @click="toggleEdit" class="d-print-none">{{ $t('input.editor.edit') }}</ButtonLink>.
|
<ButtonLink
|
||||||
|
@click="toggleEdit"
|
||||||
|
v-shortcut="editShortcut"
|
||||||
|
class="d-print-none">
|
||||||
|
{{ $t('input.editor.edit') }}
|
||||||
|
</ButtonLink>.
|
||||||
</template>
|
</template>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<ul class="actions d-print-none" v-if="bottomActions.length > 0">
|
<ul class="actions d-print-none" v-if="bottomActions.length > 0">
|
||||||
<li v-if="isEditEnabled && !showPreviewText && showSave">
|
<li v-if="isEditEnabled && !showPreviewText && showSave">
|
||||||
<BaseButton v-if="showEditButton" @click="toggleEdit">{{ $t('input.editor.edit') }}</BaseButton>
|
<BaseButton
|
||||||
<BaseButton v-else-if="isEditActive" @click="toggleEdit" class="done-edit">{{ $t('misc.save') }}</BaseButton>
|
v-if="showEditButton"
|
||||||
|
@click="toggleEdit"
|
||||||
|
v-shortcut="editShortcut">
|
||||||
|
{{ $t('input.editor.edit') }}
|
||||||
|
</BaseButton>
|
||||||
|
<BaseButton
|
||||||
|
v-else-if="isEditActive"
|
||||||
|
@click="toggleEdit"
|
||||||
|
class="done-edit">
|
||||||
|
{{ $t('misc.save') }}
|
||||||
|
</BaseButton>
|
||||||
</li>
|
</li>
|
||||||
<li v-for="(action, k) in bottomActions" :key="k">
|
<li v-for="(action, k) in bottomActions" :key="k">
|
||||||
<BaseButton @click="action.action">{{ action.title }}</BaseButton>
|
<BaseButton @click="action.action">{{ action.title }}</BaseButton>
|
||||||
|
@ -32,7 +47,11 @@
|
||||||
<template v-else-if="isEditEnabled && showSave">
|
<template v-else-if="isEditEnabled && showSave">
|
||||||
<ul v-if="showEditButton" class="actions d-print-none">
|
<ul v-if="showEditButton" class="actions d-print-none">
|
||||||
<li>
|
<li>
|
||||||
<BaseButton @click="toggleEdit">{{ $t('input.editor.edit') }}</BaseButton>
|
<BaseButton
|
||||||
|
@click="toggleEdit"
|
||||||
|
v-shortcut="editShortcut">
|
||||||
|
{{ $t('input.editor.edit') }}
|
||||||
|
</BaseButton>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<x-button
|
<x-button
|
||||||
|
@ -110,6 +129,12 @@ export default defineComponent({
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
|
// If a key is passed the editor will go in "edit" mode when the key is pressed.
|
||||||
|
// Disabled if an empty string is passed.
|
||||||
|
editShortcut: {
|
||||||
|
type: String,
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
emits: ['update:modelValue', 'change'],
|
emits: ['update:modelValue', 'change'],
|
||||||
computed: {
|
computed: {
|
||||||
|
|
|
@ -83,8 +83,8 @@ import {getSavedFilterIdFromListId} from '@/helpers/savedFilter'
|
||||||
import Dropdown from '@/components/misc/dropdown.vue'
|
import Dropdown from '@/components/misc/dropdown.vue'
|
||||||
import DropdownItem from '@/components/misc/dropdown-item.vue'
|
import DropdownItem from '@/components/misc/dropdown-item.vue'
|
||||||
import TaskSubscription from '@/components/misc/subscription.vue'
|
import TaskSubscription from '@/components/misc/subscription.vue'
|
||||||
import type {IList} from '@/models/list'
|
import type {IList} from '@/modelTypes/IList'
|
||||||
import type { ISubscription } from '@/models/subscription'
|
import type {ISubscription} from '@/modelTypes/ISubscription'
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
list: {
|
list: {
|
||||||
|
|
|
@ -45,7 +45,7 @@ import {getBlobFromBlurHash} from '@/helpers/getBlobFromBlurHash'
|
||||||
import {colorIsDark} from '@/helpers/color/colorIsDark'
|
import {colorIsDark} from '@/helpers/color/colorIsDark'
|
||||||
|
|
||||||
import BaseButton from '@/components/base/BaseButton.vue'
|
import BaseButton from '@/components/base/BaseButton.vue'
|
||||||
import type { IList } from '@/models/list'
|
import type {IList} from '@/modelTypes/IList'
|
||||||
|
|
||||||
const background = ref<string | null>(null)
|
const background = ref<string | null>(null)
|
||||||
const backgroundLoading = ref(false)
|
const backgroundLoading = ref(false)
|
||||||
|
|
|
@ -136,6 +136,10 @@ export const KEYBOARD_SHORTCUTS : ShortcutGroup[] = [
|
||||||
title: 'keyboardShortcuts.task.reminder',
|
title: 'keyboardShortcuts.task.reminder',
|
||||||
keys: ['alt', 'r'],
|
keys: ['alt', 'r'],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: 'keyboardShortcuts.task.description',
|
||||||
|
keys: ['e'],
|
||||||
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|
|
@ -39,7 +39,8 @@ import BaseButton from '@/components/base/BaseButton.vue'
|
||||||
import DropdownItem from '@/components/misc/dropdown-item.vue'
|
import DropdownItem from '@/components/misc/dropdown-item.vue'
|
||||||
|
|
||||||
import SubscriptionService from '@/services/subscription'
|
import SubscriptionService from '@/services/subscription'
|
||||||
import SubscriptionModel, { type ISubscription } from '@/models/subscription'
|
import SubscriptionModel from '@/models/subscription'
|
||||||
|
import type {ISubscription} from '@/modelTypes/ISubscription'
|
||||||
|
|
||||||
import {success} from '@/message'
|
import {success} from '@/message'
|
||||||
|
|
||||||
|
|
|
@ -59,7 +59,8 @@ import {ref, onMounted, type PropType} from 'vue'
|
||||||
import Dropdown from '@/components/misc/dropdown.vue'
|
import Dropdown from '@/components/misc/dropdown.vue'
|
||||||
import DropdownItem from '@/components/misc/dropdown-item.vue'
|
import DropdownItem from '@/components/misc/dropdown-item.vue'
|
||||||
import TaskSubscription from '@/components/misc/subscription.vue'
|
import TaskSubscription from '@/components/misc/subscription.vue'
|
||||||
import type { INamespace } from '@/models/namespace'
|
import type {INamespace} from '@/modelTypes/INamespace'
|
||||||
|
import type {ISubscription} from '@/modelTypes/ISubscription'
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
namespace: {
|
namespace: {
|
||||||
|
@ -68,7 +69,7 @@ const props = defineProps({
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
const subscription = ref(null)
|
const subscription = ref<ISubscription | null>(null)
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
subscription.value = props.namespace.subscription
|
subscription.value = props.namespace.subscription
|
||||||
})
|
})
|
||||||
|
|
|
@ -181,13 +181,15 @@ import {useStore} from '@/store'
|
||||||
import {useI18n} from 'vue-i18n'
|
import {useI18n} from 'vue-i18n'
|
||||||
|
|
||||||
import {RIGHTS} from '@/constants/rights'
|
import {RIGHTS} from '@/constants/rights'
|
||||||
import LinkShareModel, { type ILinkShare } from '@/models/linkShare'
|
import LinkShareModel from '@/models/linkShare'
|
||||||
|
|
||||||
|
import type {ILinkShare} from '@/modelTypes/ILinkShare'
|
||||||
|
import type {IList} from '@/modelTypes/IList'
|
||||||
|
|
||||||
import LinkShareService from '@/services/linkShare'
|
import LinkShareService from '@/services/linkShare'
|
||||||
|
|
||||||
import {useCopyToClipboard} from '@/composables/useCopyToClipboard'
|
import {useCopyToClipboard} from '@/composables/useCopyToClipboard'
|
||||||
import {success} from '@/message'
|
import {success} from '@/message'
|
||||||
import type { IList } from '@/models/list'
|
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
listId: {
|
listId: {
|
||||||
|
|
|
@ -143,22 +143,29 @@ import {useStore} from '@/store'
|
||||||
import {useI18n} from 'vue-i18n'
|
import {useI18n} from 'vue-i18n'
|
||||||
|
|
||||||
import UserNamespaceService from '@/services/userNamespace'
|
import UserNamespaceService from '@/services/userNamespace'
|
||||||
import UserNamespaceModel, { type IUserNamespace } from '@/models/userNamespace'
|
import UserNamespaceModel from '@/models/userNamespace'
|
||||||
|
import type {IUserNamespace} from '@/modelTypes/IUserNamespace'
|
||||||
|
|
||||||
import UserListService from '@/services/userList'
|
import UserListService from '@/services/userList'
|
||||||
import UserListModel, { type IUserList } from '@/models/userList'
|
import UserListModel from '@/models/userList'
|
||||||
|
import type {IUserList} from '@/modelTypes/IUserList'
|
||||||
|
|
||||||
import UserService from '@/services/user'
|
import UserService from '@/services/user'
|
||||||
import UserModel, { type IUser } from '@/models/user'
|
import UserModel from '@/models/user'
|
||||||
|
import type {IUser} from '@/modelTypes/IUser'
|
||||||
|
|
||||||
import TeamNamespaceService from '@/services/teamNamespace'
|
import TeamNamespaceService from '@/services/teamNamespace'
|
||||||
import TeamNamespaceModel, { type ITeamNamespace } from '@/models/teamNamespace'
|
import TeamNamespaceModel from '@/models/teamNamespace'
|
||||||
|
import type { ITeamNamespace } from '@/modelTypes/ITeamNamespace'
|
||||||
|
|
||||||
import TeamListService from '@/services/teamList'
|
import TeamListService from '@/services/teamList'
|
||||||
import TeamListModel, { type ITeamList } from '@/models/teamList'
|
import TeamListModel from '@/models/teamList'
|
||||||
|
import type { ITeamList } from '@/modelTypes/ITeamList'
|
||||||
|
|
||||||
import TeamService from '@/services/team'
|
import TeamService from '@/services/team'
|
||||||
import TeamModel, { type ITeam } from '@/models/team'
|
import TeamModel from '@/models/team'
|
||||||
|
import type {ITeam} from '@/modelTypes/ITeam'
|
||||||
|
|
||||||
|
|
||||||
import {RIGHTS} from '@/constants/rights'
|
import {RIGHTS} from '@/constants/rights'
|
||||||
import Multiselect from '@/components/input/multiselect.vue'
|
import Multiselect from '@/components/input/multiselect.vue'
|
||||||
|
|
|
@ -83,7 +83,8 @@ import {useI18n} from 'vue-i18n'
|
||||||
import Editor from '@/components/input/AsyncEditor'
|
import Editor from '@/components/input/AsyncEditor'
|
||||||
|
|
||||||
import TaskService from '@/services/task'
|
import TaskService from '@/services/task'
|
||||||
import TaskModel, { type ITask } from '@/models/task'
|
import TaskModel from '@/models/task'
|
||||||
|
import type {ITask} from '@/modelTypes/ITask'
|
||||||
import EditLabels from './partials/editLabels.vue'
|
import EditLabels from './partials/editLabels.vue'
|
||||||
import Reminders from './partials/reminders.vue'
|
import Reminders from './partials/reminders.vue'
|
||||||
import ColorPicker from '../input/colorPicker.vue'
|
import ColorPicker from '../input/colorPicker.vue'
|
||||||
|
|
|
@ -147,7 +147,8 @@
|
||||||
import {defineComponent} from 'vue'
|
import {defineComponent} from 'vue'
|
||||||
|
|
||||||
import AttachmentService from '../../../services/attachment'
|
import AttachmentService from '../../../services/attachment'
|
||||||
import AttachmentModel, { type IAttachment } from '@/models/attachment'
|
import AttachmentModel from '@/models/attachment'
|
||||||
|
import type {IAttachment} from '@/modelTypes/IAttachment'
|
||||||
import User from '@/components/misc/user.vue'
|
import User from '@/components/misc/user.vue'
|
||||||
import {mapState} from 'vuex'
|
import {mapState} from 'vuex'
|
||||||
|
|
||||||
|
@ -155,8 +156,8 @@ import { useCopyToClipboard } from '@/composables/useCopyToClipboard'
|
||||||
import { uploadFiles, generateAttachmentUrl } from '@/helpers/attachments'
|
import { uploadFiles, generateAttachmentUrl } from '@/helpers/attachments'
|
||||||
import {formatDate, formatDateSince, formatDateLong} from '@/helpers/time/formatDate'
|
import {formatDate, formatDateSince, formatDateLong} from '@/helpers/time/formatDate'
|
||||||
|
|
||||||
import BaseButton from '@/components/base/BaseButton'
|
import BaseButton from '@/components/base/BaseButton.vue'
|
||||||
import type { IFile } from '@/models/file'
|
import type { IFile } from '@/modelTypes/IFile'
|
||||||
import { getHumanSize } from '@/helpers/getHumanSize'
|
import { getHumanSize } from '@/helpers/getHumanSize'
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
|
|
|
@ -14,7 +14,7 @@ import {computed, type PropType} from 'vue'
|
||||||
import { useI18n } from 'vue-i18n'
|
import { useI18n } from 'vue-i18n'
|
||||||
|
|
||||||
import {getChecklistStatistics} from '@/helpers/checklistFromText'
|
import {getChecklistStatistics} from '@/helpers/checklistFromText'
|
||||||
import type {ITask} from '@/models/task'
|
import type {ITask} from '@/modelTypes/ITask'
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
task: {
|
task: {
|
||||||
|
|
|
@ -159,12 +159,15 @@ import {useI18n} from 'vue-i18n'
|
||||||
import Editor from '@/components/input/AsyncEditor'
|
import Editor from '@/components/input/AsyncEditor'
|
||||||
|
|
||||||
import TaskCommentService from '@/services/taskComment'
|
import TaskCommentService from '@/services/taskComment'
|
||||||
import TaskCommentModel, { type ITaskComment } from '@/models/taskComment'
|
import TaskCommentModel from '@/models/taskComment'
|
||||||
|
|
||||||
|
import type {ITaskComment} from '@/modelTypes/ITaskComment'
|
||||||
|
import type {ITask} from '@/modelTypes/ITask'
|
||||||
|
|
||||||
import {uploadFile} from '@/helpers/attachments'
|
import {uploadFile} from '@/helpers/attachments'
|
||||||
import {success} from '@/message'
|
import {success} from '@/message'
|
||||||
import {formatDateLong, formatDateSince} from '@/helpers/time/formatDate'
|
import {formatDateLong, formatDateSince} from '@/helpers/time/formatDate'
|
||||||
|
|
||||||
import type { ITask } from '@/models/task'
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
taskId: {
|
taskId: {
|
||||||
type: Number,
|
type: Number,
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import {computed, toRefs, type PropType} from 'vue'
|
import {computed, toRefs, type PropType} from 'vue'
|
||||||
import type { ITask } from '@/models/task'
|
import type {ITask} from '@/modelTypes/ITask'
|
||||||
import {formatISO, formatDateLong, formatDateSince} from '@/helpers/time/formatDate'
|
import {formatISO, formatDateLong, formatDateSince} from '@/helpers/time/formatDate'
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
|
|
|
@ -44,7 +44,7 @@ import {useI18n} from 'vue-i18n'
|
||||||
import flatPickr from 'vue-flatpickr-component'
|
import flatPickr from 'vue-flatpickr-component'
|
||||||
|
|
||||||
import TaskService from '@/services/task'
|
import TaskService from '@/services/task'
|
||||||
import { type ITask } from '@/models/task'
|
import type {ITask} from '@/modelTypes/ITask'
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
modelValue: {
|
modelValue: {
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
:placeholder="$t('task.description.placeholder')"
|
:placeholder="$t('task.description.placeholder')"
|
||||||
:empty-text="$t('task.description.empty')"
|
:empty-text="$t('task.description.empty')"
|
||||||
:show-save="true"
|
:show-save="true"
|
||||||
|
edit-shortcut="e"
|
||||||
v-model="task.description"
|
v-model="task.description"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
@ -35,7 +36,7 @@ import {useStore} from '@/store'
|
||||||
|
|
||||||
import Editor from '@/components/input/AsyncEditor'
|
import Editor from '@/components/input/AsyncEditor'
|
||||||
|
|
||||||
import type { ITask } from '@/models/task'
|
import type {ITask} from '@/modelTypes/ITask'
|
||||||
|
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
@search="findUser"
|
@search="findUser"
|
||||||
:search-results="foundUsers"
|
:search-results="foundUsers"
|
||||||
@select="addAssignee"
|
@select="addAssignee"
|
||||||
label="username"
|
label="name"
|
||||||
:select-placeholder="$t('task.assignee.selectPlaceholder')"
|
:select-placeholder="$t('task.assignee.selectPlaceholder')"
|
||||||
v-model="assignees"
|
v-model="assignees"
|
||||||
ref="multiselect"
|
ref="multiselect"
|
||||||
|
@ -106,6 +106,11 @@ async function findUser(query: string) {
|
||||||
|
|
||||||
// Filter the results to not include users who are already assigned
|
// Filter the results to not include users who are already assigned
|
||||||
foundUsers.value = response.filter(({id}) => !includesById(assignees.value, id))
|
foundUsers.value = response.filter(({id}) => !includesById(assignees.value, id))
|
||||||
|
.map(u => {
|
||||||
|
// Users may not have a display name set, so we fall back on the username in that case
|
||||||
|
u.name = u.name === '' ? u.username : u.name
|
||||||
|
return u
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function clearAllFoundUsers() {
|
function clearAllFoundUsers() {
|
||||||
|
|
|
@ -34,12 +34,14 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import {ref, computed, type PropType} from 'vue'
|
import {ref, computed, type PropType} from 'vue'
|
||||||
import {useStore} from '@/store'
|
import {useStore} from '@/store'
|
||||||
|
import {useRouter} from 'vue-router'
|
||||||
|
|
||||||
import BaseButton from '@/components/base/BaseButton.vue'
|
import BaseButton from '@/components/base/BaseButton.vue'
|
||||||
import Done from '@/components/misc/Done.vue'
|
import Done from '@/components/misc/Done.vue'
|
||||||
import type {ITask} from '@/models/task'
|
|
||||||
import { useRouter } from 'vue-router'
|
import {useCopyToClipboard} from '@/composables/useCopyToClipboard'
|
||||||
import { useCopyToClipboard } from '@/composables/useCopyToClipboard'
|
|
||||||
|
import type {ITask} from '@/modelTypes/ITask'
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
task: {
|
task: {
|
||||||
|
|
|
@ -74,7 +74,8 @@ import User from '../../../components/misc/user.vue'
|
||||||
import Done from '@/components/misc/Done.vue'
|
import Done from '@/components/misc/Done.vue'
|
||||||
import Labels from '../../../components/tasks/partials/labels.vue'
|
import Labels from '../../../components/tasks/partials/labels.vue'
|
||||||
import ChecklistSummary from './checklist-summary.vue'
|
import ChecklistSummary from './checklist-summary.vue'
|
||||||
import {TASK_DEFAULT_COLOR, type ITask} from '@/models/task'
|
import {TASK_DEFAULT_COLOR} from '@/models/task'
|
||||||
|
import type {ITask} from '@/modelTypes/ITask'
|
||||||
|
|
||||||
import {formatDateLong, formatISO, formatDateSince} from '@/helpers/time/formatDate'
|
import {formatDateLong, formatISO, formatDateSince} from '@/helpers/time/formatDate'
|
||||||
import {colorIsDark} from '@/helpers/color/colorIsDark'
|
import {colorIsDark} from '@/helpers/color/colorIsDark'
|
||||||
|
|
|
@ -11,8 +11,8 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import type { PropType } from 'vue'
|
import type {PropType} from 'vue'
|
||||||
import type { ILabel } from '@/models/label'
|
import type {ILabel} from '@/modelTypes/ILabel'
|
||||||
|
|
||||||
defineProps({
|
defineProps({
|
||||||
labels: {
|
labels: {
|
||||||
|
|
|
@ -21,7 +21,8 @@ import {reactive, ref, watch} from 'vue'
|
||||||
import type {PropType} from 'vue'
|
import type {PropType} from 'vue'
|
||||||
import {useStore} from '@/store'
|
import {useStore} from '@/store'
|
||||||
import {useI18n} from 'vue-i18n'
|
import {useI18n} from 'vue-i18n'
|
||||||
import ListModel, { type IList } from '@/models/list'
|
import ListModel from '@/models/list'
|
||||||
|
import type {IList} from '@/modelTypes/IList'
|
||||||
import Multiselect from '@/components/input/multiselect.vue'
|
import Multiselect from '@/components/input/multiselect.vue'
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
|
|
|
@ -98,7 +98,8 @@
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import {defineComponent, type PropType} from 'vue'
|
import {defineComponent, type PropType} from 'vue'
|
||||||
|
|
||||||
import TaskModel, { type ITask } from '../../../models/task'
|
import TaskModel from '@/models/task'
|
||||||
|
import type {ITask} from '@/modelTypes/ITask'
|
||||||
import PriorityLabel from './priorityLabel.vue'
|
import PriorityLabel from './priorityLabel.vue'
|
||||||
import TaskService from '../../../services/task'
|
import TaskService from '../../../services/task'
|
||||||
import Labels from '@/components/tasks/partials/labels.vue'
|
import Labels from '@/components/tasks/partials/labels.vue'
|
||||||
|
|
|
@ -3,11 +3,42 @@ import {useI18n} from 'vue-i18n'
|
||||||
|
|
||||||
export function useCopyToClipboard() {
|
export function useCopyToClipboard() {
|
||||||
const {t} = useI18n({useScope: 'global'})
|
const {t} = useI18n({useScope: 'global'})
|
||||||
|
|
||||||
|
function fallbackCopyTextToClipboard(text: string) {
|
||||||
|
const textArea = document.createElement('textarea')
|
||||||
|
textArea.value = text
|
||||||
|
|
||||||
|
// Avoid scrolling to bottom
|
||||||
|
textArea.style.top = '0'
|
||||||
|
textArea.style.left = '0'
|
||||||
|
textArea.style.position = 'fixed'
|
||||||
|
|
||||||
|
document.body.appendChild(textArea)
|
||||||
|
textArea.focus()
|
||||||
|
textArea.select()
|
||||||
|
|
||||||
|
try {
|
||||||
|
// NOTE: the execCommand is deprecated but as of 2022_09
|
||||||
|
// widely supported and works without https
|
||||||
|
const successful = document.execCommand('copy')
|
||||||
|
if (!successful) {
|
||||||
|
throw new Error()
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
error(t('misc.copyError'))
|
||||||
|
}
|
||||||
|
|
||||||
|
document.body.removeChild(textArea)
|
||||||
|
}
|
||||||
|
|
||||||
return async (text: string) => {
|
return async (text: string) => {
|
||||||
|
if (!navigator.clipboard) {
|
||||||
|
fallbackCopyTextToClipboard(text)
|
||||||
|
return
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
await navigator.clipboard.writeText(text)
|
await navigator.clipboard.writeText(text)
|
||||||
} catch {
|
} catch(e) {
|
||||||
error(t('misc.copyError'))
|
error(t('misc.copyError'))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,9 @@ import {isAppleDevice} from '@/helpers/isAppleDevice'
|
||||||
|
|
||||||
const directive: Directive = {
|
const directive: Directive = {
|
||||||
mounted(el, {value}) {
|
mounted(el, {value}) {
|
||||||
|
if(value === '') {
|
||||||
|
return
|
||||||
|
}
|
||||||
if (isAppleDevice() && value.includes('Control')) {
|
if (isAppleDevice() && value.includes('Control')) {
|
||||||
value = value.replace('Control', 'Meta')
|
value = value.replace('Control', 'Meta')
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import AttachmentModel, { type IAttachment } from '@/models/attachment'
|
import AttachmentModel from '@/models/attachment'
|
||||||
import type {IFile} from '@/models/file'
|
import type {IAttachment} from '@/modelTypes/IAttachment'
|
||||||
|
import type {IFile} from '@/modelTypes/IFile'
|
||||||
|
|
||||||
import AttachmentService from '@/services/attachment'
|
import AttachmentService from '@/services/attachment'
|
||||||
import { store } from '@/store'
|
import { store } from '@/store'
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import {i18n} from '@/i18n'
|
import {i18n} from '@/i18n'
|
||||||
import type { IList } from '@/models/list'
|
import type {IList} from '@/modelTypes/IList'
|
||||||
|
|
||||||
export function getListTitle(l: IList) {
|
export function getListTitle(l: IList) {
|
||||||
if (l.id === -1) {
|
if (l.id === -1) {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import {i18n} from '@/i18n'
|
import {i18n} from '@/i18n'
|
||||||
import type {INamespace} from '@/models/namespace'
|
import type {INamespace} from '@/modelTypes/INamespace'
|
||||||
|
|
||||||
export const getNamespaceTitle = (n: INamespace) => {
|
export const getNamespaceTitle = (n: INamespace) => {
|
||||||
if (n.id === -1) {
|
if (n.id === -1) {
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import {createNewIndexer} from '../indexes'
|
import {createNewIndexer} from '../indexes'
|
||||||
|
|
||||||
import type {LabelState} from '@/store/types'
|
import type {LabelState} from '@/store/types'
|
||||||
import type {ILabel} from '@/models/label'
|
import type {ILabel} from '@/modelTypes/ILabel'
|
||||||
|
|
||||||
const {search} = createNewIndexer('labels', ['title', 'description'])
|
const {search} = createNewIndexer('labels', ['title', 'description'])
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import type {IList} from '@/models/list'
|
import type {IList} from '@/modelTypes/IList'
|
||||||
|
|
||||||
const key = 'collapsedBuckets'
|
const key = 'collapsedBuckets'
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import type {IList} from '@/models/list'
|
import type {IList} from '@/modelTypes/IList'
|
||||||
|
|
||||||
export function getSavedFilterIdFromListId(listId: IList['id']) {
|
export function getSavedFilterIdFromListId(listId: IList['id']) {
|
||||||
let filterId = listId * -1 - 1
|
let filterId = listId * -1 - 1
|
||||||
|
|
|
@ -870,7 +870,8 @@
|
||||||
"related": "Modify related tasks of this task",
|
"related": "Modify related tasks of this task",
|
||||||
"color": "Change the color of this task",
|
"color": "Change the color of this task",
|
||||||
"move": "Move this task to another list",
|
"move": "Move this task to another list",
|
||||||
"reminder": "Manage reminders of this task"
|
"reminder": "Manage reminders of this task",
|
||||||
|
"description": "Toggle editing of the task description"
|
||||||
},
|
},
|
||||||
"list": {
|
"list": {
|
||||||
"title": "List Views",
|
"title": "List Views",
|
||||||
|
|
|
@ -870,7 +870,8 @@
|
||||||
"related": "Upravit související úkoly tohoto úkolu",
|
"related": "Upravit související úkoly tohoto úkolu",
|
||||||
"color": "Změnit barvu tohoto úkolu",
|
"color": "Změnit barvu tohoto úkolu",
|
||||||
"move": "Přesunout tento úkol do jiného seznamu",
|
"move": "Přesunout tento úkol do jiného seznamu",
|
||||||
"reminder": "Manage reminders of this task"
|
"reminder": "Manage reminders of this task",
|
||||||
|
"description": "Toggle editing of the task description"
|
||||||
},
|
},
|
||||||
"list": {
|
"list": {
|
||||||
"title": "Zobrazení seznamů",
|
"title": "Zobrazení seznamů",
|
||||||
|
|
|
@ -870,7 +870,8 @@
|
||||||
"related": "Ändere die Abhängigen Aufgaben dieser Aufgabe",
|
"related": "Ändere die Abhängigen Aufgaben dieser Aufgabe",
|
||||||
"color": "Die Farbe dieser Aufgabe ändern",
|
"color": "Die Farbe dieser Aufgabe ändern",
|
||||||
"move": "Diese Aufgabe in eine andere Liste verschieben",
|
"move": "Diese Aufgabe in eine andere Liste verschieben",
|
||||||
"reminder": "Erinnerungen für diese Aufgabe verwalten"
|
"reminder": "Erinnerungen für diese Aufgabe verwalten",
|
||||||
|
"description": "Aufgabenbeschreibung bearbeiten"
|
||||||
},
|
},
|
||||||
"list": {
|
"list": {
|
||||||
"title": "Listenansicht",
|
"title": "Listenansicht",
|
||||||
|
|
|
@ -870,7 +870,8 @@
|
||||||
"related": "Beziehige vo dere Uufgab bearbeite",
|
"related": "Beziehige vo dere Uufgab bearbeite",
|
||||||
"color": "Die Farbe dieser Aufgabe ändern",
|
"color": "Die Farbe dieser Aufgabe ändern",
|
||||||
"move": "Diese Aufgabe in eine andere Liste verschieben",
|
"move": "Diese Aufgabe in eine andere Liste verschieben",
|
||||||
"reminder": "Erinnerungen für diese Aufgabe verwalten"
|
"reminder": "Erinnerungen für diese Aufgabe verwalten",
|
||||||
|
"description": "Aufgabenbeschreibung bearbeiten"
|
||||||
},
|
},
|
||||||
"list": {
|
"list": {
|
||||||
"title": "Listenansicht",
|
"title": "Listenansicht",
|
||||||
|
|
|
@ -873,7 +873,8 @@
|
||||||
"related": "Modify related tasks of this task",
|
"related": "Modify related tasks of this task",
|
||||||
"color": "Change the color of this task",
|
"color": "Change the color of this task",
|
||||||
"move": "Move this task to another list",
|
"move": "Move this task to another list",
|
||||||
"reminder": "Manage reminders of this task"
|
"reminder": "Manage reminders of this task",
|
||||||
|
"description": "Toggle editing of the task description"
|
||||||
},
|
},
|
||||||
"list": {
|
"list": {
|
||||||
"title": "List Views",
|
"title": "List Views",
|
||||||
|
|
|
@ -870,7 +870,8 @@
|
||||||
"related": "Modify related tasks of this task",
|
"related": "Modify related tasks of this task",
|
||||||
"color": "Change the color of this task",
|
"color": "Change the color of this task",
|
||||||
"move": "Move this task to another list",
|
"move": "Move this task to another list",
|
||||||
"reminder": "Manage reminders of this task"
|
"reminder": "Manage reminders of this task",
|
||||||
|
"description": "Toggle editing of the task description"
|
||||||
},
|
},
|
||||||
"list": {
|
"list": {
|
||||||
"title": "List Views",
|
"title": "List Views",
|
||||||
|
|
|
@ -870,7 +870,8 @@
|
||||||
"related": "Modifier les tâches connexes de cette tâche",
|
"related": "Modifier les tâches connexes de cette tâche",
|
||||||
"color": "Changer la couleur de cette tâche",
|
"color": "Changer la couleur de cette tâche",
|
||||||
"move": "Déplacer cette tâche dans une autre liste",
|
"move": "Déplacer cette tâche dans une autre liste",
|
||||||
"reminder": "Manage reminders of this task"
|
"reminder": "Manage reminders of this task",
|
||||||
|
"description": "Toggle editing of the task description"
|
||||||
},
|
},
|
||||||
"list": {
|
"list": {
|
||||||
"title": "Vues en liste",
|
"title": "Vues en liste",
|
||||||
|
|
|
@ -87,7 +87,7 @@
|
||||||
"language": "Lingua",
|
"language": "Lingua",
|
||||||
"defaultList": "Lista predefinita",
|
"defaultList": "Lista predefinita",
|
||||||
"timezone": "Fuso Orario",
|
"timezone": "Fuso Orario",
|
||||||
"overdueTasksRemindersTime": "Orario email del promemoria attività in ritardo"
|
"overdueTasksRemindersTime": "Orario email attività in scadute"
|
||||||
},
|
},
|
||||||
"totp": {
|
"totp": {
|
||||||
"title": "Autenticazione a due fattori",
|
"title": "Autenticazione a due fattori",
|
||||||
|
@ -562,12 +562,12 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"datemathHelp": {
|
"datemathHelp": {
|
||||||
"canuse": "You can use date math to filter for relative dates.",
|
"canuse": "Puoi usare le date calcolate per filtrare per date relative.",
|
||||||
"learnhow": "Scopri come funziona",
|
"learnhow": "Scopri come funziona",
|
||||||
"title": "Date Math",
|
"title": "Date Calcolate",
|
||||||
"intro": "Date Math allows you to specify relative dates which are resolved on the fly by Vikunja when applying the filter.",
|
"intro": "Le Date Calcolate ti permettono di specificare date relative che vengono calcolate al volo da Vikunja quando viene applicato il filtro.",
|
||||||
"expression": "Each Date Math expression starts with an anchor date, which can either be {0}, or a date string ending with {1}. This anchor date can optionally be followed by one or more maths expressions.",
|
"expression": "Ogni Data Calcolata inizia con una data base, che può essere {0}, o una data con {1} alla fine. Questa data base può essere seguita da una o più espressioni matematiche.",
|
||||||
"similar": "These expressions are similar to the ones provided by {0} and {1}.",
|
"similar": "Queste espressioni sono simili a quelle fornite da {0} e {1}.",
|
||||||
"add1Day": "Aggiungi un giorno",
|
"add1Day": "Aggiungi un giorno",
|
||||||
"minus1Day": "Sottrai un giorno",
|
"minus1Day": "Sottrai un giorno",
|
||||||
"roundDay": "Arrotonda per difetto al giorno più vicino",
|
"roundDay": "Arrotonda per difetto al giorno più vicino",
|
||||||
|
@ -781,7 +781,7 @@
|
||||||
"weeks": "Settimane",
|
"weeks": "Settimane",
|
||||||
"months": "Mesi",
|
"months": "Mesi",
|
||||||
"years": "Anni",
|
"years": "Anni",
|
||||||
"invalidAmount": "Please enter more than 0."
|
"invalidAmount": "Inserisci più di 0."
|
||||||
},
|
},
|
||||||
"quickAddMagic": {
|
"quickAddMagic": {
|
||||||
"hint": "Puoi usare l'Aggiunta Rapida Magica",
|
"hint": "Puoi usare l'Aggiunta Rapida Magica",
|
||||||
|
@ -791,15 +791,15 @@
|
||||||
"multiple": "Puoi usarlo più volte.",
|
"multiple": "Puoi usarlo più volte.",
|
||||||
"label1": "Per aggiungere un'etichetta, basta aggiungere il nome dell'etichetta preceduto da {prefix}.",
|
"label1": "Per aggiungere un'etichetta, basta aggiungere il nome dell'etichetta preceduto da {prefix}.",
|
||||||
"label2": "Vikunja controllerà prima se l'etichetta esiste già e nel caso la creerà.",
|
"label2": "Vikunja controllerà prima se l'etichetta esiste già e nel caso la creerà.",
|
||||||
"label3": "To use spaces, simply add a \" or ' around the label name.",
|
"label3": "Per usare gli spazi, basta aggiungere un \" o ' prima e dopo il nome dell'etichetta.",
|
||||||
"label4": "Per esempio: {prefix}\"Etichetta con spazi\".",
|
"label4": "Per esempio: {prefix}\"Etichetta con spazi\".",
|
||||||
"priority1": "Per impostare la priorità di un'attività, aggiungi un numero 1-5, preceduto da {prefix}.",
|
"priority1": "Per impostare la priorità di un'attività, aggiungi un numero 1-5, preceduto da {prefix}.",
|
||||||
"priority2": "Più alto è il numero, più alta è la priorità.",
|
"priority2": "Più alto è il numero, più alta è la priorità.",
|
||||||
"assignees": "Per assegnare direttamente l'attività a un utente, aggiungere il suo nome utente preceduto da {prefix} all'attività.",
|
"assignees": "Per assegnare direttamente l'attività a un utente, aggiungere il suo nome utente preceduto da {prefix} all'attività.",
|
||||||
"list1": "Per impostare una lista di appartenenza all'attività, inserisci il suo nome prefisso con {prefix}.",
|
"list1": "Per impostare una lista di appartenenza all'attività, inserisci il suo nome prefisso con {prefix}.",
|
||||||
"list2": "Ciò restituirà un errore se la lista non esiste.",
|
"list2": "Ciò restituirà un errore se la lista non esiste.",
|
||||||
"list3": "To use spaces, simply add a \" or ' around the list name.",
|
"list3": "Per usare gli spazi, basta aggiungere un \" o ' prima e dopo il nome della lista.",
|
||||||
"list4": "For example: {prefix}\"List with spaces\".",
|
"list4": "Per esempio: {prefix}\"Etichetta con spazi\".",
|
||||||
"dateAndTime": "Data e ora",
|
"dateAndTime": "Data e ora",
|
||||||
"date": "Qualsiasi data verrà utilizzata come data di scadenza della nuova attività. È possibile utilizzare le date in uno qualsiasi di questi formati:",
|
"date": "Qualsiasi data verrà utilizzata come data di scadenza della nuova attività. È possibile utilizzare le date in uno qualsiasi di questi formati:",
|
||||||
"dateWeekday": "qualsiasi giorno della settimana, userà la data più vicina",
|
"dateWeekday": "qualsiasi giorno della settimana, userà la data più vicina",
|
||||||
|
@ -870,7 +870,8 @@
|
||||||
"related": "Modifica le attività collegate a questa",
|
"related": "Modifica le attività collegate a questa",
|
||||||
"color": "Cambia il colore di questa attività",
|
"color": "Cambia il colore di questa attività",
|
||||||
"move": "Sposta questa attività in un altro elenco",
|
"move": "Sposta questa attività in un altro elenco",
|
||||||
"reminder": "Gestisci i promemoria di questa attività"
|
"reminder": "Gestisci i promemoria di questa attività",
|
||||||
|
"description": "Attiva/Disattiva modifica della descrizione dell'attività"
|
||||||
},
|
},
|
||||||
"list": {
|
"list": {
|
||||||
"title": "Viste Liste",
|
"title": "Viste Liste",
|
||||||
|
|
|
@ -870,7 +870,8 @@
|
||||||
"related": "Modify related tasks of this task",
|
"related": "Modify related tasks of this task",
|
||||||
"color": "Change the color of this task",
|
"color": "Change the color of this task",
|
||||||
"move": "Move this task to another list",
|
"move": "Move this task to another list",
|
||||||
"reminder": "Manage reminders of this task"
|
"reminder": "Manage reminders of this task",
|
||||||
|
"description": "Toggle editing of the task description"
|
||||||
},
|
},
|
||||||
"list": {
|
"list": {
|
||||||
"title": "List Views",
|
"title": "List Views",
|
||||||
|
|
|
@ -870,7 +870,8 @@
|
||||||
"related": "Zmodyfikuj zadania powiązane z tym zadaniem",
|
"related": "Zmodyfikuj zadania powiązane z tym zadaniem",
|
||||||
"color": "Zmień kolor tego zadania",
|
"color": "Zmień kolor tego zadania",
|
||||||
"move": "Przenieś to zadanie do innej listy",
|
"move": "Przenieś to zadanie do innej listy",
|
||||||
"reminder": "Zarządzaj przypomnieniami o tym zadaniu"
|
"reminder": "Zarządzaj przypomnieniami o tym zadaniu",
|
||||||
|
"description": "Toggle editing of the task description"
|
||||||
},
|
},
|
||||||
"list": {
|
"list": {
|
||||||
"title": "Widoki listy",
|
"title": "Widoki listy",
|
||||||
|
|
|
@ -870,7 +870,8 @@
|
||||||
"related": "Modify related tasks of this task",
|
"related": "Modify related tasks of this task",
|
||||||
"color": "Change the color of this task",
|
"color": "Change the color of this task",
|
||||||
"move": "Move this task to another list",
|
"move": "Move this task to another list",
|
||||||
"reminder": "Manage reminders of this task"
|
"reminder": "Manage reminders of this task",
|
||||||
|
"description": "Toggle editing of the task description"
|
||||||
},
|
},
|
||||||
"list": {
|
"list": {
|
||||||
"title": "List Views",
|
"title": "List Views",
|
||||||
|
|
|
@ -870,7 +870,8 @@
|
||||||
"related": "Modificar as tarefas relacionadas desta tarefa",
|
"related": "Modificar as tarefas relacionadas desta tarefa",
|
||||||
"color": "Alterar a cor desta tarefa",
|
"color": "Alterar a cor desta tarefa",
|
||||||
"move": "Mover esta tarefa para outra lista",
|
"move": "Mover esta tarefa para outra lista",
|
||||||
"reminder": "Gerir lembretes desta tarefa"
|
"reminder": "Gerir lembretes desta tarefa",
|
||||||
|
"description": "Alternar edição da descrição da tarefa"
|
||||||
},
|
},
|
||||||
"list": {
|
"list": {
|
||||||
"title": "Visualização em Lista",
|
"title": "Visualização em Lista",
|
||||||
|
|
|
@ -870,7 +870,8 @@
|
||||||
"related": "Modify related tasks of this task",
|
"related": "Modify related tasks of this task",
|
||||||
"color": "Change the color of this task",
|
"color": "Change the color of this task",
|
||||||
"move": "Move this task to another list",
|
"move": "Move this task to another list",
|
||||||
"reminder": "Manage reminders of this task"
|
"reminder": "Manage reminders of this task",
|
||||||
|
"description": "Toggle editing of the task description"
|
||||||
},
|
},
|
||||||
"list": {
|
"list": {
|
||||||
"title": "List Views",
|
"title": "List Views",
|
||||||
|
|
|
@ -870,7 +870,8 @@
|
||||||
"related": "Изменить связанные задачи",
|
"related": "Изменить связанные задачи",
|
||||||
"color": "Change the color of this task",
|
"color": "Change the color of this task",
|
||||||
"move": "Move this task to another list",
|
"move": "Move this task to another list",
|
||||||
"reminder": "Manage reminders of this task"
|
"reminder": "Manage reminders of this task",
|
||||||
|
"description": "Toggle editing of the task description"
|
||||||
},
|
},
|
||||||
"list": {
|
"list": {
|
||||||
"title": "List Views",
|
"title": "List Views",
|
||||||
|
|
|
@ -870,7 +870,8 @@
|
||||||
"related": "Modify related tasks of this task",
|
"related": "Modify related tasks of this task",
|
||||||
"color": "Change the color of this task",
|
"color": "Change the color of this task",
|
||||||
"move": "Move this task to another list",
|
"move": "Move this task to another list",
|
||||||
"reminder": "Manage reminders of this task"
|
"reminder": "Manage reminders of this task",
|
||||||
|
"description": "Toggle editing of the task description"
|
||||||
},
|
},
|
||||||
"list": {
|
"list": {
|
||||||
"title": "List Views",
|
"title": "List Views",
|
||||||
|
|
|
@ -870,7 +870,8 @@
|
||||||
"related": "Modify related tasks of this task",
|
"related": "Modify related tasks of this task",
|
||||||
"color": "Change the color of this task",
|
"color": "Change the color of this task",
|
||||||
"move": "Move this task to another list",
|
"move": "Move this task to another list",
|
||||||
"reminder": "Manage reminders of this task"
|
"reminder": "Manage reminders of this task",
|
||||||
|
"description": "Toggle editing of the task description"
|
||||||
},
|
},
|
||||||
"list": {
|
"list": {
|
||||||
"title": "List Views",
|
"title": "List Views",
|
||||||
|
|
|
@ -870,7 +870,8 @@
|
||||||
"related": "Modify related tasks of this task",
|
"related": "Modify related tasks of this task",
|
||||||
"color": "Change the color of this task",
|
"color": "Change the color of this task",
|
||||||
"move": "Move this task to another list",
|
"move": "Move this task to another list",
|
||||||
"reminder": "Manage reminders of this task"
|
"reminder": "Manage reminders of this task",
|
||||||
|
"description": "Toggle editing of the task description"
|
||||||
},
|
},
|
||||||
"list": {
|
"list": {
|
||||||
"title": "List Views",
|
"title": "List Views",
|
||||||
|
|
|
@ -870,7 +870,8 @@
|
||||||
"related": "Sửa đổi các công việc liên kết",
|
"related": "Sửa đổi các công việc liên kết",
|
||||||
"color": "Thay đổi màu công việc này",
|
"color": "Thay đổi màu công việc này",
|
||||||
"move": "Dời công việc này sang danh sách khác",
|
"move": "Dời công việc này sang danh sách khác",
|
||||||
"reminder": "Manage reminders of this task"
|
"reminder": "Manage reminders of this task",
|
||||||
|
"description": "Toggle editing of the task description"
|
||||||
},
|
},
|
||||||
"list": {
|
"list": {
|
||||||
"title": "Xem danh sách",
|
"title": "Xem danh sách",
|
||||||
|
|
|
@ -870,7 +870,8 @@
|
||||||
"related": "Modify related tasks of this task",
|
"related": "Modify related tasks of this task",
|
||||||
"color": "Change the color of this task",
|
"color": "Change the color of this task",
|
||||||
"move": "Move this task to another list",
|
"move": "Move this task to another list",
|
||||||
"reminder": "Manage reminders of this task"
|
"reminder": "Manage reminders of this task",
|
||||||
|
"description": "Toggle editing of the task description"
|
||||||
},
|
},
|
||||||
"list": {
|
"list": {
|
||||||
"title": "List Views",
|
"title": "List Views",
|
||||||
|
|
|
@ -5,7 +5,7 @@ import type { IUser } from '@/modelTypes/IUser'
|
||||||
import type { IFile } from '@/modelTypes/IFile'
|
import type { IFile } from '@/modelTypes/IFile'
|
||||||
import type { IAttachment } from '@/modelTypes/IAttachment'
|
import type { IAttachment } from '@/modelTypes/IAttachment'
|
||||||
|
|
||||||
export default class AttachmentModel extends AbstractModel implements IAttachment {
|
export default class AttachmentModel extends AbstractModel<IAttachment> implements IAttachment {
|
||||||
id = 0
|
id = 0
|
||||||
taskId = 0
|
taskId = 0
|
||||||
createdBy: IUser = UserModel
|
createdBy: IUser = UserModel
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import AbstractModel from './abstractModel'
|
import AbstractModel from './abstractModel'
|
||||||
import type { IAvatar } from '@/modelTypes/IAvatar'
|
import type { IAvatar } from '@/modelTypes/IAvatar'
|
||||||
|
|
||||||
export default class AvatarModel extends AbstractModel implements IAvatar {
|
export default class AvatarModel extends AbstractModel<IAvatar> implements IAvatar {
|
||||||
avatarProvider: IAvatar['avatarProvider'] = 'default'
|
avatarProvider: IAvatar['avatarProvider'] = 'default'
|
||||||
|
|
||||||
constructor(data: Partial<IAvatar>) {
|
constructor(data: Partial<IAvatar>) {
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import AbstractModel from './abstractModel'
|
import AbstractModel from './abstractModel'
|
||||||
import type {IBackgroundImage} from '@/modelTypes/IBackgroundImage'
|
import type {IBackgroundImage} from '@/modelTypes/IBackgroundImage'
|
||||||
|
|
||||||
export default class BackgroundImageModel extends AbstractModel implements IBackgroundImage {
|
export default class BackgroundImageModel extends AbstractModel<IBackgroundImage> implements IBackgroundImage {
|
||||||
id = 0
|
id = 0
|
||||||
url = ''
|
url = ''
|
||||||
thumb = ''
|
thumb = ''
|
||||||
|
|
|
@ -6,14 +6,14 @@ import type {IBucket} from '@/modelTypes/IBucket'
|
||||||
import type {ITask} from '@/modelTypes/ITask'
|
import type {ITask} from '@/modelTypes/ITask'
|
||||||
import type {IUser} from '@/modelTypes/IUser'
|
import type {IUser} from '@/modelTypes/IUser'
|
||||||
|
|
||||||
export default class BucketModel extends AbstractModel implements IBucket {
|
export default class BucketModel extends AbstractModel<IBucket> implements IBucket {
|
||||||
id = 0
|
id = 0
|
||||||
title = ''
|
title = ''
|
||||||
listId = ''
|
listId = ''
|
||||||
limit = 0
|
limit = 0
|
||||||
tasks: ITask[] = []
|
tasks: ITask[] = []
|
||||||
isDoneBucket: false
|
isDoneBucket = false
|
||||||
position: 0
|
position = 0
|
||||||
|
|
||||||
createdBy: IUser = null
|
createdBy: IUser = null
|
||||||
created: Date = null
|
created: Date = null
|
||||||
|
|
|
@ -2,7 +2,7 @@ import AbstractModel from './abstractModel'
|
||||||
|
|
||||||
import type {ICaldavToken} from '@/modelTypes/ICaldavToken'
|
import type {ICaldavToken} from '@/modelTypes/ICaldavToken'
|
||||||
|
|
||||||
export default class CaldavTokenModel extends AbstractModel implements ICaldavToken {
|
export default class CaldavTokenModel extends AbstractModel<ICaldavToken> implements ICaldavToken {
|
||||||
id: number
|
id: number
|
||||||
created: Date
|
created: Date
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ import AbstractModel from './abstractModel'
|
||||||
|
|
||||||
import type {IEmailUpdate} from '@/modelTypes/IEmailUpdate'
|
import type {IEmailUpdate} from '@/modelTypes/IEmailUpdate'
|
||||||
|
|
||||||
export default class EmailUpdateModel extends AbstractModel implements IEmailUpdate {
|
export default class EmailUpdateModel extends AbstractModel<IEmailUpdate> implements IEmailUpdate {
|
||||||
newEmail = ''
|
newEmail = ''
|
||||||
password = ''
|
password = ''
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import AbstractModel from './abstractModel'
|
import AbstractModel from './abstractModel'
|
||||||
import type {IFile} from '@/modelTypes/IFile'
|
import type {IFile} from '@/modelTypes/IFile'
|
||||||
|
|
||||||
export default class FileModel extends AbstractModel implements IFile {
|
export default class FileModel extends AbstractModel<IFile> implements IFile {
|
||||||
id = 0
|
id = 0
|
||||||
mime = ''
|
mime = ''
|
||||||
name = ''
|
name = ''
|
||||||
|
|
|
@ -8,7 +8,7 @@ import {colorIsDark} from '@/helpers/color/colorIsDark'
|
||||||
|
|
||||||
const DEFAULT_LABEL_BACKGROUND_COLOR = 'e8e8e8'
|
const DEFAULT_LABEL_BACKGROUND_COLOR = 'e8e8e8'
|
||||||
|
|
||||||
export default class LabelModel extends AbstractModel implements ILabel {
|
export default class LabelModel extends AbstractModel<ILabel> implements ILabel {
|
||||||
id = 0
|
id = 0
|
||||||
title = ''
|
title = ''
|
||||||
// FIXME: this should be empty and be definied in the client.
|
// FIXME: this should be empty and be definied in the client.
|
||||||
|
|
|
@ -2,7 +2,7 @@ import AbstractModel from './abstractModel'
|
||||||
|
|
||||||
import type { ILabelTask } from '@/modelTypes/ILabelTask'
|
import type { ILabelTask } from '@/modelTypes/ILabelTask'
|
||||||
|
|
||||||
export default class LabelTask extends AbstractModel implements ILabelTask {
|
export default class LabelTask extends AbstractModel<ILabelTask> implements ILabelTask {
|
||||||
id = 0
|
id = 0
|
||||||
taskId = 0
|
taskId = 0
|
||||||
labelId = 0
|
labelId = 0
|
||||||
|
|
|
@ -5,7 +5,7 @@ import {RIGHTS, type Right} from '@/constants/rights'
|
||||||
import type {ILinkShare} from '@/modelTypes/ILinkShare'
|
import type {ILinkShare} from '@/modelTypes/ILinkShare'
|
||||||
import type {IUser} from '@/modelTypes/IUser'
|
import type {IUser} from '@/modelTypes/IUser'
|
||||||
|
|
||||||
export default class LinkShareModel extends AbstractModel implements ILinkShare {
|
export default class LinkShareModel extends AbstractModel<ILinkShare> implements ILinkShare {
|
||||||
id = 0
|
id = 0
|
||||||
hash = ''
|
hash = ''
|
||||||
right: Right = RIGHTS.READ
|
right: Right = RIGHTS.READ
|
||||||
|
|
|
@ -11,7 +11,7 @@ import type {ISubscription} from '@/modelTypes/ISubscription'
|
||||||
|
|
||||||
import {getSavedFilterIdFromListId} from '@/helpers/savedFilter'
|
import {getSavedFilterIdFromListId} from '@/helpers/savedFilter'
|
||||||
|
|
||||||
export default class ListModel extends AbstractModel implements IList {
|
export default class ListModel extends AbstractModel<IList> implements IList {
|
||||||
id = 0
|
id = 0
|
||||||
title = ''
|
title = ''
|
||||||
description = ''
|
description = ''
|
||||||
|
@ -30,7 +30,7 @@ export default class ListModel extends AbstractModel implements IList {
|
||||||
created: Date = null
|
created: Date = null
|
||||||
updated: Date = null
|
updated: Date = null
|
||||||
|
|
||||||
constructor(data: Partial<IList>) {
|
constructor(data: Partial<IList> = {}) {
|
||||||
super()
|
super()
|
||||||
this.assignData(data)
|
this.assignData(data)
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@ import type {IListDuplicate} from '@/modelTypes/IListDuplicate'
|
||||||
import type {INamespace} from '@/modelTypes/INamespace'
|
import type {INamespace} from '@/modelTypes/INamespace'
|
||||||
import type {IList} from '@/modelTypes/IList'
|
import type {IList} from '@/modelTypes/IList'
|
||||||
|
|
||||||
export default class ListDuplicateModel extends AbstractModel implements IListDuplicate {
|
export default class ListDuplicateModel extends AbstractModel<IListDuplicate> implements IListDuplicate {
|
||||||
listId = 0
|
listId = 0
|
||||||
namespaceId: INamespace['id'] = 0
|
namespaceId: INamespace['id'] = 0
|
||||||
list: IList = ListModel
|
list: IList = ListModel
|
||||||
|
|
|
@ -8,7 +8,7 @@ import type {IUser} from '@/modelTypes/IUser'
|
||||||
import type {IList} from '@/modelTypes/IList'
|
import type {IList} from '@/modelTypes/IList'
|
||||||
import type {ISubscription} from '@/modelTypes/ISubscription'
|
import type {ISubscription} from '@/modelTypes/ISubscription'
|
||||||
|
|
||||||
export default class NamespaceModel extends AbstractModel implements INamespace {
|
export default class NamespaceModel extends AbstractModel<INamespace> implements INamespace {
|
||||||
id = 0
|
id = 0
|
||||||
title = ''
|
title = ''
|
||||||
description = ''
|
description = ''
|
||||||
|
@ -21,7 +21,7 @@ export default class NamespaceModel extends AbstractModel implements INamespace
|
||||||
created: Date = null
|
created: Date = null
|
||||||
updated: Date = null
|
updated: Date = null
|
||||||
|
|
||||||
constructor(data: Partial<INamespace>) {
|
constructor(data: Partial<INamespace> = {}) {
|
||||||
super()
|
super()
|
||||||
this.assignData(data)
|
this.assignData(data)
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@ import TeamModel from '@/models/team'
|
||||||
|
|
||||||
import {NOTIFICATION_NAMES, type INotification} from '@/modelTypes/INotification'
|
import {NOTIFICATION_NAMES, type INotification} from '@/modelTypes/INotification'
|
||||||
|
|
||||||
export default class NotificationModel extends AbstractModel implements INotification {
|
export default class NotificationModel extends AbstractModel<INotification> implements INotification {
|
||||||
id = 0
|
id = 0
|
||||||
name = ''
|
name = ''
|
||||||
notification: INotification['notification'] = null
|
notification: INotification['notification'] = null
|
||||||
|
|
|
@ -2,7 +2,7 @@ import AbstractModel from './abstractModel'
|
||||||
|
|
||||||
import type {IPasswordReset} from '@/modelTypes/IPasswordReset'
|
import type {IPasswordReset} from '@/modelTypes/IPasswordReset'
|
||||||
|
|
||||||
export default class PasswordResetModel extends AbstractModel implements IPasswordReset {
|
export default class PasswordResetModel extends AbstractModel<IPasswordReset> implements IPasswordReset {
|
||||||
token = ''
|
token = ''
|
||||||
newPassword = ''
|
newPassword = ''
|
||||||
email = ''
|
email = ''
|
||||||
|
|
|
@ -2,7 +2,7 @@ import AbstractModel from './abstractModel'
|
||||||
|
|
||||||
import type {IPasswordUpdate} from '@/modelTypes/IPasswordUpdate'
|
import type {IPasswordUpdate} from '@/modelTypes/IPasswordUpdate'
|
||||||
|
|
||||||
export default class PasswordUpdateModel extends AbstractModel implements IPasswordUpdate {
|
export default class PasswordUpdateModel extends AbstractModel<IPasswordUpdate> implements IPasswordUpdate {
|
||||||
newPassword = ''
|
newPassword = ''
|
||||||
oldPassword = ''
|
oldPassword = ''
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ import UserModel from '@/models/user'
|
||||||
import type {ISavedFilter} from '@/modelTypes/ISavedFilter'
|
import type {ISavedFilter} from '@/modelTypes/ISavedFilter'
|
||||||
import type {IUser} from '@/modelTypes/IUser'
|
import type {IUser} from '@/modelTypes/IUser'
|
||||||
|
|
||||||
export default class SavedFilterModel extends AbstractModel implements ISavedFilter {
|
export default class SavedFilterModel extends AbstractModel<ISavedFilter> implements ISavedFilter {
|
||||||
id = 0
|
id = 0
|
||||||
title = ''
|
title = ''
|
||||||
description = ''
|
description = ''
|
||||||
|
|
|
@ -4,7 +4,7 @@ import UserModel from '@/models/user'
|
||||||
import type {ISubscription} from '@/modelTypes/ISubscription'
|
import type {ISubscription} from '@/modelTypes/ISubscription'
|
||||||
import type {IUser} from '@/modelTypes/IUser'
|
import type {IUser} from '@/modelTypes/IUser'
|
||||||
|
|
||||||
export default class SubscriptionModel extends AbstractModel implements ISubscription {
|
export default class SubscriptionModel extends AbstractModel<ISubscription> implements ISubscription {
|
||||||
id = 0
|
id = 0
|
||||||
entity = ''
|
entity = ''
|
||||||
entityId = 0
|
entityId = 0
|
||||||
|
|
|
@ -32,7 +32,7 @@ export function getHexColor(hexColor: string) {
|
||||||
return hexColor
|
return hexColor
|
||||||
}
|
}
|
||||||
|
|
||||||
export default class TaskModel extends AbstractModel implements ITask {
|
export default class TaskModel extends AbstractModel<ITask> implements ITask {
|
||||||
id = 0
|
id = 0
|
||||||
title = ''
|
title = ''
|
||||||
description = ''
|
description = ''
|
||||||
|
|
|
@ -4,7 +4,7 @@ import type {ITaskAssignee} from '@/modelTypes/ITaskAssignee'
|
||||||
import type {IUser} from '@/modelTypes/IUser'
|
import type {IUser} from '@/modelTypes/IUser'
|
||||||
import type {ITask} from '@/modelTypes/ITask'
|
import type {ITask} from '@/modelTypes/ITask'
|
||||||
|
|
||||||
export default class TaskAssigneeModel extends AbstractModel implements ITaskAssignee {
|
export default class TaskAssigneeModel extends AbstractModel<ITaskAssignee> implements ITaskAssignee {
|
||||||
created: Date = null
|
created: Date = null
|
||||||
userId: IUser['id'] = 0
|
userId: IUser['id'] = 0
|
||||||
taskId: ITask['id'] = 0
|
taskId: ITask['id'] = 0
|
||||||
|
|
|
@ -5,7 +5,7 @@ import type {ITaskComment} from '@/modelTypes/ITaskComment'
|
||||||
import type {ITask} from '@/modelTypes/ITask'
|
import type {ITask} from '@/modelTypes/ITask'
|
||||||
import type {IUser} from '@/modelTypes/IUser'
|
import type {IUser} from '@/modelTypes/IUser'
|
||||||
|
|
||||||
export default class TaskCommentModel extends AbstractModel implements ITaskComment {
|
export default class TaskCommentModel extends AbstractModel<ITaskComment> implements ITaskComment {
|
||||||
id = 0
|
id = 0
|
||||||
taskId: ITask['id'] = 0
|
taskId: ITask['id'] = 0
|
||||||
comment = ''
|
comment = ''
|
||||||
|
|
|
@ -6,7 +6,7 @@ import type {ITask} from '@/modelTypes/ITask'
|
||||||
import type {IUser} from '@/modelTypes/IUser'
|
import type {IUser} from '@/modelTypes/IUser'
|
||||||
|
|
||||||
import type {IRelationKind} from '@/types/IRelationKind'
|
import type {IRelationKind} from '@/types/IRelationKind'
|
||||||
export default class TaskRelationModel extends AbstractModel implements ITaskRelation {
|
export default class TaskRelationModel extends AbstractModel<ITaskRelation> implements ITaskRelation {
|
||||||
id = 0
|
id = 0
|
||||||
otherTaskId: ITask['id'] = 0
|
otherTaskId: ITask['id'] = 0
|
||||||
taskId: ITask['id'] = 0
|
taskId: ITask['id'] = 0
|
||||||
|
|
|
@ -7,7 +7,7 @@ import type {ITeam} from '@/modelTypes/ITeam'
|
||||||
import type {ITeamMember} from '@/modelTypes/ITeamMember'
|
import type {ITeamMember} from '@/modelTypes/ITeamMember'
|
||||||
import type {IUser} from '@/modelTypes/IUser'
|
import type {IUser} from '@/modelTypes/IUser'
|
||||||
|
|
||||||
export default class TeamModel extends AbstractModel implements ITeam {
|
export default class TeamModel extends AbstractModel<ITeam> implements ITeam {
|
||||||
id = 0
|
id = 0
|
||||||
name = ''
|
name = ''
|
||||||
description = ''
|
description = ''
|
||||||
|
|
|
@ -8,7 +8,7 @@ import type {ITeam} from '@/modelTypes/ITeam'
|
||||||
* This class is a base class for common team sharing model.
|
* 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.
|
* It is extended in a way so it can be used for namespaces as well for lists.
|
||||||
*/
|
*/
|
||||||
export default class TeamShareBaseModel extends AbstractModel implements ITeamShareBase {
|
export default class TeamShareBaseModel extends AbstractModel<ITeamShareBase> implements ITeamShareBase {
|
||||||
teamId: ITeam['id'] = 0
|
teamId: ITeam['id'] = 0
|
||||||
right: Right = RIGHTS.READ
|
right: Right = RIGHTS.READ
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ import AbstractModel from './abstractModel'
|
||||||
|
|
||||||
import type {ITotp} from '@/modelTypes/ITotp'
|
import type {ITotp} from '@/modelTypes/ITotp'
|
||||||
|
|
||||||
export default class TotpModel extends AbstractModel implements ITotp {
|
export default class TotpModel extends AbstractModel<ITotp> implements ITotp {
|
||||||
secret = ''
|
secret = ''
|
||||||
enabled = false
|
enabled = false
|
||||||
url = ''
|
url = ''
|
||||||
|
|
|
@ -4,7 +4,7 @@ import UserSettingsModel from '@/models/userSettings'
|
||||||
import type { IUser } from '@/modelTypes/IUser'
|
import type { IUser } from '@/modelTypes/IUser'
|
||||||
import type { IUserSettings } from '@/modelTypes/IUserSettings'
|
import type { IUserSettings } from '@/modelTypes/IUserSettings'
|
||||||
|
|
||||||
export default class UserModel extends AbstractModel implements IUser {
|
export default class UserModel extends AbstractModel<IUser> implements IUser {
|
||||||
id = 0
|
id = 0
|
||||||
email = ''
|
email = ''
|
||||||
username = ''
|
username = ''
|
||||||
|
|
|
@ -4,7 +4,7 @@ import AbstractModel from './abstractModel'
|
||||||
import type {IUserSettings} from '@/modelTypes/IUserSettings'
|
import type {IUserSettings} from '@/modelTypes/IUserSettings'
|
||||||
import type {IList} from '@/modelTypes/IList'
|
import type {IList} from '@/modelTypes/IList'
|
||||||
|
|
||||||
export default class UserSettingsModel extends AbstractModel implements IUserSettings {
|
export default class UserSettingsModel extends AbstractModel<IUserSettings> implements IUserSettings {
|
||||||
name = ''
|
name = ''
|
||||||
emailRemindersEnabled = true
|
emailRemindersEnabled = true
|
||||||
discoverableByName = false
|
discoverableByName = false
|
||||||
|
|
|
@ -4,7 +4,7 @@ import {RIGHTS, type Right} from '@/constants/rights'
|
||||||
import type {IUserShareBase} from '@/modelTypes/IUserShareBase'
|
import type {IUserShareBase} from '@/modelTypes/IUserShareBase'
|
||||||
import type {IUser} from '@/modelTypes/IUser'
|
import type {IUser} from '@/modelTypes/IUser'
|
||||||
|
|
||||||
export default class UserShareBaseModel extends AbstractModel implements IUserShareBase {
|
export default class UserShareBaseModel extends AbstractModel<IUserShareBase> implements IUserShareBase {
|
||||||
userId: IUser['id'] = ''
|
userId: IUser['id'] = ''
|
||||||
right: Right = RIGHTS.READ
|
right: Right = RIGHTS.READ
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import {beforeEach, afterEach, describe, it, expect, vi} from 'vitest'
|
import {beforeEach, afterEach, describe, it, expect, vi} from 'vitest'
|
||||||
|
|
||||||
import {parseTaskText} from './parseTaskText'
|
import {parseTaskText, PrefixMode} from './parseTaskText'
|
||||||
import {getDateFromText, getDateFromTextIn} from '../helpers/time/parseDate'
|
import {getDateFromText, getDateFromTextIn} from '../helpers/time/parseDate'
|
||||||
import {calculateDayInterval} from '../helpers/time/calculateDayInterval'
|
import {calculateDayInterval} from '../helpers/time/calculateDayInterval'
|
||||||
import {PRIORITIES} from '@/constants/priorities'
|
import {PRIORITIES} from '@/constants/priorities'
|
||||||
|
@ -20,13 +20,13 @@ describe('Parse Task Text', () => {
|
||||||
|
|
||||||
it('should not parse text when disabled', () => {
|
it('should not parse text when disabled', () => {
|
||||||
const text = 'Lorem Ipsum today *label +list !2 @user'
|
const text = 'Lorem Ipsum today *label +list !2 @user'
|
||||||
const result = parseTaskText(text, 'disabled')
|
const result = parseTaskText(text, PrefixMode.Disabled)
|
||||||
|
|
||||||
expect(result.text).toBe(text)
|
expect(result.text).toBe(text)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should parse text in todoist mode when configured', () => {
|
it('should parse text in todoist mode when configured', () => {
|
||||||
const result = parseTaskText('Lorem Ipsum today @label #list !2 +user', 'todoist')
|
const result = parseTaskText('Lorem Ipsum today @label #list !2 +user', PrefixMode.Todoist)
|
||||||
|
|
||||||
expect(result.text).toBe('Lorem Ipsum')
|
expect(result.text).toBe('Lorem Ipsum')
|
||||||
const now = new Date()
|
const now = new Date()
|
||||||
|
@ -84,7 +84,7 @@ describe('Parse Task Text', () => {
|
||||||
'at 3am': '3:0',
|
'at 3am': '3:0',
|
||||||
'at 3:12 am': '3:12',
|
'at 3:12 am': '3:12',
|
||||||
'at 3:12 pm': '15:12',
|
'at 3:12 pm': '15:12',
|
||||||
}
|
} as const
|
||||||
|
|
||||||
for (const c in cases) {
|
for (const c in cases) {
|
||||||
it(`should recognize today with a time ${c}`, () => {
|
it(`should recognize today with a time ${c}`, () => {
|
||||||
|
@ -95,7 +95,7 @@ describe('Parse Task Text', () => {
|
||||||
expect(result.date.getFullYear()).toBe(now.getFullYear())
|
expect(result.date.getFullYear()).toBe(now.getFullYear())
|
||||||
expect(result.date.getMonth()).toBe(now.getMonth())
|
expect(result.date.getMonth()).toBe(now.getMonth())
|
||||||
expect(result.date.getDate()).toBe(now.getDate())
|
expect(result.date.getDate()).toBe(now.getDate())
|
||||||
expect(`${result.date.getHours()}:${result.date.getMinutes()}`).toBe(cases[c])
|
expect(`${result.date.getHours()}:${result.date.getMinutes()}`).toBe(cases[c as keyof typeof cases])
|
||||||
expect(result.date.getSeconds()).toBe(0)
|
expect(result.date.getSeconds()).toBe(0)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@ import type {Method} from 'axios'
|
||||||
import {objectToSnakeCase} from '@/helpers/case'
|
import {objectToSnakeCase} from '@/helpers/case'
|
||||||
import AbstractModel, { type IAbstract } from '@/models/abstractModel'
|
import AbstractModel, { type IAbstract } from '@/models/abstractModel'
|
||||||
import type { Right } from '@/constants/rights'
|
import type { Right } from '@/constants/rights'
|
||||||
import type { IFile } from '@/models/file'
|
import type {IFile} from '@/modelTypes/IFile'
|
||||||
|
|
||||||
interface Paths {
|
interface Paths {
|
||||||
create : string
|
create : string
|
||||||
|
|
|
@ -1,8 +1,12 @@
|
||||||
import AbstractService from './abstractService'
|
|
||||||
import AttachmentModel, { type IAttachment } from '../models/attachment'
|
|
||||||
import {formatISO} from 'date-fns'
|
import {formatISO} from 'date-fns'
|
||||||
|
|
||||||
|
import AbstractService from './abstractService'
|
||||||
|
import AttachmentModel from '../models/attachment'
|
||||||
|
|
||||||
|
import type { IAttachment } from '@/modelTypes/IAttachment'
|
||||||
|
import type { IFile } from '@/modelTypes/IFile'
|
||||||
|
|
||||||
import {downloadBlob} from '@/helpers/downloadBlob'
|
import {downloadBlob} from '@/helpers/downloadBlob'
|
||||||
import type { IFile } from '@/models/file'
|
|
||||||
|
|
||||||
export default class AttachmentService extends AbstractService<AttachmentModel> {
|
export default class AttachmentService extends AbstractService<AttachmentModel> {
|
||||||
constructor() {
|
constructor() {
|
||||||
|
@ -22,7 +26,7 @@ export default class AttachmentService extends AbstractService<AttachmentModel>
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
modelFactory(data) {
|
modelFactory(data: Partial<IAttachment>) {
|
||||||
return new AttachmentModel(data)
|
return new AttachmentModel(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,7 +56,7 @@ export default class AttachmentService extends AbstractService<AttachmentModel>
|
||||||
const data = new FormData()
|
const data = new FormData()
|
||||||
for (let i = 0; i < files.length; i++) {
|
for (let i = 0; i < files.length; i++) {
|
||||||
// TODO: Validation of file size
|
// TODO: Validation of file size
|
||||||
data.append('files', new Blob([JSON.stringify(files[i], null, 2)]), files[i].name)
|
data.append('files', new Blob([files[i]]), files[i].name)
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.uploadFormData(
|
return this.uploadFormData(
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import AbstractService from './abstractService'
|
import AbstractService from './abstractService'
|
||||||
import AvatarModel, { type IAvatar } from '../models/avatar'
|
import AvatarModel from '@/models/avatar'
|
||||||
|
import type { IAvatar } from '@/modelTypes/IAvatar'
|
||||||
|
|
||||||
export default class AvatarService extends AbstractService<IAvatar> {
|
export default class AvatarService extends AbstractService<IAvatar> {
|
||||||
constructor() {
|
constructor() {
|
||||||
|
@ -10,7 +11,7 @@ export default class AvatarService extends AbstractService<IAvatar> {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
modelFactory(data) {
|
modelFactory(data: Partial<IAvatar>) {
|
||||||
return new AvatarModel(data)
|
return new AvatarModel(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import AbstractService from './abstractService'
|
import AbstractService from './abstractService'
|
||||||
import BackgroundImageModel, { type IBackgroundImage } from '../models/backgroundImage'
|
import BackgroundImageModel from '../models/backgroundImage'
|
||||||
import ListModel from '@/models/list'
|
import ListModel from '@/models/list'
|
||||||
|
import type { IBackgroundImage } from '@/modelTypes/IBackgroundImage'
|
||||||
|
|
||||||
export default class BackgroundUnsplashService extends AbstractService<IBackgroundImage> {
|
export default class BackgroundUnsplashService extends AbstractService<IBackgroundImage> {
|
||||||
constructor() {
|
constructor() {
|
||||||
|
@ -10,7 +11,7 @@ export default class BackgroundUnsplashService extends AbstractService<IBackgrou
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
modelFactory(data) {
|
modelFactory(data: Partial<IBackgroundImage>) {
|
||||||
return new BackgroundImageModel(data)
|
return new BackgroundImageModel(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
import AbstractService from './abstractService'
|
import AbstractService from './abstractService'
|
||||||
import ListModel, { type IList } from '../models/list'
|
import ListModel from '@/models/list'
|
||||||
import type { IFile } from '@/models/file'
|
|
||||||
|
import type { IList } from '@/modelTypes/IList'
|
||||||
|
import type { IFile } from '@/modelTypes/IFile'
|
||||||
|
|
||||||
export default class BackgroundUploadService extends AbstractService {
|
export default class BackgroundUploadService extends AbstractService {
|
||||||
constructor() {
|
constructor() {
|
||||||
|
@ -13,14 +15,12 @@ export default class BackgroundUploadService extends AbstractService {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
modelCreateFactory(data) {
|
modelCreateFactory(data: Partial<IList>) {
|
||||||
return new ListModel(data)
|
return new ListModel(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Uploads a file to the server
|
* Uploads a file to the server
|
||||||
* @param file
|
|
||||||
* @returns {Promise<any|never>}
|
|
||||||
*/
|
*/
|
||||||
create(listId: IList['id'], file: IFile) {
|
create(listId: IList['id'], file: IFile) {
|
||||||
return this.uploadFile(
|
return this.uploadFile(
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import AbstractService from './abstractService'
|
import AbstractService from './abstractService'
|
||||||
import BucketModel, { type IBucket } from '../models/bucket'
|
import BucketModel from '../models/bucket'
|
||||||
import TaskService from '@/services/task'
|
import TaskService from '@/services/task'
|
||||||
|
import type { IBucket } from '@/modelTypes/IBucket'
|
||||||
|
|
||||||
export default class BucketService extends AbstractService<IBucket> {
|
export default class BucketService extends AbstractService<IBucket> {
|
||||||
constructor() {
|
constructor() {
|
||||||
|
@ -12,7 +13,7 @@ export default class BucketService extends AbstractService<IBucket> {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
modelFactory(data) {
|
modelFactory(data: Partial<IBucket>) {
|
||||||
return new BucketModel(data)
|
return new BucketModel(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import {formatISO} from 'date-fns'
|
import {formatISO} from 'date-fns'
|
||||||
import CaldavTokenModel, {type ICaldavToken} from '../models/caldavToken'
|
import CaldavTokenModel from '@/models/caldavToken'
|
||||||
|
import type {ICaldavToken} from '@/modelTypes/ICaldavToken'
|
||||||
import AbstractService from './abstractService'
|
import AbstractService from './abstractService'
|
||||||
|
|
||||||
export default class CaldavTokenService extends AbstractService<ICaldavToken> {
|
export default class CaldavTokenService extends AbstractService<ICaldavToken> {
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import AbstractService from './abstractService'
|
import AbstractService from './abstractService'
|
||||||
import LabelModel, { type ILabel } from '@/models/label'
|
import LabelModel from '@/models/label'
|
||||||
|
import type {ILabel} from '@/modelTypes/ILabel'
|
||||||
import {formatISO} from 'date-fns'
|
import {formatISO} from 'date-fns'
|
||||||
import {colorFromHex} from '@/helpers/color/colorFromHex'
|
import {colorFromHex} from '@/helpers/color/colorFromHex'
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import AbstractService from './abstractService'
|
import AbstractService from './abstractService'
|
||||||
import LabelTask, {type ILabelTask} from '@/models/labelTask'
|
import LabelTask from '@/models/labelTask'
|
||||||
|
import type {ILabelTask} from '@/modelTypes/ILabelTask'
|
||||||
|
|
||||||
export default class LabelTaskService extends AbstractService<ILabelTask> {
|
export default class LabelTaskService extends AbstractService<ILabelTask> {
|
||||||
constructor() {
|
constructor() {
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import AbstractService from './abstractService'
|
import AbstractService from './abstractService'
|
||||||
import LinkShareModel, { type ILinkShare } from '@/models/linkShare'
|
import LinkShareModel from '@/models/linkShare'
|
||||||
|
import type {ILinkShare} from '@/modelTypes/ILinkShare'
|
||||||
import {formatISO} from 'date-fns'
|
import {formatISO} from 'date-fns'
|
||||||
|
|
||||||
export default class LinkShareService extends AbstractService<ILinkShare> {
|
export default class LinkShareService extends AbstractService<ILinkShare> {
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import AbstractService from './abstractService'
|
import AbstractService from './abstractService'
|
||||||
import ListModel, { type IList } from '@/models/list'
|
import ListModel from '@/models/list'
|
||||||
|
import type {IList} from '@/modelTypes/IList'
|
||||||
import TaskService from './task'
|
import TaskService from './task'
|
||||||
import {formatISO} from 'date-fns'
|
import {formatISO} from 'date-fns'
|
||||||
import {colorFromHex} from '@/helpers/color/colorFromHex'
|
import {colorFromHex} from '@/helpers/color/colorFromHex'
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import AbstractService from './abstractService'
|
import AbstractService from './abstractService'
|
||||||
import listDuplicateModel, {type IListDuplicate} from '../models/listDuplicateModel'
|
import listDuplicateModel from '@/models/listDuplicateModel'
|
||||||
|
import type {IListDuplicate} from '@/modelTypes/IListDuplicate'
|
||||||
|
|
||||||
export default class ListDuplicateService extends AbstractService<IListDuplicate> {
|
export default class ListDuplicateService extends AbstractService<IListDuplicate> {
|
||||||
constructor() {
|
constructor() {
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import type {IFile} from '@/modelTypes/IFile'
|
||||||
import AbstractService from '../abstractService'
|
import AbstractService from '../abstractService'
|
||||||
|
|
||||||
// This service builds on top of the abstract service and basically just hides away method names.
|
// This service builds on top of the abstract service and basically just hides away method names.
|
||||||
|
@ -5,7 +6,7 @@ import AbstractService from '../abstractService'
|
||||||
export default class AbstractMigrationFileService extends AbstractService {
|
export default class AbstractMigrationFileService extends AbstractService {
|
||||||
serviceUrlKey = ''
|
serviceUrlKey = ''
|
||||||
|
|
||||||
constructor(serviceUrlKey) {
|
constructor(serviceUrlKey: '') {
|
||||||
super({
|
super({
|
||||||
create: '/migration/' + serviceUrlKey + '/migrate',
|
create: '/migration/' + serviceUrlKey + '/migrate',
|
||||||
})
|
})
|
||||||
|
@ -20,7 +21,7 @@ export default class AbstractMigrationFileService extends AbstractService {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
migrate(file) {
|
migrate(file: IFile) {
|
||||||
console.log(file)
|
console.log(file)
|
||||||
return this.uploadFile(
|
return this.uploadFile(
|
||||||
this.paths.create,
|
this.paths.create,
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import AbstractService from './abstractService'
|
import AbstractService from './abstractService'
|
||||||
import NamespaceModel, { type INamespace } from '../models/namespace'
|
import NamespaceModel from '../models/namespace'
|
||||||
|
import type {INamespace} from '@/modelTypes/INamespace'
|
||||||
import {formatISO} from 'date-fns'
|
import {formatISO} from 'date-fns'
|
||||||
import {colorFromHex} from '@/helpers/color/colorFromHex'
|
import {colorFromHex} from '@/helpers/color/colorFromHex'
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import AbstractService from '@/services/abstractService'
|
import AbstractService from '@/services/abstractService'
|
||||||
import {formatISO} from 'date-fns'
|
import {formatISO} from 'date-fns'
|
||||||
import NotificationModel, { type INotification } from '@/models/notification'
|
import NotificationModel from '@/models/notification'
|
||||||
|
import type {INotification} from '@/modelTypes/INotification'
|
||||||
|
|
||||||
export default class NotificationService extends AbstractService<INotification> {
|
export default class NotificationService extends AbstractService<INotification> {
|
||||||
constructor() {
|
constructor() {
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import AbstractService from './abstractService'
|
import AbstractService from './abstractService'
|
||||||
import PasswordResetModel, { type IPasswordReset } from '../models/passwordReset'
|
import PasswordResetModel from '@/models/passwordReset'
|
||||||
|
import type {IPasswordReset} from '@/modelTypes/IPasswordReset'
|
||||||
|
|
||||||
export default class PasswordResetService extends AbstractService<IPasswordReset> {
|
export default class PasswordResetService extends AbstractService<IPasswordReset> {
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import type { IPasswordUpdate } from '@/models/passwordUpdate'
|
|
||||||
import AbstractService from './abstractService'
|
import AbstractService from './abstractService'
|
||||||
|
import type {IPasswordUpdate} from '@/modelTypes/IPasswordUpdate'
|
||||||
|
|
||||||
export default class PasswordUpdateService extends AbstractService<IPasswordUpdate> {
|
export default class PasswordUpdateService extends AbstractService<IPasswordUpdate> {
|
||||||
constructor() {
|
constructor() {
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import AbstractService from '@/services/abstractService'
|
import AbstractService from '@/services/abstractService'
|
||||||
import SavedFilterModel, { type ISavedFilter } from '@/models/savedFilter'
|
import SavedFilterModel from '@/models/savedFilter'
|
||||||
|
import type {ISavedFilter} from '@/modelTypes/ISavedFilter'
|
||||||
import {objectToCamelCase} from '@/helpers/case'
|
import {objectToCamelCase} from '@/helpers/case'
|
||||||
|
|
||||||
export default class SavedFilterService extends AbstractService<ISavedFilter> {
|
export default class SavedFilterService extends AbstractService<ISavedFilter> {
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue