@vertigis/workflow 5.35.1 → 5.36.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.
Files changed (220) hide show
  1. package/Hooks.d.ts +3 -3
  2. package/IActivityHandler.d.ts +1 -6
  3. package/activities/arcgis/AddAttachment.d.ts +2 -2
  4. package/activities/arcgis/AddAttachment.js +1 -1
  5. package/activities/arcgis/AddFeatures.d.ts +3 -3
  6. package/activities/arcgis/AddFeatures.js +1 -1
  7. package/activities/arcgis/AddGraphics.d.ts +2 -2
  8. package/activities/arcgis/AddGraphics.js +1 -1
  9. package/activities/arcgis/ArcadeScript.d.ts +2 -2
  10. package/activities/arcgis/ArcadeScript.js +1 -1
  11. package/activities/arcgis/AreaEngineTask.d.ts +2 -2
  12. package/activities/arcgis/AreaEngineTask.js +1 -1
  13. package/activities/arcgis/BufferEngineTask.d.ts +2 -2
  14. package/activities/arcgis/BufferEngineTask.js +1 -1
  15. package/activities/arcgis/ClearGraphics.d.ts +1 -1
  16. package/activities/arcgis/ClearGraphics.js +1 -1
  17. package/activities/arcgis/ClipEngineTask.d.ts +2 -2
  18. package/activities/arcgis/ClipEngineTask.js +1 -1
  19. package/activities/arcgis/CompareGeometries.d.ts +2 -2
  20. package/activities/arcgis/CompareGeometries.js +1 -1
  21. package/activities/arcgis/CutEngineTask.d.ts +2 -2
  22. package/activities/arcgis/CutEngineTask.js +1 -1
  23. package/activities/arcgis/DeleteAttachments.d.ts +2 -2
  24. package/activities/arcgis/DeleteAttachments.js +1 -1
  25. package/activities/arcgis/DeleteFeatures.d.ts +3 -3
  26. package/activities/arcgis/DeleteFeatures.js +1 -1
  27. package/activities/arcgis/DensifyEngineTask.d.ts +2 -2
  28. package/activities/arcgis/DensifyEngineTask.js +1 -1
  29. package/activities/arcgis/DifferenceEngineTask.d.ts +2 -2
  30. package/activities/arcgis/DifferenceEngineTask.js +1 -1
  31. package/activities/arcgis/DistanceEngineTask.d.ts +2 -2
  32. package/activities/arcgis/DistanceEngineTask.js +1 -1
  33. package/activities/arcgis/ExtendedSpatialReferenceInfoEngineTask.d.ts +1 -1
  34. package/activities/arcgis/FlipEngineTask.d.ts +2 -2
  35. package/activities/arcgis/FlipEngineTask.js +1 -1
  36. package/activities/arcgis/GeneralizeEngineTask.d.ts +2 -2
  37. package/activities/arcgis/GeneralizeEngineTask.js +1 -1
  38. package/activities/arcgis/Geocode.d.ts +2 -2
  39. package/activities/arcgis/Geocode.js +1 -1
  40. package/activities/arcgis/GeoprocessingAsync.js +1 -1
  41. package/activities/arcgis/GetCodedValueDomain.d.ts +4 -4
  42. package/activities/arcgis/GetCodedValueDomain.js +1 -1
  43. package/activities/arcgis/GetFeatureLayerInfo.d.ts +2 -2
  44. package/activities/arcgis/GetFeatureLayerInfo.js +1 -1
  45. package/activities/arcgis/GetGraphics.d.ts +2 -2
  46. package/activities/arcgis/GetGraphics.js +1 -1
  47. package/activities/arcgis/GetLayer.d.ts +2 -2
  48. package/activities/arcgis/GetLayer.js +1 -1
  49. package/activities/arcgis/GetLayerDefinitionExpression.d.ts +2 -2
  50. package/activities/arcgis/GetLayerDefinitionExpression.js +1 -1
  51. package/activities/arcgis/GetLayerProperty.d.ts +2 -2
  52. package/activities/arcgis/GetLayerProperty.js +1 -1
  53. package/activities/arcgis/GetLayerVisibility.d.ts +2 -2
  54. package/activities/arcgis/GetLayerVisibility.js +1 -1
  55. package/activities/arcgis/GetMap.d.ts +2 -2
  56. package/activities/arcgis/GetMap.js +1 -1
  57. package/activities/arcgis/GetMapScreenshot.d.ts +1 -1
  58. package/activities/arcgis/GetTable.d.ts +2 -2
  59. package/activities/arcgis/GetTable.js +1 -1
  60. package/activities/arcgis/GetViewExtent.d.ts +2 -2
  61. package/activities/arcgis/GetViewExtent.js +1 -1
  62. package/activities/arcgis/GetViewpoint.d.ts +2 -2
  63. package/activities/arcgis/GetViewpoint.js +1 -1
  64. package/activities/arcgis/IntersectEngineTask.d.ts +2 -2
  65. package/activities/arcgis/IntersectEngineTask.js +1 -1
  66. package/activities/arcgis/LengthEngineTask.d.ts +2 -2
  67. package/activities/arcgis/LengthEngineTask.js +1 -1
  68. package/activities/arcgis/MapProvider.js +1 -1
  69. package/activities/arcgis/NearestVertexEngineTask.d.ts +2 -2
  70. package/activities/arcgis/NearestVertexEngineTask.js +1 -1
  71. package/activities/arcgis/NearestVerticesEngineTask.d.ts +2 -2
  72. package/activities/arcgis/NearestVerticesEngineTask.js +1 -1
  73. package/activities/arcgis/OffsetEngineTask.d.ts +2 -2
  74. package/activities/arcgis/OffsetEngineTask.js +1 -1
  75. package/activities/arcgis/QueryAttachmentInfos.d.ts +2 -2
  76. package/activities/arcgis/QueryAttachmentInfos.js +1 -1
  77. package/activities/arcgis/QueryTask.js +1 -1
  78. package/activities/arcgis/RelateEngineTask.d.ts +2 -2
  79. package/activities/arcgis/RelateEngineTask.js +1 -1
  80. package/activities/arcgis/RemoveGraphics.d.ts +2 -2
  81. package/activities/arcgis/RemoveGraphics.js +1 -1
  82. package/activities/arcgis/RemoveLayer.d.ts +2 -2
  83. package/activities/arcgis/RemoveLayer.js +1 -1
  84. package/activities/arcgis/RotateEngineTask.d.ts +2 -2
  85. package/activities/arcgis/RotateEngineTask.js +1 -1
  86. package/activities/arcgis/SetFeaturePopup.d.ts +1 -1
  87. package/activities/arcgis/SetImageryLayerOptions.d.ts +2 -2
  88. package/activities/arcgis/SetImageryLayerOptions.js +1 -1
  89. package/activities/arcgis/SetLayerDefinitionExpression.d.ts +2 -2
  90. package/activities/arcgis/SetLayerDefinitionExpression.js +1 -1
  91. package/activities/arcgis/SetLayerPopup.d.ts +2 -2
  92. package/activities/arcgis/SetLayerPopup.js +1 -1
  93. package/activities/arcgis/SetLayerProperty.d.ts +2 -2
  94. package/activities/arcgis/SetLayerProperty.js +1 -1
  95. package/activities/arcgis/SetLayerVisibility.d.ts +2 -2
  96. package/activities/arcgis/SetLayerVisibility.js +1 -1
  97. package/activities/arcgis/SetViewExtent.d.ts +2 -2
  98. package/activities/arcgis/SetViewExtent.js +1 -1
  99. package/activities/arcgis/SetViewpoint.d.ts +2 -2
  100. package/activities/arcgis/SetViewpoint.js +1 -1
  101. package/activities/arcgis/ShowFeaturePopup.d.ts +2 -2
  102. package/activities/arcgis/ShowFeaturePopup.js +1 -1
  103. package/activities/arcgis/ShowResults.d.ts +2 -2
  104. package/activities/arcgis/SimplifyEngineTask.d.ts +2 -2
  105. package/activities/arcgis/SimplifyEngineTask.js +1 -1
  106. package/activities/arcgis/UnionEngineTask.d.ts +2 -2
  107. package/activities/arcgis/UnionEngineTask.js +1 -1
  108. package/activities/arcgis/UpdateAttachment.d.ts +2 -2
  109. package/activities/arcgis/UpdateAttachment.js +1 -1
  110. package/activities/arcgis/UpdateFeatures.d.ts +3 -3
  111. package/activities/arcgis/UpdateFeatures.js +1 -1
  112. package/activities/arcgis/libs/arcGisRestApi.d.ts +1 -8
  113. package/activities/arcgis/tools.d.ts +0 -9
  114. package/activities/arcgis/tools.js +1 -1
  115. package/activities/core/WebRequest.js +1 -1
  116. package/activities/essentials/RunEssentialsWorkflow.d.ts +1 -1
  117. package/activities/essentials/RunEssentialsWorkflow.js +1 -1
  118. package/activities/forms/ActivateFormElement.d.ts +2 -2
  119. package/activities/forms/ActivateFormElement.js +1 -1
  120. package/activities/forms/AddFormElement.d.ts +3 -3
  121. package/activities/forms/ClearFormElementError.d.ts +2 -2
  122. package/activities/forms/ClearFormElementError.js +1 -1
  123. package/activities/forms/DisplayForm.d.ts +2 -2
  124. package/activities/forms/DisplayForm.js +1 -1
  125. package/activities/forms/FormRenderer.d.ts +35 -29
  126. package/activities/forms/FormRenderer.js +1 -1
  127. package/activities/forms/HideFormElement.d.ts +2 -2
  128. package/activities/forms/HideFormElement.js +1 -1
  129. package/activities/forms/SetCurrentFormElementItem.d.ts +2 -2
  130. package/activities/forms/SetCurrentFormElementItem.js +1 -1
  131. package/activities/forms/SetFormElementError.d.ts +2 -2
  132. package/activities/forms/SetFormElementError.js +1 -1
  133. package/activities/forms/SetFormElementEvent.d.ts +2 -2
  134. package/activities/forms/SetFormElementItemProperty.d.ts +2 -2
  135. package/activities/forms/SetFormElementItemProperty.js +1 -1
  136. package/activities/forms/SetFormElementItems.d.ts +2 -2
  137. package/activities/forms/SetFormElementItems.js +1 -1
  138. package/activities/forms/SetFormElementProperty.d.ts +2 -2
  139. package/activities/forms/SetFormElementProperty.js +1 -1
  140. package/activities/forms/ShowFormElement.d.ts +2 -2
  141. package/activities/forms/ShowFormElement.js +1 -1
  142. package/execution/ActivityLoader.js +1 -1
  143. package/execution/Engine.js +1 -1
  144. package/execution/ModuleLoader.js +1 -1
  145. package/execution/ProgramRunner.js +1 -1
  146. package/forms/FormComponent.d.ts +18 -1
  147. package/forms/FormComponent.js +1 -1
  148. package/forms/FormDefinition.d.ts +1 -6
  149. package/forms/FormHost.d.ts +0 -2
  150. package/forms/FormHost.js +1 -1
  151. package/forms/FormPresenterHost.d.ts +0 -2
  152. package/forms/NumberParser.d.ts +1 -0
  153. package/forms/NumberParser.js +1 -1
  154. package/forms/common.d.ts +2 -2
  155. package/forms/common.js +1 -1
  156. package/forms/components/AutoComplete.d.ts +3 -2
  157. package/forms/components/AutoComplete.js +1 -1
  158. package/forms/components/ButtonBar.d.ts +3 -8
  159. package/forms/components/ButtonBar.js +1 -1
  160. package/forms/components/CheckBox.d.ts +2 -2
  161. package/forms/components/CheckBox.js +1 -1
  162. package/forms/components/CheckGroup.d.ts +3 -2
  163. package/forms/components/CheckGroup.js +1 -1
  164. package/forms/components/Custom.d.ts +2 -2
  165. package/forms/components/Custom.js +1 -1
  166. package/forms/components/DatePicker.d.ts +3 -2
  167. package/forms/components/DatePicker.js +1 -1
  168. package/forms/components/DateRangePicker.d.ts +3 -2
  169. package/forms/components/DateRangePicker.js +1 -1
  170. package/forms/components/DateTimePicker.d.ts +3 -2
  171. package/forms/components/DateTimePicker.js +1 -1
  172. package/forms/components/DropDownList.js +1 -1
  173. package/forms/components/FilePicker.js +1 -1
  174. package/forms/components/Form.js +1 -1
  175. package/forms/components/FormLabelNumberField.d.ts +3 -1
  176. package/forms/components/FormLabelNumberField.js +1 -1
  177. package/forms/components/GeometryPicker.js +1 -1
  178. package/forms/components/HorizontalRule.d.ts +2 -2
  179. package/forms/components/Image.d.ts +2 -2
  180. package/forms/components/Image.js +1 -1
  181. package/forms/components/ItemPicker.js +1 -1
  182. package/forms/components/ListBox.d.ts +3 -2
  183. package/forms/components/ListBox.js +1 -1
  184. package/forms/components/Markdown.d.ts +3 -4
  185. package/forms/components/Markdown.js +1 -1
  186. package/forms/components/Number.d.ts +3 -2
  187. package/forms/components/Number.js +1 -1
  188. package/forms/components/NumberRangeSlider.d.ts +2 -2
  189. package/forms/components/NumberRangeSlider.js +1 -1
  190. package/forms/components/NumberSlider.d.ts +3 -2
  191. package/forms/components/NumberSlider.js +1 -1
  192. package/forms/components/RadioGroup.d.ts +3 -2
  193. package/forms/components/RadioGroup.js +1 -1
  194. package/forms/components/Scanner.js +1 -1
  195. package/forms/components/Section.js +1 -1
  196. package/forms/components/Signature.js +1 -1
  197. package/forms/components/SignatureDialog.js +1 -1
  198. package/forms/components/Text.d.ts +2 -2
  199. package/forms/components/TextArea.d.ts +2 -2
  200. package/forms/components/TextArea.js +1 -1
  201. package/forms/components/TextBox.d.ts +2 -16
  202. package/forms/components/TextBox.js +1 -1
  203. package/forms/components/TimePicker.d.ts +3 -2
  204. package/forms/components/TimePicker.js +1 -1
  205. package/forms/dateUtilities.d.ts +4 -18
  206. package/forms/dateUtilities.js +1 -1
  207. package/forms/index.d.ts +48 -12
  208. package/forms/listUtilities.d.ts +3 -0
  209. package/forms/listUtilities.js +1 -0
  210. package/forms/manifest.d.ts +3 -0
  211. package/forms/manifest.js +1 -0
  212. package/forms/numberUtilities.d.ts +40 -3
  213. package/forms/numberUtilities.js +1 -1
  214. package/forms/presenter.js +1 -1
  215. package/forms/renderers.js +1 -1
  216. package/forms/utils.d.ts +35 -21
  217. package/forms/utils.js +1 -1
  218. package/libs/version.d.ts +1 -1
  219. package/libs/version.js +1 -1
  220. package/package.json +2 -2
