@hkyhy/marsun-components-core 0.1.37 → 0.1.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/dist/components/OrgTree/OrgTree.d.ts +38 -0
  2. package/dist/components/OrgTree/OrgTree.js +123 -0
  3. package/dist/components/OrgTree/OrgTree.js.map +1 -0
  4. package/dist/components/OrgTree/index.d.ts +2 -0
  5. package/dist/components/OrgTree/style.module.scss.js +11 -0
  6. package/dist/components/OrgTree/style.module.scss.js.map +1 -0
  7. package/dist/components/Permissions/Permissions.d.ts +37 -0
  8. package/dist/components/Permissions/Permissions.js +52 -0
  9. package/dist/components/Permissions/Permissions.js.map +1 -0
  10. package/dist/components/Permissions/index.d.ts +2 -0
  11. package/dist/components/Permissions/style.module.scss.js +7 -0
  12. package/dist/components/Permissions/style.module.scss.js.map +1 -0
  13. package/dist/components/StateBar/StateBar.d.ts +28 -0
  14. package/dist/components/StateBar/StateBar.js +43 -0
  15. package/dist/components/StateBar/StateBar.js.map +1 -0
  16. package/dist/components/StateBar/index.d.ts +2 -0
  17. package/dist/components/StateBar/style.module.scss.js +12 -0
  18. package/dist/components/StateBar/style.module.scss.js.map +1 -0
  19. package/dist/components/index.d.ts +3 -0
  20. package/dist/index.d.ts +3 -0
  21. package/dist/index.js +241 -232
  22. package/dist/index.js.map +1 -1
  23. package/dist/marsun-components-core.css +1 -1
  24. package/dist/provider/MarsunCoreProvider.js +23 -29
  25. package/dist/provider/MarsunCoreProvider.js.map +1 -1
  26. package/dist/provider/context.d.ts +2 -0
  27. package/dist/provider/context.js +5 -4
  28. package/dist/provider/context.js.map +1 -1
  29. package/dist/styles/global.css +1 -1
  30. package/package.json +1 -1
