@finema/core 3.23.2 → 3.24.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.
Files changed (85) hide show
  1. package/README.md +22 -2
  2. package/dist/module.json +1 -1
  3. package/dist/module.mjs +3 -14
  4. package/dist/runtime/components/DevToolsWindow/index.vue +24 -26
  5. package/dist/runtime/components/Dialog/index.vue +11 -10
  6. package/dist/runtime/components/Empty.d.vue.ts +1 -1
  7. package/dist/runtime/components/Empty.vue +16 -12
  8. package/dist/runtime/components/Empty.vue.d.ts +1 -1
  9. package/dist/runtime/components/FlexDeck/index.vue +85 -92
  10. package/dist/runtime/components/Form/FieldWrapper.vue +13 -13
  11. package/dist/runtime/components/Form/Fields.d.vue.ts +1 -1
  12. package/dist/runtime/components/Form/Fields.vue +17 -11
  13. package/dist/runtime/components/Form/Fields.vue.d.ts +1 -1
  14. package/dist/runtime/components/Form/InputCheckbox/index.vue +19 -23
  15. package/dist/runtime/components/Form/InputCheckboxGroup/index.vue +1 -5
  16. package/dist/runtime/components/Form/InputCurrency/index.vue +56 -57
  17. package/dist/runtime/components/Form/InputDateTime/date_time_field.types.d.ts +2 -0
  18. package/dist/runtime/components/Form/InputDateTime/index.vue +70 -80
  19. package/dist/runtime/components/Form/InputDateTimeRange/index.vue +78 -75
  20. package/dist/runtime/components/Form/InputMonth/index.vue +7 -10
  21. package/dist/runtime/components/Form/InputNumber/index.vue +21 -25
  22. package/dist/runtime/components/Form/InputRadio/index.d.vue.ts +1 -1
  23. package/dist/runtime/components/Form/InputRadio/index.vue +1 -5
  24. package/dist/runtime/components/Form/InputRadio/index.vue.d.ts +1 -1
  25. package/dist/runtime/components/Form/InputRating/index.vue +1 -5
  26. package/dist/runtime/components/Form/InputSearch/index.vue +2 -8
  27. package/dist/runtime/components/Form/InputSelect/index.vue +112 -122
  28. package/dist/runtime/components/Form/InputSelectMultiple/index.vue +121 -133
  29. package/dist/runtime/components/Form/InputTags/index.vue +55 -59
  30. package/dist/runtime/components/Form/InputText/index.vue +122 -133
  31. package/dist/runtime/components/Form/InputTextarea/index.vue +19 -23
  32. package/dist/runtime/components/Form/InputTime/index.vue +63 -63
  33. package/dist/runtime/components/Form/InputToggle/index.vue +18 -21
  34. package/dist/runtime/components/Form/InputUploadDropzone/index.vue +46 -49
  35. package/dist/runtime/components/Form/InputUploadDropzoneAuto/index.vue +57 -63
  36. package/dist/runtime/components/Form/InputUploadDropzoneAutoMultiple/index.vue +57 -64
  37. package/dist/runtime/components/Form/InputUploadImageAuto/index.vue +57 -63
  38. package/dist/runtime/components/Form/InputWYSIWYG/EditorImagePasteExtension.js +7 -6
  39. package/dist/runtime/components/Form/InputWYSIWYG/EditorImageUploadExtension.js +13 -12
  40. package/dist/runtime/components/Form/InputWYSIWYG/EditorImageUploadNode.vue +21 -19
  41. package/dist/runtime/components/Form/InputWYSIWYG/EditorLinkPopover.vue +85 -87
  42. package/dist/runtime/components/Form/InputWYSIWYG/README.md +96 -96
  43. package/dist/runtime/components/Form/InputWYSIWYG/index.vue +178 -157
  44. package/dist/runtime/components/Form/fileState/EmptyState.vue +21 -21
  45. package/dist/runtime/components/Form/fileState/FailedState.vue +34 -36
  46. package/dist/runtime/components/Form/fileState/LoadingState.vue +24 -24
  47. package/dist/runtime/components/Form/fileState/MultipleFilesState.vue +74 -78
  48. package/dist/runtime/components/Form/fileState/PreviewModal.vue +23 -23
  49. package/dist/runtime/components/Form/fileState/SuccessState.vue +3 -12
  50. package/dist/runtime/components/Form/fileState/useFileState.js +2 -10
  51. package/dist/runtime/components/Form/fileState/useUploadImageState.js +1 -3
  52. package/dist/runtime/components/Form/fileState/useUploadState.js +8 -19
  53. package/dist/runtime/components/Form/fileState/useUploadStateMultiple.js +25 -30
  54. package/dist/runtime/components/Form/index.vue +5 -5
  55. package/dist/runtime/components/Image.vue +22 -28
  56. package/dist/runtime/components/Loader.d.vue.ts +1 -1
  57. package/dist/runtime/components/Loader.vue +10 -7
  58. package/dist/runtime/components/Loader.vue.d.ts +1 -1
  59. package/dist/runtime/components/Log/LogItem.vue +1 -3
  60. package/dist/runtime/components/Log/index.vue +1 -3
  61. package/dist/runtime/components/Table/Base.vue +117 -137
  62. package/dist/runtime/components/Table/ColumnDate.vue +1 -1
  63. package/dist/runtime/components/Table/ColumnDateTime.vue +1 -1
  64. package/dist/runtime/components/Table/ColumnImage.vue +4 -4
  65. package/dist/runtime/components/Table/ColumnText.vue +10 -10
  66. package/dist/runtime/components/Table/Pagination.vue +71 -77
  67. package/dist/runtime/components/Table/Simple.vue +19 -19
  68. package/dist/runtime/components/Table/index.vue +36 -42
  69. package/dist/runtime/composables/loaderList.js +1 -3
  70. package/dist/runtime/composables/loaderPage.js +156 -133
  71. package/dist/runtime/composables/useConfig.js +1 -1
  72. package/dist/runtime/composables/useDialog.js +1 -3
  73. package/dist/runtime/composables/useForm.d.ts +1 -1
  74. package/dist/runtime/composables/useForm.js +1 -3
  75. package/dist/runtime/composables/useTable.js +2 -14
  76. package/dist/runtime/helpers/apiBaseHelper.js +6 -24
  77. package/dist/runtime/helpers/apiListHelper.js +2 -5
  78. package/dist/runtime/helpers/apiObjectHelper.js +2 -5
  79. package/dist/runtime/helpers/apiPageHelper.js +19 -38
  80. package/dist/runtime/helpers/componentHelper.js +2 -6
  81. package/dist/runtime/helpers/uploadCore.js +1 -4
  82. package/dist/runtime/locale/index.js +1 -4
  83. package/dist/runtime/server/tsconfig.json +3 -3
  84. package/dist/runtime/styles/main.css +1 -1
  85. package/package.json +39 -26
