@hkyhy/marsun-components-core 0.1.119 → 0.1.121

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 (94) hide show
  1. package/dist/components/Filter/createKneFilterField.js +55 -53
  2. package/dist/components/Filter/createKneFilterField.js.map +1 -1
  3. package/dist/components/Form/SuperSelect.d.ts +1 -0
  4. package/dist/components/Form/SuperSelect.js +67 -58
  5. package/dist/components/Form/SuperSelect.js.map +1 -1
  6. package/dist/components/Form/createPagedSuperSelectApi.d.ts +60 -0
  7. package/dist/components/Form/createPagedSuperSelectApi.js +46 -0
  8. package/dist/components/Form/createPagedSuperSelectApi.js.map +1 -0
  9. package/dist/components/Form/index.d.ts +3 -0
  10. package/dist/components/Form/superSelectEmpty.d.ts +5 -0
  11. package/dist/components/Form/superSelectEmpty.js +11 -0
  12. package/dist/components/Form/superSelectEmpty.js.map +1 -0
  13. package/dist/components/FormInfo/fields.d.ts +2 -0
  14. package/dist/components/FormInfo/fields.js.map +1 -1
  15. package/dist/components/FormInfo/index.d.ts +2 -2
  16. package/dist/components/ReactFilter/fields/index.js +35 -27
  17. package/dist/components/ReactFilter/fields/index.js.map +1 -1
  18. package/dist/components/Tools/ActionTracking/Cancel/CancelExecutionModal.d.ts +20 -0
  19. package/dist/components/Tools/ActionTracking/Cancel/CancelExecutionModal.js +82 -0
  20. package/dist/components/Tools/ActionTracking/Cancel/CancelExecutionModal.js.map +1 -0
  21. package/dist/components/Tools/ActionTracking/Cancel/CancelExecutionModal.module.scss.js +7 -0
  22. package/dist/components/Tools/ActionTracking/Cancel/CancelExecutionModal.module.scss.js.map +1 -0
  23. package/dist/components/Tools/ActionTracking/Cancel/index.d.ts +3 -0
  24. package/dist/components/Tools/ActionTracking/CreateAction/CreateActionForm.d.ts +25 -0
  25. package/dist/components/Tools/ActionTracking/CreateAction/CreateActionForm.js +257 -0
  26. package/dist/components/Tools/ActionTracking/CreateAction/CreateActionForm.js.map +1 -0
  27. package/dist/components/Tools/ActionTracking/CreateAction/CreateActionForm.module.scss.js +10 -0
  28. package/dist/components/Tools/ActionTracking/CreateAction/CreateActionForm.module.scss.js.map +1 -0
  29. package/dist/components/Tools/ActionTracking/CreateAction/CreateActionModal.d.ts +47 -0
  30. package/dist/components/Tools/ActionTracking/CreateAction/CreateActionModal.js +148 -0
  31. package/dist/components/Tools/ActionTracking/CreateAction/CreateActionModal.js.map +1 -0
  32. package/dist/components/Tools/ActionTracking/CreateAction/CreateActionModal.module.scss.js +7 -0
  33. package/dist/components/Tools/ActionTracking/CreateAction/CreateActionModal.module.scss.js.map +1 -0
  34. package/dist/components/Tools/ActionTracking/CreateAction/PersonRoleCascader.d.ts +18 -0
  35. package/dist/components/Tools/ActionTracking/CreateAction/PersonRoleCascader.js +73 -0
  36. package/dist/components/Tools/ActionTracking/CreateAction/PersonRoleCascader.js.map +1 -0
  37. package/dist/components/Tools/ActionTracking/CreateAction/PersonRoleCascader.module.scss.js +5 -0
  38. package/dist/components/Tools/ActionTracking/CreateAction/PersonRoleCascader.module.scss.js.map +1 -0
  39. package/dist/components/Tools/ActionTracking/CreateAction/PersonRoleCascaderField.d.ts +19 -0
  40. package/dist/components/Tools/ActionTracking/CreateAction/PersonRoleCascaderField.js +62 -0
  41. package/dist/components/Tools/ActionTracking/CreateAction/PersonRoleCascaderField.js.map +1 -0
  42. package/dist/components/Tools/ActionTracking/CreateAction/PersonRoleCascaderField.module.scss.js +8 -0
  43. package/dist/components/Tools/ActionTracking/CreateAction/PersonRoleCascaderField.module.scss.js.map +1 -0
  44. package/dist/components/Tools/ActionTracking/CreateAction/SetFormFields.d.ts +4 -0
  45. package/dist/components/Tools/ActionTracking/CreateAction/SetFormFields.js +14 -0
  46. package/dist/components/Tools/ActionTracking/CreateAction/SetFormFields.js.map +1 -0
  47. package/dist/components/Tools/ActionTracking/CreateAction/index.d.ts +12 -0
  48. package/dist/components/Tools/ActionTracking/CreateAction/personCascadePath.d.ts +5 -0
  49. package/dist/components/Tools/ActionTracking/CreateAction/personCascadePath.js +30 -0
  50. package/dist/components/Tools/ActionTracking/CreateAction/personCascadePath.js.map +1 -0
  51. package/dist/components/Tools/ActionTracking/CreateAction/submitHelpers.d.ts +8 -0
  52. package/dist/components/Tools/ActionTracking/CreateAction/submitHelpers.js +35 -0
  53. package/dist/components/Tools/ActionTracking/CreateAction/submitHelpers.js.map +1 -0
  54. package/dist/components/Tools/ActionTracking/CreateAction/types.d.ts +108 -0
  55. package/dist/components/Tools/ActionTracking/Follow/ActionFollowModal.d.ts +27 -0
  56. package/dist/components/Tools/ActionTracking/Follow/ActionFollowModal.js +107 -0
  57. package/dist/components/Tools/ActionTracking/Follow/ActionFollowModal.js.map +1 -0
  58. package/dist/components/Tools/ActionTracking/Follow/ActionFollowModal.module.scss.js +11 -0
  59. package/dist/components/Tools/ActionTracking/Follow/ActionFollowModal.module.scss.js.map +1 -0
  60. package/dist/components/Tools/ActionTracking/Follow/index.d.ts +3 -0
  61. package/dist/components/Tools/ActionTracking/List/ActionFilterBar.d.ts +23 -0
  62. package/dist/components/Tools/ActionTracking/List/ActionFilterBar.js +31 -0
  63. package/dist/components/Tools/ActionTracking/List/ActionFilterBar.js.map +1 -0
  64. package/dist/components/Tools/ActionTracking/List/ActionFilterBar.module.scss.js +8 -0
  65. package/dist/components/Tools/ActionTracking/List/ActionFilterBar.module.scss.js.map +1 -0
  66. package/dist/components/Tools/ActionTracking/List/ActionListTable.d.ts +29 -0
  67. package/dist/components/Tools/ActionTracking/List/ActionListTable.js +76 -0
  68. package/dist/components/Tools/ActionTracking/List/ActionListTable.js.map +1 -0
  69. package/dist/components/Tools/ActionTracking/List/ActionListTable.module.scss.js +8 -0
  70. package/dist/components/Tools/ActionTracking/List/ActionListTable.module.scss.js.map +1 -0
  71. package/dist/components/Tools/ActionTracking/List/filterDefaults.d.ts +15 -0
  72. package/dist/components/Tools/ActionTracking/List/filterDefaults.js +27 -0
  73. package/dist/components/Tools/ActionTracking/List/filterDefaults.js.map +1 -0
  74. package/dist/components/Tools/ActionTracking/List/index.d.ts +6 -0
  75. package/dist/components/Tools/ActionTracking/List/listTypes.d.ts +49 -0
  76. package/dist/components/Tools/ActionTracking/{ActionTrackingShell.d.ts → Shell/ActionTrackingShell.d.ts} +1 -1
  77. package/dist/components/Tools/ActionTracking/{ActionTrackingShell.js → Shell/ActionTrackingShell.js} +1 -1
  78. package/dist/components/Tools/ActionTracking/Shell/ActionTrackingShell.js.map +1 -0
  79. package/dist/components/Tools/ActionTracking/Shell/index.d.ts +3 -0
  80. package/dist/components/Tools/ActionTracking/index.d.ts +11 -2
  81. package/dist/components/Tools/ActionTracking/utils/index.d.ts +1 -0
  82. package/dist/components/Tools/ActionTracking/utils/sanitizeActionHtml.d.ts +2 -0
  83. package/dist/components/Tools/index.d.ts +2 -0
  84. package/dist/form-info.d.ts +3 -0
  85. package/dist/form-info.js +80 -72
  86. package/dist/form-info.js.map +1 -1
  87. package/dist/index.js +855 -811
  88. package/dist/index.js.map +1 -1
  89. package/dist/marsun-components-core.css +2 -2
  90. package/dist/styles/global.css +2 -2
  91. package/package.json +1 -1
  92. package/dist/components/Tools/ActionTracking/ActionTrackingShell.js.map +0 -1
  93. /package/dist/components/Tools/ActionTracking/{style.module.scss.js → Shell/style.module.scss.js} +0 -0
  94. /package/dist/components/Tools/ActionTracking/{style.module.scss.js.map → Shell/style.module.scss.js.map} +0 -0
