@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.
- package/dist/components/Filter/createKneFilterField.js +55 -53
- package/dist/components/Filter/createKneFilterField.js.map +1 -1
- package/dist/components/Form/SuperSelect.d.ts +1 -0
- package/dist/components/Form/SuperSelect.js +67 -58
- package/dist/components/Form/SuperSelect.js.map +1 -1
- package/dist/components/Form/createPagedSuperSelectApi.d.ts +60 -0
- package/dist/components/Form/createPagedSuperSelectApi.js +46 -0
- package/dist/components/Form/createPagedSuperSelectApi.js.map +1 -0
- package/dist/components/Form/index.d.ts +3 -0
- package/dist/components/Form/superSelectEmpty.d.ts +5 -0
- package/dist/components/Form/superSelectEmpty.js +11 -0
- package/dist/components/Form/superSelectEmpty.js.map +1 -0
- package/dist/components/FormInfo/fields.d.ts +2 -0
- package/dist/components/FormInfo/fields.js.map +1 -1
- package/dist/components/FormInfo/index.d.ts +2 -2
- package/dist/components/ReactFilter/fields/index.js +35 -27
- package/dist/components/ReactFilter/fields/index.js.map +1 -1
- package/dist/components/Tools/ActionTracking/Cancel/CancelExecutionModal.d.ts +20 -0
- package/dist/components/Tools/ActionTracking/Cancel/CancelExecutionModal.js +82 -0
- package/dist/components/Tools/ActionTracking/Cancel/CancelExecutionModal.js.map +1 -0
- package/dist/components/Tools/ActionTracking/Cancel/CancelExecutionModal.module.scss.js +7 -0
- package/dist/components/Tools/ActionTracking/Cancel/CancelExecutionModal.module.scss.js.map +1 -0
- package/dist/components/Tools/ActionTracking/Cancel/index.d.ts +3 -0
- package/dist/components/Tools/ActionTracking/CreateAction/CreateActionForm.d.ts +25 -0
- package/dist/components/Tools/ActionTracking/CreateAction/CreateActionForm.js +257 -0
- package/dist/components/Tools/ActionTracking/CreateAction/CreateActionForm.js.map +1 -0
- package/dist/components/Tools/ActionTracking/CreateAction/CreateActionForm.module.scss.js +10 -0
- package/dist/components/Tools/ActionTracking/CreateAction/CreateActionForm.module.scss.js.map +1 -0
- package/dist/components/Tools/ActionTracking/CreateAction/CreateActionModal.d.ts +47 -0
- package/dist/components/Tools/ActionTracking/CreateAction/CreateActionModal.js +148 -0
- package/dist/components/Tools/ActionTracking/CreateAction/CreateActionModal.js.map +1 -0
- package/dist/components/Tools/ActionTracking/CreateAction/CreateActionModal.module.scss.js +7 -0
- package/dist/components/Tools/ActionTracking/CreateAction/CreateActionModal.module.scss.js.map +1 -0
- package/dist/components/Tools/ActionTracking/CreateAction/PersonRoleCascader.d.ts +18 -0
- package/dist/components/Tools/ActionTracking/CreateAction/PersonRoleCascader.js +73 -0
- package/dist/components/Tools/ActionTracking/CreateAction/PersonRoleCascader.js.map +1 -0
- package/dist/components/Tools/ActionTracking/CreateAction/PersonRoleCascader.module.scss.js +5 -0
- package/dist/components/Tools/ActionTracking/CreateAction/PersonRoleCascader.module.scss.js.map +1 -0
- package/dist/components/Tools/ActionTracking/CreateAction/PersonRoleCascaderField.d.ts +19 -0
- package/dist/components/Tools/ActionTracking/CreateAction/PersonRoleCascaderField.js +62 -0
- package/dist/components/Tools/ActionTracking/CreateAction/PersonRoleCascaderField.js.map +1 -0
- package/dist/components/Tools/ActionTracking/CreateAction/PersonRoleCascaderField.module.scss.js +8 -0
- package/dist/components/Tools/ActionTracking/CreateAction/PersonRoleCascaderField.module.scss.js.map +1 -0
- package/dist/components/Tools/ActionTracking/CreateAction/SetFormFields.d.ts +4 -0
- package/dist/components/Tools/ActionTracking/CreateAction/SetFormFields.js +14 -0
- package/dist/components/Tools/ActionTracking/CreateAction/SetFormFields.js.map +1 -0
- package/dist/components/Tools/ActionTracking/CreateAction/index.d.ts +12 -0
- package/dist/components/Tools/ActionTracking/CreateAction/personCascadePath.d.ts +5 -0
- package/dist/components/Tools/ActionTracking/CreateAction/personCascadePath.js +30 -0
- package/dist/components/Tools/ActionTracking/CreateAction/personCascadePath.js.map +1 -0
- package/dist/components/Tools/ActionTracking/CreateAction/submitHelpers.d.ts +8 -0
- package/dist/components/Tools/ActionTracking/CreateAction/submitHelpers.js +35 -0
- package/dist/components/Tools/ActionTracking/CreateAction/submitHelpers.js.map +1 -0
- package/dist/components/Tools/ActionTracking/CreateAction/types.d.ts +108 -0
- package/dist/components/Tools/ActionTracking/Follow/ActionFollowModal.d.ts +27 -0
- package/dist/components/Tools/ActionTracking/Follow/ActionFollowModal.js +107 -0
- package/dist/components/Tools/ActionTracking/Follow/ActionFollowModal.js.map +1 -0
- package/dist/components/Tools/ActionTracking/Follow/ActionFollowModal.module.scss.js +11 -0
- package/dist/components/Tools/ActionTracking/Follow/ActionFollowModal.module.scss.js.map +1 -0
- package/dist/components/Tools/ActionTracking/Follow/index.d.ts +3 -0
- package/dist/components/Tools/ActionTracking/List/ActionFilterBar.d.ts +23 -0
- package/dist/components/Tools/ActionTracking/List/ActionFilterBar.js +31 -0
- package/dist/components/Tools/ActionTracking/List/ActionFilterBar.js.map +1 -0
- package/dist/components/Tools/ActionTracking/List/ActionFilterBar.module.scss.js +8 -0
- package/dist/components/Tools/ActionTracking/List/ActionFilterBar.module.scss.js.map +1 -0
- package/dist/components/Tools/ActionTracking/List/ActionListTable.d.ts +29 -0
- package/dist/components/Tools/ActionTracking/List/ActionListTable.js +76 -0
- package/dist/components/Tools/ActionTracking/List/ActionListTable.js.map +1 -0
- package/dist/components/Tools/ActionTracking/List/ActionListTable.module.scss.js +8 -0
- package/dist/components/Tools/ActionTracking/List/ActionListTable.module.scss.js.map +1 -0
- package/dist/components/Tools/ActionTracking/List/filterDefaults.d.ts +15 -0
- package/dist/components/Tools/ActionTracking/List/filterDefaults.js +27 -0
- package/dist/components/Tools/ActionTracking/List/filterDefaults.js.map +1 -0
- package/dist/components/Tools/ActionTracking/List/index.d.ts +6 -0
- package/dist/components/Tools/ActionTracking/List/listTypes.d.ts +49 -0
- package/dist/components/Tools/ActionTracking/{ActionTrackingShell.d.ts → Shell/ActionTrackingShell.d.ts} +1 -1
- package/dist/components/Tools/ActionTracking/{ActionTrackingShell.js → Shell/ActionTrackingShell.js} +1 -1
- package/dist/components/Tools/ActionTracking/Shell/ActionTrackingShell.js.map +1 -0
- package/dist/components/Tools/ActionTracking/Shell/index.d.ts +3 -0
- package/dist/components/Tools/ActionTracking/index.d.ts +11 -2
- package/dist/components/Tools/ActionTracking/utils/index.d.ts +1 -0
- package/dist/components/Tools/ActionTracking/utils/sanitizeActionHtml.d.ts +2 -0
- package/dist/components/Tools/index.d.ts +2 -0
- package/dist/form-info.d.ts +3 -0
- package/dist/form-info.js +80 -72
- package/dist/form-info.js.map +1 -1
- package/dist/index.js +855 -811
- package/dist/index.js.map +1 -1
- package/dist/marsun-components-core.css +2 -2
- package/dist/styles/global.css +2 -2
- package/package.json +1 -1
- package/dist/components/Tools/ActionTracking/ActionTrackingShell.js.map +0 -1
- /package/dist/components/Tools/ActionTracking/{style.module.scss.js → Shell/style.module.scss.js} +0 -0
- /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":";;;;;;;;AAkEA,MAAMA,KAAsD,CAAC;AAAA,EAC3D,MAAAC;AAAA,EACA,SAAAC;AAAA,EACA,WAAAC;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,SAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,eAAAC;AAAA,EACA,cAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,OAAOC;AAAA,EACP,QAAQC;AAAA,EACR,kBAAAC;AAAA,EACA,SAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,UAAAC;AAAA,EACA,sBAAAC;AAAA,EACA,eAAAC,IAAgB;AAAA,EAChB,gBAAAC,IAAiB;AAAA,EACjB,OAAAC,IAAQ;AAAA,EACR,QAAAC,IAAS;AACX,MAAM;;AACJ,QAAM,CAACC,GAAQC,CAAS,IAAIC,GAAS,EAAK,GACpCC,IAAkBC,EAA6B,EAAE,GACjDC,IAAmBD,EAA6B,EAAE,GAClDE,IAAyBC,EAAY,CAACC,MAA+B;AACzE,IAAAL,EAAgB,UAAUK;AAAA,EAC5B,GAAG,CAAA,CAAE,GACCC,IAA0BF,EAAY,CAACC,MAA+B;AAC1E,IAAAH,EAAiB,UAAUG;AAAA,EAC7B,GAAG,CAAA,CAAE,GAECE,IAAa7B,MAAY,YACzB8B,IAAY,GAAQ3B,KAAiBA,EAAc,SAAS,IAC5D4B,MAAeC,IAAA/B,KAAA,gBAAAA,EAAS,YAAT,gBAAA+B,EAAkB,WAAU,IAC3CC,MAAeC,IAAAjC,KAAA,gBAAAA,EAAS,YAAT,gBAAAiC,EAAkB,WAAU,IAC3CC,MAAcC,IAAAnC,KAAA,gBAAAA,EAAS,WAAT,gBAAAmC,EAAiB,WAAU,IACzCC,IACJ,CAACP,MACAD,KAAc3B,MACf,GAAQ6B,KAAgBE,KAAgBE,IAEpCG,KAAa/B,MAAcsB,IAAa,SAAS,WACjDU,KAAS/B,MAAeqB,IAAa,OAAO,OAE5CW,KAAkBC,GAAQ,MAAM;;AACpC,UAAMC,IAAuC,CAAA;AAC7C,YAACvC,KAAiB,CAAA,GAAI,QAAQ,CAACwC,GAAOC,MAAQ;AAC5C,MAAAF,EAAa,iBAAiBE,CAAG,EAAE,IAAID,EAAM;AAAA,IAC/C,CAAC,GACM;AAAA,MACL,SAAOX,IAAA/B,KAAA,gBAAAA,EAAS,UAAT,gBAAA+B,EAAgB,WAAU;AAAA,MACjC,aAAWE,IAAAjC,KAAA,gBAAAA,EAAS,cAAT,gBAAAiC,EAAoB,aAAUE,IAAA3B,EAAiB,CAAC,MAAlB,gBAAA2B,EAAqB,UAAS;AAAA,MACvE,QAAQrB;AAAA,MACR,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,MAChB,SAAS8B,GAAW7B,CAAc;AAAA,MAClC,SAASe;AAAA,MACT,SAASD,IAAY,KAAKG;AAAA,MAC1B,QAAQH,IAAY,KAAKK;AAAA,MACzB,GAAGO;AAAA,IAAA;AAAA,EAEP,GAAG;AAAA,IACDvC;AAAA,IACA4B;AAAA,IACAE;AAAA,IACAE;AAAA,IACAL;AAAA,IACA7B,KAAA,gBAAAA,EAAS;AAAA,IACTA,KAAA,gBAAAA,EAAS;AAAA,IACTQ;AAAA,IACAM;AAAA,IACAC;AAAA,EAAA,CACD,GAEK8B,KAAe,OAAOC,MAAsC;;AAChE,UAAMC,IAAUC;AAAA,MACd,OAAOF,EAAS,mBAAmB,EAAE;AAAA,MACrC,OAAOA,EAAS,kBAAkB,EAAE;AAAA,MACpCvB,EAAiB;AAAA,MACjBF,EAAgB;AAAA,IAAA;AAElB,QAAI,CAAC0B,EAAQ;AACX,YAAAE,EAAQ,QAAQC,GAA8BH,EAAQ,IAAI,CAAC,GACrD,IAAI,MAAMA,EAAQ,IAAI;AAG9B,UAAM,EAAE,WAAWI,GAAc,UAAUC,MAAgBL,GACrDM,IAAkBF,EAAa,OAC/BG,IAAiBF,EAAY;AACnC,IAAAvC,KAAA,QAAAA,EAAuBwC,IAEvBlC,EAAU,EAAI;AACd,QAAI;AACF,YAAMoC,IAAM,OAAOT,EAAS,WAAW,EAAE,EAAE,KAAA,GACrCU,IAAWC,EAAkBL,GAAaE,CAAc,GACxDI,KAAYD,EAAkBN,GAAcE,CAAe,GAC3DM,IAAU9B,IAAYC,IAAe,OAAOgB,EAAS,WAAW,EAAE,EAAE,KAAA,GACpEc,IAAU/B,IAAY,KAAK,OAAOiB,EAAS,WAAW,EAAE,EAAE,KAAA,GAC1De,IAAShC,IAAY,KAAK,OAAOiB,EAAS,UAAU,EAAE,EAAE,KAAA,GACxDgB,KAAQ,OAAOhB,EAAS,SAAS,EAAE,EAAE,KAAA,GACrCiB,KACJ,OAAOjB,EAAS,aAAa,EAAE,EAAE,UACjC,QAAO9C,KAAA,gBAAAA,EAAS,cAAa,EAAE,EAAE,KAAA,OACjC+B,IAAAvB,EAAiB,CAAC,MAAlB,gBAAAuB,EAAqB,UACrB,IACIiC,KAAanC,KACd3B,KAAiB,CAAA,GACf,IAAI,CAAC+D,OAAMA,GAAE,KAAK,EAClB,OAAO,OAAO,EACd,KAAK,KAAK,IACb,CAACN,GAASC,GAASC,CAAM,EAAE,OAAO,OAAO,EAAE,KAAK,KAAK,GAEnDK,KAAqC;AAAA,QACzC,OAAAJ;AAAA,QACA,WAAAC;AAAA,QACA,QAAQ,OAAOjB,EAAS,UAAUhC,CAAa;AAAA,QAC/C,UAAA0C;AAAA,QACA,gBAAAF;AAAA,QACA,WAAAI;AAAA,QACA,iBAAAL;AAAA,QACA,OAAOG;AAAA,QACP,SAASD,KAAO;AAAA,QAChB,SAAAI;AAAA,QACA,SAAAC;AAAA,QACA,QAAAC;AAAA,QACA,cAAa7D,KAAA,gBAAAA,EAAS,gBAAe;AAAA,QACrC,aAAa2D,KAAW;AAAA,QACxB,cAAcE,KAAU;AAAA,QACxB,YAAAG;AAAA,MAAA,GAGIG,KAAW,MAAMvD,EAASsD,EAAO;AACvC,MAAAjB,EAAQ,QAAQrB,IAAa,UAAU,SAAS,GAChD9B,EAAUqE,EAAQ;AAAA,IACpB,SAASC,GAAK;AACZ,YAAMC,IAAOD,aAAe,QAAQA,EAAI,UAAU;AAClD,YACEC,MAAS,uBACTA,MAAS,uBACTA,MAAS,sBACTA,MAAS,sBAIXpB,EAAQ,MAAMmB,aAAe,QAAQA,EAAI,UAAU,MAAM,GACnDA;AAAA,IACR,UAAA;AACE,MAAAjD,EAAU,EAAK;AAAA,IACjB;AAAA,EACF;AAEA,SACE,gBAAAmD;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,WAAWC,GAAW,uBAAuBC,GAAO,qBAAqB,CAAC;AAAA,MAC1E,OAAOpC;AAAA,MACP,MAAAzC;AAAA,MACA,UAAUC;AAAA,MACV,WAAS;AAAA,MACT,QAAAyC;AAAA,MACA,OAAAtB;AAAA,MACA,QAAAC;AAAA,MACA,iBAAe;AAAA,MACf,eAAe,EAAE,SAASC,EAAA;AAAA,MAC1B,WAAW;AAAA,QACT,MAAMqB;AAAA,QACN,UAAUM;AAAA,MAAA;AAAA,MAGZ,UAAA,gBAAAyB;AAAA,QAACI;AAAA,QAAA;AAAA,UACC,wBAAAlD;AAAA,UACA,yBAAAG;AAAA,UACA,eAAeE,IAAY3B,IAAgB;AAAA,UAC3C,cAAc2B,IAAY,SAAY1B;AAAA,UACtC,kBAAAC;AAAA,UACA,mBAAAC;AAAA,UACA,kBAAAG;AAAA,UACA,SAAAC;AAAA,UACA,mBAAAC;AAAA,UACA,oBAAAC;AAAA,UACA,WACEyB,IACI;AAAA,YACE,SAASN,KAAgB;AAAA,YACzB,SAASE,KAAgB;AAAA,YACzB,QAAQE,KAAe;AAAA,UAAA,IAEzB;AAAA,QAAA;AAAA,MAAA;AAAA,IAER;AAAA,EAAA;AAGN;"}
|
package/dist/components/Tools/ActionTracking/CreateAction/CreateActionModal.module.scss.js.map
ADDED
|
@@ -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;"}
|
package/dist/components/Tools/ActionTracking/CreateAction/PersonRoleCascader.module.scss.js.map
ADDED
|
@@ -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;"}
|
package/dist/components/Tools/ActionTracking/CreateAction/PersonRoleCascaderField.module.scss.js
ADDED
|
@@ -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
|
package/dist/components/Tools/ActionTracking/CreateAction/PersonRoleCascaderField.module.scss.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PersonRoleCascaderField.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
|
@@ -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;"}
|