@@ -1,34 +1,34 @@
1
1
  <template>
2
- <FieldWrapper v-bind="wrapperProps">
3
- <div
4
- ref="dropzoneRef"
5
- :class="theme.base()"
6
- >
7
- <div :class="theme.wrapper()">
8
- <!-- Empty State -->
9
- <EmptyState
10
- v-if="uploadState.isEmpty.value"
11
- :theme="theme"
12
- :select-file-label="selectFileLabel ?? messages.upload.selectFile"
13
- :select-file-sub-label="selectFileSubLabel ?? messages.upload.dropHere"
14
- :placeholder="placeholder"
15
- @open-file="uploadState.handleOpenFile"
16
- />
17
-
18
- <!-- Success State -->
19
- <SuccessState
20
- v-if="uploadState.isSuccess.value"
21
- :theme="theme"
22
- :value="value"
23
- :disabled="wrapperProps.disabled"
24
- :readonly="wrapperProps.readonly"
25
- @preview="uploadState.handlePreview"
26
- @download="handleDownloadFile"
27
- @delete="uploadState.handleDeleteFile"
28
- />
29
- </div>
30
- </div>
31
- </FieldWrapper>
2
+ <FieldWrapper v-bind="wrapperProps">
3
+ <div
4
+ ref="dropzoneRef"
5
+ :class="theme.base()"
6
+ >
7
+ <div :class="theme.wrapper()">
8
+ <!-- Empty State -->
9
+ <EmptyState
10
+ v-if="uploadState.isEmpty.value"
11
+ :theme="theme"
12
+ :select-file-label="selectFileLabel ?? messages.upload.selectFile"
13
+ :select-file-sub-label="selectFileSubLabel ?? messages.upload.dropHere"
14
+ :placeholder="placeholder"
15
+ @open-file="uploadState.handleOpenFile"
16
+ />
17
+
18
+ <!-- Success State -->
19
+ <SuccessState
20
+ v-if="uploadState.isSuccess.value"
21
+ :theme="theme"
22
+ :value="value"
23
+ :disabled="wrapperProps.disabled"
24
+ :readonly="wrapperProps.readonly"
25
+ @preview="uploadState.handlePreview"
26
+ @download="handleDownloadFile"
27
+ @delete="uploadState.handleDeleteFile"
28
+ />
29
+ </div>
30
+ </div>
31
+ </FieldWrapper>
32
32
  </template>
