@iapps/ng-dhis2-ui 1.2.70 → 1.2.72

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.
@@ -3305,7 +3305,7 @@ const OrgUnitSelector = ({ hide, setHide, selectedOrgUnit, setSelectedOrgUnit, s
3305
3305
  const FilterToolbar = ({ orgUnitLabel, selectedOrgUnit, setSelectedOrgUnit, setOrgUnitState, defaultOrgUnit, setHide, startDateState, setStartDateState, endDateState, setEndDateState, visibleFilters, dateStates, inputValues, setInputValues, handleInputChange, handleInputChangeForSelectField, handleDateSelect, prevValue, setPrevValue, showAllFilters, setShowAllFilters, handleSearch, setTempStartDateState, setTempEndDateState, setTempOrgUnitState, tempStartDateState, tempEndDateState, tempOrgUnitState, dataQueryFiltersState, setDataQueryFiltersState, SetOrgUnitModalVisible, showEnrollmentDates, }) => (React__default.createElement(DataTableToolbar, { className: "table-top-toolbar" },
3306
3306
  React__default.createElement("div", { style: {
3307
3307
  display: 'flex',
3308
- flexDirection: 'column',
3308
+ // flexDirection: 'column',
3309
3309
  gap: '10px',
3310
3310
  flexWrap: 'wrap',
3311
3311
  } },
@@ -3339,15 +3339,8 @@ const FilterToolbar = ({ orgUnitLabel, selectedOrgUnit, setSelectedOrgUnit, setO
3339
3339
  if (selectedDate.calendarDateString === null) {
3340
3340
  setEndDateState(selectedDate.calendarDateString);
3341
3341
  }
3342
- } }))),
3343
- React__default.createElement(Button$1, { onClick: handleSearch }, "Search"),
3344
- React__default.createElement(Button$1, { onClick: () => setShowAllFilters(!showAllFilters) }, showAllFilters ? 'Less Filters' : 'More Filters')),
3345
- visibleFilters?.length > 0 && (React__default.createElement("div", { style: {
3346
- display: 'flex',
3347
- alignItems: 'center',
3348
- gap: '10px',
3349
- flexWrap: 'wrap',
3350
- } }, (visibleFilters ?? []).map(({ label, key, valueType, options }) => {
3342
+ } })))),
3343
+ (visibleFilters ?? []).map(({ label, key, valueType, options }) => {
3351
3344
  if (valueType === 'DATE') {
3352
3345
  return (React__default.createElement(CalendarInput, { key: key, label: `${label}:`, calendar: "gregory", locale: "en-GB", timeZone: "Africa/Dar_es_Salaam", className: "custom-input", clearable: !!dateStates[key], date: dateStates[key], onDateSelect: (selectedDate) => {
3353
3346
  handleDateSelect(key, selectedDate);
@@ -3388,164 +3381,15 @@ const FilterToolbar = ({ orgUnitLabel, selectedOrgUnit, setSelectedOrgUnit, setO
3388
3381
  setPrevValue(currentValue);
3389
3382
  }
3390
3383
  } }));
3391
- })))))
3392
- // <DataTableToolbar className="table-top-toolbar">
3393
- // <div
3394
- // style={{
3395
- // display: 'flex',
3396
- // alignItems: 'center',
3397
- // gap: '10px',
3398
- // flexWrap: 'wrap',
3399
- // }}
3400
- // >
3401
- // <InputField
3402
- // key="location"
3403
- // label={orgUnitLabel ? orgUnitLabel : 'registering unit:'}
3404
- // value={selectedOrgUnit}
3405
- // onFocus={() => setHide(false)}
3406
- // className="custom-input"
3407
- // clearable
3408
- // onChange={(event: { value: string }) => {
3409
- // setSelectedOrgUnit(event.value);
3410
- // setOrgUnitState(defaultOrgUnit);
3411
- // }}
3412
- // />
3413
- // <CalendarInput
3414
- // label="Start date:"
3415
- // calendar="gregory"
3416
- // locale="en-GB"
3417
- // timeZone="Africa/Dar_es_Salaam"
3418
- // className="custom-input"
3419
- // clearable={!!tempStartDateState}
3420
- // date={tempStartDateState}
3421
- // onDateSelect={(selectedDate: any) => {
3422
- // // if (!(selectedDate.calendarDateString === null)) {
3423
- // setTempStartDateState(selectedDate.calendarDateString);
3424
- // //}
3425
- // if (selectedDate.calendarDateString === null) {
3426
- // setStartDateState(selectedDate.calendarDateString);
3427
- // }
3428
- // }}
3429
- // />
3430
- // <CalendarInput
3431
- // label="End date:"
3432
- // calendar="gregory"
3433
- // locale="en-GB"
3434
- // timeZone="Africa/Dar_es_Salaam"
3435
- // className="custom-input"
3436
- // clearable={!!tempEndDateState}
3437
- // date={tempEndDateState}
3438
- // onDateSelect={(selectedDate: any) => {
3439
- // // if (!(selectedDate.calendarDateString === null)) {
3440
- // setTempEndDateState(selectedDate.calendarDateString);
3441
- // //}
3442
- // if (selectedDate.calendarDateString === null) {
3443
- // setEndDateState(selectedDate.calendarDateString);
3444
- // }
3445
- // }}
3446
- // />
3447
- // <Button onClick={() => handleSearch()}>Search</Button>
3448
- // <Button onClick={() => setShowAllFilters(!showAllFilters)}>
3449
- // {showAllFilters ? 'Less Filters' : 'More Filters'}
3450
- // </Button>
3451
- // {(visibleFilters ?? []).map(({ label, key, valueType, options }: any) => {
3452
- // if (valueType === 'DATE') {
3453
- // return (
3454
- // <CalendarInput
3455
- // key={key}
3456
- // label={`${label}:`}
3457
- // calendar="gregory"
3458
- // locale="en-GB"
3459
- // timeZone="Africa/Dar_es_Salaam"
3460
- // className="custom-input"
3461
- // clearable={!!dateStates[key]}
3462
- // date={dateStates[key]}
3463
- // onDateSelect={(selectedDate: any) => {
3464
- // handleDateSelect(key, selectedDate);
3465
- // const filteredFilters = dataQueryFiltersState.filter(
3466
- // (f: { attribute: any }) => f.attribute !== key
3467
- // );
3468
- // if (selectedDate === null) {
3469
- // setDataQueryFiltersState(filteredFilters);
3470
- // }
3471
- // }}
3472
- // />
3473
- // );
3474
- // }
3475
- // // const filteredFilters = prevFilters.filter((f) => f.attribute !== key);
3476
- // if (options && options.options.length > 0) {
3477
- // return (
3478
- // <SingleSelectField
3479
- // key={key}
3480
- // label={`${label}:`}
3481
- // selected={inputValues[key] || ''}
3482
- // className="custom-select-input"
3483
- // clearable
3484
- // onChange={({ selected }: { selected: string }) => {
3485
- // setInputValues((prevValues: any) => ({
3486
- // ...prevValues,
3487
- // [key]: selected ?? '',
3488
- // }));
3489
- // handleInputChangeForSelectField(key, selected ?? '');
3490
- // const filteredFilters = dataQueryFiltersState.filter(
3491
- // (f: { attribute: any }) => f.attribute !== key
3492
- // );
3493
- // if (selected === '') {
3494
- // setDataQueryFiltersState(filteredFilters);
3495
- // }
3496
- // }}
3497
- // >
3498
- // {(options.options ?? []).map((opt: any) => (
3499
- // <SingleSelectOption
3500
- // key={opt.id}
3501
- // label={opt.name}
3502
- // value={opt.code}
3503
- // />
3504
- // ))}
3505
- // </SingleSelectField>
3506
- // );
3507
- // }
3508
- // return (
3509
- // <InputField
3510
- // key={key}
3511
- // label={`${label}:`}
3512
- // className="custom-input"
3513
- // value={inputValues[key] || ''}
3514
- // clearable
3515
- // onChange={(e: any) => {
3516
- // const currentValue =
3517
- // 'target' in e ? e.target.value : e.value ?? '';
3518
- // setInputValues((prevValues: any) => ({
3519
- // ...prevValues,
3520
- // [key]: currentValue,
3521
- // }));
3522
- // // if (currentValue === '') {
3523
- // // handleInputChange(key, '');
3524
- // // }
3525
- // const filteredFilters = dataQueryFiltersState.filter(
3526
- // (f: { attribute: any }) => f.attribute !== key
3527
- // );
3528
- // if (currentValue === '') {
3529
- // setDataQueryFiltersState(filteredFilters);
3530
- // }
3531
- // }}
3532
- // onBlur={(e: any) => {
3533
- // const currentValue =
3534
- // 'target' in e ? e.target.value : e.value ?? '';
3535
- // if (currentValue !== '' && currentValue !== prevValue) {
3536
- // handleInputChange(key, currentValue);
3537
- // setPrevValue(currentValue);
3538
- // }
3539
- // }}
3540
- // />
3541
- // );
3542
- // })}
3543
- // <div>
3544
- // {/* <p>hello</p> */}
3545
- // </div>
3546
- // </div>
3547
- // </DataTableToolbar>
3548
- );
3384
+ }),
3385
+ React__default.createElement("div", { style: {
3386
+ display: 'flex',
3387
+ // alignItems: 'center',
3388
+ gap: '10px',
3389
+ // flexWrap: 'wrap',
3390
+ } },
3391
+ React__default.createElement(Button$1, { onClick: handleSearch }, "Search"),
3392
+ React__default.createElement(Button$1, { onClick: () => setShowAllFilters(!showAllFilters) }, showAllFilters ? 'Less Filters' : 'More Filters')))));
3549
3393
 
