Merge branch 'main' into feature/login-improvements

This commit is contained in:
konrad 2022-01-23 17:06:49 +00:00
commit cd92d224a2
60 changed files with 1300 additions and 1156 deletions

View File

@ -1,4 +1,4 @@
import faker from 'faker' import faker from '@faker-js/faker'
import {Factory} from '../support/factory' import {Factory} from '../support/factory'
import {formatISO} from 'date-fns' import {formatISO} from 'date-fns'

View File

@ -1,4 +1,4 @@
import faker from 'faker' import faker from '@faker-js/faker'
import {Factory} from '../support/factory' import {Factory} from '../support/factory'
import {formatISO} from 'date-fns' import {formatISO} from 'date-fns'

View File

@ -1,6 +1,6 @@
import {Factory} from '../support/factory' import {Factory} from '../support/factory'
import {formatISO} from "date-fns" import {formatISO} from "date-fns"
import faker from 'faker' import faker from '@faker-js/faker'
export class LinkShareFactory extends Factory { export class LinkShareFactory extends Factory {
static table = 'link_shares' static table = 'link_shares'

View File

@ -1,6 +1,6 @@
import {Factory} from '../support/factory' import {Factory} from '../support/factory'
import {formatISO} from "date-fns" import {formatISO} from "date-fns"
import faker from 'faker' import faker from '@faker-js/faker'
export class ListFactory extends Factory { export class ListFactory extends Factory {
static table = 'lists' static table = 'lists'

View File

@ -1,4 +1,4 @@
import faker from 'faker' import faker from '@faker-js/faker'
import {Factory} from '../support/factory' import {Factory} from '../support/factory'
import {formatISO} from 'date-fns' import {formatISO} from 'date-fns'

View File

@ -1,4 +1,4 @@
import faker from 'faker' import faker from '@faker-js/faker'
import {Factory} from '../support/factory' import {Factory} from '../support/factory'
import {formatISO} from 'date-fns' import {formatISO} from 'date-fns'

View File

@ -1,4 +1,4 @@
import faker from 'faker' import faker from '@faker-js/faker'
import {Factory} from '../support/factory' import {Factory} from '../support/factory'
import {formatISO} from "date-fns" import {formatISO} from "date-fns"

View File

@ -1,4 +1,4 @@
import faker from 'faker' import faker from '@faker-js/faker'
import {Factory} from '../support/factory' import {Factory} from '../support/factory'
import {formatISO} from 'date-fns' import {formatISO} from 'date-fns'

View File

@ -1,4 +1,4 @@
import faker from 'faker' import faker from '@faker-js/faker'
import {Factory} from '../support/factory' import {Factory} from '../support/factory'
import {formatISO} from "date-fns" import {formatISO} from "date-fns"

View File

@ -128,7 +128,7 @@ describe('Task', () => {
cy.visit(`/tasks/${tasks[0].id}`) cy.visit(`/tasks/${tasks[0].id}`)
cy.get('.task-view .action-buttons .button') cy.get('.task-view .action-buttons .button')
.contains('Done!') .contains('Mark task done!')
.click() .click()
cy.get('.task-view .heading .is-done') cy.get('.task-view .heading .is-done')

View File

@ -13,6 +13,7 @@
"lint": "eslint --ignore-pattern '*.test.*' ./src --ext .vue,.js,.ts", "lint": "eslint --ignore-pattern '*.test.*' ./src --ext .vue,.js,.ts",
"cypress:open": "cypress open", "cypress:open": "cypress open",
"test:unit": "vitest run", "test:unit": "vitest run",
"test:unit-watch": "vitest watch",
"test:frontend": "cypress run", "test:frontend": "cypress run",
"browserslist:update": "npx browserslist@latest --update-db" "browserslist:update": "npx browserslist@latest --update-db"
}, },
@ -22,32 +23,32 @@
"@sentry/tracing": "6.16.1", "@sentry/tracing": "6.16.1",
"@sentry/vue": "6.16.1", "@sentry/vue": "6.16.1",
"@types/is-touch-device": "1.0.0", "@types/is-touch-device": "1.0.0",
"@vue/compat": "3.2.26", "@vue/compat": "3.2.29",
"@vueuse/core": "7.5.2", "@vueuse/core": "7.5.4",
"@vueuse/router": "7.5.3", "@vueuse/router": "7.5.4",
"bulma-css-variables": "0.9.33", "bulma-css-variables": "0.9.33",
"camel-case": "4.1.2", "camel-case": "4.1.2",
"codemirror": "5.65.0", "codemirror": "5.65.1",
"copy-to-clipboard": "3.3.1", "copy-to-clipboard": "3.3.1",
"date-fns": "2.28.0", "date-fns": "2.28.0",
"dompurify": "2.3.4", "dompurify": "2.3.4",
"easymde": "2.15.0", "easymde": "2.16.1",
"flatpickr": "4.6.9", "flatpickr": "4.6.9",
"flexsearch": "0.7.21", "flexsearch": "0.7.21",
"highlight.js": "11.4.0", "highlight.js": "11.4.0",
"is-touch-device": "1.0.1", "is-touch-device": "1.0.1",
"lodash.clonedeep": "4.5.0", "lodash.clonedeep": "4.5.0",
"lodash.debounce": "4.0.8", "lodash.debounce": "4.0.8",
"marked": "4.0.9", "marked": "4.0.10",
"register-service-worker": "1.7.2", "register-service-worker": "1.7.2",
"snake-case": "3.0.4", "snake-case": "3.0.4",
"ufo": "0.7.9", "ufo": "0.7.9",
"v-tooltip": "4.0.0-beta.13", "v-tooltip": "4.0.0-beta.17",
"vue": "3.2.26", "vue": "3.2.29",
"vue-advanced-cropper": "2.7.1", "vue-advanced-cropper": "2.8.0",
"vue-drag-resize": "2.0.3", "vue-drag-resize": "2.0.3",
"vue-flatpickr-component": "9.0.5", "vue-flatpickr-component": "9.0.5",
"vue-i18n": "9.2.0-beta.26", "vue-i18n": "9.2.0-beta.28",
"vue-router": "4.0.12", "vue-router": "4.0.12",
"vuedraggable": "4.1.0", "vuedraggable": "4.1.0",
"vuex": "4.0.2", "vuex": "4.0.2",
@ -55,41 +56,41 @@
}, },
"devDependencies": { "devDependencies": {
"@4tw/cypress-drag-drop": "2.1.0", "@4tw/cypress-drag-drop": "2.1.0",
"@faker-js/faker": "6.0.0-alpha.3",
"@fortawesome/fontawesome-svg-core": "1.2.36", "@fortawesome/fontawesome-svg-core": "1.2.36",
"@fortawesome/free-regular-svg-icons": "5.15.4", "@fortawesome/free-regular-svg-icons": "5.15.4",
"@fortawesome/free-solid-svg-icons": "5.15.4", "@fortawesome/free-solid-svg-icons": "5.15.4",
"@fortawesome/vue-fontawesome": "3.0.0-5", "@fortawesome/vue-fontawesome": "3.0.0-5",
"@types/flexsearch": "0.7.2", "@types/flexsearch": "0.7.2",
"@typescript-eslint/eslint-plugin": "5.9.0", "@typescript-eslint/eslint-plugin": "5.10.0",
"@typescript-eslint/parser": "5.9.0", "@typescript-eslint/parser": "5.10.0",
"@vitejs/plugin-legacy": "1.6.4", "@vitejs/plugin-legacy": "1.6.4",
"@vitejs/plugin-vue": "2.0.1", "@vitejs/plugin-vue": "2.1.0",
"@vue/eslint-config-typescript": "10.0.0", "@vue/eslint-config-typescript": "10.0.0",
"autoprefixer": "10.4.2", "autoprefixer": "10.4.2",
"axios": "0.24.0", "axios": "0.25.0",
"browserslist": "4.19.1", "browserslist": "4.19.1",
"caniuse-lite": "1.0.30001298", "caniuse-lite": "1.0.30001301",
"cypress": "9.2.0", "cypress": "9.3.1",
"cypress-file-upload": "5.0.8", "cypress-file-upload": "5.0.8",
"esbuild": "0.14.10", "esbuild": "0.14.13",
"eslint": "8.6.0", "eslint": "8.7.0",
"eslint-plugin-vue": "8.2.0", "eslint-plugin-vue": "8.3.0",
"express": "4.17.2", "express": "4.17.2",
"faker": "5.5.3", "netlify-cli": "8.8.2",
"netlify-cli": "8.6.15", "happy-dom": "2.28.0",
"happy-dom": "2.25.1",
"postcss": "8.4.5", "postcss": "8.4.5",
"postcss-preset-env": "7.2.0", "postcss-preset-env": "7.2.3",
"rollup": "2.63.0", "rollup": "2.66.0",
"rollup-plugin-visualizer": "5.5.2", "rollup-plugin-visualizer": "5.5.4",
"sass": "1.47.0", "sass": "1.49.0",
"slugify": "1.6.5", "slugify": "1.6.5",
"typescript": "4.5.4", "typescript": "4.5.5",
"vite": "2.7.10", "vite": "2.7.13",
"vite-plugin-pwa": "0.11.12", "vite-plugin-pwa": "0.11.13",
"vite-svg-loader": "3.1.1", "vite-svg-loader": "3.1.2",
"vitest": "0.0.139", "vitest": "0.2.0",
"vue-tsc": "0.30.2", "vue-tsc": "0.31.1",
"wait-on": "6.0.0", "wait-on": "6.0.0",
"workbox-cli": "6.4.2" "workbox-cli": "6.4.2"
}, },

View File

@ -3,5 +3,11 @@
"labels": ["dependencies"], "labels": ["dependencies"],
"extends": [ "extends": [
"config:base" "config:base"
],
"packageRules": [
{
"matchPackageNames": ["netlify-cli"],
"extends": ["schedule:weekly"]
}
] ]
} }

View File

@ -42,7 +42,7 @@ import {useBodyClass} from '@/composables/useBodyClass'
const store = useStore() const store = useStore()
const router = useRouter() const router = useRouter()
useBodyClass('is-touch', isTouchDevice) useBodyClass('is-touch', isTouchDevice())
const keyboardShortcutsActive = computed(() => store.state.keyboardShortcutsActive) const keyboardShortcutsActive = computed(() => store.state.keyboardShortcutsActive)
const authUser = computed(() => store.getters['auth/authUser']) const authUser = computed(() => store.getters['auth/authUser'])

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 6.5 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

View File

@ -9,7 +9,7 @@
class="app-container" class="app-container"
> >
<navigation/> <navigation/>
<div <main
:class="[ :class="[
{ 'is-menu-enabled': menuActive }, { 'is-menu-enabled': menuActive },
$route.name, $route.name,
@ -35,7 +35,7 @@
> >
<icon icon="keyboard"/> <icon icon="keyboard"/>
</a> </a>
</div> </main>
</div> </div>
</div> </div>
</template> </template>

View File

@ -1,8 +1,8 @@
<template> <template>
<div :class="{'is-active': menuActive}" class="namespace-container"> <aside :class="{'is-active': menuActive}" class="namespace-container">
<div class="menu top-menu"> <nav class="menu top-menu">
<router-link :to="{name: 'home'}" class="logo"> <router-link :to="{name: 'home'}" class="logo">
<Logo width="164" height="48" /> <Logo width="164" height="48"/>
</router-link> </router-link>
<ul class="menu-list"> <ul class="menu-list">
<li> <li>
@ -46,31 +46,35 @@
</router-link> </router-link>
</li> </li>
</ul> </ul>
</div> </nav>
<aside class="menu namespaces-lists loader-container is-loading-small" :class="{'is-loading': loading}"> <nav class="menu namespaces-lists loader-container is-loading-small" :class="{'is-loading': loading}">
<template v-for="(n, nk) in namespaces" :key="n.id" > <template v-for="(n, nk) in namespaces" :key="n.id">
<div class="namespace-title" :class="{'has-menu': n.id > 0}"> <div class="namespace-title" :class="{'has-menu': n.id > 0}">
<span <span
@click="toggleLists(n.id)" @click="toggleLists(n.id)"
class="menu-label" class="menu-label"
v-tooltip="namespaceTitles[nk]"> v-tooltip="namespaceTitles[nk]"
>
<span
v-if="n.hexColor !== ''"
:style="{ backgroundColor: n.hexColor }"
class="color-bubble"
/>
<span class="name"> <span class="name">
<span
:style="{ backgroundColor: n.hexColor }"
class="color-bubble"
v-if="n.hexColor !== ''">
</span>
{{ namespaceTitles[nk] }} {{ namespaceTitles[nk] }}
</span> </span>
<a
class="icon is-small toggle-lists-icon pl-2"
:class="{'active': typeof listsVisible[n.id] !== 'undefined' ? listsVisible[n.id] : true}"
@click="toggleLists(n.id)"
>
<icon icon="chevron-down"/>
</a>
<span class="count" :class="{'ml-2 mr-0': n.id > 0}">
({{ namespaceListsCount[nk] }})
</span>
</span> </span>
<a
class="icon is-small toggle-lists-icon"
:class="{'active': typeof listsVisible[n.id] !== 'undefined' ? listsVisible[n.id] : true}"
@click="toggleLists(n.id)"
>
<icon icon="chevron-down"/>
</a>
<namespace-settings-dropdown :namespace="n" v-if="n.id > 0"/> <namespace-settings-dropdown :namespace="n" v-if="n.id > 0"/>
</div> </div>
<div <div
@ -81,7 +85,7 @@
<!-- <!--
NOTE: a v-model / computed setter is not possible, since the updateActiveLists function NOTE: a v-model / computed setter is not possible, since the updateActiveLists function
triggered by the change needs to have access to the current namespace triggered by the change needs to have access to the current namespace
--> -->
<draggable <draggable
v-bind="dragOptions" v-bind="dragOptions"
:modelValue="activeLists[nk]" :modelValue="activeLists[nk]"
@ -134,7 +138,7 @@
:class="{'is-favorite': l.isFavorite}" :class="{'is-favorite': l.isFavorite}"
@click.prevent.stop="toggleFavoriteList(l)" @click.prevent.stop="toggleFavoriteList(l)"
class="favorite"> class="favorite">
<icon :icon="l.isFavorite ? 'star' : ['far', 'star']" /> <icon :icon="l.isFavorite ? 'star' : ['far', 'star']"/>
</span> </span>
</a> </a>
</router-link> </router-link>
@ -145,9 +149,9 @@
</draggable> </draggable>
</div> </div>
</template> </template>
</aside> </nav>
<PoweredByLink /> <PoweredByLink/>
</div> </aside>
</template> </template>
<script> <script>
@ -197,10 +201,10 @@ export default {
return this.namespaces.map(({lists}) => lists?.filter(item => !item.isArchived)) return this.namespaces.map(({lists}) => lists?.filter(item => !item.isArchived))
}, },
namespaceTitles() { namespaceTitles() {
return this.namespaces.map((namespace, index) => { return this.namespaces.map((namespace) => this.getNamespaceTitle(namespace))
const title = this.getNamespaceTitle(namespace) },
return `${title} (${this.activeLists[index]?.length ?? 0})` namespaceListsCount() {
}) return this.namespaces.map((_, index) => this.activeLists[index]?.length ?? 0)
}, },
}, },
beforeCreate() { beforeCreate() {
@ -365,8 +369,9 @@ $vikunja-nav-selected-width: 0.4rem;
.menu-label { .menu-label {
.color-bubble { .color-bubble {
width: 14px !important; width: 14px;
height: 14px !important; height: 14px;
flex-basis: auto;
} }
.is-archived { .is-archived {
@ -387,6 +392,12 @@ $vikunja-nav-selected-width: 0.4rem;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
margin-right: auto;
}
.count {
color: var(--grey-500);
margin-right: .5rem;
} }
} }
@ -482,7 +493,7 @@ $vikunja-nav-selected-width: 0.4rem;
height: 1rem; height: 1rem;
vertical-align: middle; vertical-align: middle;
padding-right: 0.5rem; padding-right: 0.5rem;
&.handle { &.handle {
opacity: 0; opacity: 0;
transition: opacity $transition; transition: opacity $transition;
@ -490,7 +501,7 @@ $vikunja-nav-selected-width: 0.4rem;
cursor: grab; cursor: grab;
} }
} }
&:hover .icon.handle { &:hover .icon.handle {
opacity: 1; opacity: 1;
} }
@ -542,7 +553,7 @@ $vikunja-nav-selected-width: 0.4rem;
span.list-menu-link, li > a { span.list-menu-link, li > a {
padding-left: 2rem; padding-left: 2rem;
display: inline-block; display: inline-block;
.icon { .icon {
padding-bottom: .25rem; padding-bottom: .25rem;
} }

View File

@ -1,9 +1,8 @@
<template> <template>
<nav <header
:class="{'has-background': background}" :class="{'has-background': background}"
aria-label="main navigation" aria-label="main navigation"
class="navbar main-theme is-fixed-top" class="navbar main-theme is-fixed-top"
role="navigation"
> >
<router-link :to="{name: 'home'}" class="logo-link"> <router-link :to="{name: 'home'}" class="logo-link">
<Logo width="164" height="48"/> <Logo width="164" height="48"/>
@ -77,7 +76,7 @@
</dropdown> </dropdown>
</div> </div>
</div> </div>
</nav> </header>
</template> </template>
<script> <script>

View File

@ -85,4 +85,8 @@ export default {
margin-left: .5rem; margin-left: .5rem;
} }
} }
.dark .update-notification {
color: var(--grey-200);
}
</style> </style>

View File

