dinocollab-core 2.1.18 → 2.1.19
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.
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{inherits as r,createClass as e,
|
|
1
|
+
import{inherits as r,createClass as e,objectSpread2 as t,classCallCheck as a,callSuper as o,defineProperty as s,asyncToGenerator as n,regenerator as i}from"../_virtual/_rollupPluginBabelHelpers.js";import{jsx as l}from"react/jsx-runtime";import u,{Component as m}from"react";import{Box as c}from"@mui/material";import{validateMerge as f,convertFormDataToJson as d,trimAllStrings as v,singleValidate as p,getErrorFromResponse as E}from"./helpers.js";import S,{SingleRuleValidate as g}from"./validator.js";var h=function(h){var b=u.createContext({setModelState:function(){},messageErrors:{},onBlur:function(){},setError:function(){},removeError:function(){},clearErrorAll:function(){}}),C=function(){function u(r){var e;return a(this,u),e=o(this,u,[r]),s(e,"refForm",null),s(e,"mapContext",(function(){var r=e,t=r.setError,a=r.removeError,o=r.setModelState,s=r.clearErrorAll,n=r.onBlur,i=e.state;return{modelState:i.modelState,messageErrors:i.messageErrors,setError:t,onBlur:n,clearErrorAll:s,setModelState:o,removeError:a}})),s(e,"setModelState",(function(r){var t=Object.assign({},e.state.modelState,r);e.setState({modelState:t})})),s(e,"getValidate",(function(){var r=new S({});return f(r,null==h?void 0:h.validate,e.props.validate)})),s(e,"setError",(function(r,t){var a=s({},r,[{rule:g.Custom,message:t}]);e.setState({messageErrors:Object.assign({},e.state.messageErrors,a)})})),s(e,"removeError",(function(r){var a=t({},e.state.messageErrors);Array.isArray(r)?r.forEach((function(r){a[r]&&delete a[r]})):a[r]&&delete a[r],e.setState({messageErrors:a})})),s(e,"clearErrorAll",(function(){e.setState({messageErrors:{}})})),s(e,"onSubmit",function(){var r=n(i().m((function r(a){var o,s,n,l;return i().w((function(r){for(;;)switch(r.n){case 0:if(a.preventDefault(),o=new FormData(a.currentTarget),s=d(o),n=v(s),e.setState({modelState:n}),!(l=e.validate.run(n))){r.n=1;break}if(e.setState({messageErrors:l}),!(Object.keys(l).length>0)){r.n=1;break}return r.a(2);case 1:return r.n=2,e.props.onSubmit(n,a).catch((function(r){var a=E(r,n);e.setState({messageErrors:t(t({},e.state.messageErrors),a||{})})}));case 2:return r.a(2)}}),r)})));return function(e){return r.apply(this,arguments)}}()),s(e,"onBlur",(function(r){if(e.refForm){var t=e.state.messageErrors,a=new FormData(e.refForm),o=d(a),s=v(o);e.setState({modelState:s});var n=p(r,s,t,e.validate)||{};e.setState({messageErrors:n})}})),e.validate=e.getValidate(),e.state={messageErrors:{}},e}return r(u,m),e(u,[{key:"render",value:function(){var r,e=this;return l(c,t(t({component:"form",ref:function(r){return e.refForm=r},onSubmit:this.onSubmit},null===(r=this.props.slots)||void 0===r?void 0:r.formProps),{},{children:l(b.Provider,{value:this.mapContext(),children:this.props.children})}))}}])}();return{Form:C,Validator:null==h?void 0:h.validate,Context:b,mapContext:function(r){return l(b.Consumer,{children:r})}}};export{h as default};
|
|
2
2
|
//# sourceMappingURL=create.form-base.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.form-base.js","sources":["../../src/form/create.form-base.tsx"],"sourcesContent":["import React, { Component, ComponentType, PropsWithChildren, ReactNode } from 'react'\r\nimport { Box, BoxProps } from '@mui/material'\r\nimport { IFormBaseContext, ISetModelStateFunc } from './types'\r\nimport { convertFormDataToJson, getErrorFromResponse, singleValidate, trimAllStrings, validateMerge } from './helpers'\r\nimport FormValidator, { IPartialError, SingleRuleValidate } from './validator'\r\n\r\nexport interface IFormBaseSlots {\r\n formProps?: Omit<BoxProps, 'ref' | 'onSubmit' | 'component'
|
|
1
|
+
{"version":3,"file":"create.form-base.js","sources":["../../src/form/create.form-base.tsx"],"sourcesContent":["import React, { Component, ComponentType, PropsWithChildren, ReactNode } from 'react'\r\nimport { Box, BoxProps } from '@mui/material'\r\nimport { IFormBaseContext, ISetModelStateFunc } from './types'\r\nimport { convertFormDataToJson, getErrorFromResponse, singleValidate, trimAllStrings, validateMerge } from './helpers'\r\nimport FormValidator, { IPartialError, SingleRuleValidate } from './validator'\r\n\r\nexport interface IFormBaseSlots {\r\n formProps?: Omit<BoxProps, 'ref' | 'onSubmit' | 'component'> & { [key: string]: any }\r\n}\r\n\r\nexport interface IFormBaseConfigs<T> {\r\n validate?: FormValidator<Partial<T>>\r\n dataTrimed?: boolean\r\n dataGetter?: (data: Partial<T>) => Partial<T>\r\n}\r\n\r\nexport interface IFormBaseParams<T> extends IFormBaseConfigs<T> {}\r\n\r\nexport interface IFormBaseProps<T> extends PropsWithChildren, IFormBaseConfigs<T> {\r\n onSubmit: (data: Partial<T>, e: React.FormEvent<HTMLFormElement>) => Promise<void>\r\n slots?: IFormBaseSlots\r\n}\r\n\r\nexport interface IFormBaseState<T> {\r\n modelState?: Partial<T>\r\n messageErrors: IPartialError<T>\r\n}\r\n\r\nexport interface IFormBaseResult<T> {\r\n Form: ComponentType<IFormBaseProps<T>>\r\n Validator?: FormValidator<Partial<T>>\r\n Context: React.Context<IFormBaseContext<T>>\r\n mapContext: (params: (context: IFormBaseContext<T>) => JSX.Element) => JSX.Element\r\n}\r\n\r\nconst CreateFormBase = function <T>(params?: IFormBaseParams<T>): IFormBaseResult<T> {\r\n const FormBaseContext = React.createContext<IFormBaseContext<T>>({\r\n setModelState: () => {},\r\n messageErrors: {},\r\n onBlur: () => {},\r\n setError: () => {},\r\n removeError: () => {},\r\n clearErrorAll: () => {}\r\n })\r\n\r\n class FormBase extends Component<IFormBaseProps<T>, IFormBaseState<T>> {\r\n refForm: HTMLFormElement | null = null\r\n constructor(props: IFormBaseProps<T>) {\r\n super(props)\r\n this.validate = this.getValidate()\r\n this.state = { messageErrors: {} }\r\n }\r\n\r\n render() {\r\n return (\r\n <Box component='form' ref={(ref: HTMLFormElement) => (this.refForm = ref)} onSubmit={this.onSubmit} {...(this.props.slots?.formProps as any)}>\r\n <FormBaseContext.Provider value={this.mapContext()}>{this.props.children}</FormBaseContext.Provider>\r\n </Box>\r\n )\r\n }\r\n\r\n private mapContext = (): IFormBaseContext<T> => {\r\n const { setError, removeError, setModelState, clearErrorAll, onBlur } = this\r\n const { modelState, messageErrors } = this.state\r\n return { modelState, messageErrors, setError, onBlur, clearErrorAll, setModelState, removeError }\r\n }\r\n\r\n setModelState: ISetModelStateFunc<T> = (state) => {\r\n const obj = Object.assign({}, this.state.modelState, state)\r\n this.setState({ modelState: obj })\r\n }\r\n\r\n getValidate = (): FormValidator<Partial<T>> => {\r\n const defaultValidate = new FormValidator<Partial<T>>({})\r\n return validateMerge(defaultValidate, params?.validate, this.props.validate)\r\n }\r\n\r\n setError = (keyName: keyof T, message: string) => {\r\n const error = { [keyName]: [{ rule: SingleRuleValidate.Custom, message }] }\r\n this.setState({ messageErrors: Object.assign({}, this.state.messageErrors, error) })\r\n }\r\n\r\n removeError = (keyNames: keyof T | (keyof T)[]) => {\r\n const newErrors = { ...this.state.messageErrors }\r\n if (Array.isArray(keyNames)) {\r\n keyNames.forEach((key) => {\r\n if (newErrors[key]) delete newErrors[key]\r\n })\r\n } else {\r\n if (newErrors[keyNames]) delete newErrors[keyNames]\r\n }\r\n this.setState({ messageErrors: newErrors })\r\n }\r\n\r\n clearErrorAll = () => {\r\n this.setState({ messageErrors: {} })\r\n }\r\n\r\n private validate: FormValidator<Partial<T>>\r\n onSubmit: React.FormEventHandler<HTMLFormElement> = async (e) => {\r\n e.preventDefault()\r\n const formData = new FormData(e.currentTarget as HTMLFormElement)\r\n const raw = convertFormDataToJson<T>(formData)\r\n // TODO: validate raw data\r\n const trimmed = trimAllStrings(raw)\r\n this.setState({ modelState: trimmed })\r\n const messageErrors = this.validate.run(trimmed) as IPartialError<T>\r\n if (messageErrors) {\r\n this.setState({ messageErrors: messageErrors })\r\n if (Object.keys(messageErrors).length > 0) return\r\n }\r\n await this.props.onSubmit(trimmed, e).catch((error) => {\r\n const messageError = getErrorFromResponse(error, trimmed)\r\n this.setState({ messageErrors: { ...this.state.messageErrors, ...(messageError || {}) } })\r\n })\r\n }\r\n\r\n onBlur = (keyName: keyof T) => {\r\n if (!this.refForm) return\r\n const { messageErrors } = this.state\r\n const formData = new FormData(this.refForm)\r\n const raw = convertFormDataToJson(formData)\r\n const trimmed = trimAllStrings(raw)\r\n this.setState({ modelState: trimmed })\r\n const error = singleValidate<T, Partial<T>>(keyName, trimmed, messageErrors, this.validate) || {}\r\n this.setState({ messageErrors: error as IPartialError<T> })\r\n }\r\n }\r\n\r\n return {\r\n Form: FormBase,\r\n Validator: params?.validate,\r\n Context: FormBaseContext,\r\n mapContext: (params: (context: IFormBaseContext<T>) => ReactNode) => <FormBaseContext.Consumer>{params}</FormBaseContext.Consumer>\r\n }\r\n}\r\nexport default CreateFormBase\r\n"],"names":["CreateFormBase","params","FormBaseContext","React","createContext","setModelState","messageErrors","onBlur","setError","removeError","clearErrorAll","FormBase","props","_this","_classCallCheck","_callSuper","_defineProperty","_this2","_this$state","state","modelState","obj","Object","assign","setState","defaultValidate","FormValidator","validateMerge","validate","keyName","message","error","rule","SingleRuleValidate","Custom","keyNames","newErrors","_objectSpread","Array","isArray","forEach","key","_ref","_asyncToGenerator","_regenerator","m","_callee","e","formData","raw","trimmed","w","_context","n","preventDefault","FormData","currentTarget","convertFormDataToJson","trimAllStrings","run","keys","length","a","onSubmit","messageError","getErrorFromResponse","_x","apply","this","arguments","refForm","singleValidate","getValidate","_inherits","Component","_createClass","value","_this$props$slots","_this3","_jsx","Box","component","ref","slots","formProps","children","Provider","mapContext","Form","Validator","Context","Consumer"],"mappings":"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"}
|
|
@@ -3,7 +3,9 @@ import { BoxProps } from '@mui/material';
|
|
|
3
3
|
import { IFormBaseContext } from './types';
|
|
4
4
|
import FormValidator, { IPartialError } from './validator';
|
|
5
5
|
export interface IFormBaseSlots {
|
|
6
|
-
formProps?: Omit<BoxProps, 'ref' | 'onSubmit' | 'component'
|
|
6
|
+
formProps?: Omit<BoxProps, 'ref' | 'onSubmit' | 'component'> & {
|
|
7
|
+
[key: string]: any;
|
|
8
|
+
};
|
|
7
9
|
}
|
|
8
10
|
export interface IFormBaseConfigs<T> {
|
|
9
11
|
validate?: FormValidator<Partial<T>>;
|
package/dist/utils/helpers.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{slicedToArray as r,asyncToGenerator as t,typeof as n,regenerator as e,objectSpread2 as o,toArray as a}from"../_virtual/_rollupPluginBabelHelpers.js";import
|
|
1
|
+
import{slicedToArray as r,asyncToGenerator as t,typeof as n,regenerator 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 n=t(e().m((function t(n,o){var a,c,u;return e().w((function(t){for(;;)switch(t.n){case 0:return t.n=1,Promise.all([n(),i(o)]);case 1:return a=t.v,c=r(a,1),u=c[0],t.a(2,u)}}),t)})));return function(r,t){return n.apply(this,arguments)}}(),s=function(r){return/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/.test(r)},f=function(r){return/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(r)},l=function(r){return/^(\+?\d{1,4}[\s-]?)?((\(\d{1,4}\))|\d{1,4})[\s-]?\d{1,4}[\s-]?\d{1,9}$/.test((null!=r?r:"").trim())},d=function(r){return/^(https?|ftp):\/\/[^\s/$.?#].[^\s]*$/i.test(r)},y=function(r,t){setTimeout((function(){window.scrollTo(o({top:0,left:0,behavior:"smooth"},r))}),t||50)},v=function(){for(var r=arguments.length,t=new Array(r),n=0;n<r;n++)t[n]=arguments[n];return t.join(" ")},h=function(r){return r&&"object"===n(r)&&!Array.isArray(r)},p=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){h(r[n])&&h(t[n])?r[n]=p(r[n],t[n]):r[n]=t[n]})),r):r}),{})},A=function(t){try{return t?Object.entries(t).reduce((function(t,n){var e=r(n,2),o=e[0],a=e[1];return void 0!==a&&(t[o]=a),t}),{}):{}}catch(r){return{}}},m=function(t){if("object"!==n(t)||null===t)return t;var e=Array.isArray(t)?[]:{};return Object.entries(t).forEach((function(t){var o=r(t,2),a=o[0],c=o[1];if(null==c||"string"==typeof c&&""===c.trim()||"number"==typeof c&&isNaN(c)||Array.isArray(c)&&0===c.length||"object"===n(c)&&!Array.isArray(c)&&0===Object.keys(m(c)).length);else if("object"!==n(c)||Array.isArray(c))e[a]=c;else{var i=m(c);Object.keys(i).length>0&&(e[a]=i)}})),e},g=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),""}},b=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)}},w=function(r,t){try{return r?JSON.parse(r):t}catch(r){return console.log(r),t}},j=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}},F=function(r,t){try{return r?parseInt(r):t}catch(r){return t}},Y=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)}))},E=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"},x=function(t){var n,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"$ ",o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";try{n=parseFloat(t),isNaN(n)&&(n=0)}catch(r){n=0}var a=n.toFixed(2).split("."),c=r(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(e).concat(f).concat(o)},M=function(r){return r.toLocaleString("en-US")},T=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(""))},O={style1:"DD/MM/YYYY HH:mm",style2:"MMMM D, YYYY",style3:"MM-DD-YYYY"},D=function(r){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"style1";try{if(!r)throw new Error;return c(r).format(O[t])}catch(r){return"unknown"}};export{A as cleanObject,b as decodeBase64,m as deepRemoveEmptyFields,g as encodeBase64,u as fetchDelay,T as formatCapitalizeFirstText,x as formatCurrency,D as formatDatetime,E as formatFileSize,M as formatNumberWithCommas,s as isGuid,f as isValidEmail,l as isValidPhoneNumber,d as isValidURL,v as mergeClasses,p as mergeObjects,i as sleep,j as tryParseArray,Y as tryParseCsvFileToArray,F as tryParseIntRequired,w as tryParseObject,y 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 isGuid = (value: string): boolean => {\r\n const guidRegex = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/\r\n return guidRegex.test(value)\r\n}\r\n\r\nexport const isValidEmail = (value: string) => {\r\n const regex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/\r\n return regex.test(value)\r\n}\r\n\r\nexport const isValidPhoneNumber = (phoneNumber?: string): boolean => {\r\n const phoneRegex = /^(\\+?\\d{1,4}[\\s-]?)?((\\(\\d{1,4}\\))|\\d{1,4})[\\s-]?\\d{1,4}[\\s-]?\\d{1,9}$/\r\n return phoneRegex.test((phoneNumber ?? '').trim())\r\n}\r\n\r\nexport const isValidURL = (url: string): boolean => {\r\n const regex = /^(https?|ftp):\\/\\/[^\\s/$.?#].[^\\s]*$/i\r\n return regex.test(url)\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//#region Object\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 cleanObject = <T extends object>(obj: T): Partial<T> => {\r\n try {\r\n if (!obj) return {}\r\n return Object.entries(obj).reduce((acc, [key, value]) => {\r\n if (value !== undefined) {\r\n ;(acc as any)[key] = value\r\n }\r\n return acc\r\n }, {} as Partial<T>)\r\n } catch (error) {\r\n return {}\r\n }\r\n}\r\n\r\nexport const deepRemoveEmptyFields = <T extends object>(obj: T): T => {\r\n if (typeof obj !== 'object' || obj === null) return obj\r\n const result: any = Array.isArray(obj) ? [] : {}\r\n Object.entries(obj).forEach(([key, value]) => {\r\n if (\r\n value === undefined ||\r\n value === null ||\r\n (typeof value === 'string' && value.trim() === '') ||\r\n (typeof value === 'number' && isNaN(value)) ||\r\n (Array.isArray(value) && value.length === 0) ||\r\n (typeof value === 'object' && !Array.isArray(value) && Object.keys(deepRemoveEmptyFields(value)).length === 0)\r\n ) {\r\n // skip\r\n } else if (typeof value === 'object' && !Array.isArray(value)) {\r\n const cleaned = deepRemoveEmptyFields(value)\r\n if (Object.keys(cleaned).length > 0) result[key] = cleaned\r\n } else {\r\n result[key] = value\r\n }\r\n })\r\n return result\r\n}\r\n//#endregion\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","_regenerator","m","_callee","action","_yield$Promise$all","_yield$Promise$all2","w","_context","n","all","v","_slicedToArray","a","_x","_x2","apply","this","arguments","isGuid","value","test","isValidEmail","isValidPhoneNumber","phoneNumber","trim","isValidURL","url","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","prev","Object","keys","forEach","key","cleanObject","entries","acc","_ref2","_ref3","undefined","error","deepRemoveEmptyFields","result","_ref4","_ref5","isNaN","cleaned","encodeBase64","input","utf8Bytes","TextEncoder","encode","binaryString","byte","String","fromCharCode","btoa","console","decodeBase64","encoded","atob","Uint8Array","i","charCodeAt","TextDecoder","decode","tryParseObject","defaultValue","Error","JSON","parse","_unused","tryParseArray","parseValue","_unused2","tryParseIntRequired","parseInt","_unused3","tryParseCsvFileToArray","file","resolve","reject","reader","FileReader","onload","rows","split","filter","Boolean","headers","map","h","data","slice","row","values","item","header","index","_values$index","onerror","readAsText","formatFileSize","sizeInKb","toFixed","formatCurrency","parsedValue","prefix","suffix","parseFloat","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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"}
|
|
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 isGuid = (value: string): boolean => {\r\n const guidRegex = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/\r\n return guidRegex.test(value)\r\n}\r\n\r\nexport const isValidEmail = (value: string) => {\r\n const regex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/\r\n return regex.test(value)\r\n}\r\n\r\nexport const isValidPhoneNumber = (phoneNumber?: string): boolean => {\r\n const phoneRegex = /^(\\+?\\d{1,4}[\\s-]?)?((\\(\\d{1,4}\\))|\\d{1,4})[\\s-]?\\d{1,4}[\\s-]?\\d{1,9}$/\r\n return phoneRegex.test((phoneNumber ?? '').trim())\r\n}\r\n\r\nexport const isValidURL = (url: string): boolean => {\r\n const regex = /^(https?|ftp):\\/\\/[^\\s/$.?#].[^\\s]*$/i\r\n return regex.test(url)\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//#region Object\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 cleanObject = <T extends object>(obj: T): Partial<T> => {\r\n try {\r\n if (!obj) return {}\r\n return Object.entries(obj).reduce((acc, [key, value]) => {\r\n if (value !== undefined) {\r\n ;(acc as any)[key] = value\r\n }\r\n return acc\r\n }, {} as Partial<T>)\r\n } catch (error) {\r\n return {}\r\n }\r\n}\r\n\r\nexport const deepRemoveEmptyFields = <T extends object>(obj: T): T => {\r\n if (typeof obj !== 'object' || obj === null) return obj\r\n const result: any = Array.isArray(obj) ? [] : {}\r\n Object.entries(obj).forEach(([key, value]) => {\r\n if (\r\n value === undefined ||\r\n value === null ||\r\n (typeof value === 'string' && value.trim() === '') ||\r\n (typeof value === 'number' && isNaN(value)) ||\r\n (Array.isArray(value) && value.length === 0) ||\r\n (typeof value === 'object' && !Array.isArray(value) && Object.keys(deepRemoveEmptyFields(value)).length === 0)\r\n ) {\r\n // skip\r\n } else if (typeof value === 'object' && !Array.isArray(value)) {\r\n const cleaned = deepRemoveEmptyFields(value)\r\n if (Object.keys(cleaned).length > 0) result[key] = cleaned\r\n } else {\r\n result[key] = value\r\n }\r\n })\r\n return result\r\n}\r\n//#endregion\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) return defaultValue\r\n return JSON.parse(value)\r\n } catch (error) {\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","_regenerator","m","_callee","action","_yield$Promise$all","_yield$Promise$all2","w","_context","n","all","v","_slicedToArray","a","_x","_x2","apply","this","arguments","isGuid","value","test","isValidEmail","isValidPhoneNumber","phoneNumber","trim","isValidURL","url","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","prev","Object","keys","forEach","key","cleanObject","entries","acc","_ref2","_ref3","undefined","error","deepRemoveEmptyFields","result","_ref4","_ref5","isNaN","cleaned","encodeBase64","input","utf8Bytes","TextEncoder","encode","binaryString","byte","String","fromCharCode","btoa","console","decodeBase64","encoded","atob","Uint8Array","i","charCodeAt","TextDecoder","decode","tryParseObject","defaultValue","JSON","parse","log","tryParseArray","parseValue","_unused","tryParseIntRequired","parseInt","_unused2","tryParseCsvFileToArray","file","resolve","reject","reader","FileReader","onload","rows","split","filter","Boolean","headers","map","h","data","slice","row","values","item","header","index","_values$index","onerror","Error","readAsText","formatFileSize","sizeInKb","toFixed","formatCurrency","parsedValue","prefix","suffix","parseFloat","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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"}
|