@@ -0,0 +1,47 @@
1
+ import { CreateActionDimensionOption, CreateActionLoaders, CreateActionPrefill, CreateActionSubmitPayload, LockedContextField } from './types';
2
+ export type CreateActionModalProps = {
3
+ open: boolean;
4
+ onClose: () => void;
5
+ onCreated: (actionId?: string) => void;
6
+ variant?: 'create' | 'dispatch';
7
+ prefill?: CreateActionPrefill;
8
+ lockPrefill?: boolean;
9
+ lockedContext?: LockedContextField[];
10
+ /** @deprecated 有 lockedContext 时忽略 */
11
+ varietyLabel?: string;
12
+ /** F4:任务标题 placeholder */
13
+ titlePlaceholder?: string;
14
+ /** F4:关联指标 placeholder */
15
+ metricPlaceholder?: string;
16
+ /** 弹窗标题;默认按 variant */
17
+ title?: string;
18
+ /** 主按钮文案;默认 下发/创建 */
19
+ okText?: string;
20
+ dimensionOptions: CreateActionDimensionOption[];
21
+ loaders: CreateActionLoaders;
22
+ emptyAssigneeHint?: string;
23
+ emptyAllocatorHint?: string;
24
+ /**
25
+ * App 注入提交(对齐 EAM:校验通过后写 API / domainSubmit)。
26
+ * 返回新建 actionId(可选)。
27
+ */
28
+ onSubmit: (payload: CreateActionSubmitPayload) => Promise<string | undefined>;
29
+ /** 分配人确认后回调(App 可写 localStorage) */
30
+ onAllocatorConfirmed?: (allocatorUserId: string) => void;
31
+ defaultStatus?: string;
32
+ defaultDueDays?: number;
33
+ width?: number;
34
+ zIndex?: number;
35
+ };
36
+ /**
37
+ * 主动新建 / 预警下发任务 · FormModal + FormInfo。
38
+ *
39
+ * ## App 注入契约(W1)
40
+ * - `loaders`:人员级联 + 分厂选项(禁 DEMO / 禁 core 直连业务 API)
41
+ * - `dimensionOptions`:任务类型码表(展示名取自 App 数据)
42
+ * - `titlePlaceholder` / `metricPlaceholder`:F4,由 App 注入业务文案
43
+ * - `onSubmit`:对齐 EAM 提交面;actor / analysisId / eventSource / REST 由 App 补齐
44
+ * - EP 门禁:由 App 决定是否打开本 Modal(禁 DEMO 恒真)
45
+ */
46
+ declare const CreateActionModal: React.FC<CreateActionModalProps>;
47
+ export default CreateActionModal;
@@ -0,0 +1,148 @@
1
+ import { jsx as O } from "react/jsx-runtime";
2
+ import { useState as gt, useRef as P, useCallback as j, useMemo as vt } from "react";
3
+ import { message as M } from "antd";
4
+ import ut from "classnames";
5
+ import yt from "./CreateActionForm.js";
6
+ import { addDaysYmd as St, validateCreateActionPersons as ht, createActionPersonWarnMessage as It, personDisplayName as T } from "./submitHelpers.js";
7
+ import kt from "./CreateActionModal.module.scss.js";
8
+ import wt from "../../../FormInfo/FormModal.js";
9
+ const Lt = ({
10
+ open: A,
11
+ onClose: x,
12
+ onCreated: C,
13
+ variant: H = "create",
14
+ prefill: t,
15
+ lockPrefill: V = !1,
16
+ lockedContext: c,
17
+ varietyLabel: W,
18
+ titlePlaceholder: Y,
19
+ metricPlaceholder: $,
20
+ title: q,
21
+ okText: z,
22
+ dimensionOptions: g,
23
+ loaders: G,
24
+ emptyAssigneeHint: J,
25
+ emptyAllocatorHint: K,
26
+ onSubmit: Q,
27
+ onAllocatorConfirmed: h,
28
+ defaultStatus: I = "approved",
29
+ defaultDueDays: U = 7,
30
+ width: X = 560,
31
+ zIndex: Z = 1300
32
+ }) => {
33
+ var _, E, F;
34
+ const [D, b] = gt(!1), B = P([]), R = P([]), p = j((o) => {
35
+ B.current = o;
36
+ }, []), f = j((o) => {
37
+ R.current = o;
38
+ }, []), v = H === "dispatch", s = !!(c && c.length > 0), r = ((_ = t == null ? void 0 : t.factory) == null ? void 0 : _.trim()) || "", u = ((E = t == null ? void 0 : t.variety) == null ? void 0 : E.trim()) || "", y = ((F = t == null ? void 0 : t.metric) == null ? void 0 : F.trim()) || "", l = !s && (v || V) && !!(r || u || y), tt = q || (v ? "下发任务" : "新建跟踪任务"), ot = z || (v ? "下发" : "创建"), st = vt(() => {
39
+ var a, i, d;
40
+ const o = {};
41
+ return (c || []).forEach((m, S) => {
42
+ o[`lockedContext_${S}`] = m.value;
43
+ }), {
44
+ title: ((a = t == null ? void 0 : t.title) == null ? void 0 : a.trim()) || "",
45
+ dimension: ((i = t == null ? void 0 : t.dimension) == null ? void 0 : i.trim()) || ((d = g[0]) == null ? void 0 : d.value) || "",
46
+ status: I,
47
+ allocatorUserId: "",
48
+ assigneeUserId: "",
49
+ dueDate: St(U),
50
+ factory: r,
51
+ variety: s ? "" : u,
52
+ metric: s ? "" : y,
53
+ ...o
54
+ };
55
+ }, [
56
+ c,
57
+ r,
58
+ u,
59
+ y,
60
+ s,
61
+ t == null ? void 0 : t.title,
62
+ t == null ? void 0 : t.dimension,
63
+ g,
64
+ I,
65
+ U
66
+ ]), et = async (o) => {
67
+ var L;
68
+ const a = ht(
69
+ String(o.allocatorUserId || ""),
70
+ String(o.assigneeUserId || ""),
71
+ R.current,
72
+ B.current
73
+ );
74
+ if (!a.ok)
75
+ throw M.warning(It(a.code)), new Error(a.code);
76
+ const { allocator: i, assignee: d } = a, m = i.value, S = d.value;
77
+ h == null || h(m), b(!0);
78
+ try {
79
+ const e = String(o.dueDate ?? "").trim(), n = T(d, S), at = T(i, m), k = s ? r : String(o.factory || "").trim(), N = s ? "" : String(o.variety || "").trim(), w = s ? "" : String(o.metric || "").trim(), nt = String(o.title || "").trim(), ct = String(o.dimension || "").trim() || String((t == null ? void 0 : t.dimension) || "").trim() || ((L = g[0]) == null ? void 0 : L.value) || "", rt = s ? (c || []).map((mt) => mt.value).filter(Boolean).join(" · ") : [k, N, w].filter(Boolean).join(" · "), it = {
80
+ title: nt,
81
+ dimension: ct,
82
+ status: String(o.status || I),
83
+ assignee: n,
84
+ assigneeUserId: S,
85
+ allocator: at,
86
+ allocatorUserId: m,
87
+ owner: n,
88
+ dueDate: e || void 0,
89
+ factory: k,
90
+ variety: N,
91
+ metric: w,
92
+ factoryCode: (t == null ? void 0 : t.factoryCode) || void 0,
93
+ factoryName: k || void 0,
94
+ verifyMetric: w || void 0,
95
+ eventLabel: rt
96
+ }, dt = await Q(it);
97
+ M.success(v ? "已下发任务" : "已创建跟踪任务"), C(dt);
98
+ } catch (e) {
99
+ const n = e instanceof Error ? e.message : "";
100
+ throw n === "missing_allocator" || n === "invalid_allocator" || n === "missing_assignee" || n === "invalid_assignee" || M.error(e instanceof Error ? e.message : "创建失败"), e;
101
+ } finally {
102
+ b(!1);
103
+ }
104
+ };
105
+ return /* @__PURE__ */ O(
106
+ wt,
107
+ {
108
+ className: ut("create-action-modal", kt["create-action-modal"]),
109
+ title: tt,
110
+ open: A,
111
+ onCancel: x,
112
+ autoClose: !0,
113
+ okText: ot,
114
+ width: X,
115
+ zIndex: Z,
116
+ destroyOnHidden: !0,
117
+ okButtonProps: { loading: D },
118
+ formProps: {
119
+ data: st,
120
+ onSubmit: et
121
+ },
122
+ children: /* @__PURE__ */ O(
123
+ yt,
124
+ {
125
+ onAssigneeOptionsReady: p,
126
+ onAllocatorOptionsReady: f,
127
+ lockedContext: s ? c : void 0,
128
+ varietyLabel: s ? void 0 : W,
129
+ titlePlaceholder: Y,
130
+ metricPlaceholder: $,
131
+ dimensionOptions: g,
132
+ loaders: G,
133
+ emptyAssigneeHint: J,
134
+ emptyAllocatorHint: K,
135
+ scopeLock: l ? {
136
+ factory: r || void 0,
137
+ variety: u || void 0,
138
+ metric: y || void 0
139
+ } : void 0
140
+ }
141
+ )
142
+ }
143
+ );
144
+ };
145
+ export {
146
+ Lt as default
147
+ };
148
+ //# sourceMappingURL=CreateActionModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CreateActionModal.js","sources":["../../../../../src/components/Tools/ActionTracking/CreateAction/CreateActionModal.tsx"],"sourcesContent":["import { useCallback, useMemo, useRef, useState } from 'react';\nimport { FormModal } from '../../../FormInfo';\nimport { message } from 'antd';\nimport classNames from 'classnames';\nimport CreateActionForm from './CreateActionForm';\nimport {\n addDaysYmd,\n createActionPersonWarnMessage,\n personDisplayName,\n validateCreateActionPersons,\n} from './submitHelpers';\nimport type {\n ActionPersonOption,\n CreateActionDimensionOption,\n CreateActionLoaders,\n CreateActionPrefill,\n CreateActionSubmitPayload,\n LockedContextField,\n} from './types';\nimport styles from './CreateActionModal.module.scss';\n\nexport type CreateActionModalProps = {\n open: boolean;\n onClose: () => void;\n onCreated: (actionId?: string) => void;\n variant?: 'create' | 'dispatch';\n prefill?: CreateActionPrefill;\n lockPrefill?: boolean;\n lockedContext?: LockedContextField[];\n /** @deprecated 有 lockedContext 时忽略 */\n varietyLabel?: string;\n /** F4:任务标题 placeholder */\n titlePlaceholder?: string;\n /** F4:关联指标 placeholder */\n metricPlaceholder?: string;\n /** 弹窗标题;默认按 variant */\n title?: string;\n /** 主按钮文案;默认 下发/创建 */\n okText?: string;\n dimensionOptions: CreateActionDimensionOption[];\n loaders: CreateActionLoaders;\n emptyAssigneeHint?: string;\n emptyAllocatorHint?: string;\n /**\n * App 注入提交(对齐 EAM:校验通过后写 API / domainSubmit)。\n * 返回新建 actionId(可选)。\n */\n onSubmit: (payload: CreateActionSubmitPayload) => Promise<string | undefined>;\n /** 分配人确认后回调(App 可写 localStorage) */\n onAllocatorConfirmed?: (allocatorUserId: string) => void;\n defaultStatus?: string;\n defaultDueDays?: number;\n width?: number;\n zIndex?: number;\n};\n\n/**\n * 主动新建 / 预警下发任务 · FormModal + FormInfo。\n *\n * ## App 注入契约(W1)\n * - `loaders`:人员级联 + 分厂选项(禁 DEMO / 禁 core 直连业务 API)\n * - `dimensionOptions`:任务类型码表(展示名取自 App 数据)\n * - `titlePlaceholder` / `metricPlaceholder`:F4,由 App 注入业务文案\n * - `onSubmit`:对齐 EAM 提交面;actor / analysisId / eventSource / REST 由 App 补齐\n * - EP 门禁:由 App 决定是否打开本 Modal(禁 DEMO 恒真)\n */\nconst CreateActionModal: React.FC<CreateActionModalProps> = ({\n open,\n onClose,\n onCreated,\n variant = 'create',\n prefill,\n lockPrefill = false,\n lockedContext,\n varietyLabel,\n titlePlaceholder,\n metricPlaceholder,\n title: titleProp,\n okText: okTextProp,\n dimensionOptions,\n loaders,\n emptyAssigneeHint,\n emptyAllocatorHint,\n onSubmit,\n onAllocatorConfirmed,\n defaultStatus = 'approved',\n defaultDueDays = 7,\n width = 560,\n zIndex = 1300,\n}) => {\n const [saving, setSaving] = useState(false);\n const assigneeOptsRef = useRef<ActionPersonOption[]>([]);\n const allocatorOptsRef = useRef<ActionPersonOption[]>([]);\n const onAssigneeOptionsReady = useCallback((opts: ActionPersonOption[]) => {\n assigneeOptsRef.current = opts;\n }, []);\n const onAllocatorOptionsReady = useCallback((opts: ActionPersonOption[]) => {\n allocatorOptsRef.current = opts;\n }, []);\n\n const isDispatch = variant === 'dispatch';\n const useLocked = Boolean(lockedContext && lockedContext.length > 0);\n const scopeFactory = prefill?.factory?.trim() || '';\n const scopeVariety = prefill?.variety?.trim() || '';\n const scopeMetric = prefill?.metric?.trim() || '';\n const lockScope =\n !useLocked &&\n (isDispatch || lockPrefill) &&\n Boolean(scopeFactory || scopeVariety || scopeMetric);\n\n const modalTitle = titleProp || (isDispatch ? '下发任务' : '新建跟踪任务');\n const okText = okTextProp || (isDispatch ? '下发' : '创建');\n\n const formInitialData = useMemo(() => {\n const lockedFields: Record<string, string> = {};\n (lockedContext || []).forEach((field, idx) => {\n lockedFields[`lockedContext_${idx}`] = field.value;\n });\n return {\n title: prefill?.title?.trim() || '',\n dimension: prefill?.dimension?.trim() || dimensionOptions[0]?.value || '',\n status: defaultStatus,\n allocatorUserId: '',\n assigneeUserId: '',\n dueDate: addDaysYmd(defaultDueDays),\n factory: scopeFactory,\n variety: useLocked ? '' : scopeVariety,\n metric: useLocked ? '' : scopeMetric,\n ...lockedFields,\n };\n }, [\n lockedContext,\n scopeFactory,\n scopeVariety,\n scopeMetric,\n useLocked,\n prefill?.title,\n prefill?.dimension,\n dimensionOptions,\n defaultStatus,\n defaultDueDays,\n ]);\n\n const handleSubmit = async (formData: Record<string, unknown>) => {\n const checked = validateCreateActionPersons(\n String(formData.allocatorUserId || ''),\n String(formData.assigneeUserId || ''),\n allocatorOptsRef.current,\n assigneeOptsRef.current,\n );\n if (!checked.ok) {\n message.warning(createActionPersonWarnMessage(checked.code));\n throw new Error(checked.code);\n }\n\n const { allocator: allocatorOpt, assignee: fromOptions } = checked;\n const allocatorUserId = allocatorOpt.value;\n const assigneeUserId = fromOptions.value;\n onAllocatorConfirmed?.(allocatorUserId);\n\n setSaving(true);\n try {\n const due = String(formData.dueDate ?? '').trim();\n const assignee = personDisplayName(fromOptions, assigneeUserId);\n const allocator = personDisplayName(allocatorOpt, allocatorUserId);\n const factory = useLocked ? scopeFactory : String(formData.factory || '').trim();\n const variety = useLocked ? '' : String(formData.variety || '').trim();\n const metric = useLocked ? '' : String(formData.metric || '').trim();\n const title = String(formData.title || '').trim();\n const dimension =\n String(formData.dimension || '').trim() ||\n String(prefill?.dimension || '').trim() ||\n dimensionOptions[0]?.value ||\n '';\n const eventLabel = useLocked\n ? (lockedContext || [])\n .map((f) => f.value)\n .filter(Boolean)\n .join(' · ')\n : [factory, variety, metric].filter(Boolean).join(' · ');\n\n const payload: CreateActionSubmitPayload = {\n title,\n dimension,\n status: String(formData.status || defaultStatus),\n assignee,\n assigneeUserId,\n allocator,\n allocatorUserId,\n owner: assignee,\n dueDate: due || undefined,\n factory,\n variety,\n metric,\n factoryCode: prefill?.factoryCode || undefined,\n factoryName: factory || undefined,\n verifyMetric: metric || undefined,\n eventLabel,\n };\n\n const actionId = await onSubmit(payload);\n message.success(isDispatch ? '已下发任务' : '已创建跟踪任务');\n onCreated(actionId);\n } catch (err) {\n const code = err instanceof Error ? err.message : '';\n if (\n code === 'missing_allocator' ||\n code === 'invalid_allocator' ||\n code === 'missing_assignee' ||\n code === 'invalid_assignee'\n ) {\n throw err;\n }\n message.error(err instanceof Error ? err.message : '创建失败');\n throw err;\n } finally {\n setSaving(false);\n }\n };\n\n return (\n <FormModal\n className={classNames('create-action-modal', styles['create-action-modal'])}\n title={modalTitle}\n open={open}\n onCancel={onClose}\n autoClose\n okText={okText}\n width={width}\n zIndex={zIndex}\n destroyOnHidden\n okButtonProps={{ loading: saving }}\n formProps={{\n data: formInitialData,\n onSubmit: handleSubmit,\n }}\n >\n <CreateActionForm\n onAssigneeOptionsReady={onAssigneeOptionsReady}\n onAllocatorOptionsReady={onAllocatorOptionsReady}\n lockedContext={useLocked ? lockedContext : undefined}\n varietyLabel={useLocked ? undefined : varietyLabel}\n titlePlaceholder={titlePlaceholder}\n metricPlaceholder={metricPlaceholder}\n dimensionOptions={dimensionOptions}\n loaders={loaders}\n emptyAssigneeHint={emptyAssigneeHint}\n emptyAllocatorHint={emptyAllocatorHint}\n scopeLock={\n lockScope\n ? {\n factory: scopeFactory || undefined,\n variety: scopeVariety || undefined,\n metric: scopeMetric || undefined,\n }\n : undefined\n }\n />\n </FormModal>\n );\n};\n\nexport default CreateActionModal;\n"],"names":["CreateActionModal","open","onClose","onCreated","variant","prefill","lockPrefill","lockedContext","varietyLabel","titlePlaceholder","metricPlaceholder","titleProp","okTextProp","dimensionOptions","loaders","emptyAssigneeHint","emptyAllocatorHint","onSubmit","onAllocatorConfirmed","defaultStatus","defaultDueDays","width","zIndex","saving","setSaving","useState","assigneeOptsRef","useRef","allocatorOptsRef","onAssigneeOptionsReady","useCallback","opts","onAllocatorOptionsReady","isDispatch","useLocked","scopeFactory","_a","scopeVariety","_b","scopeMetric","_c","lockScope","modalTitle","okText","formInitialData","useMemo","lockedFields","field","idx","addDaysYmd","handleSubmit","formData","checked","validateCreateActionPersons","message","createActionPersonWarnMessage","allocatorOpt","fromOptions","allocatorUserId","assigneeUserId","due","assignee","personDisplayName","allocator","factory","variety","metric","title","dimension","eventLabel","f","payload","actionId","err","code","jsx","FormModal","classNames","styles","CreateActionForm"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ const a = {
2
+ "create-action-modal": "_create-action-modal_nske2_3"
3
+ };
4
+ export {
5
+ a as default
6
+ };
7
+ //# sourceMappingURL=CreateActionModal.module.scss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CreateActionModal.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
@@ -0,0 +1,18 @@
1
+ import { ActionPersonCascadeOption } from './types';
2
+ export type PersonRoleCascaderProps = {
3
+ value?: string;
4
+ onChange?: (userId: string) => void;
5
+ cascadeOptions: ActionPersonCascadeOption[];
6
+ loading?: boolean;
7
+ disabled?: boolean;
8
+ placeholder?: string;
9
+ emptyHint?: string;
10
+ /** 尚无 value 时写入默认 userId */
11
+ defaultUserId?: string;
12
+ };
13
+ /**
14
+ * 角色→用户两级级联(受控 userId)。
15
+ * 同一人多角色:保留用户点选角色枝(S3 path 语义)。
16
+ */
17
+ declare const PersonRoleCascader: React.FC<PersonRoleCascaderProps>;
18
+ export default PersonRoleCascader;
@@ -0,0 +1,73 @@
1
+ import { jsx as S } from "react/jsx-runtime";
2
+ import { useState as v, useEffect as a, useMemo as x } from "react";
3
+ import { Cascader as g, Spin as R } from "antd";
4
+ import b from "classnames";
5
+ import { cascadePathStillValid as y, findPersonCascadePath as h } from "./personCascadePath.js";
6
+ import L from "./PersonRoleCascader.module.scss.js";
7
+ const E = ({
8
+ value: p,
9
+ onChange: l,
10
+ cascadeOptions: e,
11
+ loading: i,
12
+ disabled: d,
13
+ placeholder: w,
14
+ emptyHint: c,
15
+ defaultUserId: n
16
+ }) => {
17
+ const [s, f] = v(), o = String(p ?? "").trim();
18
+ a(() => {
19
+ if (!o) {
20
+ f(void 0);
21
+ return;
22
+ }
23
+ if (!e.length || y(e, s, o)) return;
24
+ const t = s && s.length >= 2 ? String(s[0] || "") : void 0, r = h(e, o, t);
25
+ r && f(r);
26
+ }, [e, o]), a(() => {
27
+ if (o || !n || !e.length) return;
28
+ const t = h(e, n);
29
+ t && (f(t), l == null || l(n));
30
+ }, [e, n, o, l]);
31
+ const u = x(() => e, [e]);
32
+ return /* @__PURE__ */ S(
33
+ g,
34
+ {
35
+ allowClear: !0,
36
+ changeOnSelect: !1,
37
+ disabled: d || i || u.length === 0,
38
+ loading: i,
39
+ options: u,
40
+ value: s,
41
+ style: { width: "100%" },
42
+ className: b(
43
+ "react-form__field-component",
44
+ "person-role-cascader",
45
+ L["person-role-cascader"]
46
+ ),
47
+ placeholder: i ? "加载中…" : u.length === 0 ? c || "暂无人员" : w,
48
+ showSearch: {
49
+ filter: (t, r) => {
50
+ const m = t.trim().toLowerCase();
51
+ return m ? r.some(
52
+ (P) => String(P.label || "").toLowerCase().includes(m)
53
+ ) : !0;
54
+ }
55
+ },
56
+ displayRender: (t) => {
57
+ const r = t.filter(Boolean);
58
+ return r.length ? String(r[r.length - 1]) : "";
59
+ },
60
+ notFoundContent: i ? /* @__PURE__ */ S(R, { size: "small" }) : c || "暂无人员",
61
+ onChange: (t) => {
62
+ const r = t || void 0;
63
+ f(r);
64
+ const m = r && r.length >= 2 ? String(r[r.length - 1] || "") : "";
65
+ l == null || l(m);
66
+ }
67
+ }
68
+ );
69
+ };
70
+ export {
71
+ E as default
72
+ };
73
+ //# sourceMappingURL=PersonRoleCascader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PersonRoleCascader.js","sources":["../../../../../src/components/Tools/ActionTracking/CreateAction/PersonRoleCascader.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react';\nimport { Cascader, Spin } from 'antd';\nimport type { DefaultOptionType } from 'antd/es/cascader';\nimport classNames from 'classnames';\nimport { cascadePathStillValid, findPersonCascadePath } from './personCascadePath';\nimport type { ActionPersonCascadeOption } from './types';\nimport styles from './PersonRoleCascader.module.scss';\n\nexport type PersonRoleCascaderProps = {\n value?: string;\n onChange?: (userId: string) => void;\n cascadeOptions: ActionPersonCascadeOption[];\n loading?: boolean;\n disabled?: boolean;\n placeholder?: string;\n emptyHint?: string;\n /** 尚无 value 时写入默认 userId */\n defaultUserId?: string;\n};\n\n/**\n * 角色→用户两级级联(受控 userId)。\n * 同一人多角色:保留用户点选角色枝(S3 path 语义)。\n */\nconst PersonRoleCascader: React.FC<PersonRoleCascaderProps> = ({\n value,\n onChange,\n cascadeOptions,\n loading,\n disabled,\n placeholder,\n emptyHint,\n defaultUserId,\n}) => {\n const [path, setPath] = useState<string[] | undefined>();\n const fieldUserId = String(value ?? '').trim();\n\n useEffect(() => {\n if (!fieldUserId) {\n setPath(undefined);\n return;\n }\n if (!cascadeOptions.length) return;\n if (cascadePathStillValid(cascadeOptions, path, fieldUserId)) return;\n const preferRole = path && path.length >= 2 ? String(path[0] || '') : undefined;\n const next = findPersonCascadePath(cascadeOptions, fieldUserId, preferRole);\n if (next) setPath(next);\n // path 故意不进 deps:仅在 fieldUserId / options 变化时校正\n // eslint-disable-next-line react-hooks/exhaustive-deps -- 见上\n }, [cascadeOptions, fieldUserId]);\n\n useEffect(() => {\n if (fieldUserId || !defaultUserId || !cascadeOptions.length) return;\n const next = findPersonCascadePath(cascadeOptions, defaultUserId);\n if (!next) return;\n setPath(next);\n onChange?.(defaultUserId);\n }, [cascadeOptions, defaultUserId, fieldUserId, onChange]);\n\n const options = useMemo(() => cascadeOptions as DefaultOptionType[], [cascadeOptions]);\n\n return (\n <Cascader\n allowClear\n changeOnSelect={false}\n disabled={disabled || loading || options.length === 0}\n loading={loading}\n options={options}\n value={path}\n style={{ width: '100%' }}\n className={classNames(\n 'react-form__field-component',\n 'person-role-cascader',\n styles['person-role-cascader'],\n )}\n placeholder={\n loading ? '加载中…' : options.length === 0 ? emptyHint || '暂无人员' : placeholder\n }\n showSearch={{\n filter: (inputValue, optPath) => {\n const q = inputValue.trim().toLowerCase();\n if (!q) return true;\n return optPath.some((n) =>\n String(n.label || '')\n .toLowerCase()\n .includes(q),\n );\n },\n }}\n displayRender={(labels) => {\n const parts = labels.filter(Boolean);\n return parts.length ? String(parts[parts.length - 1]) : '';\n }}\n notFoundContent={loading ? <Spin size=\"small\" /> : emptyHint || '暂无人员'}\n onChange={(next) => {\n const p = (next as string[] | undefined) || undefined;\n setPath(p);\n const userId = p && p.length >= 2 ? String(p[p.length - 1] || '') : '';\n onChange?.(userId);\n }}\n />\n );\n};\n\nexport default PersonRoleCascader;\n"],"names":["PersonRoleCascader","value","onChange","cascadeOptions","loading","disabled","placeholder","emptyHint","defaultUserId","path","setPath","useState","fieldUserId","useEffect","cascadePathStillValid","preferRole","next","findPersonCascadePath","options","useMemo","jsx","Cascader","classNames","styles","inputValue","optPath","q","n","labels","parts","Spin","p","userId"],"mappings":";;;;;;AAwBA,MAAMA,IAAwD,CAAC;AAAA,EAC7D,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC;AAAA,EACA,aAAAC;AAAA,EACA,WAAAC;AAAA,EACA,eAAAC;AACF,MAAM;AACJ,QAAM,CAACC,GAAMC,CAAO,IAAIC,EAAA,GAClBC,IAAc,OAAOX,KAAS,EAAE,EAAE,KAAA;AAExC,EAAAY,EAAU,MAAM;AACd,QAAI,CAACD,GAAa;AAChB,MAAAF,EAAQ,MAAS;AACjB;AAAA,IACF;AAEA,QADI,CAACP,EAAe,UAChBW,EAAsBX,GAAgBM,GAAMG,CAAW,EAAG;AAC9D,UAAMG,IAAaN,KAAQA,EAAK,UAAU,IAAI,OAAOA,EAAK,CAAC,KAAK,EAAE,IAAI,QAChEO,IAAOC,EAAsBd,GAAgBS,GAAaG,CAAU;AAC1E,IAAIC,OAAcA,CAAI;AAAA,EAGxB,GAAG,CAACb,GAAgBS,CAAW,CAAC,GAEhCC,EAAU,MAAM;AACd,QAAID,KAAe,CAACJ,KAAiB,CAACL,EAAe,OAAQ;AAC7D,UAAMa,IAAOC,EAAsBd,GAAgBK,CAAa;AAChE,IAAKQ,MACLN,EAAQM,CAAI,GACZd,KAAA,QAAAA,EAAWM;AAAA,EACb,GAAG,CAACL,GAAgBK,GAAeI,GAAaV,CAAQ,CAAC;AAEzD,QAAMgB,IAAUC,EAAQ,MAAMhB,GAAuC,CAACA,CAAc,CAAC;AAErF,SACE,gBAAAiB;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,YAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,UAAUhB,KAAYD,KAAWc,EAAQ,WAAW;AAAA,MACpD,SAAAd;AAAA,MACA,SAAAc;AAAA,MACA,OAAOT;AAAA,MACP,OAAO,EAAE,OAAO,OAAA;AAAA,MAChB,WAAWa;AAAA,QACT;AAAA,QACA;AAAA,QACAC,EAAO,sBAAsB;AAAA,MAAA;AAAA,MAE/B,aACEnB,IAAU,SAASc,EAAQ,WAAW,IAAIX,KAAa,SAASD;AAAA,MAElE,YAAY;AAAA,QACV,QAAQ,CAACkB,GAAYC,MAAY;AAC/B,gBAAMC,IAAIF,EAAW,KAAA,EAAO,YAAA;AAC5B,iBAAKE,IACED,EAAQ;AAAA,YAAK,CAACE,MACnB,OAAOA,EAAE,SAAS,EAAE,EACjB,cACA,SAASD,CAAC;AAAA,UAAA,IAJA;AAAA,QAMjB;AAAA,MAAA;AAAA,MAEF,eAAe,CAACE,MAAW;AACzB,cAAMC,IAAQD,EAAO,OAAO,OAAO;AACnC,eAAOC,EAAM,SAAS,OAAOA,EAAMA,EAAM,SAAS,CAAC,CAAC,IAAI;AAAA,MAC1D;AAAA,MACA,iBAAiBzB,IAAU,gBAAAgB,EAACU,KAAK,MAAK,QAAA,CAAQ,IAAKvB,KAAa;AAAA,MAChE,UAAU,CAACS,MAAS;AAClB,cAAMe,IAAKf,KAAiC;AAC5C,QAAAN,EAAQqB,CAAC;AACT,cAAMC,IAASD,KAAKA,EAAE,UAAU,IAAI,OAAOA,EAAEA,EAAE,SAAS,CAAC,KAAK,EAAE,IAAI;AACpE,QAAA7B,KAAA,QAAAA,EAAW8B;AAAA,MACb;AAAA,IAAA;AAAA,EAAA;AAGN;"}
@@ -0,0 +1,5 @@
1
+ const s = {};
2
+ export {
3
+ s as default
4
+ };
5
+ //# sourceMappingURL=PersonRoleCascader.module.scss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PersonRoleCascader.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1,19 @@
1
+ import { ActionPersonCascadeOption } from './types';
2
+ export type PersonRoleCascaderFieldProps = {
3
+ /** 写入 FormInfo 的字段名(userId) */
4
+ name: string;
5
+ label: string;
6
+ cascadeOptions: ActionPersonCascadeOption[];
7
+ loading?: boolean;
8
+ disabled?: boolean;
9
+ placeholder?: string;
10
+ emptyHint?: string;
11
+ /** 默认选中的 userId(如上次分配人) */
12
+ defaultUserId?: string;
13
+ };
14
+ /**
15
+ * form-info 包装:useField 注册 + 与 FormInfo 字段同壳(label / 间距 / 必填星号)。
16
+ * 勿传 errMsg(kne getErrMsg 会无条件画红字)。
17
+ */
18
+ declare const PersonRoleCascaderField: React.FC<PersonRoleCascaderFieldProps>;
19
+ export default PersonRoleCascaderField;
@@ -0,0 +1,62 @@
1
+ import { jsx as e, jsxs as p } from "react/jsx-runtime";
2
+ import s from "classnames";
3
+ import u from "./PersonRoleCascader.js";
4
+ import a from "./PersonRoleCascaderField.module.scss.js";
5
+ import { useField as _ } from "@kne/react-form";
6
+ const R = ({
7
+ name: l,
8
+ label: r,
9
+ cascadeOptions: o,
10
+ loading: i,
11
+ disabled: c,
12
+ placeholder: d,
13
+ emptyHint: m,
14
+ defaultUserId: f
15
+ }) => {
16
+ const { value: n, onChange: t } = _({
17
+ name: l,
18
+ label: r,
19
+ rule: "REQ"
20
+ });
21
+ return /* @__PURE__ */ e(
22
+ "div",
23
+ {
24
+ className: s(
25
+ "react-form__field",
26
+ "person-role-cascader-field",
27
+ a["person-role-cascader-field"]
28
+ ),
29
+ children: /* @__PURE__ */ p("div", { className: "react-form__field-main", children: [
30
+ /* @__PURE__ */ e(
31
+ "div",
32
+ {
33
+ className: s(
34
+ "react-form__field-label",
35
+ "is-req",
36
+ "marsun-form-info-is-req",
37
+ a["person-role-cascader-field-label"]
38
+ ),
39
+ children: r
40
+ }
41
+ ),
42
+ /* @__PURE__ */ e("div", { className: "react-form__field-input", children: /* @__PURE__ */ e(
43
+ u,
44
+ {
45
+ value: String(n ?? ""),
46
+ onChange: t,
47
+ cascadeOptions: o,
48
+ loading: i,
49
+ disabled: c,
50
+ placeholder: d,
51
+ emptyHint: m,
52
+ defaultUserId: f
53
+ }
54
+ ) })
55
+ ] })
56
+ }
57
+ );
58
+ };
59
+ export {
60
+ R as default
61
+ };
62
+ //# sourceMappingURL=PersonRoleCascaderField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PersonRoleCascaderField.js","sources":["../../../../../src/components/Tools/ActionTracking/CreateAction/PersonRoleCascaderField.tsx"],"sourcesContent":["import { useField } from '../../../Form';\nimport classNames from 'classnames';\nimport PersonRoleCascader from './PersonRoleCascader';\nimport type { ActionPersonCascadeOption } from './types';\nimport styles from './PersonRoleCascaderField.module.scss';\n\nexport type PersonRoleCascaderFieldProps = {\n /** 写入 FormInfo 的字段名(userId) */\n name: string;\n label: string;\n cascadeOptions: ActionPersonCascadeOption[];\n loading?: boolean;\n disabled?: boolean;\n placeholder?: string;\n emptyHint?: string;\n /** 默认选中的 userId(如上次分配人) */\n defaultUserId?: string;\n};\n\n/**\n * form-info 包装:useField 注册 + 与 FormInfo 字段同壳(label / 间距 / 必填星号)。\n * 勿传 errMsg(kne getErrMsg 会无条件画红字)。\n */\nconst PersonRoleCascaderField: React.FC<PersonRoleCascaderFieldProps> = ({\n name,\n label,\n cascadeOptions,\n loading,\n disabled,\n placeholder,\n emptyHint,\n defaultUserId,\n}) => {\n const { value, onChange } = useField({\n name,\n label,\n rule: 'REQ',\n }) as {\n value?: unknown;\n onChange: (next: string) => void;\n };\n\n return (\n <div\n className={classNames(\n 'react-form__field',\n 'person-role-cascader-field',\n styles['person-role-cascader-field'],\n )}\n >\n <div className=\"react-form__field-main\">\n <div\n className={classNames(\n 'react-form__field-label',\n 'is-req',\n 'marsun-form-info-is-req',\n styles['person-role-cascader-field-label'],\n )}\n >\n {label}\n </div>\n <div className=\"react-form__field-input\">\n <PersonRoleCascader\n value={String(value ?? '')}\n onChange={onChange}\n cascadeOptions={cascadeOptions}\n loading={loading}\n disabled={disabled}\n placeholder={placeholder}\n emptyHint={emptyHint}\n defaultUserId={defaultUserId}\n />\n </div>\n </div>\n </div>\n );\n};\n\nexport default PersonRoleCascaderField;\n"],"names":["PersonRoleCascaderField","name","label","cascadeOptions","loading","disabled","placeholder","emptyHint","defaultUserId","value","onChange","useField","jsx","classNames","styles","jsxs","PersonRoleCascader"],"mappings":";;;;;AAuBA,MAAMA,IAAkE,CAAC;AAAA,EACvE,MAAAC;AAAA,EACA,OAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC;AAAA,EACA,aAAAC;AAAA,EACA,WAAAC;AAAA,EACA,eAAAC;AACF,MAAM;AACJ,QAAM,EAAE,OAAAC,GAAO,UAAAC,EAAA,IAAaC,EAAS;AAAA,IACnC,MAAAV;AAAA,IACA,OAAAC;AAAA,IACA,MAAM;AAAA,EAAA,CACP;AAKD,SACE,gBAAAU;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC;AAAA,QACT;AAAA,QACA;AAAA,QACAC,EAAO,4BAA4B;AAAA,MAAA;AAAA,MAGrC,UAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,0BACb,UAAA;AAAA,QAAA,gBAAAH;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWC;AAAA,cACT;AAAA,cACA;AAAA,cACA;AAAA,cACAC,EAAO,kCAAkC;AAAA,YAAA;AAAA,YAG1C,UAAAZ;AAAA,UAAA;AAAA,QAAA;AAAA,QAEH,gBAAAU,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA,gBAAAA;AAAA,UAACI;AAAA,UAAA;AAAA,YACC,OAAO,OAAOP,KAAS,EAAE;AAAA,YACzB,UAAAC;AAAA,YACA,gBAAAP;AAAA,YACA,SAAAC;AAAA,YACA,UAAAC;AAAA,YACA,aAAAC;AAAA,YACA,WAAAC;AAAA,YACA,eAAAC;AAAA,UAAA;AAAA,QAAA,EACF,CACF;AAAA,MAAA,EAAA,CACF;AAAA,IAAA;AAAA,EAAA;AAGN;"}
@@ -0,0 +1,8 @@
1
+ const e = {
2
+ "person-role-cascader-field": "_person-role-cascader-field_1gale_3",
3
+ "person-role-cascader-field-label": "_person-role-cascader-field-label_1gale_8"
4
+ };
5
+ export {
6
+ e as default
7
+ };
8
+ //# sourceMappingURL=PersonRoleCascaderField.module.scss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PersonRoleCascaderField.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,4 @@
1
+ /** 异步下拉就绪后写入默认值,避免 FormModal key 递增导致整表 remount 闪烁 */
2
+ export declare function SetFormFields({ patch }: {
3
+ patch: Record<string, string>;
4
+ }): null;
@@ -0,0 +1,14 @@
1
+ import { useEffect as f } from "react";
2
+ import { useFormApi as n } from "@kne/react-form";
3
+ function a({ patch: r }) {
4
+ const i = n(), o = Object.entries(r).filter(([, e]) => e).map(([e, t]) => `${e}=${t}`).join("&");
5
+ return f(() => {
6
+ if (!o) return;
7
+ const e = Object.entries(r).filter(([, t]) => t).map(([t, m]) => ({ name: t, value: m }));
8
+ i.emitter.emit("form:set-fields", { data: e, runValidate: !1 });
9
+ }, [i.emitter, o]), null;
10
+ }
11
+ export {
12
+ a as SetFormFields
13
+ };
14
+ //# sourceMappingURL=SetFormFields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SetFormFields.js","sources":["../../../../../src/components/Tools/ActionTracking/CreateAction/SetFormFields.tsx"],"sourcesContent":["import { useEffect } from 'react';\nimport { useFormApi } from '../../../Form';\n\ntype FormApiEmitter = {\n emit: (event: string, payload?: unknown) => void;\n};\n\n/** 异步下拉就绪后写入默认值,避免 FormModal key 递增导致整表 remount 闪烁 */\nexport function SetFormFields({ patch }: { patch: Record<string, string> }) {\n const formApi = useFormApi() as unknown as { emitter: FormApiEmitter };\n const payloadKey = Object.entries(patch)\n .filter(([, v]) => v)\n .map(([k, v]) => `${k}=${v}`)\n .join('&');\n\n useEffect(() => {\n if (!payloadKey) return;\n const data = Object.entries(patch)\n .filter(([, v]) => v)\n .map(([name, value]) => ({ name, value }));\n formApi.emitter.emit('form:set-fields', { data, runValidate: false });\n // patch 仅随 payloadKey 变化;避免对象引用导致重复 emit\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [formApi.emitter, payloadKey]);\n\n return null;\n}\n"],"names":["SetFormFields","patch","formApi","useFormApi","payloadKey","v","k","useEffect","data","name","value"],"mappings":";;AAQO,SAASA,EAAc,EAAE,OAAAC,KAA4C;AAC1E,QAAMC,IAAUC,EAAA,GACVC,IAAa,OAAO,QAAQH,CAAK,EACpC,OAAO,CAAC,CAAA,EAAGI,CAAC,MAAMA,CAAC,EACnB,IAAI,CAAC,CAACC,GAAGD,CAAC,MAAM,GAAGC,CAAC,IAAID,CAAC,EAAE,EAC3B,KAAK,GAAG;AAEX,SAAAE,EAAU,MAAM;AACd,QAAI,CAACH,EAAY;AACjB,UAAMI,IAAO,OAAO,QAAQP,CAAK,EAC9B,OAAO,CAAC,CAAA,EAAGI,CAAC,MAAMA,CAAC,EACnB,IAAI,CAAC,CAACI,GAAMC,CAAK,OAAO,EAAE,MAAAD,GAAM,OAAAC,EAAA,EAAQ;AAC3C,IAAAR,EAAQ,QAAQ,KAAK,mBAAmB,EAAE,MAAAM,GAAM,aAAa,IAAO;AAAA,EAGtE,GAAG,CAACN,EAAQ,SAASE,CAAU,CAAC,GAEzB;AACT;"}
@@ -0,0 +1,12 @@
1
+ export { default as CreateActionModal } from './CreateActionModal';
2
+ export type { CreateActionModalProps } from './CreateActionModal';
3
+ export { default as CreateActionForm, renderPersonOptionLabel, CREATE_ACTION_VARIETY_PAGE_SIZE, } from './CreateActionForm';
4
+ export type { CreateActionFormProps } from './CreateActionForm';
5
+ export { default as PersonRoleCascader } from './PersonRoleCascader';
6
+ export type { PersonRoleCascaderProps } from './PersonRoleCascader';
7
+ export { default as PersonRoleCascaderField } from './PersonRoleCascaderField';
8
+ export type { PersonRoleCascaderFieldProps } from './PersonRoleCascaderField';
9
+ export { SetFormFields } from './SetFormFields';
10
+ export { findPersonCascadePath, cascadePathStillValid } from './personCascadePath';
11
+ export { validateCreateActionPersons, createActionPersonWarnMessage, personDisplayName, addDaysYmd, } from './submitHelpers';
12
+ export type { CreateActionPrefill, CreateActionScopeLock, LockedContextField, ActionPersonCascadeOption, ActionPersonOption, CreateActionPersonCatalog, CreateActionSelectOption, CreateActionDimensionOption, CreateActionLoaders, CreateActionSelectPageQuery, CreateActionSelectPageResult, CreateActionSubmitPayload, CreateActionPersonValidateError, CreateActionPersonValidateResult, } from './types';
@@ -0,0 +1,5 @@
1
+ import { ActionPersonCascadeOption } from './types';
2
+ /** 在级联中查找 userId 对应路径 [roleCode, userId];可选 preferRole 优先该角色枝 */
3
+ export declare function findPersonCascadePath(options: ActionPersonCascadeOption[], userId: string, preferRole?: string): string[] | undefined;
4
+ /** 当前路径是否仍有效且叶子为该 userId */
5
+ export declare function cascadePathStillValid(options: ActionPersonCascadeOption[], path: string[] | undefined, userId: string): boolean;
@@ -0,0 +1,30 @@
1
+ function f(o, e, c) {
2
+ const n = String(e || "").trim();
3
+ if (!n) return;
4
+ const l = String(c || "").trim();
5
+ if (l)
6
+ for (const r of o) {
7
+ const i = String(r.value || "");
8
+ if (i === l) {
9
+ for (const t of r.children || [])
10
+ if (String(t.value || "") === n) return [i, n];
11
+ }
12
+ }
13
+ for (const r of o) {
14
+ const i = String(r.value || "");
15
+ for (const t of r.children || [])
16
+ if (String(t.value || "") === n) return [i, n];
17
+ }
18
+ }
19
+ function u(o, e, c) {
20
+ var i;
21
+ const n = String(c || "").trim();
22
+ if (!n || !e || e.length < 2 || String(e[e.length - 1] || "") !== n) return !1;
23
+ const l = String(e[0] || ""), r = o.find((t) => String(t.value || "") === l);
24
+ return !!((i = r == null ? void 0 : r.children) != null && i.some((t) => String(t.value || "") === n));
25
+ }
26
+ export {
27
+ u as cascadePathStillValid,
28
+ f as findPersonCascadePath
29
+ };
30
+ //# sourceMappingURL=personCascadePath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"personCascadePath.js","sources":["../../../../../src/components/Tools/ActionTracking/CreateAction/personCascadePath.ts"],"sourcesContent":["import type { ActionPersonCascadeOption } from './types';\n\n/** 在级联中查找 userId 对应路径 [roleCode, userId];可选 preferRole 优先该角色枝 */\nexport function findPersonCascadePath(\n options: ActionPersonCascadeOption[],\n userId: string,\n preferRole?: string,\n): string[] | undefined {\n const uid = String(userId || '').trim();\n if (!uid) return undefined;\n const prefer = String(preferRole || '').trim();\n\n if (prefer) {\n for (const role of options) {\n const roleCode = String(role.value || '');\n if (roleCode !== prefer) continue;\n for (const child of role.children || []) {\n if (String(child.value || '') === uid) return [roleCode, uid];\n }\n }\n }\n\n for (const role of options) {\n const roleCode = String(role.value || '');\n for (const child of role.children || []) {\n if (String(child.value || '') === uid) return [roleCode, uid];\n }\n }\n return undefined;\n}\n\n/** 当前路径是否仍有效且叶子为该 userId */\nexport function cascadePathStillValid(\n options: ActionPersonCascadeOption[],\n path: string[] | undefined,\n userId: string,\n): boolean {\n const uid = String(userId || '').trim();\n if (!uid || !path || path.length < 2) return false;\n if (String(path[path.length - 1] || '') !== uid) return false;\n const roleCode = String(path[0] || '');\n const role = options.find((r) => String(r.value || '') === roleCode);\n return Boolean(role?.children?.some((c) => String(c.value || '') === uid));\n}\n"],"names":["findPersonCascadePath","options","userId","preferRole","uid","prefer","role","roleCode","child","cascadePathStillValid","path","_a","r","c"],"mappings":"AAGO,SAASA,EACdC,GACAC,GACAC,GACsB;AACtB,QAAMC,IAAM,OAAOF,KAAU,EAAE,EAAE,KAAA;AACjC,MAAI,CAACE,EAAK;AACV,QAAMC,IAAS,OAAOF,KAAc,EAAE,EAAE,KAAA;AAExC,MAAIE;AACF,eAAWC,KAAQL,GAAS;AAC1B,YAAMM,IAAW,OAAOD,EAAK,SAAS,EAAE;AACxC,UAAIC,MAAaF;AACjB,mBAAWG,KAASF,EAAK,YAAY,CAAA;AACnC,cAAI,OAAOE,EAAM,SAAS,EAAE,MAAMJ,EAAK,QAAO,CAACG,GAAUH,CAAG;AAAA;AAAA,IAEhE;AAGF,aAAWE,KAAQL,GAAS;AAC1B,UAAMM,IAAW,OAAOD,EAAK,SAAS,EAAE;AACxC,eAAWE,KAASF,EAAK,YAAY,CAAA;AACnC,UAAI,OAAOE,EAAM,SAAS,EAAE,MAAMJ,EAAK,QAAO,CAACG,GAAUH,CAAG;AAAA,EAEhE;AAEF;AAGO,SAASK,EACdR,GACAS,GACAR,GACS;AAjCJ,MAAAS;AAkCL,QAAMP,IAAM,OAAOF,KAAU,EAAE,EAAE,KAAA;AAEjC,MADI,CAACE,KAAO,CAACM,KAAQA,EAAK,SAAS,KAC/B,OAAOA,EAAKA,EAAK,SAAS,CAAC,KAAK,EAAE,MAAMN,EAAK,QAAO;AACxD,QAAMG,IAAW,OAAOG,EAAK,CAAC,KAAK,EAAE,GAC/BJ,IAAOL,EAAQ,KAAK,CAACW,MAAM,OAAOA,EAAE,SAAS,EAAE,MAAML,CAAQ;AACnE,SAAO,IAAQI,IAAAL,KAAA,gBAAAA,EAAM,aAAN,QAAAK,EAAgB,KAAK,CAACE,MAAM,OAAOA,EAAE,SAAS,EAAE,MAAMT;AACvE;"}
@@ -0,0 +1,8 @@
1
+ import { ActionPersonOption, CreateActionPersonValidateResult } from './types';
2
+ /** 提交前校验分配人/执行人(纯函数,供 Modal 与 vitest) */
3
+ export declare function validateCreateActionPersons(allocatorUserId: string, assigneeUserId: string, allocatorOptions: ActionPersonOption[], assigneeOptions: ActionPersonOption[]): CreateActionPersonValidateResult;
4
+ export declare function createActionPersonWarnMessage(code: Extract<CreateActionPersonValidateResult, {
5
+ ok: false;
6
+ }>['code']): string;
7
+ export declare function personDisplayName(opt: ActionPersonOption | undefined, userId: string): string;
8
+ export declare function addDaysYmd(days: number, from?: Date): string;
@@ -0,0 +1,35 @@
1
+ const c = {
2
+ missing_allocator: "请选择分配人",
3
+ invalid_allocator: "分配人无效,请从角色级联中重新选择",
4
+ missing_assignee: "请选择执行人",
5
+ invalid_assignee: "执行人无效,请从角色级联中重新选择"
6
+ };
7
+ function d(e, a, n, r) {
8
+ const t = String(e || "").trim();
9
+ if (!t) return { ok: !1, code: "missing_allocator" };
10
+ const i = n.find((s) => s.value === t);
11
+ if (!i) return { ok: !1, code: "invalid_allocator" };
12
+ const o = String(a || "").trim();
13
+ if (!o) return { ok: !1, code: "missing_assignee" };
14
+ const l = r.find((s) => s.value === o);
15
+ return l ? { ok: !0, allocator: i, assignee: l } : { ok: !1, code: "invalid_assignee" };
16
+ }
17
+ function g(e) {
18
+ return c[e];
19
+ }
20
+ function f(e, a) {
21
+ return e ? e.displayName ? e.displayName : typeof e.label == "string" && e.label.trim() ? e.label : a : a;
22
+ }
23
+ function u(e, a = /* @__PURE__ */ new Date()) {
24
+ const n = new Date(a);
25
+ n.setDate(n.getDate() + e);
26
+ const r = n.getFullYear(), t = String(n.getMonth() + 1).padStart(2, "0"), i = String(n.getDate()).padStart(2, "0");
27
+ return `${r}-${t}-${i}`;
28
+ }
29
+ export {
30
+ u as addDaysYmd,
31
+ g as createActionPersonWarnMessage,
32
+ f as personDisplayName,
33
+ d as validateCreateActionPersons
34
+ };
35
+ //# sourceMappingURL=submitHelpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submitHelpers.js","sources":["../../../../../src/components/Tools/ActionTracking/CreateAction/submitHelpers.ts"],"sourcesContent":["import type { ActionPersonOption, CreateActionPersonValidateResult } from './types';\n\nconst WARN: Record<\n NonNullable<Extract<CreateActionPersonValidateResult, { ok: false }>['code']>,\n string\n> = {\n missing_allocator: '请选择分配人',\n invalid_allocator: '分配人无效,请从角色级联中重新选择',\n missing_assignee: '请选择执行人',\n invalid_assignee: '执行人无效,请从角色级联中重新选择',\n};\n\n/** 提交前校验分配人/执行人(纯函数,供 Modal 与 vitest) */\nexport function validateCreateActionPersons(\n allocatorUserId: string,\n assigneeUserId: string,\n allocatorOptions: ActionPersonOption[],\n assigneeOptions: ActionPersonOption[],\n): CreateActionPersonValidateResult {\n const allocatorId = String(allocatorUserId || '').trim();\n if (!allocatorId) return { ok: false, code: 'missing_allocator' };\n const allocator = allocatorOptions.find((o) => o.value === allocatorId);\n if (!allocator) return { ok: false, code: 'invalid_allocator' };\n\n const assigneeId = String(assigneeUserId || '').trim();\n if (!assigneeId) return { ok: false, code: 'missing_assignee' };\n const assignee = assigneeOptions.find((o) => o.value === assigneeId);\n if (!assignee) return { ok: false, code: 'invalid_assignee' };\n\n return { ok: true, allocator, assignee };\n}\n\nexport function createActionPersonWarnMessage(\n code: Extract<CreateActionPersonValidateResult, { ok: false }>['code'],\n): string {\n return WARN[code];\n}\n\nexport function personDisplayName(opt: ActionPersonOption | undefined, userId: string): string {\n if (!opt) return userId;\n if (opt.displayName) return opt.displayName;\n if (typeof opt.label === 'string' && opt.label.trim()) return opt.label;\n return userId;\n}\n\nexport function addDaysYmd(days: number, from: Date = new Date()): string {\n const d = new Date(from);\n d.setDate(d.getDate() + days);\n const y = d.getFullYear();\n const m = String(d.getMonth() + 1).padStart(2, '0');\n const day = String(d.getDate()).padStart(2, '0');\n return `${y}-${m}-${day}`;\n}\n"],"names":["WARN","validateCreateActionPersons","allocatorUserId","assigneeUserId","allocatorOptions","assigneeOptions","allocatorId","allocator","o","assigneeId","assignee","createActionPersonWarnMessage","code","personDisplayName","opt","userId","addDaysYmd","days","from","d","y","m","day"],"mappings":"AAEA,MAAMA,IAGF;AAAA,EACF,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,kBAAkB;AACpB;AAGO,SAASC,EACdC,GACAC,GACAC,GACAC,GACkC;AAClC,QAAMC,IAAc,OAAOJ,KAAmB,EAAE,EAAE,KAAA;AAClD,MAAI,CAACI,EAAa,QAAO,EAAE,IAAI,IAAO,MAAM,oBAAA;AAC5C,QAAMC,IAAYH,EAAiB,KAAK,CAACI,MAAMA,EAAE,UAAUF,CAAW;AACtE,MAAI,CAACC,EAAW,QAAO,EAAE,IAAI,IAAO,MAAM,oBAAA;AAE1C,QAAME,IAAa,OAAON,KAAkB,EAAE,EAAE,KAAA;AAChD,MAAI,CAACM,EAAY,QAAO,EAAE,IAAI,IAAO,MAAM,mBAAA;AAC3C,QAAMC,IAAWL,EAAgB,KAAK,CAACG,MAAMA,EAAE,UAAUC,CAAU;AACnE,SAAKC,IAEE,EAAE,IAAI,IAAM,WAAAH,GAAW,UAAAG,EAAA,IAFR,EAAE,IAAI,IAAO,MAAM,mBAAA;AAG3C;AAEO,SAASC,EACdC,GACQ;AACR,SAAOZ,EAAKY,CAAI;AAClB;AAEO,SAASC,EAAkBC,GAAqCC,GAAwB;AAC7F,SAAKD,IACDA,EAAI,cAAoBA,EAAI,cAC5B,OAAOA,EAAI,SAAU,YAAYA,EAAI,MAAM,KAAA,IAAeA,EAAI,QAC3DC,IAHUA;AAInB;AAEO,SAASC,EAAWC,GAAcC,IAAa,oBAAI,QAAgB;AACxE,QAAMC,IAAI,IAAI,KAAKD,CAAI;AACvB,EAAAC,EAAE,QAAQA,EAAE,QAAA,IAAYF,CAAI;AAC5B,QAAMG,IAAID,EAAE,YAAA,GACNE,IAAI,OAAOF,EAAE,SAAA,IAAa,CAAC,EAAE,SAAS,GAAG,GAAG,GAC5CG,IAAM,OAAOH,EAAE,QAAA,CAAS,EAAE,SAAS,GAAG,GAAG;AAC/C,SAAO,GAAGC,CAAC,IAAIC,CAAC,IAAIC,CAAG;AACzB;"}