forked from vikunja/frontend
Compare commits
16 Commits
main
...
feature/vi
Author | SHA1 | Date | |
---|---|---|---|
04e88be8ce | |||
16b2e14841 | |||
5661acef36 | |||
7e112ccd6d | |||
cd2f691178 | |||
04e0462cee | |||
515eb28ba6 | |||
aa52e29402 | |||
978de3bfac | |||
8d1572ba47 | |||
037338b8e3 | |||
e7d24da035 | |||
006e9e8146 | |||
51c3b0dc36 | |||
b1afc5b1b7 | |||
ee4b231afb |
18
.drone.yml
18
.drone.yml
|
@ -37,7 +37,7 @@ steps:
|
|||
- '.cache'
|
||||
|
||||
- name: dependencies
|
||||
image: node:12
|
||||
image: node:14
|
||||
pull: true
|
||||
environment:
|
||||
YARN_CACHE_FOLDER: .cache/yarn/
|
||||
|
@ -68,7 +68,7 @@ steps:
|
|||
- dependencies
|
||||
|
||||
- name: build
|
||||
image: node:12
|
||||
image: node:14
|
||||
pull: true
|
||||
environment:
|
||||
YARN_CACHE_FOLDER: .cache/yarn/
|
||||
|
@ -80,7 +80,7 @@ steps:
|
|||
- dependencies
|
||||
|
||||
- name: test-unit
|
||||
image: node:12
|
||||
image: node:14
|
||||
pull: true
|
||||
commands:
|
||||
- yarn test:unit
|
||||
|
@ -88,7 +88,7 @@ steps:
|
|||
- dependencies
|
||||
|
||||
- name: test-frontend
|
||||
image: cypress/browsers:node12.18.3-chrome87-ff82
|
||||
image: cypress/browsers:node14.15.0-chrome86-ff82
|
||||
pull: true
|
||||
environment:
|
||||
CYPRESS_API_URL: http://api:3456/api/v1
|
||||
|
@ -97,11 +97,11 @@ steps:
|
|||
CYPRESS_CACHE_FOLDER: .cache/cypress/
|
||||
CYPRESS_DEFAULT_COMMAND_TIMEOUT: 10000
|
||||
commands:
|
||||
- sed -i 's/localhost/api/g' public/index.html
|
||||
- yarn serve & npx wait-on http://localhost:8080
|
||||
- sed -i 's/localhost/api/g' index.html
|
||||
- yarn serve & npx wait-on http://localhost:5000
|
||||
- yarn test:frontend --browser chrome
|
||||
depends_on:
|
||||
- dependencies
|
||||
- build
|
||||
|
||||
- name: upload-test-results
|
||||
image: plugins/s3:1
|
||||
|
@ -163,7 +163,7 @@ steps:
|
|||
- '.cache'
|
||||
|
||||
- name: build
|
||||
image: node:12
|
||||
image: node:14
|
||||
pull: true
|
||||
group: build-static
|
||||
environment:
|
||||
|
@ -238,7 +238,7 @@ steps:
|
|||
- '.cache'
|
||||
|
||||
- name: build
|
||||
image: node:12
|
||||
image: node:14
|
||||
pull: true
|
||||
group: build-static
|
||||
environment:
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
# Stage 1: Build application
|
||||
FROM node:13.14.0 AS compile-image
|
||||
FROM node:14 AS compile-image
|
||||
|
||||
WORKDIR /build
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"baseUrl": "http://localhost:8080",
|
||||
"baseUrl": "http://localhost:5000",
|
||||
"env": {
|
||||
"API_URL": "http://localhost:3456/api/v1",
|
||||
"TEST_SECRET": "testingS3cr3et"
|
||||
|
|
35
index.html
Normal file
35
index.html
Normal file
|
@ -0,0 +1,35 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Vikunja</title>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<meta name="description" content="Vikunja (/vɪˈkuːnjə/) - The to-do app to organize your life.">
|
||||
|
||||
<link rel="icon" href="/favicon.ico">
|
||||
<link rel="preload" crossorigin="anonymous" href="/fonts/open-sans-v15-latin-700italic.woff2" as="font">
|
||||
<link rel="preload" crossorigin="anonymous" href="/fonts/open-sans-v15-latin-italic.woff2" as="font">
|
||||
<link rel="preload" crossorigin="anonymous" href="/fonts/quicksand-v7-latin-300.woff2" as="font">
|
||||
<link rel="preload" crossorigin="anonymous" href="/fonts/quicksand-v7-latin-500.woff2" as="font">
|
||||
<link rel="preload" crossorigin="anonymous" href="/fonts/quicksand-v7-latin-700.woff2" as="font">
|
||||
<link rel="preload" crossorigin="anonymous" href="/fonts/open-sans-v15-latin-regular.woff2" as="font">
|
||||
<link rel="preload" crossorigin="anonymous" href="/fonts/open-sans-v15-latin-700.woff2" as="font">
|
||||
<link rel="preload" crossorigin="anonymous" href="/fonts/quicksand-v7-latin-regular.woff2" as="font">
|
||||
</head>
|
||||
<body>
|
||||
<noscript>
|
||||
<strong>We're sorry but Vikunja doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
|
||||
</noscript>
|
||||
<div id="app"></div>
|
||||
<script type="module" src="./src/main.js"></script>
|
||||
<script>
|
||||
//
|
||||
// This variable points the frontend to the api.
|
||||
// It has to be the full url, including the last /api/v1 part and port.
|
||||
// You can change this if your api is not reachable on the same port as the frontend.
|
||||
window.API_URL = 'http://localhost:3456/api/v1'
|
||||
//
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
15
package.json
15
package.json
|
@ -3,9 +3,9 @@
|
|||
"version": "0.10.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"serve": "vue-cli-service serve",
|
||||
"serve": "npx vite preview",
|
||||
"serve:dist": "node scripts/serve-dist.js",
|
||||
"build": "vue-cli-service build --modern",
|
||||
"build": "npx workbox copyLibraries dist/ && npx vite build",
|
||||
"build:report": "vue-cli-service build --report",
|
||||
"lint": "vue-cli-service lint --ignore-pattern '*.test.*'",
|
||||
"cypress:open": "cypress open",
|
||||
|
@ -30,7 +30,8 @@
|
|||
"vue-easymde": "1.3.2",
|
||||
"vue-shortkey": "3.1.7",
|
||||
"vue-smooth-dnd": "0.8.1",
|
||||
"vuex": "3.6.2"
|
||||
"vuex": "3.6.2",
|
||||
"workbox-precaching": "^6.1.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@fortawesome/fontawesome-svg-core": "1.2.34",
|
||||
|
@ -46,17 +47,23 @@
|
|||
"babel-eslint": "10.1.0",
|
||||
"cypress": "6.6.0",
|
||||
"cypress-file-upload": "5.0.2",
|
||||
"esbuild": "0.8.51",
|
||||
"eslint": "7.21.0",
|
||||
"eslint-plugin-vue": "7.7.0",
|
||||
"faker": "5.4.0",
|
||||
"jest": "26.6.3",
|
||||
"node-sass": "5.0.0",
|
||||
"sass": "1.32.8",
|
||||
"sass-loader": "10.1.1",
|
||||
"vite": "2.0.2",
|
||||
"vite-plugin-pwa": "0.5.6",
|
||||
"vite-plugin-vue2": "1.2.1",
|
||||
"vue-flatpickr-component": "8.1.6",
|
||||
"vue-notification": "1.3.20",
|
||||
"vue-router": "3.5.1",
|
||||
"vue-template-compiler": "2.6.12",
|
||||
"wait-on": "5.2.1"
|
||||
"wait-on": "5.2.1",
|
||||
"workbox-cli": "6.1.1"
|
||||
},
|
||||
"eslintConfig": {
|
||||
"root": true,
|
||||
|
|
|
@ -16,9 +16,6 @@
|
|||
height="1066.6667"
|
||||
viewBox="0 0 1066.6667 1066.6667"
|
||||
sodipodi:docname="llama-nightscape.svg"
|
||||
inkscape:export-filename="/home/konrad/www/vikunja/frontend/public/images/llama-nightscape.png"
|
||||
inkscape:export-xdpi="172.8"
|
||||
inkscape:export-ydpi="172.8"
|
||||
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"><metadata
|
||||
id="metadata8"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
|
|
Before Width: | Height: | Size: 174 KiB After Width: | Height: | Size: 174 KiB |
|
@ -1,36 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Vikunja</title>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<meta name="description" content="Vikunja (/vɪˈkuːnjə/) - The to-do app to organize your life.">
|
||||
<meta name="hash" content="<%= webpack.hash %>"/>
|
||||
|
||||
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
|
||||
<link rel="preload" crossorigin="anonymous" href="<%= BASE_URL %>fonts/open-sans-v15-latin-700italic.woff2" as="font">
|
||||
<link rel="preload" crossorigin="anonymous" href="<%= BASE_URL %>fonts/open-sans-v15-latin-italic.woff2" as="font">
|
||||
<link rel="preload" crossorigin="anonymous" href="<%= BASE_URL %>fonts/quicksand-v7-latin-300.woff2" as="font">
|
||||
<link rel="preload" crossorigin="anonymous" href="<%= BASE_URL %>fonts/quicksand-v7-latin-500.woff2" as="font">
|
||||
<link rel="preload" crossorigin="anonymous" href="<%= BASE_URL %>fonts/quicksand-v7-latin-700.woff2" as="font">
|
||||
<link rel="preload" crossorigin="anonymous" href="<%= BASE_URL %>fonts/open-sans-v15-latin-regular.woff2" as="font">
|
||||
<link rel="preload" crossorigin="anonymous" href="<%= BASE_URL %>fonts/open-sans-v15-latin-700.woff2" as="font">
|
||||
<link rel="preload" crossorigin="anonymous" href="<%= BASE_URL %>fonts/quicksand-v7-latin-regular.woff2" as="font">
|
||||
</head>
|
||||
<body>
|
||||
<noscript>
|
||||
<strong>We're sorry but Vikunja doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
|
||||
</noscript>
|
||||
<div id="app"></div>
|
||||
<!-- built files will be auto injected -->
|
||||
<script>
|
||||
//
|
||||
// This variable points the frontend to the api.
|
||||
// It has to be the full url, including the last /api/v1 part and port.
|
||||
// You can change this if your api is not reachable on the same port as the frontend.
|
||||
window.API_URL = 'http://localhost:3456/api/v1'
|
||||
//
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
|
@ -3,7 +3,7 @@ const express = require('express')
|
|||
const app = express()
|
||||
|
||||
const p = path.join(__dirname, '..', 'dist')
|
||||
const port = 8080
|
||||
const port = 8000
|
||||
|
||||
app.use(express.static(p))
|
||||
// Handle urls set by the frontend
|
||||
|
|
|
@ -30,10 +30,10 @@ import authTypes from './models/authTypes'
|
|||
import Notification from './components/misc/notification'
|
||||
import {KEYBOARD_SHORTCUTS_ACTIVE, ONLINE} from './store/mutation-types'
|
||||
import KeyboardShortcuts from './components/misc/keyboard-shortcuts'
|
||||
import TopNavigation from '@/components/home/topNavigation'
|
||||
import ContentAuth from '@/components/home/contentAuth'
|
||||
import ContentLinkShare from '@/components/home/contentLinkShare'
|
||||
import ContentNoAuth from '@/components/home/contentNoAuth'
|
||||
import TopNavigation from './components/home/topNavigation'
|
||||
import ContentAuth from './components/home/contentAuth'
|
||||
import ContentLinkShare from './components/home/contentLinkShare'
|
||||
import ContentNoAuth from './components/home/contentNoAuth'
|
||||
|
||||
export default {
|
||||
name: 'app',
|
||||
|
|
|
@ -1,6 +1,12 @@
|
|||
/* eslint-disable no-console */
|
||||
/* eslint-disable no-undef */
|
||||
|
||||
importScripts( "/workbox-v6.1.1/workbox-sw.js");
|
||||
workbox.setConfig({modulePathPrefix: "/workbox-v6.1.1"});
|
||||
|
||||
import { precacheAndRoute } from 'workbox-precaching'
|
||||
precacheAndRoute(self.__WB_MANIFEST)
|
||||
|
||||
// Cache assets
|
||||
workbox.routing.registerRoute(
|
||||
// This regexp matches all files in precache-manifest
|
||||
|
|
|
@ -37,7 +37,7 @@
|
|||
<script>
|
||||
import {mapState} from 'vuex'
|
||||
import {CURRENT_LIST, MENU_ACTIVE} from '@/store/mutation-types'
|
||||
import Navigation from '@/components/home/navigation'
|
||||
import Navigation from '@/components/home/navigation.vue'
|
||||
|
||||
export default {
|
||||
name: 'contentAuth',
|
||||
|
|
|
@ -115,7 +115,7 @@
|
|||
<script>
|
||||
import {mapState} from 'vuex'
|
||||
import {CURRENT_LIST, MENU_ACTIVE, LOADING, LOADING_MODULE} from '@/store/mutation-types'
|
||||
import ListSettingsDropdown from '@/components/list/list-settings-dropdown'
|
||||
import ListSettingsDropdown from '@/components/list/list-settings-dropdown.vue'
|
||||
import NamespaceSettingsDropdown from '@/components/namespace/namespace-settings-dropdown.vue'
|
||||
|
||||
export default {
|
||||
|
|
|
@ -84,10 +84,10 @@
|
|||
import {mapState} from 'vuex'
|
||||
import {CURRENT_LIST} from '@/store/mutation-types'
|
||||
import Rights from '@/models/rights.json'
|
||||
import Update from '@/components/home/update'
|
||||
import ListSettingsDropdown from '@/components/list/list-settings-dropdown'
|
||||
import Dropdown from '@/components/misc/dropdown'
|
||||
import Notifications from '@/components/notifications/notifications'
|
||||
import Update from '@/components/home/update.vue'
|
||||
import ListSettingsDropdown from '@/components/list/list-settings-dropdown.vue'
|
||||
import Dropdown from '@/components/misc/dropdown.vue'
|
||||
import Notifications from '@/components/notifications/notifications.vue'
|
||||
|
||||
export default {
|
||||
name: 'topNavigation',
|
||||
|
|
|
@ -26,7 +26,6 @@
|
|||
|
||||
<script>
|
||||
import verte from 'verte'
|
||||
import 'verte/dist/verte.css'
|
||||
|
||||
export default {
|
||||
name: 'colorPicker',
|
||||
|
@ -91,6 +90,8 @@ export default {
|
|||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
@import 'verte/dist/verte.css';
|
||||
|
||||
.verte.is-empty {
|
||||
.verte__icon {
|
||||
opacity: 0;
|
||||
|
|
|
@ -75,9 +75,9 @@
|
|||
|
||||
<script>
|
||||
import {getSavedFilterIdFromListId} from '@/helpers/savedFilter'
|
||||
import Dropdown from '@/components/misc/dropdown'
|
||||
import DropdownItem from '@/components/misc/dropdown-item'
|
||||
import TaskSubscription from '@/components/misc/subscription'
|
||||
import Dropdown from '@/components/misc/dropdown.vue'
|
||||
import DropdownItem from '@/components/misc/dropdown-item.vue'
|
||||
import TaskSubscription from '@/components/misc/subscription.vue'
|
||||
|
||||
export default {
|
||||
name: 'list-settings-dropdown',
|
||||
|
|
|
@ -185,9 +185,9 @@ import 'flatpickr/dist/flatpickr.css'
|
|||
import {formatISO} from 'date-fns'
|
||||
import differenceWith from 'lodash/differenceWith'
|
||||
|
||||
import PrioritySelect from '@/components/tasks/partials/prioritySelect'
|
||||
import PercentDoneSelect from '@/components/tasks/partials/percentDoneSelect'
|
||||
import Multiselect from '@/components/input/multiselect'
|
||||
import PrioritySelect from '@/components/tasks/partials/prioritySelect.vue'
|
||||
import PercentDoneSelect from '@/components/tasks/partials/percentDoneSelect.vue'
|
||||
import Multiselect from '@/components/input/multiselect.vue'
|
||||
|
||||
import UserService from '@/services/user'
|
||||
import LabelService from '@/services/label'
|
||||
|
|
|
@ -53,7 +53,7 @@
|
|||
|
||||
<script>
|
||||
import {KEYBOARD_SHORTCUTS_ACTIVE} from '@/store/mutation-types'
|
||||
import Shortcut from '@/components/misc/shortcut'
|
||||
import Shortcut from '@/components/misc/shortcut.vue'
|
||||
|
||||
export default {
|
||||
name: 'keyboard-shortcuts',
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
import NamespaceService from '../../services/namespace'
|
||||
import NamespaceModel from '../../models/namespace'
|
||||
|
||||
import Multiselect from '@/components/input/multiselect'
|
||||
import Multiselect from '@/components/input/multiselect.vue'
|
||||
|
||||
export default {
|
||||
name: 'namespace-search',
|
||||
|
|
|
@ -53,9 +53,9 @@
|
|||
</template>
|
||||
|
||||
<script>
|
||||
import Dropdown from '@/components/misc/dropdown'
|
||||
import DropdownItem from '@/components/misc/dropdown-item'
|
||||
import TaskSubscription from '@/components/misc/subscription'
|
||||
import Dropdown from '@/components/misc/dropdown.vue'
|
||||
import DropdownItem from '@/components/misc/dropdown-item.vue'
|
||||
import TaskSubscription from '@/components/misc/subscription.vue'
|
||||
|
||||
export default {
|
||||
name: 'namespace-settings-dropdown',
|
||||
|
|
|
@ -41,7 +41,7 @@
|
|||
|
||||
<script>
|
||||
import NotificationService from '@/services/notification'
|
||||
import User from '@/components/misc/user'
|
||||
import User from '@/components/misc/user.vue'
|
||||
import names from '@/models/notificationNames.json'
|
||||
import {closeWhenClickedOutside} from '@/helpers/closeWhenClickedOutside'
|
||||
import {mapState} from 'vuex'
|
||||
|
|
|
@ -148,8 +148,8 @@ import TeamService from '../../services/team'
|
|||
import TeamModel from '../../models/team'
|
||||
|
||||
import rights from '../../models/rights'
|
||||
import Multiselect from '@/components/input/multiselect'
|
||||
import Nothing from '@/components/misc/nothing'
|
||||
import Multiselect from '@/components/input/multiselect.vue'
|
||||
import Nothing from '@/components/misc/nothing.vue'
|
||||
|
||||
export default {
|
||||
name: 'userTeamShare',
|
||||
|
|
|
@ -201,7 +201,7 @@ import PriorityLabel from './partials/priorityLabel'
|
|||
import TaskCollectionService from '../../services/taskCollection'
|
||||
import {mapState} from 'vuex'
|
||||
import Rights from '../../models/rights.json'
|
||||
import FilterPopup from '@/components/list/partials/filter-popup'
|
||||
import FilterPopup from '@/components/list/partials/filter-popup.vue'
|
||||
|
||||
export default {
|
||||
name: 'GanttChart',
|
||||
|
|
|
@ -28,8 +28,8 @@
|
|||
</template>
|
||||
|
||||
<script>
|
||||
import LoadingComponent from '@/components/misc/loading'
|
||||
import ErrorComponent from '@/components/misc/error'
|
||||
import LoadingComponent from '@/components/misc/loading.vue'
|
||||
import ErrorComponent from '@/components/misc/error.vue'
|
||||
|
||||
import {LOADING} from '@/store/mutation-types'
|
||||
import {mapState} from 'vuex'
|
||||
|
@ -38,7 +38,7 @@ export default {
|
|||
name: 'description',
|
||||
components: {
|
||||
editor: () => ({
|
||||
component: import(/* webpackChunkName: "editor" */ '@/components/input/editor'),
|
||||
component: import(/* webpackChunkName: "editor" */ '@/components/input/editor.vue'),
|
||||
loading: LoadingComponent,
|
||||
error: ErrorComponent,
|
||||
timeout: 60000,
|
||||
|
|
|
@ -29,7 +29,7 @@ import UserModel from '../../../models/user'
|
|||
import ListUserService from '../../../services/listUsers'
|
||||
import TaskAssigneeService from '../../../services/taskAssignee'
|
||||
import User from '../../misc/user'
|
||||
import Multiselect from '@/components/input/multiselect'
|
||||
import Multiselect from '@/components/input/multiselect.vue'
|
||||
|
||||
export default {
|
||||
name: 'editAssignees',
|
||||
|
|
|
@ -43,7 +43,7 @@ import LabelService from '../../../services/label'
|
|||
import LabelModel from '../../../models/label'
|
||||
import LabelTaskService from '../../../services/labelTask'
|
||||
|
||||
import Multiselect from '@/components/input/multiselect'
|
||||
import Multiselect from '@/components/input/multiselect.vue'
|
||||
|
||||
export default {
|
||||
name: 'edit-labels',
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
<script>
|
||||
import ListService from '../../../services/list'
|
||||
import ListModel from '../../../models/list'
|
||||
import Multiselect from '@/components/input/multiselect'
|
||||
import Multiselect from '@/components/input/multiselect.vue'
|
||||
|
||||
export default {
|
||||
name: 'listSearch',
|
||||
|
|
|
@ -123,7 +123,7 @@ import TaskRelationService from '../../../services/taskRelation'
|
|||
import relationKinds from '../../../models/relationKinds'
|
||||
import TaskRelationModel from '../../../models/taskRelation'
|
||||
|
||||
import Multiselect from '@/components/input/multiselect'
|
||||
import Multiselect from '@/components/input/multiselect.vue'
|
||||
|
||||
export default {
|
||||
name: 'relatedTasks',
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
</template>
|
||||
|
||||
<script>
|
||||
import datepicker from '@/components/input/datepicker'
|
||||
import datepicker from '@/components/input/datepicker.vue'
|
||||
|
||||
export default {
|
||||
name: 'reminders',
|
||||
|
|
|
@ -160,10 +160,10 @@ Vue.component('icon', FontAwesomeIcon)
|
|||
|
||||
Vue.use(vueShortkey, { prevent: ['input', 'textarea', '.input'] })
|
||||
|
||||
import focus from '@/directives/focus'
|
||||
import focus from './directives/focus'
|
||||
Vue.directive('focus', focus)
|
||||
|
||||
import tooltip from '@/directives/tooltip'
|
||||
import tooltip from './directives/tooltip'
|
||||
Vue.directive('tooltip', tooltip)
|
||||
|
||||
const formatDate = (date, f) => {
|
||||
|
@ -173,10 +173,10 @@ const formatDate = (date, f) => {
|
|||
return date ? format(date, f) : ''
|
||||
}
|
||||
|
||||
import Button from '@/components/input/button'
|
||||
import Button from './components/input/button'
|
||||
Vue.component('x-button', Button)
|
||||
|
||||
import Card from '@/components/misc/card'
|
||||
import Card from './components/misc/card'
|
||||
Vue.component('card', Card)
|
||||
|
||||
Vue.mixin({
|
||||
|
|
|
@ -4,7 +4,7 @@ import {register} from 'register-service-worker'
|
|||
import swEvents from './ServiceWorker/events'
|
||||
|
||||
if (process.env.NODE_ENV === 'production') {
|
||||
register(`${process.env.BASE_URL}sw.js`, {
|
||||
register('/sw.js', {
|
||||
ready() {
|
||||
console.log('App is being served from cache by a service worker.')
|
||||
},
|
||||
|
|
|
@ -8,7 +8,7 @@ import ErrorComponent from '../components/misc/error'
|
|||
// User Handling
|
||||
import LoginComponent from '../views/user/Login'
|
||||
import RegisterComponent from '../views/user/Register'
|
||||
import OpenIdAuth from '@/views/user/OpenIdAuth'
|
||||
import OpenIdAuth from '../views/user/OpenIdAuth'
|
||||
// Tasks
|
||||
import ShowTasksInRangeComponent from '../views/tasks/ShowTasksInRange'
|
||||
import LinkShareAuthComponent from '../views/sharing/LinkSharingAuth'
|
||||
|
@ -30,63 +30,63 @@ import List from '../views/list/views/List'
|
|||
import Gantt from '../views/list/views/Gantt'
|
||||
import Table from '../views/list/views/Table'
|
||||
// List Settings
|
||||
import ListSettingEdit from '@/views/list/settings/edit'
|
||||
import ListSettingBackground from '@/views/list/settings/background'
|
||||
import ListSettingDuplicate from '@/views/list/settings/duplicate'
|
||||
import ListSettingShare from '@/views/list/settings/share'
|
||||
import ListSettingDelete from '@/views/list/settings/delete'
|
||||
import ListSettingArchive from '@/views/list/settings/archive'
|
||||
import FilterSettingEdit from '@/views/filters/settings/edit'
|
||||
import FilterSettingDelete from '@/views/filters/settings/delete'
|
||||
import ListSettingEdit from '../views/list/settings/edit'
|
||||
import ListSettingBackground from '../views/list/settings/background'
|
||||
import ListSettingDuplicate from '../views/list/settings/duplicate'
|
||||
import ListSettingShare from '../views/list/settings/share'
|
||||
import ListSettingDelete from '../views/list/settings/delete'
|
||||
import ListSettingArchive from '../views/list/settings/archive'
|
||||
import FilterSettingEdit from '../views/filters/settings/edit'
|
||||
import FilterSettingDelete from '../views/filters/settings/delete'
|
||||
// Namespace Settings
|
||||
import NamespaceSettingEdit from '@/views/namespaces/settings/edit'
|
||||
import NamespaceSettingShare from '@/views/namespaces/settings/share'
|
||||
import NamespaceSettingArchive from '@/views/namespaces/settings/archive'
|
||||
import NamespaceSettingDelete from '@/views/namespaces/settings/delete'
|
||||
import NamespaceSettingEdit from '../views/namespaces/settings/edit'
|
||||
import NamespaceSettingShare from '../views/namespaces/settings/share'
|
||||
import NamespaceSettingArchive from '../views/namespaces/settings/archive'
|
||||
import NamespaceSettingDelete from '../views/namespaces/settings/delete'
|
||||
// Saved Filters
|
||||
import CreateSavedFilter from '@/views/filters/CreateSavedFilter'
|
||||
import CreateSavedFilter from '../views/filters/CreateSavedFilter'
|
||||
|
||||
const PasswordResetComponent = () => ({
|
||||
component: import(/* webpackChunkName: "user-settings" */'../views/user/PasswordReset'),
|
||||
component: import('../views/user/PasswordReset'),
|
||||
loading: LoadingComponent,
|
||||
error: ErrorComponent,
|
||||
timeout: 60000,
|
||||
})
|
||||
const GetPasswordResetComponent = () => ({
|
||||
component: import(/* webpackChunkName: "user-settings" */'../views/user/RequestPasswordReset'),
|
||||
component: import('../views/user/RequestPasswordReset'),
|
||||
loading: LoadingComponent,
|
||||
error: ErrorComponent,
|
||||
timeout: 60000,
|
||||
})
|
||||
const UserSettingsComponent = () => ({
|
||||
component: import(/* webpackChunkName: "user-settings" */'../views/user/Settings'),
|
||||
component: import('../views/user/Settings'),
|
||||
loading: LoadingComponent,
|
||||
error: ErrorComponent,
|
||||
timeout: 60000,
|
||||
})
|
||||
// List Handling
|
||||
const NewListComponent = () => ({
|
||||
component: import(/* webpackChunkName: "settings" */'../views/list/NewList'),
|
||||
component: import('../views/list/NewList'),
|
||||
loading: LoadingComponent,
|
||||
error: ErrorComponent,
|
||||
timeout: 60000,
|
||||
})
|
||||
// Namespace Handling
|
||||
const NewNamespaceComponent = () => ({
|
||||
component: import(/* webpackChunkName: "settings" */'../views/namespaces/NewNamespace'),
|
||||
component: import('../views/namespaces/NewNamespace'),
|
||||
loading: LoadingComponent,
|
||||
error: ErrorComponent,
|
||||
timeout: 60000,
|
||||
})
|
||||
|
||||
const EditTeamComponent = () => ({
|
||||
component: import(/* webpackChunkName: "settings" */'../views/teams/EditTeam'),
|
||||
component: import('../views/teams/EditTeam'),
|
||||
loading: LoadingComponent,
|
||||
error: ErrorComponent,
|
||||
timeout: 60000,
|
||||
})
|
||||
const NewTeamComponent = () => ({
|
||||
component: import(/* webpackChunkName: "settings" */'../views/teams/NewTeam'),
|
||||
component: import('../views/teams/NewTeam'),
|
||||
loading: LoadingComponent,
|
||||
error: ErrorComponent,
|
||||
timeout: 60000,
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
.offline {
|
||||
background: url('../../public/images/llama-nightscape.png') no-repeat center;
|
||||
background: url('/images/llama-nightscape.png') no-repeat center;
|
||||
-webkit-background-size: cover;
|
||||
background-size: cover;
|
||||
height: 100vh;
|
||||
|
|
|
@ -62,9 +62,9 @@
|
|||
</template>
|
||||
|
||||
<script>
|
||||
import LoadingComponent from '@/components/misc/loading'
|
||||
import ErrorComponent from '@/components/misc/error'
|
||||
import Filters from '@/components/list/partials/filters'
|
||||
import LoadingComponent from '@/components/misc/loading.vue'
|
||||
import ErrorComponent from '@/components/misc/error.vue'
|
||||
import Filters from '@/components/list/partials/filters.vue'
|
||||
import SavedFilterService from '@/services/savedFilter'
|
||||
import SavedFilterModel from '@/models/savedFilter'
|
||||
|
||||
|
|
|
@ -52,14 +52,14 @@
|
|||
</template>
|
||||
|
||||
<script>
|
||||
import ErrorComponent from '@/components/misc/error'
|
||||
import LoadingComponent from '@/components/misc/loading'
|
||||
import CreateEdit from '@/components/misc/create-edit'
|
||||
import ErrorComponent from '@/components/misc/error.vue'
|
||||
import LoadingComponent from '@/components/misc/loading.vue'
|
||||
import CreateEdit from '@/components/misc/create-edit.vue'
|
||||
|
||||
import SavedFilterModel from '@/models/savedFilter'
|
||||
import SavedFilterService from '@/services/savedFilter'
|
||||
import ListModel from '@/models/list'
|
||||
import Filters from '@/components/list/partials/filters'
|
||||
import Filters from '@/components/list/partials/filters.vue'
|
||||
import {objectToSnakeCase} from '@/helpers/case'
|
||||
|
||||
export default {
|
||||
|
@ -85,7 +85,7 @@ export default {
|
|||
CreateEdit,
|
||||
Filters,
|
||||
editor: () => ({
|
||||
component: import(/* webpackChunkName: "editor" */ '@/components/input/editor'),
|
||||
component: import(/* webpackChunkName: "editor" */ '@/components/input/editor.vue'),
|
||||
loading: LoadingComponent,
|
||||
error: ErrorComponent,
|
||||
timeout: 60000,
|
||||
|
|
|
@ -39,7 +39,7 @@ import labelModel from '../../models/label'
|
|||
import labelService from '../../services/label'
|
||||
import LabelModel from '../../models/label'
|
||||
import LabelService from '../../services/label'
|
||||
import CreateEdit from '@/components/misc/create-edit'
|
||||
import CreateEdit from '@/components/misc/create-edit.vue'
|
||||
import ColorPicker from '../../components/input/colorPicker'
|
||||
|
||||
export default {
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
<script>
|
||||
import ListService from '../../services/list'
|
||||
import ListModel from '../../models/list'
|
||||
import CreateEdit from '@/components/misc/create-edit'
|
||||
import CreateEdit from '@/components/misc/create-edit.vue'
|
||||
import ColorPicker from '../../components/input/colorPicker'
|
||||
|
||||
export default {
|
||||
|
|
|
@ -63,7 +63,7 @@
|
|||
import BackgroundUnsplashService from '../../../services/backgroundUnsplash'
|
||||
import BackgroundUploadService from '../../../services/backgroundUpload'
|
||||
import {CURRENT_LIST} from '@/store/mutation-types'
|
||||
import CreateEdit from '@/components/misc/create-edit'
|
||||
import CreateEdit from '@/components/misc/create-edit.vue'
|
||||
|
||||
export default {
|
||||
name: 'list-setting-background',
|
||||
|
|
|
@ -13,9 +13,9 @@
|
|||
|
||||
<script>
|
||||
import ListDuplicateService from '@/services/listDuplicateService'
|
||||
import NamespaceSearch from '@/components/namespace/namespace-search'
|
||||
import NamespaceSearch from '@/components/namespace/namespace-search.vue'
|
||||
import ListDuplicateModel from '@/models/listDuplicateModel'
|
||||
import CreateEdit from '@/components/misc/create-edit'
|
||||
import CreateEdit from '@/components/misc/create-edit.vue'
|
||||
|
||||
export default {
|
||||
name: 'list-setting-duplicate',
|
||||
|
|
|
@ -68,12 +68,12 @@
|
|||
<script>
|
||||
import ListModel from '@/models/list'
|
||||
import ListService from '@/services/list'
|
||||
import ColorPicker from '@/components/input/colorPicker'
|
||||
import LoadingComponent from '@/components/misc/loading'
|
||||
import ErrorComponent from '@/components/misc/error'
|
||||
import ColorPicker from '@/components/input/colorPicker.vue'
|
||||
import LoadingComponent from '@/components/misc/loading.vue'
|
||||
import ErrorComponent from '@/components/misc/error.vue'
|
||||
import ListDuplicateService from '@/services/listDuplicateService'
|
||||
import {CURRENT_LIST} from '@/store/mutation-types'
|
||||
import CreateEdit from '@/components/misc/create-edit'
|
||||
import CreateEdit from '@/components/misc/create-edit.vue'
|
||||
|
||||
export default {
|
||||
name: 'list-setting-edit',
|
||||
|
@ -87,7 +87,7 @@ export default {
|
|||
CreateEdit,
|
||||
ColorPicker,
|
||||
editor: () => ({
|
||||
component: import(/* webpackChunkName: "editor" */ '@/components/input/editor'),
|
||||
component: import(/* webpackChunkName: "editor" */ '@/components/input/editor.vue'),
|
||||
loading: LoadingComponent,
|
||||
error: ErrorComponent,
|
||||
timeout: 60000,
|
||||
|
|
|
@ -25,9 +25,9 @@ import ListService from '@/services/list'
|
|||
import ListModel from '@/models/list'
|
||||
import {CURRENT_LIST} from '@/store/mutation-types'
|
||||
|
||||
import CreateEdit from '@/components/misc/create-edit'
|
||||
import LinkSharing from '@/components/sharing/linkSharing'
|
||||
import userTeam from '@/components/sharing/userTeam'
|
||||
import CreateEdit from '@/components/misc/create-edit.vue'
|
||||
import LinkSharing from '@/components/sharing/linkSharing.vue'
|
||||
import userTeam from '@/components/sharing/userTeam.vue'
|
||||
|
||||
export default {
|
||||
name: 'list-setting-share',
|
||||
|
|
|
@ -263,8 +263,8 @@ import {mapState} from 'vuex'
|
|||
import {saveListView} from '@/helpers/saveListView'
|
||||
import Rights from '../../../models/rights.json'
|
||||
import {LOADING, LOADING_MODULE} from '@/store/mutation-types'
|
||||
import FilterPopup from '@/components/list/partials/filter-popup'
|
||||
import Dropdown from '@/components/misc/dropdown'
|
||||
import FilterPopup from '@/components/list/partials/filter-popup.vue'
|
||||
import Dropdown from '@/components/misc/dropdown.vue'
|
||||
import {playPop} from '@/helpers/playPop'
|
||||
|
||||
export default {
|
||||
|
|
|
@ -171,9 +171,9 @@ 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 FilterPopup from '@/components/list/partials/filter-popup.vue'
|
||||
import {HAS_TASKS} from '@/store/mutation-types'
|
||||
import Nothing from '@/components/misc/nothing'
|
||||
import Nothing from '@/components/misc/nothing.vue'
|
||||
|
||||
export default {
|
||||
name: 'List',
|
||||
|
|
|
@ -199,7 +199,7 @@ import DateTableCell from '../../../components/tasks/partials/date-table-cell'
|
|||
import Fancycheckbox from '../../../components/input/fancycheckbox'
|
||||
import Sort from '../../../components/tasks/partials/sort'
|
||||
import {saveListView} from '@/helpers/saveListView'
|
||||
import FilterPopup from '@/components/list/partials/filter-popup'
|
||||
import FilterPopup from '@/components/list/partials/filter-popup.vue'
|
||||
|
||||
export default {
|
||||
name: 'Table',
|
||||
|
|
|
@ -45,7 +45,7 @@
|
|||
<script>
|
||||
import NamespaceModel from '../../models/namespace'
|
||||
import NamespaceService from '../../services/namespace'
|
||||
import CreateEdit from '@/components/misc/create-edit'
|
||||
import CreateEdit from '@/components/misc/create-edit.vue'
|
||||
import ColorPicker from '../../components/input/colorPicker'
|
||||
|
||||
export default {
|
||||
|
|
|
@ -59,11 +59,11 @@
|
|||
<script>
|
||||
import NamespaceService from '@/services/namespace'
|
||||
import NamespaceModel from '@/models/namespace'
|
||||
import Fancycheckbox from '@/components/input/fancycheckbox'
|
||||
import ColorPicker from '@/components/input/colorPicker'
|
||||
import LoadingComponent from '@/components/misc/loading'
|
||||
import ErrorComponent from '@/components/misc/error'
|
||||
import CreateEdit from '@/components/misc/create-edit'
|
||||
import Fancycheckbox from '@/components/input/fancycheckbox.vue'
|
||||
import ColorPicker from '@/components/input/colorPicker.vue'
|
||||
import LoadingComponent from '@/components/misc/loading.vue'
|
||||
import ErrorComponent from '@/components/misc/error.vue'
|
||||
import CreateEdit from '@/components/misc/create-edit.vue'
|
||||
|
||||
export default {
|
||||
name: 'namespace-setting-edit',
|
||||
|
@ -80,7 +80,7 @@ export default {
|
|||
ColorPicker,
|
||||
Fancycheckbox,
|
||||
editor: () => ({
|
||||
component: import(/* webpackChunkName: "editor" */ '@/components/input/editor'),
|
||||
component: import(/* webpackChunkName: "editor" */ '@/components/input/editor.vue'),
|
||||
loading: LoadingComponent,
|
||||
error: ErrorComponent,
|
||||
timeout: 60000,
|
||||
|
|
|
@ -19,8 +19,8 @@
|
|||
</template>
|
||||
|
||||
<script>
|
||||
import manageSharing from '@/components/sharing/userTeam'
|
||||
import CreateEdit from '@/components/misc/create-edit'
|
||||
import manageSharing from '@/components/sharing/userTeam.vue'
|
||||
import CreateEdit from '@/components/misc/create-edit.vue'
|
||||
|
||||
import NamespaceService from '@/services/namespace'
|
||||
import NamespaceModel from '@/models/namespace'
|
||||
|
|
|
@ -422,13 +422,13 @@ import RepeatAfter from '../../components/tasks/partials/repeatAfter'
|
|||
import Reminders from '../../components/tasks/partials/reminders'
|
||||
import Comments from '../../components/tasks/partials/comments'
|
||||
import ListSearch from '../../components/tasks/partials/listSearch'
|
||||
import description from '@/components/tasks/partials/description'
|
||||
import description from '@/components/tasks/partials/description.vue'
|
||||
import ColorPicker from '../../components/input/colorPicker'
|
||||
import attachmentUpload from '../../components/tasks/mixins/attachmentUpload'
|
||||
import heading from '@/components/tasks/partials/heading'
|
||||
import Datepicker from '@/components/input/datepicker'
|
||||
import heading from '@/components/tasks/partials/heading.vue'
|
||||
import Datepicker from '@/components/input/datepicker.vue'
|
||||
import {playPop} from '@/helpers/playPop'
|
||||
import TaskSubscription from '@/components/misc/subscription'
|
||||
import TaskSubscription from '@/components/misc/subscription.vue'
|
||||
|
||||
export default {
|
||||
name: 'TaskDetailView',
|
||||
|
|
|
@ -184,7 +184,7 @@ import Rights from '../../models/rights.json'
|
|||
import LoadingComponent from '../../components/misc/loading'
|
||||
import ErrorComponent from '../../components/misc/error'
|
||||
|
||||
import Multiselect from '@/components/input/multiselect'
|
||||
import Multiselect from '@/components/input/multiselect.vue'
|
||||
|
||||
export default {
|
||||
name: 'EditTeam',
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
<script>
|
||||
import TeamModel from '../../models/team'
|
||||
import TeamService from '../../services/team'
|
||||
import CreateEdit from '@/components/misc/create-edit'
|
||||
import CreateEdit from '@/components/misc/create-edit.vue'
|
||||
|
||||
export default {
|
||||
name: 'NewTeam',
|
||||
|
|
|
@ -107,7 +107,7 @@ import {HTTPFactory} from '@/http-common'
|
|||
import message from '../../message'
|
||||
import {ERROR_MESSAGE, LOADING} from '@/store/mutation-types'
|
||||
import legal from '../../components/misc/legal'
|
||||
import ApiConfig from '@/components/misc/api-config'
|
||||
import ApiConfig from '@/components/misc/api-config.vue'
|
||||
|
||||
export default {
|
||||
components: {
|
||||
|
|
102
vite.config.js
Normal file
102
vite.config.js
Normal file
|
@ -0,0 +1,102 @@
|
|||
const {createVuePlugin} = require('vite-plugin-vue2')
|
||||
const {VitePWA} = require('vite-plugin-pwa')
|
||||
const path = require('path')
|
||||
|
||||
module.exports = {
|
||||
plugins: [
|
||||
createVuePlugin(),
|
||||
VitePWA({
|
||||
strategies: 'injectManifest',
|
||||
injectRegister: false,
|
||||
injectManifest: {
|
||||
swSrc: './src/ServiceWorker/sw.js',
|
||||
swDest: './dist/sw.js',
|
||||
},
|
||||
manifest: {
|
||||
name: 'Vikunja',
|
||||
short_name: 'Vikunja',
|
||||
theme_color: '#1973ff',
|
||||
icons: [
|
||||
{
|
||||
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/icon-maskable.png',
|
||||
sizes: '1024x1024',
|
||||
type: 'image/png',
|
||||
purpose: 'maskable'
|
||||
}
|
||||
],
|
||||
start_url: '.',
|
||||
display: 'standalone',
|
||||
background_color: '#000000',
|
||||
shortcuts: [
|
||||
{
|
||||
name: 'Overview',
|
||||
url: '/'
|
||||
},
|
||||
{
|
||||
name: 'Namespaces And Lists Overview',
|
||||
short_name: 'Namespaces & Lists',
|
||||
url: '/namespaces'
|
||||
},
|
||||
{
|
||||
name: 'Tasks Next Week',
|
||||
short_name: 'Next Week',
|
||||
url: '/tasks/by/week'
|
||||
},
|
||||
{
|
||||
name: 'Tasks Next Month',
|
||||
short_name: 'Next Month',
|
||||
url: '/tasks/by/month'
|
||||
},
|
||||
{
|
||||
name: 'Teams Overview',
|
||||
short_name: 'Teams',
|
||||
url: '/teams'
|
||||
}
|
||||
]
|
||||
},
|
||||
}),
|
||||
],
|
||||
resolve: {
|
||||
alias: [
|
||||
{
|
||||
find: '@',
|
||||
replacement: path.resolve(__dirname, 'src'),
|
||||
},
|
||||
],
|
||||
extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue'],
|
||||
},
|
||||
server: {
|
||||
port: 5000,
|
||||
strictPort: true,
|
||||
},
|
||||
build: {
|
||||
target: 'es2015',
|
||||
rollupOptions: {
|
||||
output: {
|
||||
manualChunks: {
|
||||
'user-settings': [
|
||||
'./src/views/user/PasswordReset',
|
||||
'./src/views/user/RequestPasswordReset',
|
||||
'./src/views/user/Settings',
|
||||
],
|
||||
'settings': [
|
||||
'./src/views/list/NewList',
|
||||
'./src/views/namespaces/NewNamespace',
|
||||
'./src/views/teams/EditTeam',
|
||||
'./src/views/teams/NewTeam',
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
Loading…
Reference in New Issue
Block a user