release v2.0.0 #4
34
package.json
34
package.json
|
@ -19,31 +19,31 @@
|
||||||
"@flaschengeist/users": "^1.0.0-alpha.1",
|
"@flaschengeist/users": "^1.0.0-alpha.1",
|
||||||
"axios": "^0.21.1",
|
"axios": "^0.21.1",
|
||||||
"cordova": "^10.0.0",
|
"cordova": "^10.0.0",
|
||||||
"pinia": "2.0.0-beta.5",
|
"pinia": "^2.0.0-rc.6",
|
||||||
"quasar": "^2.0.3"
|
"quasar": "^2.0.4"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@flaschengeist/types": "^1.0.0-alpha.2",
|
"@flaschengeist/types": "^1.0.0-alpha.4",
|
||||||
"@quasar/app": "^3.0.3",
|
"@quasar/app": "^3.1.0",
|
||||||
"@quasar/extras": "^1.10.9",
|
"@quasar/extras": "^1.10.12",
|
||||||
"@types/node": "^12.20.15",
|
"@types/node": "^12.20.21",
|
||||||
"@types/webpack": "^5.28.0",
|
"@types/webpack": "^5.28.0",
|
||||||
"@types/webpack-env": "^1.16.0",
|
"@types/webpack-env": "^1.16.2",
|
||||||
"@typescript-eslint/eslint-plugin": "^4.24.0",
|
"@typescript-eslint/eslint-plugin": "^4.29.3",
|
||||||
"@typescript-eslint/parser": "^4.24.0",
|
"@typescript-eslint/parser": "^4.29.3",
|
||||||
"eslint": "^7.26.0",
|
"eslint": "^7.32.0",
|
||||||
"eslint-config-prettier": "^8.3.0",
|
"eslint-config-prettier": "^8.3.0",
|
||||||
"eslint-plugin-vue": "^7.9.0",
|
"eslint-plugin-vue": "^7.17.0",
|
||||||
"eslint-webpack-plugin": "^2.5.4",
|
"eslint-webpack-plugin": "^3.0.1",
|
||||||
"modify-source-webpack-plugin": "^3.0.0-rc.0",
|
"modify-source-webpack-plugin": "^3.0.0",
|
||||||
"prettier": "^2.3.0",
|
"prettier": "^2.3.2",
|
||||||
"typescript": "^4.2.4",
|
"typescript": "~4.3.5",
|
||||||
"vuedraggable": "^4.0.1"
|
"vuedraggable": "^4.1.0"
|
||||||
},
|
},
|
||||||
"prettier": {
|
"prettier": {
|
||||||
"singleQuote": true,
|
"singleQuote": true,
|
||||||
"semi": true,
|
"semi": true,
|
||||||
"printWidth": 120,
|
"printWidth": 100,
|
||||||
"arrowParens": "always"
|
"arrowParens": "always"
|
||||||
},
|
},
|
||||||
"browserslist": [
|
"browserslist": [
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import { Notify } from 'quasar';
|
import { Notify } from 'quasar';
|
||||||
import { api } from 'boot/axios';
|
import { api } from 'src/boot/axios';
|
||||||
import { boot } from 'quasar/wrappers';
|
import { boot } from 'quasar/wrappers';
|
||||||
import routes from 'src/router/routes';
|
import routes from 'src/router/routes';
|
||||||
import { AxiosResponse } from 'axios';
|
import { AxiosResponse } from 'axios';
|
||||||
|
@ -118,7 +118,11 @@ function combineMenuRoutes(
|
||||||
target.children = [];
|
target.children = [];
|
||||||
}
|
}
|
||||||
convertRoutes(sourceMainConfig.route, sourceMainConfig.children);
|
convertRoutes(sourceMainConfig.route, sourceMainConfig.children);
|
||||||
if (sourceMainConfig.children && sourceMainConfig.children.length > 0 && !sourceMainConfig.route.component)
|
if (
|
||||||
|
sourceMainConfig.children &&
|
||||||
|
sourceMainConfig.children.length > 0 &&
|
||||||
|
!sourceMainConfig.route.component
|
||||||
|
)
|
||||||
Object.assign(sourceMainConfig.route, {
|
Object.assign(sourceMainConfig.route, {
|
||||||
component: () => import('src/components/navigation/EmptyParent.vue'),
|
component: () => import('src/components/navigation/EmptyParent.vue'),
|
||||||
});
|
});
|
||||||
|
@ -130,14 +134,20 @@ function combineMenuRoutes(
|
||||||
return target;
|
return target;
|
||||||
}
|
}
|
||||||
|
|
||||||
function combineRoutes(target: RouteRecordRaw[], source: FG_Plugin.NamedRouteRecordRaw[], mainPath: '/' | '/in') {
|
function combineRoutes(
|
||||||
|
target: RouteRecordRaw[],
|
||||||
|
source: FG_Plugin.NamedRouteRecordRaw[],
|
||||||
|
mainPath: '/' | '/in'
|
||||||
|
) {
|
||||||
// Search parent
|
// Search parent
|
||||||
target.forEach((target) => {
|
target.forEach((target) => {
|
||||||
if (target.path === mainPath) {
|
if (target.path === mainPath) {
|
||||||
// Parent found = target
|
// Parent found = target
|
||||||
source.forEach((sourceRoute) => {
|
source.forEach((sourceRoute) => {
|
||||||
// Check if source is already in target
|
// Check if source is already in target
|
||||||
const targetRoot = target.children?.find((targetRoot) => sourceRoute.path === targetRoot.path);
|
const targetRoot = target.children?.find(
|
||||||
|
(targetRoot) => sourceRoute.path === targetRoot.path
|
||||||
|
);
|
||||||
// Already in target routes, add only children
|
// Already in target routes, add only children
|
||||||
if (targetRoot) {
|
if (targetRoot) {
|
||||||
if (targetRoot.children === undefined) targetRoot.children = [];
|
if (targetRoot.children === undefined) targetRoot.children = [];
|
||||||
|
@ -145,7 +155,11 @@ function combineRoutes(target: RouteRecordRaw[], source: FG_Plugin.NamedRouteRec
|
||||||
} else {
|
} else {
|
||||||
// Append to target
|
// Append to target
|
||||||
if (target.children === undefined) target.children = [];
|
if (target.children === undefined) target.children = [];
|
||||||
if (sourceRoute.children && sourceRoute.children.length > 0 && sourceRoute.component === undefined)
|
if (
|
||||||
|
sourceRoute.children &&
|
||||||
|
sourceRoute.children.length > 0 &&
|
||||||
|
sourceRoute.component === undefined
|
||||||
|
)
|
||||||
Object.assign(sourceRoute, {
|
Object.assign(sourceRoute, {
|
||||||
component: () => import('src/components/navigation/EmptyParent.vue'),
|
component: () => import('src/components/navigation/EmptyParent.vue'),
|
||||||
});
|
});
|
||||||
|
@ -211,7 +225,11 @@ function combineShortcuts(target: FG_Plugin.Shortcut[], source: FG_Plugin.MenuRo
|
||||||
* @param plugin Plugin to load
|
* @param plugin Plugin to load
|
||||||
* @param router VueRouter instance
|
* @param router VueRouter instance
|
||||||
*/
|
*/
|
||||||
function loadPlugin(loadedPlugins: FG_Plugin.Flaschengeist, plugin: FG_Plugin.Plugin, backend: Backend) {
|
function loadPlugin(
|
||||||
|
loadedPlugins: FG_Plugin.Flaschengeist,
|
||||||
|
plugin: FG_Plugin.Plugin,
|
||||||
|
backend: Backend
|
||||||
|
) {
|
||||||
// Check if already loaded
|
// Check if already loaded
|
||||||
if (loadedPlugins.plugins.findIndex((p) => p.name === plugin.name) !== -1) return true;
|
if (loadedPlugins.plugins.findIndex((p) => p.name === plugin.name) !== -1) return true;
|
||||||
|
|
||||||
|
@ -220,7 +238,8 @@ function loadPlugin(loadedPlugins: FG_Plugin.Flaschengeist, plugin: FG_Plugin.Pl
|
||||||
!plugin.requiredModules.every(
|
!plugin.requiredModules.every(
|
||||||
(required) =>
|
(required) =>
|
||||||
backend.plugins[required[0]] !== undefined &&
|
backend.plugins[required[0]] !== undefined &&
|
||||||
(required.length == 1 || true) /* validate the version, semver440 from python is... tricky on node*/
|
(required.length == 1 ||
|
||||||
|
true) /* validate the version, semver440 from python is... tricky on node*/
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
console.error(`Plugin ${plugin.name}: Backend modules not satisfied`);
|
console.error(`Plugin ${plugin.name}: Backend modules not satisfied`);
|
||||||
|
@ -315,7 +334,9 @@ export default boot(async ({ router, app }) => {
|
||||||
|
|
||||||
// Sort widgets by priority
|
// Sort widgets by priority
|
||||||
/** @todo Remove priority with first beta */
|
/** @todo Remove priority with first beta */
|
||||||
loadedPlugins.widgets.sort((a, b) => <number>(b.order || b.priority) - <number>(a.order || a.priority));
|
loadedPlugins.widgets.sort(
|
||||||
|
(a, b) => <number>(b.order || b.priority) - <number>(a.order || a.priority)
|
||||||
|
);
|
||||||
/** @todo Can be cleaned up with first beta */
|
/** @todo Can be cleaned up with first beta */
|
||||||
loadedPlugins.menuLinks.sort((a, b) => {
|
loadedPlugins.menuLinks.sort((a, b) => {
|
||||||
const diff = a.order && b.order ? b.order - a.order : 0;
|
const diff = a.order && b.order ? b.order - a.order : 0;
|
||||||
|
|
|
@ -19,11 +19,7 @@
|
||||||
{{ notifications.length }}
|
{{ notifications.length }}
|
||||||
</q-badge>
|
</q-badge>
|
||||||
<q-menu style="max-height: 400px; overflow: auto">
|
<q-menu style="max-height: 400px; overflow: auto">
|
||||||
<q-btn
|
<q-btn v-if="useNative && noPermission" label="Benachrichtigungen erlauben" @click="requestPermission" />
|
||||||
v-if="useNative && noPermission"
|
|
||||||
label="Benachrichtigungen erlauben"
|
|
||||||
@click="requestPermission"
|
|
||||||
/>
|
|
||||||
<template v-if="notifications.length > 0">
|
<template v-if="notifications.length > 0">
|
||||||
<Notification
|
<Notification
|
||||||
v-for="(notification, index) in notifications"
|
v-for="(notification, index) in notifications"
|
||||||
|
@ -44,13 +40,7 @@
|
||||||
</q-toolbar>
|
</q-toolbar>
|
||||||
</q-header>
|
</q-header>
|
||||||
|
|
||||||
<q-drawer
|
<q-drawer v-model="leftDrawer" side="left" bordered :mini="leftDrawerMini" @click.capture="openMenu">
|
||||||
v-model="leftDrawer"
|
|
||||||
side="left"
|
|
||||||
bordered
|
|
||||||
:mini="leftDrawerMini"
|
|
||||||
@click.capture="openMenu"
|
|
||||||
>
|
|
||||||
<!-- Plugins -->
|
<!-- Plugins -->
|
||||||
<essential-expansion-link
|
<essential-expansion-link
|
||||||
v-for="(entry, index) in mainLinks"
|
v-for="(entry, index) in mainLinks"
|
||||||
|
@ -59,11 +49,7 @@
|
||||||
@add-short-cut="addShortcut"
|
@add-short-cut="addShortcut"
|
||||||
/>
|
/>
|
||||||
<q-separator />
|
<q-separator />
|
||||||
<essential-link
|
<essential-link v-for="(entry, index) in essentials" :key="'essential' + index" :entry="entry" />
|
||||||
v-for="(entry, index) in essentials"
|
|
||||||
:key="'essential' + index"
|
|
||||||
:entry="entry"
|
|
||||||
/>
|
|
||||||
</q-drawer>
|
</q-drawer>
|
||||||
<q-page-container>
|
<q-page-container>
|
||||||
<router-view />
|
<router-view />
|
||||||
|
@ -76,15 +62,7 @@ import EssentialExpansionLink from 'components/navigation/EssentialExpansionLink
|
||||||
import EssentialLink from 'src/components/navigation/EssentialLink.vue';
|
import EssentialLink from 'src/components/navigation/EssentialLink.vue';
|
||||||
import ShortcutLink from 'src/components/navigation/ShortcutLink.vue';
|
import ShortcutLink from 'src/components/navigation/ShortcutLink.vue';
|
||||||
import Notification from 'src/components/Notification.vue';
|
import Notification from 'src/components/Notification.vue';
|
||||||
import {
|
import { defineComponent, ref, inject, computed, onBeforeMount, onBeforeUnmount } from 'vue';
|
||||||
defineComponent,
|
|
||||||
ref,
|
|
||||||
inject,
|
|
||||||
computed,
|
|
||||||
onBeforeMount,
|
|
||||||
onBeforeUnmount,
|
|
||||||
ComponentPublicInstance,
|
|
||||||
} from 'vue';
|
|
||||||
import { Screen } from 'quasar';
|
import { Screen } from 'quasar';
|
||||||
import config from 'src/config';
|
import config from 'src/config';
|
||||||
import { useRouter } from 'vue-router';
|
import { useRouter } from 'vue-router';
|
||||||
|
@ -107,7 +85,7 @@ export default defineComponent({
|
||||||
EssentialLink,
|
EssentialLink,
|
||||||
ShortcutLink,
|
ShortcutLink,
|
||||||
Notification,
|
Notification,
|
||||||
drag: <ComponentPublicInstance>drag,
|
drag,
|
||||||
},
|
},
|
||||||
setup() {
|
setup() {
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
@ -151,15 +129,11 @@ export default defineComponent({
|
||||||
}
|
}
|
||||||
|
|
||||||
function requestPermission() {
|
function requestPermission() {
|
||||||
void window.Notification.requestPermission().then(
|
void window.Notification.requestPermission().then((p) => (noPermission.value = p !== 'granted'));
|
||||||
(p) => (noPermission.value = p !== 'granted')
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function pollNotification() {
|
function pollNotification() {
|
||||||
void mainStore
|
void mainStore.loadNotifications(<FG_Plugin.Flaschengeist>flaschengeist).then((notifications) => {
|
||||||
.loadNotifications(<FG_Plugin.Flaschengeist>flaschengeist)
|
|
||||||
.then((notifications) => {
|
|
||||||
if (useNative && !noPermission.value)
|
if (useNative && !noPermission.value)
|
||||||
notifications.forEach(
|
notifications.forEach(
|
||||||
(notif) =>
|
(notif) =>
|
||||||
|
|
Loading…
Reference in New Issue