adminforth 1.0.25 → 1.0.26
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/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 +528 -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/package.json +2 -2
- 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/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "adminforth",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.26",
|
|
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",
|
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
|
-
});
|
package/dist/spa/src/utils.js
DELETED
|
@@ -1,59 +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.getIcon = exports.callAdminForthApi = exports.callApi = void 0;
|
|
16
|
-
const vue_1 = require("vue");
|
|
17
|
-
const router_1 = __importDefault(require("./router"));
|
|
18
|
-
function callApi(_a) {
|
|
19
|
-
return __awaiter(this, arguments, void 0, function* ({ path, method, body = undefined }) {
|
|
20
|
-
const options = {
|
|
21
|
-
method,
|
|
22
|
-
headers: {
|
|
23
|
-
'Content-Type': 'application/json',
|
|
24
|
-
},
|
|
25
|
-
body: JSON.stringify(body),
|
|
26
|
-
};
|
|
27
|
-
const fullPath = `${import.meta.env.VITE_ADMINFORTH_PUBLIC_PATH || ''}${path}`;
|
|
28
|
-
const r = yield fetch(fullPath, options);
|
|
29
|
-
if (r.status == 401) {
|
|
30
|
-
console.log('router', router_1.default);
|
|
31
|
-
router_1.default.push({ name: 'login' });
|
|
32
|
-
return null;
|
|
33
|
-
}
|
|
34
|
-
return yield r.json();
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
exports.callApi = callApi;
|
|
38
|
-
function callAdminForthApi(_a) {
|
|
39
|
-
return __awaiter(this, arguments, void 0, function* ({ path, method, body = undefined }) {
|
|
40
|
-
try {
|
|
41
|
-
return callApi({ path: `/adminapi/v1${path}`, method, body });
|
|
42
|
-
}
|
|
43
|
-
catch (e) {
|
|
44
|
-
console.error('error', e);
|
|
45
|
-
return { error: `Unexpected error: ${e}` };
|
|
46
|
-
}
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
exports.callAdminForthApi = callAdminForthApi;
|
|
50
|
-
function getIcon(icon) {
|
|
51
|
-
// icon format is "feather:icon-name". We need to get IconName in pascal case
|
|
52
|
-
if (!icon.includes(':')) {
|
|
53
|
-
throw new Error('Icon name should be in format "icon-set:icon-name"');
|
|
54
|
-
}
|
|
55
|
-
const [iconSet, iconName] = icon.split(':');
|
|
56
|
-
const compName = 'Icon' + iconName.split('-').map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join('');
|
|
57
|
-
return (0, vue_1.resolveComponent)(compName);
|
|
58
|
-
}
|
|
59
|
-
exports.getIcon = getIcon;
|
package/dist/spa/vite.config.js
DELETED
|
@@ -1,44 +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 node_url_1 = require("node:url");
|
|
7
|
-
const vite_1 = require("vite");
|
|
8
|
-
const plugin_vue_1 = __importDefault(require("@vitejs/plugin-vue"));
|
|
9
|
-
const customLogger = {
|
|
10
|
-
info(msg) {
|
|
11
|
-
// Filter out the lines containing '➜ Local:' or '➜ Network:'
|
|
12
|
-
if (!msg.includes('➜')) {
|
|
13
|
-
console.log(msg);
|
|
14
|
-
}
|
|
15
|
-
},
|
|
16
|
-
warn(msg) {
|
|
17
|
-
console.warn(msg);
|
|
18
|
-
},
|
|
19
|
-
error(msg) {
|
|
20
|
-
console.error(msg);
|
|
21
|
-
},
|
|
22
|
-
clear() {
|
|
23
|
-
console.clear();
|
|
24
|
-
},
|
|
25
|
-
hasWarned: false,
|
|
26
|
-
};
|
|
27
|
-
// https://vitejs.dev/config/
|
|
28
|
-
exports.default = (0, vite_1.defineConfig)({
|
|
29
|
-
base: process.env.VITE_ADMINFORTH_PUBLIC_PATH || '/',
|
|
30
|
-
server: {
|
|
31
|
-
port: 5173,
|
|
32
|
-
strictPort: true, // better predictability
|
|
33
|
-
},
|
|
34
|
-
customLogger,
|
|
35
|
-
plugins: [
|
|
36
|
-
(0, plugin_vue_1.default)(),
|
|
37
|
-
],
|
|
38
|
-
resolve: {
|
|
39
|
-
alias: {
|
|
40
|
-
'@': (0, node_url_1.fileURLToPath)(new node_url_1.URL('./src', import.meta.url)),
|
|
41
|
-
'@@': (0, node_url_1.fileURLToPath)(new node_url_1.URL('./src/custom', import.meta.url)),
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
});
|
|
@@ -1,10 +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 highcharts_vue_1 = __importDefault(require("highcharts-vue"));
|
|
7
|
-
function default_1(app) {
|
|
8
|
-
app.use(highcharts_vue_1.default);
|
|
9
|
-
}
|
|
10
|
-
exports.default = default_1;
|
package/dist/spa_tmp/src/main.js
DELETED
|
@@ -1,29 +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
|
-
const vue_flowbite_1 = require("@iconify-prerendered/vue-flowbite");
|
|
9
|
-
const vue_flowbite_2 = require("@iconify-prerendered/vue-flowbite");
|
|
10
|
-
const vue_flowbite_3 = require("@iconify-prerendered/vue-flowbite");
|
|
11
|
-
const vue_flowbite_4 = require("@iconify-prerendered/vue-flowbite");
|
|
12
|
-
const vue_flowbite_5 = require("@iconify-prerendered/vue-flowbite");
|
|
13
|
-
const vue_typcn_1 = require("@iconify-prerendered/vue-typcn");
|
|
14
|
-
const vue_flowbite_6 = require("@iconify-prerendered/vue-flowbite");
|
|
15
|
-
const vueUses_ts_1 = __importDefault(require("@/custom/./custom/vueUses.ts"));
|
|
16
|
-
const App_vue_1 = __importDefault(require("./App.vue"));
|
|
17
|
-
const router_1 = __importDefault(require("./router"));
|
|
18
|
-
const app = (0, vue_1.createApp)(App_vue_1.default);
|
|
19
|
-
app.component('IconChartPieSolid', vue_flowbite_1.IconChartPieSolid);
|
|
20
|
-
app.component('IconBrainSolid', vue_flowbite_2.IconBrainSolid);
|
|
21
|
-
app.component('IconHomeSolid', vue_flowbite_3.IconHomeSolid);
|
|
22
|
-
app.component('IconCaretRightSolid', vue_flowbite_4.IconCaretRightSolid);
|
|
23
|
-
app.component('IconUserSolid', vue_flowbite_5.IconUserSolid);
|
|
24
|
-
app.component('IconArchive', vue_typcn_1.IconArchive);
|
|
25
|
-
app.component('IconTrashBinOutline', vue_flowbite_6.IconTrashBinOutline);
|
|
26
|
-
app.use((0, pinia_1.createPinia)());
|
|
27
|
-
app.use(router_1.default);
|
|
28
|
-
(0, vueUses_ts_1.default)(app);
|
|
29
|
-
app.mount('#app');
|