@luomus/laji-form 15.1.4 → 15.1.6

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 (235) hide show
  1. package/lib/ApiClient.d.ts +46 -0
  2. package/lib/ApiClient.js +93 -0
  3. package/lib/Context.d.ts +8 -0
  4. package/lib/Context.js +18 -0
  5. package/lib/ReactContext.d.ts +7 -0
  6. package/lib/ReactContext.js +5 -0
  7. package/lib/components/BaseComponent.d.ts +9 -0
  8. package/lib/components/BaseComponent.js +29 -0
  9. package/lib/components/LajiForm.d.ts +221 -0
  10. package/lib/components/LajiForm.js +616 -0
  11. package/lib/components/VirtualSchemaField.d.ts +42 -0
  12. package/lib/components/VirtualSchemaField.js +74 -0
  13. package/lib/components/components.d.ts +119 -0
  14. package/lib/components/components.js +606 -0
  15. package/lib/components/fields/AnnotationField.d.ts +34 -0
  16. package/lib/components/fields/AnnotationField.js +242 -0
  17. package/lib/components/fields/AnyToBooleanField.d.ts +18 -0
  18. package/lib/components/fields/AnyToBooleanField.js +20 -0
  19. package/lib/components/fields/ArrayBulkField.d.ts +23 -0
  20. package/lib/components/fields/ArrayBulkField.js +82 -0
  21. package/lib/components/fields/ArrayCombinerField.d.ts +36 -0
  22. package/lib/components/fields/ArrayCombinerField.js +138 -0
  23. package/lib/components/fields/ArrayField.d.ts +39 -0
  24. package/lib/components/fields/ArrayField.js +148 -0
  25. package/lib/components/fields/AsArrayField.d.ts +292 -0
  26. package/lib/components/fields/AsArrayField.js +38 -0
  27. package/lib/components/fields/AudioArrayField.d.ts +22 -0
  28. package/lib/components/fields/AudioArrayField.js +100 -0
  29. package/lib/components/fields/AutoArrayField.d.ts +24 -0
  30. package/lib/components/fields/AutoArrayField.js +56 -0
  31. package/lib/components/fields/AutosuggestField.d.ts +69 -0
  32. package/lib/components/fields/AutosuggestField.js +299 -0
  33. package/lib/components/fields/CombinedValueDisplayField.d.ts +41 -0
  34. package/lib/components/fields/CombinedValueDisplayField.js +100 -0
  35. package/lib/components/fields/ConditionalOnChangeField.d.ts +42 -0
  36. package/lib/components/fields/ConditionalOnChangeField.js +107 -0
  37. package/lib/components/fields/ConditionalUiSchemaField.d.ts +123 -0
  38. package/lib/components/fields/ConditionalUiSchemaField.js +143 -0
  39. package/lib/components/fields/ContextInjectionField.d.ts +24 -0
  40. package/lib/components/fields/ContextInjectionField.js +68 -0
  41. package/lib/components/fields/DataLeakerField.d.ts +40 -0
  42. package/lib/components/fields/DataLeakerField.js +68 -0
  43. package/lib/components/fields/DefaultValueArrayField.d.ts +34 -0
  44. package/lib/components/fields/DefaultValueArrayField.js +59 -0
  45. package/lib/components/fields/DependentBooleanField.d.ts +38 -0
  46. package/lib/components/fields/DependentBooleanField.js +87 -0
  47. package/lib/components/fields/DependentDisableField.d.ts +35 -0
  48. package/lib/components/fields/DependentDisableField.js +71 -0
  49. package/lib/components/fields/EnumRangeArrayField.d.ts +27 -0
  50. package/lib/components/fields/EnumRangeArrayField.js +115 -0
  51. package/lib/components/fields/ExtraLabelRowField.d.ts +38 -0
  52. package/lib/components/fields/ExtraLabelRowField.js +100 -0
  53. package/lib/components/fields/FakePropertyField.d.ts +18 -0
  54. package/lib/components/fields/FakePropertyField.js +48 -0
  55. package/lib/components/fields/FilterArrayField.d.ts +73 -0
  56. package/lib/components/fields/FilterArrayField.js +121 -0
  57. package/lib/components/fields/FlatField.d.ts +29 -0
  58. package/lib/components/fields/FlatField.js +171 -0
  59. package/lib/components/fields/GeocoderField.d.ts +47 -0
  60. package/lib/components/fields/GeocoderField.js +372 -0
  61. package/lib/components/fields/GridLayoutField.d.ts +18 -0
  62. package/lib/components/fields/GridLayoutField.js +32 -0
  63. package/lib/components/fields/HiddenField.d.ts +10 -0
  64. package/lib/components/fields/HiddenField.js +11 -0
  65. package/lib/components/fields/ImageArrayField.d.ts +172 -0
  66. package/lib/components/fields/ImageArrayField.js +699 -0
  67. package/lib/components/fields/ImageDisplayField.d.ts +18 -0
  68. package/lib/components/fields/ImageDisplayField.js +44 -0
  69. package/lib/components/fields/InitiallyHiddenField.d.ts +21 -0
  70. package/lib/components/fields/InitiallyHiddenField.js +58 -0
  71. package/lib/components/fields/InjectDefaultValueField.d.ts +37 -0
  72. package/lib/components/fields/InjectDefaultValueField.js +68 -0
  73. package/lib/components/fields/InjectField.d.ts +46 -0
  74. package/lib/components/fields/InjectField.js +88 -0
  75. package/lib/components/fields/InputWithDefaultValueButtonField.d.ts +25 -0
  76. package/lib/components/fields/InputWithDefaultValueButtonField.js +61 -0
  77. package/lib/components/fields/LocalityField.d.ts +22 -0
  78. package/lib/components/fields/LocalityField.js +94 -0
  79. package/lib/components/fields/LocationChooserField.d.ts +27 -0
  80. package/lib/components/fields/LocationChooserField.js +440 -0
  81. package/lib/components/fields/MapArrayField.d.ts +78 -0
  82. package/lib/components/fields/MapArrayField.js +1783 -0
  83. package/lib/components/fields/MapField.d.ts +48 -0
  84. package/lib/components/fields/MapField.js +434 -0
  85. package/lib/components/fields/MultiAnyToBooleanField.d.ts +25 -0
  86. package/lib/components/fields/MultiAnyToBooleanField.js +100 -0
  87. package/lib/components/fields/MultiArrayField.d.ts +53 -0
  88. package/lib/components/fields/MultiArrayField.js +224 -0
  89. package/lib/components/fields/MultiLanguageField.d.ts +13 -0
  90. package/lib/components/fields/MultiLanguageField.js +52 -0
  91. package/lib/components/fields/MultiTagArrayField.d.ts +36 -0
  92. package/lib/components/fields/MultiTagArrayField.js +142 -0
  93. package/lib/components/fields/NamedPlaceChooserField.d.ts +29 -0
  94. package/lib/components/fields/NamedPlaceChooserField.js +380 -0
  95. package/lib/components/fields/NamedPlaceSaverField.d.ts +29 -0
  96. package/lib/components/fields/NamedPlaceSaverField.js +237 -0
  97. package/lib/components/fields/NestField.d.ts +148 -0
  98. package/lib/components/fields/NestField.js +289 -0
  99. package/lib/components/fields/ObjectField.d.ts +2 -0
  100. package/lib/components/fields/ObjectField.js +119 -0
  101. package/lib/components/fields/PdfArrayField.d.ts +21 -0
  102. package/lib/components/fields/PdfArrayField.js +40 -0
  103. package/lib/components/fields/PrefillingArrayField.d.ts +22 -0
  104. package/lib/components/fields/PrefillingArrayField.js +65 -0
  105. package/lib/components/fields/SchemaField.d.ts +7 -0
  106. package/lib/components/fields/SchemaField.js +109 -0
  107. package/lib/components/fields/ScopeField.d.ts +85 -0
  108. package/lib/components/fields/ScopeField.js +521 -0
  109. package/lib/components/fields/SectionArrayField.d.ts +38 -0
  110. package/lib/components/fields/SectionArrayField.js +618 -0
  111. package/lib/components/fields/SelectTreeField.d.ts +39 -0
  112. package/lib/components/fields/SelectTreeField.js +143 -0
  113. package/lib/components/fields/SingleActiveArrayField.d.ts +49 -0
  114. package/lib/components/fields/SingleActiveArrayField.js +974 -0
  115. package/lib/components/fields/SingleItemArrayField.d.ts +15 -0
  116. package/lib/components/fields/SingleItemArrayField.js +60 -0
  117. package/lib/components/fields/SortArrayField.d.ts +73 -0
  118. package/lib/components/fields/SortArrayField.js +351 -0
  119. package/lib/components/fields/SplitField.d.ts +28 -0
  120. package/lib/components/fields/SplitField.js +65 -0
  121. package/lib/components/fields/StringToArrayField.d.ts +24 -0
  122. package/lib/components/fields/StringToArrayField.js +48 -0
  123. package/lib/components/fields/SumField.d.ts +35 -0
  124. package/lib/components/fields/SumField.js +83 -0
  125. package/lib/components/fields/TableField.d.ts +18 -0
  126. package/lib/components/fields/TableField.js +136 -0
  127. package/lib/components/fields/TagArrayField.d.ts +38 -0
  128. package/lib/components/fields/TagArrayField.js +128 -0
  129. package/lib/components/fields/ToggleAdditionalArrayFieldsField.d.ts +26 -0
  130. package/lib/components/fields/ToggleAdditionalArrayFieldsField.js +81 -0
  131. package/lib/components/fields/UiFieldApplierField.d.ts +30 -0
  132. package/lib/components/fields/UiFieldApplierField.js +106 -0
  133. package/lib/components/fields/UiFieldMapperArrayField.d.ts +42 -0
  134. package/lib/components/fields/UiFieldMapperArrayField.js +121 -0
  135. package/lib/components/fields/UnitCountShorthandField.d.ts +22 -0
  136. package/lib/components/fields/UnitCountShorthandField.js +149 -0
  137. package/lib/components/fields/UnitListShorthandArrayField.d.ts +26 -0
  138. package/lib/components/fields/UnitListShorthandArrayField.js +108 -0
  139. package/lib/components/fields/UnitShorthandField.d.ts +32 -0
  140. package/lib/components/fields/UnitShorthandField.js +220 -0
  141. package/lib/components/templates/ArrayFieldTemplate.d.ts +85 -0
  142. package/lib/components/templates/ArrayFieldTemplate.js +416 -0
  143. package/lib/components/templates/BaseInputTemplate.d.ts +11 -0
  144. package/lib/components/templates/BaseInputTemplate.js +80 -0
  145. package/lib/components/templates/DescriptionField.d.ts +1 -0
  146. package/lib/components/templates/DescriptionField.js +37 -0
  147. package/lib/components/templates/ErrorListTemplate.d.ts +9 -0
  148. package/lib/components/templates/ErrorListTemplate.js +95 -0
  149. package/lib/components/templates/FieldTemplate.d.ts +6 -0
  150. package/lib/components/templates/FieldTemplate.js +112 -0
  151. package/lib/components/templates/ObjectFieldTemplate.d.ts +7 -0
  152. package/lib/components/templates/ObjectFieldTemplate.js +66 -0
  153. package/lib/components/templates/TitleField.d.ts +9 -0
  154. package/lib/components/templates/TitleField.js +51 -0
  155. package/lib/components/widgets/AnyToBooleanWidget.d.ts +20 -0
  156. package/lib/components/widgets/AnyToBooleanWidget.js +49 -0
  157. package/lib/components/widgets/AutosuggestWidget.d.ts +66 -0
  158. package/lib/components/widgets/AutosuggestWidget.js +1127 -0
  159. package/lib/components/widgets/CheckboxWidget.d.ts +37 -0
  160. package/lib/components/widgets/CheckboxWidget.js +139 -0
  161. package/lib/components/widgets/DateTimeWidget.d.ts +62 -0
  162. package/lib/components/widgets/DateTimeWidget.js +251 -0
  163. package/lib/components/widgets/DateWidget.d.ts +23 -0
  164. package/lib/components/widgets/DateWidget.js +41 -0
  165. package/lib/components/widgets/HiddenWidget.d.ts +15 -0
  166. package/lib/components/widgets/HiddenWidget.js +19 -0
  167. package/lib/components/widgets/ImageSelectWidget.d.ts +14 -0
  168. package/lib/components/widgets/ImageSelectWidget.js +57 -0
  169. package/lib/components/widgets/InformalTaxonGroupChooserWidget.d.ts +43 -0
  170. package/lib/components/widgets/InformalTaxonGroupChooserWidget.js +237 -0
  171. package/lib/components/widgets/InputGroupWidget.d.ts +21 -0
  172. package/lib/components/widgets/InputGroupWidget.js +36 -0
  173. package/lib/components/widgets/InputWithDefaultValueButtonWidget.d.ts +21 -0
  174. package/lib/components/widgets/InputWithDefaultValueButtonWidget.js +47 -0
  175. package/lib/components/widgets/NumberWidget.d.ts +13 -0
  176. package/lib/components/widgets/NumberWidget.js +21 -0
  177. package/lib/components/widgets/PlainTextWidget.d.ts +12 -0
  178. package/lib/components/widgets/PlainTextWidget.js +24 -0
  179. package/lib/components/widgets/SelectWidget.d.ts +52 -0
  180. package/lib/components/widgets/SelectWidget.js +158 -0
  181. package/lib/components/widgets/SeparatedDateTimeWidget.d.ts +19 -0
  182. package/lib/components/widgets/SeparatedDateTimeWidget.js +59 -0
  183. package/lib/components/widgets/TaxonImageWidget.d.ts +13 -0
  184. package/lib/components/widgets/TaxonImageWidget.js +30 -0
  185. package/lib/components/widgets/TextSelectWidget.d.ts +25 -0
  186. package/lib/components/widgets/TextSelectWidget.js +94 -0
  187. package/lib/components/widgets/TextareaWidget.d.ts +32 -0
  188. package/lib/components/widgets/TextareaWidget.js +87 -0
  189. package/lib/components/widgets/TimeWidget.d.ts +11 -0
  190. package/lib/components/widgets/TimeWidget.js +19 -0
  191. package/lib/components/widgets/URLWidget.d.ts +14 -0
  192. package/lib/components/widgets/URLWidget.js +12 -0
  193. package/lib/components/widgets/UpperCaseWidget.d.ts +13 -0
  194. package/lib/components/widgets/UpperCaseWidget.js +21 -0
  195. package/lib/index.d.ts +20 -0
  196. package/lib/index.js +50 -0
  197. package/lib/services/blocker-service.d.ts +11 -0
  198. package/lib/services/blocker-service.js +55 -0
  199. package/lib/services/custom-event-service.d.ts +17 -0
  200. package/lib/services/custom-event-service.js +35 -0
  201. package/lib/services/dom-id-service.d.ts +8 -0
  202. package/lib/services/dom-id-service.js +30 -0
  203. package/lib/services/focus-service.d.ts +13 -0
  204. package/lib/services/focus-service.js +60 -0
  205. package/lib/services/id-service.d.ts +22 -0
  206. package/lib/services/id-service.js +130 -0
  207. package/lib/services/key-handler-service.d.ts +56 -0
  208. package/lib/services/key-handler-service.js +184 -0
  209. package/lib/services/root-instance-service.d.ts +25 -0
  210. package/lib/services/root-instance-service.js +49 -0
  211. package/lib/services/settings-service.d.ts +34 -0
  212. package/lib/services/settings-service.js +154 -0
  213. package/lib/services/singleton-map-service.d.ts +23 -0
  214. package/lib/services/singleton-map-service.js +44 -0
  215. package/lib/services/submit-hook-service.d.ts +24 -0
  216. package/lib/services/submit-hook-service.js +73 -0
  217. package/lib/styles.d.ts +1 -0
  218. package/lib/styles.js +4 -0
  219. package/lib/themes/bs3.d.ts +3 -0
  220. package/lib/themes/bs3.js +133 -0
  221. package/lib/themes/bs5.d.ts +3 -0
  222. package/lib/themes/bs5.js +111 -0
  223. package/lib/themes/glyphicon-fa-mapping.d.ts +3 -0
  224. package/lib/themes/glyphicon-fa-mapping.js +271 -0
  225. package/lib/themes/stub.d.ts +3 -0
  226. package/lib/themes/stub.js +82 -0
  227. package/lib/themes/theme.d.ts +233 -0
  228. package/lib/themes/theme.js +2 -0
  229. package/lib/translations.json +847 -0
  230. package/lib/utils.d.ts +167 -0
  231. package/lib/utils.js +1185 -0
  232. package/lib/validation.d.ts +7 -0
  233. package/lib/validation.js +141 -0
  234. package/package.json +2 -2
  235. package/patches/protractor++webdriver-manager+12.1.8.patch +0 -20395
