import { extend as dayjsExtend, locale as dayjsLocale } from 'dayjs'; import localizedFormat from 'dayjs/plugin/localizedFormat'; import 'dayjs/locale/nl'; import 'object-fit-cover'; import Vue, { VueConstructor } from 'vue'; import VueRouter, { RouteConfig } from 'vue-router'; import draggable from 'vuedraggable'; import assets from './assets/assets.vue'; import CrudFactory from './crud/crud-factory'; import { doc } from './docs/doc'; import docs from './docs/docs.vue'; import ipWhitelistFactory from './ip-whitelist/ip-whitelist-factory'; import pageCrudColumnActions from './pages/crud/page-crud-column-actions.vue'; import pageCrudColumnPageType from './pages/crud/page-crud-column-page-type.vue'; import pageCrudColumnPublished from './pages/crud/page-crud-column-published.vue'; import pageCrudColumnTitle from './pages/crud/page-crud-column-title.vue'; import pages from './pages/pages.vue'; import rootComponent from './root-component.vue'; import './resources/icomoon/style.css'; import redirectActive from './schema/fields/redirect-active.vue'; import redirectTestButton from './schema/fields/redirect-test-button.vue'; import schemaComponentPart from './schema/schema-component-part.vue'; import schemaField from './schema/schema-field.vue'; import dropdownMenu from './shared/dropdown-menu.vue'; import menuItem from './shared/menu-item.vue'; import selectDropdownMenu from './shared/select-dropdown-menu.vue'; import store from './stores'; import './style.scss'; import keepLoginAlive from './tools/keep-login-alive'; import { getCmsSettings, initializeCmsSettings } from './tools/settings'; import './tools/vue-delete.scss'; import VueScrollStop from './tools/vue-scroll-stop'; import './tools/vuedraggable.scss'; import type { CmsSettings, NavigationItem } from './types/settings'; declare global { interface Window { app: Vue; serverSideCmsSettings: CmsSettings; } } dayjsExtend(localizedFormat); dayjsLocale('nl'); // @ts-expect-error Vue.config.devtools = import.meta.env.MODE === 'development'; Vue.use(VueRouter); Vue.use(VueScrollStop); Vue.component('draggable', draggable); Vue.component('dropdown-menu', dropdownMenu); Vue.component('select-dropdown-menu', selectDropdownMenu); Vue.component('menu-item', menuItem); Vue.component('schema-component-part', schemaComponentPart); Vue.component('schema-field', schemaField); Vue.component('redirect-test-button', redirectTestButton); Vue.component('redirect-active', redirectActive); Vue.component('page-crud-column-actions', pageCrudColumnActions); Vue.component('page-crud-column-page-type', pageCrudColumnPageType); Vue.component('page-crud-column-published', pageCrudColumnPublished); Vue.component('page-crud-column-title', pageCrudColumnTitle); // create stores for cmsItems that don't have a menu item CrudFactory.generate('entityType'); const routes: RouteConfig[] = []; const systemFactories: { [key: string]: RouteConfig } = { '/redirects': CrudFactory.generate('redirect', ['description', 'isPermanent', 'from', 'toComposedUrl'], undefined, { 'Redirect is actief': 'redirect-active', Testen: 'redirect-test-button' }), '/roles': CrudFactory.generate('role', ['name', 'description']), '/cmsuser': CrudFactory.generate('cmsUser', ['name', 'email', 'isSuperUser', 'created', 'lastActivity']), '/ipwhitelist': ipWhitelistFactory }; const routeComponent = doc( (path: string, component: any, props?: Object) => { const routeConfig: RouteConfig = { path, component, children: component.children, props }; routes.push(routeConfig); }, `Koppel het component aan het pad path incl. de children (subroutes) van het component. Gebruik eigen componenten of gebruik één van de functies uit crud-factory.js.` ); function enrichWithSystemFactories(items: NavigationItem[]) { items.forEach((item) => { if (!item.factory && systemFactories[item.href]) { item.factory = systemFactories[item.href]; } if (item.items) { enrichWithSystemFactories(item.items); } }); } function createRouteComponents(items: NavigationItem[]) { items.forEach((item) => { if (item.factory) { routeComponent(item.href, item.factory); } if (item.items) { createRouteComponents(item.items); } }); } export const customComponent = doc((name: string, component: VueConstructor) => { Vue.component(name, component); }, `Creëer een custom Vue component.`); export const runCms = doc(() => { routeComponent('/assets', assets); routeComponent('/pages', pages); routeComponent('/cms-docs', docs); routeComponent('/cms-tags', CrudFactory.generate('cmsTag', ['title'])); const navigationItems = getCmsSettings().navigation.items || []; enrichWithSystemFactories(navigationItems); createRouteComponents(navigationItems); // add start route routes.push({ path: '/', redirect: getCmsSettings().navigation.startRoute ? getCmsSettings().navigation.startRoute : '/pages' }); const router = new VueRouter({ mode: 'history', linkActiveClass: 'active', routes }); window.app = new Vue({ render: (h) => h(rootComponent), router, store, components: { rootComponent } }).$mount('#cms-app'); keepLoginAlive.start(); store.initialize(); }, `Start het CMS.`); export const runCmsOnLoad = doc( (settings: CmsSettings) => { const serverSideCmsSettings = window.serverSideCmsSettings || {}; const mergedSettings = { ...settings, ...serverSideCmsSettings }; // merge navigation brand items client/serverside into one array if (serverSideCmsSettings.navigationBrandItems) { mergedSettings.navigation.brand = mergedSettings.navigation.brand || { label: 'Cms' }; mergedSettings.navigation.brand.items = mergedSettings.navigation.brand.items || []; mergedSettings.navigation.brand.items = [...mergedSettings.navigation.brand.items, ...serverSideCmsSettings.navigationBrandItems]; } initializeCmsSettings(mergedSettings); document.addEventListener('DOMContentLoaded', () => { runCms(); }); }, `Start runCms op het DOMContentLoaded event. Hiermee kan je @q42/q-cms-components importeren in een script die in de <head> staat.` ); export { createFilterLink } from './shared/listing-filter-link';