@@ -1 +1 @@
1
- import Input from"@vertigis/react-ui/Input";import*as React from"react";import{useEffect,useState}from"react";import FormElement from"../FormElement.js";import{getKeyString}from"../keyboard.js";import{makeUniqueId}from"../utils.js";const TextBox=({className:e,component:r,element:a,type:t})=>{const[n,o]=useState(""),{host:u,name:l}=r.props;var p=`${makeUniqueId(l)}-input`,m="password"===t,i=m?void 0:a.maxLength,s=u.renderText(a.prompt),c=m?void 0:a.readOnly,m=u.renderText(a.tooltip);useEffect(()=>{let e="";var t=a.value;"string"==typeof t?e=t:"number"==typeof t&&(e=u.formatNumber(t)),a.value!==e&&(a.value=e,r.forceUpdate()),o(e)},[a.value]);const d=e=>{a.value=e,u.post("changed",{name:l,value:e}),o(e)};return React.createElement(FormElement,{className:e,component:r,element:a,inputId:p},React.createElement(Input,{disabled:!r.enabled,fullWidth:!0,id:p,inputProps:{maxLength:i,onKeyDown:e=>{var t=getKeyString(e);return"enter"===t?(e=>{const t=e.currentTarget;var r=t.value;if(r!==a.value)return d(r),t.select(),e.stopPropagation(),e.preventDefault(),!1})(e):"escape"===t?(e=>{const t=e.currentTarget;if(t.value!==a.value)return o(a.value),t.select(),e.stopPropagation(),e.preventDefault(),!1})(e):void 0},title:m},inputRef:e=>{null===e||e.disabled||u.renderFocus(e,l)},onBlur:e=>{e=e.target.value;e!=a.value&&d(e)},onChange:e=>{e=e.target.value;e!=n&&o(e)},placeholder:s,readOnly:c,required:a.require,type:t,value:n}))};export default TextBox;
1
+ import Input from"@vertigis/react-ui/Input";import*as React from"react";import{useEffect,useState}from"react";import FormElement from"../FormElement.js";import{FormElementTypes}from"../constants.js";import{getKeyString}from"../keyboard.js";import{makeUniqueId}from"../utils.js";const TextBox=({className:e,component:t,element:r,enabled:n,formatNumber:o,type:a,maxLength:m,name:l,prompt:u,readOnly:s,renderFocus:p,require:i,tooltip:c,value:d,renderText:f,setValue:g})=>{const[v,y]=useState("");var x=`${makeUniqueId(l)}-input`;const E=a===FormElementTypes.PASSWORDBOX;m=E?void 0:m,u=f(u),s=E?void 0:s,c=f(c);useEffect(()=>{let e="";"string"==typeof d?e=d:"number"!=typeof d||E||(e=o(d)),d!==e&&g(e,!1),v!==e&&y(e)},[d]);const T=e=>{g(e),y(e)};return React.createElement(FormElement,{className:e,component:t,element:r,inputId:x},React.createElement(Input,{disabled:!n,fullWidth:!0,id:x,inputProps:{maxLength:m,onKeyDown:e=>{var t=getKeyString(e);return"enter"===t?(e=>{const t=e.currentTarget;var r=t.value;if(r!==d)return T(r),t.select(),e.stopPropagation(),e.preventDefault(),!1})(e):"escape"===t?(e=>{const t=e.currentTarget;if(t.value!==d)return y(d),t.select(),e.stopPropagation(),e.preventDefault(),!1})(e):void 0},title:c},inputRef:e=>{null===e||e.disabled||p(e,l)},onBlur:e=>{e=e.target.value;e!=d&&T(e)},onChange:e=>{e=e.target.value;e!=v&&y(e)},placeholder:u,readOnly:s,required:i,type:E?"password":"text",value:v}))};export default TextBox;
@@ -1,7 +1,8 @@
1
1
  /// <reference types="react" />
2
- import { BaseFormElementProps } from "../FormElement";
2
+ import { FormElementProps } from "../..";
3
+ import { defs } from "../FormHost";
3
4
  /**
4
5
  * The component for the "Time Picker" Form Element.
5
6
  */
6
- declare const TimePicker: ({ className, component, element }: BaseFormElementProps) => JSX.Element;
7
+ declare const TimePicker: ({ className, component, deriveLocale, element, enabled, error, name, prompt, renderFocus, renderText, tooltip: elementTooltip, value: elementValue, setProperty, setValue: setElementValue, }: FormElementProps<defs.DateTimeRef | undefined>) => JSX.Element;
7
8
  export default TimePicker;
