@iapps/ng-dhis2-ui 1.2.72 → 1.2.74

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,13 +25,14 @@ 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, IconChevronRight16, 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, CircularLoader as CircularLoader$1, Chip, DataTableToolbar, CalendarInput, TableHead, DataTableRow, DataTableColumnHeader, Layer as Layer$1, Popper, FlyoutMenu, MenuItem as MenuItem$1, IconMore24, DataTableCell, TableBody as TableBody$1, Pagination as Pagination$1, TableFoot, DataTable, FileInputField, FileListItem, MultiSelectField, 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, IconChevronRight16, 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, CircularLoader as CircularLoader$1, Chip, DataTableToolbar, CalendarInput, TableHead, DataTableRow, DataTableColumnHeader, Layer as Layer$1, Popper, FlyoutMenu, MenuItem as MenuItem$1, IconMore24, DataTableCell, TableBody as TableBody$1, Pagination as Pagination$1, TableFoot, DataTable, DropdownButton, FileInputField, FileListItem, MultiSelectField, TextAreaField } from '@dhis2/ui';
29
29
  import { isObject, isString, debounce, sortBy, isArray, find, camelCase, flatten, isUndefined, head, isEmpty } from 'lodash';
30
30
  import cx from 'classnames';
31
31
  import { getNowInCalendar, generateFixedPeriods } from '@dhis2/multi-calendar-dates';
32
32
  import { Pager, DataOrderCriteria, DataQueryFilter, DataFilterCondition, ProgramRuleEngine } from '@iapps/d2-web-sdk';
33
33
  import { map as map$1 } from 'rxjs/operators';
34
34
  import { format, parse as parse$1 } from 'date-fns';
35
+ import * as XLSX from 'xlsx';
35
36
  import * as i2 from '@angular/forms';
