@luomus/laji-form 15.0.0 → 15.1.1

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 (297) hide show
  1. package/CHANGELOG.md +0 -4
  2. package/dist/laji-form.js +1 -1
  3. package/dist/styles.css +81 -90
  4. package/jsonconfig.json +26 -0
  5. package/migrate.sh +0 -1
  6. package/package.json +8 -8
  7. package/test-export/array-spec.js +204 -0
  8. package/test-export/bird-point-count-spec.d.ts +1 -0
  9. package/test-export/bird-point-count-spec.js +62 -0
  10. package/test-export/collection-contest-form-spec.d.ts +1 -0
  11. package/test-export/collection-contest-form-spec.js +38 -0
  12. package/test-export/dataset-form-spec.d.ts +1 -0
  13. package/test-export/dataset-form-spec.js +50 -0
  14. package/test-export/date-time-widget-spec.d.ts +1 -0
  15. package/test-export/date-time-widget-spec.js +188 -0
  16. package/test-export/geocoder-spec.d.ts +1 -0
  17. package/test-export/geocoder-spec.js +135 -0
  18. package/test-export/image-array-spec.d.ts +1 -0
  19. package/test-export/image-array-spec.js +94 -0
  20. package/test-export/inject-field-spec.d.ts +1 -0
  21. package/test-export/inject-field-spec.js +148 -0
  22. package/test-export/internal-uuids-spec.d.ts +1 -0
  23. package/test-export/internal-uuids-spec.js +157 -0
  24. package/test-export/invasive-species-eradication-np-spec.d.ts +1 -0
  25. package/test-export/invasive-species-eradication-np-spec.js +18 -0
  26. package/test-export/invasive-species-eradication-spec.d.ts +1 -0
  27. package/test-export/invasive-species-eradication-spec.js +25 -0
  28. package/test-export/line-transect-spec.d.ts +1 -0
  29. package/test-export/line-transect-spec.js +121 -0
  30. package/test-export/mobile-form-spec.d.ts +1 -0
  31. package/test-export/mobile-form-spec.js +84 -0
  32. package/test-export/nafi-spec.d.ts +1 -0
  33. package/test-export/nafi-spec.js +85 -0
  34. package/test-export/select-widget-spec.d.ts +1 -0
  35. package/test-export/select-widget-spec.js +68 -0
  36. package/test-export/single-item-array-field-spec.d.ts +1 -0
  37. package/test-export/single-item-array-field-spec.js +92 -0
  38. package/test-export/syke-butterfly-spec.d.ts +1 -0
  39. package/test-export/syke-butterfly-spec.js +163 -0
  40. package/test-export/test-utils.d.ts +150 -176
  41. package/test-export/test-utils.js +218 -210
  42. package/test-export/transaction-form-spec.d.ts +1 -0
  43. package/test-export/transaction-form-spec.js +63 -0
  44. package/test-export/trip-report-autosuggest-spec.d.ts +1 -0
  45. package/test-export/trip-report-autosuggest-spec.js +272 -0
  46. package/test-export/trip-report-spec.d.ts +1 -0
  47. package/test-export/trip-report-spec.js +456 -0
  48. package/test-export/unit-list-shorthand-array-field-spec.d.ts +1 -0
  49. package/test-export/unit-list-shorthand-array-field-spec.js +71 -0
  50. package/test-export/validation-spec.d.ts +1 -0
  51. package/test-export/validation-spec.js +336 -0
  52. package/test-export/water-bird-spec.d.ts +1 -0
  53. package/test-export/water-bird-spec.js +30 -0
  54. package/test-export/wbc-spec.d.ts +1 -0
  55. package/test-export/wbc-spec.js +82 -0
  56. package/tsconfig.test.json +1 -1
  57. package/xsel -b +9 -0
  58. package/cypress/fixtures/example.json +0 -5
  59. package/cypress/screenshots/nafi.cy.ts/NAFI (MHL.6) -- selecting species name with keyboard navigation -- and closes suggestion list (failed).png +0 -0
  60. package/cypress/screenshots/nafi.cy.ts/NAFI (MHL.6) -- selecting species name with keyboard navigation -- and is marked as suggested (failed).png +0 -0
  61. package/lib/ApiClient.d.ts +0 -46
  62. package/lib/ApiClient.js +0 -93
  63. package/lib/Context.d.ts +0 -8
  64. package/lib/Context.js +0 -18
  65. package/lib/ReactContext.d.ts +0 -7
  66. package/lib/ReactContext.js +0 -5
  67. package/lib/components/BaseComponent.d.ts +0 -9
  68. package/lib/components/BaseComponent.js +0 -29
  69. package/lib/components/LajiForm.d.ts +0 -221
  70. package/lib/components/LajiForm.js +0 -615
  71. package/lib/components/VirtualSchemaField.d.ts +0 -42
  72. package/lib/components/VirtualSchemaField.js +0 -74
  73. package/lib/components/components.d.ts +0 -119
  74. package/lib/components/components.js +0 -606
  75. package/lib/components/fields/AnnotationField.d.ts +0 -34
  76. package/lib/components/fields/AnnotationField.js +0 -242
  77. package/lib/components/fields/AnyToBooleanField.d.ts +0 -18
  78. package/lib/components/fields/AnyToBooleanField.js +0 -20
  79. package/lib/components/fields/ArrayBulkField.d.ts +0 -23
  80. package/lib/components/fields/ArrayBulkField.js +0 -82
  81. package/lib/components/fields/ArrayCombinerField.d.ts +0 -36
  82. package/lib/components/fields/ArrayCombinerField.js +0 -138
  83. package/lib/components/fields/ArrayField.d.ts +0 -39
  84. package/lib/components/fields/ArrayField.js +0 -148
  85. package/lib/components/fields/AudioArrayField.d.ts +0 -22
  86. package/lib/components/fields/AudioArrayField.js +0 -100
  87. package/lib/components/fields/AutoArrayField.d.ts +0 -24
  88. package/lib/components/fields/AutoArrayField.js +0 -56
  89. package/lib/components/fields/AutosuggestField.d.ts +0 -69
  90. package/lib/components/fields/AutosuggestField.js +0 -299
  91. package/lib/components/fields/CombinedValueDisplayField.d.ts +0 -41
  92. package/lib/components/fields/CombinedValueDisplayField.js +0 -100
  93. package/lib/components/fields/ConditionalOnChangeField.d.ts +0 -42
  94. package/lib/components/fields/ConditionalOnChangeField.js +0 -107
  95. package/lib/components/fields/ConditionalUiSchemaField.d.ts +0 -123
  96. package/lib/components/fields/ConditionalUiSchemaField.js +0 -143
  97. package/lib/components/fields/ContextInjectionField.d.ts +0 -24
  98. package/lib/components/fields/ContextInjectionField.js +0 -68
  99. package/lib/components/fields/DataLeakerField.d.ts +0 -40
  100. package/lib/components/fields/DataLeakerField.js +0 -68
  101. package/lib/components/fields/DefaultValueArrayField.d.ts +0 -34
  102. package/lib/components/fields/DefaultValueArrayField.js +0 -59
  103. package/lib/components/fields/DependentBooleanField.d.ts +0 -38
  104. package/lib/components/fields/DependentBooleanField.js +0 -87
  105. package/lib/components/fields/DependentDisableField.d.ts +0 -35
  106. package/lib/components/fields/DependentDisableField.js +0 -71
  107. package/lib/components/fields/EnumRangeArrayField.d.ts +0 -27
  108. package/lib/components/fields/EnumRangeArrayField.js +0 -115
  109. package/lib/components/fields/ExtraLabelRowField.d.ts +0 -38
  110. package/lib/components/fields/ExtraLabelRowField.js +0 -100
  111. package/lib/components/fields/FakePropertyField.d.ts +0 -18
  112. package/lib/components/fields/FakePropertyField.js +0 -48
  113. package/lib/components/fields/FilterArrayField.d.ts +0 -73
  114. package/lib/components/fields/FilterArrayField.js +0 -121
  115. package/lib/components/fields/FlatField.d.ts +0 -29
  116. package/lib/components/fields/FlatField.js +0 -171
  117. package/lib/components/fields/GeocoderField.d.ts +0 -47
  118. package/lib/components/fields/GeocoderField.js +0 -372
  119. package/lib/components/fields/GridLayoutField.d.ts +0 -18
  120. package/lib/components/fields/GridLayoutField.js +0 -32
  121. package/lib/components/fields/HiddenField.d.ts +0 -10
  122. package/lib/components/fields/HiddenField.js +0 -11
  123. package/lib/components/fields/ImageArrayField.d.ts +0 -172
  124. package/lib/components/fields/ImageArrayField.js +0 -697
  125. package/lib/components/fields/ImageDisplayField.d.ts +0 -18
  126. package/lib/components/fields/ImageDisplayField.js +0 -44
  127. package/lib/components/fields/InitiallyHiddenField.d.ts +0 -21
  128. package/lib/components/fields/InitiallyHiddenField.js +0 -58
  129. package/lib/components/fields/InjectDefaultValueField.d.ts +0 -37
  130. package/lib/components/fields/InjectDefaultValueField.js +0 -68
  131. package/lib/components/fields/InjectField.d.ts +0 -46
  132. package/lib/components/fields/InjectField.js +0 -88
  133. package/lib/components/fields/InputWithDefaultValueButtonField.d.ts +0 -25
  134. package/lib/components/fields/InputWithDefaultValueButtonField.js +0 -61
  135. package/lib/components/fields/LocalityField.d.ts +0 -22
  136. package/lib/components/fields/LocalityField.js +0 -94
  137. package/lib/components/fields/LocationChooserField.d.ts +0 -27
  138. package/lib/components/fields/LocationChooserField.js +0 -440
  139. package/lib/components/fields/MapArrayField.d.ts +0 -78
  140. package/lib/components/fields/MapArrayField.js +0 -1783
  141. package/lib/components/fields/MapField.d.ts +0 -48
  142. package/lib/components/fields/MapField.js +0 -434
  143. package/lib/components/fields/MultiAnyToBooleanField.d.ts +0 -25
  144. package/lib/components/fields/MultiAnyToBooleanField.js +0 -100
  145. package/lib/components/fields/MultiArrayField.d.ts +0 -53
  146. package/lib/components/fields/MultiArrayField.js +0 -224
  147. package/lib/components/fields/MultiLanguageField.d.ts +0 -13
  148. package/lib/components/fields/MultiLanguageField.js +0 -52
  149. package/lib/components/fields/MultiTagArrayField.d.ts +0 -36
  150. package/lib/components/fields/MultiTagArrayField.js +0 -142
  151. package/lib/components/fields/NamedPlaceChooserField.d.ts +0 -29
  152. package/lib/components/fields/NamedPlaceChooserField.js +0 -380
  153. package/lib/components/fields/NamedPlaceSaverField.d.ts +0 -29
  154. package/lib/components/fields/NamedPlaceSaverField.js +0 -237
  155. package/lib/components/fields/NestField.d.ts +0 -148
  156. package/lib/components/fields/NestField.js +0 -289
  157. package/lib/components/fields/ObjectField.d.ts +0 -2
  158. package/lib/components/fields/ObjectField.js +0 -119
  159. package/lib/components/fields/PdfArrayField.d.ts +0 -21
  160. package/lib/components/fields/PdfArrayField.js +0 -40
  161. package/lib/components/fields/PrefillingArrayField.d.ts +0 -22
  162. package/lib/components/fields/PrefillingArrayField.js +0 -65
  163. package/lib/components/fields/SchemaField.d.ts +0 -7
  164. package/lib/components/fields/SchemaField.js +0 -109
  165. package/lib/components/fields/ScopeField.d.ts +0 -85
  166. package/lib/components/fields/ScopeField.js +0 -521
  167. package/lib/components/fields/SectionArrayField.d.ts +0 -38
  168. package/lib/components/fields/SectionArrayField.js +0 -618
  169. package/lib/components/fields/SelectTreeField.d.ts +0 -39
  170. package/lib/components/fields/SelectTreeField.js +0 -143
  171. package/lib/components/fields/SingleActiveArrayField.d.ts +0 -49
  172. package/lib/components/fields/SingleActiveArrayField.js +0 -974
  173. package/lib/components/fields/SingleItemArrayField.d.ts +0 -15
  174. package/lib/components/fields/SingleItemArrayField.js +0 -60
  175. package/lib/components/fields/SortArrayField.d.ts +0 -73
  176. package/lib/components/fields/SortArrayField.js +0 -351
  177. package/lib/components/fields/SplitField.d.ts +0 -28
  178. package/lib/components/fields/SplitField.js +0 -65
  179. package/lib/components/fields/StringToArrayField.d.ts +0 -24
  180. package/lib/components/fields/StringToArrayField.js +0 -48
  181. package/lib/components/fields/SumField.d.ts +0 -35
  182. package/lib/components/fields/SumField.js +0 -83
  183. package/lib/components/fields/TableField.d.ts +0 -18
  184. package/lib/components/fields/TableField.js +0 -136
  185. package/lib/components/fields/TagArrayField.d.ts +0 -38
  186. package/lib/components/fields/TagArrayField.js +0 -128
  187. package/lib/components/fields/ToggleAdditionalArrayFieldsField.d.ts +0 -26
  188. package/lib/components/fields/ToggleAdditionalArrayFieldsField.js +0 -81
  189. package/lib/components/fields/UiFieldApplierField.d.ts +0 -30
  190. package/lib/components/fields/UiFieldApplierField.js +0 -106
  191. package/lib/components/fields/UiFieldMapperArrayField.d.ts +0 -42
  192. package/lib/components/fields/UiFieldMapperArrayField.js +0 -121
  193. package/lib/components/fields/UnitCountShorthandField.d.ts +0 -22
  194. package/lib/components/fields/UnitCountShorthandField.js +0 -149
  195. package/lib/components/fields/UnitListShorthandArrayField.d.ts +0 -26
  196. package/lib/components/fields/UnitListShorthandArrayField.js +0 -108
  197. package/lib/components/fields/UnitShorthandField.d.ts +0 -32
  198. package/lib/components/fields/UnitShorthandField.js +0 -220
  199. package/lib/components/templates/ArrayFieldTemplate.d.ts +0 -85
  200. package/lib/components/templates/ArrayFieldTemplate.js +0 -417
  201. package/lib/components/templates/BaseInputTemplate.d.ts +0 -11
  202. package/lib/components/templates/BaseInputTemplate.js +0 -80
  203. package/lib/components/templates/DescriptionField.d.ts +0 -1
  204. package/lib/components/templates/DescriptionField.js +0 -37
  205. package/lib/components/templates/ErrorListTemplate.d.ts +0 -9
  206. package/lib/components/templates/ErrorListTemplate.js +0 -95
  207. package/lib/components/templates/FieldTemplate.d.ts +0 -6
  208. package/lib/components/templates/FieldTemplate.js +0 -112
  209. package/lib/components/templates/ObjectFieldTemplate.d.ts +0 -7
  210. package/lib/components/templates/ObjectFieldTemplate.js +0 -66
  211. package/lib/components/templates/TitleField.d.ts +0 -9
  212. package/lib/components/templates/TitleField.js +0 -51
  213. package/lib/components/widgets/AnyToBooleanWidget.d.ts +0 -20
  214. package/lib/components/widgets/AnyToBooleanWidget.js +0 -49
  215. package/lib/components/widgets/AutosuggestWidget.d.ts +0 -66
  216. package/lib/components/widgets/AutosuggestWidget.js +0 -1127
  217. package/lib/components/widgets/CheckboxWidget.d.ts +0 -37
  218. package/lib/components/widgets/CheckboxWidget.js +0 -139
  219. package/lib/components/widgets/DateTimeWidget.d.ts +0 -62
  220. package/lib/components/widgets/DateTimeWidget.js +0 -251
  221. package/lib/components/widgets/DateWidget.d.ts +0 -23
  222. package/lib/components/widgets/DateWidget.js +0 -41
  223. package/lib/components/widgets/HiddenWidget.d.ts +0 -15
  224. package/lib/components/widgets/HiddenWidget.js +0 -19
  225. package/lib/components/widgets/ImageSelectWidget.d.ts +0 -14
  226. package/lib/components/widgets/ImageSelectWidget.js +0 -57
  227. package/lib/components/widgets/InformalTaxonGroupChooserWidget.d.ts +0 -43
  228. package/lib/components/widgets/InformalTaxonGroupChooserWidget.js +0 -237
  229. package/lib/components/widgets/InputGroupWidget.d.ts +0 -21
  230. package/lib/components/widgets/InputGroupWidget.js +0 -36
  231. package/lib/components/widgets/InputWithDefaultValueButtonWidget.d.ts +0 -21
  232. package/lib/components/widgets/InputWithDefaultValueButtonWidget.js +0 -47
  233. package/lib/components/widgets/NumberWidget.d.ts +0 -13
  234. package/lib/components/widgets/NumberWidget.js +0 -21
  235. package/lib/components/widgets/PlainTextWidget.d.ts +0 -12
  236. package/lib/components/widgets/PlainTextWidget.js +0 -24
  237. package/lib/components/widgets/SelectWidget.d.ts +0 -52
  238. package/lib/components/widgets/SelectWidget.js +0 -158
  239. package/lib/components/widgets/SeparatedDateTimeWidget.d.ts +0 -19
  240. package/lib/components/widgets/SeparatedDateTimeWidget.js +0 -59
  241. package/lib/components/widgets/TaxonImageWidget.d.ts +0 -13
  242. package/lib/components/widgets/TaxonImageWidget.js +0 -30
  243. package/lib/components/widgets/TextSelectWidget.d.ts +0 -25
  244. package/lib/components/widgets/TextSelectWidget.js +0 -94
  245. package/lib/components/widgets/TextareaWidget.d.ts +0 -32
  246. package/lib/components/widgets/TextareaWidget.js +0 -87
  247. package/lib/components/widgets/TimeWidget.d.ts +0 -11
  248. package/lib/components/widgets/TimeWidget.js +0 -19
  249. package/lib/components/widgets/URLWidget.d.ts +0 -14
  250. package/lib/components/widgets/URLWidget.js +0 -12
  251. package/lib/components/widgets/UpperCaseWidget.d.ts +0 -13
  252. package/lib/components/widgets/UpperCaseWidget.js +0 -21
  253. package/lib/index.d.ts +0 -20
  254. package/lib/index.js +0 -50
  255. package/lib/services/blocker-service.d.ts +0 -11
  256. package/lib/services/blocker-service.js +0 -55
  257. package/lib/services/custom-event-service.d.ts +0 -17
  258. package/lib/services/custom-event-service.js +0 -35
  259. package/lib/services/dom-id-service.d.ts +0 -8
  260. package/lib/services/dom-id-service.js +0 -30
  261. package/lib/services/focus-service.d.ts +0 -13
  262. package/lib/services/focus-service.js +0 -60
  263. package/lib/services/id-service.d.ts +0 -22
  264. package/lib/services/id-service.js +0 -130
  265. package/lib/services/key-handler-service.d.ts +0 -56
  266. package/lib/services/key-handler-service.js +0 -184
  267. package/lib/services/root-instance-service.d.ts +0 -25
  268. package/lib/services/root-instance-service.js +0 -49
  269. package/lib/services/settings-service.d.ts +0 -34
  270. package/lib/services/settings-service.js +0 -154
  271. package/lib/services/singleton-map-service.d.ts +0 -23
  272. package/lib/services/singleton-map-service.js +0 -44
  273. package/lib/services/submit-hook-service.d.ts +0 -24
  274. package/lib/services/submit-hook-service.js +0 -73
  275. package/lib/styles.js +0 -4
  276. package/lib/themes/bs3.d.ts +0 -3
  277. package/lib/themes/bs3.js +0 -133
  278. package/lib/themes/bs5.d.ts +0 -3
  279. package/lib/themes/bs5.js +0 -111
  280. package/lib/themes/glyphicon-fa-mapping.d.ts +0 -3
  281. package/lib/themes/glyphicon-fa-mapping.js +0 -271
  282. package/lib/themes/stub.d.ts +0 -3
  283. package/lib/themes/stub.js +0 -82
  284. package/lib/themes/theme.d.ts +0 -233
  285. package/lib/themes/theme.js +0 -2
  286. package/lib/translations.json +0 -847
  287. package/lib/utils.d.ts +0 -171
  288. package/lib/utils.js +0 -1191
  289. package/lib/validation.d.ts +0 -7
  290. package/lib/validation.js +0 -141
  291. package/llol +0 -10
  292. package/llol.pdf +0 -10
  293. package/playwright-report/index.html +0 -62
  294. package/q +0 -196
  295. package/rename.sh +0 -24
  296. package/trip-report.spec.ts +0 -594
  297. /package/{lib/styles.d.ts → test-export/array-spec.d.ts} +0 -0