@@ -0,0 +1,618 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __rest = (this && this.__rest) || function (s, e) {
9
+ var t = {};
10
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
11
+ t[p] = s[p];
12
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
13
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
14
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
15
+ t[p[i]] = s[p[i]];
16
+ }
17
+ return t;
18
+ };
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ const React = require("react");
21
+ const react_dom_1 = require("react-dom");
22
+ const PropTypes = require("prop-types");
23
+ const utils_1 = require("../../utils");
24
+ const VirtualSchemaField_1 = require("../VirtualSchemaField");
25
+ const TitleField_1 = require("../templates/TitleField");
26
+ const components_1 = require("../components");
27
+ const Context_1 = require("../../Context");
28
+ const ReactContext_1 = require("../../ReactContext");
29
+ const ArrayFieldTemplate_1 = require("../templates/ArrayFieldTemplate");
30
+ const getOptions = (options) => {
31
+ const { sectionField = "/section", rowDefinerField = "/units/%{row}/identifications/0/taxonVerbatim", rowDefinerFields = [
32
+ "/units/%{row}/identifications/0/taxonID"
33
+ ], rowValueField = "/units/%{row}/individualCount", } = options;
34
+ return Object.assign(Object.assign({}, options), { sectionField, rowDefinerField, rowDefinerFields, rowValueField });
35
+ };
36
+ const hideFields = (schema, uiSchema, fields) => fields.reduce((_uiSchema, field) => utils_1.updateSafelyWithJSONPointer(_uiSchema, { "ui:field": "HiddenField" }, utils_1.uiSchemaJSONPointer(schema, field.replace("%{row}", "0"))), uiSchema);
37
+ const walkUiOrder = (schema, uiSchema, pathToShouldBeLast) => {
38
+ let [prop, ...next] = pathToShouldBeLast.split("/").filter(s => !utils_1.isEmptyString(s));
39
+ if (!prop) {
40
+ return uiSchema;
41
+ }
42
+ const nextPath = `/${next.join("/")}`;
43
+ const nextSchema = utils_1.parseSchemaFromFormDataPointer(schema, prop);
44
+ const nextUiSchema = utils_1.parseUiSchemaFromFormDataPointer(uiSchema, prop);
45
+ if (!isNaN(prop)) {
46
+ return Object.assign(Object.assign({}, uiSchema), { items: walkUiOrder(nextSchema, nextUiSchema, nextPath) });
47
+ }
48
+ if (schema.items && schema.items.properties) {
49
+ return Object.assign(Object.assign({}, uiSchema), { items: Object.assign(Object.assign({}, (uiSchema.items || {})), { [prop]: walkUiOrder(nextSchema, nextUiSchema, nextPath), "ui:order": ["*", prop] }) });
50
+ }
51
+ if (schema.properties) {
52
+ return Object.assign(Object.assign({}, uiSchema), { [prop]: walkUiOrder(nextSchema, nextUiSchema, nextPath), "ui:order": ["*", prop] });
53
+ }
54
+ };
55
+ const walkFieldTemplate = (schema, uiSchema = {}, template) => {
56
+ if (schema.items && schema.items.properties) {
57
+ return Object.assign(Object.assign({}, uiSchema), { items: walkFieldTemplate(schema.items, uiSchema.items, template) });
58
+ }
59
+ if (schema.properties) {
60
+ return Object.assign(Object.assign(Object.assign({}, uiSchema), { "ui:ObjectFieldTemplate": template }), Object.keys(schema.properties).reduce((props, prop) => (Object.assign(Object.assign({}, props), { [prop]: walkFieldTemplate(schema.properties[prop], uiSchema[prop], template) })), uiSchema.properties));
61
+ }
62
+ return uiSchema;
63
+ };
64
+ const InvisibleTitle = (props) => {
65
+ const uiSchema = Object.assign(Object.assign({}, (props.uiSchema || {})), { "ui:options": Object.assign(Object.assign({}, utils_1.getUiOptions(props.uiSchema)), { titleClassName: "hidden-title-text" }) });
66
+ return React.createElement(TitleField_1.default, Object.assign({}, props, { uiSchema: uiSchema }));
67
+ };
68
+ const NoLineBreakTitle = (props) => {
69
+ const uiSchema = Object.assign(Object.assign({}, (props.uiSchema || {})), { "ui:options": Object.assign(Object.assign({}, utils_1.getUiOptions(props.uiSchema)), { titleClassName: "no-line-break" }) });
70
+ return React.createElement(TitleField_1.default, Object.assign({}, props, { uiSchema: uiSchema }));
71
+ };
72
+ const invisibleStyle = { visibility: "hidden" };
73
+ let SectionArrayField = class SectionArrayField extends React.Component {
74
+ constructor(props) {
75
+ super(props);
76
+ // Assume that options don't change.
77
+ this.arrayKeyFunctions = _arrayKeyFunctions(getOptions(this.getUiOptions()));
78
+ }
79
+ static getName() { return "SectionArrayField"; }
80
+ getStateFromProps(props) {
81
+ const { uiSchema, schema, registry } = props;
82
+ const { sectionField, rowDefinerField } = getOptions(this.getUiOptions());
83
+ const formContext = Object.assign(Object.assign({}, props.formContext), { Label: () => null, this: this, originalUiSchema: uiSchema, errorSchema: props.errorSchema, errorsAsPopup: true });
84
+ let _uiSchema = hideFields(schema, Object.assign(Object.assign({}, uiSchema), { "ui:ArrayFieldTemplate": SectionArrayFieldTemplate }), [sectionField, rowDefinerField]);
85
+ const [containerPointer] = rowDefinerField.split("%{row}");
86
+ _uiSchema = utils_1.updateSafelyWithJSONPointer(_uiSchema, false, `/${utils_1.uiSchemaJSONPointer(schema, containerPointer)}/ui:options/removable`);
87
+ _uiSchema = utils_1.updateSafelyWithJSONPointer(_uiSchema, [{ fn: "add", className: "invisible" }], `/${utils_1.uiSchemaJSONPointer(schema, containerPointer)}/ui:options/buttons`);
88
+ _uiSchema = utils_1.updateSafelyWithJSONPointer(_uiSchema, containerArrayKeyFunctions, `/${utils_1.uiSchemaJSONPointer(schema, containerPointer)}/ui:options/arrayKeyFunctions`);
89
+ _uiSchema = walkFieldTemplate(schema, _uiSchema, NoLabelsObjectFieldTemplate);
90
+ //_uiSchema = updateSafelyWithJSONPointer(_uiSchema, {"ui:functions": [{"ui:field": "SingleItemArrayField"}, ...currentUiFunctions], ...contentUiSchema }, uiSchemaJSONPointer(schema, containerPointer));
91
+ _uiSchema = walkUiOrder(schema, _uiSchema, rowDefinerField.replace("%{row}", 0));
92
+ _uiSchema = utils_1.updateSafelyWithJSONPointer(_uiSchema, this.arrayKeyFunctions, "/ui:options/arrayKeyFunctions");
93
+ _uiSchema = utils_1.updateSafelyWithJSONPointer(_uiSchema, true, "/ui:options/keepPropFocusOnNavigate");
94
+ return {
95
+ uiSchema: _uiSchema,
96
+ formContext,
97
+ registry: Object.assign(Object.assign({}, registry), { formContext, templates: Object.assign(Object.assign({}, registry.templates), { TitleFieldTemplate: InvisibleTitle }) })
98
+ };
99
+ }
100
+ };
101
+ SectionArrayField.propTypes = {
102
+ uiSchema: PropTypes.shape({
103
+ "ui:options": PropTypes.shape({})
104
+ }),
105
+ schema: PropTypes.shape({
106
+ type: PropTypes.oneOf(["array"])
107
+ }).isRequired,
108
+ formData: PropTypes.array
109
+ };
110
+ SectionArrayField = __decorate([
111
+ VirtualSchemaField_1.default
112
+ ], SectionArrayField);
113
+ exports.default = SectionArrayField;
114
+ const Section = (_a) => {
115
+ var { children, style } = _a, rest = __rest(_a, ["children", "style"]);
116
+ return React.createElement("div", Object.assign({ style: style || { flexGrow: 1, width: 0, flexBasis: 0, minWidth: 1 } }, rest), children);
117
+ };
118
+ const emptyObj = {};
119
+ const doNothing = () => { };
120
+ const columnStyle = { display: "flex", flexDirection: "column" };
121
+ const SectionContent = ({ delete: _delete = React.createElement(components_1.DeleteButton, { style: invisibleStyle, className: "horizontally-centered", translations: emptyObj, onClick: doNothing }), sectionSum = React.createElement("strong", { style: invisibleStyle }, "hidden"), sectionLabel = React.createElement("legend", { style: invisibleStyle }, "hidden"), content }) => (React.createElement("div", { style: columnStyle },
122
+ _delete,
123
+ sectionSum,
124
+ sectionLabel,
125
+ content));
126
+ let SectionArrayFieldTemplate = class SectionArrayFieldTemplate extends React.Component {
127
+ constructor(props) {
128
+ super(props);
129
+ this.onFocuses = [];
130
+ this.getOnFocus = (i) => () => {
131
+ this.props.formContext.globals[`${this.props.idSchema.$id}.activeIdx`] = i + (utils_1.getUiOptions(this.props.uiSchema).startIdx || 0);
132
+ };
133
+ this.getElemsForRowIdx = (rowIdx) => {
134
+ const { rowValueField, rowDefinerField } = getOptions(utils_1.getUiOptions(this.props.uiSchema));
135
+ return [
136
+ `${this.props.idSchema.$id}_0_${utils_1.JSONPointerToId(rowDefinerField.replace("%{row}", rowIdx))}`,
137
+ ...this.props.formData.map((_, idx) => `${this.props.idSchema.$id}_${idx}_${utils_1.JSONPointerToId(rowValueField.replace("%{row}", rowIdx))}`)
138
+ ].map(id => document.getElementById(id));
139
+ };
140
+ this.onContainerFocus = (e) => {
141
+ const { id } = e.target;
142
+ const [rowIdx] = getIdxsFromId(this.props.idSchema, getOptions(utils_1.getUiOptions(this.props.uiSchema)), id);
143
+ if (rowIdx !== undefined) {
144
+ this.focusedRowIdx = rowIdx;
145
+ this.getElemsForRowIdx(rowIdx).forEach(elem => {
146
+ if (elem) {
147
+ elem.className += " input-highlight";
148
+ }
149
+ });
150
+ }
151
+ };
152
+ this.onContainerBlur = () => {
153
+ if (this.focusedRowIdx !== undefined) {
154
+ this.getElemsForRowIdx(this.focusedRowIdx).forEach(elem => {
155
+ if (elem) {
156
+ elem.className = elem.className.replace(" input-highlight", "");
157
+ }
158
+ });
159
+ }
160
+ };
161
+ this.getContainerElem = () => this.ref.current;
162
+ this.getAddButtonElem = () => {
163
+ return react_dom_1.findDOMNode(this.addButtonRef.current);
164
+ };
165
+ this.showAddSection = () => {
166
+ this.setState({ showAddSection: true }, () => {
167
+ setTimeout(() => {
168
+ react_dom_1.findDOMNode(this.sectionInputRef.current).focus();
169
+ });
170
+ });
171
+ };
172
+ this.hideAddSection = () => {
173
+ this.setState({ showAddSection: false, newSection: undefined });
174
+ };
175
+ this.getAddSectionPopup = () => {
176
+ const { translations } = this.props.formContext;
177
+ const { newSection = "" } = this.state;
178
+ const { Row, Col } = this.context.theme;
179
+ return (React.createElement("div", { className: "laji-form" },
180
+ React.createElement("div", null,
181
+ React.createElement("strong", null, translations.AddNewSection)),
182
+ React.createElement(Row, null,
183
+ React.createElement(Col, { xs: 3 },
184
+ React.createElement("label", { className: "row-height not-strong", htmlFor: `${this.props.idSchema.$id}-section-input` },
185
+ translations.Number,
186
+ ":")),
187
+ React.createElement(Col, { xs: 9 },
188
+ React.createElement("input", { className: "form-control", id: `${this.props.idSchema.$id}-section-input`, type: "text", value: newSection, onChange: this.onNewSectionChange, onKeyDown: this.onNewSectionKeyDown, ref: this.sectionInputRef }))),
189
+ React.createElement("div", null, translations.EnterNewSectionNumber),
190
+ React.createElement(components_1.Button, { disabled: !this.sectorIsValid(newSection), onClick: this.addSection }, translations.Add),
191
+ React.createElement(components_1.Button, { onClick: this.hideAddSection, variant: "default" }, translations.Cancel)));
192
+ };
193
+ this.sectorIsValid = (newSection) => {
194
+ const { sectionField } = getOptions(utils_1.getUiOptions(this.props.uiSchema));
195
+ const existingNumbers = this.props.formData.map(item => "" + utils_1.parseJSONPointer(item, sectionField));
196
+ return !(isNaN(parseInt(newSection)) || parseInt(newSection) < 0 || parseInt(newSection) > 50 || existingNumbers.includes(newSection));
197
+ };
198
+ this.onNewSectionChange = (e) => {
199
+ this.setState({ newSection: e.target.value.replace(/[^0-9/-]/g, "") });
200
+ };
201
+ this.onNewSectionKeyDown = (e) => {
202
+ if (e.key === "Enter") {
203
+ if (!this.sectorIsValid(this.state.newSection)) {
204
+ return;
205
+ }
206
+ this.addSection();
207
+ this.hideAddSection();
208
+ e.stopPropagation();
209
+ }
210
+ };
211
+ this.addSection = () => {
212
+ const { registry, formContext, uiSchema, schema } = this.props;
213
+ const { newSection } = this.state;
214
+ const { rowDefinerField, rowDefinerFields, sectionField } = getOptions(utils_1.getUiOptions(uiSchema));
215
+ const [containerPointer] = rowDefinerField.split("/%{row}");
216
+ const copiedRowDefinerData = (utils_1.parseJSONPointer(this.props.formData[0] || {}, containerPointer) || []).reduce((result, item, idx) => {
217
+ return [rowDefinerField, ...rowDefinerFields].reduce((_result, field) => {
218
+ const [_, parsedField] = field.split("/%{row}"); // eslint-disable-line @typescript-eslint/no-unused-vars
219
+ return utils_1.updateFormDataWithJSONPointer({
220
+ schema: schema.items,
221
+ formData: _result,
222
+ registry
223
+ }, utils_1.parseJSONPointer(item, parsedField), field.replace(/%{row}/g, idx));
224
+ }, result);
225
+ }, utils_1.getDefaultFormState(schema.items));
226
+ const tmpIdTree = formContext.services.ids.getRelativeTmpIdTree(this.props.idSchema.$id);
227
+ const _item = copiedRowDefinerData;
228
+ let [item] = utils_1.addLajiFormIds(_item, tmpIdTree, this.props.idSchema.$id);
229
+ item = utils_1.updateFormDataWithJSONPointer({ schema: schema.items, formData: item, registry }, parseInt(newSection), sectionField);
230
+ const items = [...this.props.formData, item];
231
+ const idx = items.findIndex(i => i === item);
232
+ const idToFocus = `${this.props.idSchema.$id}_${idx}`;
233
+ let { idToScrollAfterAdd = `${this.props.idSchema.$id}-add-section` } = utils_1.getUiOptions(uiSchema || {});
234
+ Context_1.default(formContext.contextId).idToFocus = idToFocus;
235
+ Context_1.default(formContext.contextId).idToScroll = idToScrollAfterAdd;
236
+ formContext.this.props.onChange(items);
237
+ this.hideAddSection();
238
+ };
239
+ this.onRowDefinerChange = formData => {
240
+ const { rowDefinerField, rowDefinerFields } = getOptions(utils_1.getUiOptions(this.props.uiSchema));
241
+ const [containerPointer] = rowDefinerField.split("%{row}");
242
+ const rowDefinerItemIdsToContainerIdxs = (utils_1.parseJSONPointer(this.props.formData[0] || {}, containerPointer) || []).reduce((map, item, idx) => {
243
+ map[utils_1.getUUID(item)] = idx;
244
+ return map;
245
+ }, {});
246
+ const tmpIdTree = this.props.formContext.services.ids.getRelativeTmpIdTree(`${this.props.idSchema.$id}_${utils_1.JSONPointerToId(containerPointer.substr(0, containerPointer.length - 1))}`);
247
+ const oldIds = utils_1.getAllLajiFormIdsDeeply(this.props.formData, tmpIdTree);
248
+ let ids = {};
249
+ const _formData = this.props.formData.map((item, containerIdx) => {
250
+ const items = utils_1.parseJSONPointer(formData, containerPointer).map((unit, idx) => {
251
+ let rowDefinerItem = utils_1.parseJSONPointer(item, `${containerPointer}/${rowDefinerItemIdsToContainerIdxs[utils_1.getUUID(unit)]}`);
252
+ if (!rowDefinerItem) {
253
+ // If container is first and it has UUID, it's an item added to the definer column. It has a UUID already, so
254
+ // we don't define it again, or else it will be rendered again and won't be autofocused properly.
255
+ const [_rowDefinerItem, _ids] = containerIdx === 0 && utils_1.getUUID(unit)
256
+ ? utils_1.addLajiFormIds(unit, tmpIdTree)
257
+ : utils_1.addLajiFormIds(this.props.formContext.utils.filterItemIdsDeeply(unit, this.props.idSchema.$id), tmpIdTree, false);
258
+ rowDefinerItem = _rowDefinerItem;
259
+ ids = Object.assign(Object.assign({}, ids), _ids);
260
+ }
261
+ const updatedUnit = [rowDefinerField, ...rowDefinerFields].reduce((updatedNewUnit, field) => {
262
+ const [_, contentPointer] = field.split("%{row}"); // eslint-disable-line @typescript-eslint/no-unused-vars
263
+ const pointer = field.replace("%{row}", idx);
264
+ const value = utils_1.parseJSONPointer(formData, pointer);
265
+ return utils_1.updateFormDataWithJSONPointer({
266
+ schema: utils_1.parseSchemaFromFormDataPointer(this.props.schema.items, containerPointer).items,
267
+ formData: updatedNewUnit,
268
+ registry: this.props.registry
269
+ }, value, contentPointer);
270
+ }, rowDefinerItem);
271
+ return utils_1.addLajiFormIds(updatedUnit, tmpIdTree, false)[0];
272
+ });
273
+ return utils_1.updateFormDataWithJSONPointer({
274
+ schema: this.props.schema.items,
275
+ formData: item,
276
+ registry: this.props.registry
277
+ }, items, containerPointer);
278
+ });
279
+ this.props.formContext.this.props.onChange(_formData);
280
+ Object.keys(oldIds).forEach(id => {
281
+ if (!ids[id]) {
282
+ this.props.formContext.services.submitHooks.remove(id);
283
+ }
284
+ });
285
+ };
286
+ this.addButtonRef = React.createRef();
287
+ this.sectionInputRef = React.createRef();
288
+ this.ref = React.createRef();
289
+ }
290
+ render() {
291
+ return (React.createElement("div", { style: { display: "flex", width: "100%" }, ref: this.ref, onFocus: this.onContainerFocus, onBlur: this.onContainerBlur, tabIndex: 0 },
292
+ React.createElement(Section, { key: "definer", style: { flexGrow: "initial", maxWidth: 200 }, id: `${this.props.idSchema.$id}-section-definer` }, this.renderRowDefinerColumn()),
293
+ this.renderSections(),
294
+ React.createElement(Section, { key: "sums", className: "bg-info", style: { maxWidth: 75 } }, this.renderRowDefinerSumColumn()),
295
+ React.createElement(Section, { key: "deletes", style: { flexGrow: "initial", maxWidth: 143 } }, this.renderRowDefinerDeleteColumn())));
296
+ }
297
+ renderRowDefinerColumn() {
298
+ const { formData, uiSchema, schema, registry } = this.props;
299
+ const { rowDefinerField, rowValueField, sectionField } = getOptions(utils_1.getUiOptions(uiSchema));
300
+ const [containerPointer] = rowDefinerField.split("/%{row}");
301
+ const { SchemaField } = this.props.registry.fields;
302
+ const { originalUiSchema } = this.props.formContext;
303
+ const _schema = schema.items;
304
+ const _formData = formData[0];
305
+ let __uiSchema = hideFields(schema, originalUiSchema, [rowValueField, sectionField]);
306
+ __uiSchema = utils_1.updateSafelyWithJSONPointer(__uiSchema.items, false, `${containerPointer}/ui:options/removable`);
307
+ __uiSchema = walkUiOrder(schema.items, __uiSchema, rowDefinerField.replace("%{row}", 0));
308
+ __uiSchema = walkFieldTemplate(schema.items, __uiSchema, RowDefinerObjectFieldTemplate);
309
+ __uiSchema = walkUiOrder(schema.items, __uiSchema, `${containerPointer}/0/identifications`);
310
+ const formContext = Object.assign(Object.assign({}, this.props.formContext), { rowDefinerField, sectionPointer: utils_1.idSchemaIdToJSONPointer(this.props.idSchema.$id) });
311
+ const idSchema = this.props.registry.schemaUtils.toIdSchema(this.props.schema.items, `${this.props.idSchema.$id}_0`);
312
+ const sectionLabel = (React.createElement(components_1.Affix, { className: "background", getContainer: this.getContainerElem, topOffset: this.props.formContext.topOffset, bottomOffset: this.props.formContext.bottomOffset },
313
+ React.createElement("legend", null, this.props.formContext.translations.Section)));
314
+ const sectionSum = React.createElement("strong", null, this.props.formContext.translations.SectionSum);
315
+ const content = (React.createElement(SchemaField, Object.assign({}, this.props, { schema: _schema, uiSchema: __uiSchema, formData: _formData, idSchema: idSchema, onChange: this.onRowDefinerChange, registry: Object.assign(Object.assign({}, registry), { formContext, templates: Object.assign(Object.assign({}, registry.templates), { TitleFieldTemplate: NoLineBreakTitle }) }), formContext: formContext, errorSchema: this.props.formContext.errorSchema[0] || {} })));
316
+ return React.createElement(SectionContent, { content: content, sectionLabel: sectionLabel, sectionSum: sectionSum });
317
+ }
318
+ renderSections() {
319
+ const { sectionField, rowValueField } = getOptions(utils_1.getUiOptions(this.props.uiSchema));
320
+ return (this.props.formData || []).map((item, idx) => {
321
+ if (!this.props.items[idx]) {
322
+ return null;
323
+ }
324
+ const { children, hasRemove, index, disabled, readonly, onDropIndexClick } = this.props.items[idx];
325
+ const del = hasRemove && (React.createElement(components_1.DeleteButton, { id: `${this.props.idSchema.$id}_${index}`, disabled: disabled || readonly, translations: this.props.formContext.translations, onClick: onDropIndexClick(index), className: "horizontally-centered" }));
326
+ const sectionLabel = (React.createElement(components_1.Affix, { className: index % 2 ? "background" : " darker", getContainer: this.getContainerElem, topOffset: this.props.formContext.topOffset, bottomOffset: this.props.formContext.bottomOffset },
327
+ React.createElement("legend", { className: "horizontally-centered" }, utils_1.parseJSONPointer(this.props.formData[index], sectionField))));
328
+ const [arr, field] = rowValueField.split("/%{row}");
329
+ const sum = (utils_1.parseJSONPointer(item, arr) || []).reduce((sum, item) => sum + (utils_1.parseJSONPointer(item, field) || 0), 0);
330
+ const sectionSum = (React.createElement("strong", { className: "horizontally-centered text-muted" }, sum));
331
+ return (React.createElement(Section, { onFocus: this.getOnFocus(idx), key: utils_1.getUUID(item), className: index % 2 ? undefined : "darker", id: `${this.props.idSchema.$id}_${idx}-section` },
332
+ React.createElement(SectionContent, { delete: del, sectionLabel: sectionLabel, sectionSum: sectionSum, content: children })));
333
+ });
334
+ }
335
+ renderRowDefinerDeleteColumn() {
336
+ const { schema, registry, formData } = this.props;
337
+ const { rowDefinerField, rowValueField, sectionField } = getOptions(utils_1.getUiOptions(this.props.uiSchema));
338
+ const [containerPointer] = rowDefinerField.split("/%{row}");
339
+ const { SchemaField } = this.props.registry.fields;
340
+ const { originalUiSchema } = this.props.formContext;
341
+ let _schema = schema.items;
342
+ const _formData = formData[0];
343
+ let __uiSchema = hideFields(schema, originalUiSchema, [rowValueField, sectionField]);
344
+ __uiSchema = utils_1.updateSafelyWithJSONPointer(__uiSchema, [{ fn: "add", className: "invisible" }], `/${utils_1.uiSchemaJSONPointer(schema, containerPointer)}/ui:options/buttons`);
345
+ __uiSchema = walkUiOrder(schema.items, __uiSchema.items, rowDefinerField.replace("%{row}", 0));
346
+ __uiSchema = walkFieldTemplate(schema.items, __uiSchema, InvisibleLabelObjectFieldTemplate);
347
+ const formContext = Object.assign(Object.assign({}, this.props.formContext), { containerPointer, sectionPointer: utils_1.idSchemaIdToJSONPointer(this.props.idSchema.$id) });
348
+ const { Overlay, Popover, Glyphicon } = this.context.theme;
349
+ const add = (React.createElement(React.Fragment, null,
350
+ React.createElement(components_1.Affix, { getContainer: this.getContainerElem, topOffset: this.props.formContext.topOffset, bottomOffset: this.props.formContext.bottomOffset },
351
+ React.createElement(components_1.Button, { id: `${this.props.idSchema.$id}-add`, onClick: this.showAddSection, style: { whiteSpace: "nowrap", padding: "3.5px 12px" }, ref: this.addButtonRef },
352
+ React.createElement(Glyphicon, { glyph: "plus" }),
353
+ " ",
354
+ this.props.formContext.translations.AddSection)),
355
+ (this.state || {}).showAddSection &&
356
+ React.createElement(Overlay, { show: true, placement: "left", rootClose: true, onHide: this.hideAddSection, target: this.getAddButtonElem },
357
+ React.createElement(Popover, { id: `${this.props.id}-show-add-section` }, this.getAddSectionPopup()))));
358
+ const delButtons = (React.createElement(SchemaField, Object.assign({}, this.props, { schema: _schema, uiSchema: __uiSchema, formData: _formData, onChange: this.onRowDefinerChange, registry: Object.assign(Object.assign({}, registry), { formContext, fields: Object.assign(Object.assign({}, registry.fields), { TitleFieldTemplate: InvisibleTitle }) }), formContext: formContext })));
359
+ return React.createElement(SectionContent, { delete: add, content: delButtons });
360
+ }
361
+ renderRowDefinerSumColumn() {
362
+ const { schema, registry, formData } = this.props;
363
+ const { rowDefinerField, rowDefinerFields, rowValueField, sectionField } = getOptions(utils_1.getUiOptions(this.props.uiSchema));
364
+ const [containerPointer, valueField] = rowValueField.split("/%{row}");
365
+ const { SchemaField } = this.props.registry.fields;
366
+ const { originalUiSchema } = this.props.formContext;
367
+ let _schema = utils_1.updateSafelyWithJSONPointer(schema.items, { type: "integer" }, `/properties/${containerPointer}/items/properties/sum`);
368
+ let _formData = formData[0];
369
+ const sums = formData.reduce((sums, item) => {
370
+ (utils_1.parseJSONPointer(item, containerPointer) || []).forEach((definerItem, idx) => {
371
+ sums[idx] = (sums[idx] || 0) + (utils_1.parseJSONPointer(definerItem, valueField) || 0);
372
+ });
373
+ return sums;
374
+ }, []);
375
+ sums.forEach((sum, idx) => {
376
+ _formData = utils_1.updateSafelyWithJSONPointer(_formData || {}, sum, `${containerPointer}/${idx}/sum`);
377
+ });
378
+ let containerUiSchema = Object.keys(utils_1.parseSchemaFromFormDataPointer(_schema, containerPointer).items.properties).reduce((uiSchema, field) => {
379
+ if (field === "sum") {
380
+ return uiSchema;
381
+ }
382
+ return Object.assign(Object.assign({}, uiSchema), { [field]: { "ui:field": "HiddenField" } });
383
+ }, utils_1.parseUiSchemaFromFormDataPointer(originalUiSchema, containerPointer).items);
384
+ let __uiSchema = utils_1.updateSafelyWithJSONPointer(originalUiSchema, containerUiSchema, `/items/${containerPointer}/items`);
385
+ __uiSchema = hideFields(schema, __uiSchema, [rowValueField, sectionField, rowDefinerField, ...rowDefinerFields]);
386
+ __uiSchema = utils_1.updateSafelyWithJSONPointer(__uiSchema.items, Object.assign(Object.assign({}, utils_1.parseJSONPointer(__uiSchema.items, `${containerPointer}/ui:options`)), { removable: false, buttons: [{ fn: "add", className: "invisible" }] }), `${containerPointer}/ui:options`);
387
+ __uiSchema = utils_1.updateSafelyWithJSONPointer(__uiSchema, {
388
+ "ui:widget": "PlainTextWidget",
389
+ "ui:options": { strong: true, centered: true }
390
+ }, `${containerPointer}/items/sum`);
391
+ __uiSchema = walkFieldTemplate(schema.items, __uiSchema, SumObjectFieldTemplate);
392
+ __uiSchema = walkUiOrder(schema.items, __uiSchema, rowDefinerField.replace("%{row}", 0));
393
+ const formContext = Object.assign(Object.assign({}, this.props.formContext), { containerPointer, sectionPointer: utils_1.idSchemaIdToJSONPointer(this.props.idSchema.$id), rowValueField,
394
+ rowDefinerField });
395
+ const sumLabel = (React.createElement(components_1.Affix, { getContainer: this.getContainerElem, topOffset: this.props.formContext.topOffset, bottomOffset: this.props.formContext.bottomOffset },
396
+ React.createElement("legend", { className: "bg-info horizontally-centered" }, this.props.formContext.translations.Sum)));
397
+ const content = (React.createElement(SchemaField, Object.assign({}, this.props, { schema: _schema, uiSchema: __uiSchema, formData: _formData, onChange: this.onRowDefinerChange, registry: Object.assign(Object.assign({}, registry), { formContext, fields: Object.assign(Object.assign({}, registry.fields), { TitleFieldTemplate: InvisibleTitle }) }), formContext: formContext })));
398
+ return React.createElement(SectionContent, { sectionLabel: sumLabel, content: content });
399
+ }
400
+ };
401
+ SectionArrayFieldTemplate.contextType = ReactContext_1.default;
402
+ SectionArrayFieldTemplate = __decorate([
403
+ ArrayFieldTemplate_1.handlesArrayKeys
404
+ ], SectionArrayFieldTemplate);
405
+ const withoutItemPointers = pointer => pointer.replace(/\/([0-9]+|%{row})/g, "");
406
+ const InvisibleLabelObjectFieldTemplate = (props) => {
407
+ const { containerPointer } = props.formContext;
408
+ const pointer = utils_1.idSchemaIdToJSONPointer(props.idSchema.$id);
409
+ const containerPointerWithoutItemPointers = withoutItemPointers(containerPointer);
410
+ const pointerWithoutItemPointers = withoutItemPointers(pointer);
411
+ return props.properties.map(prop => {
412
+ const propUiSchema = props.uiSchema[prop.name] || {};
413
+ if (propUiSchema["ui:field"] === "HiddenField" || propUiSchema["ui:widget"] === "HiddenWidget") {
414
+ return null;
415
+ }
416
+ if (containerPointerWithoutItemPointers.startsWith(pointerWithoutItemPointers.replace(props.formContext.sectionPointer, "") + "/" + prop.name)) {
417
+ return React.createElement(React.Fragment, { key: prop.name }, prop.content);
418
+ }
419
+ return React.createElement("div", { key: prop.name, className: "form-group row-height" },
420
+ React.createElement("label", null));
421
+ });
422
+ };
423
+ const SumObjectFieldTemplate = (props) => {
424
+ const { containerPointer } = props.formContext;
425
+ const pointer = utils_1.idSchemaIdToJSONPointer(props.idSchema.$id);
426
+ const containerPointerWithoutItemPointers = withoutItemPointers(containerPointer);
427
+ const pointerWithoutItemPointers = withoutItemPointers(pointer);
428
+ return props.properties.map(prop => {
429
+ const propUiSchema = props.uiSchema[prop.name] || {};
430
+ if (propUiSchema["ui:field"] === "HiddenField" || propUiSchema["ui:widget"] === "HiddenWidget") {
431
+ return null;
432
+ }
433
+ if ((containerPointerWithoutItemPointers.startsWith(pointerWithoutItemPointers.replace(props.formContext.sectionPointer, "") + "/" + prop.name))
434
+ || prop.name === "sum") {
435
+ return React.createElement(React.Fragment, { key: prop.name }, prop.content);
436
+ }
437
+ return React.createElement("div", { key: prop.name, className: "form-group row-height " + prop.name },
438
+ React.createElement("label", null));
439
+ });
440
+ };
441
+ const NoLabelsObjectFieldTemplate = (props) => {
442
+ return props.properties.map(prop => prop.content);
443
+ };
444
+ const RowDefinerObjectFieldTemplate = (props) => {
445
+ const pointer = utils_1.idSchemaIdToJSONPointer(props.idSchema.$id);
446
+ const rowDefinerFieldWithoutItemPointers = withoutItemPointers(props.formContext.rowDefinerField);
447
+ const pointerWithoutItemPointers = withoutItemPointers(pointer);
448
+ return props.properties.map(prop => {
449
+ const propUiSchema = props.uiSchema[prop.name] || {};
450
+ if (propUiSchema["ui:field"] === "HiddenField" || propUiSchema["ui:widget"] === "HiddenWidget") {
451
+ return null;
452
+ }
453
+ if ((rowDefinerFieldWithoutItemPointers.startsWith(pointerWithoutItemPointers.replace(props.formContext.sectionPointer, "") + "/" + prop.name))) {
454
+ return React.createElement(React.Fragment, { key: prop.name }, prop.content);
455
+ }
456
+ const title = (props.uiSchema[prop.name] || {})["ui:title"] || props.schema.properties[prop.name].title || prop.name;
457
+ return React.createElement("div", { key: prop.name, className: "form-group row-height" },
458
+ React.createElement("label", null, title));
459
+ });
460
+ };
461
+ const getIdxsFromId = (idSchema, options, _id) => {
462
+ const { rowDefinerField } = options;
463
+ const id = idSchema.$id;
464
+ const sectionIdx = _id.match(new RegExp(`${id}_(\\d+)`))
465
+ && !_id.match(new RegExp(`${id}_\\d+_${utils_1.JSONPointerToId(rowDefinerField.replace("%{row}", "\\d+"))}`))
466
+ ? +_id.match(new RegExp(`${id}_(\\d+)`))[1]
467
+ : undefined;
468
+ const [containerPointer] = rowDefinerField.split("%{row}");
469
+ const horizontalIdx = _id.match(new RegExp(`${id}_\\d+_${utils_1.JSONPointerToId(containerPointer)}`))
470
+ ? +_id.match(new RegExp(`${id}_\\d+_${utils_1.JSONPointerToId(containerPointer)}(\\d+)`))[1]
471
+ : undefined;
472
+ return [horizontalIdx, sectionIdx];
473
+ };
474
+ const _arrayKeyFunctions = options => {
475
+ const keyFunctions = Object.assign(Object.assign({}, ArrayFieldTemplate_1.arrayKeyFunctions), { insert: (e, props) => {
476
+ document.getElementById(`${props.getProps().idSchema.$id}-add`).click();
477
+ }, navigateSection: (e, { getProps, left, right, up, goOverRow }) => {
478
+ const { rowDefinerField, rowValueField } = options;
479
+ const currentId = getProps().formContext.utils.findNearestParentSchemaElemId(document.activeElement);
480
+ const amount = left || up ? -1 : 1;
481
+ const id = getProps().idSchema.$id;
482
+ let nextId;
483
+ const [currentRow, currentSection] = getIdxsFromId(getProps().idSchema, options, currentId);
484
+ if (currentRow === undefined && currentSection === undefined) {
485
+ return false;
486
+ }
487
+ const getNonRowSectionFieldsForSectionIdx = sectionIdx => {
488
+ let tabbable = utils_1.getTabbableFields(document.getElementById(`${id}_${sectionIdx}-section`));
489
+ return tabbable.filter(elem => {
490
+ return !elem.id.match(new RegExp(utils_1.JSONPointerToId(rowValueField.replace("%{row}", "\\d+"))));
491
+ });
492
+ };
493
+ const goOverToNonRowLogic = (currentProp, reverse = true, last = true) => {
494
+ let tabbableInSection = utils_1.getTabbableFields(document.getElementById(`${id}_${last ? getProps().formData.length - 1 : 0}-section`));
495
+ if (reverse) {
496
+ tabbableInSection = tabbableInSection.reverse();
497
+ }
498
+ let currentPropEncountered = false;
499
+ const elem = tabbableInSection.find(elem => {
500
+ if (!elem.id.match(new RegExp(utils_1.JSONPointerToId(rowValueField.replace("%{row}", "\\d+"))))) {
501
+ if (!currentProp || currentPropEncountered) {
502
+ return elem;
503
+ }
504
+ if (elem.id.match(currentProp)) {
505
+ currentPropEncountered = true;
506
+ }
507
+ }
508
+ });
509
+ nextId = getProps().formContext.utils.findNearestParentSchemaElemId(elem);
510
+ };
511
+ if (left || right) {
512
+ // Horizontal navigation from row definer column to row value column.
513
+ if (right && currentSection === undefined) {
514
+ const idSuffix = utils_1.JSONPointerToId(rowValueField.replace("%{row}", currentRow));
515
+ nextId = `${id}_0_${idSuffix}`;
516
+ // Horizontal navigation from row value column to row definer column.
517
+ }
518
+ else if (left && currentSection === 0 && currentRow !== undefined) {
519
+ const idSuffix = utils_1.JSONPointerToId(rowDefinerField.replace("%{row}", currentRow));
520
+ nextId = `${id}_${currentSection}_${idSuffix}`;
521
+ // Horizontal navigation to next/prev row if goOverRow.
522
+ }
523
+ else if (right && currentSection === getProps().formData.length - 1) {
524
+ if (!goOverRow) {
525
+ return false;
526
+ }
527
+ // Horizontal navigation inside row matrix.
528
+ if (currentRow !== undefined) {
529
+ const idSuffix = utils_1.JSONPointerToId(rowDefinerField.replace("%{row}", currentRow + 1));
530
+ nextId = `${id}_${0}_${idSuffix}`;
531
+ }
532
+ else {
533
+ let tabbableInSection = getNonRowSectionFieldsForSectionIdx(getProps().formData.length - 1);
534
+ // Horizontal navigation inside non row section field.
535
+ if (currentId === getProps().formContext.utils.findNearestParentSchemaElemId(tabbableInSection[tabbableInSection.length - 1])) {
536
+ nextId = `${id}_0_${utils_1.JSONPointerToId(rowDefinerField.replace("%{row}", 0))}`;
537
+ // Horizontal navigation from non row section to row field.
538
+ }
539
+ else {
540
+ const currentProp = currentId.match(`${id}_${currentSection}_(.+)`)[1];
541
+ goOverToNonRowLogic(currentProp, false, false);
542
+ }
543
+ }
544
+ }
545
+ else if (left && currentSection === undefined) {
546
+ if (goOverRow) {
547
+ // Horizontal navigation from row field to non row section field.
548
+ if (currentRow === 0) {
549
+ goOverToNonRowLogic();
550
+ // Horizontal navigation inside row value fields.
551
+ }
552
+ else {
553
+ const idSuffix = utils_1.JSONPointerToId(rowValueField.replace("%{row}", currentRow - 1));
554
+ nextId = `${id}_${getProps().formData.length - 1}_${idSuffix}`;
555
+ }
556
+ }
557
+ // Horizontal navigation inside non row section fields.
558
+ }
559
+ else if (left && currentRow === undefined && currentSection === 0) {
560
+ if (goOverRow) {
561
+ const currentProp = currentId.match(`${id}_${currentSection}_(.+)`)[1];
562
+ goOverToNonRowLogic(currentProp);
563
+ }
564
+ // Horizontal navigation inside value matrix.
565
+ }
566
+ else {
567
+ const [idPrefix] = currentId.match(new RegExp(`${id}_(\\d+)`));
568
+ const idSuffix = currentId.replace(`${idPrefix}_`, "");
569
+ nextId = `${id}_${+currentSection + amount}_${idSuffix}`;
570
+ }
571
+ }
572
+ else {
573
+ // Vertical navigation.
574
+ const containerId = currentSection !== undefined
575
+ ? `${id}_${currentSection}-section`
576
+ : `${id}-section-definer`;
577
+ const tabbableOutsideContainer = utils_1.getTabbableFields(document.getElementById(containerId));
578
+ const tabbableIdx = tabbableOutsideContainer.findIndex(e => e === document.activeElement);
579
+ nextId = getProps().formContext.utils.findNearestParentSchemaElemId(tabbableOutsideContainer[tabbableIdx + amount]);
580
+ if (nextId === "root") {
581
+ return true;
582
+ }
583
+ }
584
+ getProps().formContext.utils.focusAndScroll(nextId);
585
+ } });
586
+ keyFunctions.navigate = (e, props) => {
587
+ const { getProps, reverse } = props;
588
+ const id = getProps().idSchema.$id;
589
+ if (!reverse) {
590
+ const lastSectionElems = utils_1.getTabbableFields(document.getElementById(`${id}_${getProps().formData.length - 1}-section`));
591
+ const lastElem = lastSectionElems[lastSectionElems.length - 1];
592
+ if (document.activeElement === lastElem) {
593
+ return false;
594
+ }
595
+ }
596
+ else {
597
+ const { rowDefinerField } = options;
598
+ const firstElem = utils_1.getTabbableFields(document.getElementById(`${id}_0-section`))[0];
599
+ if (document.activeElement === firstElem) {
600
+ const allTabbableFields = utils_1.getTabbableFields(react_dom_1.findDOMNode(getProps().formContext.formRef.current));
601
+ const matcher = new RegExp(utils_1.JSONPointerToId(rowDefinerField.replace("%{row}", "\\d+")));
602
+ const allTabbableFieldsWithoutRowDefinerInputs = allTabbableFields.filter(f => !f.id.match(matcher));
603
+ const input = getProps().formContext.utils.getNextInputInInputs(undefined, true, allTabbableFieldsWithoutRowDefinerInputs);
604
+ if (input) {
605
+ input.focus();
606
+ }
607
+ return true;
608
+ }
609
+ }
610
+ return keyFunctions.navigateSection(e, Object.assign(Object.assign({}, props), { right: !props.reverse, left: props.reverse, goOverRow: true }));
611
+ };
612
+ return keyFunctions;
613
+ };
614
+ const containerArrayKeyFunctions = Object.assign(Object.assign({}, ArrayFieldTemplate_1.arrayKeyFunctions), {
615
+ // Disable insert, insert should bubble to section adding.
616
+ insert: () => {
617
+ return false;
618
+ } });