@@ -1 +1 @@
1
- import{buttonBaseClasses}from"@vertigis/react-ui/ButtonBase";import{clockClasses}from"@vertigis/react-ui/ClockPicker";import FormHelperText from"@vertigis/react-ui/FormHelperText";import FormLabelTextField from"@vertigis/react-ui/FormLabelTextField";import BaseTimePicker from"@vertigis/react-ui/TimePicker";import{styled}from"@vertigis/react-ui/styles";import clsx from"clsx";import*as React from"react";import{useEffect,useRef,useState}from"react";import{Calendar}from"../Calendar.js";import FormElement from"../FormElement.js";import{useFocusCallback}from"../common.js";import{hasErrorChanged,isInvalidDate,makeProperFormat,makeProperValue,updateElementValue}from"../dateUtilities.js";import{makeUniqueId}from"../utils.js";const StylableTimePicker=e=>{const{PopperProps:r={},className:t,...a}=e;return React.createElement(BaseTimePicker,{PopperProps:{...r,className:clsx(r.className,t)},...a})},StyledTimePicker=styled(StylableTimePicker)(({theme:{palette:e}})=>({[`& .${clockClasses.amButton}, .${clockClasses.pmButton}`]:{[`&.${buttonBaseClasses.focusVisible}`]:{color:e.action.active}}})),TimePicker=({className:e,component:r,element:t})=>{const[a,o]=useState(!1),[l,s]=useState(!1),[i,m]=useState(null),c=useRef(),n=useRef(!0),{host:u,name:p}=r.props;var d=useFocusCallback(r);const f=u.renderText(t.tooltip),k=makeProperFormat(t.value,t.format),P=Calendar.useNative(),v="time";useEffect(()=>{var e=makeProperValue(t.value,P);updateElementValue(t,e,v,k,P),m(e||null)},[t.value]),useEffect(()=>{n.current?n.current=!1:l||a||(isInvalidDate(i)?F({status:"invalid"}):(F(),updateElementValue(t,i,v,k,P)&&u.post("changed",{name:p,value:t.value})))},[l,a]);const F=e=>{hasErrorChanged(t,e)&&(t.error=e,r.forceUpdate())},T=`${makeUniqueId(p)}-input`,E=u.renderText(t.prompt);return React.createElement(FormElement,{className:e,component:r,element:t,inputId:T},t.error&&React.createElement(FormHelperText,{component:"div",error:!0,role:"alert"},c.current),React.createElement(StyledTimePicker,{disabled:!r.enabled,key:"date-picker",inputRef:d,onChange:e=>{m(e)},onOpen:()=>{s(!0)},onClose:()=>{s(!1)},renderInput:e=>(c.current=e.inputProps?.placeholder,e.error=!!t.error,e.inputProps={...e.inputProps,id:T,onBlur:()=>{o(!1)},onFocus:()=>{o(!0)},placeholder:E||e.inputProps?.placeholder,title:f},React.createElement(FormLabelTextField,{...e})),value:i}))};export default TimePicker;
1
+ import{buttonBaseClasses}from"@vertigis/react-ui/ButtonBase";import{clockClasses}from"@vertigis/react-ui/ClockPicker";import FormHelperText from"@vertigis/react-ui/FormHelperText";import FormLabelTextField from"@vertigis/react-ui/FormLabelTextField";import BaseTimePicker from"@vertigis/react-ui/TimePicker";import{styled}from"@vertigis/react-ui/styles";import clsx from"clsx";import*as React from"react";import{useEffect,useRef,useState}from"react";import{Calendar}from"../Calendar.js";import FormElement from"../FormElement.js";import{useFocusCallback}from"../common.js";import{areValuesEqual,hasErrorChanged,isInvalidDate,makeProperValue}from"../dateUtilities.js";import{getNewElementValue}from"../dateUtilities.js";import{makeUniqueId}from"../utils.js";const StylableTimePicker=e=>{const{PopperProps:t={},className:r,...a}=e;return React.createElement(BaseTimePicker,{PopperProps:{...t,className:clsx(t.className,r)},...a})},StyledTimePicker=styled(StylableTimePicker)(({theme:{palette:e}})=>({[`& .${clockClasses.amButton}, .${clockClasses.pmButton}`]:{[`&.${buttonBaseClasses.focusVisible}`]:{color:e.action.active}}})),TimePicker=({className:e,component:t,deriveLocale:r,element:a,enabled:o,error:l,name:s,prompt:i,renderFocus:m,renderText:c,tooltip:n,value:u,setProperty:p,setValue:d})=>{const[f,k]=useState(!1),[P,E]=useState(!1),[v,F]=useState(null),T=useRef(),C=useRef(!0);m=useFocusCallback(o,s,m);const b=c(n),g={locale:r(),timezone:(new Intl.DateTimeFormat).resolvedOptions().timeZone},x=Calendar.useNative(),R="time";useEffect(()=>{var e=makeProperValue(u,x),t=getNewElementValue(e,R,g,x);areValuesEqual(u,t)||d(t,!1),F(e||null)},[u]),useEffect(()=>{var e;C.current?C.current=!1:P||f||(isInvalidDate(v)?V({status:"invalid"}):(V(),e=getNewElementValue(v,R,g,x),areValuesEqual(u,e)||d(e)))},[P,f]);const V=e=>{hasErrorChanged(l,e)&&p("error",e)},h=`${makeUniqueId(s)}-input`,y=c(i);return React.createElement(FormElement,{className:e,component:t,element:a,inputId:h},l&&React.createElement(FormHelperText,{component:"div",error:!0,role:"alert"},T.current),React.createElement(StyledTimePicker,{disabled:!o,key:"date-picker",inputRef:m,onChange:e=>{F(e)},onOpen:()=>{E(!0)},onClose:()=>{E(!1)},renderInput:e=>(T.current=e.inputProps?.placeholder,e.error=!!l,e.inputProps={...e.inputProps,id:h,onBlur:()=>{k(!1)},onFocus:()=>{k(!0)},placeholder:y||e.inputProps?.placeholder,title:b},React.createElement(FormLabelTextField,{...e})),value:v}))};export default TimePicker;
@@ -4,11 +4,11 @@ import { defs } from "./FormHost";
4
4
  import { FormPresenterHost } from "./FormPresenterHost";
5
5
  /**
6
6
  * Checks if a form element's value is equal to the supplied value.
7
- * @param element A Form Element to inspect.
7
+ * @param elementValue The current value of a Form Element.
8
8
  * @param newValue A new value for the Form Element.
9
9
  * @returns True if the element's current value and the new value are equal, false otherwise.
10
10
  */
11
- export declare function areValuesEqual(element: defs.Element, newValue: DateTimeRef | DateRangeRef): boolean;
11
+ export declare function areValuesEqual(elementValue: defs.Value | undefined, newValue: DateTimeRef | DateRangeRef | undefined | null): boolean;
12
12
  /**
13
13
  * Checks if a given date is valid or not.
14
14
  * @param date The date object to check.
@@ -96,22 +96,8 @@ declare type Partial = void | boolean | number | string | {
96
96
  refValueType?: string;
97
97
  value?: number;
98
98
  };
99
- export declare function makeProperFormat(value: Partial, format: Partial): defs.DateTimeFormat;
100
99
  export declare function makeProperValue(value: number | string | Partial, calendar: Calendar): Date;
101
100
  export declare function isInvalidDate(date: Date | null): boolean;
102
- export declare function hasErrorChanged(element: defs.Element, error: defs.StatusRef | undefined): boolean;
103
- /**
104
- * Updates `element.value` with a new `DateTimeRef` using the supplied parameters.
105
- *
106
- * Care is taken to ensure we don't replace `element.value` with an identical
107
- * `DateTimeRef` as this can lead to infinite loops in react components
108
- * when `element.value` is a dependency of a hook such as `useEffect`.
109
- * @param element The element to be updated.
110
- * @param date The new `Date` value to use.
111
- * @param refValueType The type of value that this represents.
112
- * @param format The format of the value.
113
- * @param calendar A calendar to use to get a text representation of the date.
114
- * @returns True if the value was updated, false otherwise.
115
- */
116
- export declare function updateElementValue(element: defs.Element, date: Date | undefined | null, refValueType: DateTimeType, format: DateTimeFormat, calendar: Calendar): boolean;
101
+ export declare function hasErrorChanged(currentError: defs.Text | undefined, newError: defs.StatusRef | undefined): boolean;
102
+ export declare function getNewElementValue(date: Date | undefined | null, refValueType: DateTimeType, format: DateTimeFormat, calendar: Calendar): DateTimeRef;
117
103
  export {};
