dinocollab-core 1.0.18 → 1.0.20

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 (39) hide show
  1. package/dist/filter-bar/create.filter-menu.js +1 -1
  2. package/dist/filter-bar/create.filter-menu.js.map +1 -1
  3. package/dist/form/create.autocomplete.chips.js +1 -1
  4. package/dist/form/create.autocomplete.chips.js.map +1 -1
  5. package/dist/form/create.date-expired.js +1 -1
  6. package/dist/form/create.date-expired.js.map +1 -1
  7. package/dist/form/create.date-picker.js +1 -1
  8. package/dist/form/create.date-picker.js.map +1 -1
  9. package/dist/form/create.form-base.js +1 -1
  10. package/dist/form/create.form-base.js.map +1 -1
  11. package/dist/form/create.input-file.csv-local-parser.js +2 -0
  12. package/dist/form/create.input-file.csv-local-parser.js.map +1 -0
  13. package/dist/form/create.input.file.js +1 -1
  14. package/dist/form/create.input.file.js.map +1 -1
  15. package/dist/form/create.input.js +1 -1
  16. package/dist/form/create.input.js.map +1 -1
  17. package/dist/form/create.select-simple.js +1 -1
  18. package/dist/form/create.select-simple.js.map +1 -1
  19. package/dist/form/create.select-with-api.js +1 -1
  20. package/dist/form/create.select-with-api.js.map +1 -1
  21. package/dist/form/create.text-editor.js +1 -1
  22. package/dist/form/create.text-editor.js.map +1 -1
  23. package/dist/form/dino-form.js +1 -1
  24. package/dist/form/dino-form.js.map +1 -1
  25. package/dist/form/helpers.js +2 -0
  26. package/dist/form/helpers.js.map +1 -0
  27. package/dist/index.js +1 -1
  28. package/dist/table/create.table.js +1 -1
  29. package/dist/table/create.table.js.map +1 -1
  30. package/dist/types/form/create.input-file.csv-local-parser.d.ts +52 -0
  31. package/dist/types/form/dino-form.d.ts +3 -1
  32. package/dist/types/form/{helper.d.ts → helpers.d.ts} +18 -1
  33. package/dist/types/form/index.d.ts +1 -1
  34. package/dist/types/utils/helpers.d.ts +5 -4
  35. package/dist/utils/helpers.js +1 -1
  36. package/dist/utils/helpers.js.map +1 -1
  37. package/package.json +1 -1
  38. package/dist/form/helper.js +0 -2
  39. package/dist/form/helper.js.map +0 -1
@@ -0,0 +1,52 @@
1
+ import { ComponentType } from 'react';
2
+ import { BoxProps, TextFieldProps } from '@mui/material';
3
+ import { IFormInputBase } from './types';
4
+ export interface IInputFileCsvLocalParserSlots {
5
+ /**
6
+ * The URL of the sample CSV file that users can download.
7
+ * If provided, a "Download sample" link will be displayed.
8
+ * Example: '/sample.csv' or 'https://example.com/sample.csv'
9
+ */
10
+ downloadSampleUrl?: string;
11
+ /**
12
+ * Instructional text displayed alongside the download link or file input.
13
+ * Useful for guiding users on how to use or fill out the CSV file.
14
+ */
15
+ instructionalText?: string;
16
+ /**
17
+ * Props to customize the TextField used for uploading the CSV file.
18
+ * Allows customization of appearance and behavior (e.g., placeholder, onChange, disabled).
19
+ */
20
+ textFieldProps?: TextFieldProps;
21
+ /**
22
+ * Props passed to the wrapper element (typically a Box).
23
+ * Useful for customizing layout styles such as margin, padding, or display.
24
+ */
25
+ wrapProps?: BoxProps;
26
+ /**
27
+ * Whether the label should shrink when displayed.
28
+ * Defaults to `true` if a label is present to prevent overlap.
29
+ * @default true
30
+ */
31
+ labelShrink?: boolean;
32
+ }
33
+ export interface IInputFileCsvLocalParserParams extends IInputFileCsvLocalParserSlots {
34
+ }
35
+ export interface IInputFileCsvLocalParserProps<T, C> extends IFormInputBase<T> {
36
+ onChange?: (value: C[]) => void;
37
+ slots?: IInputFileCsvLocalParserSlots;
38
+ }
39
+ export interface IInputFileCsvLocalParserState<C> {
40
+ parsedData: C[];
41
+ }
42
+ /**
43
+ * Creates a React component that renders a file input specifically for CSV files,
44
+ * parses the selected file locally into a structured array, and integrates with a form system.
45
+ *
46
+ * @template T - The main data model used in the form. Represents the shape of the overall form data.
47
+ * @template C - The type of each individual item parsed from the CSV file.
48
+ *
49
+ * @param params - Optional slot parameters to customize the appearance or behavior of the text field.
50
+ * @returns A React component configured for uploading and parsing local CSV files.
51
+ */
52
+ export declare function createInputFileCsvLocalParser<T, C>(params?: IInputFileCsvLocalParserParams): ComponentType<IInputFileCsvLocalParserProps<T, C>>;
@@ -5,6 +5,7 @@ import CreateTextEditor from './create.text-editor';
5
5
  import CreateDateExpired from './create.date-expired';
6
6
  import CreateSelectSimple from './create.select-simple';
7
7
  import CreateAutocompleteChip from './create.autocomplete.chips';