36
37
  import { Validators, UntypedFormControl, UntypedFormGroup, FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';
37
38
  import { toObservable } from '@angular/core/rxjs-interop';
@@ -4030,6 +4031,7 @@ class LineListTableComponent extends ReactWrapperModule {
4030
4031
  this.rowsSelected = new EventEmitter();
4031
4032
  this.showActionButtons = true;
4032
4033
  this.showEnrollmentDates = true;
4034
+ this.showDownloadButton = true;
4033
4035
  this.reactStateUpdaters = null;
4034
4036
  this.setReactStateUpdaters = (updaters) => {
4035
4037
  this.reactStateUpdaters = updaters;
@@ -4216,6 +4218,50 @@ class LineListTableComponent extends ReactWrapperModule {
4216
4218
  dataQueryFiltersState,
4217
4219
  triggerRefetch,
4218
4220
  ]);
4221
+ const handleExcelDownload = () => {
4222
+ const filteredColumns = columns.filter((col) => col.label !== 'Actions');
4223
+ const header = filteredColumns.map((col) => col.label);
4224
+ const rows = data.map((row) => filteredColumns.map((col) => {
4225
+ const cell = row[col.key];
4226
+ if (cell === null || cell === undefined)
4227
+ return '';
4228
+ return typeof cell === 'object' && 'value' in cell
4229
+ ? cell.value
4230
+ : cell;
4231
+ }));
4232
+ const worksheetData = [header, ...rows];
4233
+ // Creates worksheet and workbook, then writes to file
4234
+ const worksheet = XLSX.utils.aoa_to_sheet(worksheetData);
4235
+ const workbook = XLSX.utils.book_new();
4236
+ XLSX.utils.book_append_sheet(workbook, worksheet, 'LineListData');
4237
+ XLSX.writeFile(workbook, 'records.xlsx');
4238
+ };
4239
+ const handleCsvDownload = () => {
4240
+ const safeValue = (value) => {
4241
+ if (value === null || value === undefined)
4242
+ return '';
4243
+ if (typeof value === 'object') {
4244
+ if ('value' in value) {
4245
+ return value.value;
4246
+ }
4247
+ return JSON.stringify(value);
4248
+ }
4249
+ return value;
4250
+ };
4251
+ const filteredColumns = columns.filter((col) => col.label !== 'Actions');
4252
+ const header = filteredColumns.map((col) => `"${col.label}"`).join(',');
4253
+ const csvData = data.map((row) => filteredColumns.map((col) => `"${safeValue(row[col.key])}"`).join(','));
4254
+ const csvContent = [header, ...csvData].join('\n');
4255
+ // Creates a Blob and triggers the download
4256
+ const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });
4257
+ const url = URL.createObjectURL(blob);
4258
+ const link = document.createElement('a');
4259
+ link.href = url;
4260
+ link.setAttribute('download', 'records.csv');
4261
+ document.body.appendChild(link);
4262
+ link.click();
4263
+ document.body.removeChild(link);
4264
+ };
4219
4265
  const handleInputChange = (key, value) => {
4220
4266
  setInputValues((prevValues) => ({
4221
4267
  ...prevValues,
@@ -4307,6 +4353,11 @@ class LineListTableComponent extends ReactWrapperModule {
4307
4353
  React__default.createElement("div", { style: {
4308
4354
  fontSize: 14,
4309
4355
  } }, "Loading"))) : (React__default.createElement("div", null,
4356
+ this.showDownloadButton && (React__default.createElement("div", { style: { paddingBottom: '1rem', display: 'flex', justifyContent: 'flex-end' } },
4357
+ React__default.createElement(DropdownButton, { name: "Download", component: React__default.createElement("span", null,
4358
+ ' ',
4359
+ React__default.createElement(MenuItem$1, { label: "Download Csv", onClick: handleCsvDownload }),
4360
+ React__default.createElement(MenuItem$1, { label: "Download Excel", onClick: handleExcelDownload })), value: "Download" }, "Download"))),
4310
4361
  orgUnitModalVisible && (React__default.createElement(OrgUnitSelector, { hide: hide, setHide: setHide, selectedOrgUnit: selectedOrgUnit, setSelectedOrgUnit: setSelectedOrgUnit, setOrgUnitState: setOrgUnitState, setTempOrgUnitState: setTempOrgUnitState, tempOrgUnitState: tempOrgUnitState })),
4311
4362
  this.showFilters && (React__default.createElement(FilterToolbar, { orgUnitLabel: orgUnitLabel, selectedOrgUnit: selectedOrgUnit, setSelectedOrgUnit: setSelectedOrgUnit, setOrgUnitState: setOrgUnitState, defaultOrgUnit: defaultOrgUnit, setHide: setHide, startDateState: startDateState, setStartDateState: setStartDateState, endDateState: endDateState, setEndDateState: setEndDateState, visibleFilters: visibleFilters, dateStates: dateStates, inputValues: inputValues, setInputValues: setInputValues, handleInputChange: handleInputChange, handleInputChangeForSelectField: handleInputChangeForSelectField, handleDateSelect: handleDateSelect, prevValue: prevValue, setPrevValue: setPrevValue, showAllFilters: showAllFilters, setShowAllFilters: setShowAllFilters, handleSearch: handleSearch, setTempStartDateState: setTempStartDateState, setTempEndDateState: setTempEndDateState, setTempOrgUnitState: setTempOrgUnitState, tempStartDateState: tempStartDateState, tempEndDateState: tempEndDateState, tempOrgUnitState: tempOrgUnitState, dataQueryFiltersState: dataQueryFiltersState, setDataQueryFiltersState: setDataQueryFiltersState, SetOrgUnitModalVisible: setOrgUnitModalVisible, showEnrollmentDates: this.showEnrollmentDates })),
4312
4363
  React__default.createElement(LineListTable, { columns: columns, data: data, pager: pager, setPager: setPager, getTextColorFromBackGround: getTextColorFromBackGround, actionOptions: this.actionOptions, actionOptionOrientation: this.actionOptionOrientation, actionSelected: this.actionSelected, selectable: selectable, rowsSelected: this.rowsSelected, showActionButtons: showActionButtons })))));
@@ -4354,7 +4405,7 @@ class LineListTableComponent extends ReactWrapperModule {
4354
4405
  this.render();
4355
4406
  }
4356
4407
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.8", ngImport: i0, type: LineListTableComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
4357
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.8", type: LineListTableComponent, isStandalone: false, selector: "ng-dhis2-ui-line-list", inputs: { programId: "programId", orgUnit: "orgUnit", programStageId: "programStageId", actionOptions: "actionOptions", actionOptionOrientation: "actionOptionOrientation", attributeFilters: "attributeFilters", useOuModeWithOlderDHIS2Instance: "useOuModeWithOlderDHIS2Instance", startDate: "startDate", endDate: "endDate", dataQueryFilters: "dataQueryFilters", ouMode: "ouMode", isButtonLoading: "isButtonLoading", buttonFilter: "buttonFilter", filterRootOrgUnit: "filterRootOrgUnit", showFilters: "showFilters", isOptionSetNameVisible: "isOptionSetNameVisible", allowRowsSelection: "allowRowsSelection", enrollmentStatus: "enrollmentStatus", triggerRefetch: "triggerRefetch", eventStatus: "eventStatus", showActionButtons: "showActionButtons", showEnrollmentDates: "showEnrollmentDates" }, outputs: { actionSelected: "actionSelected", rowsSelected: "rowsSelected" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, styles: ["@charset \"UTF-8\";::ng-deep .custom-input{display:flex!important;gap:4px!important;align-items:center!important;border:1px solid #9fadba!important;border-radius:4px!important;margin:0;padding:0 0 0 8px;background-color:#fff!important}::ng-deep .custom-input div{margin:0!important}::ng-deep .custom-input label{font-size:12px;padding-right:0}::ng-deep .custom-input input{border:none!important;font-size:12px!important;display:flex;align-items:center;padding-left:4px;height:40px;outline:none!important;box-shadow:none!important}::ng-deep .custom-input input:focus{border:none!important;box-shadow:none!important}::ng-deep .custom-input [data-test=calendar-clear-button]{background-color:#f2f2f2!important;color:#870808!important;border-radius:6px!important;padding:4px 10px!important;font-size:0!important}::ng-deep .custom-input [data-test=calendar-clear-button]:before{content:\"\\2715\";font-size:14px;color:#870808}::ng-deep .custom-input [data-test=calendar-clear-button]:hover{background-color:#ddd}::ng-deep .calendar-input-wrapper{position:relative}::ng-deep .calendar-input-wrapper .custom-input{position:relative;width:100%;display:flex;align-items:center}::ng-deep .calendar-input-wrapper [data-test=calendar-clear-button]{right:8px;bottom:14px;margin:auto;display:flex;align-items:center;justify-content:center;width:16px;height:16px;font-size:0!important;background-color:#a0adba!important;border-radius:50%;padding:2px;cursor:pointer}::ng-deep .calendar-input-wrapper [data-test=calendar-clear-button]:before{content:\"\\2715\";font-size:10px;color:#f0f0f0}::ng-deep .calendar-input-wrapper input{padding-right:40px!important;height:40px;line-height:40px;box-sizing:border-box}::ng-deep .custom-input label{color:gray!important;opacity:1}::ng-deep .table-top-toolbar{background-color:var(--colors-grey100)!important;color:var(--colors-grey900)!important}::ng-deep .custom-select-input{display:flex!important;gap:4px!important;align-items:center!important;border:1px solid #9fadba!important;border-radius:4px!important;margin:0;padding:0 0 0 8px;background-color:#fff!important}::ng-deep .custom-select-input div{margin:0!important}::ng-deep .custom-select-input [data-test=dhis2-uiwidgets-singleselectfield-label]{font-size:12px;color:gray!important}::ng-deep .custom-select-input [data-test=dhis2-uicore-select-input]{border:none!important;font-size:12px!important;display:flex;align-items:center;padding-left:4px;height:40px;outline:none!important;box-shadow:none!important}::ng-deep .custom-select-input [data-test=dhis2-uicore-select-input]:focus-within{box-shadow:none!important}::ng-deep .custom-select-input input:focus{border:none!important;box-shadow:none!important}\n"] }); }
4408
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.8", type: LineListTableComponent, isStandalone: false, selector: "ng-dhis2-ui-line-list", inputs: { programId: "programId", orgUnit: "orgUnit", programStageId: "programStageId", actionOptions: "actionOptions", actionOptionOrientation: "actionOptionOrientation", attributeFilters: "attributeFilters", useOuModeWithOlderDHIS2Instance: "useOuModeWithOlderDHIS2Instance", startDate: "startDate", endDate: "endDate", dataQueryFilters: "dataQueryFilters", ouMode: "ouMode", isButtonLoading: "isButtonLoading", buttonFilter: "buttonFilter", filterRootOrgUnit: "filterRootOrgUnit", showFilters: "showFilters", isOptionSetNameVisible: "isOptionSetNameVisible", allowRowsSelection: "allowRowsSelection", enrollmentStatus: "enrollmentStatus", triggerRefetch: "triggerRefetch", eventStatus: "eventStatus", showActionButtons: "showActionButtons", showEnrollmentDates: "showEnrollmentDates", showDownloadButton: "showDownloadButton" }, outputs: { actionSelected: "actionSelected", rowsSelected: "rowsSelected" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, styles: ["@charset \"UTF-8\";::ng-deep .custom-input{display:flex!important;gap:4px!important;align-items:center!important;border:1px solid #9fadba!important;border-radius:4px!important;margin:0;padding:0 0 0 8px;background-color:#fff!important}::ng-deep .custom-input div{margin:0!important}::ng-deep .custom-input label{font-size:12px;padding-right:0}::ng-deep .custom-input input{border:none!important;font-size:12px!important;display:flex;align-items:center;padding-left:4px;height:40px;outline:none!important;box-shadow:none!important}::ng-deep .custom-input input:focus{border:none!important;box-shadow:none!important}::ng-deep .custom-input [data-test=calendar-clear-button]{background-color:#f2f2f2!important;color:#870808!important;border-radius:6px!important;padding:4px 10px!important;font-size:0!important}::ng-deep .custom-input [data-test=calendar-clear-button]:before{content:\"\\2715\";font-size:14px;color:#870808}::ng-deep .custom-input [data-test=calendar-clear-button]:hover{background-color:#ddd}::ng-deep .calendar-input-wrapper{position:relative}::ng-deep .calendar-input-wrapper .custom-input{position:relative;width:100%;display:flex;align-items:center}::ng-deep .calendar-input-wrapper [data-test=calendar-clear-button]{right:8px;bottom:14px;margin:auto;display:flex;align-items:center;justify-content:center;width:16px;height:16px;font-size:0!important;background-color:#a0adba!important;border-radius:50%;padding:2px;cursor:pointer}::ng-deep .calendar-input-wrapper [data-test=calendar-clear-button]:before{content:\"\\2715\";font-size:10px;color:#f0f0f0}::ng-deep .calendar-input-wrapper input{padding-right:40px!important;height:40px;line-height:40px;box-sizing:border-box}::ng-deep .custom-input label{color:gray!important;opacity:1}::ng-deep .table-top-toolbar{background-color:var(--colors-grey100)!important;color:var(--colors-grey900)!important}::ng-deep .custom-select-input{display:flex!important;gap:4px!important;align-items:center!important;border:1px solid #9fadba!important;border-radius:4px!important;margin:0;padding:0 0 0 8px;background-color:#fff!important}::ng-deep .custom-select-input div{margin:0!important}::ng-deep .custom-select-input [data-test=dhis2-uiwidgets-singleselectfield-label]{font-size:12px;color:gray!important}::ng-deep .custom-select-input [data-test=dhis2-uicore-select-input]{border:none!important;font-size:12px!important;display:flex;align-items:center;padding-left:4px;height:40px;outline:none!important;box-shadow:none!important}::ng-deep .custom-select-input [data-test=dhis2-uicore-select-input]:focus-within{box-shadow:none!important}::ng-deep .custom-select-input input:focus{border:none!important;box-shadow:none!important}\n"] }); }
4358
4409
  }
