sy-form-components 0.2.3 → 0.2.5

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/index.mjs CHANGED
@@ -4331,26 +4331,79 @@ var TASK_STATUS_META = {
4331
4331
  };
4332
4332
 
4333
4333
  // src/core/processApi.ts
4334
+ var normalizeProcessTask = (value) => {
4335
+ const taskId = value?.taskId ?? value?.id ?? value?.task_id ?? "";
4336
+ return {
4337
+ ...value,
4338
+ id: value?.id ?? taskId,
4339
+ taskId,
4340
+ nodeId: value?.nodeId ?? value?.node_id ?? "",
4341
+ nodeType: value?.nodeType ?? value?.node_type ?? "approval",
4342
+ nodeName: value?.nodeName ?? value?.title ?? value?.name ?? value?.nodeId ?? "\u5BA1\u6279\u8282\u70B9",
4343
+ status: value?.status ?? "pending",
4344
+ assigneeId: value?.assigneeId ?? value?.assignee
4345
+ };
4346
+ };
4347
+ var normalizeProcessTasks = (value) => {
4348
+ if (Array.isArray(value)) return value.map(normalizeProcessTask);
4349
+ if (!value || typeof value !== "object") return [];
4350
+ if (Array.isArray(value.tasks)) return value.tasks.map(normalizeProcessTask);
4351
+ if (Array.isArray(value.currentTasks)) return value.currentTasks.map(normalizeProcessTask);
4352
+ if (Array.isArray(value.list)) return value.list.map(normalizeProcessTask);
4353
+ if (Array.isArray(value.items)) return value.items.map(normalizeProcessTask);
4354
+ if (Array.isArray(value.records)) return value.records.map(normalizeProcessTask);
4355
+ return [];
4356
+ };
4357
+ var normalizeProcessBasic = (value) => {
4358
+ const raw = value ?? {};
4359
+ const instance = raw.instance ?? raw;
4360
+ const currentTask = raw.currentTask ? normalizeProcessTask(raw.currentTask) : void 0;
4361
+ return {
4362
+ ...raw,
4363
+ instanceId: raw.instanceId ?? raw.id ?? instance.formInstanceId ?? instance.id,
4364
+ processStatus: raw.processStatus ?? raw.status ?? instance.processStatus ?? instance.status,
4365
+ formUuid: raw.formUuid ?? instance.formUuid ?? instance.definition?.formUuid,
4366
+ appType: raw.appType ?? instance.appType ?? instance.definition?.appType,
4367
+ title: raw.title ?? instance.title,
4368
+ originatorId: raw.originatorId ?? instance.originatorId ?? instance.startedBy,
4369
+ originatorName: raw.originatorName ?? instance.originatorName ?? instance.startedByName,
4370
+ originatorDepartment: raw.originatorDepartment ?? instance.originatorDepartment ?? instance.startedDepartmentName,
4371
+ createdAt: raw.createdAt ?? instance.createdAt ?? instance.startedAt,
4372
+ currentTask
4373
+ };
4374
+ };
4375
+ var normalizeApprovalPermission = (value) => {
4376
+ const raw = value ?? {};
4377
+ const currentTasks = normalizeProcessTasks(raw.currentTasks);
4378
+ const hasPermission = Boolean(raw.hasPermission ?? raw.isApprover ?? currentTasks.length > 0);
4379
+ return {
4380
+ ...raw,
4381
+ hasPermission,
4382
+ isApprover: Boolean(raw.isApprover ?? hasPermission),
4383
+ canUndo: Boolean(raw.canUndo ?? raw.canWithdraw),
4384
+ currentTasks
4385
+ };
4386
+ };
4334
4387
  async function getProcessBasic(request, formInstId) {
4335
4388
  const response = await request({
4336
4389
  url: `/workflow/instance/${formInstId}/basic`,
4337
4390
  method: "get"
4338
4391
  });
4339
- return response.data || response.result;
4392
+ return normalizeProcessBasic(response.data || response.result);
4340
4393
  }
4341
4394
  async function getProcessProgress(request, formInstId) {
4342
4395
  const response = await request({
4343
- url: `/workflow/instance/${formInstId}`,
4396
+ url: `/workflow/instance/${formInstId}/all-tasks`,
4344
4397
  method: "get"
4345
4398
  });
4346
- return response.data || response.result || [];
4399
+ return normalizeProcessTasks(response.data || response.result);
4347
4400
  }
4348
4401
  async function checkUserApproval(request, formInstId) {
4349
4402
  const response = await request({
4350
4403
  url: `/workflow/instance/${formInstId}/permission`,
4351
4404
  method: "get"
4352
4405
  });
4353
- return response.data || response.result;
4406
+ return normalizeApprovalPermission(response.data || response.result);
4354
4407
  }
