adminforth 1.0.25 → 1.0.27

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 (68) hide show
  1. package/dataConnectors/postgres.ts +3 -6
  2. package/dist/dataConnectors/postgres.js +3 -5
  3. package/dist/index.js +16 -0
  4. package/dist/spa/.eslintrc.cjs +14 -0
  5. package/dist/spa/.vscode/extensions.json +6 -0
  6. package/dist/spa/README.md +39 -0
  7. package/dist/spa/env.d.ts +1 -0
  8. package/dist/spa/index.html +23 -0
  9. package/dist/spa/package-lock.json +4158 -0
  10. package/dist/spa/package.json +41 -0
  11. package/dist/spa/postcss.config.js +6 -0
  12. package/dist/spa/public/favicon.ico +0 -0
  13. package/dist/spa/src/App.vue +172 -0
  14. package/dist/spa/src/assets/base.css +0 -0
  15. package/dist/spa/src/assets/logo.svg +1 -0
  16. package/dist/spa/src/components/AcceptModal.vue +52 -0
  17. package/dist/spa/src/components/Breadcrumbs.vue +40 -0
  18. package/dist/spa/src/components/BreadcrumbsWithButtons.vue +26 -0
  19. package/dist/spa/src/components/CustomDatePicker.vue +161 -0
  20. package/dist/spa/src/components/CustomDateRangePicker.vue +209 -0
  21. package/dist/spa/src/components/Dropdown.vue +154 -0
  22. package/dist/spa/src/components/Filters.vue +157 -0
  23. package/dist/spa/src/components/HelloWorld.vue +17 -0
  24. package/dist/spa/src/components/MenuLink.vue +24 -0
  25. package/dist/spa/src/components/ResourceForm.vue +205 -0
  26. package/dist/spa/src/components/SingleSkeletLoader.vue +13 -0
  27. package/dist/spa/src/components/ValueRenderer.vue +44 -0
  28. package/dist/spa/src/components/icons/IconCalendar.vue +5 -0
  29. package/dist/spa/src/components/icons/IconCommunity.vue +7 -0
  30. package/dist/spa/src/components/icons/IconDocumentation.vue +7 -0
  31. package/dist/spa/src/components/icons/IconEcosystem.vue +7 -0
  32. package/dist/spa/src/components/icons/IconSupport.vue +7 -0
  33. package/dist/spa/src/components/icons/IconTime.vue +5 -0
  34. package/dist/spa/src/components/icons/IconTooling.vue +19 -0
  35. package/dist/spa/src/index.scss +26 -0
  36. package/dist/spa/src/main.ts +18 -0
  37. package/dist/spa/src/router/index.ts +53 -0
  38. package/dist/spa/src/stores/core.ts +138 -0
  39. package/dist/spa/src/stores/modal.ts +38 -0
  40. package/dist/spa/src/utils.ts +44 -0
  41. package/dist/spa/src/views/CreateView.vue +103 -0
  42. package/dist/spa/src/views/EditView.vue +103 -0
  43. package/dist/spa/src/views/HomeView.vue +8 -0
  44. package/dist/spa/src/views/ListView.vue +529 -0
  45. package/dist/spa/src/views/LoginView.vue +122 -0
  46. package/dist/spa/src/views/ResourceParent.vue +18 -0
  47. package/dist/spa/src/views/ShowView.vue +93 -0
  48. package/dist/spa/tailwind.config.js +12 -0
  49. package/dist/spa/tsconfig.app.json +14 -0
  50. package/dist/spa/tsconfig.json +11 -0
  51. package/dist/spa/tsconfig.node.json +19 -0
  52. package/dist/spa/vite.config.ts +43 -0
  53. package/index.ts +31 -2
  54. package/package.json +2 -2
  55. package/spa/src/views/ListView.vue +7 -6
  56. package/dist/spa/src/main.js +0 -16
  57. package/dist/spa/src/router/index.js +0 -79
  58. package/dist/spa/src/stores/core.js +0 -154
  59. package/dist/spa/src/stores/modal.js +0 -35
  60. package/dist/spa/src/utils.js +0 -59
  61. package/dist/spa/vite.config.js +0 -44
  62. package/dist/spa_tmp/src/custom/custom/vueUses.js +0 -10
  63. package/dist/spa_tmp/src/main.js +0 -29
  64. package/dist/spa_tmp/src/router/index.js +0 -83
  65. package/dist/spa_tmp/src/stores/core.js +0 -150
  66. package/dist/spa_tmp/src/stores/modal.js +0 -35
  67. package/dist/spa_tmp/src/utils.js +0 -59
  68. package/dist/spa_tmp/vite.config.js +0 -43
