@vertigis/workflow 5.33.0 → 5.34.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 (195) hide show
  1. package/Activator.d.ts +6 -2
  2. package/Collections.d.ts +8 -5
  3. package/EnumUtils.d.ts +1 -0
  4. package/Errors.d.ts +10 -1
  5. package/Errors.js +1 -1
  6. package/Hooks.d.ts +4 -1
  7. package/IActivityHandler.d.ts +19 -5
  8. package/LanguageStringUtils.js +1 -1
  9. package/ProgramInspectorFacility.d.ts +1 -0
  10. package/Task.d.ts +1 -0
  11. package/activities/app/GetApplicationInfo.d.ts +4 -1
  12. package/activities/app/GetUserInfo.d.ts +4 -1
  13. package/activities/app/RunCommand.d.ts +4 -1
  14. package/activities/app/RunOperation.d.ts +8 -2
  15. package/activities/arcgis/AddGraphics.d.ts +8 -2
  16. package/activities/arcgis/MapProvider.d.ts +4 -1
  17. package/activities/arcgis/QueryTask.d.ts +8 -2
  18. package/activities/arcgis/SetMap.d.ts +4 -1
  19. package/activities/arcgis/ShowResults.d.ts +3 -0
  20. package/activities/arcgis/runUtils.d.ts +5 -1
  21. package/activities/core/ChannelProvider.d.ts +1 -0
  22. package/activities/core/converters.d.ts +1 -1
  23. package/activities/forms/DisplayForm.d.ts +4 -1
  24. package/activities/forms/FormRenderer.d.ts +1 -0
  25. package/activities/forms/FormRenderer.js +1 -1
  26. package/activities/forms/SetFormElementProperty.d.ts +1 -1
  27. package/activities/index.d.ts +1 -0
  28. package/activities/index.js +1 -1
  29. package/activities/pdf/AddGeoreferenceToPdf.d.ts +19 -0
  30. package/activities/pdf/AddGeoreferenceToPdf.js +1 -0
  31. package/activities/ui/Alert.d.ts +4 -1
  32. package/activities/ui/Confirm.d.ts +8 -2
  33. package/activities/ui/Prompt.d.ts +8 -2
  34. package/definition/Program.d.ts +4 -1
  35. package/definition/ProgramInspector.d.ts +4 -1
  36. package/definition/Reference.d.ts +4 -1
  37. package/diagnostics/ConsoleDebugLogger.d.ts +4 -1
  38. package/diagnostics/logging.d.ts +4 -1
  39. package/execution/ActivityLoader.d.ts +4 -1
  40. package/execution/Engine.d.ts +16 -4
  41. package/execution/IDebugSession.d.ts +4 -1
  42. package/forms/Calendar.d.ts +1 -1
  43. package/forms/FormComponent.d.ts +4 -3
  44. package/forms/FormComponent.js +1 -1
  45. package/forms/FormDefinition.d.ts +91 -15
  46. package/forms/FormElement.d.ts +3 -17
  47. package/forms/FormElement.js +1 -1
  48. package/forms/FormHost.d.ts +20 -6
  49. package/forms/FormHost.js +1 -1
  50. package/forms/FormPresenterHost.d.ts +17 -4
  51. package/forms/common.d.ts +6 -7
  52. package/forms/common.js +1 -1
  53. package/forms/components/AccordionGroup.d.ts +15 -0
  54. package/forms/components/AccordionGroup.js +1 -0
  55. package/forms/components/AutoComplete.d.ts +7 -0
  56. package/forms/components/AutoComplete.js +1 -0
  57. package/forms/components/ButtonBar.d.ts +13 -0
  58. package/forms/components/ButtonBar.js +1 -0
  59. package/forms/components/CheckBox.d.ts +7 -0
  60. package/forms/components/CheckBox.js +1 -0
  61. package/forms/components/CheckGroup.d.ts +7 -0
  62. package/forms/components/CheckGroup.js +1 -0
  63. package/forms/components/Custom.d.ts +7 -0
  64. package/forms/components/Custom.js +1 -0
  65. package/forms/components/DatePicker.d.ts +6 -16
  66. package/forms/components/DatePicker.js +1 -1
  67. package/forms/components/DateRangePicker.d.ts +10 -8
  68. package/forms/components/DateRangePicker.js +1 -1
  69. package/forms/components/DateTimePicker.d.ts +6 -8
  70. package/forms/components/DateTimePicker.js +1 -1
  71. package/forms/components/DropDownList.d.ts +7 -0
  72. package/forms/components/DropDownList.js +1 -0
  73. package/forms/components/FilePicker.d.ts +9 -0
  74. package/forms/components/FilePicker.js +1 -0
  75. package/forms/components/Form.d.ts +23 -0
  76. package/forms/components/Form.js +1 -0
  77. package/forms/components/GeometryPicker.d.ts +4 -0
  78. package/forms/components/GeometryPicker.js +1 -0
  79. package/forms/components/GeometryPickerListItem.d.ts +23 -0
  80. package/forms/components/GeometryPickerListItem.js +1 -0
  81. package/forms/components/HorizontalRule.d.ts +7 -0
  82. package/forms/components/HorizontalRule.js +1 -0
  83. package/forms/components/Image.d.ts +7 -0
  84. package/forms/components/Image.js +1 -0
  85. package/forms/components/ItemPicker.d.ts +17 -0
  86. package/forms/components/ItemPicker.js +1 -0
  87. package/forms/components/ListBox.d.ts +7 -0
  88. package/forms/components/ListBox.js +1 -0
  89. package/forms/components/Markdown.d.ts +1 -1
  90. package/forms/components/Markdown.js +1 -1
  91. package/forms/components/Number.d.ts +7 -0
  92. package/forms/components/Number.js +1 -0
  93. package/forms/components/NumberRangeSlider.d.ts +11 -8
  94. package/forms/components/NumberRangeSlider.js +1 -1
  95. package/forms/components/NumberSlider.d.ts +9 -8
  96. package/forms/components/NumberSlider.js +1 -1
  97. package/forms/components/RadioGroup.d.ts +7 -0
  98. package/forms/components/RadioGroup.js +1 -0
  99. package/forms/components/Scanner.d.ts +9 -0
  100. package/forms/components/Scanner.js +1 -0
  101. package/forms/components/Section.d.ts +14 -0
  102. package/forms/components/Section.js +1 -0
  103. package/forms/components/Text.d.ts +1 -1
  104. package/forms/components/Text.js +1 -1
  105. package/forms/components/TextArea.d.ts +1 -1
  106. package/forms/components/TextArea.js +1 -1
  107. package/forms/components/TextBox.d.ts +1 -1
  108. package/forms/components/TextBox.js +1 -1
  109. package/forms/components/TimePicker.d.ts +7 -0
  110. package/forms/components/TimePicker.js +1 -0
  111. package/forms/constants.d.ts +2 -31
  112. package/forms/constants.js +1 -1
  113. package/forms/dateUtilities.d.ts +41 -9
  114. package/forms/dateUtilities.js +1 -1
  115. package/forms/elements/AutoComplete.d.ts +7 -0
  116. package/forms/elements/AutoComplete.js +1 -0
  117. package/forms/elements/Number.d.ts +5 -0
  118. package/forms/elements/Number.js +1 -0
  119. package/forms/elements/NumberRangeSlider.d.ts +5 -3
  120. package/forms/elements/NumberRangeSlider.js +1 -1
  121. package/forms/elements/NumberSlider.d.ts +0 -3
  122. package/forms/elements/NumberSlider.js +0 -1
  123. package/forms/elements/Scanner.d.ts +9 -0
  124. package/forms/elements/Scanner.js +1 -0
  125. package/forms/elements/types.d.ts +4 -2
  126. package/forms/index.d.ts +6 -2
  127. package/forms/index.js +1 -1
  128. package/forms/keyboard.d.ts +1 -0
  129. package/forms/numberFormatter.d.ts +5 -6
  130. package/forms/numberFormatter.js +1 -1
  131. package/forms/numberUtilities.d.ts +113 -0
  132. package/forms/numberUtilities.js +1 -0
  133. package/forms/presenter.d.ts +1 -0
  134. package/forms/presenter.js +1 -1
  135. package/forms/renderers.d.ts +29 -35
  136. package/forms/renderers.js +1 -1
  137. package/forms/textUtilities.d.ts +6 -4
  138. package/forms/textUtilities.js +1 -1
  139. package/forms/utils.d.ts +71 -18
  140. package/forms/utils.js +1 -1
  141. package/index.d.ts +1 -1
  142. package/index.js +0 -1
  143. package/libs/version.d.ts +1 -1
  144. package/libs/version.js +1 -1
  145. package/package.json +10 -11
  146. package/forms/LegacyStyles.d.ts +0 -498
  147. package/forms/LegacyStyles.js +0 -1
  148. package/forms/assets/arrow.d.ts +0 -4
  149. package/forms/assets/arrow.js +0 -1
  150. package/forms/assets/chevron.d.ts +0 -3
  151. package/forms/assets/chevron.js +0 -1
  152. package/forms/assets/cross.d.ts +0 -3
  153. package/forms/assets/cross.js +0 -1
  154. package/forms/assets/datetime.d.ts +0 -3
  155. package/forms/assets/datetime.js +0 -1
  156. package/forms/assets/remove.d.ts +0 -2
  157. package/forms/assets/remove.js +0 -1
  158. package/forms/assets/scan.d.ts +0 -4
  159. package/forms/assets/scan.js +0 -1
  160. package/forms/assets/stock.d.ts +0 -5
  161. package/forms/assets/stock.js +0 -1
  162. package/forms/components/DateRange.d.ts +0 -6
  163. package/forms/components/DateRange.js +0 -1
  164. package/forms/components/Navigator.d.ts +0 -1
  165. package/forms/components/Navigator.js +0 -1
  166. package/forms/components/ReactDateRangeCalendar.d.ts +0 -6
  167. package/forms/components/ReactDateRangeCalendar.js +0 -1
  168. package/forms/components/SyntheticButton.d.ts +0 -1
  169. package/forms/components/SyntheticButton.js +0 -1
  170. package/forms/components/TimePickerInput.d.ts +0 -24
  171. package/forms/components/TimePickerInput.js +0 -1
  172. package/forms/components/TimerManager.d.ts +0 -7
  173. package/forms/components/TimerManager.js +0 -1
  174. package/forms/components/utils.d.ts +0 -2
  175. package/forms/components/utils.js +0 -1
  176. package/forms/datetime.d.ts +0 -5
  177. package/forms/datetime.js +0 -1
  178. package/forms/files.d.ts +0 -4
  179. package/forms/files.js +0 -1
  180. package/forms/geometry.d.ts +0 -4
  181. package/forms/geometry.js +0 -1
  182. package/forms/number.d.ts +0 -11
  183. package/forms/number.js +0 -1
  184. package/forms/numberSliderUtilities.d.ts +0 -12
  185. package/forms/numberSliderUtilities.js +0 -1
  186. package/forms/scanner.d.ts +0 -4
  187. package/forms/scanner.js +0 -1
  188. package/forms/selectors.d.ts +0 -10
  189. package/forms/selectors.js +0 -1
  190. package/forms/styles/daterange.css +0 -1
  191. package/forms/styles/daterange.d.ts +0 -1
  192. package/forms/styles/daterange.js +0 -1
  193. package/forms/styles/stock.css +0 -1
  194. package/forms/styles/stock.d.ts +0 -1
  195. package/forms/styles/stock.js +0 -1