@@ -0,0 +1,336 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const test_utils_1 = require("./test-utils");
13
+ const properties = require("../properties.json");
14
+ describe("Validations", () => {
15
+ let form;
16
+ // Uncomment when https://github.com/rjsf-team/react-jsonschema-form/pull/1528 is merged.
17
+ //beforeAll(async () => {
18
+ beforeEach(() => __awaiter(void 0, void 0, void 0, function* () {
19
+ form = yield test_utils_1.createForm();
20
+ }));
21
+ const schema = {
22
+ type: "object",
23
+ properties: {
24
+ a: {
25
+ type: "string"
26
+ },
27
+ b: {
28
+ type: "string"
29
+ }
30
+ },
31
+ };
32
+ const formData = { b: "bar" };
33
+ const message = "foo";
34
+ const getCustom = (message = "foo", live) => ({
35
+ a: {
36
+ presence: {
37
+ message,
38
+ options: {
39
+ _live: live
40
+ }
41
+ }
42
+ }
43
+ });
44
+ it("pass on no errors", () => __awaiter(void 0, void 0, void 0, function* () {
45
+ yield form.setState({ schema, formData });
46
+ yield form.submit();
47
+ expect(yield form.getSubmittedData()).toEqual(formData);
48
+ }));
49
+ it("fail on schema errors", () => __awaiter(void 0, void 0, void 0, function* () {
50
+ yield form.setState({ schema: Object.assign(Object.assign({}, schema), { required: ["a"] }), formData });
51
+ yield form.submit();
52
+ expect(yield form.getSubmittedData()).not.toEqual(formData);
53
+ expect(yield form.errors.$$all.count()).toBe(1);
54
+ }));
55
+ it("doesn't run schema validators before submitted", () => __awaiter(void 0, void 0, void 0, function* () {
56
+ const _formData = Object.assign(Object.assign({}, formData), { a: "foo" });
57
+ yield form.setState({ schema: Object.assign(Object.assign({}, schema), { required: ["a"] }), formData: _formData });
58
+ yield test_utils_1.updateValue(form.$getInputWidget("a"), "");
59
+ expect(yield form.errors.$$all.count()).toBe(0);
60
+ yield form.submit();
61
+ expect(yield form.errors.$$all.count()).toBe(1);
62
+ }));
63
+ it("fail on custom errors", () => __awaiter(void 0, void 0, void 0, function* () {
64
+ const validators = getCustom();
65
+ const formData = {};
66
+ yield form.setState({ schema, formData, validators });
67
+ yield form.submit();
68
+ expect(yield form.getSubmittedData()).not.toEqual(formData);
69
+ expect(yield form.errors.$$all.get(0).getText()).toContain(message);
70
+ }));
71
+ describe("warnings", () => {
72
+ it("prevent submit", () => __awaiter(void 0, void 0, void 0, function* () {
73
+ const warnings = getCustom();
74
+ yield form.setState({ schema, formData, warnings });
75
+ yield form.submit();
76
+ expect(yield form.getSubmittedData()).not.toEqual(formData);
77
+ expect(yield form.warnings.$$all.get(0).getText()).toContain(message);
78
+ }));
79
+ it("can be submitted via warnings-acknowledged-submit button", () => __awaiter(void 0, void 0, void 0, function* () {
80
+ const warnings = getCustom();
81
+ yield form.setState({ schema, formData, warnings });
82
+ yield form.submit();
83
+ yield test_utils_1.waitUntilBlockingLoaderHides();
84
+ yield form.$acknowledgeWarnings.click();
85
+ expect(yield form.getSubmittedData()).toEqual(formData);
86
+ }));
87
+ });
88
+ [["errors", "validators"], ["warnings", "warnings"]].forEach(([type, propName]) => {
89
+ it(`doesn't run ${type} live validators on init`, () => __awaiter(void 0, void 0, void 0, function* () {
90
+ const validators = getCustom(message, "live");
91
+ const formData = {};
92
+ yield form.setState({ schema, formData, [propName]: validators });
93
+ expect(yield form[type].$panel.isPresent()).toBe(false);
94
+ }));
95
+ it(`runs live ${type} validators on onChange`, () => __awaiter(void 0, void 0, void 0, function* () {
96
+ const validators = getCustom(message, "live");
97
+ const formData = { a: "bar" };
98
+ yield form.setState({ schema, formData, [propName]: validators });
99
+ yield test_utils_1.updateValue(form.$getInputWidget("a"), "");
100
+ expect(yield form[type].$$all.get(0).getText()).toContain(message);
101
+ }));
102
+ });
103
+ it("doesn't show blocker during live validation", () => __awaiter(void 0, void 0, void 0, function* () {
104
+ const validators = getCustom(message, "live");
105
+ const formData = { a: "bar" };
106
+ yield form.setState({ schema, formData, validators });
107
+ yield test_utils_1.updateValue(form.$getInputWidget("a"), "");
108
+ expect(yield form.isBlocked()).toBe(false);
109
+ }));
110
+ it("runs both validators and warnings live on Change", () => __awaiter(void 0, void 0, void 0, function* () {
111
+ const validators = getCustom(message, "live");
112
+ const formData = { a: "bar" };
113
+ yield form.setState({ schema, formData, validators, warnings: validators });
114
+ yield test_utils_1.updateValue(form.$getInputWidget("a"), "");
115
+ for (const type of ["errors", "warnings"]) {
116
+ expect(yield form[type].$$all.get(0).getText()).toContain(message);
117
+ }
118
+ }));
119
+ it("keeps non live errors when doing only live validation", () => __awaiter(void 0, void 0, void 0, function* () {
120
+ const validators = getCustom(message, "live");
121
+ const warnings = getCustom(message);
122
+ const formData = { a: "bar" };
123
+ yield form.setState({ schema, formData, validators, warnings });
124
+ yield test_utils_1.updateValue(form.$getInputWidget("a"), "");
125
+ yield form.submit();
126
+ yield test_utils_1.waitUntilBlockingLoaderHides();
127
+ expect(yield form.warnings.$$all.get(0).getText()).toContain(message);
128
+ expect(yield form.errors.$$all.get(0).getText()).toContain(message);
129
+ yield test_utils_1.updateValue(form.$getInputWidget("a"), "bar");
130
+ expect(yield form.warnings.$$all.get(0).getText()).toContain(message);
131
+ expect(yield form.errors.$$all.count()).toBe(0);
132
+ yield test_utils_1.updateValue(form.$getInputWidget("a"), "");
133
+ for (const type of ["errors", "warnings"]) {
134
+ expect(yield form[type].$$all.get(0).getText()).toContain(message);
135
+ }
136
+ }));
137
+ it("cached non live errors are cleared when validated again against valid", () => __awaiter(void 0, void 0, void 0, function* () {
138
+ const validators = getCustom(message, "live");
139
+ const warnings = getCustom(message);
140
+ const formData = { a: "bar" };
141
+ yield form.setState({ schema, formData, validators, warnings });
142
+ yield test_utils_1.updateValue(form.$getInputWidget("a"), "");
143
+ yield form.submit();
144
+ yield test_utils_1.waitUntilBlockingLoaderHides();
145
+ expect(yield form.warnings.$$all.get(0).getText()).toContain(message);
146
+ expect(yield form.errors.$$all.get(0).getText()).toContain(message);
147
+ yield test_utils_1.updateValue(form.$getInputWidget("a"), "bar");
148
+ expect(yield form.warnings.$$all.get(0).getText()).toContain(message);
149
+ expect(yield form.errors.$$all.count()).toBe(0);
150
+ yield test_utils_1.updateValue(form.$getInputWidget("a"), "");
151
+ yield test_utils_1.updateValue(form.$getInputWidget("a"), "bar");
152
+ yield form.submit();
153
+ for (const type of ["errors", "warnings"]) {
154
+ expect(yield form[type].$$all.count()).toBe(0);
155
+ }
156
+ }));
157
+ it("runs all validator types on submit", () => __awaiter(void 0, void 0, void 0, function* () {
158
+ const validators = getCustom(message, "live");
159
+ const _validators = Object.assign(Object.assign({}, validators), { b: validators.a });
160
+ const warnings = Object.assign(Object.assign({}, validators), { b: validators.a });
161
+ yield form.setState({ schema, formData, validators: _validators, warnings });
162
+ yield test_utils_1.updateValue(form.$getInputWidget("b"), "");
163
+ yield form.submit();
164
+ expect(yield form.getSubmittedData()).not.toEqual(formData);
165
+ expect(yield form.errors.$$all.count()).toBe(2);
166
+ expect(yield form.warnings.$$all.count()).toBe(2);
167
+ }));
168
+ const response = {
169
+ "error": {
170
+ "statusCode": 422,
171
+ "name": "Error",
172
+ "message": "Unprocessable Entity",
173
+ "details": {
174
+ ".a": [
175
+ "mock"
176
+ ]
177
+ }
178
+ }
179
+ };
180
+ it("delays submit until async validators complete and doesn't submit when invalid", () => __awaiter(void 0, void 0, void 0, function* () {
181
+ const validators = {
182
+ a: {
183
+ remote: {
184
+ validator: "mock",
185
+ message
186
+ }
187
+ }
188
+ };
189
+ const { resolve, remove } = yield form.setMockResponse("/documents/validate", false);
190
+ const _formData = Object.assign(Object.assign({}, formData), { a: "empty isn't async validated so we have value here" });
191
+ yield form.setState({ schema, formData: _formData, validators });
192
+ yield form.startSubmit();
193
+ expect(yield form.getSubmittedData()).not.toEqual(_formData);
194
+ expect(yield form.errors.$$all.count()).toBe(0);
195
+ yield resolve({ status: 422, json: response }, !!"raw");
196
+ expect(yield form.errors.$$all.count()).toBe(1);
197
+ expect(yield form.errors.$$all.get(0).getText()).toContain(message);
198
+ yield remove();
199
+ }));
200
+ it("delays submit until async validators complete and submits when valid", () => __awaiter(void 0, void 0, void 0, function* () {
201
+ const validators = {
202
+ a: {
203
+ remote: {
204
+ validator: "mock",
205
+ message
206
+ }
207
+ }
208
+ };
209
+ const { resolve, remove } = yield form.setMockResponse("/documents/validate", false);
210
+ const _formData = Object.assign(Object.assign({}, formData), { a: "empty isn't async validated so we have value here" });
211
+ yield form.setState({ schema, formData: _formData, validators });
212
+ yield form.startSubmit();
213
+ expect(yield form.getSubmittedData()).not.toEqual(_formData);
214
+ expect(yield form.errors.$$all.count()).toBe(0);
215
+ yield resolve({});
216
+ expect(yield form.getSubmittedData()).toEqual(_formData);
217
+ yield remove();
218
+ }));
219
+ it("delays all validators until async operations complete", () => __awaiter(void 0, void 0, void 0, function* () {
220
+ const validators = {
221
+ a: {
222
+ remote: {
223
+ validator: "mock",
224
+ message
225
+ }
226
+ }
227
+ };
228
+ const { resolve, remove } = yield form.setMockResponse("/documents/validate", false);
229
+ const _formData = Object.assign(Object.assign({}, formData), { a: "empty isn't async validated so we have value here" });
230
+ yield form.setState({ schema, formData: _formData, validators });
231
+ yield form.startSubmit();
232
+ expect(yield form.getSubmittedData()).not.toEqual(_formData);
233
+ expect(yield form.errors.$$all.count()).toBe(0);
234
+ yield resolve({ status: 422, json: response }, !!"raw");
235
+ expect(yield form.errors.$$all.count()).toBe(1);
236
+ expect(yield form.errors.$$all.get(0).getText()).toContain(message);
237
+ yield remove();
238
+ }));
239
+ const uiSchema = {
240
+ c: {
241
+ "ui:field": "ImageArrayField"
242
+ }
243
+ };
244
+ const uiSchemaContext = {
245
+ creator: properties.userId
246
+ };
247
+ const schemaForAsync = Object.assign(Object.assign({}, schema), { properties: Object.assign(Object.assign({}, schema.properties), { c: {
248
+ type: "array",
249
+ items: {
250
+ type: "string"
251
+ }
252
+ } }) });
253
+ const imageUploaded = "imgae uploaded";
254
+ const asyncValidators = {
255
+ b: {
256
+ remote: {
257
+ validator: "mock",
258
+ message
259
+ },
260
+ presence: {
261
+ message,
262
+ options: {
263
+ _live: true
264
+ }
265
+ }
266
+ },
267
+ c: {
268
+ length: {
269
+ maximum: 0,
270
+ message: imageUploaded
271
+ }
272
+ }
273
+ };
274
+ it("validations aren't run when async validation running already", () => __awaiter(void 0, void 0, void 0, function* () {
275
+ const { resolve, remove } = yield form.setMockResponse("/documents/validate", false);
276
+ yield form.setState({ schema: schemaForAsync, formData, validators: asyncValidators, uiSchema, uiSchemaContext });
277
+ const { resolve: imageResolve, remove: imageRemove } = yield form.mockImageUpload("c");
278
+ yield form.startSubmit();
279
+ expect(yield form.errors.$$all.count()).toBe(0);
280
+ yield imageResolve();
281
+ expect(yield form.errors.$$all.count()).toBe(0);
282
+ yield resolve({});
283
+ yield remove();
284
+ yield imageRemove();
285
+ }));
286
+ it("revalidates when data is edited during async validation on submit", () => __awaiter(void 0, void 0, void 0, function* () {
287
+ const { resolve, remove } = yield form.setMockResponse("/documents/validate", false);
288
+ yield form.setState({ schema: schemaForAsync, formData, validators: asyncValidators, uiSchema, uiSchemaContext });
289
+ const { resolve: imageResolve, remove: imageRemove } = yield form.mockImageUpload("c");
290
+ yield form.startSubmit();
291
+ expect(yield form.errors.$$all.count()).toBe(0);
292
+ yield imageResolve();
293
+ yield resolve({});
294
+ yield test_utils_1.waitUntilBlockingLoaderHides();
295
+ expect(yield form.errors.$$all.count()).toBe(1);
296
+ expect(yield form.errors.$$all.get(0).getText()).toContain(imageUploaded);
297
+ yield remove();
298
+ yield imageRemove();
299
+ }));
300
+ it("shows blocking loader when validating", () => __awaiter(void 0, void 0, void 0, function* () {
301
+ const { resolve, remove } = yield form.setMockResponse("/documents/validate", false);
302
+ yield form.setState({ schema, formData, validators: asyncValidators });
303
+ expect(yield form.isBlocked()).toBe(false);
304
+ yield form.startSubmit();
305
+ expect(yield form.isBlocked()).toBe(true);
306
+ yield resolve({ status: 422, json: response }, !!"raw");
307
+ yield test_utils_1.waitUntilBlockingLoaderHides();
308
+ expect(yield form.isBlocked()).toBe(false);
309
+ yield remove();
310
+ }));
311
+ describe("Custom validation bypass", () => {
312
+ it("skips custom errors and warnings", () => __awaiter(void 0, void 0, void 0, function* () {
313
+ const validators = getCustom(message);
314
+ yield form.setState({ schema, formData, validators, warnings: validators });
315
+ yield form.submitOnlySchemaValidations();
316
+ yield form.waitUntilBlockingLoaderHides();
317
+ expect(yield form.errors.$$all.count()).toBe(0);
318
+ expect(yield form.warnings.$$all.count()).toBe(0);
319
+ }));
320
+ it("skips live errors and live warnings", () => __awaiter(void 0, void 0, void 0, function* () {
321
+ const validators = getCustom(message, "live");
322
+ yield form.setState({ schema, formData, validators, warnings: validators });
323
+ yield form.submitOnlySchemaValidations();
324
+ yield form.waitUntilBlockingLoaderHides();
325
+ expect(yield form.errors.$$all.count()).toBe(0);
326
+ expect(yield form.warnings.$$all.count()).toBe(0);
327
+ }));
328
+ it("runs schema validations", () => __awaiter(void 0, void 0, void 0, function* () {
329
+ form = yield test_utils_1.createForm();
330
+ yield form.setState({ schema: Object.assign(Object.assign({}, schema), { required: ["a"] }), formData });
331
+ yield form.submitOnlySchemaValidations();
332
+ yield form.waitUntilBlockingLoaderHides();
333
+ expect(yield form.errors.$$all.count()).toBe(1);
334
+ }));
335
+ });
336
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const test_utils_1 = require("./test-utils");
13
+ const protractor_1 = require("protractor");
14
+ describe("water bird pair count form (MHL.65)", () => {
15
+ let form;
16
+ beforeAll(() => __awaiter(void 0, void 0, void 0, function* () {
17
+ form = yield test_utils_1.createForm({ id: "MHL.65", localFormData: true });
18
+ }));
19
+ it("sets correct unitType to pair observations when using add button", () => __awaiter(void 0, void 0, void 0, function* () {
20
+ yield form.$locateButton("gatherings_0_units", "add").click();
21
+ const formData = yield form.getChangedData();
22
+ expect(formData.gatherings[0].units[0].unitType[0]).toBe("pairObservation");
23
+ }));
24
+ it("sets correct unitType to pair observations when using insert shorthand", () => __awaiter(void 0, void 0, void 0, function* () {
25
+ yield form.$locateButton("gatherings_0_units", "add").click();
26
+ yield protractor_1.browser.driver.switchTo().activeElement().sendKeys(protractor_1.protractor.Key.chord(protractor_1.protractor.Key.ALT, "i"));
27
+ const formData = yield form.getChangedData();
28
+ expect(formData.gatherings[0].units[1].unitType[0]).toBe("pairObservation");
29
+ }));
30
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const test_utils_1 = require("./test-utils");
13
+ const protractor_1 = require("protractor");
14
+ describe("WBC (MHL.3)", () => {
15
+ let form;
16
+ it("navigate to form", () => __awaiter(void 0, void 0, void 0, function* () {
17
+ form = yield test_utils_1.createForm({ id: "MHL.3", localFormData: true, isAdmin: true });
18
+ }));
19
+ it("taxon census has aves", () => __awaiter(void 0, void 0, void 0, function* () {
20
+ const formData = yield form.getPropsData();
21
+ expect(formData.gatherings[0].taxonCensus[0].censusTaxonID).toBe("MX.37580");
22
+ }));
23
+ it("taxon census has correct values when yes is selected", () => __awaiter(void 0, void 0, void 0, function* () {
24
+ const widget = form.getBooleanWidget("gatherings.0.taxonCensus");
25
+ yield widget.$true.click();
26
+ const formData = yield form.getChangedData();
27
+ expect(formData.gatherings[0].taxonCensus.length).toBe(2);
28
+ expect(formData.gatherings[0].taxonCensus[0].censusTaxonID).toBe("MX.37580");
29
+ expect(formData.gatherings[0].taxonCensus[1].censusTaxonID).toBe("MX.37612");
30
+ }));
31
+ it("taxon census has correct values when no is selected", () => __awaiter(void 0, void 0, void 0, function* () {
32
+ const widget = form.getBooleanWidget("gatherings.0.taxonCensus");
33
+ yield widget.$false.click();
34
+ const formData = yield form.getChangedData();
35
+ expect(formData.gatherings[0].taxonCensus.length).toBe(1);
36
+ expect(formData.gatherings[0].taxonCensus[0].censusTaxonID).toBe("MX.37580");
37
+ }));
38
+ it("added existing user is shown as suggested", () => __awaiter(void 0, void 0, void 0, function* () {
39
+ // ID for button is broken, should be gatheringEvent.leg?
40
+ yield form.$locateButton("gatheringEvent", "add").click();
41
+ const $field = form.$locate("gatheringEvent.1.leg");
42
+ const $input = form.$getInputWidget("gatheringEvent.1.leg");
43
+ yield $input.sendKeys("unit");
44
+ const $suggestionList = $field.$(".rw-list");
45
+ const $$suggestions = $field.$$(".rw-list-option");
46
+ yield protractor_1.browser.wait(protractor_1.protractor.ExpectedConditions.visibilityOf($suggestionList), 5000, "Suggestion list timeout");
47
+ yield $$suggestions.first().click();
48
+ yield protractor_1.browser.wait(protractor_1.protractor.ExpectedConditions.invisibilityOf($field.$(".react-spinner")), 5000, "Field input spinner didn't leave");
49
+ expect(yield form.$locate("gatheringEvent.1.leg").$(".glyphicon-user").isDisplayed()).toBe(true);
50
+ }));
51
+ describe("namedPlaceNotes", () => {
52
+ it("renders", () => __awaiter(void 0, void 0, void 0, function* () {
53
+ expect(yield form.$locate("gatherings.0.namedPlaceNotes").isDisplayed()).toBe(true);
54
+ }));
55
+ it("is textarea", () => __awaiter(void 0, void 0, void 0, function* () {
56
+ expect(yield form.$getTextareaWidget("gatherings.0.namedPlaceNotes").isDisplayed()).toBe(true);
57
+ }));
58
+ it("updates", () => __awaiter(void 0, void 0, void 0, function* () {
59
+ yield test_utils_1.updateValue(form.$getTextareaWidget("gatherings.0.namedPlaceNotes"), "test");
60
+ expect(yield form.$getTextareaWidget("gatherings.0.namedPlaceNotes").getAttribute("value")).toBe("test");
61
+ expect((yield form.getChangedData()).gatheringEvent.namedPlaceNotes).toBe("test");
62
+ }));
63
+ it("doesn't spill into gatherings", () => __awaiter(void 0, void 0, void 0, function* () {
64
+ expect((yield form.getChangedData()).gatherings[0]).not.toContain("namedPlaceNotes");
65
+ }));
66
+ });
67
+ it("added existing user ID is shown", () => __awaiter(void 0, void 0, void 0, function* () {
68
+ const $input = form.$getInputWidget("gatheringEvent.1.leg");
69
+ expect(yield $input.getAttribute("value")).toMatch(/Unit.+ \(MA\.\d+\)/);
70
+ }));
71
+ it("entering descriptionBiotopeF doesn't clear observerCount", () => __awaiter(void 0, void 0, void 0, function* () {
72
+ form = yield test_utils_1.createForm({ id: "MHL.3", localFormData: true, isAdmin: true });
73
+ const $descriptionBiotopeF = form.$locate("gatherings.0.gatheringFact.descriptionBiotopeF");
74
+ const $otherBiotopeFCheckbox = $descriptionBiotopeF.$$(".checkbox label input").get(2);
75
+ yield $otherBiotopeFCheckbox.click();
76
+ yield $otherBiotopeFCheckbox.click();
77
+ yield $otherBiotopeFCheckbox.click();
78
+ //await $descriptionBiotopeF.$("input.form-control").sendKeys("test");
79
+ const formData = yield form.getChangedData();
80
+ expect(formData.gatherings[0].gatheringFact.observerCount).toBe(1);
81
+ }));
82
+ });
@@ -5,6 +5,6 @@
5
5
  "declaration": true
6
6
  },
7
7
  "include": [
8
- "./test/test-utils.ts"
8
+ "./test/**/*"
9
9
  ]
10
10
  }
package/xsel -b ADDED
@@ -0,0 +1,9 @@
1
+ "toggleable": {
2
+ "query": {
3
+ "informalTaxonGroup": "MVL.1",
4
+ "onlyFinnish": true
5
+ },
6
+ "glyphClass": "informal-group-image MVL.1",
7
+ "placeholder": "",
8
+ "tooltip": "Aloita suomalaisten lintujen syöttö"
9
+ },
@@ -1,5 +0,0 @@
1
- {
2
- "name": "Using fixtures to represent data",
3
- "email": "hello@cypress.io",
4
- "body": "Fixtures are a great way to mock data for responses to routes"
5
- }
@@ -1,46 +0,0 @@
1
- import { Translations, Lang } from "./components/LajiForm";
2
- interface Query {
3
- [param: string]: any;
4
- }
5
- interface Options {
6
- failSilently?: boolean;
7
- [option: string]: any;
8
- }
9
- export interface ApiClientImplementation {
10
- fetch: (path: string, query: Query, options: any) => Promise<any>;
11
- }
12
- /**
13
- * ApiClient "interface". Wraps the given apiClient as a singleton object.
14
- * Given apiClient must implement fetch().
15
- */
16
- export default class ApiClient {
17
- apiClient: ApiClientImplementation;
18
- lang: Lang;
19
- translations: Translations;
20
- cache: {
21
- [path: string]: {
22
- [cacheKey: string]: Promise<any>;
23
- };
24
- };
25
- on: {
26
- [path: string]: (() => void)[];
27
- };
28
- constructor(apiClient: ApiClientImplementation, lang: Lang | undefined, translations: Translations);
29
- /**
30
- * Implementing apiClient must return a promise that passes the raw response as 1st arg.
31
- * @param path URL for GET.
32
- * @param query Object, where keys are param names and values are param values.
33
- * @returns a Promise.
34
- */
35
- fetchRaw(path: string, query?: Query, options?: any): Promise<any>;
36
- fetch<T>(path: string, query?: Query, options?: Options): Promise<T>;
37
- getCacheKey(query?: Query, options?: Options): string;
38
- fetchCached<T>(path: string, query?: Query, options?: Options): Promise<T>;
39
- invalidateCachePath(path: string): void;
40
- invalidateCachePathQuery(path: string, query: string): void;
41
- flushCache: () => void;
42
- onCachePathInvalidation(path: string, callback: () => void): void;
43
- removeOnCachePathInvalidation(path: string, callback: () => void): void;
44
- setLang(lang: Lang): void;
45
- }
46
- export {};
package/lib/ApiClient.js DELETED
@@ -1,93 +0,0 @@
1
- "use strict";
2
- var __rest = (this && this.__rest) || function (s, e) {
3
- var t = {};
4
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
- t[p] = s[p];
6
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
- t[p[i]] = s[p[i]];
10
- }
11
- return t;
12
- };
13
- Object.defineProperty(exports, "__esModule", { value: true });
14
- /**
15
- * ApiClient "interface". Wraps the given apiClient as a singleton object.
16
- * Given apiClient must implement fetch().
17
- */
18
- class ApiClient {
19
- constructor(apiClient, lang = "en", translations) {
20
- this.cache = {};
21
- this.on = {};
22
- this.flushCache = () => {
23
- this.cache = {};
24
- };
25
- this.apiClient = apiClient;
26
- this.lang = lang;
27
- this.translations = translations;
28
- }
29
- /**
30
- * Implementing apiClient must return a promise that passes the raw response as 1st arg.
31
- * @param path URL for GET.
32
- * @param query Object, where keys are param names and values are param values.
33
- * @returns a Promise.
34
- */
35
- fetchRaw(path, query, options) {
36
- const _query = Object.assign({ lang: this.lang }, (query || {}));
37
- if (!_query.lang) {
38
- delete _query.lang;
39
- }
40
- return this.apiClient.fetch(path, _query, options).catch(() => {
41
- throw new Error(this.translations[this.lang].RequestFailed);
42
- });
43
- }
44
- fetch(path, query, options = {}) {
45
- const { failSilently = false } = options, fetchOptions = __rest(options, ["failSilently"]);
46
- return this.fetchRaw(path, query, fetchOptions).then(response => {
47
- if (!failSilently && response.status >= 400) {
48
- throw new Error("Request failed");
49
- }
50
- return response.json();
51
- }).catch(() => {
52
- if (this.cache[path])
53
- delete this.cache[path][this.getCacheKey(query, options)];
54
- throw new Error(this.translations[this.lang].RequestFailed);
55
- });
56
- }
57
- getCacheKey(query, options) {
58
- return JSON.stringify(query) + JSON.stringify(options);
59
- }
60
- fetchCached(path, query, options) {
61
- const cacheKey = this.getCacheKey(query, options);
62
- if (!this.cache[path])
63
- this.cache[path] = {};
64
- this.cache[path][cacheKey] = cacheKey in this.cache[path] ? this.cache[path][cacheKey] : this.fetch(path, query, options);
65
- return this.cache[path][cacheKey];
66
- }
67
- invalidateCachePath(path) {
68
- delete this.cache[path];
69
- if (this.on[path]) {
70
- this.on[path].forEach(callback => callback());
71
- }
72
- }
73
- //TODO on invalidation callbacks
74
- invalidateCachePathQuery(path, query) {
75
- if (this.cache[path])
76
- delete this.cache[path][query];
77
- }
78
- onCachePathInvalidation(path, callback) {
79
- if (!this.on[path])
80
- this.on[path] = [];
81
- this.on[path].push(callback);
82
- }
83
- removeOnCachePathInvalidation(path, callback) {
84
- if (this.on[path]) {
85
- this.on[path] = this.on[path].filter(fn => fn !== callback);
86
- }
87
- }
88
- setLang(lang) {
89
- this.lang = lang;
90
- this.flushCache();
91
- }
92
- }
93
- exports.default = ApiClient;
package/lib/Context.d.ts DELETED
@@ -1,8 +0,0 @@
1
- declare const _default: (nameSpace?: number | string) => Record<string, unknown>;
2
- /**
3
- * A singleton context container for accessing state between components. Should be used for vars that shouldn't affect React change detection, e.g. not suitable to be stored in React context or are updated mutably.
4
- *
5
- * Empty namespace "" is used for global vars.
6
- */
7
- export default _default;
8
- export declare function clear(): void;
package/lib/Context.js DELETED
@@ -1,18 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.clear = void 0;
4
- let singletonContext = {};
5
- /**
6
- * A singleton context container for accessing state between components. Should be used for vars that shouldn't affect React change detection, e.g. not suitable to be stored in React context or are updated mutably.
7
- *
8
- * Empty namespace "" is used for global vars.
9
- */
10
- exports.default = (nameSpace = "") => {
11
- if (!singletonContext[nameSpace])
12
- singletonContext[nameSpace] = {};
13
- return singletonContext[nameSpace];
14
- };
15
- function clear() {
16
- singletonContext = {};
17
- }
18
- exports.clear = clear;
@@ -1,7 +0,0 @@
1
- import * as React from "react";
2
- import { Theme } from "./themes/theme";
3
- export interface ContextProps {
4
- theme: Theme;
5
- }
6
- declare const Context: React.Context<ContextProps>;
7
- export default Context;