dinocollab-core 2.1.36 → 2.1.39
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/src/form/create.input.js +1 -1
- package/dist/src/form/create.input.js.map +1 -1
- package/dist/src/form/decorator.form.js +1 -1
- package/dist/src/form/decorator.form.js.map +1 -1
- package/dist/src/form/decorator.js +1 -1
- package/dist/src/form/decorator.js.map +1 -1
- package/dist/src/table/ui.units.js +1 -1
- package/dist/src/table/ui.units.js.map +1 -1
- package/dist/src/utils/helpers.js +1 -1
- package/dist/src/utils/helpers.js.map +1 -1
- package/dist/types/form/decorator.d.ts +2 -2
- package/dist/types/form/decorator.form.d.ts +3 -2
- package/dist/types/form/dino-form.d.ts +1 -1
- package/dist/types/form/index.d.ts +1 -1
- package/dist/types/utils/helpers.d.ts +10 -10
- package/dist/utils/index.js +1 -1
- package/package.json +1 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{inherits as e,createClass as t,objectSpread2 as r,classCallCheck as o,callSuper as a,defineProperty as l,objectWithoutProperties as i,asyncToGenerator as n,regenerator as s}from"../../_virtual/_rollupPluginBabelHelpers.js";import{jsxs as u,jsx as p,Fragment as d}from"react/jsx-runtime";import{Component as c}from"react";import{styled as m,Box as h,TextField as v,InputAdornment as f,IconButton as g,Collapse as b,CircularProgress as x}from"@mui/material";import S from"@mui/icons-material/ContentPaste";import{mergeObjects as k}from"../utils/helpers.js";import"../utils/dayjs-config.js";import"../utils/query-param.js";import{getErrorMessage as y}from"./helpers.js";import{ImageWithFallback as P}from"../components/image-with-fallback.js";import{RichTooltip as j,HelpOutlinePulseIcon as L}from"../components/rich-tooltip.js";var C=["srcGetter","element","alt","fallbackSrc","debounceDelay"],I=function(m){return function(){function x(e){var t,c;return o(this,x),c=a(this,x,[e]),l(c,"_cachedSlots",{}),l(c,"mapTextFieldProps",function(){var e,t,o,a,l=y(c.props.messageErrors,c.props.name),i={fullWidth:!0,variant:"outlined",name:null===(e=c.props.name)||void 0===e?void 0:e.toString(),error:l.error,helperText:l.message,disabled:c.props.disabled,onBlur:function(){c.props.name&&c.props.onBlur&&c.props.onBlur(c.props.name)},label:c.getLabel(),placeholder:c.props.placeholder,InputLabelProps:c.state.value?{shrink:!0}:{},value:null!==(t=c.state.value)&&void 0!==t?t:"",onChange:c.handleChange};return i.InputProps||(i.InputProps={}),i.InputProps.endAdornment=u(f,{position:"end",children:[c.slots.pastenable&&p(g,{onClick:c.handlePaste,edge:"end",children:p(S,{})}),c.slots.tooltip&&p(j,{panel:c.slots.tooltip,children:p(L,{fontSize:"small"})})]}),null!==(o=c.slots)&&void 0!==o&&o.maxLength&&(i.inputProps=r(r({},i.inputProps),{},{maxLength:c.slots.maxLength})),k({},i,null===(a=c.slots)||void 0===a?void 0:a.textFieldProps)}),l(c,"renderImageSide",function(e){var t,o="left"===e?c.slots.imageLeft:c.slots.imageRight;if(!o)return p(d,{});var a=o.srcGetter,l=o.element,n=o.alt,s=void 0===n?"input-image":n,u=o.fallbackSrc,m=void 0===u?"":u,h=o.debounceDelay,v=void 0===h?700:h,f=i(o,C);if(l)return p(z,{children:p(l,{value:c.state.value,model:c.props.data})});var g=a?a(c.state.value,c.props.data):null!==(t=f.src)&&void 0!==t?t:c.state.value,x={src:g,alt:s,fallbackSrc:m,debounceDelay:v};return p(b,{sx:{mx:"10px"},in:!!g,unmountOnExit:!0,orientation:"horizontal",children:p(z,{children:p(P,r(r(r({},f),x),{},{loading:p(w,{})}))})})}),l(c,"mergeSlots",function(e){var t=k({},m,e),o=t.imageLeft,a=t.imageRight;return null!=o&&o.mirror&&!a?(t.imageRight=r({},o),delete t.imageRight.mirror):null!=a&&a.mirror&&!o&&(t.imageLeft=r({},a),delete t.imageLeft.mirror),t}),l(c,"getLabel",function(){var e,t,r;if(c.props.label)return null!==(e=c.slots)&&void 0!==e&&e.maxLength?"".concat(c.props.label," (").concat(null!==(t=null===(r=c.state.value)||void 0===r?void 0:r.length)&&void 0!==t?t:0,"/").concat(c.slots.maxLength,")"):c.props.label}),l(c,"handleChange",function(e){c.setState({value:e.target.value})}),l(c,"handlePaste",n(s().m(function e(){var t,r;return s().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,e.n=1,navigator.clipboard.readText();case 1:t=e.v,c.setState({value:t}),e.n=3;break;case 2:e.p=2,r=e.v,console.error("Error clipboard:",r);case 3:return e.a(2)}},e,null,[[0,2]])}))),c._cachedSlots=null!==(t=c.mergeSlots(e.slots))&&void 0!==t?t:{},c.state={value:c.defaulValue},c}return e(x,c),t(x,[{key:"slots",get:function(){return this._cachedSlots}},{key:"defaulValue",get:function(){var e,t,r=this.props,o=r.data,a=r.name;return null!==(e=
|
|
1
|
+
import{inherits as e,createClass as t,objectSpread2 as r,classCallCheck as o,callSuper as a,defineProperty as l,objectWithoutProperties as i,asyncToGenerator as n,regenerator as s}from"../../_virtual/_rollupPluginBabelHelpers.js";import{jsxs as u,jsx as p,Fragment as d}from"react/jsx-runtime";import{Component as c}from"react";import{styled as m,Box as h,TextField as v,InputAdornment as f,IconButton as g,Collapse as b,CircularProgress as x}from"@mui/material";import S from"@mui/icons-material/ContentPaste";import{mergeObjects as k}from"../utils/helpers.js";import"../utils/dayjs-config.js";import"../utils/query-param.js";import{getErrorMessage as y}from"./helpers.js";import{ImageWithFallback as P}from"../components/image-with-fallback.js";import{RichTooltip as j,HelpOutlinePulseIcon as L}from"../components/rich-tooltip.js";var C=["srcGetter","element","alt","fallbackSrc","debounceDelay"],I=function(m){return function(){function x(e){var t,c;return o(this,x),c=a(this,x,[e]),l(c,"_cachedSlots",{}),l(c,"mapTextFieldProps",function(){var e,t,o,a,l=y(c.props.messageErrors,c.props.name),i={fullWidth:!0,variant:"outlined",name:null===(e=c.props.name)||void 0===e?void 0:e.toString(),error:l.error,helperText:l.message,disabled:c.props.disabled,onBlur:function(){c.props.name&&c.props.onBlur&&c.props.onBlur(c.props.name)},label:c.getLabel(),placeholder:c.props.placeholder,InputLabelProps:c.state.value?{shrink:!0}:{},value:null!==(t=c.state.value)&&void 0!==t?t:"",onChange:c.handleChange};return i.InputProps||(i.InputProps={}),i.InputProps.endAdornment=u(f,{position:"end",children:[c.slots.pastenable&&p(g,{onClick:c.handlePaste,edge:"end",children:p(S,{})}),c.slots.tooltip&&p(j,{panel:c.slots.tooltip,children:p(L,{fontSize:"small"})})]}),null!==(o=c.slots)&&void 0!==o&&o.maxLength&&(i.inputProps=r(r({},i.inputProps),{},{maxLength:c.slots.maxLength})),k({},i,null===(a=c.slots)||void 0===a?void 0:a.textFieldProps)}),l(c,"renderImageSide",function(e){var t,o="left"===e?c.slots.imageLeft:c.slots.imageRight;if(!o)return p(d,{});var a=o.srcGetter,l=o.element,n=o.alt,s=void 0===n?"input-image":n,u=o.fallbackSrc,m=void 0===u?"":u,h=o.debounceDelay,v=void 0===h?700:h,f=i(o,C);if(l)return p(z,{children:p(l,{value:c.state.value,model:c.props.data})});var g=a?a(c.state.value,c.props.data):null!==(t=f.src)&&void 0!==t?t:c.state.value,x={src:g,alt:s,fallbackSrc:m,debounceDelay:v};return p(b,{sx:{mx:"10px"},in:!!g,unmountOnExit:!0,orientation:"horizontal",children:p(z,{children:p(P,r(r(r({},f),x),{},{loading:p(w,{})}))})})}),l(c,"mergeSlots",function(e){var t=k({},m,e),o=t.imageLeft,a=t.imageRight;return null!=o&&o.mirror&&!a?(t.imageRight=r({},o),delete t.imageRight.mirror):null!=a&&a.mirror&&!o&&(t.imageLeft=r({},a),delete t.imageLeft.mirror),t}),l(c,"getLabel",function(){var e,t,r;if(c.props.label)return null!==(e=c.slots)&&void 0!==e&&e.maxLength?"".concat(c.props.label," (").concat(null!==(t=null===(r=c.state.value)||void 0===r?void 0:r.length)&&void 0!==t?t:0,"/").concat(c.slots.maxLength,")"):c.props.label}),l(c,"handleChange",function(e){c.setState({value:e.target.value})}),l(c,"handlePaste",n(s().m(function e(){var t,r;return s().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,e.n=1,navigator.clipboard.readText();case 1:t=e.v,c.setState({value:t}),e.n=3;break;case 2:e.p=2,r=e.v,console.error("Error clipboard:",r);case 3:return e.a(2)}},e,null,[[0,2]])}))),c._cachedSlots=null!==(t=c.mergeSlots(e.slots))&&void 0!==t?t:{},c.state={value:c.defaulValue},c}return e(x,c),t(x,[{key:"slots",get:function(){return this._cachedSlots}},{key:"defaulValue",get:function(){var e,t,r=this.props,o=r.data,a=r.name;return null!==(e=o&&a?null===(t=o[a])||void 0===t?void 0:t.toString():void 0)&&void 0!==e?e:this.props.defaultValue}},{key:"componentDidUpdate",value:function(e){e.slots!==this.props.slots&&(this._cachedSlots=this.mergeSlots(this.props.slots))}},{key:"shouldComponentUpdate",value:function(e){var t=this.props,r=t.name;t.slots;if(r){var o,a,l,i,n=null!==(o=null===(a=this.props.data)||void 0===a||null===(a=a[r])||void 0===a?void 0:a.toString())&&void 0!==o?o:"",s=null!==(l=null===(i=e.data)||void 0===i||null===(i=i[r])||void 0===i?void 0:i.toString())&&void 0!==l?l:"";if(n!==s)return this.setState({value:s}),!1}return e.slots,!0}},{key:"render",value:function(){var e;return u(h,{sx:{display:"flex",alignItems:"flex-start"},children:[!!this.props.disabled&&p("input",{hidden:!0,name:null===(e=this.props.name)||void 0===e?void 0:e.toString(),defaultValue:this.defaulValue}),this.renderImageSide("left"),p(v,r({},this.mapTextFieldProps())),this.renderImageSide("right")]})}}])}()},w=function(){return p("div",{children:p(x,{size:24})})},z=m(h)({fontSize:"1rem",height:"var(--input-base-image-size, 54px)",width:"var(--input-base-image-size, 54px)",position:"relative",borderRadius:"8px",boxShadow:"rgba(0, 0, 0, 0.16) 0px 1px 4px",overflow:"hidden","& > img":{position:"absolute",top:0,left:0,backgroundRepeat:"no-repeat",height:"100%",width:"100%",backgroundSize:"contain"},"& > div":{position:"absolute",top:0,left:0,height:"100%",width:"100%",background:"#fafafa",zIndex:1,display:"flex",alignItems:"center",justifyContent:"center"}});export{I as default};
|
|
2
2
|
//# sourceMappingURL=create.input.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.input.js","sources":["../../../src/form/create.input.tsx"],"sourcesContent":["import React, { Component, ComponentType, FC } from 'react'\r\nimport { Box, CircularProgress, Collapse, IconButton, InputAdornment, styled, TextField, TextFieldProps } from '@mui/material'\r\nimport ContentPasteIcon from '@mui/icons-material/ContentPaste'\r\nimport { mergeObjects } from '../utils'\r\nimport { IFormInputBase } from './types'\r\nimport { getErrorMessage } from './helpers'\r\nimport { ImageWithFallback, IImageWithFallbackPropsOwner } from '../components/image-with-fallback'\r\nimport { IRichTooltipPanelConfig, RichTooltip, HelpOutlinePulseIcon } from '../components/rich-tooltip'\r\n\r\nexport interface InputBaseImage<T> extends Partial<IImageWithFallbackPropsOwner> {\r\n srcGetter?: (value: any, model?: Partial<T>) => string\r\n element?: React.ComponentType<{ value: any; model?: Partial<T> }>\r\n mirror?: boolean\r\n}\r\n\r\nexport interface IInputSlots<T> {\r\n maxLength?: number\r\n textFieldProps?: TextFieldProps\r\n pastenable?: boolean\r\n imageLeft?: InputBaseImage<T>\r\n imageRight?: InputBaseImage<T>\r\n tooltip?: IRichTooltipPanelConfig\r\n}\r\n\r\nexport interface IInputProps<T> extends IFormInputBase<T, IInputSlots<T>> {}\r\n\r\nexport interface IInputState {\r\n value?: string\r\n}\r\n\r\nexport interface IInputParams<T> extends IInputSlots<T> {}\r\n\r\nconst createInput = function <T>(params?: IInputParams<T>): ComponentType<IInputProps<T>> {\r\n class InputBase extends Component<IInputProps<T>, IInputState> {\r\n private _cachedSlots: IInputSlots<T> = {}\r\n constructor(props: IInputProps<T>) {\r\n super(props)\r\n this._cachedSlots = this.mergeSlots(props.slots) ?? {}\r\n this.state = { value: this.defaulValue }\r\n }\r\n\r\n get slots() {\r\n return this._cachedSlots\r\n }\r\n\r\n get defaulValue(): string {\r\n const { data, name } = this.props\r\n return this.props.defaultValue ?? (!!data && !!name ? data[name]?.toString() : undefined)\r\n }\r\n\r\n componentDidUpdate(prevProps: IInputProps<T>) {\r\n if (prevProps.slots !== this.props.slots) {\r\n this._cachedSlots = this.mergeSlots(this.props.slots)\r\n }\r\n }\r\n\r\n shouldComponentUpdate(nextProps: Readonly<IInputProps<T>>): boolean {\r\n const { name, slots } = this.props\r\n if (!!name) {\r\n const currentDataValue = this.props.data?.[name]?.toString() ?? ''\r\n const nextDataValue = nextProps.data?.[name]?.toString() ?? ''\r\n if (currentDataValue !== nextDataValue) {\r\n this.setState({ value: nextDataValue })\r\n return false\r\n }\r\n }\r\n\r\n if (slots !== nextProps.slots) {\r\n return true\r\n }\r\n return true\r\n }\r\n\r\n mapTextFieldProps = (): TextFieldProps => {\r\n const errorMessage = getErrorMessage(this.props.messageErrors, this.props.name)\r\n const tfp: TextFieldProps = {\r\n fullWidth: true,\r\n variant: 'outlined',\r\n name: this.props.name?.toString(),\r\n error: errorMessage.error,\r\n helperText: errorMessage.message,\r\n disabled: this.props.disabled,\r\n onBlur: () => {\r\n if (!this.props.name) return\r\n this.props.onBlur && this.props.onBlur(this.props.name)\r\n },\r\n label: this.getLabel(),\r\n placeholder: this.props.placeholder,\r\n InputLabelProps: !!this.state.value ? { shrink: true } : {},\r\n value: this.state.value ?? '',\r\n onChange: this.handleChange\r\n }\r\n if (!tfp.InputProps) tfp.InputProps = {}\r\n tfp.InputProps.endAdornment = (\r\n <InputAdornment position='end'>\r\n {this.slots.pastenable && (\r\n <IconButton onClick={this.handlePaste} edge='end'>\r\n <ContentPasteIcon />\r\n </IconButton>\r\n )}\r\n {this.slots.tooltip && (\r\n <RichTooltip panel={this.slots.tooltip}>\r\n <HelpOutlinePulseIcon fontSize='small' />\r\n </RichTooltip>\r\n )}\r\n </InputAdornment>\r\n )\r\n if (this.slots?.maxLength) tfp.inputProps = { ...tfp.inputProps, maxLength: this.slots.maxLength }\r\n return mergeObjects<TextFieldProps>({}, tfp, this.slots?.textFieldProps)\r\n }\r\n\r\n //#region Render\r\n render() {\r\n return (\r\n <Box sx={{ display: 'flex', alignItems: 'flex-start' }}>\r\n {!!this.props.disabled && <input hidden name={this.props.name?.toString()} defaultValue={this.defaulValue} />}\r\n {this.renderImageSide('left')}\r\n <TextField {...this.mapTextFieldProps()} />\r\n {this.renderImageSide('right')}\r\n </Box>\r\n )\r\n }\r\n\r\n renderImageSide = (side: 'left' | 'right') => {\r\n const image = side === 'left' ? this.slots.imageLeft : this.slots.imageRight\r\n if (!image) return <></>\r\n const { srcGetter, element, alt = 'input-image', fallbackSrc = '', debounceDelay = 700, ...imageOther } = image\r\n if (element) {\r\n const Element = element\r\n return (\r\n <WrapImage>\r\n <Element value={this.state.value} model={this.props.data} />\r\n </WrapImage>\r\n )\r\n }\r\n const src = srcGetter ? srcGetter(this.state.value, this.props.data) : imageOther.src ?? this.state.value\r\n const imageProps: IImageWithFallbackPropsOwner = { src, alt, fallbackSrc, debounceDelay }\r\n return (\r\n <Collapse sx={{ mx: '10px' }} in={!!src} unmountOnExit orientation='horizontal'>\r\n <WrapImage>\r\n <ImageWithFallback {...imageOther} {...imageProps} loading={<LoadingCircularProgress />} />\r\n </WrapImage>\r\n </Collapse>\r\n )\r\n }\r\n //#endregion\r\n\r\n private mergeSlots = (currentSlots?: IInputSlots<T>): IInputSlots<T> => {\r\n const base = mergeObjects<IInputSlots<T>>({}, params, currentSlots)\r\n const { imageLeft, imageRight } = base\r\n\r\n // mirror from left to right\r\n if (imageLeft?.mirror && !imageRight) {\r\n base.imageRight = { ...imageLeft }\r\n delete base.imageRight.mirror\r\n }\r\n // mirror from right to left\r\n else if (imageRight?.mirror && !imageLeft) {\r\n base.imageLeft = { ...imageRight }\r\n delete base.imageLeft.mirror\r\n }\r\n\r\n return base\r\n }\r\n\r\n getLabel = () => {\r\n if (!this.props.label) return\r\n if (!this.slots?.maxLength) return this.props.label\r\n return `${this.props.label} (${this.state.value?.length ?? 0}/${this.slots.maxLength})`\r\n }\r\n\r\n handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n this.setState({ value: event.target.value })\r\n }\r\n\r\n handlePaste = async () => {\r\n try {\r\n const clipboardText = await navigator.clipboard.readText()\r\n this.setState({ value: clipboardText })\r\n } catch (error) {\r\n console.error('Error clipboard:', error)\r\n }\r\n }\r\n }\r\n return InputBase\r\n}\r\n\r\nexport default createInput\r\n\r\n// export type InputTextType<T> = ReturnType<typeof CreateInputBase<T>>\r\n\r\nconst LoadingCircularProgress: FC = () => (\r\n <div>\r\n <CircularProgress size={24} />\r\n </div>\r\n)\r\n\r\nconst WrapImage = styled(Box)({\r\n fontSize: '1rem',\r\n height: 'var(--input-base-image-size, 54px)',\r\n width: 'var(--input-base-image-size, 54px)',\r\n position: 'relative',\r\n borderRadius: '8px',\r\n boxShadow: 'rgba(0, 0, 0, 0.16) 0px 1px 4px',\r\n overflow: 'hidden',\r\n '& > img': {\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n backgroundRepeat: 'no-repeat',\r\n height: '100%',\r\n width: '100%',\r\n backgroundSize: 'contain'\r\n },\r\n '& > div': {\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n height: '100%',\r\n width: '100%',\r\n background: '#fafafa',\r\n zIndex: 1,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center'\r\n }\r\n})\r\n"],"names":["createInput","params","InputBase","props","_this$mergeSlots","_this","_classCallCheck","_callSuper","_defineProperty","_this$props$name","_this$state$value","_this$slots","_this$slots2","errorMessage","getErrorMessage","messageErrors","name","tfp","fullWidth","variant","toString","error","helperText","message","disabled","onBlur","label","getLabel","placeholder","InputLabelProps","state","value","shrink","onChange","handleChange","InputProps","endAdornment","_jsxs","InputAdornment","position","children","slots","pastenable","_jsx","IconButton","onClick","handlePaste","edge","ContentPasteIcon","tooltip","RichTooltip","panel","HelpOutlinePulseIcon","fontSize","maxLength","inputProps","_objectSpread","mergeObjects","textFieldProps","side","_imageOther$src","image","imageLeft","imageRight","srcGetter","element","_image$alt","alt","_image$fallbackSrc","fallbackSrc","_image$debounceDelay","debounceDelay","imageOther","_objectWithoutProperties","_excluded","WrapImage","model","data","src","imageProps","Collapse","sx","mx","in","unmountOnExit","orientation","ImageWithFallback","loading","LoadingCircularProgress","currentSlots","base","mirror","_this$slots3","_this$state$value$len","_this$state$value2","concat","length","event","setState","target","_asyncToGenerator","_regenerator","m","_callee","clipboardText","_t","w","_context","p","n","navigator","clipboard","readText","v","console","a","_cachedSlots","mergeSlots","defaulValue","_inherits","Component","_createClass","key","get","this","_this$props$defaultVa","_data$name","_this$props","defaultValue","undefined","prevProps","nextProps","_this$props2","_this$props$data$name","_this$props$data","_nextProps$data$name$","_nextProps$data","currentDataValue","nextDataValue","_this$props$name2","Box","display","alignItems","hidden","renderImageSide","TextField","mapTextFieldProps","CircularProgress","size","styled","height","width","borderRadius","boxShadow","overflow","top","left","backgroundRepeat","backgroundSize","background","zIndex","justifyContent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"create.input.js","sources":["../../../src/form/create.input.tsx"],"sourcesContent":["import React, { Component, ComponentType, FC } from 'react'\r\nimport { Box, CircularProgress, Collapse, IconButton, InputAdornment, styled, TextField, TextFieldProps } from '@mui/material'\r\nimport ContentPasteIcon from '@mui/icons-material/ContentPaste'\r\nimport { mergeObjects } from '../utils'\r\nimport { IFormInputBase } from './types'\r\nimport { getErrorMessage } from './helpers'\r\nimport { ImageWithFallback, IImageWithFallbackPropsOwner } from '../components/image-with-fallback'\r\nimport { IRichTooltipPanelConfig, RichTooltip, HelpOutlinePulseIcon } from '../components/rich-tooltip'\r\n\r\nexport interface InputBaseImage<T> extends Partial<IImageWithFallbackPropsOwner> {\r\n srcGetter?: (value: any, model?: Partial<T>) => string\r\n element?: React.ComponentType<{ value: any; model?: Partial<T> }>\r\n mirror?: boolean\r\n}\r\n\r\nexport interface IInputSlots<T> {\r\n maxLength?: number\r\n textFieldProps?: TextFieldProps\r\n pastenable?: boolean\r\n imageLeft?: InputBaseImage<T>\r\n imageRight?: InputBaseImage<T>\r\n tooltip?: IRichTooltipPanelConfig\r\n}\r\n\r\nexport interface IInputProps<T> extends IFormInputBase<T, IInputSlots<T>> {}\r\n\r\nexport interface IInputState {\r\n value?: string\r\n}\r\n\r\nexport interface IInputParams<T> extends IInputSlots<T> {}\r\n\r\nconst createInput = function <T>(params?: IInputParams<T>): ComponentType<IInputProps<T>> {\r\n class InputBase extends Component<IInputProps<T>, IInputState> {\r\n private _cachedSlots: IInputSlots<T> = {}\r\n constructor(props: IInputProps<T>) {\r\n super(props)\r\n this._cachedSlots = this.mergeSlots(props.slots) ?? {}\r\n this.state = { value: this.defaulValue }\r\n }\r\n\r\n get slots() {\r\n return this._cachedSlots\r\n }\r\n\r\n get defaulValue(): string {\r\n const { data, name } = this.props\r\n return (!!data && !!name ? data[name]?.toString() : undefined) ?? this.props.defaultValue\r\n }\r\n\r\n componentDidUpdate(prevProps: IInputProps<T>) {\r\n if (prevProps.slots !== this.props.slots) {\r\n this._cachedSlots = this.mergeSlots(this.props.slots)\r\n }\r\n }\r\n\r\n shouldComponentUpdate(nextProps: Readonly<IInputProps<T>>): boolean {\r\n const { name, slots } = this.props\r\n if (!!name) {\r\n const currentDataValue = this.props.data?.[name]?.toString() ?? ''\r\n const nextDataValue = nextProps.data?.[name]?.toString() ?? ''\r\n if (currentDataValue !== nextDataValue) {\r\n this.setState({ value: nextDataValue })\r\n return false\r\n }\r\n }\r\n\r\n if (slots !== nextProps.slots) {\r\n return true\r\n }\r\n return true\r\n }\r\n\r\n mapTextFieldProps = (): TextFieldProps => {\r\n const errorMessage = getErrorMessage(this.props.messageErrors, this.props.name)\r\n const tfp: TextFieldProps = {\r\n fullWidth: true,\r\n variant: 'outlined',\r\n name: this.props.name?.toString(),\r\n error: errorMessage.error,\r\n helperText: errorMessage.message,\r\n disabled: this.props.disabled,\r\n onBlur: () => {\r\n if (!this.props.name) return\r\n this.props.onBlur && this.props.onBlur(this.props.name)\r\n },\r\n label: this.getLabel(),\r\n placeholder: this.props.placeholder,\r\n InputLabelProps: !!this.state.value ? { shrink: true } : {},\r\n value: this.state.value ?? '',\r\n onChange: this.handleChange\r\n }\r\n if (!tfp.InputProps) tfp.InputProps = {}\r\n tfp.InputProps.endAdornment = (\r\n <InputAdornment position='end'>\r\n {this.slots.pastenable && (\r\n <IconButton onClick={this.handlePaste} edge='end'>\r\n <ContentPasteIcon />\r\n </IconButton>\r\n )}\r\n {this.slots.tooltip && (\r\n <RichTooltip panel={this.slots.tooltip}>\r\n <HelpOutlinePulseIcon fontSize='small' />\r\n </RichTooltip>\r\n )}\r\n </InputAdornment>\r\n )\r\n if (this.slots?.maxLength) tfp.inputProps = { ...tfp.inputProps, maxLength: this.slots.maxLength }\r\n return mergeObjects<TextFieldProps>({}, tfp, this.slots?.textFieldProps)\r\n }\r\n\r\n //#region Render\r\n render() {\r\n return (\r\n <Box sx={{ display: 'flex', alignItems: 'flex-start' }}>\r\n {!!this.props.disabled && <input hidden name={this.props.name?.toString()} defaultValue={this.defaulValue} />}\r\n {this.renderImageSide('left')}\r\n <TextField {...this.mapTextFieldProps()} />\r\n {this.renderImageSide('right')}\r\n </Box>\r\n )\r\n }\r\n\r\n renderImageSide = (side: 'left' | 'right') => {\r\n const image = side === 'left' ? this.slots.imageLeft : this.slots.imageRight\r\n if (!image) return <></>\r\n const { srcGetter, element, alt = 'input-image', fallbackSrc = '', debounceDelay = 700, ...imageOther } = image\r\n if (element) {\r\n const Element = element\r\n return (\r\n <WrapImage>\r\n <Element value={this.state.value} model={this.props.data} />\r\n </WrapImage>\r\n )\r\n }\r\n const src = srcGetter ? srcGetter(this.state.value, this.props.data) : imageOther.src ?? this.state.value\r\n const imageProps: IImageWithFallbackPropsOwner = { src, alt, fallbackSrc, debounceDelay }\r\n return (\r\n <Collapse sx={{ mx: '10px' }} in={!!src} unmountOnExit orientation='horizontal'>\r\n <WrapImage>\r\n <ImageWithFallback {...imageOther} {...imageProps} loading={<LoadingCircularProgress />} />\r\n </WrapImage>\r\n </Collapse>\r\n )\r\n }\r\n //#endregion\r\n\r\n private mergeSlots = (currentSlots?: IInputSlots<T>): IInputSlots<T> => {\r\n const base = mergeObjects<IInputSlots<T>>({}, params, currentSlots)\r\n const { imageLeft, imageRight } = base\r\n\r\n // mirror from left to right\r\n if (imageLeft?.mirror && !imageRight) {\r\n base.imageRight = { ...imageLeft }\r\n delete base.imageRight.mirror\r\n }\r\n // mirror from right to left\r\n else if (imageRight?.mirror && !imageLeft) {\r\n base.imageLeft = { ...imageRight }\r\n delete base.imageLeft.mirror\r\n }\r\n\r\n return base\r\n }\r\n\r\n getLabel = () => {\r\n if (!this.props.label) return\r\n if (!this.slots?.maxLength) return this.props.label\r\n return `${this.props.label} (${this.state.value?.length ?? 0}/${this.slots.maxLength})`\r\n }\r\n\r\n handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n this.setState({ value: event.target.value })\r\n }\r\n\r\n handlePaste = async () => {\r\n try {\r\n const clipboardText = await navigator.clipboard.readText()\r\n this.setState({ value: clipboardText })\r\n } catch (error) {\r\n console.error('Error clipboard:', error)\r\n }\r\n }\r\n }\r\n return InputBase\r\n}\r\n\r\nexport default createInput\r\n\r\n// export type InputTextType<T> = ReturnType<typeof CreateInputBase<T>>\r\n\r\nconst LoadingCircularProgress: FC = () => (\r\n <div>\r\n <CircularProgress size={24} />\r\n </div>\r\n)\r\n\r\nconst WrapImage = styled(Box)({\r\n fontSize: '1rem',\r\n height: 'var(--input-base-image-size, 54px)',\r\n width: 'var(--input-base-image-size, 54px)',\r\n position: 'relative',\r\n borderRadius: '8px',\r\n boxShadow: 'rgba(0, 0, 0, 0.16) 0px 1px 4px',\r\n overflow: 'hidden',\r\n '& > img': {\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n backgroundRepeat: 'no-repeat',\r\n height: '100%',\r\n width: '100%',\r\n backgroundSize: 'contain'\r\n },\r\n '& > div': {\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n height: '100%',\r\n width: '100%',\r\n background: '#fafafa',\r\n zIndex: 1,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center'\r\n }\r\n})\r\n"],"names":["createInput","params","InputBase","props","_this$mergeSlots","_this","_classCallCheck","_callSuper","_defineProperty","_this$props$name","_this$state$value","_this$slots","_this$slots2","errorMessage","getErrorMessage","messageErrors","name","tfp","fullWidth","variant","toString","error","helperText","message","disabled","onBlur","label","getLabel","placeholder","InputLabelProps","state","value","shrink","onChange","handleChange","InputProps","endAdornment","_jsxs","InputAdornment","position","children","slots","pastenable","_jsx","IconButton","onClick","handlePaste","edge","ContentPasteIcon","tooltip","RichTooltip","panel","HelpOutlinePulseIcon","fontSize","maxLength","inputProps","_objectSpread","mergeObjects","textFieldProps","side","_imageOther$src","image","imageLeft","imageRight","srcGetter","element","_image$alt","alt","_image$fallbackSrc","fallbackSrc","_image$debounceDelay","debounceDelay","imageOther","_objectWithoutProperties","_excluded","WrapImage","model","data","src","imageProps","Collapse","sx","mx","in","unmountOnExit","orientation","ImageWithFallback","loading","LoadingCircularProgress","currentSlots","base","mirror","_this$slots3","_this$state$value$len","_this$state$value2","concat","length","event","setState","target","_asyncToGenerator","_regenerator","m","_callee","clipboardText","_t","w","_context","p","n","navigator","clipboard","readText","v","console","a","_cachedSlots","mergeSlots","defaulValue","_inherits","Component","_createClass","key","get","this","_ref2","_data$name","_this$props","undefined","defaultValue","prevProps","nextProps","_this$props2","_this$props$data$name","_this$props$data","_nextProps$data$name$","_nextProps$data","currentDataValue","nextDataValue","_this$props$name2","Box","display","alignItems","hidden","renderImageSide","TextField","mapTextFieldProps","CircularProgress","size","styled","height","width","borderRadius","boxShadow","overflow","top","left","backgroundRepeat","backgroundSize","background","zIndex","justifyContent"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{objectWithoutProperties as r,objectSpread2 as e,asyncToGenerator as o,regenerator as n}from"../../_virtual/_rollupPluginBabelHelpers.js";import{jsxs as t,jsx as i}from"react/jsx-runtime";import{useRef as a,useEffect as l}from"react";import{styled as s,Box as u,Typography as d,Grid as c,Button as f}from"@mui/material";import{getErrorMessage as m}from"./helpers.js";import{getFormFields as p,getFormValidators as v,getFormPreSubmit as b,isFormRegistered as g}from"./decorator.js";import h from"./validator.js";import x from"./create.
|
|
1
|
+
import{objectWithoutProperties as r,objectSpread2 as e,asyncToGenerator as o,regenerator as n}from"../../_virtual/_rollupPluginBabelHelpers.js";import{jsxs as t,jsx as i}from"react/jsx-runtime";import{useRef as a,useEffect as l}from"react";import{styled as s,Box as u,Typography as d,Grid as c,Button as f}from"@mui/material";import{getErrorMessage as m}from"./helpers.js";import{getFormFields as p,getFormValidators as v,getFormPreSubmit as b,isFormRegistered as g}from"./decorator.js";import h from"./validator.js";import x from"./create.form-base.js";import y from"./create.input.js";var C=["type","renderInput"],S=["disabled","visible","size"],j=x({}),E=y({}),w=function(o){var n,a,l=o.type,s=o.renderInput,u=r(o,C),d=(null===(n=u.name)||void 0===n?void 0:n.toString())||"",c=(null===(a=u.data)||void 0===a?void 0:a[d])||u.defaultValue;return j.mapContext(function(r){var o=r.messageErrors,n=r.onBlur,a=m(r.messageErrors,u.name);if(s)return i(s,e(e({},u),{},{messageErrors:o,onBlur:n,formContext:r}));switch(l){case String:return i(E,e(e({},u),{},{messageErrors:o,onBlur:n,formContext:r}));case Number:return i(E,e(e({},u),{},{slots:e({textFieldProps:{type:"number"}},u.slots),messageErrors:o,onBlur:n,formContext:r}));case Boolean:return t("div",{children:[t("label",{children:[u.label||d,": "]}),i("input",{name:d,type:"checkbox",defaultChecked:c}),i("span",{style:{color:"red"},children:a.error?a.message:""})]});default:return t("div",{children:["Unsupported field type for ",d]})}})},B=function(s){var m,x,y=s.slots,C=p(s.configClass),E=v(s.configClass),B=b(s.configClass),k=a(null);if(!g(s.configClass)){var P,z=(null===(P=s.configClass)||void 0===P?void 0:P.name)||"Unknown";return t(u,{sx:{border:"1px dashed #ccc",padding:12,borderRadius:4,color:"#333",background:"#fafafa"},children:[i(d,{variant:"subtitle1",sx:{fontWeight:600,marginBottom:6},children:"Form configuration not registered"}),t(d,{variant:"body1",children:['Configuration for "',z,'" was not found. Did you forget to add ',i("code",{children:"@registerForm"})," to the class?"]})]})}var I=function(){var r=o(n().m(function r(e){var o,t,i,a;return n().w(function(r){for(;;)switch(r.p=r.n){case 0:if(o=new AbortController,k.current=o,t=o.signal,i=e,r.p=1,null==B||!B.handler){r.n=3;break}return r.n=2,B.handler(e,s.data);case 2:null==(i=r.v)&&(i=e);case 3:if(!s.onSubmit){r.n=4;break}return r.n=4,s.onSubmit(i,t);case 4:r.n=6;break;case 5:throw r.p=5,a=r.v,s.onError&&s.onError(a),a;case 6:return r.a(2)}},r,null,[[1,5]])}));return function(e){return r.apply(this,arguments)}}();return l(function(){return function(){var r;null===(r=k.current)||void 0===r||r.abort()}},[]),t(j.Form,{onSubmit:I,validate:new h(E),onError:s.onSubmitError,slots:null==y?void 0:y.formBase,children:[null===(m=s.slots)||void 0===m?void 0:m.top,i(c,{container:!0,spacing:2,children:C.map(function(o){var n=o.disabled,t=o.visible,a=o.size,l=r(o,S);if(!("function"==typeof t?t(s.data):!1!==t))return null;var u="function"==typeof n?n(s.data):!0===n;return i(c,e(e({item:!0,xs:12},a),{},{children:i(w,e(e({data:s.data},l),{},{disabled:u}))}),o.name.toString())})}),function(){var r,o;if(!1===(null==y?void 0:y.isFooter))return null;if(null!=y&&y.footer){var n=y.footer;return i(n,{})}return t(F,e(e({},null==y?void 0:y.footerProps),{},{children:[null==y||null===(r=y.footerSlots)||void 0===r?void 0:r.before,i(f,{variant:"contained",color:"primary",type:"submit",size:"small",sx:{flex:"0 0 auto"},children:"Submit"}),null==y||null===(o=y.footerSlots)||void 0===o?void 0:o.after]}))}(),null===(x=s.slots)||void 0===x?void 0:x.bottom]})},k=function(r,o){return function(n){return i(B,e(e({configClass:r},o),n))}},F=s(u)(function(r){return{display:"flex",justifyContent:"flex-end",padding:r.theme.spacing(1,0)}});export{w as DecoratorField,B as DecoratorForm,k as createDecoratorForm,B as default};
|
|
2
2
|
//# sourceMappingURL=decorator.form.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorator.form.js","sources":["../../../src/form/decorator.form.tsx"],"sourcesContent":["import { ComponentType, FC, useEffect, useRef } from 'react'\r\nimport { Box, BoxProps, Button, Grid, styled, Typography } from '@mui/material'\r\nimport { IFormInputBase } from './types'\r\nimport { getErrorMessage } from './helpers'\r\nimport { getFormFields, getFormPreSubmit, getFormValidators, isFormRegistered } from './decorator'\r\nimport FormValidator, { IPartialError } from './validator'\r\nimport createInput from './create.input'\r\nimport createFormBase, { IFormBaseSlots } from './create.form-base'\r\n\r\nconst FormBase = createFormBase<any>({})\r\nconst InputInstance = createInput<any>({})\r\n\r\nexport interface IDecoratorFieldProps<T = any> extends IFormInputBase<T> {\r\n type?: any\r\n visible?: boolean | ((data: T) => boolean)\r\n renderInput?: ComponentType<IFormInputBase<T>>\r\n}\r\n\r\nexport const DecoratorField: FC<IDecoratorFieldProps> = ({ type: inputType, renderInput, ...props }) => {\r\n const name = props.name?.toString() || ''\r\n const defaultValue = props.data?.[name] || props.defaultValue\r\n\r\n return FormBase.mapContext((context) => {\r\n const { messageErrors, onBlur } = context\r\n const err = getErrorMessage(context.messageErrors, props.name as any)\r\n if (renderInput) {\r\n const InputComp = renderInput\r\n return <InputComp {...props} messageErrors={messageErrors} onBlur={onBlur} formContext={context} />\r\n }\r\n switch (inputType) {\r\n case String:\r\n return <InputInstance {...props} messageErrors={messageErrors} onBlur={onBlur} formContext={context} />\r\n case Number:\r\n return (\r\n <InputInstance\r\n {...props}\r\n slots={{ textFieldProps: { type: 'number' }, ...props.slots }}\r\n messageErrors={messageErrors}\r\n onBlur={onBlur}\r\n formContext={context}\r\n />\r\n )\r\n case Boolean:\r\n return (\r\n <div>\r\n <label>{props.label || name}: </label>\r\n <input name={name} type='checkbox' defaultChecked={defaultValue} />\r\n <span style={{ color: 'red' }}>{err.error ? err.message : ''}</span>\r\n </div>\r\n )\r\n default:\r\n return <div>Unsupported field type for {name}</div>\r\n }\r\n })\r\n}\r\n\r\nexport interface IDecoratorFormSlots {\r\n top?: React.ReactNode\r\n bottom?: React.ReactNode\r\n isFooter?: React.ReactNode | boolean\r\n formBase?: IFormBaseSlots\r\n footer?: ComponentType<any>\r\n footerProps?: BoxProps & { [key: string]: any }\r\n footerSlots?: { after?: React.ReactNode; before?: React.ReactNode }\r\n}\r\n\r\nexport interface IDecoratorFormProps<T = any> {\r\n configClass: any\r\n data?: Partial<T>\r\n onSubmit?: (data: Partial<T>, signal?: AbortSignal) => Promise<void>\r\n onError?: (error: any) => void\r\n onSubmitError?: (error: IPartialError<T>) => void\r\n slots?: IDecoratorFormSlots\r\n}\r\n\r\nexport const DecoratorForm: FC<IDecoratorFormProps> = (props) => {\r\n const { slots } = props\r\n const fields = getFormFields(props.configClass)\r\n const validators = getFormValidators(props.configClass)\r\n const preSubmitConfig = getFormPreSubmit(props.configClass)\r\n const abortControllerRef = useRef<AbortController | null>(null)\r\n\r\n // If the provided configClass isn't registered via @registerForm,\r\n // show a simple, friendly error UI instead of throwing.\r\n if (!isFormRegistered(props.configClass)) {\r\n const name = props.configClass?.name || 'Unknown'\r\n return (\r\n <Box sx={{ border: '1px dashed #ccc', padding: 12, borderRadius: 4, color: '#333', background: '#fafafa' }}>\r\n <Typography variant='subtitle1' sx={{ fontWeight: 600, marginBottom: 6 }}>\r\n Form configuration not registered\r\n </Typography>\r\n <Typography variant='body1'>\r\n Configuration for \"{name}\" was not found. Did you forget to add <code>@registerForm</code> to the class?\r\n </Typography>\r\n </Box>\r\n )\r\n }\r\n\r\n const handleSubmit = async (data: any) => {\r\n // Create new AbortController for this submit\r\n abortControllerRef.current = new AbortController()\r\n const signal = abortControllerRef.current.signal\r\n\r\n let processedData = data\r\n try {\r\n // Execute presubmit handler if exists\r\n if (preSubmitConfig?.handler) {\r\n processedData = await preSubmitConfig.handler(data, props.data)\r\n // If handler returns null/undefined, use original data\r\n if (processedData === null || processedData === undefined) {\r\n processedData = data\r\n }\r\n }\r\n\r\n // Call the original onSubmit with processed data and abort signal\r\n if (props.onSubmit) {\r\n await props.onSubmit(processedData, signal)\r\n }\r\n } catch (error) {\r\n if (props.onError) {\r\n props.onError(error)\r\n }\r\n throw error\r\n }\r\n }\r\n\r\n const renderFooter = () => {\r\n if (slots?.isFooter === false) return null\r\n if (slots?.footer) {\r\n const FooterComponent = slots.footer\r\n return <FooterComponent />\r\n }\r\n return (\r\n <FooterStyled {...slots?.footerProps}>\r\n {slots?.footerSlots?.before}\r\n <Button variant='contained' color='primary' type='submit' sx={{ flex: '0 0 auto' }}>\r\n Submit\r\n </Button>\r\n {slots?.footerSlots?.after}\r\n </FooterStyled>\r\n )\r\n }\r\n\r\n useEffect(() => {\r\n return () => {\r\n // Abort any pending request when component unmounts\r\n abortControllerRef.current?.abort()\r\n }\r\n }, [])\r\n\r\n return (\r\n <FormBase.Form onSubmit={handleSubmit} validate={new FormValidator(validators)} onError={props.onSubmitError} slots={slots?.formBase}>\r\n {props.slots?.top}\r\n <Grid container spacing={2}>\r\n {fields.map((field) => {\r\n const { disabled, visible, ...fieldOther } = field\r\n // Check visibility, default is visible (true or undefined)\r\n const isVisible = typeof visible === 'function' ? visible(props.data) : visible !== false\r\n if (!isVisible) return null\r\n // Check disabled state, default is enabled (false or undefined)\r\n const isDisabled = typeof disabled === 'function' ? disabled(props.data) : disabled === true\r\n return (\r\n <Grid item key={field.name.toString()} xs={12} {...field.size}>\r\n <DecoratorField data={props.data} {...fieldOther} disabled={isDisabled} />\r\n </Grid>\r\n )\r\n })}\r\n </Grid>\r\n {renderFooter()}\r\n {props.slots?.bottom}\r\n </FormBase.Form>\r\n )\r\n}\r\nexport default DecoratorForm\r\n\r\nexport const createDecoratorForm = function <T>(\r\n configClass: any,\r\n params?: Partial<Omit<IDecoratorFormProps<T>, 'configClass'>>\r\n): ComponentType<Omit<IDecoratorFormProps<T>, 'configClass'>> {\r\n const DecoratorFormComp: FC<Omit<IDecoratorFormProps<T>, 'configClass'>> = (props) => {\r\n return <DecoratorForm configClass={configClass} {...params} {...props} />\r\n }\r\n return DecoratorFormComp\r\n}\r\n\r\nconst FooterStyled = styled(Box)(({ theme }) => ({\r\n display: 'flex',\r\n justifyContent: 'flex-end',\r\n padding: theme.spacing(1, 0)\r\n}))\r\n"],"names":["FormBase","createFormBase","InputInstance","createInput","DecoratorField","_ref","_props$name","_props$data","inputType","type","renderInput","props","_objectWithoutProperties","_excluded","name","toString","defaultValue","data","mapContext","context","messageErrors","onBlur","err","getErrorMessage","_jsx","_objectSpread","formContext","String","Number","slots","textFieldProps","Boolean","_jsxs","children","label","defaultChecked","style","color","error","message","DecoratorForm","_props$slots","_props$slots2","fields","getFormFields","configClass","validators","getFormValidators","preSubmitConfig","getFormPreSubmit","abortControllerRef","useRef","isFormRegistered","_props$configClass","Box","sx","border","padding","borderRadius","background","Typography","variant","fontWeight","marginBottom","handleSubmit","_ref2","_asyncToGenerator","_regenerator","m","_callee","signal","processedData","_t","w","_context","p","n","current","AbortController","handler","v","onSubmit","onError","a","_x","apply","this","arguments","useEffect","_abortControllerRef$c","abort","Form","validate","FormValidator","onSubmitError","formBase","top","Grid","container","spacing","map","field","disabled","visible","fieldOther","_excluded2","isDisabled","item","xs","size","_slots$footerSlots","_slots$footerSlots2","isFooter","footer","FooterComponent","FooterStyled","footerProps","footerSlots","before","Button","flex","after","renderFooter","bottom","createDecoratorForm","params","styled","_ref3","display","justifyContent","theme"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"decorator.form.js","sources":["../../../src/form/decorator.form.tsx"],"sourcesContent":["import { ComponentType, FC, useEffect, useRef } from 'react'\r\nimport { Box, BoxProps, Button, Grid, styled, Typography } from '@mui/material'\r\nimport { IFormInputBase } from './types'\r\nimport { getErrorMessage } from './helpers'\r\nimport { getFormFields, getFormPreSubmit, getFormValidators, isFormRegistered } from './decorator'\r\nimport FormValidator, { IPartialError } from './validator'\r\nimport createFormBase, { IFormBaseSlots } from './create.form-base'\r\nimport createInput from './create.input'\r\n\r\nconst FormBase = createFormBase<any>({})\r\nconst InputInstance = createInput<any>({})\r\n\r\nexport interface IDecoratorFieldProps<T = any> extends IFormInputBase<T> {\r\n type?: any\r\n visible?: boolean | ((data: T) => boolean)\r\n renderInput?: ComponentType<IFormInputBase<T>>\r\n}\r\n\r\nexport const DecoratorField: FC<IDecoratorFieldProps> = ({ type: inputType, renderInput, ...props }) => {\r\n const name = props.name?.toString() || ''\r\n const defaultValue = props.data?.[name] || props.defaultValue\r\n\r\n return FormBase.mapContext((context) => {\r\n const { messageErrors, onBlur } = context\r\n const err = getErrorMessage(context.messageErrors, props.name as any)\r\n if (renderInput) {\r\n const InputComp = renderInput\r\n return <InputComp {...props} messageErrors={messageErrors} onBlur={onBlur} formContext={context} />\r\n }\r\n switch (inputType) {\r\n case String:\r\n return <InputInstance {...props} messageErrors={messageErrors} onBlur={onBlur} formContext={context} />\r\n case Number:\r\n return (\r\n <InputInstance\r\n {...props}\r\n slots={{ textFieldProps: { type: 'number' }, ...props.slots }}\r\n messageErrors={messageErrors}\r\n onBlur={onBlur}\r\n formContext={context}\r\n />\r\n )\r\n case Boolean:\r\n return (\r\n <div>\r\n <label>{props.label || name}: </label>\r\n <input name={name} type='checkbox' defaultChecked={defaultValue} />\r\n <span style={{ color: 'red' }}>{err.error ? err.message : ''}</span>\r\n </div>\r\n )\r\n default:\r\n return <div>Unsupported field type for {name}</div>\r\n }\r\n })\r\n}\r\n\r\nexport interface IDecoratorFormSlots {\r\n top?: React.ReactNode\r\n bottom?: React.ReactNode\r\n isFooter?: React.ReactNode | boolean\r\n formBase?: IFormBaseSlots\r\n footer?: ComponentType<any>\r\n footerProps?: BoxProps & { [key: string]: any }\r\n footerSlots?: { after?: React.ReactNode; before?: React.ReactNode }\r\n}\r\n\r\nexport interface IDecoratorFormProps<T = any> {\r\n configClass?: any\r\n data?: Partial<T>\r\n onSubmit?: (data: Partial<T>, signal?: AbortSignal) => Promise<void>\r\n onError?: (error: any) => void\r\n onSubmitError?: (error: IPartialError<T>) => void\r\n slots?: IDecoratorFormSlots\r\n}\r\n\r\nexport const DecoratorForm: FC<IDecoratorFormProps> = (props) => {\r\n const { slots } = props\r\n const fields = getFormFields(props.configClass)\r\n const validators = getFormValidators(props.configClass)\r\n const preSubmitConfig = getFormPreSubmit(props.configClass)\r\n const abortControllerRef = useRef<AbortController | null>(null)\r\n\r\n // If the provided configClass isn't registered via @registerForm,\r\n // show a simple, friendly error UI instead of throwing.\r\n if (!isFormRegistered(props.configClass)) {\r\n const name = props.configClass?.name || 'Unknown'\r\n return (\r\n <Box sx={{ border: '1px dashed #ccc', padding: 12, borderRadius: 4, color: '#333', background: '#fafafa' }}>\r\n <Typography variant='subtitle1' sx={{ fontWeight: 600, marginBottom: 6 }}>\r\n Form configuration not registered\r\n </Typography>\r\n <Typography variant='body1'>\r\n Configuration for \"{name}\" was not found. Did you forget to add <code>@registerForm</code> to the class?\r\n </Typography>\r\n </Box>\r\n )\r\n }\r\n\r\n const handleSubmit = async (data: any) => {\r\n // Create new AbortController for this submit\r\n const abortController = new AbortController()\r\n abortControllerRef.current = abortController\r\n const signal = abortController.signal\r\n\r\n let processedData = data\r\n try {\r\n // Execute presubmit handler if exists\r\n if (preSubmitConfig?.handler) {\r\n processedData = await preSubmitConfig.handler(data, props.data)\r\n // If handler returns null/undefined, use original data\r\n if (processedData === null || processedData === undefined) {\r\n processedData = data\r\n }\r\n }\r\n\r\n // Call the original onSubmit with processed data and abort signal\r\n if (props.onSubmit) {\r\n await props.onSubmit(processedData, signal)\r\n }\r\n } catch (error) {\r\n if (props.onError) {\r\n props.onError(error)\r\n }\r\n throw error\r\n }\r\n }\r\n\r\n const renderFooter = () => {\r\n if (slots?.isFooter === false) return null\r\n if (slots?.footer) {\r\n const FooterComponent = slots.footer\r\n return <FooterComponent />\r\n }\r\n return (\r\n <FooterStyled {...slots?.footerProps}>\r\n {slots?.footerSlots?.before}\r\n <Button variant='contained' color='primary' type='submit' size='small' sx={{ flex: '0 0 auto' }}>\r\n Submit\r\n </Button>\r\n {slots?.footerSlots?.after}\r\n </FooterStyled>\r\n )\r\n }\r\n\r\n useEffect(() => {\r\n return () => {\r\n // Abort any pending request when component unmounts\r\n abortControllerRef.current?.abort()\r\n }\r\n }, [])\r\n\r\n return (\r\n <FormBase.Form onSubmit={handleSubmit} validate={new FormValidator(validators)} onError={props.onSubmitError} slots={slots?.formBase}>\r\n {props.slots?.top}\r\n <Grid container spacing={2}>\r\n {fields.map((field) => {\r\n const { disabled, visible, size, ...fieldOther } = field\r\n // Check visibility, default is visible (true or undefined)\r\n const isVisible = typeof visible === 'function' ? visible(props.data) : visible !== false\r\n if (!isVisible) return null\r\n // Check disabled state, default is enabled (false or undefined)\r\n const isDisabled = typeof disabled === 'function' ? disabled(props.data) : disabled === true\r\n return (\r\n <Grid item key={field.name.toString()} xs={12} {...size}>\r\n <DecoratorField data={props.data} {...fieldOther} disabled={isDisabled} />\r\n </Grid>\r\n )\r\n })}\r\n </Grid>\r\n {renderFooter()}\r\n {props.slots?.bottom}\r\n </FormBase.Form>\r\n )\r\n}\r\nexport default DecoratorForm\r\n\r\ntype IDecoratorFormOptions<T> = Partial<Omit<IDecoratorFormProps<T>, 'configClass'>>\r\n\r\nexport const createDecoratorForm = function <T>(configClass: any, params?: IDecoratorFormOptions<T>): ComponentType<IDecoratorFormProps<T>> {\r\n const DecoratorFormComp: FC<IDecoratorFormProps<T>> = (props) => {\r\n return <DecoratorForm configClass={configClass} {...params} {...props} />\r\n }\r\n return DecoratorFormComp\r\n}\r\n\r\nconst FooterStyled = styled(Box)(({ theme }) => ({\r\n display: 'flex',\r\n justifyContent: 'flex-end',\r\n padding: theme.spacing(1, 0)\r\n}))\r\n"],"names":["FormBase","createFormBase","InputInstance","createInput","DecoratorField","_ref","_props$name","_props$data","inputType","type","renderInput","props","_objectWithoutProperties","_excluded","name","toString","defaultValue","data","mapContext","context","messageErrors","onBlur","err","getErrorMessage","_jsx","_objectSpread","formContext","String","Number","slots","textFieldProps","Boolean","_jsxs","children","label","defaultChecked","style","color","error","message","DecoratorForm","_props$slots","_props$slots2","fields","getFormFields","configClass","validators","getFormValidators","preSubmitConfig","getFormPreSubmit","abortControllerRef","useRef","isFormRegistered","_props$configClass","Box","sx","border","padding","borderRadius","background","Typography","variant","fontWeight","marginBottom","handleSubmit","_ref2","_asyncToGenerator","_regenerator","m","_callee","abortController","signal","processedData","_t","w","_context","p","n","AbortController","current","handler","v","onSubmit","onError","a","_x","apply","this","arguments","useEffect","_abortControllerRef$c","abort","Form","validate","FormValidator","onSubmitError","formBase","top","Grid","container","spacing","map","field","disabled","visible","size","fieldOther","_excluded2","isDisabled","item","xs","_slots$footerSlots","_slots$footerSlots2","isFooter","footer","FooterComponent","FooterStyled","footerProps","footerSlots","before","Button","flex","after","renderFooter","bottom","createDecoratorForm","params","styled","_ref3","display","justifyContent","theme"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{toConsumableArray as e,objectSpread2 as t,inherits as r,createClass as a,classCallCheck as n,callSuper as o,defineProperty as
|
|
1
|
+
import{toConsumableArray as e,objectSpread2 as t,inherits as r,createClass as a,classCallCheck as n,callSuper as o,defineProperty as c}from"../../_virtual/_rollupPluginBabelHelpers.js";import"../../_virtual/Reflect.js";var f=new Map;function u(e){return function(t){var u=e||t.name;f.set(u,t);var i=function(e){function t(){var e;n(this,t);for(var r=arguments.length,a=new Array(r),f=0;f<r;f++)a[f]=arguments[f];return e=o(this,t,[].concat(a)),c(e,"__class",u),e.__class=u,e}return r(t,e),a(t)}(t);return Object.defineProperty(i,"name",{value:t.name}),Object.defineProperty(i,"__class",{value:u}),i}}function i(e){if(!e)return!1;var t="function"==typeof e?e:null==e?void 0:e.constructor;if(!t)return!1;var r=t.__class||t.name;return!!r&&f.has(r)}function l(e){return function(t){return Reflect.defineMetadata("form:presubmit",{handler:e},t),t}}function s(e){return Reflect.getMetadata("form:presubmit",e)}function d(r){return function(a,n){var o=Reflect.getMetadata("design:type",a,n),c=r.type||o,f=Reflect.hasOwnMetadata("form:fields",a.constructor)?Reflect.getOwnMetadata("form:fields",a.constructor):[],u=f.findIndex(function(e){return e.name===n}),i=r.defaultValue;if(void 0===i)try{i=(new a.constructor)[n]}catch(e){i=void 0}var l=t(t({name:n,type:c,label:r.label||n},r),{},{defaultValue:i});if(u>=0)f[u]=l,Reflect.defineMetadata("form:fields",f,a.constructor);else{var s=[].concat(e(f),[l]);Reflect.defineMetadata("form:fields",s,a.constructor)}}}var m=function(t){var r=Object.getPrototypeOf(t),a=r&&r!==Function.prototype?m(r):[],n=Reflect.getMetadata("form:fields",t)||[];if(0===a.length)return n;var o=e(a),c=new Set(a.map(function(e){return e.name.toString()}));return n.forEach(function(e){var t=e.name.toString();if(c.has(t)){var r=o.findIndex(function(e){return e.name.toString()===t});r>=0&&(o[r]=e)}else o.push(e),c.add(t)}),o};function v(r){return function(a,n){var o=Reflect.getMetadata("form:validators",a.constructor)||[],c=e(o);c.push(t({name:n},r)),Reflect.defineMetadata("form:validators",c,a.constructor)}}function p(e){return(Reflect.getMetadata("form:validators",e)||[]).reduce(function(e,t){return e[t.name]={Rules:t.Rules,label:t.label},e},{})}export{d as formField,l as formPreSubmit,v as formValidate,m as getFormFields,s as getFormPreSubmit,p as getFormValidators,i as isFormRegistered,u as registerForm};
|
|
2
2
|
//# sourceMappingURL=decorator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorator.js","sources":["../../../src/form/decorator.ts"],"sourcesContent":["import 'reflect-metadata'\r\nimport { ComponentType } from 'react'\r\nimport { IFormInputBase } from './types'\r\nimport { IConfigValue, IFormValidatorConfig } from './validator'\r\n\r\nconst ClassRegistry = new Map<string, any>()\r\n\r\nexport function registerForm(name?: string) {\r\n return function <T extends { new (...args: any[]): {} }>(constructor: T) {\r\n const key = name || constructor.name\r\n ClassRegistry.set(key, constructor)\r\n class RegisteredClass extends constructor {\r\n __class = key\r\n constructor(...args: any[]) {\r\n super(...args)\r\n this.__class = key\r\n }\r\n }\r\n Object.defineProperty(RegisteredClass, 'name', { value: constructor.name })\r\n Object.defineProperty(RegisteredClass, '__class', { value: key })\r\n return RegisteredClass\r\n }\r\n}\r\n\r\n/**\r\n * Check whether a class (constructor) or an instance has been registered\r\n * with the @registerForm decorator.\r\n *\r\n * Accepts:\r\n * - the decorated constructor (function)\r\n * - the original constructor (function)\r\n * - an instance of the class\r\n *\r\n * Returns true when the underlying registry contains an entry for the\r\n * class key (either the custom name provided to the decorator or the\r\n * constructor name).\r\n */\r\nexport function isFormRegistered(target: any): boolean {\r\n if (!target) return false\r\n const ctor = typeof target === 'function' ? target : target?.constructor\r\n if (!ctor) return false\r\n const key = (ctor as any).__class || (ctor as any).name\r\n if (!key) return false\r\n return ClassRegistry.has(key)\r\n}\r\n\r\nexport interface IPreSubmitMetadata<T = any> {\r\n handler: (data: T, oldData: T) => Promise<any> | any\r\n}\r\n\r\nexport function formPreSubmit<T = any>(handler: IPreSubmitMetadata<T>['handler']) {\r\n return function <T extends { new (...args: any[]): {} }>(constructor: T) {\r\n Reflect.defineMetadata('form:presubmit', { handler }, constructor)\r\n return constructor\r\n }\r\n}\r\n\r\nexport function getFormPreSubmit(targetClass: any): IPreSubmitMetadata | undefined {\r\n return Reflect.getMetadata('form:presubmit', targetClass)\r\n}\r\n\r\nexport interface IFieldMetadata<T = any> {\r\n name: keyof T | string\r\n label?: string\r\n placeholder?: string\r\n default?: any\r\n type?: any\r\n size?: Partial<Record<'xs' | 'sm' | 'md' | 'lg' | 'xl', number>>\r\n visible?: boolean | ((data?: T) => boolean)\r\n disabled?: boolean | ((data?: T) => boolean)\r\n renderInput?: ComponentType<IFormInputBase<T>>\r\n}\r\n\r\nexport function formField(options: Omit<IFieldMetadata, 'name'>) {\r\n return function (target: any, propertyKey: string) {\r\n const designType = Reflect.getMetadata('design:type', target, propertyKey)\r\n const actualType = options.type || designType\r\n const existing: IFieldMetadata[] = Reflect.getMetadata('form:fields', target.constructor) || []\r\n const fields = [...existing]\r\n fields.push({ name: propertyKey, type: actualType, label: options.label || propertyKey, ...options })\r\n Reflect.defineMetadata('form:fields', fields, target.constructor)\r\n }\r\n}\r\n\r\nexport const getFormFields = (targetClass: any): IFieldMetadata[] => {\r\n return Reflect.getMetadata('form:fields', targetClass) || []\r\n}\r\n\r\nexport interface IValidationMetadata extends IConfigValue {\r\n name: string\r\n}\r\n\r\nexport function formValidate(options: Omit<IValidationMetadata, 'name'>) {\r\n return function (target: any, propertyKey: string) {\r\n const existing: IValidationMetadata[] = Reflect.getMetadata('form:validators', target.constructor) || []\r\n const validators = [...existing]\r\n validators.push({ name: propertyKey, ...options })\r\n Reflect.defineMetadata('form:validators', validators, target.constructor)\r\n }\r\n}\r\n\r\nexport function getFormValidators<T = any>(targetClass: any): IFormValidatorConfig<T> {\r\n const metas: IValidationMetadata[] = Reflect.getMetadata('form:validators', targetClass) || []\r\n return metas.reduce<IFormValidatorConfig<T>>((acc, curr) => {\r\n acc[curr.name as keyof T] = { Rules: curr.Rules, label: curr.label }\r\n return acc\r\n }, {})\r\n}\r\n"],"names":["ClassRegistry","Map","registerForm","name","constructor","key","set","RegisteredClass","_constructor","_this","_classCallCheck","_len","arguments","length","args","Array","_key","_callSuper","this","concat","_defineProperty","__class","_inherits","_createClass","Object","defineProperty","value","isFormRegistered","target","ctor","has","formPreSubmit","handler","Reflect","defineMetadata","getFormPreSubmit","targetClass","getMetadata","formField","options","propertyKey","designType","actualType","type","existing","fields","_toConsumableArray","push","_objectSpread","label","getFormFields","formValidate","validators","getFormValidators","reduce","acc","curr","Rules"],"mappings":"2NAKA,IAAMA,EAAgB,IAAIC,IAEpB,SAAUC,EAAaC,GAC3B,OAAO,SAAkDC,GACvD,IAAMC,EAAMF,GAAQC,EAAYD,KAChCH,EAAcM,IAAID,EAAKD,GAAY,IAC7BG,WAAgBC,GAEpB,SAAAD,IAA0B,IAAAE,EAAAC,OAAAH,GAAA,IAAA,IAAAI,EAAAC,UAAAC,OAAXC,EAAWC,IAAAA,MAAAJ,GAAAK,EAAA,EAAAA,EAAAL,EAAAK,IAAXF,EAAWE,GAAAJ,UAAAI,GAEN,OADlBP,EAAAQ,EAAAC,KAAAX,EAAAY,GAAAA,OAASL,IAAKM,EAAAX,EAAA,UAFNJ,GAGRI,EAAKY,QAAUhB,EAAGI,CACpB,CAAC,OAAAa,EAAAf,EAAAC,GAAAe,EAAAhB,EAAA,EAL2BH,GAS9B,OAFAoB,OAAOC,eAAelB,EAAiB,OAAQ,CAAEmB,MAAOtB,EAAYD,OACpEqB,OAAOC,eAAelB,EAAiB,UAAW,CAAEmB,MAAOrB,IACpDE,CACR,CACH,CAeM,SAAUoB,EAAiBC,GAC/B,IAAKA,EAAQ,OAAO,EACpB,IAAMC,EAAyB,mBAAXD,EAAwBA,EAASA,aAAAA,EAAAA,EAAQxB,YAC7D,IAAKyB,EAAM,OAAO,EAClB,IAAMxB,EAAOwB,EAAaR,SAAYQ,EAAa1B,KACnD,QAAKE,GACEL,EAAc8B,IAAIzB,EAC3B,CAMM,SAAU0B,EAAuBC,GACrC,OAAO,SAAkD5B,GAEvD,OADA6B,QAAQC,eAAe,iBAAkB,CAAEF,QAAAA,GAAW5B,GAC/CA,CACR,CACH,CAEM,SAAU+B,EAAiBC,GAC/B,OAAOH,QAAQI,YAAY,iBAAkBD,EAC/C,CAcM,SAAUE,EAAUC,GACxB,OAAO,SAAUX,EAAaY,GAC5B,IAAMC,EAAaR,QAAQI,YAAY,cAAeT,EAAQY,GACxDE,EAAaH,EAAQI,MAAQF,EAC7BG,EAA6BX,QAAQI,YAAY,cAAeT,EAAOxB,cAAgB,GACvFyC,EAAMC,EAAOF,GACnBC,EAAOE,KAAIC,EAAA,CAAG7C,KAAMqC,EAAaG,KAAMD,EAAYO,MAAOV,EAAQU,OAAST,GAAgBD,IAC3FN,QAAQC,eAAe,cAAeW,EAAQjB,EAAOxB,YACtD,CACH,KAEa8C,EAAgB,SAACd,GAC5B,OAAOH,QAAQI,YAAY,cAAeD,IAAgB,EAC5D,EAMM,SAAUe,EAAaZ,GAC3B,OAAO,SAAUX,EAAaY,GAC5B,IAAMI,EAAkCX,QAAQI,YAAY,kBAAmBT,EAAOxB,cAAgB,GAChGgD,EAAUN,EAAOF,GACvBQ,EAAWL,KAAIC,EAAA,CAAG7C,KAAMqC,GAAgBD,IACxCN,QAAQC,eAAe,kBAAmBkB,EAAYxB,EAAOxB,YAC9D,CACH,CAEM,SAAUiD,EAA2BjB,GAEzC,OADqCH,QAAQI,YAAY,kBAAmBD,IAAgB,IAC/EkB,OAAgC,SAACC,EAAKC,GAEjD,OADAD,EAAIC,EAAKrD,MAAmB,CAAEsD,MAAOD,EAAKC,MAAOR,MAAOO,EAAKP,OACtDM,CACR,EAAE,GACL"}
|
|
1
|
+
{"version":3,"file":"decorator.js","sources":["../../../src/form/decorator.ts"],"sourcesContent":["import 'reflect-metadata'\r\nimport { ComponentType } from 'react'\r\nimport { IFormInputBase } from './types'\r\nimport { IConfigValue, IFormValidatorConfig } from './validator'\r\n\r\nconst ClassRegistry = new Map<string, any>()\r\n\r\nexport function registerForm(name?: string) {\r\n return function <T extends { new (...args: any[]): {} }>(constructor: T) {\r\n const key = name || constructor.name\r\n ClassRegistry.set(key, constructor)\r\n class RegisteredClass extends constructor {\r\n __class = key\r\n constructor(...args: any[]) {\r\n super(...args)\r\n this.__class = key\r\n }\r\n }\r\n Object.defineProperty(RegisteredClass, 'name', { value: constructor.name })\r\n Object.defineProperty(RegisteredClass, '__class', { value: key })\r\n return RegisteredClass\r\n }\r\n}\r\n\r\n/**\r\n * Check whether a class (constructor) or an instance has been registered\r\n * with the @registerForm decorator.\r\n *\r\n * Accepts:\r\n * - the decorated constructor (function)\r\n * - the original constructor (function)\r\n * - an instance of the class\r\n *\r\n * Returns true when the underlying registry contains an entry for the\r\n * class key (either the custom name provided to the decorator or the\r\n * constructor name).\r\n */\r\nexport function isFormRegistered(target: any): boolean {\r\n if (!target) return false\r\n const ctor = typeof target === 'function' ? target : target?.constructor\r\n if (!ctor) return false\r\n const key = (ctor as any).__class || (ctor as any).name\r\n if (!key) return false\r\n return ClassRegistry.has(key)\r\n}\r\n\r\nexport interface IPreSubmitMetadata<T = any> {\r\n handler: (data: T, oldData: T) => Promise<any> | any\r\n}\r\n\r\nexport function formPreSubmit<T = any>(handler: IPreSubmitMetadata<T>['handler']) {\r\n return function <T extends { new (...args: any[]): {} }>(constructor: T) {\r\n Reflect.defineMetadata('form:presubmit', { handler }, constructor)\r\n return constructor\r\n }\r\n}\r\n\r\nexport function getFormPreSubmit(targetClass: any): IPreSubmitMetadata | undefined {\r\n return Reflect.getMetadata('form:presubmit', targetClass)\r\n}\r\n\r\nexport interface IFieldMetadata<T = any, O = {}> {\r\n name: keyof T | string\r\n label?: string\r\n placeholder?: string\r\n defaultValue?: any\r\n type?: any\r\n size?: Partial<Record<'xs' | 'sm' | 'md' | 'lg' | 'xl', number>>\r\n visible?: boolean | ((data?: T) => boolean)\r\n disabled?: boolean | ((data?: T) => boolean)\r\n renderInput?: ComponentType<IFormInputBase<T>>\r\n}\r\n\r\nexport function formField(options: Omit<IFieldMetadata, 'name'>) {\r\n return function (target: any, propertyKey: string) {\r\n const designType = Reflect.getMetadata('design:type', target, propertyKey)\r\n const actualType = options.type || designType\r\n\r\n // Get existing fields metadata - use hasOwnMetadata to avoid parent pollution\r\n const isMetaData = Reflect.hasOwnMetadata('form:fields', target.constructor)\r\n const existing: IFieldMetadata[] = isMetaData ? Reflect.getOwnMetadata('form:fields', target.constructor) : []\r\n\r\n // Check if this field already exists (override case)\r\n const existingIndex = existing.findIndex((f) => f.name === propertyKey)\r\n\r\n // Get default value from property if not explicitly provided\r\n // Need to create a temporary instance to get the initialized value\r\n let defaultValue = options.defaultValue\r\n if (defaultValue === undefined) {\r\n try {\r\n const tempInstance = new (target.constructor as any)()\r\n defaultValue = tempInstance[propertyKey]\r\n } catch {\r\n // If constructor fails, use undefined\r\n defaultValue = undefined\r\n }\r\n }\r\n\r\n const newField: IFieldMetadata = { name: propertyKey, type: actualType, label: options.label || propertyKey, ...options, defaultValue }\r\n\r\n if (existingIndex >= 0) {\r\n // Override existing field, keep position\r\n existing[existingIndex] = newField\r\n Reflect.defineMetadata('form:fields', existing, target.constructor)\r\n } else {\r\n // New field, append to end\r\n const fields = [...existing, newField]\r\n Reflect.defineMetadata('form:fields', fields, target.constructor)\r\n }\r\n }\r\n}\r\n\r\nexport const getFormFields = (targetClass: any): IFieldMetadata[] => {\r\n // Get parent class\r\n const parentClass = Object.getPrototypeOf(targetClass)\r\n\r\n // Get parent fields recursively\r\n const parentFields: IFieldMetadata[] = parentClass && parentClass !== Function.prototype ? getFormFields(parentClass) : []\r\n\r\n // Get current class fields\r\n const currentFields: IFieldMetadata[] = Reflect.getMetadata('form:fields', targetClass) || []\r\n\r\n // If no parent, return current fields directly\r\n if (parentFields.length === 0) {\r\n return currentFields\r\n }\r\n\r\n // Merge parent and current fields\r\n // Start with parent fields as base\r\n const mergedFields = [...parentFields]\r\n const fieldNames = new Set(parentFields.map((f) => f.name.toString()))\r\n\r\n // Process current class fields\r\n currentFields.forEach((currentField) => {\r\n const fieldName = currentField.name.toString()\r\n\r\n if (fieldNames.has(fieldName)) {\r\n // Override parent field - find and replace it in place\r\n const index = mergedFields.findIndex((f) => f.name.toString() === fieldName)\r\n if (index >= 0) {\r\n mergedFields[index] = currentField\r\n }\r\n } else {\r\n // New field - append to end\r\n mergedFields.push(currentField)\r\n fieldNames.add(fieldName)\r\n }\r\n })\r\n\r\n return mergedFields\r\n}\r\n\r\nexport interface IValidationMetadata extends IConfigValue {\r\n name: string\r\n}\r\n\r\nexport function formValidate(options: Omit<IValidationMetadata, 'name'>) {\r\n return function (target: any, propertyKey: string) {\r\n const existing: IValidationMetadata[] = Reflect.getMetadata('form:validators', target.constructor) || []\r\n const validators = [...existing]\r\n validators.push({ name: propertyKey, ...options })\r\n Reflect.defineMetadata('form:validators', validators, target.constructor)\r\n }\r\n}\r\n\r\nexport function getFormValidators<T = any>(targetClass: any): IFormValidatorConfig<T> {\r\n const metas: IValidationMetadata[] = Reflect.getMetadata('form:validators', targetClass) || []\r\n return metas.reduce<IFormValidatorConfig<T>>((acc, curr) => {\r\n acc[curr.name as keyof T] = { Rules: curr.Rules, label: curr.label }\r\n return acc\r\n }, {})\r\n}\r\n"],"names":["ClassRegistry","Map","registerForm","name","constructor","key","set","RegisteredClass","_constructor","_this","_classCallCheck","_len","arguments","length","args","Array","_key","_callSuper","this","concat","_defineProperty","__class","_inherits","_createClass","Object","defineProperty","value","isFormRegistered","target","ctor","has","formPreSubmit","handler","Reflect","defineMetadata","getFormPreSubmit","targetClass","getMetadata","formField","options","propertyKey","designType","actualType","type","existing","hasOwnMetadata","getOwnMetadata","existingIndex","findIndex","f","defaultValue","undefined","_unused","newField","_objectSpread","label","fields","_toConsumableArray","getFormFields","parentClass","getPrototypeOf","parentFields","Function","prototype","currentFields","mergedFields","fieldNames","Set","map","toString","forEach","currentField","fieldName","index","push","add","formValidate","validators","getFormValidators","reduce","acc","curr","Rules"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{objectWithoutProperties as
|
|
1
|
+
import{objectWithoutProperties as r,objectSpread2 as e,slicedToArray as i}from"../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as t,Fragment as a,jsxs as l}from"react/jsx-runtime";import{useState as n,useEffect as o}from"react";import{styled as c,Typography as p,Box as m,Chip as s,Tooltip as u,IconButton as d,Divider as f}from"@mui/material";import v from"@mui/icons-material/OpenInNew";import{mergeObjects as g}from"../utils/helpers.js";import"../utils/dayjs-config.js";import"../utils/query-param.js";import{HelpTooltipWrap as h}from"../components/help-tooltip.js";import{CopyToClipboard as x}from"../components/copy-to-clipboard.js";import b from"dayjs";var y=["children"],k=function(r,i){return function(l){var n,o,c,p,m;return l.value?t(j,e(e({onClick:l.onClick},null===(n=l.slots)||void 0===n?void 0:n.typographyProps),{},{sx:(c=l.value,p=l.sx,m=l.slots,Object.assign({},c?r[c]:{},null==i?void 0:i.sx,p,null==m||null===(o=m.typographyProps)||void 0===o?void 0:o.sx)),children:l.title||l.value})):t(a,{})}},j=c(p)({borderRadius:"4px",fontSize:"0.8rem",padding:"4px 9px",fontWeight:600,minWidth:"70px",textAlign:"center",color:"#ffffff",display:"inline-block"}),w=function(r){var e,a=n(null!==(e=r.imageUri)&&void 0!==e?e:r.fallbackSrc),c=i(a,2),s=c[0],u=c[1];return o(function(){var e;u(null!==(e=r.imageUri)&&void 0!==e?e:r.fallbackSrc)},[r.imageUri,r.fallbackSrc]),l(m,{sx:{display:"flex",alignItems:"center",height:"100%",gap:"10px"},children:[t(F,{src:s,onError:function(){return u(r.fallbackSrc)}}),t(p,{variant:"body1",children:r.value})]})},S=function(r){var e,a=n(null!==(e=r.imageUri)&&void 0!==e?e:r.imageFallback),l=i(a,2),c=l[0],p=l[1];return o(function(){var e;p(null!==(e=r.imageUri)&&void 0!==e?e:r.imageFallback)},[r.imageUri,r.imageFallback]),t(F,{src:c,onError:function(){return p(r.imageFallback)},sx:r.sx})},F=c("img")({backgroundRepeat:"no-repeat",height:"50px",width:"50px",backgroundSize:"contain",borderRadius:"8px",boxShadow:"rgba(0, 0, 0, 0.16) 0px 1px 4px"}),U=function(r){var i,a=null!==(i=r.valueFormatted)&&void 0!==i?i:r.value,n=!!r.copyToClipboard&&!!a;return l(W,e(e({title:a},r.wrapProps),{},{children:[!!r.imageUrl&&t(S,{imageUri:r.imageUrl,sx:{mr:"10px"},imageFallback:r.imageFallbackSrc}),!!r.icon&&r.icon,t(p,e(e({variant:"body2",component:"span",noWrap:!0,sx:{flex:1}},r.typographyProps),{},{children:a})),a&&!0===r.openInNewTab&&t(u,{arrow:!0,title:"Open new tab",children:t(d,{component:"a",href:a,target:"_blank",children:t(v,{fontSize:"small",sx:{color:"#1A75E2"}})})}),n&&t(x,{value:a}),a&&!0===r.beforeLine&&t(f,{flexItem:!0,variant:"middle",orientation:"vertical"})]}))},W=c(function(i){var a=i.children,l=r(i,y);return t(m,e(e({},l),{},{children:t("div",{children:a})}))})({flex:1,width:"100%",height:"100%",position:"relative",top:0,left:0,"& > div":{display:"flex",alignItems:"center",width:"100%",height:"100%",position:"absolute",top:0,left:0}}),I=function(r){var e,i;if("string"!=typeof r.value)return null!==(e=r.value)&&void 0!==e?e:t(a,{});var n=r.value.split(null!==(i=null==r?void 0:r.separator)&&void 0!==i?i:"|").filter(function(r){return!!r}),o=null!=r&&r.maximum?n.slice(0,r.maximum):n,c=null!=r&&r.maximum&&n.length>r.maximum?n.length-r.maximum:0;return l(m,{sx:{display:"flex",alignItems:"center",flexWrap:"wrap",gap:"4px",height:"100%"},children:[o.map(function(e,i){return t(P,{label:r.valueFormatter?r.valueFormatter(e):e,size:"small"},"key"+i)}),c>0&&t(h,{title:"Artists",content:t(m,{sx:{display:"flex",alignItems:"center",flexWrap:"wrap",gap:"4px"},children:n.map(function(r,e){return t(P,{label:r,size:"small"},"key"+e)})}),children:t(P,{label:"+".concat(c),size:"small"},"remaining")})]})},P=c(s)({lineHeight:1}),z=function(r){try{var i,a,l=null!==(i=null==r?void 0:r.showRelative)&&void 0!==i&&i,n=b(r.value),o=n.format(r.formatString),c=l?"".concat(o," (").concat(b().to(n),")"):o,m=r.styledGetter?r.styledGetter(r.value):{flex:1},s=g({},null!==(a=r.typographyProps)&&void 0!==a?a:{},{sx:m});return t(p,e(e({variant:"body2",component:"span",noWrap:!0,title:"".concat(c," formatted with ").concat(r.formatString)},s),{},{children:c}))}catch(r){return t(p,{variant:"body2",component:"span",noWrap:!0,children:"format invalid"})}};export{U as CellBase,I as CellChips,z as CellDate,w as CellImageSmall,k as CreateStatusCell,S as ImageSmallFallback};
|
|
2
2
|
//# sourceMappingURL=ui.units.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui.units.js","sources":["../../../src/table/ui.units.tsx"],"sourcesContent":["import { useEffect, useState } from 'react'\r\nimport { Box, BoxProps, Chip, Divider, IconButton, styled, SxProps, Theme, Tooltip, Typography, TypographyProps } from '@mui/material'\r\nimport type { ComponentType, FC, PropsWithChildren, ReactNode } from 'react'\r\nimport OpenInNewIcon from '@mui/icons-material/OpenInNew'\r\nimport { dayjsCustom, mergeObjects } from '../utils'\r\nimport { CopyToClipboard, HelpTooltipWrap } from '../components'\r\n\r\n//#region CellImageSmall\r\nexport type IStatusCellConfig<T extends string> = { [key in T]: SxProps<Theme> }\r\n\r\nexport interface IStatusCellOptions {\r\n sx?: SxProps<Theme>\r\n}\r\n\r\nexport interface IStatusCellProps<T extends string> extends PropsWithChildren {\r\n value?: T\r\n title?: string\r\n sx?: SxProps<Theme>\r\n onClick?: TypographyProps['onClick']\r\n slots?: {\r\n typographyProps?: TypographyProps\r\n }\r\n}\r\n\r\nexport const CreateStatusCell = function <T extends string>(\r\n config: IStatusCellConfig<T>,\r\n options?: IStatusCellOptions\r\n): ComponentType<IStatusCellProps<T>> {\r\n const StatusCell: FC<IStatusCellProps<T>> = (props) => {\r\n const getSxProps = (): SxProps<Theme> => {\r\n const { value: data, sx, slots } = props\r\n return Object.assign({}, data ? config[data] : {}, options?.sx, sx, slots?.typographyProps?.sx)\r\n }\r\n\r\n if (!props.value) return <></>\r\n return (\r\n <CustomTypography onClick={props.onClick} {...props.slots?.typographyProps} sx={getSxProps()}>\r\n {props.title || props.value}\r\n </CustomTypography>\r\n )\r\n }\r\n return StatusCell\r\n}\r\n\r\nconst CustomTypography = styled(Typography)({\r\n borderRadius: '4px',\r\n fontSize: '0.8rem',\r\n padding: '4px 9px',\r\n fontWeight: 600,\r\n minWidth: '70px',\r\n textAlign: 'center',\r\n color: '#ffffff',\r\n display: 'inline-block'\r\n})\r\n\r\n//#region CellImageSmall\r\ninterface CellImageSmallProps {\r\n value: string\r\n imageUri?: string\r\n fallbackSrc?: string\r\n}\r\n\r\nexport const CellImageSmall: FC<CellImageSmallProps> = (props) => {\r\n const [imgSrc, setImgSrc] = useState(props.imageUri ?? props.fallbackSrc)\r\n useEffect(() => {\r\n setImgSrc(props.imageUri ?? props.fallbackSrc)\r\n }, [props.imageUri, props.fallbackSrc])\r\n return (\r\n <Box sx={{ display: 'flex', alignItems: 'center', height: '100%', gap: '10px' }}>\r\n <ImageSmall src={imgSrc} onError={() => setImgSrc(props.fallbackSrc)} />\r\n <Typography variant='body1'>{props.value}</Typography>\r\n </Box>\r\n )\r\n}\r\n\r\ninterface ImageSmallFallbackProps {\r\n imageUri?: string\r\n imageFallback?: string\r\n sx?: SxProps<Theme>\r\n}\r\n\r\nexport const ImageSmallFallback: FC<ImageSmallFallbackProps> = (props) => {\r\n const [imgSrc, setImgSrc] = useState(props.imageUri ?? props.imageFallback)\r\n useEffect(() => {\r\n setImgSrc(props.imageUri ?? props.imageFallback)\r\n }, [props.imageUri, props.imageFallback])\r\n return <ImageSmall src={imgSrc} onError={() => setImgSrc(props.imageFallback)} sx={props.sx} />\r\n}\r\n\r\nconst ImageSmall = styled('img')({\r\n backgroundRepeat: 'no-repeat',\r\n height: '50px',\r\n width: '50px',\r\n backgroundSize: 'contain',\r\n borderRadius: '8px',\r\n boxShadow: 'rgba(0, 0, 0, 0.16) 0px 1px 4px'\r\n})\r\n//#endregion\r\n\r\n//#region CellBase\r\n\r\nexport interface CellBaseOptions {\r\n openInNewTab?: boolean\r\n beforeLine?: boolean\r\n copyToClipboard?: boolean\r\n icon?: ReactNode\r\n imageUrl?: string\r\n imageFallbackSrc?: string\r\n valueFormatter?: (value?: string) => string\r\n wrapProps?: BoxProps & { [key: string]: any }\r\n typographyProps?: TypographyProps & { [key: string]: any }\r\n}\r\n\r\ninterface CellBaseProps extends CellBaseOptions {\r\n value?: string\r\n valueFormatted?: string\r\n}\r\n\r\nexport const CellBase: FC<CellBaseProps> = (props) => {\r\n const value = props.valueFormatted ?? props.value\r\n const isCopyToClipboard = !!props.copyToClipboard && !!value\r\n return (\r\n <CellBaseWrap title={value} {...props.wrapProps}>\r\n {!!props.imageUrl && <ImageSmallFallback imageUri={props.imageUrl} sx={{ mr: '10px' }} imageFallback={props.imageFallbackSrc} />}\r\n {!!props.icon && props.icon}\r\n <Typography variant='body2' component='span' noWrap sx={{ flex: 1 }} {...props.typographyProps}>\r\n {value}\r\n </Typography>\r\n {value && props.openInNewTab === true && (\r\n <Tooltip arrow title='Open new tab'>\r\n <IconButton component='a' href={value} target='_blank'>\r\n <OpenInNewIcon fontSize='small' sx={{ color: '#1A75E2' }} />\r\n </IconButton>\r\n </Tooltip>\r\n )}\r\n {isCopyToClipboard && <CopyToClipboard value={value} />}\r\n {value && props.beforeLine === true && <Divider flexItem variant='middle' orientation='vertical' />}\r\n </CellBaseWrap>\r\n )\r\n}\r\n\r\nconst CellBaseWrap = styled(({ children, ...props }: BoxProps) => (\r\n <Box {...props}>\r\n <div>{children}</div>\r\n </Box>\r\n))({\r\n flex: 1,\r\n width: '100%',\r\n height: '100%',\r\n position: 'relative',\r\n top: 0,\r\n left: 0,\r\n '& > div': {\r\n display: 'flex',\r\n alignItems: 'center',\r\n width: '100%',\r\n height: '100%',\r\n position: 'absolute',\r\n top: 0,\r\n left: 0\r\n }\r\n})\r\n//#endregion\r\n\r\n//#region Chips\r\nexport interface CellChipsProps {\r\n value?: string\r\n valueFormatter?: (value: string) => string\r\n separator?: string\r\n maximum?: number\r\n}\r\n\r\nexport const CellChips: FC<CellChipsProps> = (props) => {\r\n if (typeof props.value !== 'string') return props.value ?? <></>\r\n\r\n const list = props.value.split(props?.separator ?? '|').filter((x) => !!x)\r\n const displayList = props?.maximum ? list.slice(0, props.maximum) : list\r\n const remainingCount = props?.maximum && list.length > props.maximum ? list.length - props.maximum : 0\r\n\r\n return (\r\n <Box sx={{ display: 'flex', alignItems: 'center', flexWrap: 'wrap', gap: '4px', height: '100%' }}>\r\n {displayList.map((x, i) => (\r\n <CustomChip key={'key' + i} label={props.valueFormatter ? props.valueFormatter(x) : x} size='small' />\r\n ))}\r\n {remainingCount > 0 && (\r\n <HelpTooltipWrap\r\n title='Artists'\r\n content={\r\n <Box sx={{ display: 'flex', alignItems: 'center', flexWrap: 'wrap', gap: '4px' }}>\r\n {list.map((x, i) => (\r\n <CustomChip key={'key' + i} label={x} size='small' />\r\n ))}\r\n </Box>\r\n }\r\n >\r\n <CustomChip key='remaining' label={`+${remainingCount}`} size='small' />\r\n </HelpTooltipWrap>\r\n )}\r\n </Box>\r\n )\r\n}\r\n\r\nconst CustomChip = styled(Chip)({\r\n lineHeight: 1\r\n})\r\n//#endregion\r\n\r\n//#region Date\r\nexport interface CellDatePropsOwner {\r\n formatString?: string\r\n showRelative?: boolean\r\n typographyProps?: TypographyProps\r\n styledGetter?: (value: any) => SxProps<Theme>\r\n}\r\nexport interface CellDateProps extends CellDatePropsOwner {\r\n value: any\r\n}\r\n\r\nexport const CellDate: FC<CellDateProps> = (props) => {\r\n try {\r\n const showRelative = props?.showRelative ?? false\r\n const date = dayjsCustom(props.value)\r\n const formatted = date.format(props.formatString)\r\n const value = showRelative ? `${formatted} (${dayjsCustom().to(date)})` : formatted\r\n const sx = props.styledGetter ? props.styledGetter(props.value) : { flex: 1 }\r\n const mergeTypographyProps = mergeObjects<TypographyProps>({}, props.typographyProps ?? {}, { sx })\r\n return (\r\n <Typography variant='body2' component='span' noWrap {...mergeTypographyProps}>\r\n {value}\r\n </Typography>\r\n )\r\n } catch {\r\n return (\r\n <Typography variant='body2' component='span' noWrap>\r\n format invalid\r\n </Typography>\r\n )\r\n }\r\n}\r\n//#endregion\r\n"],"names":["CreateStatusCell","config","options","props","_props$slots","_slots$typographyProp","data","sx","slots","value","_jsx","CustomTypography","_objectSpread","onClick","typographyProps","Object","assign","children","title","styled","Typography","borderRadius","fontSize","padding","fontWeight","minWidth","textAlign","color","display","CellImageSmall","_props$imageUri","_useState","useState","imageUri","fallbackSrc","_useState2","_slicedToArray","imgSrc","setImgSrc","useEffect","_props$imageUri2","_jsxs","Box","alignItems","height","gap","ImageSmall","src","onError","variant","ImageSmallFallback","_props$imageUri3","_useState3","imageFallback","_useState4","_props$imageUri4","backgroundRepeat","width","backgroundSize","boxShadow","CellBase","_props$valueFormatted","valueFormatted","isCopyToClipboard","copyToClipboard","CellBaseWrap","wrapProps","imageUrl","mr","imageFallbackSrc","icon","component","noWrap","flex","openInNewTab","Tooltip","arrow","IconButton","href","target","OpenInNewIcon","CopyToClipboard","beforeLine","Divider","flexItem","orientation","_ref","_objectWithoutProperties","_excluded","position","top","left","CellChips","_props$value","_props$separator","list","split","separator","filter","x","displayList","maximum","slice","remainingCount","length","flexWrap","map","i","CustomChip","label","valueFormatter","size","HelpTooltipWrap","content","concat","Chip","lineHeight","CellDate","_props$showRelative","_props$typographyProp","showRelative","date","dayjsCustom","formatted","format","formatString","to","styledGetter","mergeTypographyProps","mergeObjects","_unused"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ui.units.js","sources":["../../../src/table/ui.units.tsx"],"sourcesContent":["import { useEffect, useState } from 'react'\r\nimport { Box, BoxProps, Chip, Divider, IconButton, styled, SxProps, Theme, Tooltip, Typography, TypographyProps } from '@mui/material'\r\nimport type { ComponentType, FC, PropsWithChildren, ReactNode } from 'react'\r\nimport OpenInNewIcon from '@mui/icons-material/OpenInNew'\r\nimport { dayjsCustom, mergeObjects } from '../utils'\r\nimport { CopyToClipboard, HelpTooltipWrap } from '../components'\r\n\r\n//#region CellImageSmall\r\nexport type IStatusCellConfig<T extends string> = { [key in T]: SxProps<Theme> }\r\n\r\nexport interface IStatusCellOptions {\r\n sx?: SxProps<Theme>\r\n}\r\n\r\nexport interface IStatusCellProps<T extends string> extends PropsWithChildren {\r\n value?: T\r\n title?: string\r\n sx?: SxProps<Theme>\r\n onClick?: TypographyProps['onClick']\r\n slots?: {\r\n typographyProps?: TypographyProps\r\n }\r\n}\r\n\r\nexport const CreateStatusCell = function <T extends string>(\r\n config: IStatusCellConfig<T>,\r\n options?: IStatusCellOptions\r\n): ComponentType<IStatusCellProps<T>> {\r\n const StatusCell: FC<IStatusCellProps<T>> = (props) => {\r\n const getSxProps = (): SxProps<Theme> => {\r\n const { value: data, sx, slots } = props\r\n return Object.assign({}, data ? config[data] : {}, options?.sx, sx, slots?.typographyProps?.sx)\r\n }\r\n\r\n if (!props.value) return <></>\r\n return (\r\n <CustomTypography onClick={props.onClick} {...props.slots?.typographyProps} sx={getSxProps()}>\r\n {props.title || props.value}\r\n </CustomTypography>\r\n )\r\n }\r\n return StatusCell\r\n}\r\n\r\nconst CustomTypography = styled(Typography)({\r\n borderRadius: '4px',\r\n fontSize: '0.8rem',\r\n padding: '4px 9px',\r\n fontWeight: 600,\r\n minWidth: '70px',\r\n textAlign: 'center',\r\n color: '#ffffff',\r\n display: 'inline-block'\r\n})\r\n\r\n//#region CellImageSmall\r\ninterface CellImageSmallProps {\r\n value: string\r\n imageUri?: string\r\n fallbackSrc?: string\r\n}\r\n\r\nexport const CellImageSmall: FC<CellImageSmallProps> = (props) => {\r\n const [imgSrc, setImgSrc] = useState(props.imageUri ?? props.fallbackSrc)\r\n useEffect(() => {\r\n setImgSrc(props.imageUri ?? props.fallbackSrc)\r\n }, [props.imageUri, props.fallbackSrc])\r\n return (\r\n <Box sx={{ display: 'flex', alignItems: 'center', height: '100%', gap: '10px' }}>\r\n <ImageSmall src={imgSrc} onError={() => setImgSrc(props.fallbackSrc)} />\r\n <Typography variant='body1'>{props.value}</Typography>\r\n </Box>\r\n )\r\n}\r\n\r\ninterface ImageSmallFallbackProps {\r\n imageUri?: string\r\n imageFallback?: string\r\n sx?: SxProps<Theme>\r\n}\r\n\r\nexport const ImageSmallFallback: FC<ImageSmallFallbackProps> = (props) => {\r\n const [imgSrc, setImgSrc] = useState(props.imageUri ?? props.imageFallback)\r\n useEffect(() => {\r\n setImgSrc(props.imageUri ?? props.imageFallback)\r\n }, [props.imageUri, props.imageFallback])\r\n return <ImageSmall src={imgSrc} onError={() => setImgSrc(props.imageFallback)} sx={props.sx} />\r\n}\r\n\r\nconst ImageSmall = styled('img')({\r\n backgroundRepeat: 'no-repeat',\r\n height: '50px',\r\n width: '50px',\r\n backgroundSize: 'contain',\r\n borderRadius: '8px',\r\n boxShadow: 'rgba(0, 0, 0, 0.16) 0px 1px 4px'\r\n})\r\n//#endregion\r\n\r\n//#region CellBase\r\n\r\nexport interface CellBaseOptions {\r\n openInNewTab?: boolean\r\n beforeLine?: boolean\r\n copyToClipboard?: boolean\r\n icon?: ReactNode\r\n imageUrl?: string\r\n imageFallbackSrc?: string\r\n valueFormatter?: (value?: string) => string\r\n wrapProps?: BoxProps & { [key: string]: any }\r\n typographyProps?: TypographyProps & { [key: string]: any }\r\n}\r\n\r\ninterface CellBaseProps extends CellBaseOptions {\r\n value?: string\r\n valueFormatted?: string\r\n}\r\n\r\nexport const CellBase: FC<CellBaseProps> = (props) => {\r\n const value = props.valueFormatted ?? props.value\r\n const isCopyToClipboard = !!props.copyToClipboard && !!value\r\n return (\r\n <CellBaseWrap title={value} {...props.wrapProps}>\r\n {!!props.imageUrl && <ImageSmallFallback imageUri={props.imageUrl} sx={{ mr: '10px' }} imageFallback={props.imageFallbackSrc} />}\r\n {!!props.icon && props.icon}\r\n <Typography variant='body2' component='span' noWrap sx={{ flex: 1 }} {...props.typographyProps}>\r\n {value}\r\n </Typography>\r\n {value && props.openInNewTab === true && (\r\n <Tooltip arrow title='Open new tab'>\r\n <IconButton component='a' href={value} target='_blank'>\r\n <OpenInNewIcon fontSize='small' sx={{ color: '#1A75E2' }} />\r\n </IconButton>\r\n </Tooltip>\r\n )}\r\n {isCopyToClipboard && <CopyToClipboard value={value} />}\r\n {value && props.beforeLine === true && <Divider flexItem variant='middle' orientation='vertical' />}\r\n </CellBaseWrap>\r\n )\r\n}\r\n\r\nconst CellBaseWrap = styled(({ children, ...props }: BoxProps) => (\r\n <Box {...props}>\r\n <div>{children}</div>\r\n </Box>\r\n))({\r\n flex: 1,\r\n width: '100%',\r\n height: '100%',\r\n position: 'relative',\r\n top: 0,\r\n left: 0,\r\n '& > div': {\r\n display: 'flex',\r\n alignItems: 'center',\r\n width: '100%',\r\n height: '100%',\r\n position: 'absolute',\r\n top: 0,\r\n left: 0\r\n }\r\n})\r\n//#endregion\r\n\r\n//#region Chips\r\nexport interface CellChipsProps {\r\n value?: string\r\n valueFormatter?: (value: string) => string\r\n separator?: string\r\n maximum?: number\r\n}\r\n\r\nexport const CellChips: FC<CellChipsProps> = (props) => {\r\n if (typeof props.value !== 'string') return props.value ?? <></>\r\n\r\n const list = props.value.split(props?.separator ?? '|').filter((x) => !!x)\r\n const displayList = props?.maximum ? list.slice(0, props.maximum) : list\r\n const remainingCount = props?.maximum && list.length > props.maximum ? list.length - props.maximum : 0\r\n\r\n return (\r\n <Box sx={{ display: 'flex', alignItems: 'center', flexWrap: 'wrap', gap: '4px', height: '100%' }}>\r\n {displayList.map((x, i) => (\r\n <CustomChip key={'key' + i} label={props.valueFormatter ? props.valueFormatter(x) : x} size='small' />\r\n ))}\r\n {remainingCount > 0 && (\r\n <HelpTooltipWrap\r\n title='Artists'\r\n content={\r\n <Box sx={{ display: 'flex', alignItems: 'center', flexWrap: 'wrap', gap: '4px' }}>\r\n {list.map((x, i) => (\r\n <CustomChip key={'key' + i} label={x} size='small' />\r\n ))}\r\n </Box>\r\n }\r\n >\r\n <CustomChip key='remaining' label={`+${remainingCount}`} size='small' />\r\n </HelpTooltipWrap>\r\n )}\r\n </Box>\r\n )\r\n}\r\n\r\nconst CustomChip = styled(Chip)({\r\n lineHeight: 1\r\n})\r\n//#endregion\r\n\r\n//#region Date\r\nexport interface CellDatePropsOwner {\r\n formatString?: string\r\n showRelative?: boolean\r\n typographyProps?: TypographyProps\r\n styledGetter?: (value: any) => SxProps<Theme>\r\n}\r\nexport interface CellDateProps extends CellDatePropsOwner {\r\n value: any\r\n}\r\n\r\nexport const CellDate: FC<CellDateProps> = (props) => {\r\n try {\r\n const showRelative = props?.showRelative ?? false\r\n const date = dayjsCustom(props.value)\r\n const formatted = date.format(props.formatString)\r\n const value = showRelative ? `${formatted} (${dayjsCustom().to(date)})` : formatted\r\n const sx = props.styledGetter ? props.styledGetter(props.value) : { flex: 1 }\r\n const mergeTypographyProps = mergeObjects<TypographyProps>({}, props.typographyProps ?? {}, { sx })\r\n return (\r\n <Typography variant='body2' component='span' noWrap title={`${value} formatted with ${props.formatString}`} {...mergeTypographyProps}>\r\n {value}\r\n </Typography>\r\n )\r\n } catch {\r\n return (\r\n <Typography variant='body2' component='span' noWrap>\r\n format invalid\r\n </Typography>\r\n )\r\n }\r\n}\r\n//#endregion\r\n"],"names":["CreateStatusCell","config","options","props","_props$slots","_slots$typographyProp","data","sx","slots","value","_jsx","CustomTypography","_objectSpread","onClick","typographyProps","Object","assign","children","title","styled","Typography","borderRadius","fontSize","padding","fontWeight","minWidth","textAlign","color","display","CellImageSmall","_props$imageUri","_useState","useState","imageUri","fallbackSrc","_useState2","_slicedToArray","imgSrc","setImgSrc","useEffect","_props$imageUri2","_jsxs","Box","alignItems","height","gap","ImageSmall","src","onError","variant","ImageSmallFallback","_props$imageUri3","_useState3","imageFallback","_useState4","_props$imageUri4","backgroundRepeat","width","backgroundSize","boxShadow","CellBase","_props$valueFormatted","valueFormatted","isCopyToClipboard","copyToClipboard","CellBaseWrap","wrapProps","imageUrl","mr","imageFallbackSrc","icon","component","noWrap","flex","openInNewTab","Tooltip","arrow","IconButton","href","target","OpenInNewIcon","CopyToClipboard","beforeLine","Divider","flexItem","orientation","_ref","_objectWithoutProperties","_excluded","position","top","left","CellChips","_props$value","_props$separator","list","split","separator","filter","x","displayList","maximum","slice","remainingCount","length","flexWrap","map","i","CustomChip","label","valueFormatter","size","HelpTooltipWrap","content","concat","Chip","lineHeight","CellDate","_props$showRelative","_props$typographyProp","showRelative","date","dayjsCustom","formatted","format","formatString","to","styledGetter","mergeTypographyProps","mergeObjects","_unused"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{slicedToArray as r,asyncToGenerator as t,typeof as n,regenerator as e,objectSpread2 as o,toArray as a,arrayLikeToArray as
|
|
1
|
+
import{slicedToArray as r,asyncToGenerator as t,typeof as n,regenerator as e,objectSpread2 as o,toArray as a,arrayLikeToArray as i}from"../../_virtual/_rollupPluginBabelHelpers.js";import c from"dayjs";var u=function(r){return new Promise(function(t){return setTimeout(t,r)})},f=function(){var n=t(e().m(function t(n,o){var a,i,c;return e().w(function(t){for(;;)switch(t.n){case 0:return t.n=1,Promise.all([n(),u(o)]);case 1:return a=t.v,i=r(a,1),c=i[0],t.a(2,c)}},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)},l=function(r){return/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(r)},d=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())},y=function(r){return/^(https?|ftp):\/\/[^\s/$.?#].[^\s]*$/i.test(r)},v=function(r,t){setTimeout(function(){window.scrollTo(o({top:0,left:0,behavior:"smooth"},r))},t||50)},h=function(){for(var r=arguments.length,t=new Array(r),n=0;n<r;n++)t[n]=arguments[n];return t.join(" ")},p=function(r){return r&&"object"===n(r)&&!Array.isArray(r)},A=function(){for(var r=arguments.length,t=new Array(r),n=0;n<r;n++)t[n]=arguments[n];return t.reduce(function(r,t){return t?(Object.keys(t).forEach(function(n){p(r[n])&&p(t[n])?r[n]=A(r[n],t[n]):r[n]=t[n]}),r):r},{})},g=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],i=o[1];if(null==i||"string"==typeof i&&""===i.trim()||"number"==typeof i&&isNaN(i)||Array.isArray(i)&&0===i.length||"object"===n(i)&&!Array.isArray(i)&&0===Object.keys(m(i)).length);else if("object"!==n(i)||Array.isArray(i))e[a]=i;else{var c=m(i);Object.keys(c).length>0&&(e[a]=c)}}),e},b=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),""}},w=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)}},j=function(r,t){try{return r?JSON.parse(r):t}catch(r){return console.log(r),t}},F=function(r){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];try{if(!r)return[];var n=JSON.parse(r);return Array.isArray(n)?n:[]}catch(r){return t}},M=function(r,t){try{return r?parseInt(r):t}catch(r){return t}},S=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)})},Y=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"},E=function(r){var t=null==r,n="string"==typeof r&&isNaN(Number(r));if(t||n)return"00:00:00";var e=Math.round(r),o=Math.floor(e/3600),a=Math.floor(e%3600/60),i=e%60,c=String(o).padStart(2,"0"),u=String(a).padStart(2,"0"),f=String(i).padStart(2,"0");return"".concat(c,":").concat(u,":").concat(f)},T=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("."),i=r(a,2),c=i[0],u=i[1],f=c.replace(/\B(?=(\d{3})+(?!\d))/g," "),s=f;return"00"!==u&&(s="".concat(f,".").concat(u)),"".concat(e).concat(s).concat(o)},x=function(r){return r.toLocaleString("en-US")},N=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=i(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{var n;if(!r)throw new Error;var e=null!==(n=O[t])&&void 0!==n?n:t;return c(r).format(e)}catch(r){return"unknown"}};export{g as cleanObject,w as decodeBase64,m as deepRemoveEmptyFields,b as encodeBase64,f as fetchDelay,N as formatCapitalizeFirstText,T as formatCurrency,D as formatDatetime,O as formatDatetimeStyles,E as formatDuration,Y as formatFileSize,x as formatNumberWithCommas,s as isGuid,l as isValidEmail,d as isValidPhoneNumber,y as isValidURL,h as mergeClasses,A as mergeObjects,u as sleep,F as tryParseArray,S as tryParseCsvFileToArray,M as tryParseIntRequired,j as tryParseObject,v 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) 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","_arrayLikeToArray","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 formatDuration = (duration?: number): string => {\r\n const isNotValidDuration = duration === undefined || duration === null\r\n const isNotNumber = typeof duration === 'string' && isNaN(Number(duration))\r\n if (isNotValidDuration || isNotNumber) return '00:00:00'\r\n\r\n // Round the duration to the nearest second\r\n const totalSeconds = Math.round(duration)\r\n\r\n // Calculate hours, minutes, and seconds\r\n const hours = Math.floor(totalSeconds / 3600)\r\n const minutes = Math.floor((totalSeconds % 3600) / 60)\r\n const seconds = totalSeconds % 60\r\n\r\n // Format each component to ensure it has two digits\r\n const hoursString = String(hours).padStart(2, '0')\r\n const minutesString = String(minutes).padStart(2, '0')\r\n const secondsString = String(seconds).padStart(2, '0')\r\n\r\n // Combine the components into a single string\r\n return `${hoursString}:${minutesString}:${secondsString}`\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\nexport type FormatDatetimeStyle = 'style1' | 'style2' | 'style3'\r\n\r\nexport const formatDatetimeStyles: Record<FormatDatetimeStyle, string> = {\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 or a custom format string.\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 * - style3: MM-DD-YYYY → e.g., '04-25-2025'\r\n * - Or any custom dayjs format string → e.g., 'YYYY-MM-DD', 'HH:mm:ss'\r\n *\r\n * @param value - A datetime string (ISO format or any format parsable by dayjs).\r\n * @param format - Format style key ('style1', 'style2', 'style3') or custom dayjs format string. 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: FormatDatetimeStyle | (string & {}) = 'style1'): string => {\r\n try {\r\n if (!value) throw new Error()\r\n const finalFormat = formatDatetimeStyles[format as FormatDatetimeStyle] ?? format\r\n return dayjs(value).format(finalFormat)\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","formatDuration","duration","isNotValidDuration","isNotNumber","Number","totalSeconds","Math","round","hours","floor","minutes","seconds","hoursString","padStart","minutesString","secondsString","concat","formatCurrency","parsedValue","prefix","suffix","parseFloat","e","_roundedValue$split","_roundedValue$split2","integerPart","decimalPart","formattedIntegerPart","replace","formattedValue","formatNumberWithCommas","number","toLocaleString","formatCapitalizeFirstText","_Array$from","from","_Array$from2","_toArray","first","_arrayLikeToArray","toUpperCase","formatDatetimeStyles","style1","style2","style3","formatDatetime","format","_formatDatetimeStyles","finalFormat","dayjs"],"mappings":"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"}
|
|
@@ -26,11 +26,11 @@ export interface IPreSubmitMetadata<T = any> {
|
|
|
26
26
|
}
|
|
27
27
|
export declare function formPreSubmit<T = any>(handler: IPreSubmitMetadata<T>['handler']): <T_1 extends new (...args: any[]) => {}>(constructor: T_1) => T_1;
|
|
28
28
|
export declare function getFormPreSubmit(targetClass: any): IPreSubmitMetadata | undefined;
|
|
29
|
-
export interface IFieldMetadata<T = any> {
|
|
29
|
+
export interface IFieldMetadata<T = any, O = {}> {
|
|
30
30
|
name: keyof T | string;
|
|
31
31
|
label?: string;
|
|
32
32
|
placeholder?: string;
|
|
33
|
-
|
|
33
|
+
defaultValue?: any;
|
|
34
34
|
type?: any;
|
|
35
35
|
size?: Partial<Record<'xs' | 'sm' | 'md' | 'lg' | 'xl', number>>;
|
|
36
36
|
visible?: boolean | ((data?: T) => boolean);
|
|
@@ -24,7 +24,7 @@ export interface IDecoratorFormSlots {
|
|
|
24
24
|
};
|
|
25
25
|
}
|
|
26
26
|
export interface IDecoratorFormProps<T = any> {
|
|
27
|
-
configClass
|
|
27
|
+
configClass?: any;
|
|
28
28
|
data?: Partial<T>;
|
|
29
29
|
onSubmit?: (data: Partial<T>, signal?: AbortSignal) => Promise<void>;
|
|
30
30
|
onError?: (error: any) => void;
|
|
@@ -33,4 +33,5 @@ export interface IDecoratorFormProps<T = any> {
|
|
|
33
33
|
}
|
|
34
34
|
export declare const DecoratorForm: FC<IDecoratorFormProps>;
|
|
35
35
|
export default DecoratorForm;
|
|
36
|
-
|
|
36
|
+
type IDecoratorFormOptions<T> = Partial<Omit<IDecoratorFormProps<T>, 'configClass'>>;
|
|
37
|
+
export declare const createDecoratorForm: <T>(configClass: any, params?: Partial<Omit<IDecoratorFormProps<T>, "configClass">> | undefined) => ComponentType<IDecoratorFormProps<T>>;
|
|
@@ -19,7 +19,7 @@ declare class DinoFormBase {
|
|
|
19
19
|
createFormComfirm: <T = any>(param?: import("./create.form-comfirm").IFormComfirmParam<T> | undefined) => import("react").ComponentType<import("react").PropsWithChildren<import("./create.form-comfirm").IFormComfirmProps<T>>>;
|
|
20
20
|
createFormGridLayout: <T>(params: import("./create.form-grid-layout").IFormGridLayoutParams<T>) => import("react").ComponentType<import("./create.form-grid-layout").IFormGridLayoutProps<T>>;
|
|
21
21
|
DecoratorForm: import("react").FC<import("./decorator.form").IDecoratorFormProps<any>>;
|
|
22
|
-
createDecoratorForm: <T>(configClass: any, params?: Partial<Omit<import("./decorator.form").IDecoratorFormProps<T>, "configClass">> | undefined) => import("react").ComponentType<
|
|
22
|
+
createDecoratorForm: <T>(configClass: any, params?: Partial<Omit<import("./decorator.form").IDecoratorFormProps<T>, "configClass">> | undefined) => import("react").ComponentType<import("./decorator.form").IDecoratorFormProps<T>>;
|
|
23
23
|
createColorPicker: typeof createColorPicker;
|
|
24
24
|
createDateExpired: typeof CreateDateExpired;
|
|
25
25
|
createDatePicker: <T extends Object>(params?: import("./create.date-picker").IDatePickerSlots | undefined) => import("react").ComponentType<import("./create.date-picker").IDatePickerProps<T>>;
|
|
@@ -3,7 +3,7 @@ export { default as FormValidator } from './validator';
|
|
|
3
3
|
export * from './validator';
|
|
4
4
|
export { default as DinoForm } from './dino-form';
|
|
5
5
|
export { getErrorMessage, convertFormDataToJson, validateCsvModel } from './helpers';
|
|
6
|
-
export type { ISelectWithApiOption } from './create.select-with-api';
|
|
6
|
+
export type { ISelectWithApiOption, ISelectWithApiFetchData, ISelectWithApiParams } from './create.select-with-api';
|
|
7
7
|
export type { InputBaseImage } from './create.input';
|
|
8
8
|
export * from './decorator';
|
|
9
9
|
export * from './decorator.form';
|
|
@@ -19,24 +19,24 @@ export declare const tryParseArray: <T>(value: any, defaultValue?: T[]) => T[];
|
|
|
19
19
|
export declare const tryParseIntRequired: (value: any, defaultValue: number) => number;
|
|
20
20
|
export declare const tryParseCsvFileToArray: (file: File) => Promise<Record<string, string>[]>;
|
|
21
21
|
export declare const formatFileSize: (sizeInKb: number) => string;
|
|
22
|
+
export declare const formatDuration: (duration?: number) => string;
|
|
22
23
|
export declare const formatCurrency: (value?: any, prefix?: string, suffix?: string) => string;
|
|
23
24
|
export declare const formatNumberWithCommas: (number: number) => string;
|
|
24
25
|
export declare const formatCapitalizeFirstText: (value?: string) => string;
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
style2: string;
|
|
28
|
-
style3: string;
|
|
29
|
-
};
|
|
26
|
+
export type FormatDatetimeStyle = 'style1' | 'style2' | 'style3';
|
|
27
|
+
export declare const formatDatetimeStyles: Record<FormatDatetimeStyle, string>;
|
|
30
28
|
/**
|
|
31
|
-
* Formats a datetime string using one of the predefined styles.
|
|
29
|
+
* Formats a datetime string using one of the predefined styles or a custom format string.
|
|
32
30
|
*
|
|
33
31
|
* Available format styles:
|
|
34
32
|
* - style1: DD/MM/YYYY HH:mm → e.g., '25/04/2025 14:30'
|
|
35
|
-
* - style2:
|
|
36
|
-
* -
|
|
33
|
+
* - style2: MMMM D, YYYY → e.g., 'April 25, 2025'
|
|
34
|
+
* - style3: MM-DD-YYYY → e.g., '04-25-2025'
|
|
35
|
+
* - Or any custom dayjs format string → e.g., 'YYYY-MM-DD', 'HH:mm:ss'
|
|
36
|
+
*
|
|
37
37
|
* @param value - A datetime string (ISO format or any format parsable by dayjs).
|
|
38
|
-
* @param format - Format style key
|
|
38
|
+
* @param format - Format style key ('style1', 'style2', 'style3') or custom dayjs format string. Defaults to 'style1'.
|
|
39
39
|
* @returns A formatted datetime string, or 'unknown' if the input is invalid or unparsable.
|
|
40
40
|
*/
|
|
41
|
-
export declare const formatDatetime: (value: string, format?:
|
|
41
|
+
export declare const formatDatetime: (value: string, format?: FormatDatetimeStyle | (string & {})) => string;
|
|
42
42
|
export {};
|
package/dist/utils/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export{cleanObject,decodeBase64,deepRemoveEmptyFields,encodeBase64,fetchDelay,formatCapitalizeFirstText,formatCurrency,formatDatetime,formatFileSize,formatNumberWithCommas,isGuid,isValidEmail,isValidPhoneNumber,isValidURL,mergeClasses,mergeObjects,sleep,tryParseArray,tryParseCsvFileToArray,tryParseIntRequired,tryParseObject,windowScrollToTop}from"../src/utils/helpers.js";import"../src/utils/dayjs-config.js";export{default as JObject}from"../src/utils/json-object.js";export{QueryParam}from"../src/utils/query-param.js";export{createObjectSingleton}from"../src/utils/singletone.js";export{default as dayjsCustom}from"dayjs";
|
|
1
|
+
export{cleanObject,decodeBase64,deepRemoveEmptyFields,encodeBase64,fetchDelay,formatCapitalizeFirstText,formatCurrency,formatDatetime,formatDatetimeStyles,formatDuration,formatFileSize,formatNumberWithCommas,isGuid,isValidEmail,isValidPhoneNumber,isValidURL,mergeClasses,mergeObjects,sleep,tryParseArray,tryParseCsvFileToArray,tryParseIntRequired,tryParseObject,windowScrollToTop}from"../src/utils/helpers.js";import"../src/utils/dayjs-config.js";export{default as JObject}from"../src/utils/json-object.js";export{QueryParam}from"../src/utils/query-param.js";export{createObjectSingleton}from"../src/utils/singletone.js";export{default as dayjsCustom}from"dayjs";
|
|
2
2
|
//# sourceMappingURL=index.js.map
|