3550
3394
  // export const TableHeader = ({
3551
3395
  // columns,
@@ -4890,6 +4734,7 @@ class FormField {
4890
4734
  this.selectedOptionsLabel =
4891
4735
  options.availableOptionsLabel ?? 'Selected options';
4892
4736
  this.allowFutureDate = options.allowFutureDate;
4737
+ this.extension = options.extension;
4893
4738
  }
4894
4739
  setMax(field) {
4895
4740
  if (field.controlType !== 'date') {
@@ -5345,6 +5190,7 @@ class FormFieldGroup {
5345
5190
  const hasOptions = (options?.length > 0 ||
5346
5191
  dependentField !== undefined ||
5347
5192
  fieldMetaData['hasOptions']);
5193
+ const extension = this.params.formFieldExtensions?.find((fieldExtension) => fieldExtension?.id === field.id);
5348
5194
  return new FormField({
5349
5195
  ...(fieldMetaData || {}),
5350
5196
  ...field,
@@ -5372,6 +5218,7 @@ class FormFieldGroup {
5372
5218
  controlType: FieldUtil.getFieldControlType(fieldMetaData['valueType'], hasOptions),
5373
5219
  metaType: fieldMetaData['metaType'],
5374
5220
  stepId: fieldMetaData['stepId'],
5221
+ extension,
5375
5222
  });
5376
5223
  })
5377
5224
  .filter((field) => field);
@@ -5512,6 +5359,7 @@ class FormMetadataSection {
5512
5359
  formFieldGroup,
5513
5360
  fieldMetaData: [...this.attributes, ...this.dataElements],
5514
5361
  locale: this.params.locale,
5362
+ formFieldExtensions: this.params.formFieldExtensions,
5515
5363
  }).toJson();
5516
5364
  });
