@opengis/cms 0.0.21 → 0.0.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/package.json +2 -2
  2. package/src/App.css +52 -0
  3. package/src/App.vue +62 -0
  4. package/src/assets/image.png +0 -0
  5. package/src/assets/main.css +3 -0
  6. package/src/assets/tailwind-3.4.17.js +113 -0
  7. package/src/components/LanguageSwitcher.vue +73 -0
  8. package/src/components/SettingsCard.vue +40 -0
  9. package/src/components/builder/CreateForm.vue +128 -0
  10. package/src/components/builder/formTypeSchema.js +145 -0
  11. package/src/components/builder/tabs/index.ts +9 -0
  12. package/src/components/builder/tabs/vs-builder-edit.vue +133 -0
  13. package/src/components/builder/tabs/vs-builder-monaco.vue +29 -0
  14. package/src/components/builder/tabs/vs-builder-preview.vue +39 -0
  15. package/src/components/builder/vs-builder-datatable-controls.vue +138 -0
  16. package/src/components/builder/vs-builder-datatable-form.vue +80 -0
  17. package/src/components/builder/vs-builder-datatable.vue +191 -0
  18. package/src/components/builder/vs-builder-list-item.vue +110 -0
  19. package/src/components/collections/CollectionsBreadcrumb.vue +52 -0
  20. package/src/components/collections/CollectionsGrid.vue +176 -0
  21. package/src/components/collections/ContentBlock.vue +75 -0
  22. package/src/components/collections/formWrapper.vue +156 -0
  23. package/src/components/dashboard/ContentItem.vue +82 -0
  24. package/src/components/dashboard/DashboardHeader.vue +33 -0
  25. package/src/components/dashboard/QuickActions.vue +84 -0
  26. package/src/components/dashboard/RecentContent.vue +54 -0
  27. package/src/components/dashboard/StatCard.vue +63 -0
  28. package/src/components/dashboard/StatsGrid.vue +28 -0
  29. package/src/components/form-components/MonacoEditor.vue +104 -0
  30. package/src/components/form-components/VsFormMeta.vue +40 -0
  31. package/src/components/form-components/VsFormTags.vue +150 -0
  32. package/src/components/form-components/custom-datatable/vs-form-custom-datatable-add.vue +84 -0
  33. package/src/components/form-components/custom-datatable/vs-form-custom-datatable-controls.vue +106 -0
  34. package/src/components/form-components/index.js +23 -0
  35. package/src/components/form-components/reference/vs-form-reference-add.vue +92 -0
  36. package/src/components/form-components/reference/vs-form-reference-controls.vue +101 -0
  37. package/src/components/form-components/reference-list/referenceOptionList.js +78 -0
  38. package/src/components/form-components/reference-list/vs-form-reference-add.vue +145 -0
  39. package/src/components/form-components/reference-list/vs-form-reference-choce.vue +39 -0
  40. package/src/components/form-components/reference-list/vs-form-reference-controls.vue +110 -0
  41. package/src/components/form-components/reference-skeleton/about-skeleton.vue +37 -0
  42. package/src/components/form-components/reference-skeleton/banner-skeleton.vue +29 -0
  43. package/src/components/form-components/reference-skeleton/body-skeleton.vue +56 -0
  44. package/src/components/form-components/reference-skeleton/cards-skeleton.vue +47 -0
  45. package/src/components/form-components/reference-skeleton/documents-skeleton.vue +64 -0
  46. package/src/components/form-components/reference-skeleton/faq-skeleton.vue +64 -0
  47. package/src/components/form-components/reference-skeleton/form-skeleton.vue +41 -0
  48. package/src/components/form-components/reference-skeleton/index.js +36 -0
  49. package/src/components/form-components/reference-skeleton/infoLine-skeleton.vue +37 -0
  50. package/src/components/form-components/reference-skeleton/news-skeleton.vue +54 -0
  51. package/src/components/form-components/reference-skeleton/slider-skeleton.vue +41 -0
  52. package/src/components/form-components/reference-skeleton/tabs-skeleton.vue +40 -0
  53. package/src/components/form-components/reference-skeleton/team-skeleton.vue +103 -0
  54. package/src/components/form-components/reference-skeleton/usefulLinks-skeleton.vue +52 -0
  55. package/src/components/form-components/reference-skeleton/video-skeleton.vue +36 -0
  56. package/src/components/form-components/testReferenceTypes.js +773 -0
  57. package/src/components/form-components/vs-form-color-picker.vue +29 -0
  58. package/src/components/form-components/vs-form-custom-datatable.vue +214 -0
  59. package/src/components/form-components/vs-form-integer.vue +86 -0
  60. package/src/components/form-components/vs-form-key-value.vue +201 -0
  61. package/src/components/form-components/vs-form-marcdown-md.vue +3 -0
  62. package/src/components/form-components/vs-form-media-select.vue +780 -0
  63. package/src/components/form-components/vs-form-reference-list.vue +97 -0
  64. package/src/components/form-components/vs-form-reference.vue +59 -0
  65. package/src/components/form-components/vs-form-relation.vue +30 -0
  66. package/src/components/form-components/vs-form-reletion-link.vue +34 -0
  67. package/src/components/form-components/vs-form-select-collection.vue +0 -0
  68. package/src/components/form-components/vs-form-slug.vue +72 -0
  69. package/src/components/form-components/vs-form-tiptap.vue +7 -0
  70. package/src/components/form-components/vs-richtext-md.vue +3 -0
  71. package/src/components/icons/BellIcon.vue +17 -0
  72. package/src/components/icons/GlobeIcon.vue +18 -0
  73. package/src/components/icons/KeyIcon.vue +20 -0
  74. package/src/components/icons/PaletteIcon.vue +22 -0
  75. package/src/components/icons/SettingsIcon.vue +19 -0
  76. package/src/components/icons/ShieldIcon.vue +18 -0
  77. package/src/components/icons/UsersIcon.vue +19 -0
  78. package/src/components/icons/icon-chevron-right.vue +16 -0
  79. package/src/components/icons/icon-drag.vue +20 -0
  80. package/src/components/icons/icon-file-text.vue +21 -0
  81. package/src/components/icons/icon-folder.vue +18 -0
  82. package/src/components/icons/icon-grid.vue +17 -0
  83. package/src/components/icons/icon-group.vue +19 -0
  84. package/src/components/icons/icon-home.vue +16 -0
  85. package/src/components/icons/icon-image.vue +18 -0
  86. package/src/components/icons/icon-list.vue +20 -0
  87. package/src/components/icons/icon-more.vue +17 -0
  88. package/src/components/icons/icon-plus.vue +17 -0
  89. package/src/components/icons-types/icon-array.vue +22 -0
  90. package/src/components/icons-types/icon-boolean.vue +18 -0
  91. package/src/components/icons-types/icon-datalist.vue +22 -0
  92. package/src/components/icons-types/icon-date.vue +20 -0
  93. package/src/components/icons-types/icon-datetime.vue +20 -0
  94. package/src/components/icons-types/icon-file.vue +21 -0
  95. package/src/components/icons-types/icon-gallery.vue +18 -0
  96. package/src/components/icons-types/icon-image.vue +19 -0
  97. package/src/components/icons-types/icon-integer.vue +20 -0
  98. package/src/components/icons-types/icon-merkdown.vue +18 -0
  99. package/src/components/icons-types/icon-multiselect.vue +22 -0
  100. package/src/components/icons-types/icon-number.vue +20 -0
  101. package/src/components/icons-types/icon-radio.vue +22 -0
  102. package/src/components/icons-types/icon-reference-list.vue +22 -0
  103. package/src/components/icons-types/icon-reference.vue +20 -0
  104. package/src/components/icons-types/icon-relation.vue +22 -0
  105. package/src/components/icons-types/icon-richtext.vue +18 -0
  106. package/src/components/icons-types/icon-select.vue +22 -0
  107. package/src/components/icons-types/icon-slug.vue +19 -0
  108. package/src/components/icons-types/icon-text.vue +19 -0
  109. package/src/components/icons-types/index.js +43 -0
  110. package/src/components/layout/Layout.vue +67 -0
  111. package/src/components/layout/Sidebar.vue +128 -0
  112. package/src/components/media/FileUploadProgress.vue +29 -0
  113. package/src/components/media/MediaBreadcrumb.vue +42 -0
  114. package/src/components/media/MediaCreateFolder.vue +59 -0
  115. package/src/components/media/MediaFileInfo.vue +148 -0
  116. package/src/components/media/MediaGrid.vue +148 -0
  117. package/src/components/media/MediaList.vue +148 -0
  118. package/src/components/media/MediaViewControls.vue +38 -0
  119. package/src/components/media/TypeTag.vue +23 -0
  120. package/src/components/menu/AddNewItemInTree.vue +75 -0
  121. package/src/components/menu/MenuBody.vue +149 -0
  122. package/src/components/menu/MenuItem.vue +73 -0
  123. package/src/components/menu/MenuList.vue +101 -0
  124. package/src/components/referencec/index.ts +7 -0
  125. package/src/components/referencec/vs-reference-faq.vue +61 -0
  126. package/src/components/referencec/vs-reference-user-card.vue +40 -0
  127. package/src/components/settings/NotificationSettings.vue +32 -0
  128. package/src/components/settings/SettingsTable.vue +50 -0
  129. package/src/components/settings/SettingsTitle.vue +33 -0
  130. package/src/components/settings/SettingsToggleItem.vue +25 -0
  131. package/src/components/sidebar/DropdownMenu.vue +34 -0
  132. package/src/components/sidebar/SettingsSidebar.vue +121 -0
  133. package/src/components/sidebar/SidebarFooter.vue +52 -0
  134. package/src/components/sidebar/SidebarHeader.vue +57 -0
  135. package/src/components/sidebar/SidebarMenu.vue +78 -0
  136. package/src/components/ui/EmptyData.vue +76 -0
  137. package/src/components/ui/UniversalTable.vue +310 -0
  138. package/src/components/ui/UniversalTableFilters.vue +0 -0
  139. package/src/components/ui/UniversalTablePagination.vue +118 -0
  140. package/src/components/ui/VsPreview.vue +75 -0
  141. package/src/composables/useCollectionView.ts +21 -0
  142. package/src/composables/useDebounce.ts +26 -0
  143. package/src/composables/useMonaco.ts +28 -0
  144. package/src/composables/useTheme.ts +40 -0
  145. package/src/content/test-slug/metadata.json +1 -0
  146. package/src/i18n.ts +75 -0
  147. package/src/index.css +3 -0
  148. package/src/locales/en.json +778 -0
  149. package/src/locales/uk.json +797 -0
  150. package/src/main.ts +41 -0
  151. package/src/pages/Dashboard.vue +168 -0
  152. package/src/pages/EmailPage.vue +183 -0
  153. package/src/pages/FeedbackPage.vue +232 -0
  154. package/src/pages/MediaPage.vue +372 -0
  155. package/src/pages/TagsPage.vue +207 -0
  156. package/src/pages/builder/BuilderPage.vue +195 -0
  157. package/src/pages/builder/EditCollectionPage.vue +163 -0
  158. package/src/pages/collections/ArticlesPage.vue +385 -0
  159. package/src/pages/collections/CollectionsPage.vue +146 -0
  160. package/src/pages/collections/SingletonsPage.vue +119 -0
  161. package/src/pages/collections/contentForm.vue +484 -0
  162. package/src/pages/collections/schema/seo.ts +27 -0
  163. package/src/pages/menu/MenuAddPage.vue +123 -0
  164. package/src/pages/menu/MenuItemPage.vue +183 -0
  165. package/src/pages/menu/MenuPage.vue +133 -0
  166. package/src/pages/settings/ApiKeys.vue +75 -0
  167. package/src/pages/settings/Appearance.vue +80 -0
  168. package/src/pages/settings/Logs.vue +260 -0
  169. package/src/pages/settings/PermissionsPage.vue +237 -0
  170. package/src/pages/settings/Settings.vue +186 -0
  171. package/src/pages/settings/Users.vue +109 -0
  172. package/src/pages/settings/general.vue +154 -0
  173. package/src/pages/settings/generalScheme.js +132 -0
  174. package/src/pages/users/AddUser.vue +106 -0
  175. package/src/pages/users/UsersPage.vue +98 -0
  176. package/src/props/builder.ts +67 -0
  177. package/src/props/content.ts +56 -0
  178. package/src/props/media.ts +63 -0
  179. package/src/router/index.ts +181 -0
  180. package/src/types/fastify-auth.d.ts +4 -0
  181. package/src/utils/getField.js +270 -0
  182. package/src/utils/translit.js +19 -0
  183. package/src/vite-env.d.ts +1 -0
