@luomus/laji-form 15.1.0 → 15.1.2

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 (248) hide show
  1. package/CHANGELOG.md +0 -4
  2. package/dist/laji-form.js +1 -1
  3. package/jsonconfig.json +26 -0
  4. package/migrate.sh +0 -1
  5. package/package.json +8 -8
  6. package/test-export/test-utils.d.ts +100 -54
  7. package/test-export/test-utils.js +102 -84
  8. package/xsel -b +9 -0
  9. package/cypress/fixtures/example.json +0 -5
  10. package/cypress/screenshots/nafi.cy.ts/NAFI (MHL.6) -- selecting species name with keyboard navigation -- and closes suggestion list (failed).png +0 -0
  11. package/cypress/screenshots/nafi.cy.ts/NAFI (MHL.6) -- selecting species name with keyboard navigation -- and is marked as suggested (failed).png +0 -0
  12. package/lib/ApiClient.d.ts +0 -46
  13. package/lib/ApiClient.js +0 -93
  14. package/lib/Context.d.ts +0 -8
  15. package/lib/Context.js +0 -18
  16. package/lib/ReactContext.d.ts +0 -7
  17. package/lib/ReactContext.js +0 -5
  18. package/lib/components/BaseComponent.d.ts +0 -9
  19. package/lib/components/BaseComponent.js +0 -29
  20. package/lib/components/LajiForm.d.ts +0 -221
  21. package/lib/components/LajiForm.js +0 -615
  22. package/lib/components/VirtualSchemaField.d.ts +0 -42
  23. package/lib/components/VirtualSchemaField.js +0 -74
  24. package/lib/components/components.d.ts +0 -119
  25. package/lib/components/components.js +0 -606
  26. package/lib/components/fields/AnnotationField.d.ts +0 -34
  27. package/lib/components/fields/AnnotationField.js +0 -242
  28. package/lib/components/fields/AnyToBooleanField.d.ts +0 -18
  29. package/lib/components/fields/AnyToBooleanField.js +0 -20
  30. package/lib/components/fields/ArrayBulkField.d.ts +0 -23
  31. package/lib/components/fields/ArrayBulkField.js +0 -82
  32. package/lib/components/fields/ArrayCombinerField.d.ts +0 -36
  33. package/lib/components/fields/ArrayCombinerField.js +0 -138
  34. package/lib/components/fields/ArrayField.d.ts +0 -39
  35. package/lib/components/fields/ArrayField.js +0 -148
  36. package/lib/components/fields/AudioArrayField.d.ts +0 -22
  37. package/lib/components/fields/AudioArrayField.js +0 -100
  38. package/lib/components/fields/AutoArrayField.d.ts +0 -24
  39. package/lib/components/fields/AutoArrayField.js +0 -56
  40. package/lib/components/fields/AutosuggestField.d.ts +0 -69
  41. package/lib/components/fields/AutosuggestField.js +0 -299
  42. package/lib/components/fields/CombinedValueDisplayField.d.ts +0 -41
  43. package/lib/components/fields/CombinedValueDisplayField.js +0 -100
  44. package/lib/components/fields/ConditionalOnChangeField.d.ts +0 -42
  45. package/lib/components/fields/ConditionalOnChangeField.js +0 -107
  46. package/lib/components/fields/ConditionalUiSchemaField.d.ts +0 -123
  47. package/lib/components/fields/ConditionalUiSchemaField.js +0 -143
  48. package/lib/components/fields/ContextInjectionField.d.ts +0 -24
  49. package/lib/components/fields/ContextInjectionField.js +0 -68
  50. package/lib/components/fields/DataLeakerField.d.ts +0 -40
  51. package/lib/components/fields/DataLeakerField.js +0 -68
  52. package/lib/components/fields/DefaultValueArrayField.d.ts +0 -34
  53. package/lib/components/fields/DefaultValueArrayField.js +0 -59
  54. package/lib/components/fields/DependentBooleanField.d.ts +0 -38
  55. package/lib/components/fields/DependentBooleanField.js +0 -87
  56. package/lib/components/fields/DependentDisableField.d.ts +0 -35
  57. package/lib/components/fields/DependentDisableField.js +0 -71
  58. package/lib/components/fields/EnumRangeArrayField.d.ts +0 -27
  59. package/lib/components/fields/EnumRangeArrayField.js +0 -115
  60. package/lib/components/fields/ExtraLabelRowField.d.ts +0 -38
  61. package/lib/components/fields/ExtraLabelRowField.js +0 -100
  62. package/lib/components/fields/FakePropertyField.d.ts +0 -18
  63. package/lib/components/fields/FakePropertyField.js +0 -48
  64. package/lib/components/fields/FilterArrayField.d.ts +0 -73
  65. package/lib/components/fields/FilterArrayField.js +0 -121
  66. package/lib/components/fields/FlatField.d.ts +0 -29
  67. package/lib/components/fields/FlatField.js +0 -171
  68. package/lib/components/fields/GeocoderField.d.ts +0 -47
  69. package/lib/components/fields/GeocoderField.js +0 -372
  70. package/lib/components/fields/GridLayoutField.d.ts +0 -18
  71. package/lib/components/fields/GridLayoutField.js +0 -32
  72. package/lib/components/fields/HiddenField.d.ts +0 -10
  73. package/lib/components/fields/HiddenField.js +0 -11
  74. package/lib/components/fields/ImageArrayField.d.ts +0 -172
  75. package/lib/components/fields/ImageArrayField.js +0 -697
  76. package/lib/components/fields/ImageDisplayField.d.ts +0 -18
  77. package/lib/components/fields/ImageDisplayField.js +0 -44
  78. package/lib/components/fields/InitiallyHiddenField.d.ts +0 -21
  79. package/lib/components/fields/InitiallyHiddenField.js +0 -58
  80. package/lib/components/fields/InjectDefaultValueField.d.ts +0 -37
  81. package/lib/components/fields/InjectDefaultValueField.js +0 -68
  82. package/lib/components/fields/InjectField.d.ts +0 -46
  83. package/lib/components/fields/InjectField.js +0 -88
  84. package/lib/components/fields/InputWithDefaultValueButtonField.d.ts +0 -25
  85. package/lib/components/fields/InputWithDefaultValueButtonField.js +0 -61
  86. package/lib/components/fields/LocalityField.d.ts +0 -22
  87. package/lib/components/fields/LocalityField.js +0 -94
  88. package/lib/components/fields/LocationChooserField.d.ts +0 -27
  89. package/lib/components/fields/LocationChooserField.js +0 -440
  90. package/lib/components/fields/MapArrayField.d.ts +0 -78
  91. package/lib/components/fields/MapArrayField.js +0 -1783
  92. package/lib/components/fields/MapField.d.ts +0 -48
  93. package/lib/components/fields/MapField.js +0 -434
  94. package/lib/components/fields/MultiAnyToBooleanField.d.ts +0 -25
  95. package/lib/components/fields/MultiAnyToBooleanField.js +0 -100
  96. package/lib/components/fields/MultiArrayField.d.ts +0 -53
  97. package/lib/components/fields/MultiArrayField.js +0 -224
  98. package/lib/components/fields/MultiLanguageField.d.ts +0 -13
  99. package/lib/components/fields/MultiLanguageField.js +0 -52
  100. package/lib/components/fields/MultiTagArrayField.d.ts +0 -36
  101. package/lib/components/fields/MultiTagArrayField.js +0 -142
  102. package/lib/components/fields/NamedPlaceChooserField.d.ts +0 -29
  103. package/lib/components/fields/NamedPlaceChooserField.js +0 -380
  104. package/lib/components/fields/NamedPlaceSaverField.d.ts +0 -29
  105. package/lib/components/fields/NamedPlaceSaverField.js +0 -237
  106. package/lib/components/fields/NestField.d.ts +0 -148
  107. package/lib/components/fields/NestField.js +0 -289
  108. package/lib/components/fields/ObjectField.d.ts +0 -2
  109. package/lib/components/fields/ObjectField.js +0 -119
  110. package/lib/components/fields/PdfArrayField.d.ts +0 -21
  111. package/lib/components/fields/PdfArrayField.js +0 -40
  112. package/lib/components/fields/PrefillingArrayField.d.ts +0 -22
  113. package/lib/components/fields/PrefillingArrayField.js +0 -65
  114. package/lib/components/fields/SchemaField.d.ts +0 -7
  115. package/lib/components/fields/SchemaField.js +0 -109
  116. package/lib/components/fields/ScopeField.d.ts +0 -85
  117. package/lib/components/fields/ScopeField.js +0 -521
  118. package/lib/components/fields/SectionArrayField.d.ts +0 -38
  119. package/lib/components/fields/SectionArrayField.js +0 -618
  120. package/lib/components/fields/SelectTreeField.d.ts +0 -39
  121. package/lib/components/fields/SelectTreeField.js +0 -143
  122. package/lib/components/fields/SingleActiveArrayField.d.ts +0 -49
  123. package/lib/components/fields/SingleActiveArrayField.js +0 -974
  124. package/lib/components/fields/SingleItemArrayField.d.ts +0 -15
  125. package/lib/components/fields/SingleItemArrayField.js +0 -60
  126. package/lib/components/fields/SortArrayField.d.ts +0 -73
  127. package/lib/components/fields/SortArrayField.js +0 -351
  128. package/lib/components/fields/SplitField.d.ts +0 -28
  129. package/lib/components/fields/SplitField.js +0 -65
  130. package/lib/components/fields/StringToArrayField.d.ts +0 -24
  131. package/lib/components/fields/StringToArrayField.js +0 -48
  132. package/lib/components/fields/SumField.d.ts +0 -35
  133. package/lib/components/fields/SumField.js +0 -83
  134. package/lib/components/fields/TableField.d.ts +0 -18
  135. package/lib/components/fields/TableField.js +0 -136
  136. package/lib/components/fields/TagArrayField.d.ts +0 -38
  137. package/lib/components/fields/TagArrayField.js +0 -128
  138. package/lib/components/fields/ToggleAdditionalArrayFieldsField.d.ts +0 -26
  139. package/lib/components/fields/ToggleAdditionalArrayFieldsField.js +0 -81
  140. package/lib/components/fields/UiFieldApplierField.d.ts +0 -30
  141. package/lib/components/fields/UiFieldApplierField.js +0 -106
  142. package/lib/components/fields/UiFieldMapperArrayField.d.ts +0 -42
  143. package/lib/components/fields/UiFieldMapperArrayField.js +0 -121
  144. package/lib/components/fields/UnitCountShorthandField.d.ts +0 -22
  145. package/lib/components/fields/UnitCountShorthandField.js +0 -149
  146. package/lib/components/fields/UnitListShorthandArrayField.d.ts +0 -26
  147. package/lib/components/fields/UnitListShorthandArrayField.js +0 -108
  148. package/lib/components/fields/UnitShorthandField.d.ts +0 -32
  149. package/lib/components/fields/UnitShorthandField.js +0 -220
  150. package/lib/components/templates/ArrayFieldTemplate.d.ts +0 -85
  151. package/lib/components/templates/ArrayFieldTemplate.js +0 -417
  152. package/lib/components/templates/BaseInputTemplate.d.ts +0 -11
  153. package/lib/components/templates/BaseInputTemplate.js +0 -80
  154. package/lib/components/templates/DescriptionField.d.ts +0 -1
  155. package/lib/components/templates/DescriptionField.js +0 -37
  156. package/lib/components/templates/ErrorListTemplate.d.ts +0 -9
  157. package/lib/components/templates/ErrorListTemplate.js +0 -95
  158. package/lib/components/templates/FieldTemplate.d.ts +0 -6
  159. package/lib/components/templates/FieldTemplate.js +0 -112
  160. package/lib/components/templates/ObjectFieldTemplate.d.ts +0 -7
  161. package/lib/components/templates/ObjectFieldTemplate.js +0 -66
  162. package/lib/components/templates/TitleField.d.ts +0 -9
  163. package/lib/components/templates/TitleField.js +0 -51
  164. package/lib/components/widgets/AnyToBooleanWidget.d.ts +0 -20
  165. package/lib/components/widgets/AnyToBooleanWidget.js +0 -49
  166. package/lib/components/widgets/AutosuggestWidget.d.ts +0 -66
  167. package/lib/components/widgets/AutosuggestWidget.js +0 -1127
  168. package/lib/components/widgets/CheckboxWidget.d.ts +0 -37
  169. package/lib/components/widgets/CheckboxWidget.js +0 -139
  170. package/lib/components/widgets/DateTimeWidget.d.ts +0 -62
  171. package/lib/components/widgets/DateTimeWidget.js +0 -251
  172. package/lib/components/widgets/DateWidget.d.ts +0 -23
  173. package/lib/components/widgets/DateWidget.js +0 -41
  174. package/lib/components/widgets/HiddenWidget.d.ts +0 -15
  175. package/lib/components/widgets/HiddenWidget.js +0 -19
  176. package/lib/components/widgets/ImageSelectWidget.d.ts +0 -14
  177. package/lib/components/widgets/ImageSelectWidget.js +0 -57
  178. package/lib/components/widgets/InformalTaxonGroupChooserWidget.d.ts +0 -43
  179. package/lib/components/widgets/InformalTaxonGroupChooserWidget.js +0 -237
  180. package/lib/components/widgets/InputGroupWidget.d.ts +0 -21
  181. package/lib/components/widgets/InputGroupWidget.js +0 -36
  182. package/lib/components/widgets/InputWithDefaultValueButtonWidget.d.ts +0 -21
  183. package/lib/components/widgets/InputWithDefaultValueButtonWidget.js +0 -47
  184. package/lib/components/widgets/NumberWidget.d.ts +0 -13
  185. package/lib/components/widgets/NumberWidget.js +0 -21
  186. package/lib/components/widgets/PlainTextWidget.d.ts +0 -12
  187. package/lib/components/widgets/PlainTextWidget.js +0 -24
  188. package/lib/components/widgets/SelectWidget.d.ts +0 -52
  189. package/lib/components/widgets/SelectWidget.js +0 -158
  190. package/lib/components/widgets/SeparatedDateTimeWidget.d.ts +0 -19
  191. package/lib/components/widgets/SeparatedDateTimeWidget.js +0 -59
  192. package/lib/components/widgets/TaxonImageWidget.d.ts +0 -13
  193. package/lib/components/widgets/TaxonImageWidget.js +0 -30
  194. package/lib/components/widgets/TextSelectWidget.d.ts +0 -25
  195. package/lib/components/widgets/TextSelectWidget.js +0 -94
  196. package/lib/components/widgets/TextareaWidget.d.ts +0 -32
  197. package/lib/components/widgets/TextareaWidget.js +0 -87
  198. package/lib/components/widgets/TimeWidget.d.ts +0 -11
  199. package/lib/components/widgets/TimeWidget.js +0 -19
  200. package/lib/components/widgets/URLWidget.d.ts +0 -14
  201. package/lib/components/widgets/URLWidget.js +0 -12
  202. package/lib/components/widgets/UpperCaseWidget.d.ts +0 -13
  203. package/lib/components/widgets/UpperCaseWidget.js +0 -21
  204. package/lib/index.d.ts +0 -20
  205. package/lib/index.js +0 -50
  206. package/lib/services/blocker-service.d.ts +0 -11
  207. package/lib/services/blocker-service.js +0 -55
  208. package/lib/services/custom-event-service.d.ts +0 -17
  209. package/lib/services/custom-event-service.js +0 -35
  210. package/lib/services/dom-id-service.d.ts +0 -8
  211. package/lib/services/dom-id-service.js +0 -30
  212. package/lib/services/focus-service.d.ts +0 -13
  213. package/lib/services/focus-service.js +0 -60
  214. package/lib/services/id-service.d.ts +0 -22
  215. package/lib/services/id-service.js +0 -130
  216. package/lib/services/key-handler-service.d.ts +0 -56
  217. package/lib/services/key-handler-service.js +0 -184
  218. package/lib/services/root-instance-service.d.ts +0 -25
  219. package/lib/services/root-instance-service.js +0 -49
  220. package/lib/services/settings-service.d.ts +0 -34
  221. package/lib/services/settings-service.js +0 -154
  222. package/lib/services/singleton-map-service.d.ts +0 -23
  223. package/lib/services/singleton-map-service.js +0 -44
  224. package/lib/services/submit-hook-service.d.ts +0 -24
  225. package/lib/services/submit-hook-service.js +0 -73
  226. package/lib/styles.d.ts +0 -1
  227. package/lib/styles.js +0 -4
  228. package/lib/themes/bs3.d.ts +0 -3
  229. package/lib/themes/bs3.js +0 -133
  230. package/lib/themes/bs5.d.ts +0 -3
  231. package/lib/themes/bs5.js +0 -111
  232. package/lib/themes/glyphicon-fa-mapping.d.ts +0 -3
  233. package/lib/themes/glyphicon-fa-mapping.js +0 -271
  234. package/lib/themes/stub.d.ts +0 -3
  235. package/lib/themes/stub.js +0 -82
  236. package/lib/themes/theme.d.ts +0 -233
  237. package/lib/themes/theme.js +0 -2
  238. package/lib/translations.json +0 -847
  239. package/lib/utils.d.ts +0 -171
  240. package/lib/utils.js +0 -1191
  241. package/lib/validation.d.ts +0 -7
  242. package/lib/validation.js +0 -141
  243. package/llol +0 -10
  244. package/llol.pdf +0 -10
  245. package/playwright-report/index.html +0 -62
  246. package/q +0 -196
  247. package/rename.sh +0 -24
  248. package/trip-report.spec.ts +0 -594
@@ -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
- });