4355
4408
  async function handleApproval(request, params) {
4356
4409
  const response = await request({
@@ -5134,7 +5187,23 @@ function useFormDetail(options) {
5134
5187
  }
5135
5188
 
5136
5189
  // src/hooks/useProcessDetail.ts
5137
- import { useState as useState21, useEffect as useEffect28, useCallback as useCallback8, useRef as useRef8 } from "react";
5190
+ import { useState as useState21, useEffect as useEffect28, useCallback as useCallback8, useRef as useRef8, useMemo as useMemo8 } from "react";
5191
+ var DEFAULT_APPROVAL_ACTIONS = [
5192
+ { action: "agree", name: { zh_CN: "\u540C\u610F" } },
5193
+ { action: "rejected", name: { zh_CN: "\u62D2\u7EDD" } }
5194
+ ];
5195
+ var WITHDRAW_ACTION = { action: "withdraw", name: { zh_CN: "\u64A4\u9500" } };
5196
+ function mergeCurrentTask(processTask, approvalTask) {
5197
+ if (!approvalTask) return processTask ?? null;
5198
+ if (!processTask) return approvalTask;
5199
+ return {
5200
+ ...processTask,
5201
+ ...approvalTask,
5202
+ nodeName: processTask.nodeName || approvalTask.nodeName,
5203
+ title: processTask.title || approvalTask.title,
5204
+ actions: processTask.actions ?? approvalTask.actions
5205
+ };
5206
+ }
5138
5207
  function useProcessDetail(options) {
5139
5208
  const { formUuid, appType, formInstanceId, fieldIds } = options;
5140
5209
  const { api } = useFormContext();
@@ -5147,6 +5216,7 @@ function useProcessDetail(options) {
5147
5216
  const [instanceInfo, setInstanceInfo] = useState21(null);
5148
5217
  const [isApprover, setIsApprover] = useState21(false);
5149
5218
  const [canWithdraw, setCanWithdraw] = useState21(false);
5219
+ const [approvalTasks, setApprovalTasks] = useState21([]);
5150
5220
  const [permissions, setPermissions] = useState21(null);
5151
5221
  const [processDefinition, setProcessDefinition] = useState21(null);
5152
5222
  const mountedRef = useRef8(true);
@@ -5156,7 +5226,10 @@ function useProcessDetail(options) {
5156
5226
  mountedRef.current = false;
5157
5227
  };
5158
5228
  }, []);
5159
- const currentTask = processInfo?.currentTask ?? null;
5229
+ const currentTask = useMemo8(
5230
+ () => mergeCurrentTask(processInfo?.currentTask, approvalTasks[0]),
5231
+ [processInfo?.currentTask, approvalTasks]
5232
+ );
5160
5233
  const processStatus = processInfo?.processStatus ?? null;
5161
5234
  const isOriginatorReturn = currentTask?.nodeType === "originator_return";
5162
5235
  const isProcessCompleted = processStatus === "completed" || processStatus === "terminated";
@@ -5167,7 +5240,14 @@ function useProcessDetail(options) {
5167
5240
  isApprover,
5168
5241
  mode
5169
5242
  });
5170
- const activeActions = isApprover && currentTask?.actions ? currentTask.actions : [];
5243
+ const activeActions = useMemo8(() => {
5244
+ if (!isApprover) return [];
5245
+ const actions = currentTask?.actions && currentTask.actions.length > 0 ? [...currentTask.actions] : [...DEFAULT_APPROVAL_ACTIONS];
5246
+ if (canWithdraw && !actions.some((action) => action.action === "withdraw")) {
5247
+ actions.push(WITHDRAW_ACTION);
5248
+ }
5249
+ return actions;
5250
+ }, [isApprover, currentTask?.actions, canWithdraw]);
5171
5251
  const loadData = useCallback8(async () => {
5172
5252
  if (!mountedRef.current) return;
5173
5253
  setLoading(true);
@@ -5182,6 +5262,7 @@ function useProcessDetail(options) {
5182
5262
  setProcessInfo(basicResult);
5183
5263
  setIsApprover(approvalResult?.isApprover ?? false);
5184
5264
  setCanWithdraw(approvalResult?.canUndo ?? false);
5265
+ setApprovalTasks(approvalResult?.currentTasks ?? []);
5185
5266
  setPermissions(permResult);
5186
5267
  setInstanceInfo(formResult);
5187
5268
  setFormData(extractFormValues(formResult, fieldIds));
@@ -5212,6 +5293,7 @@ function useProcessDetail(options) {
5212
5293
  setProcessInfo(null);
5213
5294
  setFormData(null);
5214
5295
  setInstanceInfo(null);
5296
+ setApprovalTasks([]);
5215
5297
  }
5216
5298
  } finally {
5217
5299
  if (mountedRef.current) {
@@ -5937,15 +6019,17 @@ var ApprovalTimeline = ({
5937
6019
  showRemarks = true,
5938
6020
  compactMode = false
5939
6021
  }) => {
5940
- if (!tasks || tasks.length === 0) {
6022
+ const taskList = Array.isArray(tasks) ? tasks : [];
6023
+ if (taskList.length === 0) {
5941
6024
  return /* @__PURE__ */ jsx77("div", { className: `bg-white rounded-xl shadow-sm border border-gray-100 p-6 ${className}`, children: /* @__PURE__ */ jsx77("p", { className: "text-sm text-gray-400 text-center", children: "\u6682\u65E0\u5BA1\u6279\u8BB0\u5F55" }) });
5942
6025
  }
5943
- return /* @__PURE__ */ jsx77("div", { className: `${className}`, children: tasks.map((task, index) => {
6026
+ return /* @__PURE__ */ jsx77("div", { className: `${className}`, children: taskList.map((task, index) => {
6027
+ const taskKey = task.taskId || task.id || `${task.nodeId}-${index}`;
5944
6028
  if (renderNode) {
5945
- return /* @__PURE__ */ jsx77("div", { children: renderNode(task, index) }, task.taskId);
6029
+ return /* @__PURE__ */ jsx77("div", { children: renderNode(task, index) }, taskKey);
5946
6030
  }
5947
6031
  const phase = getNodePhase(task);
5948
- const isLast = index === tasks.length - 1;
6032
+ const isLast = index === taskList.length - 1;
5949
6033
  const statusMeta = TASK_STATUS_META[task.status];
5950
6034
  return /* @__PURE__ */ jsxs23("div", { className: "flex gap-4", children: [
5951
6035
  /* @__PURE__ */ jsxs23("div", { className: "flex flex-col items-center", children: [
@@ -5999,7 +6083,7 @@ var ApprovalTimeline = ({
5999
6083
  ]
6000
6084
  }
6001
6085
  ) })
6002
- ] }, task.taskId);
6086
+ ] }, taskKey);
6003
6087
  }) });
6004
6088
  };
6005
6089
 
@@ -6595,7 +6679,7 @@ var FormSubmitTemplate = ({
6595
6679
  };
6596
6680
 
6597
6681
  // src/templates/FormDetailTemplate.tsx
6598
- import { useCallback as useCallback14, useMemo as useMemo8 } from "react";
6682
+ import { useCallback as useCallback14, useMemo as useMemo9 } from "react";
6599
6683
 
6600
6684
  // src/templates/PageSkeleton.tsx
6601
6685
  import { Skeleton as Skeleton3 } from "antd";
@@ -6675,7 +6759,7 @@ var InnerDetailContent = ({
6675
6759
  onDelete,
6676
6760
  onSave
6677
6761
  }) => {
6678
- const fieldIds = useMemo8(() => schema.fields.map((field) => field.fieldId), [schema.fields]);
6762
+ const fieldIds = useMemo9(() => schema.fields.map((field) => field.fieldId), [schema.fields]);
6679
6763
  const {
6680
6764
  loading,
6681
6765
  mode,
@@ -6800,7 +6884,7 @@ var FormDetailTemplate = (props) => {
6800
6884
  };
6801
6885
 
6802
6886
  // src/templates/ProcessDetailTemplate.tsx
6803
- import { useCallback as useCallback15, useMemo as useMemo9, useRef as useRef12 } from "react";
6887
+ import { useCallback as useCallback15, useMemo as useMemo10, useRef as useRef12 } from "react";
6804
6888
  import { Fragment as Fragment7, jsx as jsx85, jsxs as jsxs31 } from "react/jsx-runtime";
6805
6889
  function FormDataBridge({
6806
6890
  formDataRef
@@ -6822,7 +6906,7 @@ var InnerProcessContent = ({
6822
6906
  onActionComplete
6823
6907
  }) => {
6824
6908
  const formDataRef = useRef12(void 0);
6825
- const fieldIds = useMemo9(() => schema.fields.map((field) => field.fieldId), [schema.fields]);
6909
+ const fieldIds = useMemo10(() => schema.fields.map((field) => field.fieldId), [schema.fields]);
6826
6910
  const {
6827
6911
  loading,
6828
6912
  processInfo,
@@ -6844,7 +6928,7 @@ var InnerProcessContent = ({
6844
6928
  formInstanceId,
6845
6929
  formUuid,
6846
6930
  appType,
6847
- currentTaskId: currentTask?.taskId,
6931
+ currentTaskId: currentTask?.taskId ?? currentTask?.id,
6848
6932
  onActionComplete: async (action) => {
6849
6933
  onActionComplete?.(action);
6850
6934
  await refreshProgress();