@@ -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{isStatus}from"./textUtilities.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){const t=e.value;return void 0===t&&void 0===a||null===t&&null===a||(isDateTimeRef(t)&&isDateTimeRef(a)?t.display===a.display&&t.format===a.format&&t.refValueType===a.refValueType&&t.value===a.value:!(!isDateRangeRef(t)||!isDateRangeRef(a))&&(t.endDate?.valueOf()===a.endDate?.valueOf()&&t.refValueType===a.refValueType&&t.startDate?.valueOf()===a.startDate?.valueOf()))}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]}`}}}async function getDateFnsLocale(e){const a=[];e=parseLocale(e);if(e){e.territory&&a.push(`${e.language}-${e.territory}`),a.push(e.language);for(const t of a)if(-1!==SUPPORTED_DATE_FNS_LOCALES.indexOf(t)){let e;try{switch(t){case"cs":e=(await import("date-fns/locale/cs")).default;break;case"da":e=(await import("date-fns/locale/da")).default;break;case"de":e=(await import("date-fns/locale/de")).default;break;case"de-AT":e=(await import("date-fns/locale/de-AT")).default;break;case"en-AU":e=(await import("date-fns/locale/en-AU")).default;break;case"en-CA":e=(await import("date-fns/locale/en-CA")).default;break;case"en-GB":e=(await import("date-fns/locale/en-GB")).default;break;case"en-IN":e=(await import("date-fns/locale/en-IN")).default;break;case"en-NZ":e=(await import("date-fns/locale/en-NZ")).default;break;case"en-US":e=(await import("date-fns/locale/en-US")).default;break;case"en-ZA":e=(await import("date-fns/locale/en-ZA")).default;break;case"fr":e=(await import("date-fns/locale/fr")).default;break;case"fr-CA":e=(await import("date-fns/locale/fr-CA")).default;break;case"fr-CH":e=(await import("date-fns/locale/fr-CH")).default;break;case"it":e=(await import("date-fns/locale/it")).default;break;case"nb":e=(await import("date-fns/locale/nb")).default;break;case"nl":e=(await import("date-fns/locale/nl")).default;break;case"nl-BE":e=(await import("date-fns/locale/nl-BE")).default;break;case"nn":e=(await import("date-fns/locale/nn")).default;break;case"pt":e=(await import("date-fns/locale/pt")).default;break;case"pt-BR":e=(await import("date-fns/locale/pt-BR")).default}}catch{continue}if(e?.localize)return e}}}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 loadLocale(e){e=e.deriveLocale();if("inv"!==e&&"en"!==e&&e!==DEFAULT_LOCALE)return getDateFnsLocale(e)}function makeProperFormat(e,a){if("object"==typeof e&&null!==e)switch(e.refValueType){case"date":case"time":case"datetime":a=e.format}if("object"!=typeof a)return"app"===a?a:"device";if(null===a)return"device";var t=a.locale,r=a.timezone;return"string"==typeof t&&"string"==typeof r?{locale:t,timezone:r}:"device"}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 isInvalidDate(e){return e instanceof Date&&isNaN(e.getDate())}function hasErrorChanged(e,a){e=e.error;return(void 0!==e||void 0!==a)&&((null!==e||null!==a)&&(!isStatus(e)||!isStatus(a)||e.status!==a.status))}function updateElementValue(e,a,t,r,o){if(null!=a&&isFinite(a.valueOf())){a={refValueType:t,format:r,display:o.format(a,Calendar.fullFormat),value:a.valueOf()};if(!areValuesEqual(e,a))return e.value=a,!0}else if(void 0!==e.value)return!(e.value=void 0);return!1}export{areValuesEqual,isValidDate,tryParseYear,tryParseMonth,tryParseDay,tryParseDateText,getDateFnsLocale,getLocaleDateFormat,getLocaleDateFormatSeparator,getLocaleDateFormatTokenPosition,convertToDateRangeRef,__test__setlocaleDateFormatInCache,loadLocale,makeProperFormat,makeProperValue,isInvalidDate,hasErrorChanged,updateElementValue};
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{isStatus}from"./textUtilities.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]}`}}}async function getDateFnsLocale(e){const a=[];e=parseLocale(e);if(e){e.territory&&a.push(`${e.language}-${e.territory}`),a.push(e.language);for(const t of a)if(-1!==SUPPORTED_DATE_FNS_LOCALES.indexOf(t)){let e;try{switch(t){case"cs":e=(await import("date-fns/locale/cs")).default;break;case"da":e=(await import("date-fns/locale/da")).default;break;case"de":e=(await import("date-fns/locale/de")).default;break;case"de-AT":e=(await import("date-fns/locale/de-AT")).default;break;case"en-AU":e=(await import("date-fns/locale/en-AU")).default;break;case"en-CA":e=(await import("date-fns/locale/en-CA")).default;break;case"en-GB":e=(await import("date-fns/locale/en-GB")).default;break;case"en-IN":e=(await import("date-fns/locale/en-IN")).default;break;case"en-NZ":e=(await import("date-fns/locale/en-NZ")).default;break;case"en-US":e=(await import("date-fns/locale/en-US")).default;break;case"en-ZA":e=(await import("date-fns/locale/en-ZA")).default;break;case"fr":e=(await import("date-fns/locale/fr")).default;break;case"fr-CA":e=(await import("date-fns/locale/fr-CA")).default;break;case"fr-CH":e=(await import("date-fns/locale/fr-CH")).default;break;case"it":e=(await import("date-fns/locale/it")).default;break;case"nb":e=(await import("date-fns/locale/nb")).default;break;case"nl":e=(await import("date-fns/locale/nl")).default;break;case"nl-BE":e=(await import("date-fns/locale/nl-BE")).default;break;case"nn":e=(await import("date-fns/locale/nn")).default;break;case"pt":e=(await import("date-fns/locale/pt")).default;break;case"pt-BR":e=(await import("date-fns/locale/pt-BR")).default}}catch{continue}if(e?.localize)return e}}}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 loadLocale(e){e=e.deriveLocale();if("inv"!==e&&"en"!==e&&e!==DEFAULT_LOCALE)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 isInvalidDate(e){return e instanceof Date&&isNaN(e.getDate())}function hasErrorChanged(e,a){return(void 0!==e||void 0!==a)&&((null!==e||null!==a)&&(!isStatus(e)||!isStatus(a)||e.status!==a.status))}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{areValuesEqual,isValidDate,tryParseYear,tryParseMonth,tryParseDay,tryParseDateText,getDateFnsLocale,getLocaleDateFormat,getLocaleDateFormatSeparator,getLocaleDateFormatTokenPosition,convertToDateRangeRef,__test__setlocaleDateFormatInCache,loadLocale,makeProperValue,isInvalidDate,hasErrorChanged,getNewElementValue};
package/forms/index.d.ts CHANGED
@@ -1,16 +1,30 @@
1
1
  /// <reference types="react" />
2
+ import { EventArgumentTypes, EventValueTypes } from "./FormComponent";
3
+ import { defs } from "./FormHost";
4
+ import { FormatOptions } from "./numberFormatter";
2
5
  export { Orientation, TitleLocation } from "./constants";
3
6
  export type { Text } from "./elements/types";
7
+ /**
8
+ * Details about an event to be fired when the value property is updated.
9
+ * If `false`, no event is fired.
10
+ * If `true`, the event is fired with the event object just containing the element's value.
11
+ * If an object containing `"argument"` or `"item" properties, the event is fired and those properties are included in the event object.
12
+ */
13
+ declare type EventOptions = Partial<Pick<defs.Event, "argument" | "item">> | boolean;
4
14
  /** @public */
