import Vue from 'vue' import App from './App.vue' import router from './router' import {error, success} from './message' declare global { interface Window { API_URL: string; } } import {formatDate, formatDateSince} from '@/helpers/time/formatDate' // @ts-ignore import {VERSION} from './version.json' // Register the modal // @ts-ignore import Modal from './components/modal/modal' // Add CSS import './styles/vikunja.scss' // Notifications import Notifications from 'vue-notification' // PWA import './registerServiceWorker' // Shortcuts // @ts-ignore - no types available import vueShortkey from 'vue-shortkey' // Mixins import {colorIsDark} from './helpers/color/colorIsDark' import {setTitle} from './helpers/setTitle' import {getNamespaceTitle} from './helpers/getNamespaceTitle' import {getListTitle} from './helpers/getListTitle' // Vuex import {store} from './store' // i18n import VueI18n from 'vue-i18n' // types import {i18n} from './i18n/setup' console.info(`Vikunja frontend version ${VERSION}`) // 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 } // Make sure the api url does not contain a / at the end if (window.API_URL.substr(window.API_URL.length - 1, window.API_URL.length) === '/') { window.API_URL = window.API_URL.substr(0, window.API_URL.length - 1) } Vue.component('modal', Modal) Vue.config.productionTip = false Vue.use(Notifications) import FontAwesomeIcon from './icons' Vue.component('icon', FontAwesomeIcon) Vue.use(vueShortkey, {prevent: ['input', 'textarea', '.input', '[contenteditable]']}) // define as global property const Message = { install(Vue) { if (this.installed) { return } this.installed = true const message = { error(e, actions = []) { return error(e, Vue.prototype, actions) }, success(s, actions = []) { return success(s, Vue.prototype, actions) }, } Vue.prototype['$message'] = message }, } Vue.use(Message) import focus from './directives/focus' Vue.directive('focus', focus) import tooltip from './directives/tooltip' // @ts-ignore Vue.directive('tooltip', tooltip) // @ts-ignore import Button from './components/input/button' Vue.component('x-button', Button) // @ts-ignore import Card from './components/misc/card' Vue.component('card', Card) Vue.mixin({ methods: { formatDateSince(date) { return formatDateSince(date, (p: VueI18n.Path, params?: VueI18n.Values) => this.$t(p, params)) }, formatDate(date) { return formatDate(date, 'PPPPpppp', this.$t('date.locale')) }, formatDateShort(date) { return formatDate(date, 'PPpp', this.$t('date.locale')) }, getNamespaceTitle(n) { return getNamespaceTitle(n, (p: VueI18n.Path) => this.$t(p)) }, getListTitle(l) { return getListTitle(l, (p: VueI18n.Path) => this.$t(p)) }, colorIsDark: colorIsDark, setTitle: setTitle, }, }) new Vue({ router, store, i18n, render: h => h(App), }).$mount('#app')