@@ -0,0 +1,93 @@
1
+ <template>
2
+ <div class="relative">
3
+ <BreadcrumbsWithButtons>
4
+ <RouterLink :to="{ name: 'resource-edit', params: { resourceId: $route.params.resourceId, primaryKey: $route.params.primaryKey } }"
5
+ class="flex items-center py-1 px-3 me-2 mb-2 text-sm font-medium text-gray-900 focus:outline-none bg-white rounded border border-gray-300 hover:bg-gray-100 hover:text-blue-700 focus:z-10 focus:ring-4 focus:ring-gray-100 dark:focus:ring-gray-700 dark:bg-gray-800 dark:text-gray-400 dark:border-gray-600 dark:hover:text-white dark:hover:bg-gray-700"
6
+ >
7
+ <IconPenSolid class="w-4 h-4" />
8
+ Edit
9
+ </RouterLink>
10
+
11
+ <button @click="deleteRecord"
12
+ class="flex items-center py-1 px-3 mb-2 text-sm font-medium text-red-600 focus:outline-none bg-white rounded border border-gray-300 hover:bg-gray-100 hover:text-red-700 focus:z-10 focus:ring-4 focus:ring-gray-100 dark:focus:ring-gray-700 dark:bg-gray-800 dark:text-red-500 dark:border-gray-600 dark:hover:text-white dark:hover:bg-gray-700"
13
+ >
14
+ <IconTrashBinSolid class="w-4 h-4" />
15
+ Delete
16
+ </button>
17
+ </BreadcrumbsWithButtons>
18
+
19
+ <div v-if="loading" role="status" class="max-w-sm animate-pulse">
20
+ <div class="h-2.5 bg-gray-200 rounded-full dark:bg-gray-700 w-48 mb-4"></div>
21
+ <div class="h-2 bg-gray-200 rounded-full dark:bg-gray-700 max-w-[360px] mb-2.5"></div>
22
+ <div class="h-2 bg-gray-200 rounded-full dark:bg-gray-700 mb-2.5"></div>
23
+ <div class="h-2 bg-gray-200 rounded-full dark:bg-gray-700 max-w-[330px] mb-2.5"></div>
24
+ <div class="h-2 bg-gray-200 rounded-full dark:bg-gray-700 max-w-[300px] mb-2.5"></div>
25
+ <div class="h-2 bg-gray-200 rounded-full dark:bg-gray-700 max-w-[360px]"></div>
26
+ <span class="sr-only">Loading...</span>
27
+ </div>
28
+ <div
29
+ v-else
30
+ class="relative overflow-x-auto shadow-md sm:rounded-lg"
31
+ >
32
+ <table class="w-full text-sm text-left rtl:text-right text-gray-500 dark:text-gray-400">
33
+ <thead class="text-xs text-gray-700 uppercase bg-gray-50 dark:bg-gray-700 dark:text-gray-400">
34
+ <tr>
35
+ <th scope="col" class="px-6 py-3">
36
+ Field
37
+ </th>
38
+ <th scope="col" class="px-6 py-3 w-4/6">
39
+ Value
40
+ </th>
41
+ </tr>
42
+ </thead>
43
+ <tbody>
44
+ <tr v-for="column in coreStore.resourceColumns?.filter(c => c.showIn.includes('show'))" :key="column.name"
45
+ class="odd:bg-white odd:dark:bg-gray-900 even:bg-gray-50 even:dark:bg-gray-800 border-b dark:border-gray-700"
46
+ >
47
+ <td class="px-6 py-4 whitespace-nowrap">
48
+ {{ column.label }}
49
+ </td>
50
+ <td class="px-6 py-4 whitespace-nowrap whitespace-pre-wrap">
51
+ <ValueRenderer :column="column" :row="coreStore.record" />
52
+ </td>
53
+ </tr>
54
+
55
+ </tbody>
56
+ </table>
57
+ </div>
58
+
59
+
60
+ </div>
61
+ </template>
62
+
63
+
64
+ <script setup>
65
+
66
+ import { ref, computed, onMounted } from 'vue';
67
+ import { useRoute } from 'vue-router';
68
+ import { callAdminForthApi } from '@/utils';
69
+ import BreadcrumbsWithButtons from '@/components/BreadcrumbsWithButtons.vue';
70
+ import { IconPenSolid, IconTrashBinSolid } from '@iconify-prerendered/vue-flowbite';
71
+ import { useCoreStore } from '@/stores/core';
72
+ import ValueRenderer from '@/components/ValueRenderer.vue';
73
+
74
+
75
+ const item = ref(null);
76
+ const route = useRoute();
77
+ const loading = ref(false);
78
+
79
+ const coreStore = useCoreStore();
80
+
81
+ onMounted(async () => {
82
+ loading.value = true;
83
+ await coreStore.fetchColumns({
84
+ resourceId: route.params.resourceId
85
+ });
86
+ await coreStore.fetchRecord({
87
+ resourceId: route.params.resourceId,
88
+ primaryKey: route.params.primaryKey,
89
+ });
90
+ loading.value = false;
91
+ });
92
+
93
+ </script>
@@ -0,0 +1,12 @@
1
+ /** @type {import('tailwindcss').Config} */
2
+ export default {
3
+ content: ["./src/**/*.{vue, js}", "./node_modules/flowbite/**/*.js"],
4
+ theme: {
5
+ extend: {},
6
+ },
7
+ darkMode: 'class',
8
+ plugins: [
9
+ require('flowbite/plugin'),
10
+ ],
11
+ }
12
+
@@ -0,0 +1,14 @@
1
+ {
2
+ "extends": "@vue/tsconfig/tsconfig.dom.json",
3
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
4
+ "exclude": ["src/**/__tests__/*"],
5
+ "compilerOptions": {
6
+ "composite": true,
7
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
8
+
9
+ "baseUrl": ".",
10
+ "paths": {
11
+ "@/*": ["./src/*"]
12
+ }
13
+ }
14
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "files": [],
3
+ "references": [
4
+ {
5
+ "path": "./tsconfig.node.json"
6
+ },
7
+ {
8
+ "path": "./tsconfig.app.json"
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "extends": "@tsconfig/node20/tsconfig.json",
3
+ "include": [
4
+ "vite.config.*",
5
+ "vitest.config.*",
6
+ "cypress.config.*",
7
+ "nightwatch.conf.*",
8
+ "playwright.config.*"
9
+ ],
10
+ "compilerOptions": {
11
+ "composite": true,
12
+ "noEmit": true,
13
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
14
+
15
+ "module": "ESNext",
16
+ "moduleResolution": "Bundler",
17
+ "types": ["node"]
18
+ }
19
+ }
@@ -0,0 +1,43 @@
1
+ import { fileURLToPath, URL } from 'node:url'
2
+
3
+ import { defineConfig } from 'vite'
4
+ import vue from '@vitejs/plugin-vue'
5
+
6
+
7
+ const customLogger = {
8
+ info(msg: string) {
9
+ // Filter out the lines containing '➜ Local:' or '➜ Network:'
10
+ if (!msg.includes('➜')) {
11
+ console.log(msg);
12
+ }
13
+ },
14
+ warn(msg: string) {
15
+ console.warn(msg);
16
+ },
17
+ error(msg: string) {
18
+ console.error(msg);
19
+ },
20
+ clear() {
21
+ console.clear();
22
+ },
23
+ hasWarned: false,
24
+ };
25
+
26
+ // https://vitejs.dev/config/
27
+ export default defineConfig({
28
+ base: process.env.VITE_ADMINFORTH_PUBLIC_PATH || '/',
29
+ server: {
30
+ port: 5173,
31
+ strictPort: true, // better predictability
32
+ },
33
+ customLogger,
34
+ plugins: [
35
+ vue(),
36
+ ],
37
+ resolve: {
38
+ alias: {
39
+ '@': fileURLToPath(new URL('./src', import.meta.url)),
40
+ '@@': fileURLToPath(new URL('./src/custom', import.meta.url)),
41
+ }
42
+ }
43
+ })
package/index.ts CHANGED
@@ -13,6 +13,7 @@ import fs from 'fs';
13
13
  import { AdminForthFilterOperators, AdminForthTypes, AdminForthTypesValues } from './types.js';
14
14
 
15
15
  const AVAILABLE_SHOW_IN = ['list', 'edit', 'create', 'filter', 'show'];
16
+ const DEFAULT_ALLOWED_ACTIONS = {create: true, edit: true, show: true, delete: true};
16
17
 
17
18
  type AdminForthConfigMenuItem = {
18
19
  label: string,
@@ -24,6 +25,7 @@ type AdminForthConfigMenuItem = {
24
25
  children?: Array<AdminForthConfigMenuItem>,
25
26
  }
26
27
 
28
+
27
29
  type AdminForthResourceColumn = {
28
30
  name: string,
29
31
  label?: string,
@@ -67,7 +69,8 @@ type AdminForthResource = {
67
69
  icon: string,
68
70
  action: Function,
69
71
  }>,
70
- allowDelete?: boolean,
72
+ allowedActions?: AllowedActions,
73
+
71
74
  },
72
75
  }
73
76
 
@@ -102,6 +105,13 @@ type AdminForthConfig = {
102
105
  deleteConfirmation?: boolean,
103
106
  }
104
107
 
108
+ type AllowedActions = {
109
+ create: boolean,
110
+ edit: boolean,
111
+ show: boolean,
112
+ delete: boolean,
113
+ }
114
+
105
115
  class AdminForth {
106
116
  static Types = AdminForthTypes;
107
117
 
@@ -248,6 +258,10 @@ class AdminForth {
248
258
  col.showIn = col.showIn?.map(c => c.toLowerCase()) || AVAILABLE_SHOW_IN;
249
259
  })
250
260
 
261
+ if (!res.options) {
262
+ res.options = {bulkActions: [], allowedActions: {}};
263
+ }
264
+
251
265
 
252
266
  //check if resource has bulkActions
253
267
  if(res.options?.bulkActions){
@@ -276,7 +290,22 @@ class AdminForth {
276
290
  });
277
291
  bulkActions = newBulkActions;
278
292
  }
279
- });
293
+
294
+ //add default allowedActions to resources
295
+ if(res.options.allowedActions){
296
+ //check if allowedActions is an object
297
+ if(typeof res.options.allowedActions !== 'object'){
298
+ errors.push(`Resource "${res.resourceId}" allowedActions must be an object`);
299
+ }
300
+ const userAllowedActions = res.options.allowedActions
301
+ res.options.allowedActions = Object.assign({}, DEFAULT_ALLOWED_ACTIONS, userAllowedActions);
302
+ } else {
303
+ res.options.allowedActions = DEFAULT_ALLOWED_ACTIONS;
304
+ }
305
+ })
306
+
307
+
308
+
280
309
 
