PluginProbe
The Innovative Form Builder – IvyForms / 1.0
The Innovative Form Builder – IvyForms v1.0
1.5.1 1.5 1.4.1 1.4 trunk 0.1.2 0.2 0.2.1 0.3 0.3.1 0.4 0.5 0.6 0.6.1 0.6.1-backup 0.6.1.1 0.7 0.8 0.8.1 0.8.2 0.9 0.9.1 1.0 1.1 1.1.1 All 27 releases
ivyforms / frontend / src / composables / useImportedFormsFlow.ts

useImportedFormsFlow.ts in The Innovative Form Builder – IvyForms 1.0, at frontend/src/composables/useImportedFormsFlow.ts

129 lines 3.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 import { useLabels } from '@/composables/useLabels'
2 import { useFormImport } from '@/composables/useFormImport'
3 import IvyMessage from '@/views/_components/message/ivyMessage'
4
5 interface ImportedFormResult {
6 id: number | string
7 name: string
8 }
9
10 interface ValidImportedFormResult extends ImportedFormResult {
11 id: number
12 }
13
14 interface HandleImportedFormsOptions {
15 showSuccessMessage?: boolean
16 showErrorMessage?: boolean
17 successMessage?: string
18 onAfterSuccessfulImport?: (
19 importedFormIds: number[],
20 importedForms: ValidImportedFormResult[],
21 ) => void | Promise<void>
22 onSingleFormImported?: (
23 formId: number,
24 importedForm: ValidImportedFormResult,
25 importedFormIds: number[],
26 importedForms: ValidImportedFormResult[],
27 ) => void | Promise<void>
28 onMultipleFormsImported?: (
29 importedFormIds: number[],
30 importedForms: ValidImportedFormResult[],
31 ) => void | Promise<void>
32 }
33
34 export function useImportedFormsFlow() {
35 const { getLabel } = useLabels()
36 const { importForms, isImporting, importError } = useFormImport()
37
38 const getValidImportedForms = (
39 importedForms: ImportedFormResult[],
40 ): ValidImportedFormResult[] => {
41 return importedForms.reduce<ValidImportedFormResult[]>((forms, form) => {
42 const formId = Number(form.id)
43
44 if (Number.isInteger(formId) && formId > 0) {
45 forms.push({
46 ...form,
47 id: formId,
48 })
49 }
50
51 return forms
52 }, [])
53 }
54
55 const getImportedFormIds = (importedForms: ImportedFormResult[]): number[] => {
56 return getValidImportedForms(importedForms).map((form) => form.id)
57 }
58
59 const showImportError = (message?: string) => {
60 IvyMessage({
61 message: message || importError.value || getLabel('failed_to_import_forms'),
62 type: 'error',
63 })
64 }
65
66 const handleImportedForms = async (
67 file: File,
68 options: HandleImportedFormsOptions = {},
69 ): Promise<number[]> => {
70 const {
71 showSuccessMessage = false,
72 showErrorMessage = true,
73 successMessage = getLabel('forms_imported_successfully'),
74 onAfterSuccessfulImport,
75 onSingleFormImported,
76 onMultipleFormsImported,
77 } = options
78
79 const importedForms = await importForms(file)
80
81 if (!importedForms || !Array.isArray(importedForms) || importedForms.length === 0) {
82 if (showErrorMessage) {
83 showImportError()
84 }
85 return []
86 }
87
88 const validImportedForms = getValidImportedForms(importedForms)
89 const importedFormIds = validImportedForms.map((form) => form.id)
90
91 if (importedFormIds.length === 0) {
92 if (showErrorMessage) {
93 showImportError()
94 }
95 return []
96 }
97
98 if (showSuccessMessage) {
99 IvyMessage({
100 message: successMessage,
101 type: 'success',
102 })
103 }
104
105 await onAfterSuccessfulImport?.(importedFormIds, validImportedForms)
106
107 if (importedFormIds.length === 1) {
108 await onSingleFormImported?.(
109 importedFormIds[0],
110 validImportedForms[0],
111 importedFormIds,
112 validImportedForms,
113 )
114 } else {
115 await onMultipleFormsImported?.(importedFormIds, validImportedForms)
116 }
117
118 return importedFormIds
119 }
120
121 return {
122 isImporting,
123 importError,
124 handleImportedForms,
125 getImportedFormIds,
126 getValidImportedForms,
127 }
128 }
129