@vertigis/workflow 5.40.1 → 5.42.0
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/activities/arcgis/ArcadeScript.d.ts +5 -1
- package/activities/arcgis/ArcadeScript.js +1 -1
- package/activities/arcgis/CreateFeatureSet.d.ts +1 -0
- package/activities/arcgis/CreateFeatureSet.js +1 -1
- package/activities/arcgis/MapProvider.js +1 -1
- package/activities/arcgis/QueryTask.d.ts +4 -2
- package/activities/arcgis/QueryTask.js +1 -1
- package/activities/arcgis/RunPrint.d.ts +1 -0
- package/activities/arcgis/RunPrint.js +1 -1
- package/activities/arcgis/RunReport.d.ts +1 -0
- package/activities/arcgis/RunReport.js +1 -1
- package/activities/arcgis/SymbolFromJson.js +1 -1
- package/activities/arcgis/TypeChecking.d.ts +1 -2
- package/activities/core/Subworkflow.d.ts +2 -0
- package/activities/ui/Alert.d.ts +6 -3
- package/activities/ui/Alert.js +1 -1
- package/activities/ui/Confirm.d.ts +6 -3
- package/activities/ui/Confirm.js +1 -1
- package/activities/ui/DialogContent.d.ts +24 -0
- package/activities/ui/DialogContent.js +1 -0
- package/activities/ui/DialogProvider.d.ts +19 -0
- package/activities/ui/DialogProvider.js +1 -0
- package/activities/ui/Prompt.d.ts +7 -4
- package/activities/ui/Prompt.js +1 -1
- package/execution/util.js +1 -1
- package/forms/FormDefinition.d.ts +1 -1
- package/forms/FormHost.d.ts +1 -3
- package/forms/components/AccordionGroup.js +1 -1
- package/forms/components/AutoComplete.d.ts +1 -1
- package/forms/components/AutoComplete.js +1 -1
- package/forms/components/ButtonBar.d.ts +1 -1
- package/forms/components/ButtonBar.js +1 -1
- package/forms/components/CheckBox.d.ts +1 -1
- package/forms/components/CheckBox.js +1 -1
- package/forms/components/CheckGroup.d.ts +1 -1
- package/forms/components/CheckGroup.js +1 -1
- package/forms/components/Custom.d.ts +1 -1
- package/forms/components/Custom.js +1 -1
- package/forms/components/DatePicker.d.ts +1 -1
- package/forms/components/DatePicker.js +1 -1
- package/forms/components/DateRangePicker.d.ts +1 -1
- package/forms/components/DateRangePicker.js +1 -1
- package/forms/components/DateTimePicker.d.ts +1 -1
- package/forms/components/DateTimePicker.js +1 -1
- package/forms/components/DropDownList.d.ts +1 -1
- package/forms/components/DropDownList.js +1 -1
- package/forms/components/FilePicker.d.ts +4 -1
- package/forms/components/FilePicker.js +1 -1
- package/forms/components/Form.d.ts +1 -1
- package/forms/components/Form.js +1 -1
- package/forms/components/FormElement.d.ts +37 -0
- package/forms/components/FormElement.js +1 -0
- package/forms/components/GeometryPicker.d.ts +4 -1
- package/forms/components/GeometryPicker.js +1 -1
- package/forms/components/HorizontalRule.d.ts +1 -1
- package/forms/components/HorizontalRule.js +1 -1
- package/forms/components/Image.d.ts +1 -1
- package/forms/components/Image.js +1 -1
- package/forms/components/ItemPicker.d.ts +1 -1
- package/forms/components/ItemPicker.js +1 -1
- package/forms/components/ListBox.d.ts +4 -1
- package/forms/components/ListBox.js +1 -1
- package/forms/components/Markdown.d.ts +1 -3
- package/forms/components/Markdown.js +1 -1
- package/forms/components/Number.d.ts +1 -1
- package/forms/components/Number.js +1 -1
- package/forms/components/NumberRangeSlider.d.ts +1 -1
- package/forms/components/NumberRangeSlider.js +1 -1
- package/forms/components/NumberSlider.d.ts +1 -1
- package/forms/components/NumberSlider.js +1 -1
- package/forms/components/RadioGroup.d.ts +1 -1
- package/forms/components/RadioGroup.js +1 -1
- package/forms/components/Scanner.d.ts +1 -1
- package/forms/components/Scanner.js +1 -1
- package/forms/components/Section.d.ts +1 -1
- package/forms/components/Section.js +1 -1
- package/forms/components/Signature.d.ts +1 -1
- package/forms/components/Signature.js +1 -1
- package/forms/components/SignatureDialog.d.ts +3 -1
- package/forms/components/SignatureDialog.js +1 -1
- package/forms/components/Sketch.d.ts +1 -1
- package/forms/components/Sketch.js +1 -1
- package/forms/components/SketchDialog.d.ts +3 -8
- package/forms/components/SketchDialog.js +1 -1
- package/forms/components/TabGroup.js +1 -1
- package/forms/components/Text.d.ts +1 -1
- package/forms/components/Text.js +1 -1
- package/forms/components/TextArea.d.ts +1 -1
- package/forms/components/TextArea.js +1 -1
- package/forms/components/TextBox.d.ts +1 -1
- package/forms/components/TextBox.js +1 -1
- package/forms/components/TimePicker.d.ts +1 -1
- package/forms/components/TimePicker.js +1 -1
- package/forms/{common.d.ts → components/common.d.ts} +13 -28
- package/forms/components/common.js +1 -0
- package/forms/dateUtilities.d.ts +10 -5
- package/forms/dateUtilities.js +1 -1
- package/forms/hostContext.d.ts +4 -0
- package/forms/hostContext.js +1 -0
- package/forms/index.d.ts +0 -21
- package/forms/numberUtilities.d.ts +1 -1
- package/forms/numberUtilities.js +1 -1
- package/forms/presenter.js +1 -1
- package/forms/utils.d.ts +13 -0
- package/forms/utils.js +1 -1
- package/libs/version.d.ts +1 -1
- package/libs/version.js +1 -1
- package/licensing/LicenseChecker.js +1 -1
- package/package.json +8 -7
- package/ui/UIService.d.ts +23 -0
- package/ui/UIService.js +1 -0
- package/forms/FormElement.d.ts +0 -23
- package/forms/FormElement.js +0 -1
- package/forms/common.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import Accordion,{accordionClasses}from"@vertigis/react-ui/Accordion";import AccordionSummary from"@vertigis/react-ui/AccordionSummary";import Box from"@vertigis/react-ui/Box";import FormLabel from"@vertigis/react-ui/FormLabel";import ChevronDown from"@vertigis/react-ui/icons/ChevronDown";import{styled}from"@vertigis/react-ui/styles";import clsx from"clsx";import*as React from"react";import{useEffect}from"react";import{defs}from"../FormHost.js";import
|
|
1
|
+
import Accordion,{accordionClasses}from"@vertigis/react-ui/Accordion";import AccordionSummary from"@vertigis/react-ui/AccordionSummary";import Box from"@vertigis/react-ui/Box";import FormLabel from"@vertigis/react-ui/FormLabel";import ChevronDown from"@vertigis/react-ui/icons/ChevronDown";import{styled}from"@vertigis/react-ui/styles";import clsx from"clsx";import*as React from"react";import{useContext,useEffect}from"react";import{defs}from"../FormHost.js";import HostContext from"../hostContext.js";import{getLabelId,isAccordionSection,isCollapsibleSection,isFieldsetSection,isTabSection,makeSafeClassName,makeUniqueId}from"../utils.js";import Markdown from"./Markdown.js";import{renderAccessibleDescription,renderDescription,renderError,useFocusCallback}from"./common.js";const PREFIX="WorkflowSection",sectionClasses={root:`${PREFIX}-root`,basicSection:`${PREFIX}-basicSection`,fieldSetSection:`${PREFIX}-fieldSetSection`,tabSection:`${PREFIX}-tabSetSection`,title:`${PREFIX}-title`,unstyledSection:`${PREFIX}-unstyledSection`,description:`${PREFIX}-description`},StyledAccordion=styled(Accordion)(({theme:{spacing:e}})=>({[`.${accordionClasses.region}`]:{padding:e(1),[`.${sectionClasses.description} p`]:{marginBottom:0,marginTop:0,padding:e(.5)}}})),StyledTabPage=styled(Box)(({theme:{spacing:e}})=>({padding:e(1)})),StyledSection=styled(Box)(({theme:{palette:e,spacing:t,typography:{pxToRem:o}}})=>({margin:`${t(4)} 0 ${t(4)} 0`,[`.${sectionClasses.description} p`]:{marginBottom:0,marginTop:0,padding:t(.5)},[`&.${sectionClasses.basicSection}`]:{borderLeft:`6px solid ${e.primary[500]}`,paddingLeft:t(1),paddingRight:t(1)},[`&.${sectionClasses.fieldSetSection}`]:{position:"relative",border:`3px solid ${e.primary[500]}`,borderLeft:"none",borderRight:"none",padding:`${t(3)} 0 ${t(2)} 0`,[`.${sectionClasses.title}`]:{backgroundColor:e.background.default,position:"absolute",top:o(-22),left:0,padding:0,"& span":{paddingRight:t(1)}}},[`&.${sectionClasses.unstyledSection}`]:{marginBottom:0,marginTop:0}})),Section=({accessibleDescription:e,className:t,collapsed:o,component:i,description:s,element:n,enabled:r,error:a,name:c,setProperty:l})=>{const d=useContext(HostContext);let m;null!=n&&n.format&&(m=n.format),m=void 0!==m&&null!==m?m:defs.DEFAULT_SECTION_FORMAT;const p=isAccordionSection(n);var S=isFieldsetSection(n),f=isTabSection(n);const b=p||f||isCollapsibleSection(n);var u=`${makeUniqueId(c)}-input`,g=useFocusCallback(r,c,d);useEffect(()=>(d.refs[c]=i,()=>{d.refs[c]=void 0}),[]);var C,y,E,$=(C=n,y=u,E=S?"legend":void 0,React.createElement(FormLabel,{className:sectionClasses.title,error:b&&(d.hasInvalidChild(C)||!!a),id:getLabelId(y),component:E||"h6"},React.createElement(Markdown,{inline:!0,text:C.title}))),r=renderDescription(s,u,r,sectionClasses.description),e=renderAccessibleDescription(e,s,u,d),s=renderError(a),u={"aria-labelledby":$?.props?.id,"aria-details":r?.props?.id,"aria-describedby":e?.props?.id},s=[r,e,s,i.props.children],n=clsx(t,n.type,sectionClasses.root,{[sectionClasses.basicSection]:"basic-section"===m,[sectionClasses.fieldSetSection]:"fieldset-section"===m,[sectionClasses.tabSection]:"tab-section"===m,[sectionClasses.unstyledSection]:"unstyled-section"===m,[makeSafeClassName(c)]:!!c,[makeSafeClassName(n.styleName)]:!!n.styleName});if(f)return React.createElement(StyledTabPage,{"aria-labelledby":`simple-tab-${c}`,className:n,hidden:o,id:`simple-tabpanel-${c}`,role:"tabpanel"},...s);if(b)return React.createElement(StyledAccordion,{className:n,expanded:!0!==o,onChange:(e,t)=>{p&&t?d.updateMutuallyExclusiveSections(c):l("collapsed",!t)},...u},React.createElement(AccordionSummary,{expandIcon:React.createElement(ChevronDown,null),ref:g},$),...s);{const i=S?"fieldset":"section";return React.createElement(StyledSection,{className:n,component:i,...u},$,React.createElement(Box,null,...s))}};export default Section;export{sectionClasses};
|
|
@@ -8,5 +8,5 @@ export declare const signatureClasses: {
|
|
|
8
8
|
/**
|
|
9
9
|
* The component for the "Signature" Form Element.
|
|
10
10
|
*/
|
|
11
|
-
declare const Signature: ({ className,
|
|
11
|
+
declare const Signature: ({ className, element, enabled, label, name, prompt, require, setValue, size, title, tooltip: elementTooltip, value, }: FormElementProps<defs.SignatureRef | undefined>) => React.JSX.Element;
|
|
12
12
|
export default Signature;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import Box from"@vertigis/react-ui/Box";import Button from"@vertigis/react-ui/Button";import Dialog from"@vertigis/react-ui/Dialog";import IconButton from"@vertigis/react-ui/IconButton";import SignatureIcon from"@vertigis/react-ui/icons/Signature";import Trash from"@vertigis/react-ui/icons/Trash";import{styled}from"@vertigis/react-ui/styles";import*as React from"react";import{useEffect,useState}from"react";import
|
|
1
|
+
import Box from"@vertigis/react-ui/Box";import Button from"@vertigis/react-ui/Button";import Dialog from"@vertigis/react-ui/Dialog";import IconButton from"@vertigis/react-ui/IconButton";import SignatureIcon from"@vertigis/react-ui/icons/Signature";import Trash from"@vertigis/react-ui/icons/Trash";import{styled}from"@vertigis/react-ui/styles";import*as React from"react";import{useContext,useEffect,useState}from"react";import{signatureConfiguration}from"../elements/Signature.js";import HostContext from"../hostContext.js";import{makeUniqueId}from"../utils.js";import FormElement from"./FormElement.js";import Markdown from"./Markdown.js";import SignatureDialog from"./SignatureDialog.js";import{renderTitle,useFocusCallback}from"./common.js";const PREFIX="Signature",signatureClasses={button:`${PREFIX}-button`,image:`${PREFIX}-image`},StyledFormElement=styled(FormElement)(({theme:{spacing:e}})=>({[`.${signatureClasses.button}`]:{marginBottom:e(1),marginTop:e(1)},[`.${signatureClasses.image}`]:{alignItems:"flex-start",display:"flex",flexDirection:"row",gap:e(1),img:{border:"solid 1px grey",flexShrink:1,minWidth:0}}})),Signature=({className:e,element:t,enabled:a,label:i,name:r,prompt:o,require:n,setValue:s,size:l,title:m,tooltip:c,value:u})=>{const g=useContext(HostContext),[d,f]=useState(),[p,x]=useState(500),C=g.renderText(c),h=useFocusCallback(a,r,g),E=g.renderText("@common-clear");useEffect(()=>{let e=signatureConfiguration.width.default;"number"!=typeof l||isNaN(l)?"object"!=typeof l||void 0===l.width||isNaN(l.width)||(e=l.width):e=l,e=Math.max(e,signatureConfiguration.width.minimum),e=Math.min(e,signatureConfiguration.width.maximum),x(e)},[l]),useEffect(()=>{f(u?.dataUrl)},[u]);const b=async e=>{if(e){const a=await fetch(e);var t=await a.blob(),t=new File([t],`${r}.png`,{type:t.type});s({refValueType:"signature",dataUrl:e,file:t})}else s(void 0);f(e)};return React.createElement(StyledFormElement,{className:e,element:t,name:r},d?React.createElement(Box,{className:signatureClasses.image},React.createElement("img",{src:d,alt:C}),React.createElement(IconButton,{"aria-label":E,disabled:!a,onClick:()=>b(void 0),title:E},React.createElement(Trash,null))):null,d?null:React.createElement(Box,{className:signatureClasses.button},React.createElement(Button,{disabled:!a,onClick:async()=>{const e=Math.round(.4*p);await g.displayDialog(a=>React.createElement(SignatureDialog,{cancelCaption:g.renderText("@common-cancel"),clearCaption:E,doneCaption:g.renderText("@common-done"),format:"image/png",height:e,helperText:React.createElement(Markdown,{inline:!0,text:i}),host:g,onClose:(e,t)=>{e&&b(t),a()},title:renderTitle(makeUniqueId(r+"-dialog"),n,m),undoCaption:g.renderText("@common-undo"),width:p}),Dialog)},ref:h,startIcon:React.createElement(SignatureIcon,null),title:C,variant:"outlined"},React.createElement(Markdown,{inline:!0,text:o||""}))))};export default Signature;export{signatureClasses};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
+
import type { FormHostMembers } from "../hostContext";
|
|
2
3
|
export declare const signatureDialogClasses: {
|
|
3
4
|
canvas: string;
|
|
4
5
|
canvasAnnotations: string;
|
|
@@ -13,10 +14,11 @@ export interface StyledDialogProps {
|
|
|
13
14
|
format: string;
|
|
14
15
|
helperText: React.JSX.Element | null;
|
|
15
16
|
height: number;
|
|
17
|
+
host: FormHostMembers;
|
|
16
18
|
title: React.JSX.Element | null;
|
|
17
19
|
undoCaption: string;
|
|
18
20
|
width: number;
|
|
19
21
|
onClose: (confirm: boolean, dataUrl: string | undefined) => void;
|
|
20
22
|
}
|
|
21
|
-
declare const SignatureDialog: ({ cancelCaption, clearCaption, doneCaption, format, height, helperText, title, undoCaption, width, onClose, }: StyledDialogProps) => React.JSX.Element;
|
|
23
|
+
declare const SignatureDialog: ({ cancelCaption, clearCaption, doneCaption, format, height, helperText, host, title, undoCaption, width, onClose, }: StyledDialogProps) => React.JSX.Element;
|
|
22
24
|
export default SignatureDialog;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import Box from"@vertigis/react-ui/Box";import Button from"@vertigis/react-ui/Button";import DialogActions from"@vertigis/react-ui/DialogActions";import DialogContent from"@vertigis/react-ui/DialogContent";import DialogTitle from"@vertigis/react-ui/DialogTitle";import IconButton from"@vertigis/react-ui/IconButton";import Skeleton from"@vertigis/react-ui/Skeleton";import Stack from"@vertigis/react-ui/Stack";import Typography from"@vertigis/react-ui/Typography";import Trash from"@vertigis/react-ui/icons/Trash";import Undo from"@vertigis/react-ui/icons/Undo";import{styled}from"@vertigis/react-ui/styles";import*as React from"react";import{lazy,Suspense}from"react";const SignaturePadWrapper=lazy(()=>import("react-signature-pad-wrapper")),DialogPrefix="SignatureDialog",signatureDialogClasses={canvas:`${DialogPrefix}-canvas`,canvasAnnotations:`${DialogPrefix}-canvas-annotations`,container:`${DialogPrefix}-container`,mark:`${DialogPrefix}-mark`,titleText:`${DialogPrefix}-title-text`},StyledDialogTitle=styled(DialogTitle)(()=>({display:"flex",[`.${signatureDialogClasses.titleText}`]:{flexGrow:1,flexShrink:1}})),StyledDialogContent=styled(DialogContent)(({theme:{spacing:e,typography:t}})=>({[`.${signatureDialogClasses.container}`]:{backgroundColor:"#eee",filter:"drop-shadow(2px 2px 2px grey)",[`.${signatureDialogClasses.canvas}`]:{position:"relative",zIndex:1},[`.${signatureDialogClasses.canvasAnnotations}`]:{alignItems:"center",display:"flex",flexDirection:"column",marginTop:t.pxToRem(-64),paddingLeft:e(1),paddingRight:e(1),position:"relative",zIndex:0,[`.${signatureDialogClasses.mark}`]:{fontSize:"large",borderBottom:"solid 1px black",width:"100%"}}}})),NonItalicCaption=styled(Typography)(()=>({fontStyle:"inherit"})),SignatureDialog=({cancelCaption:e,clearCaption:t,doneCaption:a,format:i,height:o,helperText:r,
|
|
1
|
+
import Box from"@vertigis/react-ui/Box";import Button from"@vertigis/react-ui/Button";import DialogActions from"@vertigis/react-ui/DialogActions";import DialogContent from"@vertigis/react-ui/DialogContent";import DialogTitle from"@vertigis/react-ui/DialogTitle";import IconButton from"@vertigis/react-ui/IconButton";import Skeleton from"@vertigis/react-ui/Skeleton";import Stack from"@vertigis/react-ui/Stack";import Typography from"@vertigis/react-ui/Typography";import Trash from"@vertigis/react-ui/icons/Trash";import Undo from"@vertigis/react-ui/icons/Undo";import{styled}from"@vertigis/react-ui/styles";import*as React from"react";import{lazy,Suspense}from"react";import{HostProvider}from"../hostContext.js";const SignaturePadWrapper=lazy(()=>import("react-signature-pad-wrapper")),DialogPrefix="SignatureDialog",signatureDialogClasses={canvas:`${DialogPrefix}-canvas`,canvasAnnotations:`${DialogPrefix}-canvas-annotations`,container:`${DialogPrefix}-container`,mark:`${DialogPrefix}-mark`,titleText:`${DialogPrefix}-title-text`},StyledDialogTitle=styled(DialogTitle)(()=>({display:"flex",[`.${signatureDialogClasses.titleText}`]:{flexGrow:1,flexShrink:1}})),StyledDialogContent=styled(DialogContent)(({theme:{spacing:e,typography:t}})=>({[`.${signatureDialogClasses.container}`]:{backgroundColor:"#eee",filter:"drop-shadow(2px 2px 2px grey)",[`.${signatureDialogClasses.canvas}`]:{position:"relative",zIndex:1},[`.${signatureDialogClasses.canvasAnnotations}`]:{alignItems:"center",display:"flex",flexDirection:"column",marginTop:t.pxToRem(-64),paddingLeft:e(1),paddingRight:e(1),position:"relative",zIndex:0,[`.${signatureDialogClasses.mark}`]:{fontSize:"large",borderBottom:"solid 1px black",width:"100%"}}}})),NonItalicCaption=styled(Typography)(()=>({fontStyle:"inherit"})),SignatureDialog=({cancelCaption:e,clearCaption:t,doneCaption:a,format:i,height:o,helperText:r,host:n,title:l,undoCaption:s,width:c,onClose:g})=>{let m,p,u;return React.createElement(HostProvider,{value:n},React.createElement(StyledDialogTitle,null,React.createElement("div",{className:signatureDialogClasses.titleText},l),React.createElement(Stack,{direction:"row"},React.createElement(IconButton,{"aria-label":s,onClick:async()=>{if(m){const e=m.toData();e.pop(),m.fromData(e)}},title:s},React.createElement(Undo,null)),React.createElement(IconButton,{"aria-label":t,onClick:async()=>{p&&p.clear()},title:t},React.createElement(Trash,null)))),React.createElement(StyledDialogContent,null,React.createElement(Box,{className:signatureDialogClasses.container,sx:{height:`${o}px`,width:`${c}px`}},React.createElement(Suspense,{fallback:React.createElement(Skeleton,{variant:"rectangular",width:c,height:o})},React.createElement(SignaturePadWrapper,{canvasProps:{className:signatureDialogClasses.canvas},ref:e=>{m=e||void 0,p=m?.instance||void 0,u=m?.canvas?.current||void 0,u&&(u.oncontextmenu=()=>!1,u.height=o,u.width=c)}}),React.createElement(Box,{className:signatureDialogClasses.canvasAnnotations},React.createElement(Typography,{"aria-hidden":!0,className:signatureDialogClasses.mark},"X"),React.createElement(NonItalicCaption,{variant:"caption"},r))))),React.createElement(DialogActions,null,React.createElement(Button,{color:"primary",onClick:()=>{let e;p&&!p.isEmpty()&&(e=p.toDataURL(i)),g(!0,e)},variant:"contained"},a),React.createElement(Button,{color:"inherit",onClick:()=>{g(!1,void 0)},variant:"outlined"},e)))};export default SignatureDialog;export{signatureDialogClasses};
|
|
@@ -9,5 +9,5 @@ export declare const sketchClasses: {
|
|
|
9
9
|
/**
|
|
10
10
|
* The component for the "Sketch" Form Element.
|
|
11
11
|
*/
|
|
12
|
-
declare const Sketch: ({ className,
|
|
12
|
+
declare const Sketch: ({ className, element, enabled, name, prompt, require, setValue, size, source, title, tooltip: elementTooltip, value, }: FormElementProps<defs.SketchRef | undefined>) => React.JSX.Element;
|
|
13
13
|
export default Sketch;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import Box from"@vertigis/react-ui/Box";import Button from"@vertigis/react-ui/Button";import Dialog,{dialogClasses}from"@vertigis/react-ui/Dialog";import IconButton from"@vertigis/react-ui/IconButton";import Stack from"@vertigis/react-ui/Stack";import Edit from"@vertigis/react-ui/icons/Edit";import Trash from"@vertigis/react-ui/icons/Trash";import{styled}from"@vertigis/react-ui/styles";import*as React from"react";import{useEffect,useRef,useState}from"react";import
|
|
1
|
+
import Box from"@vertigis/react-ui/Box";import Button from"@vertigis/react-ui/Button";import Dialog,{dialogClasses}from"@vertigis/react-ui/Dialog";import IconButton from"@vertigis/react-ui/IconButton";import Stack from"@vertigis/react-ui/Stack";import Edit from"@vertigis/react-ui/icons/Edit";import Trash from"@vertigis/react-ui/icons/Trash";import{styled}from"@vertigis/react-ui/styles";import*as React from"react";import{useContext,useEffect,useRef,useState}from"react";import HostContext from"../hostContext.js";import{makeUniqueId}from"../utils.js";import FormElement from"./FormElement.js";import Markdown from"./Markdown.js";import SketchDialog from"./SketchDialog.js";import{renderTitle,useFocusCallback}from"./common.js";const PREFIX="Sketch",sketchClasses={button:`${PREFIX}-button`,imagePanel:`${PREFIX}-image-panel`,imageScroller:`${PREFIX}-image-scroller`},StyledFormElement=styled(FormElement)(({theme:{spacing:e}})=>({[`.${sketchClasses.button}`]:{marginBottom:e(1),marginTop:e(1)},[`.${sketchClasses.imagePanel}`]:{alignItems:"flex-start",display:"flex",flexDirection:"row",gap:e(1),img:{border:"solid 1px grey",maxWidth:"100%",minWidth:0}}})),StyledDialog=styled(Dialog)(()=>({[`.${dialogClasses.paper}`]:{maxWidth:"inherit"}})),Sketch=({className:e,element:t,enabled:a,name:i,prompt:r,require:o,setValue:l,size:s,source:c,title:n,tooltip:m,value:u})=>{const d=useContext(HostContext),[f,g]=useState(),[h,p]=useState(),[k,E]=useState(),[R,v]=useState(),x=useRef([]),y=useRef(),b=d.renderText(m),C=useFocusCallback(a,i,d);useEffect(()=>{var e,t;"object"==typeof s&&(e=void 0===s.height||isNaN(s.height)?void 0:s.height,t=void 0===s.width||isNaN(s.width)?void 0:s.width,p(e),v(t))},[s]),useEffect(()=>{g("object"==typeof u?u.dataUrl:void 0)},[u]),useEffect(()=>{var e;return y.current&&(URL.revokeObjectURL(y.current),y.current=void 0),"string"==typeof c?E(c):c instanceof File&&(e=URL.createObjectURL(c),E(e),y.current=e),()=>{y.current&&URL.revokeObjectURL(y.current)}},[c]);const S=async e=>{if(e){const r=await fetch(e);var t=await r.blob(),t=new File([t],`${i}.png`,{type:t.type});l({refValueType:"sketch",dataUrl:e,file:t})}else l(void 0);g(e)},w=!!k&&!!f,F=async()=>{await d.displayDialog(r=>React.createElement(SketchDialog,{dataUrl:f,height:h,history:x.current,host:d,onClose:(e,t)=>{e&&t&&(S(t.dataUrl),v(t.width),p(t.height),x.current=t.history),r()},source:k,title:renderTitle(makeUniqueId(i+"-dialog"),o,n),width:R}),StyledDialog)};return React.createElement(StyledFormElement,{className:e,element:t,name:i},(()=>{if(!f&&!k)return null;var e=f||k,t=d.renderText("@common-clear"),r=d.renderText("@common-edit");return React.createElement(Box,{className:sketchClasses.imagePanel},React.createElement("img",{src:e,alt:b}),w&&React.createElement(Stack,null,React.createElement(IconButton,{"aria-label":r,disabled:!a,onClick:F,ref:C,title:r},React.createElement(Edit,null)),React.createElement(IconButton,{"aria-label":t,disabled:!a,onClick:()=>{S(void 0),x.current=[]},title:t},React.createElement(Trash,null))))})(),w?null:React.createElement(Box,{className:sketchClasses.button},React.createElement(Button,{disabled:!a||!k,onClick:F,ref:e=>{k&&C(e)},title:b,variant:"outlined"},React.createElement(Markdown,{inline:!0,text:r||""}))))};export default Sketch;export{sketchClasses};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import type {
|
|
2
|
+
import type { FormHostMembers } from "../hostContext";
|
|
3
3
|
export declare const sketchDialogClasses: {
|
|
4
4
|
canvasContainer: string;
|
|
5
5
|
canvasScroller: string;
|
|
@@ -44,13 +44,8 @@ export interface StyledDialogProps {
|
|
|
44
44
|
dataUrl: string | undefined;
|
|
45
45
|
height: number | undefined;
|
|
46
46
|
history: HistoryItem[];
|
|
47
|
+
host: FormHostMembers;
|
|
47
48
|
onClose: (confirm: boolean, result?: SketchDialogResult) => void;
|
|
48
|
-
/**
|
|
49
|
-
* Renders form text as a string.
|
|
50
|
-
* If `text` is a reference to a language string (e.g. `"@my-language-string"`), it is translated.
|
|
51
|
-
* If `text` is a `MarkdownRef`, it is converted to plain text.
|
|
52
|
-
*/
|
|
53
|
-
renderText: (text: defs.Text | undefined) => string;
|
|
54
49
|
source: string;
|
|
55
50
|
title: React.JSX.Element | null;
|
|
56
51
|
width: number | undefined;
|
|
@@ -63,5 +58,5 @@ type Point = {
|
|
|
63
58
|
x: number;
|
|
64
59
|
y: number;
|
|
65
60
|
};
|
|
66
|
-
declare const SketchDialog: ({ dataUrl, height, history: previousHistory,
|
|
61
|
+
declare const SketchDialog: ({ dataUrl, height, history: previousHistory, host, onClose, source, title, width, }: StyledDialogProps) => React.JSX.Element;
|
|
67
62
|
export default SketchDialog;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import Box from"@vertigis/react-ui/Box";import Button from"@vertigis/react-ui/Button";import DialogActions from"@vertigis/react-ui/DialogActions";import DialogContent from"@vertigis/react-ui/DialogContent";import DialogTitle from"@vertigis/react-ui/DialogTitle";import FormControl from"@vertigis/react-ui/FormControl";import FormControlLabel from"@vertigis/react-ui/FormControlLabel";import FormLabel from"@vertigis/react-ui/FormLabel";import FormLabelColorField from"@vertigis/react-ui/FormLabelColorField";import IconButton from"@vertigis/react-ui/IconButton";import Radio from"@vertigis/react-ui/Radio";import RadioGroup from"@vertigis/react-ui/RadioGroup";import Slider from"@vertigis/react-ui/Slider";import Stack from"@vertigis/react-ui/Stack";import Trash from"@vertigis/react-ui/icons/Trash";import Undo from"@vertigis/react-ui/icons/Undo";import{styled}from"@vertigis/react-ui/styles";import*as React from"react";import{useEffect,useRef,useState}from"react";const DialogPrefix="SketchDialog",sketchDialogClasses={canvasContainer:`${DialogPrefix}-canvas-container`,canvasScroller:`${DialogPrefix}-canvas-scroller`,drawingCanvas:`${DialogPrefix}-drawing-canvas`,highlightCanvas:`${DialogPrefix}-highlight-canvas`,size:`${DialogPrefix}-size`,titleText:`${DialogPrefix}-title-text`},StyledDialogTitle=styled(DialogTitle)(()=>({display:"flex",[`.${sketchDialogClasses.titleText}`]:{flexGrow:1,flexShrink:1}})),StyledDialogContent=styled(DialogContent)(({theme:{spacing:e}})=>({display:"flex",flexDirection:"column",alignItems:"center",[`.${sketchDialogClasses.size}`]:{marginLeft:e(2),width:"15rem"},[`.${sketchDialogClasses.canvasScroller}`]:{maxWidth:"100%",overflow:"auto",[`.${sketchDialogClasses.canvasContainer}`]:{lineHeight:0,overflow:"clip",canvas:{position:"relative",[`&.${sketchDialogClasses.highlightCanvas}`]:{opacity:.5}}}}}));function isDrawingHistoryItem(e){return Array.isArray(e.points)}const PenColours=["#F13B2F","#42A345","#049FF1","#FFE600","#000000","#FFFFFF"],HighlighterColours=["#FFE600","#26E600","#44C8F5","#EC008C","#FF5500","#6600CC"],SketchDialog=({dataUrl:n,height:e,history:c,onClose:r,
|
|
1
|
+
import Box from"@vertigis/react-ui/Box";import Button from"@vertigis/react-ui/Button";import DialogActions from"@vertigis/react-ui/DialogActions";import DialogContent from"@vertigis/react-ui/DialogContent";import DialogTitle from"@vertigis/react-ui/DialogTitle";import FormControl from"@vertigis/react-ui/FormControl";import FormControlLabel from"@vertigis/react-ui/FormControlLabel";import FormLabel from"@vertigis/react-ui/FormLabel";import FormLabelColorField from"@vertigis/react-ui/FormLabelColorField";import IconButton from"@vertigis/react-ui/IconButton";import Radio from"@vertigis/react-ui/Radio";import RadioGroup from"@vertigis/react-ui/RadioGroup";import Slider from"@vertigis/react-ui/Slider";import Stack from"@vertigis/react-ui/Stack";import Trash from"@vertigis/react-ui/icons/Trash";import Undo from"@vertigis/react-ui/icons/Undo";import{styled}from"@vertigis/react-ui/styles";import*as React from"react";import{useEffect,useRef,useState}from"react";import{HostProvider}from"../hostContext.js";const DialogPrefix="SketchDialog",sketchDialogClasses={canvasContainer:`${DialogPrefix}-canvas-container`,canvasScroller:`${DialogPrefix}-canvas-scroller`,drawingCanvas:`${DialogPrefix}-drawing-canvas`,highlightCanvas:`${DialogPrefix}-highlight-canvas`,size:`${DialogPrefix}-size`,titleText:`${DialogPrefix}-title-text`},StyledDialogTitle=styled(DialogTitle)(()=>({display:"flex",[`.${sketchDialogClasses.titleText}`]:{flexGrow:1,flexShrink:1}})),StyledDialogContent=styled(DialogContent)(({theme:{spacing:e}})=>({display:"flex",flexDirection:"column",alignItems:"center",[`.${sketchDialogClasses.size}`]:{marginLeft:e(2),width:"15rem"},[`.${sketchDialogClasses.canvasScroller}`]:{maxWidth:"100%",overflow:"auto",[`.${sketchDialogClasses.canvasContainer}`]:{lineHeight:0,overflow:"clip",canvas:{position:"relative",[`&.${sketchDialogClasses.highlightCanvas}`]:{opacity:.5}}}}}));function isDrawingHistoryItem(e){return Array.isArray(e.points)}const PenColours=["#F13B2F","#42A345","#049FF1","#FFE600","#000000","#FFFFFF"],HighlighterColours=["#FFE600","#26E600","#44C8F5","#EC008C","#FF5500","#6600CC"],SketchDialog=({dataUrl:n,height:e,history:c,host:t,onClose:r,source:s,title:o,width:a})=>{const[g,u]=useState(e||0),[m,h]=useState(a||0),[d,l]=useState(PenColours[0]),[C,i]=useState(3),[p,f]=useState(HighlighterColours[0]),[v,x]=useState(12),[R,D]=useState("pen"),y="highlighter"===R,k=useRef(null),E=useRef(null),F=useRef(null),S=useRef([]),w=useRef([]),T=useRef(!1),b=useRef(!1),P=e=>(e?"highlighter"!==e?F:E:y?E:F).current,$=async e=>{let r,o;var t=new Promise((e,t)=>{r=e,o=t});const a=new Image;return a.crossOrigin="anonymous",a.onerror=e=>{o(e)},a.onload=()=>{r(a)},a.src=e,a.complete&&r(a),t};useEffect(()=>{(async()=>{const o=k.current,a=F.current;if(o&&a&&!T.current){let r;try{r=await $(s)}catch(e){console.error(`Error loading image from ${s}.`,e)}if(r){let e=Math.max(m,0),t=Math.max(g,0);var{height:l,width:i}=r;0==e&&0==t?(t=l,e=i):0===t?t=e*(l/i):0===e&&(e=t*(i/l)),o.height=t,o.width=e,a.height=t,a.width=e,o.getContext("2d").drawImage(r,0,0,o.width,o.height),0<c.length?(w.current=[...c],await U()):n&&(w.current=[{tool:"pen",dataUrl:n}],await U()),u(t),h(e),T.current=!0}else I()}})()},[k.current,F.current]);const B=(e,t)=>{t=t.getBoundingClientRect();return{x:e.clientX-t.left,y:e.clientY-t.top}};var L=()=>{if(b.current){b.current=!1;const e=P(),t=e.getContext("2d");t.closePath(),w.current.push({lineCap:t.lineCap,lineWidth:t.lineWidth,points:[...S.current],strokeStyle:t.strokeStyle,tool:R}),S.current.length=0}};const I=()=>{r(!1)};const U=async e=>{for(const l of w.current)if(!e||l.tool===e){const i=P(l.tool);if(isDrawingHistoryItem(l)){const n=i.getContext("2d");n.beginPath(),n.lineCap=l.lineCap,n.lineWidth=l.lineWidth,n.strokeStyle=l.strokeStyle;var t=l["points"];for(let e=0;e<t.length;e++){var{x:r,y:o}=t[e];0===e?n.moveTo(r,o):(n.lineTo(r,o),n.stroke())}n.closePath()}else{var a=await $(l.dataUrl);i.getContext("2d").drawImage(a,0,0,i.width,i.height)}}};e=t.renderText("@common-clear"),a=t.renderText("@common-undo");return React.createElement(HostProvider,{value:t},React.createElement(StyledDialogTitle,null,React.createElement("div",{className:sketchDialogClasses.titleText},o),React.createElement(Stack,{direction:"row"},React.createElement(IconButton,{"aria-label":a,onClick:async()=>{if(0!==w.current.length){var e=w.current.pop()["tool"];const t=P(e),r=t.getContext("2d");r.clearRect(0,0,m,g),await U(e)}},title:a},React.createElement(Undo,null)),React.createElement(IconButton,{"aria-label":e,onClick:()=>{E.current.getContext("2d").clearRect(0,0,m,g),F.current.getContext("2d").clearRect(0,0,m,g),w.current=[]},title:e},React.createElement(Trash,null)))),React.createElement(StyledDialogContent,null,React.createElement(Box,null,React.createElement(FormControl,null,React.createElement(FormLabel,null,t.renderText("@sketch-tool")),React.createElement(RadioGroup,{onChange:e=>D(e.currentTarget.value),row:!0,value:R},React.createElement(FormControlLabel,{control:React.createElement(Radio,null),value:"pen",label:t.renderText("@sketch-tool-pen")}),React.createElement(FormControlLabel,{control:React.createElement(Radio,null),value:"highlighter",label:t.renderText("@sketch-tool-highlighter")}))),React.createElement(FormLabelColorField,{label:t.renderText("@common-color"),value:y?p:d,ColorInputProps:{presetColors:y?HighlighterColours:PenColours},onChange:e=>{(y?f:l)(e)}}),React.createElement(FormControl,{className:sketchDialogClasses.size},React.createElement(FormLabel,null,t.renderText("@sketch-size")),React.createElement(Slider,{min:1,value:y?v:C,onChange:(e,t)=>{(y?x:i)(t)}}))),React.createElement(Box,{className:sketchDialogClasses.canvasScroller},React.createElement(Box,{sx:{width:`${m}px`,height:`${g}px`},className:sketchDialogClasses.canvasContainer},React.createElement("canvas",{ref:k}),React.createElement("canvas",{className:sketchDialogClasses.highlightCanvas,height:g,ref:E,style:{top:`-${g}px`},width:m}),React.createElement("canvas",{className:sketchDialogClasses.drawingCanvas,onMouseDown:e=>{const t=P(),r=t.getContext("2d");var{x:o,y:a}=B(e,t),{lineCap:l,lineWidth:i,strokeStyle:e}=y?{lineCap:"butt",lineWidth:v,strokeStyle:p}:{lineCap:"round",lineWidth:C,strokeStyle:d};r.beginPath(),r.lineCap=l,r.lineWidth=i,r.strokeStyle=e,r.moveTo(o,a),S.current.length=0,S.current.push({x:o,y:a}),b.current=!0},onMouseLeave:L,onMouseMove:e=>{if(b.current){const r=P(),o=r.getContext("2d");var{x:t,y:e}=B(e,r);o.lineTo(t,e),o.stroke(),S.current.push({x:t,y:e})}},onMouseUp:L,ref:F,style:{top:`-${2*g}px`}})))),React.createElement(DialogActions,null,React.createElement(Button,{color:"primary",onClick:()=>{if(0!==w.current.length){const t=k.current.getContext("2d");t.globalAlpha=.5,t.drawImage(E.current,0,0),t.globalAlpha=1,t.drawImage(F.current,0,0);var e=k.current.toDataURL("image/png");r(!0,{dataUrl:e,history:[...w.current],width:m,height:g})}else I()},variant:"contained"},t.renderText("@common-done")),React.createElement(Button,{color:"inherit",onClick:I,variant:"outlined"},t.renderText("@common-cancel"))))};export default SketchDialog;export{sketchDialogClasses};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import Box from"@vertigis/react-ui/Box";import{formLabelClasses}from"@vertigis/react-ui/FormLabel";import FormLabel from"@vertigis/react-ui/FormLabel";import Tab from"@vertigis/react-ui/Tab";import Tabs from"@vertigis/react-ui/Tabs";import{styled}from"@vertigis/react-ui/styles";import*as React from"react";import{useEffect,useState}from"react";import Markdown from"./Markdown.js";const
|
|
1
|
+
import Box from"@vertigis/react-ui/Box";import{formLabelClasses}from"@vertigis/react-ui/FormLabel";import FormLabel from"@vertigis/react-ui/FormLabel";import Tab from"@vertigis/react-ui/Tab";import Tabs from"@vertigis/react-ui/Tabs";import{styled}from"@vertigis/react-ui/styles";import*as React from"react";import{useEffect,useState}from"react";import Markdown from"./Markdown.js";const StyledBox=styled(Box)(({theme:{spacing:e}})=>({marginBottom:e(4),marginTop:e(4)})),StyledFormLabel=styled(FormLabel)(()=>({[`&.${formLabelClasses.error}`]:{backgroundColor:"transparent"}})),TabGroup=({className:e,component:t})=>{const[r,a]=useState(!1),{children:o,host:l}=t.props;useEffect(()=>{let e=o.filter(e=>!0!==l.form.elements[e.props.name].collapsed)[0]?.props?.name;e?a(e):(e=o[0]?.props?.name,e?l.updateMutuallyExclusiveSections(e):a(!1))},[o]);return React.createElement(StyledBox,{className:e},React.createElement(Tabs,{onChange:(e,t)=>{l.updateMutuallyExclusiveSections(t)},scrollButtons:"auto",value:r,variant:"scrollable"},o.map(e=>{var t,r=e.props["name"];return React.createElement(Tab,{"aria-controls":`simple-tabpanel-${r}`,id:`simple-tab-${r}`,key:r,label:(t=l.form.elements[r],e=r,React.createElement(StyledFormLabel,{error:l.hasInvalidChild(t)||!!t.error,id:`${e}-label`},React.createElement(Markdown,{inline:!0,text:t.title}))),value:r})})),o)};export default TabGroup;
|
|
@@ -4,5 +4,5 @@ import type { FormElementProps } from "../..";
|
|
|
4
4
|
* The component for the "Text" Form Element.
|
|
5
5
|
* It just exposes the Title and Description which are common to all.
|
|
6
6
|
*/
|
|
7
|
-
declare const Text: ({ className,
|
|
7
|
+
declare const Text: ({ className, element, name }: FormElementProps) => React.JSX.Element;
|
|
8
8
|
export default Text;
|
package/forms/components/Text.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import*as React from"react";import FormElement from"
|
|
1
|
+
import*as React from"react";import FormElement from"./FormElement.js";const Text=({className:e,element:m,name:t})=>React.createElement(FormElement,{className:e,element:m,name:t});export default Text;
|
|
@@ -3,5 +3,5 @@ import type { FormElementProps } from "../..";
|
|
|
3
3
|
/**
|
|
4
4
|
* The component for the "Text Area" Form Element.
|
|
5
5
|
*/
|
|
6
|
-
declare const TextArea: ({ className, component, element, enabled, name, maxLength, prompt, readOnly,
|
|
6
|
+
declare const TextArea: ({ className, component, element, enabled, name, maxLength, prompt, readOnly, require, size, tooltip, value: elementValue, wrap: elementWrap, setValue: setElementValue, }: FormElementProps<string | undefined>) => React.JSX.Element;
|
|
7
7
|
export default TextArea;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import Input from"@vertigis/react-ui/Input";import{useEffect,useState}from"react";import*as React from"react";import
|
|
1
|
+
import Input from"@vertigis/react-ui/Input";import{useContext,useEffect,useState}from"react";import*as React from"react";import HostContext from"../hostContext.js";import{makeUniqueId}from"../utils.js";import FormElement from"./FormElement.js";import{useFocusCallback}from"./common.js";const TextArea=({className:e,component:t,element:o,enabled:r,name:a,maxLength:n,prompt:s,readOnly:m,require:u,size:l,tooltip:i,value:p,wrap:f,setValue:c})=>{const d=useContext(HostContext),[x,g]=useState(8),[E,C]=useState(""),[h,y]=useState("soft"),I=`${makeUniqueId(a)}-input`,b=d.renderText(s),v=d.renderText(i);useEffect(()=>{"number"==typeof l&&g(l)},[l]),useEffect(()=>{let e="string"==typeof p?p:"";p!==e&&(c(e,!1),t.forceUpdate()),C(e)},[p]),useEffect(()=>{"string"==typeof f&&-1!==["hard","soft","off"].indexOf(f)&&y(f)},[f]);const F=e=>{e=e.target.value;e!=p&&(c(e),C(e))},j=e=>{e=e.target.value;e!=E&&C(e)},k=e=>{e.stopPropagation()},q=useFocusCallback(r,a,d);return React.createElement(FormElement,{className:e,element:o,inputId:I,name:a},e=>React.createElement(Input,{disabled:!r,fullWidth:!0,id:I,inputProps:{...e,maxLength:n,onKeyDown:k,title:v,wrap:h},inputRef:q,multiline:!0,onBlur:F,onChange:j,placeholder:b,readOnly:m,required:u,rows:x,value:E}))};export default TextArea;
|
|
@@ -3,5 +3,5 @@ import type { FormElementProps } from "../..";
|
|
|
3
3
|
/**
|
|
4
4
|
* The component for the "Text Box" and "Password Box" Form Elements.
|
|
5
5
|
*/
|
|
6
|
-
declare const TextBox: ({ className,
|
|
6
|
+
declare const TextBox: ({ className, element, enabled, type: elementType, maxLength: elementMaxLength, name, prompt, readOnly: elementReadOnly, require, tooltip, value: elementValue, setValue: setElementValue, }: FormElementProps<string | undefined>) => React.JSX.Element;
|
|
7
7
|
export default TextBox;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import Input from"@vertigis/react-ui/Input";import*as React from"react";import{useEffect,useState}from"react";import
|
|
1
|
+
import Input from"@vertigis/react-ui/Input";import*as React from"react";import{useContext,useEffect,useState}from"react";import{FormElementTypes}from"../constants.js";import HostContext from"../hostContext.js";import{getKeyString}from"../keyboard.js";import{makeUniqueId}from"../utils.js";import FormElement from"./FormElement.js";import{useFocusCallback}from"./common.js";const TextBox=({className:e,element:t,enabled:r,type:o,maxLength:n,name:a,prompt:m,readOnly:s,require:u,tooltip:l,value:i,setValue:p})=>{const c=useContext(HostContext),[f,d]=useState(""),g=`${makeUniqueId(a)}-input`,x=o===FormElementTypes.PASSWORDBOX,v=x?void 0:n,y=c.renderText(m),E=x?void 0:s,C=c.renderText(l);useEffect(()=>{let e="";"string"==typeof i?e=i:"number"!=typeof i||x||(e=c.formatNumber(i)),i!==e&&p(e,!1),f!==e&&d(e)},[i]);const T=e=>{p(e),d(e)},b=e=>{e=e.target.value;e!=i&&T(e)},F=e=>{e=e.target.value;e!=f&&d(e)},h=e=>{var t=getKeyString(e);return"enter"===t?(e=>{const t=e.currentTarget;var r=t.value;if(r!==i)return T(r),t.select(),e.stopPropagation(),e.preventDefault(),!1})(e):"escape"===t?(e=>{const t=e.currentTarget;if(t.value!==i)return d(i),t.select(),e.stopPropagation(),e.preventDefault(),!1})(e):void 0},j=useFocusCallback(r,a,c);return React.createElement(FormElement,{className:e,element:t,inputId:g,name:a},e=>React.createElement(Input,{disabled:!r,fullWidth:!0,id:g,inputProps:{...e,maxLength:v,onKeyDown:h,title:C},inputRef:j,onBlur:b,onChange:F,placeholder:y,readOnly:E,required:u,type:x?"password":"text",value:f}))};export default TextBox;
|
|
@@ -4,5 +4,5 @@ import type { defs } from "../FormHost";
|
|
|
4
4
|
/**
|
|
5
5
|
* The component for the "Time Picker" Form Element.
|
|
6
6
|
*/
|
|
7
|
-
declare const TimePicker: ({ className,
|
|
7
|
+
declare const TimePicker: ({ className, element, enabled, error, format: elementFormat, name, prompt, setProperty, setValue: setElementValue, tooltip: elementTooltip, value: elementValue, }: FormElementProps<defs.DateTimeRef | undefined>) => React.JSX.Element;
|
|
8
8
|
export default TimePicker;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{buttonBaseClasses}from"@vertigis/react-ui/ButtonBase";import FormHelperText from"@vertigis/react-ui/FormHelperText";import{
|
|
1
|
+
import{buttonBaseClasses}from"@vertigis/react-ui/ButtonBase";import FormHelperText from"@vertigis/react-ui/FormHelperText";import{clockClasses}from"@vertigis/react-ui/TimeClock";import BaseTimePicker from"@vertigis/react-ui/TimePicker";import{styled}from"@vertigis/react-ui/styles";import*as React from"react";import{useContext,useEffect,useMemo,useRef,useState}from"react";import{Calendar}from"../Calendar.js";import{areValuesEqual,getDateBounds,getNewElementValue,makeProperValue}from"../dateUtilities.js";import HostContext from"../hostContext.js";import{isInvalidError}from"../textUtilities.js";import{makeUniqueId,useLocale}from"../utils.js";import DateTimeTextField from"./DateTimeTextField.js";import FormElement from"./FormElement.js";import{useFocusCallback}from"./common.js";const StylableTimePicker=e=>{let{className:t,slotProps:r,...o}=e;return r=r||{},React.createElement(BaseTimePicker,{slotProps:{...r,popper:{...r.popper,className:t}},...o})},StyledTimePicker=styled(StylableTimePicker)(({theme:{palette:e}})=>({[`& .${clockClasses.amButton}, .${clockClasses.pmButton}`]:{[`&.${buttonBaseClasses.focusVisible}`]:{color:e.action.active}}})),TimePicker=({className:e,element:t,enabled:r,error:o,format:a,name:s,prompt:i,setProperty:l,setValue:m,tooltip:n,value:u})=>{const c=useContext(HostContext),[p,d]=useState(!1),[f,T]=useState(!1),[k,E]=useState(!1),[x,v]=useState(null),C=useRef();const F={locale:useLocale(),timezone:(new Intl.DateTimeFormat).resolvedOptions().timeZone},P=useRef(!0),g=useFocusCallback(r,s,c),B=c.renderText(n),R=Calendar.useNative(),S="time",V=isInvalidError(o);useEffect(()=>{var e=makeProperValue(u,R),t=getNewElementValue(e,S,F,R);areValuesEqual(u,t)||m(t,!1),v(e||null)},[u]),useEffect(()=>{if(!k&&!f)if(p)V||l("error",{status:"invalid"});else{if(V&&l("error",void 0),P.current)return void(P.current=!1);var e=getNewElementValue(x,S,F,R);areValuesEqual(u,e)||m(e)}P.current=!1},[p,f,k]);const{min:b,max:y}=getDateBounds(a),j=useMemo(()=>`${makeUniqueId(s)}-input`,[s]),N=c.renderText(i);return React.createElement(FormElement,{className:e,element:t,inputId:j,name:s},e=>React.createElement(React.Fragment,null,V&&React.createElement(FormHelperText,{component:"div",error:!0,role:"alert"},C.current),React.createElement(StyledTimePicker,{disabled:!r,inputRef:e=>{e&&(C.current=e.dataset.formatString,g(e))},key:"date-picker",maxTime:y,minTime:b,onChange:e=>v(e),onClose:()=>E(!1),onError:e=>d(!!e),onOpen:()=>E(!0),slots:{textField:DateTimeTextField},slotProps:{textField:{error:!!o,id:j,inputProps:{...e,placeholder:N},onBlur:()=>T(!1),onFocus:()=>T(!0),title:B}},value:x})))};export default TimePicker;
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import type {
|
|
3
|
-
import type {
|
|
4
|
-
|
|
5
|
-
export declare function getDescriptionId(elementId: string): string;
|
|
6
|
-
export declare function getErrorId(elementId: string): string;
|
|
2
|
+
import type { defs } from "../FormHost";
|
|
3
|
+
import type { FormHostMembers } from "../hostContext";
|
|
4
|
+
import type { ElementType } from "react";
|
|
7
5
|
export type TranslateTextFunction = (content: defs.Text | undefined) => string | defs.MarkdownRef | undefined;
|
|
8
6
|
/**
|
|
9
7
|
* Renders the title for a Form Element.
|
|
@@ -11,57 +9,44 @@ export type TranslateTextFunction = (content: defs.Text | undefined) => string |
|
|
|
11
9
|
* When specified, the title is marked as "for" that DOM element.
|
|
12
10
|
* @param required Indicates if the element is a required field. If so, the title is rendered with an asterisk beside it.
|
|
13
11
|
* @param title The title of the element.
|
|
14
|
-
* @param translateText A function for translating text, replacing placeholders as well.
|
|
15
12
|
* @param inputId (optional) The id of the DOM element representing the main input for the Form Element.
|
|
13
|
+
* @param component (optional) The component type to use for rendering the title.
|
|
16
14
|
* @returns A title component, or `null` if there is no title.
|
|
17
15
|
*/
|
|
18
|
-
export declare function renderTitle(elementId: string, required: boolean | undefined, title: defs.Text | undefined,
|
|
16
|
+
export declare function renderTitle(elementId: string, required: boolean | undefined, title: defs.Text | undefined, inputId?: string | undefined, component?: ElementType | undefined): React.JSX.Element | null;
|
|
19
17
|
/**
|
|
20
18
|
* Renders the description for a Form Element.
|
|
21
19
|
* @param description The description of the Form Element.
|
|
22
20
|
* @param elementId The id of the DOM element representing the Form Element.
|
|
23
21
|
* @param enabled True if the Form Element is enabled, false otherwise.
|
|
24
|
-
* @param translateText A function for translating text, replacing placeholders as well.
|
|
25
22
|
* @param className (optional) A class name to add to the component.
|
|
26
23
|
* @returns A description component, or `null` if there is no description.
|
|
27
24
|
*/
|
|
28
|
-
export declare function renderDescription(description: defs.Text | undefined, elementId: string, enabled: boolean | undefined,
|
|
25
|
+
export declare function renderDescription(description: defs.Text | undefined, elementId: string, enabled: boolean | undefined, className?: string): React.JSX.Element | null;
|
|
29
26
|
/**
|
|
30
27
|
* Renders the accessible description for a Form Element.
|
|
31
28
|
* @param accessibleDescription The element's accessible description.
|
|
32
29
|
* @param description The element's description.
|
|
33
30
|
* @param elementId The element's id.
|
|
34
|
-
* @param
|
|
31
|
+
* @param host The FormHost, containing the `translateText()` method.
|
|
35
32
|
* @returns An accessible description component, or `null` if there is no accessible description or description.
|
|
36
33
|
*/
|
|
37
|
-
export declare function renderAccessibleDescription(accessibleDescription: string | undefined, description: defs.Text | undefined, elementId: string,
|
|
34
|
+
export declare function renderAccessibleDescription(accessibleDescription: string | undefined, description: defs.Text | undefined, elementId: string, host: FormHostMembers): React.JSX.Element | null;
|
|
38
35
|
/**
|
|
39
36
|
* Renders the error for a Form Element.
|
|
40
37
|
* @param error The error to be rendered.
|
|
41
|
-
* @param translateText The translate text function.
|
|
42
38
|
* @returns An error component, or `null` if there is no error.
|
|
43
39
|
*/
|
|
44
|
-
export declare function renderError(error: defs.Text | undefined
|
|
45
|
-
/**
|
|
46
|
-
* Asks the host to focus the provided element when the form is initially shown.
|
|
47
|
-
* Ignores the specified target if it is null or disabled.
|
|
48
|
-
*
|
|
49
|
-
* NOTE: Some elements contain more elaborate forms of this element.
|
|
50
|
-
* For simplicity, this one replaces the basic cases which were all identical.
|
|
51
|
-
* @param target The HTML Element to receive focus.
|
|
52
|
-
* @param name The name of the Form Element.
|
|
53
|
-
* @param host The form presenter host.
|
|
54
|
-
*/
|
|
55
|
-
export declare function renderFocus(target: (HTMLElement & {
|
|
56
|
-
disabled?: boolean | undefined;
|
|
57
|
-
}) | null, name: string | undefined, host: FormPresenterHost): void;
|
|
40
|
+
export declare function renderError(error: defs.Text | undefined): React.JSX.Element | null;
|
|
58
41
|
/**
|
|
59
42
|
* Returns a memoized function which asks the host to focus the provided element when the form is
|
|
60
43
|
* initially shown. Ignores the specified target if it is null or disabled.
|
|
61
|
-
* @param
|
|
44
|
+
* @param enabled True if the Form Element is enabled, false otherwise.
|
|
45
|
+
* @param name The name of the form element that the target HTML element belongs to.
|
|
46
|
+
* @param renderFocus The renderFocus function supplied to the Form Element from the host.
|
|
62
47
|
* @returns A memoized function that focuses a target HTML element.
|
|
63
48
|
*/
|
|
64
|
-
export declare function useFocusCallback(enabled: boolean, name: string | undefined,
|
|
49
|
+
export declare function useFocusCallback(enabled: boolean, name: string | undefined, host: FormHostMembers): (target: (HTMLElement & {
|
|
65
50
|
disabled?: boolean;
|
|
66
51
|
thumbRefs?: any[];
|
|
67
52
|
}) | null) => void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import Box from"@vertigis/react-ui/Box";import FormLabel,{formLabelClasses}from"@vertigis/react-ui/FormLabel";import{styled}from"@vertigis/react-ui/styles";import clsx from"clsx";import{useCallback}from"react";import*as React from"react";import{hasContent,isMarkdown,markdownToText}from"../textUtilities.js";import{getAccessibleDescriptionId,getDescriptionId,getLabelId}from"../utils.js";import{formClasses}from"./Form.js";import Markdown from"./Markdown.js";function renderTitle(e,r,t,o,s){return hasContent(t)?React.createElement(FormLabel,{className:formClasses.formElementTitle,component:s,htmlFor:o,id:getLabelId(e),required:!!r},React.createElement(Markdown,{inline:!0,text:t})):null}const DescriptionMarkdown=styled(Markdown)(({theme:{palette:e}})=>({[`&.${formLabelClasses.disabled}`]:{color:e.text.disabled}}));function renderDescription(e,r,t,o){return hasContent(e)?React.createElement(DescriptionMarkdown,{className:clsx(o,{[formLabelClasses.disabled]:!t}),id:getDescriptionId(r),text:e}):null}function renderAccessibleDescription(e,r,t,o){let s=o.translateText(e);return s||(r=o.translateText(r),s=isMarkdown(r)?markdownToText(r.markdown):r),s?React.createElement(Box,{hidden:!0,id:getAccessibleDescriptionId(t)},s):null}const ErrorMarkdown=styled(Markdown)(({theme:{palette:e}})=>({color:e.custom.errorText,fontStyle:"italic",backgroundColor:e.custom.errorBackground}));function renderError(e){return hasContent(e)?React.createElement(ErrorMarkdown,{role:"alert",text:e}):null}function useFocusCallback(e,r,t){return useCallback(e=>{null===(e=Array.isArray(e?.thumbRefs)&&0<e.thumbRefs.length?e.thumbRefs[0].current:e)||e.disabled||t.renderFocus(e,r)},[e,r,t])}export{renderTitle,renderDescription,renderAccessibleDescription,renderError,useFocusCallback};
|
package/forms/dateUtilities.d.ts
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import { Calendar } from "./Calendar";
|
|
2
2
|
import type { DateRangeRef, DateTimeFormat, DateTimeRef, DateTimeType, FormatRef } from "./FormDefinition";
|
|
3
3
|
import type { defs } from "./FormHost";
|
|
4
|
-
import type {
|
|
4
|
+
import type { PickersLocaleText } from "@mui/x-date-pickers";
|
|
5
5
|
import type { Locale } from "date-fns";
|
|
6
|
+
/**
|
|
7
|
+
* A list of the locales we currently bundle from `date-fns`.
|
|
8
|
+
*/
|
|
9
|
+
export declare const SUPPORTED_DATE_FNS_LOCALES: string[];
|
|
6
10
|
/**
|
|
7
11
|
* Checks if a form element's value is equal to the supplied value.
|
|
8
12
|
* @param elementValue The current value of a Form Element.
|
|
@@ -63,6 +67,7 @@ export declare function getDateBounds(format: FormatRef | undefined): {
|
|
|
63
67
|
* @param language The target language to retrieve the locale for.
|
|
64
68
|
*/
|
|
65
69
|
export declare function getDateFnsLocale(language: string): Promise<Locale | undefined>;
|
|
70
|
+
export declare function getLocaleText(language: string): Promise<Partial<PickersLocaleText<any>> | undefined>;
|
|
66
71
|
/**
|
|
67
72
|
* Gets the date format based on the current browser locale. This function will always return four digit year tokens
|
|
68
73
|
* and two digit month and day tokens. The browser locale however, will determine their placement and the separator.
|
|
@@ -98,15 +103,15 @@ export declare function convertToDateRangeRef(value: DateRangeLike): DateRangeRe
|
|
|
98
103
|
* @param dateFormat The date format to set in cache.
|
|
99
104
|
*/
|
|
100
105
|
export declare function __test__setlocaleDateFormatInCache(dateFormat: string): void;
|
|
101
|
-
export declare function
|
|
102
|
-
type
|
|
106
|
+
export declare function getLocale(language: string): Promise<Locale | undefined>;
|
|
107
|
+
type PartialValue = void | boolean | number | string | {
|
|
103
108
|
[name: string]: any;
|
|
104
|
-
format?:
|
|
109
|
+
format?: PartialValue | void;
|
|
105
110
|
locale?: string;
|
|
106
111
|
timezone?: string;
|
|
107
112
|
refValueType?: string;
|
|
108
113
|
value?: number;
|
|
109
114
|
};
|
|
110
|
-
export declare function makeProperValue(value: number | string |
|
|
115
|
+
export declare function makeProperValue(value: number | string | PartialValue, calendar: Calendar): Date | undefined;
|
|
111
116
|
export declare function getNewElementValue(date: Date | undefined | null, refValueType: DateTimeType, format: DateTimeFormat, calendar: Calendar): DateTimeRef | undefined;
|
|
112
117
|
export {};
|
package/forms/dateUtilities.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{parse,isAfter}from"date-fns";import{DEFAULT_LOCALE}from"../constants.js";import{parseLocale}from"../definition/ProgramInspector.js";import{Calendar}from"./Calendar.js";import{isDateRangeRef,isDateTimeRef}from"./utils.js";const CURRENT_CENTURY_YEAR_CUTOFF=29,SUPPORTED_DATE_FNS_LOCALES=["cs","da","de","de-AT","en-AU","en-CA","en-GB","en-IN","en-NZ","en-US","en-ZA","fr","fr-CA","fr-CH","it","nb","nl","nl-BE","nn","pt","pt-BR"];let localeDateFormat="",dateFormatSeparator;function areValuesEqual(e,a){return void 0===e&&void 0===a||null===e&&null===a||(isDateTimeRef(e)&&a&&isDateTimeRef(a)?e.display===a.display&&e.refValueType===a.refValueType&&e.value===a.value&&areFormatsEqual(e.format,a.format):!!(isDateRangeRef(e)&&a&&isDateRangeRef(a))&&(e.endDate?.valueOf()===a.endDate?.valueOf()&&e.refValueType===a.refValueType&&e.startDate?.valueOf()===a.startDate?.valueOf()))}function areFormatsEqual(e,a){return void 0===e&&void 0===a||("string"==typeof e&&"string"==typeof a?e===a:"object"==typeof e&&"object"==typeof a&&(null===e||null===a?e===a:e.locale===a.locale&&e.timezone===a.timezone))}function isValidDate(e){return e instanceof Date&&!isNaN(e.valueOf())}function tryParseYear(e){if(/^\d+$/.test(e)&&!(4<e.length)){for(2===e.length&&(e=`${CURRENT_CENTURY_YEAR_CUTOFF>=parseInt(e,10)?20:19}${e}`);e.length<4;)e=`0${e}`;return e}}function tryParseMonth(e){if(/^\d+$/.test(e)&&!(2<e.length)){1===e.length&&(e=`0${e}`);var a=parseInt(e,10);if(!(a<1||12<a))return e}}function tryParseDay(e){if(/^\d+$/.test(e)&&!(2<e.length)){1===e.length&&(e=`0${e}`);var a=parseInt(e,10);if(!(a<1||31<a))return e}}function tryParseDateText(e){if(e){const r=(e=e.replace(/\\/g,"\\\\")).match(/(\d+)/g);if(3===r?.length){var e=getLocaleDateFormatSeparator(),a=getLocaleDateFormatTokenPosition("yyyy"),t=getLocaleDateFormatTokenPosition("MM");for(let e=0;e<3;e++){switch(e){case a:r[e]=tryParseYear(r[e]);break;case t:r[e]=tryParseMonth(r[e]);break;default:r[e]=tryParseDay(r[e])}if(void 0===r[e])return}return`${r[0]}${e}${r[1]}${e}${r[2]}`}}}function getDateBounds(e){var{lowerBound:a,upperBound:e}=e||{};return{min:"number"==typeof a?new Date(a):void 0,max:"number"==typeof e?new Date(e):void 0}}
|
|
1
|
+
import{parse,isAfter}from"date-fns";import{DEFAULT_LOCALE}from"../constants.js";import{parseLocale}from"../definition/ProgramInspector.js";import{Calendar}from"./Calendar.js";import{isDateRangeRef,isDateTimeRef}from"./utils.js";const CURRENT_CENTURY_YEAR_CUTOFF=29,SUPPORTED_DATE_FNS_LOCALES=["cs","da","de","de-AT","en-AU","en-CA","en-GB","en-IN","en-NZ","en-US","en-ZA","fr","fr-CA","fr-CH","it","nb","nl","nl-BE","nn","pt","pt-BR"];let localeDateFormat="",dateFormatSeparator;function areValuesEqual(e,a){return void 0===e&&void 0===a||null===e&&null===a||(isDateTimeRef(e)&&a&&isDateTimeRef(a)?e.display===a.display&&e.refValueType===a.refValueType&&e.value===a.value&&areFormatsEqual(e.format,a.format):!!(isDateRangeRef(e)&&a&&isDateRangeRef(a))&&(e.endDate?.valueOf()===a.endDate?.valueOf()&&e.refValueType===a.refValueType&&e.startDate?.valueOf()===a.startDate?.valueOf()))}function areFormatsEqual(e,a){return void 0===e&&void 0===a||("string"==typeof e&&"string"==typeof a?e===a:"object"==typeof e&&"object"==typeof a&&(null===e||null===a?e===a:e.locale===a.locale&&e.timezone===a.timezone))}function isValidDate(e){return e instanceof Date&&!isNaN(e.valueOf())}function tryParseYear(e){if(/^\d+$/.test(e)&&!(4<e.length)){for(2===e.length&&(e=`${CURRENT_CENTURY_YEAR_CUTOFF>=parseInt(e,10)?20:19}${e}`);e.length<4;)e=`0${e}`;return e}}function tryParseMonth(e){if(/^\d+$/.test(e)&&!(2<e.length)){1===e.length&&(e=`0${e}`);var a=parseInt(e,10);if(!(a<1||12<a))return e}}function tryParseDay(e){if(/^\d+$/.test(e)&&!(2<e.length)){1===e.length&&(e=`0${e}`);var a=parseInt(e,10);if(!(a<1||31<a))return e}}function tryParseDateText(e){if(e){const r=(e=e.replace(/\\/g,"\\\\")).match(/(\d+)/g);if(3===r?.length){var e=getLocaleDateFormatSeparator(),a=getLocaleDateFormatTokenPosition("yyyy"),t=getLocaleDateFormatTokenPosition("MM");for(let e=0;e<3;e++){switch(e){case a:r[e]=tryParseYear(r[e]);break;case t:r[e]=tryParseMonth(r[e]);break;default:r[e]=tryParseDay(r[e])}if(void 0===r[e])return}return`${r[0]}${e}${r[1]}${e}${r[2]}`}}}function getDateBounds(e){var{lowerBound:a,upperBound:e}=e||{};return{min:"number"==typeof a?new Date(a):void 0,max:"number"==typeof e?new Date(e):void 0}}function getTargetLanguages(e){e=parseLocale(e);if(!e)return[DEFAULT_LOCALE];const a=[];return e.territory&&a.push(`${e.language}-${e.territory}`),a.push(e.language),a.push(DEFAULT_LOCALE),a}async function getDateFnsLocale(e){for(const a of getTargetLanguages(e))if(-1!==SUPPORTED_DATE_FNS_LOCALES.indexOf(a)){let e;try{switch(a){case"cs":e=(await import("date-fns/locale/cs")).cs;break;case"da":e=(await import("date-fns/locale/da")).da;break;case"de":e=(await import("date-fns/locale/de")).de;break;case"de-AT":e=(await import("date-fns/locale/de-AT")).deAT;break;case"en-AU":e=(await import("date-fns/locale/en-AU")).enAU;break;case"en-CA":e=(await import("date-fns/locale/en-CA")).enCA;break;case"en-GB":e=(await import("date-fns/locale/en-GB")).enGB;break;case"en-IN":e=(await import("date-fns/locale/en-IN")).enIN;break;case"en-NZ":e=(await import("date-fns/locale/en-NZ")).enNZ;break;case"en-US":e=(await import("date-fns/locale/en-US")).enUS;break;case"en-ZA":e=(await import("date-fns/locale/en-ZA")).enZA;break;case"fr":e=(await import("date-fns/locale/fr")).fr;break;case"fr-CA":e=(await import("date-fns/locale/fr-CA")).frCA;break;case"fr-CH":e=(await import("date-fns/locale/fr-CH")).frCH;break;case"it":e=(await import("date-fns/locale/it")).it;break;case"nb":e=(await import("date-fns/locale/nb")).nb;break;case"nl":e=(await import("date-fns/locale/nl")).nl;break;case"nl-BE":e=(await import("date-fns/locale/nl-BE")).nlBE;break;case"nn":e=(await import("date-fns/locale/nn")).nn;break;case"pt":e=(await import("date-fns/locale/pt")).pt;break;case"pt-BR":e=(await import("date-fns/locale/pt-BR")).ptBR}}catch{continue}if(e?.localize)return e}}async function getLocaleText(e){for(const a of getTargetLanguages(e))if(-1!==SUPPORTED_DATE_FNS_LOCALES.indexOf(a)){let e;try{switch(a){case"cs":e=(await import("@mui/x-date-pickers/locales/csCZ")).csCZ;break;case"da":e=(await import("@mui/x-date-pickers/locales/daDK")).daDK;break;case"de":case"de-AT":e=(await import("@mui/x-date-pickers/locales/deDE")).deDE;break;case"en-AU":case"en-CA":case"en-GB":case"en-IN":case"en-NZ":case"en-US":case"en-ZA":case"nn":e=(await import("@mui/x-date-pickers/locales/enUS")).enUS;break;case"fr":case"fr-CA":case"fr-CH":e=(await import("@mui/x-date-pickers/locales/frFR")).frFR;break;case"it":e=(await import("@mui/x-date-pickers/locales/itIT")).itIT;break;case"nb":e=(await import("@mui/x-date-pickers/locales/nbNO")).nbNO;break;case"nl":case"nl-BE":e=(await import("@mui/x-date-pickers/locales/nlNL")).nlNL;break;case"pt":case"pt-BR":e=(await import("@mui/x-date-pickers/locales/ptBR")).ptBR}}catch{continue}return e?e.components.MuiLocalizationProvider.defaultProps.localeText:{}}}function getLocaleDateFormat(){if(localeDateFormat)return localeDateFormat;const e=new Date(1999,11,31,0,0,0);return localeDateFormat=e.toLocaleDateString(void 0,{year:"numeric",month:"numeric",day:"numeric"}),localeDateFormat=localeDateFormat.replace("1999","yyyy"),localeDateFormat=localeDateFormat.replace("99","yyyy"),localeDateFormat=localeDateFormat.replace("12","MM"),localeDateFormat=localeDateFormat.replace("31","dd"),localeDateFormat}function getLocaleDateFormatSeparator(){var e;return void 0===dateFormatSeparator&&(e=/[^dMy]+/.exec(getLocaleDateFormat()),dateFormatSeparator=e?e[0]:""),dateFormatSeparator}function getLocaleDateFormatTokenPosition(e){const a=getLocaleDateFormat();var t=a.indexOf("yyyy"),r=a.indexOf("MM"),o=a.indexOf("dd");return"yyyy"===e?0===t?0:r<t&&o<t?2:1:"MM"===e?0===r?0:o<r&&t<r?2:1:0===o?0:r<o&&t<o?2:1}const coerceIntoDate=e=>{if(e instanceof Date&&isValidDate(e))return new Date(e.valueOf());if("string"==typeof e)if(/^\d+$/.test(e))e=Number(e);else{var a=tryParseDateText(e);if(a){var t=getLocaleDateFormat(),t=parse(a,t,0);if(isValidDate(t))return t}}if("number"==typeof e){e=new Date(e);if(isValidDate(e))return e}};function convertToDateRangeRef(e){let a,t,r=!1;Array.isArray(e)?(a=coerceIntoDate(e[0]),t=coerceIntoDate(e[1]),r=!0):"object"==typeof e&&(a=coerceIntoDate(e.startDate),t=coerceIntoDate(e.endDate));var o=!!a&&!!t;let n=o&&!isAfter(a,t);return r&&o&&!n&&(e=a,a=t,t=e,n=!0),o&&n?{refValueType:"daterange",startDate:a,endDate:t}:void 0}function __test__setlocaleDateFormatInCache(e){localeDateFormat=e,dateFormatSeparator=void 0}async function getLocale(e){return getDateFnsLocale(e)}function makeProperValue(e,a){if("object"==typeof e){if(null===e)return;switch(e.refValueType){case"date":case"time":case"datetime":break;default:return}e=e.value}if("number"==typeof e||"string"==typeof e){const t=a.coerceIntoValue(e);if(void 0!==t&&null!==t&&isFinite(t.valueOf()))return t}}function getNewElementValue(e,a,t,r){if(null!=e&&isFinite(e.valueOf()))return{refValueType:a,format:t,display:r.format(e,Calendar.fullFormat),value:e.valueOf()}}export{SUPPORTED_DATE_FNS_LOCALES,areValuesEqual,isValidDate,tryParseYear,tryParseMonth,tryParseDay,tryParseDateText,getDateBounds,getDateFnsLocale,getLocaleText,getLocaleDateFormat,getLocaleDateFormatSeparator,getLocaleDateFormatTokenPosition,convertToDateRangeRef,__test__setlocaleDateFormatInCache,getLocale,makeProperValue,getNewElementValue};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createContext}from"react";const HostContext=createContext({}),HostProvider=HostContext.Provider;export default HostContext;export{HostProvider};
|
package/forms/index.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
import type { EventArgumentTypes, EventValueTypes } from "./FormComponent";
|
|
3
3
|
import type { defs } from "./FormHost";
|
|
4
|
-
import type { FormatOptions } from "./numberFormatter";
|
|
5
4
|
export { Orientation, TitleLocation } from "./constants";
|
|
6
5
|
export type { Text } from "./elements/types";
|
|
7
6
|
/**
|
|
@@ -19,15 +18,7 @@ export interface ITranslateTextFunction {
|
|
|
19
18
|
/** @public */
|
|
20
19
|
export interface FormElementProps<TValue = undefined> extends FormElementSettableProps<TValue>, FormElementGettableProps {
|
|
21
20
|
className?: string;
|
|
22
|
-
/** Coerces a number from a value. */
|
|
23
|
-
coerceNumber: (value: string) => number;
|
|
24
|
-
/**
|
|
25
|
-
* Derives the current locale set by the host application (or default if undefined) will be returned.
|
|
26
|
-
*/
|
|
27
|
-
deriveLocale: () => string;
|
|
28
21
|
enabled: boolean;
|
|
29
|
-
/** Formats a value into a string. */
|
|
30
|
-
formatNumber: (value: number, options?: FormatOptions) => string;
|
|
31
22
|
id: string;
|
|
32
23
|
name: string | undefined;
|
|
33
24
|
/**
|
|
@@ -39,16 +30,6 @@ export interface FormElementProps<TValue = undefined> extends FormElementSettabl
|
|
|
39
30
|
* @param eventValue The value of the event.
|
|
40
31
|
*/
|
|
41
32
|
raiseEvent: <K extends keyof EventValueTypes>(eventName: K, eventValue: EventValueTypes[K], argument?: EventArgumentTypes[K], item?: string, cancellationToken?: PromiseLike<void>) => void;
|
|
42
|
-
/** Renders the focus. */
|
|
43
|
-
renderFocus: (target: Node, name?: string) => boolean;
|
|
44
|
-
/** Renders a component's state. */
|
|
45
|
-
renderState(name: string, type: string, state?: {}): boolean;
|
|
46
|
-
/**
|
|
47
|
-
* Renders form text as a string.
|
|
48
|
-
* If `text` is a reference to a language string (e.g. `"@my-language-string"`), it is translated.
|
|
49
|
-
* If `text` is a `MarkdownRef`, it is converted to plain text.
|
|
50
|
-
*/
|
|
51
|
-
renderText: (text: defs.Text | undefined) => string;
|
|
52
33
|
/**
|
|
53
34
|
* Set a property on an item in the element.
|
|
54
35
|
* @param property The name of the property to set.
|
|
@@ -70,8 +51,6 @@ export interface FormElementProps<TValue = undefined> extends FormElementSettabl
|
|
|
70
51
|
* @param value The new value to set.
|
|
71
52
|
*/
|
|
72
53
|
setValue: (value: this["value"], event?: EventOptions) => void;
|
|
73
|
-
/** Translates the supplied value. */
|
|
74
|
-
translateText: ITranslateTextFunction;
|
|
75
54
|
}
|
|
76
55
|
/**
|
|
77
56
|
* Properties of a Form Element that can be read via the component's properties.
|
|
@@ -129,7 +129,7 @@ export declare function getMarks(maximum: number, minimum: number, step: number,
|
|
|
129
129
|
* @param decimalPlaces The number of decimal places to round to.
|
|
130
130
|
* @returns An accurately rounded value.
|
|
131
131
|
*/
|
|
132
|
-
export declare function
|
|
132
|
+
export declare function preciseRound(value: number, decimalPlaces: number): number;
|
|
133
133
|
/**
|
|
134
134
|
* Details about a symbol that is used to represent currency or percentage.
|
|
135
135
|
*/
|
package/forms/numberUtilities.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{format}from"./numberFormatter.js";import{isNumberRef,isNumeric}from"./utils.js";const defaultNumberFormatConfiguration={lowerBound:{default:0},precision:{default:3,minimum:-20,maximum:20},step:{default:1},upperBound:{default:100}};function getNumberConstraints(e,r){var{lowerBound:
|
|
1
|
+
import{format}from"./numberFormatter.js";import{isNumberRef,isNumeric}from"./utils.js";const defaultNumberFormatConfiguration={lowerBound:{default:0},precision:{default:3,minimum:-20,maximum:20},step:{default:1},upperBound:{default:100}};function getNumberConstraints(e,r){var{lowerBound:i,upperBound:t}=e=e||{};let{precision:n,step:o}=e;var u,r=getNumberFormatConfiguration(r);let a=isNumeric(i)?i:r.lowerBound.default,m=isNumeric(t)?t:r.upperBound.default;return void 0!==m&&void 0!==a&&m<=a&&(a=r.lowerBound.default,m=r.upperBound.default),n="number"!=typeof n||Number.isNaN(n)?r.precision.default:n,void 0!==r.precision.minimum&&(n=Math.max(n,r.precision.minimum)),void 0!==r.precision.maximum&&(n=Math.min(n,r.precision.maximum)),n<0?(u=Math.pow(10,-1*n),void 0!==o&&o%u==0||(o=u)):(o=isNumeric(o)&&0<o?o:r.step.default,void 0!==m&&void 0!==a&&(o=Math.min(o,m-a),u=preciseDivide(m-a,o),Number.isInteger(u)||(r=countDecimalsInValue(o),m=preciseRound(a+Math.floor(u)*o,r)))),{maximum:m,minimum:a,step:o}}const intlNumberFormat=new Intl.NumberFormat("en-US",{minimumFractionDigits:0,maximumFractionDigits:20,useGrouping:!1}),customDecimals=/\.([#\d]+)/;function countDecimalsInCustomFormat(e){if(e){e=customDecimals.exec(e);if(e)return e[1].length}return 0}function countDecimalsInValue(e){if(Number.isInteger(e))return 0;const r=intlNumberFormat.format(e);e=r.indexOf(".");return-1===e?0:r.length-e-1}function sanitizePrecision(e,r,i){i=getNumberFormatConfiguration(i);void 0===e&&(e=i.precision.default);r=countDecimalsInValue(r);return Math.max(r,e)}function getNumberFormatConfiguration(e){const r={lowerBound:{...defaultNumberFormatConfiguration.lowerBound},precision:{...defaultNumberFormatConfiguration.precision},step:{...defaultNumberFormatConfiguration.step},upperBound:{...defaultNumberFormatConfiguration.upperBound}};if(void 0!==e)for(const i in e)r[i]=Object.assign(r[i]||{},e[i]);return r}function preciseDivide(e,r){var i=countDecimalsInValue(e),t=countDecimalsInValue(r);if(0<i||0<t){t=Math.max(i,t),t=Math.pow(10,t);return e*t/(r*t)}return e/r}function enforceConstraints(e,r){var i,t,{maximum:n,minimum:o,step:r}=r;return void 0!==o?(i=preciseDivide(e-o,r),Number.isInteger(i)||(t=countDecimalsInValue(r),e=preciseRound(o+Math.round(i)*r,t))):void 0!==n&&(i=preciseDivide(n-e,r),Number.isInteger(i)||(t=countDecimalsInValue(r),e=preciseRound(n-Math.round(i)*r,t))),void 0!==o&&e<o&&(e=o),e=void 0!==n&&n<e?n:e}function getNumberSliderValues(e,r,i=!1){let t=[],n=NaN,o=NaN;if("string"==typeof e){const a=e.split("\n").filter(e=>""!==e);e=a.map(e=>(e=>(e=(e||"").trim(),isNumeric(e)?parseFloat(e):NaN))(e))}else"number"==typeof e?n=e:"number"==typeof e?.numeric&&(n=e.numeric);if(Array.isArray(e)&&1<=e.length&&(n=e[0],o=e[1]),void 0===n||isNaN(n)||(n=enforceConstraints(n,r),void 0===o||isNaN(o)?i&&t.push(n):(o=enforceConstraints(o,r),t.push(n,o))),t.sort((e,r)=>e-r),t.length===(i?1:2))return t;var u=r.maximum,e=r.minimum;return i?[enforceConstraints((e+u)/2,r)]:[e,u]}function areValuesEqual(e,r){if(void 0===e&&void 0===r||null===e&&null===r)return!0;var i,t;return!(!isNumberRef(e)||!isNumberRef(r))&&(e.display===r.display&&e.refValueType===r.refValueType&&e.numeric===r.numeric&&(i=e.format,t=r.format,void 0===i&&void 0===t||void 0!==i&&void 0!==t&&(i.currency===t.currency&&i.customDisplayFormat===t.customDisplayFormat&&i.displayFormat===t.displayFormat&&i.lowerBound===t.lowerBound&&i.precision===t.precision&&i.step===t.step&&i.upperBound===t.upperBound)))}function getMarks(r,i,t,e,n,o){if(n&&o){const u=[{value:i,label:format(e,i)}];for(let e=i+t;e<r;e+=t)u.push({value:e});return u.push({value:r,label:format(e,r)}),u}return n&&!o?[{value:i,label:format(e,i)},{value:r,label:format(e,r)}]:o}function preciseRound(e,r){return Number(Math.round(Number(e+`e${r}`))+`e-${r}`)}function getCurrencySymbolInfo(e,r){const i=new Intl.NumberFormat(e,{style:"currency",currency:r,minimumFractionDigits:0,maximumFractionDigits:0,useGrouping:!1}),t=i.formatToParts(0);e=t.filter(e=>"currency"===e.type)[0],r=t.filter(e=>"integer"===e.type)[0];if(e&&r)return{position:t.indexOf(e)<t.indexOf(r)?"start":"end",symbol:e.value}}function getPercentSymbolInfo(e){const r=new Intl.NumberFormat(e,{style:"percent",minimumFractionDigits:0,maximumFractionDigits:0,useGrouping:!1}),i=r.formatToParts(0);var t=i.filter(e=>"percentSign"===e.type)[0],e=i.filter(e=>"integer"===e.type)[0];if(t&&e)return{position:i.indexOf(t)<i.indexOf(e)?"start":"end",symbol:t.value}}export{defaultNumberFormatConfiguration,getNumberConstraints,countDecimalsInCustomFormat,countDecimalsInValue,sanitizePrecision,getNumberFormatConfiguration,enforceConstraints,getNumberSliderValues,areValuesEqual,getMarks,preciseRound,getCurrencySymbolInfo,getPercentSymbolInfo};
|