8
+ import { createInputFileCsvLocalParser } from './create.input-file.csv-local-parser';
8
9
  declare class DinoFormBase {
9
10
  ModalWrap: import("react").FC<import("./modal-wrapper").IFormModalWrapperProps>;
10
11
  BottomBarWrap: StyledComponent<ComponentProps, SpecificComponentProps, JSXProps>;
@@ -16,8 +17,9 @@ declare class DinoFormBase {
16
17
  createDateExpired: typeof CreateDateExpired;
17
18
  createDatePicker: <T extends Object>(params?: import("./create.date-picker").IDatePickerSlots | undefined) => import("react").ComponentType<import("./create.date-picker").IDatePickerProps<T>>;
18
19
  createAutocompleteChip: typeof CreateAutocompleteChip;
19
- createInput: <T>(params?: import("./create.input").IInputParams<T> | undefined) => import("react").ComponentType<import("./create.input").IInputProps<T>>;
20
+ createInputFileCsvLocalParser: typeof createInputFileCsvLocalParser;
20
21
  createInputFile: typeof CreateInputFile;
22
+ createInput: <T>(params?: import("./create.input").IInputParams<T> | undefined) => import("react").ComponentType<import("./create.input").IInputProps<T>>;
21
23
  createSelectSimple: typeof CreateSelectSimple;
22
24
  createSelectWithApi: <T, O extends import("./create.select-with-api").ISelectWithApiOption<any> = import("./create.select-with-api").ISelectWithApiOption<any>>(params?: import("./create.select-with-api").ISelectWithApiParams<O> | undefined) => import("react").ComponentType<import("./create.select-with-api").ISelectWithApiProps<T, O>>;
23
25
  createTextEditor: typeof CreateTextEditor;
@@ -5,10 +5,27 @@ type IModelBase = {
5
5
  [key: string]: any;
6
6
  };
7
7
  export declare const convertFormDataToJson: <TModel>(form: FormData) => Partial<TModel>;
8
- export declare const SingleValidate: <TModel, TPartial = TModel>(key: keyof TModel, modelState: TPartial, MessageErrors: IPartialError<TModel>, Validator: FormValidator<TPartial>) => {
8
+ export declare const singleValidate: <TModel, TPartial = TModel>(key: keyof TModel, modelState: TPartial, MessageErrors: IPartialError<TModel>, Validator: FormValidator<TPartial>) => {
9
9
  [key: string]: any;
10
10
  } | null;
11
11
  export declare const getErrorFromResponse: <TModel>(error: AxiosError, ModelRender: TModel) => IPartialError<TModel> | undefined;
12
12
  export declare const clearFieldEmpty: <TModel>(model: Extract<TModel, IModelBase>) => void;
13
13
  export declare const validateMerge: <TModel>(...validateor: (FormValidator<TModel> | undefined)[]) => FormValidator<TModel>;
14
+ /**
15
+ * Interface representing the result of a CSV validation.
16
+ */
17
+ export interface IValidateCsv {
18
+ /** Indicates whether the CSV data is valid */
19
+ valid: boolean;
20
+ /** Optional message providing error details if validation fails */
21
+ message?: string;
22
+ }
23
+ /**
24
+ * Validates a parsed CSV data array against a list of required column keys.
25
+ *
26
+ * @param data - An array of objects representing rows parsed from a CSV file.
27
+ * @param requiredKeys - An array of keys that must exist in the CSV headers and each row.
28
+ * @returns An object indicating whether the data is valid and an optional error message.
29
+ */
30
+ export declare const validateCsvModel: <T extends Record<string, any>>(data: T[], requiredKeys: (keyof T)[]) => IValidateCsv;
14
31
  export {};
@@ -2,6 +2,6 @@ export * from './types';
2
2
  export { default as FormValidator } from './validator';
3
3
  export * from './validator';
4
4
  export { default as DinoForm } from './dino-form';
5
- export { getErrorMessage, convertFormDataToJson } from './helper';
5
+ export { getErrorMessage, convertFormDataToJson, validateCsvModel } from './helpers';
6
6
  export type { ISelectWithApiOption } from './create.select-with-api';
7
7
  export type { InputBaseImage } from './create.input';
@@ -2,15 +2,16 @@ export declare const sleep: (sec: number) => Promise<unknown>;
2
2
  export declare const fetchDelay: <TModel>(action: () => Promise<TModel>, sec: number) => Promise<TModel>;
3
3
  export declare const windowScrollToTop: (options?: ScrollToOptions, delay?: number) => void;
4
4
  export declare const mergeClasses: (...classes: string[]) => string;
5
+ type DeepPartial<T> = {
6
+ [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
7
+ } | undefined;
8
+ export declare const mergeObjects: <T>(...objects: DeepPartial<T>[]) => T;
5
9
  export declare const encodeBase64: (input: string) => string;
6
10
  export declare const decodeBase64: (encoded: string) => string | undefined;
7
11
  export declare const tryParseObject: <T>(value: any, defaultValue: T) => T;
8
12
  export declare const tryParseArray: <T>(value: any, defaultValue?: T[]) => T[];
9
13
  export declare const tryParseIntRequired: (value: any, defaultValue: number) => number;
10
- type DeepPartial<T> = {
11
- [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
12
- } | undefined;
13
- export declare const mergeObjects: <T>(...objects: DeepPartial<T>[]) => T;
14
+ export declare const tryParseCsvFileToArray: (file: File) => Promise<Record<string, string>[]>;
14
15
  export declare const formatFileSize: (sizeInKb: number) => string;
15
16
  export declare const formatCurrency: (value?: any, prefix?: string, suffix?: string) => string;
16
17
  export declare const formatNumberWithCommas: (number: number) => string;
@@ -1,2 +1,2 @@
1
- import{asyncToGenerator as r,typeof as t,regeneratorRuntime as n,slicedToArray as e,objectSpread2 as o,toArray as a}from"../_virtual/_rollupPluginBabelHelpers.js";import c from"dayjs";var i=function(r){return new Promise((function(t){return setTimeout(t,r)}))},u=function(){var t=r(n().mark((function r(t,o){var a,c,u;return n().wrap((function(r){for(;;)switch(r.prev=r.next){case 0:return r.next=2,Promise.all([t(),i(o)]);case 2:return a=r.sent,c=e(a,1),u=c[0],r.abrupt("return",u);case 6:case"end":return r.stop()}}),r)})));return function(r,n){return t.apply(this,arguments)}}(),s=function(r,t){setTimeout((function(){window.scrollTo(o({top:0,left:0,behavior:"smooth"},r))}),t||50)},f=function(){for(var r=arguments.length,t=new Array(r),n=0;n<r;n++)t[n]=arguments[n];return t.join(" ")},l=function(r){try{var t=(new TextEncoder).encode(r),n="";return t.forEach((function(r){n+=String.fromCharCode(r)})),btoa(n)}catch(r){return console.error("Error encoding to base64",r),""}},d=function(r){try{for(var t=atob(r),n=new Uint8Array(t.length),e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return(new TextDecoder).decode(n)}catch(r){return void console.error("Error decoding base64",r)}},h=function(r,t){try{if(!r)throw new Error("Value is required!");return JSON.parse(r)}catch(r){return t}},y=function(r){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];try{if(!r)return[];var n=JSON.parse(r);return Array.isArray(n)?n:[]}catch(r){return t}},v=function(r,t){try{return r?parseInt(r):t}catch(r){return t}},p=function(r){return r&&"object"===t(r)&&!Array.isArray(r)},g=function(){for(var r=arguments.length,t=new Array(r),n=0;n<r;n++)t[n]=arguments[n];return t.reduce((function(r,t){return t?(Object.keys(t).forEach((function(n){p(r[n])&&p(t[n])?r[n]=g(r[n],t[n]):r[n]=t[n]})),r):r}),{})},m=function(r){return r<1024?r.toFixed(2)+" Kb":r<1048576?(r/1024).toFixed(2)+" Mb":r<1073741824?(r/1048576).toFixed(2)+" Gb":(r/1073741824).toFixed(2)+" Tb"},b=function(r){var t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"$ ",o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";try{t=parseFloat(r),isNaN(t)&&(t=0)}catch(r){t=0}var a=t.toFixed(2).split("."),c=e(a,2),i=c[0],u=c[1],s=i.replace(/\B(?=(\d{3})+(?!\d))/g," "),f=s;return"00"!==u&&(f="".concat(s,".").concat(u)),"".concat(n).concat(f).concat(o)},w=function(r){return r.toLocaleString("en-US")},Y=function(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";if(!r)return r;var t=Array.from(r),n=a(t),e=n[0],o=n.slice(1);return"".concat(e.toUpperCase()).concat(o.join(""))},A={style1:"DD/MM/YYYY HH:mm",style2:"MMMM D, YYYY",style3:"MM-DD-YYYY"},x=function(r){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"style1";try{if(!r)throw new Error;return c(r).format(A[t])}catch(r){return"unknown"}};export{d as decodeBase64,l as encodeBase64,u as fetchDelay,Y as formatCapitalizeFirstText,b as formatCurrency,x as formatDatetime,m as formatFileSize,w as formatNumberWithCommas,f as mergeClasses,g as mergeObjects,i as sleep,y as tryParseArray,v as tryParseIntRequired,h as tryParseObject,s as windowScrollToTop};
1
+ import{asyncToGenerator as r,typeof as t,regeneratorRuntime as n,slicedToArray as e,objectSpread2 as o,toArray as a}from"../_virtual/_rollupPluginBabelHelpers.js";import c from"dayjs";var i=function(r){return new Promise((function(t){return setTimeout(t,r)}))},u=function(){var t=r(n().mark((function r(t,o){var a,c,u;return n().wrap((function(r){for(;;)switch(r.prev=r.next){case 0:return r.next=2,Promise.all([t(),i(o)]);case 2:return a=r.sent,c=e(a,1),u=c[0],r.abrupt("return",u);case 6:case"end":return r.stop()}}),r)})));return function(r,n){return t.apply(this,arguments)}}(),s=function(r,t){setTimeout((function(){window.scrollTo(o({top:0,left:0,behavior:"smooth"},r))}),t||50)},f=function(){for(var r=arguments.length,t=new Array(r),n=0;n<r;n++)t[n]=arguments[n];return t.join(" ")},l=function(r){return r&&"object"===t(r)&&!Array.isArray(r)},d=function(){for(var r=arguments.length,t=new Array(r),n=0;n<r;n++)t[n]=arguments[n];return t.reduce((function(r,t){return t?(Object.keys(t).forEach((function(n){l(r[n])&&l(t[n])?r[n]=d(r[n],t[n]):r[n]=t[n]})),r):r}),{})},h=function(r){try{var t=(new TextEncoder).encode(r),n="";return t.forEach((function(r){n+=String.fromCharCode(r)})),btoa(n)}catch(r){return console.error("Error encoding to base64",r),""}},v=function(r){try{for(var t=atob(r),n=new Uint8Array(t.length),e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return(new TextDecoder).decode(n)}catch(r){return void console.error("Error decoding base64",r)}},p=function(r,t){try{if(!r)throw new Error("Value is required!");return JSON.parse(r)}catch(r){return t}},y=function(r){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];try{if(!r)return[];var n=JSON.parse(r);return Array.isArray(n)?n:[]}catch(r){return t}},m=function(r,t){try{return r?parseInt(r):t}catch(r){return t}},g=function(r){return new Promise((function(t,n){var e=new FileReader;e.onload=function(){try{var r=e.result.split(/\r?\n/).filter(Boolean);if(r.length<1)return t([]);var n=r[0].split(",").map((function(r){return r.trim()})),o=r.slice(1).map((function(r){var t=r.split(",").map((function(r){return r.trim()})),e={};return n.forEach((function(r,n){var o;e[r]=null!==(o=t[n])&&void 0!==o?o:""})),e}));t(o)}catch(r){t([])}},e.onerror=function(){n(new Error("Error reading file"))},e.readAsText(r)}))},w=function(r){return r<1024?r.toFixed(2)+" Kb":r<1048576?(r/1024).toFixed(2)+" Mb":r<1073741824?(r/1048576).toFixed(2)+" Gb":(r/1073741824).toFixed(2)+" Tb"},b=function(r){var t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"$ ",o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";try{t=parseFloat(r),isNaN(t)&&(t=0)}catch(r){t=0}var a=t.toFixed(2).split("."),c=e(a,2),i=c[0],u=c[1],s=i.replace(/\B(?=(\d{3})+(?!\d))/g," "),f=s;return"00"!==u&&(f="".concat(s,".").concat(u)),"".concat(n).concat(f).concat(o)},A=function(r){return r.toLocaleString("en-US")},Y=function(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";if(!r)return r;var t=Array.from(r),n=a(t),e=n[0],o=n.slice(1);return"".concat(e.toUpperCase()).concat(o.join(""))},x={style1:"DD/MM/YYYY HH:mm",style2:"MMMM D, YYYY",style3:"MM-DD-YYYY"},E=function(r){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"style1";try{if(!r)throw new Error;return c(r).format(x[t])}catch(r){return"unknown"}};export{v as decodeBase64,h as encodeBase64,u as fetchDelay,Y as formatCapitalizeFirstText,b as formatCurrency,E as formatDatetime,w as formatFileSize,A as formatNumberWithCommas,f as mergeClasses,d as mergeObjects,i as sleep,y as tryParseArray,g as tryParseCsvFileToArray,m as tryParseIntRequired,p as tryParseObject,s as windowScrollToTop};
2
2
  //# sourceMappingURL=helpers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sources":["../../src/utils/helpers.ts"],"sourcesContent":["import dayjs from 'dayjs'\r\n\r\nexport const sleep = (sec: number) => new Promise((res) => setTimeout(res, sec))\r\n\r\nexport const fetchDelay = async function <TModel>(action: () => Promise<TModel>, sec: number) {\r\n const [res] = await Promise.all([action(), sleep(sec)])\r\n return res\r\n}\r\n\r\nexport const windowScrollToTop = (options?: ScrollToOptions, delay?: number) => {\r\n setTimeout(() => {\r\n window.scrollTo({ top: 0, left: 0, behavior: 'smooth', ...options })\r\n }, delay || 50)\r\n}\r\n\r\nexport const mergeClasses = (...classes: string[]) => {\r\n return classes.join(' ')\r\n}\r\n\r\nexport const encodeBase64 = (input: string): string => {\r\n try {\r\n const utf8Bytes = new TextEncoder().encode(input)\r\n let binaryString = ''\r\n utf8Bytes.forEach((byte) => {\r\n binaryString += String.fromCharCode(byte)\r\n })\r\n return btoa(binaryString)\r\n } catch (error) {\r\n console.error('Error encoding to base64', error)\r\n return ''\r\n }\r\n}\r\n\r\nexport const decodeBase64 = (encoded: string): string | undefined => {\r\n try {\r\n const binaryString = atob(encoded)\r\n const utf8Bytes = new Uint8Array(binaryString.length)\r\n for (let i = 0; i < binaryString.length; i++) {\r\n utf8Bytes[i] = binaryString.charCodeAt(i)\r\n }\r\n return new TextDecoder().decode(utf8Bytes)\r\n } catch (error) {\r\n console.error('Error decoding base64', error)\r\n return\r\n }\r\n}\r\n\r\nexport const tryParseObject = function <T>(value: any, defaultValue: T): T {\r\n try {\r\n if (!value) {\r\n throw new Error('Value is required!')\r\n }\r\n return JSON.parse(value)\r\n } catch {\r\n // console.log(error)\r\n return defaultValue\r\n }\r\n}\r\n\r\nexport const tryParseArray = function <T>(value: any, defaultValue: T[] = []): T[] {\r\n try {\r\n if (!value) return []\r\n const parseValue = JSON.parse(value)\r\n return Array.isArray(parseValue) ? parseValue : []\r\n } catch {\r\n return defaultValue\r\n }\r\n}\r\n\r\nexport const tryParseIntRequired = function (value: any, defaultValue: number): number {\r\n try {\r\n if (!value) return defaultValue\r\n return parseInt(value)\r\n } catch {\r\n return defaultValue\r\n }\r\n}\r\n\r\n/**\r\n * Simple object check.\r\n * @param item\r\n * @returns {boolean}\r\n */\r\nconst isObject = (obj: any) => {\r\n return obj && typeof obj === 'object' && !Array.isArray(obj)\r\n}\r\n\r\ntype DeepPartial<T> = { [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P] } | undefined\r\n\r\nexport const mergeObjects = <T>(...objects: DeepPartial<T>[]): T => {\r\n return objects.reduce((prev, obj) => {\r\n if (!obj) return prev\r\n Object.keys(obj).forEach((key) => {\r\n if (isObject((prev as any)[key]) && isObject((obj as any)[key])) {\r\n ;(prev as any)[key] = mergeObjects((prev as any)[key], (obj as any)[key])\r\n } else {\r\n ;(prev as any)[key] = (obj as any)[key]\r\n }\r\n })\r\n return prev\r\n }, {} as T) as any\r\n}\r\n\r\n//#region Format\r\nexport const formatFileSize = (sizeInKb: number) => {\r\n if (sizeInKb < 1024) {\r\n return sizeInKb.toFixed(2) + ' Kb'\r\n } else if (sizeInKb < 1024 * 1024) {\r\n return (sizeInKb / 1024).toFixed(2) + ' Mb'\r\n } else if (sizeInKb < 1024 * 1024 * 1024) {\r\n return (sizeInKb / (1024 * 1024)).toFixed(2) + ' Gb'\r\n } else {\r\n return (sizeInKb / (1024 * 1024 * 1024)).toFixed(2) + ' Tb'\r\n }\r\n}\r\n\r\nexport const formatCurrency = (value?: any, prefix = '$ ', suffix = ''): string => {\r\n let parsedValue\r\n try {\r\n parsedValue = parseFloat(value)\r\n if (isNaN(parsedValue)) parsedValue = 0\r\n } catch (e) {\r\n parsedValue = 0\r\n }\r\n const roundedValue = parsedValue.toFixed(2)\r\n const [integerPart, decimalPart] = roundedValue.split('.')\r\n const formattedIntegerPart = integerPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ')\r\n\r\n let formattedValue = formattedIntegerPart\r\n if (decimalPart !== '00') {\r\n formattedValue = `${formattedIntegerPart}.${decimalPart}`\r\n }\r\n return `${prefix}${formattedValue}${suffix}`\r\n}\r\n\r\nexport const formatNumberWithCommas = (number: number): string => {\r\n return number.toLocaleString('en-US')\r\n}\r\n\r\nexport const formatCapitalizeFirstText = (value: string = '') => {\r\n if (!value) return value\r\n const [first, ...data] = Array.from(value)\r\n return `${first.toUpperCase()}${data.join('')}`\r\n}\r\n\r\nconst formatDatetimeStyle = {\r\n style1: 'DD/MM/YYYY HH:mm',\r\n style2: 'MMMM D, YYYY',\r\n style3: 'MM-DD-YYYY'\r\n}\r\n\r\n/**\r\n * Formats a datetime string using one of the predefined styles.\r\n *\r\n * Available format styles:\r\n * - style1: DD/MM/YYYY HH:mm → e.g., '25/04/2025 14:30'\r\n * - style2: 'MMMM D, YYYY' → e.g., 'April 25, 2025'\r\n * - style2: 'MM-DD-YYYY' → e.g., '04-25-2025'\r\n * @param value - A datetime string (ISO format or any format parsable by dayjs).\r\n * @param format - Format style key: 'style1' or 'style2'. Defaults to 'style1'.\r\n * @returns A formatted datetime string, or 'unknown' if the input is invalid or unparsable.\r\n */\r\nexport const formatDatetime = (value: string, format: keyof typeof formatDatetimeStyle = 'style1'): string => {\r\n try {\r\n if (!value) throw new Error()\r\n return dayjs(value).format(formatDatetimeStyle[format])\r\n } catch (error) {\r\n return 'unknown'\r\n }\r\n}\r\n//#endregion\r\n"],"names":["sleep","sec","Promise","res","setTimeout","fetchDelay","_ref","_asyncToGenerator","_regeneratorRuntime","mark","_callee","action","_yield$Promise$all","_yield$Promise$all2","wrap","_context","prev","next","all","sent","_slicedToArray","abrupt","stop","_x","_x2","apply","this","arguments","windowScrollToTop","options","delay","window","scrollTo","_objectSpread","top","left","behavior","mergeClasses","_len","length","classes","Array","_key","join","encodeBase64","input","utf8Bytes","TextEncoder","encode","binaryString","forEach","byte","String","fromCharCode","btoa","error","console","decodeBase64","encoded","atob","Uint8Array","i","charCodeAt","TextDecoder","decode","tryParseObject","value","defaultValue","Error","JSON","parse","_unused","tryParseArray","parseValue","isArray","_unused2","tryParseIntRequired","parseInt","_unused3","isObject","obj","_typeof","mergeObjects","_len2","objects","_key2","reduce","Object","keys","key","formatFileSize","sizeInKb","toFixed","formatCurrency","parsedValue","prefix","undefined","suffix","parseFloat","isNaN","e","_roundedValue$split","split","_roundedValue$split2","integerPart","decimalPart","formattedIntegerPart","replace","formattedValue","concat","formatNumberWithCommas","number","toLocaleString","formatCapitalizeFirstText","_Array$from","from","_Array$from2","_toArray","first","data","slice","toUpperCase","formatDatetimeStyle","style1","style2","style3","formatDatetime","format","dayjs"],"mappings":"4LAEaA,EAAQ,SAACC,GAAW,OAAK,IAAIC,SAAQ,SAACC,GAAG,OAAKC,WAAWD,EAAKF,KAAK,EAEnEI,EAAU,WAAA,IAAAC,EAAAC,EAAAC,IAAAC,MAAG,SAAAC,EAAwBC,EAA+BV,GAAW,IAAAW,EAAAC,EAAAV,EAAA,OAAAK,IAAAM,MAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,KAAA,EAAA,OAAAF,EAAAE,KAAA,EACtEf,QAAQgB,IAAI,CAACP,IAAUX,EAAMC,KAAM,KAAA,EAA7C,OAA6CW,EAAAG,EAAAI,KAAAN,EAAAO,EAAAR,EAAA,GAAhDT,EAAGU,EAAA,GAAAE,EAAAM,OAAA,SACHlB,GAAG,KAAA,EAAA,IAAA,MAAA,OAAAY,EAAAO,OAAA,GAAAZ,OACX,OAAA,SAHsBa,EAAAC,GAAA,OAAAlB,EAAAmB,MAAAC,KAAAC,UAAA,CAAA,CAAA,GAKVC,EAAoB,SAACC,EAA2BC,GAC3D1B,YAAW,WACT2B,OAAOC,SAAQC,EAAA,CAAGC,IAAK,EAAGC,KAAM,EAAGC,SAAU,UAAaP,GAC5D,GAAGC,GAAS,GACd,EAEaO,EAAe,WAAyB,IAAA,IAAAC,EAAAX,UAAAY,OAArBC,EAAiBC,IAAAA,MAAAH,GAAAI,EAAA,EAAAA,EAAAJ,EAAAI,IAAjBF,EAAiBE,GAAAf,UAAAe,GAC/C,OAAOF,EAAQG,KAAK,IACtB,EAEaC,EAAe,SAACC,GAC3B,IACE,IAAMC,GAAY,IAAIC,aAAcC,OAAOH,GACvCI,EAAe,GAInB,OAHAH,EAAUI,SAAQ,SAACC,GACjBF,GAAgBG,OAAOC,aAAaF,EACtC,IACOG,KAAKL,EACb,CAAC,MAAOM,GAEP,OADAC,QAAQD,MAAM,2BAA4BA,GACnC,EACR,CACH,EAEaE,EAAe,SAACC,GAC3B,IAGE,IAFA,IAAMT,EAAeU,KAAKD,GACpBZ,EAAY,IAAIc,WAAWX,EAAaV,QACrCsB,EAAI,EAAGA,EAAIZ,EAAaV,OAAQsB,IACvCf,EAAUe,GAAKZ,EAAaa,WAAWD,GAEzC,OAAO,IAAIE,aAAcC,OAAOlB,EACjC,CAAC,MAAOS,GAEP,YADAC,QAAQD,MAAM,wBAAyBA,EAExC,CACH,EAEaU,EAAiB,SAAaC,EAAYC,GACrD,IACE,IAAKD,EACH,MAAM,IAAIE,MAAM,sBAElB,OAAOC,KAAKC,MAAMJ,EACnB,CAAC,MAAAK,GAEA,OAAOJ,CACR,CACH,EAEaK,EAAgB,SAAaN,GAAkC,IAAtBC,yDAAoB,GACxE,IACE,IAAKD,EAAO,MAAO,GACnB,IAAMO,EAAaJ,KAAKC,MAAMJ,GAC9B,OAAOzB,MAAMiC,QAAQD,GAAcA,EAAa,EACjD,CAAC,MAAAE,GACA,OAAOR,CACR,CACH,EAEaS,EAAsB,SAAUV,EAAYC,GACvD,IACE,OAAKD,EACEW,SAASX,GADGC,CAEpB,CAAC,MAAAW,GACA,OAAOX,CACR,CACH,EAOMY,EAAW,SAACC,GAChB,OAAOA,GAAsB,WAAfC,EAAOD,KAAqBvC,MAAMiC,QAAQM,EAC1D,EAIaE,EAAe,WAAuC,IAAA,IAAAC,EAAAxD,UAAAY,OAAhC6C,EAAyB3C,IAAAA,MAAA0C,GAAAE,EAAA,EAAAA,EAAAF,EAAAE,IAAzBD,EAAyBC,GAAA1D,UAAA0D,GAC1D,OAAOD,EAAQE,QAAO,SAACtE,EAAMgE,GAC3B,OAAKA,GACLO,OAAOC,KAAKR,GAAK9B,SAAQ,SAACuC,GACpBV,EAAU/D,EAAayE,KAASV,EAAUC,EAAYS,IACtDzE,EAAayE,GAAOP,EAAclE,EAAayE,GAAOT,EAAYS,IAElEzE,EAAayE,GAAQT,EAAYS,EAEvC,IACOzE,GARUA,CASlB,GAAE,GACL,EAGa0E,EAAiB,SAACC,GAC7B,OAAIA,EAAW,KACNA,EAASC,QAAQ,GAAK,MACpBD,EAAW,SACZA,EAAW,MAAMC,QAAQ,GAAK,MAC7BD,EAAW,YACZA,EAAQ,SAAkBC,QAAQ,GAAK,OAEvCD,EAAY,YAAqBC,QAAQ,GAAK,KAE1D,EAEaC,EAAiB,SAAC3B,GAAmD,IAC5E4B,EADsCC,EAAMpE,UAAAY,OAAA,QAAAyD,IAAArE,UAAA,GAAAA,UAAA,GAAG,KAAMsE,EAAMtE,UAAAY,OAAA,QAAAyD,IAAArE,UAAA,GAAAA,UAAA,GAAG,GAElE,IACEmE,EAAcI,WAAWhC,GACrBiC,MAAML,KAAcA,EAAc,EACvC,CAAC,MAAOM,GACPN,EAAc,CACf,CACD,IACAO,EADqBP,EAAYF,QAAQ,GACOU,MAAM,KAAIC,EAAAnF,EAAAiF,EAAA,GAAnDG,EAAWD,EAAA,GAAEE,EAAWF,EAAA,GACzBG,EAAuBF,EAAYG,QAAQ,wBAAyB,KAEtEC,EAAiBF,EAIrB,MAHoB,OAAhBD,IACFG,EAAc,GAAAC,OAAMH,OAAoBG,OAAIJ,IAE9CI,GAAAA,OAAUd,GAAMc,OAAGD,GAAcC,OAAGZ,EACtC,EAEaa,EAAyB,SAACC,GACrC,OAAOA,EAAOC,eAAe,QAC/B,EAEaC,EAA4B,WAAuB,IAAtB/C,EAAgBvC,UAAAY,OAAA,QAAAyD,IAAArE,UAAA,GAAAA,UAAA,GAAA,GACxD,IAAKuC,EAAO,OAAOA,EACnB,IAAAgD,EAAyBzE,MAAM0E,KAAKjD,GAAMkD,EAAAC,EAAAH,GAAnCI,EAAKF,EAAA,GAAKG,EAAIH,EAAAI,MAAA,GACrB,MAAA,GAAAX,OAAUS,EAAMG,eAAaZ,OAAGU,EAAK5E,KAAK,IAC5C,EAEM+E,EAAsB,CAC1BC,OAAQ,mBACRC,OAAQ,eACRC,OAAQ,cAcGC,EAAiB,SAAC5D,GAA8E,IAA/D6D,EAAApG,UAAAY,OAAA,QAAAyD,IAAArE,UAAA,GAAAA,UAAA,GAA2C,SACvF,IACE,IAAKuC,EAAO,MAAM,IAAIE,MACtB,OAAO4D,EAAM9D,GAAO6D,OAAOL,EAAoBK,GAChD,CAAC,MAAOxE,GACP,MAAO,SACR,CACH"}
1
+ {"version":3,"file":"helpers.js","sources":["../../src/utils/helpers.ts"],"sourcesContent":["import dayjs from 'dayjs'\r\n\r\nexport const sleep = (sec: number) => new Promise((res) => setTimeout(res, sec))\r\n\r\nexport const fetchDelay = async function <TModel>(action: () => Promise<TModel>, sec: number) {\r\n const [res] = await Promise.all([action(), sleep(sec)])\r\n return res\r\n}\r\n\r\nexport const windowScrollToTop = (options?: ScrollToOptions, delay?: number) => {\r\n setTimeout(() => {\r\n window.scrollTo({ top: 0, left: 0, behavior: 'smooth', ...options })\r\n }, delay || 50)\r\n}\r\n\r\nexport const mergeClasses = (...classes: string[]) => {\r\n return classes.join(' ')\r\n}\r\n\r\n/**\r\n * Simple object check.\r\n * @param item\r\n * @returns {boolean}\r\n */\r\nconst isObject = (obj: any) => {\r\n return obj && typeof obj === 'object' && !Array.isArray(obj)\r\n}\r\n\r\ntype DeepPartial<T> = { [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P] } | undefined\r\n\r\nexport const mergeObjects = <T>(...objects: DeepPartial<T>[]): T => {\r\n return objects.reduce((prev, obj) => {\r\n if (!obj) return prev\r\n Object.keys(obj).forEach((key) => {\r\n if (isObject((prev as any)[key]) && isObject((obj as any)[key])) {\r\n ;(prev as any)[key] = mergeObjects((prev as any)[key], (obj as any)[key])\r\n } else {\r\n ;(prev as any)[key] = (obj as any)[key]\r\n }\r\n })\r\n return prev\r\n }, {} as T) as any\r\n}\r\n\r\nexport const encodeBase64 = (input: string): string => {\r\n try {\r\n const utf8Bytes = new TextEncoder().encode(input)\r\n let binaryString = ''\r\n utf8Bytes.forEach((byte) => {\r\n binaryString += String.fromCharCode(byte)\r\n })\r\n return btoa(binaryString)\r\n } catch (error) {\r\n console.error('Error encoding to base64', error)\r\n return ''\r\n }\r\n}\r\n\r\nexport const decodeBase64 = (encoded: string): string | undefined => {\r\n try {\r\n const binaryString = atob(encoded)\r\n const utf8Bytes = new Uint8Array(binaryString.length)\r\n for (let i = 0; i < binaryString.length; i++) {\r\n utf8Bytes[i] = binaryString.charCodeAt(i)\r\n }\r\n return new TextDecoder().decode(utf8Bytes)\r\n } catch (error) {\r\n console.error('Error decoding base64', error)\r\n return\r\n }\r\n}\r\n\r\n//#region Try Parse\r\nexport const tryParseObject = function <T>(value: any, defaultValue: T): T {\r\n try {\r\n if (!value) {\r\n throw new Error('Value is required!')\r\n }\r\n return JSON.parse(value)\r\n } catch {\r\n // console.log(error)\r\n return defaultValue\r\n }\r\n}\r\n\r\nexport const tryParseArray = function <T>(value: any, defaultValue: T[] = []): T[] {\r\n try {\r\n if (!value) return []\r\n const parseValue = JSON.parse(value)\r\n return Array.isArray(parseValue) ? parseValue : []\r\n } catch {\r\n return defaultValue\r\n }\r\n}\r\n\r\nexport const tryParseIntRequired = function (value: any, defaultValue: number): number {\r\n try {\r\n if (!value) return defaultValue\r\n return parseInt(value)\r\n } catch {\r\n return defaultValue\r\n }\r\n}\r\n\r\nexport const tryParseCsvFileToArray = (file: File): Promise<Record<string, string>[]> => {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader()\r\n\r\n reader.onload = () => {\r\n try {\r\n const text = reader.result as string\r\n const rows = text.split(/\\r?\\n/).filter(Boolean)\r\n\r\n if (rows.length < 1) return resolve([])\r\n\r\n const headers = rows[0].split(',').map((h) => h.trim())\r\n\r\n const data = rows.slice(1).map((row) => {\r\n const values = row.split(',').map((v) => v.trim())\r\n const item: Record<string, string> = {}\r\n\r\n headers.forEach((header, index) => {\r\n item[header] = values[index] ?? ''\r\n })\r\n\r\n return item\r\n })\r\n\r\n resolve(data)\r\n } catch (error) {\r\n resolve([])\r\n }\r\n }\r\n\r\n reader.onerror = () => {\r\n reject(new Error('Error reading file'))\r\n }\r\n\r\n reader.readAsText(file)\r\n })\r\n}\r\n//#endregion\r\n\r\n//#region Format\r\nexport const formatFileSize = (sizeInKb: number) => {\r\n if (sizeInKb < 1024) {\r\n return sizeInKb.toFixed(2) + ' Kb'\r\n } else if (sizeInKb < 1024 * 1024) {\r\n return (sizeInKb / 1024).toFixed(2) + ' Mb'\r\n } else if (sizeInKb < 1024 * 1024 * 1024) {\r\n return (sizeInKb / (1024 * 1024)).toFixed(2) + ' Gb'\r\n } else {\r\n return (sizeInKb / (1024 * 1024 * 1024)).toFixed(2) + ' Tb'\r\n }\r\n}\r\n\r\nexport const formatCurrency = (value?: any, prefix = '$ ', suffix = ''): string => {\r\n let parsedValue\r\n try {\r\n parsedValue = parseFloat(value)\r\n if (isNaN(parsedValue)) parsedValue = 0\r\n } catch (e) {\r\n parsedValue = 0\r\n }\r\n const roundedValue = parsedValue.toFixed(2)\r\n const [integerPart, decimalPart] = roundedValue.split('.')\r\n const formattedIntegerPart = integerPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ')\r\n\r\n let formattedValue = formattedIntegerPart\r\n if (decimalPart !== '00') {\r\n formattedValue = `${formattedIntegerPart}.${decimalPart}`\r\n }\r\n return `${prefix}${formattedValue}${suffix}`\r\n}\r\n\r\nexport const formatNumberWithCommas = (number: number): string => {\r\n return number.toLocaleString('en-US')\r\n}\r\n\r\nexport const formatCapitalizeFirstText = (value: string = '') => {\r\n if (!value) return value\r\n const [first, ...data] = Array.from(value)\r\n return `${first.toUpperCase()}${data.join('')}`\r\n}\r\n\r\nconst formatDatetimeStyle = {\r\n style1: 'DD/MM/YYYY HH:mm',\r\n style2: 'MMMM D, YYYY',\r\n style3: 'MM-DD-YYYY'\r\n}\r\n\r\n/**\r\n * Formats a datetime string using one of the predefined styles.\r\n *\r\n * Available format styles:\r\n * - style1: DD/MM/YYYY HH:mm → e.g., '25/04/2025 14:30'\r\n * - style2: 'MMMM D, YYYY' → e.g., 'April 25, 2025'\r\n * - style2: 'MM-DD-YYYY' → e.g., '04-25-2025'\r\n * @param value - A datetime string (ISO format or any format parsable by dayjs).\r\n * @param format - Format style key: 'style1' or 'style2'. Defaults to 'style1'.\r\n * @returns A formatted datetime string, or 'unknown' if the input is invalid or unparsable.\r\n */\r\nexport const formatDatetime = (value: string, format: keyof typeof formatDatetimeStyle = 'style1'): string => {\r\n try {\r\n if (!value) throw new Error()\r\n return dayjs(value).format(formatDatetimeStyle[format])\r\n } catch (error) {\r\n return 'unknown'\r\n }\r\n}\r\n//#endregion\r\n"],"names":["sleep","sec","Promise","res","setTimeout","fetchDelay","_ref","_asyncToGenerator","_regeneratorRuntime","mark","_callee","action","_yield$Promise$all","_yield$Promise$all2","wrap","_context","prev","next","all","sent","_slicedToArray","abrupt","stop","_x","_x2","apply","this","arguments","windowScrollToTop","options","delay","window","scrollTo","_objectSpread","top","left","behavior","mergeClasses","_len","length","classes","Array","_key","join","isObject","obj","_typeof","isArray","mergeObjects","_len2","objects","_key2","reduce","Object","keys","forEach","key","encodeBase64","input","utf8Bytes","TextEncoder","encode","binaryString","byte","String","fromCharCode","btoa","error","console","decodeBase64","encoded","atob","Uint8Array","i","charCodeAt","TextDecoder","decode","tryParseObject","value","defaultValue","Error","JSON","parse","_unused","tryParseArray","parseValue","_unused2","tryParseIntRequired","parseInt","_unused3","tryParseCsvFileToArray","file","resolve","reject","reader","FileReader","onload","rows","result","split","filter","Boolean","headers","map","h","trim","data","slice","row","values","v","item","header","index","_values$index","onerror","readAsText","formatFileSize","sizeInKb","toFixed","formatCurrency","parsedValue","prefix","undefined","suffix","parseFloat","isNaN","e","_roundedValue$split","_roundedValue$split2","integerPart","decimalPart","formattedIntegerPart","replace","formattedValue","concat","formatNumberWithCommas","number","toLocaleString","formatCapitalizeFirstText","_Array$from","from","_Array$from2","_toArray","first","toUpperCase","formatDatetimeStyle","style1","style2","style3","formatDatetime","format","dayjs"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dinocollab-core",
3
- "version": "1.0.18",
3
+ "version": "1.0.20",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
@@ -1,2 +0,0 @@
1
- import{toConsumableArray as r,objectSpread2 as n,typeof as e}from"../_virtual/_rollupPluginBabelHelpers.js";import t from"./validator.js";var o=function(r){for(var n=arguments.length,e=new Array(n>1?n-1:0),t=1;t<n;t++)e[t-1]=arguments[t];return e.length<1?r:e.filter((function(r){return r})).reduce((function(r,n){return r=Object.assign(r,n)}),r)},u=function(n){for(var t=arguments.length,a=new Array(t>1?t-1:0),i=1;i<t;i++)a[i-1]=arguments[i];if((a=a.filter((function(r){return!!r}))).length<1)return n;for(var c=[n].concat(r(a)).filter((function(r){return r})),f=c.reduce((function(n,t){if(!t)return n;var o=Object.keys(t).filter((function(r){return"object"===e(t[r])&&!Array.isArray(t[r])}));return n.push.apply(n,r(o)),n}),[]),l=o.apply(void 0,[n].concat(r(c.slice(1)))),s=l,p=c.slice(1).filter((function(r){return!!r})),v=function(){var n=f[y];s[n]=u.apply(void 0,[{},s[n]].concat(r(p.map((function(r){return r[n]})))))},y=0;y<f.length;y++)v();return l},a=function(r,e){return r&&r[e]?n(n({},r[e][0]),{},{error:!0}):{error:!1,message:""}},i=function(r){var n=Array.from(r).reduce((function(r,n){return r[n[0]]?Array.isArray(r[n[0]])?r[n[0]].push(n[1]):r[n[0]]=[r[n[0]],n[1]]:r[n[0]]=n[1],r}),{});return Object.keys(n).forEach((function(r){var e=n[r];"string"!=typeof e||"true"!==e.toString().toLocaleLowerCase()&&"false"!==e.toString().toLocaleLowerCase()||(n[r]="true"===e.toString().toLocaleLowerCase())})),n},c=function(r,n,e,t){var o=t.run(n);if(o){var u=e||{},a=Object.keys(n).filter((function(r){return!!n[r]})).filter((function(r){return n[r]instanceof File&&!!n[r].size}));return a.push(r),a.forEach((function(r){o[r]?u[r]=o[r]:delete u[r]})),u}return null},f=function(r,n){var e,t=null===(e=r.response)||void 0===e?void 0:e.data;if(t){var o=Object.keys(n),u={};return o.forEach((function(r){var n=t[r];Array.isArray(n)&&n.length>0&&(u[r]=[{message:n[0]}])})),u}},l=function(){for(var n=arguments.length,e=new Array(n),o=0;o<n;o++)e[o]=arguments[o];for(var a=e.map((function(r){return null==r?void 0:r.configs})).filter((function(r){return!!r})),i=Object.assign.apply(Object,[{}].concat(r(a))),c=function(){var n=Object.keys(i)[f];i[n]=u.apply(void 0,[{}].concat(r(a.map((function(r){return r?r[n]:{Rules:[]}}))))),i[n].Rules=a.map((function(r){return r?r[n]:{Rules:[]}})).reduce((function(n,e){var t;return n.push.apply(n,r(null!==(t=null==e?void 0:e.Rules)&&void 0!==t?t:[])),n}),[])},f=0;f<Object.keys(i).length;f++)c();return new t(i)};export{c as SingleValidate,i as convertFormDataToJson,f as getErrorFromResponse,a as getErrorMessage,l as validateMerge};
2
- //# sourceMappingURL=helper.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"helper.js","sources":["../../src/form/helper.ts"],"sourcesContent":["import { AxiosError } from 'axios'\r\nimport FormValidator, { IModelError, IRuleOption, IPartialError } from './validator'\r\n\r\ntype IAnyObject = { [key: string]: any }\r\nconst objectAssign = <T extends IAnyObject>(model: T, ...sources: (Partial<T> | undefined)[]) => {\r\n if (sources.length < 1) {\r\n return model\r\n }\r\n const temps = sources.filter((x) => x) as T[]\r\n return temps.reduce((a, b) => {\r\n a = Object.assign(a, b)\r\n return a\r\n }, model)\r\n}\r\n\r\nconst deepMerge = <T extends IAnyObject>(model: T, ...sources: (Partial<T> | undefined)[]) => {\r\n sources = sources.filter((x) => !!x)\r\n if (sources.length < 1) {\r\n return model\r\n }\r\n const temps = [model, ...sources].filter((x) => x)\r\n const fieldObjects = temps.reduce<string[]>((a, b) => {\r\n if (!b) return a\r\n const fields = Object.keys(b).filter((x) => typeof b[x] === 'object' && !Array.isArray(b[x]))\r\n a.push(...fields)\r\n return a\r\n }, [])\r\n\r\n const target = objectAssign<T>(model, ...temps.slice(1))\r\n const temp = target as any\r\n const temp2 = temps.slice(1).filter((x) => !!x) as Partial<T>[]\r\n for (let index = 0; index < fieldObjects.length; index++) {\r\n const element = fieldObjects[index]\r\n temp[element] = deepMerge({}, temp[element], ...temp2.map((x) => x[element]))\r\n }\r\n return target\r\n}\r\n\r\nexport const getErrorMessage = function <TModel>(MessageErrors: IPartialError<TModel> | undefined, key?: keyof TModel): IModelError {\r\n return MessageErrors && (MessageErrors as any)[key] ? { ...(MessageErrors as any)[key][0], error: true } : { error: false, message: '' }\r\n}\r\n\r\ntype IModelBase = {\r\n [key: string]: any\r\n}\r\n\r\nexport const convertFormDataToJson = function <TModel>(form: FormData): Partial<TModel> {\r\n const data = Array.from(form as any).reduce<Partial<TModel>>((a: unknown | any, b: any) => {\r\n if (!a[b[0]]) {\r\n a[b[0]] = b[1]\r\n } else if (Array.isArray(a[b[0]])) {\r\n a[b[0]].push(b[1])\r\n } else {\r\n a[b[0]] = [a[b[0]], b[1]]\r\n }\r\n return a\r\n }, {} as any) as any\r\n\r\n Object.keys(data).forEach((key) => {\r\n const value = data[key]\r\n if (typeof value === 'string' && (value.toString().toLocaleLowerCase() === 'true' || value.toString().toLocaleLowerCase() === 'false')) {\r\n data[key] = value.toString().toLocaleLowerCase() === 'true'\r\n }\r\n })\r\n return data\r\n}\r\n\r\nexport const SingleValidate = function <TModel, TPartial = TModel>(\r\n key: keyof TModel,\r\n modelState: TPartial,\r\n MessageErrors: IPartialError<TModel>,\r\n Validator: FormValidator<TPartial>\r\n) {\r\n const messageErrors = Validator.run(modelState) as { [key: string]: any }\r\n if (messageErrors) {\r\n let errors = (MessageErrors || {}) as { [key: string]: any }\r\n const keys = Object.keys(modelState as any)\r\n .filter((key) => !!(modelState as any)[key])\r\n .filter((key) => ((modelState as any)[key] instanceof File ? !!((modelState as any)[key] as File).size : false))\r\n keys.push(key as string)\r\n keys.forEach((key) => {\r\n if (messageErrors[key]) {\r\n errors[key] = messageErrors[key]\r\n } else {\r\n delete errors[key]\r\n }\r\n })\r\n return errors\r\n }\r\n return null\r\n}\r\n\r\nexport const getErrorFromResponse = function <TModel>(error: AxiosError, ModelRender: TModel) {\r\n const data = error.response?.data as any\r\n if (data) {\r\n const keys = Object.keys(ModelRender as any)\r\n const MessageErrors: IPartialError<TModel> | undefined = {}\r\n keys.forEach((key) => {\r\n const messages = data[key]\r\n if (Array.isArray(messages) && messages.length > 0) {\r\n ;(MessageErrors as any)[key] = [{ message: messages[0] }]\r\n }\r\n })\r\n return MessageErrors\r\n }\r\n}\r\n\r\nexport const clearFieldEmpty = <TModel>(model: Extract<TModel, IModelBase>) => {\r\n Object.keys(model).forEach((key: keyof Extract<TModel, IModelBase>) => {\r\n if (!model[key]) delete model[key]\r\n })\r\n}\r\n\r\nexport const validateMerge = <TModel>(...validateor: (FormValidator<TModel> | undefined)[]): FormValidator<TModel> => {\r\n const configs = validateor.map((x) => x?.configs).filter((x) => !!x)\r\n\r\n let temp: any = Object.assign({}, ...configs)\r\n\r\n for (let index = 0; index < Object.keys(temp).length; index++) {\r\n const key = Object.keys(temp)[index]\r\n //merge configs\r\n temp[key] = deepMerge({}, ...configs.map((x) => (x ? x[key] : { Rules: [] })))\r\n //merge rules\r\n temp[key].Rules = configs\r\n .map((x) => (x ? x[key] : { Rules: [] }))\r\n .reduce<IRuleOption<TModel>[]>((a, b) => {\r\n a.push(...(b?.Rules ?? []))\r\n return a\r\n }, [])\r\n }\r\n return new FormValidator(temp)\r\n}\r\n"],"names":["objectAssign","model","_len","arguments","length","sources","Array","_key","filter","x","reduce","a","b","Object","assign","deepMerge","_len2","_key2","temps","concat","_toConsumableArray","fieldObjects","fields","keys","_typeof","isArray","push","apply","target","slice","temp","temp2","_loop","element","index","map","getErrorMessage","MessageErrors","key","_objectSpread","error","message","convertFormDataToJson","form","data","from","forEach","value","toString","toLocaleLowerCase","SingleValidate","modelState","Validator","messageErrors","run","errors","File","size","getErrorFromResponse","ModelRender","_error$response","response","messages","validateMerge","_len3","validateor","_key3","configs","_loop2","Rules","_b$Rules","FormValidator"],"mappings":"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"}