forked from vikunja/frontend
Compare commits
71 Commits
7b17ccbf1f
...
7098b6315f
Author | SHA1 | Date | |
---|---|---|---|
7098b6315f | |||
dc70df54ba | |||
24dcbaba27 | |||
eedbba5657 | |||
1223d8b679 | |||
c6e7390f13 | |||
a84fb8b5df | |||
7bbd452f3b | |||
01c29578fb | |||
5d58c4baa3 | |||
b1493e2be6 | |||
50f19829d5 | |||
99cba7fc02 | |||
89c67c9726 | |||
3ab58a015c | |||
45b7434bda | |||
ae47298b3c | |||
9f36085505 | |||
cf6eea97b1 | |||
739b26ae9f | |||
f9e9c9d6e3 | |||
2cb482dc93 | |||
196b2f0c6c | |||
52e94df048 | |||
2454b0862d | |||
63bbc44ed6 | |||
05e8986916 | |||
600808beb0 | |||
30bc74a5aa | |||
d44d9f44bc | |||
ee89358be6 | |||
7e5e3f81b3 | |||
1bf41edb96 | |||
67b1b0b118 | |||
8d76bec525 | |||
0da9262cce | |||
1149d7adfd | |||
8e472211ff | |||
2ca0bc6dad | |||
51ffe93048 | |||
3440d71e74 | |||
067173f08e | |||
40fa551f28 | |||
a804df342e | |||
896196f08f | |||
245b134c92 | |||
667afa3c05 | |||
42e830eb73 | |||
8718efbc1c | |||
8c8a07f1de | |||
985f379845 | |||
5b8d142abb | |||
76cb94c488 | |||
4994db4f77 | |||
35d3cd6e83 | |||
7a46843a28 | |||
bafef06e90 | |||
d5445e0298 | |||
9bbaa67eec | |||
1f14e7bee8 | |||
e05b729c21 | |||
ad7ed86d36 | |||
e82a83c8cf | |||
31480eae72 | |||
c8162728b7 | |||
8b3072672a | |||
0e09f9fded | |||
ab406f00d9 | |||
2507f661e8 | |||
cf27131e48 | |||
54d8e341ab |
2057
CHANGELOG.md
2057
CHANGELOG.md
File diff suppressed because it is too large
Load Diff
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
[![Build Status](https://drone.kolaente.de/api/badges/vikunja/frontend/status.svg)](https://drone.kolaente.de/vikunja/frontend)
|
[![Build Status](https://drone.kolaente.de/api/badges/vikunja/frontend/status.svg)](https://drone.kolaente.de/vikunja/frontend)
|
||||||
[![License: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](LICENSE)
|
[![License: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](LICENSE)
|
||||||
[![Download](https://img.shields.io/badge/download-v0.18.2-brightgreen.svg)](https://dl.vikunja.io)
|
[![Download](https://img.shields.io/badge/download-v0.19.1-brightgreen.svg)](https://dl.vikunja.io)
|
||||||
[![Translation](https://badges.crowdin.net/vikunja/localized.svg)](https://crowdin.com/project/vikunja)
|
[![Translation](https://badges.crowdin.net/vikunja/localized.svg)](https://crowdin.com/project/vikunja)
|
||||||
|
|
||||||
This is the web frontend for Vikunja, written in Vue.js.
|
This is the web frontend for Vikunja, written in Vue.js.
|
||||||
|
|
59
cliff.toml
Normal file
59
cliff.toml
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
[changelog]
|
||||||
|
body = """
|
||||||
|
{% if version %}\
|
||||||
|
## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
|
||||||
|
{% else %}\
|
||||||
|
## [unreleased]
|
||||||
|
{% endif %}\
|
||||||
|
|
||||||
|
|
||||||
|
{% for group, commits in commits | group_by(attribute="group") %}
|
||||||
|
### {{ group | upper_first }}
|
||||||
|
{% for commit in commits
|
||||||
|
| filter(attribute="scope")
|
||||||
|
| sort(attribute="scope") %}
|
||||||
|
* *({{commit.scope}})* {{ commit.message | upper_first }}
|
||||||
|
{%- if commit.breaking %}
|
||||||
|
{% raw %} {% endraw %}- **BREAKING**: {{commit.breaking_description}}
|
||||||
|
{%- endif -%}
|
||||||
|
{%- endfor -%}
|
||||||
|
{%- for commit in commits %}
|
||||||
|
{%- if commit.scope -%}
|
||||||
|
{% else -%}
|
||||||
|
* {{ commit.message | upper_first }} ([{{ commit.id | truncate(length=7, end="") }}]({{ commit.id }}))
|
||||||
|
{% if commit.breaking -%}
|
||||||
|
{% raw %} {% endraw %}- **BREAKING**: {{commit.breaking_description}}
|
||||||
|
{% endif -%}
|
||||||
|
{% endif -%}
|
||||||
|
{% endfor -%}
|
||||||
|
{% raw %}\n{% endraw %}\
|
||||||
|
{% endfor %}\n
|
||||||
|
|
||||||
|
"""
|
||||||
|
#{% for group, commits in commits | group_by(attribute="group") %}
|
||||||
|
# ### {{ group | upper_first }}
|
||||||
|
# {% for commit in commits %}\
|
||||||
|
# - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }} ([{{ commit.id | truncate(length=7, end="") }}]({{ commit.id }}))
|
||||||
|
# {% endfor %}\
|
||||||
|
#{% endfor %}\n
|
||||||
|
# remove the leading and trailing whitespace from the template
|
||||||
|
trim = true
|
||||||
|
|
||||||
|
[git]
|
||||||
|
conventional_commits = true
|
||||||
|
filter_unconventional = false
|
||||||
|
commit_parsers = [
|
||||||
|
{ message = ".*(deps).*", group = "Dependencies"},
|
||||||
|
{ message = "^feat", group = "Features"},
|
||||||
|
{ message = "^fix", group = "Bug Fixes"},
|
||||||
|
{ message = "^doc", group = "Documentation"},
|
||||||
|
{ message = "^perf", group = "Performance"},
|
||||||
|
{ message = "^refactor", group = "Refactor"},
|
||||||
|
{ message = "^style", group = "Styling"},
|
||||||
|
{ message = "^test", group = "Testing"},
|
||||||
|
{ message = "^chore\\(release\\): prepare for", skip = true},
|
||||||
|
{ message = "^chore", group = "Miscellaneous Tasks"},
|
||||||
|
{ body = ".*security", group = "Security"},
|
||||||
|
{ message = ".*", group = "Other", default_scope = "other"}, # Everything that's not a conventional commit goes into the "Other" category
|
||||||
|
]
|
||||||
|
|
|
@ -3,14 +3,19 @@ import {UserFactory} from '../../factories/user'
|
||||||
import {NamespaceFactory} from '../../factories/namespace'
|
import {NamespaceFactory} from '../../factories/namespace'
|
||||||
import {TaskFactory} from '../../factories/task'
|
import {TaskFactory} from '../../factories/task'
|
||||||
|
|
||||||
export function prepareLists(setLists = () => {}) {
|
export function createLists() {
|
||||||
beforeEach(() => {
|
|
||||||
UserFactory.create(1)
|
UserFactory.create(1)
|
||||||
NamespaceFactory.create(1)
|
NamespaceFactory.create(1)
|
||||||
const lists = ListFactory.create(1, {
|
const lists = ListFactory.create(1, {
|
||||||
title: 'First List'
|
title: 'First List'
|
||||||
})
|
})
|
||||||
setLists(lists)
|
|
||||||
TaskFactory.truncate()
|
TaskFactory.truncate()
|
||||||
|
return lists
|
||||||
|
}
|
||||||
|
|
||||||
|
export function prepareLists(setLists = () => {}) {
|
||||||
|
beforeEach(() => {
|
||||||
|
const lists = createLists()
|
||||||
|
setLists(lists)
|
||||||
})
|
})
|
||||||
}
|
}
|
|
@ -1,16 +1,44 @@
|
||||||
import '../../support/authenticateUser'
|
import '../../support/authenticateUser'
|
||||||
|
import {createLists} from '../list/prepareLists'
|
||||||
|
|
||||||
describe('Log out', () => {
|
function logout() {
|
||||||
it('Logs the user out', () => {
|
|
||||||
cy.visit('/')
|
|
||||||
|
|
||||||
cy.get('.navbar .user .username')
|
cy.get('.navbar .user .username')
|
||||||
.click()
|
.click()
|
||||||
cy.get('.navbar .user .dropdown-menu .dropdown-item')
|
cy.get('.navbar .user .dropdown-menu .dropdown-item')
|
||||||
.contains('Logout')
|
.contains('Logout')
|
||||||
.click()
|
.click()
|
||||||
|
}
|
||||||
|
|
||||||
|
describe('Log out', () => {
|
||||||
|
it('Logs the user out', () => {
|
||||||
|
cy.visit('/')
|
||||||
|
|
||||||
|
expect(localStorage.getItem('token')).to.not.eq(null)
|
||||||
|
|
||||||
|
logout()
|
||||||
|
|
||||||
cy.url()
|
cy.url()
|
||||||
.should('contain', '/login')
|
.should('contain', '/login')
|
||||||
|
.then(() => {
|
||||||
|
expect(localStorage.getItem('token')).to.eq(null)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it.skip('Should clear the list history after logging the user out', () => {
|
||||||
|
const lists = createLists()
|
||||||
|
cy.visit(`/lists/${lists[0].id}`)
|
||||||
|
.then(() => {
|
||||||
|
expect(localStorage.getItem('listHistory')).to.not.eq(null)
|
||||||
|
})
|
||||||
|
|
||||||
|
logout()
|
||||||
|
|
||||||
|
cy.wait(1000) // This makes re-loading of the list and associated entities (and the resulting error) visible
|
||||||
|
|
||||||
|
cy.url()
|
||||||
|
.should('contain', '/login')
|
||||||
|
.then(() => {
|
||||||
|
expect(localStorage.getItem('listHistory')).to.eq(null)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
52
package.json
52
package.json
|
@ -20,12 +20,12 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@github/hotkey": "2.0.1",
|
"@github/hotkey": "2.0.1",
|
||||||
"@kyvg/vue3-notification": "2.3.6",
|
"@kyvg/vue3-notification": "2.3.6",
|
||||||
"@sentry/tracing": "7.8.0",
|
"@sentry/tracing": "7.11.1",
|
||||||
"@sentry/vue": "7.8.0",
|
"@sentry/vue": "7.11.1",
|
||||||
"@types/is-touch-device": "1.0.0",
|
"@types/is-touch-device": "1.0.0",
|
||||||
"@types/sortablejs": "1.13.0",
|
"@types/sortablejs": "1.13.0",
|
||||||
"@vueuse/core": "9.0.2",
|
"@vueuse/core": "9.1.0",
|
||||||
"@vueuse/router": "9.0.2",
|
"@vueuse/router": "9.1.0",
|
||||||
"blurhash": "1.1.5",
|
"blurhash": "1.1.5",
|
||||||
"bulma-css-variables": "0.9.33",
|
"bulma-css-variables": "0.9.33",
|
||||||
"camel-case": "4.1.2",
|
"camel-case": "4.1.2",
|
||||||
|
@ -48,53 +48,53 @@
|
||||||
"vue-advanced-cropper": "2.8.3",
|
"vue-advanced-cropper": "2.8.3",
|
||||||
"vue-drag-resize": "2.0.3",
|
"vue-drag-resize": "2.0.3",
|
||||||
"vue-flatpickr-component": "9.0.6",
|
"vue-flatpickr-component": "9.0.6",
|
||||||
"vue-i18n": "9.2.0-beta.40",
|
"vue-i18n": "9.2.2",
|
||||||
"vue-router": "4.1.3",
|
"vue-router": "4.1.3",
|
||||||
"vuex": "4.0.2",
|
"vuex": "4.0.2",
|
||||||
"workbox-precaching": "6.5.3",
|
"workbox-precaching": "6.5.4",
|
||||||
"zhyswan-vuedraggable": "4.1.3"
|
"zhyswan-vuedraggable": "4.1.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@4tw/cypress-drag-drop": "2.2.1",
|
"@4tw/cypress-drag-drop": "2.2.1",
|
||||||
"@cypress/vite-dev-server": "3.0.0",
|
"@cypress/vite-dev-server": "3.1.1",
|
||||||
"@cypress/vue": "4.0.0",
|
"@cypress/vue": "4.1.0",
|
||||||
"@faker-js/faker": "7.3.0",
|
"@faker-js/faker": "7.4.0",
|
||||||
"@fortawesome/fontawesome-svg-core": "6.1.2",
|
"@fortawesome/fontawesome-svg-core": "6.1.2",
|
||||||
"@fortawesome/free-regular-svg-icons": "6.1.2",
|
"@fortawesome/free-regular-svg-icons": "6.1.2",
|
||||||
"@fortawesome/free-solid-svg-icons": "6.1.2",
|
"@fortawesome/free-solid-svg-icons": "6.1.2",
|
||||||
"@fortawesome/vue-fontawesome": "3.0.1",
|
"@fortawesome/vue-fontawesome": "3.0.1",
|
||||||
"@types/flexsearch": "0.7.3",
|
"@types/flexsearch": "0.7.3",
|
||||||
"@typescript-eslint/eslint-plugin": "5.31.0",
|
"@typescript-eslint/eslint-plugin": "5.33.1",
|
||||||
"@typescript-eslint/parser": "5.31.0",
|
"@typescript-eslint/parser": "5.33.1",
|
||||||
"@vitejs/plugin-legacy": "2.0.0",
|
"@vitejs/plugin-legacy": "2.0.1",
|
||||||
"@vitejs/plugin-vue": "3.0.1",
|
"@vitejs/plugin-vue": "3.0.3",
|
||||||
"@vue/eslint-config-typescript": "11.0.0",
|
"@vue/eslint-config-typescript": "11.0.0",
|
||||||
"@vue/test-utils": "2.0.2",
|
"@vue/test-utils": "2.0.2",
|
||||||
"@vue/tsconfig": "0.1.3",
|
"@vue/tsconfig": "0.1.3",
|
||||||
"autoprefixer": "10.4.8",
|
"autoprefixer": "10.4.8",
|
||||||
"axios": "0.27.2",
|
"axios": "0.27.2",
|
||||||
"browserslist": "4.21.3",
|
"browserslist": "4.21.3",
|
||||||
"caniuse-lite": "1.0.30001373",
|
"caniuse-lite": "1.0.30001376",
|
||||||
"cypress": "10.3.1",
|
"cypress": "10.6.0",
|
||||||
"esbuild": "0.14.51",
|
"esbuild": "0.15.5",
|
||||||
"eslint": "8.20.0",
|
"eslint": "8.22.0",
|
||||||
"eslint-plugin-vue": "9.3.0",
|
"eslint-plugin-vue": "9.3.0",
|
||||||
"express": "4.18.1",
|
"express": "4.18.1",
|
||||||
"happy-dom": "6.0.4",
|
"happy-dom": "6.0.4",
|
||||||
"netlify-cli": "10.13.0",
|
"netlify-cli": "10.17.4",
|
||||||
"postcss": "8.4.14",
|
"postcss": "8.4.16",
|
||||||
"postcss-preset-env": "7.7.2",
|
"postcss-preset-env": "7.8.0",
|
||||||
"rollup": "2.77.2",
|
"rollup": "2.78.0",
|
||||||
"rollup-plugin-visualizer": "5.7.1",
|
"rollup-plugin-visualizer": "5.7.1",
|
||||||
"sass": "1.54.0",
|
"sass": "1.54.4",
|
||||||
"typescript": "4.7.4",
|
"typescript": "4.7.4",
|
||||||
"vite": "3.0.4",
|
"vite": "3.0.8",
|
||||||
"vite-plugin-pwa": "0.12.3",
|
"vite-plugin-pwa": "0.12.3",
|
||||||
"vite-svg-loader": "3.4.0",
|
"vite-svg-loader": "3.4.0",
|
||||||
"vitest": "0.20.2",
|
"vitest": "0.22.1",
|
||||||
"vue-tsc": "0.39.4",
|
"vue-tsc": "0.40.1",
|
||||||
"wait-on": "6.0.1",
|
"wait-on": "6.0.1",
|
||||||
"workbox-cli": "6.5.3"
|
"workbox-cli": "6.5.4"
|
||||||
},
|
},
|
||||||
"postcss": {
|
"postcss": {
|
||||||
"plugins": {
|
"plugins": {
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
:disabled="disabled || undefined"
|
:disabled="disabled || undefined"
|
||||||
ref="button"
|
ref="button"
|
||||||
>
|
>
|
||||||
<slot />
|
<slot/>
|
||||||
</component>
|
</component>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@ export default defineComponent({
|
||||||
|
|
||||||
// NOTE: Do NOT use buttons with @click to push routes. => Use router-links instead!
|
// NOTE: Do NOT use buttons with @click to push routes. => Use router-links instead!
|
||||||
|
|
||||||
import { ref, watchEffect, computed, useAttrs, PropType } from 'vue'
|
import {ref, watchEffect, computed, useAttrs, PropType} from 'vue'
|
||||||
|
|
||||||
const BASE_BUTTON_TYPES_MAP = Object.freeze({
|
const BASE_BUTTON_TYPES_MAP = Object.freeze({
|
||||||
button: 'button',
|
button: 'button',
|
||||||
|
@ -52,6 +52,7 @@ const props = defineProps({
|
||||||
|
|
||||||
|
|
||||||
const componentNodeName = ref<Node['nodeName']>('button')
|
const componentNodeName = ref<Node['nodeName']>('button')
|
||||||
|
|
||||||
interface ElementBindings {
|
interface ElementBindings {
|
||||||
type?: string;
|
type?: string;
|
||||||
rel?: string;
|
rel?: string;
|
||||||
|
@ -92,6 +93,7 @@ watchEffect(() => {
|
||||||
const isButton = computed(() => componentNodeName.value === 'button')
|
const isButton = computed(() => componentNodeName.value === 'button')
|
||||||
|
|
||||||
const button = ref()
|
const button = ref()
|
||||||
|
|
||||||
function focus() {
|
function focus() {
|
||||||
button.value.focus()
|
button.value.focus()
|
||||||
}
|
}
|
||||||
|
@ -123,7 +125,7 @@ defineExpose({
|
||||||
user-select: none;
|
user-select: none;
|
||||||
pointer-events: auto; // disable possible resets
|
pointer-events: auto; // disable possible resets
|
||||||
|
|
||||||
&:focus {
|
&:focus, &.is-focused {
|
||||||
outline: transparent;
|
outline: transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -243,7 +243,7 @@ function updateActiveLists(namespace: NamespaceModel, activeLists: ListModel[])
|
||||||
const listUpdating = ref<{ [id: NamespaceModel['id']]: boolean }>({})
|
const listUpdating = ref<{ [id: NamespaceModel['id']]: boolean }>({})
|
||||||
|
|
||||||
async function saveListPosition(e: SortableEvent) {
|
async function saveListPosition(e: SortableEvent) {
|
||||||
if (!e.newIndex) return
|
if (!e.newIndex && e.newIndex !== 0) return
|
||||||
|
|
||||||
const namespaceId = parseInt(e.to.dataset.namespaceId as string)
|
const namespaceId = parseInt(e.to.dataset.namespaceId as string)
|
||||||
const newNamespaceIndex = parseInt(e.to.dataset.namespaceIndex as string)
|
const newNamespaceIndex = parseInt(e.to.dataset.namespaceIndex as string)
|
||||||
|
|
|
@ -500,6 +500,14 @@ export default defineComponent({
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Don't load things if we already have something loaded.
|
||||||
|
// This is not the most ideal solution because it prevents a re-population when filters are changed
|
||||||
|
// from the outside. It is still fine because we're not changing them from the outside, other than
|
||||||
|
// loading them initially.
|
||||||
|
if(this[kind].length > 0) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
this[kind] = await this[`${servicePrefix}Service`].getAll({}, {s: this.filters[filterName]})
|
this[kind] = await this[`${servicePrefix}Service`].getAll({}, {s: this.filters[filterName]})
|
||||||
},
|
},
|
||||||
setDoneFilter() {
|
setDoneFilter() {
|
||||||
|
@ -532,6 +540,7 @@ export default defineComponent({
|
||||||
|
|
||||||
if (query === '') {
|
if (query === '') {
|
||||||
this.clear(kind)
|
this.clear(kind)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const response = await this[`${kind}Service`].getAll({}, {s: query})
|
const response = await this[`${kind}Service`].getAll({}, {s: query})
|
||||||
|
@ -558,7 +567,7 @@ export default defineComponent({
|
||||||
|
|
||||||
let ids = []
|
let ids = []
|
||||||
this[kind].forEach(u => {
|
this[kind].forEach(u => {
|
||||||
ids.push(u.id)
|
ids.push(kind === 'users' ? u.username : u.id)
|
||||||
})
|
})
|
||||||
|
|
||||||
this.filters[filterName] = ids.join(',')
|
this.filters[filterName] = ids.join(',')
|
||||||
|
|
|
@ -93,12 +93,9 @@ import {success} from '@/message'
|
||||||
const {t} = useI18n({useScope: 'global'})
|
const {t} = useI18n({useScope: 'global'})
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps<{
|
||||||
task: {
|
task?: TaskModel | null,
|
||||||
type: TaskModel,
|
}>()
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
const taskService = shallowReactive(new TaskService())
|
const taskService = shallowReactive(new TaskService())
|
||||||
|
|
||||||
|
|
|
@ -82,7 +82,7 @@ const props = defineProps({
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
const {t} = useI18n()
|
const {t} = useI18n({useScope: 'global'})
|
||||||
|
|
||||||
const emit = defineEmits(['update:modelValue', 'change'])
|
const emit = defineEmits(['update:modelValue', 'change'])
|
||||||
|
|
||||||
|
|
|
@ -1,13 +1,14 @@
|
||||||
/**
|
/**
|
||||||
* Make date objects from timestamps
|
* Make date objects from timestamps
|
||||||
*/
|
*/
|
||||||
export function parseDateOrNull(date) {
|
export function parseDateOrNull(date) {
|
||||||
if (date instanceof Date) {
|
if (date instanceof Date) {
|
||||||
return date
|
return date
|
||||||
}
|
}
|
||||||
|
|
||||||
if (date && !date.startsWith('0001')) {
|
if ((typeof date === 'string' || date instanceof String) && !date.startsWith('0001')) {
|
||||||
return new Date(date)
|
return new Date(date)
|
||||||
}
|
}
|
||||||
|
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
1032
src/i18n/lang/zh-CN.json
Normal file
1032
src/i18n/lang/zh-CN.json
Normal file
File diff suppressed because it is too large
Load Diff
|
@ -287,6 +287,7 @@ export default {
|
||||||
},
|
},
|
||||||
logout(ctx) {
|
logout(ctx) {
|
||||||
removeToken()
|
removeToken()
|
||||||
|
window.localStorage.clear() // Clear all settings and history we might have saved in local storage.
|
||||||
ctx.dispatch('checkAuth')
|
ctx.dispatch('checkAuth')
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
@ -245,6 +245,7 @@
|
||||||
--border: var(--grey-200);
|
--border: var(--grey-200);
|
||||||
--input-disabled-background-color: var(--grey-100);
|
--input-disabled-background-color: var(--grey-100);
|
||||||
--input-disabled-border-color: var(--grey-300);
|
--input-disabled-border-color: var(--grey-300);
|
||||||
|
--progress-value-background-color: var(--grey-500);
|
||||||
// END Overrides of Bulma defaults
|
// END Overrides of Bulma defaults
|
||||||
|
|
||||||
|
|
||||||
|
@ -286,12 +287,15 @@
|
||||||
// Elements that rely on Bulma defaults in light mode but
|
// Elements that rely on Bulma defaults in light mode but
|
||||||
// need to be overriden in dark mode
|
// need to be overriden in dark mode
|
||||||
--input-placeholder-color: hsla(var(--grey-900-hsl), 0.6);
|
--input-placeholder-color: hsla(var(--grey-900-hsl), 0.6);
|
||||||
--tag-color: var(--grey-800);
|
--tag-color: var(--grey-300);
|
||||||
--table-row-hover-background-color: var(--grey-100);
|
--table-row-hover-background-color: var(--grey-100);
|
||||||
--dropdown-item-hover-background-color: var(--grey-100);
|
--dropdown-item-hover-background-color: var(--grey-100);
|
||||||
--dropdown-item-hover-color: var(--text);
|
--dropdown-item-hover-color: var(--text);
|
||||||
|
--pre-background: var(--grey-200);
|
||||||
--button-text-hover-background-color: var(--grey-200);
|
--button-text-hover-background-color: var(--grey-200);
|
||||||
--button-hover-color: var(--grey-600);
|
--button-hover-color: var(--grey-600);
|
||||||
|
--button-active-color: var(--grey-600);
|
||||||
|
--button-focus-color: var(--grey-600);
|
||||||
|
|
||||||
// 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);
|
||||||
|
|
|
@ -52,11 +52,6 @@ h6 {
|
||||||
margin: 0 0.5rem 0 0;
|
margin: 0 0.5rem 0 0;
|
||||||
flex: 3 1 auto;
|
flex: 3 1 auto;
|
||||||
|
|
||||||
&::-moz-progress-bar,
|
|
||||||
&::-webkit-progress-value {
|
|
||||||
background: var(--grey-500);
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (max-width: $tablet) {
|
@media screen and (max-width: $tablet) {
|
||||||
margin: 0.5rem 0 0 0;
|
margin: 0.5rem 0 0 0;
|
||||||
order: 1;
|
order: 1;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* eslint-disable no-console */
|
/* eslint-disable no-console */
|
||||||
/* eslint-disable no-undef */
|
/* eslint-disable no-undef */
|
||||||
|
|
||||||
const workboxVersion = 'v6.5.3'
|
const workboxVersion = 'v6.5.4'
|
||||||
importScripts( `/workbox-${workboxVersion}/workbox-sw.js`)
|
importScripts( `/workbox-${workboxVersion}/workbox-sw.js`)
|
||||||
workbox.setConfig({
|
workbox.setConfig({
|
||||||
modulePathPrefix: `/workbox-${workboxVersion}`,
|
modulePathPrefix: `/workbox-${workboxVersion}`,
|
||||||
|
|
|
@ -288,19 +288,9 @@ export default defineComponent({
|
||||||
this.$store.commit(HAS_TASKS, true)
|
this.$store.commit(HAS_TASKS, true)
|
||||||
},
|
},
|
||||||
editTask(id) {
|
editTask(id) {
|
||||||
// Find the selected task and set it to the current object
|
this.taskEditTask = {...this.tasks.find(t => t.id === parseInt(id))}
|
||||||
let theTask = this.getTaskById(id) // Somehow this does not work if we directly assign this to this.taskEditTask
|
|
||||||
this.taskEditTask = theTask
|
|
||||||
this.isTaskEdit = true
|
this.isTaskEdit = true
|
||||||
},
|
},
|
||||||
getTaskById(id) {
|
|
||||||
for (const t in this.tasks) {
|
|
||||||
if (this.tasks[t].id === parseInt(id)) {
|
|
||||||
return this.tasks[t]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return {} // FIXME: This should probably throw something to make it clear to the user noting was found
|
|
||||||
},
|
|
||||||
updateTasks(updatedTask) {
|
updateTasks(updatedTask) {
|
||||||
for (const t in this.tasks) {
|
for (const t in this.tasks) {
|
||||||
if (this.tasks[t].id === updatedTask.id) {
|
if (this.tasks[t].id === updatedTask.id) {
|
||||||
|
|
|
@ -71,7 +71,7 @@ import NamespaceModel from '@/models/namespace'
|
||||||
import {useI18n} from 'vue-i18n'
|
import {useI18n} from 'vue-i18n'
|
||||||
import {useTitle} from '@/composables/useTitle'
|
import {useTitle} from '@/composables/useTitle'
|
||||||
|
|
||||||
const {t} = useI18n()
|
const {t} = useI18n({useScope: 'global'})
|
||||||
const store = useStore()
|
const store = useStore()
|
||||||
|
|
||||||
const namespaceService = ref(new NamespaceService())
|
const namespaceService = ref(new NamespaceService())
|
||||||
|
|
|
@ -25,7 +25,7 @@ import {getErrorText} from '@/message'
|
||||||
import Message from '@/components/misc/message.vue'
|
import Message from '@/components/misc/message.vue'
|
||||||
import {clearLastVisited, getLastVisited} from '@/helpers/saveLastVisited'
|
import {clearLastVisited, getLastVisited} from '@/helpers/saveLastVisited'
|
||||||
|
|
||||||
const {t} = useI18n()
|
const {t} = useI18n({useScope: 'global'})
|
||||||
|
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
|
|
Loading…
Reference in New Issue
Block a user