@iapps/ng-dhis2-ui 1.1.48 → 1.1.49
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/fesm2022/iapps-ng-dhis2-ui.mjs +72 -21
- package/fesm2022/iapps-ng-dhis2-ui.mjs.map +1 -1
- package/lib/modules/form/components/file-upload-field.component.d.ts +13 -0
- package/lib/modules/form/components/org-unit-form-field.component.d.ts +1 -1
- package/lib/modules/form/utils/field-type.util.d.ts +1 -1
- package/lib/modules/form/utils/field.util.d.ts +1 -1
- package/lib/shared/utils/predefinedDimensions.d.ts +6 -6
- package/package.json +1 -1
|
@@ -27,7 +27,7 @@ import { MenuItem, MenuDivider } from '@dhis2-ui/menu';
|
|
|
27
27
|
import parse from 'html-react-parser';
|
|
28
28
|
import { Button as Button$1, IconDimensionData16, IconClock16, IconDimensionOrgUnit16, spacers as spacers$1, colors as colors$1, IconEdit16, theme as theme$1, Tooltip, SingleSelectField, SingleSelectOption, InputField as InputField$1, TabBar, Tab, Transfer, Modal as Modal$1, ModalTitle as ModalTitle$1, ModalContent as ModalContent$1, ModalActions as ModalActions$1, ButtonStrip as ButtonStrip$1, Checkbox, OrganisationUnitTree, MultiSelect, MultiSelectOption, IconWarningFilled16, Layer as Layer$1, Popper, FlyoutMenu, MenuItem as MenuItem$1, IconMore24, CircularLoader as CircularLoader$1, IconFilter16, DataTable, TableHead, DataTableRow, DataTableColumnHeader, TableBody, DataTableCell, TableFoot, Pagination, Chip, FileInputField, FileListItem, MultiSelectField, TextAreaField } from '@dhis2/ui';
|
|
29
29
|
import { getNowInCalendar, generateFixedPeriods } from '@dhis2/multi-calendar-dates';
|
|
30
|
-
import { isObject, isString, sortBy, isArray, find, camelCase, flatten, debounce, head, isEmpty } from 'lodash';
|
|
30
|
+
import { isObject, isString, sortBy, isArray, find, camelCase, flatten, debounce, isUndefined, head, isEmpty } from 'lodash';
|
|
31
31
|
import cx from 'classnames';
|
|
32
32
|
import { map as map$1, switchMap } from 'rxjs/operators';
|
|
33
33
|
import * as i2 from '@angular/forms';
|
|
@@ -5095,6 +5095,65 @@ const OrgUnitFormField = (props) => {
|
|
|
5095
5095
|
React__default.createElement(CircularLoader$1, { small: true }))) : (React__default.createElement("div", { className: classes.orgUnitTreeContainer, style: { maxHeight: '200px', overflowY: 'auto' } }, renderOrgUnitTree()))))))));
|
|
5096
5096
|
};
|
|
5097
5097
|
|
|
5098
|
+
// Copyright 2025 UDSM DHIS2 Lab. All rights reserved.
|
|
5099
|
+
// Use of this source code is governed by a BSD-style
|
|
5100
|
+
// license that can be found in the LICENSE file.
|
|
5101
|
+
const FileUploadField = (props) => {
|
|
5102
|
+
const { label, id, uploadUrl, performUpload, validationText, required, hasError, onChange, onUploadSuccess, } = props;
|
|
5103
|
+
const d2 = window?.d2Web;
|
|
5104
|
+
const [file, setFile] = useState(null);
|
|
5105
|
+
const [uploading, setUploading] = useState();
|
|
5106
|
+
const valid = useMemo(() => {
|
|
5107
|
+
if (isUndefined(hasError)) {
|
|
5108
|
+
return undefined;
|
|
5109
|
+
}
|
|
5110
|
+
return !hasError;
|
|
5111
|
+
}, [hasError]);
|
|
5112
|
+
const uploadFile = async (fileItem) => {
|
|
5113
|
+
if (fileItem) {
|
|
5114
|
+
setUploading(true);
|
|
5115
|
+
const formData = new FormData();
|
|
5116
|
+
formData.append('file', fileItem);
|
|
5117
|
+
try {
|
|
5118
|
+
const fileUploadResponse = await d2.httpInstance.post(uploadUrl, formData);
|
|
5119
|
+
setUploading(false);
|
|
5120
|
+
const fileId = fileUploadResponse?.data?.response?.fileResource
|
|
5121
|
+
?.id;
|
|
5122
|
+
if (fileId) {
|
|
5123
|
+
onUploadSuccess(fileId);
|
|
5124
|
+
}
|
|
5125
|
+
}
|
|
5126
|
+
catch (error) {
|
|
5127
|
+
setUploading(false);
|
|
5128
|
+
}
|
|
5129
|
+
}
|
|
5130
|
+
};
|
|
5131
|
+
return (React__default.createElement(FileInputField, { accept: "*", buttonLabel: "Upload a file", label: label, name: id, valid: valid, required: required, validationText: validationText, onChange: (event) => {
|
|
5132
|
+
const fileItem = (event?.files || [])[0];
|
|
5133
|
+
setFile(fileItem);
|
|
5134
|
+
if (performUpload) {
|
|
5135
|
+
uploadFile(fileItem);
|
|
5136
|
+
}
|
|
5137
|
+
else {
|
|
5138
|
+
onChange(file);
|
|
5139
|
+
}
|
|
5140
|
+
// this.ngZone.run(() => {
|
|
5141
|
+
// this.form().get(this.field().id) ||
|
|
5142
|
+
// this.form()
|
|
5143
|
+
// .get(this.field().key)
|
|
5144
|
+
// ?.setValue((event?.files || [])[0]);
|
|
5145
|
+
// this.update.emit({
|
|
5146
|
+
// form: this.form(),
|
|
5147
|
+
// value: (event?.files || [])[0],
|
|
5148
|
+
// });
|
|
5149
|
+
// });
|
|
5150
|
+
// setValue((event?.files || [])[0]);
|
|
5151
|
+
// setTouched(true);
|
|
5152
|
+
} }, file && (React__default.createElement(FileListItem, { cancelText: "Cancel", label: file.name, loading: uploading, onRemove: () => {
|
|
5153
|
+
setFile(null);
|
|
5154
|
+
}, removeText: "Remove" }))));
|
|
5155
|
+
};
|
|
5156
|
+
|
|
5098
5157
|
// Copyright 2024 UDSM DHIS2 Lab. All rights reserved.
|
|
5099
5158
|
// Use of this source code is governed by a BSD-style
|
|
5100
5159
|
// license that can be found in the LICENSE file.
|
|
@@ -5214,7 +5273,7 @@ class BaseFormFieldComponent extends ReactWrapperModule {
|
|
|
5214
5273
|
this.ngZone.run(() => {
|
|
5215
5274
|
this.update.emit({ form: this.form(), value });
|
|
5216
5275
|
});
|
|
5217
|
-
}, selected: value
|
|
5276
|
+
}, selected: value }));
|
|
5218
5277
|
case 'transfer':
|
|
5219
5278
|
return (React__default.createElement(Transfer, { filterable: true, filterPlaceholder: "Search", selected: selected, leftHeader: React__default.createElement("div", { style: {
|
|
5220
5279
|
fontSize: 14,
|
|
@@ -5282,27 +5341,19 @@ class BaseFormFieldComponent extends ReactWrapperModule {
|
|
|
5282
5341
|
setTouched(true);
|
|
5283
5342
|
}, selected: arrayValue }, (this.field().options || []).map((option) => (React__default.createElement(MultiSelectOption, { key: option.key, label: option.label, value: option.value })))));
|
|
5284
5343
|
case 'file':
|
|
5285
|
-
return (React__default.createElement(
|
|
5286
|
-
|
|
5287
|
-
|
|
5288
|
-
|
|
5289
|
-
|
|
5290
|
-
|
|
5291
|
-
|
|
5292
|
-
|
|
5293
|
-
|
|
5294
|
-
value: (event?.files || [])[0],
|
|
5344
|
+
return (React__default.createElement(React__default.Fragment, null,
|
|
5345
|
+
React__default.createElement(FileUploadField, { label: this.label(), id: this.field().id, hasError: hasError, required: this.field().required, validationText: validationError, performUpload: true, uploadUrl: 'fileResources', onUploadSuccess: (fileId) => {
|
|
5346
|
+
this.ngZone.run(() => {
|
|
5347
|
+
this.form().get(this.field().id) ||
|
|
5348
|
+
this.form().get(this.field().key)?.setValue(fileId);
|
|
5349
|
+
this.update.emit({
|
|
5350
|
+
form: this.form(),
|
|
5351
|
+
value: fileId,
|
|
5352
|
+
});
|
|
5295
5353
|
});
|
|
5296
|
-
|
|
5297
|
-
setValue((event?.files || [])[0]);
|
|
5298
|
-
setTouched(true);
|
|
5299
|
-
} }, this.uploadedFiles.map((file, index) => (React__default.createElement(FileListItem, { key: index, cancelText: "Cancel", label: file.name, onCancel: () => { }, onRemove: () => {
|
|
5300
|
-
this.ngZone.run(() => {
|
|
5301
|
-
this.uploadedFiles.splice(index, 1);
|
|
5302
|
-
setValue(this.uploadedFiles);
|
|
5354
|
+
setValue(fileId);
|
|
5303
5355
|
setTouched(true);
|
|
5304
|
-
});
|
|
5305
|
-
}, removeText: "Remove" })))));
|
|
5356
|
+
} })));
|
|
5306
5357
|
default:
|
|
5307
5358
|
return (React__default.createElement(InputField$1, { error: hasError, validationText: validationError, type: this.field().type, inputWidth: this.fieldConfig()?.inputWidth, required: this.field().required, name: this.field().id, label: this.label(), min: this.field().min?.toString(), max: this.field().max?.toString(), placeholder: this.placeholder(), value: value, disabled: this.field()?.disabled ||
|
|
5308
5359
|
this.field()?.generated ||
|