@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.
@@ -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, onBlur: (event) => { } }));
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(FileInputField, { accept: "*", buttonLabel: "Upload a file", label: this.label(), name: this.field().id, onChange: (event) => {
5286
- this.uploadedFiles.push((event?.files || [])[0]);
5287
- this.ngZone.run(() => {
5288
- this.form().get(this.field().id) ||
5289
- this.form()
5290
- .get(this.field().key)
5291
- ?.setValue((event?.files || [])[0]);
5292
- this.update.emit({
5293
- form: this.form(),
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 ||