Merge branch 'main' into bulma-css-variables

# Conflicts:
#	package.json
#	src/components/misc/no-auth-wrapper.vue
#	yarn.lock
This commit is contained in:
kolaente 2021-11-22 21:55:23 +01:00
commit 8380e06ed6
Signed by: konrad
GPG Key ID: F40E70337AB24C9B
20 changed files with 2234 additions and 872 deletions

View File

@ -202,6 +202,7 @@ steps:
YARN_CACHE_FOLDER: .cache/yarn/ YARN_CACHE_FOLDER: .cache/yarn/
commands: commands:
- yarn --frozen-lockfile --network-timeout 100000 - yarn --frozen-lockfile --network-timeout 100000
- npx browserslist@latest --update-db
- yarn run lint - yarn run lint
- "echo '{\"VERSION\": \"'$(git describe --tags --always --abbrev=10 | sed 's/-/+/' | sed 's/^v//' | sed 's/-g/-/')'\"}' > src/version.json" - "echo '{\"VERSION\": \"'$(git describe --tags --always --abbrev=10 | sed 's/-/+/' | sed 's/^v//' | sed 's/-g/-/')'\"}' > src/version.json"
- yarn run build - yarn run build

View File

@ -19,15 +19,15 @@
"dependencies": { "dependencies": {
"@github/hotkey": "1.6.0", "@github/hotkey": "1.6.0",
"@kyvg/vue3-notification": "2.3.4", "@kyvg/vue3-notification": "2.3.4",
"@sentry/tracing": "6.14.3", "@sentry/tracing": "6.15.0",
"@sentry/vue": "6.14.3", "@sentry/vue": "6.15.0",
"@vue/compat": "3.2.21", "@vue/compat": "3.2.22",
"@vueuse/core": "^6.8.0", "@vueuse/core": "^6.8.0",
"bulma-css-variables": "^0.9.33", "bulma-css-variables": "^0.9.33",
"camel-case": "4.1.2", "camel-case": "4.1.2",
"codemirror": "5.63.3", "codemirror": "5.64.0",
"copy-to-clipboard": "3.3.1", "copy-to-clipboard": "3.3.1",
"date-fns": "2.25.0", "date-fns": "2.26.0",
"dompurify": "2.3.3", "dompurify": "2.3.3",
"easymde": "2.15.0", "easymde": "2.15.0",
"flatpickr": "4.6.9", "flatpickr": "4.6.9",
@ -36,7 +36,7 @@
"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.3", "marked": "4.0.4",
"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",
@ -44,11 +44,11 @@
"vue-advanced-cropper": "2.7.0", "vue-advanced-cropper": "2.7.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.18", "vue-i18n": "9.2.0-beta.20",
"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",
"workbox-precaching": "6.3.0" "workbox-precaching": "6.4.1"
}, },
"devDependencies": { "devDependencies": {
"@4tw/cypress-drag-drop": "2.0.0", "@4tw/cypress-drag-drop": "2.0.0",
@ -57,37 +57,37 @@
"@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",
"@types/jest": "27.0.2", "@types/jest": "27.0.3",
"@typescript-eslint/eslint-plugin": "5.4.0", "@typescript-eslint/eslint-plugin": "5.4.0",
"@typescript-eslint/parser": "5.4.0", "@typescript-eslint/parser": "5.4.0",
"@vitejs/plugin-legacy": "1.6.2", "@vitejs/plugin-legacy": "1.6.3",
"@vitejs/plugin-vue": "1.9.4", "@vitejs/plugin-vue": "1.10.0",
"@vue/eslint-config-typescript": "9.0.1", "@vue/eslint-config-typescript": "9.1.0",
"autoprefixer": "10.4.0",
"axios": "0.24.0", "axios": "0.24.0",
"browserslist": "4.18.1", "browserslist": "4.18.1",
"cypress": "9.0.0", "cypress": "9.0.0",
"cypress-file-upload": "5.0.8", "cypress-file-upload": "5.0.8",
"esbuild": "0.13.13", "esbuild": "0.13.15",
"eslint": "8.2.0", "eslint": "8.3.0",
"eslint-plugin-vue": "8.0.3", "eslint-plugin-vue": "8.1.1",
"express": "4.17.1", "express": "4.17.1",
"faker": "5.5.3", "faker": "5.5.3",
"jest": "27.3.1", "jest": "27.3.1",
"netlify-cli": "6.14.25", "netlify-cli": "7.0.4",
"postcss": "8.3.11", "postcss": "8.3.11",
"rollup": "2.60.0", "postcss-preset-env": "7.0.1",
"rollup": "2.60.1",
"rollup-plugin-visualizer": "5.5.2", "rollup-plugin-visualizer": "5.5.2",
"sass": "1.43.4", "sass": "1.43.4",
"slugify": "1.6.2", "slugify": "1.6.3",
"ts-jest": "27.0.7", "ts-jest": "27.0.7",
"typescript": "4.4.4", "typescript": "4.5.2",
"vite": "2.6.14", "vite": "2.6.14",
"vite-plugin-pwa": "0.11.5", "vite-plugin-pwa": "0.11.6",
"vite-svg-loader": "3.1.0", "vite-svg-loader": "3.1.0",
"vue-tsc": "0.29.5", "vue-tsc": "0.29.6",
"wait-on": "6.0.0", "wait-on": "6.0.0",
"workbox-cli": "6.3.0" "workbox-cli": "6.4.1"
}, },
"eslintConfig": { "eslintConfig": {
"root": true, "root": true,

View File

@ -38,6 +38,7 @@ const motd = computed(() => store.state.config.motd)
} }
.logo { .logo {
max-width: 100%;
color: var(--logo-text-color); color: var(--logo-text-color);
} }
</style> </style>