5
- export interface FormElementProps<TValue = undefined> extends FormElementSettableProps<TValue> {
6
- /** The description of the element. */
7
- description?: Text;
8
- /** The enabled state of the element. */
15
+ export interface FormElementProps<TValue = undefined> extends FormElementSettableProps<TValue>, Pick<defs.Element, "customType" | "description" | "delay" | "format" | "manualEntry" | "maxLength" | "minLength" | "orientation" | "prompt" | "readOnly" | "require" | "showMinMaxLabels" | "showTickMarks" | "size" | "title" | "tooltip" | "type" | "wrap"> {
16
+ className?: string;
17
+ /** Coerces a number from a value. */
18
+ coerceNumber: (value: string) => number;
19
+ /**
20
+ * Derives the current locale set by the host application (or default if undefined) will be returned.
21
+ */
22
+ deriveLocale: () => string;
9
23
  enabled: boolean;
10
- /** The error state of the element. */
11
- error?: Text;
12
- /** The title of the element. */
13
- title?: string;
24
+ /** Formats a value into a string. */
25
+ formatNumber: (value: number, options?: FormatOptions) => string;
26
+ id: string;
27
+ name: string | undefined;
14
28
  /**
15
29
  * A callback function to raise an event. The `custom` event accepts any
16
30
  * value as the eventValue. Use the Get Form Event Data to access the event
@@ -19,13 +33,27 @@ export interface FormElementProps<TValue = undefined> extends FormElementSettabl
19
33
  * is permitted.
20
34
  * @param eventValue The value of the event.
21
35
  */
22
- raiseEvent: (eventName: "custom", eventValue: any) => void;
36
+ raiseEvent: <K extends keyof EventValueTypes>(eventName: K, eventValue: EventValueTypes[K], argument?: EventArgumentTypes[K], item?: string, cancellationToken?: PromiseLike<void>) => void;
37
+ /** Renders the focus. */
38
+ renderFocus: (target: Node, name?: string) => boolean;
39
+ /**
40
+ * Renders form text as a string.
41
+ * If `text` is a reference to a language string (e.g. `"@my-language-string"`), it is translated.
42
+ * If `text` is a `MarkdownRef`, it is converted to plain text.
43
+ */
44
+ renderText: (text: defs.Text | undefined) => string;
45
+ /**
46
+ * Set a property on an item in the element.
47
+ * @param property The name of the property to set.
48
+ * @param value The new value to set.
49
+ */
50
+ setItemProperty: <K extends keyof FormElementItemSettableProps>(item: string, property: K, value: FormElementItemProps[K]) => void;
23
51
  /**
24
52
  * Set a property on the element.
25
53
  * @param property The name of the property to set.
26
54
  * @param value The new value to set.
27
55
  */
28
- setProperty: <K extends keyof Omit<this, keyof FormElementProps<TValue>> | keyof FormElementSettableProps<TValue>>(property: K, value: this[K]) => void;
56
+ setProperty: <K extends keyof Omit<this, keyof FormElementProps<TValue>> | keyof FormElementSettableProps<TValue>>(property: K, value: this[K], event?: EventOptions) => void;
29
57
  /**
30
58
  * Sets the `value` property of the element. Equivalent to calling
31
59
  * `setProperty("value", value)`.
@@ -34,13 +62,21 @@ export interface FormElementProps<TValue = undefined> extends FormElementSettabl
34
62
  *
35
63
  * @param value The new value to set.
36
64
  */
37
- setValue: (value: this["value"]) => void;
65
+ setValue: (value: this["value"], event?: EventOptions) => void;
66
+ /** Translates the supplied value. */
67
+ translateText: (content: defs.Text | undefined) => string | defs.MarkdownRef | undefined;
38
68
  }
39
69
  /** @public */
40
- export interface FormElementSettableProps<TValue = undefined> {
70
+ export interface FormElementSettableProps<TValue = undefined> extends Pick<defs.Element, "items" | "checked" | "current" | "error" | "label"> {
41
71
  /** The value of the element. */
42
72
  value: TValue;
43
73
  }
74
+ /** @public */
75
+ export interface FormElementItemProps extends FormElementItemSettableProps, Pick<defs.Item, "default" | "enabled" | "index" | "label" | "styleName" | "tooltip" | "validates" | "value" | "visible"> {
76
+ }
77
+ /** @public */
78
+ export interface FormElementItemSettableProps extends Pick<defs.Item, "checked"> {
79
+ }
44
80
  declare type SettablePropsFromProps<TProps extends FormElementProps> = Omit<TProps, keyof FormElementProps> & FormElementSettableProps<TProps["value"]>;
45
81
  declare type Unionize<T> = T[keyof T];
46
82
  /** @public */
@@ -0,0 +1,3 @@
1
+ import { ItemsRef, Value } from "./FormDefinition";
2
+ export declare function arrayEqual(arr1: string[], arr2: string[]): boolean;
3
+ export declare function areValuesEqual(elementValue: Value | undefined, newValue: ItemsRef | undefined): boolean;
@@ -0,0 +1 @@
1
+ import{isItemsRef}from"./utils.js";function arrayEqual(e,t){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(e[r]!==t[r])return!1;return!0}function areValuesEqual(r,e){return r===e||void 0!==r&&void 0!==e&&(!!isItemsRef(r)&&itemArrayEqual(r.items,e.items))}function itemArrayEqual(e,t){if(e===t)return!0;if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(e[r]!==t[r])return!1;return!0}export{arrayEqual,areValuesEqual};
@@ -0,0 +1,3 @@
1
+ import { Lookup } from "../Collections";
2
+ import { FormElementRegistration } from ".";
3
+ export declare const BuiltInFormElements: Lookup<FormElementRegistration<any>>;
@@ -0,0 +1 @@
1
+ import AutoComplete from"./components/AutoComplete.js";import ButtonBar from"./components/ButtonBar.js";import CheckBox from"./components/CheckBox.js";import CheckGroup from"./components/CheckGroup.js";import Custom from"./components/Custom.js";import DatePicker from"./components/DatePicker.js";import DateRangePicker from"./components/DateRangePicker.js";import DateTimePicker from"./components/DateTimePicker.js";import HorizontalRule from"./components/HorizontalRule.js";import Image from"./components/Image.js";import ListBox from"./components/ListBox.js";import Number from"./components/Number.js";import NumberRangeSlider from"./components/NumberRangeSlider.js";import NumberSlider from"./components/NumberSlider.js";import RadioGroup from"./components/RadioGroup.js";import Text from"./components/Text.js";import TextArea from"./components/TextArea.js";import TextBox from"./components/TextBox.js";import TimePicker from"./components/TimePicker.js";import{FormElementTypes}from"./constants.js";const BuiltInFormElements={[FormElementTypes.AUTOCOMPLETE]:{id:FormElementTypes.AUTOCOMPLETE,component:AutoComplete},[FormElementTypes.BUTTONBAR]:{id:FormElementTypes.BUTTONBAR,component:ButtonBar},[FormElementTypes.CHECKBOX]:{id:FormElementTypes.CHECKBOX,component:CheckBox},[FormElementTypes.CHECKGROUP]:{id:FormElementTypes.CHECKGROUP,component:CheckGroup},[FormElementTypes.CUSTOM]:{id:FormElementTypes.CUSTOM,component:Custom},[FormElementTypes.DATEPICKER]:{id:FormElementTypes.DATEPICKER,component:DatePicker},[FormElementTypes.DATERANGEPICKER]:{id:FormElementTypes.DATERANGEPICKER,component:DateRangePicker},[FormElementTypes.DATETIMEPICKER]:{id:FormElementTypes.DATETIMEPICKER,component:DateTimePicker},[FormElementTypes.HORIZONTALRULE]:{id:FormElementTypes.HORIZONTALRULE,component:HorizontalRule},[FormElementTypes.IMAGE]:{id:FormElementTypes.IMAGE,component:Image},[FormElementTypes.LISTBOX]:{id:FormElementTypes.LISTBOX,component:ListBox},[FormElementTypes.NUMBER]:{id:FormElementTypes.NUMBER,component:Number},[FormElementTypes.NUMBERRANGESLIDER]:{id:FormElementTypes.NUMBERRANGESLIDER,component:NumberRangeSlider},[FormElementTypes.NUMBERSLIDER]:{id:FormElementTypes.NUMBERSLIDER,component:NumberSlider},[FormElementTypes.PASSWORDBOX]:{id:FormElementTypes.PASSWORDBOX,component:TextBox},[FormElementTypes.RADIOGROUP]:{id:FormElementTypes.RADIOGROUP,component:RadioGroup},[FormElementTypes.TEXT]:{id:FormElementTypes.TEXT,component:Text},[FormElementTypes.TEXTAREA]:{id:FormElementTypes.TEXTAREA,component:TextArea},[FormElementTypes.TEXTBOX]:{id:FormElementTypes.TEXTBOX,component:TextBox},[FormElementTypes.TIMEPICKER]:{id:FormElementTypes.TIMEPICKER,component:TimePicker}};export{BuiltInFormElements};
@@ -31,6 +31,16 @@ export declare const defaultNumberFormatConfiguration: NumberFormatConfiguration
31
31
  * @returns A {@link defs.NumberConstraints} containing values that can be safely used in a component.
32
32
  */
33
33
  export declare function getNumberConstraints(numberFormat: defs.NumberFormat | undefined, partialNumberFormatConfiguration?: Partial<NumberFormatConfiguration>): defs.NumberConstraints;
34
+ /**
35
+ * Counts the number of decimal places in the specified custom format string and returns the result.
36
+ * The supplied value is treated as one of Microsoft's [Custom numeric format strings](https://learn.microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings)
37
+ *
38
+ * There are lots of unusual ways you can combine the supported characters, but for simplicity, we support the most common use case
39
+ * which is using `#` and numeric characters as placeholders.
40
+ * @param customFormat The custom format to be inspected.
41
+ * @returns The number of decimal places in `customFormat`.
42
+ */
43
+ export declare function countDecimalsInCustomFormat(customFormat: string | undefined): number;
34
44
  /**
35
45
  * Counts the number of decimal places in the specified number and returns the result.
36
46
  * This uses Intl.NumberFormat rather than number.toString() to ensure that large numbers don't get converted to an exponential format.
@@ -40,7 +50,7 @@ export declare function getNumberConstraints(numberFormat: defs.NumberFormat | u
40
50
  * @param value The value to be inspected.
41
51
  * @returns The number of decimal places in `value`.
42
52
  */
43
- export declare function countDecimalPlaces(value: number): number;
53
+ export declare function countDecimalsInValue(value: number): number;
44
54
  /**
45
55
  * Determines how many decimal places should be used in presenting values to the user.
46
56
  *
@@ -83,11 +93,11 @@ export declare function enforceConstraints(value: number, numberConstraints: def
83
93
  export declare function getNumberSliderValues(values: defs.Value | undefined, numberConstraints: defs.NumberConstraints, singleValue?: boolean): number[];
84
94
  /**
85
95
  * Checks if a form element's value is equal to the supplied value.
86
- * @param element A Form Element to inspect.
96
+ * @param elementValue The current value of a Form Element.
87
97
  * @param newValue A new value for the Form Element.
88
98
  * @returns True if the element's current value and the new value are equal, false otherwise.
89
99
  */
90
- export declare function areValuesEqual(element: defs.Element, newValue: defs.NumberRef | undefined): boolean;
100
+ export declare function areValuesEqual(elementValue: defs.Value | undefined, newValue: defs.NumberRef | undefined): boolean;
91
101
  /**
92
102
  * A mark on the slider. This is a copy of the interface by the same name in @mui/base/useSlider.
93
103
  * We use string rather than React.Node so that we can share this between runtime and designer without discrepancies between the typings.
@@ -111,3 +121,30 @@ export interface Mark {
111
121
  * @returns The value for the marks property for the slider.
112
122
  */
113
123
  export declare function getMarks(maximum: number, minimum: number, step: number, formatOptions: FormatOptions, showMinMaxLabels: boolean, showTickMarks: boolean): boolean | Mark[];
124
+ /**
125
+ * Rounds a value to the specified number of decimals in a way that should avoid rounding errors.
126
+ * This is based on an example found here:
127
+ * https://medium.com/swlh/how-to-round-to-a-certain-number-of-decimal-places-in-javascript-ed74c471c1b8
128
+ * @param value The value to be rounded.
129
+ * @param decimalPlaces The number of decimal places to round to.
130
+ * @returns An accurately rounded value.
131
+ */
132
+ export declare function roundAccurately(value: number, decimalPlaces: number): number;
133
+ /**
134
+ * Details about a symbol that is used to represent currency or percentage.
135
+ */
136
+ declare type SymbolInfo = {
137
+ /**
138
+ * Whether the symbol should appear at the start (before the value) or end (after it).
139
+ */
140
+ position: "start" | "end";
141
+ /**
142
+ * The symbol to displayed.
143
+ */
144
+ symbol: string;
145
+ symbolCount?: number;
146
+ integerCount?: number;
147
+ };
148
+ export declare function getCurrencySymbolInfo(locale: string, currency: string): SymbolInfo;
149
+ export declare function getPercentSymbolInfo(locale: string): SymbolInfo;
150
+ export {};
@@ -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:i,upperBound:t}=e=e||{};let{precision:u,step:o}=e;var n,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),u="number"!=typeof u||Number.isNaN(u)?r.precision.default:u,void 0!==r.precision.minimum&&(u=Math.max(u,r.precision.minimum)),void 0!==r.precision.maximum&&(u=Math.min(u,r.precision.maximum)),u<0?(n=Math.pow(10,-1*u),void 0!==o&&o%n==0||(o=n)):(o=isNumeric(o)&&0<o?o:r.step.default,void 0!==m&&void 0!==a&&(o=Math.min(o,m-a),n=(m-a)/o,Number.isInteger(n)||(r=countDecimalPlaces(o),m=roundAccurately(a+Math.floor(n)*o,r)))),{maximum:m,minimum:a,step:o}}const intlNumberFormat=new Intl.NumberFormat("en-US",{minimumFractionDigits:0,maximumFractionDigits:20,useGrouping:!1});function countDecimalPlaces(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=countDecimalPlaces(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 enforceConstraints(e,r){var i,t,{maximum:u,minimum:o,step:r}=r;return void 0!==o?(i=(e-o)/r,Number.isInteger(i)||(t=countDecimalPlaces(r),e=roundAccurately(o+Math.round(i)*r,t))):void 0!==u&&(i=(u-e)/r,Number.isInteger(i)||(t=countDecimalPlaces(r),e=roundAccurately(u-Math.round(i)*r,t))),void 0!==o&&e<o&&(e=o),e=void 0!==u&&u<e?u:e}function getNumberSliderValues(e,r,i=!1){let t=[],u=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?u=e:"number"==typeof e?.numeric&&(u=e.numeric);if(Array.isArray(e)&&1<=e.length&&(u=e[0],o=e[1]),void 0===u||isNaN(u)||(u=enforceConstraints(u,r),void 0===o||isNaN(o)?i&&t.push(u):(o=enforceConstraints(o,r),t.push(u,o))),t=t.sort((e,r)=>e-r),t.length===(i?1:2))return t;var n=r.maximum,e=r.minimum;return i?[enforceConstraints((e+n)/2,r)]:[e,n]}function areValuesEqual(e,r){e=e.value;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,u,o){if(u&&o){const n=[{value:i,label:format(e,i)}];for(let e=i+t;e<r;e+=t)n.push({value:e});return n.push({value:r,label:format(e,r)}),n}return u&&!o?[{value:i,label:format(e,i)},{value:r,label:format(e,r)}]:o}function roundAccurately(e,r){return Number(Math.round(Number(e+`e${r}`))+`e-${r}`)}export{defaultNumberFormatConfiguration,getNumberConstraints,countDecimalPlaces,sanitizePrecision,getNumberFormatConfiguration,enforceConstraints,getNumberSliderValues,areValuesEqual,getMarks};
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:t,upperBound:n}=e=e||{};let{precision:i,step:u}=e;var o,r=getNumberFormatConfiguration(r);let a=isNumeric(t)?t:r.lowerBound.default,m=isNumeric(n)?n:r.upperBound.default;return void 0!==m&&void 0!==a&&m<=a&&(a=r.lowerBound.default,m=r.upperBound.default),i="number"!=typeof i||Number.isNaN(i)?r.precision.default:i,void 0!==r.precision.minimum&&(i=Math.max(i,r.precision.minimum)),void 0!==r.precision.maximum&&(i=Math.min(i,r.precision.maximum)),i<0?(o=Math.pow(10,-1*i),void 0!==u&&u%o==0||(u=o)):(u=isNumeric(u)&&0<u?u:r.step.default,void 0!==m&&void 0!==a&&(u=Math.min(u,m-a),o=(m-a)/u,Number.isInteger(o)||(r=countDecimalsInValue(u),m=roundAccurately(a+Math.floor(o)*u,r)))),{maximum:m,minimum:a,step:u}}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,t){t=getNumberFormatConfiguration(t);void 0===e&&(e=t.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 t in e)r[t]=Object.assign(r[t],e[t]);return r}function enforceConstraints(e,r){var t,n,{maximum:i,minimum:u,step:r}=r;return void 0!==u?(t=(e-u)/r,Number.isInteger(t)||(n=countDecimalsInValue(r),e=roundAccurately(u+Math.round(t)*r,n))):void 0!==i&&(t=(i-e)/r,Number.isInteger(t)||(n=countDecimalsInValue(r),e=roundAccurately(i-Math.round(t)*r,n))),void 0!==u&&e<u&&(e=u),e=void 0!==i&&i<e?i:e}function getNumberSliderValues(e,r,t=!1){let n=[],i=NaN,u=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?i=e:"number"==typeof e?.numeric&&(i=e.numeric);if(Array.isArray(e)&&1<=e.length&&(i=e[0],u=e[1]),void 0===i||isNaN(i)||(i=enforceConstraints(i,r),void 0===u||isNaN(u)?t&&n.push(i):(u=enforceConstraints(u,r),n.push(i,u))),n=n.sort((e,r)=>e-r),n.length===(t?1:2))return n;var o=r.maximum,e=r.minimum;return t?[enforceConstraints((e+o)/2,r)]:[e,o]}function areValuesEqual(e,r){if(void 0===e&&void 0===r||null===e&&null===r)return!0;var t,n;return!(!isNumberRef(e)||!isNumberRef(r))&&(e.display===r.display&&e.refValueType===r.refValueType&&e.numeric===r.numeric&&(t=e.format,n=r.format,void 0===t&&void 0===n||void 0!==t&&void 0!==n&&(t.currency===n.currency&&t.customDisplayFormat===n.customDisplayFormat&&t.displayFormat===n.displayFormat&&t.lowerBound===n.lowerBound&&t.precision===n.precision&&t.step===n.step&&t.upperBound===n.upperBound)))}function getMarks(r,t,n,e,i,u){if(i&&u){const o=[{value:t,label:format(e,t)}];for(let e=t+n;e<r;e+=n)o.push({value:e});return o.push({value:r,label:format(e,r)}),o}return i&&!u?[{value:t,label:format(e,t)},{value:r,label:format(e,r)}]:u}function roundAccurately(e,r){return Number(Math.round(Number(e+`e${r}`))+`e-${r}`)}function getCurrencySymbolInfo(e,r){const t=new Intl.NumberFormat(e,{style:"currency",currency:r,minimumFractionDigits:0,maximumFractionDigits:0,useGrouping:!1}),n=t.formatToParts(0);e=n.filter(e=>"currency"===e.type)[0],r=n.filter(e=>"integer"===e.type)[0];if(e&&r)return{position:n.indexOf(e)<n.indexOf(r)?"start":"end",symbol:e.value}}function getPercentSymbolInfo(e){const r=new Intl.NumberFormat(e,{style:"percent",minimumFractionDigits:0,maximumFractionDigits:0,useGrouping:!1}),t=r.formatToParts(0);var n=t.filter(e=>"percentSign"===e.type)[0],e=t.filter(e=>"integer"===e.type)[0];if(n&&e)return{position:t.indexOf(n)<t.indexOf(e)?"start":"end",symbol:n.value}}export{defaultNumberFormatConfiguration,getNumberConstraints,countDecimalsInCustomFormat,countDecimalsInValue,sanitizePrecision,getNumberFormatConfiguration,enforceConstraints,getNumberSliderValues,areValuesEqual,getMarks,roundAccurately,getCurrencySymbolInfo,getPercentSymbolInfo};
@@ -1 +1 @@
1
- import{createElement}from"react";import*as React from"react";import{unmountComponentAtNode,render as reactRender}from"react-dom";import{FormComponent}from"./FormComponent.js";import{FormComponentTypes,FormElementTypes}from"./constants.js";import{renderComponent,renderElement,renderNone as renderers_renderNone}from"./renderers.js";import{getElementProps}from"./utils.js";function refresh(e){e instanceof FormComponent&&e.forceUpdate()}function refreshForm(e,r){reactRender(React.createElement(FormComponent,{host:e,type:"form"}),r)}function releaseForm(e){unmountComponentAtNode(e)}function render(e){if(e instanceof FormComponent){if(e.props.type!==FormComponentTypes.ELEMENT)return renderComponent(e);var r=e.prepare();if(null==r)return;var n=r.type;return"string"!=typeof n?void 0:n===FormElementTypes.CUSTOM?e.props.host.renderCustom(e,r):e.elementRegistration?createElement(e.elementRegistration.component,getElementProps(e,r)):renderElement(n,e,r)}}function renderNone(e){if(e instanceof FormComponent)return renderers_renderNone(e)}export{refresh,refreshForm,releaseForm,render,renderNone};
1
+ import{createElement}from"react";import*as React from"react";import{unmountComponentAtNode,render as reactRender}from"react-dom";import{FormComponent}from"./FormComponent.js";import Custom from"./components/Custom.js";import{FormComponentTypes,FormElementTypes}from"./constants.js";import{renderComponent,renderElement,renderNone as renderers_renderNone}from"./renderers.js";import{getElementProps}from"./utils.js";function refresh(e){e instanceof FormComponent&&e.forceUpdate()}function refreshForm(e,r){reactRender(React.createElement(FormComponent,{host:e,type:"form"}),r)}function releaseForm(e){unmountComponentAtNode(e)}function render(e){if(e instanceof FormComponent){if(e.props.type!==FormComponentTypes.ELEMENT)return renderComponent(e);var r=e.prepare();if(null==r)return;var n=r.type;return"string"!=typeof n?void 0:e.elementRegistration?createElement(e.elementRegistration.component,getElementProps(e,r)):n===FormElementTypes.CUSTOM?createElement(Custom,getElementProps(e,r)):renderElement(n,e,r)}}function renderNone(e){if(e instanceof FormComponent)return renderers_renderNone(e)}export{refresh,refreshForm,releaseForm,render,renderNone};
@@ -1 +1 @@
1
- import Box from"@vertigis/react-ui/Box";import*as React from"react";import AccordionGroup from"./components/AccordionGroup.js";import AutoComplete from"./components/AutoComplete.js";import ButtonBar from"./components/ButtonBar.js";import CheckBox from"./components/CheckBox.js";import CheckGroup from"./components/CheckGroup.js";import Custom from"./components/Custom.js";import DatePicker from"./components/DatePicker.js";import DateRangePicker from"./components/DateRangePicker.js";import DateTimePicker from"./components/DateTimePicker.js";import DropDownList from"./components/DropDownList.js";import FilePicker from"./components/FilePicker.js";import Form,{formClasses}from"./components/Form.js";import GeometryPicker from"./components/GeometryPicker.js";import HorizontalRule from"./components/HorizontalRule.js";import Image from"./components/Image.js";import ItemPicker from"./components/ItemPicker.js";import ListBox from"./components/ListBox.js";import Number from"./components/Number.js";import NumberRangeSlider from"./components/NumberRangeSlider.js";import NumberSlider from"./components/NumberSlider.js";import RadioGroup from"./components/RadioGroup.js";import Scanner from"./components/Scanner.js";import Section from"./components/Section.js";import Signature from"./components/Signature.js";import Text from"./components/Text.js";import TextArea from"./components/TextArea.js";import TextBox from"./components/TextBox.js";import TimePicker from"./components/TimePicker.js";import{FormComponentTypes,FormElementTypes}from"./constants.js";function renderComponent(e){switch(e.props.type){case FormComponentTypes.FORM:return React.createElement(Form,{component:e});case FormComponentTypes.HEADER:return renderBox(e.props.children,formClasses.header);case FormComponentTypes.MAIN:return renderBox(e.props.children,formClasses.main);case FormComponentTypes.FOOTER:return renderBox(e.props.children,formClasses.footer);case FormComponentTypes.BODY:return renderBox(e.props.children,formClasses.body);case FormComponentTypes.ROW:return renderBox(e.props.children,formClasses.row);case FormComponentTypes.SECTION:return renderElement(FormElementTypes.SECTION,e,e.prepare());case FormComponentTypes.ACCORDIONGROUP:return React.createElement(AccordionGroup,{component:e});default:return null}}function renderNone(e){return renderBox([`--- Unsupported Form Element (name=${e.props.name}) ---`],"None")}function renderBox(e,t){return React.createElement(Box,{className:t},e)}function renderElement(e,t,r){switch(e){case FormElementTypes.AUTOCOMPLETE:return React.createElement(AutoComplete,{component:t,element:r});case FormElementTypes.BUTTONBAR:return React.createElement(ButtonBar,{component:t,element:r});case FormElementTypes.CHECKBOX:return React.createElement(CheckBox,{component:t,element:r});case FormElementTypes.CHECKGROUP:return React.createElement(CheckGroup,{component:t,element:r});case FormElementTypes.CUSTOM:return React.createElement(Custom,{component:t,element:r});case FormElementTypes.DATEPICKER:return React.createElement(DatePicker,{component:t,element:r});case FormElementTypes.DATERANGEPICKER:return React.createElement(DateRangePicker,{component:t,element:r});case FormElementTypes.DATETIMEPICKER:return React.createElement(DateTimePicker,{component:t,element:r});case FormElementTypes.DROPDOWNLIST:return React.createElement(DropDownList,{component:t,element:r});case FormElementTypes.FILEPICKER:return React.createElement(FilePicker,{component:t,element:r});case FormElementTypes.GEOMETRYPICKER:return React.createElement(GeometryPicker,{component:t,element:r});case FormElementTypes.HORIZONTALRULE:return React.createElement(HorizontalRule,{component:t,element:r});case FormElementTypes.IMAGE:return React.createElement(Image,{component:t,element:r});case FormElementTypes.ITEMPICKER:return React.createElement(ItemPicker,{component:t,element:r});case FormElementTypes.LISTBOX:return React.createElement(ListBox,{component:t,element:r});case FormElementTypes.NUMBER:return React.createElement(Number,{component:t,element:r});case FormElementTypes.NUMBERRANGESLIDER:return React.createElement(NumberRangeSlider,{component:t,element:r});case FormElementTypes.NUMBERSLIDER:return React.createElement(NumberSlider,{component:t,element:r});case FormElementTypes.PASSWORDBOX:return React.createElement(TextBox,{component:t,element:r,type:"password"});case FormElementTypes.RADIOGROUP:return React.createElement(RadioGroup,{component:t,element:r});case FormElementTypes.SCANNER:return React.createElement(Scanner,{component:t,element:r});case FormElementTypes.SECTION:return React.createElement(Section,{component:t,element:r});case FormElementTypes.SIGNATURE:return React.createElement(Signature,{component:t,element:r});case FormElementTypes.TEXT:return React.createElement(Text,{component:t,element:r});case FormElementTypes.TEXTAREA:return React.createElement(TextArea,{component:t,element:r});case FormElementTypes.TEXTBOX:return React.createElement(TextBox,{component:t,element:r});case FormElementTypes.TIMEPICKER:return React.createElement(TimePicker,{component:t,element:r});default:return null}}export{renderComponent,renderNone,renderElement};
1
+ import Box from"@vertigis/react-ui/Box";import*as React from"react";import AccordionGroup from"./components/AccordionGroup.js";import DropDownList from"./components/DropDownList.js";import FilePicker from"./components/FilePicker.js";import Form,{formClasses}from"./components/Form.js";import GeometryPicker from"./components/GeometryPicker.js";import ItemPicker from"./components/ItemPicker.js";import Scanner from"./components/Scanner.js";import Section from"./components/Section.js";import Signature from"./components/Signature.js";import{FormComponentTypes,FormElementTypes}from"./constants.js";function renderComponent(e){switch(e.props.type){case FormComponentTypes.FORM:return React.createElement(Form,{component:e});case FormComponentTypes.HEADER:return renderBox(e.props.children,formClasses.header);case FormComponentTypes.MAIN:return renderBox(e.props.children,formClasses.main);case FormComponentTypes.FOOTER:return renderBox(e.props.children,formClasses.footer);case FormComponentTypes.BODY:return renderBox(e.props.children,formClasses.body);case FormComponentTypes.ROW:return renderBox(e.props.children,formClasses.row);case FormComponentTypes.SECTION:return renderElement(FormElementTypes.SECTION,e,e.prepare());case FormComponentTypes.ACCORDIONGROUP:return React.createElement(AccordionGroup,{component:e});default:return null}}function renderNone(e){return renderBox([`--- Unsupported Form Element (name=${e.props.name}) ---`],"None")}function renderBox(e,r){return React.createElement(Box,{className:r},e)}function renderElement(e,r,n){switch(e){case FormElementTypes.DROPDOWNLIST:return React.createElement(DropDownList,{component:r,element:n});case FormElementTypes.FILEPICKER:return React.createElement(FilePicker,{component:r,element:n});case FormElementTypes.GEOMETRYPICKER:return React.createElement(GeometryPicker,{component:r,element:n});case FormElementTypes.ITEMPICKER:return React.createElement(ItemPicker,{component:r,element:n});case FormElementTypes.SCANNER:return React.createElement(Scanner,{component:r,element:n});case FormElementTypes.SECTION:return React.createElement(Section,{component:r,element:n});case FormElementTypes.SIGNATURE:return React.createElement(Signature,{component:r,element:n});default:return null}}export{renderComponent,renderNone,renderElement};
package/forms/utils.d.ts CHANGED
@@ -46,25 +46,25 @@ export { text };
46
46
  export declare function makeId(): string;
