+++ /dev/null
-<eg-staff-banner bannerText="Load MARC Order Records" i18n-bannerText>
-</eg-staff-banner>
-
-<div class="row">
- <div class="ml-auto mr-3"><a i18n href="/eg/staff/acq/legacy/picklist/upload">Legacy Upload Interface</a></div>
-</div>
-
-
-<eg-alert-dialog #dupeQueueAlert i18n-dialogBody
- dialogBody="A queue with the requested name already exists.">
-</eg-alert-dialog>
-
-<div class="common-form striped-odd form-validated ml-3 mr-3">
- <div class="row">
- <div class="col-lg-3">
- <label for="template-select" i18n>Apply/Create Form Template</label>
- </div>
- <div class="col-lg-3">
- <eg-combobox #formTemplateSelector
- id="template-select"
- (onChange)="templateSelectorChange($event)"
- [allowFreeText]="true"
- [startId]="selectedTemplate"
- [startIdFiresOnChange]="true"
- [entries]="formatTemplateEntries()">
- </eg-combobox>
- </div>
- <div class="col-lg-6">
- <button class="btn btn-success"
- [disabled]="!selectedTemplate"
- (click)="saveTemplate()" i18n>Save As New Template</button>
- <button class="btn btn-outline-primary ml-3"
- [disabled]="!selectedTemplate"
- (click)="markTemplateDefault()" i18n>Mark Template as Default</button>
- <button class="btn btn-danger ml-3"
- [disabled]="!selectedTemplate"
- (click)="deleteTemplate()" i18n>Delete Template</button>
- </div>
- </div>
-
- <h2>Purchase Order</h2>
- <div class="row">
- <div class="col-lg-3">
- <label for="provider-select" i18n>Provider</label>
- </div>
-
- <div class="col-lg-3">
- <eg-combobox #providerSelector
- id="provider-select"
- [entries]="formatEntries('providersList')"
- (onChange)="selectEntry($event, 'providersList')"
- [required]="true"
- [startId]="selectedProvider">
- </eg-combobox>
- </div>
-
- <div class="col-lg-3">
- <label for="create-po" i18n>Create Purchase Order</label>
- </div>
- <div class="col-lg-3">
- <input class="form-check-input" type="checkbox"
- id="create-po"
- [(ngModel)]="createPurchaseOrder">
- </div>
-</div>
- <div class="row">
- <div class="col-lg-3">
- <label for="type-select" i18n>Ordering Agency</label>
- </div>
- <div class="col-lg-3">
- <eg-org-select
- [applyOrgId]="orderingAgency"
- (onChange)="orgOnChange($event)">
- </eg-org-select>
- </div>
-
- <div class="col-lg-3">
- <label for="activate-po" i18n>Activate Purchase Order</label>
- </div>
-
- <div class="col-lg-3">
- <input class="form-check-input" type="checkbox"
- id="activate-po"
- [(ngModel)]="activatePurchaseOrder">
- </div>
- </div>
-
- <div class="row">
- <div class="col-lg-3">
- <label for="year-select" i18n>Fiscal Year</label>
- </div>
- <div class="col-lg-3">
- <eg-combobox #fiscalYearSelector
- id="year-select"
- [startId]="selectedFiscalYear"
- [entries]="formatEntries('fiscalYears')"
- [required]="true"
- (onChange)="selectEntry($event, 'fiscalYears')">
- </eg-combobox>
- </div>
- </div>
-
- <div class="row">
- <div class="col-lg-3">
- <label for="sl-select" i18n>Add to Selection List?</label>
- </div>
- <div class="col-lg-3">
- <eg-combobox #selectionListSelector
- id="sl-select"
- [startId]="selectedSelectionList"
- [entries]="formatEntries('selectionLists')"
- (onChange)="selectedSelectionList=$event" i18n-placeholder
- [allowFreeText]="true">
- </eg-combobox>
- </div>
- </div>
-
-
- <h2>Upload Settings</h2>
-
- <div class="row">
- <div class="col-lg-3">
- <label for="source-select" i18n>Record Source</label>
- </div>
- <div class="col-lg-3">
- <eg-combobox #bibSourceSelector
- id="source-select"
- [entries]="formatEntries('bibSources')"
- (onChange)="selectEntry($event, 'bibSources')"
- [startId]="selectedBibSource">
- </eg-combobox>
- </div>
- <div class="col-lg-3">
- <label for="import-non-matching" i18n>Import Non-Matching Records</label>
- </div>
- <div class="col-lg-3">
- <input class="form-check-input" type="checkbox"
- id="import-non-matching"
- [(ngModel)]="importNonMatching">
- </div>
- </div>
-
- <div class="row">
- <div class="col-lg-3">
- <label for="match-set-select" i18n>Record Match Set</label>
- </div>
- <div class="col-lg-3">
- <eg-combobox #matchSetSelector
- id="match-set-select"
- [entries]="formatEntries('matchSets')"
- [disabled]="(selectedQueue && !selectedQueue.freetext) || importSelection()"
- [startId]="selectedMatchSet || defaultMatchSet"
- (onChange)="selectEntry($event, 'matchSets')">
- </eg-combobox>
- </div>
- <div class="col-lg-3">
- <label for="merge-on-exact" i18n>Merge On Exact Match (901c)</label>
- </div>
- <div class="col-lg-3">
- <input class="form-check-input" type="checkbox"
- id="merge-on-exact" [(ngModel)]="mergeOnExact">
- </div>
- </div>
-
- <div class="row">
- <div class="col-lg-3">
- <label for="merge-profiles" i18n>Merge Profile</label>
- </div>
- <div class="col-lg-3">
- <eg-combobox #mergeProfileSelector
- id="merge-profiles"
- [entries]="formatEntries('mergeProfiles')"
- (onChange)="selectEntry($event, 'mergeProfiles')"
- [startId]="selectedMergeProfile">
- </eg-combobox>
- </div>
- <div class="col-lg-3">
- <label for="merge-on-single" i18n>Merge On Single Match</label>
- </div>
- <div class="col-lg-3">
- <input class="form-check-input" type="checkbox"
- id="merge-on-single" [(ngModel)]="mergeOnSingleMatch">
- </div>
- </div>
- <div class="row">
- <div class="col-lg-3">
- <label for="insuff-merge-profiles" i18n>
- Insufficient Quality Fall-Through Profile
- </label>
- </div>
- <div class="col-lg-3">
- <eg-combobox #fallThruMergeProfileSelector
- id="insuff-merge-profiles"
- [entries]="formatEntries('mergeProfiles')"
- (onChange)="selectEntry($event, 'FallThruMergeProfile')"
- [startId]="selectedFallThruMergeProfile">
- </eg-combobox>
- </div>
- <div class="col-lg-3">
- <label for="merge-on-best" i18n>Merge On Best Match</label>
- </div>
- <div class="col-lg-3">
- <input class="form-check-input" type="checkbox"
- id="merge-on-best" [(ngModel)]="mergeOnBestMatch">
- </div>
- </div>
- <div class="row">
- <div class="col-lg-3">
- <label for="min-quality-ratio" i18n>
- Best/Single Match Minimum Quality Ratio
- </label>
- </div>
- <div class="col-lg-3">
- <input type="number" step="0.1" id="min-quality-ratio"
- class="form-control" [(ngModel)]="minQualityRatio">
- </div>
- <div class="col-lg-3">
- <label for="load-items" i18n>Load Items for Imported Records</label>
- </div>
- <div class="col-lg-3">
- <input class="form-check-input" type="checkbox"
- id="load-items"
- [(ngModel)]="loadItems">
- </div>
- </div>
-
- <h2>This Upload</h2>
- <div class="row">
- <div class="col-lg-3">
- <label for="queue-select" i18n>Select or Create a Queue</label>
- </div>
- <div class="col-lg-3">
- <eg-combobox [entries]="formatEntries('activeQueues')"
- id="queue-select"
- [startIdFiresOnChange]="true"
- (onChange)="selectedQueue=$event" i18n-placeholder
- [required]="true"
- [allowFreeText]="true">
- </eg-combobox>
- </div>
- </div>
- <div class="row" *ngIf="!importSelection()">
- <div class="col-lg-3">
- <label for="upload-file" i18n>File to Upload:</label>
- </div>
- <div class="col-lg-3">
- <input #fileSelector (change)="fileSelected($event)"
- id="upload-file" required class="form-control" type="file"/>
- </div>
- </div>
- <div class="row" *ngIf="importSelection()">
- <div class="col-lg-3">
- <label>Import Selected</label>
- </div>
- <div class="col-lg-3">
- <span *ngIf="!importSelection().importQueue" i18n>
- Importing {{importSelection().recordIds.length}} Record(s)</span>
- <span *ngIf="importSelection().importQueue" i18n>
- Importing Queue {{importSelection().queue.name()}}</span>
- </div>
- <div class="col-lg-3">
- <button class="btn btn-outline-info ml-2" (click)="clearSelection()" i18n>
- Clear Selection
- </button>
- </div>
- </div>
- <div class="row">
- <div class="col-lg-6 offset-lg-3">
- <button class="btn btn-success btn-lg btn-block font-weight-bold"
- [disabled]="isUploading || !hasNeededData()"
- (click)="upload()" i18n>Upload</button>
- </div>
- </div>
- <div class="row" [hidden]="!showProgress || uploadComplete">
- <div class="col-lg-3">
- <label i18n>Upload File to Server</label>
- </div>
- <div class="col-lg-6">
- <eg-progress-inline #uploadProgress></eg-progress-inline>
- </div>
- </div>
-
-
- <div class="col-lg-6 offset-lg-3" [hidden]="!uploadProcessing || uploadComplete">
- <h2><label i18n><i>Processing...</i></label></h2>
- </div>
-
- <div class="row" [hidden]="!uploadComplete">
- <div class="col-lg-3 offset-lg-3">
- <h2><label i18n>Upload Complete!</label></h2>
- </div>
- </div>
- <div class="row" [hidden]="!uploadComplete">
- <div class="col-sm-1 offset-lg-3">
- <label i18n>Go to:</label>
- </div>
- <div><a routerLink="/staff/cat/vandelay/queue/{{recordType}}/{{activeQueueId}}" target="_blank" i18n>Queue</a></div>
- <div class="col-sm-1" [hidden]="!selectedSelectionList"><a href="/eg/staff/acq/legacy/picklist/view/{{activeSelectionListId}}" target="_blank">Selection List</a></div>
- <div class="col-sm-2" [hidden]="!createPurchaseOrder"><a href="/eg/staff/acq/legacy/po/view/{{newPO}}" target="_blank">Purchase Order</a></div>
- </div>
+++ /dev/null
-import {Component, OnInit, AfterViewInit, Input,
- ViewChild, OnDestroy} from '@angular/core';
-import {Subject} from 'rxjs';
-import {tap} from 'rxjs/operators';
-import {IdlObject} from '@eg/core/idl.service';
-import {NetService} from '@eg/core/net.service';
-import {EventService} from '@eg/core/event.service';
-import {OrgService} from '@eg/core/org.service';
-import {AuthService} from '@eg/core/auth.service';
-import {ToastService} from '@eg/share/toast/toast.service';
-import {ComboboxComponent,
- ComboboxEntry} from '@eg/share/combobox/combobox.component';
-import {VandelayImportSelection,
- VANDELAY_UPLOAD_PATH} from '@eg/staff/cat/vandelay/vandelay.service';
-import {HttpClient, HttpRequest, HttpEventType} from '@angular/common/http';
-import {HttpResponse, HttpErrorResponse} from '@angular/common/http';
-import {ProgressInlineComponent} from '@eg/share/dialog/progress-inline.component';
-import {AlertDialogComponent} from '@eg/share/dialog/alert.component';
-import {ServerStoreService} from '@eg/core/server-store.service';
-import {PicklistUploadService} from './upload.service';
-import {OrgSelectComponent} from '@eg/share/org-select/org-select.component'
-
-
-const TEMPLATE_SETTING_NAME = 'eg.acq.picklist.upload.templates';
-
-const TEMPLATE_ATTRS = [
- 'createPurchaseOrder',
- 'activatePurchaseOrder',
- 'selectedProvider',
- 'orderingAgency',
- 'selectedFiscalYear',
- 'loadItems',
- 'selectedBibSource',
- 'selectedMatchSet',
- 'mergeOnExact',
- 'importNonMatching',
- 'mergeOnBestMatch',
- 'mergeOnSingleMatch',
- 'selectedMergeProfile',
- 'selectedFallThruMergeProfile',
- 'minQualityRatio'
-];
-
-const ORG_SETTINGS = [
- 'acq.upload.default.activate_po',
- 'acq.upload.default.create_po',
- 'acq.upload.default.provider',
- 'acq.upload.default.vandelay.import_non_matching',
- 'acq.upload.default.vandelay.load_item_for_imported',
- 'acq.upload.default.vandelay.low_quality_fall_thru_profile',
- 'acq.upload.default.vandelay.match_set',
- 'acq.upload.default.vandelay.merge_on_best',
- 'acq.upload.default.vandelay.merge_on_exact',
- 'acq.upload.default.vandelay.merge_on_single',
- 'acq.upload.default.vandelay.merge_profile',
- 'acq.upload.default.vandelay.quality_ratio'
-];
-
-
-@Component({
- templateUrl: './upload.component.html'
-})
-export class UploadComponent implements OnInit, AfterViewInit, OnDestroy {
-
- settings: Object = {};
- recordType: string;
- selectedQueue: ComboboxEntry;
-
-
- activeSelectionListId: number;
- activeQueueId: number;
- orderingAgency: number;
- selectedFiscalYear: number;
- selectedSelectionList: ComboboxEntry;
- selectedBibSource: number;
- selectedProvider: number;
- selectedMatchSet: number;
- importDefId: number;
- selectedMergeProfile: number;
- selectedFallThruMergeProfile: number;
- selectedFile: File;
- newPO: number;
-
- defaultMatchSet: string;
-
- createPurchaseOrder: boolean;
- activatePurchaseOrder: boolean;
- loadItems: boolean;
-
- importNonMatching: boolean;
- mergeOnExact: boolean;
- mergeOnSingleMatch: boolean;
- mergeOnBestMatch: boolean;
- minQualityRatio: number;
-
- isUploading: boolean;
- uploadProcessing: boolean;
- uploadComplete: boolean;
-
- // Generated by the server
- sessionKey: string;
-
- selectedTemplate: string;
- formTemplates: {[name: string]: any};
- newTemplateName: string;
-
- @ViewChild('fileSelector', { static: false }) private fileSelector;
- @ViewChild('uploadProgress', { static: true })
- private uploadProgress: ProgressInlineComponent;
-
- @ViewChild('formTemplateSelector', { static: true })
- private formTemplateSelector: ComboboxComponent;
- @ViewChild('bibSourceSelector', { static: true })
- private bibSourceSelector: ComboboxComponent;
- @ViewChild('providerSelector', {static: true})
- private providerSelector: ComboboxComponent;
- @ViewChild('fiscalYearSelector', { static: true })
- private fiscalYearSelector: ComboboxComponent;
- @ViewChild('selectionListSelector', { static: true })
- private selectionListSelector: ComboboxComponent;
- @ViewChild('matchSetSelector', { static: true })
- private matchSetSelector: ComboboxComponent;
- @ViewChild('mergeProfileSelector', { static: true })
- private mergeProfileSelector: ComboboxComponent;
- @ViewChild('fallThruMergeProfileSelector', { static: true })
- private fallThruMergeProfileSelector: ComboboxComponent;
- @ViewChild('dupeQueueAlert', { static: true })
- private dupeQueueAlert: AlertDialogComponent;
-
- constructor(
- private http: HttpClient,
- private toast: ToastService,
- private evt: EventService,
- private net: NetService,
- private auth: AuthService,
- private org: OrgService,
- private store: ServerStoreService,
- private vlagent: PicklistUploadService
- ) {
- this.applyDefaults();
- this.applySettings();
- }
-
- applySettings(): Promise<any> {
- return this.store.getItemBatch(ORG_SETTINGS)
- .then(settings => {
- this.createPurchaseOrder = settings['acq.upload.default.create_po'];
- this.activatePurchaseOrder = settings['acq.upload.default.activate_po'];
- this.selectedProvider = Number(settings['acq.upload.default.provider']);
- this.importNonMatching = settings['acq.upload.default.vandelay.import_non_matching'];
- this.loadItems = settings['acq.upload.default.vandelay.load_item_for_imported'];
- this.selectedFallThruMergeProfile = Number(settings['acq.upload.default.vandelay.low_quality_fall_thru_profile']);
- this.selectedMatchSet = Number(settings['acq.upload.default.vandelay.match_set']);
- this.mergeOnBestMatch = settings['acq.upload.default.vandelay.merge_on_best'];
- this.mergeOnExact = settings['acq.upload.default.vandelay.merge_on_exact'];
- this.mergeOnSingleMatch = settings['acq.upload.default.vandelay.merge_on_single'];
- this.selectedMergeProfile = Number(settings['acq.upload.default.vandelay.merge_profile']);
- this.minQualityRatio = Number(settings['acq.upload.default.vandelay.quality_ratio']);
- });
- }
- applyDefaults() {
- this.minQualityRatio = 0;
- this.recordType = 'bib';
- this.formTemplates = {};
- if (this.vlagent.importSelection) {
-
- if (!this.vlagent.importSelection.queue) {
- // Incomplete import selection, clear it.
- this.vlagent.importSelection = null;
- return;
- }
-
- const queue = this.vlagent.importSelection.queue;
- this.selectedMatchSet = queue.match_set();
-
- }
- }
-
- ngOnInit() {}
-
- ngAfterViewInit() {
- this.loadStartupData();
- }
-
- ngOnDestroy() {
- this.clearSelection();
- }
-
- importSelection(): VandelayImportSelection {
- return this.vlagent.importSelection;
- }
-
- loadStartupData(): Promise<any> {
-
-
- const promises = [
- this.vlagent.getMergeProfiles(),
- this.vlagent.getAllQueues('bib'),
- this.vlagent.getMatchSets('bib'),
- this.vlagent.getBibSources(),
- this.vlagent.getFiscalYears(),
- this.vlagent.getProvidersList(),
- this.vlagent.getSelectionLists(),
- this.vlagent.getItemImportDefs(),
- this.org.settings(['vandelay.default_match_set']).then(
- s => this.defaultMatchSet = s['vandelay.default_match_set']),
- this.loadTemplates()
- ];
-
- return Promise.all(promises);
- }
-
-
- orgOnChange(org: IdlObject) {
- this.orderingAgency = org.id()
- }
-
- loadTemplates() {
- this.store.getItem(TEMPLATE_SETTING_NAME).then(
- templates => {
- this.formTemplates = templates || {};
-
- Object.keys(this.formTemplates).forEach(name => {
- if (this.formTemplates[name].default) {
- this.selectedTemplate = name;
- }
- });
- }
- );
- }
-
- formatTemplateEntries(): ComboboxEntry[] {
- const entries = [];
-
- Object.keys(this.formTemplates || {}).forEach(
- name => entries.push({id: name, label: name}));
-
- return entries;
- }
-
- formatEntries(etype: string): ComboboxEntry[] {
- const rtype = this.recordType;
- let list;
-
- switch (etype) {
- case 'bibSources':
- return (this.vlagent.bibSources || []).map(
- s => {
- return {id: s.id(), label: s.source()};
- });
-
- case 'providersList':
- return (this.vlagent.providersList || []).map(
- p => {
- return {id: p.id(), label: p.code()};
- });
-
- case 'fiscalYears':
- return (this.vlagent.fiscalYears || []).map(
- fy => {
- return {id: fy.id(), label: fy.year()};
- });
- break;
-
- case 'selectionLists':
- list = this.vlagent.selectionLists;
- break;
-
- case 'activeQueues':
- list = (this.vlagent.allQueues[rtype] || []);
- break;
-
- case 'matchSets':
- list = this.vlagent.matchSets['bib'];
- break;
-
-
- case 'importItemDefs':
- list = this.vlagent.importItemAttrDefs;
- break;
-
- case 'mergeProfiles':
- list = this.vlagent.mergeProfiles;
- break;
- }
-
- return (list || []).map(item => {
- return {id: item.id(), label: item.name()};
- });
- }
-
- selectEntry($event: ComboboxEntry, etype: string) {
- const id = $event ? $event.id : null;
-
- switch (etype) {
- case 'recordType':
- this.recordType = id;
- break;
-
- case 'providersList':
- this.selectedProvider = id;
- break;
-
- case 'bibSources':
- this.selectedBibSource = id;
- break;
-
- case 'fiscalYears':
- this.selectedFiscalYear = id;
- break;
-
- case 'selectionLists':
- this.selectedSelectionList = id;
- break;
-
- case 'matchSets':
- this.selectedMatchSet = id;
- break;
-
-
- case 'mergeProfiles':
- this.selectedMergeProfile = id;
- break;
-
- case 'FallThruMergeProfile':
- this.selectedFallThruMergeProfile = id;
- break;
- }
- }
-
- fileSelected($event) {
- this.selectedFile = $event.target.files[0];
- }
-
- hasNeededData(): boolean {
- return this.selectedQueue &&
- Boolean(this.selectedFile) &&
- Boolean(this.selectedFiscalYear) &&
- Boolean(this.selectedProvider) &&
- Boolean(this.orderingAgency);
- }
-
-
- upload() {
- this.sessionKey = null;
- this.isUploading = true;
- this.uploadComplete = false;
- this.resetProgressBars();
-
- this.resolveSelectionList(),
- this.resolveQueue()
- .then(
- queueId => {
- this.activeQueueId = queueId;
- return this.uploadFile();
- },
- err => Promise.reject('queue create failed')
- ).then(
- ok => this.processUpload(),
- err => Promise.reject('process spool failed')
- ).then(
- ok => {
- this.isUploading = false;
- this.uploadComplete = true;
- },
- err => {
- console.log('file upload failed: ', err);
- this.isUploading = false;
- this.resetProgressBars();
-
- }
- );
- }
-
- resetProgressBars() {
- this.uploadProgress.update({value: 0, max: 1});
- }
-
- resolveQueue(): Promise<number> {
-
- if (this.selectedQueue.freetext) {
- return this.vlagent.createQueue(
- this.selectedQueue.label,
- this.recordType,
- this.importDefId,
- this.selectedMatchSet,
- ).then(
- id => id,
- err => {
- const evt = this.evt.parse(err);
- if (evt) {
- if (evt.textcode.match(/QUEUE_EXISTS/)) {
- this.dupeQueueAlert.open();
- } else {
- alert(evt); // server error
- }
- }
-
- return Promise.reject('Queue Create Failed');
- }
- );
- } else {
- return Promise.resolve(this.selectedQueue.id);
- }
- }
-
- resolveSelectionList(): Promise<any> {
- if (!this.selectedSelectionList) {
- return Promise.resolve()
- }
- if (this.selectedSelectionList.id) {
- this.activeSelectionListId = this.selectedSelectionList.id
- }
- if (this.selectedSelectionList.freetext) {
-
- return this.vlagent.createSelectionList(
- this.selectedSelectionList.label,
- this.orderingAgency
- ).then(
- value => this.activeSelectionListId = value
- );
- }
- return Promise.resolve(this.activeSelectionListId);
- }
-
- uploadFile(): Promise<any> {
-
- if (this.vlagent.importSelection) {
- return Promise.resolve();
- }
-
- const formData: FormData = new FormData();
-
- formData.append('ses', this.auth.token());
- formData.append('marc_upload',
- this.selectedFile, this.selectedFile.name);
-
- if (this.selectedBibSource) {
- formData.append('bib_source', '' + this.selectedBibSource);
- }
-
- const req = new HttpRequest('POST', VANDELAY_UPLOAD_PATH, formData,
- {reportProgress: true, responseType: 'text'});
-
- return this.http.request(req).pipe(tap(
- evt => {
- if (evt.type === HttpEventType.UploadProgress) {
- this.uploadProgress.update(
- {value: evt.loaded, max: evt.total});
-
- } else if (evt instanceof HttpResponse) {
- this.sessionKey = evt.body as string;
- console.log(
- 'vlagent file uploaded OK with key ' + this.sessionKey);
- }
- },
-
- (err: HttpErrorResponse) => {
- console.error(err);
- this.toast.danger(err.error);
- }
- )).toPromise();
- }
-
- processUpload(): Promise<any> {
-
- this.uploadProcessing = true;
-
- if (this.vlagent.importSelection) {
- return Promise.resolve();
- }
-
- let spoolType = this.recordType;
-
- const vandelayOptions = {
- import_no_match: this.importNonMatching,
- auto_overlay_exact: this.mergeOnExact,
- auto_overlay_best_match: this.mergeOnBestMatch,
- auto_overlay_1match: this.mergeOnSingleMatch,
- merge_profile: this.selectedMergeProfile,
- fall_through_merge_profile: this.selectedFallThruMergeProfile,
- match_quality_ratio: this.minQualityRatio,
- bib_source: this.selectedBibSource,
- create_assets: this.loadItems,
- queue_name: this.selectedQueue.label
- }
-
- const args = {
-
- provider: this.selectedProvider,
- ordering_agency: this.orderingAgency,
- create_po: this.createPurchaseOrder,
- activate_po: this.activatePurchaseOrder,
- fiscal_year: this.selectedFiscalYear,
- picklist: this.activeSelectionListId,
- vandelay: vandelayOptions
- }
-
-
- const method = `open-ils.acq.process_upload_records`;
-
- return new Promise((resolve, reject) => {
- this.net.request(
- 'open-ils.acq', method,
- this.auth.token(), this.sessionKey, args
- ).subscribe(
- progress => {
- const resp = this.evt.parse(progress);
- console.log(progress);
- if (resp) { console.error(resp); return reject();}
- if (progress.complete) {
- this.uploadProcessing = false;
- this.uploadComplete = true;
- }
- if (progress.purchase_order) {this.newPO = progress.purchase_order.id();}
- }
- );
- });
- }
-
- clearSelection() {
- this.vlagent.importSelection = null;
- this.activeSelectionListId = null;
- }
-
-
- saveTemplate() {
-
- const template = {};
- TEMPLATE_ATTRS.forEach(key => template[key] = this[key]);
-
- console.debug('Saving import profile', template);
-
- this.formTemplates[this.selectedTemplate] = template;
- return this.store.setItem(TEMPLATE_SETTING_NAME, this.formTemplates);
- }
-
- markTemplateDefault() {
-
- Object.keys(this.formTemplates).forEach(
- name => delete this.formTemplates.default
- );
-
- this.formTemplates[this.selectedTemplate].default = true;
-
- return this.store.setItem(TEMPLATE_SETTING_NAME, this.formTemplates);
- }
-
- templateSelectorChange(entry: ComboboxEntry) {
-
- if (!entry) {
- this.selectedTemplate = '';
- return;
- }
-
- this.selectedTemplate = entry.label; // label == name
-
- if (entry.freetext) {
- return;
- }
-
- const template = this.formTemplates[entry.id];
-
- TEMPLATE_ATTRS.forEach(key => this[key] = template[key]);
-
- this.bibSourceSelector.applyEntryId(this.selectedBibSource);
- this.matchSetSelector.applyEntryId(this.selectedMatchSet);
- this.providerSelector.applyEntryId(this.selectedProvider);
- this.fiscalYearSelector.applyEntryId(this.selectedFiscalYear);
- this.mergeProfileSelector.applyEntryId(this.selectedMergeProfile);
- this.fallThruMergeProfileSelector.applyEntryId(this.selectedFallThruMergeProfile);
- }
-
- deleteTemplate() {
- delete this.formTemplates[this.selectedTemplate];
- this.formTemplateSelector.selected = null;
- return this.store.setItem(TEMPLATE_SETTING_NAME, this.formTemplates);
- }
-}
-
+++ /dev/null
-import {Injectable} from '@angular/core';
-import {Observable} from 'rxjs';
-import {tap, map} from 'rxjs/operators';
-import {HttpClient} from '@angular/common/http';
-import {saveAs} from 'file-saver';
-import {IdlService, IdlObject} from '@eg/core/idl.service';
-import {OrgService} from '@eg/core/org.service';
-import {NetService} from '@eg/core/net.service';
-import {AuthService} from '@eg/core/auth.service';
-import {PcrudService} from '@eg/core/pcrud.service';
-import {PermService} from '@eg/core/perm.service';
-import {EventService} from '@eg/core/event.service';
-import {ProgressDialogComponent} from '@eg/share/dialog/progress.component';
-import {VandelayImportSelection} from '@eg/staff/cat/vandelay/vandelay.service'
-
-
-@Injectable()
-export class PicklistUploadService {
-
- allQueues: {[qtype: string]: IdlObject[]};
- attrDefs: {[atype: string]: IdlObject[]};
- bibSources: IdlObject[];
- matchSets: {[stype: string]: IdlObject[]};
- importItemAttrDefs: IdlObject[];
- mergeProfiles: IdlObject[];
- providersList: IdlObject[];
- fiscalYears: IdlObject[];
- selectionLists: IdlObject[];
- queueType: string;
- recordType: string;
-
-
- importSelection: VandelayImportSelection;
-
- constructor(
- private http: HttpClient,
- private idl: IdlService,
- private org: OrgService,
- private evt: EventService,
- private net: NetService,
- private auth: AuthService,
- private pcrud: PcrudService,
- private perm: PermService
- ) {
- this.attrDefs = {};
- this.allQueues = {};
- this.matchSets = {};
- this.importSelection = null;
- this.queueType = 'acq';
- this.recordType = 'bib';
- }
-
- getAttrDefs(dtype: string): Promise<IdlObject[]> {
- if (this.attrDefs[dtype]) {
- return Promise.resolve(this.attrDefs[dtype]);
- }
- const cls = (dtype === 'bib') ? 'vqbrad' : 'vqarad';
- const orderBy = {};
- orderBy[cls] = 'id';
- return this.pcrud.retrieveAll(cls,
- {order_by: orderBy}, {atomic: true}).toPromise()
- .then(list => {
- this.attrDefs[dtype] = list;
- return list;
- });
- }
-
- getMergeProfiles(): Promise<IdlObject[]> {
- if (this.mergeProfiles) {
- return Promise.resolve(this.mergeProfiles);
- }
-
- const owners = this.org.ancestors(this.auth.user().ws_ou(), true);
- return this.pcrud.search('vmp',
- {owner: owners}, {order_by: {vmp: ['name']}}, {atomic: true})
- .toPromise().then(profiles => {
- this.mergeProfiles = profiles;
- return profiles;
- });
- }
-
- getProvidersList(): Promise<IdlObject[]> {
- if (this.providersList) {
- return Promise.resolve(this.providersList);
- }
-
- const owners = this.org.ancestors(this.auth.user().ws_ou(), true);
- return this.pcrud.search('acqpro',
- {owner: owners}, {order_by: {acqpro: ['code']}}, {atomic: true})
- .toPromise().then(providers => {
- this.providersList = providers;
- return providers;
- });
- }
-
- getSelectionLists(): Promise<IdlObject[]> {
- if (this.selectionLists) {
- return Promise.resolve(this.selectionLists);
- }
-
- const owners = this.auth.user().id();
- return this.pcrud.search('acqpl',
- {owner: owners}, {order_by: {acqpl: ['name']}}, {atomic: true})
- .toPromise().then(lists => {
- this.selectionLists = lists;
- return lists;
- });
- }
-
- getAllQueues(qtype: string): Promise<IdlObject[]> {
- if (this.allQueues[qtype]) {
- return Promise.resolve(this.allQueues[qtype]);
- } else {
- this.allQueues[qtype] = [];
- }
-
- return this.net.request(
- 'open-ils.vandelay',
- `open-ils.vandelay.bib_queue.owner.retrieve`,
- this.auth.token()
- ).pipe(tap(
- queue => this.allQueues[qtype].push(queue)
- )).toPromise().then(() => this.allQueues[qtype]);
- }
-
- getBibSources(): Promise<IdlObject[]> {
- if (this.bibSources) {
- return Promise.resolve(this.bibSources);
- }
-
- return this.pcrud.retrieveAll('cbs',
- {order_by: {cbs: 'id'}},
- {atomic: true}
- ).toPromise().then(sources => {
- this.bibSources = sources;
- return sources;
- });
- }
-
- getFiscalYears(): Promise<IdlObject[]> {
- if (this.fiscalYears) {
- return Promise.resolve(this.fiscalYears);
- }
-
- return this.pcrud.retrieveAll('acqfy',
- {order_by: {acqfy: 'year'}},
- {atomic: true}
- ).toPromise().then(years => {
- this.fiscalYears = years;
- return years;
- });
- }
-
- getItemImportDefs(): Promise<IdlObject[]> {
- if (this.importItemAttrDefs) {
- return Promise.resolve(this.importItemAttrDefs);
- }
-
- const owners = this.org.ancestors(this.auth.user().ws_ou(), true);
- return this.pcrud.search('viiad', {owner: owners}, {}, {atomic: true})
- .toPromise().then(defs => {
- this.importItemAttrDefs = defs;
- return defs;
- });
- }
-
- getMatchSets(mtype: string): Promise<IdlObject[]> {
-
- const mstype = 'biblio'
-
- if (this.matchSets[mtype]) {
- return Promise.resolve(this.matchSets[mtype]);
- } else {
- this.matchSets[mtype] = [];
- }
-
- const owners = this.org.ancestors(this.auth.user().ws_ou(), true);
-
- return this.pcrud.search('vms',
- {owner: owners, mtype: mstype}, {}, {atomic: true})
- .toPromise().then(sets => {
- this.matchSets[mtype] = sets;
- return sets;
- });
- }
-
-
- createQueue(
- queueName: string,
- queueType: string,
- importDefId: number,
- matchSet: number): Promise<number> {
-
- const method = `open-ils.vandelay.bib_queue.create`;
- queueType = 'acq';
-
-
- return new Promise((resolve, reject) => {
- this.net.request(
- 'open-ils.vandelay', method,
- this.auth.token(), queueName, null, queueType,
- matchSet, importDefId
- ).subscribe(queue => {
- const e = this.evt.parse(queue);
- if (e) {
- reject(e);
- } else {
- this.allQueues['bib'].push(queue);
- resolve(queue.id());
- }
- });
- });
- }
-
- createSelectionList(
- picklistName: string,
- picklistOrg: number
- ): Promise<number> {
-
- const newpicklist = this.idl.create('acqpl');
- newpicklist.owner(this.auth.user().id());
- newpicklist.name(picklistName);
- newpicklist.org_unit(picklistOrg)
-
- return new Promise((resolve, reject) => {
- this.net.request(
- 'open-ils.acq', 'open-ils.acq.picklist.create',
- this.auth.token(), newpicklist
- ).subscribe((picklist) => {
- if (this.evt.parse(picklist)) {
- console.error(picklist);
- } else {
- console.log(picklist);
- resolve(picklist);
- }
- });
- });
- }
-
-}
-