dinocollab-core 2.1.17 → 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.
- package/dist/form/create.form-base.js +1 -1
- package/dist/form/create.form-base.js.map +1 -1
- package/dist/form/validator.js +1 -1
- package/dist/form/validator.js.map +1 -1
- package/dist/http-service/base/helpers.js +1 -1
- package/dist/http-service/base/helpers.js.map +1 -1
- package/dist/types/form/create.form-base.d.ts +3 -1
- package/dist/types/form/validator.d.ts +2 -2
- package/dist/utils/helpers.js +1 -1
- package/dist/utils/helpers.js.map +1 -1
- package/package.json +1 -1
|
@@ -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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"}
|
package/dist/form/validator.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{defineProperty as e,createClass as r,classCallCheck as i}from"../_virtual/_rollupPluginBabelHelpers.js";import{formatFileSize as u}from"../utils/helpers.js";import"../utils/dayjs-config.js";import"../utils/query-param.js";var n
|
|
1
|
+
import{defineProperty as e,createClass as r,classCallCheck as i}from"../_virtual/_rollupPluginBabelHelpers.js";import{formatFileSize as u}from"../utils/helpers.js";import"../utils/dayjs-config.js";import"../utils/query-param.js";var t,n;!function(e){e.Required="Required",e.Regex="Regex",e.RequiredValue="RequiredValue",e.Array="Array",e.Number="Number",e.Email="Email",e.PhoneNumber="PhoneNumber",e.Url="Url",e.File="File",e.FileRequired="FileRequired",e.Custom="Custom"}(n||(n={}));var s={Required:"The {0} is required",Regex:"The {0} is not match {1}",RequiredValue:"the {0} is not equal {1}",Array:"The {0} is not valid",Number:"{0} must be a number",Email:"The {0} is not valid",PhoneNumber:"The {0} is not valid",Url:"The {0} is not valid",File:"File size must be less than {1}",FileRequired:"The {0} is required",Custom:"Error Custom"},a=function(e,r){return r},l=r((function r(t){var l=this;i(this,r),e(this,"AddRules",(function(e){var r,i=l.configs[e];i||(i={Rules:[]},l.configs[e]=i);for(var u=arguments.length,t=new Array(u>1?u-1:0),n=1;n<u;n++)t[n-1]=arguments[n];return(r=i.Rules).push.apply(r,t),l})),e(this,"Required",(function(e,r){return null==r||""===r})),e(this,"Regex",(function(e,r,i){return!!r&&!e.Value.test(r)})),e(this,"RequiredValue",(function(e,r){return!!r&&r!==e.Value})),e(this,"Custom",(function(e,r,i){return"function"!=typeof e.Value||e.Value(r,i)})),e(this,"Array",(function(e,r){return!!r&&("number"!=typeof e.Value||(!Array.isArray(r)||r.length<=e.Value))})),e(this,"Number",(function(e,r){return!!r&&isNaN(Number(r))})),e(this,"Email",(function(e,r){if(!r)return!1;return!/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(r)})),e(this,"PhoneNumber",(function(e,r){if(!r)return!1;return!/^(\+?\d{1,4}[\s-]?)?((\(\d{1,4}\))|\d{1,4})[\s-]?\d{1,4}[\s-]?\d{1,9}$/.test((null!=r?r:"").trim())})),e(this,"Url",(function(e,r){if(!r)return!1;try{return new URL(r),!1}catch(e){return!0}})),e(this,"File",(function(e,r){if(!r)return!1;var i=a(0,e.options),u=Array.isArray(r)?r:[r];return!!i&&(!0===i.all?u.reduce((function(e,r){return e+=r.size}),0)>i.maxSize:u.some((function(e){return e.size>i.maxSize})))})),e(this,"FileRequired",(function(e,r){return!!(Array.isArray(r)?r:[r]).filter((function(e){return!!e})).some((function(e){return e.size<=0}))})),e(this,"RenderMessage",(function(e,r,i,t){if(t&&"string"==typeof t)e.message=t;else if(!e.message)switch(e.message=s[e.rule].replace("{0}",null!=i?i:r),e.rule){case n.Regex:e.message=e.message.replace("{1}",e.Value.source);break;case n.RequiredValue:var l,o;e.message=e.message.replace("{1}",null!==(l=null===(o=e.Value)||void 0===o?void 0:o.toString())&&void 0!==l?l:"");break;case n.File:var c,f,m=a(0,e.options);if(!0===(null==m?void 0:m.all))e.message="Total file size must be less than ".concat(u((null!==(c=null==m?void 0:m.maxSize)&&void 0!==c?c:0)/1024));else e.message=e.message.replace("{1}",u((null!==(f=null==m?void 0:m.maxSize)&&void 0!==f?f:0)/1024))}return e.message=e.message.replace("{0}",r),e})),e(this,"run",(function(e){var r=Object.keys(l.configs),i={};return r.forEach((function(r){var u=l.configs[r];if(u){var t=l.Executed(u,e[r],e);t.length<1||(i[r]=t.map((function(e){return l.RenderMessage(e.rule,r,u.label,e.value)})))}})),i})),e(this,"Executed",(function(e,r,i){return e.Rules.map((function(e){var u=l[e.rule.toString()],t=u&&u(e,r,i);return{value:t,rule:e}})).filter((function(e){return e.value}))})),this.configs=t}));t=l,e(l,"initial",(function(e){return new t(e)}));var o=function(){return new l({})};export{n as SingleRuleValidate,o as createFormValidator,l as default,a as mapRuleOptions};
|
|
2
2
|
//# sourceMappingURL=validator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.js","sources":["../../src/form/validator.ts"],"sourcesContent":["import { formatFileSize } from '../utils'\r\n\r\nexport type IModelBase = { [key: string]: any }\r\n\r\nexport enum SingleRuleValidate {\r\n Required = 'Required',\r\n Regex = 'Regex',\r\n RequiredValue = 'RequiredValue',\r\n Array = 'Array',\r\n Number = 'Number',\r\n Email = 'Email',\r\n PhoneNumber = 'PhoneNumber',\r\n Url = 'Url',\r\n File = 'File',\r\n FileRequired = 'FileRequired',\r\n Custom = 'Custom'\r\n}\r\n\r\nconst MessageDefault = {\r\n Required: 'The {0} is required',\r\n Regex: 'The {0} is not match {1}',\r\n RequiredValue: 'the {0} is not equal {1}',\r\n Array: 'The {0} is not valid',\r\n Number: '{0} must be a number',\r\n Email: 'The {0} is not valid',\r\n PhoneNumber: 'The {0} is not valid',\r\n Url: 'The {0} is not valid',\r\n File: 'File size must be less than {1}',\r\n FileRequired: 'The {0} is required',\r\n Custom: 'Error Custom'\r\n}\r\n\r\nexport interface IRuleOptions {\r\n File: {\r\n maxSize: number\r\n // toal size of files\r\n all?: boolean\r\n }\r\n}\r\n\r\nexport const mapRuleOptions = <TK extends keyof IRuleOptions>(key: TK, options?: IRuleOptions[TK]) => options\r\n\r\nexport interface IRuleOption<TModel = any> {\r\n rule: SingleRuleValidate\r\n message?: string\r\n Value?: RegExp | ((value: any, model: TModel) => boolean | string) | number | Array<any> | boolean\r\n options?: any\r\n}\r\n\r\nexport interface IConfigValue<TModel = any> {\r\n Rules: IRuleOption<TModel>[]\r\n label?: string\r\n}\r\n\r\nexport interface IModelError {\r\n message: string\r\n error: boolean\r\n}\r\n\r\nexport type IFormValidatorConfig<TModel> = {\r\n [key in keyof Extract<TModel, IModelBase>]?: IConfigValue<TModel>\r\n}\r\n\r\nexport type IPartialError<TModel> = {\r\n [key in keyof TModel]?: IRuleOption<TModel>[]\r\n}\r\n\r\nexport default class FormValidator<TModel> {\r\n configs: IFormValidatorConfig<TModel>\r\n constructor(configs: IFormValidatorConfig<TModel>) {\r\n this.configs = configs\r\n }\r\n\r\n static initial = <T>(configs: IFormValidatorConfig<T>) => new FormValidator(configs)\r\n\r\n AddRules = (key: keyof TModel, ...rule: IRuleOption<TModel>[]) => {\r\n let fieldConfig = this.configs[key]\r\n if (!fieldConfig) {\r\n fieldConfig = { Rules: [] }\r\n this.configs[key] = fieldConfig\r\n }\r\n fieldConfig.Rules.push(...rule)\r\n return this\r\n }\r\n\r\n Required = (RuleOption: IRuleOption, value: any) => {\r\n return value === null || value === undefined || value === ''\r\n }\r\n Regex = (RuleOption: IRuleOption, value: string, Regex: RegExp) => {\r\n if (!value) return false\r\n return !(RuleOption.Value as RegExp).test(value)\r\n }\r\n RequiredValue = (RuleOption: IRuleOption, value: any) => {\r\n if (!value) return false\r\n return value !== RuleOption.Value\r\n }\r\n Custom = (RuleOption: IRuleOption, value: any, model: any) => {\r\n if (typeof RuleOption.Value === 'function') {\r\n return RuleOption.Value(value, model)\r\n }\r\n return true\r\n }\r\n Array = (RuleOption: IRuleOption, value: any) => {\r\n if (!value) return false\r\n if (typeof RuleOption.Value === 'number') {\r\n return Array.isArray(value) ? value.length <= RuleOption.Value : true\r\n }\r\n return true\r\n }\r\n Number = (RuleOption: IRuleOption, value: any) => {\r\n if (!value) return false\r\n return isNaN(Number(value))\r\n }\r\n Email = (RuleOption: IRuleOption, value: any) => {\r\n if (!value) return false\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 PhoneNumber = (RuleOption: IRuleOption, value: any) => {\r\n if (!value) return false\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((value ?? '').trim())\r\n }\r\n Url = (RuleOption: IRuleOption, value: any) => {\r\n if (!value) return false\r\n try {\r\n new URL(value)\r\n return false\r\n } catch (err) {\r\n return true\r\n }\r\n }\r\n File = (RuleOption: IRuleOption, value: any) => {\r\n if (!value) return false\r\n const options = mapRuleOptions('File', RuleOption.options)\r\n const files: File[] = Array.isArray(value) ? value : [value]\r\n if (!options) return false\r\n if (options.all === true) {\r\n const size = files.reduce((a, b) => {\r\n a += b.size\r\n return a\r\n }, 0)\r\n return size > options.maxSize\r\n } else {\r\n return files.some((x) => x.size > options.maxSize)\r\n }\r\n }\r\n FileRequired = (RuleOption: IRuleOption, value: any) => {\r\n const files: File[] = Array.isArray(value) ? value : [value]\r\n return !!files.filter((x) => !!x).some((x) => x.size <= 0)\r\n }\r\n RenderMessage = (RuleOption: IRuleOption, key: string, label?: string, message?: string) => {\r\n if (message) {\r\n RuleOption.message = message\r\n } else if (!RuleOption.message) {\r\n RuleOption.message = MessageDefault[RuleOption.rule].replace('{0}', label ?? key)\r\n switch (RuleOption.rule) {\r\n case SingleRuleValidate.Regex: {\r\n RuleOption.message = RuleOption.message.replace('{1}', (RuleOption.Value as RegExp).source)\r\n break\r\n }\r\n case SingleRuleValidate.RequiredValue: {\r\n RuleOption.message = RuleOption.message.replace('{1}', RuleOption.Value?.toString() ?? '')\r\n break\r\n }\r\n case SingleRuleValidate.File: {\r\n const options = mapRuleOptions('File', RuleOption.options)\r\n if (options?.all === true) {\r\n RuleOption.message = `Total file size must be less than ${formatFileSize((options?.maxSize ?? 0) / 1024)}`\r\n } else {\r\n RuleOption.message = RuleOption.message.replace('{1}', formatFileSize((options?.maxSize ?? 0) / 1024))\r\n }\r\n break\r\n }\r\n default:\r\n break\r\n }\r\n }\r\n RuleOption.message = RuleOption.message.replace('{0}', key)\r\n return RuleOption\r\n }\r\n run = (model: TModel) => {\r\n const keys = Object.keys(this.configs)\r\n const data: IPartialError<TModel> = {}\r\n keys.forEach((key) => {\r\n const config = this.configs[key]\r\n if (!config) return\r\n const tmp = this.Executed(config, (model as any)[key], model)\r\n if (tmp.length < 1) return\r\n ;(data as any)[key] = tmp.map((x) => this.RenderMessage(x.rule, key, config.label, x.value))\r\n })\r\n return data\r\n }\r\n Executed = (Config: IConfigValue, valueField: any, model: any) => {\r\n return Config.Rules.map((Value) => {\r\n const action = (this as any)[Value.rule.toString()]\r\n const res = action && action(Value, valueField, model)\r\n return { value: typeof res === 'boolean' ? undefined : (res as string), rule: Value }\r\n }).filter((x) => x.value)\r\n }\r\n}\r\n\r\nexport const createFormValidator = <TModel>() => {\r\n return new FormValidator<Partial<TModel>>({})\r\n}\r\n"],"names":["SingleRuleValidate","MessageDefault","Required","Regex","RequiredValue","Array","Number","Email","PhoneNumber","Url","File","FileRequired","Custom","mapRuleOptions","key","options","FormValidator","_createClass","configs","_this","this","_classCallCheck","_defineProperty","_fieldConfig$Rules","fieldConfig","Rules","_len","arguments","length","rule","_key","push","apply","RuleOption","value","Value","test","model","isArray","isNaN","trim","URL","err","files","all","reduce","a","b","size","maxSize","some","x","filter","label","message","replace","source","_RuleOption$Value$toS","_RuleOption$Value","toString","_options$maxSize","_options$maxSize2","concat","formatFileSize","keys","Object","data","forEach","config","tmp","Executed","map","RenderMessage","Config","valueField","action","res","undefined","_FormValidator","createFormValidator"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"validator.js","sources":["../../src/form/validator.ts"],"sourcesContent":["import { formatFileSize } from '../utils'\r\n\r\nexport type IModelBase = { [key: string]: any }\r\n\r\nexport enum SingleRuleValidate {\r\n Required = 'Required',\r\n Regex = 'Regex',\r\n RequiredValue = 'RequiredValue',\r\n Array = 'Array',\r\n Number = 'Number',\r\n Email = 'Email',\r\n PhoneNumber = 'PhoneNumber',\r\n Url = 'Url',\r\n File = 'File',\r\n FileRequired = 'FileRequired',\r\n Custom = 'Custom'\r\n}\r\n\r\nconst MessageDefault = {\r\n Required: 'The {0} is required',\r\n Regex: 'The {0} is not match {1}',\r\n RequiredValue: 'the {0} is not equal {1}',\r\n Array: 'The {0} is not valid',\r\n Number: '{0} must be a number',\r\n Email: 'The {0} is not valid',\r\n PhoneNumber: 'The {0} is not valid',\r\n Url: 'The {0} is not valid',\r\n File: 'File size must be less than {1}',\r\n FileRequired: 'The {0} is required',\r\n Custom: 'Error Custom'\r\n}\r\n\r\nexport interface IRuleOptions {\r\n File: {\r\n maxSize: number\r\n // toal size of files\r\n all?: boolean\r\n }\r\n}\r\n\r\nexport const mapRuleOptions = <TK extends keyof IRuleOptions>(key: TK, options?: IRuleOptions[TK]) => options\r\n\r\nexport interface IRuleOption<TModel = any> {\r\n rule: SingleRuleValidate\r\n message?: string\r\n Value?: RegExp | ((value: any, model: TModel) => boolean | string) | number | Array<any> | boolean\r\n options?: any\r\n}\r\n\r\nexport interface IConfigValue<TModel = any> {\r\n Rules: IRuleOption<TModel>[]\r\n label?: string\r\n}\r\n\r\nexport interface IModelError {\r\n message: string\r\n error: boolean\r\n}\r\n\r\nexport type IFormValidatorConfig<TModel> = {\r\n [key in keyof Extract<TModel, IModelBase>]?: IConfigValue<TModel>\r\n}\r\n\r\nexport type IPartialError<TModel> = {\r\n [key in keyof TModel]?: IRuleOption<TModel>[]\r\n}\r\n\r\nexport default class FormValidator<TModel> {\r\n configs: IFormValidatorConfig<TModel>\r\n constructor(configs: IFormValidatorConfig<TModel>) {\r\n this.configs = configs\r\n }\r\n\r\n static initial = <T>(configs: IFormValidatorConfig<T>) => new FormValidator(configs)\r\n\r\n AddRules = (key: keyof TModel, ...rule: IRuleOption<TModel>[]) => {\r\n let fieldConfig = this.configs[key]\r\n if (!fieldConfig) {\r\n fieldConfig = { Rules: [] }\r\n this.configs[key] = fieldConfig\r\n }\r\n fieldConfig.Rules.push(...rule)\r\n return this\r\n }\r\n\r\n Required = (RuleOption: IRuleOption, value: any) => {\r\n return value === null || value === undefined || value === ''\r\n }\r\n Regex = (RuleOption: IRuleOption, value: string, Regex: RegExp) => {\r\n if (!value) return false\r\n return !(RuleOption.Value as RegExp).test(value)\r\n }\r\n RequiredValue = (RuleOption: IRuleOption, value: any) => {\r\n if (!value) return false\r\n return value !== RuleOption.Value\r\n }\r\n Custom = (RuleOption: IRuleOption, value: any, model: any) => {\r\n if (typeof RuleOption.Value === 'function') {\r\n return RuleOption.Value(value, model)\r\n }\r\n return true\r\n }\r\n Array = (RuleOption: IRuleOption, value: any) => {\r\n if (!value) return false\r\n if (typeof RuleOption.Value === 'number') {\r\n return Array.isArray(value) ? value.length <= RuleOption.Value : true\r\n }\r\n return true\r\n }\r\n Number = (RuleOption: IRuleOption, value: any) => {\r\n if (!value) return false\r\n return isNaN(Number(value))\r\n }\r\n Email = (RuleOption: IRuleOption, value: any) => {\r\n if (!value) return false\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 PhoneNumber = (RuleOption: IRuleOption, value: any) => {\r\n if (!value) return false\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((value ?? '').trim())\r\n }\r\n Url = (RuleOption: IRuleOption, value: any) => {\r\n if (!value) return false\r\n try {\r\n new URL(value)\r\n return false\r\n } catch (err) {\r\n return true\r\n }\r\n }\r\n File = (RuleOption: IRuleOption, value: any) => {\r\n if (!value) return false\r\n const options = mapRuleOptions('File', RuleOption.options)\r\n const files: File[] = Array.isArray(value) ? value : [value]\r\n if (!options) return false\r\n if (options.all === true) {\r\n const size = files.reduce((a, b) => {\r\n a += b.size\r\n return a\r\n }, 0)\r\n return size > options.maxSize\r\n } else {\r\n return files.some((x) => x.size > options.maxSize)\r\n }\r\n }\r\n FileRequired = (RuleOption: IRuleOption, value: any) => {\r\n const files: File[] = Array.isArray(value) ? value : [value]\r\n return !!files.filter((x) => !!x).some((x) => x.size <= 0)\r\n }\r\n RenderMessage = (RuleOption: IRuleOption, key: string, label?: string, message?: string | boolean) => {\r\n if (!!message && typeof message === 'string') {\r\n RuleOption.message = message\r\n } else if (!RuleOption.message) {\r\n RuleOption.message = MessageDefault[RuleOption.rule].replace('{0}', label ?? key)\r\n switch (RuleOption.rule) {\r\n case SingleRuleValidate.Regex: {\r\n RuleOption.message = RuleOption.message.replace('{1}', (RuleOption.Value as RegExp).source)\r\n break\r\n }\r\n case SingleRuleValidate.RequiredValue: {\r\n RuleOption.message = RuleOption.message.replace('{1}', RuleOption.Value?.toString() ?? '')\r\n break\r\n }\r\n case SingleRuleValidate.File: {\r\n const options = mapRuleOptions('File', RuleOption.options)\r\n if (options?.all === true) {\r\n RuleOption.message = `Total file size must be less than ${formatFileSize((options?.maxSize ?? 0) / 1024)}`\r\n } else {\r\n RuleOption.message = RuleOption.message.replace('{1}', formatFileSize((options?.maxSize ?? 0) / 1024))\r\n }\r\n break\r\n }\r\n default:\r\n break\r\n }\r\n }\r\n RuleOption.message = RuleOption.message.replace('{0}', key)\r\n return RuleOption\r\n }\r\n run = (model: TModel) => {\r\n const keys = Object.keys(this.configs)\r\n const data: IPartialError<TModel> = {}\r\n keys.forEach((key) => {\r\n const config = this.configs[key]\r\n if (!config) return\r\n const tmp = this.Executed(config, (model as any)[key], model)\r\n if (tmp.length < 1) return\r\n ;(data as any)[key] = tmp.map((x) => this.RenderMessage(x.rule, key, config.label, x.value))\r\n })\r\n return data\r\n }\r\n Executed = (Config: IConfigValue, valueField: any, model: any) => {\r\n return Config.Rules.map((Value) => {\r\n const action = (this as any)[Value.rule.toString()]\r\n const res = action && action(Value, valueField, model)\r\n return { value: typeof res === 'boolean' ? res : (res as string), rule: Value }\r\n }).filter((x) => x.value)\r\n }\r\n}\r\n\r\nexport const createFormValidator = <TModel>() => {\r\n return new FormValidator<Partial<TModel>>({})\r\n}\r\n"],"names":["SingleRuleValidate","MessageDefault","Required","Regex","RequiredValue","Array","Number","Email","PhoneNumber","Url","File","FileRequired","Custom","mapRuleOptions","key","options","FormValidator","_createClass","configs","_this","this","_classCallCheck","_defineProperty","_fieldConfig$Rules","fieldConfig","Rules","_len","arguments","length","rule","_key","push","apply","RuleOption","value","Value","test","model","isArray","isNaN","trim","URL","err","files","all","reduce","a","b","size","maxSize","some","x","filter","label","message","replace","source","_RuleOption$Value$toS","_RuleOption$Value","toString","_options$maxSize","_options$maxSize2","concat","formatFileSize","keys","Object","data","forEach","config","tmp","Executed","map","RenderMessage","Config","valueField","action","res","_FormValidator","createFormValidator"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{asyncToGenerator as r,regenerator as e,slicedToArray as n}from"../../_virtual/_rollupPluginBabelHelpers.js";import{authService as o,ApplicationPaths as t}from"partner-oidc-auth";var
|
|
1
|
+
import{asyncToGenerator as r,regenerator as e,slicedToArray as n}from"../../_virtual/_rollupPluginBabelHelpers.js";import{authService as o,ApplicationPaths as t}from"partner-oidc-auth";var i=globalThis.ApiAlertContext;"development"===process.env.NODE_ENV&&(globalThis.authService=o);var u=function(r){return new Promise((function(e){return setTimeout(e,r)}))},s=function(){var o=r(e().m((function r(o,t){var i,s,l;return e().w((function(r){for(;;)switch(r.n){case 0:return r.n=1,Promise.all([o(),u(t)]);case 1:return i=r.v,s=n(i,1),l=s[0],r.a(2,l)}}),r)})));return function(r,e){return o.apply(this,arguments)}}(),l=function(r){var e,n,o,t,u,s=Object.values(null!==(e=null!==(n=null===(o=r.response)||void 0===o||null===(o=o.data)||void 0===o?void 0:o.errors)&&void 0!==n?n:null===(t=r.response)||void 0===t?void 0:t.data)&&void 0!==e?e:{}).filter((function(r){return r.length>0})).map((function(r){return r[0]}));s.length<1||null==i||null===(u=i.ApiAlert)||void 0===u||u.PushError(s.join("\n"))},a=function(){var n=r(e().m((function r(n){var u,s,l,a,c,d,v,p,f,h;return e().w((function(r){for(;;)switch(r.n){case 0:if(403!==(null===(u=n.response)||void 0===u?void 0:u.status)){r.n=7;break}d=n.response.data,h=d.Code,r.n=3===h?1:1===h?3:5;break;case 1:return r.n=2,o.signOut({returnUrl:o.getReturnUrl()});case 2:return r.a(3,6);case 3:return r.n=4,null===(v=o.userManager)||void 0===v?void 0:v.revokeTokens(["access_token"]);case 4:return window.location.replace(t.Origin("")),r.a(3,6);case 5:return window.location.replace(t.Origin(t.IdentityAccessDenied)),r.a(3,6);case 6:r.n=8;break;case 7:401===(null===(s=n.response)||void 0===s?void 0:s.status)||"ERR_CANCELED"===n.code||((null!==(l=null===(a=n.response)||void 0===a?void 0:a.status)&&void 0!==l?l:500)>=500?"ERR_CANCELED"!==n.code&&(null==i||null===(p=i.ApiAlert)||void 0===p||p.PushError("An error has occurred!")):404===(null===(c=n.response)||void 0===c?void 0:c.status)&&(null==i||null===(f=i.ApiAlert)||void 0===f||f.PushError("Resource not found!")));case 8:return r.a(2,Promise.reject(n))}}),r)})));return function(r){return n.apply(this,arguments)}}();export{i as ApiAlertContext,s as fetchDelay,a as handleResponseError,l as processError,u as sleep};
|
|
2
2
|
//# sourceMappingURL=helpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sources":["../../../src/http-service/base/helpers.ts"],"sourcesContent":["import { AxiosError } from 'axios'\r\nimport { ApplicationPaths, authService } from 'partner-oidc-auth'\r\nimport type { IApiContext } from './type.api-alert'\r\n\r\nexport const ApiAlertContext = (globalThis as any).ApiAlertContext as IApiContext | undefined\r\n\r\nif (process.env.NODE_ENV === 'development') {\r\n ;(globalThis as any).authService = authService\r\n}\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\ninterface ErrorModel {\r\n [key: string]: string[]\r\n}\r\n\r\n/**\r\n * Processes axios errors and displays error messages to the user\r\n * @param err - The axios error containing response data\r\n */\r\nexport const processError = (err: AxiosError<ErrorModel>) => {\r\n const errorMessages = Object.values(err.response?.data ?? {})\r\n .filter((x) => x.length > 0)\r\n .map((x) => x[0])\r\n if (errorMessages.length < 1) return\r\n ApiAlertContext?.ApiAlert?.PushError(errorMessages.join('\\n'))\r\n}\r\n\r\n/**\r\n * Checks if the current user's token is expired.\r\n * @returns {Promise<boolean>} True if token is expired or user not logged in, false otherwise.\r\n */\r\nexport const checkTokenExpiry = async () => {\r\n try {\r\n const user = await authService.getUser()\r\n if (!user) {\r\n console.log('No user is currently logged in.')\r\n return true\r\n }\r\n\r\n const now = Math.floor(Date.now() / 1000) // Current time in seconds since epoch\r\n const expiresIn = user.exp - now\r\n\r\n if (expiresIn <= 0) {\r\n console.log('The token has expired.')\r\n return true\r\n } else {\r\n console.log(`The token will expire in ${expiresIn} seconds.`)\r\n return false\r\n }\r\n } catch (error) {\r\n console.error('Error checking token expiry:', error)\r\n return true\r\n }\r\n}\r\n/**\r\n * Refreshes the token once if at least 4 seconds have passed since the last refresh.\r\n * Uses localStorage key 'ltt' to track last refresh time.\r\n */\r\nexport const refreshTokenOnce = async () => {\r\n const timeStamp = new Date().getTime() - parseInt(localStorage.getItem('ltt') ?? '0')\r\n localStorage.setItem('ltt', new Date().getTime().toString())\r\n if (timeStamp >= 4000) {\r\n try {\r\n await authService.ensureUserManagerInitialized()\r\n await authService.signIn({})\r\n } catch (e) {\r\n console.log(e)\r\n }\r\n }\r\n}\r\n/**\r\n * Handles errors from Axios HTTP responses.\r\n * Redirects or signs out user based on error code and status.\r\n * @param {AxiosError} err - The error object from Axios.\r\n * @returns {Promise<never>} Always rejects with the error.\r\n */\r\nexport const handleResponseError = async (err: AxiosError) => {\r\n if (err.response?.status === 403) {\r\n const dataError: { Code: number; Message: string } = err.response.data as any\r\n switch (dataError.Code) {\r\n case 3: {\r\n await authService.signOut({ returnUrl: authService.getReturnUrl() })\r\n break\r\n }\r\n case 1: {\r\n await authService.userManager?.revokeTokens(['access_token'])\r\n window.location.replace(ApplicationPaths.Origin(''))\r\n break\r\n }\r\n default: {\r\n window.location.replace(ApplicationPaths.Origin(ApplicationPaths.IdentityAccessDenied))\r\n break\r\n }\r\n }\r\n } else if (err.response?.status === 401) {\r\n } else if (err.code === 'ERR_CANCELED') {\r\n } else if ((err.response?.status ?? 500) >= 500) {\r\n if (err.code !== 'ERR_CANCELED') {\r\n ApiAlertContext?.ApiAlert?.PushError('An error has occurred!')\r\n }\r\n } else if (err.response?.status === 404) {\r\n ApiAlertContext?.ApiAlert?.PushError('Resource not found!')\r\n }\r\n return Promise.reject(err)\r\n}\r\n"],"names":["ApiAlertContext","globalThis","process","env","NODE_ENV","authService","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","processError","err","_err$response$data","_err$response","_ApiAlertContext$ApiA","errorMessages","Object","values","response","data","filter","x","length","map","ApiAlert","PushError","join","handleResponseError","
|
|
1
|
+
{"version":3,"file":"helpers.js","sources":["../../../src/http-service/base/helpers.ts"],"sourcesContent":["import { AxiosError } from 'axios'\r\nimport { ApplicationPaths, authService } from 'partner-oidc-auth'\r\nimport type { IApiContext } from './type.api-alert'\r\n\r\nexport const ApiAlertContext = (globalThis as any).ApiAlertContext as IApiContext | undefined\r\n\r\nif (process.env.NODE_ENV === 'development') {\r\n ;(globalThis as any).authService = authService\r\n}\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\ninterface ErrorModel {\r\n [key: string]: string[]\r\n}\r\n\r\n/**\r\n * Processes axios errors and displays error messages to the user\r\n * @param err - The axios error containing response data\r\n */\r\nexport const processError = (err: AxiosError<ErrorModel>) => {\r\n const errorMessages = Object.values(err.response?.data?.errors ?? err.response?.data ?? {})\r\n .filter((x) => x.length > 0)\r\n .map((x) => x[0])\r\n if (errorMessages.length < 1) return\r\n ApiAlertContext?.ApiAlert?.PushError(errorMessages.join('\\n'))\r\n}\r\n\r\n/**\r\n * Checks if the current user's token is expired.\r\n * @returns {Promise<boolean>} True if token is expired or user not logged in, false otherwise.\r\n */\r\nexport const checkTokenExpiry = async () => {\r\n try {\r\n const user = await authService.getUser()\r\n if (!user) {\r\n console.log('No user is currently logged in.')\r\n return true\r\n }\r\n\r\n const now = Math.floor(Date.now() / 1000) // Current time in seconds since epoch\r\n const expiresIn = user.exp - now\r\n\r\n if (expiresIn <= 0) {\r\n console.log('The token has expired.')\r\n return true\r\n } else {\r\n console.log(`The token will expire in ${expiresIn} seconds.`)\r\n return false\r\n }\r\n } catch (error) {\r\n console.error('Error checking token expiry:', error)\r\n return true\r\n }\r\n}\r\n/**\r\n * Refreshes the token once if at least 4 seconds have passed since the last refresh.\r\n * Uses localStorage key 'ltt' to track last refresh time.\r\n */\r\nexport const refreshTokenOnce = async () => {\r\n const timeStamp = new Date().getTime() - parseInt(localStorage.getItem('ltt') ?? '0')\r\n localStorage.setItem('ltt', new Date().getTime().toString())\r\n if (timeStamp >= 4000) {\r\n try {\r\n await authService.ensureUserManagerInitialized()\r\n await authService.signIn({})\r\n } catch (e) {\r\n console.log(e)\r\n }\r\n }\r\n}\r\n/**\r\n * Handles errors from Axios HTTP responses.\r\n * Redirects or signs out user based on error code and status.\r\n * @param {AxiosError} err - The error object from Axios.\r\n * @returns {Promise<never>} Always rejects with the error.\r\n */\r\nexport const handleResponseError = async (err: AxiosError) => {\r\n if (err.response?.status === 403) {\r\n const dataError: { Code: number; Message: string } = err.response.data as any\r\n switch (dataError.Code) {\r\n case 3: {\r\n await authService.signOut({ returnUrl: authService.getReturnUrl() })\r\n break\r\n }\r\n case 1: {\r\n await authService.userManager?.revokeTokens(['access_token'])\r\n window.location.replace(ApplicationPaths.Origin(''))\r\n break\r\n }\r\n default: {\r\n window.location.replace(ApplicationPaths.Origin(ApplicationPaths.IdentityAccessDenied))\r\n break\r\n }\r\n }\r\n } else if (err.response?.status === 401) {\r\n } else if (err.code === 'ERR_CANCELED') {\r\n } else if ((err.response?.status ?? 500) >= 500) {\r\n if (err.code !== 'ERR_CANCELED') {\r\n ApiAlertContext?.ApiAlert?.PushError('An error has occurred!')\r\n }\r\n } else if (err.response?.status === 404) {\r\n ApiAlertContext?.ApiAlert?.PushError('Resource not found!')\r\n }\r\n return Promise.reject(err)\r\n}\r\n"],"names":["ApiAlertContext","globalThis","process","env","NODE_ENV","authService","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","processError","err","_ref2","_err$response$data$er","_err$response","_err$response2","_ApiAlertContext$ApiA","errorMessages","Object","values","response","data","errors","filter","x","length","map","ApiAlert","PushError","join","handleResponseError","_ref5","_callee4","_err$response3","_err$response4","_err$response$status","_err$response5","_err$response6","dataError","_authService$userMana","_ApiAlertContext$ApiA2","_ApiAlertContext$ApiA3","_t3","_context4","status","Code","signOut","returnUrl","getReturnUrl","userManager","revokeTokens","window","location","replace","ApplicationPaths","Origin","IdentityAccessDenied","code","reject","_x3"],"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>>;
|
|
@@ -57,10 +57,10 @@ export default class FormValidator<TModel> {
|
|
|
57
57
|
Url: (RuleOption: IRuleOption, value: any) => boolean;
|
|
58
58
|
File: (RuleOption: IRuleOption, value: any) => boolean;
|
|
59
59
|
FileRequired: (RuleOption: IRuleOption, value: any) => boolean;
|
|
60
|
-
RenderMessage: (RuleOption: IRuleOption, key: string, label?: string, message?: string) => IRuleOption<any>;
|
|
60
|
+
RenderMessage: (RuleOption: IRuleOption, key: string, label?: string, message?: string | boolean) => IRuleOption<any>;
|
|
61
61
|
run: (model: TModel) => IPartialError<TModel>;
|
|
62
62
|
Executed: (Config: IConfigValue, valueField: any, model: any) => {
|
|
63
|
-
value: string |
|
|
63
|
+
value: string | boolean;
|
|
64
64
|
rule: IRuleOption<any>;
|
|
65
65
|
}[];
|
|
66
66
|
}
|
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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"}
|