@rkosafo/cai.components 0.0.46 → 0.0.48

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.
@@ -0,0 +1,134 @@
1
+ <script lang="ts" module>
2
+ import { registerPlugin, supported } from 'svelte-filepond';
3
+ import FilePondPluginImageExifOrientation from 'filepond-plugin-image-exif-orientation';
4
+ import FilePondPluginImagePreview from 'filepond-plugin-image-preview';
5
+ import FilePondPluginFileValidateType from 'filepond-plugin-file-validate-type';
6
+ registerPlugin(
7
+ FilePondPluginImageExifOrientation,
8
+ FilePondPluginImagePreview,
9
+ FilePondPluginFileValidateType
10
+ );
11
+ </script>
12
+
13
+ <script lang="ts">
14
+ import { key, Label } from '../../index.js';
15
+ import type { FormFileUploadProps } from '../../types/index.js';
16
+ import { nanoid } from 'nanoid';
17
+ import { getContext } from 'svelte';
18
+ import FilePond from 'svelte-filepond';
19
+
20
+ let {
21
+ title = 'Click Browse or drop the file to upload',
22
+ subTitle = '',
23
+ url = '',
24
+ name = 'file',
25
+ allowMultiple = false,
26
+ acceptedFileTypes = [
27
+ 'image/png',
28
+ 'image/jpeg',
29
+ 'application/pdf',
30
+ 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
31
+ ],
32
+ files = [],
33
+ label = '',
34
+ required = false,
35
+ showError = false,
36
+ imageOnly = false,
37
+ contextKey = null,
38
+ onChange
39
+ }: FormFileUploadProps = $props();
40
+
41
+ // State
42
+ let pond = $state<any>();
43
+
44
+ // Context
45
+ const { touched, errors, data, setData }: any = getContext(contextKey || key);
46
+
47
+ // Derived state
48
+ let id = nanoid();
49
+ let hasError = $derived($touched[name] && $errors[name]?.length);
50
+ let error = $derived($errors[name]?.join(', '));
51
+
52
+ // Constants
53
+ const uploadServerConfig = {};
54
+
55
+ // Effects
56
+ $effect(() => {
57
+ if (imageOnly && acceptedFileTypes?.length === 3) {
58
+ acceptedFileTypes = ['image/png', 'image/jpeg'];
59
+ }
60
+ });
61
+
62
+ function checkFiles(files: any) {
63
+ if (files.length > 1) {
64
+ const newFiles = files.map((x: any) => x.file);
65
+ setData({ ...$data, [name]: newFiles });
66
+ onChange?.({ name, value: newFiles });
67
+ } else if (files.length === 1) {
68
+ const { file } = files[0];
69
+ setData({ ...$data, [name]: file });
70
+ onChange?.({ name, value: file });
71
+ } else if (files.length == 0) {
72
+ onChange?.(null);
73
+ }
74
+ }
75
+
76
+ function customFileTypeDetection(source: File, type: string) {
77
+ return new Promise((resolve, reject) => {
78
+ const fileName = source.name;
79
+ if (fileName.endsWith('.frx')) {
80
+ resolve('.frx');
81
+ } else {
82
+ resolve(type);
83
+ }
84
+ });
85
+ }
86
+ </script>
87
+
88
+ <div class="relative my-2 flex flex-grow flex-col">
89
+ <Label
90
+ >{label}
91
+ {#if required}
92
+ <span class="pl-1 text-red-500">*</span>
93
+ {/if}
94
+ </Label>
95
+
96
+ <FilePond
97
+ {name}
98
+ required={true}
99
+ allowReplace={true}
100
+ instantUpload={false}
101
+ server={uploadServerConfig}
102
+ {allowMultiple}
103
+ allowRevert={true}
104
+ allowImagePreview={true}
105
+ allowImageResize={true}
106
+ bind:this={pond}
107
+ onupdatefiles={checkFiles}
108
+ {files}
109
+ {acceptedFileTypes}
110
+ fileValidateTypeDetectType={customFileTypeDetection}
111
+ credits={false}
112
+ />
113
+
114
+ {#if hasError}
115
+ <Label
116
+ class="v-error-container absolute top-9 right-2 flex items-center gap-1 text-sm {hasError &&
117
+ 'text-red-600'}"
118
+ >
119
+ <span class="v-error-message hidden backdrop-blur-sm">
120
+ {error}
121
+ </span>
122
+ <iconify-icon
123
+ icon="solar:danger-circle-bold-duotone"
124
+ class="v-error-svg ml-auto cursor-pointer text-red-500 select-none hover:text-red-600"
125
+ style="font-size: 18px;"
126
+ ></iconify-icon>
127
+ </Label>
128
+ {/if}
129
+ </div>
130
+
131
+ <style>
132
+ @import 'filepond/dist/filepond.css';
133
+ @import 'filepond-plugin-image-preview/dist/filepond-plugin-image-preview.css';
134
+ </style>
@@ -0,0 +1,4 @@
1
+ import type { FormFileUploadProps } from '../../types/index.js';
2
+ declare const FormFileUplad: import("svelte").Component<FormFileUploadProps, {}, "">;
3
+ type FormFileUplad = ReturnType<typeof FormFileUplad>;
4
+ export default FormFileUplad;
@@ -0,0 +1 @@
1
+ export { default as FormFileUpload } from './FormFileUplad.svelte';
@@ -0,0 +1 @@
1
+ export { default as FormFileUpload } from './FormFileUplad.svelte';
package/dist/index.d.ts CHANGED
@@ -35,6 +35,7 @@ export * from './forms/textarea/index.js';
35
35
  export * from './forms/select/index.js';
36
36
  export * from './forms/radio/index.js';
37
37
  export * from './forms/checkbox/index.js';
38
+ export * from './forms/FormFileUpload/index.js';
38
39
  export * from './forms/form/index.js';
39
40
  export * from './forms/FormInput/index.js';
40
41
  export * from './forms/FormDatepicker/index.js';
package/dist/index.js CHANGED
@@ -36,6 +36,7 @@ export * from './forms/textarea/index.js';
36
36
  export * from './forms/select/index.js';
37
37
  export * from './forms/radio/index.js';
38
38
  export * from './forms/checkbox/index.js';
39
+ export * from './forms/FormFileUpload/index.js';
39
40
  export * from './forms/form/index.js';
40
41
  export * from './forms/FormInput/index.js';
41
42
  export * from './forms/FormDatepicker/index.js';
@@ -761,6 +761,7 @@ export interface ITab {
761
761
  export interface RemoveTabEvent {
762
762
  tabId: string | number;
763
763
  tabData?: any;
764
+ refresh?: boolean;
764
765
  }
765
766
  export interface TabChildrenProps extends ITab {
766
767
  onTabChange?: (tabId: number | string) => void;
@@ -855,3 +856,18 @@ export interface IDocumentCanvasProps {
855
856
  close: (val: IDocumentCanvasClose) => void;
856
857
  toggleCollapse: (id: string) => void;
857
858
  }
859
+ export interface FormFileUploadProps {
860
+ title: string;
861
+ subTitle?: string;
862
+ url?: string;
863
+ name: string;
864
+ allowMultiple?: boolean;
865
+ acceptedFileTypes?: string[];
866
+ files?: any[];
867
+ label: string;
868
+ required?: boolean;
869
+ showError?: boolean;
870
+ imageOnly?: boolean;
871
+ contextKey?: any;
872
+ onChange?: (val: any) => void;
873
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rkosafo/cai.components",
3
- "version": "0.0.46",
3
+ "version": "0.0.48",
4
4
  "files": [
5
5
  "dist",
6
6
  "!dist/**/*.test.*",
@@ -59,12 +59,17 @@
59
59
  "date-fns": "^4.1.0",
60
60
  "dayjs": "^1.11.18",
61
61
  "felte": "^1.3.0",
62
+ "filepond": "^4.32.9",
63
+ "filepond-plugin-file-validate-type": "^1.2.9",
64
+ "filepond-plugin-image-exif-orientation": "^1.0.11",
65
+ "filepond-plugin-image-preview": "^4.6.12",
62
66
  "iconify-icon": "^3.0.0",
63
67
  "keycloak-js": "^26.2.0",
64
68
  "lodash": "^4.17.21",
65
69
  "mdsvex": "^0.12.6",
66
70
  "nanoid": "^5.1.5",
67
71
  "svelecte": "^5.3.0",
72
+ "svelte-filepond": "^0.2.2",
68
73
  "svelte-french-toast": "^1.2.0",
69
74
  "svelte-headless-table": "^0.18.3",
70
75
  "svelte-meta-tags": "^4.4.0",