@@ -0,0 +1,38 @@
1
+ import { default as React, ReactNode } from 'react';
2
+ export type OrgTreeNode = {
3
+ id: string;
4
+ name: string;
5
+ parentId?: string | null;
6
+ children?: OrgTreeNode[];
7
+ /** 名称旁附加文案(如 mapped) */
8
+ nameExtra?: ReactNode;
9
+ };
10
+ export type OrgTreeProps = {
11
+ nodes: OrgTreeNode[];
12
+ loading?: boolean;
13
+ /** 展示节点内增删改操作 */
14
+ editable?: boolean;
15
+ className?: string;
16
+ onAdd?: (parentId: string) => void;
17
+ onEdit?: (node: {
18
+ id: string;
19
+ name: string;
20
+ parentId: string | null;
21
+ }) => void;
22
+ /** 确认删除后回调;由业务执行 API */
23
+ onDelete?: (node: {
24
+ id: string;
25
+ name: string;
26
+ }) => void | Promise<void>;
27
+ /** 删除确认文案 */
28
+ deleteConfirmTitle?: string;
29
+ /** 确认钮文案(软禁用场景可传「禁用」) */
30
+ deleteOkText?: string;
31
+ deleteOkType?: 'primary' | 'danger';
32
+ };
33
+ /**
34
+ * 组织树(对齐 Assets 组织架构行为):默认展开、节点 hover 增删改。
35
+ * 纯 UI,无业务 API。
36
+ */
37
+ declare const OrgTree: React.FC<OrgTreeProps>;
38
+ export default OrgTree;
@@ -0,0 +1,123 @@
1
+ import { jsx as a, jsxs as c } from "react/jsx-runtime";
2
+ import { Plus as C, Pencil as E, Trash2 as K } from "../Icons/index.js";
3
+ import { Spin as w, Tree as S, Tooltip as j, Space as v, Button as p, Popconfirm as I } from "antd";
4
+ import l from "classnames";
5
+ import { useMemo as B, useState as L, useEffect as M } from "react";
6
+ import i from "./style.module.scss.js";
7
+ function P(t) {
8
+ var o;
9
+ const n = [];
10
+ for (const s of t)
11
+ n.push(s.id), (o = s.children) != null && o.length && n.push(...P(s.children));
12
+ return n;
13
+ }
14
+ const J = ({
15
+ nodes: t,
16
+ loading: n = !1,
17
+ editable: o = !1,
18
+ className: s,
19
+ onAdd: u,
20
+ onEdit: g,
21
+ onDelete: h,
22
+ deleteConfirmTitle: k = "确认删除该节点?",
23
+ deleteOkText: f = "删除",
24
+ deleteOkType: z = "danger"
25
+ }) => {
26
+ const d = B(() => P(t), [t]), [T, x] = L([]);
27
+ M(() => {
28
+ x(d);
29
+ }, [d]);
30
+ const y = (m) => m.map((e) => {
31
+ var N;
32
+ return {
33
+ key: e.id,
34
+ title: /* @__PURE__ */ c("div", { className: l("marsun-org-tree-row", i["marsun-org-tree-row"]), children: [
35
+ /* @__PURE__ */ a(j, { title: e.name, children: /* @__PURE__ */ c("span", { className: l("marsun-org-tree-name", i["marsun-org-tree-name"]), children: [
36
+ e.name,
37
+ e.nameExtra ? /* @__PURE__ */ a(
38
+ "span",
39
+ {
40
+ className: l("marsun-org-tree-extra", i["marsun-org-tree-extra"]),
41
+ children: e.nameExtra
42
+ }
43
+ ) : null
44
+ ] }) }),
45
+ o ? /* @__PURE__ */ c(
46
+ v,
47
+ {
48
+ size: 0,
49
+ className: l("marsun-org-tree-actions", i["marsun-org-tree-actions"]),
50
+ children: [
51
+ u ? /* @__PURE__ */ a(
52
+ p,
53
+ {
54
+ type: "text",
55
+ size: "small",
56
+ "aria-label": "添加子节点",
57
+ icon: /* @__PURE__ */ a(C, { size: 14 }),
58
+ onClick: (r) => {
59
+ r.stopPropagation(), u(e.id);
60
+ }
61
+ }
62
+ ) : null,
63
+ g ? /* @__PURE__ */ a(
64
+ p,
65
+ {
66
+ type: "text",
67
+ size: "small",
68
+ "aria-label": "编辑",
69
+ icon: /* @__PURE__ */ a(E, { size: 14 }),
70
+ onClick: (r) => {
71
+ r.stopPropagation(), g({
72
+ id: e.id,
73
+ name: e.name,
74
+ parentId: e.parentId ?? null
75
+ });
76
+ }
77
+ }
78
+ ) : null,
79
+ h ? /* @__PURE__ */ a(
80
+ I,
81
+ {
82
+ title: k,
83
+ okText: f,
84
+ okType: z,
85
+ cancelText: "取消",
86
+ onConfirm: (r) => (r == null || r.stopPropagation(), h({ id: e.id, name: e.name })),
87
+ onCancel: (r) => r == null ? void 0 : r.stopPropagation(),
88
+ children: /* @__PURE__ */ a(
89
+ p,
90
+ {
91
+ type: "text",
92
+ size: "small",
93
+ danger: !0,
94
+ "aria-label": f,
95
+ icon: /* @__PURE__ */ a(K, { size: 14 }),
96
+ onClick: (r) => r.stopPropagation()
97
+ }
98
+ )
99
+ }
100
+ ) : null
101
+ ]
102
+ }
103
+ ) : null
104
+ ] }),
105
+ children: (N = e.children) != null && N.length ? y(e.children) : void 0
106
+ };
107
+ }), b = y(t);
108
+ return /* @__PURE__ */ a(w, { spinning: n, children: /* @__PURE__ */ a(
109
+ S,
110
+ {
111
+ className: l("marsun-org-tree", i["marsun-org-tree"], s),
112
+ treeData: b,
113
+ expandedKeys: T,
114
+ onExpand: (m) => x(m),
115
+ showLine: !0,
116
+ blockNode: !0
117
+ }
118
+ ) });
119
+ };
120
+ export {
121
+ J as default
122
+ };
123
+ //# sourceMappingURL=OrgTree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrgTree.js","sources":["../../../src/components/OrgTree/OrgTree.tsx"],"sourcesContent":["import { Pencil, Plus, Trash2 } from '../Icons';\nimport { Button, Popconfirm, Space, Spin, Tooltip, Tree } from 'antd';\nimport type { DataNode } from 'antd/es/tree';\nimport classNames from 'classnames';\nimport React, { useEffect, useMemo, useState, type Key, type ReactNode } from 'react';\nimport styles from './style.module.scss';\n\nexport type OrgTreeNode = {\n id: string;\n name: string;\n parentId?: string | null;\n children?: OrgTreeNode[];\n /** 名称旁附加文案(如 mapped) */\n nameExtra?: ReactNode;\n};\n\nexport type OrgTreeProps = {\n nodes: OrgTreeNode[];\n loading?: boolean;\n /** 展示节点内增删改操作 */\n editable?: boolean;\n className?: string;\n onAdd?: (parentId: string) => void;\n onEdit?: (node: { id: string; name: string; parentId: string | null }) => void;\n /** 确认删除后回调;由业务执行 API */\n onDelete?: (node: { id: string; name: string }) => void | Promise<void>;\n /** 删除确认文案 */\n deleteConfirmTitle?: string;\n /** 确认钮文案(软禁用场景可传「禁用」) */\n deleteOkText?: string;\n deleteOkType?: 'primary' | 'danger';\n};\n\nfunction collectAllKeys(nodes: OrgTreeNode[]): string[] {\n const keys: string[] = [];\n for (const n of nodes) {\n keys.push(n.id);\n if (n.children?.length) keys.push(...collectAllKeys(n.children));\n }\n return keys;\n}\n\n/**\n * 组织树(对齐 Assets 组织架构行为):默认展开、节点 hover 增删改。\n * 纯 UI,无业务 API。\n */\nconst OrgTree: React.FC<OrgTreeProps> = ({\n nodes,\n loading = false,\n editable = false,\n className,\n onAdd,\n onEdit,\n onDelete,\n deleteConfirmTitle = '确认删除该节点?',\n deleteOkText = '删除',\n deleteOkType = 'danger',\n}) => {\n const allKeys = useMemo(() => collectAllKeys(nodes), [nodes]);\n const [expandedKeys, setExpandedKeys] = useState<Key[]>([]);\n\n useEffect(() => {\n setExpandedKeys(allKeys);\n }, [allKeys]);\n\n const buildTreeNodes = (list: OrgTreeNode[]): DataNode[] =>\n list.map((node) => ({\n key: node.id,\n title: (\n <div className={classNames('marsun-org-tree-row', styles['marsun-org-tree-row'])}>\n <Tooltip title={node.name}>\n <span className={classNames('marsun-org-tree-name', styles['marsun-org-tree-name'])}>\n {node.name}\n {node.nameExtra ? (\n <span\n className={classNames('marsun-org-tree-extra', styles['marsun-org-tree-extra'])}\n >\n {node.nameExtra}\n </span>\n ) : null}\n </span>\n </Tooltip>\n {editable ? (\n <Space\n size={0}\n className={classNames('marsun-org-tree-actions', styles['marsun-org-tree-actions'])}\n >\n {onAdd ? (\n <Button\n type=\"text\"\n size=\"small\"\n aria-label=\"添加子节点\"\n icon={<Plus size={14} />}\n onClick={(e) => {\n e.stopPropagation();\n onAdd(node.id);\n }}\n />\n ) : null}\n {onEdit ? (\n <Button\n type=\"text\"\n size=\"small\"\n aria-label=\"编辑\"\n icon={<Pencil size={14} />}\n onClick={(e) => {\n e.stopPropagation();\n onEdit({\n id: node.id,\n name: node.name,\n parentId: node.parentId ?? null,\n });\n }}\n />\n ) : null}\n {onDelete ? (\n <Popconfirm\n title={deleteConfirmTitle}\n okText={deleteOkText}\n okType={deleteOkType}\n cancelText=\"取消\"\n onConfirm={(e) => {\n e?.stopPropagation();\n return onDelete({ id: node.id, name: node.name });\n }}\n onCancel={(e) => e?.stopPropagation()}\n >\n <Button\n type=\"text\"\n size=\"small\"\n danger\n aria-label={deleteOkText}\n icon={<Trash2 size={14} />}\n onClick={(e) => e.stopPropagation()}\n />\n </Popconfirm>\n ) : null}\n </Space>\n ) : null}\n </div>\n ),\n children: node.children?.length ? buildTreeNodes(node.children) : undefined,\n }));\n\n const treeData = buildTreeNodes(nodes);\n\n return (\n <Spin spinning={loading}>\n <Tree\n className={classNames('marsun-org-tree', styles['marsun-org-tree'], className)}\n treeData={treeData}\n expandedKeys={expandedKeys}\n onExpand={(keys) => setExpandedKeys(keys)}\n showLine\n blockNode\n />\n </Spin>\n );\n};\n\nexport default OrgTree;\n"],"names":["collectAllKeys","nodes","keys","n","_a","OrgTree","loading","editable","className","onAdd","onEdit","onDelete","deleteConfirmTitle","deleteOkText","deleteOkType","allKeys","useMemo","expandedKeys","setExpandedKeys","useState","useEffect","buildTreeNodes","list","node","classNames","styles","jsx","Tooltip","jsxs","Space","Button","Plus","e","Pencil","Popconfirm","Trash2","treeData","Spin","Tree"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { default as OrgTree, default } from './OrgTree';
2
+ export type { OrgTreeNode, OrgTreeProps } from './OrgTree';
@@ -0,0 +1,11 @@
1
+ const r = {
2
+ "marsun-org-tree": "_marsun-org-tree_1hg7h_2",
3
+ "marsun-org-tree-row": "_marsun-org-tree-row_1hg7h_10",
4
+ "marsun-org-tree-actions": "_marsun-org-tree-actions_1hg7h_18",
5
+ "marsun-org-tree-name": "_marsun-org-tree-name_1hg7h_22",
6
+ "marsun-org-tree-extra": "_marsun-org-tree-extra_1hg7h_32"
7
+ };
8
+ export {
9
+ r as default
10
+ };
11
+ //# sourceMappingURL=style.module.scss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
@@ -0,0 +1,37 @@
1
+ import { FC, ReactNode } from 'react';
2
+ export type PermissionsType = 'hidden' | 'tooltip' | 'error';
3
+ /** 权限请求:字符串数组(OR)、或自定义判定函数 */
4
+ export type PermissionRequest = string[] | ((permissions: string[]) => boolean) | (() => boolean);
5
+ export type PermissionsRenderProps = {
6
+ isPass: boolean;
7
+ type: PermissionsType;
8
+ request?: PermissionRequest;
9
+ };
10
+ export type PermissionsProps = {
11
+ /** 无权限呈现:hidden 隐藏 / tooltip 可看见但不可操作 / error 展示 403 */
12
+ type?: PermissionsType;
13
+ /** 包裹标签,同 React.createElement 的 type,默认 span */
14
+ tagName?: keyof HTMLElementTagNameMap | string;
15
+ /** 无权限提示文案 */
16
+ message?: string;
17
+ /** 所需权限;数组为 OR;空/未传视为通过 */
18
+ request?: PermissionRequest;
19
+ className?: string;
20
+ children?: ReactNode | ((props: PermissionsRenderProps) => ReactNode);
21
+ } & Record<string, unknown>;
22
+ export declare function computedIsPass({ permissions, request, }: {
23
+ permissions?: string[];
24
+ request?: PermissionRequest;
25
+ }): boolean;
26
+ export declare function usePermissions(): {
27
+ permissions: string[];
28
+ };
29
+ export declare function usePermissionsPass({ request }: {
30
+ request?: PermissionRequest;
31
+ }): boolean;
32
+ /**
33
+ * 权限控制:对照 kne-union Permissions,权限源改为 MarsunCoreProvider.auth。
34
+ * 判定语义:request 数组为 OR(与上游运行时一致)。
35
+ */
36
+ declare const Permissions: FC<PermissionsProps>;
37
+ export default Permissions;
@@ -0,0 +1,52 @@
1
+ import { jsx as i, Fragment as m } from "react/jsx-runtime";
2
+ import { Result as p, Tooltip as c } from "antd";
3
+ import y from "classnames";
4
+ import { createElement as A } from "react";
5
+ import P from "./style.module.scss.js";
6
+ import { useMarsunAuth as a } from "../../provider/context.js";
7
+ function u({
8
+ permissions: r,
9
+ request: n
10
+ }) {
11
+ if (typeof n == "function")
12
+ return !!n(r || []);
13
+ if (Array.isArray(n) && n.length > 0) {
14
+ const t = r || [];
15
+ return n.some((o) => t.indexOf(o) > -1);
16
+ }
17
+ return !0;
18
+ }
19
+ function d() {
20
+ const { permissions: r } = a();
21
+ return { permissions: r ?? [] };
22
+ }
23
+ function g({ request: r }) {
24
+ const { permissions: n } = d(), { hasPermission: t } = a();
25
+ return typeof r == "function" ? u({ permissions: n, request: r }) : Array.isArray(r) && r.length > 0 ? n.length > 0 ? u({ permissions: n, request: r }) : r.some((o) => !!(t != null && t(o))) : !0;
26
+ }
27
+ const B = ({
28
+ type: r = "hidden",
29
+ className: n,
30
+ tagName: t = "span",
31
+ message: o = "您暂无权限,请联系管理员",
32
+ request: e,
33
+ children: s,
34
+ ...l
35
+ }) => {
36
+ const f = g({ request: e });
37
+ return typeof s == "function" ? /* @__PURE__ */ i(m, { children: s({ isPass: f, type: r, request: e }) }) : f ? /* @__PURE__ */ i(m, { children: s }) : r === "error" ? /* @__PURE__ */ i(p, { status: "403", subTitle: o }) : r === "tooltip" ? /* @__PURE__ */ i(c, { title: o, children: A(
38
+ t,
39
+ {
40
+ ...l,
41
+ className: y("permissions-outer", P["permissions-outer"], n)
42
+ },
43
+ s
44
+ ) }) : null;
45
+ };
46
+ export {
47
+ u as computedIsPass,
48
+ B as default,
49
+ d as usePermissions,
50
+ g as usePermissionsPass
51
+ };
52
+ //# sourceMappingURL=Permissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Permissions.js","sources":["../../../src/components/Permissions/Permissions.tsx"],"sourcesContent":["import { useMarsunAuth } from '@/provider';\nimport { Result, Tooltip } from 'antd';\nimport classNames from 'classnames';\nimport { createElement, type FC, type ReactNode } from 'react';\nimport styles from './style.module.scss';\n\nexport type PermissionsType = 'hidden' | 'tooltip' | 'error';\n\n/** 权限请求:字符串数组(OR)、或自定义判定函数 */\nexport type PermissionRequest = string[] | ((permissions: string[]) => boolean) | (() => boolean);\n\nexport type PermissionsRenderProps = {\n isPass: boolean;\n type: PermissionsType;\n request?: PermissionRequest;\n};\n\nexport type PermissionsProps = {\n /** 无权限呈现:hidden 隐藏 / tooltip 可看见但不可操作 / error 展示 403 */\n type?: PermissionsType;\n /** 包裹标签,同 React.createElement 的 type,默认 span */\n tagName?: keyof HTMLElementTagNameMap | string;\n /** 无权限提示文案 */\n message?: string;\n /** 所需权限;数组为 OR;空/未传视为通过 */\n request?: PermissionRequest;\n className?: string;\n children?: ReactNode | ((props: PermissionsRenderProps) => ReactNode);\n} & Record<string, unknown>;\n\nexport function computedIsPass({\n permissions,\n request,\n}: {\n permissions?: string[];\n request?: PermissionRequest;\n}): boolean {\n if (typeof request === 'function') {\n return Boolean((request as (permissions: string[]) => boolean)(permissions || []));\n }\n if (Array.isArray(request) && request.length > 0) {\n const list = permissions || [];\n return request.some((currentKey) => list.indexOf(currentKey) > -1);\n }\n return true;\n}\n\nexport function usePermissions(): { permissions: string[] } {\n const { permissions } = useMarsunAuth();\n return { permissions: permissions ?? [] };\n}\n\nexport function usePermissionsPass({ request }: { request?: PermissionRequest }): boolean {\n const { permissions } = usePermissions();\n const { hasPermission } = useMarsunAuth();\n\n if (typeof request === 'function') {\n return computedIsPass({ permissions, request });\n }\n\n if (Array.isArray(request) && request.length > 0) {\n if (permissions.length > 0) {\n return computedIsPass({ permissions, request });\n }\n return request.some((key) => !!hasPermission?.(key));\n }\n\n return true;\n}\n\n/**\n * 权限控制:对照 kne-union Permissions,权限源改为 MarsunCoreProvider.auth。\n * 判定语义:request 数组为 OR(与上游运行时一致)。\n */\nconst Permissions: FC<PermissionsProps> = ({\n type = 'hidden',\n className,\n tagName = 'span',\n message = '您暂无权限,请联系管理员',\n request,\n children,\n ...props\n}) => {\n const isPass = usePermissionsPass({ request });\n\n if (typeof children === 'function') {\n return <>{children({ isPass, type, request })}</>;\n }\n\n if (isPass) {\n return <>{children}</>;\n }\n\n if (type === 'error') {\n return <Result status=\"403\" subTitle={message} />;\n }\n\n if (type === 'tooltip') {\n return (\n <Tooltip title={message}>\n {createElement(\n tagName,\n {\n ...props,\n className: classNames('permissions-outer', styles['permissions-outer'], className),\n },\n children,\n )}\n </Tooltip>\n );\n }\n\n return null;\n};\n\nexport default Permissions;\n"],"names":["computedIsPass","permissions","request","list","currentKey","usePermissions","useMarsunAuth","usePermissionsPass","hasPermission","key","Permissions","type","className","tagName","message","children","props","isPass","jsx","Result","Tooltip","createElement","classNames","styles"],"mappings":";;;;;;AA8BO,SAASA,EAAe;AAAA,EAC7B,aAAAC;AAAA,EACA,SAAAC;AACF,GAGY;AACV,MAAI,OAAOA,KAAY;AACrB,WAAO,EAASA,EAA+CD,KAAe,CAAA,CAAE;AAElF,MAAI,MAAM,QAAQC,CAAO,KAAKA,EAAQ,SAAS,GAAG;AAChD,UAAMC,IAAOF,KAAe,CAAA;AAC5B,WAAOC,EAAQ,KAAK,CAACE,MAAeD,EAAK,QAAQC,CAAU,IAAI,EAAE;AAAA,EACnE;AACA,SAAO;AACT;AAEO,SAASC,IAA4C;AAC1D,QAAM,EAAE,aAAAJ,EAAA,IAAgBK,EAAA;AACxB,SAAO,EAAE,aAAaL,KAAe,GAAC;AACxC;AAEO,SAASM,EAAmB,EAAE,SAAAL,KAAqD;AACxF,QAAM,EAAE,aAAAD,EAAA,IAAgBI,EAAA,GAClB,EAAE,eAAAG,EAAA,IAAkBF,EAAA;AAE1B,SAAI,OAAOJ,KAAY,aACdF,EAAe,EAAE,aAAAC,GAAa,SAAAC,GAAS,IAG5C,MAAM,QAAQA,CAAO,KAAKA,EAAQ,SAAS,IACzCD,EAAY,SAAS,IAChBD,EAAe,EAAE,aAAAC,GAAa,SAAAC,GAAS,IAEzCA,EAAQ,KAAK,CAACO,MAAQ,CAAC,EAACD,KAAA,QAAAA,EAAgBC,GAAI,IAG9C;AACT;AAMA,MAAMC,IAAoC,CAAC;AAAA,EACzC,MAAAC,IAAO;AAAA,EACP,WAAAC;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,SAAAC,IAAU;AAAA,EACV,SAAAZ;AAAA,EACA,UAAAa;AAAA,EACA,GAAGC;AACL,MAAM;AACJ,QAAMC,IAASV,EAAmB,EAAE,SAAAL,GAAS;AAE7C,SAAI,OAAOa,KAAa,oCACZ,UAAAA,EAAS,EAAE,QAAAE,GAAQ,MAAAN,GAAM,SAAAT,EAAA,CAAS,GAAE,IAG5Ce,2BACQ,UAAAF,GAAS,IAGjBJ,MAAS,UACJ,gBAAAO,EAACC,GAAA,EAAO,QAAO,OAAM,UAAUL,GAAS,IAG7CH,MAAS,YAET,gBAAAO,EAACE,GAAA,EAAQ,OAAON,GACb,UAAAO;AAAA,IACCR;AAAA,IACA;AAAA,MACE,GAAGG;AAAA,MACH,WAAWM,EAAW,qBAAqBC,EAAO,mBAAmB,GAAGX,CAAS;AAAA,IAAA;AAAA,IAEnFG;AAAA,EAAA,GAEJ,IAIG;AACT;"}
@@ -0,0 +1,2 @@
1
+ export { default as Permissions, computedIsPass, usePermissions, usePermissionsPass, } from './Permissions';
2
+ export type { PermissionRequest, PermissionsProps, PermissionsRenderProps, PermissionsType, } from './Permissions';
@@ -0,0 +1,7 @@
1
+ const s = {
2
+ "permissions-outer": "_permissions-outer_jdl0s_1"
3
+ };
4
+ export {
5
+ s as default
6
+ };
7
+ //# sourceMappingURL=style.module.scss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
@@ -0,0 +1,28 @@
1
+ import { TabsProps } from 'antd';
2
+ import { CSSProperties, ReactNode } from 'react';
3
+ export type StateBarType = 'tab' | 'radio' | 'step';
4
+ export type StateBarOption = {
5
+ key: string;
6
+ /** 选项卡标题(优先于 label) */
7
+ tab?: ReactNode;
8
+ label?: ReactNode;
9
+ children?: ReactNode;
10
+ disabled?: boolean;
11
+ className?: string;
12
+ style?: CSSProperties;
13
+ };
14
+ export type StateBarProps = Omit<TabsProps, 'items' | 'type'> & {
15
+ /** 状态项列表 */
16
+ stateOption?: StateBarOption[];
17
+ /** 展示样式 */
18
+ type?: StateBarType;
19
+ /** 底部线延展至容器全宽 */
20
+ isInner?: boolean;
21
+ className?: string;
22
+ };
23
+ /**
24
+ * 基于 antd Tabs 的状态栏(对齐 kne-union StateBar)。
25
+ * 无 children 时仅作切换条(隐藏 content-holder);有 children 时展示面板。
26
+ */
27
+ declare const StateBar: React.FC<StateBarProps>;
28
+ export default StateBar;
@@ -0,0 +1,43 @@
1
+ import { jsx as d } from "react/jsx-runtime";
2
+ import { Tabs as f } from "antd";
3
+ import h from "classnames";
4
+ import a from "./style.module.scss.js";
5
+ const N = ({
6
+ className: r,
7
+ type: s = "tab",
8
+ stateOption: t = [],
9
+ isInner: o,
10
+ style: l,
11
+ ...m
12
+ }) => {
13
+ const n = t.some((e) => e.children != null);
14
+ return /* @__PURE__ */ d(
15
+ f,
16
+ {
17
+ ...m,
18
+ "data-testid": "components-core-state-bar",
19
+ animated: !1,
20
+ className: h(
21
+ "marsun-state-bar",
22
+ a["state-bar"],
23
+ a[`tab-${s}-control`],
24
+ o && a["inner-state-bar"],
25
+ n && a["has-children"],
26
+ r
27
+ ),
28
+ style: {
29
+ "--total-count": t.length,
30
+ ...l
31
+ },
32
+ items: t.map(({ tab: e, label: c, key: i, ...b }) => ({
33
+ key: i,
34
+ label: e ?? c,
35
+ ...b
36
+ }))
37
+ }
38
+ );
39
+ };
40
+ export {
41
+ N as default
42
+ };
43
+ //# sourceMappingURL=StateBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StateBar.js","sources":["../../../src/components/StateBar/StateBar.tsx"],"sourcesContent":["import { Tabs } from 'antd';\nimport type { TabsProps } from 'antd';\nimport classNames from 'classnames';\nimport type { CSSProperties, ReactNode } from 'react';\nimport styles from './style.module.scss';\n\nexport type StateBarType = 'tab' | 'radio' | 'step';\n\nexport type StateBarOption = {\n key: string;\n /** 选项卡标题(优先于 label) */\n tab?: ReactNode;\n label?: ReactNode;\n children?: ReactNode;\n disabled?: boolean;\n className?: string;\n style?: CSSProperties;\n};\n\nexport type StateBarProps = Omit<TabsProps, 'items' | 'type'> & {\n /** 状态项列表 */\n stateOption?: StateBarOption[];\n /** 展示样式 */\n type?: StateBarType;\n /** 底部线延展至容器全宽 */\n isInner?: boolean;\n className?: string;\n};\n\n/**\n * 基于 antd Tabs 的状态栏(对齐 kne-union StateBar)。\n * 无 children 时仅作切换条(隐藏 content-holder);有 children 时展示面板。\n */\nconst StateBar: React.FC<StateBarProps> = ({\n className,\n type = 'tab',\n stateOption = [],\n isInner,\n style,\n ...props\n}) => {\n const hasChildren = stateOption.some((item) => item.children != null);\n\n return (\n <Tabs\n {...props}\n data-testid=\"components-core-state-bar\"\n animated={false}\n className={classNames(\n 'marsun-state-bar',\n styles['state-bar'],\n styles[`tab-${type}-control`],\n isInner && styles['inner-state-bar'],\n hasChildren && styles['has-children'],\n className,\n )}\n style={\n {\n ['--total-count' as string]: stateOption.length,\n ...style,\n } as CSSProperties\n }\n items={stateOption.map(({ tab, label, key, ...rest }) => ({\n key,\n label: tab ?? label,\n ...rest,\n }))}\n />\n );\n};\n\nexport default StateBar;\n"],"names":["StateBar","className","type","stateOption","isInner","style","props","hasChildren","item","jsx","Tabs","classNames","styles","tab","label","key","rest"],"mappings":";;;;AAiCA,MAAMA,IAAoC,CAAC;AAAA,EACzC,WAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,aAAAC,IAAc,CAAA;AAAA,EACd,SAAAC;AAAA,EACA,OAAAC;AAAA,EACA,GAAGC;AACL,MAAM;AACJ,QAAMC,IAAcJ,EAAY,KAAK,CAACK,MAASA,EAAK,YAAY,IAAI;AAEpE,SACE,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACE,GAAGJ;AAAA,MACJ,eAAY;AAAA,MACZ,UAAU;AAAA,MACV,WAAWK;AAAA,QACT;AAAA,QACAC,EAAO,WAAW;AAAA,QAClBA,EAAO,OAAOV,CAAI,UAAU;AAAA,QAC5BE,KAAWQ,EAAO,iBAAiB;AAAA,QACnCL,KAAeK,EAAO,cAAc;AAAA,QACpCX;AAAA,MAAA;AAAA,MAEF,OACE;AAAA,QACG,iBAA4BE,EAAY;AAAA,QACzC,GAAGE;AAAA,MAAA;AAAA,MAGP,OAAOF,EAAY,IAAI,CAAC,EAAE,KAAAU,GAAK,OAAAC,GAAO,KAAAC,GAAK,GAAGC,SAAY;AAAA,QACxD,KAAAD;AAAA,QACA,OAAOF,KAAOC;AAAA,QACd,GAAGE;AAAA,MAAA,EACH;AAAA,IAAA;AAAA,EAAA;AAGR;"}
@@ -0,0 +1,2 @@
1
+ export { default as StateBar, default } from './StateBar';
2
+ export type { StateBarOption, StateBarProps, StateBarType } from './StateBar';
@@ -0,0 +1,12 @@
1
+ const t = {
2
+ "state-bar": "_state-bar_nrtjt_1",
3
+ "has-children": "_has-children_nrtjt_7",
4
+ "tab-tab-control": "_tab-tab-control_nrtjt_14",
5
+ "tab-radio-control": "_tab-radio-control_nrtjt_21",
6
+ "tab-step-control": "_tab-step-control_nrtjt_55",
7
+ "inner-state-bar": "_inner-state-bar_nrtjt_145"
8
+ };
9
+ export {
10
+ t as default
11
+ };
12
+ //# sourceMappingURL=style.module.scss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
@@ -7,6 +7,9 @@ export * from './Form';
7
7
  export * from './InteractiveBlock';
8
8
  export * from './Layout';
9
9
  export * from './Modal';
10
+ export * from './Permissions';
11
+ export * from './OrgTree';
12
+ export * from './StateBar';
10
13
  export * from './Stat';
11
14
  export * from './Table';
12
15
  export * from './Tag';
package/dist/index.d.ts CHANGED
@@ -30,6 +30,9 @@ export * from './components/Form';
30
30
  export * from './components/InteractiveBlock';
31
31
  export * from './components/Layout';
32
32
  export * from './components/Modal';
33
+ export * from './components/Permissions';
34
+ export * from './components/OrgTree';
35
+ export * from './components/StateBar';
33
36
  export * from './components/Stat';
34
37
  export * from './components/Table';
35
38
  export * from './components/Tag';