4359
4410
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.8", ngImport: i0, type: LineListTableComponent, decorators: [{
4360
4411
  type: Component,
@@ -4407,6 +4458,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.8", ngImpor
4407
4458
  type: Input
4408
4459
  }], showEnrollmentDates: [{
4409
4460
  type: Input
4461
+ }], showDownloadButton: [{
4462
+ type: Input
4410
4463
  }] } });
4411
4464
 
4412
4465
  class LineListModule {
@@ -5477,6 +5530,7 @@ class FormMetaData {
5477
5530
  program,
5478
5531
  locale: this.params.locale,
5479
5532
  excludeInheritedAttributes: this.params.excludeInheritedAttributes,
5533
+ formFieldExtensions: this.params.formFieldExtensions,
5480
5534
  }).toJson();
5481
5535
  });
5482
5536
  }
@@ -5507,6 +5561,7 @@ class FormMetaData {
5507
5561
  program,
5508
5562
  locale: this.params.locale,
5509
5563
  excludeInheritedAttributes: this.params.excludeInheritedAttributes,
5564
+ formFieldExtensions: this.params.formFieldExtensions,
5510
5565
  }).toJson();
5511
5566
  }
5512
5567
  #getReportingDateSection(program) {
@@ -5544,6 +5599,7 @@ class FormMetaData {
5544
5599
  program,
5545
5600
  locale: this.params.locale,
5546
5601
  excludeInheritedAttributes: this.params.excludeInheritedAttributes,
5602
+ formFieldExtensions: this.params.formFieldExtensions,
5547
5603
  }).toJson();
5548
5604
  }
5549
5605
  #getRegistrationSection(program) {
@@ -5577,6 +5633,7 @@ class FormMetaData {
5577
5633
  program,
5578
5634
  locale: this.params.locale,
5579
5635
  excludeInheritedAttributes: this.params.excludeInheritedAttributes,
5636
+ formFieldExtensions: this.params.formFieldExtensions,
5580
5637
  }).toJson();
5581
5638
  }
5582
5639
  #getMergedRegistrationSection(program) {
@@ -5653,6 +5710,7 @@ class FormMetaData {
5653
5710
  program,
5654
5711
  locale: this.params.locale,
5655
5712
  excludeInheritedAttributes: this.params.excludeInheritedAttributes,
5713
+ formFieldExtensions: this.params.formFieldExtensions,
5656
5714
  }).toJson();
5657
5715
  }
5658
5716
  toJson() {
@@ -7253,7 +7311,6 @@ class TrackerFormComponent {
7253
7311
  }
7254
7312
  onFormUpdate(values) {
7255
7313
  const instance = this.instance;
7256
- console.log(instance);
7257
7314
  instance?.updateDataValues(values);
7258
7315
  }
7259
7316
  onSave(event) { }