com-angel-authorization 1.0.9 → 1.0.11

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.
@@ -22,6 +22,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
22
22
  var react_exports = {};
23
23
  __export(react_exports, {
24
24
  Can: () => Can,
25
+ MENU_LEAF_NO: () => MENU_LEAF_NO,
26
+ MENU_LEAF_YES: () => MENU_LEAF_YES,
25
27
  MENU_LIST_TYPE_PARAM: () => MENU_LIST_TYPE_PARAM,
26
28
  MENU_TYPE_BUTTON: () => MENU_TYPE_BUTTON,
27
29
  MENU_TYPE_LABEL: () => MENU_TYPE_LABEL,
@@ -56,6 +58,7 @@ __export(react_exports, {
56
58
  extractRecords: () => extractRecords,
57
59
  getAppClientId: () => getAppClientId,
58
60
  getDeviceWorkerId: () => getDeviceWorkerId,
61
+ isMenuLeaf: () => isMenuLeaf,
59
62
  mapAuthorizationResource: () => mapAuthorizationResource,
60
63
  mapMenuResource: () => mapMenuResource,
61
64
  resolveMenuDepth: () => resolveMenuDepth,
@@ -285,6 +288,8 @@ function Can({
285
288
  var import_react2 = require("react");
286
289
 
287
290
  // src/resources/types.ts
291
+ var MENU_LEAF_YES = 1;
292
+ var MENU_LEAF_NO = 0;
288
293
  var RESOURCE_TYPE_API = "api";
289
294
  var MENU_TYPE_PAGE = "page";
290
295
  var MENU_TYPE_MENU = "menu";
@@ -513,10 +518,13 @@ function mapMenuResource(item) {
513
518
  const rawDepth = row.depth;
514
519
  const parsedDepth = Number(rawDepth);
515
520
  const depth = Number.isFinite(parsedDepth) && parsedDepth > 0 ? Math.floor(parsedDepth) : parentId ? ROOT_MENU_DEPTH + 1 : ROOT_MENU_DEPTH;
521
+ const rawLeaf = row.leaf;
522
+ const leaf = rawLeaf === true || rawLeaf === 1 || rawLeaf === "1" || String(rawLeaf).toLowerCase() === "true" ? MENU_LEAF_YES : Number(rawLeaf) === MENU_LEAF_YES ? MENU_LEAF_YES : 0;
516
523
  return {
517
524
  resourceId: String(resourceId),
518
525
  parentId,
519
526
  depth,
527
+ leaf,
520
528
  type: toMenuType(row.type),
521
529
  name: String(row.name ?? ""),
522
530
  identification: String(row.identification ?? row.identity ?? row.path ?? ""),
@@ -525,6 +533,9 @@ function mapMenuResource(item) {
525
533
  status: toResourceStatus(row.status)
526
534
  };
527
535
  }
536
+ function isMenuLeaf(row) {
537
+ return Number(row.leaf) === MENU_LEAF_YES;
538
+ }
528
539
  function resolveMenuDepth(parentId, menus) {
529
540
  if (!parentId) return ROOT_MENU_DEPTH;
530
541
  const parent = menus.find((item) => item.resourceId === parentId);
@@ -534,6 +545,9 @@ function resolveMenuDepth(parentId, menus) {
534
545
  function buildListUrl(type, params) {
535
546
  const parts = [];
536
547
  appendQueryParam(parts, "type", type);
548
+ if (params?.depth !== void 0 && params?.depth !== null && String(params.depth) !== "") {
549
+ appendQueryParam(parts, "depth", String(params.depth));
550
+ }
537
551
  appendQueryParam(parts, "page-token", params?.pagination?.pageToken ?? "");
538
552
  appendQueryParam(parts, "page-size", params?.pagination?.pageSize ?? "20");
539
553
  appendQueryParam(parts, "page-direction", params?.pagination?.pageDirection ?? "current");
@@ -631,7 +645,10 @@ function createMenuResourceApi(request) {
631
645
  async list(params, signal) {
632
646
  const json = await request({
633
647
  method: "GET",
634
- url: buildListUrl(MENU_LIST_TYPE_PARAM, params),
648
+ url: buildListUrl(MENU_LIST_TYPE_PARAM, {
649
+ pagination: params?.pagination,
650
+ depth: params?.depth ?? ROOT_MENU_DEPTH
651
+ }),
635
652
  signal
636
653
  });
637
654
  const records = extractRecords(json).map(mapMenuResource).filter((item) => item !== null);
@@ -641,6 +658,14 @@ function createMenuResourceApi(request) {
641
658
  ...pagination
642
659
  };
643
660
  },
661
+ async listSubResources(resourceId, signal) {
662
+ const json = await request({
663
+ method: "GET",
664
+ url: `/authorization-resources/${encodeURIComponent(resourceId)}/sub-resources`,
665
+ signal
666
+ });
667
+ return extractRecords(json).map(mapMenuResource).filter((item) => item !== null);
668
+ },
644
669
  listPermissionPoints(params, signal) {
645
670
  return permissionApi.list(params, signal);
646
671
  },
@@ -1256,6 +1281,9 @@ function MenuManager({
1256
1281
  toolbarExtra
1257
1282
  }) {
1258
1283
  const [records, setRecords] = (0, import_react3.useState)([]);
1284
+ const [childrenMap, setChildrenMap] = (0, import_react3.useState)({});
1285
+ const [expandedIds, setExpandedIds] = (0, import_react3.useState)({});
1286
+ const [expandingIds, setExpandingIds] = (0, import_react3.useState)({});
1259
1287
  const [permissionPoints, setPermissionPoints] = (0, import_react3.useState)([]);
1260
1288
  const [loading, setLoading] = (0, import_react3.useState)(false);
1261
1289
  const [error, setError] = (0, import_react3.useState)("");
@@ -1274,18 +1302,40 @@ function MenuManager({
1274
1302
  permissionPoints.forEach((p) => map.set(p.resourceId, p.name || p.identification));
1275
1303
  return map;
1276
1304
  }, [permissionPoints]);
1305
+ const allKnownMenus = (0, import_react3.useMemo)(() => {
1306
+ const map = /* @__PURE__ */ new Map();
1307
+ records.forEach((row) => map.set(row.resourceId, row));
1308
+ Object.values(childrenMap).forEach((list) => {
1309
+ list.forEach((row) => map.set(row.resourceId, row));
1310
+ });
1311
+ return Array.from(map.values());
1312
+ }, [records, childrenMap]);
1277
1313
  const parentOptions = (0, import_react3.useMemo)(() => {
1278
- return records.filter((row) => !editing || row.resourceId !== editing.resourceId).map((row) => ({
1314
+ return allKnownMenus.filter((row) => !editing || row.resourceId !== editing.resourceId).map((row) => ({
1279
1315
  value: row.resourceId,
1280
1316
  label: `${row.name}\uFF08${MENU_TYPE_LABEL[row.type]}\uFF09`
1281
1317
  }));
1282
- }, [records, editing]);
1318
+ }, [allKnownMenus, editing]);
1319
+ const flatRows = (0, import_react3.useMemo)(() => {
1320
+ const rows = [];
1321
+ const walk = (list) => {
1322
+ list.forEach((row) => {
1323
+ rows.push(row);
1324
+ if (expandedIds[row.resourceId] && childrenMap[row.resourceId]?.length) {
1325
+ walk(childrenMap[row.resourceId]);
1326
+ }
1327
+ });
1328
+ };
1329
+ walk(records);
1330
+ return rows;
1331
+ }, [records, childrenMap, expandedIds]);
1283
1332
  const loadList = (0, import_react3.useCallback)(
1284
1333
  async (direction = "current", token = pageToken) => {
1285
1334
  setLoading(true);
1286
1335
  setError("");
1287
1336
  try {
1288
1337
  const result = await api.list({
1338
+ depth: ROOT_MENU_DEPTH,
1289
1339
  pagination: {
1290
1340
  pageToken: token,
1291
1341
  pageSize,
@@ -1293,6 +1343,9 @@ function MenuManager({
1293
1343
  }
1294
1344
  });
1295
1345
  setRecords(result.records);
1346
+ setChildrenMap({});
1347
+ setExpandedIds({});
1348
+ setExpandingIds({});
1296
1349
  setPageToken(result.pageToken);
1297
1350
  setHasPreviousPage(result.hasPreviousPage);
1298
1351
  setHasNextPage(result.hasNextPage);
@@ -1313,6 +1366,29 @@ function MenuManager({
1313
1366
  } catch {
1314
1367
  }
1315
1368
  }, [api]);
1369
+ const toggleExpand = async (row) => {
1370
+ if (isMenuLeaf(row)) return;
1371
+ const id = row.resourceId;
1372
+ if (expandedIds[id]) {
1373
+ setExpandedIds((prev) => ({ ...prev, [id]: false }));
1374
+ return;
1375
+ }
1376
+ if (!childrenMap[id]) {
1377
+ setExpandingIds((prev) => ({ ...prev, [id]: true }));
1378
+ setError("");
1379
+ try {
1380
+ const children = await api.listSubResources(id);
1381
+ setChildrenMap((prev) => ({ ...prev, [id]: children }));
1382
+ setExpandedIds((prev) => ({ ...prev, [id]: true }));
1383
+ } catch (err) {
1384
+ setError(err instanceof Error ? err.message : "\u52A0\u8F7D\u4E0B\u7EA7\u83DC\u5355\u5931\u8D25");
1385
+ } finally {
1386
+ setExpandingIds((prev) => ({ ...prev, [id]: false }));
1387
+ }
1388
+ return;
1389
+ }
1390
+ setExpandedIds((prev) => ({ ...prev, [id]: true }));
1391
+ };
1316
1392
  (0, import_react3.useEffect)(() => {
1317
1393
  void loadList("current", "");
1318
1394
  void loadPermissionPoints();
@@ -1327,7 +1403,7 @@ function MenuManager({
1327
1403
  setEditing(row);
1328
1404
  setForm({
1329
1405
  parentId: row.parentId ?? null,
1330
- depth: resolveMenuDepth(row.parentId ?? null, records),
1406
+ depth: resolveMenuDepth(row.parentId ?? null, allKnownMenus),
1331
1407
  type: row.type,
1332
1408
  name: row.name,
1333
1409
  identification: row.identification,
@@ -1415,35 +1491,54 @@ function MenuManager({
1415
1491
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("th", { style: styles2.th, children: "\u6743\u9650\u6807\u8BC6" }),
1416
1492
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("th", { style: { ...styles2.th, width: 140 }, children: "\u64CD\u4F5C" })
1417
1493
  ] }) }),
1418
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("tbody", { children: loading ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("tr", { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("td", { colSpan: 6, style: styles2.empty, children: "\u52A0\u8F7D\u4E2D\u2026" }) }) : records.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("tr", { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("td", { colSpan: 6, style: styles2.empty, children: "\u6682\u65E0\u6570\u636E" }) }) : records.map((row) => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("tr", { children: [
1419
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("td", { style: styles2.td, children: row.name }),
1420
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("td", { style: styles2.td, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("code", { style: styles2.code, children: row.identification || "\u2014" }) }),
1421
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("td", { style: styles2.td, children: MENU_TYPE_LABEL[row.type] }),
1422
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("td", { style: styles2.td, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1423
- "span",
1424
- {
1425
- style: {
1426
- ...styles2.badge,
1427
- background: row.status === RESOURCE_STATUS_ENABLED ? "#e8f7ef" : "#f4f4f5",
1428
- color: row.status === RESOURCE_STATUS_ENABLED ? "#067647" : "#667085"
1429
- },
1430
- children: row.status === RESOURCE_STATUS_ENABLED ? "\u663E\u793A" : "\u9690\u85CF"
1431
- }
1432
- ) }),
1433
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("td", { style: styles2.td, children: renderPermissionLabels(row) }),
1434
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("td", { style: styles2.td, children: [
1435
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { type: "button", style: styles2.linkBtn, onClick: () => openEdit(row), children: "\u7F16\u8F91" }),
1436
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1437
- "button",
1494
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("tbody", { children: loading ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("tr", { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("td", { colSpan: 6, style: styles2.empty, children: "\u52A0\u8F7D\u4E2D\u2026" }) }) : flatRows.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("tr", { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("td", { colSpan: 6, style: styles2.empty, children: "\u6682\u65E0\u6570\u636E" }) }) : flatRows.map((row) => {
1495
+ const leaf = isMenuLeaf(row);
1496
+ const expanded = Boolean(expandedIds[row.resourceId]);
1497
+ const expanding = Boolean(expandingIds[row.resourceId]);
1498
+ const indent = Math.max(0, (row.depth || 1) - 1) * 18;
1499
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("tr", { children: [
1500
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("td", { style: styles2.td, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: { ...styles2.treeCell, paddingLeft: indent }, children: [
1501
+ leaf ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: styles2.treeSpacer }) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1502
+ "button",
1503
+ {
1504
+ type: "button",
1505
+ style: styles2.treeToggle,
1506
+ onClick: () => void toggleExpand(row),
1507
+ disabled: expanding,
1508
+ "aria-label": expanded ? "\u6536\u8D77" : "\u5C55\u5F00",
1509
+ children: expanding ? "\u2026" : expanded ? "\u25BC" : "\u25B6"
1510
+ }
1511
+ ),
1512
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { children: row.name })
1513
+ ] }) }),
1514
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("td", { style: styles2.td, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("code", { style: styles2.code, children: row.identification || "\u2014" }) }),
1515
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("td", { style: styles2.td, children: MENU_TYPE_LABEL[row.type] }),
1516
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("td", { style: styles2.td, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1517
+ "span",
1438
1518
  {
1439
- type: "button",
1440
- style: { ...styles2.linkBtn, color: "#d92d20" },
1441
- onClick: () => askDelete(row),
1442
- children: "\u5220\u9664"
1519
+ style: {
1520
+ ...styles2.badge,
1521
+ background: row.status === RESOURCE_STATUS_ENABLED ? "#e8f7ef" : "#f4f4f5",
1522
+ color: row.status === RESOURCE_STATUS_ENABLED ? "#067647" : "#667085"
1523
+ },
1524
+ children: row.status === RESOURCE_STATUS_ENABLED ? "\u663E\u793A" : "\u9690\u85CF"
1443
1525
  }
1444
- )
1445
- ] })
1446
- ] }, row.resourceId)) })
1526
+ ) }),
1527
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("td", { style: styles2.td, children: renderPermissionLabels(row) }),
1528
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("td", { style: styles2.td, children: [
1529
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { type: "button", style: styles2.linkBtn, onClick: () => openEdit(row), children: "\u7F16\u8F91" }),
1530
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1531
+ "button",
1532
+ {
1533
+ type: "button",
1534
+ style: { ...styles2.linkBtn, color: "#d92d20" },
1535
+ onClick: () => askDelete(row),
1536
+ children: "\u5220\u9664"
1537
+ }
1538
+ )
1539
+ ] })
1540
+ ] }, row.resourceId);
1541
+ }) })
1447
1542
  ] }) }),
1448
1543
  /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: styles2.pagination, children: [
1449
1544
  /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("label", { style: styles2.pageSize, children: [
@@ -1509,7 +1604,7 @@ function MenuManager({
1509
1604
  setForm((prev) => ({
1510
1605
  ...prev,
1511
1606
  parentId,
1512
- depth: resolveMenuDepth(parentId, records)
1607
+ depth: resolveMenuDepth(parentId, allKnownMenus)
1513
1608
  }));
1514
1609
  },
1515
1610
  children: [
@@ -1519,10 +1614,6 @@ function MenuManager({
1519
1614
  }
1520
1615
  )
1521
1616
  ] }),
1522
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: styles2.field, children: [
1523
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: styles2.label, children: "\u83DC\u5355\u5C42\u7EA7\uFF08depth\uFF09" }),
1524
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("input", { style: styles2.input, value: form.depth, readOnly: true })
1525
- ] }),
1526
1617
  /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("fieldset", { style: styles2.fieldset, children: [
1527
1618
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("legend", { style: styles2.label, children: "\u83DC\u5355\u7C7B\u578B" }),
1528
1619
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: styles2.radioGroup, children: MENU_TYPE_OPTIONS.map((opt) => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("label", { style: styles2.radioItem, children: [
@@ -1531,6 +1622,7 @@ function MenuManager({
1531
1622
  {
1532
1623
  type: "radio",
1533
1624
  name: "menu-type",
1625
+ style: styles2.control,
1534
1626
  checked: form.type === opt.value,
1535
1627
  onChange: () => setForm((prev) => ({
1536
1628
  ...prev,
@@ -1573,6 +1665,7 @@ function MenuManager({
1573
1665
  "input",
1574
1666
  {
1575
1667
  type: "checkbox",
1668
+ style: styles2.control,
1576
1669
  checked: form.permissionPointIds.includes(p.resourceId),
1577
1670
  onChange: () => togglePermission(p.resourceId)
1578
1671
  }
@@ -1591,6 +1684,7 @@ function MenuManager({
1591
1684
  {
1592
1685
  type: "radio",
1593
1686
  name: "menu-status",
1687
+ style: styles2.control,
1594
1688
  checked: form.status === opt.value,
1595
1689
  onChange: () => setForm((prev) => ({ ...prev, status: opt.value }))
1596
1690
  }
@@ -1707,6 +1801,30 @@ var styles2 = {
1707
1801
  borderBottom: "1px solid #f2f4f7",
1708
1802
  verticalAlign: "middle"
1709
1803
  },
1804
+ treeCell: {
1805
+ display: "flex",
1806
+ alignItems: "center",
1807
+ gap: 6
1808
+ },
1809
+ treeToggle: {
1810
+ width: 22,
1811
+ height: 22,
1812
+ border: "1px solid #d0d5dd",
1813
+ borderRadius: 4,
1814
+ background: "#fff",
1815
+ color: "#475467",
1816
+ cursor: "pointer",
1817
+ fontSize: 10,
1818
+ lineHeight: "20px",
1819
+ padding: 0,
1820
+ flexShrink: 0
1821
+ },
1822
+ treeSpacer: {
1823
+ width: 22,
1824
+ height: 22,
1825
+ flexShrink: 0,
1826
+ display: "inline-block"
1827
+ },
1710
1828
  empty: { padding: 28, textAlign: "center", color: "#98a2b3", fontSize: 14 },
1711
1829
  code: {
1712
1830
  fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace",
@@ -1822,7 +1940,9 @@ var styles2 = {
1822
1940
  border: "none",
1823
1941
  display: "flex",
1824
1942
  flexDirection: "column",
1825
- gap: 8
1943
+ gap: 8,
1944
+ backgroundColor: "transparent",
1945
+ color: "#101828"
1826
1946
  },
1827
1947
  label: { fontSize: 13, color: "#344054", fontWeight: 500 },
1828
1948
  input: {
@@ -1836,14 +1956,29 @@ var styles2 = {
1836
1956
  boxSizing: "border-box",
1837
1957
  width: "100%"
1838
1958
  },
1839
- radioGroup: { display: "flex", flexWrap: "wrap", gap: 16 },
1959
+ control: {
1960
+ width: 16,
1961
+ height: 16,
1962
+ margin: 0,
1963
+ flexShrink: 0,
1964
+ accentColor: "#049BAD",
1965
+ backgroundColor: "#ffffff",
1966
+ colorScheme: "light"
1967
+ },
1968
+ radioGroup: {
1969
+ display: "flex",
1970
+ flexWrap: "wrap",
1971
+ gap: 16,
1972
+ backgroundColor: "transparent"
1973
+ },
1840
1974
  radioItem: {
1841
1975
  display: "flex",
1842
1976
  alignItems: "center",
1843
1977
  gap: 6,
1844
1978
  fontSize: 14,
1845
1979
  color: "#344054",
1846
- cursor: "pointer"
1980
+ cursor: "pointer",
1981
+ backgroundColor: "transparent"
1847
1982
  },
1848
1983
  multiSelect: {
1849
1984
  maxHeight: 160,
@@ -1851,7 +1986,8 @@ var styles2 = {
1851
1986
  border: "1px solid #eaecf0",
1852
1987
  borderRadius: 8,
1853
1988
  padding: 8,
1854
- background: "#f9fafb"
1989
+ backgroundColor: "#ffffff",
1990
+ color: "#101828"
1855
1991
  },
1856
1992
  checkItem: {
1857
1993
  display: "flex",
@@ -1860,7 +1996,8 @@ var styles2 = {
1860
1996
  padding: "6px 4px",
1861
1997
  fontSize: 13,
1862
1998
  color: "#344054",
1863
- cursor: "pointer"
1999
+ cursor: "pointer",
2000
+ backgroundColor: "transparent"
1864
2001
  },
1865
2002
  hint: { fontSize: 13, color: "#98a2b3", padding: 8 },
1866
2003
  dialogFooter: {
@@ -2016,6 +2153,8 @@ var styles3 = {
2016
2153
  // Annotate the CommonJS export names for ESM import in node:
2017
2154
  0 && (module.exports = {
2018
2155
  Can,
2156
+ MENU_LEAF_NO,
2157
+ MENU_LEAF_YES,
2019
2158
  MENU_LIST_TYPE_PARAM,
2020
2159
  MENU_TYPE_BUTTON,
2021
2160
  MENU_TYPE_LABEL,
@@ -2050,6 +2189,7 @@ var styles3 = {
2050
2189
  extractRecords,
2051
2190
  getAppClientId,
2052
2191
  getDeviceWorkerId,
2192
+ isMenuLeaf,
2053
2193
  mapAuthorizationResource,
2054
2194
  mapMenuResource,
2055
2195
  resolveMenuDepth,