-
+
@@ -116,8 +26,9 @@
--- a/koha-tmpl/intranet-tmpl/prog/js/vue/components/LeftMenu.vue
+++ a/koha-tmpl/intranet-tmpl/prog/js/vue/components/LeftMenu.vue
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
--- a/koha-tmpl/intranet-tmpl/prog/js/vue/components/NavigationItem.vue
+++ a/koha-tmpl/intranet-tmpl/prog/js/vue/components/NavigationItem.vue
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+ {{ $__(item.title) }}
+
+
+
+
+
+ {{ $__(item.title) }}
+
+
+
+
+
+ {{ $__(item.title) }}
+
+
+
+
+
+ {{
+ $__(item.title)
+ }}
+
+
+
+
+
+
+
+
+
--- a/koha-tmpl/intranet-tmpl/prog/js/vue/i18n/index.js
+++ a/koha-tmpl/intranet-tmpl/prog/js/vue/i18n/index.js
@@ -0,0 +1,9 @@
+export const $__ = (key) => {
+ return window["__"](key);
+};
+
+export default {
+ install: (app, options) => {
+ app.config.globalProperties.$__ = $__
+ },
+};
--- a/koha-tmpl/intranet-tmpl/prog/js/vue/modules/erm.ts
+++ a/koha-tmpl/intranet-tmpl/prog/js/vue/modules/erm.ts
@@ -17,27 +17,26 @@ library.add(faPlus, faMinus, faPencil, faTrash, faSpinner);
import App from "../components/ERM/Main.vue";
-import { routes } from "../routes/erm";
-
-const router = createRouter({
- history: createWebHistory(),
- linkExactActiveClass: "current",
- routes,
-});
+import { routes as routesDef } from "../routes/erm";
import { useMainStore } from "../stores/main";
import { useVendorStore } from "../stores/vendors";
import { useAVStore } from "../stores/authorised-values";
+import { useNavigationStore } from "../stores/navigation";
+import i18n from "../i18n";
const pinia = createPinia();
-const i18n = {
- install: (app, options) => {
- app.config.globalProperties.$__ = (key) => {
- return window["__"](key);
- };
- },
-};
+const mainStore = useMainStore(pinia);
+const AVStore = useAVStore(pinia);
+const navigationStore = useNavigationStore(pinia);
+const routes = navigationStore.setRoutes(routesDef);
+
+const router = createRouter({
+ history: createWebHistory(),
+ linkExactActiveClass: "current",
+ routes,
+});
const app = createApp(App);
@@ -50,15 +49,15 @@ const rootComponent = app
app.config.unwrapInjectedRef = true;
app.provide("vendorStore", useVendorStore(pinia));
-const mainStore = useMainStore(pinia);
app.provide("mainStore", mainStore);
-const AVStore = useAVStore(pinia);
app.provide("AVStore", AVStore);
+app.provide("navigationStore", navigationStore);
app.mount("#erm");
const { removeMessages } = mainStore;
router.beforeEach((to, from) => {
+ navigationStore.$patch({current: to.meta.self});
removeMessages(); // This will actually flag the messages as displayed already
});
router.afterEach((to, from) => {
--- a/koha-tmpl/intranet-tmpl/prog/js/vue/routes/erm.js
+++ a/koha-tmpl/intranet-tmpl/prog/js/vue/routes/erm.js
@@ -1,3 +1,5 @@
+import { markRaw } from "vue";
+
import Home from "../components/ERM/Home.vue";
import AgreementsList from "../components/ERM/AgreementsList.vue";
import AgreementsShow from "../components/ERM/AgreementsShow.vue";
@@ -19,100 +21,12 @@ import LicensesList from "../components/ERM/LicensesList.vue";
import LicensesShow from "../components/ERM/LicensesShow.vue";
import LicensesFormAdd from "../components/ERM/LicensesFormAdd.vue";
-const breadcrumbs = {
- home: {
- text: "Home", // $t("Home")
- path: "/cgi-bin/koha/mainpage.pl",
- },
- erm_home: {
- text: "E-resource management", // $t("E-resource management")
- path: "/cgi-bin/koha/erm/erm.pl",
- },
- agreements: {
- text: "Agreements", // $t("Agreements")
- path: "/cgi-bin/koha/erm/agreements",
- },
- eholdings: {
- home: {
- text: "eHoldings", // $t("eHoldings")
- },
- local: {
- home: {
- text: "Local", // $t("Local")
- },
- titles: {
- text: "Titles", // $t("Titles")
- path: "/cgi-bin/koha/erm/eholdings/local/titles",
- },
- packages: {
- text: "Packages", // $t("Packages")
- path: "/cgi-bin/koha/erm/eholdings/local/packages",
- },
- },
- ebsco: {
- home: {
- text: "EBSCO", // $t("EBSCO")
- },
- titles: {
- text: "Titles", // $t("Titles")
- path: "/cgi-bin/koha/erm/eholdings/ebsco/titles",
- },
- packages: {
- text: "Packages", // $t("Packages")
- path: "/cgi-bin/koha/erm/eholdings/ebsco/packages",
- },
- },
- },
- licenses: {
- text: "Licenses", // $t("Licenses")
- path: "/cgi-bin/koha/erm/licenses",
- },
-};
-const breadcrumb_paths = {
- agreements: [
- breadcrumbs.home,
- breadcrumbs.erm_home,
- breadcrumbs.agreements,
- ],
- eholdings: [
- breadcrumbs.home,
- breadcrumbs.erm_home,
- breadcrumbs.eholdings.home,
- ],
- eholdings_local: [
- breadcrumbs.home,
- breadcrumbs.erm_home,
- breadcrumbs.eholdings.home,
- breadcrumbs.eholdings.local.home,
- ],
- eholdings_ebsco: [
- breadcrumbs.home,
- breadcrumbs.erm_home,
- breadcrumbs.eholdings.home,
- breadcrumbs.eholdings.ebsco.home,
- ],
- licenses: [breadcrumbs.home, breadcrumbs.erm_home, breadcrumbs.licenses],
-};
-
-function build_breadcrumb(parent_breadcrumb, current) {
- let breadcrumb = parent_breadcrumb.flat(Infinity);
- if (current) {
- breadcrumb.push({
- text: current,
- });
- }
- return breadcrumb;
-}
+import { $__ } from "../i18n";
export const routes = [
- {
- path: "/cgi-bin/koha/mainpage.pl",
- beforeEnter(to, from, next) {
- window.location.href = "/cgi-bin/koha/mainpage.pl";
- },
- },
{
path: "/cgi-bin/koha/admin/background_jobs/:id",
+ is_base: true,
beforeEnter(to, from, next) {
window.location.href =
"/cgi-bin/koha/admin/background_jobs.pl?op=view&id=" +
@@ -121,388 +35,221 @@ export const routes = [
},
{
path: "/cgi-bin/koha/erm/erm.pl",
- name: "Home",
- component: Home,
- meta: {
- breadcrumb: () => [breadcrumbs.home, breadcrumbs.erm_home],
- },
- },
- {
- path: "/cgi-bin/koha/erm/agreements",
+ is_default: true,
+ is_base: true,
+ title: $__('E-resource management'),
children: [
{
path: "",
- name: "AgreementsList",
- component: AgreementsList,
- meta: {
- breadcrumb: () => breadcrumb_paths.agreements,
- },
+ name: "Home",
+ component: markRaw(Home),
+ is_navigation_item: false,
},
{
- path: ":agreement_id",
- name: "AgreementsShow",
- component: AgreementsShow,
- meta: {
- breadcrumb: () =>
- build_breadcrumb(
- breadcrumb_paths.agreements,
- "Show agreement" // $t("Show agreement")
- ),
- },
- },
- {
- path: "add",
- name: "AgreementsFormAdd",
- component: AgreementsFormAdd,
- meta: {
- breadcrumb: () =>
- build_breadcrumb(
- breadcrumb_paths.agreements,
- "Add agreement" // $t("Add agreement")
- ),
- },
- },
- {
- path: "edit/:agreement_id",
- name: "AgreementsFormAddEdit",
- component: AgreementsFormAdd,
- meta: {
- breadcrumb: () =>
- build_breadcrumb(
- breadcrumb_paths.agreements,
- "Edit agreement" // $t("Edit agreement")
- ),
- },
- },
- ],
- },
- {
- path: "/cgi-bin/koha/erm/eholdings",
- meta: {
- breadcrumb: () => breadcrumb_paths.eholdings,
- },
- children: [
- {
- path: "",
- meta: {
- breadcrumb: () => breadcrumb_paths.eholdings,
- },
- },
- {
- path: "local",
+ path: "/cgi-bin/koha/erm/agreements",
+ title: $__('Agreements'),
+ icon: 'fa-check-circle-o',
+ is_end_node: true,
children: [
{
path: "",
- meta: {
- breadcrumb: () => breadcrumb_paths.eholdings_local,
- },
+ name: "AgreementsList",
+ component: markRaw(AgreementsList),
},
{
- path: "packages",
- children: [
- {
- path: "",
- name: "EHoldingsLocalPackagesList",
- component: EHoldingsLocalPackagesList,
- meta: {
- breadcrumb: () =>
- build_breadcrumb([
- breadcrumb_paths.eholdings_local,
- breadcrumbs.eholdings.local
- .packages,
- ]),
- },
- },
- {
- path: ":package_id",
- name: "EHoldingsLocalPackagesShow",
- component: EHoldingsLocalPackagesShow,
- meta: {
- breadcrumb: () =>
- build_breadcrumb(
- [
- breadcrumb_paths.eholdings_local,
- breadcrumbs.eholdings.local
- .packages,
- ],
- "Show package" // $t("Show package")
- ),
- },
- },
- {
- path: "add",
- name: "EHoldingsLocalPackagesFormAdd",
- component: EHoldingsLocalPackagesFormAdd,
- meta: {
- breadcrumb: () =>
- build_breadcrumb(
- [
- breadcrumb_paths.eholdings_local,
- breadcrumbs.eholdings.local
- .packages,
- ],
- "Add package" // $t("Add package")
- ),
- },
- },
- {
- path: "edit/:package_id",
- name: "EHoldingsLocalPackagesFormAddEdit",
- component: EHoldingsLocalPackagesFormAdd,
- meta: {
- breadcrumb: () =>
- build_breadcrumb(
- [
- breadcrumb_paths.eholdings_local,
- breadcrumbs.eholdings.local
- .packages,
- ],
- "Edit package" // $t("Edit package")
- ),
- },
- },
- ],
+ path: ":agreement_id",
+ name: "AgreementsShow",
+ component: markRaw(AgreementsShow),
+ title: $__('Show agreement'),
},
{
- path: "titles",
- children: [
- {
- path: "",
- name: "EHoldingsLocalTitlesList",
- component: EHoldingsLocalTitlesList,
- meta: {
- breadcrumb: () =>
- build_breadcrumb([
- breadcrumb_paths.eholdings_local,
- breadcrumbs.eholdings.local.titles,
- ]),
- },
- },
- {
- path: ":title_id",
- name: "EHoldingsLocalTitlesShow",
- component: EHoldingsLocalTitlesShow,
- meta: {
- breadcrumb: () =>
- build_breadcrumb(
- [
- breadcrumb_paths.eholdings_local,
- breadcrumbs.eholdings.local
- .titles,
- ],
- "Show title" // $t("Show title")
- ),
- },
- },
- {
- path: "add",
- name: "EHoldingsLocalTitlesFormAdd",
- component: EHoldingsLocalTitlesFormAdd,
- meta: {
- breadcrumb: () =>
- build_breadcrumb(
- [
- breadcrumb_paths.eholdings_local,
- breadcrumbs.eholdings.local
- .titles,
- ],
- "Add title" // $t("Add title")
- ),
- },
- },
- {
- path: "edit/:title_id",
- name: "EHoldingsLocalTitlesFormAddEdit",
- component: EHoldingsLocalTitlesFormAdd,
- meta: {
- breadcrumb: () =>
- build_breadcrumb(
- [
- breadcrumb_paths.eholdings_local,
- breadcrumbs.eholdings.local
- .titles,
- ],
- "Edit title" // $t("Edit title")
- ),
- },
- },
- {
- path: "import",
- name: "EHoldingsLocalTitlesFormImport",
- component: EHoldingsLocalTitlesFormImport,
- meta: {
- breadcrumb: () =>
- build_breadcrumb(
- [
- breadcrumb_paths.eholdings_local,
- breadcrumbs.eholdings.local
- .titles,
- ],
- "Import from a list" // $t("Import from a list")
- ),
- },
- },
- ],
+ path: "add",
+ name: "AgreementsFormAdd",
+ component: markRaw(AgreementsFormAdd),
+ title: $__('Add agreement'),
},
{
- path: "resources/:resource_id",
- name: "EHoldingsLocalResourcesShow",
- component: EHoldingsLocalResourcesShow,
- meta: {
- breadcrumb: () =>
- build_breadcrumb(
- [
- breadcrumb_paths.eholdings_local,
- breadcrumbs.eholdings.local.titles,
- ],
- "Resource" // $t("Resource")
- ),
- },
+ path: "edit/:agreement_id",
+ name: "AgreementsFormAddEdit",
+ component: markRaw(AgreementsFormAdd),
+ title: $__('Edit agreement'),
},
],
},
{
- path: "ebsco",
+ path: "/cgi-bin/koha/erm/licenses",
+ title: $__('Licenses'),
+ icon: "fa-gavel",
+ is_end_node: true,
children: [
{
path: "",
- meta: {
- breadcrumb: () => breadcrumb_paths.eholdings_ebsco,
- },
+ name: "LicensesList",
+ component: markRaw(LicensesList),
+ },
+ {
+ path: ":license_id",
+ name: "LicensesShow",
+ component: markRaw(LicensesShow),
+ title: $__('Show license'),
+ },
+ {
+ path: "add",
+ name: "LicensesFormAdd",
+ component: markRaw(LicensesFormAdd),
+ title: $__('Add license'),
},
{
- path: "packages",
+ path: "edit/:license_id",
+ name: "LicensesFormAddEdit",
+ component: markRaw(LicensesFormAdd),
+ title: $__('Edit license'),
+ },
+ ],
+ },
+ {
+ path: "/cgi-bin/koha/erm/eholdings",
+ title: $__('eHoldings'),
+ icon: 'fa-crosshairs',
+ disabled: true,
+ children: [
+ {
+ path: "local",
+ title: $__('Local'),
+ icon: "fa-map-marker",
+ disabled: true,
children: [
{
- path: "",
- name: "EHoldingsEBSCOPackagesList",
- component: EHoldingsEBSCOPackagesList,
- meta: {
- breadcrumb: () =>
- build_breadcrumb([
- breadcrumb_paths.eholdings_ebsco,
- breadcrumbs.eholdings.ebsco
- .packages,
- ]),
- },
+ path: "packages",
+ title: $__('Packages'),
+ icon: "fa-archive",
+ is_end_node: true,
+ children: [
+ {
+ path: "",
+ name: "EHoldingsLocalPackagesList",
+ component: markRaw(EHoldingsLocalPackagesList),
+ },
+ {
+ path: ":package_id",
+ name: "EHoldingsLocalPackagesShow",
+ component: markRaw(EHoldingsLocalPackagesShow),
+ title: $__('Show package'),
+ },
+ {
+ path: "add",
+ name: "EHoldingsLocalPackagesFormAdd",
+ component: markRaw(EHoldingsLocalPackagesFormAdd),
+ title: $__('Add package'),
+ },
+ {
+ path: "edit/:package_id",
+ name: "EHoldingsLocalPackagesFormAddEdit",
+ component: markRaw(EHoldingsLocalPackagesFormAdd),
+ title: $__('Edit package'),
+ },
+ ],
},
{
- path: ":package_id",
- name: "EHoldingsEBSCOPackagesShow",
- component: EHoldingsEBSCOPackagesShow,
- meta: {
- breadcrumb: () =>
- build_breadcrumb(
- [
- breadcrumb_paths.eholdings_ebsco,
- breadcrumbs.eholdings.ebsco
- .packages,
- ],
- "Show package" // $t("Show package")
- ),
- },
+ path: "titles",
+ title: $__('Titles'),
+ icon: "fa-sort-alpha-asc",
+ is_end_node: true,
+ children: [
+ {
+ path: "",
+ name: "EHoldingsLocalTitlesList",
+ component: markRaw(EHoldingsLocalTitlesList),
+ },
+ {
+ path: ":title_id",
+ name: "EHoldingsLocalTitlesShow",
+ component: markRaw(EHoldingsLocalTitlesShow),
+ title: $__('Show title'),
+ },
+ {
+ path: "add",
+ name: "EHoldingsLocalTitlesFormAdd",
+ component: markRaw(EHoldingsLocalTitlesFormAdd),
+ title: $__('Add title'),
+ },
+ {
+ path: "edit/:title_id",
+ name: "EHoldingsLocalTitlesFormAddEdit",
+ component: markRaw(EHoldingsLocalTitlesFormAdd),
+ title: $__('Edit title'),
+ },
+ {
+ path: "import",
+ name: "EHoldingsLocalTitlesFormImport",
+ component: markRaw(EHoldingsLocalTitlesFormImport),
+ title: $__('Import from a list'),
+ },
+ {
+ path: "/cgi-bin/koha/erm/eholdings/local/resources/:resource_id",
+ name: "EHoldingsLocalResourcesShow",
+ component: markRaw(EHoldingsLocalResourcesShow),
+ title: $__('Resource'),
+ },
+ ],
},
],
},
{
- path: "titles",
+ path: "ebsco",
+ title: $__('EBSCO'),
+ icon: 'fa-globe',
+ disabled: true,
children: [
{
- path: "",
- name: "EHoldingsEBSCOTitlesList",
- component: EHoldingsEBSCOTitlesList,
- meta: {
- breadcrumb: () =>
- build_breadcrumb([
- breadcrumb_paths.eholdings_ebsco,
- breadcrumbs.eholdings.ebsco.titles,
- ]),
- },
+ path: "packages",
+ title: $__('Packages'),
+ icon: "fa-archive",
+ is_end_node: true,
+ children: [
+ {
+ path: "",
+ name: "EHoldingsEBSCOPackagesList",
+ component: markRaw(EHoldingsEBSCOPackagesList),
+ },
+ {
+ path: ":package_id",
+ name: "EHoldingsEBSCOPackagesShow",
+ component: markRaw(EHoldingsEBSCOPackagesShow),
+ title: $__('Show package'),
+ },
+ ],
},
{
- path: ":title_id",
- name: "EHoldingsEBSCOTitlesShow",
- component: EHoldingsEBSCOTitlesShow,
- meta: {
- breadcrumb: () =>
- build_breadcrumb(
- [
- breadcrumb_paths.eholdings_ebsco,
- breadcrumbs.eholdings.ebsco
- .titles,
- ],
- "Show title" // $t("Show title")
- ),
- },
+ path: "titles",
+ title: $__('Titles'),
+ icon: "fa-sort-alpha-asc",
+ is_end_node: true,
+ children: [
+ {
+ path: "",
+ name: "EHoldingsEBSCOTitlesList",
+ component: markRaw(EHoldingsEBSCOTitlesList),
+ },
+ {
+ path: ":title_id",
+ name: "EHoldingsEBSCOTitlesShow",
+ component: markRaw(EHoldingsEBSCOTitlesShow),
+ title: $__('Show title'),
+ },
+ {
+ path: "/cgi-bin/koha/erm/eholdings/ebsco/resources/:resource_id",
+ name: "EHoldingsEBSCOResourcesShow",
+ component: markRaw(EHoldingsEBSCOResourcesShow),
+ title: $__('Resource'),
+ is_navigation_item: false,
+ },
+ ],
},
],
},
- {
- path: "resources/:resource_id",
- name: "EHoldingsEBSCOResourcesShow",
- component: EHoldingsEBSCOResourcesShow,
- meta: {
- breadcrumb: () =>
- build_breadcrumb(
- [
- breadcrumb_paths.eholdings_ebsco,
- breadcrumbs.eholdings.ebsco.titles,
- ],
- "Resource" // $t("Resource")
- ),
- },
- },
],
},
- ],
- },
- {
- path: "/cgi-bin/koha/erm/licenses",
- children: [
- {
- path: "",
- name: "LicensesList",
- component: LicensesList,
- meta: {
- breadcrumb: () => breadcrumb_paths.licenses,
- },
- },
- {
- path: ":license_id",
- name: "LicensesShow",
- component: LicensesShow,
- meta: {
- breadcrumb: () =>
- build_breadcrumb(
- breadcrumb_paths.licenses,
- "Show license" // $t("Show license")
- ),
- },
- },
- {
- path: "add",
- name: "LicensesFormAdd",
- component: LicensesFormAdd,
- meta: {
- breadcrumb: () =>
- build_breadcrumb(
- breadcrumb_paths.licenses,
- "Add license" // $t("Add license")
- ),
- },
- },
- {
- path: "edit/:license_id",
- name: "LicensesFormAddEdit",
- component: LicensesFormAdd,
- meta: {
- breadcrumb: () =>
- build_breadcrumb(
- breadcrumb_paths.licenses,
- "Edit license" // $t("Edit license")
- ),
- },
- },
- ],
+ ]
},
];
--- a/koha-tmpl/intranet-tmpl/prog/js/vue/stores/navigation.js
+++ a/koha-tmpl/intranet-tmpl/prog/js/vue/stores/navigation.js
@@ -0,0 +1,211 @@
+import {
+ defineStore
+} from "pinia";
+
+export const useNavigationStore = defineStore("navigation", {
+ state: () => ({
+ routeState: {
+ alt: "Home",
+ href: "/cgi-bin/koha/mainpage.pl",
+ is_navigation_item: false,
+ is_base: true,
+ children: []
+ },
+ current: null,
+ }),
+ actions: {
+ setRoutes(routesDef) {
+ if (!Array.isArray(routesDef)) {
+ routesDef = [routesDef]
+ }
+ this.routeState.children = routesDef
+ _traverseChildren(this.routeState)
+
+ return this.navigationRoutes
+
+ // Function declarations
+
+ function _traverseChildren(parent) {
+ if (isParent(parent)) {
+ parent.children.forEach(child => {
+ _setChildDefaults(parent, child);
+ _traverseChildren(child)
+ })
+ }
+ }
+
+ function _setChildDefaults(parent, child) {
+ child.parent = parent;
+ if (isRoutable(child)) {
+ _setMetadata(child);
+ }
+ if (parent.children.length === 1 && parent.is_base) {
+ _setBaseAndNavigationDefaults(child, {
+ is_base: true,
+ is_navigation_item: false
+ });
+ } else {
+ _setBaseAndNavigationDefaults(child, {
+ is_base: false,
+ is_navigation_item: true
+ });
+ }
+ }
+
+ function _setBaseAndNavigationDefaults(child, {
+ is_base,
+ is_navigation_item
+ }) {
+ child.is_base = child.is_base !== undefined ? child.is_base : is_base;
+ child.is_navigation_item = child.is_navigation_item !== undefined ? child.is_navigation_item : is_navigation_item;
+ }
+
+ function _setMetadata(child) {
+ if (!child.meta)
+ child.meta = {};
+ child.meta.self = child;
+ }
+ }
+ },
+ getters: {
+ breadcrumbs() {
+ if (this.current)
+ return _traverseParent(this.current)
+
+ return _getBaseElements(this.routeState)
+
+ // Function declarations
+
+ function _getBaseElements(parent) {
+ if (!parent.is_base) return []
+ let next = {}
+ if (isParent(parent)) {
+ next = _defineNextElement(parent)
+ }
+ return [{
+ ...parent,
+ children: null
+ }, ..._getBaseElements(next)]
+ }
+
+ function _defineNextElement(parent) {
+ return parent.children.find(child => child.is_default) || parent.children[0];
+ }
+
+ function _traverseParent(child) {
+ let breadcrumbs = []
+ let builtPath = child.path
+ if (child.parent) {
+ breadcrumbs = _traverseParent(child.parent)
+ builtPath = _buildPath(builtPath, breadcrumbs);
+ }
+ if (_isBaseOrNotStub(child)) breadcrumbs.push({
+ ...child,
+ icon: null,
+ path: builtPath,
+ children: null
+ })
+ return breadcrumbs
+ }
+
+ function _isBaseOrNotStub(child) {
+ return child.is_base || (child.path && child.path !== '');
+ }
+
+ function _buildPath(builtPath, breadcrumbs) {
+ if (!isAbsolutePath(builtPath)) {
+ const {
+ path: parentPath
+ } = breadcrumbs[breadcrumbs.length - 1];
+ if (parentPath !== undefined) {
+ builtPath = `${parentPath}${addSlashIfNotPresent(parentPath)}${builtPath}`;
+ }
+ }
+ return builtPath;
+ }
+ },
+ leftNavigation() {
+ return _getNavigationElements(this.routeState)
+
+ // Function declarations
+
+ function _getNavigationElements(parent, prevPath = '') {
+ if (_isBaseAndNoChildren(parent)) return [];
+ if (parent.is_base)
+ return _buildChildNavigationElements(parent).flat(Infinity)
+
+ const builtPath = _buildPath(prevPath, parent);
+
+ let children = []
+ if (!parent.is_end_node && isParent(parent)) {
+ children = _buildChildNavigationElements(parent, builtPath)
+ }
+
+ return {
+ ...parent,
+ path: builtPath ? builtPath : parent.path,
+ children
+ }
+ }
+
+ function _buildPath(prevPath, element) {
+ let builtPath;
+
+ if (isRoutable(element) && isAbsolutePath(element.path)) {
+ builtPath = element.path;
+ } else {
+ if (prevPath)
+ builtPath = `${prevPath}${addSlashIfNotPresent(prevPath)}`;
+ if (isRoutable(element))
+ builtPath = `${builtPath}${element.path}`;
+ }
+
+ return builtPath;
+ }
+
+ function _buildChildNavigationElements(parent, builtPath) {
+ return parent.children
+ .filter(child => child.is_base || child.is_navigation_item)
+ .map(child => _getNavigationElements(child, builtPath));
+ }
+
+ function _isBaseAndNoChildren(parent) {
+ return parent.is_base && (!parent.children || !parent.children.length);
+ }
+ },
+ navigationRoutes() {
+ let routes = _toRoute(this.routeState)
+ return Array.isArray(routes) ? routes : [routes]
+
+ // Function declarations
+
+ function _toRoute(parent) {
+ if (!isRoutable(parent))
+ return _getRoutableChildren(parent)
+ return parent
+ }
+
+ function _getRoutableChildren(parent) {
+ return parent.children
+ .map(child => _toRoute(child))
+ .flat(Infinity);
+ }
+ }
+ }
+})
+
+function addSlashIfNotPresent(path) {
+ return /\/$/.test(path) ? '' : '/';
+}
+
+function isRoutable(element) {
+ return element.path !== undefined || element.name !== undefined;
+}
+
+function isParent(parent) {
+ return parent.children && parent.children.length;
+}
+
+function isAbsolutePath(path) {
+ return /^\//.test(path);
+}
--