forked from vikunja/frontend
Compare commits
7 Commits
034a30046c
...
52b0a4c6ac
Author | SHA1 | Date | |
---|---|---|---|
|
52b0a4c6ac | ||
|
9f9c942c73 | ||
|
d363cfc972 | ||
|
c3c22bf202 | ||
|
5d36d9399d | ||
|
f70932dd39 | ||
|
4642ce2b0f |
|
@ -5,10 +5,18 @@ root = true
|
|||
|
||||
[*]
|
||||
indent_style = tab
|
||||
end_of_line = crlf
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = false
|
||||
insert_final_newline = false
|
||||
|
||||
[*.vue]
|
||||
indent_style = tab
|
||||
|
||||
[*.{yaml,yml}]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
[*.json]
|
||||
indent_style = space
|
||||
indent_size = 4
|
|
@ -1,5 +1,5 @@
|
|||
module.exports = {
|
||||
presets: [
|
||||
'@vue/app'
|
||||
]
|
||||
'@vue/app',
|
||||
],
|
||||
}
|
||||
|
|
195
package.json
195
package.json
|
@ -1,96 +1,109 @@
|
|||
{
|
||||
"name": "vikunja-frontend",
|
||||
"version": "0.10.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"serve": "vue-cli-service serve",
|
||||
"serve:dist": "node scripts/serve-dist.js",
|
||||
"build": "vue-cli-service build --modern",
|
||||
"build:report": "vue-cli-service build --report",
|
||||
"lint": "vue-cli-service lint --ignore-pattern '*.test.*'",
|
||||
"cypress:open": "cypress open",
|
||||
"test:unit": "jest",
|
||||
"test:frontend": "cypress run"
|
||||
},
|
||||
"dependencies": {
|
||||
"browserslist": "4.16.6",
|
||||
"bulma": "0.9.2",
|
||||
"camel-case": "4.1.2",
|
||||
"copy-to-clipboard": "3.3.1",
|
||||
"date-fns": "2.22.1",
|
||||
"dompurify": "2.2.9",
|
||||
"highlight.js": "11.0.0",
|
||||
"lodash": "4.17.21",
|
||||
"marked": "2.0.7",
|
||||
"register-service-worker": "1.7.2",
|
||||
"sass": "1.34.0",
|
||||
"snake-case": "3.0.4",
|
||||
"verte": "0.0.12",
|
||||
"vue": "2.6.13",
|
||||
"vue-advanced-cropper": "1.6.0",
|
||||
"vue-drag-resize": "1.5.4",
|
||||
"vue-easymde": "1.4.0",
|
||||
"vue-shortkey": "3.1.7",
|
||||
"vue-smooth-dnd": "0.8.1",
|
||||
"vuex": "3.6.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@fortawesome/fontawesome-svg-core": "1.2.35",
|
||||
"@fortawesome/free-regular-svg-icons": "5.15.3",
|
||||
"@fortawesome/free-solid-svg-icons": "5.15.3",
|
||||
"@fortawesome/vue-fontawesome": "2.0.2",
|
||||
"@vue/cli": "4.5.13",
|
||||
"@vue/cli-plugin-babel": "4.5.13",
|
||||
"@vue/cli-plugin-eslint": "4.5.13",
|
||||
"@vue/cli-plugin-pwa": "4.5.13",
|
||||
"@vue/cli-service": "4.5.13",
|
||||
"axios": "0.21.1",
|
||||
"babel-eslint": "10.1.0",
|
||||
"cypress": "7.4.0",
|
||||
"cypress-file-upload": "5.0.7",
|
||||
"eslint": "7.27.0",
|
||||
"eslint-plugin-vue": "7.10.0",
|
||||
"faker": "5.5.3",
|
||||
"jest": "27.0.3",
|
||||
"sass-loader": "10.2.0",
|
||||
"vue-flatpickr-component": "8.1.6",
|
||||
"vue-notification": "1.3.20",
|
||||
"vue-router": "3.5.1",
|
||||
"vue-template-compiler": "2.6.13",
|
||||
"wait-on": "5.3.0"
|
||||
},
|
||||
"eslintConfig": {
|
||||
"root": true,
|
||||
"env": {
|
||||
"node": true
|
||||
"name": "vikunja-frontend",
|
||||
"version": "0.10.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"serve": "vue-cli-service serve",
|
||||
"serve:dist": "node scripts/serve-dist.js",
|
||||
"build": "vue-cli-service build --modern",
|
||||
"build:report": "vue-cli-service build --report",
|
||||
"lint": "vue-cli-service lint --ignore-pattern '*.test.*'",
|
||||
"cypress:open": "cypress open",
|
||||
"test:unit": "jest",
|
||||
"test:frontend": "cypress run"
|
||||
},
|
||||
"extends": [
|
||||
"plugin:vue/essential",
|
||||
"eslint:recommended"
|
||||
"dependencies": {
|
||||
"browserslist": "4.16.6",
|
||||
"bulma": "0.9.2",
|
||||
"camel-case": "4.1.2",
|
||||
"copy-to-clipboard": "3.3.1",
|
||||
"date-fns": "2.22.1",
|
||||
"dompurify": "2.2.9",
|
||||
"highlight.js": "11.0.0",
|
||||
"lodash": "4.17.21",
|
||||
"marked": "2.0.7",
|
||||
"register-service-worker": "1.7.2",
|
||||
"sass": "1.34.0",
|
||||
"snake-case": "3.0.4",
|
||||
"verte": "0.0.12",
|
||||
"vue": "2.6.13",
|
||||
"vue-advanced-cropper": "1.6.0",
|
||||
"vue-drag-resize": "1.5.4",
|
||||
"vue-easymde": "1.4.0",
|
||||
"vue-shortkey": "3.1.7",
|
||||
"vue-smooth-dnd": "0.8.1",
|
||||
"vuex": "3.6.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@fortawesome/fontawesome-svg-core": "1.2.35",
|
||||
"@fortawesome/free-regular-svg-icons": "5.15.3",
|
||||
"@fortawesome/free-solid-svg-icons": "5.15.3",
|
||||
"@fortawesome/vue-fontawesome": "2.0.2",
|
||||
"@vue/cli": "4.5.13",
|
||||
"@vue/cli-plugin-babel": "4.5.13",
|
||||
"@vue/cli-plugin-eslint": "4.5.13",
|
||||
"@vue/cli-plugin-pwa": "4.5.13",
|
||||
"@vue/cli-service": "4.5.13",
|
||||
"axios": "0.21.1",
|
||||
"babel-eslint": "10.1.0",
|
||||
"cypress": "7.4.0",
|
||||
"cypress-file-upload": "5.0.7",
|
||||
"eslint": "7.27.0",
|
||||
"eslint-plugin-vue": "7.10.0",
|
||||
"faker": "5.5.3",
|
||||
"jest": "27.0.3",
|
||||
"sass-loader": "10.2.0",
|
||||
"vue-flatpickr-component": "8.1.6",
|
||||
"vue-notification": "1.3.20",
|
||||
"vue-router": "3.5.1",
|
||||
"vue-template-compiler": "2.6.13",
|
||||
"wait-on": "5.3.0"
|
||||
},
|
||||
"eslintConfig": {
|
||||
"root": true,
|
||||
"env": {
|
||||
"node": true
|
||||
},
|
||||
"extends": [
|
||||
"plugin:vue/essential",
|
||||
"eslint:recommended"
|
||||
],
|
||||
"rules": {
|
||||
"vue/html-quotes": [
|
||||
"error",
|
||||
"double"
|
||||
],
|
||||
"quotes": [
|
||||
"error",
|
||||
"single"
|
||||
],
|
||||
"comma-dangle": [
|
||||
"error",
|
||||
"always-multiline"
|
||||
]
|
||||
},
|
||||
"parserOptions": {
|
||||
"parser": "babel-eslint"
|
||||
},
|
||||
"ignorePatterns": [
|
||||
"*.test.js",
|
||||
"cypress/*"
|
||||
]
|
||||
},
|
||||
"postcss": {
|
||||
"plugins": {
|
||||
"autoprefixer": {}
|
||||
}
|
||||
},
|
||||
"browserslist": [
|
||||
"> 1%",
|
||||
"last 2 versions",
|
||||
"not ie < 11"
|
||||
],
|
||||
"rules": {},
|
||||
"parserOptions": {
|
||||
"parser": "babel-eslint"
|
||||
},
|
||||
"ignorePatterns": [
|
||||
"*.test.js",
|
||||
"cypress/*"
|
||||
]
|
||||
},
|
||||
"postcss": {
|
||||
"plugins": {
|
||||
"autoprefixer": {}
|
||||
"license": "AGPL-3.0-or-later",
|
||||
"jest": {
|
||||
"testPathIgnorePatterns": [
|
||||
"cypress"
|
||||
]
|
||||
}
|
||||
},
|
||||
"browserslist": [
|
||||
"> 1%",
|
||||
"last 2 versions",
|
||||
"not ie < 11"
|
||||
],
|
||||
"license": "AGPL-3.0-or-later",
|
||||
"jest": {
|
||||
"testPathIgnorePatterns": [
|
||||
"cypress"
|
||||
]
|
||||
}
|
||||
}
|
|
@ -55,7 +55,7 @@ export default {
|
|||
computed: {
|
||||
showIconOnly() {
|
||||
return this.icon !== '' && typeof this.$slots.default === 'undefined'
|
||||
}
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
click(e) {
|
||||
|
|
|
@ -145,16 +145,16 @@ export default {
|
|||
},
|
||||
props: {
|
||||
value: {
|
||||
validator: prop => prop instanceof Date || prop === null || typeof prop === 'string'
|
||||
validator: prop => prop instanceof Date || prop === null || typeof prop === 'string',
|
||||
},
|
||||
chooseDateLabel: {
|
||||
type: String,
|
||||
default: 'Choose a date'
|
||||
default: 'Choose a date',
|
||||
},
|
||||
disabled: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
}
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
this.setDateValue(this.value)
|
||||
|
|
|
@ -363,7 +363,7 @@ export default {
|
|||
link: (href, title, text) => {
|
||||
const isLocal = href.startsWith(`${location.protocol}//${location.hostname}`)
|
||||
const html = linkRenderer.call(renderer, href, title, text)
|
||||
return isLocal ? html : html.replace(/^<a /, `<a target="_blank" rel="noreferrer noopener nofollow" `)
|
||||
return isLocal ? html : html.replace(/^<a /, '<a target="_blank" rel="noreferrer noopener nofollow" ')
|
||||
},
|
||||
},
|
||||
highlight: function (code, language) {
|
||||
|
|
|
@ -108,21 +108,21 @@ export default {
|
|||
type: Boolean,
|
||||
default() {
|
||||
return false
|
||||
}
|
||||
},
|
||||
},
|
||||
// The placeholder of the search input
|
||||
placeholder: {
|
||||
type: String,
|
||||
default() {
|
||||
return ''
|
||||
}
|
||||
},
|
||||
},
|
||||
// The search results where the @search listener needs to put the results into
|
||||
searchResults: {
|
||||
type: Array,
|
||||
default() {
|
||||
return []
|
||||
}
|
||||
},
|
||||
},
|
||||
// The name of the property of the searched object to show the user.
|
||||
// If empty the component will show all raw data of an entry.
|
||||
|
@ -130,13 +130,13 @@ export default {
|
|||
type: String,
|
||||
default() {
|
||||
return ''
|
||||
}
|
||||
},
|
||||
},
|
||||
// The object with the value, updated every time an entry is selected.
|
||||
value: {
|
||||
default() {
|
||||
return null
|
||||
}
|
||||
},
|
||||
},
|
||||
// If true, will provide an "add this as a new value" entry which fires an @create event when clicking on it.
|
||||
creatable: {
|
||||
|
|
|
@ -22,7 +22,7 @@ export default {
|
|||
type: String,
|
||||
required: false,
|
||||
default: '',
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
|
|
@ -6,6 +6,6 @@
|
|||
|
||||
<script>
|
||||
export default {
|
||||
name: 'nothing'
|
||||
name: 'nothing',
|
||||
}
|
||||
</script>
|
||||
|
|
|
@ -14,7 +14,7 @@ export default {
|
|||
keys: {
|
||||
type: Array,
|
||||
required: true,
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
|
|
@ -115,7 +115,7 @@ export default {
|
|||
.catch(e => {
|
||||
this.error(e, this)
|
||||
})
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
|
|
@ -382,7 +382,7 @@ export default {
|
|||
reset() {
|
||||
this.query = ''
|
||||
this.selectedCmd = null
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
|
|
@ -250,7 +250,7 @@ export default {
|
|||
this.showNewForm = false
|
||||
this.success(
|
||||
{message: 'The link share was successfully created'},
|
||||
this
|
||||
this,
|
||||
)
|
||||
this.load()
|
||||
})
|
||||
|
@ -268,7 +268,7 @@ export default {
|
|||
.then(() => {
|
||||
this.success(
|
||||
{message: 'The link share was successfully deleted'},
|
||||
this
|
||||
this,
|
||||
)
|
||||
this.load()
|
||||
})
|
||||
|
|
|
@ -202,11 +202,11 @@ export default {
|
|||
this.searchLabel = 'username'
|
||||
|
||||
if (this.type === 'list') {
|
||||
this.typeString = `list`
|
||||
this.typeString = 'list'
|
||||
this.stuffService = new UserListService()
|
||||
this.stuffModel = new UserListModel({listId: this.id})
|
||||
} else if (this.type === 'namespace') {
|
||||
this.typeString = `namespace`
|
||||
this.typeString = 'namespace'
|
||||
this.stuffService = new UserNamespaceService()
|
||||
this.stuffModel = new UserNamespaceModel({
|
||||
namespaceId: this.id,
|
||||
|
@ -220,11 +220,11 @@ export default {
|
|||
this.searchLabel = 'name'
|
||||
|
||||
if (this.type === 'list') {
|
||||
this.typeString = `list`
|
||||
this.typeString = 'list'
|
||||
this.stuffService = new TeamListService()
|
||||
this.stuffModel = new TeamListModel({listId: this.id})
|
||||
} else if (this.type === 'namespace') {
|
||||
this.typeString = `namespace`
|
||||
this.typeString = 'namespace'
|
||||
this.stuffService = new TeamNamespaceService()
|
||||
this.stuffModel = new TeamNamespaceModel({
|
||||
namespaceId: this.id,
|
||||
|
@ -245,7 +245,7 @@ export default {
|
|||
.then((r) => {
|
||||
this.$set(this, 'sharables', r)
|
||||
r.forEach((s) =>
|
||||
this.$set(this.selectedRight, s.id, s.right)
|
||||
this.$set(this.selectedRight, s.id, s.right),
|
||||
)
|
||||
})
|
||||
.catch((e) => {
|
||||
|
@ -302,7 +302,7 @@ export default {
|
|||
this.shareType +
|
||||
' was successfully added.',
|
||||
},
|
||||
this
|
||||
this,
|
||||
)
|
||||
this.load()
|
||||
})
|
||||
|
@ -347,7 +347,7 @@ export default {
|
|||
this.shareType +
|
||||
' right was successfully updated.',
|
||||
},
|
||||
this
|
||||
this,
|
||||
)
|
||||
})
|
||||
.catch((e) => {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<template>
|
||||
<div class="field is-grouped">
|
||||
<div class="field is-grouped" v-if="validListIdAvailable">
|
||||
<p
|
||||
:class="{ 'is-loading': taskService.loading }"
|
||||
class="control has-icons-left is-expanded"
|
||||
|
@ -31,35 +31,37 @@
|
|||
</template>
|
||||
|
||||
<script>
|
||||
import LabelTask from "../../models/labelTask";
|
||||
import LabelModel from "../../models/label";
|
||||
import LabelTask from '../../models/labelTask';
|
||||
import LabelModel from '../../models/label';
|
||||
|
||||
import { HAS_TASKS } from "@/store/mutation-types";
|
||||
import { HAS_TASKS } from '@/store/mutation-types';
|
||||
// import Nothing from "@/components/misc/nothing";
|
||||
|
||||
import ListService from "../../services/list";
|
||||
import TaskService from "../../services/task";
|
||||
import TaskModel from "../../models/task";
|
||||
import LabelService from "../../services/label";
|
||||
import LabelTaskService from "../../services/labelTask";
|
||||
import ListService from '../../services/list';
|
||||
import TaskService from '../../services/task';
|
||||
import TaskModel from '../../models/task';
|
||||
import LabelService from '../../services/label';
|
||||
import LabelTaskService from '../../services/labelTask';
|
||||
|
||||
export default {
|
||||
name: "add-task",
|
||||
name: 'add-task',
|
||||
data() {
|
||||
return {
|
||||
newTaskText: "",
|
||||
newTaskText: '',
|
||||
listService: ListService,
|
||||
taskService: TaskService,
|
||||
labelService: LabelService,
|
||||
labelTaskService: LabelTaskService
|
||||
labelTaskService: LabelTaskService,
|
||||
listIdForNewTask: undefined,
|
||||
validListIdAvailable: false,
|
||||
};
|
||||
},
|
||||
components: {},
|
||||
props: {
|
||||
listId: {
|
||||
type: Number,
|
||||
required: false
|
||||
}
|
||||
required: false,
|
||||
},
|
||||
},
|
||||
created() {
|
||||
this.listService = new ListService();
|
||||
|
@ -67,32 +69,33 @@ export default {
|
|||
this.labelService = new LabelService();
|
||||
this.labelTaskService = new LabelTaskService();
|
||||
},
|
||||
beforeMount() {
|
||||
console.log(this.listId);
|
||||
if (this.listId !== undefined) {
|
||||
this.listIdForNewTask = this.listId;
|
||||
this.validListIdAvailable = true;
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
addTask() {
|
||||
if (this.newTaskText === "") {
|
||||
if (this.newTaskText === '') {
|
||||
this.showError = true;
|
||||
return;
|
||||
}
|
||||
this.showError = false;
|
||||
|
||||
let task = new TaskModel({
|
||||
const task = new TaskModel({
|
||||
title: this.newTaskText,
|
||||
listId: this.listId
|
||||
listId: this.listIdForNewTask,
|
||||
});
|
||||
|
||||
if (this.listId === undefined) {
|
||||
// TODO: Have a default list in settings.
|
||||
task.listId = 1;
|
||||
}
|
||||
this.taskService
|
||||
.create(task)
|
||||
.then(task => {
|
||||
// this.tasks.push(task);
|
||||
// this.sortTasks();
|
||||
this.newTaskText = "";
|
||||
this.newTaskText = '';
|
||||
|
||||
// Check if the task has words starting with ~ in the title and make them to labels
|
||||
const parts = task.title.split(" ~");
|
||||
const parts = task.title.split(' ~');
|
||||
// The first element will always contain the title, even if there is no occurrence of ~
|
||||
if (parts.length > 1) {
|
||||
// First, create an unresolved promise for each entry in the array to wait
|
||||
|
@ -107,7 +110,7 @@ export default {
|
|||
labelAddsToWaitFor.push(
|
||||
new Promise((resolve, reject) => {
|
||||
labelAddings.push({ resolve: resolve, reject: reject });
|
||||
})
|
||||
}),
|
||||
);
|
||||
});
|
||||
|
||||
|
@ -118,10 +121,10 @@ export default {
|
|||
}
|
||||
|
||||
// The part up until the next space
|
||||
const labelTitle = p.split(" ")[0];
|
||||
const labelTitle = p.split(' ')[0];
|
||||
|
||||
// Don't create an empty label
|
||||
if (labelTitle === "") {
|
||||
if (labelTitle === '') {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -133,7 +136,7 @@ export default {
|
|||
if (res.length > 0 && res[0].title === labelTitle) {
|
||||
const labelTask = new LabelTask({
|
||||
taskId: task.id,
|
||||
labelId: res[0].id
|
||||
labelId: res[0].id,
|
||||
});
|
||||
this.labelTaskService
|
||||
.create(labelTask)
|
||||
|
@ -141,7 +144,7 @@ export default {
|
|||
task.labels.push(res[0]);
|
||||
|
||||
// Remove the label text from the task title
|
||||
task.title = task.title.replace(` ~${labelTitle}`, "");
|
||||
task.title = task.title.replace(` ~${labelTitle}`, '');
|
||||
|
||||
// Make the promise done (the one with the index 0 does not exist)
|
||||
labelAddings[index - 1].resolve(result);
|
||||
|
@ -157,7 +160,7 @@ export default {
|
|||
.then(res => {
|
||||
const labelTask = new LabelTask({
|
||||
taskId: task.id,
|
||||
labelId: res.id
|
||||
labelId: res.id,
|
||||
});
|
||||
this.labelTaskService
|
||||
.create(labelTask)
|
||||
|
@ -167,7 +170,7 @@ export default {
|
|||
// Remove the label text from the task title
|
||||
task.title = task.title.replace(
|
||||
` ~${labelTitle}`,
|
||||
""
|
||||
'',
|
||||
);
|
||||
|
||||
// Make the promise done (the one with the index 0 does not exist)
|
||||
|
@ -192,10 +195,6 @@ export default {
|
|||
Promise.all(labelAddsToWaitFor).then(() => {
|
||||
this.taskService
|
||||
.update(task)
|
||||
// .then(updatedTask => {
|
||||
// this.updateTasks(updatedTask);
|
||||
// this.$store.commit(HAS_TASKS, true);
|
||||
// })
|
||||
.then(() => {
|
||||
this.$store.commit(HAS_TASKS, true);
|
||||
})
|
||||
|
@ -204,12 +203,12 @@ export default {
|
|||
});
|
||||
});
|
||||
}
|
||||
this.$emit("taskAdded", task);
|
||||
this.$emit('taskAdded', task);
|
||||
})
|
||||
.catch(e => {
|
||||
this.error(e, this);
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
|
|
@ -387,7 +387,7 @@ export default {
|
|||
|
||||
let startDate = new Date(this.startDate)
|
||||
startDate.setDate(
|
||||
startDate.getDate() + newRect.left / this.dayWidth
|
||||
startDate.getDate() + newRect.left / this.dayWidth,
|
||||
)
|
||||
startDate.setUTCHours(0)
|
||||
startDate.setUTCMinutes(0)
|
||||
|
@ -396,7 +396,7 @@ export default {
|
|||
this.taskDragged.startDate = startDate
|
||||
let endDate = new Date(startDate)
|
||||
endDate.setDate(
|
||||
startDate.getDate() + newRect.width / this.dayWidth
|
||||
startDate.getDate() + newRect.width / this.dayWidth,
|
||||
)
|
||||
this.taskDragged.startDate = startDate
|
||||
this.taskDragged.endDate = endDate
|
||||
|
@ -439,7 +439,7 @@ export default {
|
|||
this.$set(
|
||||
this.theTasks,
|
||||
tt,
|
||||
this.addGantAttributes(r)
|
||||
this.addGantAttributes(r),
|
||||
)
|
||||
break
|
||||
}
|
||||
|
|
|
@ -224,7 +224,7 @@ export default {
|
|||
.then((r) => {
|
||||
this.$store.commit(
|
||||
'attachments/removeById',
|
||||
this.attachmentToDelete.id
|
||||
this.attachmentToDelete.id,
|
||||
)
|
||||
this.success(r, this)
|
||||
})
|
||||
|
|
|
@ -260,7 +260,7 @@ export default {
|
|||
this.newComment.comment = ''
|
||||
this.success(
|
||||
{message: 'The comment was added successfully.'},
|
||||
this
|
||||
this,
|
||||
)
|
||||
})
|
||||
.catch((e) => {
|
||||
|
|
|
@ -91,7 +91,7 @@ export default {
|
|||
.finally(() => {
|
||||
this.saving = false
|
||||
})
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
|
|
@ -95,7 +95,7 @@ export default {
|
|||
.finally(() => {
|
||||
this.saving = false
|
||||
})
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
|
|
@ -135,7 +135,7 @@ export default {
|
|||
showListColor: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
}
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
theTask(newVal) {
|
||||
|
@ -183,7 +183,7 @@ export default {
|
|||
callback: () => {
|
||||
this.task.done = !this.task.done
|
||||
this.markAsDone(!checked)
|
||||
}
|
||||
},
|
||||
}],
|
||||
)
|
||||
})
|
||||
|
|
|
@ -12,7 +12,7 @@ export const createDateFromString = dateString => {
|
|||
}
|
||||
|
||||
if (dateString.includes('-')) {
|
||||
dateString = dateString.replace(/-/g, "/")
|
||||
dateString = dateString.replace(/-/g, '/')
|
||||
}
|
||||
|
||||
return new Date(dateString)
|
||||
|
|
|
@ -170,7 +170,7 @@ export default new Router({
|
|||
name: 'list.create',
|
||||
components: {
|
||||
popup: NewListComponent,
|
||||
}
|
||||
},
|
||||
},
|
||||
{
|
||||
path: '/namespaces/:id/settings/edit',
|
||||
|
|
|
@ -69,6 +69,6 @@ export default {
|
|||
ctx.commit('setList', list)
|
||||
return Promise.reject(e)
|
||||
})
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
|
@ -1,11 +1,11 @@
|
|||
<template>
|
||||
<div class="content has-text-centered">
|
||||
<h2>
|
||||
{{ welcomePrefix }}
|
||||
{{ userInfo.name !== "" ? userInfo.name : userInfo.username }}!
|
||||
Hi {{ userInfo.name !== '' ? userInfo.name : userInfo.username }}!
|
||||
</h2>
|
||||
<div>{{ defaultListId }}</div>
|
||||
<add-task
|
||||
:list="defaultList"
|
||||
:listId="defaultListId"
|
||||
@taskAdded="updateTaskList"
|
||||
class="is-max-width-desktop"
|
||||
/>
|
||||
|
@ -35,38 +35,27 @@
|
|||
</template>
|
||||
|
||||
<script>
|
||||
import { mapState } from "vuex";
|
||||
import ShowTasks from "./tasks/ShowTasks";
|
||||
import AddTask from "../components/tasks/add-task";
|
||||
import ListModel from "../models/list";
|
||||
import { mapState } from 'vuex';
|
||||
import ShowTasks from './tasks/ShowTasks';
|
||||
import AddTask from '../components/tasks/add-task';
|
||||
|
||||
export default {
|
||||
name: "Home",
|
||||
name: 'Home',
|
||||
components: {
|
||||
ShowTasks,
|
||||
AddTask
|
||||
AddTask,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
loading: false,
|
||||
currentDate: new Date(),
|
||||
tasks: [],
|
||||
defaultList: ListModel,
|
||||
updateWelcomeInterval: 1000,
|
||||
welcomePrefix: "Hi",
|
||||
showTasksKey: 0
|
||||
defaultListId: undefined,
|
||||
showTasksKey: 0,
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.defaultList = new ListModel();
|
||||
this.defaultList.id = 1;
|
||||
},
|
||||
mounted() {
|
||||
const timer = window.setTimeout(
|
||||
this.updateWelcome,
|
||||
this.updateWelcomeInterval
|
||||
);
|
||||
this.$on("hook:destroyed", () => window.clearTimeout(timer));
|
||||
//TODO: Load the value from user settings. Until then it will not render the add task component.
|
||||
},
|
||||
computed: mapState({
|
||||
migratorsEnabled: state =>
|
||||
|
@ -88,26 +77,12 @@ export default {
|
|||
}
|
||||
|
||||
return state.namespaces.namespaces[0].lists.length > 0;
|
||||
}
|
||||
},
|
||||
}),
|
||||
methods: {
|
||||
updateTaskList() {
|
||||
this.showTasksKey += 1;
|
||||
},
|
||||
updateWelcome() {
|
||||
this.currentDate = new Date();
|
||||
if (this.currentDate.getHours() < 12) {
|
||||
this.welcomePrefix = "Good Morning";
|
||||
} else if (this.currentDate.getHours() < 17) {
|
||||
this.welcomePrefix = "Good Afternoon";
|
||||
} else {
|
||||
this.welcomePrefix = "Good Evening";
|
||||
}
|
||||
this.$options.timer = window.setTimeout(
|
||||
this.updateDateTime,
|
||||
this.updateWelcomeInterval
|
||||
);
|
||||
}
|
||||
}
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
|
|
@ -79,7 +79,7 @@ export default {
|
|||
})
|
||||
this.success(
|
||||
{ message: 'The label was successfully created.' },
|
||||
this
|
||||
this,
|
||||
)
|
||||
})
|
||||
.catch((e) => {
|
||||
|
|
|
@ -71,7 +71,7 @@ export default {
|
|||
.then((r) => {
|
||||
this.success(
|
||||
{ message: 'The list was successfully created.' },
|
||||
this
|
||||
this,
|
||||
)
|
||||
this.$router.push({
|
||||
name: 'list.index',
|
||||
|
|
|
@ -165,36 +165,36 @@
|
|||
</template>
|
||||
|
||||
<script>
|
||||
import TaskService from "../../../services/task";
|
||||
import TaskModel from "../../../models/task";
|
||||
import LabelTaskService from "../../../services/labelTask";
|
||||
import LabelService from "../../../services/label";
|
||||
import TaskService from '../../../services/task';
|
||||
import TaskModel from '../../../models/task';
|
||||
import LabelTaskService from '../../../services/labelTask';
|
||||
import LabelService from '../../../services/label';
|
||||
|
||||
import EditTask from "../../../components/tasks/edit-task";
|
||||
import AddTask from "../../../components/tasks/add-task";
|
||||
import SingleTaskInList from "../../../components/tasks/partials/singleTaskInList";
|
||||
import taskList from "../../../components/tasks/mixins/taskList";
|
||||
import { saveListView } from "@/helpers/saveListView";
|
||||
import Rights from "../../../models/rights.json";
|
||||
import { mapState } from "vuex";
|
||||
import FilterPopup from "@/components/list/partials/filter-popup";
|
||||
import { HAS_TASKS } from "@/store/mutation-types";
|
||||
import Nothing from "@/components/misc/nothing";
|
||||
import EditTask from '../../../components/tasks/edit-task';
|
||||
import AddTask from '../../../components/tasks/add-task';
|
||||
import SingleTaskInList from '../../../components/tasks/partials/singleTaskInList';
|
||||
import taskList from '../../../components/tasks/mixins/taskList';
|
||||
import { saveListView } from '@/helpers/saveListView';
|
||||
import Rights from '../../../models/rights.json';
|
||||
import { mapState } from 'vuex';
|
||||
import FilterPopup from '@/components/list/partials/filter-popup';
|
||||
import { HAS_TASKS } from '@/store/mutation-types';
|
||||
import Nothing from '@/components/misc/nothing';
|
||||
|
||||
export default {
|
||||
name: "List",
|
||||
name: 'List',
|
||||
data() {
|
||||
return {
|
||||
taskService: TaskService,
|
||||
isTaskEdit: false,
|
||||
taskEditTask: TaskModel,
|
||||
newTaskText: "",
|
||||
newTaskText: '',
|
||||
|
||||
showError: false,
|
||||
labelTaskService: LabelTaskService,
|
||||
labelService: LabelService,
|
||||
|
||||
ctaVisible: false
|
||||
ctaVisible: false,
|
||||
};
|
||||
},
|
||||
mixins: [taskList],
|
||||
|
@ -203,7 +203,7 @@ export default {
|
|||
FilterPopup,
|
||||
SingleTaskInList,
|
||||
EditTask,
|
||||
AddTask
|
||||
AddTask,
|
||||
},
|
||||
created() {
|
||||
this.taskService = new TaskService();
|
||||
|
@ -216,14 +216,14 @@ export default {
|
|||
},
|
||||
computed: mapState({
|
||||
canWrite: state => state.currentList.maxRight > Rights.READ,
|
||||
list: state => state.currentList
|
||||
list: state => state.currentList,
|
||||
}),
|
||||
mounted() {
|
||||
this.$nextTick(() => (this.ctaVisible = true));
|
||||
},
|
||||
methods: {
|
||||
// This function initializes the tasks page and loads the first page of tasks
|
||||
initTasks(page, search = "") {
|
||||
initTasks(page, search = '') {
|
||||
this.taskEditTask = null;
|
||||
this.isTaskEdit = false;
|
||||
this.loadTasks(page, search);
|
||||
|
@ -255,7 +255,7 @@ export default {
|
|||
}
|
||||
}
|
||||
this.sortTasks();
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
|
|
@ -82,7 +82,7 @@ export default {
|
|||
this.$store.commit('namespaces/addNamespace', r)
|
||||
this.success(
|
||||
{ message: 'The namespace was successfully created.' },
|
||||
this
|
||||
this,
|
||||
)
|
||||
this.$router.back()
|
||||
})
|
||||
|
|
|
@ -637,7 +637,7 @@ export default {
|
|||
this.$refs[fieldName].$el.scrollIntoView({
|
||||
behavior: 'smooth',
|
||||
block: 'center',
|
||||
inline: 'nearest'
|
||||
inline: 'nearest',
|
||||
})
|
||||
}
|
||||
})
|
||||
|
|
|
@ -265,7 +265,7 @@ export default {
|
|||
this.team = response
|
||||
this.success(
|
||||
{message: 'The team was successfully updated.'},
|
||||
this
|
||||
this,
|
||||
)
|
||||
})
|
||||
.catch((e) => {
|
||||
|
@ -278,7 +278,7 @@ export default {
|
|||
.then(() => {
|
||||
this.success(
|
||||
{message: 'The team was successfully deleted.'},
|
||||
this
|
||||
this,
|
||||
)
|
||||
router.push({name: 'teams.index'})
|
||||
})
|
||||
|
@ -295,7 +295,7 @@ export default {
|
|||
message:
|
||||
'The user was successfully deleted from the team.',
|
||||
},
|
||||
this
|
||||
this,
|
||||
)
|
||||
this.loadTeam()
|
||||
})
|
||||
|
@ -317,7 +317,7 @@ export default {
|
|||
this.loadTeam()
|
||||
this.success(
|
||||
{message: 'The team member was successfully added.'},
|
||||
this
|
||||
this,
|
||||
)
|
||||
})
|
||||
.catch((e) => {
|
||||
|
@ -343,7 +343,7 @@ export default {
|
|||
(member.admin ? 'admin' : 'member') +
|
||||
'.',
|
||||
},
|
||||
this
|
||||
this,
|
||||
)
|
||||
})
|
||||
.catch((e) => {
|
||||
|
|
|
@ -69,7 +69,7 @@ export default {
|
|||
})
|
||||
this.success(
|
||||
{ message: 'The team was successfully created.' },
|
||||
this
|
||||
this,
|
||||
)
|
||||
})
|
||||
.catch((e) => {
|
||||
|
|
|
@ -127,7 +127,7 @@ export default {
|
|||
let emailVerifyToken = localStorage.getItem('emailConfirmToken')
|
||||
if (emailVerifyToken) {
|
||||
const cancel = message.setLoading(this)
|
||||
HTTP.post(`user/confirm`, {token: emailVerifyToken})
|
||||
HTTP.post('user/confirm', {token: emailVerifyToken})
|
||||
.then(() => {
|
||||
localStorage.removeItem('emailConfirmToken')
|
||||
this.confirmedEmailSuccess = true
|
||||
|
|
|
@ -320,7 +320,7 @@ export default {
|
|||
migratorsEnabled: state => state.config.availableMigrators !== null && state.config.availableMigrators.length > 0,
|
||||
caldavEnabled: state => state.config.caldavEnabled,
|
||||
userInfo: state => state.auth.info,
|
||||
})
|
||||
}),
|
||||
},
|
||||
methods: {
|
||||
updatePassword() {
|
||||
|
|
|
@ -20,22 +20,22 @@ module.exports = {
|
|||
msTileImage: 'images/icons/msapplication-icon-144x144.png',
|
||||
},
|
||||
manifestOptions: {
|
||||
"icons": [
|
||||
'icons': [
|
||||
{
|
||||
"src": "./images/icons/android-chrome-192x192.png",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png"
|
||||
'src': './images/icons/android-chrome-192x192.png',
|
||||
'sizes': '192x192',
|
||||
'type': 'image/png',
|
||||
},
|
||||
{
|
||||
"src": "./images/icons/android-chrome-512x512.png",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png"
|
||||
'src': './images/icons/android-chrome-512x512.png',
|
||||
'sizes': '512x512',
|
||||
'type': 'image/png',
|
||||
},
|
||||
{
|
||||
"src": "./images/icons/icon-maskable.png",
|
||||
"sizes": "1024x1024",
|
||||
"type": "image/png",
|
||||
"purpose": "maskable"
|
||||
'src': './images/icons/icon-maskable.png',
|
||||
'sizes': '1024x1024',
|
||||
'type': 'image/png',
|
||||
'purpose': 'maskable',
|
||||
},
|
||||
],
|
||||
shortcuts: [
|
||||
|
@ -62,8 +62,8 @@ module.exports = {
|
|||
name: 'Teams Overview',
|
||||
short_name: 'Teams',
|
||||
url: '/teams',
|
||||
}
|
||||
]
|
||||
},
|
||||
],
|
||||
},
|
||||
}
|
||||
},
|
||||
}
|
Loading…
Reference in New Issue
Block a user