sy-form-components 0.2.2 → 0.2.4

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,6 +4331,15 @@ var TASK_STATUS_META = {
4331
4331
  };
4332
4332
 
4333
4333
  // src/core/processApi.ts
4334
+ var normalizeProcessTasks = (value) => {
4335
+ if (Array.isArray(value)) return value;
4336
+ if (!value || typeof value !== "object") return [];
4337
+ if (Array.isArray(value.tasks)) return value.tasks;
4338
+ if (Array.isArray(value.list)) return value.list;
4339
+ if (Array.isArray(value.items)) return value.items;
4340
+ if (Array.isArray(value.records)) return value.records;
4341
+ return [];
4342
+ };
4334
4343
  async function getProcessBasic(request, formInstId) {
4335
4344
  const response = await request({
4336
4345
  url: `/workflow/instance/${formInstId}/basic`,
@@ -4340,10 +4349,10 @@ async function getProcessBasic(request, formInstId) {
4340
4349
  }
4341
4350
  async function getProcessProgress(request, formInstId) {
4342
4351
  const response = await request({
4343
- url: `/workflow/instance/${formInstId}`,
4352
+ url: `/workflow/instance/${formInstId}/all-tasks`,
4344
4353
  method: "get"
4345
4354
  });
4346
- return response.data || response.result || [];
4355
+ return normalizeProcessTasks(response.data || response.result);
4347
4356
  }
4348
4357
  async function checkUserApproval(request, formInstId) {
4349
4358
  const response = await request({
@@ -4945,6 +4954,75 @@ function useFieldPermission(options) {
4945
4954
 
4946
4955
  // src/hooks/useFormDetail.ts
4947
4956
  import { useState as useState20, useEffect as useEffect27, useCallback as useCallback7, useRef as useRef7 } from "react";
4957
+
4958
+ // src/utils/formInstanceData.ts
4959
+ var FORM_INSTANCE_METADATA_KEYS = /* @__PURE__ */ new Set([
4960
+ "appType",
4961
+ "code",
4962
+ "createdAt",
4963
+ "createdBy",
4964
+ "createdByDepartmentId",
4965
+ "createdByDepartmentName",
4966
+ "createdByName",
4967
+ "creator",
4968
+ "data",
4969
+ "error",
4970
+ "formInstId",
4971
+ "formInstanceId",
4972
+ "formUuid",
4973
+ "instanceTitle",
4974
+ "message",
4975
+ "result",
4976
+ "success",
4977
+ "title",
4978
+ "updatedAt"
4979
+ ]);
4980
+ var isPlainRecord = (value) => Boolean(value) && typeof value === "object" && !Array.isArray(value);
4981
+ var parseJsonRecord = (value) => {
4982
+ if (typeof value !== "string" || value.trim() === "") return null;
4983
+ try {
4984
+ const parsed = JSON.parse(value);
4985
+ return isPlainRecord(parsed) ? parsed : null;
4986
+ } catch {
4987
+ return null;
4988
+ }
4989
+ };
4990
+ var pickKnownFields = (source, fieldIds) => {
4991
+ if (fieldIds?.length) {
4992
+ const values = {};
4993
+ for (const fieldId of fieldIds) {
4994
+ if (Object.prototype.hasOwnProperty.call(source, fieldId)) {
4995
+ values[fieldId] = source[fieldId];
4996
+ }
4997
+ }
4998
+ return values;
4999
+ }
5000
+ return Object.fromEntries(
5001
+ Object.entries(source).filter(([key]) => !FORM_INSTANCE_METADATA_KEYS.has(key))
5002
+ );
5003
+ };
5004
+ var extractFormValues = (formInstance, fieldIds) => {
5005
+ if (!isPlainRecord(formInstance)) return null;
5006
+ const nestedCandidates = [
5007
+ formInstance.data,
5008
+ parseJsonRecord(formInstance.data),
5009
+ formInstance.formData,
5010
+ parseJsonRecord(formInstance.formData),
5011
+ formInstance.values,
5012
+ formInstance.fieldValues,
5013
+ parseJsonRecord(formInstance.formDataJson),
5014
+ parseJsonRecord(formInstance.dataJson)
5015
+ ];
5016
+ for (const candidate of nestedCandidates) {
5017
+ if (isPlainRecord(candidate)) {
5018
+ return pickKnownFields(candidate, fieldIds);
5019
+ }
5020
+ }
5021
+ const flatValues = pickKnownFields(formInstance, fieldIds);
5022
+ return Object.keys(flatValues).length > 0 ? flatValues : null;
5023
+ };
5024
+
5025
+ // src/hooks/useFormDetail.ts
4948
5026
  function buildFieldBehaviors(permissions, mode) {
4949
5027
  const behaviors = {};
4950
5028
  if (!permissions) return behaviors;
@@ -4960,7 +5038,7 @@ function buildFieldBehaviors(permissions, mode) {
4960
5038
  return behaviors;
4961
5039
  }
4962
5040
  function useFormDetail(options) {
4963
- const { formUuid, appType, formInstanceId, onPermissionDenied } = options;
5041
+ const { formUuid, appType, formInstanceId, fieldIds, onPermissionDenied } = options;
4964
5042
  const { api } = useFormContext();
4965
5043
  const request = api.request;
4966
5044
  const [loading, setLoading] = useState20(true);
@@ -4989,7 +5067,7 @@ function useFormDetail(options) {
4989
5067
  }
4990
5068
  setPermissions(permResult);
4991
5069
  setInstanceInfo(formResult);
4992
- setFormData(formResult?.data ?? null);
5070
+ setFormData(extractFormValues(formResult, fieldIds));
4993
5071
  } catch (error) {
4994
5072
  console.error("[useFormDetail] Failed to load data:", error);
4995
5073
  if (mountedRef.current) {
@@ -5002,7 +5080,7 @@ function useFormDetail(options) {
5002
5080
  setLoading(false);
5003
5081
  }
5004
5082
  }
5005
- }, [request, formUuid, appType, formInstanceId, onPermissionDenied]);
5083
+ }, [request, formUuid, appType, formInstanceId, fieldIds, onPermissionDenied]);
5006
5084
  useEffect27(() => {
5007
5085
  loadData();
5008
5086
  }, [loadData]);
@@ -5067,7 +5145,7 @@ function useFormDetail(options) {
5067
5145
  // src/hooks/useProcessDetail.ts
5068
5146
  import { useState as useState21, useEffect as useEffect28, useCallback as useCallback8, useRef as useRef8 } from "react";
5069
5147
  function useProcessDetail(options) {
5070
- const { formUuid, appType, formInstanceId } = options;
5148
+ const { formUuid, appType, formInstanceId, fieldIds } = options;
5071
5149
  const { api } = useFormContext();
5072
5150
  const request = api.request;
5073
5151
  const [loading, setLoading] = useState21(true);
@@ -5115,7 +5193,7 @@ function useProcessDetail(options) {
5115
5193
  setCanWithdraw(approvalResult?.canUndo ?? false);
5116
5194
  setPermissions(permResult);
5117
5195
  setInstanceInfo(formResult);
5118
- setFormData(formResult?.data ?? null);
5196
+ setFormData(extractFormValues(formResult, fieldIds));
5119
5197
  if (permResult?.operations?.includes("VIEW_PROCESS") || permResult?.operations?.length > 0) {
5120
5198
  try {
5121
5199
  const progress = await getProcessProgress(request, formInstanceId);
@@ -5149,7 +5227,7 @@ function useProcessDetail(options) {
5149
5227
  setLoading(false);
5150
5228
  }
5151
5229
  }
5152
- }, [request, formUuid, appType, formInstanceId]);
5230
+ }, [request, formUuid, appType, formInstanceId, fieldIds]);
5153
5231
  useEffect28(() => {
5154
5232
  loadData();
5155
5233
  }, [loadData]);
@@ -5868,15 +5946,16 @@ var ApprovalTimeline = ({
5868
5946
  showRemarks = true,
5869
5947
  compactMode = false
5870
5948
  }) => {
5871
- if (!tasks || tasks.length === 0) {
5949
+ const taskList = Array.isArray(tasks) ? tasks : [];
5950
+ if (taskList.length === 0) {
5872
5951
  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" }) });
5873
5952
  }
5874
- return /* @__PURE__ */ jsx77("div", { className: `${className}`, children: tasks.map((task, index) => {
5953
+ return /* @__PURE__ */ jsx77("div", { className: `${className}`, children: taskList.map((task, index) => {
5875
5954
  if (renderNode) {
5876
5955
  return /* @__PURE__ */ jsx77("div", { children: renderNode(task, index) }, task.taskId);
5877
5956
  }
5878
5957
  const phase = getNodePhase(task);
5879
- const isLast = index === tasks.length - 1;
5958
+ const isLast = index === taskList.length - 1;
5880
5959
  const statusMeta = TASK_STATUS_META[task.status];
5881
5960
  return /* @__PURE__ */ jsxs23("div", { className: "flex gap-4", children: [
5882
5961
  /* @__PURE__ */ jsxs23("div", { className: "flex flex-col items-center", children: [
@@ -6526,7 +6605,7 @@ var FormSubmitTemplate = ({
6526
6605
  };
6527
6606
 
6528
6607
  // src/templates/FormDetailTemplate.tsx
6529
- import { useCallback as useCallback14 } from "react";
6608
+ import { useCallback as useCallback14, useMemo as useMemo8 } from "react";
6530
6609
 
6531
6610
  // src/templates/PageSkeleton.tsx
6532
6611
  import { Skeleton as Skeleton3 } from "antd";
@@ -6606,6 +6685,7 @@ var InnerDetailContent = ({
6606
6685
  onDelete,
6607
6686
  onSave
6608
6687
  }) => {
6688
+ const fieldIds = useMemo8(() => schema.fields.map((field) => field.fieldId), [schema.fields]);
6609
6689
  const {
6610
6690
  loading,
6611
6691
  mode,
@@ -6619,7 +6699,7 @@ var InnerDetailContent = ({
6619
6699
  canEdit,
6620
6700
  canDelete,
6621
6701
  canViewChangeRecords
6622
- } = useFormDetail({ formUuid, appType, formInstanceId });
6702
+ } = useFormDetail({ formUuid, appType, formInstanceId, fieldIds });
6623
6703
  const {
6624
6704
  records,
6625
6705
  loading: recordsLoading,
@@ -6730,7 +6810,7 @@ var FormDetailTemplate = (props) => {
6730
6810
  };
6731
6811
 
6732
6812
  // src/templates/ProcessDetailTemplate.tsx
6733
- import { useCallback as useCallback15, useRef as useRef12 } from "react";
6813
+ import { useCallback as useCallback15, useMemo as useMemo9, useRef as useRef12 } from "react";
6734
6814
  import { Fragment as Fragment7, jsx as jsx85, jsxs as jsxs31 } from "react/jsx-runtime";
6735
6815
  function FormDataBridge({
6736
6816
  formDataRef
@@ -6752,6 +6832,7 @@ var InnerProcessContent = ({
6752
6832
  onActionComplete
6753
6833
  }) => {
6754
6834
  const formDataRef = useRef12(void 0);
6835
+ const fieldIds = useMemo9(() => schema.fields.map((field) => field.fieldId), [schema.fields]);
6755
6836
  const {
6756
6837
  loading,
6757
6838
  processInfo,
@@ -6768,7 +6849,7 @@ var InnerProcessContent = ({
6768
6849
  switchToEdit,
6769
6850
  switchToReadonly,
6770
6851
  refreshProgress
6771
- } = useProcessDetail({ formUuid, appType, formInstanceId });
6852
+ } = useProcessDetail({ formUuid, appType, formInstanceId, fieldIds });
6772
6853
  const { approve, reject, withdraw, save, resubmit } = useApprovalActions({
6773
6854
  formInstanceId,
6774
6855
  formUuid,
@@ -6967,6 +7048,7 @@ export {
6967
7048
  defineFormSchema,
6968
7049
  deleteFormData,
6969
7050
  evaluateEffects,
7051
+ extractFormValues,
6970
7052
  getChangeRecords,
6971
7053
  getFormData,
6972
7054
  getProcessBasic,