33
33
 
34
34
  <script setup>
@@ -63,18 +63,9 @@ const props = defineProps({
63
63
  ui: { type: null, required: false },
64
64
  containerUi: { type: null, required: false }
65
65
  });
66
- const {
67
- messages
68
- } = useCoreMessages();
69
- const {
70
- wrapperProps,
71
- handleChange: onChange,
72
- setErrors,
73
- value
74
- } = useFieldHOC(props);
75
- const acceptedFileTypes = computed(
76
- () => typeof props.accept === "string" ? props.accept : props.accept?.join(",")
77
- );
66
+ const { messages } = useCoreMessages();
67
+ const { wrapperProps, handleChange: onChange, setErrors, value } = useFieldHOC(props);
68
+ const acceptedFileTypes = computed(() => typeof props.accept === "string" ? props.accept : props.accept?.join(","));
78
69
  const dropzoneRef = useTemplateRef("dropzoneRef");
79
70
  const uploadState = useFileState({
80
71
  props,
@@ -86,15 +77,21 @@ const uploadState = useFileState({
86
77
  wrapperProps,
87
78
  dropzoneRef
88
79
  });
89
- useWatchChange(() => value.value, (newValue) => {
90
- if (typeof newValue === "object" && newValue !== null) {
91
- onChange(newValue);
92
- } else {
93
- onChange(void 0);
80
+ useWatchChange(
81
+ () => value.value,
82
+ (newValue) => {
83
+ if (typeof newValue === "object" && newValue !== null) {
84
+ onChange(newValue);
85
+ } else {
86
+ onChange(void 0);
87
+ }
94
88
  }
95
- });
89
+ );
96
90
  const theme = computed(
97
- () => useUiConfig(uploadFileDropzoneTheme, "uploadFileDropzone")({
91
+ () => useUiConfig(
92
+ uploadFileDropzoneTheme,
93
+ "uploadFileDropzone"
94
+ )({
98
95
  dragover: uploadState.dropzone.isOverDropZone.value && uploadState.isEmpty.value,
99
96
  disabled: wrapperProps.value.disabled
100
97
  })
@@ -1,54 +1,54 @@
1
1
  <template>
2
- <FieldWrapper v-bind="wrapperProps">
3
- <div
4
- ref="dropzoneRef"
5
- :class="theme.base()"
6
- >
7
- <div :class="theme.wrapper()">
8
- <!-- Empty State -->
9
- <EmptyState
10
- v-if="uploadState.isEmpty.value"
11
- :theme="theme"
12
- :select-file-label="selectFileLabel ?? messages.upload.selectFile"
13
- :select-file-sub-label="selectFileSubLabel ?? messages.upload.dropHere"
14
- :placeholder="placeholder"
15
- @open-file="uploadState.handleOpenFile"
16
- />
17
-
18
- <!-- Loading State -->
19
- <LoadingState
20
- v-if="uploadState.isUploading.value"
21
- :theme="theme"
22
- :selected-file="uploadState.selectedFile.value"
23
- :percent="uploadState.percent.value"
24
- :uploading-label="uploadingLabel ?? messages.upload.uploading"
25
- />
26
-
27
- <!-- Success State -->
28
- <SuccessState
29
- v-if="uploadState.isSuccess.value"
30
- :theme="theme"
31
- :value="value"
32
- :disabled="wrapperProps.disabled"
33
- :readonly="wrapperProps.readonly"
34
- @preview="uploadState.handlePreview"
35
- @download="handleDownloadFile"
36
- @delete="uploadState.handleDeleteFile"
37
- />
38
-
39
- <!-- Failed State -->
40
- <FailedState
41
- v-if="uploadState.isError.value"
42
- :theme="theme"
43
- :selected-file="uploadState.selectedFile.value"
44
- :upload-failed-label="uploadFailedLabel ?? messages.upload.uploadFailed"
45
- :retry-label="retryLabel ?? messages.upload.retry"
46
- @retry="uploadState.handleRetryUpload"
47
- @delete="uploadState.handleDeleteFile"
48
- />
49
- </div>
50
- </div>
51
- </FieldWrapper>
2
+ <FieldWrapper v-bind="wrapperProps">
3
+ <div
4
+ ref="dropzoneRef"
5
+ :class="theme.base()"
6
+ >
7
+ <div :class="theme.wrapper()">
8
+ <!-- Empty State -->
9
+ <EmptyState
10
+ v-if="uploadState.isEmpty.value"
11
+ :theme="theme"
12
+ :select-file-label="selectFileLabel ?? messages.upload.selectFile"
13
+ :select-file-sub-label="selectFileSubLabel ?? messages.upload.dropHere"
14
+ :placeholder="placeholder"
15
+ @open-file="uploadState.handleOpenFile"
16
+ />
17
+
18
+ <!-- Loading State -->
19
+ <LoadingState
20
+ v-if="uploadState.isUploading.value"
21
+ :theme="theme"
22
+ :selected-file="uploadState.selectedFile.value"
23
+ :percent="uploadState.percent.value"
24
+ :uploading-label="uploadingLabel ?? messages.upload.uploading"
25
+ />
26
+
27
+ <!-- Success State -->
28
+ <SuccessState
29
+ v-if="uploadState.isSuccess.value"
30
+ :theme="theme"
31
+ :value="value"
32
+ :disabled="wrapperProps.disabled"
33
+ :readonly="wrapperProps.readonly"
34
+ @preview="uploadState.handlePreview"
35
+ @download="handleDownloadFile"
36
+ @delete="uploadState.handleDeleteFile"
37
+ />
38
+
39
+ <!-- Failed State -->
40
+ <FailedState
41
+ v-if="uploadState.isError.value"
42
+ :theme="theme"
43
+ :selected-file="uploadState.selectedFile.value"
44
+ :upload-failed-label="uploadFailedLabel ?? messages.upload.uploadFailed"
45
+ :retry-label="retryLabel ?? messages.upload.retry"
46
+ @retry="uploadState.handleRetryUpload"
47
+ @delete="uploadState.handleDeleteFile"
48
+ />
49
+ </div>
50
+ </div>
51
+ </FieldWrapper>
52
52
  </template>
53
53
 
54
54
  <script setup>
@@ -97,18 +97,9 @@ const props = defineProps({
97
97
  ui: { type: null, required: false },
98
98
  containerUi: { type: null, required: false }
99
99
  });
100
- const {
101
- messages
102
- } = useCoreMessages();
103
- const {
104
- wrapperProps,
105
- handleChange: onChange,
106
- setErrors,
107
- value
108
- } = useFieldHOC(props);
109
- const acceptedFileTypes = computed(
110
- () => typeof props.accept === "string" ? props.accept : props.accept?.join(",")
111
- );
100
+ const { messages } = useCoreMessages();
101
+ const { wrapperProps, handleChange: onChange, setErrors, value } = useFieldHOC(props);
102
+ const acceptedFileTypes = computed(() => typeof props.accept === "string" ? props.accept : props.accept?.join(","));
112
103
  const dropzoneRef = useTemplateRef("dropzoneRef");
113
104
  const uploadState = useUploadState({
114
105
  props,
@@ -121,7 +112,10 @@ const uploadState = useUploadState({
121
112
  dropzoneRef
122
113
  });
123
114
  const theme = computed(
124
- () => useUiConfig(uploadFileDropzoneTheme, "uploadFileDropzone")({
115
+ () => useUiConfig(
116
+ uploadFileDropzoneTheme,
117
+ "uploadFileDropzone"
118
+ )({
125
119
  dragover: uploadState.dropzone.isOverDropZone.value && uploadState.isEmpty.value,
126
120
  disabled: wrapperProps.value.disabled,
127
121
  failed: uploadState.upload.status.value.isError
@@ -1,54 +1,54 @@
1
1
  <template>
2
- <FieldWrapper v-bind="wrapperProps">
3
- <div
4
- ref="dropzoneRef"
5
- :class="theme.base()"
6
- >
7
- <div :class="theme.wrapper()">
8
- <!-- Empty State -->
9
- <EmptyState
10
- :theme="theme"
11
- :select-file-label="selectFileLabel ?? messages.upload.selectFile"
12
- :select-file-sub-label="selectFileSubLabel ?? messages.upload.dropHere"
13
- :placeholder="placeholder"
14
- @open-file="uploadState.handleOpenFile"
15
- />
16
- </div>
17
- </div>
18
- <!-- Multiple Files State -->
19
- <MultipleFilesState
20
- v-if="!uploadState.isEmpty.value"
21
- :theme="theme"
22
- :file-items="uploadState.fileItems.value"
23
- :disabled="wrapperProps.disabled"
24
- :readonly="wrapperProps.readonly"
25
- :upload-failed-label="uploadFailedLabel ?? messages.upload.uploadFailed"
26
- :retry-label="retryLabel ?? messages.upload.retry"
27
- @preview="uploadState.handlePreview"
28
- @download="handleDownloadFile"
29
- @delete="uploadState.handleDeleteFile"
30
- @retry="uploadState.handleRetryUpload"
31
- />
32
-
33
- <!-- Success State -->
34
- <div
35
- v-for="(item, index) in value"
36
- :key="index"
37
- :class="theme.multipleFilesWrapper()"
38
- >
39
- <div :class="theme.fileItemWrapper()">
40
- <SuccessState
41
- :theme="theme"
42
- :value="item"
43
- :disabled="wrapperProps.disabled"
44
- :readonly="wrapperProps.readonly"
45
- @preview="uploadState.handlePreview(item)"
46
- @download="handleDownloadFile(item)"
47
- @delete="handleDeleteFile(index, item)"
48
- />
49
- </div>
50
- </div>
51
- </FieldWrapper>
2
+ <FieldWrapper v-bind="wrapperProps">
3
+ <div
4
+ ref="dropzoneRef"
5
+ :class="theme.base()"
6
+ >
7
+ <div :class="theme.wrapper()">
8
+ <!-- Empty State -->
9
+ <EmptyState
10
+ :theme="theme"
11
+ :select-file-label="selectFileLabel ?? messages.upload.selectFile"
12
+ :select-file-sub-label="selectFileSubLabel ?? messages.upload.dropHere"
13
+ :placeholder="placeholder"
14
+ @open-file="uploadState.handleOpenFile"
15
+ />
16
+ </div>
17
+ </div>
18
+ <!-- Multiple Files State -->
19
+ <MultipleFilesState
20
+ v-if="!uploadState.isEmpty.value"
21
+ :theme="theme"
22
+ :file-items="uploadState.fileItems.value"
23
+ :disabled="wrapperProps.disabled"
24
+ :readonly="wrapperProps.readonly"
25
+ :upload-failed-label="uploadFailedLabel ?? messages.upload.uploadFailed"
26
+ :retry-label="retryLabel ?? messages.upload.retry"
27
+ @preview="uploadState.handlePreview"
28
+ @download="handleDownloadFile"
29
+ @delete="uploadState.handleDeleteFile"
30
+ @retry="uploadState.handleRetryUpload"
31
+ />
32
+
33
+ <!-- Success State -->
34
+ <div
35
+ v-for="(item, index) in value"
36
+ :key="index"
37
+ :class="theme.multipleFilesWrapper()"
38
+ >
39
+ <div :class="theme.fileItemWrapper()">
40
+ <SuccessState
41
+ :theme="theme"
42
+ :value="item"
43
+ :disabled="wrapperProps.disabled"
44
+ :readonly="wrapperProps.readonly"
45
+ @preview="uploadState.handlePreview(item)"
46
+ @download="handleDownloadFile(item)"
47
+ @delete="handleDeleteFile(index, item)"
48
+ />
49
+ </div>
50
+ </div>
51
+ </FieldWrapper>
52
52
  </template>
53
53
 
54
54
  <script setup>
@@ -97,20 +97,10 @@ const props = defineProps({
97
97
  ui: { type: null, required: false },
98
98
  containerUi: { type: null, required: false }
99
99
  });
100
- const {
101
- messages,
102
- format
103
- } = useCoreMessages();
104
- const {
105
- wrapperProps,
106
- handleChange: onChange,
107
- setErrors,
108
- value
109
- } = useFieldHOC(props);
100
+ const { messages, format } = useCoreMessages();
101
+ const { wrapperProps, handleChange: onChange, setErrors, value } = useFieldHOC(props);
110
102
  const dialog = useDialog();
111
- const acceptedFileTypes = computed(
112
- () => typeof props.accept === "string" ? props.accept : props.accept?.join(",")
113
- );
103
+ const acceptedFileTypes = computed(() => typeof props.accept === "string" ? props.accept : props.accept?.join(","));
114
104
  const dropzoneRef = useTemplateRef("dropzoneRef");
115
105
  const uploadState = useUploadStateMultiple({
116
106
  props,
@@ -123,7 +113,10 @@ const uploadState = useUploadStateMultiple({
123
113
  dropzoneRef
124
114
  });
125
115
  const theme = computed(
126
- () => useUiConfig(uploadFileDropzoneTheme, "uploadFileDropzone")({
116
+ () => useUiConfig(
117
+ uploadFileDropzoneTheme,
118
+ "uploadFileDropzone"
119
+ )({
127
120
  dragover: uploadState.dropzone.isOverDropZone.value && uploadState.isEmpty.value,
128
121
  disabled: wrapperProps.value.disabled,
129
122
  failed: false
@@ -1,54 +1,54 @@
1
1
  <template>
2
- <FieldWrapper v-bind="wrapperProps">
3
- <div
4
- ref="dropzoneRef"
5
- :class="theme.base()"
6
- >
7
- <div :class="theme.wrapper()">
8
- <!-- Empty State -->
9
- <EmptyState
10
- v-if="uploadState.isEmpty.value"
11
- :theme="theme"
12
- :select-file-label="selectFileLabel ?? messages.upload.selectImage"
13
- :select-file-sub-label="selectFileSubLabel ?? messages.upload.dropHere"
14
- :placeholder="placeholder"
15
- @open-file="uploadState.handleOpenFile"
16
- />
17
-
18
- <!-- Loading State -->
19
- <LoadingState
20
- v-if="uploadState.isUploading.value"
21
- :theme="theme"
22
- :selected-file="uploadState.selectedFile.value"
23
- :percent="uploadState.percent.value"
24
- :uploading-label="uploadingLabel ?? messages.upload.uploading"
25
- />
26
-
27
- <!-- Success State -->
28
- <SuccessState
29
- v-if="uploadState.isSuccess.value"
30
- :theme="theme"
31
- :value="value"
32
- :disabled="wrapperProps.disabled"
33
- :readonly="wrapperProps.readonly"
34
- @preview="uploadState.handlePreview"
35
- @download="handleDownloadFile"
36
- @delete="uploadState.handleDeleteFile"
37
- />
38
-
39
- <!-- Failed State -->
40
- <FailedState
41
- v-if="uploadState.isError.value"
42
- :theme="theme"
43
- :selected-file="uploadState.selectedFile.value"
44
- :upload-failed-label="uploadFailedLabel ?? messages.upload.uploadFailed"
45
- :retry-label="retryLabel ?? messages.upload.retry"
46
- @retry="uploadState.handleRetryUpload"
47
- @delete="uploadState.handleDeleteFile"
48
- />
49
- </div>
50
- </div>
51
- </FieldWrapper>
2
+ <FieldWrapper v-bind="wrapperProps">
3
+ <div
4
+ ref="dropzoneRef"
5
+ :class="theme.base()"
6
+ >
7
+ <div :class="theme.wrapper()">
8
+ <!-- Empty State -->
9
+ <EmptyState
10
+ v-if="uploadState.isEmpty.value"
11
+ :theme="theme"
12
+ :select-file-label="selectFileLabel ?? messages.upload.selectImage"
13
+ :select-file-sub-label="selectFileSubLabel ?? messages.upload.dropHere"
14
+ :placeholder="placeholder"
15
+ @open-file="uploadState.handleOpenFile"
16
+ />
17
+
18
+ <!-- Loading State -->
19
+ <LoadingState
20
+ v-if="uploadState.isUploading.value"
21
+ :theme="theme"
22
+ :selected-file="uploadState.selectedFile.value"
23
+ :percent="uploadState.percent.value"
24
+ :uploading-label="uploadingLabel ?? messages.upload.uploading"
25
+ />
26
+
27
+ <!-- Success State -->
28
+ <SuccessState
29
+ v-if="uploadState.isSuccess.value"
30
+ :theme="theme"
31
+ :value="value"
32
+ :disabled="wrapperProps.disabled"
33
+ :readonly="wrapperProps.readonly"
34
+ @preview="uploadState.handlePreview"
35
+ @download="handleDownloadFile"
36
+ @delete="uploadState.handleDeleteFile"
37
+ />
38
+
39
+ <!-- Failed State -->
40
+ <FailedState
41
+ v-if="uploadState.isError.value"
42
+ :theme="theme"
43
+ :selected-file="uploadState.selectedFile.value"
44
+ :upload-failed-label="uploadFailedLabel ?? messages.upload.uploadFailed"
45
+ :retry-label="retryLabel ?? messages.upload.retry"
46
+ @retry="uploadState.handleRetryUpload"
47
+ @delete="uploadState.handleDeleteFile"
48
+ />
49
+ </div>
50
+ </div>
51
+ </FieldWrapper>
52
52
  </template>
53
53
 
54
54
  <script setup>
@@ -98,18 +98,9 @@ const props = defineProps({
98
98
  ui: { type: null, required: false },
99
99
  containerUi: { type: null, required: false }
100
100
  });
101
- const {
102
- messages
103
- } = useCoreMessages();
104
- const {
105
- wrapperProps,
106
- handleChange: onChange,
107
- setErrors,
108
- value
109
- } = useFieldHOC(props);
110
- const acceptedFileTypes = computed(
111
- () => typeof props.accept === "string" ? props.accept : props.accept?.join(",")
112
- );
101
+ const { messages } = useCoreMessages();
102
+ const { wrapperProps, handleChange: onChange, setErrors, value } = useFieldHOC(props);
103
+ const acceptedFileTypes = computed(() => typeof props.accept === "string" ? props.accept : props.accept?.join(","));
113
104
  const dropzoneRef = useTemplateRef("dropzoneRef");
114
105
  const uploadState = useUploadImageState({
115
106
  props,
@@ -122,7 +113,10 @@ const uploadState = useUploadImageState({
122
113
  dropzoneRef
123
114
  });
124
115
  const theme = computed(
125
- () => useUiConfig(uploadFileDropzoneTheme, "uploadFileDropzone")({
116
+ () => useUiConfig(
117
+ uploadFileDropzoneTheme,
118
+ "uploadFileDropzone"
119
+ )({
126
120
  dragover: uploadState.dropzone.isOverDropZone.value && uploadState.isEmpty.value,
127
121
  disabled: wrapperProps.value.disabled,
128
122
  failed: uploadState.upload.status.value.isError
@@ -39,14 +39,15 @@ export const ImagePaste = Extension.create({
39
39
  console.warn("ImagePaste: requestOptions is not configured");
40
40
  continue;
41
41
  }
42
- const {
43
- schema
44
- } = view.state;
42
+ const { schema } = view.state;
45
43
  const pos = view.state.selection.from;
46
44
  if (schema.nodes.imageUpload) {
47
- const transaction = view.state.tr.insert(pos, schema.nodes.imageUpload.create({
48
- loading: true
49
- }));
45
+ const transaction = view.state.tr.insert(
46
+ pos,
47
+ schema.nodes.imageUpload.create({
48
+ loading: true
49
+ })
50
+ );
50
51
  view.dispatch(transaction);
51
52
  }
52
53
  const request = {
@@ -10,25 +10,26 @@ export const ImageUpload = Node.create({
10
10
  return {};
11
11
  },
12
12
  parseHTML() {
13
- return [{
14
- tag: 'div[data-type="image-upload"]'
15
- }];
13
+ return [
14
+ {
15
+ tag: 'div[data-type="image-upload"]'
16
+ }
17
+ ];
16
18
  },
17
- renderHTML({
18
- HTMLAttributes
19
- }) {
20
- return ["div", mergeAttributes(HTMLAttributes, {
21
- "data-type": "image-upload"
22
- })];
19
+ renderHTML({ HTMLAttributes }) {
20
+ return [
21
+ "div",
22
+ mergeAttributes(HTMLAttributes, {
23
+ "data-type": "image-upload"
24
+ })
25
+ ];
23
26
  },
24
27
  addNodeView() {
25
28
  return VueNodeViewRenderer(ImageUploadNodeComponent);
26
29
  },
27
30
  addCommands() {
28
31
  return {
29
- insertImageUpload: () => ({
30
- commands
31
- }) => {
32
+ insertImageUpload: () => ({ commands }) => {
32
33
  return commands.insertContent({
33
34
  type: this.name
34
35
  });
@@ -1,22 +1,22 @@
1
1
  <template>
2
- <NodeViewWrapper>
3
- <FileUpload
4
- v-model="file"
5
- accept="image/*"
6
- label="Upload an image"
7
- description="SVG, PNG, JPG or GIF"
8
- :preview="false"
9
- class="min-h-48"
10
- >
11
- <template #leading>
12
- <Avatar
13
- :icon="loading ? 'i-lucide-loader-circle' : 'i-lucide-image'"
14
- size="xl"
15
- :ui="{ icon: [loading && 'animate-spin'] }"
16
- />
17
- </template>
18
- </FileUpload>
19
- </NodeViewWrapper>
2
+ <NodeViewWrapper>
3
+ <FileUpload
4
+ v-model="file"
5
+ accept="image/*"
6
+ label="Upload an image"
7
+ description="SVG, PNG, JPG or GIF"
8
+ :preview="false"
9
+ class="min-h-48"
10
+ >
11
+ <template #leading>
12
+ <Avatar
13
+ :icon="loading ? 'i-lucide-loader-circle' : 'i-lucide-image'"
14
+ size="xl"
15
+ :ui="{ icon: [loading && 'animate-spin'] }"
16
+ />
17
+ </template>
18
+ </FileUpload>
19
+ </NodeViewWrapper>
20
20
  </template>
21
21
 
22
22
  <script setup>
@@ -38,7 +38,9 @@ const props = defineProps({
38
38
  extension: { type: Object, required: true },
39
39
  HTMLAttributes: { type: Object, required: true }
40
40
  });
41
- const options = computed(() => props.extension.options);
41
+ const options = computed(
42
+ () => props.extension.options
43
+ );
42
44
  const file = ref(null);
43
45
  const loading = ref(false);
44
46
  watch(file, async (newFile) => {