@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
@@ -1,594 +0,0 @@
1
- import { test, expect, Locator, Page } from "@playwright/test";
2
- import { Form, createForm, Mock, NamedPlaceChooserPO, lajiFormLocator, EnumWidgetPO } from "./test-utils";
3
- const { googleApiKey } = require("../properties.json");
4
-
5
- const _testWidget = (form: Form) => async (path: string, type?: string) => {
6
- const parsePointer = (container: any, path: string): any => {
7
- const [next, ...remaining] = path.split(".");
8
- const nextObject = container[next];
9
- if (remaining.length) {
10
- return parsePointer(nextObject, remaining.join("."));
11
- }
12
- return nextObject;
13
- };
14
-
15
- expect(form.$locate(path)).toBeVisible();
16
- const beforeChange = parsePointer(await form.getChangedData() || {}, path);
17
- let widget;
18
- let $secondOption, $otherOptionThanActive;
19
- switch (type) {
20
- case "checkbox":
21
- widget = form.getBooleanWidget(path);
22
- await widget.$nonactive.click();
23
- break;
24
- case "enum":
25
- widget = form.$getEnumWidget(path);
26
- await widget.$container.click();
27
- $secondOption = widget.$enums.nth(1);
28
- $otherOptionThanActive = (await $secondOption.getAttribute("class")).includes("rw-state-selected")
29
- ? widget.$enums.first()
30
- : $secondOption;
31
- await $otherOptionThanActive.click();
32
- break;
33
- case "date":
34
- widget = form.getDateWidget(path).$input;
35
- await widget.click();
36
- await widget.type("1.1.2019");
37
- await widget.press("Tab");
38
- break;
39
- default:
40
- widget = form.$getInputWidget(path);
41
- await widget.type("1");
42
- await widget.press("Tab");
43
- break;
44
- }
45
- expect(beforeChange).not.toEqual(parsePointer(await form.getChangedData(), path));
46
- };
47
-
48
- test.describe.configure({ mode: "serial" });
49
-
50
- test.describe("Trip report (JX.519)", () => {
51
-
52
- let page: Page;
53
- let form: Form;
54
- let testWidget: (path: string, fill?: string) => Promise<void>;
55
- let npMock: Mock;
56
- let $gatheringsMap: Locator;
57
- let $$gatheringMarkerPaths: Locator;
58
- let $gatheringEvent: Locator;
59
- let $gatheringAdd: Locator;
60
- let $additionalsButton: Locator;
61
-
62
- test.beforeAll(async ({browser}) => {
63
- page = await browser.newPage();
64
- // Initialize via json require so we can mock the named places fetch before the page initializees
65
- form = await createForm(page);
66
- npMock = await form.setMockResponse("/named-places", false);
67
- form.setState({...require("../forms/JX.519"), formData: {gatheringEvent: {leg: [require("../properties.json").userId]}}});
68
-
69
- testWidget = _testWidget(form);
70
- $gatheringsMap = form.$locate("gatherings").locator(".laji-map");
71
- $$gatheringMarkerPaths = $gatheringsMap.locator(".vector-marker path");
72
- $gatheringEvent = form.$locate("gatheringEvent");
73
- $gatheringAdd = form.$locateButton("gatherings", "add");
74
- $additionalsButton = form.$locateButton("gatherings.0", "additionals");
75
- });
76
-
77
- test.describe("gatheringEvent", () => {
78
-
79
- test("container is displayed", async () => {
80
- await expect($gatheringEvent).toBeVisible();
81
- });
82
-
83
- test.describe("contains", () => {
84
-
85
- test("secureLevel which is editable", async () => {
86
- await expect($gatheringEvent.locator(lajiFormLocator("secureLevel"))).toBeVisible();
87
- await testWidget("secureLevel", "checkbox");
88
- });
89
-
90
- test("gatheringEvent.legPublic which is editable", async () => {
91
- await testWidget("gatheringEvent.legPublic", "checkbox");
92
- });
93
-
94
- test("gatheringEvent.dateBegin which is editable", async () => {
95
- await testWidget("gatheringEvent.dateBegin", "date");
96
- });
97
-
98
- test("gatheringEvent.dateEnd which is editable", async () => {
99
- await testWidget("gatheringEvent.dateEnd", "date");
100
- });
101
-
102
- test("keywords which is editable", async () => {
103
- await expect($gatheringEvent.locator(lajiFormLocator("keywords"))).toBeVisible();
104
- await testWidget("keywords");
105
- });
106
-
107
-
108
- // TODO TableField messes up ids!
109
- test.describe("observers", () => {
110
- test("displayed", async () => {
111
- await expect(form.$locate("gatheringEvent.0.leg")).toBeVisible();
112
- });
113
-
114
- test("can be added", async () => {
115
- await form.$locateButton("gatheringEvent", "add").click();
116
-
117
- await expect(form.$locate("gatheringEvent.1.leg")).toBeVisible();
118
- });
119
-
120
- test("deleting first shows only the remaining empty", async () => {
121
- // Should be 1st delete button (row 0 is labels)
122
- await form.$locate("").locator(".table-field .row").nth(1).locator("button").click();
123
-
124
- await expect(form.$locate("gatheringEvent.1.leg")).not.toBeVisible();
125
- await expect(form.$getInputWidget("gatheringEvent.0.leg")).toHaveValue("");
126
- });
127
- });
128
- });
129
- });
130
-
131
- test.describe("gatherings", () => {
132
- let geocodingMock: Mock;
133
-
134
- test.beforeAll(async () => {
135
- geocodingMock = await form.setMockResponse("/coordinates/location");
136
- });
137
-
138
- test("is displayed", async () => {
139
- await expect(form.$locate("gatherings")).toBeVisible();
140
- });
141
-
142
- test("is empty", async () => {
143
- await expect(form.$locate("gatherings.0")).not.toBeVisible();
144
- });
145
-
146
- test("map is present", async () => {
147
- await expect($gatheringsMap).toBeVisible();
148
- });
149
-
150
- test("creating pointer on map creates gathering", async () => {
151
- await form.putMarkerToMap(); // Adds outside Finland so "country" field will appear for later test.
152
-
153
- await expect(form.$locate("gatherings.0")).toBeVisible();
154
-
155
- await form.$locateButton("gatherings.0", "delete").click(); // Cleanup
156
- });
157
-
158
- test.describe("items", async () => {
159
- test.beforeEach(async () => {
160
- await form.putMarkerToMap();
161
- });
162
-
163
- test.afterEach(async () => {
164
- await form.$locateButton("gatherings.0", "delete").click();
165
- });
166
-
167
- test.describe("geocoding", () => {
168
- test("starts and finishes after adding gathering", async () => {
169
- // if (await form.$locate("gatherings.0.country")) {
170
- // return;
171
- // }
172
- // const $loadingGeocoderButton = $(".geocoder-btn .react-spinner");
173
-
174
- // if (await $loadingGeocoderButton) {
175
- // await browser.wtest(protractor.ExpectedConditions.invisibilityOf($loadingGeocoderButton), 6000, "Geocoding timeout");
176
- // }
177
-
178
- await expect(form.$locate("gatherings.0.country")).not.toBeVisible();
179
- await expect(form.getGeocoder().$spinner).toBeVisible();
180
-
181
- await geocodingMock.resolve(require("./mocks/coordinates.json"));
182
- await geocodingMock.remove();
183
-
184
- await expect(form.$locate("gatherings.0.country")).toBeVisible();
185
- await expect(form.getGeocoder().$spinner).not.toBeVisible();
186
- });
187
-
188
- test.describe("after geocoded", () => {
189
- test.beforeEach(async () => {
190
- await geocodingMock.resolve(require("./mocks/coordinates.json"));
191
- await geocodingMock.remove();
192
- });
193
- test("adds country which is editable", async () => {
194
- await testWidget("gatherings.0.country");
195
- });
196
-
197
- test("adds biologicalProvince which is editable", async () => {
198
- await testWidget("gatherings.0.biologicalProvince");
199
- });
200
-
201
- test("adds municipality which is editable", async () => {
202
- await testWidget("gatherings.0.municipality");
203
- });
204
- });
205
- });
206
-
207
- test("contains locality which is editable", async () => {
208
- await testWidget("gatherings.0.locality");
209
- });
210
-
211
- test("contains localityDescription which is editable", async () => {
212
- await testWidget("gatherings.0.localityDescription");
213
- });
214
-
215
- test("contains weather which is editable", async () => {
216
- await testWidget("gatherings.0.weather");
217
- });
218
-
219
- test("contains notes which is editable", async () => {
220
- await testWidget("gatherings.0.notes");
221
- });
222
-
223
- test("has additional fields button", async () => {
224
- await expect(form.getScopeField("gatherings.0").$button).toBeVisible();
225
- });
226
-
227
- test.describe("taxonCensus", () => {
228
- test("can be added from additional fields", async () => {
229
- const scopeField = form.getScopeField("gatherings.0");
230
- await scopeField.$button.click();
231
- await scopeField.$listItems.last().click();
232
-
233
- await expect(form.$locate("gatherings.0.taxonCensus")).toBeVisible();
234
-
235
- await $additionalsButton.click();
236
-
237
- await expect(scopeField.$listItems).not.toBeVisible();
238
- });
239
-
240
- test("can add items", async () => {
241
- await form.$locateButton("gatherings.0.taxonCensus", "add").click();
242
- });
243
-
244
- test("added item is focused", async () => {
245
- await expect(form.$getInputWidget("gatherings.0.taxonCensus.0.censusTaxonID")).toBeFocused();
246
- });
247
-
248
- test("added item is displayed and can be edited", async () => {
249
- await testWidget("gatherings.0.taxonCensus.0.censusTaxonID");
250
- await testWidget("gatherings.0.taxonCensus.0.taxonCensusType", "enum");
251
- });
252
-
253
- test("second added item is focused", async () => {
254
- await form.$locateButton("gatherings.0.taxonCensus", "add").click();
255
-
256
- await expect(form.$getInputWidget("gatherings.0.taxonCensus.1.censusTaxonID")).toBeFocused();
257
- });
258
- });
259
-
260
- test.describe("adding with button", async () => {
261
- test.beforeAll(async () => {
262
- await $gatheringAdd.click();
263
- });
264
-
265
- test.afterAll(async () => {
266
- await form.$locateButton("gatherings.0", "delete").click();
267
- });
268
-
269
- test("works", async () => {
270
- await expect(form.$locate("gatherings.1")).toBeVisible();
271
- });
272
-
273
- test("map is empty for new gathering", async () => {
274
- await expect($gatheringsMap.locator(".vector-marker.leaflet-interactive")).toHaveCount(0);
275
- });
276
-
277
- test("items can be closed", async () => {
278
- await form.$locateAddition("gatherings.1", "panel").locator(".laji-form-clickable-panel-header").click();
279
-
280
- await expect(form.$locate("gatherings.1.units")).not.toBeVisible();
281
- });
282
-
283
- test("items can be opened", async () => {
284
- await form.$locateAddition("gatherings.1", "panel").locator(".laji-form-clickable-panel-header").click();
285
-
286
- expect(form.$locate("gatherings.1.units")).toBeVisible();
287
- });
288
-
289
- test("items can be deleted", async () => {
290
- await form.$locateButton("gatherings.1", "delete").click();
291
- await form.$locateButton("gatherings.1", "delete-confirm-yes").click();
292
-
293
- await expect(form.$locate("gatherings.1")).not.toBeVisible();
294
- await expect(form.$locateAddition("gatherings.1", "header")).not.toBeVisible();
295
- });
296
-
297
- test.describe("named place button", () => {
298
- let $addNPButton: Locator;
299
- let npChooser: NamedPlaceChooserPO;
300
- let npList: EnumWidgetPO;
301
-
302
- test.beforeAll(async () => {
303
- $addNPButton = form.$locateButton("gatherings", "addNamedPlace");
304
- npChooser = form.getNamedPlaceChooser();
305
- npList = npChooser.select;
306
- });
307
-
308
- test("not displayed before fetched", async () => {
309
- await expect($addNPButton).not.toBeVisible();
310
- });
311
-
312
- test("displayed when fetched", async () => {
313
- await npMock.resolve(require("./mocks/named-places.json"));
314
- await expect($addNPButton).toBeVisible();
315
- });
316
-
317
- test("click displays list", async () => {
318
- await $addNPButton.click();
319
-
320
- await expect(npList.$container).toBeVisible();
321
- });
322
-
323
- test("selecting from list displays map popup", async () => {
324
- await npList.openEnums();
325
- await npList.$enums.first().click();
326
- });
327
-
328
- test("map popup select btn click closes chooser modal", async () => {
329
- await npChooser.getMapPopup().$useBtn.click();
330
- });
331
-
332
- test("np chooser modal closes after np selected or shows alert", async () => {
333
- await expect(npList.$container).not.toBeVisible();
334
- });
335
-
336
- test("new gathering is added", async () => {
337
- await expect(form.$locate("gatherings.1")).toBeVisible();
338
- await form.$locateButton("gatherings.1", "delete").click();
339
- await form.$locateButton("gatherings.1", "delete-confirm-yes").click();
340
- });
341
- });
342
- });
343
- });
344
- });
345
-
346
- test.describe("units", () => {
347
-
348
- test("is displayed", async () => {
349
- await expect(form.$locate("gatherings.0.units")).toBeVisible();
350
- });
351
-
352
- test("has one by default", async () => {
353
- await expect(form.$locate("gatherings.0.units.0")).toBeVisible();
354
- });
355
-
356
- test("can be added", async () => {
357
- await form.$locateButton("gatherings.0.units", "add").click();
358
-
359
- await expect(form.$locate("gatherings.0.units.1")).toBeVisible();
360
- });
361
-
362
- test("added is focused", async () => {
363
- await expect(form.$getInputWidget("gatherings.0.units.1.identifications.0.taxon")).toBeFocused();
364
- });
365
-
366
- test("first is shown as table row after activating second", async () => {
367
- expect(await form.$locate("gatherings.0.units.0").evaluate(e => e.tagName)).toBe("TR");
368
- });
369
-
370
- test("activating works for both", async () => {
371
- await form.$locate("gatherings.0.units.0").click();
372
-
373
- expect(await form.$locate("gatherings.0.units.0").evaluate(e => e.tagName)).toBe("DIV");
374
- expect(await form.$locate("gatherings.0.units.1").evaluate(e => e.tagName)).toBe("TR");
375
-
376
- await form.$locate("gatherings.0.units.1").click();
377
-
378
- expect(await form.$locate("gatherings.0.units.1").evaluate(e => e.tagName)).toBe("DIV");
379
- expect(await form.$locate("gatherings.0.units.0").evaluate(e => e.tagName)).toBe("TR");
380
- });
381
-
382
- test("can be deleted", async () => {
383
- await form.removeUnit(0, 1);
384
-
385
- await expect(form.$locate("gatherings.0.units.1")).not.toBeVisible();
386
- });
387
-
388
- test("first is active after deleting second", async () => {
389
- expect(await form.$locate("gatherings.0.units.0").evaluate(e => e.tagName)).toBe("DIV");
390
- });
391
-
392
- test("contains identifications.0.taxon", async () => {
393
- await expect(form.$locate("gatherings.0.units.0.identifications.0.taxon")).toBeVisible();
394
- });
395
-
396
- test("contains count which is editable", async () => {
397
- await testWidget("gatherings.0.units.0.count");
398
- });
399
-
400
- test("contains notes which is editable", async () => {
401
- await testWidget("gatherings.0.units.0.notes");
402
- });
403
-
404
- test("contains taxonConfidence which is editable", async () => {
405
- await testWidget("gatherings.0.units.0.taxonConfidence", "enum");
406
- });
407
-
408
- test("contains recordBasis which is editable", async () => {
409
- await testWidget("gatherings.0.units.0.recordBasis", "enum");
410
- });
411
-
412
- test("contains images", async () => {
413
- await expect(form.$locate("gatherings.0.units.0.images")).toBeVisible();
414
- });
415
-
416
- test("can open additionals chooser", async () => {
417
- const scopeField = form.getScopeField("gatherings.0.units.0");
418
- await expect(scopeField.$button).toBeVisible();
419
- const informalGroups = [1, 343, 232, 187];
420
- let mocks: Mock[] = [];
421
- for (let id of informalGroups) {
422
- mocks.push(await form.setMockResponse(`/informal-taxon-groups/MVL.${id}`));
423
- }
424
-
425
- await scopeField.$button.click();
426
-
427
- await expect(scopeField.modal.$container).toBeVisible();
428
-
429
- await expect(scopeField.modal.$loadingGroup.nth(1)).toBeVisible();
430
-
431
- for (let idx in informalGroups) {
432
- await mocks[idx].resolve({
433
- "id": informalGroups[idx],
434
- "name": "test"
435
- });
436
- }
437
-
438
- await expect(scopeField.modal.$loadingGroup).toHaveCount(0);
439
- await expect(scopeField.modal.$groupTitles.first()).toHaveText("test");
440
- });
441
-
442
- test("can add additional fields", async () => {
443
- const scopeField = form.getScopeField("gatherings.0.units.0");
444
-
445
- await expect(form.$locate("gatherings.0.units.0.identifications.0.det")).not.toBeVisible();
446
-
447
- await expect(scopeField.$button).toBeVisible();
448
-
449
- const getFieldCount = () => form.$locate("gatherings.0.units.0").locator("input").count();
450
- const fieldCount = await getFieldCount();
451
-
452
- const $additionalItem = scopeField.$listItems.first();
453
-
454
- await expect(scopeField.modal.$container).toBeVisible();
455
- await expect($additionalItem).toBeVisible();
456
-
457
- await $additionalItem.click();
458
- await scopeField.modal.$close.click();
459
-
460
- await expect($additionalItem).not.toBeVisible();
461
- expect(await getFieldCount()).toBe(fieldCount + 1);
462
- });
463
-
464
- const getLocationChooserFor = (gatheringIdx: number, unitIdx: number) => form.getLocationChooser(`gatherings.${gatheringIdx}.units.${unitIdx}`);
465
- // const $getLocationModal = () => page.locator(".map-dialog");
466
- // const $getLocationModalMap = () => $getLocationModal().locator(".laji-map");
467
-
468
- test("has location button", async () => {
469
- await expect(getLocationChooserFor(0, 0).$button).toBeVisible();
470
- });
471
-
472
- async function clickLocationButtonAndAddLocation(gatheringIdx: number, unitIdx: number) {
473
- const locationChooser = getLocationChooserFor(gatheringIdx, unitIdx);
474
- await locationChooser.$button.click();
475
-
476
- // await browser.wtest(protractor.ExpectedConditions.visibilityOf($locationModal), 5000, "Map modal waiting timeout");
477
-
478
- await expect(locationChooser.modal.$container).toBeVisible();
479
-
480
- await locationChooser.modal.map.clickAt(0, 0);
481
- // const pos = await $getLocationModalMap().boundingBox();
482
- // page.mouse.move(pos.x, pos.y)
483
- // page.mouse.click(pos.x, pos.y)
484
- // await browser.actions()
485
- // .mouseMove($getLocationModalMap().getWebElement(), {x: 100, y: 100}).perform();
486
- // await browser.actions().click().perform();
487
- }
488
-
489
- test("can add location", async () => {
490
- await clickLocationButtonAndAddLocation(0, 0);
491
-
492
- await expect($gatheringsMap.locator(".vector-marker.leaflet-interactive")).toHaveCount(2);
493
- });
494
-
495
- test("unit map modal hides after adding location", async () => {
496
- const locationChooser = getLocationChooserFor(0, 0);
497
- await expect(locationChooser.modal.$container).not.toBeVisible();
498
- });
499
-
500
- test("gatherings map shows unit with different color", async () => {
501
- await expect($$gatheringMarkerPaths).toHaveCount(2);
502
- const firstFill = await $$gatheringMarkerPaths.first().getAttribute("fill");
503
- const secondFill = await $$gatheringMarkerPaths.last().getAttribute("fill");
504
-
505
- expect(firstFill).not.toBe(secondFill);
506
- });
507
-
508
- test("hovering unit table row changes gathering map unit color", async () => {
509
- await form.$locateButton("gatherings.0.unit", "add").click();
510
-
511
- const unitFill = await $$gatheringMarkerPaths.last().getAttribute("style");
512
-
513
- form.$locate("gatherings.0.units.0").hover();
514
- // debugger;
515
- // await browser.actions()
516
- // .mouseMove(form.$locate("gatherings.0.units.0").getWebElement())
517
- // .perform();
518
- // debugger;
519
-
520
- const unitFillAfterLocationHover = await $$gatheringMarkerPaths.last().getAttribute("style");
521
-
522
- expect(unitFill).not.toBe(unitFillAfterLocationHover);
523
-
524
- await form.removeUnit(0, 1);
525
- });
526
-
527
- // const $locationPeeker = $("#root_gatherings_0_units_0-location-peeker");
528
-
529
- test("hovering location button displays location peeking map", async () => {
530
- await getLocationChooserFor(0, 0).$button.hover();
531
-
532
- await expect(getLocationChooserFor(0, 0).peeker.$map).toBeVisible();
533
- });
534
-
535
- test("location peeker shows data", async () => {
536
- const locationChooser = getLocationChooserFor(0, 0);
537
- await locationChooser.$button.hover();
538
-
539
- // await browser.wtest(protractor.ExpectedConditions.visibilityOf($locationPeeker.locator(".leaflet-container")), 5000, "Map peeker waiting timeout");
540
-
541
- // const $$peekerPaths = $$("#root_gatherings_0_units_0-location-peeker .vector-marker path");
542
-
543
- await expect(locationChooser.peeker.$markers).not.toHaveCount(0);
544
-
545
- const firstFill = await locationChooser.peeker.$markers.first().getAttribute("fill");
546
- const secondFill = await locationChooser.peeker.$markers.last().getAttribute("fill");
547
-
548
- expect(firstFill).not.toBe(secondFill);
549
- });
550
-
551
- test("can have location even if gathering doesn't have", async () => {
552
- await $gatheringAdd.click();
553
- await clickLocationButtonAndAddLocation(1, 0);
554
-
555
- await expect($$gatheringMarkerPaths).toHaveCount(1);
556
-
557
- await form.$locateButton("gatherings.1", "delete").click();
558
- await form.$locateButton("gatherings.1", "delete-confirm-yes").click();
559
- });
560
-
561
- test("choosing informal taxon group changes fields", async () => {
562
- await page.locator(".informal-taxon-group-chooser").click();
563
-
564
- await expect(form.$locate("gatherings.0.units.0.twitched")).not.toBeVisible();
565
- const $birdButton = page.locator(".MVL\.1").locator("xpath=..").locator("button").last();
566
-
567
- await $birdButton.click();
568
- await expect(form.$locate("gatherings.0.units.0.twitched")).toBeVisible();
569
- });
570
-
571
- test("adding image in background", async () => {
572
- await form.$locateButton("gatherings.0.unit", "add").click();
573
- const {resolve, remove} = await form.mockImageUpload("gatherings.0.units.1");
574
- await form.$locate("gatherings.0.units.0").locator("td").first().click();
575
- await resolve();
576
- await form.$locate("gatherings.0.units.1").locator("td").first().click();
577
-
578
- await expect(form.getImageArrayField("gatherings.0.units.1").$imgs).toHaveCount(1);
579
- await remove();
580
- await form.removeUnit(0, 1);
581
- });
582
-
583
- test("removing unit with image loading", async () => {
584
- await form.$locateButton("gatherings.0.unit", "add").click();
585
- const {resolve, remove} = await form.mockImageUpload("gatherings.0.units.1");
586
- await form.$locate("gatherings.0.units.0").locator("td").first().click();
587
- await form.removeUnit(0, 1);
588
- await resolve();
589
- await remove();
590
-
591
- await expect(form.getFailedJobs().$container).not.toBeVisible();
592
- });
593
- });
594
- });