2018-08-28 22:50:22 +02:00
|
|
|
import Vue from 'vue'
|
|
|
|
import App from './App.vue'
|
2018-09-06 19:46:09 +02:00
|
|
|
import router from './router'
|
2018-08-28 22:50:22 +02:00
|
|
|
|
2021-07-19 20:20:49 +02:00
|
|
|
declare global {
|
|
|
|
interface Window {
|
|
|
|
API_URL: string;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-06-24 01:24:57 +02:00
|
|
|
import {formatDate, formatDateSince} from '@/helpers/time/formatDate'
|
2021-07-19 20:20:49 +02:00
|
|
|
// @ts-ignore
|
2020-05-09 21:39:46 +02:00
|
|
|
import {VERSION} from './version.json'
|
2021-04-22 14:26:48 +02:00
|
|
|
|
2020-09-05 22:35:52 +02:00
|
|
|
// Register the modal
|
2021-07-19 20:20:49 +02:00
|
|
|
// @ts-ignore
|
2020-09-05 22:35:52 +02:00
|
|
|
import Modal from './components/modal/modal'
|
|
|
|
// Add CSS
|
|
|
|
import './styles/vikunja.scss'
|
|
|
|
// Notifications
|
|
|
|
import Notifications from 'vue-notification'
|
|
|
|
// PWA
|
|
|
|
import './registerServiceWorker'
|
|
|
|
|
|
|
|
// Shortcuts
|
2021-07-19 20:20:49 +02:00
|
|
|
// @ts-ignore - no types available
|
2020-09-05 22:35:52 +02:00
|
|
|
import vueShortkey from 'vue-shortkey'
|
|
|
|
// Mixins
|
|
|
|
import message from './message'
|
2021-01-17 11:51:07 +01:00
|
|
|
import {colorIsDark} from './helpers/color/colorIsDark'
|
2020-09-05 22:35:52 +02:00
|
|
|
import {setTitle} from './helpers/setTitle'
|
2021-07-09 10:22:20 +02:00
|
|
|
import {getNamespaceTitle} from './helpers/getNamespaceTitle'
|
|
|
|
import {getListTitle} from './helpers/getListTitle'
|
2020-09-05 22:35:52 +02:00
|
|
|
// Vuex
|
|
|
|
import {store} from './store'
|
2021-06-24 01:24:57 +02:00
|
|
|
// i18n
|
2021-07-19 20:20:49 +02:00
|
|
|
import VueI18n from 'vue-i18n' // types
|
2021-06-24 01:24:57 +02:00
|
|
|
import {i18n} from './i18n/setup'
|
2020-09-05 22:35:52 +02:00
|
|
|
|
2020-05-09 21:39:46 +02:00
|
|
|
console.info(`Vikunja frontend version ${VERSION}`)
|
|
|
|
|
2020-10-11 12:13:35 +02:00
|
|
|
// Check if we have an api url in local storage and use it if that's the case
|
|
|
|
const apiUrlFromStorage = localStorage.getItem('API_URL')
|
|
|
|
if (apiUrlFromStorage !== null) {
|
|
|
|
window.API_URL = apiUrlFromStorage
|
|
|
|
}
|
|
|
|
|
2020-05-10 18:26:33 +02:00
|
|
|
// Make sure the api url does not contain a / at the end
|
2020-09-05 22:35:52 +02:00
|
|
|
if (window.API_URL.substr(window.API_URL.length - 1, window.API_URL.length) === '/') {
|
2020-05-10 18:26:33 +02:00
|
|
|
window.API_URL = window.API_URL.substr(0, window.API_URL.length - 1)
|
|
|
|
}
|
|
|
|
|
2018-09-12 08:22:17 +02:00
|
|
|
Vue.component('modal', Modal)
|
|
|
|
|
2018-08-28 22:50:22 +02:00
|
|
|
Vue.config.productionTip = false
|
|
|
|
|
2018-09-08 21:43:16 +02:00
|
|
|
Vue.use(Notifications)
|
|
|
|
|
2021-09-21 18:39:56 +02:00
|
|
|
import FontAwesomeIcon from './icons'
|
2018-09-09 17:23:06 +02:00
|
|
|
Vue.component('icon', FontAwesomeIcon)
|
|
|
|
|
2021-06-24 01:24:57 +02:00
|
|
|
Vue.use(vueShortkey, {prevent: ['input', 'textarea', '.input']})
|
2020-07-25 16:52:04 +02:00
|
|
|
|
2021-07-25 15:27:15 +02:00
|
|
|
import focus from './directives/focus'
|
2020-11-02 21:52:07 +01:00
|
|
|
Vue.directive('focus', focus)
|
2018-12-25 16:03:51 +01:00
|
|
|
|
2021-07-25 15:27:15 +02:00
|
|
|
import tooltip from './directives/tooltip'
|
2021-04-22 14:26:48 +02:00
|
|
|
|
2021-07-19 20:20:49 +02:00
|
|
|
// @ts-ignore
|
2021-06-24 01:24:57 +02:00
|
|
|
Vue.directive('tooltip', tooltip)
|
2020-11-28 14:59:27 +01:00
|
|
|
|
2021-07-19 20:20:49 +02:00
|
|
|
// @ts-ignore
|
2021-07-25 15:27:15 +02:00
|
|
|
import Button from './components/input/button'
|
2021-01-17 18:57:57 +01:00
|
|
|
Vue.component('x-button', Button)
|
|
|
|
|
2021-07-19 20:20:49 +02:00
|
|
|
// @ts-ignore
|
2021-07-25 15:27:15 +02:00
|
|
|
import Card from './components/misc/card'
|
2021-01-17 18:57:57 +01:00
|
|
|
Vue.component('card', Card)
|
|
|
|
|
2020-01-30 21:49:00 +01:00
|
|
|
Vue.mixin({
|
|
|
|
methods: {
|
2021-06-24 01:24:57 +02:00
|
|
|
formatDateSince(date) {
|
2021-07-19 20:20:49 +02:00
|
|
|
return formatDateSince(date, (p: VueI18n.Path, params?: VueI18n.Values) => this.$t(p, params))
|
2021-06-24 01:24:57 +02:00
|
|
|
},
|
|
|
|
formatDate(date) {
|
|
|
|
return formatDate(date, 'PPPPpppp', this.$t('date.locale'))
|
|
|
|
},
|
|
|
|
formatDateShort(date) {
|
|
|
|
return formatDate(date, 'PPpp', this.$t('date.locale'))
|
2020-03-23 18:46:33 +01:00
|
|
|
},
|
2021-07-09 10:22:20 +02:00
|
|
|
getNamespaceTitle(n) {
|
2021-07-19 20:20:49 +02:00
|
|
|
return getNamespaceTitle(n, (p: VueI18n.Path) => this.$t(p))
|
2021-07-09 10:22:20 +02:00
|
|
|
},
|
|
|
|
getListTitle(l) {
|
2021-07-19 20:20:49 +02:00
|
|
|
return getListTitle(l, (p: VueI18n.Path) => this.$t(p))
|
2021-07-09 10:22:20 +02:00
|
|
|
},
|
2021-06-22 22:07:57 +02:00
|
|
|
error(e, actions = []) {
|
2021-07-19 20:20:49 +02:00
|
|
|
return message.error(e, this, (p: VueI18n.Path) => this.$t(p), actions)
|
2021-06-22 22:07:57 +02:00
|
|
|
},
|
|
|
|
success(s, actions = []) {
|
2021-07-19 20:20:49 +02:00
|
|
|
return message.success(s, this, (p: VueI18n.Path) => this.$t(p), actions)
|
2021-06-22 22:07:57 +02:00
|
|
|
},
|
2020-07-07 22:07:13 +02:00
|
|
|
colorIsDark: colorIsDark,
|
|
|
|
setTitle: setTitle,
|
2020-09-05 22:35:52 +02:00
|
|
|
},
|
2020-01-30 21:49:00 +01:00
|
|
|
})
|
|
|
|
|
2018-08-28 22:50:22 +02:00
|
|
|
new Vue({
|
2020-01-30 22:47:08 +01:00
|
|
|
router,
|
2020-05-08 20:43:51 +02:00
|
|
|
store,
|
2021-06-24 01:24:57 +02:00
|
|
|
i18n,
|
2020-09-05 22:35:52 +02:00
|
|
|
render: h => h(App),
|
2018-08-28 22:50:22 +02:00
|
|
|
}).$mount('#app')
|