@iapps/ng-dhis2-ui 1.1.48 → 1.1.50
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 +96 -37
- 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.util.d.ts +1 -1
- 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';
|
|
@@ -3584,26 +3584,34 @@ class LineListTableComponent extends ReactWrapperModule {
|
|
|
3584
3584
|
borderRadius: '4px',
|
|
3585
3585
|
cursor: 'pointer',
|
|
3586
3586
|
}, onClick: handleApprovalClick, primary: true }, this.buttonLabel))),
|
|
3587
|
-
this.showFilterButton && (React__default.createElement(Button$1
|
|
3588
|
-
|
|
3589
|
-
|
|
3590
|
-
|
|
3591
|
-
|
|
3592
|
-
|
|
3593
|
-
|
|
3594
|
-
|
|
3595
|
-
|
|
3596
|
-
|
|
3587
|
+
this.showFilterButton && (React__default.createElement(Button$1
|
|
3588
|
+
// style={{
|
|
3589
|
+
// backgroundColor: '#6b7280',
|
|
3590
|
+
// color: 'white',
|
|
3591
|
+
// padding: '8px 16px',
|
|
3592
|
+
// borderRadius: '4px',
|
|
3593
|
+
// cursor: 'pointer',
|
|
3594
|
+
// display: 'flex',
|
|
3595
|
+
// alignItems: 'center',
|
|
3596
|
+
// gap: 8,
|
|
3597
|
+
// }}
|
|
3598
|
+
, {
|
|
3599
|
+
// style={{
|
|
3600
|
+
// backgroundColor: '#6b7280',
|
|
3601
|
+
// color: 'white',
|
|
3602
|
+
// padding: '8px 16px',
|
|
3603
|
+
// borderRadius: '4px',
|
|
3604
|
+
// cursor: 'pointer',
|
|
3605
|
+
// display: 'flex',
|
|
3606
|
+
// alignItems: 'center',
|
|
3607
|
+
// gap: 8,
|
|
3608
|
+
// }}
|
|
3609
|
+
onClick: () => {
|
|
3597
3610
|
setFilters(!filters);
|
|
3598
3611
|
}, secondary: true },
|
|
3599
3612
|
React__default.createElement(IconFilter16, null),
|
|
3600
3613
|
filters ? 'Hide Filters' : 'Show Filters'))),
|
|
3601
|
-
filters && (React__default.createElement("div", {
|
|
3602
|
-
display: 'flex',
|
|
3603
|
-
gap: '10px',
|
|
3604
|
-
flexWrap: 'wrap',
|
|
3605
|
-
paddingBottom: '16px',
|
|
3606
|
-
} }, (filteredColumns ?? []).map(({ label, key }) => (React__default.createElement(InputField$1, { key: key, label: label, value: inputValues[key] || '', onChange: (e) => {
|
|
3614
|
+
filters && (React__default.createElement("div", null, (filteredColumns ?? []).map(({ label, key }) => (React__default.createElement(InputField$1, { key: key, label: label, value: inputValues[key] || '', onChange: (e) => {
|
|
3607
3615
|
// Check if it's a standard event with target.value
|
|
3608
3616
|
if ('target' in e && e.target) {
|
|
3609
3617
|
handleInputChange(key, e.target.value);
|
|
@@ -5095,6 +5103,65 @@ const OrgUnitFormField = (props) => {
|
|
|
5095
5103
|
React__default.createElement(CircularLoader$1, { small: true }))) : (React__default.createElement("div", { className: classes.orgUnitTreeContainer, style: { maxHeight: '200px', overflowY: 'auto' } }, renderOrgUnitTree()))))))));
|
|
5096
5104
|
};
|
|
5097
5105
|
|
|
5106
|
+
// Copyright 2025 UDSM DHIS2 Lab. All rights reserved.
|
|
5107
|
+
// Use of this source code is governed by a BSD-style
|
|
5108
|
+
// license that can be found in the LICENSE file.
|
|
5109
|
+
const FileUploadField = (props) => {
|
|
5110
|
+
const { label, id, uploadUrl, performUpload, validationText, required, hasError, onChange, onUploadSuccess, } = props;
|
|
5111
|
+
const d2 = window?.d2Web;
|
|
5112
|
+
const [file, setFile] = useState(null);
|
|
5113
|
+
const [uploading, setUploading] = useState();
|
|
5114
|
+
const valid = useMemo(() => {
|
|
5115
|
+
if (isUndefined(hasError)) {
|
|
5116
|
+
return undefined;
|
|
5117
|
+
}
|
|
5118
|
+
return !hasError;
|
|
5119
|
+
}, [hasError]);
|
|
5120
|
+
const uploadFile = async (fileItem) => {
|
|
5121
|
+
if (fileItem) {
|
|
5122
|
+
setUploading(true);
|
|
5123
|
+
const formData = new FormData();
|
|
5124
|
+
formData.append('file', fileItem);
|
|
5125
|
+
try {
|
|
5126
|
+
const fileUploadResponse = await d2.httpInstance.post(uploadUrl, formData);
|
|
5127
|
+
setUploading(false);
|
|
5128
|
+
const fileId = fileUploadResponse?.data?.response?.fileResource
|
|
5129
|
+
?.id;
|
|
5130
|
+
if (fileId) {
|
|
5131
|
+
onUploadSuccess(fileId);
|
|
5132
|
+
}
|
|
5133
|
+
}
|
|
5134
|
+
catch (error) {
|
|
5135
|
+
setUploading(false);
|
|
5136
|
+
}
|
|
5137
|
+
}
|
|
5138
|
+
};
|
|
5139
|
+
return (React__default.createElement(FileInputField, { accept: "*", buttonLabel: "Upload a file", label: label, name: id, valid: valid, required: required, validationText: validationText, onChange: (event) => {
|
|
5140
|
+
const fileItem = (event?.files || [])[0];
|
|
5141
|
+
setFile(fileItem);
|
|
5142
|
+
if (performUpload) {
|
|
5143
|
+
uploadFile(fileItem);
|
|
5144
|
+
}
|
|
5145
|
+
else {
|
|
5146
|
+
onChange(file);
|
|
5147
|
+
}
|
|
5148
|
+
// this.ngZone.run(() => {
|
|
5149
|
+
// this.form().get(this.field().id) ||
|
|
5150
|
+
// this.form()
|
|
5151
|
+
// .get(this.field().key)
|
|
5152
|
+
// ?.setValue((event?.files || [])[0]);
|
|
5153
|
+
// this.update.emit({
|
|
5154
|
+
// form: this.form(),
|
|
5155
|
+
// value: (event?.files || [])[0],
|
|
5156
|
+
// });
|
|
5157
|
+
// });
|
|
5158
|
+
// setValue((event?.files || [])[0]);
|
|
5159
|
+
// setTouched(true);
|
|
5160
|
+
} }, file && (React__default.createElement(FileListItem, { cancelText: "Cancel", label: file.name, loading: uploading, onRemove: () => {
|
|
5161
|
+
setFile(null);
|
|
5162
|
+
}, removeText: "Remove" }))));
|
|
5163
|
+
};
|
|
5164
|
+
|
|
5098
5165
|
// Copyright 2024 UDSM DHIS2 Lab. All rights reserved.
|
|
5099
5166
|
// Use of this source code is governed by a BSD-style
|
|
5100
5167
|
// license that can be found in the LICENSE file.
|
|
@@ -5214,7 +5281,7 @@ class BaseFormFieldComponent extends ReactWrapperModule {
|
|
|
5214
5281
|
this.ngZone.run(() => {
|
|
5215
5282
|
this.update.emit({ form: this.form(), value });
|
|
5216
5283
|
});
|
|
5217
|
-
}, selected: value
|
|
5284
|
+
}, selected: value }));
|
|
5218
5285
|
case 'transfer':
|
|
5219
5286
|
return (React__default.createElement(Transfer, { filterable: true, filterPlaceholder: "Search", selected: selected, leftHeader: React__default.createElement("div", { style: {
|
|
5220
5287
|
fontSize: 14,
|
|
@@ -5282,27 +5349,19 @@ class BaseFormFieldComponent extends ReactWrapperModule {
|
|
|
5282
5349
|
setTouched(true);
|
|
5283
5350
|
}, selected: arrayValue }, (this.field().options || []).map((option) => (React__default.createElement(MultiSelectOption, { key: option.key, label: option.label, value: option.value })))));
|
|
5284
5351
|
case 'file':
|
|
5285
|
-
return (React__default.createElement(
|
|
5286
|
-
|
|
5287
|
-
|
|
5288
|
-
|
|
5289
|
-
|
|
5290
|
-
|
|
5291
|
-
|
|
5292
|
-
|
|
5293
|
-
|
|
5294
|
-
value: (event?.files || [])[0],
|
|
5352
|
+
return (React__default.createElement(React__default.Fragment, null,
|
|
5353
|
+
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) => {
|
|
5354
|
+
this.ngZone.run(() => {
|
|
5355
|
+
this.form().get(this.field().id) ||
|
|
5356
|
+
this.form().get(this.field().key)?.setValue(fileId);
|
|
5357
|
+
this.update.emit({
|
|
5358
|
+
form: this.form(),
|
|
5359
|
+
value: fileId,
|
|
5360
|
+
});
|
|
5295
5361
|
});
|
|
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);
|
|
5362
|
+
setValue(fileId);
|
|
5303
5363
|
setTouched(true);
|
|
5304
|
-
});
|
|
5305
|
-
}, removeText: "Remove" })))));
|
|
5364
|
+
} })));
|
|
5306
5365
|
default:
|
|
5307
5366
|
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
5367
|
this.field()?.generated ||
|