@iapps/ng-dhis2-ui 1.1.5 → 1.1.7

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.
@@ -25,7 +25,7 @@ import { Layer } from '@dhis2-ui/layer';
25
25
  import { CircularLoader } from '@dhis2-ui/loader';
26
26
  import { MenuItem, MenuDivider } from '@dhis2-ui/menu';
27
27
  import parse from 'html-react-parser';
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, DataTable, TableHead, DataTableRow, DataTableColumnHeader, TableBody, DataTableCell, TableFoot, Pagination, FileInputField, FileListItem, TextAreaField } from '@dhis2/ui';
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, DataTable, TableHead, DataTableRow, DataTableColumnHeader, TableBody, DataTableCell, TableFoot, Pagination, FileInputField, FileListItem, MultiSelectField, TextAreaField } from '@dhis2/ui';
29
29
  import { getNowInCalendar, generateFixedPeriods } from '@dhis2/multi-calendar-dates';
30
30
  import { isObject, isString, sortBy, isArray, find, camelCase, flatten, head, isEmpty } from 'lodash';
31
31
  import cx from 'classnames';
@@ -2661,7 +2661,7 @@ const OrgUnitDimension = ({ roots, selected, onSelect, hideGroupSelect, hideLeve
2661
2661
  React__default.createElement("div", { className: cx('orgUnitTreeWrapper', {
2662
2662
  disabled: selectedItems.some((item) => DYNAMIC_ORG_UNITS.includes(item.id)),
2663
2663
  }) },
2664
- React__default.createElement(OrganisationUnitTree, { roots: roots, initiallyExpanded: [
2664
+ React__default.createElement(OrganisationUnitTree, { roots: roots, singleSelection: allowSingleSelection, initiallyExpanded: [
2665
2665
  ...(roots.length === 1 ? [`/${roots[0]}`] : []),
2666
2666
  ...selectedItems
2667
2667
  .filter((item) => !DYNAMIC_ORG_UNITS.includes(item.id) &&
@@ -3778,6 +3778,7 @@ class DateRangeValue {
3778
3778
  var FieldType;
3779
3779
  (function (FieldType) {
3780
3780
  FieldType["TEXT"] = "TEXT";
3781
+ FieldType["MULTI_TEXT"] = "MULTI_TEXT";
3781
3782
  FieldType["TRUE_ONLY"] = "TRUE_ONLY";
3782
3783
  FieldType["LONG_TEXT"] = "LONG_TEXT";
3783
3784
  FieldType["BOOLEAN"] = "BOOLEAN";
@@ -3937,11 +3938,16 @@ class FieldUtil {
3937
3938
  class FieldControlTypeUtil {
3938
3939
  static getFieldControlType(valueType, hasOptions) {
3939
3940
  if (hasOptions) {
3941
+ if (valueType === FieldType.MULTI_TEXT) {
3942
+ return 'multi-dropdown';
3943
+ }
3940
3944
  return 'dropdown';
3941
3945
  }
3942
3946
  switch (valueType) {
3943
3947
  case FieldType.TEXT:
3944
3948
  return 'textbox';
3949
+ case FieldType.MULTI_TEXT:
3950
+ return 'multi-dropdown';
3945
3951
  case FieldType.BOOLEAN:
3946
3952
  return 'dropdown';
3947
3953
  case FieldType.LONG_TEXT:
@@ -4169,7 +4175,9 @@ class FormFieldGroup {
4169
4175
  type: FieldUtil.getFieldType(fieldMetaData['valueType']),
4170
4176
  dependentField,
4171
4177
  options,
4172
- disabled: field.disabled ?? fieldMetaData['disabled'],
4178
+ disabled: field.disabled ??
4179
+ fieldMetaData['disabled'] ??
4180
+ fieldMetaData['generated'],
4173
4181
  min: field.min ?? fieldMetaData['min'],
4174
4182
  max: field.max ?? fieldMetaData['max'],
4175
4183
  order: field.order ??
@@ -4331,7 +4339,8 @@ class FormMetaData {
4331
4339
  #getSectionFromPrograms(programs) {
4332
4340
  const sections = flatten(programs.map((program) => {
4333
4341
  return [
4334
- this.#getReportingDetailsSection(program),
4342
+ this.#getRegisteringUnitSection(program),
4343
+ this.#getReportingDateSection(program),
4335
4344
  new FormMetadataSection({
4336
4345
  section: {
4337
4346
  id: 'registration',
@@ -4406,25 +4415,44 @@ class FormMetaData {
4406
4415
  }
4407
4416
  return sections;
4408
4417
  }
4409
- #getReportingDetailsSection(program) {
4418
+ #getRegisteringUnitSection(program) {
4410
4419
  return new FormMetadataSection({
4411
4420
  section: {
4412
- id: 'reporting_details',
4413
- name: 'Reporting details',
4421
+ id: 'registering_unit_details',
4422
+ name: 'Registering unit details',
4414
4423
  fieldGroups: [
4415
4424
  {
4416
- id: 'reporting_details',
4425
+ id: 'registering_unit_details',
4417
4426
  sortOrder: 1,
4418
- isFormHorizontal: true,
4427
+ isFormHorizontal: false,
4419
4428
  fields: [
4420
4429
  new FormField({
4421
4430
  id: 'orgUnit',
4422
4431
  key: 'orgUnit',
4423
- label: 'Organisation unit',
4432
+ label: program.orgUnitLabel || 'Registering unit',
4424
4433
  code: 'orgUnit',
4425
4434
  required: true,
4426
4435
  controlType: 'org-unit',
4427
4436
  }),
4437
+ ],
4438
+ },
4439
+ ],
4440
+ },
4441
+ program,
4442
+ locale: this.params.locale,
4443
+ }).toJson();
4444
+ }
4445
+ #getReportingDateSection(program) {
4446
+ return new FormMetadataSection({
4447
+ section: {
4448
+ id: 'reporting_dates',
4449
+ name: 'Reporting dates',
4450
+ fieldGroups: [
4451
+ {
4452
+ id: 'reporting_dates',
4453
+ sortOrder: 1,
4454
+ isFormHorizontal: false,
4455
+ fields: [
4428
4456
  new DateField({
4429
4457
  id: 'enrollmentDate',
4430
4458
  label: program.enrollmentDateLabel || 'Enrollment date',
@@ -4512,8 +4540,8 @@ class BaseFormFieldComponent extends ReactWrapperModule {
4512
4540
  this.value = model();
4513
4541
  this.value$ = toObservable(this.value);
4514
4542
  this.FieldOrgUnitSelector = (props) => {
4515
- const { onSelectOrgUnit, onCancelOrgUnit } = props;
4516
- const [selected, setSelected] = useState([]);
4543
+ const { onSelectOrgUnit, selectedOrgUnits } = props;
4544
+ const [selected, setSelected] = useState(selectedOrgUnits);
4517
4545
  const [rootOrgUnits, setRootOrgUnits] = useState();
4518
4546
  const [config, setConfig] = useState();
4519
4547
  useEffect(() => {
@@ -4526,19 +4554,14 @@ class BaseFormFieldComponent extends ReactWrapperModule {
4526
4554
  });
4527
4555
  }, []);
4528
4556
  return config ? (React__default.createElement(Provider, { config: config, plugin: false, parentAlertsAdd: undefined, showAlertsInPlugin: false }, React__default.createElement(Modal$1, { position: "middle", large: true },
4529
- React__default.createElement(ModalTitle$1, null, "Organisation unit"),
4557
+ React__default.createElement(ModalTitle$1, null,
4558
+ "Select ",
4559
+ this.field().label),
4530
4560
  React__default.createElement(ModalContent$1, null,
4531
- React__default.createElement(OrgUnitDimension, { selected: selected, hideGroupSelect: this.orgUnitSelectionConfig.hideGroupSelect, hideLevelSelect: this.orgUnitSelectionConfig.hideLevelSelect, hideUserOrgUnits: this.orgUnitSelectionConfig.hideUserOrgUnits, onSelect: (selectionEvent) => {
4561
+ React__default.createElement(OrgUnitDimension, { selected: selected, allowSingleSelection: true, hideGroupSelect: this.orgUnitSelectionConfig.hideGroupSelect, hideLevelSelect: this.orgUnitSelectionConfig.hideLevelSelect, hideUserOrgUnits: this.orgUnitSelectionConfig.hideUserOrgUnits, onSelect: (selectionEvent) => {
4532
4562
  setSelected(selectionEvent.items);
4533
- }, orgUnitGroupPromise: this.getOrgUnitGroups(), orgUnitLevelPromise: this.getOrgUnitLevels(), roots: rootOrgUnits })),
4534
- React__default.createElement(ModalActions$1, null,
4535
- React__default.createElement(ButtonStrip$1, { end: true },
4536
- React__default.createElement(Button$1, { onClick: () => {
4537
- onCancelOrgUnit();
4538
- } }, "Cancel"),
4539
- React__default.createElement(Button$1, { primary: true, disabled: selected.length === 0, onClick: () => {
4540
- onSelectOrgUnit(selected);
4541
- } }, "Confirm")))))) : (React__default.createElement(CircularLoader$1, { small: true }));
4563
+ onSelectOrgUnit(selectionEvent.items);
4564
+ }, orgUnitGroupPromise: this.getOrgUnitGroups(), orgUnitLevelPromise: this.getOrgUnitLevels(), roots: rootOrgUnits }))))) : (React__default.createElement(CircularLoader$1, { small: true }));
4542
4565
  };
4543
4566
  this.showOrgUnitTree = signal(false);
4544
4567
  this.orgUnitSelectionConfig = {
@@ -4583,6 +4606,12 @@ class BaseFormFieldComponent extends ReactWrapperModule {
4583
4606
  const [touched, setTouched] = useState(false);
4584
4607
  const [showOrgUnit, setShowOrgUnit] = useState(false);
4585
4608
  const onChange = (payload) => setSelected(payload.selected);
4609
+ const arrayValue = useMemo(() => {
4610
+ if (value && value.length > 0) {
4611
+ return value.split(',');
4612
+ }
4613
+ return [];
4614
+ }, [value]);
4586
4615
  const hasError = useMemo(() => {
4587
4616
  return (touched &&
4588
4617
  (this.form().get(this.field().id) ||
@@ -4647,10 +4676,7 @@ class BaseFormFieldComponent extends ReactWrapperModule {
4647
4676
  });
4648
4677
  setTouched(true);
4649
4678
  } }),
4650
- showOrgUnit && (React__default.createElement(this.FieldOrgUnitSelector, { onCancelOrgUnit: () => {
4651
- setShowOrgUnit(false);
4652
- setTouched(true);
4653
- }, onSelectOrgUnit: (selectedOrgUnits) => {
4679
+ showOrgUnit && (React__default.createElement(this.FieldOrgUnitSelector, { selectedOrgUnits: [], onSelectOrgUnit: (selectedOrgUnits) => {
4654
4680
  if ((selectedOrgUnits || [])[0]) {
4655
4681
  const selectedOrgUnit = selectedOrgUnits[0];
4656
4682
  setDisplayValue(selectedOrgUnit.name);
@@ -4710,6 +4736,20 @@ class BaseFormFieldComponent extends ReactWrapperModule {
4710
4736
  setValue(event.selected);
4711
4737
  setTouched(true);
4712
4738
  } }, (this.field().options || []).map((option) => (React__default.createElement(SingleSelectOption, { key: option.key, label: option.label, value: option.value })))));
4739
+ case 'multi-dropdown':
4740
+ return (React__default.createElement(MultiSelectField, { clearText: "Clear", clearable: true, empty: "No data found", filterable: (this.field().options || []).length > 5, filterPlaceholder: "Type to filter options", error: hasError, validationText: validationError, inputWidth: this.fieldConfig()?.inputWidth, label: this.label(), name: this.field().id, required: this.field().required, loadingText: "Loading options", noMatchText: "No options found", onChange: (event) => {
4741
+ const selectedValue = (event.selected || []).join(',');
4742
+ this.ngZone.run(() => {
4743
+ (this.form().get(this.field().id) ||
4744
+ this.form().get(this.field().key))?.setValue(selectedValue);
4745
+ this.update.emit({
4746
+ form: this.form(),
4747
+ value: selectedValue,
4748
+ });
4749
+ });
4750
+ setValue(selectedValue);
4751
+ setTouched(true);
4752
+ }, selected: arrayValue }, (this.field().options || []).map((option) => (React__default.createElement(MultiSelectOption, { key: option.key, label: option.label, value: option.value })))));
4713
4753
  case 'file':
4714
4754
  return (React__default.createElement(FileInputField, { accept: "*", buttonLabel: "Upload a file", label: this.label(), name: this.field().id, files: this.uploadedFiles, onChange: (event) => {
4715
4755
  this.uploadedFiles.push((event?.files || [])[0]);