From 1765af28c56226725cfb4ff9dd0d4ce567f01b2e Mon Sep 17 00:00:00 2001 From: Galen Charlton Date: Tue, 14 Dec 2021 10:43:09 -0500 Subject: [PATCH] LP#1942220: implement Export Single Attribute List from LI Search Also do a bit of refactoring; LineitemService will include more of the meat of each action, leaving it to the caller to stage parameters. Signed-off-by: Galen Charlton --- .../staff/acq/lineitem/lineitem-list.component.ts | 17 +---------------- .../src/app/staff/acq/lineitem/lineitem.service.ts | 20 ++++++++++++++++++++ .../src/app/staff/acq/search/acq-search.module.ts | 4 +++- .../staff/acq/search/lineitem-results.component.html | 2 ++ .../staff/acq/search/lineitem-results.component.ts | 14 ++++++++++++++ 5 files changed, 40 insertions(+), 17 deletions(-) diff --git a/Open-ILS/src/eg2/src/app/staff/acq/lineitem/lineitem-list.component.ts b/Open-ILS/src/eg2/src/app/staff/acq/lineitem/lineitem-list.component.ts index 83ee4ba5fc..54ea3aaf49 100644 --- a/Open-ILS/src/eg2/src/app/staff/acq/lineitem/lineitem-list.component.ts +++ b/Open-ILS/src/eg2/src/app/staff/acq/lineitem/lineitem-list.component.ts @@ -18,7 +18,6 @@ import {AddCopiesDialogComponent} from './add-copies-dialog.component'; import {LinkInvoiceDialogComponent} from './link-invoice-dialog.component'; import {ExportAttributesDialogComponent} from './export-attributes-dialog.component'; import {ClaimPolicyDialogComponent} from './claim-policy-dialog.component'; -import {saveAs} from 'file-saver'; const DELETABLE_STATES = [ 'new', 'selector-ready', 'order-ready', 'approved', 'pending-order' @@ -716,21 +715,7 @@ export class LineitemListComponent implements OnInit { this.exportAttributesDialog.open().subscribe(attr => { if (!attr) { return; } - const values: string[] = []; - this.liService.getFleshedLineitems(ids, { fromCache: true }).subscribe( - li => values.push(this.displayAttr(li.lineitem, attr)), - err => {}, - () => { - const filtered = values.filter(x => x !== ''); - saveAs( - new Blob( - [ filtered.join('\n') + '\n' ], - { type: 'text/plain;charset=utf-8' } - ), - 'export_attr_list.txt' - ); - } - ); + this.liService.doExportSingleAttributeList(ids, attr); }); } diff --git a/Open-ILS/src/eg2/src/app/staff/acq/lineitem/lineitem.service.ts b/Open-ILS/src/eg2/src/app/staff/acq/lineitem/lineitem.service.ts index 928ee9bb67..faaf3bedb0 100644 --- a/Open-ILS/src/eg2/src/app/staff/acq/lineitem/lineitem.service.ts +++ b/Open-ILS/src/eg2/src/app/staff/acq/lineitem/lineitem.service.ts @@ -7,6 +7,7 @@ import {AuthService} from '@eg/core/auth.service'; import {PcrudService} from '@eg/core/pcrud.service'; import {ComboboxEntry} from '@eg/share/combobox/combobox.component'; import {ItemLocationService} from '@eg/share/item-location-select/item-location-select.service'; +import {saveAs} from 'file-saver'; const COPY_ORDER_DISPOSITIONS: 'canceled' | 'delayed' | 'received' | 'on-order' | 'pre-order' = null; @@ -437,5 +438,24 @@ export class LineitemService { return li.id(); } } + + doExportSingleAttributeList(ids: number[], attr: string) { + if (!attr) { return; } + const values: string[] = []; + this.getFleshedLineitems(ids, { fromCache: true }).subscribe( + li => values.push(this.getFirstAttributeValue(li.lineitem, attr, 'lineitem_marc_attr_definition')), + err => {}, + () => { + const filtered = values.filter(x => x !== ''); + saveAs( + new Blob( + [ filtered.join('\n') + '\n' ], + { type: 'text/plain;charset=utf-8' } + ), + 'export_attr_list.txt' + ); + } + ); + } } diff --git a/Open-ILS/src/eg2/src/app/staff/acq/search/acq-search.module.ts b/Open-ILS/src/eg2/src/app/staff/acq/search/acq-search.module.ts index 1fea224ec1..05226d5cc1 100644 --- a/Open-ILS/src/eg2/src/app/staff/acq/search/acq-search.module.ts +++ b/Open-ILS/src/eg2/src/app/staff/acq/search/acq-search.module.ts @@ -12,6 +12,7 @@ import {PicklistCloneDialogComponent} from './picklist-clone-dialog.component'; import {PicklistDeleteDialogComponent} from './picklist-delete-dialog.component'; import {PicklistMergeDialogComponent} from './picklist-merge-dialog.component'; import {AcqSearchService} from './acq-search.service'; +import {LineitemModule} from '@eg/staff/acq/lineitem/lineitem.module'; @NgModule({ declarations: [ @@ -28,7 +29,8 @@ import {AcqSearchService} from './acq-search.service'; ], imports: [ StaffCommonModule, - AcqSearchRoutingModule + AcqSearchRoutingModule, + LineitemModule ], providers: [AcqSearchService] }) diff --git a/Open-ILS/src/eg2/src/app/staff/acq/search/lineitem-results.component.html b/Open-ILS/src/eg2/src/app/staff/acq/search/lineitem-results.component.html index f980421a40..93d4b336d6 100644 --- a/Open-ILS/src/eg2/src/app/staff/acq/search/lineitem-results.component.html +++ b/Open-ILS/src/eg2/src/app/staff/acq/search/lineitem-results.component.html @@ -2,6 +2,8 @@ i18n-searchTypeLabel searchTypeLabel="Line Item" runImmediatelySetting="eg.acq.search.lineitems.run_immediately" defaultSearchSetting="eg.acq.search.default.lineitems"> + + diff --git a/Open-ILS/src/eg2/src/app/staff/acq/search/lineitem-results.component.ts b/Open-ILS/src/eg2/src/app/staff/acq/search/lineitem-results.component.ts index bf5f98306d..9fcb40df8a 100644 --- a/Open-ILS/src/eg2/src/app/staff/acq/search/lineitem-results.component.ts +++ b/Open-ILS/src/eg2/src/app/staff/acq/search/lineitem-results.component.ts @@ -9,6 +9,8 @@ import {AuthService} from '@eg/core/auth.service'; import {GridComponent} from '@eg/share/grid/grid.component'; import {GridDataSource, GridCellTextGenerator} from '@eg/share/grid/grid'; import {AcqSearchService, AcqSearchTerm, AcqSearch} from './acq-search.service'; +import {LineitemService} from '../lineitem/lineitem.service'; +import {ExportAttributesDialogComponent} from '../lineitem/export-attributes-dialog.component'; import {AcqSearchFormComponent} from './acq-search-form.component'; @Component({ @@ -22,6 +24,7 @@ export class LineitemResultsComponent implements OnInit { gridSource: GridDataSource; @ViewChild('acqSearchForm', { static: true}) acqSearchForm: AcqSearchFormComponent; @ViewChild('acqSearchLineitemsGrid', { static: true }) lineitemResultsGrid: GridComponent; + @ViewChild('exportAttributesDialog') exportAttributesDialog: ExportAttributesDialogComponent; noSelectedRows: (rows: IdlObject[]) => boolean; @@ -32,6 +35,7 @@ export class LineitemResultsComponent implements OnInit { private route: ActivatedRoute, private net: NetService, private auth: AuthService, + private liService: LineitemService, private acqSearch: AcqSearchService) { } @@ -74,4 +78,14 @@ export class LineitemResultsComponent implements OnInit { window.open('/eg2/staff/acq/po/' + row.purchase_order().id() + '/lineitem/' + row.id() + '/worksheet', '_blank'); } + + exportSingleAttributeList(rows: IdlObject[]) { + const ids = rows.map(x => Number(x.id())); + this.exportAttributesDialog.ids = ids; + this.exportAttributesDialog.open().subscribe(attr => { + if (!attr) { return; } + + this.liService.doExportSingleAttributeList(ids, attr); + }); + } } -- 2.11.0