@rytass/bpm-core-react 0.9.0 → 0.10.0
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/CHANGELOG.md +46 -0
- package/dist/chunks/{FormBuilderView-BPLwAJGv.cjs → FormBuilderView-D6baVqBY.cjs} +2 -2
- package/dist/chunks/{FormBuilderView-BPLwAJGv.cjs.map → FormBuilderView-D6baVqBY.cjs.map} +1 -1
- package/dist/chunks/{FormBuilderView-Do9-MIAe.js → FormBuilderView-QtREqV4j.js} +2 -2
- package/dist/chunks/{FormBuilderView-Do9-MIAe.js.map → FormBuilderView-QtREqV4j.js.map} +1 -1
- package/dist/chunks/FormRendererView-Cw9LiidV.cjs +2 -0
- package/dist/chunks/FormRendererView-Cw9LiidV.cjs.map +1 -0
- package/dist/chunks/{FormRendererView-C5POZbWz.js → FormRendererView-D8QHLvd0.js} +224 -139
- package/dist/chunks/FormRendererView-D8QHLvd0.js.map +1 -0
- package/dist/chunks/{compose-CULMDsLS.cjs → compose-CODnd9-2.cjs} +2 -2
- package/dist/chunks/{compose-CULMDsLS.cjs.map → compose-CODnd9-2.cjs.map} +1 -1
- package/dist/chunks/{compose-DJBlA5PD.js → compose-D-OS-Ngs.js} +4 -4
- package/dist/chunks/{compose-DJBlA5PD.js.map → compose-D-OS-Ngs.js.map} +1 -1
- package/dist/chunks/{designer-CmqAU92b.cjs → designer-Cdn10NNl.cjs} +2 -2
- package/dist/chunks/{designer-CmqAU92b.cjs.map → designer-Cdn10NNl.cjs.map} +1 -1
- package/dist/chunks/{designer-BszXJ5RO.js → designer-DDSxwtjV.js} +2 -2
- package/dist/chunks/{designer-BszXJ5RO.js.map → designer-DDSxwtjV.js.map} +1 -1
- package/dist/chunks/detail-CtVu5NTi.cjs +2 -0
- package/dist/chunks/detail-CtVu5NTi.cjs.map +1 -0
- package/dist/chunks/{detail-DAak2OXS.js → detail-DAPz2qyn.js} +31 -30
- package/dist/chunks/detail-DAPz2qyn.js.map +1 -0
- package/dist/pages/instances/detail/index.cjs +1 -1
- package/dist/pages/instances/detail/index.js +1 -1
- package/dist/pages/templates/compose/index.cjs +1 -1
- package/dist/pages/templates/compose/index.js +1 -1
- package/dist/pages/templates/designer/index.cjs +1 -1
- package/dist/pages/templates/designer/index.js +1 -1
- package/dist/views/forms/builder/index.cjs +1 -1
- package/dist/views/forms/builder/index.js +1 -1
- package/dist/views/forms/renderer/form-data-source-field.d.ts +15 -0
- package/dist/views/forms/renderer/index.cjs +1 -1
- package/dist/views/forms/renderer/index.js +2 -2
- package/dist/views/instances/detail/index.cjs +1 -1
- package/dist/views/instances/detail/index.js +1 -1
- package/dist/views/instances/new/index.cjs +1 -1
- package/dist/views/instances/new/index.cjs.map +1 -1
- package/dist/views/instances/new/index.js +8 -6
- package/dist/views/instances/new/index.js.map +1 -1
- package/dist/views/templates/compose/index.cjs +1 -1
- package/dist/views/templates/compose/index.js +1 -1
- package/dist/views/templates/designer/index.cjs +1 -1
- package/dist/views/templates/designer/index.js +1 -1
- package/package.json +29 -20
- package/dist/chunks/FormRendererView-C5POZbWz.js.map +0 -1
- package/dist/chunks/FormRendererView-DNtNodNl.cjs +0 -2
- package/dist/chunks/FormRendererView-DNtNodNl.cjs.map +0 -1
- package/dist/chunks/detail-CDexqBoU.cjs +0 -2
- package/dist/chunks/detail-CDexqBoU.cjs.map +0 -1
- package/dist/chunks/detail-DAak2OXS.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FormRendererView-DNtNodNl.cjs","names":[],"sources":["../../src/views/forms/renderer/form-data-source-field.ts","../../src/views/forms/renderer/FormRendererView.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n FormDataSourceValueSnapshots,\n FormDefinitionSchema,\n FormFieldDefinition,\n FormFieldOption,\n FormFieldValue,\n FormUiSchema,\n isFormDataSourceFieldDefinition,\n} from '@rytass/bpm-core-shared/form';\nimport {\n FormDataSourceFieldStatus,\n FormRendererValues,\n mergeFormDataSourceOptions,\n readFormDataSourceErrorMessage,\n readMissingFormDataSourceOptionValues,\n previewFormFieldOptions,\n readFormDataSourceValueSignature,\n readMissingFormDataSourceDependencies,\n readSelectedFormDataSourceOptions,\n readFormFieldOptions,\n} from '@rytass/bpm-core-client/form';\n\nexport type FormRendererDataSourceContext =\n | { readonly kind: 'preview' }\n | {\n readonly instanceId?: string | null;\n readonly kind: 'runtime';\n readonly templateId?: string | null;\n };\n\nexport interface FormDataSourceFieldState {\n readonly error: string | null;\n readonly hasValue: boolean;\n readonly hasNextPage: boolean;\n readonly invalidValues: readonly string[];\n readonly onReachBottom: () => void;\n readonly onSearch: (searchText: string) => void;\n readonly options: readonly FormFieldOption[];\n readonly retry: () => void;\n readonly status: FormDataSourceFieldStatus;\n}\n\nexport interface UseFormDataSourceFieldInput {\n readonly context?: FormRendererDataSourceContext;\n readonly field: FormFieldDefinition;\n readonly formData: FormRendererValues;\n readonly initialFormData?: FormRendererValues;\n readonly initialValue?: FormFieldValue | undefined;\n readonly optionSnapshots?: FormDataSourceValueSnapshots;\n readonly readonly: boolean;\n readonly schema: FormDefinitionSchema;\n readonly uiSchema: FormUiSchema;\n}\n\nconst EMPTY_FIELD_STATE: FormDataSourceFieldState = {\n error: null,\n hasValue: false,\n hasNextPage: false,\n invalidValues: [],\n onReachBottom: (): void => undefined,\n onSearch: (): void => undefined,\n options: [],\n retry: (): void => undefined,\n status: 'IDLE',\n};\n\nexport function useFormDataSourceField(\n input: UseFormDataSourceFieldInput,\n): FormDataSourceFieldState {\n const dynamicField = isFormDataSourceFieldDefinition(input.field)\n ? input.field\n : null;\n const snapshot = dynamicField\n ? input.optionSnapshots?.[dynamicField.fieldKey]\n : undefined;\n const snapshotSignature = JSON.stringify(snapshot ?? null);\n const snapshotOptions = useMemo(\n (): readonly FormFieldOption[] => snapshot?.options ?? [],\n [snapshotSignature],\n );\n const formDataSignature = JSON.stringify(input.formData);\n const initialFormDataSignature = JSON.stringify(input.initialFormData ?? {});\n const schemaSignature = JSON.stringify(input.schema);\n const uiSchemaSignature = JSON.stringify(input.uiSchema);\n const contextKind = input.context?.kind;\n const contextInstanceId =\n input.context?.kind === 'runtime' ? input.context.instanceId : undefined;\n const contextTemplateId =\n input.context?.kind === 'runtime' ? input.context.templateId : undefined;\n const missingDependencies = dynamicField\n ? readMissingFormDataSourceDependencies(dynamicField, input.formData)\n : [];\n const missingDependenciesSignature = JSON.stringify(missingDependencies);\n const dataSourceRefreshSignature = dynamicField\n ? JSON.stringify({\n bindings: dynamicField.dataSource.bindings.map((binding) =>\n binding.from.kind === 'FIELD'\n ? {\n fieldKey: binding.from.fieldKey,\n value: input.formData[binding.from.fieldKey],\n }\n : { value: binding.from.value },\n ),\n value:\n typeof input.initialFormData !== 'undefined' ||\n typeof input.initialValue !== 'undefined'\n ? input.formData[dynamicField.fieldKey]\n : undefined,\n })\n : '';\n const effectiveContext = useMemo(\n (): FormRendererDataSourceContext | undefined => {\n if (contextKind === 'preview') {\n return { kind: 'preview' };\n }\n\n if (contextKind === 'runtime' && !input.readonly) {\n return {\n instanceId: contextInstanceId,\n kind: 'runtime',\n templateId: contextTemplateId,\n };\n }\n\n return undefined;\n },\n [\n contextInstanceId,\n contextKind,\n contextTemplateId,\n input.readonly,\n ],\n );\n const valueChanged = dynamicField\n ? (typeof input.initialFormData !== 'undefined' ||\n typeof input.initialValue !== 'undefined') &&\n readFormDataSourceValueSignature(input.initialValue) !==\n readFormDataSourceValueSignature(input.formData[dynamicField.fieldKey])\n : false;\n const bindingsChanged = dynamicField\n ? typeof input.initialFormData !== 'undefined' &&\n dynamicField.dataSource.bindings.some((binding) => {\n if (binding.from.kind !== 'FIELD') {\n return false;\n }\n\n return (\n readFormDataSourceValueSignature(\n input.initialFormData?.[binding.from.fieldKey],\n ) !==\n readFormDataSourceValueSignature(input.formData[binding.from.fieldKey])\n );\n })\n : false;\n const isStale = Boolean(snapshot && (valueChanged || bindingsChanged));\n const [remoteOptions, setRemoteOptions] = useState<readonly FormFieldOption[]>(\n [],\n );\n const [searchText, setSearchText] = useState('');\n const [nextCursor, setNextCursor] = useState<string | null>(null);\n const [status, setStatus] = useState<FormDataSourceFieldStatus>(\n dynamicField ? (snapshot ? (isStale ? 'STALE' : 'VALID') : 'IDLE') : 'IDLE',\n );\n const [error, setError] = useState<string | null>(null);\n const requestSequence = useRef(0);\n const lastRequest = useRef<{ readonly cursor: string | null; readonly searchText: string }>({\n cursor: null,\n searchText: '',\n });\n\n const queryFormData = useMemo(\n (): Readonly<Record<string, FormFieldValue>> =>\n Object.entries(input.formData).reduce<\n Readonly<Record<string, FormFieldValue>>\n >((values, [key, value]) => {\n if (typeof value === 'undefined') {\n return values;\n }\n\n return { ...values, [key]: value };\n }, {}),\n [formDataSignature],\n );\n const mergedOptions = useMemo(\n (): readonly FormFieldOption[] =>\n mergeFormDataSourceOptions(snapshotOptions, remoteOptions),\n [remoteOptions, snapshotOptions],\n );\n const invalidValues = useMemo(\n (): readonly string[] =>\n readMissingFormDataSourceOptionValues(\n dynamicField ? input.formData[dynamicField.fieldKey] : undefined,\n mergedOptions,\n ),\n [dynamicField, input.formData, mergedOptions],\n );\n const hasValue = readFormDataSourceValuePresent(\n dynamicField ? input.formData[dynamicField.fieldKey] : undefined,\n );\n\n const loadOptions = useCallback(\n (nextSearchTextToLoad: string, cursor: string | null): void => {\n if (!dynamicField || !effectiveContext) {\n return;\n }\n\n if (missingDependencies.length > 0) {\n setStatus('WAITING_FOR_DEPENDENCIES');\n setError(null);\n\n return;\n }\n\n const requestId = requestSequence.current + 1;\n requestSequence.current = requestId;\n lastRequest.current = {\n cursor,\n searchText: nextSearchTextToLoad,\n };\n setStatus(isStale ? 'STALE' : 'LOADING');\n setError(null);\n\n const request =\n effectiveContext.kind === 'preview'\n ? previewFormFieldOptions({\n cursor,\n fieldKey: dynamicField.fieldKey,\n formData: queryFormData,\n schema: input.schema,\n searchText: nextSearchTextToLoad,\n uiSchema: input.uiSchema,\n })\n : readFormFieldOptions({\n cursor,\n fieldKey: dynamicField.fieldKey,\n formData: queryFormData,\n instanceId: effectiveContext.instanceId ?? null,\n searchText: nextSearchTextToLoad,\n templateId: effectiveContext.templateId ?? null,\n });\n\n void request\n .then((result): void => {\n if (requestSequence.current !== requestId) {\n return;\n }\n\n setRemoteOptions((currentOptions) => {\n const currentValue = dynamicField\n ? input.formData[dynamicField.fieldKey]\n : undefined;\n const selectedOptions = readSelectedFormDataSourceOptions(\n currentValue,\n currentOptions,\n );\n\n return mergeFormDataSourceOptions(\n selectedOptions,\n cursor ? currentOptions : [],\n result.options,\n );\n });\n setNextCursor(result.nextCursor);\n setStatus('VALID');\n setError(null);\n })\n .catch((requestError: unknown): void => {\n if (requestSequence.current !== requestId) {\n return;\n }\n\n setStatus('UNAVAILABLE');\n // The backend answers with stable codes rather than prose, so show\n // the mapped copy instead of a raw `FORM_DATA_SOURCE_*` string.\n setError(\n readFormDataSourceErrorMessage(requestError) ??\n (requestError instanceof Error\n ? requestError.message\n : '選項來源暫時無法使用。'),\n );\n });\n },\n [\n dynamicField,\n effectiveContext,\n isStale,\n missingDependencies.length,\n queryFormData,\n schemaSignature,\n uiSchemaSignature,\n ],\n );\n const loadOptionsRef = useRef(loadOptions);\n loadOptionsRef.current = loadOptions;\n\n useEffect((): void => {\n requestSequence.current += 1;\n setRemoteOptions((currentOptions) => {\n const currentValue = dynamicField\n ? input.formData[dynamicField.fieldKey]\n : undefined;\n\n return readSelectedFormDataSourceOptions(currentValue, currentOptions);\n });\n setNextCursor((currentCursor) =>\n currentCursor === null ? currentCursor : null,\n );\n setSearchText((currentSearchText) =>\n currentSearchText ? '' : currentSearchText,\n );\n setError((currentError) => (currentError ? null : currentError));\n\n if (!dynamicField) {\n setStatus('IDLE');\n\n return;\n }\n\n if (missingDependencies.length > 0) {\n setStatus('WAITING_FOR_DEPENDENCIES');\n\n return;\n }\n\n if (!effectiveContext) {\n setStatus(\n snapshot\n ? isStale\n ? 'STALE'\n : 'VALID'\n : input.readonly\n ? 'UNAVAILABLE'\n : 'IDLE',\n );\n\n return;\n }\n\n if (dynamicField.type === 'autocomplete') {\n setStatus(snapshot ? (isStale ? 'STALE' : 'VALID') : 'IDLE');\n\n return;\n }\n\n loadOptionsRef.current('', null);\n }, [\n dynamicField,\n effectiveContext,\n dataSourceRefreshSignature,\n initialFormDataSignature,\n input.readonly,\n isStale,\n missingDependenciesSignature,\n snapshotSignature,\n ]);\n\n const onSearch = useCallback(\n (nextSearchTextToLoad: string): void => {\n setSearchText(nextSearchTextToLoad);\n setRemoteOptions((currentOptions) => {\n const currentValue = dynamicField\n ? input.formData[dynamicField.fieldKey]\n : undefined;\n\n return readSelectedFormDataSourceOptions(currentValue, currentOptions);\n });\n setNextCursor(null);\n loadOptions(nextSearchTextToLoad, null);\n },\n [loadOptions],\n );\n const onReachBottom = useCallback((): void => {\n if (nextCursor) {\n loadOptions(searchText, nextCursor);\n }\n }, [loadOptions, nextCursor, searchText]);\n const retry = useCallback((): void => {\n loadOptions(lastRequest.current.searchText, lastRequest.current.cursor);\n }, [loadOptions]);\n\n if (!dynamicField) {\n return EMPTY_FIELD_STATE;\n }\n\n return {\n error,\n hasValue,\n hasNextPage: Boolean(nextCursor),\n invalidValues,\n onReachBottom,\n onSearch,\n options: mergedOptions,\n retry,\n status: status === 'VALID' && invalidValues.length ? 'INVALID' : status,\n };\n}\n\nexport function readFormDataSourceFieldStatusMessage(\n state: FormDataSourceFieldState,\n): string | null {\n switch (state.status) {\n case 'WAITING_FOR_DEPENDENCIES':\n return '請先填寫相依欄位。';\n case 'STALE':\n return '選項需要重新載入或驗證。';\n case 'INVALID':\n return state.invalidValues.length\n ? `無法辨識選項:${state.invalidValues.join('、')}`\n : '目前選項已失效,請重新選擇。';\n case 'UNAVAILABLE':\n return state.error ?? '選項來源暫時無法使用。';\n case 'VALID':\n return state.options.length ? null : '目前沒有可用選項。';\n default:\n return null;\n }\n}\n\nexport function isFormDataSourceFieldSubmissionBlocked(\n state: Pick<FormDataSourceFieldState, 'hasValue' | 'status'>,\n): boolean {\n return state.hasValue && state.status !== 'VALID';\n}\n\nfunction readFormDataSourceValuePresent(\n value: FormFieldValue | undefined,\n): boolean {\n if (typeof value === 'undefined' || value === null) {\n return false;\n }\n\n if (typeof value === 'string') {\n return value.trim().length > 0;\n }\n\n if (Array.isArray(value)) {\n return value.length > 0;\n }\n\n return true;\n}\n","'use client';\n\nimport {\n ChangeEvent,\n CSSProperties,\n ReactElement,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n AutoComplete,\n Button,\n CheckboxGroup,\n DatePicker,\n DateTimePicker,\n Input,\n RadioGroup,\n Select,\n Textarea,\n Toggle,\n Typography,\n Upload,\n} from '@mezzanine-ui/react';\nimport type { UploadFile } from '@mezzanine-ui/react/Upload';\nimport {\n FormDataSourceOptionFieldDefinition,\n FormDataSourceValueSnapshots,\n FormDefinitionSchema,\n FormFieldDefinition,\n FormFieldValue,\n FormUiSchema,\n isFormDataSourceFieldDefinition,\n isFormStaticOptionFieldDefinition,\n readFormFieldSelectionMode,\n} from '@rytass/bpm-core-shared/form';\nimport {\n buildFormRendererValues,\n clampOptionalNumber,\n formatDatePickerValue,\n formatDateTimePickerValue,\n FormRendererValues,\n isFormRendererFieldReadonly,\n isFormRendererFieldRequired,\n parseOptionalNumberInput,\n readDatePickerValue,\n readFieldOptionAsSelectOption,\n readSelectedFormDataSourceOptions,\n readSelectOption,\n readVisibleFormRendererFields,\n} from '@rytass/bpm-core-client/form';\nimport { BPMFormField } from '../../../components/bpm-form-field';\nimport {\n FormDataSourceFieldState,\n FormRendererDataSourceContext,\n readFormDataSourceFieldStatusMessage,\n useFormDataSourceField,\n} from './form-data-source-field';\n\nexport interface FormRendererProps {\n readonly dataSourceContext?: FormRendererDataSourceContext;\n readonly dataSourceInitialValues?: FormRendererValues;\n readonly emptyText?: string;\n readonly errors?: Readonly<Record<string, string>>;\n readonly maxWidth?: CSSProperties['maxWidth'];\n readonly onChange?: (values: FormRendererValues) => void;\n readonly onDataSourceStateChange?: (\n fieldKey: string,\n state: Pick<\n FormDataSourceFieldState,\n 'hasValue' | 'invalidValues' | 'status'\n >,\n ) => void;\n readonly onUploadAttachment?: (\n field: FormFieldDefinition,\n file: File,\n ) => Promise<{ readonly id: string }>;\n readonly optionSnapshots?: FormDataSourceValueSnapshots;\n readonly readonly?: boolean;\n readonly schema: FormDefinitionSchema;\n readonly singleColumn?: boolean;\n readonly uiSchema: FormUiSchema;\n readonly value?: FormRendererValues;\n}\n\nconst FORM_RENDERER_GRID_STYLE: CSSProperties = {\n alignItems: 'start',\n display: 'grid',\n gap: 12,\n gridTemplateColumns: 'repeat(12, minmax(0, 1fr))',\n};\n\nconst FORM_RENDERER_EMPTY_STYLE: CSSProperties = {\n gridColumn: '1 / -1',\n};\n\nconst FORM_RENDERER_FIELD_STYLE: CSSProperties = {\n alignItems: 'start',\n display: 'grid',\n gap: 8,\n minWidth: 0,\n};\n\nconst TEXTAREA_STYLE: CSSProperties = {\n minWidth: '100%',\n width: '100%',\n};\n\nfunction applyFullWidthTextareaHost(element: HTMLDivElement | null): void {\n if (!element) {\n return;\n }\n\n element.style.width = '100%';\n}\n\nexport function FormRenderer({\n dataSourceContext,\n dataSourceInitialValues,\n emptyText = '尚未建立欄位。',\n errors = {},\n maxWidth,\n onChange,\n onDataSourceStateChange,\n onUploadAttachment,\n optionSnapshots,\n readonly = false,\n schema,\n singleColumn = false,\n uiSchema,\n value,\n}: FormRendererProps): ReactElement {\n const [internalValues, setInternalValues] = useState<FormRendererValues>(() =>\n buildFormRendererValues(schema.fields, value ?? {}),\n );\n const values = useMemo(\n (): FormRendererValues =>\n buildFormRendererValues(schema.fields, value ?? internalValues),\n [internalValues, schema.fields, value],\n );\n const valuesRef = useRef<FormRendererValues>(values);\n const visibleFields = useMemo(\n (): readonly FormFieldDefinition[] =>\n readVisibleFormRendererFields(schema, uiSchema, values),\n [schema, uiSchema, values],\n );\n\n useEffect((): void => {\n valuesRef.current = values;\n }, [values]);\n\n useEffect((): void => {\n setInternalValues((currentValues) =>\n buildFormRendererValues(schema.fields, value ?? currentValues),\n );\n }, [schema.fields, value]);\n\n function updateValue(\n fieldKey: string,\n nextValue: FormFieldValue | undefined,\n ): void {\n const nextValues = {\n ...valuesRef.current,\n [fieldKey]: nextValue,\n };\n valuesRef.current = nextValues;\n\n if (!value) {\n setInternalValues(nextValues);\n }\n\n onChange?.(nextValues);\n }\n\n if (!visibleFields.length) {\n return (\n <div style={FORM_RENDERER_GRID_STYLE}>\n <Typography\n color=\"text-neutral\"\n style={FORM_RENDERER_EMPTY_STYLE}\n variant=\"body\"\n >\n {schema.fields.length > 0 ? '目前條件下沒有可填寫欄位。' : emptyText}\n </Typography>\n </div>\n );\n }\n\n return (\n <div\n style={{\n ...FORM_RENDERER_GRID_STYLE,\n ...(singleColumn ? { maxWidth, width: '100%' } : {}),\n }}\n >\n {visibleFields.map((field) => (\n <FormRendererField\n dataSourceContext={dataSourceContext}\n dataSourceInitialValues={dataSourceInitialValues}\n field={field}\n error={errors[field.fieldKey] ?? null}\n fields={schema.fields}\n key={field.fieldKey}\n onChange={updateValue}\n onDataSourceStateChange={onDataSourceStateChange}\n onUploadAttachment={onUploadAttachment}\n optionSnapshots={optionSnapshots}\n readonly={readonly}\n schema={schema}\n style={{\n ...FORM_RENDERER_FIELD_STYLE,\n gridColumn: `span ${\n singleColumn ? 12 : readFieldColumnSpan(field, uiSchema)\n }`,\n }}\n value={values[field.fieldKey]}\n values={values}\n uiSchema={uiSchema}\n />\n ))}\n </div>\n );\n}\n\nfunction FormRendererField({\n dataSourceContext,\n dataSourceInitialValues,\n error,\n field,\n fields,\n onChange,\n onDataSourceStateChange,\n onUploadAttachment,\n optionSnapshots,\n readonly,\n schema,\n style,\n value,\n values,\n uiSchema,\n}: {\n readonly dataSourceContext?: FormRendererDataSourceContext;\n readonly dataSourceInitialValues?: FormRendererValues;\n readonly error: string | null;\n readonly field: FormFieldDefinition;\n readonly fields: readonly FormFieldDefinition[];\n readonly onChange: (\n fieldKey: string,\n value: FormFieldValue | undefined,\n ) => void;\n readonly onDataSourceStateChange?: (\n fieldKey: string,\n state: Pick<\n FormDataSourceFieldState,\n 'hasValue' | 'invalidValues' | 'status'\n >,\n ) => void;\n readonly onUploadAttachment?:\n | ((\n field: FormFieldDefinition,\n file: File,\n ) => Promise<{ readonly id: string }>)\n | undefined;\n readonly optionSnapshots?: FormDataSourceValueSnapshots;\n readonly readonly: boolean;\n readonly schema: FormDefinitionSchema;\n readonly style: CSSProperties;\n readonly uiSchema: FormUiSchema;\n readonly value: FormFieldValue | undefined;\n readonly values: FormRendererValues;\n}): ReactElement {\n const required = isFormRendererFieldRequired(field, fields, values);\n const fieldReadonly =\n readonly || isFormRendererFieldReadonly(field, fields, values);\n const dataSourceState = useFormDataSourceField({\n context: dataSourceContext,\n field,\n formData: values,\n initialFormData: dataSourceInitialValues,\n initialValue: dataSourceInitialValues?.[field.fieldKey],\n optionSnapshots,\n readonly: fieldReadonly,\n schema,\n uiSchema,\n });\n const dataSourceStatusMessage = readFormDataSourceFieldStatusMessage(\n dataSourceState,\n );\n const dataSourceStateSignature = JSON.stringify({\n hasValue: dataSourceState.hasValue,\n invalidValues: dataSourceState.invalidValues,\n status: dataSourceState.status,\n });\n\n useEffect((): void => {\n if (!isFormDataSourceFieldDefinition(field)) {\n return;\n }\n\n onDataSourceStateChange?.(field.fieldKey, {\n hasValue: dataSourceState.hasValue,\n invalidValues: dataSourceState.invalidValues,\n status: dataSourceState.status,\n });\n }, [\n dataSourceStateSignature,\n field.fieldKey,\n onDataSourceStateChange,\n ]);\n\n return (\n <div data-form-field-key={field.fieldKey} style={style}>\n <BPMFormField\n label={field.label}\n name={field.fieldKey}\n required={required}\n >\n {renderControl(\n field,\n value,\n fieldReadonly,\n onChange,\n onUploadAttachment,\n dataSourceContext,\n dataSourceState,\n )}\n </BPMFormField>\n {error ? (\n <Typography color=\"text-error\" variant=\"caption\">\n {error}\n </Typography>\n ) : null}\n {dataSourceStatusMessage ? (\n <div style={DATA_SOURCE_FEEDBACK_STYLE}>\n <Typography\n color={\n dataSourceState.status === 'INVALID' ||\n dataSourceState.status === 'UNAVAILABLE'\n ? 'text-error'\n : 'text-neutral'\n }\n variant=\"caption\"\n >\n {dataSourceStatusMessage}\n </Typography>\n {dataSourceState.status === 'UNAVAILABLE' ? (\n <Button\n onClick={dataSourceState.retry}\n size=\"sub\"\n type=\"button\"\n variant=\"base-ghost\"\n >\n 重試\n </Button>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nconst DATA_SOURCE_FEEDBACK_STYLE: CSSProperties = {\n alignItems: 'center',\n display: 'flex',\n gap: 8,\n};\n\nfunction renderControl(\n field: FormFieldDefinition,\n value: FormFieldValue | undefined,\n readonly: boolean,\n onChange: (fieldKey: string, value: FormFieldValue | undefined) => void,\n onUploadAttachment:\n | ((\n field: FormFieldDefinition,\n file: File,\n ) => Promise<{ readonly id: string }>)\n | undefined,\n dataSourceContext: FormRendererDataSourceContext | undefined,\n dataSourceState: FormDataSourceFieldState,\n): ReactElement {\n if (field.type === 'textarea') {\n return (\n <Textarea\n onChange={(event: ChangeEvent<HTMLTextAreaElement>): void =>\n onChange(field.fieldKey, event.target.value)\n }\n placeholder={field.placeholder ?? '請輸入多行文字'}\n readOnly={readonly}\n ref={applyFullWidthTextareaHost}\n rows={3}\n style={TEXTAREA_STYLE}\n value={readStringValue(value)}\n />\n );\n }\n\n if (field.type === 'boolean') {\n return (\n <Toggle\n checked={value === true}\n disabled={readonly}\n label=\"啟用\"\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n onChange(field.fieldKey, event.target.checked)\n }\n />\n );\n }\n\n if (isFormDataSourceFieldDefinition(field)) {\n return renderDynamicOptionControl(\n field,\n value,\n readonly,\n onChange,\n dataSourceContext,\n dataSourceState,\n );\n }\n\n if (isFormStaticOptionFieldDefinition(field) && field.type === 'checkbox') {\n const options = field.options.map(readFieldOptionAsSelectOption);\n\n return (\n <Select\n mode=\"multiple\"\n onChange={(options): void =>\n onChange(\n field.fieldKey,\n options?.length\n ? options.map((option) => option.id)\n : undefined,\n )\n }\n options={options}\n placeholder={field.placeholder ?? '請選擇一或多個選項'}\n readOnly={readonly}\n value={options.filter((option) =>\n readStringArrayValue(value).includes(option.id),\n )}\n />\n );\n }\n\n if (isFormStaticOptionFieldDefinition(field)) {\n const options = field.options.map(readFieldOptionAsSelectOption);\n\n return (\n <Select\n onChange={(option): void =>\n onChange(field.fieldKey, option?.id ?? undefined)\n }\n options={options}\n placeholder={field.placeholder ?? '請選擇'}\n readOnly={readonly}\n value={readSelectOption(options, readStringValue(value))}\n />\n );\n }\n\n if (field.type === 'file_upload') {\n return (\n <Upload\n accept={field.acceptedMimeTypes?.join(',')}\n disabled={readonly}\n maxFiles={field.maxFiles}\n mode=\"button-list\"\n {...((field.maxFiles ?? 1) > 1 ? { multiple: true } : {})}\n onChange={(files): void =>\n onChange(\n field.fieldKey,\n files.length ? files.map((file) => file.id) : undefined,\n )\n }\n onUpload={async (files): Promise<UploadFile[]> =>\n Promise.all(\n files.map(async (file): Promise<UploadFile> => {\n const uploadedFile = onUploadAttachment\n ? await onUploadAttachment(field, file)\n : { id: `${file.name}-${file.lastModified}` };\n\n return {\n file,\n id: uploadedFile.id,\n progress: 100,\n status: 'done',\n };\n }),\n )\n }\n size=\"sub\"\n />\n );\n }\n\n if (field.type === 'date') {\n return (\n <DatePicker\n format=\"YYYY-MM-DD\"\n fullWidth\n onChange={(nextValue): void =>\n onChange(field.fieldKey, formatDatePickerValue(nextValue))\n }\n placeholder={field.placeholder ?? readInputPlaceholder(field.type)}\n readOnly={readonly}\n value={readDatePickerValue(value)}\n />\n );\n }\n\n if (field.type === 'datetime') {\n return (\n <DateTimePicker\n formatDate=\"YYYY-MM-DD\"\n formatTime=\"HH:mm\"\n fullWidth\n hideSecond\n onChange={(nextValue): void =>\n onChange(field.fieldKey, formatDateTimePickerValue(nextValue))\n }\n placeholderLeft=\"選擇日期\"\n placeholderRight=\"選擇時間\"\n readOnly={readonly}\n value={readDatePickerValue(value)}\n />\n );\n }\n\n if (field.type === 'number' || field.type === 'money') {\n return (\n <Input\n fullWidth\n max={field.maximum}\n min={field.minimum}\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n onChange(\n field.fieldKey,\n clampOptionalNumber(parseOptionalNumberInput(event.target.value), {\n max: field.maximum,\n min: field.minimum,\n }),\n )\n }\n placeholder={field.placeholder ?? readInputPlaceholder(field.type)}\n {...(readonly ? { readonly: true as const } : {})}\n showSpinner\n value={readNumberInputValue(value)}\n variant=\"measure\"\n />\n );\n }\n\n return (\n <Input\n fullWidth\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n onChange(field.fieldKey, event.target.value)\n }\n placeholder={field.placeholder ?? readInputPlaceholder(field.type)}\n {...(readonly ? { readonly: true as const } : {})}\n value={readStringValue(value)}\n variant=\"base\"\n />\n );\n}\n\nfunction renderDynamicOptionControl(\n field: FormDataSourceOptionFieldDefinition,\n value: FormFieldValue | undefined,\n readonly: boolean,\n onChange: (fieldKey: string, value: FormFieldValue | undefined) => void,\n dataSourceContext: FormRendererDataSourceContext | undefined,\n dataSourceState: FormDataSourceFieldState,\n): ReactElement {\n const options = dataSourceState.options.map(readFieldOptionAsSelectOption);\n const selectedOptions = readSelectedFormDataSourceOptions(\n value,\n dataSourceState.options,\n ).map(readFieldOptionAsSelectOption);\n const loading = dataSourceState.status === 'LOADING';\n const waitingForDependencies =\n dataSourceState.status === 'WAITING_FOR_DEPENDENCIES';\n const interactiveSearch = Boolean(dataSourceContext) && !readonly;\n const optionControlDisabled = readonly || waitingForDependencies;\n\n if (field.type === 'autocomplete') {\n if (readFormFieldSelectionMode(field) === 'multiple') {\n return (\n <AutoComplete\n asyncData={interactiveSearch}\n clearSearchText\n disabled={optionControlDisabled}\n disabledOptionsFilter={interactiveSearch}\n globalPortal\n loading={loading}\n mode=\"multiple\"\n onChange={(nextOptions): void =>\n onChange(\n field.fieldKey,\n nextOptions.length\n ? nextOptions.map((option) => option.id)\n : undefined,\n )\n }\n onReachBottom={\n dataSourceState.hasNextPage\n ? dataSourceState.onReachBottom\n : undefined\n }\n onSearch={interactiveSearch ? dataSourceState.onSearch : undefined}\n options={options}\n placeholder={field.placeholder ?? '請輸入或選擇'}\n readOnly={readonly}\n searchDebounceTime={300}\n value={selectedOptions}\n />\n );\n }\n\n return (\n <AutoComplete\n asyncData={interactiveSearch}\n clearSearchText\n disabled={optionControlDisabled}\n disabledOptionsFilter={interactiveSearch}\n globalPortal\n loading={loading}\n mode=\"single\"\n onChange={(nextOption): void =>\n onChange(field.fieldKey, nextOption?.id ?? undefined)\n }\n onReachBottom={\n dataSourceState.hasNextPage\n ? dataSourceState.onReachBottom\n : undefined\n }\n onSearch={interactiveSearch ? dataSourceState.onSearch : undefined}\n options={options}\n placeholder={field.placeholder ?? '請輸入或選擇'}\n readOnly={readonly}\n searchDebounceTime={300}\n value={selectedOptions[0] ?? null}\n />\n );\n }\n\n if (field.type === 'radio') {\n return (\n <RadioGroup\n disabled={optionControlDisabled}\n name={field.fieldKey}\n onChange={(event): void =>\n onChange(field.fieldKey, event.target.value || undefined)\n }\n options={options}\n value={readStringValue(value)}\n />\n );\n }\n\n if (field.type === 'checkbox') {\n return (\n <CheckboxGroup\n disabled={optionControlDisabled}\n name={field.fieldKey}\n onChange={(event): void =>\n onChange(\n field.fieldKey,\n event.target.values.length ? event.target.values : undefined,\n )\n }\n options={options.map((option) => ({\n label: option.name,\n value: option.id,\n }))}\n value={[...readStringArrayValue(value)]}\n />\n );\n }\n\n if (readFormFieldSelectionMode(field) === 'multiple') {\n return (\n <Select\n disabled={optionControlDisabled}\n loading={loading}\n mode=\"multiple\"\n onChange={(nextOptions): void =>\n onChange(\n field.fieldKey,\n nextOptions.length\n ? nextOptions.map((option) => option.id)\n : undefined,\n )\n }\n onReachBottom={\n dataSourceState.hasNextPage\n ? dataSourceState.onReachBottom\n : undefined\n }\n options={options}\n placeholder={field.placeholder ?? '請選擇一或多個選項'}\n readOnly={readonly}\n value={selectedOptions}\n />\n );\n }\n\n return (\n <Select\n disabled={optionControlDisabled}\n loading={loading}\n onChange={(nextOption): void =>\n onChange(field.fieldKey, nextOption?.id ?? undefined)\n }\n onReachBottom={\n dataSourceState.hasNextPage\n ? dataSourceState.onReachBottom\n : undefined\n }\n options={options}\n placeholder={field.placeholder ?? '請選擇'}\n readOnly={readonly}\n value={selectedOptions[0] ?? null}\n />\n );\n}\n\nfunction readFieldColumnSpan(\n field: FormFieldDefinition,\n uiSchema: FormUiSchema,\n): number {\n const width =\n uiSchema.layout.find((item) => item.fieldKey === field.fieldKey)?.width ??\n 'FULL';\n const spans: Readonly<Record<typeof width, number>> = {\n FULL: 12,\n HALF: 6,\n THIRD: 4,\n };\n\n return spans[width];\n}\n\nfunction readStringValue(value: FormFieldValue | undefined): string {\n return typeof value === 'string' ? value : '';\n}\n\nfunction readStringArrayValue(\n value: FormFieldValue | undefined,\n): readonly string[] {\n return Array.isArray(value) ? value : [];\n}\n\nfunction readNumberInputValue(value: FormFieldValue | undefined): string {\n return typeof value === 'number' ? String(value) : '';\n}\n\nfunction readInputPlaceholder(type: FormFieldDefinition['type']): string {\n const placeholders: Readonly<Record<FormFieldDefinition['type'], string>> = {\n boolean: '',\n autocomplete: '請輸入或選擇',\n checkbox: '請選擇一或多個選項',\n date: '請選擇日期',\n datetime: '請選擇日期與時間',\n file_upload: '請上傳附件',\n money: '請輸入金額',\n number: '請輸入數字',\n radio: '請選擇一個選項',\n select: '請選擇一個選項',\n text: '請輸入文字',\n textarea: '請輸入多行文字',\n };\n\n return placeholders[type];\n}\n\nexport { FormRenderer as FormRendererView };\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use client";require('../style.css');require('../detail.css');const e=require("./chunk-CMqjfN_6.cjs"),t=require("./auth-provider-4BeCw7cI.cjs"),n=require("./format-date-time-XxBzF0F5.cjs"),r=require("./bpm-form-field-Bc6k4ZEO.cjs"),i=require("./FormRendererView-DNtNodNl.cjs");;/* empty css */let a=require("react"),o=require("@mezzanine-ui/react"),s=require("react/jsx-runtime"),c=require("@rytass/bpm-core-client/workflow"),l=require("@mezzanine-ui/react/ContentHeader");l=e.t(l,1);let u=require("@mezzanine-ui/icons"),d=require("@rytass/bpm-core-client/form"),f=require("@xyflow/react"),p=require("dagre");p=e.t(p,1);let m=require("react-pdf"),h=require("@mezzanine-ui/core/stepper");var g={root:`bpm_root_ehm7w`,toolbar:`bpm_toolbar_R-tis`,pageControls:`bpm_pageControls_jM-rC`,zoomControls:`bpm_zoomControls_7RAbJ`,counter:`bpm_counter_ILUsD`,viewport:`bpm_viewport_DQXms`,page:`bpm_page_Cv5Rg`,state:`bpm_state_bpgp3`},ee=760,te=920,_=320,ne=32,re=.75,v=1.75,y=.25;function b({filename:e,fileUrl:t,onDownload:n}){let r=(0,a.useRef)(null),[i,c]=(0,a.useState)(null),[l,d]=(0,a.useState)(1),[f,p]=(0,a.useState)(1),[h,b]=(0,a.useState)(ee);(0,a.useEffect)(()=>{let e=r.current;if(!e||typeof ResizeObserver>`u`)return;let t=new ResizeObserver(e=>{let t=e[0]?.contentRect.width;t&&b(t)});return t.observe(e),()=>t.disconnect()},[]),(0,a.useEffect)(()=>{c(null),d(1),p(1)},[t]);let ie=(0,a.useMemo)(()=>{let e=Math.max(_,h-ne);return Math.round(Math.min(te,e)*f)},[f,h]),ae=(0,a.useCallback)(e=>{c(e.numPages),d(1)},[]),S=l>1,oe=i!==null&&l<i,C=f>re,w=f<v,T=i===null?`第 ${l} 頁`:`第 ${l} / ${i} 頁`,E=`${Math.round(f*100)}%`;return(0,s.jsxs)(`section`,{"aria-label":`${e} PDF 預覽`,className:g.root,children:[(0,s.jsxs)(`div`,{className:g.toolbar,children:[(0,s.jsxs)(`div`,{className:g.pageControls,"aria-label":`頁面切換`,children:[(0,s.jsx)(o.Button,{"aria-label":`上一頁`,disabled:!S,icon:u.ChevronLeftIcon,onClick:()=>{d(e=>Math.max(1,e-1))},size:`minor`,variant:`base-secondary`}),(0,s.jsx)(o.Typography,{className:g.counter,component:`span`,variant:`body`,children:T}),(0,s.jsx)(o.Button,{"aria-label":`下一頁`,disabled:!oe,icon:u.ChevronRightIcon,onClick:()=>{d(e=>i===null?e:Math.min(i,e+1))},size:`minor`,variant:`base-secondary`})]}),(0,s.jsxs)(`div`,{className:g.zoomControls,"aria-label":`縮放`,children:[(0,s.jsx)(o.Button,{"aria-label":`縮小`,disabled:!C,icon:u.ZoomOutIcon,onClick:()=>{p(e=>Math.max(re,e-y))},size:`minor`,variant:`base-secondary`}),(0,s.jsx)(o.Typography,{className:g.counter,component:`span`,variant:`body`,children:E}),(0,s.jsx)(o.Button,{"aria-label":`放大`,disabled:!w,icon:u.ZoomInIcon,onClick:()=>{p(e=>Math.min(v,e+y))},size:`minor`,variant:`base-secondary`})]}),n?(0,s.jsx)(o.Button,{icon:u.DownloadIcon,iconType:`leading`,onClick:n,size:`minor`,variant:`base-primary`,children:`下載`}):null]}),(0,s.jsx)(`div`,{className:g.viewport,ref:r,children:(0,s.jsx)(m.Document,{error:(0,s.jsx)(x,{message:`PDF 無法載入。`}),file:t,loading:(0,s.jsx)(x,{message:`正在載入 PDF...`}),noData:(0,s.jsx)(x,{message:`沒有可預覽的 PDF。`}),onLoadSuccess:ae,children:(0,s.jsx)(m.Page,{className:g.page,loading:(0,s.jsx)(x,{message:`正在載入頁面...`}),pageNumber:l,renderAnnotationLayer:!0,renderTextLayer:!0,width:ie})})})]})}function x({message:e}){return(0,s.jsx)(`div`,{className:g.state,children:(0,s.jsx)(o.Typography,{color:`text-neutral`,variant:`body`,children:e})})}function ie(e){let t=S(e,`from`),n=S(e,`to`),r=S(e,`reason`);return!t||!n||!r?null:{from:t,reason:r,ruleId:S(e,`ruleId`),to:n}}function ae(e){try{let t=JSON.parse(e);return Array.isArray(t)?t.map(e=>T(e)?ie(e):null).filter(e=>e!==null):[]}catch{return[]}}function S(e,t){let n=e[t];return typeof n==`string`?n:null}function oe(e,t){let n=e[t];return Array.isArray(n)?n.filter(e=>typeof e==`string`):[]}function C(e,t){let n=e[t];return typeof n==`number`?n:null}function w(e){return typeof e==`string`&&e.trim().length>0}function T(e){return typeof e==`object`&&!!e}function E(e){return e.status===`PENDING`||e.status===`IN_PROGRESS`}function D(e){return(0,d.readFormDataSourceErrorMessage)(e)||(e instanceof Error?e.message:`發生未知錯誤`)}function se(e){return!Number.isFinite(e)||e<=0?`-`:e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/1024/1024).toFixed(1)} MB`}function O(e){return e.length>16?`${e.slice(0,12)}...`:e}function k(e){return e===`APPROVED`?`已同意`:e===`CANCELLED`?`已取消`:e===`DRAFT`?`草稿`:e===`EXPIRED`?`已逾期`:e===`REJECTED`?`已拒絕`:e===`RETURNED`?`已退回`:e===`RUNNING`?`進行中`:e}function ce(e){return e===`PENDING`?`待處理`:e===`IN_PROGRESS`?`處理中`:e===`COMPLETED`?`已完成`:e===`CANCELLED`?`已取消`:e===`TRANSFERRED`?`已轉派`:e}function le(e){return e===`APPROVED`?`同意`:e===`REJECTED`?`拒絕`:e===`RETURNED`?`退回`:e===`TRANSFERRED`?`轉派`:e}function A(e){return e===`startEvent`?`開始`:e===`endEvent`?`完成`:e===`userTask`?`簽核節點`:e===`serviceTask`?`知會節點`:e===`exclusiveGateway`?`條件分流`:`平行處理`}function ue(e,t){return t?.nodes.find(t=>t.id===e)?.data.label??e}function j(e,t){if(!e)return`-`;let n=t.get(e);return n?`${n.name}(${n.email})`:e}function de(e,t=new Map){let n=ae(e.delegationChainJson);if(!e.assigneeMemberId)return e.candidateMemberIds.length?`候選 ${e.candidateMemberIds.map(e=>j(e,t)).join(`、`)}`:`未指定`;let r=j(e.assigneeMemberId,t),i=j(e.originalAssigneeMemberId,t);return n.length===0||e.originalAssigneeMemberId===e.assigneeMemberId?r:`${r}(原:${i})`}function fe(e,t){return t?e.assigneeMemberId===t||e.candidateMemberIds.includes(t):!1}function pe(e,t){if(t.type!==`userTask`||!t.data.returnBehavior.allowReturn)return[];if(t.data.returnBehavior.allowedTargets===`ANY`)return e.nodes.filter(e=>e.id!==t.id).map(e=>({id:e.id,name:`${e.data.label}(${A(e.type)})`}));let n=t.data.returnBehavior.allowedTargets===`INITIATOR`?e.nodes.find(e=>e.type===`startEvent`)?.id:e.edges.find(e=>e.target===t.id)?.source,r=e.nodes.find(e=>e.id===n);return r?[{id:r.id,name:`${r.data.label}(${A(r.type)})`}]:[]}function me(e){return{email:e.email,id:e.memberId,name:`${e.name} · ${e.email}`}}function M(e){if(!T(e))return null;let t=e.email,n=e.id,r=e.name;return typeof n==`string`&&typeof r==`string`?{email:typeof t==`string`?t:null,id:n,name:r}:null}function he(e,t){let n=e.trim().toLocaleLowerCase();if(!n)return null;let r=t.filter(e=>[e.id,e.name,e.email??``].some(e=>e.toLocaleLowerCase().includes(n)));return r.length===1?r[0]??null:null}function N(e){return w(e)?{text:e,type:`text`}:null}function ge(e){return w(e)?{text:e,type:`dangerText`}:null}function _e(e,t,n,r){let i=t?n.get(t):null;return{email:i?.email??null,label:i?.name??r,memberId:t,prefix:e,type:`member`}}function P(e){return!!e}function F(e){let t=e.findIndex(e=>e.id.startsWith(`pending-task-`)||e.id.startsWith(`future-node-`));return t===-1?e.length:t}function ve(e){return e.eventType===`INSTANCE_STARTED`||e.eventType===`TASK_DECIDED`||e.eventType===`SLA_TRIGGERED`}function I(e){return e===`APPROVED`?`已同意`:e===`REJECTED`?`已拒絕`:e===`RETURNED`?`已退回`:e===`TRANSFERRED`?`已轉派`:`簽核已決議`}function L(e,t){return e===`INSTANCE_STARTED`?`案件已發起`:e===`TOKEN_CREATED`?`流程路徑已建立`:e===`ENGINE_PROCESS_REQUESTED`?`流程引擎已處理`:e===`TOKEN_ADVANCED`?`流程已前進`:e===`TASK_CREATED`?`待簽任務已建立`:e===`TASK_DECIDED`?I(S(t,`action`)):e===`SLA_TRIGGERED`?`時限提醒已觸發`:e}function ye(e){try{let t=JSON.parse(e.payloadJson);return T(t)?t:{}}catch{return{}}}function be(e,t){return e.eventType===`SLA_TRIGGERED`||S(t,`action`)===`REJECTED`||S(t,`instanceState`)===`REJECTED`}function xe(e){return n.t(e)}function R(e,t,n,r){if(e.eventType===`TASK_CREATED`){let e=S(t,`assigneeMemberId`),n=S(t,`originalAssigneeMemberId`);if(!e){let e=oe(t,`candidateMemberIds`);return e.length?`候選簽核人:${e.map(e=>j(e,r)).join(`、`)}`:null}let i=j(e,r),a=j(n,r);return n&&n!==e?`待簽人:${i}(原簽核人:${a})`:`待簽人:${i}`}if(e.eventType===`TASK_DECIDED`){let e=S(t,`action`),n=S(t,`comment`),i=e?`決議:${le(e)}`:null,a=S(t,`transferToMemberId`);return e===`REJECTED`&&n?[i,`拒絕原因:${n}`].filter(w).join(` · `):e===`APPROVED`&&n?[i,`同意說明:${n}`].filter(w).join(` · `):e===`TRANSFERRED`?[i,`轉派給:${j(a,r)}`].filter(w).join(` · `):i}if(e.eventType===`TOKEN_ADVANCED`){let e=S(t,`action`);if(e)return`流程結果:${le(e)}`;let r=C(t,`arrivedCount`),i=C(t,`requiredCount`);if(r!==null&&i!==null)return`等待匯合:${r}/${i}`;let a=S(t,`fromNodeId`),o=S(t,`toNodeId`);if(a&&o)return`由 ${ue(a,n)} 前進至 ${ue(o,n)}`}if(e.eventType===`ENGINE_PROCESS_REQUESTED`){let e=S(t,`state`);return e?`案件狀態:${k(e)}`:null}return null}function Se(e,t,n,r,i,a,o){if(e.eventType!==`TASK_DECIDED`)return[N(R(e,t,n,o))].filter(P);let s=e.taskId?r.get(e.taskId):null,c=S(t,`action`)??s?.action??null,l=S(t,`comment`)??s?.comment??null,u=S(t,`transferToMemberId`)??s?.transferToMemberId??null,d=S(t,`signatureId`)??s?.signatureId??null,f=d?i.get(d):null;return[N(c?`決議:${le(c)}`:null),c===`REJECTED`?ge(`拒絕原因:${l??`-`}`):null,c===`APPROVED`&&l?N(`同意說明:${l}`):null,c===`RETURNED`?N(`退回說明:${l??`-`}`):null,c===`TRANSFERRED`?N(`轉派給:${j(u,o)}`):null,c===`TRANSFERRED`?N(`轉派說明:${l??`-`}`):null,f?N(a?.valid?`簽章:已驗證(${O(f.signedPayloadHash)})`:`簽章:待檢查(${O(f.signedPayloadHash)})`):null].filter(P)}function z(e,t,n,r,i){if(e.type===`startEvent`||i.has(e.id))return!1;if(r===`REJECTED`)return!0;let a=De(e,t,n,r);return a.tone===`neutral`||a.tone===`waiting`}function B(e,t,n,r,i){if(r!==`RUNNING`&&r!==`REJECTED`)return[];let a=e.nodes.filter(e=>z(e,t,n,r,i)),o=Ce(e,a,t,n,i),s=new Map(e.nodes.map((e,t)=>[e.id,t]));return a.filter(e=>o.has(e.id)).sort((e,t)=>{let n=o.get(e.id)??0,r=o.get(t.id)??0;return n===r?e.position.x===t.position.x?e.position.y===t.position.y?(s.get(e.id)??0)-(s.get(t.id)??0):e.position.y-t.position.y:e.position.x-t.position.x:n-r})}function Ce(e,t,n,r,i){let a=new Set(t.map(e=>e.id)),o=e.edges.reduce((e,t)=>{let n=[...e.get(t.source)??[],t.target];return new Map(e).set(t.source,n)},new Map);return we(e,n,r,i).reduce((e,t)=>Ee(e,Te(t,o,a)),new Map)}function we(e,t,n,r){let i=n.filter(e=>e.status===`ACTIVE`||e.status===`WAITING`).map(e=>e.currentNodeId),a=t.filter(E).map(e=>e.nodeId),o=e.nodes.filter(e=>r.has(e.id)).map(e=>e.id),s=[...new Set([...i,...a,...o])],c=e.nodes.filter(e=>e.type===`startEvent`).map(e=>e.id);return s.length>0?s:c}function Te(e,t,n){return V([{distance:0,nodeId:e}],t,n)}function V(e,t,n,r=new Set,i=new Map){let[a,...o]=e;if(!a)return i;if(r.has(a.nodeId))return V(o,t,n,r,i);let s=new Set(r).add(a.nodeId),c=n.has(a.nodeId)?new Map(i).set(a.nodeId,Math.min(i.get(a.nodeId)??a.distance,a.distance)):i;return V([...o,...(t.get(a.nodeId)??[]).map(e=>({distance:a.distance+1,nodeId:e}))],t,n,s,c)}function Ee(e,t){return[...t.entries()].reduce((e,[t,n])=>new Map(e).set(t,Math.min(e.get(t)??n,n)),e)}function H(e){return e.type===`userTask`?`未來簽核:${e.data.label}`:e.type===`serviceTask`?`未來知會:${e.data.label}`:e.type===`exclusiveGateway`?`未來分流:${e.data.label}`:e.type===`parallelGateway`?`未來匯合:${e.data.label}`:e.type===`endEvent`?`流程完成:${e.data.label}`:`未來節點:${e.data.label}`}function U(e,t,n,r,i,a,o,s,c){let l=e.filter(ve).map(e=>{let t=ye(e),n=e.nodeId?ue(e.nodeId,r):null;return{descriptionParts:[N(n?`節點:${n}`:`節點:全流程`),_e(`操作者`,e.actorMemberId,a,`系統`),N(`時間:${xe(e.createdAt)}`),...Se(e,t,r,o,s,c,a)].filter(P),error:be(e,t),id:e.id,title:L(e.eventType,t)}}),u=t.filter(E).map(e=>({descriptionParts:[N(`節點:${ue(e.nodeId,r)}`),_e(`處理者`,e.assigneeMemberId,a,`未指定`),N(`建立時間:${xe(e.createdAt)}`)].filter(P),error:!1,id:`pending-task-${e.id}`,title:e.status===`IN_PROGRESS`?`簽核處理中`:`等待簽核處理`})),d=new Set([...e.filter(ve).map(e=>e.nodeId),...t.map(e=>e.nodeId)].filter(w)),f=r?B(r,t,n,i,d).map(e=>({descriptionParts:[N(`${A(e.type)} · 尚未抵達`)].filter(P),error:!1,forcePending:!0,id:`future-node-${e.id}`,title:H(e)})):[];return[...l,...u,...f]}function De(e,t,n,r){let i=t.filter(t=>t.nodeId===e.id),a=i.find(e=>e.status===`PENDING`||e.status===`IN_PROGRESS`),o=i.find(e=>e.status===`CANCELLED`),s=i.find(e=>e.status===`COMPLETED`),c=n.filter(t=>t.currentNodeId===e.id),l=c.find(e=>e.status===`ACTIVE`),u=c.find(e=>e.status===`WAITING`);return a?{secondaryLabel:`處理者 ${de(a)}`,statusLabel:`待處理`,tone:`current`}:o?{secondaryLabel:`已取消 ${de(o)}`,statusLabel:`已取消`,tone:`cancelled`}:s?{secondaryLabel:`已完成 ${de(s)}`,statusLabel:`已完成`,tone:`completed`}:l?{secondaryLabel:`token ${l.id}`,statusLabel:`執行中`,tone:`current`}:u?{secondaryLabel:`token ${u.id}`,statusLabel:`等待前置`,tone:`waiting`}:e.type===`startEvent`?{secondaryLabel:`流程已發起`,statusLabel:`已發起`,tone:`completed`}:e.type===`endEvent`&&r!==`RUNNING`?{secondaryLabel:r,statusLabel:r===`REJECTED`?`已拒絕`:`已完成`,tone:r===`REJECTED`?`cancelled`:`completed`}:{secondaryLabel:A(e.type),statusLabel:`未抵達`,tone:`neutral`}}async function Oe({activityLogs:e,adhocDirectives:t=[],tasks:n}){let r=[...new Set([...e.map(e=>e.actorMemberId),...n.map(e=>e.assigneeMemberId),...n.map(e=>e.originalAssigneeMemberId),...n.flatMap(e=>e.candidateMemberIds),...n.flatMap(e=>ae(e.delegationChainJson).flatMap(e=>[e.from,e.to])),...t.flatMap(e=>[e.createdByMemberId,...ke(e.targetValueJson)])].filter(w))];try{return await(0,c.resolveMemberProfiles)(r)}catch{return[]}}function ke(e){try{return(JSON.parse(e).memberIds??[]).filter(e=>typeof e==`string`)}catch{return[]}}async function Ae(e){return(await Promise.all(e.map(e=>(0,c.listTaskDecisions)(e.id)))).flat()}function je(e){return e.reduce((e,t)=>{let n=e.get(t.taskId),r=!n||new Date(t.decidedAt).getTime()>new Date(n.decidedAt).getTime()?t:n;return new Map(e).set(t.taskId,r)},new Map)}var W={display:`grid`,gap:16},G={display:`flex`,flexWrap:`wrap`,gap:8};function Me({canResubmitInstance:e,deciding:t,error:n,instance:r,loading:a,onDataSourceStateChange:c,onResubmitFormChange:l,onResubmitInstance:d,onUploadAttachment:f,resubmitFormData:p,resubmitFormErrors:m}){return(0,s.jsxs)(`div`,{style:W,children:[n?(0,s.jsx)(o.Typography,{color:`text-error`,variant:`body`,children:n}):null,a?(0,s.jsx)(o.Typography,{color:`text-neutral`,variant:`body`,children:`載入中...`}):null,r?.formDefinitionSnapshot.schema&&r.formDefinitionSnapshot.uiSchema?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.t,{dataSourceContext:e?{instanceId:r.id,kind:`runtime`,templateId:r.templateId}:void 0,dataSourceInitialValues:r.formData,errors:m,onChange:e=>{l(e)},onDataSourceStateChange:c,onUploadAttachment:e?f:void 0,optionSnapshots:r.formDataOptionSnapshot,readonly:!e,schema:r.formDefinitionSnapshot.schema,uiSchema:r.formDefinitionSnapshot.uiSchema,value:e?p:r.formData}),e?(0,s.jsx)(`div`,{style:G,children:(0,s.jsx)(o.Button,{disabled:t,icon:u.RefreshCcwIcon,iconType:`leading`,onClick:d,variant:`base-primary`,children:`重新送出`})}):null]}):(0,s.jsx)(o.Typography,{color:`text-neutral`,variant:`body`,children:`此案件沒有可顯示的表單快照。`})]})}var Ne={display:`grid`,gap:16};function K({attachments:e,onDownload:t,onPreview:r}){let i=(0,a.useMemo)(()=>e.map(e=>({attachment:e,createdAt:e.createdAt,filename:e.filename,id:e.id,key:e.id,mimeType:e.mimeType,sizeLabel:se(Number(e.sizeBytes))})),[e]),c=(0,a.useMemo)(()=>[{dataIndex:`filename`,key:`filename`,title:`檔名`,width:260},{dataIndex:`mimeType`,key:`mimeType`,title:`類型`,width:180},{dataIndex:`sizeLabel`,key:`sizeLabel`,title:`大小`,width:120},{key:`createdAt`,render:e=>(0,s.jsx)(o.Typography,{component:`span`,variant:`body`,children:n.t(e.createdAt)}),title:`上傳時間`,width:220}],[]),l=(0,a.useMemo)(()=>({render:e=>[...e.mimeType===`application/pdf`?[{icon:u.FileSearchIcon,iconType:`leading`,name:`預覽`,onClick:()=>{r(e.attachment)}}]:[],{icon:u.DownloadIcon,iconType:`leading`,name:`下載`,onClick:()=>{t(e.attachment)}}],variant:`base-secondary`,width:160}),[t,r]);return(0,s.jsxs)(`div`,{style:Ne,children:[(0,s.jsx)(o.Typography,{component:`h2`,variant:`h3`,children:`附件`}),i.length>0?(0,s.jsx)(o.Table,{actions:l,columns:c,dataSource:i,fullWidth:!0}):(0,s.jsx)(o.Typography,{color:`text-neutral`,variant:`body`,children:`此案件沒有附件。`})]})}var Pe={display:`grid`,gap:12,width:`100%`},q={minWidth:`100%`,width:`100%`},Fe={display:`grid`,gap:12,width:`100%`},Ie={marginTop:12},J={marginTop:24};function Le(e){e&&(e.style.width=`100%`)}var Re={COMPLETION_NOTIFY:`結案通知`,COUNTERSIGN:`臨時會簽`,PRE_APPROVAL:`臨時加簽`,STAGE_NOTIFY:`階段完成通知`},ze={COMPLETION_NOTIFY:`本張單到達結案狀態(核准 / 拒絕 / 取消)後,通知指定對象。`,COUNTERSIGN:`指定對象會併入下一層簽核,下一層需所有人都完成才會繼續。`,PRE_APPROVAL:`指定對象需先完成加簽,本階段才會往下一層繼續。`,STAGE_NOTIFY:`本階段完成後(不論通過與否)通知指定對象。`},Y=[{id:`REJECT_INSTANCE`,name:`加簽拒絕時整單駁回`},{id:`RETURN_TO_ORIGIN`,name:`加簽拒絕時退回給我重新處理`}],Be=[{id:`MEMBER`,name:`指定成員`},{id:`WEBHOOK`,name:`Webhook`}],X=(0,a.forwardRef)(function({adhocDirectives:e,currentMemberId:t,instance:i,memberProfilesById:l,onChanged:u,tasks:d},f){let[p,m]=(0,a.useState)(!1),[h,g]=(0,a.useState)(null),[ee,te]=(0,a.useState)(``),[_,ne]=(0,a.useState)(!1),[re,v]=(0,a.useState)(``),[y,b]=(0,a.useState)(null),[x,ie]=(0,a.useState)(!1),[ae,S]=(0,a.useState)(``),[oe,C]=(0,a.useState)(!1),[w,T]=(0,a.useState)(null),[E,se]=(0,a.useState)(``),[O,k]=(0,a.useState)(null),[le,A]=(0,a.useState)(!1),[N,ge]=(0,a.useState)([]),[_e,P]=(0,a.useState)(!1),[F,ve]=(0,a.useState)(``),[I,L]=(0,a.useState)(null),[ye,be]=(0,a.useState)(!1),[xe,R]=(0,a.useState)([]),[Se,z]=(0,a.useState)(!1),[B,Ce]=(0,a.useState)(`COUNTERSIGN`),[we,Te]=(0,a.useState)(`REJECT_INSTANCE`),[V,Ee]=(0,a.useState)(!1),[H,U]=(0,a.useState)(`MEMBER`),[De,Oe]=(0,a.useState)(``),ke=re.trim(),Ae=ae.trim(),je=E.trim(),W=(0,a.useMemo)(()=>d.find(e=>fe(e,t)&&(e.status===`PENDING`||e.status===`IN_PROGRESS`))??null,[t,d]),G=(0,a.useMemo)(()=>W&&i?i.workflowSnapshot.nodes.find(e=>e.id===W.nodeId)??null:null,[W,i]),Me=(0,a.useMemo)(()=>G&&i?pe(i.workflowSnapshot,G):[],[G,i]),Ne=G?.type===`userTask`&&G.data.returnBehavior.allowReturn,K=G?.type===`userTask`&&G.data.allowReject!==!1,X=G?.type===`userTask`&&G.data.allowTransfer!==!1,He=G?.type===`userTask`&&G.data.returnBehavior.requireComment===!0,Ue=G?.type===`userTask`&&G.data.allowAddSigner,We=(0,a.useMemo)(()=>e.filter(e=>e.status===`PENDING`),[e]),Ge=Me.find(e=>e.id===w)??Me[0]??null,Ke=(0,a.useMemo)(()=>d.map(e=>({...e,assigneeLabel:de(e,l),key:e.id,nodeLabel:`${ue(e.nodeId,i?.workflowSnapshot??null)}${e.isAdhoc?e.adhocType===`COUNTERSIGN`?`(臨時會簽)`:`(臨時加簽)`:``}`,statusLabel:ce(e.status)})),[i,l,d]),Z=(0,a.useMemo)(()=>[{dataIndex:`nodeLabel`,key:`nodeLabel`,title:`節點`,width:180},{key:`assigneeMemberId`,title:`處理者`,render:e=>(0,s.jsx)(o.Typography,{component:`span`,variant:`body`,children:e.assigneeLabel}),width:180},{dataIndex:`statusLabel`,key:`statusLabel`,title:`狀態`,width:120},{key:`createdAt`,render:e=>(0,s.jsx)(o.Typography,{component:`span`,variant:`body`,children:n.t(e.createdAt)}),title:`建立時間`,width:220}],[]),qe=(0,a.useMemo)(()=>We.map(e=>({...e,createdByLabel:j(e.createdByMemberId,l),key:e.id,targetLabel:Ve(e,l),typeLabel:Re[e.type]})),[l,We]),Je=(0,a.useMemo)(()=>[{dataIndex:`typeLabel`,key:`typeLabel`,title:`類型`,width:180},{key:`targetLabel`,render:e=>(0,s.jsx)(o.Typography,{component:`span`,variant:`body`,children:e.targetLabel}),title:`對象`,width:220},{key:`createdByLabel`,render:e=>(0,s.jsx)(o.Typography,{component:`span`,variant:`body`,children:e.createdByLabel}),title:`設定者`,width:180},{key:`createdAt`,render:e=>(0,s.jsx)(o.Typography,{component:`span`,variant:`body`,children:n.t(e.createdAt)}),title:`建立時間`,width:220},{key:`actions`,render:e=>e.createdByMemberId===t?(0,s.jsx)(o.Button,{disabled:V,onClick:()=>void pt(e.id),size:`minor`,variant:`destructive-secondary`,children:`撤回`}):(0,s.jsx)(s.Fragment,{}),title:`操作`,width:100}],[V,t]);async function Ye({action:e,comment:n,returnToNodeId:r=null,transferToMemberId:i=null}){if(!t||!W||e===`REJECTED`&&!K||e===`TRANSFERRED`&&!X)return!1;m(!0),g(null);try{await(0,c.decideTask)({action:e,comment:n,decidedByMemberId:t,returnToNodeId:r,taskId:W.id,transferToMemberId:i}),ie(!1),C(!1),P(!1),v(``),S(``),se(``),k(null),T(null),b(null)}catch(e){return g(D(e)),m(!1),!1}try{await u()}catch(e){g(D(e))}finally{m(!1)}return!0}function Xe(){!t||!W||(g(null),te(``),ne(!0))}function Ze(){p||(ne(!1),te(``))}async function Qe(){p||await Ye({action:`APPROVED`,comment:ee.trim()||null})&&(ne(!1),te(``))}function $e(){K&&(v(``),b(null),ie(!0))}function Q(){p||(ie(!1),v(``),b(null))}function et(){S(``),T(Me[0]?.id??null),C(!0)}function tt(){p||(C(!1),S(``),T(null))}function nt(){X&&(se(``),k(null),P(!0),it(``))}function rt(){p||(P(!1),se(``),k(null))}async function it(e){A(!0);try{ge((await(0,c.searchMembers)(e)).filter(e=>e.memberId!==t).map(me))}catch(e){g(D(e))}finally{A(!1)}}async function at(){if(K){if(!ke){b(`請輸入拒絕原因`);return}await Ye({action:`REJECTED`,comment:ke})}}async function ot(){if(X){if(!O){g(`請選擇轉派對象`);return}await Ye({action:`TRANSFERRED`,comment:je||null,transferToMemberId:O.id})}}async function st(){await Ye({action:`RETURNED`,comment:Ae||null,returnToNodeId:Ge?.id??null})}function ct(){ve(``),L(null),Te(`REJECT_INSTANCE`),U(`MEMBER`),Oe(``)}function lt(e){Ce(e),ct(),z(!0),dt(``)}function ut(){V||(z(!1),ct())}async function dt(e){be(!0);try{R((await(0,c.searchMembers)(e)).map(me))}catch(e){g(D(e))}finally{be(!1)}}async function ft(){if(!W)return;let e=(B===`STAGE_NOTIFY`||B===`COMPLETION_NOTIFY`)&&H===`WEBHOOK`,t=De.trim(),n=I;if(e&&!t){g(`請輸入 Webhook URL`);return}if(!e&&!n){g(`請選擇對象成員`);return}let r=e||!n?{kind:`WEBHOOK`,webhookUrl:t}:{kind:`MEMBER`,memberIds:[n.id]},i=F.trim()||null;Ee(!0),g(null);try{B===`COUNTERSIGN`?await(0,c.requestAdhocCountersign)({comment:i,target:r,taskId:W.id}):B===`PRE_APPROVAL`?await(0,c.requestAdhocPreApproval)({comment:i,onReject:we,target:r,taskId:W.id}):B===`STAGE_NOTIFY`?await(0,c.configureAdhocStageNotification)({target:r,taskId:W.id}):await(0,c.configureAdhocCompletionNotification)({target:r,taskId:W.id}),z(!1),ct(),await u()}catch(e){g(D(e))}finally{Ee(!1)}}async function pt(e){Ee(!0),g(null);try{await(0,c.cancelAdhocDirective)(e),await u()}catch(e){g(D(e))}finally{Ee(!1)}}(0,a.useImperativeHandle)(f,()=>({canAddSignerCurrentTask:Ue,canRejectCurrentTask:K,canReturnCurrentTask:Ne,canTransferCurrentTask:X,deciding:p,handleApprove:Xe,hasCurrentTask:W!==null,openAdhocModal:lt,openRejectModal:$e,openReturnModal:et,openTransferModal:nt}),[Ue,K,Ne,X,t,W,p]);let $=B===`STAGE_NOTIFY`||B===`COMPLETION_NOTIFY`,mt=$&&H===`WEBHOOK`?!De.trim():!I,ht=Y.find(e=>e.id===we)??Y[0],gt=Be.find(e=>e.id===H)??Be[0];return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(o.Typography,{component:`h2`,variant:`h3`,children:`任務`}),h?(0,s.jsx)(o.Typography,{color:`text-error`,variant:`body`,children:h}):null,(0,s.jsx)(`div`,{style:Ie,children:(0,s.jsx)(o.Table,{columns:Z,dataSource:Ke,fullWidth:!0})}),We.length>0?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(o.Typography,{component:`h3`,style:J,variant:`h3`,children:`待生效的臨時設定`}),(0,s.jsx)(`div`,{style:Ie,children:(0,s.jsx)(o.Table,{columns:Je,dataSource:qe,fullWidth:!0})})]}):null,(0,s.jsxs)(o.Modal,{cancelText:`取消`,confirmText:`送出同意`,loading:p,modalType:`standard`,onCancel:Ze,onClose:Ze,onConfirm:()=>void Qe(),open:_,showModalFooter:!0,showModalHeader:!0,size:`regular`,supportingText:`可以留下同意的說明,內容會記錄在簽核歷程;不填也可以直接送出。`,title:`簽核意見`,children:[h?(0,s.jsx)(o.Typography,{color:`text-error`,role:`alert`,variant:`body`,children:h}):null,(0,s.jsx)(`div`,{style:Pe,children:(0,s.jsx)(r.t,{label:`簽核意見`,name:`approveComment`,children:(0,s.jsx)(o.Textarea,{autoFocus:!0,onChange:e=>te(e.target.value),placeholder:`選填,例如補充核准的條件或提醒事項`,ref:Le,resize:`vertical`,rows:4,style:q,value:ee})})})]}),(0,s.jsx)(o.Modal,{cancelText:`取消`,confirmButtonProps:{disabled:!ke,variant:`destructive-primary`},confirmText:`送出拒絕`,loading:p,modalStatusType:`error`,modalType:`standard`,onCancel:Q,onClose:Q,onConfirm:()=>void at(),open:x,showModalFooter:!0,showModalHeader:!0,size:`regular`,supportingText:`拒絕案件時必須留下原因,供發起人與後續追蹤查看。`,title:`拒絕原因`,children:(0,s.jsxs)(`div`,{style:Pe,children:[(0,s.jsx)(r.t,{label:`拒絕原因`,name:`rejectReason`,required:!0,children:(0,s.jsx)(o.Textarea,{autoFocus:!0,onChange:e=>{v(e.target.value),b(null)},placeholder:`請說明拒絕原因`,ref:Le,resize:`vertical`,rows:4,style:q,type:y?`error`:`default`,value:re})}),y?(0,s.jsx)(o.Typography,{color:`text-error`,variant:`body`,children:y}):null]})}),(0,s.jsx)(o.Modal,{cancelText:`取消`,confirmButtonProps:{disabled:!O},confirmText:`送出轉派`,loading:p,modalType:`standard`,onCancel:rt,onClose:rt,onConfirm:()=>void ot(),open:_e,showModalFooter:!0,showModalHeader:!0,size:`regular`,supportingText:`轉派後,原任務會保留轉派紀錄,新的待簽任務會指派給指定成員。`,title:`轉派簽核`,children:(0,s.jsxs)(`div`,{style:Fe,children:[(0,s.jsx)(r.t,{label:`轉派對象`,name:`transferToMemberId`,required:!0,children:(0,s.jsx)(o.AutoComplete,{asyncData:!0,disabledOptionsFilter:!0,emptyText:`沒有符合的成員`,inputProps:{autoCapitalize:`none`,autoCorrect:`off`,name:`transfer-member-search`,spellCheck:!1},loading:le,loadingText:`搜尋成員中...`,mode:`single`,onChange:e=>k(M(e)),onSearch:it,onSearchTextChange:e=>k(he(e,N)),onVisibilityChange:e=>{e&&it(``)},options:[...N],placeholder:`搜尋姓名或信箱`,searchDebounceTime:300,value:O})}),(0,s.jsx)(r.t,{label:`轉派說明`,name:`transferComment`,children:(0,s.jsx)(o.Textarea,{onChange:e=>se(e.target.value),placeholder:`可補充轉派原因`,ref:Le,resize:`vertical`,rows:4,style:q,value:E})})]})}),(0,s.jsx)(o.Modal,{cancelText:`取消`,confirmButtonProps:{disabled:!Ge||He&&!Ae},confirmText:`送出退回`,loading:p,modalType:`standard`,onCancel:tt,onClose:tt,onConfirm:()=>void st(),open:oe,showModalFooter:!0,showModalHeader:!0,size:`regular`,supportingText:`退回後,流程會回到指定節點並等待重新處理。`,title:`退回簽核`,children:(0,s.jsxs)(`div`,{style:Fe,children:[(0,s.jsx)(r.t,{label:`退回節點`,name:`returnTargetNodeId`,required:!0,children:(0,s.jsx)(o.Select,{clearable:!1,fullWidth:!0,onChange:e=>T(e?.id??null),options:[...Me],placeholder:`選擇退回節點`,value:Ge})}),(0,s.jsx)(r.t,{hintText:He?`此關卡設定退回時必須填寫意見。`:void 0,label:`退回說明`,name:`returnComment`,required:He,children:(0,s.jsx)(o.Textarea,{onChange:e=>S(e.target.value),placeholder:He?`請說明退回原因`:`可補充需要修改的內容`,ref:Le,resize:`vertical`,rows:4,style:q,value:ae})})]})}),(0,s.jsx)(o.Modal,{cancelText:`取消`,confirmButtonProps:{disabled:mt},confirmText:`送出`,loading:V,modalType:`standard`,onCancel:ut,onClose:ut,onConfirm:()=>void ft(),open:Se,showModalFooter:!0,showModalHeader:!0,size:`regular`,supportingText:ze[B],title:Re[B],children:(0,s.jsxs)(`div`,{style:Fe,children:[$?(0,s.jsx)(r.t,{label:`通知時機`,name:`adhocNotifyMode`,required:!0,children:(0,s.jsx)(o.Select,{clearable:!1,fullWidth:!0,onChange:e=>Ce(e?.id===`COMPLETION_NOTIFY`?`COMPLETION_NOTIFY`:`STAGE_NOTIFY`),options:[{id:`STAGE_NOTIFY`,name:Re.STAGE_NOTIFY},{id:`COMPLETION_NOTIFY`,name:Re.COMPLETION_NOTIFY}],value:{id:B,name:Re[B]}})}):null,$?(0,s.jsx)(r.t,{label:`通知對象類型`,name:`adhocTargetKind`,required:!0,children:(0,s.jsx)(o.Select,{clearable:!1,fullWidth:!0,onChange:e=>U(e?.id===`WEBHOOK`?`WEBHOOK`:`MEMBER`),options:[...Be],value:gt})}):null,$&&H===`WEBHOOK`?(0,s.jsx)(r.t,{label:`Webhook URL`,name:`adhocWebhookUrl`,required:!0,children:(0,s.jsx)(o.Input,{fullWidth:!0,onChange:e=>Oe(e.target.value),placeholder:`https://example.com/webhook`,value:De})}):(0,s.jsx)(r.t,{label:$?`通知對象`:`簽核對象`,name:`adhocMemberId`,required:!0,children:(0,s.jsx)(o.AutoComplete,{asyncData:!0,disabledOptionsFilter:!0,emptyText:`沒有符合的成員`,inputProps:{autoCapitalize:`none`,autoCorrect:`off`,name:`adhoc-member-search`,spellCheck:!1},loading:ye,loadingText:`搜尋成員中...`,mode:`single`,onChange:e=>L(M(e)),onSearch:dt,onSearchTextChange:e=>L(he(e,xe)),onVisibilityChange:e=>{e&&dt(``)},options:[...xe],placeholder:`搜尋姓名或信箱`,searchDebounceTime:300,value:I})}),B===`PRE_APPROVAL`?(0,s.jsx)(r.t,{label:`拒簽處理方式`,name:`adhocOnReject`,required:!0,children:(0,s.jsx)(o.Select,{clearable:!1,fullWidth:!0,onChange:e=>Te(e?.id===`RETURN_TO_ORIGIN`?`RETURN_TO_ORIGIN`:`REJECT_INSTANCE`),options:[...Y],value:ht})}):null,$?null:(0,s.jsx)(r.t,{label:`說明`,name:`adhocComment`,children:(0,s.jsx)(o.Textarea,{onChange:e=>ve(e.target.value),placeholder:`可補充原因`,ref:Le,resize:`vertical`,rows:3,style:q,value:F})})]})})]})});function Ve(e,t){try{let n=JSON.parse(e.targetValueJson);if(n.memberIds?.length)return n.memberIds.map(e=>j(e,t)).join(`、`);if(n.webhookUrl)return n.webhookUrl;if(n.positionId)return`職位 ${n.positionId}`;if(n.orgUnitId)return`部門 ${n.orgUnitId}`}catch{}return e.targetKind}var He={display:`grid`,gap:16};function Ue({signatureVerification:e,signatures:t}){let r=(0,a.useMemo)(()=>t.map(e=>({algorithm:e.algorithm,hashLabel:O(e.signedPayloadHash),key:e.id,keyVersion:e.keyVersion,signedAtLabel:n.t(e.signedAt),signerMemberId:e.signerMemberId})),[t]),i=(0,a.useMemo)(()=>[{dataIndex:`signerMemberId`,key:`signerMemberId`,title:`簽章者`,width:160},{dataIndex:`algorithm`,key:`algorithm`,title:`演算法`,width:150},{dataIndex:`keyVersion`,key:`keyVersion`,title:`Key 版本`,width:100},{dataIndex:`hashLabel`,key:`hashLabel`,title:`Payload Hash`,width:180},{dataIndex:`signedAtLabel`,key:`signedAtLabel`,title:`簽章時間`,width:220}],[]);return(0,s.jsxs)(`div`,{style:He,children:[(0,s.jsx)(o.Typography,{component:`h2`,variant:`h3`,children:`簽章`}),(0,s.jsx)(o.Typography,{color:e?.valid?`text-success`:`text-error`,variant:`body`,children:e?e.valid?`簽章鏈已驗證,共 ${e.checkedCount} 筆。`:`簽章鏈驗證失敗:${e.errors.join(`、`)}`:`尚無簽章紀錄。`}),r.length>0?(0,s.jsx)(o.Table,{columns:i,dataSource:r,fullWidth:!0}):null]})}var We={display:`grid`,gap:16},Ge={cursor:`help`,textDecoration:`underline dotted`,textUnderlineOffset:3},Ke={color:`var(--mzn-color-text-error)`};function Z(...e){return e.filter(e=>w(e??null)).join(` `)}var qe=(0,a.forwardRef)(function({className:e,descriptionParts:t,error:n,forcePending:r=!1,index:i=0,orientation:c,status:l=`pending`,title:u,type:d=`number`,...f},p){let m=r?`pending`:l;return(0,s.jsxs)(`div`,{...f,className:Z(h.stepClasses.host,d===`dot`?h.stepClasses.dot:null,n&&m!==`processing`?h.stepClasses.error:null,c===`horizontal`?h.stepClasses.horizontal:null,d===`number`?h.stepClasses.number:null,m===`pending`?h.stepClasses.pending:null,m===`processing`?h.stepClasses.processing:null,n&&m===`processing`?h.stepClasses.processingError:null,!n&&m===`succeeded`?h.stepClasses.succeeded:null,c===`vertical`?h.stepClasses.vertical:null,e),ref:p,children:[d===`dot`?(0,s.jsx)(`span`,{className:Z(h.stepClasses.statusIndicator,h.stepClasses.statusIndicatorDot)}):(0,s.jsx)(`span`,{className:h.stepClasses.statusIndicator,children:i+1}),(0,s.jsxs)(`div`,{className:h.stepClasses.textContainer,children:[(0,s.jsxs)(o.Typography,{className:h.stepClasses.title,variant:`label-primary-highlight`,children:[u,(0,s.jsx)(`span`,{className:h.stepClasses.titleConnectLine})]}),t.length>0?(0,s.jsx)(o.Typography,{className:h.stepClasses.description,variant:`caption`,children:t.map((e,t)=>(0,s.jsxs)(a.Fragment,{children:[t>0?` · `:null,Je(e)]},`${e.type}-${t}`))}):null]})]})});function Je(e){return e.type===`text`?e.text:e.type===`dangerText`?(0,s.jsx)(`span`,{style:Ke,children:e.text}):e.email?(0,s.jsxs)(s.Fragment,{children:[e.prefix,`:`,(0,s.jsx)(o.Tooltip,{title:e.email,children:({onMouseEnter:t,onMouseLeave:n,ref:r})=>(0,s.jsx)(`span`,{"data-testid":e.memberId?`member-tooltip-${e.memberId}`:void 0,onMouseEnter:t,onMouseLeave:n,ref:r,style:Ge,children:e.label})})]}):`${e.prefix}:${e.label}`}function Ye({activityLogs:e,instanceState:t,memberProfilesById:n,signatureVerification:r,signaturesById:i,taskDecisionsByTaskId:a,tasks:c,workflowSnapshot:l,workflowTokens:u}){let d=U(e,c,u,l,t,n,a,i,r),f=F(d),p=d.map(e=>({...e,descriptionParts:e.descriptionParts.filter(P)}));return(0,s.jsxs)(`div`,{style:We,children:[(0,s.jsx)(o.Typography,{component:`h2`,variant:`h3`,children:`歷程`}),p.length>0?(0,s.jsx)(o.Stepper,{currentStep:f,orientation:`vertical`,type:`dot`,children:p.map(e=>(0,s.jsx)(qe,{descriptionParts:e.descriptionParts,error:e.error,forcePending:e.forcePending,title:e.title},e.id))}):(0,s.jsx)(o.Typography,{color:`text-neutral`,variant:`body`,children:`尚無歷程紀錄。`})]})}var Xe=184,Ze=96,Qe={display:`grid`,gap:16},$e={background:`#f8fafc`,border:`1px solid #e2e8f0`,borderRadius:8,height:`min(64vh, 620px)`,minHeight:440,overflow:`hidden`,width:`min(80vw, 1040px)`},Q={background:`#ffffff`,border:`1px solid #cbd5e1`,borderRadius:8,boxShadow:`0 8px 18px rgba(15, 23, 42, 0.08)`,display:`grid`,gap:6,minHeight:82,padding:12,width:184},et={borderRadius:999,fontSize:12,fontWeight:600,justifySelf:`start`,lineHeight:`18px`,padding:`0 8px`},tt={color:`#64748b`,fontSize:12,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},nt={opacity:0},rt={display:`flex`,flexWrap:`wrap`,gap:8},it={alignItems:`center`,background:`#ffffff`,border:`1px solid #cbd5e1`,borderRadius:8,color:`#334155`,display:`inline-flex`,fontSize:12,fontWeight:600,gap:6,lineHeight:`20px`,padding:`4px 8px`},at={display:`grid`,gap:16},ot={workflowRuntime:ht};function st({instanceId:e,showAttachments:p=!0,showForm:m=!0,showHistory:h=!0,showSignatures:g=!0,showTasks:ee=!0}){let{member:te}=t.n(),_=te?.memberId??null,[ne,re]=(0,a.useState)([]),[v,y]=(0,a.useState)(null),[x,ie]=(0,a.useState)([]),[ae,S]=(0,a.useState)([]),[oe,C]=(0,a.useState)([]),[w,T]=(0,a.useState)(null),[E,se]=(0,a.useState)([]),[O,ce]=(0,a.useState)([]),[le,A]=(0,a.useState)([]),[ue,j]=(0,a.useState)(null),[de,pe]=(0,a.useState)(!0),[me,M]=(0,a.useState)(!1),[he,N]=(0,a.useState)(!1),[ge,_e]=(0,a.useState)(``),[P,F]=(0,a.useState)(!1),[ve,I]=(0,a.useState)({}),[L,ye]=(0,a.useState)({}),[be,xe]=(0,a.useState)({}),[R,Se]=(0,a.useState)(null),[z,B]=(0,a.useState)(null),[Ce,we]=(0,a.useState)([]),Te=ge.trim(),V=(0,a.useRef)(null);(0,a.useEffect)(()=>{Y()},[_,e]),(0,a.useEffect)(()=>{ye(v?.formData??{}),xe({})},[v]);let Ee=(0,a.useCallback)((e,t)=>{xe(n=>{let r=n[e];return r?.hasValue===t.hasValue&&r.status===t.status?n:{...n,[e]:{hasValue:t.hasValue,status:t.status}}})},[]),H=(0,a.useMemo)(()=>E.find(e=>fe(e,_)&&(e.status===`PENDING`||e.status===`IN_PROGRESS`))??null,[_,E]),U=(0,a.useMemo)(()=>H&&v?v.workflowSnapshot.nodes.find(e=>e.id===H.nodeId)??null:null,[H,v]),De=U?.type===`userTask`&&U.data.returnBehavior.allowReturn,ke=U?.type===`userTask`&&U.data.allowReject!==!1,W=U?.type===`userTask`&&U.data.allowTransfer!==!1,G=U?.type===`userTask`&&U.data.allowAddSigner,Ne=!!(v&&v.initiatorMemberId===_&&(v.state===`RUNNING`||v.state===`RETURNED`)),Pe=!!(v&&v.initiatorMemberId===_&&v.state===`RETURNED`),q=(0,a.useMemo)(()=>new Map(le.map(e=>[e.memberId,e])),[le]),Fe=(0,a.useMemo)(()=>je(x),[x]),Ie=(0,a.useMemo)(()=>new Map(oe.map(e=>[e.id,e])),[oe]),J=(0,a.useMemo)(()=>v?ft(v.workflowSnapshot):null,[v]),Le=(0,a.useMemo)(()=>v&&J?dt(J,E,O,v.state):[],[v,J,E,O]),Re=(0,a.useMemo)(()=>J?pt(J):[],[J]),ze=(0,a.useMemo)(()=>v?lt(v.workflowSnapshot):[],[v]);async function Y(){pe(!0),j(null);try{let t=await(0,c.readApprovalInstance)(e);re(t.activityLogs),y(t.instance),se(t.tasks),ce(t.workflowTokens);let n=await(0,c.listAdhocDirectives)(t.instance.id),[r,i,a,o]=await Promise.all([Ae(t.tasks),Oe({...t,adhocDirectives:n}),(0,c.listAttachments)(t.instance.id),(0,c.readInstanceSignatures)(t.instance.id)]);ie(r),A(i),S(a),C(o.signatures),T(o.verification),we(n)}catch(e){j(D(e))}finally{pe(!1)}}async function Be(e,t){if(!_)throw Error(`尚未登入,無法上傳附件`);return{id:(await(0,c.uploadAttachment)({file:t,formFieldPath:`form.${e.fieldKey}`})).id}}async function Ve(e){if(!_)return;let t=await(0,c.readAttachmentDownloadUrl)({id:e.id});window.open(t,`_blank`,`noopener,noreferrer`)}async function He(e){if(!_)return;let t=await(0,c.readAttachmentPreviewUrl)({id:e.id});Se(e),B(t)}async function We(){if(!(!_||!v||!Ne)){if(M(!0),j(null),I({}),v.formDefinitionSnapshot.schema&&v.formDefinitionSnapshot.uiSchema){let e=(0,d.validateFormRendererValues)({schema:v.formDefinitionSnapshot.schema,uiSchema:v.formDefinitionSnapshot.uiSchema,values:L});if(!e.valid){I(e.errors),j(`請先補齊必填欄位。`),e.firstInvalidFieldKey&&(0,d.focusFormRendererField)(e.firstInvalidFieldKey),M(!1);return}}try{await(0,c.cancelApprovalInstance)({cancelledByMemberId:_,comment:Te||null,instanceId:v.id}),_e(``),F(!1),await Y()}catch(e){j(D(e))}finally{M(!1)}}}async function Ge(){if(!(!_||!v||!Pe)){if(M(!0),j(null),Object.values(be).some(i.n)){j(`請先完成動態選項驗證。`),M(!1);return}try{await(0,c.resubmitApprovalInstance)({formData:L,initiatorMemberId:_,instanceId:v.id,title:v.title}),await Y()}catch(e){j(D(e))}finally{M(!1)}}}let Ke=V.current?.deciding??!1,Z=me||Ke;return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(o.PageHeader,{children:(0,s.jsxs)(l.default,{description:v?`${k(v.state)} · ${n.t(v.startedAt)}`:`載入案件內容。`,title:v?.title??`簽核案件`,children:[v?(0,s.jsx)(o.Button,{"aria-label":`查看流程圖`,icon:u.ShareIcon,iconType:`icon-only`,onClick:()=>N(!0),title:`查看流程圖`,variant:`base-secondary`,children:`流程圖`}):null,Ne?(0,s.jsx)(o.Button,{disabled:Z,icon:u.DangerousOutlineIcon,iconType:`leading`,onClick:()=>F(!0),variant:`destructive-secondary`,children:`取消案件`}):null,H?(0,s.jsxs)(s.Fragment,{children:[G?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(o.Button,{disabled:Z,icon:u.PlusIcon,iconType:`leading`,onClick:()=>V.current?.openAdhocModal(`COUNTERSIGN`),variant:`base-secondary`,children:`會簽`},`adhoc-countersign`),(0,s.jsx)(o.Button,{disabled:Z,icon:u.PlusIcon,iconType:`leading`,onClick:()=>V.current?.openAdhocModal(`PRE_APPROVAL`),variant:`base-secondary`,children:`加簽`},`adhoc-pre-approval`)]}):null,(0,s.jsx)(o.Button,{disabled:Z,icon:u.NotificationUnreadIcon,iconType:`leading`,onClick:()=>V.current?.openAdhocModal(`STAGE_NOTIFY`),variant:`base-secondary`,children:`通知設定`},`adhoc-notify`),De?(0,s.jsx)(o.Button,{disabled:Z,icon:u.RefreshCcwIcon,iconType:`leading`,onClick:()=>V.current?.openReturnModal(),variant:`base-secondary`,children:`退回`},`task-return`):null,W?(0,s.jsx)(o.Button,{disabled:Z,icon:u.UserIcon,iconType:`leading`,onClick:()=>V.current?.openTransferModal(),variant:`base-secondary`,children:`轉派`},`task-transfer`):null,ke?(0,s.jsx)(o.Button,{disabled:Z,icon:u.DangerousOutlineIcon,iconType:`leading`,onClick:()=>V.current?.openRejectModal(),variant:`destructive-secondary`,children:`拒絕`},`task-reject`):null,(0,s.jsx)(o.Button,{disabled:Z,icon:u.CheckedIcon,iconType:`leading`,onClick:()=>V.current?.handleApprove(),variant:`base-primary`,children:`同意`},`task-approve`)]}):null]})}),(0,s.jsxs)(o.SectionGroup,{children:[m?(0,s.jsx)(o.Section,{children:(0,s.jsx)(Me,{canResubmitInstance:Pe,deciding:me,error:ue,instance:v,loading:de,onDataSourceStateChange:Ee,onResubmitFormChange:e=>{ye(e),I({})},onResubmitInstance:()=>void Ge(),onUploadAttachment:Be,resubmitFormData:L,resubmitFormErrors:ve})}):null,p?(0,s.jsx)(o.Section,{children:(0,s.jsx)(K,{attachments:ae,onDownload:e=>{Ve(e)},onPreview:e=>{He(e)}})}):null,ee?(0,s.jsx)(o.Section,{children:(0,s.jsx)(X,{adhocDirectives:Ce,currentMemberId:_,instance:v,memberProfilesById:q,onChanged:Y,ref:V,tasks:E})}):null,g?(0,s.jsx)(o.Section,{children:(0,s.jsx)(Ue,{signatureVerification:w,signatures:oe})}):null,h?(0,s.jsx)(o.Section,{children:(0,s.jsx)(Ye,{activityLogs:ne,instanceState:v?.state??`RUNNING`,memberProfilesById:q,signatureVerification:w,signaturesById:Ie,taskDecisionsByTaskId:Fe,tasks:E,workflowSnapshot:v?.workflowSnapshot??null,workflowTokens:O})}):null]}),v?(0,s.jsx)(o.Modal,{modalType:`standard`,onClose:()=>N(!1),open:he,showModalHeader:!0,size:`wide`,supportingText:`${k(v.state)} · ${n.t(v.startedAt)}`,title:`流程圖`,children:(0,s.jsxs)(`div`,{style:Qe,children:[(0,s.jsx)(`div`,{style:$e,children:(0,s.jsxs)(f.ReactFlow,{edges:Re,fitView:!0,fitViewOptions:{padding:.18},maxZoom:1.2,minZoom:.2,nodes:Le,nodesDraggable:!1,nodesFocusable:!1,nodeTypes:ot,panOnDrag:!0,proOptions:{hideAttribution:!0},children:[(0,s.jsx)(f.Background,{}),(0,s.jsx)(f.Controls,{showInteractive:!1})]})}),ze.length>0?(0,s.jsx)(`div`,{style:rt,children:ze.map(e=>(0,s.jsx)(`span`,{style:it,children:e},e))}):null]})}):null,(0,s.jsx)(o.Modal,{modalType:`standard`,onClose:()=>{Se(null),B(null)},open:!!(R&&z),showModalHeader:!0,size:`wide`,supportingText:R?.filename??void 0,title:`PDF 預覽`,children:z?(0,s.jsx)(b,{filename:R?.filename??`PDF 預覽`,fileUrl:z,onDownload:R?()=>void Ve(R):void 0}):null}),(0,s.jsx)(o.Modal,{cancelText:`保留案件`,confirmButtonProps:{variant:`destructive-primary`},confirmText:`確認取消`,loading:me,modalStatusType:`error`,modalType:`standard`,onCancel:()=>F(!1),onClose:()=>F(!1),onConfirm:()=>void We(),open:P,showModalFooter:!0,showModalHeader:!0,supportingText:`取消後會關閉目前待簽任務與候選簽核人。`,title:`取消案件`,children:(0,s.jsxs)(`div`,{style:at,children:[(0,s.jsxs)(o.Typography,{variant:`body`,children:[`確定要取消「`,v?.title??``,`」嗎?`]}),(0,s.jsx)(r.t,{label:`取消原因`,name:`cancelComment`,children:(0,s.jsx)(o.Textarea,{onChange:e=>_e(e.target.value),placeholder:`可填寫取消原因`,resize:`vertical`,rows:3,value:ge})})]})})]})}function ct(e){return e.data.label?e.data.label:e.data.isDefault?`其他情況`:e.data.condition??``}function lt(e){return e.edges.map(ct).filter(e=>e.trim().length>0)}function ut(e){return e===`startEvent`?`開始`:e===`endEvent`?`完成`:e===`userTask`?`簽核節點`:e===`serviceTask`?`知會節點`:e===`exclusiveGateway`?`條件分流`:`平行處理`}function dt(e,t,n,r){return e.nodes.map(e=>{let i=De(e,t,n,r);return{data:{kindLabel:ut(e.type),label:e.data.label,secondaryLabel:i.secondaryLabel,statusLabel:i.statusLabel,tone:i.tone},id:e.id,position:e.position,sourcePosition:f.Position.Right,targetPosition:f.Position.Left,type:`workflowRuntime`}})}function ft(e){let t=new p.graphlib.Graph;return t.setDefaultEdgeLabel(()=>({})),t.setGraph({nodesep:56,rankdir:`LR`,ranksep:120}),e.nodes.forEach(e=>{t.setNode(e.id,{height:Ze,width:Xe})}),e.edges.forEach(e=>{t.setEdge(e.source,e.target)}),p.layout(t),{...e,nodes:e.nodes.map(e=>{let n=t.node(e.id);return n?{...e,position:{x:n.x-Xe/2,y:n.y-Ze/2}}:e})}}function pt(e){return e.edges.map(e=>{let t=ct(e);return{animated:!1,id:e.id,label:t,labelBgBorderRadius:6,labelBgPadding:[8,4],labelBgStyle:{fill:e.data.isDefault?`#f8fafc`:`#eff6ff`,stroke:e.data.isDefault?`#64748b`:`#2563eb`,strokeWidth:1},labelShowBg:!!t,labelStyle:{fill:e.data.isDefault?`#475569`:`#2563eb`,fontSize:12,fontWeight:600},source:e.source,style:{stroke:`#475569`,strokeWidth:1.5},target:e.target,type:e.type??`smoothstep`}})}function $(e){return e===`current`?{...Q,border:`1px solid var(--mzn-color-primary, #0057ff)`,boxShadow:`0 0 0 3px rgba(0, 87, 255, 0.14)`}:e===`completed`?{...Q,border:`1px solid #16a34a`}:e===`cancelled`?{...Q,border:`1px solid #dc2626`,opacity:.72}:e===`waiting`?{...Q,border:`1px dashed #64748b`}:Q}function mt(e){let t=et;return e===`current`?{...t,background:`#eff6ff`,color:`#2563eb`}:e===`completed`?{...t,background:`#f0fdf4`,color:`#15803d`}:e===`cancelled`?{...t,background:`#fef2f2`,color:`#dc2626`}:e===`waiting`?{...t,background:`#f8fafc`,color:`#475569`}:{...t,background:`#f1f5f9`,color:`#64748b`}}function ht({data:e}){return(0,s.jsxs)(`div`,{style:$(e.tone),children:[(0,s.jsx)(f.Handle,{isConnectable:!1,position:f.Position.Left,style:nt,type:`target`}),(0,s.jsx)(o.Typography,{component:`span`,ellipsis:!0,title:e.label,variant:`label-primary`,children:e.label}),(0,s.jsx)(`span`,{style:mt(e.tone),children:e.statusLabel}),(0,s.jsx)(`span`,{title:e.secondaryLabel,style:tt,children:e.secondaryLabel||e.kindLabel}),(0,s.jsx)(f.Handle,{isConnectable:!1,position:f.Position.Right,style:nt,type:`source`})]})}Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return K}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return X}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return Ye}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return Me}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return Ue}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return st}});
|
|
2
|
-
//# sourceMappingURL=detail-CDexqBoU.cjs.map
|