com-angel-authorization 1.0.4 → 1.0.6
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/README.md +47 -0
- package/dist/index.cjs +144 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +71 -6
- package/dist/index.d.ts +71 -6
- package/dist/index.js +133 -4
- package/dist/index.js.map +1 -1
- package/dist/react/index.cjs +870 -9
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +79 -6
- package/dist/react/index.d.ts +79 -6
- package/dist/react/index.js +862 -9
- package/dist/react/index.js.map +1 -1
- package/dist/vue/index.cjs +1059 -9
- package/dist/vue/index.cjs.map +1 -1
- package/dist/vue/index.d.cts +107 -6
- package/dist/vue/index.d.ts +107 -6
- package/dist/vue/index.js +1054 -9
- package/dist/vue/index.js.map +1 -1
- package/package.json +1 -1
package/dist/vue/index.js
CHANGED
|
@@ -310,16 +310,35 @@ import {
|
|
|
310
310
|
|
|
311
311
|
// src/resources/types.ts
|
|
312
312
|
var RESOURCE_TYPE_API = "api";
|
|
313
|
+
var MENU_TYPE_PAGE = "page";
|
|
314
|
+
var MENU_TYPE_MENU = "menu";
|
|
315
|
+
var MENU_TYPE_BUTTON = "button";
|
|
316
|
+
var MENU_LIST_TYPE_PARAM = "page,menu,button";
|
|
317
|
+
var ROOT_PARENT_ID = "0";
|
|
313
318
|
var RESOURCE_STATUS_ENABLED = 1;
|
|
314
319
|
var RESOURCE_STATUS_DISABLED = 0;
|
|
315
320
|
var RESOURCE_STATUS_OPTIONS = [
|
|
316
321
|
{ label: "\u542F\u7528", value: RESOURCE_STATUS_ENABLED },
|
|
317
322
|
{ label: "\u7981\u7528", value: RESOURCE_STATUS_DISABLED }
|
|
318
323
|
];
|
|
324
|
+
var MENU_VISIBILITY_OPTIONS = [
|
|
325
|
+
{ label: "\u663E\u793A", value: RESOURCE_STATUS_ENABLED },
|
|
326
|
+
{ label: "\u9690\u85CF", value: RESOURCE_STATUS_DISABLED }
|
|
327
|
+
];
|
|
319
328
|
var RESOURCE_PRIVATE_OPTIONS = [
|
|
320
329
|
{ label: "\u662F", value: true },
|
|
321
330
|
{ label: "\u5426", value: false }
|
|
322
331
|
];
|
|
332
|
+
var MENU_TYPE_OPTIONS = [
|
|
333
|
+
{ label: "\u76EE\u5F55", value: MENU_TYPE_PAGE },
|
|
334
|
+
{ label: "\u83DC\u5355", value: MENU_TYPE_MENU },
|
|
335
|
+
{ label: "\u6309\u94AE", value: MENU_TYPE_BUTTON }
|
|
336
|
+
];
|
|
337
|
+
var MENU_TYPE_LABEL = {
|
|
338
|
+
page: "\u76EE\u5F55",
|
|
339
|
+
menu: "\u83DC\u5355",
|
|
340
|
+
button: "\u6309\u94AE"
|
|
341
|
+
};
|
|
323
342
|
|
|
324
343
|
// src/utils/snowflake.ts
|
|
325
344
|
var DEVICE_WORKER_ID_KEY = "hgams_device_worker_id";
|
|
@@ -464,6 +483,29 @@ function toBoolean(value) {
|
|
|
464
483
|
}
|
|
465
484
|
return false;
|
|
466
485
|
}
|
|
486
|
+
function toStringArray(value) {
|
|
487
|
+
if (Array.isArray(value)) {
|
|
488
|
+
return value.map((item) => {
|
|
489
|
+
if (item && typeof item === "object") {
|
|
490
|
+
const row = item;
|
|
491
|
+
const id = row.resourceId ?? row.resource_id ?? row.id;
|
|
492
|
+
return id === void 0 || id === null ? "" : String(id);
|
|
493
|
+
}
|
|
494
|
+
return String(item ?? "");
|
|
495
|
+
}).filter(Boolean);
|
|
496
|
+
}
|
|
497
|
+
if (typeof value === "string" && value.trim()) {
|
|
498
|
+
return value.split(",").map((s3) => s3.trim()).filter(Boolean);
|
|
499
|
+
}
|
|
500
|
+
return [];
|
|
501
|
+
}
|
|
502
|
+
function toMenuType(value) {
|
|
503
|
+
const v = String(value ?? "").toLowerCase();
|
|
504
|
+
if (v === MENU_TYPE_PAGE || v === MENU_TYPE_MENU || v === MENU_TYPE_BUTTON) {
|
|
505
|
+
return v;
|
|
506
|
+
}
|
|
507
|
+
return MENU_TYPE_MENU;
|
|
508
|
+
}
|
|
467
509
|
function mapAuthorizationResource(item) {
|
|
468
510
|
if (!item || typeof item !== "object") return null;
|
|
469
511
|
const row = item;
|
|
@@ -479,9 +521,31 @@ function mapAuthorizationResource(item) {
|
|
|
479
521
|
description: String(row.description ?? row.desc ?? "")
|
|
480
522
|
};
|
|
481
523
|
}
|
|
482
|
-
function
|
|
524
|
+
function mapMenuResource(item) {
|
|
525
|
+
if (!item || typeof item !== "object") return null;
|
|
526
|
+
const row = item;
|
|
527
|
+
const resourceId = row.resourceId ?? row.resource_id ?? row.id;
|
|
528
|
+
if (resourceId === void 0 || resourceId === null || resourceId === "") return null;
|
|
529
|
+
const permissionPointIds = toStringArray(
|
|
530
|
+
row.permissionPointIds ?? row.permission_point_ids ?? row.permissionPoints ?? row.permissions
|
|
531
|
+
);
|
|
532
|
+
const permissionNamesRaw = row.permissionPointNames ?? row.permission_point_names ?? row.permissionNames;
|
|
533
|
+
const permissionPointNames = Array.isArray(permissionNamesRaw) ? permissionNamesRaw.map((n) => String(n ?? "")).filter(Boolean) : void 0;
|
|
534
|
+
const parentId = row.parentId ?? row.parent_id ?? ROOT_PARENT_ID;
|
|
535
|
+
return {
|
|
536
|
+
resourceId: String(resourceId),
|
|
537
|
+
parentId: parentId === void 0 || parentId === null ? ROOT_PARENT_ID : String(parentId),
|
|
538
|
+
type: toMenuType(row.type),
|
|
539
|
+
name: String(row.name ?? ""),
|
|
540
|
+
identification: String(row.identification ?? row.identity ?? row.path ?? ""),
|
|
541
|
+
permissionPointIds,
|
|
542
|
+
permissionPointNames,
|
|
543
|
+
status: toResourceStatus(row.status)
|
|
544
|
+
};
|
|
545
|
+
}
|
|
546
|
+
function buildListUrl(type, params) {
|
|
483
547
|
const parts = [];
|
|
484
|
-
appendQueryParam(parts, "type",
|
|
548
|
+
appendQueryParam(parts, "type", type);
|
|
485
549
|
appendQueryParam(parts, "page-token", params?.pagination?.pageToken ?? "");
|
|
486
550
|
appendQueryParam(parts, "page-size", params?.pagination?.pageSize ?? "20");
|
|
487
551
|
appendQueryParam(parts, "page-direction", params?.pagination?.pageDirection ?? "current");
|
|
@@ -508,12 +572,33 @@ function buildUpdateBody(values) {
|
|
|
508
572
|
description: values.description.trim()
|
|
509
573
|
};
|
|
510
574
|
}
|
|
575
|
+
function buildCreateMenuBody(values, resourceId = getAppClientId()) {
|
|
576
|
+
return {
|
|
577
|
+
resourceId,
|
|
578
|
+
parentId: values.parentId || ROOT_PARENT_ID,
|
|
579
|
+
type: values.type,
|
|
580
|
+
name: values.name.trim(),
|
|
581
|
+
identification: values.identification.trim(),
|
|
582
|
+
permissionPointIds: [...values.permissionPointIds],
|
|
583
|
+
status: values.status
|
|
584
|
+
};
|
|
585
|
+
}
|
|
586
|
+
function buildUpdateMenuBody(values) {
|
|
587
|
+
return {
|
|
588
|
+
parentId: values.parentId || ROOT_PARENT_ID,
|
|
589
|
+
type: values.type,
|
|
590
|
+
name: values.name.trim(),
|
|
591
|
+
identification: values.identification.trim(),
|
|
592
|
+
permissionPointIds: [...values.permissionPointIds],
|
|
593
|
+
status: values.status
|
|
594
|
+
};
|
|
595
|
+
}
|
|
511
596
|
function createAuthorizationResourceApi(request) {
|
|
512
597
|
return {
|
|
513
598
|
async list(params, signal) {
|
|
514
599
|
const json = await request({
|
|
515
600
|
method: "GET",
|
|
516
|
-
url: buildListUrl(params),
|
|
601
|
+
url: buildListUrl(RESOURCE_TYPE_API, params),
|
|
517
602
|
signal
|
|
518
603
|
});
|
|
519
604
|
const records = extractRecords(json).map(mapAuthorizationResource).filter((item) => item !== null);
|
|
@@ -548,6 +633,50 @@ function createAuthorizationResourceApi(request) {
|
|
|
548
633
|
}
|
|
549
634
|
};
|
|
550
635
|
}
|
|
636
|
+
function createMenuResourceApi(request) {
|
|
637
|
+
const permissionApi = createAuthorizationResourceApi(request);
|
|
638
|
+
return {
|
|
639
|
+
async list(params, signal) {
|
|
640
|
+
const json = await request({
|
|
641
|
+
method: "GET",
|
|
642
|
+
url: buildListUrl(MENU_LIST_TYPE_PARAM, params),
|
|
643
|
+
signal
|
|
644
|
+
});
|
|
645
|
+
const records = extractRecords(json).map(mapMenuResource).filter((item) => item !== null);
|
|
646
|
+
const pagination = extractPagination(json);
|
|
647
|
+
return {
|
|
648
|
+
records,
|
|
649
|
+
...pagination
|
|
650
|
+
};
|
|
651
|
+
},
|
|
652
|
+
listPermissionPoints(params, signal) {
|
|
653
|
+
return permissionApi.list(params, signal);
|
|
654
|
+
},
|
|
655
|
+
async create(values, signal) {
|
|
656
|
+
return request({
|
|
657
|
+
method: "POST",
|
|
658
|
+
url: "/authorization-resources",
|
|
659
|
+
body: buildCreateMenuBody(values),
|
|
660
|
+
signal
|
|
661
|
+
});
|
|
662
|
+
},
|
|
663
|
+
async update(resourceId, values, signal) {
|
|
664
|
+
return request({
|
|
665
|
+
method: "PATCH",
|
|
666
|
+
url: `/authorization-resources/${encodeURIComponent(resourceId)}`,
|
|
667
|
+
body: buildUpdateMenuBody(values),
|
|
668
|
+
signal
|
|
669
|
+
});
|
|
670
|
+
},
|
|
671
|
+
async remove(resourceId, signal) {
|
|
672
|
+
return request({
|
|
673
|
+
method: "DELETE",
|
|
674
|
+
url: `/authorization-resources/${encodeURIComponent(resourceId)}`,
|
|
675
|
+
signal
|
|
676
|
+
});
|
|
677
|
+
}
|
|
678
|
+
};
|
|
679
|
+
}
|
|
551
680
|
function createDefaultResourceRequest(options = {}) {
|
|
552
681
|
const baseUrl = (options.baseUrl ?? "").replace(/\/+$/, "");
|
|
553
682
|
const credentials = options.credentials ?? "include";
|
|
@@ -704,11 +833,22 @@ var s = {
|
|
|
704
833
|
cursor: "pointer",
|
|
705
834
|
fontSize: "14px"
|
|
706
835
|
},
|
|
836
|
+
dangerBtn: {
|
|
837
|
+
border: "none",
|
|
838
|
+
background: "#d92d20",
|
|
839
|
+
color: "#fff",
|
|
840
|
+
borderRadius: "8px",
|
|
841
|
+
padding: "8px 14px",
|
|
842
|
+
cursor: "pointer",
|
|
843
|
+
fontSize: "14px"
|
|
844
|
+
},
|
|
707
845
|
select: {
|
|
708
846
|
border: "1px solid #d0d5dd",
|
|
709
847
|
borderRadius: "6px",
|
|
710
848
|
padding: "4px 8px",
|
|
711
|
-
fontSize: "13px"
|
|
849
|
+
fontSize: "13px",
|
|
850
|
+
backgroundColor: "#ffffff",
|
|
851
|
+
color: "#101828"
|
|
712
852
|
},
|
|
713
853
|
mask: {
|
|
714
854
|
position: "fixed",
|
|
@@ -744,6 +884,18 @@ var s = {
|
|
|
744
884
|
color: "#667085"
|
|
745
885
|
},
|
|
746
886
|
form: { display: "flex", flexDirection: "column", gap: "12px", padding: "16px" },
|
|
887
|
+
confirmBody: {
|
|
888
|
+
display: "flex",
|
|
889
|
+
flexDirection: "column",
|
|
890
|
+
gap: "16px",
|
|
891
|
+
padding: "16px"
|
|
892
|
+
},
|
|
893
|
+
confirmText: {
|
|
894
|
+
margin: "0",
|
|
895
|
+
fontSize: "14px",
|
|
896
|
+
color: "#344054",
|
|
897
|
+
lineHeight: "1.6"
|
|
898
|
+
},
|
|
747
899
|
field: { display: "flex", flexDirection: "column", gap: "6px" },
|
|
748
900
|
label: { fontSize: "13px", color: "#344054", fontWeight: "500" },
|
|
749
901
|
input: {
|
|
@@ -751,7 +903,11 @@ var s = {
|
|
|
751
903
|
borderRadius: "8px",
|
|
752
904
|
padding: "8px 10px",
|
|
753
905
|
fontSize: "14px",
|
|
754
|
-
outline: "none"
|
|
906
|
+
outline: "none",
|
|
907
|
+
backgroundColor: "#ffffff",
|
|
908
|
+
color: "#101828",
|
|
909
|
+
boxSizing: "border-box",
|
|
910
|
+
width: "100%"
|
|
755
911
|
},
|
|
756
912
|
dialogFooter: {
|
|
757
913
|
display: "flex",
|
|
@@ -788,6 +944,8 @@ var ResourceManager = defineComponent2({
|
|
|
788
944
|
const editing = ref(null);
|
|
789
945
|
const form = reactive(emptyForm());
|
|
790
946
|
const saving = ref(false);
|
|
947
|
+
const deletingRow = ref(null);
|
|
948
|
+
const deleting = ref(false);
|
|
791
949
|
const statusLabel = Object.fromEntries(
|
|
792
950
|
RESOURCE_STATUS_OPTIONS.map((o) => [o.value, o.label])
|
|
793
951
|
);
|
|
@@ -857,14 +1015,24 @@ var ResourceManager = defineComponent2({
|
|
|
857
1015
|
saving.value = false;
|
|
858
1016
|
}
|
|
859
1017
|
}
|
|
860
|
-
|
|
861
|
-
|
|
1018
|
+
function askDelete(row) {
|
|
1019
|
+
deletingRow.value = row;
|
|
1020
|
+
}
|
|
1021
|
+
function closeDeleteDialog() {
|
|
1022
|
+
if (!deleting.value) deletingRow.value = null;
|
|
1023
|
+
}
|
|
1024
|
+
async function confirmDelete() {
|
|
1025
|
+
if (!deletingRow.value) return;
|
|
1026
|
+
deleting.value = true;
|
|
862
1027
|
error.value = "";
|
|
863
1028
|
try {
|
|
864
|
-
await props.api.remove(
|
|
1029
|
+
await props.api.remove(deletingRow.value.resourceId);
|
|
1030
|
+
deletingRow.value = null;
|
|
865
1031
|
await loadList("current", "");
|
|
866
1032
|
} catch (err) {
|
|
867
1033
|
error.value = err instanceof Error ? err.message : "\u5220\u9664\u5931\u8D25";
|
|
1034
|
+
} finally {
|
|
1035
|
+
deleting.value = false;
|
|
868
1036
|
}
|
|
869
1037
|
}
|
|
870
1038
|
onMounted(() => {
|
|
@@ -946,7 +1114,7 @@ var ResourceManager = defineComponent2({
|
|
|
946
1114
|
{
|
|
947
1115
|
type: "button",
|
|
948
1116
|
style: { ...s.linkBtn, color: "#d92d20" },
|
|
949
|
-
onClick: () =>
|
|
1117
|
+
onClick: () => askDelete(row)
|
|
950
1118
|
},
|
|
951
1119
|
"\u5220\u9664"
|
|
952
1120
|
)
|
|
@@ -1138,12 +1306,884 @@ var ResourceManager = defineComponent2({
|
|
|
1138
1306
|
]
|
|
1139
1307
|
)
|
|
1140
1308
|
]
|
|
1309
|
+
) : null,
|
|
1310
|
+
deletingRow.value ? h(
|
|
1311
|
+
"div",
|
|
1312
|
+
{ style: s.mask, onClick: closeDeleteDialog },
|
|
1313
|
+
[
|
|
1314
|
+
h(
|
|
1315
|
+
"div",
|
|
1316
|
+
{
|
|
1317
|
+
style: { ...s.dialog, maxWidth: "420px" },
|
|
1318
|
+
role: "dialog",
|
|
1319
|
+
"aria-modal": "true",
|
|
1320
|
+
"aria-labelledby": "angel-auth-delete-title",
|
|
1321
|
+
onClick: (e) => e.stopPropagation()
|
|
1322
|
+
},
|
|
1323
|
+
[
|
|
1324
|
+
h("div", { style: s.dialogHeader }, [
|
|
1325
|
+
h(
|
|
1326
|
+
"h3",
|
|
1327
|
+
{
|
|
1328
|
+
id: "angel-auth-delete-title",
|
|
1329
|
+
style: s.dialogTitle
|
|
1330
|
+
},
|
|
1331
|
+
"\u786E\u8BA4\u5220\u9664"
|
|
1332
|
+
),
|
|
1333
|
+
h(
|
|
1334
|
+
"button",
|
|
1335
|
+
{
|
|
1336
|
+
type: "button",
|
|
1337
|
+
style: s.iconBtn,
|
|
1338
|
+
"aria-label": "\u5173\u95ED",
|
|
1339
|
+
onClick: closeDeleteDialog
|
|
1340
|
+
},
|
|
1341
|
+
"\xD7"
|
|
1342
|
+
)
|
|
1343
|
+
]),
|
|
1344
|
+
h("div", { style: s.confirmBody }, [
|
|
1345
|
+
h("p", { style: s.confirmText }, [
|
|
1346
|
+
"\u786E\u8BA4\u5220\u9664\u6743\u9650\u70B9\u300C",
|
|
1347
|
+
h("strong", deletingRow.value.name),
|
|
1348
|
+
"\u300D\u5417\uFF1F\u5220\u9664\u540E\u4E0D\u53EF\u6062\u590D\u3002"
|
|
1349
|
+
]),
|
|
1350
|
+
h("div", { style: s.dialogFooter }, [
|
|
1351
|
+
h(
|
|
1352
|
+
"button",
|
|
1353
|
+
{
|
|
1354
|
+
type: "button",
|
|
1355
|
+
style: s.secondaryBtn,
|
|
1356
|
+
disabled: deleting.value,
|
|
1357
|
+
onClick: closeDeleteDialog
|
|
1358
|
+
},
|
|
1359
|
+
"\u53D6\u6D88"
|
|
1360
|
+
),
|
|
1361
|
+
h(
|
|
1362
|
+
"button",
|
|
1363
|
+
{
|
|
1364
|
+
type: "button",
|
|
1365
|
+
style: s.dangerBtn,
|
|
1366
|
+
disabled: deleting.value,
|
|
1367
|
+
onClick: () => void confirmDelete()
|
|
1368
|
+
},
|
|
1369
|
+
deleting.value ? "\u5220\u9664\u4E2D\u2026" : "\u786E\u8BA4\u5220\u9664"
|
|
1370
|
+
)
|
|
1371
|
+
])
|
|
1372
|
+
])
|
|
1373
|
+
]
|
|
1374
|
+
)
|
|
1375
|
+
]
|
|
1376
|
+
) : null
|
|
1377
|
+
]);
|
|
1378
|
+
}
|
|
1379
|
+
});
|
|
1380
|
+
|
|
1381
|
+
// src/vue/MenuManager.ts
|
|
1382
|
+
import {
|
|
1383
|
+
computed as computed3,
|
|
1384
|
+
defineComponent as defineComponent3,
|
|
1385
|
+
h as h2,
|
|
1386
|
+
onMounted as onMounted2,
|
|
1387
|
+
reactive as reactive2,
|
|
1388
|
+
ref as ref2,
|
|
1389
|
+
watch as watch2
|
|
1390
|
+
} from "vue";
|
|
1391
|
+
var PAGE_SIZE_OPTIONS2 = ["10", "20", "50", "100"];
|
|
1392
|
+
function emptyForm2() {
|
|
1393
|
+
return {
|
|
1394
|
+
parentId: ROOT_PARENT_ID,
|
|
1395
|
+
type: MENU_TYPE_MENU,
|
|
1396
|
+
name: "",
|
|
1397
|
+
identification: "",
|
|
1398
|
+
permissionPointIds: [],
|
|
1399
|
+
status: RESOURCE_STATUS_ENABLED
|
|
1400
|
+
};
|
|
1401
|
+
}
|
|
1402
|
+
var s2 = {
|
|
1403
|
+
root: {
|
|
1404
|
+
display: "flex",
|
|
1405
|
+
flexDirection: "column",
|
|
1406
|
+
gap: "16px",
|
|
1407
|
+
padding: "16px",
|
|
1408
|
+
color: "#101828",
|
|
1409
|
+
fontFamily: '"PingFang SC", "Microsoft YaHei", -apple-system, BlinkMacSystemFont, sans-serif'
|
|
1410
|
+
},
|
|
1411
|
+
toolbar: {
|
|
1412
|
+
display: "flex",
|
|
1413
|
+
alignItems: "center",
|
|
1414
|
+
justifyContent: "space-between",
|
|
1415
|
+
gap: "12px"
|
|
1416
|
+
},
|
|
1417
|
+
title: { margin: "0", fontSize: "18px", fontWeight: "600" },
|
|
1418
|
+
toolbarRight: { display: "flex", alignItems: "center", gap: "8px" },
|
|
1419
|
+
error: {
|
|
1420
|
+
padding: "10px 12px",
|
|
1421
|
+
borderRadius: "8px",
|
|
1422
|
+
background: "#fef3f2",
|
|
1423
|
+
color: "#b42318",
|
|
1424
|
+
fontSize: "13px"
|
|
1425
|
+
},
|
|
1426
|
+
tableWrap: {
|
|
1427
|
+
overflow: "auto",
|
|
1428
|
+
border: "1px solid #eaecf0",
|
|
1429
|
+
borderRadius: "10px",
|
|
1430
|
+
background: "#fff"
|
|
1431
|
+
},
|
|
1432
|
+
table: { width: "100%", borderCollapse: "collapse", minWidth: "820px" },
|
|
1433
|
+
th: {
|
|
1434
|
+
textAlign: "left",
|
|
1435
|
+
padding: "12px 14px",
|
|
1436
|
+
fontSize: "13px",
|
|
1437
|
+
fontWeight: "600",
|
|
1438
|
+
color: "#475467",
|
|
1439
|
+
background: "#f9fafb",
|
|
1440
|
+
borderBottom: "1px solid #eaecf0"
|
|
1441
|
+
},
|
|
1442
|
+
td: {
|
|
1443
|
+
padding: "12px 14px",
|
|
1444
|
+
fontSize: "14px",
|
|
1445
|
+
borderBottom: "1px solid #f2f4f7",
|
|
1446
|
+
verticalAlign: "middle"
|
|
1447
|
+
},
|
|
1448
|
+
empty: {
|
|
1449
|
+
padding: "28px",
|
|
1450
|
+
textAlign: "center",
|
|
1451
|
+
color: "#98a2b3",
|
|
1452
|
+
fontSize: "14px"
|
|
1453
|
+
},
|
|
1454
|
+
code: {
|
|
1455
|
+
fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace",
|
|
1456
|
+
fontSize: "13px",
|
|
1457
|
+
background: "#f2f4f7",
|
|
1458
|
+
padding: "2px 6px",
|
|
1459
|
+
borderRadius: "4px"
|
|
1460
|
+
},
|
|
1461
|
+
badge: {
|
|
1462
|
+
display: "inline-block",
|
|
1463
|
+
padding: "2px 8px",
|
|
1464
|
+
borderRadius: "999px",
|
|
1465
|
+
fontSize: "12px",
|
|
1466
|
+
fontWeight: "500"
|
|
1467
|
+
},
|
|
1468
|
+
linkBtn: {
|
|
1469
|
+
border: "none",
|
|
1470
|
+
background: "transparent",
|
|
1471
|
+
color: "#049BAD",
|
|
1472
|
+
cursor: "pointer",
|
|
1473
|
+
padding: "0 8px 0 0",
|
|
1474
|
+
fontSize: "13px"
|
|
1475
|
+
},
|
|
1476
|
+
pagination: {
|
|
1477
|
+
display: "flex",
|
|
1478
|
+
alignItems: "center",
|
|
1479
|
+
justifyContent: "space-between",
|
|
1480
|
+
gap: "12px"
|
|
1481
|
+
},
|
|
1482
|
+
pageSize: {
|
|
1483
|
+
display: "flex",
|
|
1484
|
+
alignItems: "center",
|
|
1485
|
+
gap: "8px",
|
|
1486
|
+
fontSize: "13px",
|
|
1487
|
+
color: "#475467"
|
|
1488
|
+
},
|
|
1489
|
+
pageBtns: { display: "flex", gap: "8px" },
|
|
1490
|
+
primaryBtn: {
|
|
1491
|
+
border: "none",
|
|
1492
|
+
background: "#049BAD",
|
|
1493
|
+
color: "#fff",
|
|
1494
|
+
borderRadius: "8px",
|
|
1495
|
+
padding: "8px 14px",
|
|
1496
|
+
cursor: "pointer",
|
|
1497
|
+
fontSize: "14px"
|
|
1498
|
+
},
|
|
1499
|
+
secondaryBtn: {
|
|
1500
|
+
border: "1px solid #d0d5dd",
|
|
1501
|
+
background: "#fff",
|
|
1502
|
+
color: "#344054",
|
|
1503
|
+
borderRadius: "8px",
|
|
1504
|
+
padding: "8px 14px",
|
|
1505
|
+
cursor: "pointer",
|
|
1506
|
+
fontSize: "14px"
|
|
1507
|
+
},
|
|
1508
|
+
dangerBtn: {
|
|
1509
|
+
border: "none",
|
|
1510
|
+
background: "#d92d20",
|
|
1511
|
+
color: "#fff",
|
|
1512
|
+
borderRadius: "8px",
|
|
1513
|
+
padding: "8px 14px",
|
|
1514
|
+
cursor: "pointer",
|
|
1515
|
+
fontSize: "14px"
|
|
1516
|
+
},
|
|
1517
|
+
select: {
|
|
1518
|
+
border: "1px solid #d0d5dd",
|
|
1519
|
+
borderRadius: "6px",
|
|
1520
|
+
padding: "4px 8px",
|
|
1521
|
+
fontSize: "13px",
|
|
1522
|
+
backgroundColor: "#ffffff",
|
|
1523
|
+
color: "#101828"
|
|
1524
|
+
},
|
|
1525
|
+
mask: {
|
|
1526
|
+
position: "fixed",
|
|
1527
|
+
inset: "0",
|
|
1528
|
+
background: "rgba(16, 24, 40, 0.45)",
|
|
1529
|
+
display: "flex",
|
|
1530
|
+
alignItems: "center",
|
|
1531
|
+
justifyContent: "center",
|
|
1532
|
+
zIndex: "1000",
|
|
1533
|
+
padding: "16px"
|
|
1534
|
+
},
|
|
1535
|
+
dialog: {
|
|
1536
|
+
width: "100%",
|
|
1537
|
+
maxWidth: "480px",
|
|
1538
|
+
background: "#fff",
|
|
1539
|
+
borderRadius: "12px",
|
|
1540
|
+
boxShadow: "0 20px 40px rgba(16,24,40,0.18)",
|
|
1541
|
+
maxHeight: "90vh",
|
|
1542
|
+
overflow: "auto"
|
|
1543
|
+
},
|
|
1544
|
+
dialogHeader: {
|
|
1545
|
+
display: "flex",
|
|
1546
|
+
alignItems: "center",
|
|
1547
|
+
justifyContent: "space-between",
|
|
1548
|
+
padding: "14px 16px",
|
|
1549
|
+
borderBottom: "1px solid #eaecf0",
|
|
1550
|
+
position: "sticky",
|
|
1551
|
+
top: "0",
|
|
1552
|
+
background: "#fff",
|
|
1553
|
+
zIndex: "1"
|
|
1554
|
+
},
|
|
1555
|
+
dialogTitle: { margin: "0", fontSize: "16px", fontWeight: "600" },
|
|
1556
|
+
iconBtn: {
|
|
1557
|
+
border: "none",
|
|
1558
|
+
background: "transparent",
|
|
1559
|
+
fontSize: "22px",
|
|
1560
|
+
lineHeight: "1",
|
|
1561
|
+
cursor: "pointer",
|
|
1562
|
+
color: "#667085"
|
|
1563
|
+
},
|
|
1564
|
+
form: { display: "flex", flexDirection: "column", gap: "12px", padding: "16px" },
|
|
1565
|
+
confirmBody: {
|
|
1566
|
+
display: "flex",
|
|
1567
|
+
flexDirection: "column",
|
|
1568
|
+
gap: "16px",
|
|
1569
|
+
padding: "16px"
|
|
1570
|
+
},
|
|
1571
|
+
confirmText: {
|
|
1572
|
+
margin: "0",
|
|
1573
|
+
fontSize: "14px",
|
|
1574
|
+
color: "#344054",
|
|
1575
|
+
lineHeight: "1.6"
|
|
1576
|
+
},
|
|
1577
|
+
field: { display: "flex", flexDirection: "column", gap: "6px" },
|
|
1578
|
+
fieldset: {
|
|
1579
|
+
margin: "0",
|
|
1580
|
+
padding: "0",
|
|
1581
|
+
border: "none",
|
|
1582
|
+
display: "flex",
|
|
1583
|
+
flexDirection: "column",
|
|
1584
|
+
gap: "8px"
|
|
1585
|
+
},
|
|
1586
|
+
label: { fontSize: "13px", color: "#344054", fontWeight: "500" },
|
|
1587
|
+
input: {
|
|
1588
|
+
border: "1px solid #d0d5dd",
|
|
1589
|
+
borderRadius: "8px",
|
|
1590
|
+
padding: "8px 10px",
|
|
1591
|
+
fontSize: "14px",
|
|
1592
|
+
outline: "none",
|
|
1593
|
+
backgroundColor: "#ffffff",
|
|
1594
|
+
color: "#101828",
|
|
1595
|
+
boxSizing: "border-box",
|
|
1596
|
+
width: "100%"
|
|
1597
|
+
},
|
|
1598
|
+
radioGroup: { display: "flex", flexWrap: "wrap", gap: "16px" },
|
|
1599
|
+
radioItem: {
|
|
1600
|
+
display: "flex",
|
|
1601
|
+
alignItems: "center",
|
|
1602
|
+
gap: "6px",
|
|
1603
|
+
fontSize: "14px",
|
|
1604
|
+
color: "#344054",
|
|
1605
|
+
cursor: "pointer"
|
|
1606
|
+
},
|
|
1607
|
+
multiSelect: {
|
|
1608
|
+
maxHeight: "160px",
|
|
1609
|
+
overflow: "auto",
|
|
1610
|
+
border: "1px solid #eaecf0",
|
|
1611
|
+
borderRadius: "8px",
|
|
1612
|
+
padding: "8px",
|
|
1613
|
+
background: "#f9fafb"
|
|
1614
|
+
},
|
|
1615
|
+
checkItem: {
|
|
1616
|
+
display: "flex",
|
|
1617
|
+
alignItems: "center",
|
|
1618
|
+
gap: "8px",
|
|
1619
|
+
padding: "6px 4px",
|
|
1620
|
+
fontSize: "13px",
|
|
1621
|
+
color: "#344054",
|
|
1622
|
+
cursor: "pointer"
|
|
1623
|
+
},
|
|
1624
|
+
hint: { fontSize: "13px", color: "#98a2b3", padding: "8px" },
|
|
1625
|
+
dialogFooter: {
|
|
1626
|
+
display: "flex",
|
|
1627
|
+
justifyContent: "flex-end",
|
|
1628
|
+
gap: "8px",
|
|
1629
|
+
paddingTop: "4px"
|
|
1630
|
+
}
|
|
1631
|
+
};
|
|
1632
|
+
var MenuManager = defineComponent3({
|
|
1633
|
+
name: "MenuManager",
|
|
1634
|
+
props: {
|
|
1635
|
+
api: {
|
|
1636
|
+
type: Object,
|
|
1637
|
+
required: true
|
|
1638
|
+
},
|
|
1639
|
+
title: {
|
|
1640
|
+
type: String,
|
|
1641
|
+
default: "\u83DC\u5355\u7BA1\u7406"
|
|
1642
|
+
},
|
|
1643
|
+
pageSize: {
|
|
1644
|
+
type: String,
|
|
1645
|
+
default: "20"
|
|
1646
|
+
}
|
|
1647
|
+
},
|
|
1648
|
+
setup(props, { slots }) {
|
|
1649
|
+
const records = ref2([]);
|
|
1650
|
+
const permissionPoints = ref2([]);
|
|
1651
|
+
const loading = ref2(false);
|
|
1652
|
+
const error = ref2("");
|
|
1653
|
+
const pageSize = ref2(props.pageSize);
|
|
1654
|
+
const pageToken = ref2("");
|
|
1655
|
+
const hasPreviousPage = ref2(false);
|
|
1656
|
+
const hasNextPage = ref2(false);
|
|
1657
|
+
const dialogOpen = ref2(false);
|
|
1658
|
+
const editing = ref2(null);
|
|
1659
|
+
const form = reactive2(emptyForm2());
|
|
1660
|
+
const saving = ref2(false);
|
|
1661
|
+
const deletingRow = ref2(null);
|
|
1662
|
+
const deleting = ref2(false);
|
|
1663
|
+
const permissionNameMap = computed3(() => {
|
|
1664
|
+
const map = /* @__PURE__ */ new Map();
|
|
1665
|
+
permissionPoints.value.forEach(
|
|
1666
|
+
(p) => map.set(p.resourceId, p.name || p.identification)
|
|
1667
|
+
);
|
|
1668
|
+
return map;
|
|
1669
|
+
});
|
|
1670
|
+
const parentOptions = computed3(
|
|
1671
|
+
() => records.value.filter((row) => !editing.value || row.resourceId !== editing.value.resourceId).map((row) => ({
|
|
1672
|
+
value: row.resourceId,
|
|
1673
|
+
label: `${row.name}\uFF08${MENU_TYPE_LABEL[row.type]}\uFF09`
|
|
1674
|
+
}))
|
|
1675
|
+
);
|
|
1676
|
+
async function loadList(direction = "current", token = pageToken.value) {
|
|
1677
|
+
loading.value = true;
|
|
1678
|
+
error.value = "";
|
|
1679
|
+
try {
|
|
1680
|
+
const result = await props.api.list({
|
|
1681
|
+
pagination: {
|
|
1682
|
+
pageToken: token,
|
|
1683
|
+
pageSize: pageSize.value,
|
|
1684
|
+
pageDirection: direction
|
|
1685
|
+
}
|
|
1686
|
+
});
|
|
1687
|
+
records.value = result.records;
|
|
1688
|
+
pageToken.value = result.pageToken;
|
|
1689
|
+
hasPreviousPage.value = result.hasPreviousPage;
|
|
1690
|
+
hasNextPage.value = result.hasNextPage;
|
|
1691
|
+
} catch (err) {
|
|
1692
|
+
error.value = err instanceof Error ? err.message : "\u52A0\u8F7D\u5931\u8D25";
|
|
1693
|
+
} finally {
|
|
1694
|
+
loading.value = false;
|
|
1695
|
+
}
|
|
1696
|
+
}
|
|
1697
|
+
async function loadPermissionPoints() {
|
|
1698
|
+
try {
|
|
1699
|
+
const result = await props.api.listPermissionPoints({
|
|
1700
|
+
pagination: { pageSize: "200", pageDirection: "current" }
|
|
1701
|
+
});
|
|
1702
|
+
permissionPoints.value = result.records;
|
|
1703
|
+
} catch {
|
|
1704
|
+
}
|
|
1705
|
+
}
|
|
1706
|
+
function openCreate() {
|
|
1707
|
+
editing.value = null;
|
|
1708
|
+
Object.assign(form, emptyForm2());
|
|
1709
|
+
dialogOpen.value = true;
|
|
1710
|
+
void loadPermissionPoints();
|
|
1711
|
+
}
|
|
1712
|
+
function openEdit(row) {
|
|
1713
|
+
editing.value = row;
|
|
1714
|
+
Object.assign(form, {
|
|
1715
|
+
parentId: row.parentId || ROOT_PARENT_ID,
|
|
1716
|
+
type: row.type,
|
|
1717
|
+
name: row.name,
|
|
1718
|
+
identification: row.identification,
|
|
1719
|
+
permissionPointIds: [...row.permissionPointIds],
|
|
1720
|
+
status: row.status
|
|
1721
|
+
});
|
|
1722
|
+
dialogOpen.value = true;
|
|
1723
|
+
void loadPermissionPoints();
|
|
1724
|
+
}
|
|
1725
|
+
function closeDialog() {
|
|
1726
|
+
if (!saving.value) dialogOpen.value = false;
|
|
1727
|
+
}
|
|
1728
|
+
async function handleSubmit(event) {
|
|
1729
|
+
event.preventDefault();
|
|
1730
|
+
if (!form.name.trim()) {
|
|
1731
|
+
error.value = "\u8BF7\u586B\u5199\u83DC\u5355\u540D\u79F0";
|
|
1732
|
+
return;
|
|
1733
|
+
}
|
|
1734
|
+
saving.value = true;
|
|
1735
|
+
error.value = "";
|
|
1736
|
+
try {
|
|
1737
|
+
if (editing.value) {
|
|
1738
|
+
await props.api.update(editing.value.resourceId, { ...form });
|
|
1739
|
+
} else {
|
|
1740
|
+
await props.api.create({ ...form });
|
|
1741
|
+
}
|
|
1742
|
+
dialogOpen.value = false;
|
|
1743
|
+
await loadList("current", "");
|
|
1744
|
+
} catch (err) {
|
|
1745
|
+
error.value = err instanceof Error ? err.message : "\u4FDD\u5B58\u5931\u8D25";
|
|
1746
|
+
} finally {
|
|
1747
|
+
saving.value = false;
|
|
1748
|
+
}
|
|
1749
|
+
}
|
|
1750
|
+
function askDelete(row) {
|
|
1751
|
+
deletingRow.value = row;
|
|
1752
|
+
}
|
|
1753
|
+
function closeDeleteDialog() {
|
|
1754
|
+
if (!deleting.value) deletingRow.value = null;
|
|
1755
|
+
}
|
|
1756
|
+
async function confirmDelete() {
|
|
1757
|
+
if (!deletingRow.value) return;
|
|
1758
|
+
deleting.value = true;
|
|
1759
|
+
error.value = "";
|
|
1760
|
+
try {
|
|
1761
|
+
await props.api.remove(deletingRow.value.resourceId);
|
|
1762
|
+
deletingRow.value = null;
|
|
1763
|
+
await loadList("current", "");
|
|
1764
|
+
} catch (err) {
|
|
1765
|
+
error.value = err instanceof Error ? err.message : "\u5220\u9664\u5931\u8D25";
|
|
1766
|
+
} finally {
|
|
1767
|
+
deleting.value = false;
|
|
1768
|
+
}
|
|
1769
|
+
}
|
|
1770
|
+
function togglePermission(id) {
|
|
1771
|
+
const exists = form.permissionPointIds.includes(id);
|
|
1772
|
+
form.permissionPointIds = exists ? form.permissionPointIds.filter((x) => x !== id) : [...form.permissionPointIds, id];
|
|
1773
|
+
}
|
|
1774
|
+
function renderPermissionLabels(row) {
|
|
1775
|
+
if (row.permissionPointNames?.length) {
|
|
1776
|
+
return row.permissionPointNames.join("\u3001");
|
|
1777
|
+
}
|
|
1778
|
+
if (!row.permissionPointIds.length) return "\u2014";
|
|
1779
|
+
return row.permissionPointIds.map((id) => permissionNameMap.value.get(id) ?? id).join("\u3001");
|
|
1780
|
+
}
|
|
1781
|
+
onMounted2(() => {
|
|
1782
|
+
void loadList("current", "");
|
|
1783
|
+
void loadPermissionPoints();
|
|
1784
|
+
});
|
|
1785
|
+
watch2(
|
|
1786
|
+
() => [props.api, pageSize.value],
|
|
1787
|
+
() => {
|
|
1788
|
+
pageToken.value = "";
|
|
1789
|
+
void loadList("current", "");
|
|
1790
|
+
}
|
|
1791
|
+
);
|
|
1792
|
+
return () => h2("div", { style: s2.root }, [
|
|
1793
|
+
h2("div", { style: s2.toolbar }, [
|
|
1794
|
+
h2("h2", { style: s2.title }, props.title),
|
|
1795
|
+
h2("div", { style: s2.toolbarRight }, [
|
|
1796
|
+
slots.toolbarExtra?.(),
|
|
1797
|
+
h2(
|
|
1798
|
+
"button",
|
|
1799
|
+
{ type: "button", style: s2.primaryBtn, onClick: openCreate },
|
|
1800
|
+
"\u65B0\u589E"
|
|
1801
|
+
)
|
|
1802
|
+
])
|
|
1803
|
+
]),
|
|
1804
|
+
error.value ? h2("div", { style: s2.error }, error.value) : null,
|
|
1805
|
+
h2("div", { style: s2.tableWrap }, [
|
|
1806
|
+
h2("table", { style: s2.table }, [
|
|
1807
|
+
h2("thead", [
|
|
1808
|
+
h2("tr", [
|
|
1809
|
+
h2("th", { style: s2.th }, "\u83DC\u5355\u540D\u79F0"),
|
|
1810
|
+
h2("th", { style: s2.th }, "\u8BF7\u6C42\u5730\u5740"),
|
|
1811
|
+
h2("th", { style: { ...s2.th, width: "90px" } }, "\u7C7B\u578B"),
|
|
1812
|
+
h2("th", { style: { ...s2.th, width: "80px" } }, "\u53EF\u89C1"),
|
|
1813
|
+
h2("th", { style: s2.th }, "\u6743\u9650\u6807\u8BC6"),
|
|
1814
|
+
h2("th", { style: { ...s2.th, width: "140px" } }, "\u64CD\u4F5C")
|
|
1815
|
+
])
|
|
1816
|
+
]),
|
|
1817
|
+
h2(
|
|
1818
|
+
"tbody",
|
|
1819
|
+
loading.value ? [
|
|
1820
|
+
h2("tr", [
|
|
1821
|
+
h2("td", { colspan: 6, style: s2.empty }, "\u52A0\u8F7D\u4E2D\u2026")
|
|
1822
|
+
])
|
|
1823
|
+
] : records.value.length === 0 ? [
|
|
1824
|
+
h2("tr", [
|
|
1825
|
+
h2("td", { colspan: 6, style: s2.empty }, "\u6682\u65E0\u6570\u636E")
|
|
1826
|
+
])
|
|
1827
|
+
] : records.value.map(
|
|
1828
|
+
(row) => h2("tr", { key: row.resourceId }, [
|
|
1829
|
+
h2("td", { style: s2.td }, row.name),
|
|
1830
|
+
h2("td", { style: s2.td }, [
|
|
1831
|
+
h2(
|
|
1832
|
+
"code",
|
|
1833
|
+
{ style: s2.code },
|
|
1834
|
+
row.identification || "\u2014"
|
|
1835
|
+
)
|
|
1836
|
+
]),
|
|
1837
|
+
h2("td", { style: s2.td }, MENU_TYPE_LABEL[row.type]),
|
|
1838
|
+
h2("td", { style: s2.td }, [
|
|
1839
|
+
h2(
|
|
1840
|
+
"span",
|
|
1841
|
+
{
|
|
1842
|
+
style: {
|
|
1843
|
+
...s2.badge,
|
|
1844
|
+
background: row.status === RESOURCE_STATUS_ENABLED ? "#e8f7ef" : "#f4f4f5",
|
|
1845
|
+
color: row.status === RESOURCE_STATUS_ENABLED ? "#067647" : "#667085"
|
|
1846
|
+
}
|
|
1847
|
+
},
|
|
1848
|
+
row.status === RESOURCE_STATUS_ENABLED ? "\u663E\u793A" : "\u9690\u85CF"
|
|
1849
|
+
)
|
|
1850
|
+
]),
|
|
1851
|
+
h2("td", { style: s2.td }, renderPermissionLabels(row)),
|
|
1852
|
+
h2("td", { style: s2.td }, [
|
|
1853
|
+
h2(
|
|
1854
|
+
"button",
|
|
1855
|
+
{
|
|
1856
|
+
type: "button",
|
|
1857
|
+
style: s2.linkBtn,
|
|
1858
|
+
onClick: () => openEdit(row)
|
|
1859
|
+
},
|
|
1860
|
+
"\u7F16\u8F91"
|
|
1861
|
+
),
|
|
1862
|
+
h2(
|
|
1863
|
+
"button",
|
|
1864
|
+
{
|
|
1865
|
+
type: "button",
|
|
1866
|
+
style: { ...s2.linkBtn, color: "#d92d20" },
|
|
1867
|
+
onClick: () => askDelete(row)
|
|
1868
|
+
},
|
|
1869
|
+
"\u5220\u9664"
|
|
1870
|
+
)
|
|
1871
|
+
])
|
|
1872
|
+
])
|
|
1873
|
+
)
|
|
1874
|
+
)
|
|
1875
|
+
])
|
|
1876
|
+
]),
|
|
1877
|
+
h2("div", { style: s2.pagination }, [
|
|
1878
|
+
h2("label", { style: s2.pageSize }, [
|
|
1879
|
+
"\u6BCF\u9875",
|
|
1880
|
+
h2(
|
|
1881
|
+
"select",
|
|
1882
|
+
{
|
|
1883
|
+
style: s2.select,
|
|
1884
|
+
value: pageSize.value,
|
|
1885
|
+
onChange: (e) => {
|
|
1886
|
+
pageSize.value = e.target.value;
|
|
1887
|
+
}
|
|
1888
|
+
},
|
|
1889
|
+
PAGE_SIZE_OPTIONS2.map(
|
|
1890
|
+
(size) => h2("option", { key: size, value: size }, size)
|
|
1891
|
+
)
|
|
1892
|
+
)
|
|
1893
|
+
]),
|
|
1894
|
+
h2("div", { style: s2.pageBtns }, [
|
|
1895
|
+
h2(
|
|
1896
|
+
"button",
|
|
1897
|
+
{
|
|
1898
|
+
type: "button",
|
|
1899
|
+
style: s2.secondaryBtn,
|
|
1900
|
+
disabled: !hasPreviousPage.value || loading.value,
|
|
1901
|
+
onClick: () => void loadList("previous")
|
|
1902
|
+
},
|
|
1903
|
+
"\u4E0A\u4E00\u9875"
|
|
1904
|
+
),
|
|
1905
|
+
h2(
|
|
1906
|
+
"button",
|
|
1907
|
+
{
|
|
1908
|
+
type: "button",
|
|
1909
|
+
style: s2.secondaryBtn,
|
|
1910
|
+
disabled: !hasNextPage.value || loading.value,
|
|
1911
|
+
onClick: () => void loadList("next")
|
|
1912
|
+
},
|
|
1913
|
+
"\u4E0B\u4E00\u9875"
|
|
1914
|
+
)
|
|
1915
|
+
])
|
|
1916
|
+
]),
|
|
1917
|
+
dialogOpen.value ? h2(
|
|
1918
|
+
"div",
|
|
1919
|
+
{ style: s2.mask, onClick: closeDialog },
|
|
1920
|
+
[
|
|
1921
|
+
h2(
|
|
1922
|
+
"div",
|
|
1923
|
+
{
|
|
1924
|
+
style: { ...s2.dialog, maxWidth: "520px" },
|
|
1925
|
+
role: "dialog",
|
|
1926
|
+
"aria-modal": "true",
|
|
1927
|
+
onClick: (e) => e.stopPropagation()
|
|
1928
|
+
},
|
|
1929
|
+
[
|
|
1930
|
+
h2("div", { style: s2.dialogHeader }, [
|
|
1931
|
+
h2(
|
|
1932
|
+
"h3",
|
|
1933
|
+
{ style: s2.dialogTitle },
|
|
1934
|
+
editing.value ? "\u7F16\u8F91\u83DC\u5355" : "\u65B0\u589E\u83DC\u5355"
|
|
1935
|
+
),
|
|
1936
|
+
h2(
|
|
1937
|
+
"button",
|
|
1938
|
+
{
|
|
1939
|
+
type: "button",
|
|
1940
|
+
style: s2.iconBtn,
|
|
1941
|
+
"aria-label": "\u5173\u95ED",
|
|
1942
|
+
onClick: closeDialog
|
|
1943
|
+
},
|
|
1944
|
+
"\xD7"
|
|
1945
|
+
)
|
|
1946
|
+
]),
|
|
1947
|
+
h2(
|
|
1948
|
+
"form",
|
|
1949
|
+
{
|
|
1950
|
+
style: s2.form,
|
|
1951
|
+
onSubmit: (e) => void handleSubmit(e)
|
|
1952
|
+
},
|
|
1953
|
+
[
|
|
1954
|
+
h2("label", { style: s2.field }, [
|
|
1955
|
+
h2("span", { style: s2.label }, "\u4E0A\u7EA7\u83DC\u5355"),
|
|
1956
|
+
h2(
|
|
1957
|
+
"select",
|
|
1958
|
+
{
|
|
1959
|
+
style: s2.input,
|
|
1960
|
+
value: form.parentId,
|
|
1961
|
+
onChange: (e) => {
|
|
1962
|
+
form.parentId = e.target.value;
|
|
1963
|
+
}
|
|
1964
|
+
},
|
|
1965
|
+
[
|
|
1966
|
+
h2("option", { value: ROOT_PARENT_ID }, "\u6839\u76EE\u5F55"),
|
|
1967
|
+
...parentOptions.value.map(
|
|
1968
|
+
(opt) => h2(
|
|
1969
|
+
"option",
|
|
1970
|
+
{ key: opt.value, value: opt.value },
|
|
1971
|
+
opt.label
|
|
1972
|
+
)
|
|
1973
|
+
)
|
|
1974
|
+
]
|
|
1975
|
+
)
|
|
1976
|
+
]),
|
|
1977
|
+
h2("fieldset", { style: s2.fieldset }, [
|
|
1978
|
+
h2("legend", { style: s2.label }, "\u83DC\u5355\u7C7B\u578B"),
|
|
1979
|
+
h2(
|
|
1980
|
+
"div",
|
|
1981
|
+
{ style: s2.radioGroup },
|
|
1982
|
+
MENU_TYPE_OPTIONS.map(
|
|
1983
|
+
(opt) => h2("label", { key: opt.value, style: s2.radioItem }, [
|
|
1984
|
+
h2("input", {
|
|
1985
|
+
type: "radio",
|
|
1986
|
+
name: "menu-type",
|
|
1987
|
+
checked: form.type === opt.value,
|
|
1988
|
+
onChange: () => {
|
|
1989
|
+
form.type = opt.value;
|
|
1990
|
+
}
|
|
1991
|
+
}),
|
|
1992
|
+
opt.label
|
|
1993
|
+
])
|
|
1994
|
+
)
|
|
1995
|
+
)
|
|
1996
|
+
]),
|
|
1997
|
+
h2("label", { style: s2.field }, [
|
|
1998
|
+
h2("span", { style: s2.label }, "\u83DC\u5355\u540D\u79F0"),
|
|
1999
|
+
h2("input", {
|
|
2000
|
+
style: s2.input,
|
|
2001
|
+
value: form.name,
|
|
2002
|
+
placeholder: "\u8BF7\u8F93\u5165\u83DC\u5355\u540D\u79F0",
|
|
2003
|
+
required: true,
|
|
2004
|
+
onInput: (e) => {
|
|
2005
|
+
form.name = e.target.value;
|
|
2006
|
+
}
|
|
2007
|
+
})
|
|
2008
|
+
]),
|
|
2009
|
+
h2("label", { style: s2.field }, [
|
|
2010
|
+
h2("span", { style: s2.label }, "\u8BF7\u6C42\u5730\u5740"),
|
|
2011
|
+
h2("input", {
|
|
2012
|
+
style: s2.input,
|
|
2013
|
+
value: form.identification,
|
|
2014
|
+
placeholder: "\u5982 /system/user",
|
|
2015
|
+
onInput: (e) => {
|
|
2016
|
+
form.identification = e.target.value;
|
|
2017
|
+
}
|
|
2018
|
+
})
|
|
2019
|
+
]),
|
|
2020
|
+
h2("fieldset", { style: s2.fieldset }, [
|
|
2021
|
+
h2("legend", { style: s2.label }, "\u6743\u9650\u6807\u8BC6"),
|
|
2022
|
+
h2(
|
|
2023
|
+
"div",
|
|
2024
|
+
{ style: s2.multiSelect },
|
|
2025
|
+
permissionPoints.value.length === 0 ? [
|
|
2026
|
+
h2(
|
|
2027
|
+
"div",
|
|
2028
|
+
{ style: s2.hint },
|
|
2029
|
+
"\u6682\u65E0\u6743\u9650\u70B9\uFF0C\u8BF7\u5148\u5728\u6743\u9650\u70B9\u7BA1\u7406\u4E2D\u65B0\u589E"
|
|
2030
|
+
)
|
|
2031
|
+
] : permissionPoints.value.map(
|
|
2032
|
+
(p) => h2(
|
|
2033
|
+
"label",
|
|
2034
|
+
{ key: p.resourceId, style: s2.checkItem },
|
|
2035
|
+
[
|
|
2036
|
+
h2("input", {
|
|
2037
|
+
type: "checkbox",
|
|
2038
|
+
checked: form.permissionPointIds.includes(
|
|
2039
|
+
p.resourceId
|
|
2040
|
+
),
|
|
2041
|
+
onChange: () => togglePermission(p.resourceId)
|
|
2042
|
+
}),
|
|
2043
|
+
h2("span", [
|
|
2044
|
+
p.name,
|
|
2045
|
+
h2(
|
|
2046
|
+
"code",
|
|
2047
|
+
{
|
|
2048
|
+
style: {
|
|
2049
|
+
...s2.code,
|
|
2050
|
+
marginLeft: "6px"
|
|
2051
|
+
}
|
|
2052
|
+
},
|
|
2053
|
+
p.identification
|
|
2054
|
+
)
|
|
2055
|
+
])
|
|
2056
|
+
]
|
|
2057
|
+
)
|
|
2058
|
+
)
|
|
2059
|
+
)
|
|
2060
|
+
]),
|
|
2061
|
+
h2("fieldset", { style: s2.fieldset }, [
|
|
2062
|
+
h2("legend", { style: s2.label }, "\u72B6\u6001"),
|
|
2063
|
+
h2(
|
|
2064
|
+
"div",
|
|
2065
|
+
{ style: s2.radioGroup },
|
|
2066
|
+
MENU_VISIBILITY_OPTIONS.map(
|
|
2067
|
+
(opt) => h2("label", { key: opt.value, style: s2.radioItem }, [
|
|
2068
|
+
h2("input", {
|
|
2069
|
+
type: "radio",
|
|
2070
|
+
name: "menu-status",
|
|
2071
|
+
checked: form.status === opt.value,
|
|
2072
|
+
onChange: () => {
|
|
2073
|
+
form.status = opt.value;
|
|
2074
|
+
}
|
|
2075
|
+
}),
|
|
2076
|
+
opt.label
|
|
2077
|
+
])
|
|
2078
|
+
)
|
|
2079
|
+
)
|
|
2080
|
+
]),
|
|
2081
|
+
h2("div", { style: s2.dialogFooter }, [
|
|
2082
|
+
h2(
|
|
2083
|
+
"button",
|
|
2084
|
+
{
|
|
2085
|
+
type: "button",
|
|
2086
|
+
style: s2.secondaryBtn,
|
|
2087
|
+
onClick: closeDialog
|
|
2088
|
+
},
|
|
2089
|
+
"\u53D6\u6D88"
|
|
2090
|
+
),
|
|
2091
|
+
h2(
|
|
2092
|
+
"button",
|
|
2093
|
+
{
|
|
2094
|
+
type: "submit",
|
|
2095
|
+
style: s2.primaryBtn,
|
|
2096
|
+
disabled: saving.value
|
|
2097
|
+
},
|
|
2098
|
+
saving.value ? "\u4FDD\u5B58\u4E2D\u2026" : "\u4FDD\u5B58"
|
|
2099
|
+
)
|
|
2100
|
+
])
|
|
2101
|
+
]
|
|
2102
|
+
)
|
|
2103
|
+
]
|
|
2104
|
+
)
|
|
2105
|
+
]
|
|
2106
|
+
) : null,
|
|
2107
|
+
deletingRow.value ? h2(
|
|
2108
|
+
"div",
|
|
2109
|
+
{ style: s2.mask, onClick: closeDeleteDialog },
|
|
2110
|
+
[
|
|
2111
|
+
h2(
|
|
2112
|
+
"div",
|
|
2113
|
+
{
|
|
2114
|
+
style: { ...s2.dialog, maxWidth: "420px" },
|
|
2115
|
+
role: "dialog",
|
|
2116
|
+
"aria-modal": "true",
|
|
2117
|
+
"aria-labelledby": "angel-auth-menu-delete-title",
|
|
2118
|
+
onClick: (e) => e.stopPropagation()
|
|
2119
|
+
},
|
|
2120
|
+
[
|
|
2121
|
+
h2("div", { style: s2.dialogHeader }, [
|
|
2122
|
+
h2(
|
|
2123
|
+
"h3",
|
|
2124
|
+
{
|
|
2125
|
+
id: "angel-auth-menu-delete-title",
|
|
2126
|
+
style: s2.dialogTitle
|
|
2127
|
+
},
|
|
2128
|
+
"\u786E\u8BA4\u5220\u9664"
|
|
2129
|
+
),
|
|
2130
|
+
h2(
|
|
2131
|
+
"button",
|
|
2132
|
+
{
|
|
2133
|
+
type: "button",
|
|
2134
|
+
style: s2.iconBtn,
|
|
2135
|
+
"aria-label": "\u5173\u95ED",
|
|
2136
|
+
onClick: closeDeleteDialog
|
|
2137
|
+
},
|
|
2138
|
+
"\xD7"
|
|
2139
|
+
)
|
|
2140
|
+
]),
|
|
2141
|
+
h2("div", { style: s2.confirmBody }, [
|
|
2142
|
+
h2("p", { style: s2.confirmText }, [
|
|
2143
|
+
"\u786E\u8BA4\u5220\u9664\u83DC\u5355\u300C",
|
|
2144
|
+
h2("strong", deletingRow.value.name),
|
|
2145
|
+
"\u300D\u5417\uFF1F\u5220\u9664\u540E\u4E0D\u53EF\u6062\u590D\u3002"
|
|
2146
|
+
]),
|
|
2147
|
+
h2("div", { style: s2.dialogFooter }, [
|
|
2148
|
+
h2(
|
|
2149
|
+
"button",
|
|
2150
|
+
{
|
|
2151
|
+
type: "button",
|
|
2152
|
+
style: s2.secondaryBtn,
|
|
2153
|
+
disabled: deleting.value,
|
|
2154
|
+
onClick: closeDeleteDialog
|
|
2155
|
+
},
|
|
2156
|
+
"\u53D6\u6D88"
|
|
2157
|
+
),
|
|
2158
|
+
h2(
|
|
2159
|
+
"button",
|
|
2160
|
+
{
|
|
2161
|
+
type: "button",
|
|
2162
|
+
style: s2.dangerBtn,
|
|
2163
|
+
disabled: deleting.value,
|
|
2164
|
+
onClick: () => void confirmDelete()
|
|
2165
|
+
},
|
|
2166
|
+
deleting.value ? "\u5220\u9664\u4E2D\u2026" : "\u786E\u8BA4\u5220\u9664"
|
|
2167
|
+
)
|
|
2168
|
+
])
|
|
2169
|
+
])
|
|
2170
|
+
]
|
|
2171
|
+
)
|
|
2172
|
+
]
|
|
1141
2173
|
) : null
|
|
1142
2174
|
]);
|
|
1143
2175
|
}
|
|
1144
2176
|
});
|
|
1145
2177
|
export {
|
|
1146
2178
|
Can,
|
|
2179
|
+
MENU_LIST_TYPE_PARAM,
|
|
2180
|
+
MENU_TYPE_BUTTON,
|
|
2181
|
+
MENU_TYPE_LABEL,
|
|
2182
|
+
MENU_TYPE_MENU,
|
|
2183
|
+
MENU_TYPE_OPTIONS,
|
|
2184
|
+
MENU_TYPE_PAGE,
|
|
2185
|
+
MENU_VISIBILITY_OPTIONS,
|
|
2186
|
+
MenuManager,
|
|
1147
2187
|
PERMISSION_STORE_KEY,
|
|
1148
2188
|
PermissionStore,
|
|
1149
2189
|
RESOURCE_PRIVATE_OPTIONS,
|
|
@@ -1151,12 +2191,16 @@ export {
|
|
|
1151
2191
|
RESOURCE_STATUS_ENABLED,
|
|
1152
2192
|
RESOURCE_STATUS_OPTIONS,
|
|
1153
2193
|
RESOURCE_TYPE_API,
|
|
2194
|
+
ROOT_PARENT_ID,
|
|
1154
2195
|
ResourceManager,
|
|
1155
2196
|
appendQueryParam,
|
|
1156
2197
|
buildCreateBody,
|
|
2198
|
+
buildCreateMenuBody,
|
|
1157
2199
|
buildUpdateBody,
|
|
2200
|
+
buildUpdateMenuBody,
|
|
1158
2201
|
createAuthorizationResourceApi,
|
|
1159
2202
|
createDefaultResourceRequest,
|
|
2203
|
+
createMenuResourceApi,
|
|
1160
2204
|
createPermissionPlugin,
|
|
1161
2205
|
createPermissionStore,
|
|
1162
2206
|
createVPermission,
|
|
@@ -1165,6 +2209,7 @@ export {
|
|
|
1165
2209
|
getAppClientId,
|
|
1166
2210
|
getDeviceWorkerId,
|
|
1167
2211
|
mapAuthorizationResource,
|
|
2212
|
+
mapMenuResource,
|
|
1168
2213
|
snowyflake,
|
|
1169
2214
|
useHasPermission,
|
|
1170
2215
|
useHasRole,
|