@skopon-cool/form-sdk 0.6.4 → 0.6.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/catalog/a2uiCustomCatalog.d.ts.map +1 -1
- package/dist/catalog/materialUploadContext.d.ts +24 -0
- package/dist/catalog/materialUploadContext.d.ts.map +1 -0
- package/dist/components/AskUserFormCard.d.ts +3 -0
- package/dist/components/AskUserFormCard.d.ts.map +1 -1
- package/dist/components/SkoponFormRenderer.d.ts +3 -0
- package/dist/components/SkoponFormRenderer.d.ts.map +1 -1
- package/dist/index.js +1482 -1445
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/catalog/a2uiCustomCatalog.tsx +100 -34
- package/src/catalog/fileUploadPreview.test.tsx +24 -14
- package/src/catalog/materialUploadContext.tsx +43 -0
- package/src/components/AskUserFormCard.tsx +5 -0
- package/src/components/SkoponFormRenderer.tsx +6 -0
- package/src/types/index.ts +1 -1
package/dist/types/index.d.ts
CHANGED
|
@@ -122,7 +122,7 @@ export interface FormBlock {
|
|
|
122
122
|
fileReviewRequired?: boolean;
|
|
123
123
|
/** 物料采集来源模式,由 skopon-admin 环节配置。 */
|
|
124
124
|
fileSourceMode?: 'upload_required' | 'upload_or_asset' | 'asset_only';
|
|
125
|
-
/** 通用收集流从 Footage
|
|
125
|
+
/** 通用收集流从 Footage 为当前素材位查询的候选;提交选中的素材 ID。 */
|
|
126
126
|
fileAssetOptions?: FormAssetOption[];
|
|
127
127
|
/** 对应 Footage 同步素材位的限定 key。 */
|
|
128
128
|
assetSlotKey?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -38,12 +38,10 @@ import {
|
|
|
38
38
|
getRegisteredCatalogComponents,
|
|
39
39
|
} from '../blocks/registry'
|
|
40
40
|
import FilePlaceholderIcon from '../icons/FilePlaceholderIcon'
|
|
41
|
-
import {
|
|
42
|
-
isUploadCancelledError,
|
|
43
|
-
uploadFileToCdn,
|
|
44
|
-
} from '../client/uploadClient'
|
|
41
|
+
import { isUploadCancelledError } from '../client/uploadClient'
|
|
45
42
|
import { useA2uiPreviewMode } from './a2uiPreviewContext'
|
|
46
43
|
import { useFileUploadStatus } from './fileUploadStatusContext'
|
|
44
|
+
import { useMaterialUpload } from './materialUploadContext'
|
|
47
45
|
import {
|
|
48
46
|
asOptionalString,
|
|
49
47
|
asStringArray,
|
|
@@ -573,11 +571,34 @@ interface FileUploadListItem {
|
|
|
573
571
|
name: string
|
|
574
572
|
status: 'uploading' | 'done' | 'error'
|
|
575
573
|
url?: string
|
|
574
|
+
assetId?: string
|
|
575
|
+
source?: 'upload' | 'library_select'
|
|
576
576
|
error?: string
|
|
577
577
|
}
|
|
578
578
|
|
|
579
|
-
|
|
580
|
-
|
|
579
|
+
interface FileValueRef {
|
|
580
|
+
assetId?: string
|
|
581
|
+
source?: 'upload' | 'library_select'
|
|
582
|
+
url?: string
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
function normalizeFileValues(value: unknown): FileValueRef[] {
|
|
586
|
+
const values = Array.isArray(value) ? value : value == null || value === '' ? [] : [value]
|
|
587
|
+
return values.reduce<FileValueRef[]>((result, entry) => {
|
|
588
|
+
if (typeof entry === 'string' && entry.trim()) {
|
|
589
|
+
result.push({ url: entry.trim() })
|
|
590
|
+
return result
|
|
591
|
+
}
|
|
592
|
+
if (!entry || typeof entry !== 'object' || Array.isArray(entry)) return result
|
|
593
|
+
const obj = entry as Record<string, unknown>
|
|
594
|
+
const assetId = String(obj.asset_id ?? obj.assetId ?? '').trim()
|
|
595
|
+
if (!assetId) return result
|
|
596
|
+
result.push({
|
|
597
|
+
assetId,
|
|
598
|
+
source: obj.source === 'library_select' ? 'library_select' as const : 'upload' as const,
|
|
599
|
+
})
|
|
600
|
+
return result
|
|
601
|
+
}, [])
|
|
581
602
|
}
|
|
582
603
|
|
|
583
604
|
function fileNameFromUrl(url: string): string {
|
|
@@ -597,6 +618,7 @@ function fileItemFromUrl(url: string, uid: string): FileUploadListItem {
|
|
|
597
618
|
function FileUploadPreview({ context }: { context: ComponentContext }) {
|
|
598
619
|
const { interactive } = useA2uiPreviewMode()
|
|
599
620
|
const { beginUpload } = useFileUploadStatus()
|
|
621
|
+
const uploadMaterial = useMaterialUpload()
|
|
600
622
|
const { value, setValue, setValueSilent, fieldName } = useSkoponBoundField(context, 'value', {
|
|
601
623
|
component: 'FileUpload',
|
|
602
624
|
changeAction: 'change',
|
|
@@ -640,14 +662,25 @@ function FileUploadPreview({ context }: { context: ComponentContext }) {
|
|
|
640
662
|
: sourceMode === 'upload_or_asset'
|
|
641
663
|
? '物料或素材'
|
|
642
664
|
: '物料 · 仅上传'
|
|
643
|
-
const
|
|
665
|
+
const initialValues = normalizeFileValues(value)
|
|
644
666
|
const externalUidRef = useRef(0)
|
|
645
667
|
const mountedRef = useRef(true)
|
|
646
668
|
const controllersRef = useRef(new Map<string, AbortController>())
|
|
647
669
|
const setValueRef = useRef(setValue)
|
|
648
670
|
setValueRef.current = setValue
|
|
649
671
|
const [items, setItems] = useState<FileUploadListItem[]>(() => [
|
|
650
|
-
...
|
|
672
|
+
...initialValues.map((entry) => {
|
|
673
|
+
if (entry.url) return fileItemFromUrl(entry.url, `external-${externalUidRef.current++}`)
|
|
674
|
+
const option = assetOptions.find((item) => item.assetId === entry.assetId)
|
|
675
|
+
return {
|
|
676
|
+
uid: `asset-${entry.assetId}-${externalUidRef.current++}`,
|
|
677
|
+
name: option?.label || `素材 ${entry.assetId}`,
|
|
678
|
+
status: 'done' as const,
|
|
679
|
+
url: option?.previewUrl || option?.url,
|
|
680
|
+
assetId: entry.assetId,
|
|
681
|
+
source: entry.source,
|
|
682
|
+
}
|
|
683
|
+
}),
|
|
651
684
|
...rejectedUrls.map((url) => ({
|
|
652
685
|
...fileItemFromUrl(url, `rejected-${externalUidRef.current++}`),
|
|
653
686
|
status: 'error' as const,
|
|
@@ -660,16 +693,18 @@ function FileUploadPreview({ context }: { context: ComponentContext }) {
|
|
|
660
693
|
const commitItems = useCallback(
|
|
661
694
|
(
|
|
662
695
|
updater: (current: FileUploadListItem[]) => FileUploadListItem[],
|
|
663
|
-
|
|
696
|
+
writeValues: boolean,
|
|
664
697
|
) => {
|
|
665
698
|
const next = updater(itemsRef.current)
|
|
666
699
|
itemsRef.current = next
|
|
667
700
|
if (mountedRef.current) setItems(next)
|
|
668
|
-
if (
|
|
701
|
+
if (writeValues) {
|
|
669
702
|
setValueRef.current(
|
|
670
703
|
next
|
|
671
|
-
.filter((item) => item.status === 'done' && item.url)
|
|
672
|
-
.map((item) => item.
|
|
704
|
+
.filter((item) => item.status === 'done' && (item.assetId || item.url))
|
|
705
|
+
.map((item) => item.assetId
|
|
706
|
+
? { asset_id: item.assetId, source: item.source || 'upload' }
|
|
707
|
+
: item.url as string),
|
|
673
708
|
)
|
|
674
709
|
}
|
|
675
710
|
return next
|
|
@@ -687,27 +722,34 @@ function FileUploadPreview({ context }: { context: ComponentContext }) {
|
|
|
687
722
|
}, [])
|
|
688
723
|
|
|
689
724
|
useEffect(() => {
|
|
690
|
-
const
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
const consumed = new Set<number>()
|
|
725
|
+
const normalized = normalizeFileValues(value)
|
|
726
|
+
if (!Array.isArray(value)) {
|
|
727
|
+
setValueSilent(normalized.map((entry) => entry.assetId
|
|
728
|
+
? { asset_id: entry.assetId, source: entry.source || 'upload' }
|
|
729
|
+
: entry.url))
|
|
730
|
+
}
|
|
731
|
+
const expected = new Set(normalized.map((entry) => entry.assetId ? `asset:${entry.assetId}` : `url:${entry.url}`))
|
|
698
732
|
commitItems(
|
|
699
733
|
(current) => {
|
|
700
|
-
const next = current.filter((item) =>
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
return
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
next.push(fileItemFromUrl(url, `external-${externalUidRef.current++}`))
|
|
734
|
+
const next = current.filter((item) =>
|
|
735
|
+
item.status !== 'done' || expected.has(item.assetId ? `asset:${item.assetId}` : `url:${item.url}`))
|
|
736
|
+
const present = new Set(next.map((item) => item.assetId ? `asset:${item.assetId}` : `url:${item.url}`))
|
|
737
|
+
normalized.forEach((entry) => {
|
|
738
|
+
const key = entry.assetId ? `asset:${entry.assetId}` : `url:${entry.url}`
|
|
739
|
+
if (present.has(key)) return
|
|
740
|
+
if (entry.url) {
|
|
741
|
+
next.push(fileItemFromUrl(entry.url, `external-${externalUidRef.current++}`))
|
|
742
|
+
return
|
|
710
743
|
}
|
|
744
|
+
const option = assetOptions.find((item) => item.assetId === entry.assetId)
|
|
745
|
+
next.push({
|
|
746
|
+
uid: `asset-${entry.assetId}-${externalUidRef.current++}`,
|
|
747
|
+
name: option?.label || `素材 ${entry.assetId}`,
|
|
748
|
+
status: 'done',
|
|
749
|
+
url: option?.previewUrl || option?.url,
|
|
750
|
+
assetId: entry.assetId,
|
|
751
|
+
source: entry.source,
|
|
752
|
+
})
|
|
711
753
|
})
|
|
712
754
|
return next
|
|
713
755
|
},
|
|
@@ -730,14 +772,31 @@ function FileUploadPreview({ context }: { context: ComponentContext }) {
|
|
|
730
772
|
)
|
|
731
773
|
const endUpload = beginUpload()
|
|
732
774
|
|
|
733
|
-
|
|
775
|
+
const upload = uploadMaterial
|
|
776
|
+
? uploadMaterial(file, {
|
|
777
|
+
fieldName,
|
|
778
|
+
moduleId: readString(props.moduleId) || undefined,
|
|
779
|
+
positionKey: fieldName || undefined,
|
|
780
|
+
assetSlotKey: readString(props.assetSlotKey) || undefined,
|
|
781
|
+
assetType: readString(props.assetType) || undefined,
|
|
782
|
+
}, { signal: controller.signal })
|
|
783
|
+
: Promise.reject(new Error('当前宿主未配置私有物料上传,请联系管理员'))
|
|
784
|
+
void upload
|
|
734
785
|
.then((result) => {
|
|
735
786
|
if (!mountedRef.current || controller.signal.aborted) return
|
|
736
787
|
commitItems(
|
|
737
788
|
(current) =>
|
|
738
789
|
current.map((item) =>
|
|
739
790
|
item.uid === uid
|
|
740
|
-
? {
|
|
791
|
+
? {
|
|
792
|
+
...item,
|
|
793
|
+
status: 'done',
|
|
794
|
+
name: result.name || item.name,
|
|
795
|
+
url: result.previewUrl,
|
|
796
|
+
assetId: result.assetId || undefined,
|
|
797
|
+
source: result.assetId ? 'upload' : undefined,
|
|
798
|
+
error: undefined,
|
|
799
|
+
}
|
|
741
800
|
: item,
|
|
742
801
|
),
|
|
743
802
|
true,
|
|
@@ -759,7 +818,7 @@ function FileUploadPreview({ context }: { context: ComponentContext }) {
|
|
|
759
818
|
endUpload()
|
|
760
819
|
})
|
|
761
820
|
},
|
|
762
|
-
[beginUpload, commitItems, hasMaxLimit, interactive, maxCount, sourceMode],
|
|
821
|
+
[beginUpload, commitItems, fieldName, hasMaxLimit, interactive, maxCount, props, sourceMode, uploadMaterial],
|
|
763
822
|
)
|
|
764
823
|
|
|
765
824
|
const handleRemove = useCallback(
|
|
@@ -795,7 +854,14 @@ function FileUploadPreview({ context }: { context: ComponentContext }) {
|
|
|
795
854
|
}
|
|
796
855
|
commitItems((current) => {
|
|
797
856
|
const retained = maxCount === 1 ? [] : current.filter((item) => item.status !== 'error' && item.url !== asset.url)
|
|
798
|
-
return [...retained, {
|
|
857
|
+
return [...retained, {
|
|
858
|
+
uid: `asset-${asset.assetId}-${externalUidRef.current++}`,
|
|
859
|
+
name: asset.label,
|
|
860
|
+
status: 'done',
|
|
861
|
+
url: asset.previewUrl || asset.url,
|
|
862
|
+
assetId: asset.assetId,
|
|
863
|
+
source: 'library_select',
|
|
864
|
+
}]
|
|
799
865
|
}, true)
|
|
800
866
|
setAssetPickerOpen(false)
|
|
801
867
|
}
|
|
@@ -62,6 +62,7 @@ function renderFileSurface(options: {
|
|
|
62
62
|
fileReviewMessage?: string
|
|
63
63
|
fileRejectedUrls?: string[]
|
|
64
64
|
help?: string
|
|
65
|
+
withUploader?: boolean
|
|
65
66
|
} = {}) {
|
|
66
67
|
const doc = blocksToA2ui(
|
|
67
68
|
{
|
|
@@ -98,6 +99,7 @@ function renderFileSurface(options: {
|
|
|
98
99
|
surfaceId: 'upload-test',
|
|
99
100
|
fieldNames: ['attachments'],
|
|
100
101
|
onUploadingChange: options.onUploadingChange,
|
|
102
|
+
uploadMaterial: options.withUploader === false ? undefined : uploadMock,
|
|
101
103
|
}),
|
|
102
104
|
)
|
|
103
105
|
const input = view.container.querySelector('input[type="file"]') as HTMLInputElement
|
|
@@ -139,9 +141,9 @@ describe('FileUploadPreview', () => {
|
|
|
139
141
|
expect(container.querySelector('input[type="file"]')?.hasAttribute('disabled')).toBe(true)
|
|
140
142
|
expect(ref.current?.getValues()).toEqual({ attachments: ['https://cdn.example.com/approved.jpg'] })
|
|
141
143
|
})
|
|
142
|
-
it('stores successful
|
|
143
|
-
const first = deferred<{
|
|
144
|
-
const second = deferred<{
|
|
144
|
+
it('stores successful private asset IDs in user selection order', async () => {
|
|
145
|
+
const first = deferred<{ assetId: string; name: string; previewUrl: string }>()
|
|
146
|
+
const second = deferred<{ assetId: string; name: string; previewUrl: string }>()
|
|
145
147
|
uploadMock
|
|
146
148
|
.mockImplementationOnce(() => first.promise)
|
|
147
149
|
.mockImplementationOnce(() => second.promise)
|
|
@@ -158,16 +160,16 @@ describe('FileUploadPreview', () => {
|
|
|
158
160
|
await waitFor(() => expect(uploadMock).toHaveBeenCalledTimes(2))
|
|
159
161
|
expect(uploadingChanges).toContain(true)
|
|
160
162
|
|
|
161
|
-
await act(async () => second.resolve({
|
|
163
|
+
await act(async () => second.resolve({ assetId: 'mat_second', name: 'second.pdf', previewUrl: 'https://cdn.example.com/second.pdf' }))
|
|
162
164
|
expect(ref.current?.getValues()).toEqual({
|
|
163
|
-
attachments: ['
|
|
165
|
+
attachments: [{ asset_id: 'mat_second', source: 'upload' }],
|
|
164
166
|
})
|
|
165
|
-
await act(async () => first.resolve({
|
|
167
|
+
await act(async () => first.resolve({ assetId: 'mat_first', name: 'first.pdf', previewUrl: 'https://cdn.example.com/first.pdf' }))
|
|
166
168
|
await waitFor(() =>
|
|
167
169
|
expect(ref.current?.getValues()).toEqual({
|
|
168
170
|
attachments: [
|
|
169
|
-
'
|
|
170
|
-
'
|
|
171
|
+
{ asset_id: 'mat_first', source: 'upload' },
|
|
172
|
+
{ asset_id: 'mat_second', source: 'upload' },
|
|
171
173
|
],
|
|
172
174
|
}),
|
|
173
175
|
)
|
|
@@ -185,11 +187,11 @@ describe('FileUploadPreview', () => {
|
|
|
185
187
|
it('allows removing below minCount and aborts an in-flight request', async () => {
|
|
186
188
|
let signal: AbortSignal | undefined
|
|
187
189
|
uploadMock.mockImplementation(
|
|
188
|
-
(_file: File, options?: { signal?: AbortSignal }) => {
|
|
190
|
+
(_file: File, _field: unknown, options?: { signal?: AbortSignal }) => {
|
|
189
191
|
signal = options?.signal
|
|
190
|
-
return new Promise<{
|
|
192
|
+
return new Promise<{ assetId: string; name: string }>((resolve) => {
|
|
191
193
|
signal?.addEventListener('abort', () => {
|
|
192
|
-
resolve({
|
|
194
|
+
resolve({ assetId: 'mat_ignored', name: 'ignored.pdf' })
|
|
193
195
|
})
|
|
194
196
|
})
|
|
195
197
|
},
|
|
@@ -219,6 +221,14 @@ describe('FileUploadPreview', () => {
|
|
|
219
221
|
)
|
|
220
222
|
expect(getByText('legacy file.pdf')).toBeTruthy()
|
|
221
223
|
})
|
|
224
|
+
|
|
225
|
+
it('fails closed when the host does not inject a private uploader', async () => {
|
|
226
|
+
const { input, getByText, ref } = renderFileSurface({ withUploader: false })
|
|
227
|
+
fireEvent.change(input, { target: { files: [new File(['x'], 'private.pdf')] } })
|
|
228
|
+
await waitFor(() => expect(getByText('当前宿主未配置私有物料上传,请联系管理员')).toBeTruthy())
|
|
229
|
+
expect(ref.current?.getValues()).toEqual({ attachments: [] })
|
|
230
|
+
expect(uploadMock).not.toHaveBeenCalled()
|
|
231
|
+
})
|
|
222
232
|
})
|
|
223
233
|
|
|
224
234
|
describe('Footage selection in generic material forms', () => {
|
|
@@ -231,12 +241,12 @@ describe('Footage selection in generic material forms', () => {
|
|
|
231
241
|
return { ref, ...render(createElement(SkoponFormRenderer, { ref, doc, surfaceId: 'asset-test', fieldNames: ['scene'] })) }
|
|
232
242
|
}
|
|
233
243
|
|
|
234
|
-
it('asset-only fields
|
|
244
|
+
it('asset-only fields submit the selected asset identity without uploading', async () => {
|
|
235
245
|
const view = renderAssetField('asset_only')
|
|
236
246
|
expect(view.container.querySelector('input[type="file"]')).toBeNull()
|
|
237
247
|
fireEvent.click(view.getByRole('button', { name: '选择素材' }))
|
|
238
248
|
fireEvent.click(await view.findByRole('button', { name: '选择素材 山景' }))
|
|
239
|
-
await waitFor(() => expect(view.ref.current?.getValues().scene).toEqual(['
|
|
249
|
+
await waitFor(() => expect(view.ref.current?.getValues().scene).toEqual([{ asset_id: '17', source: 'library_select' }]))
|
|
240
250
|
expect(uploadMock).not.toHaveBeenCalled()
|
|
241
251
|
})
|
|
242
252
|
|
|
@@ -245,6 +255,6 @@ describe('Footage selection in generic material forms', () => {
|
|
|
245
255
|
expect(view.container.querySelector('input[type="file"]')).not.toBeNull()
|
|
246
256
|
fireEvent.click(view.getByRole('button', { name: '选择素材' }))
|
|
247
257
|
fireEvent.click(await view.findByRole('button', { name: '选择素材 山景' }))
|
|
248
|
-
await waitFor(() => expect(view.ref.current?.getValues().scene).toEqual(['
|
|
258
|
+
await waitFor(() => expect(view.ref.current?.getValues().scene).toEqual([{ asset_id: '17', source: 'library_select' }]))
|
|
249
259
|
})
|
|
250
260
|
})
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { createContext, useContext, type ReactNode } from 'react'
|
|
2
|
+
|
|
3
|
+
export interface MaterialUploadFieldContext {
|
|
4
|
+
fieldName?: string
|
|
5
|
+
moduleId?: string
|
|
6
|
+
positionKey?: string
|
|
7
|
+
assetSlotKey?: string
|
|
8
|
+
assetType?: string
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface MaterialUploadResult {
|
|
12
|
+
assetId: string
|
|
13
|
+
name: string
|
|
14
|
+
mimeType?: string
|
|
15
|
+
size?: number
|
|
16
|
+
previewUrl?: string
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export type MaterialUploadFn = (
|
|
20
|
+
file: File,
|
|
21
|
+
context: MaterialUploadFieldContext,
|
|
22
|
+
options?: { signal?: AbortSignal },
|
|
23
|
+
) => Promise<MaterialUploadResult>
|
|
24
|
+
|
|
25
|
+
const MaterialUploadContext = createContext<MaterialUploadFn | null>(null)
|
|
26
|
+
|
|
27
|
+
export function MaterialUploadProvider({
|
|
28
|
+
uploadMaterial,
|
|
29
|
+
children,
|
|
30
|
+
}: {
|
|
31
|
+
uploadMaterial?: MaterialUploadFn | null
|
|
32
|
+
children: ReactNode
|
|
33
|
+
}) {
|
|
34
|
+
return (
|
|
35
|
+
<MaterialUploadContext.Provider value={uploadMaterial ?? null}>
|
|
36
|
+
{children}
|
|
37
|
+
</MaterialUploadContext.Provider>
|
|
38
|
+
)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function useMaterialUpload(): MaterialUploadFn | null {
|
|
42
|
+
return useContext(MaterialUploadContext)
|
|
43
|
+
}
|
|
@@ -41,6 +41,7 @@ import {
|
|
|
41
41
|
import SkoponFormRenderer, { type SkoponFormRendererRef } from './SkoponFormRenderer'
|
|
42
42
|
import CurlSubmitBlock from './CurlSubmitBlock'
|
|
43
43
|
import SkoponFormProvider from './SkoponFormProvider'
|
|
44
|
+
import type { MaterialUploadFn } from '../catalog/materialUploadContext'
|
|
44
45
|
|
|
45
46
|
const REFRESH_REPORT_DEBOUNCE_MS = 80
|
|
46
47
|
|
|
@@ -82,6 +83,8 @@ export interface AskUserFormCardProps {
|
|
|
82
83
|
contentSearch?: ContentSearchFn | null
|
|
83
84
|
/** 案例单选组件:注入搜索函数 */
|
|
84
85
|
caseSearch?: CaseSearchFn | null
|
|
86
|
+
/** 用户私有物料上传函数,由宿主负责浏览器直传及上下文。 */
|
|
87
|
+
uploadMaterial?: MaterialUploadFn | null
|
|
85
88
|
}
|
|
86
89
|
|
|
87
90
|
interface AskUserFormCardBodyProps extends AskUserFormCardProps {
|
|
@@ -103,6 +106,7 @@ function AskUserFormCardBody({
|
|
|
103
106
|
resumeSearch = null,
|
|
104
107
|
contentSearch = null,
|
|
105
108
|
caseSearch = null,
|
|
109
|
+
uploadMaterial = null,
|
|
106
110
|
onSurfaceReadyChange,
|
|
107
111
|
onAutoControlReady,
|
|
108
112
|
}: AskUserFormCardBodyProps) {
|
|
@@ -516,6 +520,7 @@ function AskUserFormCardBody({
|
|
|
516
520
|
resumeSearch={resumeSearch}
|
|
517
521
|
contentSearch={contentSearch}
|
|
518
522
|
caseSearch={caseSearch}
|
|
523
|
+
uploadMaterial={uploadMaterial}
|
|
519
524
|
onUploadingChange={setUploading}
|
|
520
525
|
/>
|
|
521
526
|
|
|
@@ -16,6 +16,7 @@ import { isA2uiSurfaceEmpty, surfaceDocToMessages } from '../adapter/a2uiAdapter
|
|
|
16
16
|
import { SKOPON_CATALOG_ID, buildSkoponCatalog } from '../catalog/a2uiCustomCatalog'
|
|
17
17
|
import { A2uiPreviewModeProvider } from '../catalog/a2uiPreviewContext'
|
|
18
18
|
import { FileUploadStatusProvider } from '../catalog/fileUploadStatusContext'
|
|
19
|
+
import { MaterialUploadProvider, type MaterialUploadFn } from '../catalog/materialUploadContext'
|
|
19
20
|
import { CaseSearchProvider, type CaseSearchFn } from '../catalog/caseSearchContext'
|
|
20
21
|
import { ContentSearchProvider, type ContentSearchFn } from '../catalog/contentSearchContext'
|
|
21
22
|
import { ResumeSearchProvider, type ResumeSearchFn } from '../catalog/resumeSearchContext'
|
|
@@ -41,6 +42,8 @@ export interface SkoponFormRendererProps {
|
|
|
41
42
|
caseSearch?: CaseSearchFn | null
|
|
42
43
|
/** 任意文件上传任务的聚合状态 */
|
|
43
44
|
onUploadingChange?: (uploading: boolean) => void
|
|
45
|
+
/** 宿主注入的用户私有物料直传;未注入时上传会失败并提示配置。 */
|
|
46
|
+
uploadMaterial?: MaterialUploadFn | null
|
|
44
47
|
/** 外层已包裹 SkoponFormProvider 时可设为 false,避免重复 ConfigProvider */
|
|
45
48
|
wrapProvider?: boolean
|
|
46
49
|
}
|
|
@@ -57,6 +60,7 @@ const SkoponFormRenderer = forwardRef<SkoponFormRendererRef, SkoponFormRendererP
|
|
|
57
60
|
contentSearch = null,
|
|
58
61
|
caseSearch = null,
|
|
59
62
|
onUploadingChange,
|
|
63
|
+
uploadMaterial = null,
|
|
60
64
|
wrapProvider = true,
|
|
61
65
|
},
|
|
62
66
|
ref,
|
|
@@ -144,6 +148,7 @@ const SkoponFormRenderer = forwardRef<SkoponFormRendererRef, SkoponFormRendererP
|
|
|
144
148
|
}
|
|
145
149
|
|
|
146
150
|
const content = (
|
|
151
|
+
<MaterialUploadProvider uploadMaterial={uploadMaterial}>
|
|
147
152
|
<FileUploadStatusProvider onUploadingChange={onUploadingChange}>
|
|
148
153
|
<ResumeSearchProvider resumeSearch={resumeSearch}>
|
|
149
154
|
<ContentSearchProvider contentSearch={contentSearch}>
|
|
@@ -159,6 +164,7 @@ const SkoponFormRenderer = forwardRef<SkoponFormRendererRef, SkoponFormRendererP
|
|
|
159
164
|
</ContentSearchProvider>
|
|
160
165
|
</ResumeSearchProvider>
|
|
161
166
|
</FileUploadStatusProvider>
|
|
167
|
+
</MaterialUploadProvider>
|
|
162
168
|
)
|
|
163
169
|
|
|
164
170
|
return wrapProvider ? <SkoponFormProvider>{content}</SkoponFormProvider> : content
|
package/src/types/index.ts
CHANGED
|
@@ -187,7 +187,7 @@ export interface FormBlock {
|
|
|
187
187
|
fileReviewRequired?: boolean
|
|
188
188
|
/** 物料采集来源模式,由 skopon-admin 环节配置。 */
|
|
189
189
|
fileSourceMode?: 'upload_required' | 'upload_or_asset' | 'asset_only'
|
|
190
|
-
/** 通用收集流从 Footage
|
|
190
|
+
/** 通用收集流从 Footage 为当前素材位查询的候选;提交选中的素材 ID。 */
|
|
191
191
|
fileAssetOptions?: FormAssetOption[]
|
|
192
192
|
/** 对应 Footage 同步素材位的限定 key。 */
|
|
193
193
|
assetSlotKey?: string
|