47
47
  /**
48
48
  * Performs key/item sorting.
49
- * @product This is intended for internal use only within VertiGIS Studio products.
50
49
  */
51
- export declare function sort<T>(items: T | undefined, predicate?: (item: T[keyof T], index: number) => number | undefined): T;
52
50
  /**
53
- * This function does a few things relating to items within an element.
51
+ * This function attempts to sort and filter a collection of items.
52
+ *
53
+ * The sorted is limited as the result is an object, so the order of the keys is not entirely configurable.
54
54
  *
55
- * 1. The items are sorted by index, falling back to their order of the keys if no index is present.
56
- * 2. Any items with visibe = false are excluded.
57
- * 3. It ensures `element.value` and `element.current` are consistent.
58
- * 4. It updates `element.label` to match the current item.
55
+ * The filtering is achieved via the predicate. Any item that causes a non-numeric return value from the predicate
56
+ * is dropped from the resulting items.
57
+ *
58
+ * @param items The items to be sorted and filtered.
59
+ * @param predicate The function to call for each item to determine its new index. If this returns something other than a number, the item is excluded from the result.
60
+ * @returns A sorted and filtered version of the items.
59
61
  * @product This is intended for internal use only within VertiGIS Studio products.
60
- * @param element The element whose items are to be sorted.
61
- * @returns An array of visible items, sorted by index.
62
62
  */
