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