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.
- package/dataConnectors/postgres.ts +3 -6
- package/dist/dataConnectors/postgres.js +3 -5
- package/dist/index.js +16 -0
- package/dist/spa/.eslintrc.cjs +14 -0
- package/dist/spa/.vscode/extensions.json +6 -0
- package/dist/spa/README.md +39 -0
- package/dist/spa/env.d.ts +1 -0
- package/dist/spa/index.html +23 -0
- package/dist/spa/package-lock.json +4158 -0
- package/dist/spa/package.json +41 -0
- package/dist/spa/postcss.config.js +6 -0
- package/dist/spa/public/favicon.ico +0 -0
- package/dist/spa/src/App.vue +172 -0
- package/dist/spa/src/assets/base.css +0 -0
- package/dist/spa/src/assets/logo.svg +1 -0
- package/dist/spa/src/components/AcceptModal.vue +52 -0
- package/dist/spa/src/components/Breadcrumbs.vue +40 -0
- package/dist/spa/src/components/BreadcrumbsWithButtons.vue +26 -0
- package/dist/spa/src/components/CustomDatePicker.vue +161 -0
- package/dist/spa/src/components/CustomDateRangePicker.vue +209 -0
- package/dist/spa/src/components/Dropdown.vue +154 -0
- package/dist/spa/src/components/Filters.vue +157 -0
- package/dist/spa/src/components/HelloWorld.vue +17 -0
- package/dist/spa/src/components/MenuLink.vue +24 -0
- package/dist/spa/src/components/ResourceForm.vue +205 -0
- package/dist/spa/src/components/SingleSkeletLoader.vue +13 -0
- package/dist/spa/src/components/ValueRenderer.vue +44 -0
- package/dist/spa/src/components/icons/IconCalendar.vue +5 -0
- package/dist/spa/src/components/icons/IconCommunity.vue +7 -0
- package/dist/spa/src/components/icons/IconDocumentation.vue +7 -0
- package/dist/spa/src/components/icons/IconEcosystem.vue +7 -0
- package/dist/spa/src/components/icons/IconSupport.vue +7 -0
- package/dist/spa/src/components/icons/IconTime.vue +5 -0
- package/dist/spa/src/components/icons/IconTooling.vue +19 -0
- package/dist/spa/src/index.scss +26 -0
- package/dist/spa/src/main.ts +18 -0
- package/dist/spa/src/router/index.ts +53 -0
- package/dist/spa/src/stores/core.ts +138 -0
- package/dist/spa/src/stores/modal.ts +38 -0
- package/dist/spa/src/utils.ts +44 -0
- package/dist/spa/src/views/CreateView.vue +103 -0
- package/dist/spa/src/views/EditView.vue +103 -0
- package/dist/spa/src/views/HomeView.vue +8 -0
- package/dist/spa/src/views/ListView.vue +529 -0
- package/dist/spa/src/views/LoginView.vue +122 -0
- package/dist/spa/src/views/ResourceParent.vue +18 -0
- package/dist/spa/src/views/ShowView.vue +93 -0
- package/dist/spa/tailwind.config.js +12 -0
- package/dist/spa/tsconfig.app.json +14 -0
- package/dist/spa/tsconfig.json +11 -0
- package/dist/spa/tsconfig.node.json +19 -0
- package/dist/spa/vite.config.ts +43 -0
- package/index.ts +31 -2
- package/package.json +2 -2
- package/spa/src/views/ListView.vue +7 -6
- package/dist/spa/src/main.js +0 -16
- package/dist/spa/src/router/index.js +0 -79
- package/dist/spa/src/stores/core.js +0 -154
- package/dist/spa/src/stores/modal.js +0 -35
- package/dist/spa/src/utils.js +0 -59
- package/dist/spa/vite.config.js +0 -44
- package/dist/spa_tmp/src/custom/custom/vueUses.js +0 -10
- package/dist/spa_tmp/src/main.js +0 -29
- package/dist/spa_tmp/src/router/index.js +0 -83
- package/dist/spa_tmp/src/stores/core.js +0 -150
- package/dist/spa_tmp/src/stores/modal.js +0 -35
- package/dist/spa_tmp/src/utils.js +0 -59
- 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,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,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
|
-
|
|
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.
|
|
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="
|
|
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
|
|
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
|
-
|
|
436
|
-
|
|
436
|
+
allowedActions.value = data.options?.allowedActions;
|
|
437
|
+
|
|
437
438
|
|
|
438
439
|
setTimeout(() => {
|
|
439
440
|
initFlowbite();
|
package/dist/spa/src/main.js
DELETED
|
@@ -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
|
-
});
|