View File

@ -500,7 +500,6 @@ $gantt-vertical-border-color: var(--grey-100);
.tasks { .tasks {
max-width: unset !important; max-width: unset !important;
margin: 0;
border-top: $gantt-border; border-top: $gantt-border;
.row { .row {

View File

@ -306,24 +306,16 @@ export default {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.media.comment { .media-left {
align-items: center; margin: 0 1rem;
}
.media-left { .comment-info {
margin: 0 1rem; display: flex;
} align-items: center;
gap: .5rem;
.comment-info {
display: flex;
align-items: center;
* {
padding-right: .5rem;
}
img {
display: none;
img {
@media screen and (max-width: $tablet) { @media screen and (max-width: $tablet) {
display: block; display: block;
width: 20px; width: 20px;
@ -331,22 +323,20 @@ export default {
padding-right: 0; padding-right: 0;
margin-right: .5rem; margin-right: .5rem;
} }
}
@media screen and (min-width: $tablet) {
display: none;
}
}
span { span {
font-size: .75rem; font-size: .75rem;
line-height: 1; line-height: 1;
} }
}
.editor {
margin-top: .5rem;
}
} }
.media-content { .media-content {
width: calc(100% - 48px - 2rem); width: calc(100% - 48px - 2rem);
} }
</style> </style>

View File

@ -7,7 +7,7 @@
:class="{'disabled': !canWrite}" :class="{'disabled': !canWrite}"
@blur="save($event.target.textContent)" @blur="save($event.target.textContent)"
@keydown.enter.prevent.stop="$event.target.blur()" @keydown.enter.prevent.stop="$event.target.blur()"
:contenteditable="canWrite ? 'true' : 'false'" :contenteditable="canWrite ? true : undefined"
:spellcheck="false" :spellcheck="false"
> >
{{ task.title.trim() }} {{ task.title.trim() }}

View File

@ -1,5 +1,6 @@
<template> <template>
<div <div
class="task loader-container draggable"
:class="{ :class="{
'is-loading': loadingInternal || loading, 'is-loading': loadingInternal || loading,
'draggable': !(loadingInternal || loading), 'draggable': !(loadingInternal || loading),
@ -9,7 +10,6 @@
@click.ctrl="() => toggleTaskDone(task)" @click.ctrl="() => toggleTaskDone(task)"
@click.exact="() => $router.push({ name: 'task.kanban.detail', params: { id: task.id } })" @click.exact="() => $router.push({ name: 'task.kanban.detail', params: { id: task.id } })"
@click.meta="() => toggleTaskDone(task)" @click.meta="() => toggleTaskDone(task)"
class="task loader-container draggable"
> >
<span class="task-id"> <span class="task-id">
<Done class="kanban-card__done" :is-done="task.done" variant="small" /> <Done class="kanban-card__done" :is-done="task.done" variant="small" />

View File

@ -319,6 +319,10 @@ export default {
margin: 0; margin: 0;
} }
.tasks {
padding: .5rem;
}
.task { .task {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;

View File

@ -7,6 +7,10 @@ export const ERROR_NO_API_URL = 'noApiUrlProvided'
const updateConfig = () => store.dispatch('config/update') const updateConfig = () => store.dispatch('config/update')
export const checkAndSetApiUrl = (url: string): Promise<string> => { export const checkAndSetApiUrl = (url: string): Promise<string> => {
if(url.startsWith('/')) {
url = window.location.host + url
}
// Check if the url has an http prefix // Check if the url has an http prefix
if ( if (
!url.startsWith('http://') && !url.startsWith('http://') &&

View File

@ -7,6 +7,8 @@ import {REPEAT_MODE_DEFAULT} from './constants/taskRepeatModes'
import SubscriptionModel from '@/models/subscription' import SubscriptionModel from '@/models/subscription'
import {parseDateOrNull} from '@/helpers/parseDateOrNull' import {parseDateOrNull} from '@/helpers/parseDateOrNull'
const SUPPORTS_TRIGGERED_NOTIFICATION = 'Notification' in window && 'showTrigger' in Notification.prototype
export default class TaskModel extends AbstractModel { export default class TaskModel extends AbstractModel {
defaultColor = '198CFF' defaultColor = '198CFF'
@ -161,7 +163,7 @@ export default class TaskModel extends AbstractModel {
} }
async cancelScheduledNotifications() { async cancelScheduledNotifications() {
if (!(Notification && 'showTrigger' in Notification.prototype)) { if (!SUPPORTS_TRIGGERED_NOTIFICATION) {
console.debug('This browser does not support triggered notifications') console.debug('This browser does not support triggered notifications')
return return
} }
@ -196,7 +198,7 @@ export default class TaskModel extends AbstractModel {
return return
} }
if (!(Notification && 'showTrigger' in Notification.prototype)) { if (!SUPPORTS_TRIGGERED_NOTIFICATION) {
console.debug('This browser does not support triggered notifications') console.debug('This browser does not support triggered notifications')
return return
} }

View File

@ -37,8 +37,8 @@ export default {
update(label) update(label)
}, },
removeLabelById(state, label) { removeLabelById(state, label) {
delete state.labels[label.id]
remove(label) remove(label)
delete state.labels[label.id]
}, },
setLoaded(state, loaded) { setLoaded(state, loaded) {
state.loaded = loaded state.loaded = loaded

View File

@ -23,8 +23,8 @@ export default {
}) })
}, },
removeListById(state, list) { removeListById(state, list) {
delete state[list.id]
remove(list) remove(list)
delete state[list.id]
}, },
}, },
getters: { getters: {

View File

@ -55,8 +55,8 @@ export default {
removeNamespaceById(state, namespaceId) { removeNamespaceById(state, namespaceId) {
for (const n in state.namespaces) { for (const n in state.namespaces) {
if (state.namespaces[n].id === namespaceId) { if (state.namespaces[n].id === namespaceId) {
state.namespaces.splice(n, 1)
remove(state.namespaces[n]) remove(state.namespaces[n])
state.namespaces.splice(n, 1)
return return
} }
} }

View File

@ -2,8 +2,6 @@
// very hard to untangle // very hard to untangle
// they have many overwrites at different positions // they have many overwrites at different positions
.tasks { .tasks {
margin-top: 1rem;
padding: 0;
text-align: left; text-align: left;
@ -26,19 +24,6 @@
margin: 1rem -0.5rem; margin: 1rem -0.5rem;
} }
.task {
margin: 0 .5rem;
&:first-child {
margin-top: .5rem;
}
&:last-child {
margin-bottom: .5rem;
border-bottom: none;
}
}
.checklist-summary { .checklist-summary {
padding-left: .5rem; padding-left: .5rem;
font-size: .9rem; font-size: .9rem;

View File

@ -1,7 +1,7 @@
/* eslint-disable no-console */ /* eslint-disable no-console */
/* eslint-disable no-undef */ /* eslint-disable no-undef */
const workboxVersion = 'v6.3.0' const workboxVersion = 'v6.4.1'
importScripts( `/workbox-${workboxVersion}/workbox-sw.js`) importScripts( `/workbox-${workboxVersion}/workbox-sw.js`)
workbox.setConfig({ workbox.setConfig({
modulePathPrefix: `/workbox-${workboxVersion}`, modulePathPrefix: `/workbox-${workboxVersion}`,

View File

@ -43,7 +43,7 @@
@blur="saveBucketTitle(bucket.id, $event.target.textContent)" @blur="saveBucketTitle(bucket.id, $event.target.textContent)"
@click="focusBucketTitle" @click="focusBucketTitle"
class="title input" class="title input"
:contenteditable="(bucketTitleEditable && canWrite && !collapsedBuckets[bucket.id]) ? 'true' : 'false'" :contenteditable="(bucketTitleEditable && canWrite && !collapsedBuckets[bucket.id]) ? true : undefined"
:spellcheck="false">{{ bucket.title }}</h2> :spellcheck="false">{{ bucket.title }}</h2>
<span <span
:class="{'is-max': bucket.tasks.length >= bucket.limit}" :class="{'is-max': bucket.tasks.length >= bucket.limit}"
@ -635,7 +635,6 @@ $filter-container-height: '1rem - #{$switch-view-height}';
.tasks { .tasks {
max-height: calc(#{$crazy-height-calculation-tasks}); max-height: calc(#{$crazy-height-calculation-tasks});
overflow: auto; overflow: auto;
margin-top: 0;
@media screen and (max-width: $tablet) { @media screen and (max-width: $tablet) {
max-height: calc(#{$crazy-height-calculation-tasks} - #{$filter-container-height}); max-height: calc(#{$crazy-height-calculation-tasks} - #{$filter-container-height});

View File

@ -323,6 +323,7 @@ export default {
.tasks { .tasks {
width: 100%; width: 100%;
padding: .5rem;
.ghost { .ghost {
border-radius: $radius; border-radius: $radius;

View File

@ -31,12 +31,12 @@
<color-picker v-model="namespace.hexColor" /> <color-picker v-model="namespace.hexColor" />
</div> </div>
</div> </div>
<p
class="is-small has-text-centered" <div class="notification is-info mt-4">
v-tooltip.bottom="$t('namespace.create.explanation')" <h4 class="title">{{ $t('namespace.create.tooltip') }}</h4>
>
{{ $t('namespace.create.tooltip') }} {{ $t('namespace.create.explanation') }}
</p> </div>
</create-edit> </create-edit>
</template> </template>

View File

@ -271,6 +271,10 @@ h3 {
} }
} }
.tasks {
padding: .5rem;
}
.llama-cool { .llama-cool {
margin-top: 2rem; margin-top: 2rem;
} }

2950
yarn.lock

File diff suppressed because it is too large Load Diff