@ -128,10 +128,6 @@ export default {
date: null, date: null,
show: false, show: false,
changed: false, changed: false,
// Since flatpickr dates are strings, we need to convert them to native date objects.
// To make that work, we need a separate variable since flatpickr does not have a change event.
flatPickrDate: null,
} }
}, },
components: { components: {
@ -164,10 +160,6 @@ export default {
handler: 'setDateValue', handler: 'setDateValue',
immediate: true, immediate: true,
}, },
flatPickrDate(newVal) {
this.date = createDateFromString(newVal)
this.updateData()
},
}, },
computed: { computed: {
flatPickerConfig() { flatPickerConfig() {
@ -183,6 +175,17 @@ export default {
}, },
} }
}, },
// Since flatpickr dates are strings, we need to convert them to native date objects.
// To make that work, we need a separate variable since flatpickr does not have a change event.
flatPickrDate: {
set(newValue) {
this.date = createDateFromString(newValue)
this.updateData()
},
get() {
return format(this.date, 'yyy-LL-dd H:mm')
},
},
}, },
methods: { methods: {
setDateValue(newVal) { setDateValue(newVal) {

View File

@ -312,8 +312,6 @@ export default {
@import './vue-easymde/vue-easymde.css'; @import './vue-easymde/vue-easymde.css';
@import 'highlight.js/scss/base16/equilibrium-gray-light'; @import 'highlight.js/scss/base16/equilibrium-gray-light';
$editor-border-color: #ddd;
.editor { .editor {
.clear { .clear {
clear: both; clear: both;
@ -337,7 +335,7 @@ $editor-border-color: #ddd;
.CodeMirror { .CodeMirror {
padding: .5rem; padding: .5rem;
border: 1px solid $editor-border-color; border: 1px solid var(--grey-200) !important;
background: var(--white); background: var(--white);
&-lines pre { &-lines pre {
@ -348,6 +346,10 @@ $editor-border-color: #ddd;
color: var(--grey-400) !important; color: var(--grey-400) !important;
font-style: italic; font-style: italic;
} }
&-cursor {
border-color: var(--grey-700);
}
} }
.editor-preview { .editor-preview {
@ -359,12 +361,13 @@ $editor-border-color: #ddd;
} }
.editor-toolbar { .editor-toolbar {
background: #ffffff; background: var(--grey-50);
border-top: 1px solid $editor-border-color; border: 1px solid var(--grey-200);
border-left: 1px solid $editor-border-color; border-bottom: none;
border-right: 1px solid $editor-border-color;
button { button {
color: var(--grey-700);
svg { svg {
vertical-align: middle; vertical-align: middle;
@ -379,6 +382,15 @@ $editor-border-color: #ddd;
top: 24px; top: 24px;
margin-left: -3px; margin-left: -3px;
} }
&:hover {
background: var(--grey-200);
border-color: var(--grey-300);
}
}
i.separator {
border-color: var(--grey-200) !important;
} }
} }

View File

@ -14,112 +14,112 @@ export function createEasyMDEConfig({ placeholder, uploadImage, imageUploadFunct
name: 'heading-1', name: 'heading-1',
action: EasyMDE.toggleHeading1, action: EasyMDE.toggleHeading1,
title: i18n.global.t('input.editor.heading1'), title: i18n.global.t('input.editor.heading1'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill-rule="evenodd" clip-rule="evenodd" d="M18.2773 19.25L12.5773 4.34995C12.5773 4.34995 12.5773 4.24995 12.4773 4.24995C12.4773 4.24995 12.4773 4.14995 12.3773 4.14995C12.3773 4.14995 12.2773 4.14995 12.2773 4.04995L12.1773 3.94995H12.0773H11.9773C11.8773 3.94995 11.8773 3.94995 11.8773 3.94995H11.7773C11.6773 4.04995 11.6773 4.14995 11.5773 4.14995C11.5773 4.14995 11.5773 4.14995 11.4773 4.14995C11.4773 4.14995 11.4773 4.24995 11.3773 4.24995L11.2773 4.34995L5.67733 19.25C5.57733 19.55 5.67733 19.95 5.97733 20.05C6.07733 20.05 6.07733 20.05 6.17733 20.05C6.37733 20.05 6.67733 19.95 6.77733 19.65L7.87733 16.85H16.1773L17.2773 19.65C17.3773 19.85 17.5773 20.05 17.8773 20.05C17.9773 20.05 17.9773 20.05 18.0773 20.05C18.2773 19.85 18.4773 19.55 18.2773 19.25ZM8.27733 15.65L11.9773 6.24995L15.6773 15.65H8.27733Z"/></svg>', icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M18.2773 19.25L12.5773 4.34995C12.5773 4.34995 12.5773 4.24995 12.4773 4.24995C12.4773 4.24995 12.4773 4.14995 12.3773 4.14995C12.3773 4.14995 12.2773 4.14995 12.2773 4.04995L12.1773 3.94995H12.0773H11.9773C11.8773 3.94995 11.8773 3.94995 11.8773 3.94995H11.7773C11.6773 4.04995 11.6773 4.14995 11.5773 4.14995C11.5773 4.14995 11.5773 4.14995 11.4773 4.14995C11.4773 4.14995 11.4773 4.24995 11.3773 4.24995L11.2773 4.34995L5.67733 19.25C5.57733 19.55 5.67733 19.95 5.97733 20.05C6.07733 20.05 6.07733 20.05 6.17733 20.05C6.37733 20.05 6.67733 19.95 6.77733 19.65L7.87733 16.85H16.1773L17.2773 19.65C17.3773 19.85 17.5773 20.05 17.8773 20.05C17.9773 20.05 17.9773 20.05 18.0773 20.05C18.2773 19.85 18.4773 19.55 18.2773 19.25ZM8.27733 15.65L11.9773 6.24995L15.6773 15.65H8.27733Z"/></svg>',
}, },
{ {
name: 'heading-2', name: 'heading-2',
action: EasyMDE.toggleHeading2, action: EasyMDE.toggleHeading2,
title: i18n.global.t('input.editor.heading2'), title: i18n.global.t('input.editor.heading2'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill-rule="evenodd" clip-rule="evenodd" d="M18.2773 19.25L12.5773 4.34995C12.5773 4.34995 12.5773 4.24995 12.4773 4.24995C12.4773 4.24995 12.4773 4.14995 12.3773 4.14995C12.3773 4.14995 12.2773 4.14995 12.2773 4.04995L12.1773 3.94995H12.0773H11.9773C11.8773 3.94995 11.8773 3.94995 11.8773 3.94995H11.7773C11.6773 4.04995 11.6773 4.14995 11.5773 4.14995C11.5773 4.14995 11.5773 4.14995 11.4773 4.14995C11.4773 4.14995 11.4773 4.24995 11.3773 4.24995L11.2773 4.34995L5.67733 19.25C5.57733 19.55 5.67733 19.95 5.97733 20.05C6.07733 20.05 6.07733 20.05 6.17733 20.05C6.37733 20.05 6.67733 19.95 6.77733 19.65L7.87733 16.85H16.1773L17.2773 19.65C17.3773 19.85 17.5773 20.05 17.8773 20.05C17.9773 20.05 17.9773 20.05 18.0773 20.05C18.2773 19.85 18.4773 19.55 18.2773 19.25ZM8.27733 15.65L11.9773 6.24995L15.6773 15.65H8.27733Z"/></svg>', icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M18.2773 19.25L12.5773 4.34995C12.5773 4.34995 12.5773 4.24995 12.4773 4.24995C12.4773 4.24995 12.4773 4.14995 12.3773 4.14995C12.3773 4.14995 12.2773 4.14995 12.2773 4.04995L12.1773 3.94995H12.0773H11.9773C11.8773 3.94995 11.8773 3.94995 11.8773 3.94995H11.7773C11.6773 4.04995 11.6773 4.14995 11.5773 4.14995C11.5773 4.14995 11.5773 4.14995 11.4773 4.14995C11.4773 4.14995 11.4773 4.24995 11.3773 4.24995L11.2773 4.34995L5.67733 19.25C5.57733 19.55 5.67733 19.95 5.97733 20.05C6.07733 20.05 6.07733 20.05 6.17733 20.05C6.37733 20.05 6.67733 19.95 6.77733 19.65L7.87733 16.85H16.1773L17.2773 19.65C17.3773 19.85 17.5773 20.05 17.8773 20.05C17.9773 20.05 17.9773 20.05 18.0773 20.05C18.2773 19.85 18.4773 19.55 18.2773 19.25ZM8.27733 15.65L11.9773 6.24995L15.6773 15.65H8.27733Z"/></svg>',
}, },
{ {
name: 'heading-3', name: 'heading-3',
action: EasyMDE.toggleHeading3, action: EasyMDE.toggleHeading3,
title: i18n.global.t('input.editor.heading3'), title: i18n.global.t('input.editor.heading3'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill-rule="evenodd" clip-rule="evenodd" d="M18.2773 19.25L12.5773 4.34995C12.5773 4.34995 12.5773 4.24995 12.4773 4.24995C12.4773 4.24995 12.4773 4.14995 12.3773 4.14995C12.3773 4.14995 12.2773 4.14995 12.2773 4.04995L12.1773 3.94995H12.0773H11.9773C11.8773 3.94995 11.8773 3.94995 11.8773 3.94995H11.7773C11.6773 4.04995 11.6773 4.14995 11.5773 4.14995C11.5773 4.14995 11.5773 4.14995 11.4773 4.14995C11.4773 4.14995 11.4773 4.24995 11.3773 4.24995L11.2773 4.34995L5.67733 19.25C5.57733 19.55 5.67733 19.95 5.97733 20.05C6.07733 20.05 6.07733 20.05 6.17733 20.05C6.37733 20.05 6.67733 19.95 6.77733 19.65L7.87733 16.85H16.1773L17.2773 19.65C17.3773 19.85 17.5773 20.05 17.8773 20.05C17.9773 20.05 17.9773 20.05 18.0773 20.05C18.2773 19.85 18.4773 19.55 18.2773 19.25ZM8.27733 15.65L11.9773 6.24995L15.6773 15.65H8.27733Z"/></svg>', icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M18.2773 19.25L12.5773 4.34995C12.5773 4.34995 12.5773 4.24995 12.4773 4.24995C12.4773 4.24995 12.4773 4.14995 12.3773 4.14995C12.3773 4.14995 12.2773 4.14995 12.2773 4.04995L12.1773 3.94995H12.0773H11.9773C11.8773 3.94995 11.8773 3.94995 11.8773 3.94995H11.7773C11.6773 4.04995 11.6773 4.14995 11.5773 4.14995C11.5773 4.14995 11.5773 4.14995 11.4773 4.14995C11.4773 4.14995 11.4773 4.24995 11.3773 4.24995L11.2773 4.34995L5.67733 19.25C5.57733 19.55 5.67733 19.95 5.97733 20.05C6.07733 20.05 6.07733 20.05 6.17733 20.05C6.37733 20.05 6.67733 19.95 6.77733 19.65L7.87733 16.85H16.1773L17.2773 19.65C17.3773 19.85 17.5773 20.05 17.8773 20.05C17.9773 20.05 17.9773 20.05 18.0773 20.05C18.2773 19.85 18.4773 19.55 18.2773 19.25ZM8.27733 15.65L11.9773 6.24995L15.6773 15.65H8.27733Z"/></svg>',
}, },
{ {
name: 'heading-smaller', name: 'heading-smaller',
action: EasyMDE.toggleHeadingSmaller, action: EasyMDE.toggleHeadingSmaller,
title: i18n.global.t('input.editor.headingSmaller'), title: i18n.global.t('input.editor.headingSmaller'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill-rule="evenodd" clip-rule="evenodd" d="M18.2773 19.25L12.5773 4.34995C12.5773 4.34995 12.5773 4.24995 12.4773 4.24995C12.4773 4.24995 12.4773 4.14995 12.3773 4.14995C12.3773 4.14995 12.2773 4.14995 12.2773 4.04995L12.1773 3.94995H12.0773H11.9773C11.8773 3.94995 11.8773 3.94995 11.8773 3.94995H11.7773C11.6773 4.04995 11.6773 4.14995 11.5773 4.14995C11.5773 4.14995 11.5773 4.14995 11.4773 4.14995C11.4773 4.14995 11.4773 4.24995 11.3773 4.24995L11.2773 4.34995L5.67733 19.25C5.57733 19.55 5.67733 19.95 5.97733 20.05C6.07733 20.05 6.07733 20.05 6.17733 20.05C6.37733 20.05 6.67733 19.95 6.77733 19.65L7.87733 16.85H16.1773L17.2773 19.65C17.3773 19.85 17.5773 20.05 17.8773 20.05C17.9773 20.05 17.9773 20.05 18.0773 20.05C18.2773 19.85 18.4773 19.55 18.2773 19.25ZM8.27733 15.65L11.9773 6.24995L15.6773 15.65H8.27733Z"/></svg>', icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M18.2773 19.25L12.5773 4.34995C12.5773 4.34995 12.5773 4.24995 12.4773 4.24995C12.4773 4.24995 12.4773 4.14995 12.3773 4.14995C12.3773 4.14995 12.2773 4.14995 12.2773 4.04995L12.1773 3.94995H12.0773H11.9773C11.8773 3.94995 11.8773 3.94995 11.8773 3.94995H11.7773C11.6773 4.04995 11.6773 4.14995 11.5773 4.14995C11.5773 4.14995 11.5773 4.14995 11.4773 4.14995C11.4773 4.14995 11.4773 4.24995 11.3773 4.24995L11.2773 4.34995L5.67733 19.25C5.57733 19.55 5.67733 19.95 5.97733 20.05C6.07733 20.05 6.07733 20.05 6.17733 20.05C6.37733 20.05 6.67733 19.95 6.77733 19.65L7.87733 16.85H16.1773L17.2773 19.65C17.3773 19.85 17.5773 20.05 17.8773 20.05C17.9773 20.05 17.9773 20.05 18.0773 20.05C18.2773 19.85 18.4773 19.55 18.2773 19.25ZM8.27733 15.65L11.9773 6.24995L15.6773 15.65H8.27733Z"/></svg>',
}, },
{ {
name: 'heading-bigger', name: 'heading-bigger',
action: EasyMDE.toggleHeadingBigger, action: EasyMDE.toggleHeadingBigger,
title: i18n.global.t('input.editor.headingBigger'), title: i18n.global.t('input.editor.headingBigger'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill-rule="evenodd" clip-rule="evenodd" d="M18.2773 19.25L12.5773 4.34995C12.5773 4.34995 12.5773 4.24995 12.4773 4.24995C12.4773 4.24995 12.4773 4.14995 12.3773 4.14995C12.3773 4.14995 12.2773 4.14995 12.2773 4.04995L12.1773 3.94995H12.0773H11.9773C11.8773 3.94995 11.8773 3.94995 11.8773 3.94995H11.7773C11.6773 4.04995 11.6773 4.14995 11.5773 4.14995C11.5773 4.14995 11.5773 4.14995 11.4773 4.14995C11.4773 4.14995 11.4773 4.24995 11.3773 4.24995L11.2773 4.34995L5.67733 19.25C5.57733 19.55 5.67733 19.95 5.97733 20.05C6.07733 20.05 6.07733 20.05 6.17733 20.05C6.37733 20.05 6.67733 19.95 6.77733 19.65L7.87733 16.85H16.1773L17.2773 19.65C17.3773 19.85 17.5773 20.05 17.8773 20.05C17.9773 20.05 17.9773 20.05 18.0773 20.05C18.2773 19.85 18.4773 19.55 18.2773 19.25ZM8.27733 15.65L11.9773 6.24995L15.6773 15.65H8.27733Z"/></svg>', icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M18.2773 19.25L12.5773 4.34995C12.5773 4.34995 12.5773 4.24995 12.4773 4.24995C12.4773 4.24995 12.4773 4.14995 12.3773 4.14995C12.3773 4.14995 12.2773 4.14995 12.2773 4.04995L12.1773 3.94995H12.0773H11.9773C11.8773 3.94995 11.8773 3.94995 11.8773 3.94995H11.7773C11.6773 4.04995 11.6773 4.14995 11.5773 4.14995C11.5773 4.14995 11.5773 4.14995 11.4773 4.14995C11.4773 4.14995 11.4773 4.24995 11.3773 4.24995L11.2773 4.34995L5.67733 19.25C5.57733 19.55 5.67733 19.95 5.97733 20.05C6.07733 20.05 6.07733 20.05 6.17733 20.05C6.37733 20.05 6.67733 19.95 6.77733 19.65L7.87733 16.85H16.1773L17.2773 19.65C17.3773 19.85 17.5773 20.05 17.8773 20.05C17.9773 20.05 17.9773 20.05 18.0773 20.05C18.2773 19.85 18.4773 19.55 18.2773 19.25ZM8.27733 15.65L11.9773 6.24995L15.6773 15.65H8.27733Z"/></svg>',
}, },
'|', '|',
{ {
name: 'bold', name: 'bold',
action: EasyMDE.toggleBold, action: EasyMDE.toggleBold,
title: i18n.global.t('input.editor.bold'), title: i18n.global.t('input.editor.bold'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill-rule="evenodd" clip-rule="evenodd" d="M3.5 3H6.5H15.25C18.15 3 20.5 5.36 20.5 8.25C20.5 9.8 19.81 11.19 18.73 12.15C20.37 13.04 21.5 14.76 21.5 16.75C21.5 19.64 19.15 22 16.25 22H6.5H3.5C2.95 22 2.5 21.55 2.5 21C2.5 20.45 2.95 20 3.5 20H5.5V5H3.5C2.95 5 2.5 4.55 2.5 4C2.5 3.45 2.95 3 3.5 3ZM7.5 20H16.25C18.04 20 19.5 18.54 19.5 16.75C19.5 14.96 18.04 13.5 16.25 13.5H7.5V20ZM7.5 11.5H15.25C17.04 11.5 18.5 10.04 18.5 8.25C18.5 6.46 17.04 5 15.25 5H7.5V11.5Z"/></svg>', icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M3.5 3H6.5H15.25C18.15 3 20.5 5.36 20.5 8.25C20.5 9.8 19.81 11.19 18.73 12.15C20.37 13.04 21.5 14.76 21.5 16.75C21.5 19.64 19.15 22 16.25 22H6.5H3.5C2.95 22 2.5 21.55 2.5 21C2.5 20.45 2.95 20 3.5 20H5.5V5H3.5C2.95 5 2.5 4.55 2.5 4C2.5 3.45 2.95 3 3.5 3ZM7.5 20H16.25C18.04 20 19.5 18.54 19.5 16.75C19.5 14.96 18.04 13.5 16.25 13.5H7.5V20ZM7.5 11.5H15.25C17.04 11.5 18.5 10.04 18.5 8.25C18.5 6.46 17.04 5 15.25 5H7.5V11.5Z"/></svg>',
}, },
{ {
name: 'italic', name: 'italic',
action: EasyMDE.toggleItalic, action: EasyMDE.toggleItalic,
title: i18n.global.t('input.editor.italic'), title: i18n.global.t('input.editor.italic'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill-rule="evenodd" clip-rule="evenodd" d="M14.0967 4.2H17.0001C17.3301 4.2 17.6001 3.93 17.6001 3.6C17.6001 3.27 17.3301 3 17.0001 3H10.2001C9.8701 3 9.6001 3.27 9.6001 3.6C9.6001 3.93 9.8701 4.2 10.2001 4.2H12.8748L9.90335 19.8H6.9999C6.6699 19.8 6.3999 20.07 6.3999 20.4C6.3999 20.73 6.6699 21 6.9999 21H13.7999C14.1299 21 14.3999 20.73 14.3999 20.4C14.3999 20.07 14.1299 19.8 13.7999 19.8H11.1253L14.0967 4.2Z"/></svg>', icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M14.0967 4.2H17.0001C17.3301 4.2 17.6001 3.93 17.6001 3.6C17.6001 3.27 17.3301 3 17.0001 3H10.2001C9.8701 3 9.6001 3.27 9.6001 3.6C9.6001 3.93 9.8701 4.2 10.2001 4.2H12.8748L9.90335 19.8H6.9999C6.6699 19.8 6.3999 20.07 6.3999 20.4C6.3999 20.73 6.6699 21 6.9999 21H13.7999C14.1299 21 14.3999 20.73 14.3999 20.4C14.3999 20.07 14.1299 19.8 13.7999 19.8H11.1253L14.0967 4.2Z"/></svg>',
}, },
{ {
name: 'strikethrough', name: 'strikethrough',
action: EasyMDE.toggleStrikethrough, action: EasyMDE.toggleStrikethrough,
title: i18n.global.t('input.editor.strikethrough'), title: i18n.global.t('input.editor.strikethrough'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill-rule="evenodd" clip-rule="evenodd" d="M18.25 7.17005C18.25 7.50005 17.98 7.77005 17.65 7.77005C17.32 7.77005 17.05 7.50005 17.05 7.17005V5.96005C15.97 5.12005 14.17 4.56005 12.79 4.31005C11.1 4.00005 9.51 4.30005 8.41 5.12005C7.2 6.03005 6.67 7.67005 7.19 8.88005C7.56 9.73005 8.37 10.31 8.98 10.64C9.57215 10.9644 10.1961 11.2013 10.8465 11.3999H20.4C20.73 11.3999 21 11.6699 21 11.9999C21 12.3299 20.73 12.5999 20.4 12.5999H15.3012C16.6583 13.0929 17.5255 13.7765 17.95 14.69C18.73 16.36 17.74 18.33 16.36 19.41C15.05 20.4401 13.35 21 11.54 21H11.16C9.78 20.9401 8.34 20.5301 6.95 19.85V20.3601C6.95 20.6901 6.68 20.96 6.35 20.96C6.02 20.96 5.75 20.6901 5.75 20.3601V17.36C5.75 17.03 6.02 16.76 6.35 16.76C6.68 16.76 6.95 17.03 6.95 17.36V18.5C8.35 19.2801 9.81 19.74 11.21 19.8C12.86 19.89 14.46 19.39 15.62 18.48C16.6 17.71 17.37 16.3 16.86 15.21C16.55 14.54 15.8 14.0201 14.58 13.63C13.9711 13.4331 13.3222 13.2762 12.6906 13.1235C12.6168 13.1056 12.5432 13.0878 12.47 13.07C12.4313 13.0607 12.3925 13.0514 12.3537 13.0421C11.7861 12.9055 11.2108 12.767 10.6413 12.5999H3.6C3.27 12.5999 3 12.3299 3 11.9999C3 11.6699 3.27 11.3999 3.6 11.3999H7.90288C7.04984 10.8343 6.42752 10.1363 6.09 9.36005C5.34 7.63005 6.03 5.40005 7.69 4.16005C9.05 3.15005 10.99 2.77005 13 3.13005C13.64 3.25005 15.53 3.66005 17.05 4.53005V4.17005C17.05 3.84005 17.32 3.57005 17.65 3.57005C17.98 3.57005 18.25 3.84005 18.25 4.17005V7.17005Z"/></svg>', icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M18.25 7.17005C18.25 7.50005 17.98 7.77005 17.65 7.77005C17.32 7.77005 17.05 7.50005 17.05 7.17005V5.96005C15.97 5.12005 14.17 4.56005 12.79 4.31005C11.1 4.00005 9.51 4.30005 8.41 5.12005C7.2 6.03005 6.67 7.67005 7.19 8.88005C7.56 9.73005 8.37 10.31 8.98 10.64C9.57215 10.9644 10.1961 11.2013 10.8465 11.3999H20.4C20.73 11.3999 21 11.6699 21 11.9999C21 12.3299 20.73 12.5999 20.4 12.5999H15.3012C16.6583 13.0929 17.5255 13.7765 17.95 14.69C18.73 16.36 17.74 18.33 16.36 19.41C15.05 20.4401 13.35 21 11.54 21H11.16C9.78 20.9401 8.34 20.5301 6.95 19.85V20.3601C6.95 20.6901 6.68 20.96 6.35 20.96C6.02 20.96 5.75 20.6901 5.75 20.3601V17.36C5.75 17.03 6.02 16.76 6.35 16.76C6.68 16.76 6.95 17.03 6.95 17.36V18.5C8.35 19.2801 9.81 19.74 11.21 19.8C12.86 19.89 14.46 19.39 15.62 18.48C16.6 17.71 17.37 16.3 16.86 15.21C16.55 14.54 15.8 14.0201 14.58 13.63C13.9711 13.4331 13.3222 13.2762 12.6906 13.1235C12.6168 13.1056 12.5432 13.0878 12.47 13.07C12.4313 13.0607 12.3925 13.0514 12.3537 13.0421C11.7861 12.9055 11.2108 12.767 10.6413 12.5999H3.6C3.27 12.5999 3 12.3299 3 11.9999C3 11.6699 3.27 11.3999 3.6 11.3999H7.90288C7.04984 10.8343 6.42752 10.1363 6.09 9.36005C5.34 7.63005 6.03 5.40005 7.69 4.16005C9.05 3.15005 10.99 2.77005 13 3.13005C13.64 3.25005 15.53 3.66005 17.05 4.53005V4.17005C17.05 3.84005 17.32 3.57005 17.65 3.57005C17.98 3.57005 18.25 3.84005 18.25 4.17005V7.17005Z"/></svg>',
}, },
{ {
name: 'code', name: 'code',
action: EasyMDE.toggleCodeBlock, action: EasyMDE.toggleCodeBlock,
title: i18n.global.t('input.editor.code'), title: i18n.global.t('input.editor.code'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill-rule="evenodd" clip-rule="evenodd" d="M8.57 20.9601C8.64 20.9901 8.71 21.0001 8.78 21.0001C9.02 21.0001 9.24 20.8501 9.34 20.6101L15.79 3.81005C15.9 3.50005 15.75 3.15005 15.44 3.03005C15.14 2.92005 14.79 3.07005 14.67 3.38005L8.22 20.1801C8.11 20.4901 8.26 20.8401 8.57 20.9601ZM7.00007 18.0001C6.85007 18.0001 6.69007 17.9401 6.58007 17.8201L1.18007 12.4201C0.950068 12.1901 0.950068 11.8101 1.18007 11.5701L6.58007 6.17006C6.81007 5.94006 7.19007 5.94006 7.43007 6.17006C7.66007 6.40006 7.66007 6.78006 7.43007 7.02006L2.45007 12.0001L7.43007 16.9801C7.66007 17.2101 7.66007 17.5901 7.43007 17.8301C7.31007 17.9401 7.15007 18.0001 7.00007 18.0001ZM17 18.0001C16.85 18.0001 16.69 17.9401 16.58 17.8201C16.35 17.5901 16.35 17.2101 16.58 16.9701L21.55 12.0001L16.57 7.02006C16.34 6.79006 16.34 6.41006 16.57 6.17006C16.81 5.94006 17.19 5.94006 17.42 6.17006L22.82 11.5701C23.05 11.8001 23.05 12.1801 22.82 12.4201L17.42 17.8201C17.31 17.9401 17.15 18.0001 17 18.0001Z"/></svg>', icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M8.57 20.9601C8.64 20.9901 8.71 21.0001 8.78 21.0001C9.02 21.0001 9.24 20.8501 9.34 20.6101L15.79 3.81005C15.9 3.50005 15.75 3.15005 15.44 3.03005C15.14 2.92005 14.79 3.07005 14.67 3.38005L8.22 20.1801C8.11 20.4901 8.26 20.8401 8.57 20.9601ZM7.00007 18.0001C6.85007 18.0001 6.69007 17.9401 6.58007 17.8201L1.18007 12.4201C0.950068 12.1901 0.950068 11.8101 1.18007 11.5701L6.58007 6.17006C6.81007 5.94006 7.19007 5.94006 7.43007 6.17006C7.66007 6.40006 7.66007 6.78006 7.43007 7.02006L2.45007 12.0001L7.43007 16.9801C7.66007 17.2101 7.66007 17.5901 7.43007 17.8301C7.31007 17.9401 7.15007 18.0001 7.00007 18.0001ZM17 18.0001C16.85 18.0001 16.69 17.9401 16.58 17.8201C16.35 17.5901 16.35 17.2101 16.58 16.9701L21.55 12.0001L16.57 7.02006C16.34 6.79006 16.34 6.41006 16.57 6.17006C16.81 5.94006 17.19 5.94006 17.42 6.17006L22.82 11.5701C23.05 11.8001 23.05 12.1801 22.82 12.4201L17.42 17.8201C17.31 17.9401 17.15 18.0001 17 18.0001Z"/></svg>',
}, },
{ {
name: 'quote', name: 'quote',
action: EasyMDE.toggleBlockquote, action: EasyMDE.toggleBlockquote,
title: i18n.global.t('input.editor.quote'), title: i18n.global.t('input.editor.quote'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill-rule="evenodd" clip-rule="evenodd" d="M19.373 5.16357H5.62695C4.79102 5.16357 4.11133 5.84326 4.11133 6.6792V16.2095C4.11133 17.0464 4.79102 17.7261 5.62695 17.7261H6.8877V21.1245C6.8877 21.3667 7.0332 21.5854 7.25684 21.6782C7.33203 21.7095 7.41016 21.7241 7.4873 21.7241C7.64258 21.7241 7.7959 21.6636 7.91113 21.5493L11.748 17.7261H19.373C20.209 17.7261 20.8887 17.0464 20.8887 16.2095V6.6792C20.8887 5.84326 20.209 5.16357 19.373 5.16357ZM19.6895 16.2095C19.6895 16.3843 19.5469 16.5269 19.373 16.5269H11.5C11.3408 16.5269 11.1895 16.5894 11.0762 16.7017L8.08691 19.6802V17.1265C8.08691 16.7954 7.81836 16.5269 7.4873 16.5269H5.62695C5.45312 16.5269 5.31055 16.3843 5.31055 16.2095V6.6792C5.31055 6.50537 5.45312 6.36279 5.62695 6.36279H19.373C19.5469 6.36279 19.6895 6.50537 19.6895 6.6792V16.2095ZM10.3431 8.45264C9.46326 8.45264 8.75 9.16589 8.75 10.0458C8.75 10.9257 9.46326 11.639 10.3431 11.639C10.4775 11.639 10.6058 11.6173 10.7305 11.5861V11.6195C10.7305 12.1322 10.3135 12.5492 9.75586 12.5492C9.4248 12.5492 9.17871 12.8177 9.17871 13.1488C9.17871 13.4799 9.46973 13.7484 9.80078 13.7484C10.9746 13.7484 11.9297 12.7933 11.9297 11.6195V10.1176L11.9294 10.1165L11.9292 10.1155C11.9297 10.1049 11.9312 10.0946 11.9326 10.0843L11.9326 10.0843C11.9345 10.0716 11.9363 10.059 11.9363 10.0458C11.9363 9.16589 11.223 8.45264 10.3431 8.45264ZM13.0637 10.0458C13.0637 9.16589 13.7771 8.45264 14.657 8.45264C15.5369 8.45264 16.2501 9.16589 16.2501 10.0458C16.2501 10.0584 16.2484 10.0706 16.2466 10.0828C16.2452 10.0929 16.2437 10.103 16.2433 10.1134C16.2433 10.1149 16.2441 10.1161 16.2441 10.1176V11.6195C16.2441 12.7933 15.2891 13.7484 14.1152 13.7484C13.7842 13.7484 13.4922 13.4799 13.4922 13.1488C13.4922 12.8177 13.7383 12.5492 14.0693 12.5492C14.6279 12.5492 15.0449 12.1322 15.0449 11.6195V11.5858C14.9202 11.6173 14.7915 11.639 14.657 11.639C13.7771 11.639 13.0637 10.9257 13.0637 10.0458Z"/></svg>', icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M19.373 5.16357H5.62695C4.79102 5.16357 4.11133 5.84326 4.11133 6.6792V16.2095C4.11133 17.0464 4.79102 17.7261 5.62695 17.7261H6.8877V21.1245C6.8877 21.3667 7.0332 21.5854 7.25684 21.6782C7.33203 21.7095 7.41016 21.7241 7.4873 21.7241C7.64258 21.7241 7.7959 21.6636 7.91113 21.5493L11.748 17.7261H19.373C20.209 17.7261 20.8887 17.0464 20.8887 16.2095V6.6792C20.8887 5.84326 20.209 5.16357 19.373 5.16357ZM19.6895 16.2095C19.6895 16.3843 19.5469 16.5269 19.373 16.5269H11.5C11.3408 16.5269 11.1895 16.5894 11.0762 16.7017L8.08691 19.6802V17.1265C8.08691 16.7954 7.81836 16.5269 7.4873 16.5269H5.62695C5.45312 16.5269 5.31055 16.3843 5.31055 16.2095V6.6792C5.31055 6.50537 5.45312 6.36279 5.62695 6.36279H19.373C19.5469 6.36279 19.6895 6.50537 19.6895 6.6792V16.2095ZM10.3431 8.45264C9.46326 8.45264 8.75 9.16589 8.75 10.0458C8.75 10.9257 9.46326 11.639 10.3431 11.639C10.4775 11.639 10.6058 11.6173 10.7305 11.5861V11.6195C10.7305 12.1322 10.3135 12.5492 9.75586 12.5492C9.4248 12.5492 9.17871 12.8177 9.17871 13.1488C9.17871 13.4799 9.46973 13.7484 9.80078 13.7484C10.9746 13.7484 11.9297 12.7933 11.9297 11.6195V10.1176L11.9294 10.1165L11.9292 10.1155C11.9297 10.1049 11.9312 10.0946 11.9326 10.0843L11.9326 10.0843C11.9345 10.0716 11.9363 10.059 11.9363 10.0458C11.9363 9.16589 11.223 8.45264 10.3431 8.45264ZM13.0637 10.0458C13.0637 9.16589 13.7771 8.45264 14.657 8.45264C15.5369 8.45264 16.2501 9.16589 16.2501 10.0458C16.2501 10.0584 16.2484 10.0706 16.2466 10.0828C16.2452 10.0929 16.2437 10.103 16.2433 10.1134C16.2433 10.1149 16.2441 10.1161 16.2441 10.1176V11.6195C16.2441 12.7933 15.2891 13.7484 14.1152 13.7484C13.7842 13.7484 13.4922 13.4799 13.4922 13.1488C13.4922 12.8177 13.7383 12.5492 14.0693 12.5492C14.6279 12.5492 15.0449 12.1322 15.0449 11.6195V11.5858C14.9202 11.6173 14.7915 11.639 14.657 11.639C13.7771 11.639 13.0637 10.9257 13.0637 10.0458Z"/></svg>',
}, },
{ {
name: 'unordered-list', name: 'unordered-list',
action: EasyMDE.toggleUnorderedList, action: EasyMDE.toggleUnorderedList,
title: i18n.global.t('input.editor.unorderedList'), title: i18n.global.t('input.editor.unorderedList'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill-rule="evenodd" clip-rule="evenodd" d="M6.5281 3.7002H3.5281C3.1981 3.7002 2.9281 3.9702 2.9281 4.3002V7.3002C2.9281 7.6302 3.1981 7.9002 3.5281 7.9002H6.5281C6.8581 7.9002 7.1281 7.6302 7.1281 7.3002V4.3002C7.1281 3.9702 6.8581 3.7002 6.5281 3.7002ZM5.9281 6.7002H4.1281V4.9002H5.9281V6.7002ZM3.5281 9.90015H6.5281C6.8581 9.90015 7.1281 10.1701 7.1281 10.5001V13.5001C7.1281 13.8301 6.8581 14.1001 6.5281 14.1001H3.5281C3.1981 14.1001 2.9281 13.8301 2.9281 13.5001V10.5001C2.9281 10.1701 3.1981 9.90015 3.5281 9.90015ZM4.1281 12.9001H5.9281V11.1001H4.1281V12.9001ZM3.5281 16.1001H6.5281C6.8581 16.1001 7.1281 16.3701 7.1281 16.7001V19.7001C7.1281 20.0301 6.8581 20.3001 6.5281 20.3001H3.5281C3.1981 20.3001 2.9281 20.0301 2.9281 19.7001V16.7001C2.9281 16.3701 3.1981 16.1001 3.5281 16.1001ZM4.1281 19.1001H5.9281V17.3001H4.1281V19.1001ZM9.72817 6.4002H20.7282C21.0582 6.4002 21.3282 6.1302 21.3282 5.8002C21.3282 5.4702 21.0582 5.2002 20.7282 5.2002H9.72817C9.39817 5.2002 9.12817 5.4702 9.12817 5.8002C9.12817 6.1302 9.39817 6.4002 9.72817 6.4002ZM9.72817 11.4001H20.7282C21.0582 11.4001 21.3282 11.6701 21.3282 12.0001C21.3282 12.3301 21.0582 12.6001 20.7282 12.6001H9.72817C9.39817 12.6001 9.12817 12.3301 9.12817 12.0001C9.12817 11.6701 9.39817 11.4001 9.72817 11.4001ZM9.72817 17.6001H20.7282C21.0582 17.6001 21.3282 17.8701 21.3282 18.2001C21.3282 18.5301 21.0582 18.8001 20.7282 18.8001H9.72817C9.39817 18.8001 9.12817 18.5301 9.12817 18.2001C9.12817 17.8701 9.39817 17.6001 9.72817 17.6001Z"/></svg>', icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M6.5281 3.7002H3.5281C3.1981 3.7002 2.9281 3.9702 2.9281 4.3002V7.3002C2.9281 7.6302 3.1981 7.9002 3.5281 7.9002H6.5281C6.8581 7.9002 7.1281 7.6302 7.1281 7.3002V4.3002C7.1281 3.9702 6.8581 3.7002 6.5281 3.7002ZM5.9281 6.7002H4.1281V4.9002H5.9281V6.7002ZM3.5281 9.90015H6.5281C6.8581 9.90015 7.1281 10.1701 7.1281 10.5001V13.5001C7.1281 13.8301 6.8581 14.1001 6.5281 14.1001H3.5281C3.1981 14.1001 2.9281 13.8301 2.9281 13.5001V10.5001C2.9281 10.1701 3.1981 9.90015 3.5281 9.90015ZM4.1281 12.9001H5.9281V11.1001H4.1281V12.9001ZM3.5281 16.1001H6.5281C6.8581 16.1001 7.1281 16.3701 7.1281 16.7001V19.7001C7.1281 20.0301 6.8581 20.3001 6.5281 20.3001H3.5281C3.1981 20.3001 2.9281 20.0301 2.9281 19.7001V16.7001C2.9281 16.3701 3.1981 16.1001 3.5281 16.1001ZM4.1281 19.1001H5.9281V17.3001H4.1281V19.1001ZM9.72817 6.4002H20.7282C21.0582 6.4002 21.3282 6.1302 21.3282 5.8002C21.3282 5.4702 21.0582 5.2002 20.7282 5.2002H9.72817C9.39817 5.2002 9.12817 5.4702 9.12817 5.8002C9.12817 6.1302 9.39817 6.4002 9.72817 6.4002ZM9.72817 11.4001H20.7282C21.0582 11.4001 21.3282 11.6701 21.3282 12.0001C21.3282 12.3301 21.0582 12.6001 20.7282 12.6001H9.72817C9.39817 12.6001 9.12817 12.3301 9.12817 12.0001C9.12817 11.6701 9.39817 11.4001 9.72817 11.4001ZM9.72817 17.6001H20.7282C21.0582 17.6001 21.3282 17.8701 21.3282 18.2001C21.3282 18.5301 21.0582 18.8001 20.7282 18.8001H9.72817C9.39817 18.8001 9.12817 18.5301 9.12817 18.2001C9.12817 17.8701 9.39817 17.6001 9.72817 17.6001Z"/></svg>',
}, },
{ {
name: 'ordered-list', name: 'ordered-list',
action: EasyMDE.toggleOrderedList, action: EasyMDE.toggleOrderedList,
title: i18n.global.t('input.editor.orderedList'), title: i18n.global.t('input.editor.orderedList'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill-rule="evenodd" clip-rule="evenodd" d="M4.19494 8.29994H5.99494C6.26494 8.29994 6.49494 8.07995 6.49494 7.79994C6.49494 7.51995 6.27494 7.29994 5.99494 7.29994H5.59494V3.79994C5.59494 3.62994 5.50494 3.46994 5.36494 3.37994C5.22494 3.28994 5.04494 3.26994 4.89494 3.33994L3.89494 3.76994C3.64494 3.87994 3.52494 4.17994 3.63494 4.42994C3.74494 4.67994 4.03494 4.79994 4.29494 4.68994L4.59494 4.55994V7.29994H4.19494C3.91494 7.29994 3.69494 7.51995 3.69494 7.79994C3.69494 8.07995 3.91494 8.29994 4.19494 8.29994ZM20.195 6.39995H9.19497C8.86497 6.39995 8.59497 6.12995 8.59497 5.79995C8.59497 5.46995 8.86497 5.19995 9.19497 5.19995H20.195C20.525 5.19995 20.795 5.46995 20.795 5.79995C20.795 6.12995 20.525 6.39995 20.195 6.39995ZM3.78486 14.36H6.37486C6.65486 14.36 6.87486 14.14 6.87486 13.86C6.87486 13.58 6.65486 13.36 6.37486 13.36H4.88486C5.00486 13.23 5.12486 13.09 5.23486 12.95C5.26626 12.9151 5.29645 12.8802 5.32626 12.8458L5.32629 12.8457C5.38192 12.7814 5.43627 12.7186 5.49486 12.66C5.73486 12.4 5.98486 12.12 6.17486 11.79C6.47486 11.25 6.41486 10.63 6.01486 10.17C5.57486 9.66 4.86486 9.5 4.24486 9.74C3.74486 9.95 3.39486 10.35 3.22486 10.91C3.14486 11.18 3.29486 11.46 3.56486 11.54C3.82486 11.61 4.10486 11.46 4.18486 11.2C4.29486 10.85 4.48486 10.73 4.62486 10.67C4.88486 10.57 5.13486 10.68 5.26486 10.82C5.38486 10.96 5.40486 11.12 5.30486 11.29C5.17595 11.5202 4.99618 11.7165 4.80458 11.9257L4.75486 11.98C4.67298 12.0801 4.58283 12.1801 4.49946 12.2727L4.49945 12.2727L4.47486 12.3C4.12486 12.72 3.76486 13.13 3.40486 13.53C3.27486 13.68 3.23486 13.9 3.32486 14.07C3.41486 14.24 3.58486 14.36 3.78486 14.36ZM3.68486 20.3699C4.04486 20.5899 4.46486 20.6999 4.87486 20.6999C5.13486 20.6999 5.38486 20.6499 5.61486 20.5499C6.31486 20.2799 6.73486 19.5599 6.60486 18.8799C6.53486 18.5499 6.35486 18.2899 6.12486 18.0899C6.32486 17.8999 6.45486 17.6499 6.50486 17.3799C6.57486 17.0099 6.49486 16.6299 6.27486 16.3099C5.85486 15.6899 5.07486 15.5199 4.10486 15.8299C3.83486 15.9199 3.69486 16.1999 3.77486 16.4599C3.86486 16.7299 4.14486 16.8699 4.40486 16.7899C4.70486 16.6999 5.24486 16.5799 5.45486 16.8899C5.51486 16.9899 5.54486 17.0999 5.52486 17.1999C5.51486 17.2699 5.47486 17.3599 5.36486 17.4299C5.26486 17.4999 5.12486 17.5399 4.95486 17.5799L4.77486 17.6299C4.54486 17.6999 4.40486 17.9099 4.41486 18.1499C4.42486 18.3899 4.61486 18.5799 4.84486 18.6099C5.20486 18.6599 5.58486 18.8299 5.63486 19.0799C5.67486 19.2999 5.46486 19.5499 5.25486 19.6299C4.94486 19.7599 4.52486 19.7099 4.21486 19.5199C3.97486 19.3699 3.67486 19.4399 3.52486 19.6799C3.37486 19.9199 3.44486 20.2299 3.68486 20.3699ZM20.195 18.7999H9.19497C8.86497 18.7999 8.59497 18.5299 8.59497 18.1999C8.59497 17.8699 8.86497 17.5999 9.19497 17.5999H20.195C20.525 17.5999 20.795 17.8699 20.795 18.1999C20.795 18.5299 20.525 18.7999 20.195 18.7999ZM9.19497 12.5999H20.195C20.525 12.5999 20.795 12.3299 20.795 11.9999C20.795 11.6699 20.525 11.3999 20.195 11.3999H9.19497C8.86497 11.3999 8.59497 11.6699 8.59497 11.9999C8.59497 12.3299 8.86497 12.5999 9.19497 12.5999Z"/></svg>', icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M4.19494 8.29994H5.99494C6.26494 8.29994 6.49494 8.07995 6.49494 7.79994C6.49494 7.51995 6.27494 7.29994 5.99494 7.29994H5.59494V3.79994C5.59494 3.62994 5.50494 3.46994 5.36494 3.37994C5.22494 3.28994 5.04494 3.26994 4.89494 3.33994L3.89494 3.76994C3.64494 3.87994 3.52494 4.17994 3.63494 4.42994C3.74494 4.67994 4.03494 4.79994 4.29494 4.68994L4.59494 4.55994V7.29994H4.19494C3.91494 7.29994 3.69494 7.51995 3.69494 7.79994C3.69494 8.07995 3.91494 8.29994 4.19494 8.29994ZM20.195 6.39995H9.19497C8.86497 6.39995 8.59497 6.12995 8.59497 5.79995C8.59497 5.46995 8.86497 5.19995 9.19497 5.19995H20.195C20.525 5.19995 20.795 5.46995 20.795 5.79995C20.795 6.12995 20.525 6.39995 20.195 6.39995ZM3.78486 14.36H6.37486C6.65486 14.36 6.87486 14.14 6.87486 13.86C6.87486 13.58 6.65486 13.36 6.37486 13.36H4.88486C5.00486 13.23 5.12486 13.09 5.23486 12.95C5.26626 12.9151 5.29645 12.8802 5.32626 12.8458L5.32629 12.8457C5.38192 12.7814 5.43627 12.7186 5.49486 12.66C5.73486 12.4 5.98486 12.12 6.17486 11.79C6.47486 11.25 6.41486 10.63 6.01486 10.17C5.57486 9.66 4.86486 9.5 4.24486 9.74C3.74486 9.95 3.39486 10.35 3.22486 10.91C3.14486 11.18 3.29486 11.46 3.56486 11.54C3.82486 11.61 4.10486 11.46 4.18486 11.2C4.29486 10.85 4.48486 10.73 4.62486 10.67C4.88486 10.57 5.13486 10.68 5.26486 10.82C5.38486 10.96 5.40486 11.12 5.30486 11.29C5.17595 11.5202 4.99618 11.7165 4.80458 11.9257L4.75486 11.98C4.67298 12.0801 4.58283 12.1801 4.49946 12.2727L4.49945 12.2727L4.47486 12.3C4.12486 12.72 3.76486 13.13 3.40486 13.53C3.27486 13.68 3.23486 13.9 3.32486 14.07C3.41486 14.24 3.58486 14.36 3.78486 14.36ZM3.68486 20.3699C4.04486 20.5899 4.46486 20.6999 4.87486 20.6999C5.13486 20.6999 5.38486 20.6499 5.61486 20.5499C6.31486 20.2799 6.73486 19.5599 6.60486 18.8799C6.53486 18.5499 6.35486 18.2899 6.12486 18.0899C6.32486 17.8999 6.45486 17.6499 6.50486 17.3799C6.57486 17.0099 6.49486 16.6299 6.27486 16.3099C5.85486 15.6899 5.07486 15.5199 4.10486 15.8299C3.83486 15.9199 3.69486 16.1999 3.77486 16.4599C3.86486 16.7299 4.14486 16.8699 4.40486 16.7899C4.70486 16.6999 5.24486 16.5799 5.45486 16.8899C5.51486 16.9899 5.54486 17.0999 5.52486 17.1999C5.51486 17.2699 5.47486 17.3599 5.36486 17.4299C5.26486 17.4999 5.12486 17.5399 4.95486 17.5799L4.77486 17.6299C4.54486 17.6999 4.40486 17.9099 4.41486 18.1499C4.42486 18.3899 4.61486 18.5799 4.84486 18.6099C5.20486 18.6599 5.58486 18.8299 5.63486 19.0799C5.67486 19.2999 5.46486 19.5499 5.25486 19.6299C4.94486 19.7599 4.52486 19.7099 4.21486 19.5199C3.97486 19.3699 3.67486 19.4399 3.52486 19.6799C3.37486 19.9199 3.44486 20.2299 3.68486 20.3699ZM20.195 18.7999H9.19497C8.86497 18.7999 8.59497 18.5299 8.59497 18.1999C8.59497 17.8699 8.86497 17.5999 9.19497 17.5999H20.195C20.525 17.5999 20.795 17.8699 20.795 18.1999C20.795 18.5299 20.525 18.7999 20.195 18.7999ZM9.19497 12.5999H20.195C20.525 12.5999 20.795 12.3299 20.795 11.9999C20.795 11.6699 20.525 11.3999 20.195 11.3999H9.19497C8.86497 11.3999 8.59497 11.6699 8.59497 11.9999C8.59497 12.3299 8.86497 12.5999 9.19497 12.5999Z"/></svg>',
}, },
'|', '|',
{ {
name: 'clean-block', name: 'clean-block',
action: EasyMDE.cleanBlock, action: EasyMDE.cleanBlock,
title: i18n.global.t('input.editor.cleanBlock'), title: i18n.global.t('input.editor.cleanBlock'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill-rule="evenodd" clip-rule="evenodd" d="M9.25989 6.18384H20.4513C20.7823 6.18384 21.0509 6.45239 21.0509 6.78345V17.9749C21.0509 18.3059 20.7823 18.5745 20.4513 18.5745H9.25989C9.0929 18.5745 8.93469 18.5061 8.82043 18.384L3.6095 12.7883C3.39563 12.5579 3.39563 12.2004 3.6095 11.97L8.82043 6.37427C8.93469 6.2522 9.0929 6.18384 9.25989 6.18384ZM9.52063 17.3752H19.8517V7.38306H9.52063L4.86926 12.3792L9.52063 17.3752ZM12.7755 15.0686C12.6222 15.0686 12.4679 15.01 12.3517 14.8928C12.1173 14.6584 12.1173 14.2786 12.3517 14.0452L14.0503 12.3469L12.3517 10.6487C12.1173 10.4153 12.1173 10.0354 12.3517 9.80103C12.5841 9.56665 12.965 9.56665 13.1993 9.80103L14.8981 11.4994L16.5968 9.80103C16.8312 9.56665 17.212 9.56665 17.4445 9.80103C17.6788 10.0354 17.6788 10.4153 17.4445 10.6487L15.7458 12.3469L17.4445 14.0452C17.6788 14.2786 17.6788 14.6584 17.4445 14.8928C17.3282 15.01 17.174 15.0686 17.0206 15.0686C16.8673 15.0686 16.714 15.01 16.5968 14.8928L14.8981 13.1945L13.1993 14.8928C13.0822 15.01 12.9288 15.0686 12.7755 15.0686Z"/></svg>', icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M9.25989 6.18384H20.4513C20.7823 6.18384 21.0509 6.45239 21.0509 6.78345V17.9749C21.0509 18.3059 20.7823 18.5745 20.4513 18.5745H9.25989C9.0929 18.5745 8.93469 18.5061 8.82043 18.384L3.6095 12.7883C3.39563 12.5579 3.39563 12.2004 3.6095 11.97L8.82043 6.37427C8.93469 6.2522 9.0929 6.18384 9.25989 6.18384ZM9.52063 17.3752H19.8517V7.38306H9.52063L4.86926 12.3792L9.52063 17.3752ZM12.7755 15.0686C12.6222 15.0686 12.4679 15.01 12.3517 14.8928C12.1173 14.6584 12.1173 14.2786 12.3517 14.0452L14.0503 12.3469L12.3517 10.6487C12.1173 10.4153 12.1173 10.0354 12.3517 9.80103C12.5841 9.56665 12.965 9.56665 13.1993 9.80103L14.8981 11.4994L16.5968 9.80103C16.8312 9.56665 17.212 9.56665 17.4445 9.80103C17.6788 10.0354 17.6788 10.4153 17.4445 10.6487L15.7458 12.3469L17.4445 14.0452C17.6788 14.2786 17.6788 14.6584 17.4445 14.8928C17.3282 15.01 17.174 15.0686 17.0206 15.0686C16.8673 15.0686 16.714 15.01 16.5968 14.8928L14.8981 13.1945L13.1993 14.8928C13.0822 15.01 12.9288 15.0686 12.7755 15.0686Z"/></svg>',
}, },
{ {
name: 'link', name: 'link',
action: EasyMDE.drawLink, action: EasyMDE.drawLink,
title: i18n.global.t('input.editor.link'), title: i18n.global.t('input.editor.link'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill-rule="evenodd" clip-rule="evenodd" d="M11.4399 15.3452C11.4999 15.3652 11.5699 15.3752 11.6299 15.3752C11.8799 15.3752 12.1199 15.2152 12.1999 14.9652C12.2999 14.6452 12.1299 14.3052 11.8199 14.2052C11.3499 14.0452 10.9299 13.7852 10.5699 13.4152C10.1999 13.0552 9.9399 12.6452 9.7799 12.1552C9.6599 11.8252 9.5999 11.4652 9.5999 11.0952C9.5999 10.2152 9.9399 9.38518 10.5699 8.75518L15.1599 4.15518C16.4499 2.87518 18.5399 2.87518 19.8299 4.15518C20.4499 4.78518 20.7899 5.61518 20.7899 6.49518C20.7899 7.37518 20.4499 8.20518 19.8299 8.82518L16.7399 11.9052C16.5099 12.1452 16.5099 12.5252 16.7399 12.7552C16.9799 12.9852 17.3599 12.9852 17.5899 12.7552L20.6799 9.67518C21.5299 8.83518 21.9999 7.69518 21.9999 6.49518C21.9999 5.29518 21.5299 4.16518 20.6899 3.30518C18.9299 1.55518 16.0799 1.55518 14.3199 3.30518L9.7299 7.90518C8.8699 8.75518 8.3999 9.88518 8.3999 11.0952C8.3999 11.6152 8.4899 12.1152 8.6499 12.5552C8.8599 13.1952 9.2399 13.7952 9.7199 14.2652C10.1999 14.7552 10.7999 15.1352 11.4399 15.3452ZM3.32 20.6851C4.2 21.5551 5.35 21.9951 6.5 21.9951C7.65 21.9951 8.81 21.5551 9.69 20.7051L14.28 16.1051C15.14 15.2551 15.61 14.1251 15.61 12.9151C15.61 12.4551 15.54 11.9951 15.4 11.5551C15.17 10.8651 14.8 10.2551 14.28 9.73509C13.76 9.21509 13.15 8.84509 12.46 8.61509C12.14 8.51509 11.8 8.68509 11.7 8.99509C11.6 9.30509 11.77 9.64509 12.1 9.75509C12.61 9.91509 13.06 10.1951 13.44 10.5751C13.82 10.9551 14.09 11.4051 14.26 11.9151C14.36 12.2351 14.41 12.5651 14.41 12.9051C14.41 13.7951 14.06 14.6251 13.43 15.2451L8.84 19.8451C7.55 21.1251 5.46 21.1251 4.17 19.8451C3.55 19.2151 3.21 18.3951 3.21 17.5051C3.21 16.6151 3.55 15.7851 4.17 15.1651L7.35 11.9851C7.58 11.7451 7.59 11.3651 7.35 11.1351C7.11 10.9051 6.73 10.9051 6.5 11.1351L3.32 14.3151C2.47 15.1551 2 16.2851 2 17.4951C2 18.7051 2.47 19.8351 3.32 20.6851Z"/></svg>', icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M11.4399 15.3452C11.4999 15.3652 11.5699 15.3752 11.6299 15.3752C11.8799 15.3752 12.1199 15.2152 12.1999 14.9652C12.2999 14.6452 12.1299 14.3052 11.8199 14.2052C11.3499 14.0452 10.9299 13.7852 10.5699 13.4152C10.1999 13.0552 9.9399 12.6452 9.7799 12.1552C9.6599 11.8252 9.5999 11.4652 9.5999 11.0952C9.5999 10.2152 9.9399 9.38518 10.5699 8.75518L15.1599 4.15518C16.4499 2.87518 18.5399 2.87518 19.8299 4.15518C20.4499 4.78518 20.7899 5.61518 20.7899 6.49518C20.7899 7.37518 20.4499 8.20518 19.8299 8.82518L16.7399 11.9052C16.5099 12.1452 16.5099 12.5252 16.7399 12.7552C16.9799 12.9852 17.3599 12.9852 17.5899 12.7552L20.6799 9.67518C21.5299 8.83518 21.9999 7.69518 21.9999 6.49518C21.9999 5.29518 21.5299 4.16518 20.6899 3.30518C18.9299 1.55518 16.0799 1.55518 14.3199 3.30518L9.7299 7.90518C8.8699 8.75518 8.3999 9.88518 8.3999 11.0952C8.3999 11.6152 8.4899 12.1152 8.6499 12.5552C8.8599 13.1952 9.2399 13.7952 9.7199 14.2652C10.1999 14.7552 10.7999 15.1352 11.4399 15.3452ZM3.32 20.6851C4.2 21.5551 5.35 21.9951 6.5 21.9951C7.65 21.9951 8.81 21.5551 9.69 20.7051L14.28 16.1051C15.14 15.2551 15.61 14.1251 15.61 12.9151C15.61 12.4551 15.54 11.9951 15.4 11.5551C15.17 10.8651 14.8 10.2551 14.28 9.73509C13.76 9.21509 13.15 8.84509 12.46 8.61509C12.14 8.51509 11.8 8.68509 11.7 8.99509C11.6 9.30509 11.77 9.64509 12.1 9.75509C12.61 9.91509 13.06 10.1951 13.44 10.5751C13.82 10.9551 14.09 11.4051 14.26 11.9151C14.36 12.2351 14.41 12.5651 14.41 12.9051C14.41 13.7951 14.06 14.6251 13.43 15.2451L8.84 19.8451C7.55 21.1251 5.46 21.1251 4.17 19.8451C3.55 19.2151 3.21 18.3951 3.21 17.5051C3.21 16.6151 3.55 15.7851 4.17 15.1651L7.35 11.9851C7.58 11.7451 7.59 11.3651 7.35 11.1351C7.11 10.9051 6.73 10.9051 6.5 11.1351L3.32 14.3151C2.47 15.1551 2 16.2851 2 17.4951C2 18.7051 2.47 19.8351 3.32 20.6851Z"/></svg>',
}, },
{ {
name: 'image', name: 'image',
action: EasyMDE.drawImage, action: EasyMDE.drawImage,
title: i18n.global.t('input.editor.image'), title: i18n.global.t('input.editor.image'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill-rule="evenodd" clip-rule="evenodd" d="M4 4C2.89543 4 2 4.89543 2 6V16V17.5152V18C2 19.1046 2.89543 20 4 20H20C21.0528 20 21.9156 19.1866 21.9942 18.1539L22 18.1632V18V16V6C22 4.89543 21.1046 4 20 4H4ZM3.2 17.7V16.5642L6.78192 13.7254C6.8616 13.6622 6.97597 13.6689 7.04776 13.7409L10.3126 17.0146C10.7026 17.4056 11.3357 17.4065 11.7268 17.0165C11.7606 16.9827 11.792 16.9465 11.8207 16.9083L16.736 10.352C16.8023 10.2636 16.9277 10.2457 17.016 10.312C17.0355 10.3265 17.0521 10.3445 17.0651 10.365L20.8 16.2669V17.7C20.8 18.3075 20.3075 18.8 19.7 18.8H4.3C3.69249 18.8 3.2 18.3075 3.2 17.7ZM17.3865 8.61836L20.8 14.08V6.3C20.8 5.69249 20.3075 5.2 19.7 5.2H4.3C3.69249 5.2 3.2 5.69249 3.2 6.3V15.04L6.65054 12.2796C6.84949 12.1204 7.13629 12.1363 7.31645 12.3164L10.8369 15.8369C10.915 15.915 11.0417 15.915 11.1198 15.8369C11.1265 15.8302 16.5625 8.58336 16.5625 8.58336C16.7282 8.36245 17.0416 8.31768 17.2625 8.48336C17.3118 8.52034 17.3538 8.56611 17.3865 8.61836ZM8 8.5C8 9.32843 7.32843 10 6.5 10C5.67157 10 5 9.32843 5 8.5C5 7.67157 5.67157 7 6.5 7C7.32843 7 8 7.67157 8 8.5Z"/></svg>', icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M4 4C2.89543 4 2 4.89543 2 6V16V17.5152V18C2 19.1046 2.89543 20 4 20H20C21.0528 20 21.9156 19.1866 21.9942 18.1539L22 18.1632V18V16V6C22 4.89543 21.1046 4 20 4H4ZM3.2 17.7V16.5642L6.78192 13.7254C6.8616 13.6622 6.97597 13.6689 7.04776 13.7409L10.3126 17.0146C10.7026 17.4056 11.3357 17.4065 11.7268 17.0165C11.7606 16.9827 11.792 16.9465 11.8207 16.9083L16.736 10.352C16.8023 10.2636 16.9277 10.2457 17.016 10.312C17.0355 10.3265 17.0521 10.3445 17.0651 10.365L20.8 16.2669V17.7C20.8 18.3075 20.3075 18.8 19.7 18.8H4.3C3.69249 18.8 3.2 18.3075 3.2 17.7ZM17.3865 8.61836L20.8 14.08V6.3C20.8 5.69249 20.3075 5.2 19.7 5.2H4.3C3.69249 5.2 3.2 5.69249 3.2 6.3V15.04L6.65054 12.2796C6.84949 12.1204 7.13629 12.1363 7.31645 12.3164L10.8369 15.8369C10.915 15.915 11.0417 15.915 11.1198 15.8369C11.1265 15.8302 16.5625 8.58336 16.5625 8.58336C16.7282 8.36245 17.0416 8.31768 17.2625 8.48336C17.3118 8.52034 17.3538 8.56611 17.3865 8.61836ZM8 8.5C8 9.32843 7.32843 10 6.5 10C5.67157 10 5 9.32843 5 8.5C5 7.67157 5.67157 7 6.5 7C7.32843 7 8 7.67157 8 8.5Z"/></svg>',
}, },
{ {
name: 'table', name: 'table',
action: EasyMDE.drawTable, action: EasyMDE.drawTable,
title: i18n.global.t('input.editor.table'), title: i18n.global.t('input.editor.table'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill-rule="evenodd" clip-rule="evenodd" d="M6.18524 3.08496H19.4152C20.6752 3.08496 21.7152 4.11496 21.7152 5.38496V18.615C21.7152 19.885 20.6852 20.915 19.4152 20.915H6.18524C4.91524 20.915 3.88525 19.885 3.88525 18.615V5.38496C3.88525 4.11496 4.91524 3.08496 6.18524 3.08496ZM19.4052 19.705C20.0152 19.705 20.5052 19.215 20.5052 18.605H20.5153V5.38496C20.5153 4.77496 20.0252 4.28496 19.4152 4.28496H6.18524C5.57524 4.28496 5.08521 4.77496 5.08521 5.38496V18.605C5.08521 19.215 5.57524 19.705 6.18524 19.705H19.4052ZM17.4453 9.15503H8.15527C7.82527 9.15503 7.5553 9.42503 7.5553 9.75503C7.5553 10.085 7.82527 10.355 8.15527 10.355H17.4453C17.7753 10.355 18.0453 10.085 18.0453 9.75503C18.0453 9.42503 17.7753 9.15503 17.4453 9.15503ZM17.4453 13.635H8.15527C7.82527 13.635 7.5553 13.905 7.5553 14.235C7.5553 14.565 7.82527 14.835 8.15527 14.835H17.4453C17.7753 14.835 18.0453 14.565 18.0453 14.235C18.0453 13.905 17.7753 13.635 17.4453 13.635Z"/></svg>', icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M6.18524 3.08496H19.4152C20.6752 3.08496 21.7152 4.11496 21.7152 5.38496V18.615C21.7152 19.885 20.6852 20.915 19.4152 20.915H6.18524C4.91524 20.915 3.88525 19.885 3.88525 18.615V5.38496C3.88525 4.11496 4.91524 3.08496 6.18524 3.08496ZM19.4052 19.705C20.0152 19.705 20.5052 19.215 20.5052 18.605H20.5153V5.38496C20.5153 4.77496 20.0252 4.28496 19.4152 4.28496H6.18524C5.57524 4.28496 5.08521 4.77496 5.08521 5.38496V18.605C5.08521 19.215 5.57524 19.705 6.18524 19.705H19.4052ZM17.4453 9.15503H8.15527C7.82527 9.15503 7.5553 9.42503 7.5553 9.75503C7.5553 10.085 7.82527 10.355 8.15527 10.355H17.4453C17.7753 10.355 18.0453 10.085 18.0453 9.75503C18.0453 9.42503 17.7753 9.15503 17.4453 9.15503ZM17.4453 13.635H8.15527C7.82527 13.635 7.5553 13.905 7.5553 14.235C7.5553 14.565 7.82527 14.835 8.15527 14.835H17.4453C17.7753 14.835 18.0453 14.565 18.0453 14.235C18.0453 13.905 17.7753 13.635 17.4453 13.635Z"/></svg>',
}, },
{ {
name: 'horizontal-rule', name: 'horizontal-rule',
action: EasyMDE.drawHorizontalRule, action: EasyMDE.drawHorizontalRule,
title: i18n.global.t('input.editor.horizontalRule'), title: i18n.global.t('input.editor.horizontalRule'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill-rule="evenodd" clip-rule="evenodd" d="M21 13H3C2.45 13 2 12.55 2 12C2 11.45 2.45 11 3 11H21C21.55 11 22 11.45 22 12C22 12.55 21.55 13 21 13Z"/></svg>', icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M21 13H3C2.45 13 2 12.55 2 12C2 11.45 2.45 11 3 11H21C21.55 11 22 11.45 22 12C22 12.55 21.55 13 21 13Z"/></svg>',
}, },
'|', '|',
{ {
name: 'side-by-side', name: 'side-by-side',
action: EasyMDE.toggleSideBySide, action: EasyMDE.toggleSideBySide,
title: i18n.global.t('input.editor.sideBySide'), title: i18n.global.t('input.editor.sideBySide'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill-rule="evenodd" clip-rule="evenodd" d="M18.4787 14.58C18.3587 14.69 18.2987 14.85 18.2987 15C18.2987 15.15 18.3587 15.31 18.4787 15.42C18.7187 15.65 19.0987 15.65 19.3287 15.42L22.3287 12.42C22.5587 12.18 22.5587 11.8 22.3287 11.57L19.3287 8.56996C19.0887 8.33996 18.7087 8.33996 18.4787 8.56996C18.2487 8.80996 18.2487 9.18996 18.4787 9.41996L20.451 11.3999L14.4487 11.3999L14.4487 4.6C14.4487 4.27 14.1787 4 13.8487 4C13.5187 4 13.2487 4.27 13.2487 4.6L13.2487 19.4C13.2487 19.73 13.5187 20 13.8487 20C14.1787 20 14.4487 19.73 14.4487 19.4L14.4487 12.5999L20.4511 12.5999L18.4787 14.58ZM9.54878 19.4L9.54878 12.5999L3.5486 12.5999L5.52867 14.58C5.75867 14.81 5.75867 15.19 5.52867 15.43C5.29867 15.66 4.91867 15.66 4.67867 15.43L1.67867 12.43C1.63274 12.384 1.5956 12.3323 1.56725 12.2774C1.53058 12.2077 1.50724 12.1299 1.50068 12.0477C1.49934 12.0317 1.49867 12.0158 1.49867 12C1.49867 11.9841 1.49933 11.9682 1.50067 11.9522C1.51454 11.778 1.60365 11.6242 1.73526 11.5234L4.67867 8.57997C4.90867 8.34997 5.28867 8.34997 5.52867 8.57997C5.75867 8.80997 5.75867 9.18997 5.52867 9.42997L3.55107 11.3999L9.54878 11.3999L9.54878 4.6C9.54878 4.27 9.81878 4 10.1488 4C10.4788 4 10.7488 4.27 10.7488 4.6L10.7488 11.9999L10.7488 19.4C10.7488 19.73 10.4788 20 10.1488 20C9.81878 20 9.54878 19.73 9.54878 19.4Z"/></svg>', icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M18.4787 14.58C18.3587 14.69 18.2987 14.85 18.2987 15C18.2987 15.15 18.3587 15.31 18.4787 15.42C18.7187 15.65 19.0987 15.65 19.3287 15.42L22.3287 12.42C22.5587 12.18 22.5587 11.8 22.3287 11.57L19.3287 8.56996C19.0887 8.33996 18.7087 8.33996 18.4787 8.56996C18.2487 8.80996 18.2487 9.18996 18.4787 9.41996L20.451 11.3999L14.4487 11.3999L14.4487 4.6C14.4487 4.27 14.1787 4 13.8487 4C13.5187 4 13.2487 4.27 13.2487 4.6L13.2487 19.4C13.2487 19.73 13.5187 20 13.8487 20C14.1787 20 14.4487 19.73 14.4487 19.4L14.4487 12.5999L20.4511 12.5999L18.4787 14.58ZM9.54878 19.4L9.54878 12.5999L3.5486 12.5999L5.52867 14.58C5.75867 14.81 5.75867 15.19 5.52867 15.43C5.29867 15.66 4.91867 15.66 4.67867 15.43L1.67867 12.43C1.63274 12.384 1.5956 12.3323 1.56725 12.2774C1.53058 12.2077 1.50724 12.1299 1.50068 12.0477C1.49934 12.0317 1.49867 12.0158 1.49867 12C1.49867 11.9841 1.49933 11.9682 1.50067 11.9522C1.51454 11.778 1.60365 11.6242 1.73526 11.5234L4.67867 8.57997C4.90867 8.34997 5.28867 8.34997 5.52867 8.57997C5.75867 8.80997 5.75867 9.18997 5.52867 9.42997L3.55107 11.3999L9.54878 11.3999L9.54878 4.6C9.54878 4.27 9.81878 4 10.1488 4C10.4788 4 10.7488 4.27 10.7488 4.6L10.7488 11.9999L10.7488 19.4C10.7488 19.73 10.4788 20 10.1488 20C9.81878 20 9.54878 19.73 9.54878 19.4Z"/></svg>',
}, },
{ {
name: 'guide', name: 'guide',
@ -127,7 +127,7 @@ export function createEasyMDEConfig({ placeholder, uploadImage, imageUploadFunct
window.open('https://www.markdownguide.org/basic-syntax/', '_blank') window.open('https://www.markdownguide.org/basic-syntax/', '_blank')
}, },
title: i18n.global.t('input.editor.guide'), title: i18n.global.t('input.editor.guide'),
icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill-rule="evenodd" clip-rule="evenodd" d="M19.4999 2.3999H6.4999C5.0699 2.3999 3.8999 3.5699 3.8999 4.9999V18.9999C3.8999 20.4299 5.0699 21.5999 6.4999 21.5999H19.4999C19.8299 21.5999 20.0999 21.3299 20.0999 20.9999V16.9999V2.9999C20.0999 2.6699 19.8299 2.3999 19.4999 2.3999ZM5.0999 4.9999V16.8118C5.50468 16.5513 5.98546 16.3999 6.4999 16.3999H18.8999V3.5999H6.4999C5.7299 3.5999 5.0999 4.2299 5.0999 4.9999ZM6.4999 17.5999H18.8999V20.3999H6.4999C5.7299 20.3999 5.0999 19.7699 5.0999 18.9999C5.0999 18.2299 5.7299 17.5999 6.4999 17.5999ZM8.4999 8.5999H15.4999C15.8299 8.5999 16.0999 8.3299 16.0999 7.9999C16.0999 7.6699 15.8299 7.3999 15.4999 7.3999H8.4999C8.1699 7.3999 7.8999 7.6699 7.8999 7.9999C7.8999 8.3299 8.1699 8.5999 8.4999 8.5999ZM15.4999 11.3999H8.4999C8.1699 11.3999 7.8999 11.6699 7.8999 11.9999C7.8999 12.3299 8.1699 12.5999 8.4999 12.5999H15.4999C15.8299 12.5999 16.0999 12.3299 16.0999 11.9999C16.0999 11.6699 15.8299 11.3999 15.4999 11.3999Z"/></svg>', icon: '<svg viewBox="0 0 24 24"><rect fill="none" rx="0" ry="0"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M19.4999 2.3999H6.4999C5.0699 2.3999 3.8999 3.5699 3.8999 4.9999V18.9999C3.8999 20.4299 5.0699 21.5999 6.4999 21.5999H19.4999C19.8299 21.5999 20.0999 21.3299 20.0999 20.9999V16.9999V2.9999C20.0999 2.6699 19.8299 2.3999 19.4999 2.3999ZM5.0999 4.9999V16.8118C5.50468 16.5513 5.98546 16.3999 6.4999 16.3999H18.8999V3.5999H6.4999C5.7299 3.5999 5.0999 4.2299 5.0999 4.9999ZM6.4999 17.5999H18.8999V20.3999H6.4999C5.7299 20.3999 5.0999 19.7699 5.0999 18.9999C5.0999 18.2299 5.7299 17.5999 6.4999 17.5999ZM8.4999 8.5999H15.4999C15.8299 8.5999 16.0999 8.3299 16.0999 7.9999C16.0999 7.6699 15.8299 7.3999 15.4999 7.3999H8.4999C8.1699 7.3999 7.8999 7.6699 7.8999 7.9999C7.8999 8.3299 8.1699 8.5999 8.4999 8.5999ZM15.4999 11.3999H8.4999C8.1699 11.3999 7.8999 11.6699 7.8999 11.9999C7.8999 12.3299 8.1699 12.5999 8.4999 12.5999H15.4999C15.8299 12.5999 16.0999 12.3299 16.0999 11.9999C16.0999 11.6699 15.8299 11.3999 15.4999 11.3999Z"/></svg>',
}, },
], ],
} }

View File

@ -28,19 +28,20 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import {ref, watch} from 'vue' import {PropType, ref, watch} from 'vue'
import {useStore} from 'vuex' import {useStore} from 'vuex'
import ListService from '@/services/list' import ListService from '@/services/list'
import {colorIsDark} from '@/helpers/color/colorIsDark' import {colorIsDark} from '@/helpers/color/colorIsDark'
import ListModel from '@/models/list'
const background = ref<string | null>(null) const background = ref<string | null>(null)
const backgroundLoading = ref(false) const backgroundLoading = ref(false)
const props = defineProps({ const props = defineProps({
list: { list: {
type: Object, type: Object as PropType<ListModel>,
required: true, required: true,
}, },
showArchived: { showArchived: {
@ -68,7 +69,7 @@ async function loadBackground() {
const store = useStore() const store = useStore()
function toggleFavoriteList(list) { function toggleFavoriteList(list: ListModel) {
// The favorites pseudo list is always favorite // The favorites pseudo list is always favorite
// Archived lists cannot be marked favorite // Archived lists cannot be marked favorite
if (list.id === -1 || list.isArchived) { if (list.id === -1 || list.isArchived) {

View File

@ -4,7 +4,7 @@
<template v-for="(s, i) in shortcuts" :key="i"> <template v-for="(s, i) in shortcuts" :key="i">
<h3>{{ $t(s.title) }}</h3> <h3>{{ $t(s.title) }}</h3>
<message> <message class="mb-4">
{{ {{
s.available($route) ? $t('keyboardShortcuts.currentPageOnly') : $t('keyboardShortcuts.allPages') s.available($route) ? $t('keyboardShortcuts.currentPageOnly') : $t('keyboardShortcuts.allPages')
}} }}

View File

@ -38,9 +38,13 @@ const props = defineProps({
}, },
subscription: { subscription: {
required: true, required: true,
validator(value) {
return value instanceof SubscriptionModel || value === null
},
}, },
entityId: { entityId: {
required: true, required: true,
type: Number,
}, },
isButton: { isButton: {
type: Boolean, type: Boolean,
@ -48,6 +52,8 @@ const props = defineProps({
}, },
}) })
const subscriptionEntity = computed<string>(() => props.subscription.entity)
const emit = defineEmits(['change']) const emit = defineEmits(['change'])
const subscriptionService = shallowRef(new SubscriptionService()) const subscriptionService = shallowRef(new SubscriptionService())
@ -57,7 +63,7 @@ const tooltipText = computed(() => {
if (disabled.value) { if (disabled.value) {
return t('task.subscription.subscribedThroughParent', { return t('task.subscription.subscribedThroughParent', {
entity: props.entity, entity: props.entity,
parent: props.subscription.entity, parent: subscriptionEntity.value,
}) })
} }
@ -73,7 +79,7 @@ const disabled = computed(() => {
return false return false
} }
return props.subscription.entity !== props.entity return subscriptionEntity.value !== props.entity
}) })
function changeSubscription() { function changeSubscription() {

View File

@ -13,6 +13,7 @@
import {ref, computed} from 'vue' import {ref, computed} from 'vue'
import {useStore} from 'vuex' import {useStore} from 'vuex'
import Multiselect from '@/components/input/multiselect.vue' import Multiselect from '@/components/input/multiselect.vue'
import NamespaceModel from '@/models/namespace'
const emit = defineEmits(['selected']) const emit = defineEmits(['selected'])
@ -25,7 +26,7 @@ function findNamespaces(newQuery: string) {
query.value = newQuery query.value = newQuery
} }
function select(namespace) { function select(namespace: NamespaceModel) {
emit('selected', namespace) emit('selected', namespace)
} }
</script> </script>

View File

@ -34,7 +34,7 @@
> >
<div class="filename">{{ a.file.name }}</div> <div class="filename">{{ a.file.name }}</div>
<div class="info"> <div class="info">
<p class="collapses"> <p class="attachment-info-meta">
<i18n-t keypath="task.attachment.createdBy"> <i18n-t keypath="task.attachment.createdBy">
<span v-tooltip="formatDate(a.created)"> <span v-tooltip="formatDate(a.created)">
{{ formatDateSince(a.created) }} {{ formatDateSince(a.created) }}
@ -289,21 +289,6 @@ export default {
content: '·'; content: '·';
padding: 0 .25rem; padding: 0 .25rem;
} }
@media screen and (max-width: $mobile) {
&.collapses {
flex-direction: column;
> span:not(:last-child):after,
> a:not(:last-child):after {
display: none;
}
.user .username {
display: none;
}
}
}
} }
} }
} }
@ -341,6 +326,10 @@ export default {
height: auto; height: auto;
text-shadow: var(--shadow-md); text-shadow: var(--shadow-md);
animation: bounce 2s infinite; animation: bounce 2s infinite;
@media (prefers-reduced-motion: reduce) {
animation: none;
}
} }
.hint { .hint {
@ -357,6 +346,35 @@ export default {
} }
} }
.attachment-info-meta {
display: flex;
align-items: center;
:deep(.user) {
display: flex !important;
align-items: center;
margin: 0 .5rem;
}
@media screen and (max-width: $mobile) {
flex-direction: column;
align-items: flex-start;
:deep(.user) {
margin: .5rem 0;
}
> span:not(:last-child):after,
> a:not(:last-child):after {
display: none;
}
.user .username {
display: none;
}
}
}
@keyframes bounce { @keyframes bounce {
from, from,
20%, 20%,

View File

@ -1,6 +1,8 @@
<template> <template>
<td v-tooltip="+date === 0 ? '' : formatDate(date)"> <td v-tooltip="+date === 0 ? '' : formatDate(date)">
{{ +date === 0 ? '-' : formatDateSince(date) }} <time :datetime="date ? formatISO(date) : null">
{{ +date === 0 ? '-' : formatDateSince(date) }}
</time>
</td> </td>
</template> </template>

View File

@ -25,13 +25,13 @@
<template #searchResult="props"> <template #searchResult="props">
<span <span
v-if="typeof props.option === 'string'" v-if="typeof props.option === 'string'"
class="tag"> class="tag search-result">
<span>{{ props.option }}</span> <span>{{ props.option }}</span>
</span> </span>
<span <span
v-else v-else
:style="{'background': props.option.hexColor, 'color': props.option.textColor}" :style="{'background': props.option.hexColor, 'color': props.option.textColor}"
class="tag"> class="tag search-result">
<span>{{ props.option.title }}</span> <span>{{ props.option.title }}</span>
</span> </span>
</template> </template>
@ -152,6 +152,18 @@ export default {
<style lang="scss" scoped> <style lang="scss" scoped>
.tag { .tag {
margin: .5rem 0 0 .5rem; margin: .25rem !important;
}
.tag.search-result {
margin: 0 !important;
}
:deep(.input-wrapper) {
padding: .25rem !important;
}
:deep(input.input) {
padding: 0 .5rem;
} }
</style> </style>

View File

@ -28,9 +28,9 @@
<span class="icon"> <span class="icon">
<icon :icon="['far', 'calendar-alt']"/> <icon :icon="['far', 'calendar-alt']"/>
</span> </span>
<span> <time :datetime="formatISO(task.dueDate)">
{{ formatDateSince(task.dueDate) }} {{ formatDateSince(task.dueDate) }}
</span> </time>
</span> </span>
<h3>{{ task.title }}</h3> <h3>{{ task.title }}</h3>
<progress <progress

View File

@ -39,14 +39,17 @@
:user="a" :user="a"
v-for="(a, i) in task.assignees" v-for="(a, i) in task.assignees"
/> />
<i <time
:datetime="formatISO(task.dueDate)"
:class="{'overdue': task.dueDate <= new Date() && !task.done}" :class="{'overdue': task.dueDate <= new Date() && !task.done}"
class="is-italic"
@click.prevent.stop="showDefer = !showDefer" @click.prevent.stop="showDefer = !showDefer"
v-if="+new Date(task.dueDate) > 0" v-if="+new Date(task.dueDate) > 0"
v-tooltip="formatDate(task.dueDate)" v-tooltip="formatDate(task.dueDate)"
:aria-expanded="showDefer ? 'true' : 'false'"
> >
- {{ $t('task.detail.due', {at: formatDateSince(task.dueDate)}) }} - {{ $t('task.detail.due', {at: formatDateSince(task.dueDate)}) }}
</i> </time>
<transition name="fade"> <transition name="fade">
<defer-task v-if="+new Date(task.dueDate) > 0 && showDefer" v-model="task" ref="deferDueDate"/> <defer-task v-if="+new Date(task.dueDate) > 0 && showDefer" v-model="task" ref="deferDueDate"/>
</transition> </transition>

View File

@ -1,9 +1,9 @@
import {computed, watch, readonly} from 'vue' import {computed, watch, readonly} from 'vue'
import {useStorage, createSharedComposable, ColorSchema, usePreferredColorScheme, tryOnMounted} from '@vueuse/core' import {useStorage, createSharedComposable, BasicColorSchema, usePreferredColorScheme, tryOnMounted} from '@vueuse/core'
const STORAGE_KEY = 'color-scheme' const STORAGE_KEY = 'color-scheme'
const DEFAULT_COLOR_SCHEME_SETTING: ColorSchema = 'light' const DEFAULT_COLOR_SCHEME_SETTING: BasicColorSchema = 'light'
const CLASS_DARK = 'dark' const CLASS_DARK = 'dark'
const CLASS_LIGHT = 'light' const CLASS_LIGHT = 'light'
@ -16,7 +16,7 @@ const CLASS_LIGHT = 'light'
// - value is synced via `createSharedComposable` // - value is synced via `createSharedComposable`
// https://github.com/vueuse/vueuse/blob/main/packages/core/useDark/index.ts // https://github.com/vueuse/vueuse/blob/main/packages/core/useDark/index.ts
export const useColorScheme = createSharedComposable(() => { export const useColorScheme = createSharedComposable(() => {
const store = useStorage<ColorSchema>(STORAGE_KEY, DEFAULT_COLOR_SCHEME_SETTING) const store = useStorage<BasicColorSchema>(STORAGE_KEY, DEFAULT_COLOR_SCHEME_SETTING)
const preferredColorScheme = usePreferredColorScheme() const preferredColorScheme = usePreferredColorScheme()

View File

@ -1,5 +1,5 @@
import {createDateFromString} from '@/helpers/time/createDateFromString' import {createDateFromString} from '@/helpers/time/createDateFromString'
import {format, formatDistanceToNow} from 'date-fns' import {format, formatDistanceToNow, formatISO as formatISOfns} from 'date-fns'
import {enGB, de, fr, ru} from 'date-fns/locale' import {enGB, de, fr, ru} from 'date-fns/locale'
import {i18n} from '@/i18n' import {i18n} from '@/i18n'
@ -44,3 +44,7 @@ export const formatDateSince = (date) => {
addSuffix: true, addSuffix: true,
}) })
} }
export function formatISO(date) {
return date ? formatISOfns(date) : ''
}

View File

@ -7,7 +7,7 @@
"lastViewed": "Naposledy zobrazeno", "lastViewed": "Naposledy zobrazeno",
"list": { "list": {
"newText": "Můžete vytvořit nový seznam pro své nové úkoly:", "newText": "Můžete vytvořit nový seznam pro své nové úkoly:",
"new": "New list", "new": "Nový seznam",
"importText": "Nebo importujte své seznamy a úkoly z jiných služeb:", "importText": "Nebo importujte své seznamy a úkoly z jiných služeb:",
"import": "Importujte svá data do Vikunja" "import": "Importujte svá data do Vikunja"
} }
@ -157,7 +157,7 @@
"searchSelect": "Klikněte nebo stiskněte Enter pro výběr tohoto seznamu", "searchSelect": "Klikněte nebo stiskněte Enter pro výběr tohoto seznamu",
"shared": "Sdílené seznamy", "shared": "Sdílené seznamy",
"create": { "create": {
"header": "New list", "header": "Nový seznam",
"titlePlaceholder": "Název seznamu přijde sem…", "titlePlaceholder": "Název seznamu přijde sem…",
"addTitleRequired": "Uveďte prosím název.", "addTitleRequired": "Uveďte prosím název.",
"createdSuccess": "Seznam byl úspěšně vytvořen.", "createdSuccess": "Seznam byl úspěšně vytvořen.",
@ -315,7 +315,7 @@
"namespaces": "Prostory", "namespaces": "Prostory",
"search": "Začni psát pro vyhledání prostoru…", "search": "Začni psát pro vyhledání prostoru…",
"create": { "create": {
"title": "New namespace", "title": "Nový prostor",
"titleRequired": "Uveďte prosím název.", "titleRequired": "Uveďte prosím název.",
"explanation": "Prostor je kolekce seznamů, které můžete sdílet a používat k organizaci seznamů. Každý seznam patří do nějakého prostoru.", "explanation": "Prostor je kolekce seznamů, které můžete sdílet a používat k organizaci seznamů. Každý seznam patří do nějakého prostoru.",
"tooltip": "Co je prostor?", "tooltip": "Co je prostor?",
@ -383,7 +383,7 @@
"reminderRange": "Připomínky - období" "reminderRange": "Připomínky - období"
}, },
"create": { "create": {
"title": "New Saved Filter", "title": "Nový uložený filtr",
"description": "Uložený filtr je virtuální seznam, který se počítá ze sady filtrů pokaždé, když je přístupný. Jakmile bude vytvořen, objeví se ve speciálním prostoru.", "description": "Uložený filtr je virtuální seznam, který se počítá ze sady filtrů pokaždé, když je přístupný. Jakmile bude vytvořen, objeví se ve speciálním prostoru.",
"action": "Vytvořit uložený filtr" "action": "Vytvořit uložený filtr"
}, },
@ -545,7 +545,7 @@
"chooseStartDate": "Klikněte zde pro nastavení počátečního data", "chooseStartDate": "Klikněte zde pro nastavení počátečního data",
"chooseEndDate": "Klikněte zde pro nastavení data ukončení", "chooseEndDate": "Klikněte zde pro nastavení data ukončení",
"move": "Přesunout úkol do jiného seznamu", "move": "Přesunout úkol do jiného seznamu",
"done": "Hotovo!", "done": "Označit úkol jako hotový!",
"undone": "Označit jako znovu otevřené", "undone": "Označit jako znovu otevřené",
"created": "Vytvořeno {0} uživatelem {1}", "created": "Vytvořeno {0} uživatelem {1}",
"updated": "Aktualizováno {0}", "updated": "Aktualizováno {0}",
@ -781,7 +781,7 @@
"then": "potom", "then": "potom",
"task": { "task": {
"title": "Stránka úkolů", "title": "Stránka úkolů",
"done": "Označit úkol jako hotový", "done": "Hotovo",
"assign": "Přiřadit uživateli", "assign": "Přiřadit uživateli",
"labels": "Přidat štítky k tomuto úkolu", "labels": "Přidat štítky k tomuto úkolu",
"dueDate": "Změnit termín tohoto úkolu", "dueDate": "Změnit termín tohoto úkolu",
@ -899,7 +899,7 @@
"4015": "Komentář k úkolu neexistuje.", "4015": "Komentář k úkolu neexistuje.",
"4016": "Neplatné pole úkolu.", "4016": "Neplatné pole úkolu.",
"4017": "Neplatný komparátor filtru úkolů.", "4017": "Neplatný komparátor filtru úkolů.",
"4018": "Neplatný koncatinátor filtru úkolů.", "4018": "Invalid task filter concatenator.",
"4019": "Neplatná hodnota filtru úkolů.", "4019": "Neplatná hodnota filtru úkolů.",
"5001": "Prostor neexistuje.", "5001": "Prostor neexistuje.",
"5003": "Nemáte přístup ke zvolenému prostoru.", "5003": "Nemáte přístup ke zvolenému prostoru.",

View File

@ -7,7 +7,7 @@
"lastViewed": "Zuletzt angesehen", "lastViewed": "Zuletzt angesehen",
"list": { "list": {
"newText": "Du kannst eine neue Liste für deine neuen Aufgaben erstellen:", "newText": "Du kannst eine neue Liste für deine neuen Aufgaben erstellen:",
"new": "New list", "new": "Neue Liste",
"importText": "Oder importiere deine Listen und Aufgaben aus anderen Diensten in Vikunja:", "importText": "Oder importiere deine Listen und Aufgaben aus anderen Diensten in Vikunja:",
"import": "Deine Daten in Vikunja importieren" "import": "Deine Daten in Vikunja importieren"
} }
@ -157,7 +157,7 @@
"searchSelect": "Klicke auf oder drücke die Eingabetaste, um diese Liste auszuwählen", "searchSelect": "Klicke auf oder drücke die Eingabetaste, um diese Liste auszuwählen",
"shared": "Geteilte Listen", "shared": "Geteilte Listen",
"create": { "create": {
"header": "New list", "header": "Neue Liste",
"titlePlaceholder": "Der Titel der Liste steht hier…", "titlePlaceholder": "Der Titel der Liste steht hier…",
"addTitleRequired": "Bitte gebe einen Namen an.", "addTitleRequired": "Bitte gebe einen Namen an.",
"createdSuccess": "Die Liste wurde erfolgreich erstellt.", "createdSuccess": "Die Liste wurde erfolgreich erstellt.",
@ -315,7 +315,7 @@
"namespaces": "Namespaces", "namespaces": "Namespaces",
"search": "Beginne zu schreiben, um einen Namespace zu suchen…", "search": "Beginne zu schreiben, um einen Namespace zu suchen…",
"create": { "create": {
"title": "New namespace", "title": "Neuer Namespace",
"titleRequired": "Bitte gebe einen Titel an.", "titleRequired": "Bitte gebe einen Titel an.",
"explanation": "Ein Namespace ist eine Sammlung von Listen, die du teilen und zur Organisation verwenden kannst. Jede Liste zu einem Namespace.", "explanation": "Ein Namespace ist eine Sammlung von Listen, die du teilen und zur Organisation verwenden kannst. Jede Liste zu einem Namespace.",
"tooltip": "Was ist ein Namespace?", "tooltip": "Was ist ein Namespace?",
@ -383,7 +383,7 @@
"reminderRange": "Erinnerungs-Datumsbereich" "reminderRange": "Erinnerungs-Datumsbereich"
}, },
"create": { "create": {
"title": "New Saved Filter", "title": "Neuer gespeicherter Filter",
"description": "Ein gespeicherter Filter ist eine virtuelle Liste, die bei jedem Zugriff aus einem Satz von Filtern errechnet wird. Einmal erstellt, erscheint diese in einem speziellen Namespace.", "description": "Ein gespeicherter Filter ist eine virtuelle Liste, die bei jedem Zugriff aus einem Satz von Filtern errechnet wird. Einmal erstellt, erscheint diese in einem speziellen Namespace.",
"action": "Neuen gespeicherten Filter erstellen" "action": "Neuen gespeicherten Filter erstellen"
}, },
@ -545,7 +545,7 @@
"chooseStartDate": "Klicke hier, um ein Startdatum zu setzen", "chooseStartDate": "Klicke hier, um ein Startdatum zu setzen",
"chooseEndDate": "Klicke hier, um ein Enddatum zu setzen", "chooseEndDate": "Klicke hier, um ein Enddatum zu setzen",
"move": "Aufgabe in eine andere Liste verschieben", "move": "Aufgabe in eine andere Liste verschieben",
"done": "Fertig!", "done": "Als erledigt markieren!",
"undone": "Als nicht erledigt markieren", "undone": "Als nicht erledigt markieren",
"created": "Erstellt {0} von {1}", "created": "Erstellt {0} von {1}",
"updated": "Aktualisiert {0}", "updated": "Aktualisiert {0}",
@ -781,7 +781,7 @@
"then": "dann", "then": "dann",
"task": { "task": {
"title": "Aufgabenseite", "title": "Aufgabenseite",
"done": "Eine Aufgabe als erledigt markieren", "done": "Fertig",
"assign": "Benutzer:in zuweisen", "assign": "Benutzer:in zuweisen",
"labels": "Dieser Aufgabe ein Label hinzufügen", "labels": "Dieser Aufgabe ein Label hinzufügen",
"dueDate": "Ändere das Fälligkeitsdatum dieser Aufgabe", "dueDate": "Ändere das Fälligkeitsdatum dieser Aufgabe",
@ -899,7 +899,7 @@
"4015": "Dieser Aufgabenkommentar existiert nicht.", "4015": "Dieser Aufgabenkommentar existiert nicht.",
"4016": "Ungültiges Aufgabenfeld.", "4016": "Ungültiges Aufgabenfeld.",
"4017": "Ungültiger Aufgabenfilter (Vergleichskriterium).", "4017": "Ungültiger Aufgabenfilter (Vergleichskriterium).",
"4018": "Ungültiger Aufgabenfilter (Kombination).", "4018": "Ungültige Verkettung von Aufgabenfiltern.",
"4019": "Ungültiger Aufgabenfilter (Wert).", "4019": "Ungültiger Aufgabenfilter (Wert).",
"5001": "Dieser Namespace existiert nicht.", "5001": "Dieser Namespace existiert nicht.",
"5003": "Du hast keinen Zugriff auf den Namespace.", "5003": "Du hast keinen Zugriff auf den Namespace.",

View File

@ -7,7 +7,7 @@
"lastViewed": "Zletscht ahglueget", "lastViewed": "Zletscht ahglueget",
"list": { "list": {
"newText": "Du chasch e Liste für dini neue Uufgabe erstelle:", "newText": "Du chasch e Liste für dini neue Uufgabe erstelle:",
"new": "New list", "new": "Neue Liste",
"importText": "Oder importier dini Liste und Uufgabe us anderne Dienst nach Vikunja:", "importText": "Oder importier dini Liste und Uufgabe us anderne Dienst nach Vikunja:",
"import": "Dini Date in Vikunja importiere" "import": "Dini Date in Vikunja importiere"
} }
@ -157,7 +157,7 @@
"searchSelect": "Druck uf Enter um die Liste uuszwähle", "searchSelect": "Druck uf Enter um die Liste uuszwähle",
"shared": "Teilti Liste", "shared": "Teilti Liste",
"create": { "create": {
"header": "New list", "header": "Neue Liste",
"titlePlaceholder": "Listetitl da ahgeh…", "titlePlaceholder": "Listetitl da ahgeh…",
"addTitleRequired": "Bitte gib en Titl ah.", "addTitleRequired": "Bitte gib en Titl ah.",
"createdSuccess": "Liste erfolgriich erstellt.", "createdSuccess": "Liste erfolgriich erstellt.",
@ -315,7 +315,7 @@
"namespaces": "Namensrüüm", "namespaces": "Namensrüüm",
"search": "Schriib, um nachemne Namensruum z'sueche…", "search": "Schriib, um nachemne Namensruum z'sueche…",
"create": { "create": {
"title": "New namespace", "title": "Neuer Namespace",
"titleRequired": "Bitte gib en Titl ah.", "titleRequired": "Bitte gib en Titl ah.",
"explanation": "En Namensruum isch e Gruppe vo Liste, wo du chasch zur Organisation benutze. Tatsächlich sind alli Listene emne Namensruum zuegwise.", "explanation": "En Namensruum isch e Gruppe vo Liste, wo du chasch zur Organisation benutze. Tatsächlich sind alli Listene emne Namensruum zuegwise.",
"tooltip": "Was isch en Namensruum?", "tooltip": "Was isch en Namensruum?",
@ -383,7 +383,7 @@
"reminderRange": "Errinnerigs Datumbereich" "reminderRange": "Errinnerigs Datumbereich"
}, },
"create": { "create": {
"title": "New Saved Filter", "title": "Neuer gespeicherter Filter",
"description": "En gspeicherete Filter isch e virtuelli Liste, welche vomene Satz a Filter zemmegsetzt wird, sobald me uf sie zuegriift. Wenn sie mal erstellt worde isch, erhaltet si ihren eigene Namensruum.", "description": "En gspeicherete Filter isch e virtuelli Liste, welche vomene Satz a Filter zemmegsetzt wird, sobald me uf sie zuegriift. Wenn sie mal erstellt worde isch, erhaltet si ihren eigene Namensruum.",
"action": "Neue gspeicherete Filter erstelle" "action": "Neue gspeicherete Filter erstelle"
}, },
@ -545,7 +545,7 @@
"chooseStartDate": "Druck dah, um es Startdatum z'setze", "chooseStartDate": "Druck dah, um es Startdatum z'setze",
"chooseEndDate": "Druck da, um es Enddatum z'setze", "chooseEndDate": "Druck da, um es Enddatum z'setze",
"move": "Schieb die Uufgab in e anderi Liste", "move": "Schieb die Uufgab in e anderi Liste",
"done": "Fertig!", "done": "Als erledigt markieren!",
"undone": "Als unerledigt markierä", "undone": "Als unerledigt markierä",
"created": "Erstellt am {0} vo {1}", "created": "Erstellt am {0} vo {1}",
"updated": "{0} g'updatet", "updated": "{0} g'updatet",
@ -781,7 +781,7 @@
"then": "dann", "then": "dann",
"task": { "task": {
"title": "Uufgabesiite", "title": "Uufgabesiite",
"done": "Uufgab als erledigt markiere", "done": "Fertig",
"assign": "Benutzer:in zuweisen", "assign": "Benutzer:in zuweisen",
"labels": "Labels ennere Uufgab hinzuefüege", "labels": "Labels ennere Uufgab hinzuefüege",
"dueDate": "S'Fälligkeitsdatum für die Uufgab ändere", "dueDate": "S'Fälligkeitsdatum für die Uufgab ändere",
@ -899,7 +899,7 @@
"4015": "De Uufgabe Kommentar giz nid.", "4015": "De Uufgabe Kommentar giz nid.",
"4016": "Ungültigs Uufgabefeld.", "4016": "Ungültigs Uufgabefeld.",
"4017": "Ungültige Uufgabefilter vergliich.", "4017": "Ungültige Uufgabefilter vergliich.",
"4018": "Ungültige Uufgabefilter Zemmezug.", "4018": "Ungültige Verkettung von Aufgabenfiltern.",
"4019": "Ungültigi Uufgabe Filter Wert.", "4019": "Ungültigi Uufgabe Filter Wert.",
"5001": "De Namensruum existiert nid.", "5001": "De Namensruum existiert nid.",
"5003": "Du hesch kei Zuegriff zu dem Namensruum.", "5003": "Du hesch kei Zuegriff zu dem Namensruum.",

View File

@ -551,7 +551,7 @@
"chooseStartDate": "Click here to set a start date", "chooseStartDate": "Click here to set a start date",
"chooseEndDate": "Click here to set an end date", "chooseEndDate": "Click here to set an end date",
"move": "Move task to a different list", "move": "Move task to a different list",
"done": "Done!", "done": "Mark task done!",
"undone": "Mark as undone", "undone": "Mark as undone",
"created": "Created {0} by {1}", "created": "Created {0} by {1}",
"updated": "Updated {0}", "updated": "Updated {0}",
@ -787,7 +787,7 @@
"then": "then", "then": "then",
"task": { "task": {
"title": "Task Page", "title": "Task Page",
"done": "Mark a task as done", "done": "Done",
"assign": "Assign to a user", "assign": "Assign to a user",
"labels": "Add labels to this task", "labels": "Add labels to this task",
"dueDate": "Change the due date of this task", "dueDate": "Change the due date of this task",
@ -905,7 +905,7 @@
"4015": "The task comment does not exist.", "4015": "The task comment does not exist.",
"4016": "Invalid task field.", "4016": "Invalid task field.",
"4017": "Invalid task filter comparator.", "4017": "Invalid task filter comparator.",
"4018": "Invalid task filter concatinator.", "4018": "Invalid task filter concatenator.",
"4019": "Invalid task filter value.", "4019": "Invalid task filter value.",
"5001": "The namespace does not exist.", "5001": "The namespace does not exist.",
"5003": "You do not have access to the specified namespace.", "5003": "You do not have access to the specified namespace.",

View File

@ -545,7 +545,7 @@
"chooseStartDate": "Click here to set a start date", "chooseStartDate": "Click here to set a start date",
"chooseEndDate": "Click here to set an end date", "chooseEndDate": "Click here to set an end date",
"move": "Move task to a different list", "move": "Move task to a different list",
"done": "Done!", "done": "Mark task done!",
"undone": "Mark as undone", "undone": "Mark as undone",
"created": "Created {0} by {1}", "created": "Created {0} by {1}",
"updated": "Updated {0}", "updated": "Updated {0}",
@ -781,7 +781,7 @@
"then": "then", "then": "then",
"task": { "task": {
"title": "Task Page", "title": "Task Page",
"done": "Mark a task as done", "done": "Done",
"assign": "Assign to a user", "assign": "Assign to a user",
"labels": "Add labels to this task", "labels": "Add labels to this task",
"dueDate": "Change the due date of this task", "dueDate": "Change the due date of this task",
@ -899,7 +899,7 @@
"4015": "The task comment does not exist.", "4015": "The task comment does not exist.",
"4016": "Invalid task field.", "4016": "Invalid task field.",
"4017": "Invalid task filter comparator.", "4017": "Invalid task filter comparator.",
"4018": "Invalid task filter concatinator.", "4018": "Invalid task filter concatenator.",
"4019": "Invalid task filter value.", "4019": "Invalid task filter value.",
"5001": "The namespace does not exist.", "5001": "The namespace does not exist.",
"5003": "You do not have access to the specified namespace.", "5003": "You do not have access to the specified namespace.",

View File

@ -116,12 +116,12 @@
"vikunja": "Vikunja" "vikunja": "Vikunja"
}, },
"appearance": { "appearance": {
"title": "Color Scheme", "title": "Jeu de couleurs",
"setSuccess": "Saved change of color scheme to {colorScheme}", "setSuccess": "Changement du jeu de couleurs enregistré vers {colorScheme}",
"colorScheme": { "colorScheme": {
"light": "Light", "light": "Clair",
"system": "System", "system": "Système",
"dark": "Dark" "dark": "Sombre"
} }
} }
}, },
@ -475,7 +475,7 @@
"download": "Télécharger", "download": "Télécharger",
"showMenu": "Afficher le menu", "showMenu": "Afficher le menu",
"hideMenu": "Masquer le menu", "hideMenu": "Masquer le menu",
"forExample": "For example:", "forExample": "Par exemple :",
"welcomeBack": "Welcome Back!" "welcomeBack": "Welcome Back!"
}, },
"input": { "input": {
@ -545,7 +545,7 @@
"chooseStartDate": "Clique ici pour fixer une date de début", "chooseStartDate": "Clique ici pour fixer une date de début",
"chooseEndDate": "Clique ici pour fixer une date de fin", "chooseEndDate": "Clique ici pour fixer une date de fin",
"move": "Déplacer une tâche vers une autre liste", "move": "Déplacer une tâche vers une autre liste",
"done": "Terminé !", "done": "Mark task done!",
"undone": "Marquer comme inachevé", "undone": "Marquer comme inachevé",
"created": "Créé {0} par {1}", "created": "Créé {0} par {1}",
"updated": "Mis à jour {0}", "updated": "Mis à jour {0}",
@ -561,7 +561,7 @@
"text2": "Ceci supprimera également toutes les pièces jointes, les rappels et les relations associés à cette tâche et ne pourra pas être annulé !" "text2": "Ceci supprimera également toutes les pièces jointes, les rappels et les relations associés à cette tâche et ne pourra pas être annulé !"
}, },
"actions": { "actions": {
"assign": "Assign to a user", "assign": "Attribuer à un utilisateur",
"label": "Ajouter des étiquettes", "label": "Ajouter des étiquettes",
"priority": "Définir la priorité", "priority": "Définir la priorité",
"dueDate": "Définir léchéance", "dueDate": "Définir léchéance",
@ -726,8 +726,8 @@
"dateCurrentYear": "utilisera lannée en cours", "dateCurrentYear": "utilisera lannée en cours",
"dateNth": "utilisera le {day}e du mois en cours", "dateNth": "utilisera le {day}e du mois en cours",
"dateTime": "Combinez nimporte lequel des formats de date avec « {time} » (ou {timePM}) pour définir une heure.", "dateTime": "Combinez nimporte lequel des formats de date avec « {time} » (ou {timePM}) pour définir une heure.",
"repeats": "Repeating tasks", "repeats": "Tâches répétitives",
"repeatsDescription": "To set a task as repeating in an interval, simply add '{suffix}' to the task text. The amount needs to be a number and can be omitted to use just the type (see examples)." "repeatsDescription": "Pour définir une tâche comme répétitive dans un intervalle, il suffit d'ajouter « {suffix} » au texte de la tâche. Le montant doit être un nombre et peut être omis pour utiliser uniquement le type (voir exemples)."
} }
}, },
"team": { "team": {
@ -781,8 +781,8 @@
"then": "puis", "then": "puis",
"task": { "task": {
"title": "Page de tâche", "title": "Page de tâche",
"done": "Marquer une tâche comme terminée", "done": "Done",
"assign": "Assign to a user", "assign": "Attribuer à un utilisateur",
"labels": "Ajouter des étiquettes à cette tâche", "labels": "Ajouter des étiquettes à cette tâche",
"dueDate": "Modifier la date déchéance de cette tâche", "dueDate": "Modifier la date déchéance de cette tâche",
"attachment": "Ajouter une pièce jointe à cette tâche", "attachment": "Ajouter une pièce jointe à cette tâche",
@ -899,7 +899,7 @@
"4015": "Le commentaire de la tâche nexiste pas.", "4015": "Le commentaire de la tâche nexiste pas.",
"4016": "Champ de tâche invalide.", "4016": "Champ de tâche invalide.",
"4017": "Comparateur de filtre de tâche invalide.", "4017": "Comparateur de filtre de tâche invalide.",
"4018": "Concaténateur de filtre de tâche invalide.", "4018": "Invalid task filter concatenator.",
"4019": "Valeur de filtre de tâche invalide.", "4019": "Valeur de filtre de tâche invalide.",
"5001": "Lespace de noms nexiste pas.", "5001": "Lespace de noms nexiste pas.",
"5003": "Tu nas pas accès à lespace de noms indiqué.", "5003": "Tu nas pas accès à lespace de noms indiqué.",
@ -908,7 +908,7 @@
"5010": "Cette équipe na pas accès à cet espace de noms.", "5010": "Cette équipe na pas accès à cet espace de noms.",
"5011": "Cet·e utilisateur·rice a déjà accès à cet espace de noms.", "5011": "Cet·e utilisateur·rice a déjà accès à cet espace de noms.",
"5012": "Lespace de noms est archivé et ne peut donc être consulté quen lecture seule.", "5012": "Lespace de noms est archivé et ne peut donc être consulté quen lecture seule.",
"6001": "The team name cannot be empty.", "6001": "Le nom de l'équipe ne peut pas être vide.",
"6002": "Léquipe nexiste pas.", "6002": "Léquipe nexiste pas.",
"6004": "Léquipe a déjà accès à cet espace de noms ou à cette liste.", "6004": "Léquipe a déjà accès à cet espace de noms ou à cette liste.",
"6005": "Lutilisateur·rice est déjà membre de cette équipe.", "6005": "Lutilisateur·rice est déjà membre de cette équipe.",

View File

@ -7,7 +7,7 @@
"lastViewed": "Ultima visualizzazione", "lastViewed": "Ultima visualizzazione",
"list": { "list": {
"newText": "È possibile creare una nuova lista per le nuove attività:", "newText": "È possibile creare una nuova lista per le nuove attività:",
"new": "New list", "new": "Nuova lista",
"importText": "O importare le liste e le attività da altri servizi in Vikunja:", "importText": "O importare le liste e le attività da altri servizi in Vikunja:",
"import": "Importa i tuoi dati in Vikunja" "import": "Importa i tuoi dati in Vikunja"
} }
@ -17,14 +17,14 @@
"text": "La pagina richiesta non esiste." "text": "La pagina richiesta non esiste."
}, },
"ready": { "ready": {
"loading": "Vikunja is loading…", "loading": "Vikunja sta caricando…",
"errorOccured": "An error occured:", "errorOccured": "Si è verificato un errore:",
"checkApiUrl": "Please check if the api url is correct.", "checkApiUrl": "Controlla se l'URL API è corretto.",
"noApiUrlConfigured": "No API url was configured. Please set one below:" "noApiUrlConfigured": "Nessun URL API configurato. Impostane uno qui sotto:"
}, },
"offline": { "offline": {
"title": "You are offline.", "title": "Sei offline.",
"text": "Please check your network connection and try again." "text": "Controlla la connessione di rete e riprova."
}, },
"user": { "user": {
"auth": { "auth": {
@ -36,7 +36,7 @@
"password": "Password", "password": "Password",
"passwordRepeat": "Digita di nuovo la tua password", "passwordRepeat": "Digita di nuovo la tua password",
"passwordPlaceholder": "es. ••••••••••••", "passwordPlaceholder": "es. ••••••••••••",
"forgotPassword": "Forgot your password?", "forgotPassword": "Password dimenticata?",
"resetPassword": "Reimposta la tua password", "resetPassword": "Reimposta la tua password",
"resetPasswordAction": "Inviami il link per reimpostare la password", "resetPasswordAction": "Inviami il link per reimpostare la password",
"resetPasswordSuccess": "Controlla la tua casella di posta! Dovresti avere un'e-mail con le istruzioni su come reimpostare la password.", "resetPasswordSuccess": "Controlla la tua casella di posta! Dovresti avere un'e-mail con le istruzioni su come reimpostare la password.",
@ -48,7 +48,7 @@
"register": "Registrati", "register": "Registrati",
"loginWith": "Accedi con {provider}", "loginWith": "Accedi con {provider}",
"authenticating": "Autenticazione…", "authenticating": "Autenticazione…",
"openIdStateError": "State does not match, refusing to continue!", "openIdStateError": "Stato non corrispondente, impossibile continuare!",
"openIdGeneralError": "Si è verificato un errore durante l'autenticazione con terze parti.", "openIdGeneralError": "Si è verificato un errore durante l'autenticazione con terze parti.",
"logout": "Esci" "logout": "Esci"
}, },
@ -103,31 +103,31 @@
"title": "Avatar", "title": "Avatar",
"initials": "Iniziali", "initials": "Iniziali",
"gravatar": "Gravatar", "gravatar": "Gravatar",
"marble": "Marble", "marble": "Marmo",
"upload": "Carica", "upload": "Carica",
"uploadAvatar": "Carica Avatar", "uploadAvatar": "Carica Avatar",
"statusUpdateSuccess": "Avatar status was updated successfully!", "statusUpdateSuccess": "Avatar aggiornato!",
"setSuccess": "L'avatar è stato impostato con successo!" "setSuccess": "L'avatar è stato impostato con successo!"
}, },
"quickAddMagic": { "quickAddMagic": {
"title": "Quick Add Magic Mode", "title": "Modalità Aggiunta Rapida Magica",
"disabled": "Disabilitato", "disabled": "Disabilitato",
"todoist": "Todoist", "todoist": "Todoist",
"vikunja": "Vikunja" "vikunja": "Vikunja"
}, },
"appearance": { "appearance": {
"title": "Color Scheme", "title": "Tema",
"setSuccess": "Saved change of color scheme to {colorScheme}", "setSuccess": "Tema cambiato in {colorScheme}",
"colorScheme": { "colorScheme": {
"light": "Light", "light": "Chiaro",
"system": "System", "system": "Sistema",
"dark": "Dark" "dark": "Scuro"
} }
} }
}, },
"deletion": { "deletion": {
"title": "Delete your Vikunja Account", "title": "Elimina il tuo Account Vikunja",
"text1": "The deletion of your account is permanent and cannot be undone. We will delete all your namespaces, lists, tasks and everything associated with it.", "text1": "La cancellazione del tuo account è permanente e non può essere annullata. Elimineremo tutti i tuoi namespace, liste, attività e tutto ciò che è ad esso associato.",
"text2": "Per continuare, inserisci la tua password. Riceverai un'e-mail con ulteriori istruzioni.", "text2": "Per continuare, inserisci la tua password. Riceverai un'e-mail con ulteriori istruzioni.",
"confirm": "Elimina il mio profilo", "confirm": "Elimina il mio profilo",
"requestSuccess": "Richiesta riuscita. Riceverai un'e-mail con ulteriori istruzioni.", "requestSuccess": "Richiesta riuscita. Riceverai un'e-mail con ulteriori istruzioni.",
@ -141,7 +141,7 @@
}, },
"export": { "export": {
"title": "Esporta i tuoi dati Vikunja", "title": "Esporta i tuoi dati Vikunja",
"description": "You can request a copy of all your Vikunja data. This include Namespaces, Lists, Tasks and everything associated to them. You can import this data in any Vikunja instance through the migration function.", "description": "Puoi richiedere una copia di tutti i tuoi dati all'interno di Vikunja. Questo include i Namespace, le Liste, le Attività e tutto ciò che è loro associato. È possibile importare questi dati in qualsiasi istanza Vikunja attraverso la funzione di migrazione.",
"descriptionPasswordRequired": "Inserisci la tua password per procedere:", "descriptionPasswordRequired": "Inserisci la tua password per procedere:",
"request": "Richiedi una copia dei miei dati Vikunja", "request": "Richiedi una copia dei miei dati Vikunja",
"success": "Hai richiesto con successo i tuoi dati Vikunja! Ti invieremo un'e-mail una volta che saranno pronti da scaricare.", "success": "Hai richiesto con successo i tuoi dati Vikunja! Ti invieremo un'e-mail una volta che saranno pronti da scaricare.",
@ -157,7 +157,7 @@
"searchSelect": "Fare clic o premere invio per selezionare questa lista", "searchSelect": "Fare clic o premere invio per selezionare questa lista",
"shared": "Liste Condivise", "shared": "Liste Condivise",
"create": { "create": {
"header": "New list", "header": "Nuova lista",
"titlePlaceholder": "Il titolo della lista va qui…", "titlePlaceholder": "Il titolo della lista va qui…",
"addTitleRequired": "Specifica un titolo.", "addTitleRequired": "Specifica un titolo.",
"createdSuccess": "La lista è stata creata correttamente.", "createdSuccess": "La lista è stata creata correttamente.",
@ -191,7 +191,7 @@
"duplicate": { "duplicate": {
"title": "Duplica questa lista", "title": "Duplica questa lista",
"label": "Duplica", "label": "Duplica",
"text": "Select a namespace which should hold the duplicated list:", "text": "Seleziona un namespace che dovrebbe contenere l'elenco duplicato:",
"success": "Lista duplicata." "success": "Lista duplicata."
}, },
"edit": { "edit": {
@ -279,23 +279,23 @@
"title": "Kanban", "title": "Kanban",
"limit": "Limite: {limit}", "limit": "Limite: {limit}",
"noLimit": "Non Impostato", "noLimit": "Non Impostato",
"doneBucket": "Done bucket", "doneBucket": "Colonna attività completate",
"doneBucketHint": "All tasks moved into this bucket will automatically marked as done.", "doneBucketHint": "Tutte le attività spostate in questa colonna verranno automaticamente contrassegnate come completate.",
"doneBucketHintExtended": "All tasks moved into the done bucket will be marked as done automatically. All tasks marked as done from elsewhere will be moved as well.", "doneBucketHintExtended": "Tutte le attività spostate nella colonna attività completate saranno contrassegnate automaticamente come completate. Tutte le attività contrassegnate come completate altrove verranno anche spostate.",
"doneBucketSavedSuccess": "The done bucket has been saved successfully.", "doneBucketSavedSuccess": "Colonna attività completate salvata.",
"deleteLast": "You cannot remove the last bucket.", "deleteLast": "Impossibile eliminare l'ultima colonna.",
"addTaskPlaceholder": "Enter the new task title…", "addTaskPlaceholder": "Inserisci il nuovo titolo dell'attività…",
"addTask": "Aggiungi un'attività", "addTask": "Aggiungi un'attività",
"addAnotherTask": "Aggiungi un'altra attività", "addAnotherTask": "Aggiungi un'altra attività",
"addBucket": "Create a new bucket", "addBucket": "Crea una nuova colonna",
"addBucketPlaceholder": "Enter the new bucket title…", "addBucketPlaceholder": "Inserisci il titolo della nuova colonna…",
"deleteHeaderBucket": "Delete the bucket", "deleteHeaderBucket": "Elimina la colonna",
"deleteBucketText1": "Are you sure you want to delete this bucket?", "deleteBucketText1": "Confermi di voler eliminare questa colonna?",
"deleteBucketText2": "This will not delete any tasks but move them into the default bucket.", "deleteBucketText2": "Questo non eliminerà nessuna attività, ma la sposterà nel bucket predefinito.",
"deleteBucketSuccess": "The bucket has been deleted successfully.", "deleteBucketSuccess": "Colonna eliminata.",
"bucketTitleSavedSuccess": "The bucket title has been saved successfully.", "bucketTitleSavedSuccess": "Titolo della colonna salvato.",
"bucketLimitSavedSuccess": "The bucket limit been saved successfully.", "bucketLimitSavedSuccess": "Limite della colonna salvato.",
"collapse": "Collapse this bucket" "collapse": "Comprimi questa colonna"
}, },
"pseudo": { "pseudo": {
"favorites": { "favorites": {
@ -304,52 +304,52 @@
} }
}, },
"namespace": { "namespace": {
"title": "Namespaces & Lists", "title": "Namespace e Liste",
"namespace": "Namespace", "namespace": "Namespace",
"showArchived": "Show Archived", "showArchived": "Mostra Archiviati",
"noneAvailable": "You don't have any namespaces right now.", "noneAvailable": "Non hai alcun namespace in questo momento.",
"unarchive": "Un-Archive", "unarchive": "De-Archivia",
"archived": "Archived", "archived": "Archiviato",
"noLists": "This namespace does not contain any lists.", "noLists": "Questo namespace non contiene alcuna lista.",
"createList": "Create a new list in this namespace.", "createList": "Crea una nuova lista in questo namespace.",
"namespaces": "Namespaces", "namespaces": "Namespace",
"search": "Type to search for a namespace…", "search": "Digita per cercare un namespace…",
"create": { "create": {
"title": "New namespace", "title": "Nuovo namespace",
"titleRequired": "Please specify a title.", "titleRequired": "Specifica un titolo.",
"explanation": "A namespace is a collection of lists you can share and use to organize your lists with. In fact, every list belongs to a namepace.", "explanation": "Un namespace è una raccolta di liste che puoi condividere e che puoi usare per organizzare le tue liste. Infatti, ogni lista appartiene a un namespace.",
"tooltip": "What's a namespace?", "tooltip": "Che cos'è un namespace?",
"success": "The namespace was successfully created." "success": "Namespace creato."
}, },
"archive": { "archive": {
"titleArchive": "Archivia \"{namespace}\"", "titleArchive": "Archivia \"{namespace}\"",
"titleUnarchive": "Un-Archive \"{namespace}\"", "titleUnarchive": "Disarchivia \"{namespace}\"",
"archiveText": "You won't be able to edit this namespace or create new lists until you un-archive it. This will also archive all lists in this namespace.", "archiveText": "Non sarà possibile modificare questo namespace o creare nuove liste fino a quando non verrà disarchiviato. Questo archivierà anche tutte le liste in questo namespace.",
"unarchiveText": "You will be able to create new lists or edit it.", "unarchiveText": "Potrai creare nuove liste o modificarle.",
"success": "The namespace was successfully archived.", "success": "Namespace creato.",
"description": "If a namespace is archived, you cannot create new lists or edit it." "description": "Se un namespace è archiviato, non è possibile creare nuove liste o modificarlo."
}, },
"delete": { "delete": {
"title": "Delete \"{namespace}\"", "title": "Elimina \"{namespace}\"",
"text1": "Are you sure you want to delete this namespace and all of its contents?", "text1": "Sei sicuro di voler rimuovere questo namespace e tutto il relativo contenuto?",
"text2": "Questo include tutte le liste e le attività e NON PUÒ ESSERE RIPRISTINATO!", "text2": "Questo include tutte le liste e le attività e NON PUÒ ESSERE RIPRISTINATO!",
"success": "The namespace was successfully deleted." "success": "Namespace eliminato."
}, },
"edit": { "edit": {
"title": "Modifica \"{namespace}\"", "title": "Modifica \"{namespace}\"",
"success": "The namespace was successfully updated." "success": "Namespace aggiornato."
}, },
"share": { "share": {
"title": "Condividi \"{namespace}\"" "title": "Condividi \"{namespace}\""
}, },
"attributes": { "attributes": {
"title": "Namespace Title", "title": "Titolo del Namespace",
"titlePlaceholder": "The namespace title goes here…", "titlePlaceholder": "Il titolo del namespace va qui…",
"description": "Descrizione", "description": "Descrizione",
"descriptionPlaceholder": "The namespaces description goes here…", "descriptionPlaceholder": "La descrizione del namespace va qui…",
"color": "Colore", "color": "Colore",
"archived": "Is Archived", "archived": "Archiviato",
"isArchived": "This namespace is archived" "isArchived": "Questo namespace è archiviato"
}, },
"pseudo": { "pseudo": {
"sharedLists": { "sharedLists": {
@ -365,7 +365,7 @@
}, },
"filters": { "filters": {
"title": "Filtri", "title": "Filtri",
"clear": "Clear Filters", "clear": "Pulisci Filtri",
"attributes": { "attributes": {
"title": "Titolo", "title": "Titolo",
"titlePlaceholder": "Il titolo del filtro salvato va qui…", "titlePlaceholder": "Il titolo del filtro salvato va qui…",
@ -374,17 +374,17 @@
"includeNulls": "Includi attività che non hanno un valore impostato", "includeNulls": "Includi attività che non hanno un valore impostato",
"requireAll": "Tutti i filtri devono essere veri affinché l'attività venga mostrata", "requireAll": "Tutti i filtri devono essere veri affinché l'attività venga mostrata",
"showDoneTasks": "Mostra Attività Fatte", "showDoneTasks": "Mostra Attività Fatte",
"sortAlphabetically": "Sort Alphabetically", "sortAlphabetically": "Ordine alfabetico",
"enablePriority": "Abilita Filtro Per Priorità", "enablePriority": "Abilita Filtro Per Priorità",
"enablePercentDone": "Abilitare Filtro Per Percentuale Fatta", "enablePercentDone": "Abilitare Filtro Per Percentuale Fatta",
"dueDateRange": "Intervallo Data Di Scadenza", "dueDateRange": "Intervallo Data Di Scadenza",
"startDateRange": "Intervallo Data Iniziale", "startDateRange": "Intervallo Data Iniziale",
"endDateRange": "Intervallo Data Finale", "endDateRange": "Intervallo Data Finale",
"reminderRange": "Reminder Date Range" "reminderRange": "Intervallo date dei promemoria"
}, },
"create": { "create": {
"title": "New Saved Filter", "title": "Nuovo Filtro Salvato",
"description": "A saved filter is a virtual list which is computed from a set of filters each time it is accessed. Once created, it will appear in a special namespace.", "description": "Un filtro salvato è una lista virtuale che viene calcolata da un insieme di filtri di volta in volta. Una volta creato, apparirà in un namespace speciale.",
"action": "Crea nuovo filtro salvato" "action": "Crea nuovo filtro salvato"
}, },
"delete": { "delete": {
@ -446,9 +446,9 @@
}, },
"navigation": { "navigation": {
"overview": "Panoramica", "overview": "Panoramica",
"upcoming": "Upcoming", "upcoming": "Prossimamente",
"settings": "Impostazioni", "settings": "Impostazioni",
"imprint": "Imprint", "imprint": "Informazioni legali",
"privacy": "Politica sulla Privacy" "privacy": "Politica sulla Privacy"
}, },
"misc": { "misc": {
@ -464,19 +464,19 @@
"searchPlaceholder": "Digita per cercare…", "searchPlaceholder": "Digita per cercare…",
"previous": "Precedente", "previous": "Precedente",
"next": "Successivo", "next": "Successivo",
"poweredBy": "Powered by Vikunja", "poweredBy": "Creato con Vikunja",
"info": "Info", "info": "Info",
"create": "Create", "create": "Crea",
"doit": "Fallo!", "doit": "Fallo!",
"saving": "Salvataggio…", "saving": "Salvataggio…",
"saved": "Salvato!", "saved": "Salvato!",
"default": "Predefinito", "default": "Predefinito",
"close": "Chiudi", "close": "Chiudi",
"download": "Scarica", "download": "Scarica",
"showMenu": "Show the menu", "showMenu": "Mostra il menu",
"hideMenu": "Hide the menu", "hideMenu": "Nascondi il menù",
"forExample": "For example:", "forExample": "Ad esempio:",
"welcomeBack": "Welcome Back!" "welcomeBack": "Bentornato!"
}, },
"input": { "input": {
"resetColor": "Ripristina Colore", "resetColor": "Ripristina Colore",
@ -485,9 +485,9 @@
"tomorrow": "Domani", "tomorrow": "Domani",
"nextMonday": "Lunedì Prossimo", "nextMonday": "Lunedì Prossimo",
"thisWeekend": "Questo fine settimana", "thisWeekend": "Questo fine settimana",
"laterThisWeek": "Later This Week", "laterThisWeek": "Alla fine di questa settimana",
"nextWeek": "Prossima Settimana", "nextWeek": "Prossima Settimana",
"chooseDate": "Choose a date" "chooseDate": "Seleziona una data"
}, },
"editor": { "editor": {
"edit": "Modifica", "edit": "Modifica",
@ -504,16 +504,16 @@
"quote": "Citazione", "quote": "Citazione",
"unorderedList": "Elenco puntato", "unorderedList": "Elenco puntato",
"orderedList": "Elenco numerato", "orderedList": "Elenco numerato",
"cleanBlock": "Clean Block", "cleanBlock": "Pulisci Blocco",
"link": "Link", "link": "Link",
"image": "Immagine", "image": "Immagine",
"table": "Tabella", "table": "Tabella",
"horizontalRule": "Horizontal Rule", "horizontalRule": "Divisore Orizzontale",
"sideBySide": "Side By Side", "sideBySide": "Affianca",
"guide": "Guide" "guide": "Guida"
}, },
"multiselect": { "multiselect": {
"createPlaceholder": "Create new", "createPlaceholder": "Crea nuovo",
"selectPlaceholder": "Clicca o premere invio per selezionare" "selectPlaceholder": "Clicca o premere invio per selezionare"
} }
}, },
@ -533,19 +533,19 @@
"titleDates": "Attività dal {from} al {to}", "titleDates": "Attività dal {from} al {to}",
"noDates": "Mostra attività senza date", "noDates": "Mostra attività senza date",
"current": "Attività attuali", "current": "Attività attuali",
"from": "Tasks from", "from": "Attività dal",
"until": "until", "until": "fino al",
"today": "Oggi", "today": "Oggi",
"nextWeek": "Settimana Prossima", "nextWeek": "Settimana Prossima",
"nextMonth": "Prossimo Mese", "nextMonth": "Prossimo Mese",
"noTasks": "Nothing to do — Have a nice day!" "noTasks": "Nessuna attività — Buona giornata!"
}, },
"detail": { "detail": {
"chooseDueDate": "Clicca qui per impostare una data di scadenza", "chooseDueDate": "Clicca qui per impostare una data di scadenza",
"chooseStartDate": "Clicca qui per impostare una data di inizio", "chooseStartDate": "Clicca qui per impostare una data di inizio",
"chooseEndDate": "Clicca qui per impostare una data di fine", "chooseEndDate": "Clicca qui per impostare una data di fine",
"move": "Sposta attività in un'altra lista", "move": "Sposta attività in un'altra lista",
"done": "Fatto!", "done": "Segna attività fatta!",
"undone": "Segna come non completato", "undone": "Segna come non completato",
"created": "Creato {0} da {1}", "created": "Creato {0} da {1}",
"updated": "Aggiornato {0}", "updated": "Aggiornato {0}",
@ -554,21 +554,21 @@
"deleteSuccess": "L'attività è stata eliminata con successo.", "deleteSuccess": "L'attività è stata eliminata con successo.",
"belongsToList": "Questa attività appartiene alla lista '{list}'", "belongsToList": "Questa attività appartiene alla lista '{list}'",
"due": "Scadenza {at}", "due": "Scadenza {at}",
"closePopup": "Close popup", "closePopup": "Chiudi popup",
"delete": { "delete": {
"header": "Elimina questa attività", "header": "Elimina questa attività",
"text1": "Sei sicuro di voler eliminare questa attività?", "text1": "Sei sicuro di voler eliminare questa attività?",
"text2": "Questo rimuoverà anche tutti gli allegati, i promemoria e le relazioni associati a questa attività e non può essere ripristinato!" "text2": "Questo rimuoverà anche tutti gli allegati, i promemoria e le relazioni associati a questa attività e non può essere ripristinato!"
}, },
"actions": { "actions": {
"assign": "Assign to a user", "assign": "Assegna ad un utente",
"label": "Aggiungi etichette", "label": "Aggiungi etichette",
"priority": "Imposta Priorità", "priority": "Imposta Priorità",
"dueDate": "Imposta data di scadenza", "dueDate": "Imposta data di scadenza",
"startDate": "Imposta una data di inizio", "startDate": "Imposta una data di inizio",
"endDate": "Imposta una data di fine", "endDate": "Imposta una data di fine",
"reminders": "Imposta promemoria", "reminders": "Imposta promemoria",
"repeatAfter": "Set a repeating interval", "repeatAfter": "Imposta ricorrenza",
"percentDone": "Imposta Percentuale Completata", "percentDone": "Imposta Percentuale Completata",
"attachments": "Aggiungi allegati", "attachments": "Aggiungi allegati",
"relatedTasks": "Aggiungi attività collegate", "relatedTasks": "Aggiungi attività collegate",
@ -599,13 +599,13 @@
"updated": "Aggiornato" "updated": "Aggiornato"
}, },
"subscription": { "subscription": {
"subscribedThroughParent": "You can't unsubscribe here because you are subscribed to this {entity} through its {parent}.", "subscribedThroughParent": "Non puoi annullare l'iscrizione qui perché sei iscritto a questo {entity} attraverso il suo {parent}.",
"subscribed": "You are currently subscribed to this {entity} and will receive notifications for changes.", "subscribed": "Sei attualmente iscritto a questo {entity} e riceverai notifiche per le modifiche.",
"notSubscribed": "You are not subscribed to this {entity} and won't receive notifications for changes.", "notSubscribed": "Non sei iscritto a questo {entity} e non riceverai notifiche per le modifiche.",
"subscribe": "Subscribe", "subscribe": "Iscriviti",
"unsubscribe": "Unsubscribe", "unsubscribe": "Disiscriviti",
"subscribeSuccess": "You are now subscribed to this {entity}", "subscribeSuccess": "Ti sei iscritto a questo {entity}",
"unsubscribeSuccess": "You are now unsubscribed to this {entity}" "unsubscribeSuccess": "Ti sei disiscritto a questo {entity}"
}, },
"attachment": { "attachment": {
"title": "Allegati", "title": "Allegati",
@ -623,41 +623,41 @@
"comment": { "comment": {
"title": "Commenti", "title": "Commenti",
"loading": "Caricamento commenti…", "loading": "Caricamento commenti…",
"edited": "edited {date}", "edited": "modificato il {date}",
"creating": "Creazione del commento…", "creating": "Creazione del commento…",
"placeholder": "Aggiungi un commento…", "placeholder": "Aggiungi un commento…",
"comment": "Comment", "comment": "Commenta",
"delete": "Elimina questo commento", "delete": "Elimina questo commento",
"deleteText1": "Sei sicuro di voler eliminare questo commento?", "deleteText1": "Sei sicuro di voler eliminare questo commento?",
"deleteText2": "Questa azione non può essere annullata!", "deleteText2": "Questa azione non può essere annullata!",
"addedSuccess": "Il commento è stato aggiunto correttamente." "addedSuccess": "Il commento è stato aggiunto correttamente."
}, },
"deferDueDate": { "deferDueDate": {
"title": "Defer due date", "title": "Rinvia data di scadenza",
"1day": "1 giorno", "1day": "1 giorno",
"3days": "3 giorni", "3days": "3 giorni",
"1week": "1 settimana" "1week": "1 settimana"
}, },
"description": { "description": {
"placeholder": "Click here to enter a description…", "placeholder": "Clicca qui per inserire una descrizione…",
"empty": "No description available yet." "empty": "Nessuna descrizione."
}, },
"assignee": { "assignee": {
"placeholder": "Type to assign a user…", "placeholder": "Digita per assegnare un utente…",
"selectPlaceholder": "Assegna questo utente", "selectPlaceholder": "Assegna questo utente",
"assignSuccess": "The user has been assigned successfully.", "assignSuccess": "Utente assegnato.",
"unassignSuccess": "The user has been unassigned successfully." "unassignSuccess": "Utente disassegnato."
}, },
"label": { "label": {
"placeholder": "Type to add a new label…", "placeholder": "Digita per aggiungere una nuova etichetta…",
"createPlaceholder": "Add this as new label", "createPlaceholder": "Aggiungila come nuova etichetta",
"addSuccess": "Etichetta aggiunta.", "addSuccess": "Etichetta aggiunta.",
"createSuccess": "Etichetta creata.", "createSuccess": "Etichetta creata.",
"removeSuccess": "Etichetta eliminata.", "removeSuccess": "Etichetta eliminata.",
"addCreateSuccess": "Etichetta creata e aggiunta." "addCreateSuccess": "Etichetta creata e aggiunta."
}, },
"priority": { "priority": {
"unset": "Unset", "unset": "Azzera",
"low": "Bassa", "low": "Bassa",
"medium": "Media", "medium": "Media",
"high": "Alta", "high": "Alta",
@ -665,38 +665,38 @@
"doNow": "FARE ORA" "doNow": "FARE ORA"
}, },
"relation": { "relation": {
"add": "Add a New Task Relation", "add": "Aggiungi Attività Collegata",
"new": "New Task Relation", "new": "Nuova Attività Collegata",
"searchPlaceholder": "Type search for a new task to add as related…", "searchPlaceholder": "Digita per cercare un'attività da aggiungere come collegata…",
"createPlaceholder": "Add this as new related task", "createPlaceholder": "Aggiungi come attività collegata",
"differentList": "This task belongs to a different list.", "differentList": "Questa attività è di una lista diversa.",
"differentNamespace": "This task belongs to a different namespace.", "differentNamespace": "Questa attività appartiene ad un namespace diverso.",
"noneYet": "No task relations yet.", "noneYet": "Nessuna attività collegata.",
"delete": "Delete Task Relation", "delete": "Elimina Collegamento Attività",
"deleteText1": "Are you sure you want to delete this task relation?", "deleteText1": "Confermi di voler eliminare questo collegamento attività?",
"deleteText2": "Questa azione non può essere annullata!", "deleteText2": "Questa azione non può essere annullata!",
"select": "Select a relation kind", "select": "Seleziona un tipo di collegamento",
"kinds": { "kinds": {
"subtask": "Subtask | Subtasks", "subtask": "Sotto-attività | Sotto-attività",
"parenttask": "Parent Task | Parent Tasks", "parenttask": "Attività Principale | Attività Principale",
"related": "Related Task | Related Tasks", "related": "Attività Correlata | Attività Correlata",
"duplicateof": "Duplicato Di | Duplicati Di", "duplicateof": "Duplicato Di | Duplicati Di",
"duplicates": "Duplicates | Duplicates", "duplicates": "Duplicato | Duplicati",
"blocking": "Blocking | Blocking", "blocking": "Bloccante | Bloccanti",
"blocked": "Blocked By | Blocked By", "blocked": "Bloccato Da | Bloccati Da",
"precedes": "Precedes | Precedes", "precedes": "Precede | Precede",
"follows": "Follows | Follows", "follows": "Segue | Segue",
"copiedfrom": "Copied From | Copied From", "copiedfrom": "Copiata Da | Copiate Da",
"copiedto": "Copied To | Copied To" "copiedto": "Copiata In | Copiate In"
} }
}, },
"repeat": { "repeat": {
"everyDay": "Ogni Giorno", "everyDay": "Ogni Giorno",
"everyWeek": "Ogni Settimana", "everyWeek": "Ogni Settimana",
"everyMonth": "Ogni Mese", "everyMonth": "Ogni Mese",
"mode": "Repeat mode", "mode": "Modalità Ripetizione",
"monthly": "Mensilmente", "monthly": "Mensilmente",
"fromCurrentDate": "From Current Date", "fromCurrentDate": "Dalla Data Attuale",
"each": "Ogni", "each": "Ogni",
"specifyAmount": "Specifica una quantità…", "specifyAmount": "Specifica una quantità…",
"hours": "Ore", "hours": "Ore",
@ -706,32 +706,32 @@
"years": "Anni" "years": "Anni"
}, },
"quickAddMagic": { "quickAddMagic": {
"hint": "You can use Quick Add Magic", "hint": "Puoi usare l'Aggiunta Rapida Magica",
"what": "Cosa?", "what": "Cosa?",
"title": "Quick Add Magic", "title": "Aggiunta Rapida Magica",
"intro": "When creating a task, you can use special keywords to directly add attributes to the newly created task. This allows to add commonly used attributes to tasks much faster.", "intro": "Quando si crea un'attività, è possibile utilizzare parole chiave speciali per aggiungere direttamente attributi all'attività appena creata. Questo permette di aggiungere gli attributi comuni molto più velocemente.",
"multiple": "Puoi usarlo più volte.", "multiple": "Puoi usarlo più volte.",
"label1": "To add a label, simply prefix the name of the label with {prefix}.", "label1": "Per aggiungere un'etichetta, basta aggiungere il nome dell'etichetta preceduto da {prefix}.",
"label2": "Vikunja will first check if the label already exist and create it if not.", "label2": "Vikunja controllerà prima se l'etichetta esiste già e nel caso la creerà.",
"label3": "To use spaces, simply add a \" around the label name.", "label3": "Per usare gli spazi, basta \" prima e dopo del nome dell'etichetta.",
"label4": "For example: {prefix}\"Label with spaces\".", "label4": "Per esempio: {prefix}\"Etichetta con spazi\".",
"priority1": "To set a task's priority, add a number 1-5, prefixed with a {prefix}.", "priority1": "Per impostare la priorità di un'attività, aggiungi un numero 1-5, preceduto da {prefix}.",
"priority2": "The higher the number, the higher the priority.", "priority2": "Più alto è il numero, più alta è la priorità.",
"assignees": "To directly assign the task to a user, add their username prefixed with {prefix} to the task.", "assignees": "Per assegnare direttamente l'attività a un utente, aggiungere il suo nome utente preceduto da {prefix} all'attività.",
"list1": "To set a list for the task to appear in, enter its name prefixed with {prefix}.", "list1": "Per impostare una lista di appartenenza all'attività, inserisci il suo nome prefisso con {prefix}.",
"list2": "This will return an error if the list does not exist.", "list2": "Ciò restituirà un errore se la lista non esiste.",
"dateAndTime": "Data e ora", "dateAndTime": "Data e ora",
"date": "Any date will be used as the due date of the new task. You can use dates in any of these formats:", "date": "Qualsiasi data verrà utilizzata come data di scadenza della nuova attività. È possibile utilizzare le date in uno qualsiasi di questi formati:",
"dateWeekday": "any weekday, will use the next date with that date", "dateWeekday": "qualsiasi giorno della settimana, userà la data più vicina",
"dateCurrentYear": "will use the current year", "dateCurrentYear": "userà lanno corrente",
"dateNth": "will use the {day}th of the current month", "dateNth": "userà il {day} del mese corrente",
"dateTime": "Combine any of the date formats with \"{time}\" (or {timePM}) to set a time.", "dateTime": "Combina uno qualsiasi dei formati di data con \"{time}\" (o {timePM}) per impostare un orario.",
"repeats": "Repeating tasks", "repeats": "Attività ricorrenti",
"repeatsDescription": "To set a task as repeating in an interval, simply add '{suffix}' to the task text. The amount needs to be a number and can be omitted to use just the type (see examples)." "repeatsDescription": "Per impostare un'attività come ricorrente in un intervallo, basta aggiungere '{suffix}' al testo dell'attività. La quantità deve essere un numero e può essere omesso per usare solo il tipo (vedi esempi)."
} }
}, },
"team": { "team": {
"title": "Teams", "title": "Gruppi",
"noTeams": "Non fai parte di nessun gruppo.", "noTeams": "Non fai parte di nessun gruppo.",
"create": { "create": {
"title": "Crea un nuovo gruppo", "title": "Crea un nuovo gruppo",
@ -746,23 +746,23 @@
"makeAdmin": "Rendi Amministratore", "makeAdmin": "Rendi Amministratore",
"success": "Gruppo aggiornato.", "success": "Gruppo aggiornato.",
"userAddedSuccess": "Membro del gruppo aggiunto.", "userAddedSuccess": "Membro del gruppo aggiunto.",
"madeMember": "The team member was successfully made member.", "madeMember": "Membro del gruppo reso membro.",
"madeAdmin": "The team member was successfully made admin.", "madeAdmin": "Membro del gruppo reso amministratore.",
"delete": { "delete": {
"header": "Elimina il gruppo", "header": "Elimina il gruppo",
"text1": "Sei sicuro di voler eliminare questo gruppo e tutti i suoi membri?", "text1": "Sei sicuro di voler eliminare questo gruppo e tutti i suoi membri?",
"text2": "All team members will lose access to lists and namespaces shared with this team. This CANNOT BE UNDONE!", "text2": "Tutti i membri del gruppo perderanno l'accesso alle liste e ai namespace condivisi con questo gruppo. NON PUÒ ESSERE RIPRISTINATO!",
"success": "Gruppo eliminato." "success": "Gruppo eliminato."
}, },
"deleteUser": { "deleteUser": {
"header": "Rimuovi un utente dal gruppo", "header": "Rimuovi un utente dal gruppo",
"text1": "Confermi di voler rimuovere questo utente dal gruppo?", "text1": "Confermi di voler rimuovere questo utente dal gruppo?",
"text2": "They will lose access to all lists and namespaces this team has access to. This CANNOT BE UNDONE!", "text2": "Perderanno l'accesso a tutte le liste e i namespace a cui questo gruppo ha accesso. NON PUÒ ESSERE RIPRISTINATO!",
"success": "Utente rimosso dal gruppo." "success": "Utente rimosso dal gruppo."
} }
}, },
"attributes": { "attributes": {
"name": "Team Name", "name": "Nome Gruppo",
"namePlaceholder": "Il nome del gruppo va qui…", "namePlaceholder": "Il nome del gruppo va qui…",
"nameRequired": "Specifica un nome.", "nameRequired": "Specifica un nome.",
"description": "Descrizione", "description": "Descrizione",
@ -772,32 +772,32 @@
} }
}, },
"keyboardShortcuts": { "keyboardShortcuts": {
"title": "Keyboard Shortcuts", "title": "Tasti Rapidi",
"general": "General", "general": "Generali",
"allPages": "Queste scorciatoie funzionano in tutte le pagine.", "allPages": "Queste scorciatoie funzionano in tutte le pagine.",
"currentPageOnly": "Queste scorciatoie funzionano solo nella pagina attuale.", "currentPageOnly": "Queste scorciatoie funzionano solo nella pagina attuale.",
"toggleMenu": "Attiva/Disattiva Menu", "toggleMenu": "Attiva/Disattiva Menu",
"quickSearch": "Apri la barra di ricerca/azione rapida", "quickSearch": "Apri la barra di ricerca/azione rapida",
"then": "then", "then": "e dopo",
"task": { "task": {
"title": "Task Page", "title": "Pagina Attività",
"done": "Mark a task as done", "done": "Fatto",
"assign": "Assign to a user", "assign": "Assegna a un utente",
"labels": "Add labels to this task", "labels": "Aggiungi etichette a questa attività",
"dueDate": "Change the due date of this task", "dueDate": "Modifica la data di scadenza di questa attività",
"attachment": "Add an attachment to this task", "attachment": "Aggiungi un allegato a questa attività",
"related": "Modify related tasks of this task" "related": "Modifica le attività collegate a questa"
}, },
"list": { "list": {
"title": "List Views", "title": "Viste Liste",
"switchToListView": "Switch to list view", "switchToListView": "Passa alla vista Lista",
"switchToGanttView": "Switch to gantt view", "switchToGanttView": "Passa alla vista Gantt",
"switchToKanbanView": "Switch to kanban view", "switchToKanbanView": "Passa alla vista Kanban",
"switchToTableView": "Switch to table view" "switchToTableView": "Passa alla vista Tabella"
} }
}, },
"update": { "update": {
"available": "There is an update for Vikunja available!", "available": "È disponibile un aggiornamento per Vikunja!",
"do": "Aggiorna Adesso" "do": "Aggiorna Adesso"
}, },
"menu": { "menu": {
@ -805,136 +805,136 @@
"archive": "Archivia", "archive": "Archivia",
"duplicate": "Duplica", "duplicate": "Duplica",
"delete": "Elimina", "delete": "Elimina",
"unarchive": "Un-Archive", "unarchive": "Disarchivia",
"setBackground": "Set background", "setBackground": "Imposta sfondo",
"share": "Condividi", "share": "Condividi",
"newList": "Nuova lista" "newList": "Nuova lista"
}, },
"apiConfig": { "apiConfig": {
"url": "URL Vikunja", "url": "URL Vikunja",
"urlPlaceholder": "es. http://localhost:8080", "urlPlaceholder": "es. http://localhost:8080",
"change": "change", "change": "modifica",
"use": "Using Vikunja installation at {0}", "use": "Usa l'installazione di Vikunja a {0}",
"error": "Could not find or use Vikunja installation at \"{domain}\". Please try a different url.", "error": "Impossibile trovare o usare l'installazione di Vikunja su \"{domain}\". Prova per favore con un altro Url.",
"success": "Using Vikunja installation at \"{domain}\".", "success": "Utilizzando l'installazione di Vikunja su \"{domain}\".",
"urlRequired": "A url is required." "urlRequired": "L'URL è obbligatorio."
}, },
"loadingError": { "loadingError": {
"failed": "Loading failed, please {0}. If the error persists, please {1}.", "failed": "Caricamento non riuscito, si prega di {0}. Se l'errore persiste, per favore {1}.",
"tryAgain": "try again", "tryAgain": "riprova",
"contact": "contact us" "contact": "Contattaci"
}, },
"notification": { "notification": {
"title": "Notifications", "title": "Notifiche",
"none": "You don't have any notifications. Have a nice day!", "none": "Nessuna notifica. Buona giornata!",
"explainer": "Notifications will appear here when actions on namespaces, lists or tasks you subscribed to happen." "explainer": "Le notifiche appariranno qui quando le azioni su Namespace, liste o attività a cui hai sottoscritto la sottoscrizione avvengono."
}, },
"quickActions": { "quickActions": {
"commands": "Commands", "commands": "Comandi",
"placeholder": "Type a command or search…", "placeholder": "Digita un comando o cerca…",
"hint": "You can use {list} to limit the search to a list. Combine {list} or {label} (labels) with a search query to search for a task with these labels or on that list. Use {assignee} to only search for teams.", "hint": "Puoi usare {list} per limitare la ricerca a una lista. Unisci {list} o {label} (etichette) alla ricerca per trovare un'attività con quelle etichette o in quella lista. Usa {assignee} per cercare solo i gruppi.",
"tasks": "Tasks", "tasks": "Attivitá",
"lists": "Liste", "lists": "Liste",
"teams": "Teams", "teams": "Gruppi",
"newList": "Enter the title of the new list…", "newList": "Inserisci il titolo della nuova lista…",
"newTask": "Enter the title of the new task…", "newTask": "Inserisci il titolo della nuova attività…",
"newNamespace": "Enter the title of the new namespace…", "newNamespace": "Inserisci il titolo del nuovo namespace…",
"newTeam": "Enter the name of the new team…", "newTeam": "Inserisci il nome del nuovo gruppo…",
"createTask": "Create a task in the current list ({title})", "createTask": "Crea un'attività nella lista attuale ({title})",
"createList": "Create a list in the current namespace ({title})", "createList": "Crea una lista nel namespace attuale ({title})",
"cmds": { "cmds": {
"newTask": "New task", "newTask": "Nuova attività",
"newList": "New list", "newList": "Nuova lista",
"newNamespace": "New namespace", "newNamespace": "Nuovo Namespace",
"newTeam": "New team" "newTeam": "Nuovo gruppo"
} }
}, },
"date": { "date": {
"locale": "en", "locale": "it",
"altFormatLong": "j M Y H:i", "altFormatLong": "j M Y H:i",
"altFormatShort": "j M Y" "altFormatShort": "j M Y"
}, },
"error": { "error": {
"error": "Errore", "error": "Errore",
"success": "Success", "success": "Fatto",
"0001": "Non ti è permesso farlo.", "0001": "Non ti è permesso farlo.",
"1001": "A user with this username already exists.", "1001": "Esiste già un utente con questo nome utente.",
"1002": "Un utente con questo indirizzo e-mail esiste già.", "1002": "Un utente con questo indirizzo e-mail esiste già.",
"1004": "No username and password specified.", "1004": "Nessun nome utente e password specificati.",
"1005": "L'utente non esiste.", "1005": "L'utente non esiste.",
"1006": "Impossibile ottenere l'id utente.", "1006": "Impossibile ottenere l'id utente.",
"1008": "No password reset token provided.", "1008": "Nessun codice di reimpostazione password fornito.",
"1009": "Invalid password reset token.", "1009": "Codice di reimpostazione password non valido.",
"1010": "Token di conferma dell'e-mail non valido.", "1010": "Token di conferma dell'e-mail non valido.",
"1011": "Wrong username or password.", "1011": "Nome utente o password errati.",
"1012": "Indirizzo e-mail dell'utente non confermato.", "1012": "Indirizzo e-mail dell'utente non confermato.",
"1013": "La nuova password è vuota.", "1013": "La nuova password è vuota.",
"1014": "La vecchia password è vuota.", "1014": "La vecchia password è vuota.",
"1015": "Autenticazione TOTP già abilitata per questo utente.", "1015": "Autenticazione TOTP già abilitata per questo utente.",
"1016": "Autenticazione TOTP non abilitata per questo utente.", "1016": "Autenticazione TOTP non abilitata per questo utente.",
"1017": "Codice TOTP non valido.", "1017": "Codice TOTP non valido.",
"1018": "The user avatar type setting is invalid.", "1018": "L'impostazione del tipo di avatar utente non è valida.",
"2001": "L'ID non può essere vuoto o 0.", "2001": "L'ID non può essere vuoto o 0.",
"2002": "Alcuni dati della richiesta non erano validi.", "2002": "Alcuni dati della richiesta non erano validi.",
"3001": "La lista non esiste.", "3001": "La lista non esiste.",
"3004": "You need to have read permissions on that list to perform that action.", "3004": "Devi avere i permessi di lettura su quella lista per eseguire quell'azione.",
"3005": "Il titolo della lista non può essere vuoto.", "3005": "Il titolo della lista non può essere vuoto.",
"3006": "The list share does not exist.", "3006": "La condivisione della lista non esiste.",
"3007": "Esiste già una lista con questo identificatore.", "3007": "Esiste già una lista con questo identificatore.",
"3008": "The list is archived and can therefore only be accessed read only. This is also true for all tasks associated with this list.", "3008": "La lista è archiviata e può quindi essere consultata solo in sola lettura. Questo vale anche per tutte le attività associate a questa lista.",
"4001": "The list task text cannot be empty.", "4001": "Il testo delle attività della lista non può essere vuoto.",
"4002": "The list task does not exist.", "4002": "Lista di attività non esistente.",
"4003": "Tutte le attività di modifica in blocco devono appartenere alla stessa lista.", "4003": "Tutte le attività di modifica in blocco devono appartenere alla stessa lista.",
"4004": "Hai bisogno di almeno un'attività quando si modificano in blocco le attività.", "4004": "Hai bisogno di almeno un'attività quando si modificano in blocco le attività.",
"4005": "Non hai il permesso di vedere l'attività.", "4005": "Non hai il permesso di vedere l'attività.",
"4006": "You can't set a parent task as the task itself.", "4006": "Non è possibile impostare un'attività principale come l'attività stessa.",
"4007": "You can't create a task relation with an invalid kind of relation.", "4007": "Non è possibile creare una relazione di attività con un tipo di relazione non valido.",
"4008": "You can't create a task relation which already exists.", "4008": "Non è possibile creare una relazione di attività già esistente.",
"4009": "The task relation does not exist.", "4009": "La relazione di attività non esiste.",
"4010": "Cannot relate a task with itself.", "4010": "Non è possibile relazionare un'attività con se stessa.",
"4011": "The task attachment does not exist.", "4011": "L'allegato dell'attività non esiste.",
"4012": "The task attachment is too large.", "4012": "L'allegato dell'attività è troppo grande.",
"4013": "The task sort param is invalid.", "4013": "Il parametro di ordinamento dei task non è valido.",
"4014": "The task sort order is invalid.", "4014": "L' ordinamento dei task non è valido.",
"4015": "The task comment does not exist.", "4015": "Il commento all'attività non esiste.",
"4016": "Invalid task field.", "4016": "Campo attività non valido.",
"4017": "Invalid task filter comparator.", "4017": "Comparatore di filtri attività non valido.",
"4018": "Invalid task filter concatinator.", "4018": "Concatenatore filtro attività non valido.",
"4019": "Invalid task filter value.", "4019": "Filtro attività non valido.",
"5001": "The namespace does not exist.", "5001": "Il namespace non esiste.",
"5003": "You do not have access to the specified namespace.", "5003": "Non hai accesso a questo namespace.",
"5006": "The namespace name cannot be empty.", "5006": "Il nome del namespace non può essere vuoto.",
"5009": "You need to have namespace read access to perform that action.", "5009": "Devi avere accesso in lettura al namespace per effettuare questa operazione.",
"5010": "This team does not have access to that namespace.", "5010": "Il tuo gruppo non ha accesso a questo namespace.",
"5011": "This user has already access to that namespace.", "5011": "Questo utente ha già accesso a quel namespace.",
"5012": "The namespace is archived and can therefore only be accessed read only.", "5012": "Il namespace è archiviato e può quindi essere accessibile solo in sola lettura.",
"6001": "The team name cannot be empty.", "6001": "Il nome del gruppo non può essere vuoto.",
"6002": "The team does not exist.", "6002": "Gruppo non esistente.",
"6004": "The team already has access to that namespace or list.", "6004": "Il team ha già accesso a questo namespace o lista.",
"6005": "The user is already a member of that team.", "6005": "L'utente è già membro di quel gruppo.",
"6006": "Cannot delete the last team member.", "6006": "Non è possibile eliminare l'ultimo membro del gruppo.",
"6007": "The team does not have access to the list to perform that action.", "6007": "Il gruppo non ha accesso alla lista per eseguire quell'azione.",
"7002": "The user already has access to that list.", "7002": "L'utente ha già accesso a quella lista.",
"7003": "Non hai accesso a quella lista.", "7003": "Non hai accesso a quella lista.",
"8001": "Questa etichetta esiste già in quell'attività.", "8001": "Questa etichetta esiste già in quell'attività.",
"8002": "L'etichetta non esiste.", "8002": "L'etichetta non esiste.",
"8003": "Non hai accesso a questa etichetta.", "8003": "Non hai accesso a questa etichetta.",
"9001": "The right is invalid.", "9001": "Permesso non valido.",
"10001": "The bucket does not exist.", "10001": "Colonna non esistente.",
"10002": "The bucket does not belong to that list.", "10002": "La colonna non appartiene a quella lista.",
"10003": "You cannot remove the last bucket on a list.", "10003": "Non puoi rimuovere l'ultima colonna di una lista.",
"10004": "You cannot add the task to this bucket as it already exceeded the limit of tasks it can hold.", "10004": "Non puoi aggiungere l'attività a questa colonna perché ha già superato il limite di attività che può contenere.",
"10005": "There can be only one done bucket per list.", "10005": "Ci può essere solo una colonna completati per lista.",
"11001": "The saved filter does not exist.", "11001": "Filtro salvato non esistente.",
"11002": "Saved filters are not available for link shares.", "11002": "I filtri salvati non sono disponibili per i link di condivisione.",
"12001": "The subscription entity type is invalid.", "12001": "Il tipo di entità sottoscritto non è valido.",
"12002": "You are already subscribed to the entity itself or a parent entity.", "12002": "Sei già iscritto all'entità stessa o a un'entità principale.",
"13001": "This link share requires a password for authentication, but none was provided.", "13001": "Questa condivisione di link richiede una password per l'autenticazione, ma non è stato inserita.",
"13002": "The provided link share password was invalid." "13002": "La password inserita per il link di condivisione è valida."
}, },
"about": { "about": {
"title": "About", "title": "Informazioni",
"frontendVersion": "Frontend Version: {version}", "frontendVersion": "Versione Frontend: {version}",
"apiVersion": "API Version: {version}" "apiVersion": "Versione API: {version}"
} }
} }

View File

@ -545,7 +545,7 @@
"chooseStartDate": "Click here to set a start date", "chooseStartDate": "Click here to set a start date",
"chooseEndDate": "Click here to set an end date", "chooseEndDate": "Click here to set an end date",
"move": "Move task to a different list", "move": "Move task to a different list",
"done": "Done!", "done": "Mark task done!",
"undone": "Mark as undone", "undone": "Mark as undone",
"created": "Created {0} by {1}", "created": "Created {0} by {1}",
"updated": "Updated {0}", "updated": "Updated {0}",
@ -781,7 +781,7 @@
"then": "then", "then": "then",
"task": { "task": {
"title": "Task Page", "title": "Task Page",
"done": "Mark a task as done", "done": "Done",
"assign": "Assign to a user", "assign": "Assign to a user",
"labels": "Add labels to this task", "labels": "Add labels to this task",
"dueDate": "Change the due date of this task", "dueDate": "Change the due date of this task",
@ -899,7 +899,7 @@
"4015": "The task comment does not exist.", "4015": "The task comment does not exist.",
"4016": "Invalid task field.", "4016": "Invalid task field.",
"4017": "Invalid task filter comparator.", "4017": "Invalid task filter comparator.",
"4018": "Invalid task filter concatinator.", "4018": "Invalid task filter concatenator.",
"4019": "Invalid task filter value.", "4019": "Invalid task filter value.",
"5001": "The namespace does not exist.", "5001": "The namespace does not exist.",
"5003": "You do not have access to the specified namespace.", "5003": "You do not have access to the specified namespace.",

View File

@ -545,7 +545,7 @@
"chooseStartDate": "Click here to set a start date", "chooseStartDate": "Click here to set a start date",
"chooseEndDate": "Click here to set an end date", "chooseEndDate": "Click here to set an end date",
"move": "Move task to a different list", "move": "Move task to a different list",
"done": "Done!", "done": "Mark task done!",
"undone": "Mark as undone", "undone": "Mark as undone",
"created": "Created {0} by {1}", "created": "Created {0} by {1}",
"updated": "Updated {0}", "updated": "Updated {0}",
@ -781,7 +781,7 @@
"then": "then", "then": "then",
"task": { "task": {
"title": "Task Page", "title": "Task Page",
"done": "Mark a task as done", "done": "Done",
"assign": "Assign to a user", "assign": "Assign to a user",
"labels": "Add labels to this task", "labels": "Add labels to this task",
"dueDate": "Change the due date of this task", "dueDate": "Change the due date of this task",
@ -899,7 +899,7 @@
"4015": "The task comment does not exist.", "4015": "The task comment does not exist.",
"4016": "Invalid task field.", "4016": "Invalid task field.",
"4017": "Invalid task filter comparator.", "4017": "Invalid task filter comparator.",
"4018": "Invalid task filter concatinator.", "4018": "Invalid task filter concatenator.",
"4019": "Invalid task filter value.", "4019": "Invalid task filter value.",
"5001": "The namespace does not exist.", "5001": "The namespace does not exist.",
"5003": "You do not have access to the specified namespace.", "5003": "You do not have access to the specified namespace.",

View File

@ -545,7 +545,7 @@
"chooseStartDate": "Click here to set a start date", "chooseStartDate": "Click here to set a start date",
"chooseEndDate": "Click here to set an end date", "chooseEndDate": "Click here to set an end date",
"move": "Move task to a different list", "move": "Move task to a different list",
"done": "Done!", "done": "Mark task done!",
"undone": "Mark as undone", "undone": "Mark as undone",
"created": "Created {0} by {1}", "created": "Created {0} by {1}",
"updated": "Updated {0}", "updated": "Updated {0}",
@ -781,7 +781,7 @@
"then": "then", "then": "then",
"task": { "task": {
"title": "Task Page", "title": "Task Page",
"done": "Mark a task as done", "done": "Done",
"assign": "Assign to a user", "assign": "Assign to a user",
"labels": "Add labels to this task", "labels": "Add labels to this task",
"dueDate": "Change the due date of this task", "dueDate": "Change the due date of this task",
@ -899,7 +899,7 @@
"4015": "The task comment does not exist.", "4015": "The task comment does not exist.",
"4016": "Invalid task field.", "4016": "Invalid task field.",
"4017": "Invalid task filter comparator.", "4017": "Invalid task filter comparator.",
"4018": "Invalid task filter concatinator.", "4018": "Invalid task filter concatenator.",
"4019": "Invalid task filter value.", "4019": "Invalid task filter value.",
"5001": "The namespace does not exist.", "5001": "The namespace does not exist.",
"5003": "You do not have access to the specified namespace.", "5003": "You do not have access to the specified namespace.",

View File

@ -545,7 +545,7 @@
"chooseStartDate": "Click here to set a start date", "chooseStartDate": "Click here to set a start date",
"chooseEndDate": "Click here to set an end date", "chooseEndDate": "Click here to set an end date",
"move": "Move task to a different list", "move": "Move task to a different list",
"done": "Done!", "done": "Mark task done!",
"undone": "Mark as undone", "undone": "Mark as undone",
"created": "Created {0} by {1}", "created": "Created {0} by {1}",
"updated": "Updated {0}", "updated": "Updated {0}",
@ -781,7 +781,7 @@
"then": "then", "then": "then",
"task": { "task": {
"title": "Task Page", "title": "Task Page",
"done": "Mark a task as done", "done": "Done",
"assign": "Assign to a user", "assign": "Assign to a user",
"labels": "Add labels to this task", "labels": "Add labels to this task",
"dueDate": "Change the due date of this task", "dueDate": "Change the due date of this task",
@ -899,7 +899,7 @@
"4015": "The task comment does not exist.", "4015": "The task comment does not exist.",
"4016": "Invalid task field.", "4016": "Invalid task field.",
"4017": "Invalid task filter comparator.", "4017": "Invalid task filter comparator.",
"4018": "Invalid task filter concatinator.", "4018": "Invalid task filter concatenator.",
"4019": "Invalid task filter value.", "4019": "Invalid task filter value.",
"5001": "The namespace does not exist.", "5001": "The namespace does not exist.",
"5003": "You do not have access to the specified namespace.", "5003": "You do not have access to the specified namespace.",

View File

@ -545,7 +545,7 @@
"chooseStartDate": "Нажми для выбора даты начала", "chooseStartDate": "Нажми для выбора даты начала",
"chooseEndDate": "Нажми для выбора даты завершения", "chooseEndDate": "Нажми для выбора даты завершения",
"move": "Переместить задачу в другой список", "move": "Переместить задачу в другой список",
"done": "Завершено!", "done": "Mark task done!",
"undone": "Не завершено", "undone": "Не завершено",
"created": "Создана {0} пользователем {1}", "created": "Создана {0} пользователем {1}",
"updated": "Обновлено {0}", "updated": "Обновлено {0}",
@ -781,7 +781,7 @@
"then": "then", "then": "then",
"task": { "task": {
"title": "Страница задачи", "title": "Страница задачи",
"done": "Пометить задачу завершённой", "done": "Done",
"assign": "Assign to a user", "assign": "Assign to a user",
"labels": "Добавить метки этой задаче", "labels": "Добавить метки этой задаче",
"dueDate": "Изменить срок этой задачи", "dueDate": "Изменить срок этой задачи",
@ -899,7 +899,7 @@
"4015": "Комментарий не существует.", "4015": "Комментарий не существует.",
"4016": "Неверное поле задачи.", "4016": "Неверное поле задачи.",
"4017": "Неверный сравнитель фильтров задач.", "4017": "Неверный сравнитель фильтров задач.",
"4018": "Неверный соединитель фильтров задач.", "4018": "Invalid task filter concatenator.",
"4019": "Неверное значение фильтра задач.", "4019": "Неверное значение фильтра задач.",
"5001": "Пространство имён не существует.", "5001": "Пространство имён не существует.",
"5003": "Нет доступа к указанному пространству имён.", "5003": "Нет доступа к указанному пространству имён.",

View File

@ -545,7 +545,7 @@
"chooseStartDate": "Click here to set a start date", "chooseStartDate": "Click here to set a start date",
"chooseEndDate": "Click here to set an end date", "chooseEndDate": "Click here to set an end date",
"move": "Move task to a different list", "move": "Move task to a different list",
"done": "Done!", "done": "Mark task done!",
"undone": "Mark as undone", "undone": "Mark as undone",
"created": "Created {0} by {1}", "created": "Created {0} by {1}",
"updated": "Updated {0}", "updated": "Updated {0}",
@ -781,7 +781,7 @@
"then": "then", "then": "then",
"task": { "task": {
"title": "Task Page", "title": "Task Page",
"done": "Mark a task as done", "done": "Done",
"assign": "Assign to a user", "assign": "Assign to a user",
"labels": "Add labels to this task", "labels": "Add labels to this task",
"dueDate": "Change the due date of this task", "dueDate": "Change the due date of this task",
@ -899,7 +899,7 @@
"4015": "The task comment does not exist.", "4015": "The task comment does not exist.",
"4016": "Invalid task field.", "4016": "Invalid task field.",
"4017": "Invalid task filter comparator.", "4017": "Invalid task filter comparator.",
"4018": "Invalid task filter concatinator.", "4018": "Invalid task filter concatenator.",
"4019": "Invalid task filter value.", "4019": "Invalid task filter value.",
"5001": "The namespace does not exist.", "5001": "The namespace does not exist.",
"5003": "You do not have access to the specified namespace.", "5003": "You do not have access to the specified namespace.",

View File

@ -545,7 +545,7 @@
"chooseStartDate": "Click here to set a start date", "chooseStartDate": "Click here to set a start date",
"chooseEndDate": "Click here to set an end date", "chooseEndDate": "Click here to set an end date",
"move": "Move task to a different list", "move": "Move task to a different list",
"done": "Done!", "done": "Mark task done!",
"undone": "Mark as undone", "undone": "Mark as undone",
"created": "Created {0} by {1}", "created": "Created {0} by {1}",
"updated": "Updated {0}", "updated": "Updated {0}",
@ -781,7 +781,7 @@
"then": "then", "then": "then",
"task": { "task": {
"title": "Task Page", "title": "Task Page",
"done": "Mark a task as done", "done": "Done",
"assign": "Assign to a user", "assign": "Assign to a user",
"labels": "Add labels to this task", "labels": "Add labels to this task",
"dueDate": "Change the due date of this task", "dueDate": "Change the due date of this task",
@ -899,7 +899,7 @@
"4015": "The task comment does not exist.", "4015": "The task comment does not exist.",
"4016": "Invalid task field.", "4016": "Invalid task field.",
"4017": "Invalid task filter comparator.", "4017": "Invalid task filter comparator.",
"4018": "Invalid task filter concatinator.", "4018": "Invalid task filter concatenator.",
"4019": "Invalid task filter value.", "4019": "Invalid task filter value.",
"5001": "The namespace does not exist.", "5001": "The namespace does not exist.",
"5003": "You do not have access to the specified namespace.", "5003": "You do not have access to the specified namespace.",

View File

@ -545,7 +545,7 @@
"chooseStartDate": "Bấm vào đây để đặt ngày bắt đầu", "chooseStartDate": "Bấm vào đây để đặt ngày bắt đầu",
"chooseEndDate": "Bấm vào đây để đặt ngày kết thúc", "chooseEndDate": "Bấm vào đây để đặt ngày kết thúc",
"move": "Di chuyển công việc sang một danh sách khác", "move": "Di chuyển công việc sang một danh sách khác",
"done": "Xong!", "done": "Mark task done!",
"undone": "Đánh dấu Chưa xong", "undone": "Đánh dấu Chưa xong",
"created": "Đã tạo được {0} bởi {1}", "created": "Đã tạo được {0} bởi {1}",
"updated": "Đã cập nhật {0}", "updated": "Đã cập nhật {0}",
@ -781,7 +781,7 @@
"then": "sau đó", "then": "sau đó",
"task": { "task": {
"title": "Trang công việc", "title": "Trang công việc",
"done": "Đánh dấu hoàn thành", "done": "Done",
"assign": "Chỉ định một người", "assign": "Chỉ định một người",
"labels": "Thêm nhãn cho công việc này", "labels": "Thêm nhãn cho công việc này",
"dueDate": "Thay đổi ngày hết hạn của công việc này", "dueDate": "Thay đổi ngày hết hạn của công việc này",
@ -899,7 +899,7 @@
"4015": "Bình luận không tồn tại.", "4015": "Bình luận không tồn tại.",
"4016": "Trường công việc không hợp lệ.", "4016": "Trường công việc không hợp lệ.",
"4017": "Bộ so sánh bộ lọc công việc không hợp lệ.", "4017": "Bộ so sánh bộ lọc công việc không hợp lệ.",
"4018": "Bộ lọc kết hợp không hợp lệ.", "4018": "Invalid task filter concatenator.",
"4019": "Giá trị bộ lọc công việc không hợp lệ.", "4019": "Giá trị bộ lọc công việc không hợp lệ.",
"5001": "Góc làm việc không có nữa.", "5001": "Góc làm việc không có nữa.",
"5003": "Bạn chưa được phép bước vào vào góc làm việc được chỉ định.", "5003": "Bạn chưa được phép bước vào vào góc làm việc được chỉ định.",

View File

@ -18,7 +18,7 @@ declare global {
} }
} }
import {formatDate, formatDateShort, formatDateLong, formatDateSince} from '@/helpers/time/formatDate' import {formatDate, formatDateShort, formatDateLong, formatDateSince, formatISO} from '@/helpers/time/formatDate'
// @ts-ignore // @ts-ignore
import {VERSION} from './version.json' import {VERSION} from './version.json'
@ -52,6 +52,7 @@ app.use(Notifications)
// directives // directives
import focus from '@/directives/focus' import focus from '@/directives/focus'
// @ts-ignore The export does exist, ts just doesn't find it.
import { VTooltip } from 'v-tooltip' import { VTooltip } from 'v-tooltip'
import 'v-tooltip/dist/v-tooltip.css' import 'v-tooltip/dist/v-tooltip.css'
import shortcut from '@/directives/shortcut' import shortcut from '@/directives/shortcut'
@ -84,6 +85,7 @@ app.mixin({
format: formatDate, format: formatDate,
formatDate: formatDateLong, formatDate: formatDateLong,
formatDateShort: formatDateShort, formatDateShort: formatDateShort,
formatISO,
getNamespaceTitle, getNamespaceTitle,
getListTitle, getListTitle,
setTitle, setTitle,

View File

@ -32,6 +32,13 @@ describe('Parse Task Text', () => {
expect(result.assignees).toHaveLength(1) expect(result.assignees).toHaveLength(1)
expect(result.assignees[0]).toBe('user') expect(result.assignees[0]).toBe('user')
}) })
it('should ignore email addresses', () => {
const text = 'Lorem Ipsum email@example.com'
const result = parseTaskText(text)
expect(result.text).toBe(text)
})
describe('Date Parsing', () => { describe('Date Parsing', () => {
it('should not return any date if none was provided', () => { it('should not return any date if none was provided', () => {

View File

@ -117,23 +117,30 @@ export const parseTaskText = (text: string, prefixesMode: PrefixMode = PrefixMod
const getItemsFromPrefix = (text: string, prefix: string): string[] => { const getItemsFromPrefix = (text: string, prefix: string): string[] => {
const items: string[] = [] const items: string[] = []
const itemParts = text.split(prefix) const itemParts = text.split(' ' + prefix)
if (text.startsWith(prefix)) {
const firstItem = text.split(prefix)[1]
itemParts.unshift(firstItem)
}
itemParts.forEach((p, index) => { itemParts.forEach((p, index) => {
// First part contains the rest // First part contains the rest
if (index < 1) { if (index < 1) {
return return
} }
let labelText p = p.replace(prefix, '')
let itemText
if (p.charAt(0) === '\'') { if (p.charAt(0) === '\'') {
labelText = p.split('\'')[1] itemText = p.split('\'')[1]
} else if (p.charAt(0) === '"') { } else if (p.charAt(0) === '"') {
labelText = p.split('"')[1] itemText = p.split('"')[1]
} else { } else {
// Only until the next space // Only until the next space
labelText = p.split(' ')[0] itemText = p.split(' ')[0]
} }
items.push(labelText) items.push(itemText)
}) })
return Array.from(new Set(items)) return Array.from(new Set(items))

View File

@ -226,7 +226,7 @@ export default {
commit('info', info) commit('info', info)
commit('lastUserRefresh') commit('lastUserRefresh')
if (typeof info.settings.language !== 'undefined') { if (typeof info.settings.language === 'undefined' || info.settings.language === '') {
// save current language // save current language
await dispatch('saveUserSettings', { await dispatch('saveUserSettings', {
settings: { settings: {

View File

@ -179,9 +179,18 @@ export default {
console.debug('Could not add label to task in kanban, task not found', t) console.debug('Could not add label to task in kanban, task not found', t)
return r return r
} }
// FIXME: direct store manipulation (task)
t.task.labels.push(label) const labels = [...t.task.labels]
ctx.commit('kanban/setTaskInBucketByIndex', t, { root: true }) labels.push(label)
ctx.commit('kanban/setTaskInBucketByIndex', {
task: {
labels,
...t.task,
},
...t,
}, { root: true })
return r return r
}, },
@ -200,15 +209,21 @@ export default {
} }
// Remove the label from the list // Remove the label from the list
for (const l in t.task.labels) { const labels = [...t.task.labels]
if (t.task.labels[l].id === label.id) { for (const l in labels) {
// FIXME: direct store manipulation (task) if (labels[l].id === label.id) {
t.task.labels.splice(l, 1) labels.splice(l, 1)
break break
} }
} }
ctx.commit('kanban/setTaskInBucketByIndex', t, {root: true}) ctx.commit('kanban/setTaskInBucketByIndex', {
task: {
labels,
...t.task,
},
...t,
}, {root: true})
return response return response
}, },

View File

@ -60,9 +60,9 @@
--danger: hsla(var(--danger-h), var(--danger-s), var(--danger-l), var(--danger-a)); --danger: hsla(var(--danger-h), var(--danger-s), var(--danger-l), var(--danger-a));
// var(--primary) / $blue is #1973ff // var(--primary) / $blue is #1973ff
--primary-h: 216.5deg; --primary-h: 217deg;
--primary-s: 100%; --primary-s: 98%;
--primary-l: 54.9%; --primary-l: 53%;
--primary-a: 1; --primary-a: 1;
--primary-hsl: var(--primary-h), var(--primary-s), var(--primary-l); --primary-hsl: var(--primary-h), var(--primary-s), var(--primary-l);
--primary: hsla(var(--primary-h), var(--primary-s), var(--primary-l), var(--primary-a)); --primary: hsla(var(--primary-h), var(--primary-s), var(--primary-l), var(--primary-a));
@ -122,5 +122,10 @@
// Custom color variables we need to override // Custom color variables we need to override
--card-border-color: hsla(var(--grey-100-hsl), 0.3); --card-border-color: hsla(var(--grey-100-hsl), 0.3);
--logo-text-color: var(--grey-700); --logo-text-color: var(--grey-700);
// Slightly different primary color to make sure it has a sufficent contrast ratio
--primary-h: 217deg;
--primary-s: 98%;
--primary-l: 58%;
} }
} }

4
src/types/faker.d.ts vendored Normal file
View File

@ -0,0 +1,4 @@
declare module '@faker-js/faker' {
import faker from 'faker'
export default faker
}

View File

@ -254,4 +254,13 @@ export default {
background-color: var(--primary-dark); background-color: var(--primary-dark);
} }
} }
@media (prefers-reduced-motion: reduce) {
@keyframes wave {
10% {
transform: translate(0, 0);
background-color: var(--primary);
}
}
}
</style> </style>

View File

@ -22,7 +22,7 @@
</router-link> </router-link>
</p> </p>
<div :key="`n${n.id}`" class="namespace" v-for="n in namespaces"> <section :key="`n${n.id}`" class="namespace" v-for="n in namespaces">
<x-button <x-button
:to="{name: 'list.create', params: {id: n.id}}" :to="{name: 'list.create', params: {id: n.id}}"
class="is-pulled-right" class="is-pulled-right"
@ -64,7 +64,7 @@
:show-archived="showArchived" :show-archived="showArchived"
/> />
</div> </div>
</div> </section>
</div> </div>
</template> </template>

View File

@ -44,7 +44,7 @@ import Message from '@/components/misc/message.vue'
const {t} = useI18n() const {t} = useI18n()
useTitle(t('sharing.authenticating')) useTitle(t('sharing.authenticating'))
async function useAuth() { function useAuth() {
const store = useStore() const store = useStore()
const route = useRoute() const route = useRoute()
const router = useRouter() const router = useRouter()
@ -75,21 +75,21 @@ async function useAuth() {
password: password.value, password: password.value,
}) })
router.push({name: 'list.list', params: {listId}}) router.push({name: 'list.list', params: {listId}})
} catch (e) { } catch (e: any) {
if (e.response?.data?.code === 13001) { if (e.response?.data?.code === 13001) {
authenticateWithPassword.value = true authenticateWithPassword.value = true
return return
} }
// TODO: Put this logic in a global errorMessage handler method which checks all auth codes // TODO: Put this logic in a global errorMessage handler method which checks all auth codes
let errorMessage = t('sharing.error') let err = t('sharing.error')
if (e.response?.data?.message) { if (e.response?.data?.message) {
errorMessage = e.response.data.message err = e.response.data.message
} }
if (e.response?.data?.code === 13002) { if (e.response?.data?.code === 13002) {
errorMessage = t('sharing.invalidPassword') err = t('sharing.invalidPassword')
} }
errorMessage.value = errorMessage errorMessage.value = err
} finally { } finally {
loading.value = false loading.value = false
} }

View File

@ -386,22 +386,28 @@
<!-- Created / Updated [by] --> <!-- Created / Updated [by] -->
<p class="created"> <p class="created">
<i18n-t keypath="task.detail.created"> <time :datetime="formatISO(task.created)" v-tooltip="formatDate(task.created)">
<span v-tooltip="formatDate(task.created)">{{ formatDateSince(task.created) }}</span> <i18n-t keypath="task.detail.created">
{{ task.createdBy.getDisplayName() }} <span>{{ formatDateSince(task.created) }}</span>
</i18n-t> {{ task.createdBy.getDisplayName() }}
</i18n-t>
</time>
<template v-if="+new Date(task.created) !== +new Date(task.updated)"> <template v-if="+new Date(task.created) !== +new Date(task.updated)">
<br/> <br/>
<!-- Computed properties to show the actual date every time it gets updated --> <!-- Computed properties to show the actual date every time it gets updated -->
<i18n-t keypath="task.detail.updated"> <time :datetime="formatISO(task.updated)" v-tooltip="updatedFormatted">
<span v-tooltip="updatedFormatted">{{ updatedSince }}</span> <i18n-t keypath="task.detail.updated">
</i18n-t> <span>{{ updatedSince }}</span>
</i18n-t>
</time>
</template> </template>
<template v-if="task.done"> <template v-if="task.done">
<br/> <br/>
<i18n-t keypath="task.detail.doneAt"> <time :datetime="formatISO(task.doneAt)" v-tooltip="doneFormatted">
<span v-tooltip="doneFormatted">{{ doneSince }}</span> <i18n-t keypath="task.detail.doneAt">
</i18n-t> <span>{{ doneSince }}</span>
</i18n-t>
</time>
</template> </template>
</p> </p>
</div> </div>
@ -589,6 +595,9 @@ export default {
} }
}, },
scrollToHeading() { scrollToHeading() {
if(!this.$refs?.heading?.$el) {
return
}
this.$refs.heading.$el.scrollIntoView({block: 'center'}) this.$refs.heading.$el.scrollIntoView({block: 'center'})
}, },
setActiveFields() { setActiveFields() {
@ -627,7 +636,6 @@ export default {
} }
this.task = await this.$store.dispatch('tasks/update', this.task) this.task = await this.$store.dispatch('tasks/update', this.task)
this.setActiveFields()
if (!showNotification) { if (!showNotification) {
return return
@ -871,7 +879,7 @@ $flash-background-duration: 750ms;
} }
.action-buttons { .action-buttons {
a.button { .button {
width: 100%; width: 100%;
margin-bottom: .5rem; margin-bottom: .5rem;
justify-content: left; justify-content: left;
@ -932,4 +940,12 @@ $flash-background-duration: 750ms;
background: transparent; background: transparent;
} }
} }
@media (prefers-reduced-motion: reduce) {
@keyframes flash-background {
0% {
background: transparent;
}
}
}
</style> </style>

1282
yarn.lock

File diff suppressed because it is too large Load Diff