@luomus/laji-form 15.1.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 -177
  41. package/test-export/test-utils.js +218 -214
  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,697 +0,0 @@
1
- "use strict";
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- var __rest = (this && this.__rest) || function (s, e) {
9
- var t = {};
10
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
11
- t[p] = s[p];
12
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
13
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
14
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
15
- t[p[i]] = s[p[i]];
16
- }
17
- return t;
18
- };
19
- Object.defineProperty(exports, "__esModule", { value: true });
20
- exports.Thumbnail = exports.MediaArrayField = void 0;
21
- const React = require("react");
22
- const PropTypes = require("prop-types");
23
- const immutability_helper_1 = require("immutability-helper");
24
- const Context_1 = require("../../Context");
25
- const react_dropzone_1 = require("react-dropzone");
26
- const components_1 = require("../components");
27
- const LajiForm_1 = require("../LajiForm");
28
- const utils_1 = require("../../utils");
29
- const BaseComponent_1 = require("../BaseComponent");
30
- const Spinner = require("react-spinner");
31
- const exif = require("exif-js");
32
- const utils_2 = require("@luomus/laji-map/lib/utils");
33
- const moment = require("moment");
34
- const ReactContext_1 = require("../../ReactContext");
35
- const utils_3 = require("@rjsf/utils");
36
- function toDecimal(number) {
37
- if (!number)
38
- return undefined;
39
- return number[0].numerator + number[1].numerator /
40
- (60 * number[1].denominator) + number[2].numerator / (3600 * number[2].denominator);
41
- }
42
- let mediaUuid = 0;
43
- let ImageArrayField = class ImageArrayField extends React.Component {
44
- constructor() {
45
- super(...arguments);
46
- this.ALLOWED_FILE_TYPES = ["image/jpeg", "image/png", "image/bmp", "image/tiff", "image/gif"];
47
- this.ACCEPT_FILE_TYPES = ["image/*"];
48
- this.MAX_FILE_SIZE = 20000000;
49
- this.KEY = "IMAGE";
50
- this.ENDPOINT = "images";
51
- this.GLYPH = "camera";
52
- this.TRANSLATION_TAKE_NEW = "TakeNewPhoto";
53
- this.TRANSLATION_SELECT_FILE = "SelectPhoto";
54
- this.TRANSLATION_NO_MEDIA = "NoPhoto";
55
- this.CONTAINER_CLASS = "images-container";
56
- this.METADATA_FORM_ID = "JX.111712";
57
- this.renderMedia = (id) => React.createElement(Thumbnail, { id: id, apiClient: this.props.formContext.apiClient });
58
- this.renderLoadingMedia = (id) => React.createElement(Thumbnail, { dataURL: id, loading: true, apiClient: this.props.formContext.apiClient });
59
- this.onMediaClick = (i) => this.openModalFor(i);
60
- this.renderModalMedia = () => React.createElement("img", { src: this.state.modalMediaSrc });
61
- }
62
- formatValue(value, options, props) {
63
- const { translations } = props.formContext;
64
- return value && value.length
65
- ? `${value.length} ${translations.HowManyPhotos}`
66
- : null;
67
- }
68
- };
69
- ImageArrayField = __decorate([
70
- MediaArrayField
71
- ], ImageArrayField);
72
- exports.default = ImageArrayField;
73
- function MediaArrayField(ComposedComponent) {
74
- let MediaArrayField = class MediaArrayField extends ComposedComponent {
75
- constructor(...args) {
76
- super(...args);
77
- this.deprecatedOptions = {
78
- imageAddModal: "addModal",
79
- autoOpenImageAddModal: "autoOpenAddModal"
80
- };
81
- this.addMediaContainerRef = React.createRef();
82
- this.getOptions = (uiSchema) => {
83
- let options = utils_1.getUiOptions(uiSchema);
84
- Object.keys(this.deprecatedOptions).forEach(deprecated => {
85
- if (options[deprecated] !== undefined) {
86
- options = Object.assign(Object.assign({}, options), { [this.deprecatedOptions[deprecated]]: options[deprecated] });
87
- }
88
- });
89
- return options;
90
- };
91
- this.onDragEnter = () => { this.setState({ dragging: true }); };
92
- this.onDragLeave = () => { this.setState({ dragging: false }); };
93
- this.onDrop = (files) => {
94
- this.state.dragging && this.setState({ dragging: false });
95
- this.onFileFormChange(files);
96
- };
97
- this.defaultOnClick = () => {
98
- const { addModal } = utils_1.getUiOptions(this.props.uiSchema);
99
- this.setState({ addModal });
100
- };
101
- this.onKeyDown = this.props.formContext.utils.keyboardClick(() => {
102
- var _a;
103
- const input = (_a = this.addMediaContainerRef.current) === null || _a === void 0 ? void 0 : _a.querySelector("input");
104
- const { addModal } = utils_1.getUiOptions(this.props.uiSchema);
105
- addModal ? this.defaultOnClick() : input === null || input === void 0 ? void 0 : input.click();
106
- });
107
- this.renderMedias = () => {
108
- const { disabled, readonly } = this.props;
109
- const { deleteConfirmPlacement = "top" } = utils_1.getUiOptions(this.props.uiSchema);
110
- return (this.props.formData || []).map((item, i) => (React.createElement("div", { key: i, className: "media-container" },
111
- React.createElement("a", { onClick: this.onMediaClick(i) }, this.renderMedia(item, i)),
112
- React.createElement(components_1.DeleteButton, { corner: true, confirm: true, confirmPlacement: deleteConfirmPlacement, translations: this.props.formContext.translations, onClick: this.onMediaRmClick(i), disabled: disabled || readonly, id: `${this.props.idSchema.$id}_${i}` }))));
113
- };
114
- this.renderLoadingMedias = () => {
115
- const containerId = this.getContainerId();
116
- return (this.state.tmpMedias || []).map((item, i) => {
117
- const medias = this._context.tmpMedias[containerId];
118
- if (!medias || !medias[item])
119
- return null;
120
- return (React.createElement("div", { key: i, className: "media-container" },
121
- React.createElement("a", null, this.renderLoadingMedia(medias[item]))));
122
- });
123
- };
124
- this.openModalFor = (i) => () => {
125
- const item = this.props.formData[i];
126
- this.setState({ metadataModalOpen: i });
127
- this.fetching = item;
128
- this.apiClient.fetch(`/${this.ENDPOINT}/${item}`).then((response) => {
129
- if (response.id !== this.fetching)
130
- return;
131
- this._context.metadatas[item] = response;
132
- this.setState({ modalIdx: i, modalMediaSrc: response.fullURL, modalMetadata: this._context.metadatas[item] });
133
- });
134
- };
135
- this.onMediaRmClick = (i) => () => {
136
- const id = this.props.formData[i];
137
- this.props.onChange(immutability_helper_1.default(this.props.formData, { $splice: [[i, 1]] }));
138
- this.apiClient.fetch(`/${this.ENDPOINT}/${id}`, undefined, {
139
- method: "DELETE",
140
- failSilently: true
141
- });
142
- };
143
- this.hideMetadataModal = () => this.setState({ metadataModalOpen: false, metadataSaveSuccess: undefined });
144
- this.onMetadataFormChange = (formData) => this.setState({ modalMetadata: formData });
145
- this.renderMetadataModal = () => {
146
- const { metadataModalOpen, modalIdx, modalMetadata, metadataSaveSuccess } = this.state;
147
- const { lang, translations } = this.props.registry.formContext;
148
- const metadataForm = this.state.metadataForm || {};
149
- if (typeof metadataModalOpen === "number" && !this.state.metadataForm) {
150
- this.apiClient.fetchCached(`/forms/${this.METADATA_FORM_ID}`, { lang, format: "schema" })
151
- .then(metadataForm => {
152
- if (this.mounted) {
153
- this.setState({ metadataForm });
154
- }
155
- });
156
- }
157
- const { Previous, Next } = this.props.formContext.translations;
158
- const isOpen = modalIdx === metadataModalOpen && modalMetadata && metadataForm.schema;
159
- const uiSchema = isOpen ? Object.assign(Object.assign({}, metadataForm.uiSchema), { "ui:shortcuts": Object.assign(Object.assign({}, (metadataForm.uiSchema["ui:shorcuts"] || {})), this.props.formContext.services.keyHandler.shortcuts), "ui:disabled": this.props.disabled, "ui:readonly": this.props.readonly }) : undefined;
160
- const { metadataModal = true } = utils_1.getUiOptions(this.props.uiSchema);
161
- const { Modal, Alert, Pager } = this.context.theme;
162
- return typeof metadataModalOpen === "number" ?
163
- React.createElement(Modal, { dialogClassName: "laji-form media-modal", show: true, onHide: this.hideMetadataModal },
164
- React.createElement(Modal.Header, { closeButton: true },
165
- React.createElement("br", null),
166
- React.createElement(Pager, null,
167
- React.createElement(Pager.Item, { previous: true, onClick: this.openModalFor(metadataModalOpen - 1), disabled: metadataModalOpen <= 0 },
168
- "\u2190 ",
169
- Previous),
170
- React.createElement(Pager.Item, { next: true, onClick: this.openModalFor(metadataModalOpen + 1), disabled: metadataModalOpen >= this.props.formData.length - 1 },
171
- Next,
172
- " \u2192"))),
173
- React.createElement(Modal.Body, null,
174
- React.createElement("div", { className: `laji-form${metadataModal ? " media-modal-content" : ""}` }, isOpen
175
- ? React.createElement(React.Fragment, null,
176
- this.renderModalMedia(modalIdx),
177
- metadataModal && React.createElement(LajiForm_1.default, Object.assign({}, metadataForm, { uiSchema: uiSchema, formData: modalMetadata, onChange: this.onMetadataFormChange, onSubmit: this.onMediaMetadataUpdate, submitText: translations.Save, lang: lang, apiClient: this.props.formContext.apiClient.apiClient, uiSchemaContext: this.props.formContext.uiSchemaContext, showShortcutButton: false }), (metadataSaveSuccess !== undefined) ? (React.createElement(Alert, { variant: metadataSaveSuccess ? "success" : "danger" }, translations[metadataSaveSuccess ? "SaveSuccess" : "SaveFail"])) : null))
178
- : React.createElement(Spinner, null)))) : null;
179
- };
180
- this.onHideMediaAddModal = () => this.setState({ addModal: undefined }, () => {
181
- this.parseExif([]);
182
- });
183
- this.renderMediaAddModal = () => {
184
- const { disabled, readonly } = this.props;
185
- const { addModal } = this.state;
186
- const { labels: { cancel } = { cancel: undefined } } = (utils_1.isObject(addModal) ? addModal : {});
187
- const { translations } = this.props.formContext;
188
- if (!addModal)
189
- return null;
190
- const { Modal } = this.context.theme;
191
- return (React.createElement(Modal, { dialogClassName: "laji-form media-add-modal", show: true, onHide: this.onHideMediaAddModal },
192
- React.createElement(Modal.Header, { closeButton: true }),
193
- React.createElement(Modal.Body, null,
194
- [
195
- ["environment",
196
- this.TRANSLATION_TAKE_NEW
197
- ],
198
- [
199
- undefined,
200
- this.TRANSLATION_SELECT_FILE
201
- ]
202
- ].map(([captureMethod, label]) => React.createElement(react_dropzone_1.default, { key: captureMethod || "", accept: this.ACCEPT_FILE_TYPES, onDrop: this.onDrop, disabled: readonly || disabled }, ({ getRootProps, getInputProps }) => {
203
- return (React.createElement("div", Object.assign({ className: "btn-block" }, getRootProps()),
204
- React.createElement("input", Object.assign({}, getInputProps(), { capture: captureMethod })),
205
- React.createElement(components_1.Button, { block: true, disabled: readonly || disabled }, label ? translations[label] : undefined)));
206
- })),
207
- React.createElement(components_1.Button, { className: "cancel", block: true, onClick: this.onHideMediaAddModal }, cancel || translations[this.TRANSLATION_NO_MEDIA]))));
208
- };
209
- this.onAlertOk = () => {
210
- this.setState({ alert: false, alertMsg: undefined });
211
- };
212
- this.parseExif = (files) => {
213
- const { exifParsers = [] } = utils_1.getUiOptions(this.props.uiSchema);
214
- if (!exifParsers)
215
- return;
216
- const found = exifParsers.reduce((found, { parse }) => {
217
- found[parse] = false;
218
- return found;
219
- }, {});
220
- return files.reduce((promise, file) => {
221
- if (Object.keys(found).every(k => found[k])) {
222
- return promise;
223
- }
224
- return promise.then(found => new Promise(resolve => {
225
- exif.getData(file, function () {
226
- if ("geometry" in found)
227
- try {
228
- const coordinates = ["GPSLongitude", "GPSLatitude"].map(tag => toDecimal(exif.getTag(this, tag)));
229
- const rawDatum = exif.getTag(this, "GPSMapDatum");
230
- const datum = typeof rawDatum === "string"
231
- ? rawDatum.trim().toUpperCase()
232
- : undefined;
233
- if ((!datum || datum === "WGS-84" || datum === "WGS84") && utils_2.validateLatLng(coordinates, utils_2.wgs84Validator)) {
234
- found.geometry = {
235
- type: "Point",
236
- coordinates
237
- };
238
- }
239
- }
240
- catch (e) {
241
- console.info("Reading GPS from EXIF failed", e);
242
- }
243
- const readDateFromFile = () => {
244
- if (file.lastModified) {
245
- const momentDate = moment(file.lastModified);
246
- if (momentDate.isValid()) {
247
- const date = momentDate.format("YYYY-MM-DDTHH:mm");
248
- if (date) {
249
- found.date = date;
250
- }
251
- }
252
- }
253
- };
254
- if ("date" in found) {
255
- try {
256
- const rawDate = exif.getTag(this, "DateTimeOriginal");
257
- const momentDate = moment(rawDate, "YYYY:MM:DD HH:mm:ss");
258
- if (momentDate.isValid()) {
259
- found.date = momentDate.format("YYYY-MM-DDTHH:mm");
260
- }
261
- else {
262
- readDateFromFile();
263
- }
264
- }
265
- catch (e) {
266
- console.info("Reading date from EXIF failed, trying to read from file", e);
267
- readDateFromFile();
268
- }
269
- }
270
- else {
271
- readDateFromFile();
272
- }
273
- resolve(found);
274
- });
275
- }));
276
- }, Promise.resolve(found)).then((found) => {
277
- let { registry } = this.props;
278
- const lajiFormInstance = this.props.formContext.services.rootInstance;
279
- const schema = lajiFormInstance.getSchema();
280
- let formData = lajiFormInstance.getFormData();
281
- exifParsers.filter((f) => f.type === "event" || found[f.parse]).forEach(({ field, parse, type, eventName }) => {
282
- if (type === "mutate") {
283
- formData = utils_1.updateFormDataWithJSONPointer({ formData, schema, registry }, found[parse], field);
284
- }
285
- if (type === "event") {
286
- this.props.formContext.services.customEvents.send(`root_${utils_1.JSONPointerToId(field)}`, eventName, found[parse], undefined, { bubble: false });
287
- }
288
- });
289
- return formData;
290
- });
291
- };
292
- this.sideEffects = (formData) => {
293
- const lajiFormInstance = this.props.formContext.services.rootInstance;
294
- const schema = lajiFormInstance.getSchema();
295
- const lajiFormFormData = lajiFormInstance.getFormData();
296
- const { sideEffects } = utils_1.getUiOptions(this.props.uiSchema);
297
- if (sideEffects) {
298
- const thisPath = utils_1.idSchemaIdToJSONPointer(this.props.idSchema.$id);
299
- const containerPath = thisPath.replace(/^(\/.*)\/.*$/, "$1");
300
- const parseRelativePaths = (path, containerPath) => {
301
- while ((path.match(/\/\.\./g) || []).length > 1) {
302
- containerPath = containerPath.replace(/^(\/.*)\/.*$/, "$1");
303
- path = path.replace(/^(.*)\/\.\.(.*)/, "$1$2");
304
- }
305
- return path.replace(/^(.*)\/\.\.(.*)/, `$1${containerPath}$2`);
306
- };
307
- formData = Object.keys(sideEffects).reduce((formData, field) => {
308
- const jsonPointer = parseRelativePaths(field, containerPath);
309
- return !utils_1.isDefaultData(utils_1.parseJSONPointer(formData, jsonPointer), utils_1.parseSchemaFromFormDataPointer(schema, jsonPointer))
310
- ? formData
311
- : utils_1.updateFormDataWithJSONPointer({ schema, registry: this.props.registry, formData }, sideEffects[field], parseRelativePaths(field, containerPath));
312
- }, formData);
313
- }
314
- if (formData !== lajiFormFormData) {
315
- lajiFormInstance.onChange(formData);
316
- }
317
- };
318
- this.onFileFormChange = (files) => {
319
- var _a;
320
- if (this.state.addModal) {
321
- this.setState({ addModal: undefined });
322
- }
323
- (_a = this.parseExif(files)) === null || _a === void 0 ? void 0 : _a.then(this.sideEffects);
324
- const id = this.getContainerId();
325
- const lajiFormInstance = this.props.formContext.services.rootInstance;
326
- const saveAndOnChange = () => this.saveMedias(files).then(mediaIds => {
327
- if (!lajiFormInstance.isMounted() || !mediaIds) {
328
- return;
329
- }
330
- let pointer = this.props.formContext.services.ids.getJSONPointerFromLajiFormIdAndFormDataAndIdSchemaId(this.props.idSchema.$id, id);
331
- if (!this.mounted && !pointer) {
332
- return;
333
- }
334
- const newFormData = [
335
- ...(this.mounted
336
- ? this.props.formData || []
337
- : utils_1.parseJSONPointer(lajiFormInstance.getFormData(), pointer) || []),
338
- ...mediaIds
339
- ];
340
- if (!lajiFormInstance.isMounted())
341
- return;
342
- if ((this.mounted || id === "root") && id === this.getContainerId()) {
343
- this.props.onChange(newFormData);
344
- // Settimeout because the resource is undefined 404 if fetched right away.
345
- setTimeout(() => {
346
- if (!this.mounted)
347
- return;
348
- const { autoOpenMetadataModal = false } = utils_1.getUiOptions(this.props.uiSchema);
349
- let shouldOpenMetadataModal = autoOpenMetadataModal;
350
- if (shouldOpenMetadataModal) {
351
- this.openModalFor(newFormData.length - mediaIds.length)();
352
- }
353
- }, 0);
354
- return;
355
- }
356
- pointer = this.props.formContext.services.ids.getJSONPointerFromLajiFormIdAndFormDataAndIdSchemaId(this.props.idSchema.$id, id);
357
- lajiFormInstance.onChange(utils_1.updateSafelyWithJSONPointer(lajiFormInstance.getFormData(), newFormData, pointer));
358
- });
359
- this.props.formContext.services.submitHooks.add(this.props, saveAndOnChange);
360
- };
361
- this.getContainerId = () => {
362
- const { _parentLajiFormId = "root" } = this.props.formContext;
363
- return _parentLajiFormId;
364
- };
365
- this.addNameToDataURL = (dataURL, name) => {
366
- return dataURL.replace(";base64", `;name=${name};base64`);
367
- };
368
- this.processFiles = (files) => {
369
- return Promise.all([].map.call(files, this.processFile));
370
- };
371
- this.processFile = (file) => {
372
- const { name, size, type } = file;
373
- return new Promise(resolve => {
374
- const reader = new window.FileReader();
375
- reader.onload = event => {
376
- var _a;
377
- resolve({
378
- dataURL: this.addNameToDataURL((_a = event.target) === null || _a === void 0 ? void 0 : _a.result, name),
379
- name,
380
- size,
381
- type
382
- });
383
- };
384
- reader.readAsDataURL(file);
385
- });
386
- };
387
- this.onMediaMetadataUpdate = ({ formData }) => {
388
- this.props.formContext.services.blocker.push();
389
- this.apiClient.fetch(`/${this.ENDPOINT}/${formData.id}`, undefined, {
390
- method: "PUT",
391
- headers: {
392
- "accept": "application/json",
393
- "content-type": "application/json"
394
- },
395
- body: JSON.stringify(formData)
396
- }).then(() => {
397
- this.props.formContext.services.blocker.pop();
398
- const notify = () => this.props.formContext.notifier.success(this.props.formContext.translations.SaveSuccess);
399
- if (this.mounted) {
400
- this.setState({ metadataModalOpen: false }, notify);
401
- }
402
- else {
403
- notify();
404
- }
405
- }).catch(() => {
406
- this.props.formContext.services.blocker.pop();
407
- this.mounted && this.setState({ metadataSaveSuccess: false });
408
- });
409
- };
410
- this.getMetadataPromise = () => {
411
- let mediaMetadata = this.props.formContext.mediaMetadata
412
- || { intellectualRights: "MZ.intellectualRightsARR" };
413
- const MACode = this.props.formContext.uiSchemaContext.creator;
414
- return ("capturerVerbatim" in mediaMetadata)
415
- ? Promise.resolve(Object.assign(Object.assign({}, mediaMetadata), { capturerVerbatim: [mediaMetadata.capturerVerbatim] }))
416
- : MACode
417
- ? this.apiClient.fetchCached(`/person/by-id/${MACode}`).then(({ fullName = MACode }) => (Object.assign(Object.assign({ capturerVerbatim: Array.isArray(fullName) ? fullName : [fullName] }, mediaMetadata), { intellectualOwner: fullName }))).catch(() => Promise.resolve(mediaMetadata))
418
- : Promise.resolve(mediaMetadata);
419
- };
420
- this.getMaxFileSizeAsString = () => {
421
- let maxSize = this.MAX_FILE_SIZE.toString().substring(0, this.MAX_FILE_SIZE.toString().length - 6);
422
- return maxSize + " " + `${this.props.formContext.translations.Mb}`;
423
- };
424
- this.getAllowedMediaFormatsAsString = () => {
425
- let formats = "";
426
- for (let i = 0; i < this.ALLOWED_FILE_TYPES.length; i++) {
427
- formats += this.ALLOWED_FILE_TYPES[i].split("/")[1];
428
- if (i < this.ALLOWED_FILE_TYPES.length - 2) {
429
- formats += ", ";
430
- }
431
- else if (i === this.ALLOWED_FILE_TYPES.length - 2) {
432
- formats += ` ${this.props.formContext.translations.and} `;
433
- }
434
- }
435
- return formats;
436
- };
437
- const [props] = args;
438
- ["ALLOWED_FILE_TYPES",
439
- "MAX_FILE_SIZE",
440
- "KEY",
441
- "ENDPOINT",
442
- "GLYPH",
443
- "renderMedia",
444
- "renderLoadingMedia",
445
- "onMediaClick",
446
- "formatValue",
447
- "TRANSLATION_TAKE_NEW",
448
- "TRANSLATION_SELECT_FILE",
449
- "TRANSLATION_NO_MEDIA",
450
- "CONTAINER_CLASS"
451
- ].forEach(prop => {
452
- if (this[prop] === undefined) {
453
- throw new Error(`${utils_1.getReactComponentName(ComposedComponent)} doesn't implement MediaArrayField ${prop}`);
454
- }
455
- });
456
- const options = this.getOptions(props.uiSchema);
457
- Object.keys(this.deprecatedOptions).forEach(deprecated => {
458
- if (options[deprecated] !== undefined) {
459
- console.warn(`laji-form warning: ${utils_1.getReactComponentName(ComposedComponent)} ui:option '${deprecated}' is deprecated. Use '${this.deprecatedOptions[deprecated]}' instead!`);
460
- }
461
- });
462
- this.apiClient = props.formContext.apiClient;
463
- this._context = Context_1.default(`${this.KEY}_ARRAY_FIELD`);
464
- if (!this._context.metadatas)
465
- this._context.metadatas = {};
466
- if (!this._context.tmpMedias)
467
- this._context.tmpMedias = {};
468
- this.state = { tmpMedias: Object.keys(this._context.tmpMedias[this.getContainerId()] || {}).map(i => +i) };
469
- const { addModal, autoOpenAddModal } = options;
470
- if (addModal
471
- && autoOpenAddModal
472
- && (props.formData || []).length === 0
473
- && !props.formContext.uiSchemaContext.isEdit) {
474
- this.state.addModal = addModal; // eslint-disable-line react/no-direct-mutation-state
475
- }
476
- }
477
- componentDidMount() {
478
- this.mounted = true;
479
- }
480
- componentWillUnmount() {
481
- this.mounted = false;
482
- }
483
- render() {
484
- const { schema, uiSchema, idSchema, name, formContext, readonly, disabled } = this.props;
485
- const { translations } = formContext;
486
- const { description, addModal } = utils_1.getUiOptions(uiSchema);
487
- const title = (schema.title === undefined) ? name : schema.title;
488
- const TitleFieldTemplate = utils_3.getTemplate("TitleFieldTemplate", this.props.registry, utils_1.getUiOptions(this.props.uiSchema));
489
- const { OverlayTrigger, Tooltip, Glyphicon } = this.context.theme;
490
- const tooltip = (React.createElement(Tooltip, { id: `${this.props.idSchema.$id}-drop-zone-tooltip` },
491
- React.createElement("span", null,
492
- translations.DropOrSelectFiles,
493
- ". "),
494
- React.createElement("span", null,
495
- translations.AllowedFileFormats,
496
- " ",
497
- this.getAllowedMediaFormatsAsString(),
498
- " ",
499
- translations.and,
500
- " ",
501
- translations.allowedFileSize,
502
- " ",
503
- this.getMaxFileSizeAsString(),
504
- ".")));
505
- const { dragging } = this.state;
506
- const { Row, Col } = this.context.theme;
507
- const { DescriptionFieldTemplate } = this.props.registry.templates;
508
- return (React.createElement(Row, null,
509
- React.createElement(Col, { xs: 12 },
510
- React.createElement(TitleFieldTemplate, { title: title, schema: schema, uiSchema: uiSchema, id: idSchema.$id, registry: this.props.registry }),
511
- description !== undefined ? React.createElement(DescriptionFieldTemplate, { description: description, schema: schema, id: idSchema.$id, registry: this.props.registry }) : null,
512
- React.createElement("div", { className: `laji-form-medias ${this.CONTAINER_CLASS}` },
513
- this.renderMedias(),
514
- this.renderLoadingMedias(),
515
- React.createElement(OverlayTrigger, { overlay: tooltip },
516
- React.createElement(react_dropzone_1.default, { accept: this.ACCEPT_FILE_TYPES, onDragEnter: this.onDragEnter, onDragLeave: this.onDragLeave, onDrop: this.onDrop, disabled: readonly || disabled, noKeyboard: true }, ({ getRootProps, getInputProps }) => {
517
- const _a = getRootProps(), { onClick: _onClick } = _a, rootProps = __rest(_a, ["onClick"]);
518
- const onClick = addModal ? this.defaultOnClick : _onClick;
519
- return (React.createElement("div", Object.assign({ className: utils_1.classNames("laji-form-drop-zone", dragging && "dragging", (readonly || disabled) && " disabled"), onClick: onClick, role: "button", tabIndex: 0 }, rootProps, { onKeyDown: this.onKeyDown, ref: this.addMediaContainerRef }),
520
- React.createElement("input", Object.assign({}, getInputProps())),
521
- React.createElement(Glyphicon, { glyph: this.GLYPH })));
522
- })),
523
- this.renderMetadataModal(),
524
- this.renderMediaAddModal()))));
525
- }
526
- saveMedias(files) {
527
- const containerId = this.getContainerId();
528
- let tmpMedias;
529
- const fail = (translationKey, additionalInfo = "") => {
530
- const translation = (Array.isArray(translationKey) ? translationKey : [translationKey])
531
- .map((key) => this.props.formContext.translations[key])
532
- .join(". ");
533
- throw `${translation} ${additionalInfo}`;
534
- };
535
- return this.processFiles(files).then(processedFiles => {
536
- let invalidFile = (files.length <= 0);
537
- let fileTooLarge = false;
538
- let noValidData = true;
539
- if (!this._context.tmpMedias[containerId]) {
540
- this._context.tmpMedias[containerId] = {};
541
- }
542
- tmpMedias = processedFiles.map(f => {
543
- mediaUuid++;
544
- this._context.tmpMedias[containerId][mediaUuid] = f.dataURL;
545
- return mediaUuid;
546
- });
547
- this.mounted && this.setState({ tmpMedias: [...(this.state.tmpMedias || []), ...tmpMedias] });
548
- const formDataBody = files.reduce((body, file) => {
549
- if (!this.ALLOWED_FILE_TYPES.includes(file.type)) {
550
- invalidFile = true;
551
- }
552
- else if (file.size > this.MAX_FILE_SIZE) {
553
- fileTooLarge = true;
554
- }
555
- else {
556
- body.append("data", file);
557
- noValidData = false;
558
- }
559
- return body;
560
- }, new FormData());
561
- if (noValidData && invalidFile) {
562
- fail("AllowedFileFormats", this.getAllowedMediaFormatsAsString() + ".");
563
- return;
564
- }
565
- else if (noValidData && fileTooLarge) {
566
- fail("AllowedFileSize", this.getMaxFileSizeAsString() + ".");
567
- return;
568
- }
569
- else {
570
- return this.apiClient.fetchRaw(`/${this.ENDPOINT}`, undefined, {
571
- method: "POST",
572
- body: formDataBody
573
- });
574
- }
575
- }).then(response => {
576
- if (!response)
577
- return;
578
- if (response.status < 400) {
579
- return response.json();
580
- }
581
- else if (response.status === 400) {
582
- fail("InvalidFile");
583
- }
584
- else if (response.status === 503) {
585
- fail("InsufficientSpace");
586
- }
587
- else {
588
- fail(["SomethingWentWrong", "TryAgainLater"]);
589
- }
590
- }).then(response => {
591
- if (!response)
592
- return;
593
- return this.getMetadataPromise().then(mediaMetadata => {
594
- return Promise.all(response.map((item) => {
595
- return this.apiClient.fetchRaw(`/${this.ENDPOINT}/${item.id}`, undefined, {
596
- method: "POST",
597
- headers: {
598
- "accept": "application/json",
599
- "content-type": "application/json"
600
- },
601
- body: JSON.stringify(mediaMetadata)
602
- }).then(response => {
603
- if (response.status < 400) {
604
- return response.json();
605
- }
606
- });
607
- }));
608
- });
609
- }).then(response => {
610
- if (!response)
611
- return;
612
- const ids = response.map((item) => item ? item.id : undefined).filter(item => item !== undefined);
613
- tmpMedias.forEach(id => {
614
- delete this._context.tmpMedias[containerId][id];
615
- });
616
- this.mounted && this.setState({ tmpMedias: this.state.tmpMedias.filter(id => !tmpMedias.includes(id)) });
617
- return ids;
618
- }).catch((e) => {
619
- if (tmpMedias) {
620
- tmpMedias.forEach(id => {
621
- delete this._context.tmpMedias[containerId][id];
622
- });
623
- this.mounted && this.setState({ tmpMedias: this.state.tmpMedias.filter(id => !tmpMedias.includes(id)) });
624
- }
625
- throw e;
626
- });
627
- }
628
- };
629
- MediaArrayField.contextType = ReactContext_1.default;
630
- MediaArrayField.propTypes = {
631
- uiSchema: PropTypes.shape({
632
- "ui:options": PropTypes.shape({
633
- titleClassName: PropTypes.string,
634
- addModal: PropTypes.oneOfType([
635
- PropTypes.bool,
636
- PropTypes.shape({
637
- labels: PropTypes.shape({
638
- cancel: PropTypes.string
639
- })
640
- })
641
- ]),
642
- autoOpenAddModal: PropTypes.bool,
643
- autoOpenMetadataModal: PropTypes.bool,
644
- sideEffects: PropTypes.object,
645
- exifParsers: PropTypes.arrayOf(PropTypes.object)
646
- })
647
- }),
648
- schema: PropTypes.shape({
649
- type: PropTypes.oneOf(["array"]),
650
- items: PropTypes.shape({
651
- type: PropTypes.oneOf(["string"]).isRequired
652
- }).isRequired
653
- }).isRequired,
654
- formData: PropTypes.array
655
- };
656
- MediaArrayField.displayName = utils_1.getReactComponentName(ComposedComponent);
657
- MediaArrayField = __decorate([
658
- BaseComponent_1.default
659
- ], MediaArrayField);
660
- return MediaArrayField;
661
- }
662
- exports.MediaArrayField = MediaArrayField;
663
- class Thumbnail extends React.PureComponent {
664
- constructor(props) {
665
- super(props);
666
- this.updateURL = ({ id, apiClient, apiEndpoint = "images" }) => {
667
- if (!id)
668
- return;
669
- apiClient.fetchCached(`/${apiEndpoint}/${id}`, undefined, { failSilently: true }).then((response) => {
670
- if (!this.mounted)
671
- return;
672
- this.setState({ url: response.squareThumbnailURL });
673
- });
674
- };
675
- this.state = {};
676
- this.updateURL(props);
677
- }
678
- componentDidMount() {
679
- this.mounted = true;
680
- }
681
- componentWillUnmount() {
682
- this.mounted = false;
683
- }
684
- UNSAFE_componentWillReceiveProps(props) {
685
- this.updateURL(props);
686
- }
687
- render() {
688
- const url = this.state.url || this.props.dataURL;
689
- const img = url ? React.createElement("img", { src: url }) : null;
690
- return (!url || this.props.loading)
691
- ? React.createElement("div", { className: "media-loading" },
692
- img,
693
- React.createElement(Spinner, null))
694
- : img;
695
- }
696
- }
697
- exports.Thumbnail = Thumbnail;