@@ -0,0 +1,98 @@
1
+ <template>
2
+ <div class="space-y-6 max-w-7xl mx-auto">
3
+ <div class="flex items-center justify-between mb-8">
4
+ <div>
5
+ <div class="flex items-center gap-2">
6
+ <h1 class="text-3xl font-bold text-slate-800 dark:text-slate-100 mb-2">{{ $t("users.createUser") }}</h1>
7
+ <a :href="`https://cms.opengis.info/${locale}/config/user-management/`" target="_blank" :title="$t('guide.users')">
8
+ <HelpCircle class="w-5 h-5" />
9
+ </a>
10
+ </div>
11
+ <p class="text-slate-600 dark:text-slate-300">{{ $t("users.description") }}</p>
12
+ </div>
13
+ <router-link
14
+ v-if="users?.rows?.length > 0"
15
+ to="/users/create/"
16
+ class="inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium h-9 px-4 py-2 bg-blue-600 text-white shadow-md transition-all duration-200 transform
17
+ hover:bg-blue-700 hover:shadow-lg hover:scale-105
18
+ focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring
19
+ disabled:pointer-events-none disabled:opacity-50"
20
+ >
21
+ <Plus class="w-4 h-4 mr-2" />
22
+ {{ $t("users.createUser") }}
23
+ </router-link>
24
+ </div>
25
+ <div class="rounded-xl text-card-foreground shadow-lg border-0 bg-white dark:bg-slate-800 backdrop-blur-sm overflow-hidden">
26
+ <EmptyData
27
+ v-if="!users || users?.rows?.length === 0"
28
+ :title="t('users.emptyTitle')"
29
+ :description="t('users.emptyDescription')"
30
+ :button-text="t('users.emptyButton')"
31
+ :show-button="true"
32
+ />
33
+ <UniversalTable
34
+ v-if="users?.rows?.length > 0"
35
+ :columns="users.columns"
36
+ :rows="users.rows"
37
+ :on-edit="handleEditUser"
38
+ @delete="handleDeleteUser"
39
+ />
40
+ </div>
41
+ </div>
42
+ </template>
43
+
44
+ <script setup>
45
+ import { ref, onMounted } from 'vue';
46
+ import { useI18n } from 'vue-i18n';
47
+ import { Plus, HelpCircle } from 'lucide-vue-next';
48
+ import { notify } from '@opengis/core';
49
+ import { useRouter } from 'vue-router';
50
+ const { t, locale } = useI18n();
51
+ import EmptyData from '@/components/ui/EmptyData.vue';
52
+ import UniversalTable from '@/components/ui/UniversalTable.vue';
53
+
54
+ const router = useRouter();
55
+
56
+ const users = ref([]);
57
+
58
+ const fetchUsers = async () => {
59
+ try {
60
+ const response = await fetch('api/data/admin.users.table');
61
+ const data = await response.json();
62
+ users.value = data;
63
+ } catch (error) {
64
+ console.error(error);
65
+ }
66
+ }
67
+
68
+ const handleDeleteUser = async (user) => {
69
+ try {
70
+ let token = await fetch(`/api/form/admin.users.table/${user.uid}`)
71
+ token = await token.json();
72
+ await fetch(`/api/table/${token.token}`, { method: 'DELETE'})
73
+
74
+ notify({
75
+ type: "success",
76
+ title: t("common.actions.success"),
77
+ message: t("users.deleteUserSuccess"),
78
+ });
79
+
80
+ fetchUsers();
81
+ } catch (error) {
82
+ notify({
83
+ type: "error",
84
+ title: t("common.actions.warning"),
85
+ message: t("users.deleteUserFailed"),
86
+ });
87
+ console.error(error);
88
+ }
89
+ }
90
+
91
+ const handleEditUser = async (user) => {
92
+ router.push(`/users/edit/${user.uid}`);
93
+ }
94
+
95
+ onMounted(() => {
96
+ fetchUsers();
97
+ })
98
+ </script>
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Builder/Content Type definitions
3
+ */
4
+
5
+ export type ContentTypeStatus = 'draft' | 'published' | 'archived';
6
+ export type ContentTypeType = 'collection' | 'single';
7
+
8
+ export interface ContentType {
9
+ id: string;
10
+ content_type_id: string;
11
+ name: string;
12
+ title: string;
13
+ table_name?: string;
14
+ columns?: any;
15
+ status: ContentTypeStatus;
16
+ visible: boolean;
17
+ localized: boolean;
18
+ type: ContentTypeType;
19
+ schema?: any;
20
+ description?: string;
21
+ icon?: string;
22
+ color?: string;
23
+ preview_path?: string;
24
+ created_at: string;
25
+ updated_at: string;
26
+ created_by: string;
27
+ updated_by?: string;
28
+ entries?: number;
29
+ fields?: number;
30
+ }
31
+
32
+ export interface Collection extends ContentType {
33
+ entries: number;
34
+ fields: number;
35
+ }
36
+
37
+ export interface FieldType {
38
+ type: string;
39
+ label: string;
40
+ placeholder?: string;
41
+ options?: Array<{ text: string; id: string; color?: string }>;
42
+ validators?: string[];
43
+ conditions?: any[];
44
+ mode?: string;
45
+ }
46
+
47
+ export interface FormTypeSchema {
48
+ name: FieldType;
49
+ type: FieldType;
50
+ subtype?: FieldType;
51
+ parent?: FieldType;
52
+ options?: FieldType;
53
+ }
54
+
55
+ export interface BuilderFormData {
56
+ name: string;
57
+ title: string;
58
+ description?: string;
59
+ type: ContentTypeType;
60
+ status: ContentTypeStatus;
61
+ visible: boolean;
62
+ localized: boolean;
63
+ schema?: any;
64
+ icon?: string;
65
+ color?: string;
66
+ preview_path?: string;
67
+ }
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Content definitions
3
+ */
4
+
5
+ export interface ContentItem {
6
+ id: string;
7
+ content_type_id: string;
8
+ title?: string;
9
+ slug?: string;
10
+ status: 'draft' | 'published' | 'archived';
11
+ visible: boolean;
12
+ created_at: string;
13
+ updated_at: string;
14
+ created_by: string;
15
+ updated_by?: string;
16
+ [key: string]: any; // For dynamic fields based on content type schema
17
+ }
18
+
19
+ export interface ContentEntry extends ContentItem {
20
+ // Additional fields that might be present in content entries
21
+ description?: string;
22
+ content?: string;
23
+ excerpt?: string;
24
+ featured_image?: string;
25
+ tags?: string[];
26
+ categories?: string[];
27
+ author?: string;
28
+ published_at?: string;
29
+ }
30
+
31
+ export interface ContentFormData {
32
+ title?: string;
33
+ slug?: string;
34
+ status: 'draft' | 'published' | 'archived';
35
+ visible: boolean;
36
+ [key: string]: any; // For dynamic fields
37
+ }
38
+
39
+ export interface ContentListResponse {
40
+ rows: ContentItem[];
41
+ total: number;
42
+ page: number;
43
+ limit: number;
44
+ totalPages: number;
45
+ }
46
+
47
+ export interface ContentFilters {
48
+ status?: 'draft' | 'published' | 'archived';
49
+ visible?: boolean;
50
+ content_type_id?: string;
51
+ search?: string;
52
+ page?: number;
53
+ limit?: number;
54
+ sort?: string;
55
+ order?: 'asc' | 'desc';
56
+ }
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Media file type definitions
3
+ */
4
+
5
+ export type MediaFileType = 'image' | 'document' | 'other';
6
+
7
+ export interface MediaFile {
8
+ id: string;
9
+ filename: string;
10
+ filetype: MediaFileType;
11
+ filesize: number;
12
+ url: string;
13
+ description: string | null;
14
+ alt: string | null;
15
+ mime: string;
16
+ preview_url: string | null;
17
+ created_at: string;
18
+ updated_at: string;
19
+ created_by: string;
20
+ updated_by: string;
21
+ filepath: string;
22
+ metadata: string;
23
+ exists: boolean;
24
+ }
25
+
26
+ /**
27
+ * Maps MIME types to file types
28
+ * @param mime - MIME type
29
+ * @returns MediaFileType
30
+ */
31
+ export function getFileTypeFromMime(mime: string): MediaFileType {
32
+ if (mime.startsWith('image/')) return 'image';
33
+ if (mime.startsWith('application/pdf') ||
34
+ mime.startsWith('application/msword') ||
35
+ mime.startsWith('application/vnd.openxmlformats-officedocument')) {
36
+ return 'document';
37
+ }
38
+ return 'other';
39
+ }
40
+
41
+ /**
42
+ * Formats file size to human readable format
43
+ * @param bytes - Size in bytes
44
+ * @returns string
45
+ */
46
+ export function formatFileSize(bytes: number): string {
47
+ if (bytes === 0) return '0 Bytes';
48
+ const k = 1024;
49
+ const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
50
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
51
+ return Number.parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
52
+ }
53
+
54
+ /**
55
+ * Formats date to YYYY-MM-DD
56
+ * @param dateString - ISO date string
57
+ * @returns string
58
+ */
59
+ export function formatDate(dateString: string): string {
60
+ const date = new Date(dateString);
61
+ if (isNaN(date.getTime())) return '';
62
+ return date.toISOString().slice(0, 10);
63
+ }
@@ -0,0 +1,181 @@
1
+ import { createRouter, createWebHistory, type RouteLocationNormalized } from 'vue-router';
2
+ import { i18n } from '../i18n.ts';
3
+
4
+ const router = createRouter({
5
+ history: createWebHistory(),
6
+ routes: [
7
+ {
8
+ path: '/',
9
+ name: 'dashboard',
10
+ component: () => import('../pages/Dashboard.vue'),
11
+ meta: { title: 'dashboard.title' }
12
+ },
13
+ {
14
+ path: '/settings/collections',
15
+ name: 'collections',
16
+ component: () => import('../pages/builder/BuilderPage.vue'),
17
+ meta: { title: 'builder.collections' }
18
+ },
19
+
20
+ {
21
+ path: '/settings/collections/edit/:id',
22
+ name: 'editCollection',
23
+ component: () => import('../pages/builder/EditCollectionPage.vue'),
24
+ meta: { title: 'builder.editCollection' }
25
+ },
26
+ {
27
+ path: '/collections',
28
+ name: 'collectionsList',
29
+ component: () => import('../pages/collections/CollectionsPage.vue'),
30
+ meta: { title: 'navigation.collections' }
31
+ },
32
+ {
33
+ path: '/collections/:id',
34
+ name: 'articles',
35
+ component: () => import('../pages/collections/ArticlesPage.vue'),
36
+ meta: { title: 'articles.title' }
37
+ },
38
+ {
39
+ path: '/collections/:collection/create',
40
+ name: 'createArticle',
41
+ component: () => import('../pages/collections/contentForm.vue'),
42
+ meta: { title: 'articles.createArticle', type: 'articles' }
43
+ },
44
+ {
45
+ path: '/collections/:collection/:id',
46
+ name: 'editArticle',
47
+ component: () => import('../pages/collections/contentForm.vue'),
48
+ meta: { title: 'articles.title', type: 'articles' }
49
+ },
50
+ {
51
+ path: '/singletons',
52
+ name: 'singletons',
53
+ component: () => import('../pages/collections/SingletonsPage.vue'),
54
+ meta: { title: 'singletons.title' }
55
+ },
56
+ {
57
+ path: '/singletons/create',
58
+ name: 'createSingleton',
59
+ component: () => import('../pages/collections/contentForm.vue'),
60
+ meta: { title: 'singletons.createSingleton', type: 'single' }
61
+ },
62
+ {
63
+ path: '/singletons/:id',
64
+ name: 'editSingleton',
65
+ component: () => import('../pages/collections/contentForm.vue'),
66
+ meta: { title: 'singletons.title', type: 'single' }
67
+ },
68
+ {
69
+ path: '/menu',
70
+ name: 'singletonsMenu',
71
+ component: () => import('../pages/menu/MenuPage.vue'),
72
+ meta: { title: 'menu.title' }
73
+ },
74
+ {
75
+ path: '/menu/:id',
76
+ name: 'editSingletonMenu',
77
+ component: () => import('../pages/menu/MenuItemPage.vue'),
78
+ meta: { title: 'menu.editMenu', type: 'single' }
79
+ },
80
+ {
81
+ path: '/menu/create',
82
+ name: 'createSingletonMenu',
83
+ component: () => import('../pages/menu/MenuAddPage.vue'),
84
+ meta: { title: 'menu.menuAdd', type: 'single' }
85
+ },
86
+ {
87
+ path: '/feedback',
88
+ name: 'feedback',
89
+ component: () => import('../pages/FeedbackPage.vue'),
90
+ meta: { title: 'feedback.title' }
91
+ },
92
+ {
93
+ path: '/email',
94
+ name: 'email',
95
+ component: () => import('../pages/EmailPage.vue'),
96
+ meta: { title: 'email.title' }
97
+ },
98
+ {
99
+ path: '/tags',
100
+ name: 'tags',
101
+ component: () => import('../pages/TagsPage.vue'),
102
+ meta: { title: 'tags.title' }
103
+ },
104
+ {
105
+ path: '/users',
106
+ name: 'users',
107
+ component: () => import('../pages/users/UsersPage.vue'),
108
+ meta: { title: 'users.title' }
109
+ },
110
+ {
111
+ path: '/users/edit/:id',
112
+ name: 'editUser',
113
+ component: () => import('../pages/users/AddUser.vue'),
114
+ meta: { title: 'users.editUser' }
115
+ },
116
+ {
117
+ path: '/users/create',
118
+ name: 'createUser',
119
+ component: () => import('../pages/users/AddUser.vue'),
120
+ meta: { title: 'users.createUser' }
121
+ },
122
+ {
123
+ path: '/media',
124
+ name: 'media',
125
+ component: () => import('../pages/MediaPage.vue'),
126
+ meta: { title: 'media.title' }
127
+ },
128
+ {
129
+ path: '/settings',
130
+ name: 'settings',
131
+ component: () => import('../pages/settings/Settings.vue'),
132
+ meta: { title: 'settings.title' }
133
+ },
134
+ {
135
+ path: '/settings/users',
136
+ name: 'settingsUsers',
137
+ component: () => import('../pages/settings/Users.vue'),
138
+ meta: { title: 'settings.users.users' }
139
+ },
140
+ {
141
+ path: '/settings/general',
142
+ name: 'general',
143
+ component: () => import('../pages/settings/general.vue'),
144
+ meta: { title: 'settings.general.general' }
145
+ },
146
+ {
147
+ path: '/settings/api-keys',
148
+ name: 'apiKeys',
149
+ component: () => import('../pages/settings/ApiKeys.vue'),
150
+ meta: { title: 'settings.api-keys.apiKeys' }
151
+ },
152
+ {
153
+ path: '/settings/appearance',
154
+ name: 'appearance',
155
+ component: () => import('../pages/settings/Appearance.vue'),
156
+ meta: { title: 'settings.appearance.appearance' }
157
+ },
158
+ {
159
+ path: '/settings/logs',
160
+ name: 'logs',
161
+ component: () => import('../pages/settings/Logs.vue'),
162
+ meta: { title: 'settings.logs.title' }
163
+ },
164
+ {
165
+ path: '/settings/permissions',
166
+ name: 'permissions',
167
+ component: () => import('../pages/settings/PermissionsPage.vue'),
168
+ meta: { title: 'settings.permissions.title' }
169
+ }
170
+ ]
171
+ });
172
+
173
+ export default router;
174
+
175
+ router.afterEach((to) => {
176
+ const t = i18n.global.t;
177
+ const defaultTitle = 'CMS';
178
+ document.title = (to.meta && typeof to.meta.title === 'string')
179
+ ? t(to.meta.title)
180
+ : defaultTitle;
181
+ });
@@ -0,0 +1,4 @@
1
+ declare module '@opengis/fastify-auth' {
2
+ const mod: any;
3
+ export default mod;
4
+ }