@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.
@@ -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, { style: {
3588
- backgroundColor: '#6b7280', // Gray color
3589
- color: 'white',
3590
- padding: '8px 16px',
3591
- borderRadius: '4px',
3592
- cursor: 'pointer',
3593
- display: 'flex',
3594
- alignItems: 'center',
3595
- gap: 8,
3596
- }, onClick: () => {
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", { style: {
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, onBlur: (event) => { } }));
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(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],
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 ||