@@ -1,5 +1,8 @@
1
1
  import { NumberDisplayFormat } from "./numberFormatter";
2
- /** References a container. */
2
+ /**
3
+ * References a container.
4
+ * @product This is intended for internal use only within VertiGIS Studio products.
5
+ */
3
6
  export declare type ContainerRef = "default" | "modal" | {
4
7
  /** Indicates the name of the container. */
5
8
  name: string;
@@ -54,12 +57,18 @@ export interface GeometryRef {
54
57
  /** Indicates the geometry. */
55
58
  geometry: {}[];
56
59
  }
57
- /** References one or more items within the element. */
60
+ /**
61
+ * References one or more items within the element.
62
+ * @product This is intended for internal use only within VertiGIS Studio products.
63
+ */
58
64
  export interface ItemsRef {
59
65
  /** The items that were selected. */
60
66
  items: Item[];
61
67
  }
62
- /** Indicates the number. */
68
+ /**
69
+ * Indicates the number.
70
+ * @product This is intended for internal use only within VertiGIS Studio products.
71
+ */
63
72
  export interface NumberRef {
64
73
  /** Indicates the format for the number. */
65
74
  format: NumberFormat;
@@ -68,7 +77,10 @@ export interface NumberRef {
68
77
  /** Indicates the numeric value. */
69
78
  numeric: number;
70
79
  }
71
- /** References markdown for a markdown-based value. */
80
+ /**
81
+ * References markdown for a markdown-based value.
82
+ * @public
83
+ */
72
84
  export interface MarkdownRef {
73
85
  markdown: string;
74
86
  }
@@ -84,7 +96,10 @@ export interface ScanRef {
84
96
  /** Indicates the returned scanner data. */
85
97
  value: string;
86
98
  }
87
- /** References an error, warnings, and statuses. */
99
+ /**
100
+ * References an error, warnings, and statuses.
101
+ * @product This is intended for internal use only within VertiGIS Studio products.
102
+ */
88
103
  export interface StatusRef {
89
104
  /** missing - Input is missing. */
90
105
  /** invalid - Input is invalid. */
@@ -93,17 +108,26 @@ export interface StatusRef {
93
108
  /** trivial - Input items are empty, not relevant, not significant etc. */
94
109
  status: "missing" | "invalid" | "failure" | "pending" | "trivial";
95
110
  }
96
- /** References any kind of text. */
111
+ /**
112
+ * References any kind of text.
113
+ * @product This is intended for internal use only within VertiGIS Studio products.
114
+ */
97
115
  export declare type Text = string | MarkdownRef | StatusRef;
98
116
  /**
99
117
  * Indicates how a form element's title should be positioned relative to its content.
100
118
  */
101
119
  export declare type TitleLocation = "above" | "beside";
102
- /** References any kind of value appropriate for a form element. */
120
+ /**
121
+ * References any kind of value appropriate for a form element.
122
+ * @product This is intended for internal use only within VertiGIS Studio products.
123
+ */
103
124
  export declare type Value = boolean | number | number[] | string | DataRef | DateRangeRef | DateTimeRef | FilesRef | GeometryRef | ItemsRef | NumberRef | ScanRef;
104
125
  /** Types of matching that can be performed when finding an Item within a Form Element. */
105
126
  export declare type ItemMatchType = "index" | "item" | "key" | "label" | "value";
106
- /** References what kind of elements exist. */
127
+ /**
128
+ * References what kind of elements exist.
129
+ * @product This is intended for internal use only within VertiGIS Studio products.
130
+ */
107
131
  export declare type ElementType = "DropDownEdit" | "DropDownList" | "GeometryPicker" | "Header";
108
132
  /** References the format types. */
109
133
  export declare type FormatRef = DateTimeFormat | NumberFormat | GeometryFormat | SectionFormat;
@@ -116,7 +140,34 @@ export declare type DateTimeFormat = "app" | "device" | {
116
140
  /** Indicates the time zone for the date/time value. */
117
141
  timezone: string;
118
142
  };
119
- /** References the number format criteria. */
143
+ /**
144
+ * Constraints to be applied to numeric values within form elements that deal with selecting numbers.
145
+ */
146
+ export interface NumberConstraints {
147
+ /**
148
+ * The highest accepted value. Values higher than this value should be replaced by it.
149
+ * If this is `undefined`, there is no upper limit.
150
+ */
151
+ maximum: number | undefined;
152
+ /**
153
+ * The lowest accepted value. Values lower than this value should be replaced by it.
154
+ * If this is `undefined`, there is no lower limit.
155
+ */
156
+ minimum: number | undefined;
157
+ /**
158
+ * The amount that the number changes when the user increments/decrements the value.
159
+ * This must be a value > 0.
160
+ *
161
+ * If `minimum` is also defined, values must fall on `minimum + step * n` where `n` is an integer.
162
+ * Values that do not should be rounded to the nearest valud step. If `minimum` is not defined,
163
+ * the formula becomes `step * n`.
164
+ */
165
+ step: number;
166
+ }
167
+ /**
168
+ * References the number format criteria.
169
+ * @product This is intended for internal use only within VertiGIS Studio products.
170
+ */
120
171
  export interface NumberFormat {
121
172
  /**
122
173
  * The 3-letter ISO 4217 currency code (e.g "USD", "CAD"). Required when
@@ -134,17 +185,31 @@ export interface NumberFormat {
134
185
  displayFormat?: NumberDisplayFormat;
135
186
  /** Indicates the lower bound. */
136
187
  lowerBound?: number;
137
- /** Indicates the minimum increment/decrement and precision of values. */
188
+ /**
189
+ * Indicates the minimum increment/decrement and precision of values.
190
+ *
191
+ * Positive precision values indicates the number of decimal places to round to.
192
+ * For example, `1` would round to `0.1`, `2` would round to `0.01` etc.
193
+ *
194
+ * Negative precision values indicates the number of whole digits to round to.
195
+ * For example, `-1` would round to `10`, `-2` would round to `100` etc.
196
+ */
138
197
  precision?: number;
139
198
  /** Indicates the step size which is the amount to increment/decrement. */
140
199
  step?: number;
141
200
  /** Indicates the upper bound. */
142
201
  upperBound?: number;
143
202
  }
144
- /** References geometry format. */
203
+ /**
204
+ * References geometry format.
205
+ * @product This is intended for internal use only within VertiGIS Studio products.
206
+ */
145
207
  export declare type GeometryFormat = "polygon" | "polyline" | "point" | "polygon-freehand" | "polyline-freehand" | "extent" | "line";
146
208
  export declare type SectionFormat = "accordion-section" | "unstyled-section" | "fieldset-section" | "basic-section" | "collapsible-section";
147
- /** The `SectionFormat` to use when no value is specified. */
209
+ /**
210
+ * The `SectionFormat` to use when no value is specified.
211
+ * @product This is intended for internal use only within VertiGIS Studio products.
212
+ */
148
213
  export declare const DEFAULT_SECTION_FORMAT = "unstyled-section";
149
214
  /** References a two-dimensional size. */
150
215
  export interface Size {
@@ -153,7 +218,10 @@ export interface Size {
153
218
  /** The width. */
154
219
  width?: number;
155
220
  }
156
- /** Defines a form. */
221
+ /**
222
+ * Defines a form.
223
+ * @product This is intended for internal use only within VertiGIS Studio products.
224
+ */
157
225
  export interface Form {
158
226
  /** Indicates the defaults for the form. */
159
227
  defaults?: {
@@ -164,7 +232,10 @@ export interface Form {
164
232
  [name: string]: Element;
165
233
  };
166
234
  }
167
- /** Defines any element used in a form. */
235
+ /**
236
+ * Defines any element used in a form.
237
+ * @product This is intended for internal use only within VertiGIS Studio products.
238
+ */
168
239
  export interface Element {
169
240
  /**
170
241
  * An accessible description to be used by assistive technologies such as screen readers.
@@ -280,7 +351,10 @@ export interface Element {
280
351
  /** Indicates how the control wraps text. */
281
352
  wrap?: "hard" | "soft" | "off";
282
353
  }
283
- /** Defines an ad hoc item. */
354
+ /**
355
+ * Defines an ad hoc item.
356
+ * @product This is intended for internal use only within VertiGIS Studio products.
357
+ */
284
358
  export interface Item {
285
359
  /** Indicates the placement of the item. */
286
360
  index?: number;
@@ -304,6 +378,7 @@ export interface Item {
304
378
  styleName?: string;
305
379
  }
306
380
  export declare type EventType = "load" | "cancel" | "checked" | "changed" | "clicked" | "custom" | "dragged" | "suggest" | "submit" | "end" | "verify" | "validate" | "populate" | "prepare";
381
+ /** @product This is intended for internal use only within VertiGIS Studio products. */
307
382
  export interface Event {
308
383
  /** Indicates the name of the element raising the event. */
309
384
  name?: string;
@@ -320,6 +395,7 @@ export interface Event {
320
395
  /** Indicates the cancellation token fro the event. */
321
396
  cancellationToken?: PromiseLike<void>;
322
397
  }
398
+ /** @product This is intended for internal use only within VertiGIS Studio products. */
323
399
  export interface GeometryState {
324
400
  /** Indicates the application specific context. */
325
401
  context?: {};
@@ -6,6 +6,8 @@ import { defs } from "./FormHost";
6
6
  * Properties common to all Form Elements.
7
7
  */
8
8
  export interface BaseFormElementProps {
9
+ /** The CSS class name of the root element. */
10
+ className?: string;
9
11
  /**
10
12
  * The `FormComponent` being used to render the Form Element within this Component.
11
13
  */
@@ -15,27 +17,11 @@ export interface BaseFormElementProps {
15
17
  */
16
18
  element: defs.Element;
17
19
  }
18
- interface FormElementProps {
19
- /**
20
- * Custom classes for this element. Use sparingly.
21
- */
22
- classNames?: string[];
23
- /**
24
- * The `FormComponent` being used to render the Form Element within this Component.
25
- */
26
- component: FormComponent;
27
- /**
28
- * The Form Element to be rendered within this Component.
29
- */
30
- element: defs.Element;
20
+ interface FormElementProps extends BaseFormElementProps {
31
21
  /**
32
22
  * The id of the default input to be associated with the title.
33
23
  */
34
24
  inputId?: string;
35
- /**
36
- * True if the component should render with older styles, because it has not yet been migrated to use `react-ui` components.
37
- */
38
- legacyMode?: boolean;
39
25
  /**
40
26
  * Callback for when the Form Element receives focus.
41
27
  * @param event The focus event.
@@ -1 +1 @@
1
- import FormControl from"@vertigis/react-ui/FormControl";import{forwardRef}from"react";import*as React from"react";import{renderAccessibleDescription,renderDescription,renderError,renderTitle}from"./common.js";import{TitleLocation}from"./constants.js";import{makeSafeClassName,makeUniqueId}from"./utils.js";export default forwardRef((e,r)=>{const{children:t,classNames:o,component:a,element:s,inputId:i,legacyMode:n,...l}=e;var m=a.props.host,p=makeUniqueId(a.props.name),c=renderTitle(m,s,p,i),d=renderDescription(m,s,p),f=renderAccessibleDescription(m,s,p),u=renderError(m,s),h=c?.props?.id,e=d?.props?.id,m=f?.props?.id;const y=[s.type,makeSafeClassName(a.props.name)];n&&y.push("legacy-styled-element"),s.titleLocation===TitleLocation.BESIDE&&y.push("inline-title"),s.styleName&&y.push(makeSafeClassName(s.styleName)),o&&y.push(...o);r={"aria-labelledby":h,"aria-details":e,"aria-describedby":m,className:y.join(" "),error:!!u,id:p,ref:r,...l};let E=[c];return s.titleLocation===TitleLocation.BESIDE?E.push(React.createElement("div",{className:"form-element-content"},d,f,u,t)):(E.push(d),E.push(f),E.push(u),E.push(t)),React.createElement(FormControl,{fullWidth:!0,...r},...E)});
1
+ import FormControl from"@vertigis/react-ui/FormControl";import clsx from"clsx";import{forwardRef}from"react";import*as React from"react";import{renderAccessibleDescription,renderDescription,renderError,renderTitle}from"./common.js";import{formClasses}from"./components/Form.js";import{TitleLocation}from"./constants.js";import{makeSafeClassName,makeUniqueId}from"./utils.js";export default forwardRef((e,r)=>{const{children:o,className:t,component:s,element:a,inputId:i,...m}=e;var n=s.props.host,l=makeUniqueId(s.props.name),p=renderTitle(n,a,l,i),c=renderDescription(n,a,l),e=renderAccessibleDescription(n,a,l),n=renderError(n,a),r={"aria-labelledby":p?.props?.id,"aria-details":c?.props?.id,"aria-describedby":e?.props?.id,className:clsx(t,a.type,{[formClasses.formElementWithTitleBeside]:a.titleLocation===TitleLocation.BESIDE,[makeSafeClassName(s.props.name)]:!!s.props.name,[makeSafeClassName(a.styleName)]:!!a.styleName}),error:!!n,id:l,ref:r,required:a.require,...m};let d=[p];return a.titleLocation===TitleLocation.BESIDE?d.push(React.createElement("div",{className:formClasses.formElementContent},c,e,n,o)):(d.push(c),d.push(e),d.push(n),d.push(o)),React.createElement(FormControl,{fullWidth:!0,...r},...d)});
@@ -96,8 +96,6 @@ export declare abstract class FormHost implements FormPresenterHost {
96
96
  * @returns The original text
97
97
  */
98
98
  translateText(content: defs.Text | undefined): string | defs.MarkdownRef;
99
- /** Renders the style for the form. */
100
- renderStyle(css?: string): HTMLStyleElement;
101
99
  /** Renders the form component. */
102
100
  renderVisual(component: {}): any;
103
101
  /** Qualifies an event with defaults. */
@@ -161,10 +159,25 @@ export declare abstract class FormHost implements FormPresenterHost {
161
159
  * other elements but afterwards.
162
160
  */
163
161
  trap(event: defs.Event): boolean;
164
- /** Attempts to cascade the form. */
165
- protected cascade(name: string): boolean;
162
+ /**
163
+ * Cascade the form by clearing the value of any elements downstream of the specified one
164
+ * and triggering the "populate" event for any elements that depend on it directly.
165
+ * @param elementName The name of an elements which has just changed.
166
+ * @returns True if the operation was a success, false otherwise.
167
+ */
168
+ protected cascade(elementName: string): boolean;
166
169
  /** Routes a click event. */
167
170
  protected click(event: defs.Event): boolean;
171
+ /**
172
+ * Checks the specified element to determine if it has a selection,
173
+ * which would justify a dependent being populated at this time.
174
+ *
175
+ * This function is only interested in _initial_ selection defined in the designer
176
+ * rather than changes made in an element's `load` event. Those are handled separately.
177
+ * @param elementName The name of the element being depended upon.
178
+ * @returns True if the element has a selection at this time.
179
+ */
180
+ hasInitialSelectionToDependOn(elementName: string): boolean;
168
181
  /** Routes a prepare event. */
169
182
  protected hydrate(event: defs.Event): boolean;
170
183
  /** Determines if the event origin is a submit button. */
@@ -188,7 +201,7 @@ export declare abstract class FormHost implements FormPresenterHost {
188
201
  /** Coerces a number. */
189
202
  coerceNumber(value: string): number;
190
203
  /** Formats a number. */
191
- formatNumber(value: number, options: FormatOptions): string;
204
+ formatNumber(value: number, options?: FormatOptions): string;
192
205
  /** Renders a custom element. */
193
206
  renderCustom(component: {}, element: defs.Element): JSX.Element;
194
207
  /** Renders a component's state. */
@@ -200,7 +213,8 @@ export declare abstract class FormHost implements FormPresenterHost {
200
213
  private isElementPositionBeforeLastFocused;
201
214
  private setLastFocus;
202
215
  private isSection;
203
- private isAccordionSection;
216
+ isAccordionSection(element?: defs.Element): boolean;
217
+ isCollapsibleSection(element?: defs.Element): boolean;
204
218
  private getAllSectionElements;
205
219
  private getMutuallyExclusiveSectionGroup;
206
220
  /**
package/forms/FormHost.js CHANGED
@@ -1 +1 @@
1
- import Bluebird from"bluebird";import{Task}from"../Task.js";import{DEFAULT_LOCALE}from"../constants.js";import{FormComponent}from"./FormComponent.js";import*as defs from"./FormDefinition.js";import MutuallyExclusiveSectionGroup from"./MutuallyExclusiveSectionGroup.js";import NumberParser from"./NumberParser.js";import{format}from"./numberFormatter.js";import*as presenter from"./presenter.js";import*as renderers from"./renderers.js";import{CSS}from"./styles/stock.js";import{addStyleToDocument,sort,text}from"./utils.js";const guid="C0166F74-982A-464E-9FB6-9605CB7649C1:",eventName=guid+"FormEvent";function createEvent(e,t){return new CustomEvent(e,{bubbles:!1,cancelable:!1,detail:t})}function overlay(s,i){switch(typeof s){case"boolean":case"number":case"string":return s;case"object":break;default:return i}if(null===s)return i;if(s instanceof Array){let e=i;void 0!==e&&null!==e||(e=[]);let t=0;for(const r of s){var n=overlay(r,e[t]);void 0!==n&&(t<s.length?e[t]=n:e.push(n),++t)}return e}let e=i;void 0===e&&(e={});for(const t in s)e[t]=overlay(s[t],e[t]);return e}function createSubscription(e){function t(){return void 0!==e&&(t.active=!1,e(),!0)}return t.active=!0,t}let staticStyle=void 0;class FormHost{constructor(){this.form={defaults:{},elements:{}},this.errors={},this.refs={},this.enabled=!1,this.visible=!1,this.dismiss=!1,this.custom=!1,this.container=document.createElement("div"),this.eventIndex=0,this.eventQueue=[],this.mutuallyExclusiveSections={},this.nextFocus=!1,this.nextRefresh=!1,this.style=void 0}deriveLocale(){return DEFAULT_LOCALE}mount(){var e=this.container,t=e.parentNode;null==t&&document.body.appendChild(e),this.update()}unmount(){var e=this.container;const t=e.parentNode;void 0!==t&&null!==t&&t.removeChild(e)}observeFocus(e){this.enabled&&e instanceof HTMLElement&&(this.lastFocus&&this.lastFocus.target===e||this.setLastFocus(e))}focus(e){!0===(e=null==e?!1:e)&&(this.lastFocus=void 0),!1===e&&!1===(e=this.nextFocus)&&(e=!0),this.nextFocus=e,this.invalidate(!0!==e?e:void 0)}show(){const e=this.container;if(void 0===e)return!1;this.custom||void 0!==this.focusObserver||e.addEventListener("focus",this.focusObserver=e=>this.observeFocus(e.target),!0),this.enabled||(this.nextRefresh=!0,this.focus()),this.enforceAccordionConstraints();var t=this.errors;for(const r in t){const o=this.form.elements[r];void 0!==o&&null!==o&&(o.error=t[r],this.invalidate(r))}const s=[];let i=!1;for(const a of Object.keys(this.form.elements).map(e=>this.form.elements[e]).filter(e=>!!e.error&&!1!==e.visible)){const l=this.getParentSection(a);if(this.isAccordionSection(l)){var n=this.findName(l);const u=this.getMutuallyExclusiveSectionGroup(n);if(u){const c=s.find(e=>e.group===u);c?c.element.rowNumber>l.rowNumber&&(c.element=l):(s.push({group:u,element:l}),i=!0)}}else this.isSectionCollapsed(l)&&(l.collapsed=!1,i=!0)}for(const h of s)h.group.expandedSection=h.element;return i&&this.invalidate(),this.errors={},this.idle(),!1!==this.nextRefresh&&(this.enabled=!0,this.visible=!0,this.mount()),this.enabled}spin(){return void 0!==this.container&&(this.idle(),this.visible&&!this.enabled||(this.nextRefresh=!0,this.enabled=!1,this.visible=!0,this.mount()),this.visible)}hide(){return void 0!==this.container&&(this.idle(),this.visible&&(this.enabled=!1,this.visible=!1,this.unmount()),!0)}dispose(){if(this.dismiss)return!1;{this.dismiss=!0;const t=this.container;t.dispatchEvent(createEvent(eventName));var e=this.focusObserver;return void 0!==e&&t.removeEventListener("focus",e,!0),this.idle(),this.unmount(),this.refs={},presenter.releaseForm(this.container),this.container=void 0,this.lastFocus=void 0,!(this.eventTask=void 0)}}renderFocus(e,t){var s=this.nextFocus;if(this.enabled&&e instanceof HTMLElement)if(!1!==s)if(void 0!==t){if(t===s||!0===s&&void 0===this.lastFocus)return this.nextFocus=!1,this.setLastFocus(e,t),e.focus(),!0}else{const i=this.lastFocus?.target;if(!0===s&&i instanceof HTMLElement&&e.contains(i))return this.nextFocus=!1,i.focus(),!0}else if(!1===s&&t&&t!==this.lastFocus?.name&&this.isElementPositionBeforeLastFocused(t))return this.setLastFocus(e,t),e.focus(),!0;return!1}renderHtml(e,t){return"string"==typeof e?text.textToHtml(e):text.isMarkdown(e)?text.markdownToHtml(e.markdown,t):""}renderText(e){return"string"==typeof e?e:text.isMarkdown(e)?text.markdownToText(e.markdown):""}translateText(e){return"string"==typeof e||text.isMarkdown(e)?e:text.isStatus(e)?e.status:void 0}renderStyle(e){return"string"==typeof e?addStyleToDocument(e):staticStyle=staticStyle||addStyleToDocument(CSS)}renderVisual(e){return presenter.render(e)||presenter.renderNone(e)}qualifyDefault(e){var t=sort(this.form.elements);for(const r in t){var s=t[r];if(null!=s&&!1!==s.visible&&s.enabled){if(s.default)return e.value=s.value,r;var i=sort(s.items);if(null!=i)for(const o in i){var n=i[o];if(null!=n&&n.visible&&n.enabled&&n.default)return e.item=o,e.value=n.value,r}}}}qualify(e,t){var s;return null==t&&(t={}),"clicked"===e&&void 0===t.name&&(t.name=this.qualifyDefault(t)),t.type=e,void 0===t.routingKey&&(s=t.name,t.routingKey=void 0!==s?e+"$"+s:e),t}post(e,t){t=this.publish(e,t);const s=this.container;void 0!==s&&s.dispatchEvent(createEvent(eventName,t))}subscribe(s){const e=this.container;if(void 0===e)return createSubscription();const i=function(){s=void 0,e.removeEventListener(eventName,t)},t=function(e){const t=e.detail;void 0!==t?Bluebird.resolve().then(function(){"function"==typeof s&&s(t)}):i()};return e.addEventListener(eventName,t),createSubscription(i)}refresh(e){this.custom||("string"==typeof e?(e=this.refs[e],presenter.refresh(e)):(void 0===this.style&&(this.style=this.renderStyle()),this.refs={},presenter.refreshForm(this,this.container)))}invalidate(e){const t=this.nextRefresh;"string"==typeof e&&!0!==t&&(!1===t?this.nextRefresh={[e]:!0}:t[e]=!0),void 0!==e&&!0!==e||(this.nextRefresh=!0),!1===e&&!1===t&&(this.nextRefresh={})}update(){var e=this.nextRefresh;if(!0===e&&(this.nextRefresh=!1,this.refresh()),"object"==typeof e){this.nextRefresh=!1;for(const t in e)!0===e[t]&&this.refresh(t)}}idle(){const e=this.timerHandle;void 0!==e&&(this.timerHandle=void 0,e())}busy(){if(void 0===this.timerHandle&&void 0!==this.container){let e=setTimeout(()=>this.spin());this.timerHandle=function(){void 0!==e&&(clearTimeout(e),e=void 0)}}}publish(e,t){return this.enabled?(t=this.enqueue(e,t),0<this.eventQueue.length&&this.spin(),t):this.qualify(e,t)}enqueue(e,t){return t=this.qualify(e,t),void 0!==this.eventTask?(this.resolveEvent(t),this.eventTask=void 0):this.eventQueue.push(t),t}dequeue(){const e=this.eventQueue;if(0<e.length){var t=this.eventIndex,s=e[t++];return t>=e.length?e.length=this.eventIndex=0:this.eventIndex=t,s}}observe(){const t=this;return Bluebird.attempt(function(){if(void 0!==t.eventTask)return t.eventTask;var e=t.dequeue();return void 0!==e?e:t.show()?(t.eventTask=new Task(e=>{t.resolveEvent=e}),t.eventTask):void 0})}load(e,t){if(void 0===this.container)return!1;if(this.eventQueue.length=this.eventIndex=0,this.eventTask=void 0,this.errors={},this.lastFocus=void 0,this.nextFocus=!0,this.nextRefresh=!0,this.enqueue("load"),this.enqueue("prepare"),null!=e){e=overlay(e,e={defaults:{},elements:{}});this.form=overlay(t,e);for(const s in this.form.elements){let e=this.form.elements[s];if(e=overlay(e,{showFilter:!1,checked:!1,enabled:!0,hoisted:!1,visible:!0,overlay:!1,default:!1,validates:!1,readOnly:!1,require:!1,autoActivate:!1}),e.items)for(const i in e.items)e.items[i]=overlay(e.items[i],{enabled:!0,checked:!1,visible:!0,default:!1,validates:!1});this.form.elements[s]=e}}return!0}route(e){switch(e.type){case"changed":return this.cascade(e.name);case"prepare":return this.hydrate(e);case"suggest":return this.suggest(e);case"clicked":return this.click(e);case"validate":return this.verify(e);case"verify":return this.submit(e);case"checked":return this.changed(e)}return!1}changed(e){return this.enqueue("changed",{name:e.name,item:e.item,value:e.value}),!0}isElementValid(e,t=!0,s={status:void 0}){return null!=e&&(s.status=void 0,text.isStatus(e.error)&&"invalid"===e.error.status?!(s.status="invalid"):!0!==e.require||(this.isElementEffectivelyVisible(e)?!!this.isElementValueDefined(e)||!(s.status="missing"):t))}isElementEffectivelyVisible(e){return null!=e&&(!1!==this.getParentSection(e)?.visible&&!1!==e.visible)}isElementValueDefined(e){if(null==e)return!1;if("CheckBox"===e.type)return!0;var t=e.current;if(null!=t)return!0;t=e.value;if(null!=t&&""!==t)return!0;t=e.label;if(null!=t&&""!==t)return!0;var s=e.items;if(null!=s)for(const n in s){var i=s[n];if(null!=i&&!0===i.checked)return!0}return!1}trap(e){switch(e.type){case"populate":case"load":break;default:return!1}var t=e.name;const s=this.find(t);if(void 0===s||null===s)return!1;e=s.dependsOn;if("string"!=typeof e)return!1;e=this.find(e);return s.enabled=this.isElementEffectivelyVisible(e)&&this.isElementValueDefined(e),this.invalidate(t),!s.enabled}cascade(e){var t=this.find(e);if(null==t||!1===t.dependsOn)return!1;const s={[e]:!0};var i=sort(this.form.elements);for(const r in i){const o=i[r];var n=o.dependsOn;if("string"==typeof n){const a=this.find(n);void 0!==a&&"string"!=typeof a.dependsOn&&(a.dependsOn=!0),!0===s[n]&&(s[r]=!0,o.checked=!1,o.current=void 0,o.label=void 0,o.items=void 0,o.value=void 0,this.invalidate(r),this.enqueue("populate",{name:r}))}else o.dependsOn=!1}return!0}click(e){var t=this.form.elements[e.name];return null!=t&&"ButtonBar"==t.type&&this.validate(e)}hydrate(e){for(const t in sort(this.form.elements))this.enqueue("populate",{name:t}),this.enqueue("load",{name:t});return!0}shouldTriggerValidation(e){var t=this.find(e.name);if(null!=t&&"string"==typeof e.value){e=e.item;if("string"!=typeof e)return!0===t.validates;t=t.items;if(null!=t){e=t[e];if(null!=e)return!0===e.validates}}}validate(e){var t=this.shouldTriggerValidation(e);if(!0!==t)return!1===t&&(this.enqueue("end",{name:e.name,item:e.item,value:e.value,routingKey:"end"}),!0);{const n=this.errors={};var s=sort(this.form.elements);for(const r in s){var i=s[r];null!=i&&(n[r]=void 0,this.enqueue("validate",{name:r}))}return this.enqueue("verify",{name:e.name,item:e.item,value:e.value,routingKey:"verify"}),!0}}verify(e){var t=e.name,s=this.form.elements[t],e={status:void 0};return!this.isElementValid(s,!0,e)&&(e.status&&(this.errors[t]={status:e.status}),!1===this.nextFocus&&this.focus(t),!0)}suggest(e){const t=this.form.elements[e.name];return void 0!==t&&null!==t&&(t.items={message:{label:{status:"trivial"},enabled:!1}},this.invalidate(e.name),!0)}submit(e){return!this.hasErrors()&&(this.enqueue("submit",{name:e.name,item:e.item,value:e.value}),!0)}hasErrors(){var e=this.errors;for(const s in e){var t=e[s];if(null!=t)return!0}return!1}find(e){if(null!=e)return"string"==typeof(e="object"==typeof e?e.name:e)?this.form.elements[e]:void 0}findName(e){for(const t in this.form.elements)if(this.form.elements[t]===e)return t}coerceNumber(e){var t=this.deriveLocale();return new NumberParser(t).parse(e)}formatNumber(e,t){return t?.locale||((t=t||{}).locale=this.deriveLocale()),format(t,e)}renderCustom(e,t){if(e instanceof FormComponent)return renderers.element.renderCustom(e,t)}renderState(e,t,s){return!1}getParentSection(e){e=e.section;if(e){e="string"==typeof e?e:e.name;return this.form.elements[e]}}isSectionCollapsed(e){return!(!e||"Section"!==e.type||"collapsible-section"!==e.format&&"accordion-section"!==e.format)&&!0===e.collapsed}isElementPositionBeforeLastFocused(e){var t=this.lastFocus;if(e&&void 0!==t?.rowNumber&&void 0!==t.rowIndex){e=this.form.elements?.[e];if(e)return void 0!==e.rowNumber&&void 0!==e.rowIndex?e.rowNumber<t.rowNumber||e.rowNumber===t.rowNumber&&e.rowIndex<t.rowIndex:e.index<t.rowNumber||e.index===t.rowNumber&&0<t.rowIndex}return!1}setLastFocus(e,t){this.lastFocus={target:e},t&&(this.lastFocus.name=t,(t=this.form.elements?.[t])&&(void 0!==t.rowNumber&&void 0!==t.rowIndex?(this.lastFocus.rowNumber=t.rowNumber,this.lastFocus.rowIndex=t.rowIndex):(this.lastFocus.rowNumber=t.index,this.lastFocus.rowIndex=0)))}isSection(e){return"Section"===e?.type}isAccordionSection(e){return this.isSection(e)&&"accordion-section"===e.format}getAllSectionElements(){const e={};for(const s in this.form.elements){var t=this.form.elements[s];this.isSection(t)&&(e[s]=t)}return e}getMutuallyExclusiveSectionGroup(t){let s=this.mutuallyExclusiveSections[t];if(!s){var e=this.find(t);if(!this.isAccordionSection(e))return;s=new MutuallyExclusiveSectionGroup({elementName:t,element:e});e=this.getAllSectionElements();const r=Object.keys(sort(e,e=>e.rowNumber));t=r.indexOf(t);for(let e=t-1;0<=e;e--){const o=r[e];var i=this.find(o);if(!this.isAccordionSection(i))break;s.unshift({elementName:o,element:i})}for(let e=t+1;e<r.length;e++){const o=r[e];var n=this.find(o);if(!this.isAccordionSection(n))break;s.push({elementName:o,element:n})}s.forEach(e=>{this.mutuallyExclusiveSections[e.elementName]=s})}return s}updateAccordionSections(t){const e=this.getMutuallyExclusiveSectionGroup(t);e.forEach(e=>{e.element.collapsed=e.elementName!==t}),presenter.refreshForm(this,this.container)}enforceAccordionConstraints(){const e=[];for(const s of Object.keys(this.form.elements).map(e=>({elementName:e,element:this.form.elements[e]})).filter(e=>this.isAccordionSection(e.element)&&!1!==e.element.visible&&!0!==e.element.collapsed).sort((e,t)=>e.element.rowNumber-t.element.rowNumber)){var t=this.getMutuallyExclusiveSectionGroup(s.elementName);-1===e.indexOf(t)?e.push(t):s.element.collapsed=!0}}}export{defs,FormHost};
1
+ import Bluebird from"bluebird";import{Task}from"../Task.js";import{DEFAULT_LOCALE}from"../constants.js";import{FormComponent}from"./FormComponent.js";import*as defs from"./FormDefinition.js";import MutuallyExclusiveSectionGroup from"./MutuallyExclusiveSectionGroup.js";import NumberParser from"./NumberParser.js";import{FormElementTypes}from"./constants.js";import{format}from"./numberFormatter.js";import*as presenter from"./presenter.js";import*as renderers from"./renderers.js";import{sort,text}from"./utils.js";const guid="C0166F74-982A-464E-9FB6-9605CB7649C1:",eventName=guid+"FormEvent";function createEvent(e,t){return new CustomEvent(e,{bubbles:!1,cancelable:!1,detail:t})}function overlay(i,s){switch(typeof i){case"boolean":case"number":case"string":return i;case"object":break;default:return s}if(null===i)return s;if(i instanceof Array){let e=s;void 0!==e&&null!==e||(e=[]);let t=0;for(const r of i){var n=overlay(r,e[t]);void 0!==n&&(t<i.length?e[t]=n:e.push(n),++t)}return e}let e=s;void 0===e&&(e={});for(const t in i)e[t]=overlay(i[t],e[t]);return e}function createSubscription(e){function t(){return void 0!==e&&(t.active=!1,e(),!0)}return t.active=!0,t}class FormHost{constructor(){this.form={defaults:{},elements:{}},this.errors={},this.refs={},this.enabled=!1,this.visible=!1,this.dismiss=!1,this.custom=!1,this.container=document.createElement("div"),this.eventIndex=0,this.eventQueue=[],this.mutuallyExclusiveSections={},this.nextFocus=!1,this.nextRefresh=!1,this.style=void 0}deriveLocale(){return DEFAULT_LOCALE}mount(){var e=this.container,t=e.parentNode;null==t&&document.body.appendChild(e),this.update()}unmount(){var e=this.container;const t=e.parentNode;void 0!==t&&null!==t&&t.removeChild(e)}observeFocus(e){this.enabled&&e instanceof HTMLElement&&(this.lastFocus&&this.lastFocus.target===e||this.setLastFocus(e))}focus(e){!0===(e=null==e?!1:e)&&(this.lastFocus=void 0),!1===e&&!1===(e=this.nextFocus)&&(e=!0),this.nextFocus=e,this.invalidate(!0!==e?e:void 0)}show(){const e=this.container;if(void 0===e)return!1;this.custom||void 0!==this.focusObserver||e.addEventListener("focus",this.focusObserver=e=>this.observeFocus(e.target),!0),this.enabled||(this.nextRefresh=!0,this.focus()),this.enforceAccordionConstraints();var t=this.errors;for(const r in t){const o=this.form.elements[r];void 0!==o&&null!==o&&(o.error=t[r],this.invalidate(r))}const i=[];let s=!1;for(const a of Object.keys(this.form.elements).map(e=>this.form.elements[e]).filter(e=>!!e.error&&!1!==e.visible)){const l=this.getParentSection(a);if(this.isAccordionSection(l)){var n=this.findName(l);const u=this.getMutuallyExclusiveSectionGroup(n);if(u){const c=i.find(e=>e.group===u);c?c.element.rowNumber>l.rowNumber&&(c.element=l):(i.push({group:u,element:l}),s=!0)}}else this.isSectionCollapsed(l)&&(l.collapsed=!1,s=!0)}for(const h of i)h.group.expandedSection=h.element;return s&&this.invalidate(),this.errors={},this.idle(),!1!==this.nextRefresh&&(this.enabled=!0,this.visible=!0,this.mount()),this.enabled}spin(){return void 0!==this.container&&(this.idle(),this.visible&&!this.enabled||(this.nextRefresh=!0,this.enabled=!1,this.visible=!0,this.mount()),this.visible)}hide(){return void 0!==this.container&&(this.idle(),this.visible&&(this.enabled=!1,this.visible=!1,this.unmount()),!0)}dispose(){if(this.dismiss)return!1;{this.dismiss=!0;const t=this.container;t.dispatchEvent(createEvent(eventName));var e=this.focusObserver;return void 0!==e&&t.removeEventListener("focus",e,!0),this.idle(),this.unmount(),this.refs={},presenter.releaseForm(this.container),this.container=void 0,this.lastFocus=void 0,!(this.eventTask=void 0)}}renderFocus(e,t){var i=this.nextFocus;if(this.enabled&&e instanceof HTMLElement)if(!1!==i)if(void 0!==t){if(t===i||!0===i&&void 0===this.lastFocus)return this.nextFocus=!1,this.setLastFocus(e,t),e.focus(),!0}else{const s=this.lastFocus?.target;if(!0===i&&s instanceof HTMLElement&&e.contains(s))return this.nextFocus=!1,s.focus(),!0}else if(!1===i&&t&&t!==this.lastFocus?.name&&this.isElementPositionBeforeLastFocused(t))return this.setLastFocus(e,t),e.focus(),!0;return!1}renderHtml(e,t){return"string"==typeof e?text.textToHtml(e):text.isMarkdown(e)?text.markdownToSafeHtml(e.markdown,{inline:t===defs.HTMLContentCategory.Phrasing}):""}renderText(e){return"string"==typeof e?e:text.isMarkdown(e)?text.markdownToText(e.markdown):""}translateText(e){return"string"==typeof e||text.isMarkdown(e)?e:text.isStatus(e)?e.status:void 0}renderVisual(e){return presenter.render(e)||presenter.renderNone(e)}qualifyDefault(e){var t=sort(this.form.elements);for(const r in t){var i=t[r];if(null!=i&&!1!==i.visible&&i.enabled){if(i.default)return e.value=i.value,r;var s=sort(i.items);if(null!=s)for(const o in s){var n=s[o];if(null!=n&&n.visible&&n.enabled&&n.default)return e.item=o,e.value=n.value,r}}}}qualify(e,t){var i;return null==t&&(t={}),"clicked"===e&&void 0===t.name&&(t.name=this.qualifyDefault(t)),t.type=e,void 0===t.routingKey&&(i=t.name,t.routingKey=void 0!==i?e+"$"+i:e),t}post(e,t){t=this.publish(e,t);const i=this.container;void 0!==i&&i.dispatchEvent(createEvent(eventName,t))}subscribe(i){const e=this.container;if(void 0===e)return createSubscription();const s=function(){i=void 0,e.removeEventListener(eventName,t)},t=function(e){const t=e.detail;void 0!==t?Bluebird.resolve().then(function(){"function"==typeof i&&i(t)}):s()};return e.addEventListener(eventName,t),createSubscription(s)}refresh(e){this.custom||("string"==typeof e?(e=this.refs[e],presenter.refresh(e)):(this.refs={},presenter.refreshForm(this,this.container)))}invalidate(e){const t=this.nextRefresh;"string"==typeof e&&!0!==t&&(!1===t?this.nextRefresh={[e]:!0}:t[e]=!0),void 0!==e&&!0!==e||(this.nextRefresh=!0),!1===e&&!1===t&&(this.nextRefresh={})}update(){var e=this.nextRefresh;if(!0===e&&(this.nextRefresh=!1,this.refresh()),"object"==typeof e){this.nextRefresh=!1;for(const t in e)!0===e[t]&&this.refresh(t)}}idle(){const e=this.timerHandle;void 0!==e&&(this.timerHandle=void 0,e())}busy(){if(void 0===this.timerHandle&&void 0!==this.container){let e=setTimeout(()=>this.spin());this.timerHandle=function(){void 0!==e&&(clearTimeout(e),e=void 0)}}}publish(e,t){return this.enabled?(t=this.enqueue(e,t),0<this.eventQueue.length&&this.spin(),t):this.qualify(e,t)}enqueue(e,t){return t=this.qualify(e,t),void 0!==this.eventTask?(this.resolveEvent(t),this.eventTask=void 0):this.eventQueue.push(t),t}dequeue(){const e=this.eventQueue;if(0<e.length){var t=this.eventIndex,i=e[t++];return t>=e.length?e.length=this.eventIndex=0:this.eventIndex=t,i}}observe(){const t=this;return Bluebird.attempt(function(){if(void 0!==t.eventTask)return t.eventTask;var e=t.dequeue();return void 0!==e?e:t.show()?(t.eventTask=new Task(e=>{t.resolveEvent=e}),t.eventTask):void 0})}load(e,t){if(void 0===this.container)return!1;if(this.eventQueue.length=this.eventIndex=0,this.eventTask=void 0,this.errors={},this.lastFocus=void 0,this.nextFocus=!0,this.nextRefresh=!0,this.enqueue("load"),this.enqueue("prepare"),null!=e){e=overlay(e,e={defaults:{},elements:{}});this.form=overlay(t,e);for(const i in this.form.elements){let e=this.form.elements[i];if(e=overlay(e,{showFilter:!1,checked:!1,enabled:!0,hoisted:!1,visible:!0,overlay:!1,default:!1,validates:!1,readOnly:!1,require:!1,autoActivate:!1}),e.items)for(const s in e.items)e.items[s]=overlay(e.items[s],{enabled:!0,checked:!1,visible:!0,default:!1,validates:!1});this.form.elements[i]=e}}return!0}route(e){switch(e.type){case"changed":return this.cascade(e.name);case"prepare":return this.hydrate(e);case"suggest":return this.suggest(e);case"clicked":return this.click(e);case"validate":return this.verify(e);case"verify":return this.submit(e);case"checked":return this.changed(e)}return!1}changed(e){return this.enqueue("changed",{name:e.name,item:e.item,value:e.value}),!0}isElementValid(e,t=!0,i={status:void 0}){return null!=e&&(i.status=void 0,text.isStatus(e.error)&&"invalid"===e.error.status?!(i.status="invalid"):!0!==e.require||(this.isElementEffectivelyVisible(e)?!!this.isElementValueDefined(e)||!(i.status="missing"):t))}isElementEffectivelyVisible(e){return null!=e&&(!1!==this.getParentSection(e)?.visible&&!1!==e.visible)}isElementValueDefined(e){if(null==e)return!1;if("CheckBox"===e.type)return!0;var t=e.current;if(null!=t)return!0;t=e.value;if(null!=t&&""!==t)return!0;t=e.label;if(null!=t&&""!==t)return!0;var i=e.items;if(null!=i)for(const n in i){var s=i[n];if(null!=s&&!0===s.checked)return!0}return!1}trap(e){switch(e.type){case"populate":case"load":case"suggest":break;default:return!1}var t=e.name;const i=this.find(t);if(void 0===i||null===i)return!1;e=i.dependsOn;if("string"!=typeof e)return!1;e=this.find(e);return i.enabled=this.isElementEffectivelyVisible(e)&&this.isElementValueDefined(e),this.invalidate(t),!i.enabled}cascade(e){var t=this.find(e);if(null==t||!1===t.dependsOn)return!1;const i={[e]:!0};var s=sort(this.form.elements);for(const r in s){const o=s[r];var n=o.dependsOn;if("string"==typeof n){const a=this.find(n);void 0!==a&&"string"!=typeof a.dependsOn&&(a.dependsOn=!0),!0===i[n]&&(i[r]=!0,o.checked=!1,o.current=void 0,o.label=void 0,o.items=void 0,o.value=void 0,this.invalidate(r),o.dependsOn===e&&this.enqueue("populate",{name:r}))}else o.dependsOn=!1}return!0}click(e){var t=this.form.elements[e.name];return null!=t&&"ButtonBar"==t.type&&this.validate(e)}hasInitialSelectionToDependOn(e){e=this.form.elements[e];return e.type===FormElementTypes.DROPDOWNLIST&&(void 0!==e.current&&null!==e.current)}hydrate(e){for(const i in sort(this.form.elements)){var t=this.form.elements[i].dependsOn;"string"==typeof t&&!this.hasInitialSelectionToDependOn(t)||this.enqueue("populate",{name:i}),this.enqueue("load",{name:i})}return!0}shouldTriggerValidation(e){var t=this.find(e.name);if(null!=t&&"string"==typeof e.value){e=e.item;if("string"!=typeof e)return!0===t.validates;t=t.items;if(null!=t){e=t[e];if(null!=e)return!0===e.validates}}}validate(e){var t=this.shouldTriggerValidation(e);if(!0!==t)return!1===t&&(this.enqueue("end",{name:e.name,item:e.item,value:e.value,routingKey:"end"}),!0);{const n=this.errors={};var i=sort(this.form.elements);for(const r in i){var s=i[r];null!=s&&(n[r]=void 0,this.enqueue("validate",{name:r}))}return this.enqueue("verify",{name:e.name,item:e.item,value:e.value,routingKey:"verify"}),!0}}verify(e){var t=e.name,i=this.form.elements[t],e={status:void 0};return!this.isElementValid(i,!0,e)&&(e.status&&(this.errors[t]={status:e.status}),!1===this.nextFocus&&this.focus(t),!0)}suggest(e){const t=this.form.elements[e.name];return void 0!==t&&null!==t&&(t.items={message:{label:{status:"trivial"},enabled:!1}},this.invalidate(e.name),!0)}submit(e){return!this.hasErrors()&&(this.enqueue("submit",{name:e.name,item:e.item,value:e.value}),!0)}hasErrors(){var e=this.errors;for(const i in e){var t=e[i];if(null!=t)return!0}return!1}find(e){if(null!=e)return"string"==typeof(e="object"==typeof e?e.name:e)?this.form.elements[e]:void 0}findName(e){for(const t in this.form.elements)if(this.form.elements[t]===e)return t}coerceNumber(e){var t=this.deriveLocale();return new NumberParser(t).parse(e)}formatNumber(e,t){return t=t||{locale:this.deriveLocale()},format(t,e)}renderCustom(e,t){if(e instanceof FormComponent)return renderers.element.renderCustom(e,t)}renderState(e,t,i){return!1}getParentSection(e){e=e.section;if(e){e="string"==typeof e?e:e.name;return this.form.elements[e]}}isSectionCollapsed(e){return!(!e||"Section"!==e.type||!this.isCollapsibleSection(e)&&!this.isAccordionSection(e))&&!0===e.collapsed}isElementPositionBeforeLastFocused(e){var t=this.lastFocus;if(e&&void 0!==t?.rowNumber&&void 0!==t.rowIndex){e=this.form.elements?.[e];if(e)return void 0!==e.rowNumber&&void 0!==e.rowIndex?e.rowNumber<t.rowNumber||e.rowNumber===t.rowNumber&&e.rowIndex<t.rowIndex:e.index<t.rowNumber||e.index===t.rowNumber&&0<t.rowIndex}return!1}setLastFocus(e,t){this.lastFocus={target:e},t&&(this.lastFocus.name=t,(t=this.form.elements?.[t])&&(void 0!==t.rowNumber&&void 0!==t.rowIndex?(this.lastFocus.rowNumber=t.rowNumber,this.lastFocus.rowIndex=t.rowIndex):(this.lastFocus.rowNumber=t.index,this.lastFocus.rowIndex=0)))}isSection(e){return"Section"===e?.type}isAccordionSection(e){return this.isSection(e)&&"accordion-section"===e.format}isCollapsibleSection(e){return this.isSection(e)&&"collapsible-section"===e.format}getAllSectionElements(){const e={};for(const i in this.form.elements){var t=this.form.elements[i];this.isSection(t)&&(e[i]=t)}return e}getMutuallyExclusiveSectionGroup(t){let i=this.mutuallyExclusiveSections[t];if(!i){var e=this.find(t);if(!this.isAccordionSection(e))return;i=new MutuallyExclusiveSectionGroup({elementName:t,element:e});e=this.getAllSectionElements();const r=Object.keys(sort(e,e=>e.rowNumber));t=r.indexOf(t);for(let e=t-1;0<=e;e--){const o=r[e];var s=this.find(o);if(!this.isAccordionSection(s))break;i.unshift({elementName:o,element:s})}for(let e=t+1;e<r.length;e++){const o=r[e];var n=this.find(o);if(!this.isAccordionSection(n))break;i.push({elementName:o,element:n})}i.forEach(e=>{this.mutuallyExclusiveSections[e.elementName]=i})}return i}updateAccordionSections(t){const e=this.getMutuallyExclusiveSectionGroup(t);e.forEach(e=>{e.element.collapsed=e.elementName!==t}),presenter.refreshForm(this,this.container)}enforceAccordionConstraints(){const e=[];for(const i of Object.keys(this.form.elements).map(e=>({elementName:e,element:this.form.elements[e]})).filter(e=>this.isAccordionSection(e.element)&&!1!==e.element.visible&&!0!==e.element.collapsed).sort((e,t)=>e.element.rowNumber-t.element.rowNumber)){var t=this.getMutuallyExclusiveSectionGroup(i.elementName);-1===e.indexOf(t)?e.push(t):i.element.collapsed=!0}}}export{defs,FormHost};
@@ -1,6 +1,9 @@
1
1
  import * as defs from "./FormDefinition";
2
2
  import { FormatOptions } from "./numberFormatter";
3
- /** Exposes various features to components that require features of the environment. */
3
+ /**
4
+ * Exposes various features to components that require features of the environment.
5
+ * @product This is intended for internal use only within VertiGIS Studio products.
6
+ */
4
7
  export interface FormPresenterHost {
5
8
  /** Indicates if the form is enabled or not. */
6
9
  enabled: boolean;
@@ -11,7 +14,7 @@ export interface FormPresenterHost {
11
14
  /** Disposes the form. */
12
15
  dispose(): void;
13
16
  /** Translates the supplied value. */
14
- translateText(content: defs.Text): string | defs.MarkdownRef | undefined;
17
+ translateText(content: defs.Text | undefined): string | defs.MarkdownRef | undefined;
15
18
  /** References all elements. */
16
19
  refs: {};
17
20
  /** Refreshes the entire form. */
@@ -37,7 +40,7 @@ export interface FormPresenterHost {
37
40
  /** Coerces a number from a value. */
38
41
  coerceNumber(value: string): number;
39
42
  /** Formats a value into a string. */
40
- formatNumber(value: number, options: FormatOptions): string;
43
+ formatNumber(value: number, options?: FormatOptions): string;
41
44
  /**
42
45
  * Derives the current locale set by the host application (or default if undefined) will be returned.
43
46
  */
@@ -46,5 +49,15 @@ export interface FormPresenterHost {
46
49
  * Collapses all neighbouring accordion sections except the one specified.
47
50
  * @param expandedAccordionSection The name of the accordion section to be expanded. All others in the group will be collapsed.
48
51
  */
49
- updateAccordionSections(expandedAccordionSection: string): any;
52
+ updateAccordionSections(expandedAccordionSection: string): void;
53
+ /**
54
+ * Returns `true` if the element is has a `type` of `"Section"` and a `format` of `"accordion-section"`, `false` otherwise.
55
+ * @param element The element to be inspected.
56
+ */
57
+ isAccordionSection(element: defs.Element): boolean;
58
+ /**
59
+ * Returns `true` if the element is has a `type` of `"Section"` and a `format` of `"collapsible-section"`, `false` otherwise.
60
+ * @param element The element to be inspected.
61
+ */
62
+ isCollapsibleSection(element: defs.Element): boolean;
50
63
  }
package/forms/common.d.ts CHANGED
@@ -11,10 +11,9 @@ export declare function getErrorId(elementId: string): string;
11
11
  * @param elementId The id of the DOM element representing the Form Element.
12
12
  * @param inputId (optional) The id of the DOM element representing the main input for the Form Element.
13
13
  * When specified, the title is marked as "for" that DOM element.
14
- * @param className (optional) An alternative class name to use instead of the default. This is used when some types of section present the title within a button.
15
14
  * @returns A title component, or `null` if there is no title.
16
15
  */
17
- export declare function renderTitle(host: FormPresenterHost, element: defs.Element, elementId: string, inputId?: string, className?: string): JSX.Element;
16
+ export declare function renderTitle(host: FormPresenterHost, element: defs.Element, elementId: string, inputId?: string): JSX.Element;
18
17
  /**
19
18
  * Renders the description for a Form Element.
20
19
  * @param host The form host.
@@ -22,7 +21,7 @@ export declare function renderTitle(host: FormPresenterHost, element: defs.Eleme
22
21
  * @param elementId The id of the DOM element representing the Form Element.
23
22
  * @returns A description component, or `null` if there is no description.
24
23
  */
25
- export declare function renderDescription(host: FormPresenterHost, element: defs.Element, elementId: string): JSX.Element;
24
+ export declare function renderDescription(host: FormPresenterHost, element: defs.Element, elementId: string, className?: string): JSX.Element;
26
25
  /**
27
26
  * Renders the accessible description for a Form Element.
28
27
  * @param host The form host.
@@ -48,16 +47,16 @@ export declare function renderError(host: FormPresenterHost, element: defs.Eleme
48
47
  * @param name The name of the Form Element.
49
48
  * @param host The form presenter host.
50
49
  */
51
- export declare function renderFocus(target: HTMLElement & {
50
+ export declare function renderFocus(target: (HTMLElement & {
52
51
  disabled?: boolean | undefined;
53
- }, name: string, host: FormPresenterHost): void;
52
+ }) | null, name: string | undefined, host: FormPresenterHost): void;
54
53
  /**
55
54
  * Returns a memoized function which asks the host to focus the provided element when the form is
56
55
  * initially shown. Ignores the specified target if it is null or disabled.
57
56
  * @param component The form component
58
57
  * @returns A memoized function that focuses a target HTML element.
59
58
  */
60
- export declare function useFocusCallback(component: FormComponent): (target: ReactNode & {
59
+ export declare function useFocusCallback(component: FormComponent): (target: (ReactNode & {
61
60
  disabled?: boolean;
62
61
  thumbRefs?: any[];
63
- }) => void;
62
+ }) | null) => void;
package/forms/common.js CHANGED
@@ -1 +1 @@
1
- import Box from"@vertigis/react-ui/Box";import FormHelperText from"@vertigis/react-ui/FormHelperText";import FormLabel from"@vertigis/react-ui/FormLabel";import{useCallback}from"react";import*as React from"react";import Markdown from"./components/Markdown.js";import{isMarkdown,markdownToText}from"./textUtilities.js";const ERROR_SUFFIX="-error",DESCRIPTION_SUFFIX="-description",TITLE_SUFFIX="-title";function getTitleId(e){return`${e}${TITLE_SUFFIX}`}function getDescriptionId(e){return`${e}${DESCRIPTION_SUFFIX}`}function getErrorId(e){return`${e}${ERROR_SUFFIX}`}function renderTitle(e,r,t,n,o){return r.title?(o=o||"form-element-title",React.createElement(FormLabel,{className:o,htmlFor:n,id:`${t}-label`},React.createElement(Markdown,{host:e,inline:!0,text:r.title}))):null}function renderDescription(e,r,t){return r.description?React.createElement(FormHelperText,{component:"div",disabled:!r.enabled,error:!1,id:`${t}-description`},React.createElement(Markdown,{host:e,text:r.description})):null}function renderAccessibleDescription(e,r,t){let n=e.translateText(r.accessibleDescription);return n||(r=e.translateText(r.description),n=isMarkdown(r)?markdownToText(r.markdown):r),n?React.createElement(Box,{sx:{display:"none"},id:`${t}-accessible-description`},n):null}function renderError(e,r){return r.error?React.createElement(FormHelperText,{component:"div",error:!0,role:"alert"},React.createElement(Markdown,{host:e,text:r.error})):null}function renderFocus(e,r,t){null===e||e.disabled||t.renderFocus(e,r)}function useFocusCallback(e){const{host:r,name:t}=e.props;return useCallback(e=>{null===(e=Array.isArray(e?.thumbRefs)&&0<e.thumbRefs.length?e.thumbRefs[0].current:e)||e.disabled||r.renderFocus(e,t)},[e.enabled,t,r])}export{getTitleId,getDescriptionId,getErrorId,renderTitle,renderDescription,renderAccessibleDescription,renderError,renderFocus,useFocusCallback};
1
+ import Box from"@vertigis/react-ui/Box";import FormHelperText from"@vertigis/react-ui/FormHelperText";import FormLabel from"@vertigis/react-ui/FormLabel";import{useCallback}from"react";import*as React from"react";import{formClasses}from"./components/Form.js";import Markdown from"./components/Markdown.js";import{hasContent,isMarkdown,markdownToText}from"./textUtilities.js";const ERROR_SUFFIX="-error",DESCRIPTION_SUFFIX="-description",TITLE_SUFFIX="-title";function getTitleId(e){return`${e}${TITLE_SUFFIX}`}function getDescriptionId(e){return`${e}${DESCRIPTION_SUFFIX}`}function getErrorId(e){return`${e}${ERROR_SUFFIX}`}function renderTitle(e,r,t,n){return hasContent(r.title)?React.createElement(FormLabel,{className:formClasses.formElementTitle,htmlFor:n,id:`${t}-label`},React.createElement(Markdown,{host:e,inline:!0,text:r.title})):null}function renderDescription(e,r,t,n){return hasContent(r.description)?React.createElement(FormHelperText,{className:n,component:"div",disabled:!r.enabled,error:!1,id:`${t}-description`},React.createElement(Markdown,{host:e,text:r.description})):null}function renderAccessibleDescription(e,r,t){let n=e.translateText(r.accessibleDescription);return n||(r=e.translateText(r.description),n=isMarkdown(r)?markdownToText(r.markdown):r),n?React.createElement(Box,{sx:{display:"none"},id:`${t}-accessible-description`},n):null}function renderError(e,r){return hasContent(r.error)?React.createElement(FormHelperText,{component:"div",error:!0,role:"alert"},React.createElement(Markdown,{host:e,text:r.error})):null}function renderFocus(e,r,t){null===e||e.disabled||t.renderFocus(e,r)}function useFocusCallback(e){const{host:r,name:t}=e.props;return useCallback(e=>{null===(e=Array.isArray(e?.thumbRefs)&&0<e.thumbRefs.length?e.thumbRefs[0].current:e)||e.disabled||r.renderFocus(e,t)},[e.enabled,t,r])}export{getTitleId,getDescriptionId,getErrorId,renderTitle,renderDescription,renderAccessibleDescription,renderError,renderFocus,useFocusCallback};
@@ -0,0 +1,15 @@
1
+ /// <reference types="react" />
2
+ import { FormComponent } from "../FormComponent";
3
+ interface AccordionGroupProps {
4
+ /** The CSS class name of the root element. */
5
+ className?: string;
6
+ /**
7
+ * The `FormComponent` being used to render the Form Elements within this Component.
8
+ */
9
+ component: FormComponent;
10
+ }
11
+ /**
12
+ * This component contains a set of "Section" Form Elements with a `format` of `"accordion-section"`.
13
+ */
14
+ declare const AccordionGroup: ({ className, component }: AccordionGroupProps) => JSX.Element;
15
+ export default AccordionGroup;
@@ -0,0 +1 @@
1
+ import Box from"@vertigis/react-ui/Box";import{styled}from"@vertigis/react-ui/styles";import*as React from"react";const Root=styled(Box)(({theme:{spacing:o}})=>({marginBottom:o(4),marginTop:o(4)})),AccordionGroup=({className:o,component:t})=>{var t=t.props["children"];return React.createElement(Root,{className:o},t)};export default AccordionGroup;
@@ -0,0 +1,7 @@
1
+ /// <reference types="react" />
2
+ import { BaseFormElementProps } from "../FormElement";
3
+ /**
4
+ * The component for the "Auto Complete" Form Element.
5
+ */
6
+ declare const AutoComplete: ({ className, component, element }: BaseFormElementProps) => JSX.Element;
7
+ export default AutoComplete;
@@ -0,0 +1 @@
1
+ import BaseAutoComplete,{HighlightOption}from"@vertigis/react-ui/Autocomplete";import FormLabelTextField from"@vertigis/react-ui/FormLabelTextField";import{styled}from"@vertigis/react-ui/styles";import clsx from"clsx";import{useEffect,useMemo,useRef,useState}from"react";import*as React from"react";import{ExclusiveTimer}from"../ExclusiveTimer.js";import FormElement from"../FormElement.js";import{useFocusCallback}from"../common.js";import{autoCompletePropertyConstraints}from"../elements/AutoComplete.js";import{getKeyString}from"../keyboard.js";import{getItemId,makeSafeClassName,makeUniqueId,sortItems}from"../utils.js";const Root=styled(FormElement)(({theme:{}})=>({".MuiAutocomplete-endAdornment":{right:1}})),AutoComplete=({className:e,component:t,element:u})=>{const{host:i,name:r}=t.props,[o,n]=useState(""),[a,l]=useState(),[s,m]=useState([]),[c,p]=useState(null),d=`${makeUniqueId(r)}-input`;var f=useRef(i.renderText({status:"trivial"}));const v=i.renderText(u.prompt),g=i.renderText(u.tooltip),y=useFocusCallback(t),C=useRef({}),h=useRef({}),x=useMemo(()=>{let e=u.delay;return"number"==typeof e&&!isNaN(e)||(e=autoCompletePropertyConstraints.delay.default),Math.max(e,autoCompletePropertyConstraints.delay.minimum)},[u.delay]),b=useMemo(()=>{let e=u.minLength;return"number"==typeof e&&!isNaN(e)||(e=autoCompletePropertyConstraints.minLength.default),Math.max(e,autoCompletePropertyConstraints.minLength.minimum)},[u.minLength]),E=t.timer||(t.timer=new ExclusiveTimer),T=()=>{i.post("suggest",{name:r,value:u.value,argument:o,cancellationToken:E.cancellationToken})},I=()=>{u.items={},m([])};return useEffect(()=>{"clear"===a?I():"input"===a&&(o.length>=b?(u.current=void 0,E.reset(),E.start(x,T)):0<Object.keys(u.items||{}).length&&I())},[a,o]),useEffect(()=>{var e,t=c?.value;u.value!==t&&(e=getItemId(c,C.current),u.current=e,u.label=e?h.current[e]:void 0,u.value=t,i.post("changed",{name:r,value:u.value,argument:u.label}))},[c]),useEffect(()=>{var e=sortItems(u);const t={};var r="string"==typeof u.current?u.current:void 0;let o=null;const n=[];for(const s in e){var a=e[s];n.push(a);var l=i.renderText(a.label);t[s]=l,r&&s===r&&(o=a)}h.current=t,C.current=e,m(n),p(o)},[u.items]),useEffect(()=>{var e="string"==typeof u.current?u.current:void 0,t=e?C.current[e]:void 0,e=e?h.current[e]:void 0;t?(u.label=e,u.value=t.value,n(e||"")):(u.label=void 0,u.value=void 0),p(t||null)},[u.current]),React.createElement(Root,{className:e,component:t,element:u,inputId:d},React.createElement(BaseAutoComplete,{autoSelect:!0,clearOnEscape:!0,clearOnBlur:!1,disabled:!t.enabled,filterOptions:e=>e,getOptionDisabled:e=>!1===e.enabled,inputValue:o,noOptionsText:f.current,onBlur:()=>{1===s.length&&o.toLowerCase()===h.current[0]?.toLowerCase()?(n(h.current[0]),p(s[0])):u.label=o},onChange:(e,t,r,o)=>{p(t)},onInputChange:(e,t,r)=>{n(t),l(r)},onKeyDown:e=>{"enter"===getKeyString(e)&&e.stopPropagation()},options:s,renderOption:(e,t,{inputValue:r})=>{var o=getItemId(t,C.current),o={...e,className:clsx(e.className,t.styleName?makeSafeClassName(t.styleName):void 0),title:t.tooltip?i.renderText(t.tooltip):void 0,inputText:r,optionText:o?h.current[o]:""};return React.createElement(HighlightOption,{...o})},renderInput:e=>(e.inputProps={...e.inputProps,id:d,placeholder:v,title:g},React.createElement(FormLabelTextField,{error:!!u.error,...e,fullWidth:!0,inputRef:y})),value:c}))};export default AutoComplete;
@@ -0,0 +1,13 @@
1
+ /// <reference types="react" />
2
+ import { BaseFormElementProps } from "../FormElement";
3
+ export interface ButtonBarProps extends BaseFormElementProps {
4
+ /**
5
+ * Defines the space between immediate children.
6
+ */
7
+ spacing?: number;
8
+ }
9
+ /**
10
+ * The component for the "Button Bar" Form Element.
11
+ */
12
+ declare const ButtonBar: ({ className, component, element, spacing }: ButtonBarProps) => JSX.Element;
13
+ export default ButtonBar;
@@ -0,0 +1 @@
1
+ import Button from"@vertigis/react-ui/Button";import Stack from"@vertigis/react-ui/Stack";import{styled}from"@vertigis/react-ui/styles";import*as React from"react";import FormElement from"../FormElement.js";import{Orientation}from"../constants.js";import{makeSafeClassName,sort}from"../utils.js";import Markdown from"./Markdown.js";const Root=styled(FormElement)(({theme:{spacing:e}})=>({".MuiStack-root":{alignItems:"flex-start",flexWrap:"wrap",marginTop:e(1),marginBottom:e(1)}})),ButtonBar=({className:e,component:c,element:t,spacing:o})=>{const{host:u,name:p}=c.props,d=sort(t.items);let f;void 0===o&&(o=1);return React.createElement(Root,{className:e,component:c,element:t},React.createElement(Stack,{direction:t.orientation===Orientation.VERTICAL?"column":"row",spacing:o},Object.keys(d).map(e=>{var t,o,a,r=d[e],n=r.styleName?makeSafeClassName(r.styleName):void 0,i=!1!==r.visible,m=c.enabled&&!1!==r.enabled&&i,l=u.renderText(r.tooltip),s=d[e]["value"];return m&&void 0===f&&(f=e),i?React.createElement(Button,{onClick:(o=e,a=s,function(e){u.post("clicked",{name:p,item:o,value:a})}),className:n,color:r.default?"primary":"inherit",disabled:!m,key:e,ref:(t=e,function(e){null!==e&&t===f&&u.renderFocus(e,p)}),title:l,variant:r.default?"contained":"outlined"},React.createElement(Markdown,{host:u,inline:!0,text:r.label||""})):null})))};export default ButtonBar;
@@ -0,0 +1,7 @@
1
+ /// <reference types="react" />
2
+ import { BaseFormElementProps } from "../FormElement";
3
+ /**
4
+ * The component for the "Check Box" Form Element.
5
+ */
6
+ declare const CheckBox: ({ className, component, element }: BaseFormElementProps) => JSX.Element;
7
+ export default CheckBox;
@@ -0,0 +1 @@
1
+ import Checkbox from"@vertigis/react-ui/Checkbox";import FormControlLabel from"@vertigis/react-ui/FormControlLabel";import*as React from"react";import{useEffect,useState}from"react";import FormElement from"../FormElement.js";import Markdown from"./Markdown.js";const CheckBox=({className:e,component:t,element:o})=>{const[r,a]=useState(!1),[c,l]=useState(null),{host:n,name:m}=t.props;var s=n.renderText(o.tooltip);useEffect(()=>{a(!!o.checked)},[o.checked]),useEffect(()=>{l(React.createElement(Markdown,{host:n,text:o.label}))},[o.label]);return React.createElement(FormElement,{className:e,component:t,element:o},React.createElement(FormControlLabel,{control:React.createElement(Checkbox,{checked:r,onChange:e=>{e=e.target.checked;o.checked=e,n.post("changed",{name:m,value:e?o.value:void 0,argument:e}),a(e)},inputRef:e=>{null===e||e.disabled||n.renderFocus(e,m)}}),disabled:!t.enabled,label:c,title:s}))};export default CheckBox;
@@ -0,0 +1,7 @@
1
+ /// <reference types="react" />
2
+ import { BaseFormElementProps } from "../FormElement";
3
+ /**
4
+ * The component for the "Check Group" Form Element.
5
+ */
6
+ declare const CheckGroup: ({ className, component, element }: BaseFormElementProps) => JSX.Element;
7
+ export default CheckGroup;
@@ -0,0 +1 @@
1
+ import Checkbox from"@vertigis/react-ui/Checkbox";import FormControlLabel from"@vertigis/react-ui/FormControlLabel";import FormGroup from"@vertigis/react-ui/FormGroup";import{styled}from"@vertigis/react-ui/styles";import*as React from"react";import{useEffect,useState}from"react";import FormElement from"../FormElement.js";import{Orientation}from"../constants.js";import{makeSafeClassName,sortItems}from"../utils.js";import Markdown from"./Markdown.js";const Root=styled(FormElement)(({theme:{spacing:e}})=>({".MuiFormGroup-root":{paddingBottom:e(2)}})),CheckGroup=({className:e,component:t,element:a})=>{const[n,m]=useState([]),{host:o,name:s}=t.props,c=sortItems(a);useEffect(()=>{i()});var r=e=>{null===e||e.disabled||o.renderFocus(e,s)};function i(){const e=[],t=[];for(const o in c){var r=c[o];r.checked&&(e.push(r),t.push(o))}0===e.length?a.value=void 0:a.value={refValueType:"items",items:e},a.current=void 0,l(t,n)||m(t)}const l=(t,r)=>{if(!t&&!r)return!0;if(!t||!r)return!1;if(t.length!==r.length)return!1;for(let e=0;e<t.length;e++)if(t[e]!==r[e])return!1;return!0};const u=[];for(const v in c){var p=c[v],f=-1!==n.indexOf(v),d=t.enabled&&!1!==p.enabled,h=o.renderText(p.tooltip),k=p.styleName?makeSafeClassName(p.styleName):void 0;u.push(React.createElement(FormControlLabel,{className:k,control:React.createElement(Checkbox,{checked:f,onChange:((t,r)=>function(e){e=c[t].checked=e.currentTarget.checked;i(),o.post("changed",{name:s,item:t,value:e?r:void 0,argument:e})})(v,p.value),inputRef:r}),disabled:!d,key:v,label:React.createElement(Markdown,{host:o,text:p.label}),title:h}))}return React.createElement(Root,{className:e,component:t,element:a},React.createElement(FormGroup,{row:a.orientation===Orientation.HORIZONTAL},u))};export default CheckGroup;
@@ -0,0 +1,7 @@
1
+ /// <reference types="react" />
2
+ import { BaseFormElementProps } from "../FormElement";
3
+ /**
4
+ * The component for the "Custom" Form Element.
5
+ */
6
+ declare const Custom: ({ className, component, element }: BaseFormElementProps) => JSX.Element;
7
+ export default Custom;
@@ -0,0 +1 @@
1
+ import*as React from"react";import{createElement}from"react";import FormElement from"../FormElement.js";import{getElementProps}from"../utils.js";const Custom=({className:e,component:t,element:m})=>{var o=t.props.name;let r;return r=t.elementRegistration?createElement(t.elementRegistration.component,getElementProps(t,m)):(console.warn(`Unable to render custom form element '${o}' of type '${m.customType}'.`),`--- ${m.customType} ---`),React.createElement(FormElement,{className:e,component:t,element:m},r)};export default Custom;
@@ -1,17 +1,7 @@
1
- import * as React from "react";
2
- import { FormComponent } from "../FormComponent";
3
- import { Element } from "../FormDefinition";
4
- interface DatePickerProps {
5
- /** True if the popup is open, false otherwise. */
6
- isOpen: boolean;
7
- /** Callback for when the value changes. */
8
- onChange: (value: Date) => void;
9
- /** Callback for when the popup is opened or closed. */
10
- onPopupToggle: (isOpen: boolean) => void;
11
- /** Indicates the value for the date picker. */
12
- value?: Date;
13
- component: FormComponent;
14
- element: Element;
15
- }
16
- declare const DatePicker: React.FC<DatePickerProps>;
1
+ /// <reference types="react" />
2
+ import { BaseFormElementProps } from "../FormElement";
3
+ /**
4
+ * The component for the "Date Picker" Form Element.
5
+ */
6
+ declare const DatePicker: ({ className, component, element }: BaseFormElementProps) => JSX.Element;
17
7
  export default DatePicker;
@@ -1 +1 @@
1
- import{parse}from"date-fns";import{useEffect,useState,lazy,Suspense}from"react";import*as React from"react";import{DEFAULT_LOCALE}from"../../constants.js";import{renderCalendar}from"../assets/datetime.js";import{useFocusCallback}from"../common.js";import{CssClasses}from"../constants.js";import{getDateAsLocaleFormattedString,getDateFnsLocale,getLocaleDateFormat,isValidDate,tryParseDateText}from"../dateUtilities.js";import{CSS}from"../styles/daterange.js";import{addStyleToDocument}from"../utils.js";const Calendar=lazy(()=>import("./ReactDateRangeCalendar"));addStyleToDocument(CSS);const dateFormat=getLocaleDateFormat();let currentLocale;const DatePicker=e=>{const{component:t,element:a,isOpen:o,onChange:r,onPopupToggle:n}=e,s=t.props["host"],[c,l]=useState(),[i,m]=useState("");var d=s.renderText(a.tooltip),u=!t.enabled,p=u?"inner disabled":"inner";useEffect(()=>{(async()=>{var e=s.deriveLocale();"inv"!==e&&"en"!==e&&e!==DEFAULT_LOCALE&&(currentLocale=await getDateFnsLocale(e))})()},[]),useEffect(()=>{l(e.value),m(getDateAsLocaleFormattedString(e.value))},[e.value]);var f=useFocusCallback(t);const D=e=>{var t="string"==typeof e?e:e.target.value,a=""!==t&&void 0!==t,e=a?tryParseDateText(t):void 0,t=a?e?parse(e,dateFormat,0):new Date(NaN):void 0;a?isValidDate(t)?(l(t),m(e),v(),g(t)):(v({status:"invalid"}),l(new Date(NaN)),g(void 0)):(v(),l(void 0),g(void 0))};const g=e=>{"function"==typeof r&&r(e)};const v=e=>{a.error=e,t.forceUpdate()};return React.createElement("div",{className:"SimpleDatePicker outer",title:d},React.createElement("div",{className:p},React.createElement("input",{"aria-label":"Date Picker",ref:f,disabled:u,type:"text",onChange:e=>(e=>{m(e.target.value)})(e),onBlur:e=>D(e),onKeyDown:e=>(e=>{e.stopPropagation(),"Enter"===e.key?D(i):"Escape"===e.key&&D(getDateAsLocaleFormattedString(c))})(e),placeholder:dateFormat.toUpperCase(),value:i})),React.createElement("div",{className:"buttonContainer"},React.createElement("button",{className:"calendarButton",disabled:u,onClick:()=>{"function"==typeof n&&n(!o)}},renderCalendar()),o&&React.createElement(Suspense,{fallback:null},React.createElement("div",{className:CssClasses.DROPDOWN},React.createElement(Calendar,{format:dateFormat,editableDateInputs:!1,date:c,onChange:e=>{l(e),m(getDateAsLocaleFormattedString(e)),v(),g(e)},locale:currentLocale}),React.createElement("button",{className:"done",onClick:()=>{"function"==typeof n&&n(!1)}},s.renderText("@common-done"))))))};export default DatePicker;
1
+ import BaseDatePicker from"@vertigis/react-ui/DatePicker";import FormHelperText from"@vertigis/react-ui/FormHelperText";import FormLabelTextField from"@vertigis/react-ui/FormLabelTextField";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{isDateTimeRef,makeUniqueId}from"../utils.js";const DatePicker=({className:e,component:t,element:r})=>{const[a,o]=useState(!1),[l,n]=useState(!1),[s,i]=useState(null),m=useRef(),u=useRef(!0),{host:c,name:p}=t.props;var d=useFocusCallback(t);const f=c.renderText(r.tooltip),v=makeProperFormat(r.value,r.format),F=Calendar.useNative(),k="date";useEffect(()=>{var e=makeProperValue(r.value,F);updateElementValue(r,e,k,v,F),i(e||null)},[r.value]),useEffect(()=>{if(u.current)u.current=!1;else if(!l&&!a)if(isInvalidDate(s))E({status:"invalid"});else{E();let e=s||void 0;if(e&&isDateTimeRef(r.value)){const t=new Date(r.value.value);e=new Date(e),e.setHours(t.getHours()),e.setMinutes(t.getMinutes()),e.setSeconds(t.getSeconds()),e.setMilliseconds(t.getMilliseconds())}updateElementValue(r,e,k,v,F)&&c.post("changed",{name:p,value:r.value})}},[l,a]);const E=e=>{hasErrorChanged(r,e)&&(r.error=e,t.forceUpdate())},P=`${makeUniqueId(p)}-input`,g=c.renderText(r.prompt);return React.createElement(FormElement,{className:e,component:t,element:r,inputId:P},r.error&&React.createElement(FormHelperText,{component:"div",error:!0,role:"alert"},m.current),React.createElement(BaseDatePicker,{disabled:!t.enabled,key:"date-picker",inputRef:d,onChange:e=>{i(e)},onOpen:()=>{n(!0)},onClose:()=>{n(!1)},renderInput:e=>(m.current=e.inputProps?.placeholder,e.error=!!r.error,e.inputProps={...e.inputProps,id:P,onBlur:()=>{o(!1)},onFocus:()=>{o(!0)},placeholder:g||e.inputProps?.placeholder,title:f},React.createElement(FormLabelTextField,{...e})),value:s}))};export default DatePicker;