@luomus/laji-form 15.1.69 → 15.1.70
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.
- package/dist/laji-form.js +1 -1
- package/lib/ApiClient.d.ts +66 -21
- package/lib/ApiClient.js +174 -68
- package/lib/components/LajiForm.js +1 -1
- package/lib/components/fields/AnnotationField.js +26 -22
- package/lib/components/fields/AudioArrayField.js +18 -5
- package/lib/components/fields/AutosuggestField.d.ts +2 -2
- package/lib/components/fields/AutosuggestField.js +4 -4
- package/lib/components/fields/EnumRangeArrayField.js +1 -1
- package/lib/components/fields/GeocoderField.js +67 -79
- package/lib/components/fields/ImageArrayField.d.ts +2 -2
- package/lib/components/fields/ImageArrayField.js +82 -112
- package/lib/components/fields/MapArrayField.js +13 -5
- package/lib/components/fields/MapField.d.ts +1 -1
- package/lib/components/fields/MapField.js +13 -5
- package/lib/components/fields/NamedPlaceChooserField/NamedPlaceChooser.d.ts +2 -1
- package/lib/components/fields/NamedPlaceChooserField/NamedPlaceChooserField.d.ts +9 -4
- package/lib/components/fields/NamedPlaceChooserField/NamedPlaceChooserField.js +51 -51
- package/lib/components/fields/NamedPlaceChooserField/Popup.d.ts +2 -1
- package/lib/components/fields/NamedPlaceSaverField.js +22 -18
- package/lib/components/fields/ScopeField.js +1 -1
- package/lib/components/fields/SingleActiveArrayField.js +2 -2
- package/lib/components/fields/SortArrayField.js +1 -1
- package/lib/components/fields/UnitCountShorthandField.js +1 -1
- package/lib/components/fields/UnitListShorthandArrayField.js +2 -2
- package/lib/components/fields/UnitShorthandField.js +14 -18
- package/lib/components/widgets/AutosuggestWidget.js +77 -66
- package/lib/components/widgets/InformalTaxonGroupChooserWidget.js +1 -1
- package/lib/components/widgets/InputWithDefaultValueButtonWidget.js +1 -2
- package/lib/validation.js +1 -1
- package/package.json +5 -3
|
@@ -195,78 +195,73 @@ let GeocoderField = class GeocoderField extends React.Component {
|
|
|
195
195
|
responseField: "long_name"
|
|
196
196
|
}
|
|
197
197
|
};
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
if (
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
return found[field] && found[field][typeIdx];
|
|
214
|
-
});
|
|
198
|
+
const found = {};
|
|
199
|
+
Object.keys(parsers).forEach(field => {
|
|
200
|
+
const parser = parsers[field];
|
|
201
|
+
parser.type.some((type, typeIdx) => {
|
|
202
|
+
response.results.forEach(result => result.address_components.forEach(addressComponent => {
|
|
203
|
+
if (addressComponent.types.includes(type)) {
|
|
204
|
+
if (!found[field])
|
|
205
|
+
found[field] = {};
|
|
206
|
+
if (!found[field][typeIdx])
|
|
207
|
+
found[field][typeIdx] = {};
|
|
208
|
+
const responseField = addressComponent[parser.responseField] ? parser.responseField : "short_name";
|
|
209
|
+
found[field][typeIdx][addressComponent[responseField]] = true;
|
|
210
|
+
}
|
|
211
|
+
}));
|
|
212
|
+
return found[field] && found[field][typeIdx];
|
|
215
213
|
});
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
}
|
|
241
|
-
else {
|
|
242
|
-
changes[field] = join(changes[field], value);
|
|
214
|
+
});
|
|
215
|
+
Object.keys(parsers).forEach(field => {
|
|
216
|
+
if (!fieldByKeys[field] || !this.props.schema.properties[field]) {
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
if (found[field]) {
|
|
220
|
+
const keys = Object.keys(found[field]);
|
|
221
|
+
const responseForField = found[field][keys[0]];
|
|
222
|
+
Object.keys(responseForField).forEach(value => {
|
|
223
|
+
// If target field is array.
|
|
224
|
+
if (this.props.schema.properties[field].type === "array") {
|
|
225
|
+
const temp = Array.from((this.props.formData || {})[field] || []);
|
|
226
|
+
// Find correct enum from fieldOptions.
|
|
227
|
+
const fieldOptions = this.props.uiSchema["ui:options"].fieldOptions;
|
|
228
|
+
const enumField = fieldOptions[fieldOptions.findIndex(element => {
|
|
229
|
+
return element.field === field;
|
|
230
|
+
})].enum;
|
|
231
|
+
// Find enum value from key (eg. municipalityName --> municipalityId).
|
|
232
|
+
const _enum = this.props.formContext.uiSchemaContext[enumField].oneOf;
|
|
233
|
+
const enumValue = _enum.find(item => item.title === value).const;
|
|
234
|
+
// Push enum value to changes.
|
|
235
|
+
if (enumValue !== undefined) {
|
|
236
|
+
!temp.includes(enumValue) && temp.push(enumValue);
|
|
237
|
+
changes[field] = temp;
|
|
243
238
|
}
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
changes
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
}
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
changes[field] = join(changes[field], value);
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
changes[field] = (0, utils_1.getDefaultFormState)(this.props.schema.properties[field]);
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
if (country && this.props.schema.properties.country && fieldByKeys.country)
|
|
250
|
+
changes.country = country;
|
|
251
|
+
success(() => {
|
|
252
|
+
if (timestamp !== this.promiseTimestamp)
|
|
253
|
+
return;
|
|
254
|
+
if (this.mounted) {
|
|
255
|
+
this.props.onChange(Object.assign(Object.assign({}, (this.props.formData || {})), changes));
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
const pointer = this.props.formContext.services.ids.getJSONPointerFromLajiFormIdAndFormDataAndIdSchemaId(this.props.idSchema.$id, (0, utils_1.getFieldUUID)(this.props));
|
|
259
|
+
const newFormData = Object.assign(Object.assign({}, (0, utils_1.parseJSONPointer)(lajiFormInstance.getFormData(), pointer)), changes);
|
|
260
|
+
lajiFormInstance.onChange((0, utils_1.updateSafelyWithJSONPointer)(lajiFormInstance.getFormData(), newFormData, pointer));
|
|
261
|
+
}
|
|
262
|
+
if (callback)
|
|
263
|
+
callback();
|
|
264
|
+
});
|
|
270
265
|
};
|
|
271
266
|
const fetchForeign = () => {
|
|
272
267
|
if (!props.formContext.googleApiKey)
|
|
@@ -292,15 +287,8 @@ let GeocoderField = class GeocoderField extends React.Component {
|
|
|
292
287
|
}, 30 * 1000);
|
|
293
288
|
!bounds.overlaps(globals_1.FINLAND_BOUNDS)
|
|
294
289
|
? fetchForeign()
|
|
295
|
-
: this.props.formContext.apiClient.
|
|
296
|
-
|
|
297
|
-
headers: {
|
|
298
|
-
"accept": "application/json",
|
|
299
|
-
"content-type": "application/json"
|
|
300
|
-
},
|
|
301
|
-
body: JSON.stringify(geometry)
|
|
302
|
-
}).then(response => response.json()).then(handleResponse(props.formContext.translations.Finland, "municipality", "biologicalProvince", "biogeographicalProvince")).catch((e) => {
|
|
303
|
-
fail(e.message);
|
|
290
|
+
: this.props.formContext.apiClient.post("/coordinates/location", undefined, geometry).then().then(handleResponse(props.formContext.translations.Finland, "municipality", "biologicalProvince", "biogeographicalProvince")).catch((e) => {
|
|
291
|
+
fail(typeof e === "string" ? e : e.message);
|
|
304
292
|
});
|
|
305
293
|
}));
|
|
306
294
|
};
|
|
@@ -99,7 +99,7 @@ export declare function MediaArrayField<LFC extends Constructor<React.Component<
|
|
|
99
99
|
processFile: (file: File) => Promise<ProcessedFile>;
|
|
100
100
|
onMediaMetadataUpdate: ({ formData }: {
|
|
101
101
|
formData: any;
|
|
102
|
-
}) => void
|
|
102
|
+
}) => Promise<void>;
|
|
103
103
|
getMetadataPromise: () => Promise<MediaMetadataSchema>;
|
|
104
104
|
getMaxFileSizeAsString: () => string;
|
|
105
105
|
getAllowedMediaFormatsTranslationKey: () => "AllowedFileFormat" | "AllowedFileFormats";
|
|
@@ -170,7 +170,7 @@ export declare class Thumbnail extends React.PureComponent<ThumbnailProps, Thumb
|
|
|
170
170
|
componentDidMount(): void;
|
|
171
171
|
componentWillUnmount(): void;
|
|
172
172
|
UNSAFE_componentWillReceiveProps(props: ThumbnailProps): void;
|
|
173
|
-
updateURL: ({ id, apiClient, apiEndpoint }: ThumbnailProps) => void
|
|
173
|
+
updateURL: ({ id, apiClient, apiEndpoint }: ThumbnailProps) => Promise<void>;
|
|
174
174
|
render(): JSX.Element | null;
|
|
175
175
|
}
|
|
176
176
|
export {};
|
|
@@ -38,6 +38,15 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
38
38
|
return result;
|
|
39
39
|
};
|
|
40
40
|
})();
|
|
41
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
42
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
43
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
44
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
45
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
46
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
47
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
48
|
+
});
|
|
49
|
+
};
|
|
41
50
|
var __rest = (this && this.__rest) || function (s, e) {
|
|
42
51
|
var t = {};
|
|
43
52
|
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
@@ -162,7 +171,7 @@ function MediaArrayField(ComposedComponent) {
|
|
|
162
171
|
const item = this.props.formData[i];
|
|
163
172
|
this.setState({ metadataModalOpen: i });
|
|
164
173
|
this.fetching = item;
|
|
165
|
-
this.apiClient.
|
|
174
|
+
this.apiClient.get(`/${this.ENDPOINT}/{id}`, { path: { id: item } }).then((response) => {
|
|
166
175
|
if (response.id !== this.fetching)
|
|
167
176
|
return;
|
|
168
177
|
this._context.metadatas[item] = response;
|
|
@@ -172,10 +181,11 @@ function MediaArrayField(ComposedComponent) {
|
|
|
172
181
|
this.onMediaRmClick = (i) => () => {
|
|
173
182
|
const id = this.props.formData[i];
|
|
174
183
|
this.props.onChange((0, immutability_helper_1.default)(this.props.formData, { $splice: [[i, 1]] }));
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
184
|
+
try {
|
|
185
|
+
this.apiClient.delete(`/${this.ENDPOINT}/{id}`, { path: { id } });
|
|
186
|
+
}
|
|
187
|
+
catch (e) {
|
|
188
|
+
}
|
|
179
189
|
};
|
|
180
190
|
this.hideMetadataModal = () => this.setState({ metadataModalOpen: false, metadataSaveSuccess: undefined });
|
|
181
191
|
this.onMetadataFormChange = (formData) => this.setState({ modalMetadata: formData });
|
|
@@ -185,7 +195,7 @@ function MediaArrayField(ComposedComponent) {
|
|
|
185
195
|
const metadataForm = this.state.metadataForm || {};
|
|
186
196
|
if (typeof metadataModalOpen === "number" && !this.state.metadataForm) {
|
|
187
197
|
const { metadataFormId = this.METADATA_FORM_ID } = (0, utils_1.getUiOptions)(this.props.uiSchema);
|
|
188
|
-
this.apiClient.
|
|
198
|
+
this.apiClient.get("/forms/{id}", { path: { id: metadataFormId }, query: { lang, format: "schema" } })
|
|
189
199
|
.then(metadataForm => {
|
|
190
200
|
if (this.mounted) {
|
|
191
201
|
this.setState({ metadataForm });
|
|
@@ -422,16 +432,10 @@ function MediaArrayField(ComposedComponent) {
|
|
|
422
432
|
reader.readAsDataURL(file);
|
|
423
433
|
});
|
|
424
434
|
};
|
|
425
|
-
this.onMediaMetadataUpdate = ({ formData })
|
|
435
|
+
this.onMediaMetadataUpdate = (_a) => __awaiter(this, [_a], void 0, function* ({ formData }) {
|
|
426
436
|
this.props.formContext.services.blocker.push();
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
headers: {
|
|
430
|
-
"accept": "application/json",
|
|
431
|
-
"content-type": "application/json"
|
|
432
|
-
},
|
|
433
|
-
body: JSON.stringify(formData)
|
|
434
|
-
}).then(() => {
|
|
437
|
+
try {
|
|
438
|
+
yield this.apiClient.put(`/${this.ENDPOINT}/{id}`, { path: { id: formData.id } }, formData);
|
|
435
439
|
this.props.formContext.services.blocker.pop();
|
|
436
440
|
const notify = () => this.props.formContext.notifier.success(this.props.formContext.translations.SaveSuccess);
|
|
437
441
|
if (this.mounted) {
|
|
@@ -440,11 +444,12 @@ function MediaArrayField(ComposedComponent) {
|
|
|
440
444
|
else {
|
|
441
445
|
notify();
|
|
442
446
|
}
|
|
443
|
-
}
|
|
447
|
+
}
|
|
448
|
+
catch (e) {
|
|
444
449
|
this.props.formContext.services.blocker.pop();
|
|
445
450
|
this.mounted && this.setState({ metadataSaveSuccess: false });
|
|
446
|
-
}
|
|
447
|
-
};
|
|
451
|
+
}
|
|
452
|
+
});
|
|
448
453
|
this.getMetadataPromise = () => {
|
|
449
454
|
let mediaMetadata = this.props.formContext.mediaMetadata
|
|
450
455
|
|| { intellectualRights: "MZ.intellectualRightsARR" };
|
|
@@ -452,7 +457,7 @@ function MediaArrayField(ComposedComponent) {
|
|
|
452
457
|
return ("capturerVerbatim" in mediaMetadata)
|
|
453
458
|
? Promise.resolve(Object.assign(Object.assign({}, mediaMetadata), { capturerVerbatim: [mediaMetadata.capturerVerbatim] }))
|
|
454
459
|
: MACode
|
|
455
|
-
? this.apiClient.
|
|
460
|
+
? this.apiClient.get("/person/by-id/{personId}", { path: { personId: MACode } }).then(({ fullName = MACode }) => (Object.assign(Object.assign({ capturerVerbatim: Array.isArray(fullName) ? fullName : [fullName] }, mediaMetadata), { intellectualOwner: fullName }))).catch(() => Promise.resolve(mediaMetadata))
|
|
456
461
|
: mediaMetadata;
|
|
457
462
|
};
|
|
458
463
|
this.getMaxFileSizeAsString = () => {
|
|
@@ -567,105 +572,67 @@ function MediaArrayField(ComposedComponent) {
|
|
|
567
572
|
this.renderMediaAddModal()))));
|
|
568
573
|
}
|
|
569
574
|
saveMedias(files) {
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
const
|
|
574
|
-
.
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
mediaUuid++;
|
|
587
|
-
this._context.tmpMedias[containerId][mediaUuid] = f.dataURL;
|
|
588
|
-
return mediaUuid;
|
|
589
|
-
});
|
|
590
|
-
this.mounted && this.setState({ tmpMedias: [...(this.state.tmpMedias || []), ...tmpMedias] });
|
|
591
|
-
const formDataBody = files.reduce((body, file) => {
|
|
592
|
-
if (!this.ALLOWED_FILE_TYPES.includes(file.type)) {
|
|
593
|
-
invalidFile = true;
|
|
575
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
576
|
+
const containerId = this.getContainerId();
|
|
577
|
+
let tmpMedias = [];
|
|
578
|
+
const fail = (translationKey, additionalInfo = "") => {
|
|
579
|
+
const translation = (Array.isArray(translationKey) ? translationKey : [translationKey])
|
|
580
|
+
.map((key) => this.props.formContext.translations[key])
|
|
581
|
+
.join(". ");
|
|
582
|
+
throw `${translation} ${additionalInfo}`;
|
|
583
|
+
};
|
|
584
|
+
try {
|
|
585
|
+
const processedFiles = yield this.processFiles(files);
|
|
586
|
+
let invalidFile = (files.length <= 0);
|
|
587
|
+
let fileTooLarge = false;
|
|
588
|
+
let noValidData = true;
|
|
589
|
+
if (!this._context.tmpMedias[containerId]) {
|
|
590
|
+
this._context.tmpMedias[containerId] = {};
|
|
594
591
|
}
|
|
595
|
-
|
|
596
|
-
|
|
592
|
+
tmpMedias = processedFiles.map(f => {
|
|
593
|
+
mediaUuid++;
|
|
594
|
+
this._context.tmpMedias[containerId][mediaUuid] = f.dataURL;
|
|
595
|
+
return mediaUuid;
|
|
596
|
+
});
|
|
597
|
+
this.mounted && this.setState({ tmpMedias: [...(this.state.tmpMedias || []), ...tmpMedias] });
|
|
598
|
+
const formData = files.reduce((body, file) => {
|
|
599
|
+
if (!this.ALLOWED_FILE_TYPES.includes(file.type)) {
|
|
600
|
+
invalidFile = true;
|
|
601
|
+
}
|
|
602
|
+
else if (file.size > this.MAX_FILE_SIZE) {
|
|
603
|
+
fileTooLarge = true;
|
|
604
|
+
}
|
|
605
|
+
else {
|
|
606
|
+
body.append("data", file);
|
|
607
|
+
noValidData = false;
|
|
608
|
+
}
|
|
609
|
+
return body;
|
|
610
|
+
}, new FormData());
|
|
611
|
+
if (noValidData && invalidFile) {
|
|
612
|
+
fail(this.getAllowedMediaFormatsTranslationKey(), this.getAllowedMediaFormatsAsString() + ".");
|
|
613
|
+
return;
|
|
597
614
|
}
|
|
598
|
-
else {
|
|
599
|
-
|
|
600
|
-
|
|
615
|
+
else if (noValidData && fileTooLarge) {
|
|
616
|
+
fail("AllowedFileSize", this.getMaxFileSizeAsString() + ".");
|
|
617
|
+
return;
|
|
601
618
|
}
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
else if (noValidData && fileTooLarge) {
|
|
609
|
-
fail("AllowedFileSize", this.getMaxFileSizeAsString() + ".");
|
|
610
|
-
return;
|
|
611
|
-
}
|
|
612
|
-
else {
|
|
613
|
-
return this.apiClient.fetchRaw(`/${this.ENDPOINT}`, undefined, {
|
|
614
|
-
method: "POST",
|
|
615
|
-
body: formDataBody
|
|
619
|
+
const tmpMediaEntities = yield this.apiClient.post(`/${this.ENDPOINT}`, undefined, formData);
|
|
620
|
+
const mediaMetadata = yield this.getMetadataPromise();
|
|
621
|
+
const mediaEntities = yield Promise.all(tmpMediaEntities.map((item) => this.apiClient.post(`/${this.ENDPOINT}/{id}`, { path: { id: item.id } }, mediaMetadata)));
|
|
622
|
+
const ids = mediaEntities.map((item) => item ? item.id : undefined).filter(item => item !== undefined);
|
|
623
|
+
tmpMedias.forEach(id => {
|
|
624
|
+
delete this._context.tmpMedias[containerId][id];
|
|
616
625
|
});
|
|
626
|
+
this.mounted && this.setState({ tmpMedias: this.state.tmpMedias.filter(id => !tmpMedias.includes(id)) });
|
|
627
|
+
return ids;
|
|
617
628
|
}
|
|
618
|
-
|
|
619
|
-
if (!response)
|
|
620
|
-
return;
|
|
621
|
-
if (response.status < 400) {
|
|
622
|
-
return response.json();
|
|
623
|
-
}
|
|
624
|
-
else if (response.status === 400) {
|
|
625
|
-
fail("InvalidFile");
|
|
626
|
-
}
|
|
627
|
-
else if (response.status === 503) {
|
|
628
|
-
fail("InsufficientSpace");
|
|
629
|
-
}
|
|
630
|
-
else {
|
|
631
|
-
fail(["SomethingWentWrong", "TryAgainLater"]);
|
|
632
|
-
}
|
|
633
|
-
}).then(response => {
|
|
634
|
-
if (!response)
|
|
635
|
-
return;
|
|
636
|
-
return this.getMetadataPromise().then(mediaMetadata => {
|
|
637
|
-
return Promise.all(response.map((item) => {
|
|
638
|
-
return this.apiClient.fetchRaw(`/${this.ENDPOINT}/${item.id}`, undefined, {
|
|
639
|
-
method: "POST",
|
|
640
|
-
headers: {
|
|
641
|
-
"accept": "application/json",
|
|
642
|
-
"content-type": "application/json"
|
|
643
|
-
},
|
|
644
|
-
body: JSON.stringify(mediaMetadata)
|
|
645
|
-
}).then(response => {
|
|
646
|
-
if (response.status < 400) {
|
|
647
|
-
return response.json();
|
|
648
|
-
}
|
|
649
|
-
});
|
|
650
|
-
}));
|
|
651
|
-
});
|
|
652
|
-
}).then(response => {
|
|
653
|
-
if (!response)
|
|
654
|
-
return;
|
|
655
|
-
const ids = response.map((item) => item ? item.id : undefined).filter(item => item !== undefined);
|
|
656
|
-
tmpMedias.forEach(id => {
|
|
657
|
-
delete this._context.tmpMedias[containerId][id];
|
|
658
|
-
});
|
|
659
|
-
this.mounted && this.setState({ tmpMedias: this.state.tmpMedias.filter(id => !tmpMedias.includes(id)) });
|
|
660
|
-
return ids;
|
|
661
|
-
}).catch((e) => {
|
|
662
|
-
if (tmpMedias) {
|
|
629
|
+
catch (e) {
|
|
663
630
|
tmpMedias.forEach(id => {
|
|
664
631
|
delete this._context.tmpMedias[containerId][id];
|
|
665
632
|
});
|
|
666
633
|
this.mounted && this.setState({ tmpMedias: this.state.tmpMedias.filter(id => !tmpMedias.includes(id)) });
|
|
634
|
+
throw e;
|
|
667
635
|
}
|
|
668
|
-
throw e;
|
|
669
636
|
});
|
|
670
637
|
}
|
|
671
638
|
};
|
|
@@ -706,15 +673,18 @@ function MediaArrayField(ComposedComponent) {
|
|
|
706
673
|
class Thumbnail extends React.PureComponent {
|
|
707
674
|
constructor(props) {
|
|
708
675
|
super(props);
|
|
709
|
-
this.updateURL = ({ id, apiClient, apiEndpoint = "images" })
|
|
676
|
+
this.updateURL = (_a) => __awaiter(this, [_a], void 0, function* ({ id, apiClient, apiEndpoint = "images" }) {
|
|
710
677
|
if (!id)
|
|
711
678
|
return;
|
|
712
|
-
|
|
679
|
+
try {
|
|
680
|
+
const response = yield apiClient.get(`/${apiEndpoint}/{id}`, { path: { id } });
|
|
713
681
|
if (!this.mounted)
|
|
714
682
|
return;
|
|
715
683
|
this.setState({ url: response.squareThumbnailURL, linkUrl: response.originalURL });
|
|
716
|
-
}
|
|
717
|
-
|
|
684
|
+
}
|
|
685
|
+
catch (e) {
|
|
686
|
+
}
|
|
687
|
+
});
|
|
718
688
|
this.state = {};
|
|
719
689
|
this.updateURL(props);
|
|
720
690
|
}
|
|
@@ -38,6 +38,15 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
38
38
|
return result;
|
|
39
39
|
};
|
|
40
40
|
})();
|
|
41
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
42
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
43
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
44
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
45
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
46
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
47
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
48
|
+
});
|
|
49
|
+
};
|
|
41
50
|
var __rest = (this && this.__rest) || function (s, e) {
|
|
42
51
|
var t = {};
|
|
43
52
|
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
@@ -1053,7 +1062,7 @@ function _MapArrayField(ComposedComponent) {
|
|
|
1053
1062
|
constructor(props) {
|
|
1054
1063
|
super(props);
|
|
1055
1064
|
this.stretchContainerRef = React.createRef();
|
|
1056
|
-
this.geocode = () => {
|
|
1065
|
+
this.geocode = () => __awaiter(this, void 0, void 0, function* () {
|
|
1057
1066
|
// Zoom map to area. Area ID is accessed from schema field defined in options.areaField
|
|
1058
1067
|
const item = (this.props.formData || [])[this.state.activeIdx];
|
|
1059
1068
|
const { areaField } = (0, utils_2.getUiOptions)(this.props.uiSchema);
|
|
@@ -1066,11 +1075,10 @@ function _MapArrayField(ComposedComponent) {
|
|
|
1066
1075
|
}
|
|
1067
1076
|
const geometries = this.getGeometries();
|
|
1068
1077
|
if (geometries.length === 0 && area && area.length > 0) {
|
|
1069
|
-
this.props.formContext.apiClient.
|
|
1070
|
-
|
|
1071
|
-
});
|
|
1078
|
+
const { name } = yield this.props.formContext.apiClient.get(`/areas/${area}`);
|
|
1079
|
+
this.map.geocode(name, undefined, 8);
|
|
1072
1080
|
}
|
|
1073
|
-
};
|
|
1081
|
+
});
|
|
1074
1082
|
this.computeArea = () => {
|
|
1075
1083
|
const { activeIdx } = this.state;
|
|
1076
1084
|
if (activeIdx === undefined)
|
|
@@ -36,7 +36,7 @@ export default class MapField extends React.Component<any, any, any> {
|
|
|
36
36
|
componentDidUpdate(prevProps: any): void;
|
|
37
37
|
_lastFormData: any;
|
|
38
38
|
_zoomToDataOnNextTick: boolean | undefined;
|
|
39
|
-
geocode: (prevProps: any) => void
|
|
39
|
+
geocode: (prevProps: any) => Promise<void>;
|
|
40
40
|
zoomIfExternalEdit: (props: any) => void;
|
|
41
41
|
setMapRef: (mapComponent: any) => void;
|
|
42
42
|
map: any;
|
|
@@ -32,6 +32,15 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
32
32
|
return result;
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
36
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
37
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
38
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
39
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
40
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
41
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
42
|
+
});
|
|
43
|
+
};
|
|
35
44
|
var __rest = (this && this.__rest) || function (s, e) {
|
|
36
45
|
var t = {};
|
|
37
46
|
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
@@ -107,7 +116,7 @@ class MapField extends React.Component {
|
|
|
107
116
|
this.setState({ locateOn: true });
|
|
108
117
|
}
|
|
109
118
|
};
|
|
110
|
-
this.geocode = (prevProps) => {
|
|
119
|
+
this.geocode = (prevProps) => __awaiter(this, void 0, void 0, function* () {
|
|
111
120
|
let { area } = (0, utils_1.getUiOptions)(this.props.uiSchema);
|
|
112
121
|
if (area instanceof Array) {
|
|
113
122
|
area = area[0];
|
|
@@ -120,11 +129,10 @@ class MapField extends React.Component {
|
|
|
120
129
|
|| (geoData.type === "FeatureCollection" && geoData.features.length === 0);
|
|
121
130
|
});
|
|
122
131
|
if (isEmptyAndWasEmpty && area && area.length > 0) {
|
|
123
|
-
this.props.formContext.apiClient.
|
|
124
|
-
|
|
125
|
-
});
|
|
132
|
+
const { name } = yield this.props.formContext.apiClient.get(`/areas/${area}`);
|
|
133
|
+
this.map.geocode(name, undefined, 8);
|
|
126
134
|
}
|
|
127
|
-
};
|
|
135
|
+
});
|
|
128
136
|
this.zoomIfExternalEdit = (props) => {
|
|
129
137
|
if (!equals(this._lastFormData, props.formData)) {
|
|
130
138
|
this.map.zoomToData();
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import { ByLang, FormContext } from "../../LajiForm";
|
|
3
|
-
import { NamedPlace } from "@luomus/laji-schema";
|
|
4
3
|
import memoize from "memoizee";
|
|
4
|
+
import type { components } from "generated/api.d";
|
|
5
|
+
type NamedPlace = components["schemas"]["namedPlace"];
|
|
5
6
|
type Props = {
|
|
6
7
|
places: NamedPlace[];
|
|
7
8
|
failed?: boolean;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import { FieldProps, JSONSchemaArray, JSONSchemaObject } from "../../../types";
|
|
3
|
-
import {
|
|
3
|
+
import type { components } from "generated/api.d";
|
|
4
|
+
type NamedPlace = components["schemas"]["namedPlace"];
|
|
4
5
|
type Props = FieldProps<NamedPlace, JSONSchemaObject | JSONSchemaArray<JSONSchemaObject>>;
|
|
5
6
|
type State = {
|
|
6
7
|
show?: boolean;
|
|
@@ -11,7 +12,6 @@ type State = {
|
|
|
11
12
|
/** Compatible only with gatherings array and gathering object */
|
|
12
13
|
export default class NamedPlaceChooserField extends React.Component<Props, State> {
|
|
13
14
|
static contextType: React.Context<import("../../../ReactContext").ContextProps>;
|
|
14
|
-
removeIds: Record<string, boolean>;
|
|
15
15
|
mounted: boolean;
|
|
16
16
|
state: State;
|
|
17
17
|
getUiSchema: (props: Props, buttonDefinition: any) => import("../../../types").UiSchema<any> | {
|
|
@@ -60,9 +60,14 @@ export default class NamedPlaceChooserField extends React.Component<Props, State
|
|
|
60
60
|
};
|
|
61
61
|
isGatheringsArray: (schema: JSONSchemaObject | JSONSchemaArray<JSONSchemaObject>) => schema is JSONSchemaArray<JSONSchemaObject>;
|
|
62
62
|
onPlaceSelected: (place: NamedPlace) => void;
|
|
63
|
-
onPlaceDeleted: (place: NamedPlace
|
|
63
|
+
onPlaceDeleted: (place: NamedPlace & {
|
|
64
|
+
id: string;
|
|
65
|
+
}, end: () => void) => Promise<void>;
|
|
64
66
|
onButtonClick: () => () => void;
|
|
65
|
-
updatePlaces: (
|
|
67
|
+
updatePlaces: (response: {
|
|
68
|
+
results: NamedPlace[];
|
|
69
|
+
}) => void;
|
|
70
|
+
getNamedPlacesUnsubscribe: () => void;
|
|
66
71
|
componentDidMount(): void;
|
|
67
72
|
componentWillUnmount(): void;
|
|
68
73
|
onHide: () => void;
|