--- /dev/null
+<div class="import-form">
+ <h2 i18n>Select a Queue To Inspect</h2>
+ <div class="row flex">
+ <div>
+ <label i18n>Queue Type</label>
+ </div>
+ <div class="col-lg-3">
+ <eg-combobox (onChange)="queueTypeChanged($event)"
+ [startId]="queueType"
+ placeholder="Queue Type..." i18n-placeholder>
+ <eg-combobox-entry entryId="bib" entryLabel="Bibliographic Records"
+ i18n-entryLabel></eg-combobox-entry>
+ <eg-combobox-entry entryId="auth" entryLabel="Authority Records"
+ i18n-entryLabel></eg-combobox-entry>
+ <eg-combobox-entry entryId="bib-acq" entryLabel="Acquisitions Records"
+ i18n-entryLabel></eg-combobox-entry>
+ </eg-combobox>
+ </div>
+ </div>
+</div>
+
+<eg-grid *ngIf="queueType=='bib'" #bibQueueGrid
+ (onRowActivate)="rowActivated($event)"
+ idlClass="vbq" [dataSource]="queueSource">
+ <eg-grid-toolbar-action label="Delete Selected" i18n-label
+ [action]="deleteSelected"></eg-grid-toolbar-action>
+</eg-grid>
+
+<eg-grid *ngIf="queueType=='auth'" #authQueueGrid
+ (onRowActivate)="rowActivated($event)"
+ idlClass="vaq" [dataSource]="queueSource">
+</eg-grid>
+
+
--- /dev/null
+import {Component, OnInit, ViewChild} from '@angular/core';
+import {Observable} from 'rxjs/Observable';
+import 'rxjs/add/observable/of';
+import {map} from 'rxjs/operators/map';
+import {Router, ActivatedRoute, ParamMap} from '@angular/router';
+import {Pager} from '@eg/share/util/pager';
+import {IdlObject} from '@eg/core/idl.service';
+import {NetService} from '@eg/core/net.service';
+import {AuthService} from '@eg/core/auth.service';
+import {GridComponent} from '@eg/share/grid/grid.component';
+import {GridDataSource, GridColumn} from '@eg/share/grid/grid';
+import {VandelayService} from './vandelay.service';
+
+@Component({
+ templateUrl: 'queue-list.component.html'
+})
+export class QueueListComponent {
+
+ queueType: string; // bib / auth / bib-acq
+ queueSource: GridDataSource;
+ deleteSelected: (rows: IdlObject[]) => void;
+
+ // points to the currently active grid.
+ queueGrid: GridComponent;
+
+ @ViewChild('bibQueueGrid') bibQueueGrid: GridComponent;
+ @ViewChild('authQueueGrid') authQueueGrid: GridComponent;
+
+ constructor(
+ private router: Router,
+ private route: ActivatedRoute,
+ private net: NetService,
+ private auth: AuthService,
+ private vandelay: VandelayService) {
+
+ this.queueType = 'bib';
+ this.queueSource = new GridDataSource();
+
+ // queue API does not support sorting
+ this.queueSource.getRows = (pager: Pager) => {
+ return this.loadQueues(pager);
+ }
+
+ this.deleteSelected = (queues: IdlObject[]) => {
+
+ // Serialize the deletes, especially if there are many of them
+ // because they can be bulky calls
+ const qtype = this.queueType;
+ const method = `open-ils.vandelay.${qtype}_queue.delete`;
+
+ const deleteNext = (queues: IdlObject[], idx: number) => {
+ const queue = queues[idx];
+ if (!queue) {
+ this.currentGrid().reload();
+ return Promise.resolve();
+ }
+
+ return this.net.request('open-ils.vandelay',
+ method, this.auth.token(), queue.id()
+ ).toPromise().then(() => deleteNext(queues, ++idx));
+ }
+
+ deleteNext(queues, 0);
+ };
+ }
+
+ currentGrid(): GridComponent {
+ // The active grid changes along with the queue type.
+ // The inactive grid will be set to null.
+ return this.bibQueueGrid || this.authQueueGrid;
+ }
+
+ rowActivated(queue) {
+ const url = `/staff/cat/vandelay/queue/${this.queueType}/${queue.id()}`;
+ this.router.navigate([url]);
+ }
+
+ queueTypeChanged($event) {
+ this.queueType = $event.id;
+ this.queueSource.reset();
+ }
+
+
+ loadQueues(pager: Pager): Observable<any> {
+
+ if (!this.queueType) {
+ return Observable.of();
+ }
+
+ const qtype = this.queueType.match(/bib/) ? 'bib' : 'authority';
+ const method = `open-ils.vandelay.${qtype}_queue.owner.retrieve`;
+
+ return this.net.request('open-ils.vandelay',
+ method, this.auth.token(), null, null,
+ {offset: pager.offset, limit: pager.limit}
+ );
+ }
+}
+
-<div *ngIf="!queueId">
- show queue selector
-</div>
+<h2 i18n>Queue {{queueSummary ? queueSummary.queue.name() : ''}}</h2>
-<div *ngIf="queueId">
+<ng-template #viewMarcTmpl let-row="row">
+ <!-- TODO click -->
+ <a href i18n>TODO</a>
+</ng-template>
- <ng-template #viewMarcTmpl let-context>
- <!-- TODO click -->
- <a href i18n>View MARC</a>
- </ng-template>
+<ng-template #matchesTmpl let-row="row">
+ <!-- TODO click -->
+ <a href i18n>TODO</a>
+</ng-template>
- <ng-template #matchesTmpl let-context>
- <!-- TODO click -->
- <a href i18n>Matches</a>
- </ng-template>
+<ng-template #errorsTmpl let-row="row">
+ <!-- TODO formatting / css -->
+ <b>{{row.import_error}}</b>
+</ng-template>
- <ng-template #errorsTmpl let-row="row">
- <!-- TODO formatting / css -->
- <b>{{row.import_error}}</b>
- </ng-template>
+<ng-template #importedAsTmpl let-row="row">
+ <a routerLink="/staff/catalog/record/{{row.imported_as}}">
+ {{row.imported_as}}
+ </a>
+</ng-template>
<!--
definitions. Hide a number of stock record attributes by default
because there are a lot of them.
-->
- <eg-grid #queueGrid [dataSource]="queueSource"
- hideFields="language,pagination,price,rec_identifier,eg_tcn_source,eg_identifier,item_barcode,zsource">
- <eg-grid-column name="id" [index]="true"
- [hidden]="true"></eg-grid-column>
- <eg-grid-column i18n-label label="View MARC"
- name="+viewMarc" [cellTemplate]="viewMarcTmpl">
- </eg-grid-column>
- <eg-grid-column i18n-label label="Matches"
- name="+matches" [cellTemplate]="matchesTmpl">
- </eg-grid-column>
- <eg-grid-column name="import_error"
- i18n-label label="Import Errors" [cellTemplate]="errorsTmpl">
- </eg-grid-column>
- <eg-grid-column name="import_time"
- i18n-label label="Import Date" datatype="timestamp">
- </eg-grid-column>
- <eg-grid-column name="imported_as" i18n-label label="Imported As">
- <!-- todo record link template? -->
- </eg-grid-column>
- </eg-grid>
-
-</div>
+
+<eg-grid #queueGrid [dataSource]="queueSource"
+ hideFields="language,pagination,price,rec_identifier,eg_tcn_source,eg_identifier,item_barcode,zsource">
+ <eg-grid-column name="id" [index]="true"
+ [hidden]="true"></eg-grid-column>
+ <eg-grid-column i18n-label label="View MARC"
+ name="+viewMarc" [cellTemplate]="viewMarcTmpl"></eg-grid-column>
+ <eg-grid-column i18n-label label="Matches"
+ name="+matches" [cellTemplate]="matchesTmpl"></eg-grid-column>
+ <eg-grid-column name="import_error" i18n-label
+ label="Import Errors" [cellTemplate]="errorsTmpl"></eg-grid-column>
+ <eg-grid-column name="import_time" i18n-label
+ label="Import Date" datatype="timestamp"></eg-grid-column>
+ <eg-grid-column name="imported_as" i18n-label
+ label="Imported As" [cellTemplate]="importedAsTmpl"></eg-grid-column>
+</eg-grid>
-import {Component, OnInit, ViewChild} from '@angular/core';
+import {Component, OnInit, AfterViewInit, ViewChild} from '@angular/core';
import {Observable} from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import {map} from 'rxjs/operators/map';
import {Router, ActivatedRoute, ParamMap} from '@angular/router';
import {Pager} from '@eg/share/util/pager';
import {IdlObject} from '@eg/core/idl.service';
+import {NetService} from '@eg/core/net.service';
+import {AuthService} from '@eg/core/auth.service';
import {GridComponent} from '@eg/share/grid/grid.component';
import {GridDataSource, GridColumn} from '@eg/share/grid/grid';
import {VandelayService} from './vandelay.service';
@Component({
templateUrl: 'queue.component.html'
})
-export class QueueComponent implements OnInit {
+export class QueueComponent implements AfterViewInit {
queueId: number;
queueType: string; // bib / auth / bib-acq
queueSource: GridDataSource;
queuedRecClass: string;
+ queueSummary: any;
// keep a local copy for convenience
attrDefs: IdlObject[];
constructor(
private router: Router,
private route: ActivatedRoute,
+ private net: NetService,
+ private auth: AuthService,
private vandelay: VandelayService) {
this.route.paramMap.subscribe((params: ParamMap) => {
// queue API does not support sorting
this.queueSource.getRows = (pager: Pager) => {
- return this.loadQueue(pager);
+ return this.loadQueueRecords(pager);
}
-
}
- ngOnInit() {
- if (this.queueType) { this.applyQueueType(); }
+ ngAfterViewInit() {
+ if (this.queueType) {
+ this.applyQueueType();
+ if (this.queueId) {
+ this.loadQueueSummary();
+ }
+ }
}
applyQueueType() {
);
}
- loadQueue(pager?: Pager): Observable<any> {
+ loadQueueSummary(): Promise<any> {
+ const method =
+ `open-ils.vandelay.${this.queueType}_queue.summary.retrieve`;
- if (!(this.queueId && this.queueType)) {
- return Observable.of();
- }
+ return this.net.request(
+ 'open-ils.vandelay', method, this.auth.token(), this.queueId)
+ .toPromise().then(sum => this.queueSummary = sum);
+ }
+
+ loadQueueRecords(pager: Pager): Observable<any> {
const options = {
clear_marc: true,
import {ImportComponent} from './import.component';
import {ExportComponent} from './export.component';
import {QueueComponent} from './queue.component';
+import {QueueListComponent} from './queue-list.component';
const routes: Routes = [{
path: '',
component: ExportComponent
}, {
path: 'queue',
- component: QueueComponent
+ component: QueueListComponent
}, {
path: 'queue/:qtype/:id',
component: QueueComponent
import {ImportComponent} from './import.component';
import {ExportComponent} from './export.component';
import {QueueComponent} from './queue.component';
+import {QueueListComponent} from './queue-list.component';
import {GridModule} from '@eg/share/grid/grid.module';
import {HttpClientModule} from '@angular/common/http';
VandelayComponent,
ImportComponent,
ExportComponent,
- QueueComponent
+ QueueComponent,
+ QueueListComponent
],
imports: [
StaffCommonModule,