281
310
  if (!this.config.menu) {
282
311
  errors.push('No config.menu defined');
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "adminforth",
3
- "version": "1.0.25",
3
+ "version": "1.0.27",
4
4
  "description": "OpenSource Vue3 powered forth-generation admin panel",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "scripts": {
8
8
  "test": "echo \"Error: no test specified\" && exit 1",
9
9
  "build": "tsc",
10
- "rollout": "tsc && npm version patch && npm publish"
10
+ "rollout": "tsc && cp -r spa dist/spa && npm version patch && npm publish"
11
11
  },
12
12
  "author": "devforth.io",
13
13
  "license": "ISC",
@@ -42,7 +42,7 @@
42
42
  {{ `${action.label} (${checkboxes.length})` }}
43
43
  </button>
44
44
 
45
- <RouterLink
45
+ <RouterLink v-if="allowedActions.create"
46
46
  :to="{ name: 'resource-create', params: { resourceId: $route.params.resourceId } }"
47
47
  class="flex items-center py-1 px-3 mb-2 text-sm font-medium text-gray-900 focus:outline-none bg-white rounded border border-gray-300 hover:bg-gray-100 hover:text-blue-700 focus:z-10 focus:ring-4 focus:ring-gray-100 dark:focus:ring-gray-700 dark:bg-gray-800 dark:text-gray-400 dark:border-gray-600 dark:hover:text-white dark:hover:bg-gray-700"
48
48
  >
@@ -217,7 +217,7 @@
217
217
  <div class="tooltip-arrow" data-popper-arrow></div>
218
218
  </div>
219
219
 
220
- <RouterLink
220
+ <RouterLink v-if="allowedActions.edit"
221
221
  :to="{ name: 'resource-edit', params: { resourceId: $route.params.resourceId, primaryKey: row._primaryKeyValue } }"
222
222
  class="font-medium text-blue-600 dark:text-blue-500 hover:underline ms-3"
223
223
  :data-tooltip-target="`tooltip-edit-${rowI}`"
@@ -232,7 +232,7 @@
232
232
  <div class="tooltip-arrow" data-popper-arrow></div>
233
233
  </div>
234
234
 
235
- <button v-if="allowDelete"
235
+ <button v-if="allowedActions.delete"
236
236
  class="font-medium text-red-600 dark:text-red-500 hover:underline ms-3"
237
237
  :data-tooltip-target="`tooltip-delete-${rowI}`"
238
238
  @click="showDeleteModal(row)"
@@ -355,7 +355,8 @@ const fetchStatus = ref({pending: false, error: null, success: false});
355
355
  const rows = ref(null);
356
356
  const totalRows = ref(0);
357
357
  const allCheckedActions = ref([]);
358
- const allowDelete = ref(false);
358
+ const allowedActions = ref({});
359
+
359
360
 
360
361
  const DEFAULT_PAGE_SIZE = 10;
361
362
 
@@ -432,8 +433,8 @@ async function getList() {
432
433
  });
