dinocollab-core 2.1.35 → 2.1.38
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/create.action-row.js +1 -1
- package/dist/src/table/create.action-row.js.map +1 -1
- package/dist/types/form/decorator.d.ts +1 -1
- package/dist/types/form/decorator.form.d.ts +3 -2
- package/dist/types/form/dino-form.d.ts +1 -1
- package/dist/types/table/create.action-row.d.ts +3 -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> {\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 existing: IFieldMetadata[] = Reflect.hasOwnMetadata('form:fields', target.constructor)\r\n ? Reflect.getOwnMetadata('form:fields', target.constructor)\r\n : []\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 = {\r\n name: propertyKey,\r\n type: actualType,\r\n label: options.label || propertyKey,\r\n ...options,\r\n defaultValue\r\n }\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{inherits as r,createClass as e,objectSpread2 as t,classCallCheck as n,callSuper as o,defineProperty as i,regenerator as l}from"../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as a}from"react/jsx-runtime";import
|
|
1
|
+
import{inherits as r,createClass as e,objectSpread2 as t,classCallCheck as n,callSuper as o,defineProperty as i,regenerator as l}from"../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as a}from"react/jsx-runtime";import u,{Component as s}from"react";import{Box as c,Tooltip as p,IconButton as d}from"@mui/material";import f from"@mui/icons-material/Edit";import m from"@mui/icons-material/Delete";import{mergeObjects as v}from"../utils/helpers.js";import"../utils/dayjs-config.js";import"../utils/query-param.js";import{MapTableBaseContext as h}from"./context.js";function g(g){var b=function(){function b(){var r;n(this,b);for(var e=arguments.length,s=new Array(e),c=0;c<e;c++)s[c]=arguments[c];return r=o(this,b,[].concat(s)),i(r,"getButtons",l().m(function r(e,n,o){var i,s,c,v,h,b,y,k,C,j,x,w,D,E,A,M,P,B;return l().w(function(r){for(;;)switch(r.n){case 0:if(!(C=null!==(i=null===(s=e.props)||void 0===s?void 0:s.before)&&void 0!==i?i:null==n?void 0:n.before)){r.n=1;break}return r.n=1,a(u.Fragment,{children:C(e.props.value,o)},"Before");case 1:if(j=null!==(c=null===(v=e.props)||void 0===v?void 0:v.formEdit)&&void 0!==c?c:null==n?void 0:n.formEdit,x=j?j(e.props.value,o):void 0,!j||!x){r.n=2;break}return w=n.buttonEditProps,D="function"==typeof w?w(e.props.value):w,r.n=2,a(p,{title:"Edit",arrow:!0,children:a("span",{children:a(d,t(t({color:"primary"},D),{},{onClick:function(r){var e;null==o||o.showModal(t({renderContent:function(){return x||a(u.Fragment,{})},sx:{display:"flex",justifyContent:"center",alignItems:"center"},backdropActivated:!0},null==g?void 0:g.buttonEditConfig)),null==D||null===(e=D.onClick)||void 0===e||e.call(D,r)},children:a(f,{fontSize:"small"})}))})},"Edit");case 2:if(E=null!==(h=null===(b=e.props)||void 0===b?void 0:b.formDelete)&&void 0!==h?h:null==n?void 0:n.formDelete,A=E?E(e.props.value,o):void 0,!E||!A){r.n=3;break}return M=n.buttonDeleteProps,P="function"==typeof M?M(e.props.value):M,r.n=3,a(p,{title:"Delete",arrow:!0,children:a("span",{children:a(d,t(t({color:"error"},P),{},{onClick:function(r){var e;null==o||o.showModal(t({renderContent:function(){return A||a(u.Fragment,{})},sx:{display:"flex",justifyContent:"center",alignItems:"center"},backdropActivated:!0},null==g?void 0:g.buttonDeleteConfig)),null==P||null===(e=P.onClick)||void 0===e||e.call(P,r)},children:a(m,{fontSize:"small"})}))})},"Delete");case 3:if(!(B=null!==(y=null===(k=e.props)||void 0===k?void 0:k.after)&&void 0!==y?y:null==n?void 0:n.after)){r.n=4;break}return r.n=4,a(u.Fragment,{children:B(e.props.value,o)},"After");case 4:return r.a(2)}},r)})),r}return r(b,s),e(b,[{key:"propsMerge",get:function(){return v(g,this.props)}},{key:"render",value:function(){var r=this;return h(function(e){return a(c,t(t({sx:{display:"flex",alignItems:"center",height:"100%"}},r.propsMerge.wrapProps),{},{children:Array.from(r.getButtons(r,r.propsMerge,e))}))})}}])}();return b}export{g as default};
|
|
2
2
|
//# sourceMappingURL=create.action-row.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.action-row.js","sources":["../../../src/table/create.action-row.tsx"],"sourcesContent":["import React, { Component, ComponentType } from 'react'\r\nimport { Box, BoxProps, IconButton, Tooltip } from '@mui/material'\r\nimport EditIcon from '@mui/icons-material/Edit'\r\nimport DeleteIcon from '@mui/icons-material/Delete'\r\nimport { mergeObjects } from '../utils'\r\nimport { GlobalModalState } from '../api-context'\r\nimport { ITableBaseContext, MapTableBaseContext } from './context'\r\n\r\nexport interface IActionRowProps<T> {\r\n value: T\r\n formEdit?: (value: T, tableContext: ITableBaseContext) => React.ReactNode\r\n formDelete?: (value: T, tableContext: ITableBaseContext) => React.ReactNode\r\n after?: (value: T, tableContext: ITableBaseContext) => React.ReactNode\r\n before?: (value: T, tableContext: ITableBaseContext) => React.ReactNode\r\n wrapProps?: BoxProps\r\n buttonEditConfig?: GlobalModalState\r\n buttonDeleteConfig?: GlobalModalState\r\n}\r\n\r\nfunction CreateActionRow<T>(params?: Omit<IActionRowProps<T>, 'value'>): ComponentType<IActionRowProps<T>> {\r\n class ActionRow extends Component<IActionRowProps<T>> {\r\n get propsMerge() {\r\n return mergeObjects<IActionRowProps<T>>(params, this.props)\r\n }\r\n\r\n getButtons = function* (that: ActionRow, thatProps: Omit<IActionRowProps<T>, 'value'>, tableContext: ITableBaseContext) {\r\n const beforeFunc = that.props?.before ?? thatProps?.before\r\n if (beforeFunc) {\r\n yield <React.Fragment key='Before'>{beforeFunc(that.props.value, tableContext)}</React.Fragment>\r\n }\r\n const editFunc = that.props?.formEdit ?? thatProps?.formEdit\r\n const editContent = editFunc ? editFunc(that.props.value, tableContext) : undefined\r\n if (editFunc && !!editContent) {\r\n yield (\r\n <Tooltip title='Edit' arrow key='Edit'>\r\n <IconButton\r\n
|
|
1
|
+
{"version":3,"file":"create.action-row.js","sources":["../../../src/table/create.action-row.tsx"],"sourcesContent":["import React, { Component, ComponentType } from 'react'\r\nimport { Box, BoxProps, IconButton, IconButtonProps, Tooltip } from '@mui/material'\r\nimport EditIcon from '@mui/icons-material/Edit'\r\nimport DeleteIcon from '@mui/icons-material/Delete'\r\nimport { mergeObjects } from '../utils'\r\nimport { GlobalModalState } from '../api-context'\r\nimport { ITableBaseContext, MapTableBaseContext } from './context'\r\n\r\nexport interface IActionRowProps<T> {\r\n value: T\r\n formEdit?: (value: T, tableContext: ITableBaseContext) => React.ReactNode\r\n formDelete?: (value: T, tableContext: ITableBaseContext) => React.ReactNode\r\n after?: (value: T, tableContext: ITableBaseContext) => React.ReactNode\r\n before?: (value: T, tableContext: ITableBaseContext) => React.ReactNode\r\n wrapProps?: BoxProps\r\n buttonEditProps?: IconButtonProps | ((value: T) => IconButtonProps)\r\n buttonDeleteProps?: IconButtonProps | ((value: T) => IconButtonProps)\r\n buttonEditConfig?: GlobalModalState\r\n buttonDeleteConfig?: GlobalModalState\r\n}\r\n\r\nfunction CreateActionRow<T>(params?: Omit<IActionRowProps<T>, 'value'>): ComponentType<IActionRowProps<T>> {\r\n class ActionRow extends Component<IActionRowProps<T>> {\r\n get propsMerge() {\r\n return mergeObjects<IActionRowProps<T>>(params, this.props)\r\n }\r\n\r\n getButtons = function* (that: ActionRow, thatProps: Omit<IActionRowProps<T>, 'value'>, tableContext: ITableBaseContext) {\r\n const beforeFunc = that.props?.before ?? thatProps?.before\r\n if (beforeFunc) {\r\n yield <React.Fragment key='Before'>{beforeFunc(that.props.value, tableContext)}</React.Fragment>\r\n }\r\n const editFunc = that.props?.formEdit ?? thatProps?.formEdit\r\n const editContent = editFunc ? editFunc(that.props.value, tableContext) : undefined\r\n if (editFunc && !!editContent) {\r\n const { buttonEditProps } = thatProps\r\n const p = typeof buttonEditProps === 'function' ? buttonEditProps(that.props.value) : buttonEditProps\r\n yield (\r\n <Tooltip title='Edit' arrow key='Edit'>\r\n <span>\r\n <IconButton\r\n color='primary'\r\n {...p}\r\n onClick={(e) => {\r\n tableContext?.showModal({\r\n renderContent: () => editContent || <React.Fragment />,\r\n sx: { display: 'flex', justifyContent: 'center', alignItems: 'center' },\r\n backdropActivated: true,\r\n ...params?.buttonEditConfig\r\n })\r\n p?.onClick?.(e)\r\n }}\r\n >\r\n <EditIcon fontSize='small' />\r\n </IconButton>\r\n </span>\r\n </Tooltip>\r\n )\r\n }\r\n const deleteFunc = that.props?.formDelete ?? thatProps?.formDelete\r\n const deleteContent = deleteFunc ? deleteFunc(that.props.value, tableContext) : undefined\r\n if (deleteFunc && !!deleteContent) {\r\n const { buttonDeleteProps } = thatProps\r\n const p = typeof buttonDeleteProps === 'function' ? buttonDeleteProps(that.props.value) : buttonDeleteProps\r\n yield (\r\n <Tooltip title='Delete' arrow key='Delete'>\r\n <span>\r\n <IconButton\r\n color='error'\r\n {...p}\r\n onClick={(e) => {\r\n tableContext?.showModal({\r\n renderContent: () => deleteContent || <React.Fragment />,\r\n sx: { display: 'flex', justifyContent: 'center', alignItems: 'center' },\r\n backdropActivated: true,\r\n ...params?.buttonDeleteConfig\r\n })\r\n p?.onClick?.(e)\r\n }}\r\n >\r\n <DeleteIcon fontSize='small' />\r\n </IconButton>\r\n </span>\r\n </Tooltip>\r\n )\r\n }\r\n const afterFunc = that.props?.after ?? thatProps?.after\r\n if (afterFunc) {\r\n yield <React.Fragment key='After'>{afterFunc(that.props.value, tableContext)}</React.Fragment>\r\n }\r\n }\r\n\r\n render() {\r\n return MapTableBaseContext((context) => (\r\n <Box sx={{ display: 'flex', alignItems: 'center', height: '100%' }} {...this.propsMerge.wrapProps}>\r\n {Array.from(this.getButtons(this, this.propsMerge, context))}\r\n </Box>\r\n ))\r\n }\r\n }\r\n\r\n return ActionRow\r\n}\r\nexport default CreateActionRow\r\n"],"names":["CreateActionRow","params","ActionRow","_this","_classCallCheck","_len","arguments","length","args","Array","_key","_callSuper","this","concat","_defineProperty","_regenerator","m","_callee","that","thatProps","tableContext","_that$props$before","_that$props","_that$props$formEdit","_that$props2","_that$props$formDelet","_that$props3","_that$props$after","_that$props4","beforeFunc","editFunc","editContent","buttonEditProps","p","deleteFunc","deleteContent","buttonDeleteProps","_p","afterFunc","w","_context","n","props","before","_jsx","React","Fragment","children","value","formEdit","undefined","Tooltip","title","arrow","IconButton","_objectSpread","color","onClick","e","_p$onClick","showModal","renderContent","sx","display","justifyContent","alignItems","backdropActivated","buttonEditConfig","call","EditIcon","fontSize","formDelete","_p$onClick2","buttonDeleteConfig","DeleteIcon","after","a","_inherits","Component","_createClass","key","get","mergeObjects","_this2","MapTableBaseContext","context","Box","height","propsMerge","wrapProps","from","getButtons"],"mappings":"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"}
|
|
@@ -30,7 +30,7 @@ export interface IFieldMetadata<T = any> {
|
|
|
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>>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React, { ComponentType } from 'react';
|
|
2
|
-
import { BoxProps } from '@mui/material';
|
|
2
|
+
import { BoxProps, IconButtonProps } from '@mui/material';
|
|
3
3
|
import { GlobalModalState } from '../api-context';
|
|
4
4
|
import { ITableBaseContext } from './context';
|
|
5
5
|
export interface IActionRowProps<T> {
|
|
@@ -9,6 +9,8 @@ export interface IActionRowProps<T> {
|
|
|
9
9
|
after?: (value: T, tableContext: ITableBaseContext) => React.ReactNode;
|
|
10
10
|
before?: (value: T, tableContext: ITableBaseContext) => React.ReactNode;
|
|
11
11
|
wrapProps?: BoxProps;
|
|
12
|
+
buttonEditProps?: IconButtonProps | ((value: T) => IconButtonProps);
|
|
13
|
+
buttonDeleteProps?: IconButtonProps | ((value: T) => IconButtonProps);
|
|
12
14
|
buttonEditConfig?: GlobalModalState;
|
|
13
15
|
buttonDeleteConfig?: GlobalModalState;
|
|
14
16
|
}
|