5517
5365
  }
@@ -5543,6 +5391,7 @@ class FormMetaData {
5543
5391
  section,
5544
5392
  program,
5545
5393
  locale: this.params.locale,
5394
+ formFieldExtensions: this.params.formFieldExtensions,
5546
5395
  }).toJson();
5547
5396
  })
5548
5397
  .filter((section) => section !== null);
@@ -5856,10 +5705,11 @@ class FormValue {
5856
5705
  // Use of this source code is governed by a BSD-style
5857
5706
  // license that can be found in the LICENSE file.
5858
5707
  const FileUploadField = (props) => {
5859
- const { label, id, uploadUrl, performUpload, validationText, required, hasError, onChange, onUploadSuccess, } = props;
5708
+ const { label, id, uploadUrl, performUpload, validationText, required, hasError, onChange, onUploadSuccess, extension } = props;
5860
5709
  const d2 = window?.d2Web;
5861
5710
  const [file, setFile] = useState(null);
5862
5711
  const [uploading, setUploading] = useState();
5712
+ const [validationError, setValidationError] = useState(null);
5863
5713
  const valid = useMemo(() => {
5864
5714
  if (isUndefined(hasError)) {
5865
5715
  return undefined;
@@ -5885,8 +5735,14 @@ const FileUploadField = (props) => {
5885
5735
  }
5886
5736
  }
5887
5737
  };
5888
- return (React__default.createElement(FileInputField, { accept: "*", buttonLabel: "Upload a file", label: label, name: id, required: required, validationText: validationText, onChange: (event) => {
5738
+ return (React__default.createElement(FileInputField, { accept: extension?.accept?.join(','), buttonLabel: "Upload a file", label: label, name: id, required: required, error: !!validationError, validationText: validationError || validationText, onChange: (event) => {
5889
5739
  const fileItem = (event?.files || [])[0];
5740
+ setValidationError(null);
5741
+ if (extension?.sizeLimit && fileItem.size > extension?.sizeLimit) {
5742
+ setValidationError(`File size must not exceed ${extension.sizeLimit / (1024 * 1024)}MB`);
5743
+ setFile(null);
5744
+ return;
5745
+ }
5890
5746
  setFile(fileItem);
5891
5747
  if (performUpload) {
5892
5748
  uploadFile(fileItem);
@@ -6313,7 +6169,7 @@ class BaseFormFieldComponent extends ReactWrapperModule {
6313
6169
  });
6314
6170
  setValue(fileId);
6315
6171
  setTouched(true);
6316
- } })));
6172
+ }, extension: this.field()?.extension })));
6317
6173
  default:
6318
6174
  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, readOnly: disabled, onChange: (event) => {
6319
6175
  this.ngZone.run(() => {
@@ -7623,6 +7479,7 @@ class ProgramEntryFormFieldUtil {
7623
7479
  .map((field) => {
7624
7480
  const options = FieldDropdown.getDropdownOptions(field);
7625
7481
  const hasOptions = options?.length > 0;
7482
+ const extension = this.config.formFieldExtensions?.find((fieldExtension) => fieldExtension?.id === field.id);
7626
7483
  return new FormField({
7627
7484
  ...field,
7628
7485
  id: field.id,
@@ -7638,6 +7495,7 @@ class ProgramEntryFormFieldUtil {
7638
7495
  controlType: FieldUtil.getFieldControlType(field.valueType, hasOptions),
7639
7496
  metaType: field.metaType,
7640
7497
  stepId: field.stepId,
7498
+ extension,
7641
7499
  });
7642
7500
  })
7643
7501
  .sort((a, b) => a.order ?? 0 - (b.order ?? 0));