433
434
  totalRows.value = data.total;
434
435
  allCheckedActions.value = data.options?.bulkActions || [];
435
- allowDelete.value = data.options?.allowDelete;
436
-
436
+ allowedActions.value = data.options?.allowedActions;
437
+
437
438
 
438
439
  setTimeout(() => {
439
440
  initFlowbite();
@@ -1,16 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const vue_1 = require("vue");
7
- const pinia_1 = require("pinia");
8
- /* IMPORTANT:ADMINFORTH IMPORTS */
9
- const App_vue_1 = __importDefault(require("./App.vue"));
10
- const router_1 = __importDefault(require("./router"));
11
- const app = (0, vue_1.createApp)(App_vue_1.default);
12
- /* IMPORTANT:ADMINFORTH COMPONENT REGISTRATIONS */
13
- app.use((0, pinia_1.createPinia)());
14
- app.use(router_1.default);
15
- /* IMPORTANT:ADMINFORTH CUSTOM USES */
16
- app.mount('#app');
@@ -1,79 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- var __importDefault = (this && this.__importDefault) || function (mod) {
26
- return (mod && mod.__esModule) ? mod : { "default": mod };
27
- };
28
- Object.defineProperty(exports, "__esModule", { value: true });
29
- const vue_router_1 = require("vue-router");
30
- const HomeView_vue_1 = __importDefault(require("../views/HomeView.vue"));
31
- const ResourceParent_vue_1 = __importDefault(require("@/views/ResourceParent.vue"));
32
- const ListView_vue_1 = __importDefault(require("@/views/ListView.vue"));
33
- const ShowView_vue_1 = __importDefault(require("@/views/ShowView.vue"));
34
- const EditView_vue_1 = __importDefault(require("@/views/EditView.vue"));
35
- const CreateView_vue_1 = __importDefault(require("@/views/CreateView.vue"));
36
- const router = (0, vue_router_1.createRouter)({
37
- history: (0, vue_router_1.createWebHistory)(import.meta.env.BASE_URL),
38
- routes: [
39
- {
40
- path: '/',
41
- name: 'home',
42
- component: HomeView_vue_1.default
43
- },
44
- {
45
- path: '/login',
46
- name: 'login',
47
- component: () => Promise.resolve().then(() => __importStar(require('@/views/LoginView.vue')))
48
- },
49
- {
50
- path: '/resource/:resourceId',
51
- component: ResourceParent_vue_1.default,
52
- name: 'resource',
53
- children: [
54
- {
55
- path: '',
56
- component: ListView_vue_1.default,
57
- name: 'resource-list'
58
- },
59
- {
60
- path: 'show/:primaryKey',
61
- component: ShowView_vue_1.default,
62
- name: 'resource-show'
63
- },
64
- {
65
- path: 'edit/:primaryKey',
66
- component: EditView_vue_1.default,
67
- name: 'resource-edit'
68
- },
69
- {
70
- path: 'create',
71
- component: CreateView_vue_1.default,
72
- name: 'resource-create'
73
- },
74
- ]
75
- },
76
- /* IMPORTANT:ADMINFORTH ROUTES */
77
- ]
78
- });
79
- exports.default = router;
@@ -1,154 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.useCoreStore = void 0;
16
- const vue_1 = require("vue");
17
- const pinia_1 = require("pinia");
18
- const utils_1 = require("@/utils");
19
- const router_1 = __importDefault(require("@/router"));
20
- function findHomepage(menu) {
21
- return __awaiter(this, void 0, void 0, function* () {
22
- for (const item of menu) {
23
- if (item.homepage) {
24
- return item;
25
- }
26
- if (item.children) {
27
- const res = findHomepage(item.children);
28
- if (res) {
29
- return res;
30
- }
31
- }
32
- }
33
- return null;
34
- });
35
- }
36
- exports.useCoreStore = (0, pinia_1.defineStore)('core', () => {
37
- const resourceById = (0, vue_1.ref)([]);
38
- const menu = (0, vue_1.ref)([]);
39
- const config = (0, vue_1.ref)({});
40
- const record = (0, vue_1.ref)({});
41
- const resourceColumns = (0, vue_1.ref)(null);
42
- const resourceColumnsError = (0, vue_1.ref)('');
43
- const resourceColumnsId = (0, vue_1.ref)(null);
44
- const user = (0, vue_1.ref)(null);
45
- function fetchMenuAndResource() {
46
- return __awaiter(this, void 0, void 0, function* () {
47
- const resp = yield (0, utils_1.callAdminForthApi)({
48
- path: '/get_base_config',
49
- method: 'GET',
50
- });
51
- menu.value = resp.menu;
52
- resourceById.value = resp.resources.reduce((acc, resource) => {
53
- acc[resource.resourceId] = resource;
54
- return acc;
55
- }, {});
56
- config.value = resp.config;
57
- user.value = resp.user;
58
- // find homepage:true in menu recuresively
59
- if (import.meta.env.DEV) {
60
- return;
61
- }
62
- else {
63
- const homepage = yield findHomepage(menu.value);
64
- if (homepage) {
65
- if (homepage.resourceId) {
66
- // redirect to homepage
67
- router_1.default.push({ name: 'resource-list', params: { resourceId: homepage.resourceId } });
68
- }
69
- else {
70
- // redirect to path
71
- router_1.default.push(homepage.path);
72
- }
73
- }
74
- }
75
- });
76
- }
77
- function fetchRecord(_a) {
78
- return __awaiter(this, arguments, void 0, function* ({ resourceId, primaryKey }) {
79
- record.value = null;
80
- record.value = yield (0, utils_1.callAdminForthApi)({
81
- path: '/get_record',
82
- method: 'POST',
83
- body: {
84
- resourceId: resourceId,
85
- primaryKey: primaryKey,
86
- }
87
- });
88
- });
89
- }
90
- function fetchColumns(_a) {
91
- return __awaiter(this, arguments, void 0, function* ({ resourceId }) {
92
- if (resourceColumnsId.value === resourceId && resourceColumns.value) {
93
- // already fetched
94
- return;
95
- }
96
- resourceColumnsId.value = resourceId;
97
- resourceColumns.value = null;
98
- resourceColumnsError.value = '';
99
- const res = yield (0, utils_1.callAdminForthApi)({
100
- path: '/get_resource_columns',
101
- method: 'POST',
102
- body: {
103
- resourceId,
104
- }
105
- });
106
- if (res.error) {
107
- resourceColumnsError.value = res.error;
108
- }
109
- else {
110
- resourceColumns.value = res.resource.columns;
111
- }
112
- });
113
- }
114
- function getPublicConfig() {
115
- return __awaiter(this, void 0, void 0, function* () {
116
- const res = yield (0, utils_1.callAdminForthApi)({
117
- path: '/get_public_config',
118
- method: 'GET',
119
- });
120
- config.value = Object.assign(Object.assign({}, config.value), res);
121
- });
122
- }
123
- function logout() {
124
- return __awaiter(this, void 0, void 0, function* () {
125
- yield (0, utils_1.callAdminForthApi)({
126
- path: '/logout',
127
- method: 'POST',
128
- });
129
- });
130
- }
131
- const username = (0, vue_1.computed)(() => {
132
- const usernameField = config.value.usernameField;
133
- return user.value && user.value[usernameField];
134
- });
135
- const userFullname = (0, vue_1.computed)(() => {
136
- const userFullnameField = config.value.userFullnameField;
137
- return user.value && user.value[userFullnameField];
138
- });
139
- return {
140
- config,
141
- resourceById,
142
- menu,
143
- username,
144
- userFullname,
145
- getPublicConfig,
146
- fetchMenuAndResource,
147
- fetchRecord,
148
- record,
149
- resourceColumns,
150
- fetchColumns,
151
- resourceColumnsError,
152
- logout
153
- };
154
- });
@@ -1,35 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.useModalStore = void 0;
4
- const vue_1 = require("vue");
5
- const pinia_1 = require("pinia");
6
- exports.useModalStore = (0, pinia_1.defineStore)('modal', () => {
7
- const modalContent = (0, vue_1.ref)({
8
- title: 'title',
9
- content: 'content',
10
- acceptText: 'acceptText',
11
- cancelText: 'cancelText',
12
- });
13
- const isOpened = (0, vue_1.ref)(false);
14
- const onAcceptFunction = (0, vue_1.ref)(() => { });
15
- function togleModal() {
16
- isOpened.value = !isOpened.value;
17
- }
18
- function setOnAcceptFunction(func) {
19
- onAcceptFunction.value = func;
20
- }
21
- function setModalContent(content) {
22
- modalContent.value = content;
23
- }
24
- function resetmodalState() {
25
- isOpened.value = false;
26
- modalContent.value = {
27
- title: 'title',
28
- content: 'content',
29
- acceptText: 'acceptText',
30
- cancelText: 'cancelText',
31
- };
32
- setOnAcceptFunction(() => { });
33
- }
34
- return { isOpened, setModalContent, togleModal, modalContent, setOnAcceptFunction, onAcceptFunction, resetmodalState };
35
- });