63
- export declare function sortItems(element: defs.Element): Lookup<defs.Item>;
63
+ export declare function sortAndFilter<T>(items: T | undefined, predicate?: (item: T[keyof T], index: number) => number | undefined): T;
64
64
  /**
65
- * Details returned by `sortAndFilterItems()`.
65
+ * Details returned by `inspectItems()`.
66
66
  */
67
- declare type sortAndFilterItemsResult = {
67
+ declare type InspectItemsResult = {
68
68
  /** The index of the now-selected item, based on the new value of `items`. */
69
69
  current: string | undefined;
70
70
  /** The sorted and filtered items. */
@@ -75,17 +75,31 @@ declare type sortAndFilterItemsResult = {
75
75
  value: defs.Value | undefined;
76
76
  };
77
77
  /**
78
- * This function produces a set of `items` based on the supplied `element`.
79
- * They are sorted based on `element.index` or the ordinal position.
80
- * They are filtered to exclude `undefined`, `null` or elements with `visible` set to `false.`
78
+ * This function interates through the items of the supplied element in preparation for use.
79
+ *
80
+ * It does the following:
81
81
  *
82
- * Unlike `sortItems()`, this function does not attempt to change `element`.
83
- * Instead, new values for `current`, `label` and `value` are included in the result.
84
- * It is then the responsibility of the caller to update them in the original `element` if necessary.
85
- * @param element The element whose items are to be sorted.
86
- * @returns A sorted and filtered set if items, along with a few properties that should be updated on `element`.
82
+ * 1. Provides a new set of items.
83
+ * 1. They are sorted and filters to exclude any where `visible` is `false`.
84
+ * 2. Unlike the other values returned, this one should not be updated on the element.
85
+ * This is because we want to be able to change an invisible item back to visible in future,
86
+ * and they are omitted from the returned items.
87
+ * 2. Provides a new value for `element.current`\
88
+ * **IMPORTANT: This should be ignored when using a `defs.ItemsRef` as the value.**
89
+ * 1. It must refer to a visible item.
90
+ * 2. If absent, items' values are compared with `element.value` to find a match. If found, that is the new `current`.
91
+ * 3. Provides a new value for `element.label`.\
92
+ * **IMPORTANT: This should be ignored when using a `defs.ItemsRef` as the value.**
93
+ * 1. This is the label of the item specified by `current`.
94
+ * 4. Provides a new value for `element.value`.\
95
+ * **IMPORTANT: This should be ignored when using a `defs.ItemsRef` as the value.**
96
+ * 1. This is the value of the item specified by `current`.
97
+ * @param current The id of the current item, equivalent to `element.current`.
98
+ * @param items The items, equivalent to `element.items`.
99
+ * @param value The current value, equivalent to `element.value`.
100
+ * @returns A sorted and filtered set if items, along with some other properties that can be updated on `element`.
87
101
  */
88
- export declare function sortAndFilterItems(element: defs.Element): sortAndFilterItemsResult;
102
+ export declare function inspectItems(current: string | undefined, items: Lookup<defs.Item> | undefined, value: defs.Value | undefined): InspectItemsResult;
89
103
  /** @product This is intended for internal use only within VertiGIS Studio products. */
90
104
  export declare function makeSafeClassName(elementName: string | undefined): string;
91
105
  /** @public */
package/forms/utils.js CHANGED
@@ -1 +1 @@
1
- import*as text from"./textUtilities.js";const DEFAULT_THROTTLE_DELAY=100;let next=0,seed=(new Date).valueOf();const guid="5DDC9A38-AAAB-44C1-AD87-415160F43D75";function makeId(){return 2147483648<=next&&(seed=(new Date).valueOf(),next=0),`${guid}:${seed}:${next++}`}function indexOf(e,t){if(null!=e){e=e.index;return"number"==typeof e?e:t}}function compareIndex(e,t){return compareNumber(e.index,t.index)}function compareNumber(e,t){return e<t?-1:t<e?1:0}function sort(e,t){void 0===t&&(t=indexOf);const n={};if("object"!=typeof e||null===e)return n;let i=0;const r=[];for(const o in e){var s=e[o],a=t(s,i++);"number"==typeof a&&r.push({key:o,index:a,item:s})}for(const u of r.sort(compareIndex))n[u.key]=u.item;return n}function sortItems(e){let t=e.current;var n=e.value,i=sort(e.items,function(e,t){if(null!=e&&!1!==e.visible){e=e.index;return"number"==typeof e?e:t}});if(void 0!==t&&null!==t&&void 0!==i[t]||(t=void 0),void 0===t&&null!=n)for(const r in i){if(i[r].value===n){t=r;break}t=void 0}return void 0!==t?(e.current=t,e.label=i[t].label,e.value=i[t].value):(e.current=void 0,e.label=void 0,e.value=void 0),i}function sortAndFilterItems(e){var t={...e},e=sortItems(t);return{current:t.current,items:e,label:t.label,value:t.value}}function stripClassName(e,t){return e.className.split(" ").filter(e=>0<e.length&&e!==t).join(" ")}function makeSafeClassName(e){return`gcx-forms-${e?.replace(/[\W]/g,"")||"element"}`}let idSuffix=0;function makeUniqueId(e){return`${makeSafeClassName(e)}-${++idSuffix}`}function addClass(e,t){void 0!==e.classList?e.classList.add(t):e.className=stripClassName(e,t)+" "+t}function removeClass(e,t){void 0!==e.classList?e.classList.remove(t):e.className=stripClassName(e,t)}function setClass(e,t,n){(n?addClass:removeClass)(e,t)}function isObjectType(e,t){return"object"==typeof e&&null!==e&&(!Array.isArray(e)&&e.refValueType===t)}function isBoolean(e){return"boolean"==typeof e}function isNumber(e){return"number"==typeof e}function isString(e){return"string"==typeof e}function isDataRef(e){return isObjectType(e,"data")}function isDateRangeRef(e){return isObjectType(e,"daterange")}function isDateTimeRef(e){return isObjectType(e,"date")||isObjectType(e,"time")||isObjectType(e,"datetime")}function isFilesRef(e){return isObjectType(e,"files")}function isScanRef(e){return isObjectType(e,"scan")}function isGeometryRef(e){return isObjectType(e,"geometry")}function isItemsRef(e){return isObjectType(e,"items")}function isNumberRef(e){return isObjectType(e,"number")}function sanitizeGeometryRef(e){if(isGeometryRef(e)){var t=e.geometry;if(Array.isArray(t)&&0<t.length)switch(e.format){case"point":case"polygon":case"polyline":case"polygon-freehand":case"polyline-freehand":case"extent":case"line":return e}}}function createGeometryRef(e){return{refValueType:"geometry",format:e,geometry:[]}}function throttle(r,s=DEFAULT_THROTTLE_DELAY){let a,o;return function(){const e=this,t=arguments;function n(){o=void 0,a=Date.now(),r.apply(e,t)}var i=Date.now();a&&i<a+s?(clearTimeout(o),o=setTimeout(n,s)):n()}}function isNumeric(e){return!isNaN(parseFloat(e))&&isFinite(e)}function getElementProps(e,t){return{...t,element:t,name:e.props.name,enabled:!!t.enabled,setProperty:e.setProperty,setValue:e.setValue,raiseEvent:e.raiseEvent,value:t.value}}function getItemId(e,t){if(e)for(const n in t)if(t[n]===e)return n}export{text,makeId,sort,sortItems,sortAndFilterItems,makeSafeClassName,makeUniqueId,addClass,removeClass,setClass,isBoolean,isNumber,isString,isDataRef,isDateRangeRef,isDateTimeRef,isFilesRef,isScanRef,isGeometryRef,isItemsRef,isNumberRef,sanitizeGeometryRef,createGeometryRef,throttle,isNumeric,getElementProps,getItemId};
1
+ import*as text from"./textUtilities.js";const DEFAULT_THROTTLE_DELAY=100;let next=0,seed=(new Date).valueOf();const guid="5DDC9A38-AAAB-44C1-AD87-415160F43D75";function makeId(){return 2147483648<=next&&(seed=(new Date).valueOf(),next=0),`${guid}:${seed}:${next++}`}function indexOf(e,t){if(null!=e){e=e.index;return"number"==typeof e?e:t}}function compareIndex(e,t){return compareNumber(e.index,t.index)}function compareNumber(e,t){return e<t?-1:t<e?1:0}function sortAndFilter(e,t){void 0===t&&(t=indexOf);const n={};if("object"!=typeof e||null===e)return n;let r=0;const i=[];for(const o in e){var s=e[o],a=t(s,r++);"number"==typeof a&&i.push({key:o,index:a,item:s})}for(const u of i.sort(compareIndex))n[u.key]=u.item;return n}function inspectItems(e,t,n){let r;var i=sortAndFilter(t,function(e,t){if(null!=e&&!1!==e.visible){e=e.index;return"number"==typeof e?e:t}});if(void 0===(e=null==e||void 0===i[e]?void 0:e)&&null!=n)for(const s in i){if(i[s].value===n){e=s;break}e=void 0}return n=void 0!==e?(r=i[e].label,i[e].value):r=void 0,{current:e,items:i,label:r,value:n}}function stripClassName(e,t){return e.className.split(" ").filter(e=>0<e.length&&e!==t).join(" ")}function makeSafeClassName(e){return`gcx-forms-${e?.replace(/[\W]/g,"")||"element"}`}let idSuffix=0;function makeUniqueId(e){return`${makeSafeClassName(e)}-${++idSuffix}`}function addClass(e,t){void 0!==e.classList?e.classList.add(t):e.className=stripClassName(e,t)+" "+t}function removeClass(e,t){void 0!==e.classList?e.classList.remove(t):e.className=stripClassName(e,t)}function setClass(e,t,n){(n?addClass:removeClass)(e,t)}function isObjectType(e,t){return"object"==typeof e&&null!==e&&(!Array.isArray(e)&&e.refValueType===t)}function isBoolean(e){return"boolean"==typeof e}function isNumber(e){return"number"==typeof e}function isString(e){return"string"==typeof e}function isDataRef(e){return isObjectType(e,"data")}function isDateRangeRef(e){return isObjectType(e,"daterange")}function isDateTimeRef(e){return isObjectType(e,"date")||isObjectType(e,"time")||isObjectType(e,"datetime")}function isFilesRef(e){return isObjectType(e,"files")}function isScanRef(e){return isObjectType(e,"scan")}function isGeometryRef(e){return isObjectType(e,"geometry")}function isItemsRef(e){return isObjectType(e,"items")}function isNumberRef(e){return isObjectType(e,"number")}function sanitizeGeometryRef(e){if(isGeometryRef(e)){var t=e.geometry;if(Array.isArray(t)&&0<t.length)switch(e.format){case"point":case"polygon":case"polyline":case"polygon-freehand":case"polyline-freehand":case"extent":case"line":return e}}}function createGeometryRef(e){return{refValueType:"geometry",format:e,geometry:[]}}function throttle(i,s=DEFAULT_THROTTLE_DELAY){let a,o;return function(){const e=this,t=arguments;function n(){o=void 0,a=Date.now(),i.apply(e,t)}var r=Date.now();a&&r<a+s?(clearTimeout(o),o=setTimeout(n,s)):n()}}function isNumeric(e){return!isNaN(parseFloat(e))&&isFinite(e)}const HostMap=new WeakMap;function getElementProps(e,t){var{enabled:n,id:r,raiseEvent:i,setItemProperty:s,setProperty:a,setValue:o}=e;const u=e.props["host"];let c=HostMap.get(u);c||(c={coerceNumber:u.coerceNumber.bind(u),deriveLocale:u.deriveLocale.bind(u),formatNumber:u.formatNumber.bind(u),renderFocus:u.renderFocus.bind(u),renderText:u.renderText.bind(u),translateText:u.translateText.bind(u)},HostMap.set(u,c));var{format:f,manualEntry:l,showMinMaxLabels:m,showTickMarks:d,size:p,type:y,value:b,wrap:T}=t;return{...t,enabled:!!n,id:r,raiseEvent:i,setItemProperty:s,setProperty:a,setValue:o,format:f,manualEntry:l,showMinMaxLabels:m,showTickMarks:d,size:p,type:y,value:b,wrap:T,coerceNumber:c.coerceNumber,deriveLocale:c.deriveLocale,formatNumber:c.formatNumber,renderFocus:c.renderFocus,renderText:c.renderText,translateText:c.translateText,element:t,name:e.props.name,component:e}}function getItemId(e,t){if(e)for(const n in t)if(t[n]===e)return n}export{text,makeId,sortAndFilter,inspectItems,makeSafeClassName,makeUniqueId,addClass,removeClass,setClass,isBoolean,isNumber,isString,isDataRef,isDateRangeRef,isDateTimeRef,isFilesRef,isScanRef,isGeometryRef,isItemsRef,isNumberRef,sanitizeGeometryRef,createGeometryRef,throttle,isNumeric,getElementProps,getItemId};
package/libs/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const VERSION = "5.35.1+1";
1
+ export declare const VERSION = "5.36.0+40";
package/libs/version.js CHANGED
@@ -1 +1 @@
1
- const VERSION="5.35.1+1";export{VERSION};
1
+ const VERSION="5.36.0+40";export{VERSION};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vertigis/workflow",
3
- "version": "5.35.1",
3
+ "version": "5.36.0",
4
4
  "author": "VertiGIS",
5
5
  "dependencies": {
6
6
  "@zxing/library": "^0.20.0",
@@ -19,7 +19,7 @@
19
19
  "@types/react": "^17.0.53",
20
20
  "@types/react-dom": "^17.0.18",
21
21
  "@vertigis-internal/licensing": "^5.0.102865",
22
- "@vertigis/react-ui": "11.32.0",
22
+ "@vertigis/react-ui": "11.32.2",
23
23
  "cross-env": "7.0.3",
24
24
  "jest": "29.3.1",
25
25
  "jest-environment-jsdom": "^29.3.1",