+++ /dev/null
-
-<div *ngIf="trackers.length == 0">
- <div class="row">
- <div class="col-lg-6">
- <div class="alert alert-info">
- <span i18n>No Imports In Progress</span>
- </div>
- </div>
- </div>
-</div>
-
- <div class="row" *ngFor="let tracker of trackers">
- <div class="col-lg-6">
- <div class="card">
- <div class="card-header">
- <div class="panel-title text-center">
- <span i18n>Import Tracker
- <span class="font-weight-bold">{{tracker.name()}}</span></span>
- </div>
- </div>
- <div class="card-body">
- <div class="list-group">
- <div class="list-group-item border-0 p-2">
- <!-- .id (not .id()) check to see if it's fleshed yet -->
- <span i18n *ngIf="tracker.queue().id">
- Created on {{tracker.create_time() | date}} for
- <a class="font-weight-bold"
- routerLink="/staff/cat/vandelay/queue/{{tracker.record_type()}}/{{tracker.queue().id()}}">
- Queue {{tracker.queue().name()}}
- </a>
- </span>
- </div>
- <div class="list-group-item border-0 p-2">
- <span *ngIf="tracker.action_type() == 'enqueue'" i18n>Enqueuing...</span>
- <span *ngIf="tracker.action_type() == 'import'" i18n>Importing...</span>
- </div>
- <div class="list-group-item border-0 p-2">
- <span i18n>State:</span>
- <span *ngIf="tracker.state() == 'active'" i18n>Active</span>
- <span *ngIf="tracker.state() == 'complete'" i18n>Complete</span>
- <span *ngIf="tracker.state() == 'error'" i18n>Error</span>
- <span class='pl-3' *ngIf="tracker.state() == 'complete'">
- <span class="material-icons text-success">thumb_up</span>
- </span>
- </div>
- <div class="list-group-item border-0 p-2">
- <!-- ensure the progress shows 100% when complete -->
- <eg-progress-inline
- [max]="tracker.state() == 'complete' ? tracker.actions_performed() : tracker.total_actions() || null"
- [value]="tracker.actions_performed()">
- </eg-progress-inline>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
-
+++ /dev/null
-import {Component, OnInit} from '@angular/core';
-import {IdlService, IdlObject} from '@eg/core/idl.service';
-import {AuthService} from '@eg/core/auth.service';
-import {PcrudService} from '@eg/core/pcrud.service';
-import {VandelayService} from './vandelay.service';
-
-@Component({
- templateUrl: 'active-imports.component.html'
-})
-
-export class ActiveImportsComponent implements OnInit {
-
- trackers: IdlObject[];
- refreshInterval = 2000; // ms
-
- constructor(
- private idl: IdlService,
- private auth: AuthService,
- private pcrud: PcrudService,
- private vandelay: VandelayService
- ) {
- this.trackers = [];
- }
-
- ngOnInit() {
- this.pollTrackers();
- }
-
- pollTrackers() {
-
- const prevTrackers = this.trackers;
-
- // Report on active trackers for this workstation and for the
- // logged in user, plus any that were already reported in the
- // current instance of the UI.
- const query: any = {
- '-and' : [
- {
- '-or': [
- {workstation: this.auth.user().wsid()},
- {usr: this.auth.user().id()}
- ]
- }
- ]
- };
-
- if (this.trackers.length) {
- query['-and'].push({
- '-or': [
- {state: 'active'},
- {id: prevTrackers.map(t => t.id())}
- ]
- });
- } else {
- query['-and'].push({state: 'active'});
- }
-
- this.pcrud.search('vst', query, {order_by: {vst: 'create_time'}})
- .subscribe(
- tracker => {
- // The screen flickers less if the tracker array is
- // updated inline instead of rebuilt every time.
-
- const existing =
- this.trackers.filter(t => t.id() === tracker.id())[0];
-
- if (existing) {
- existing.update_time(tracker.update_time());
- existing.state(tracker.state());
- existing.total_actions(tracker.total_actions());
- existing.actions_performed(tracker.actions_performed());
- } else {
- // TODO: replace enqueue trackers with import trackers
- // for a given session instead of appending?
- this.trackers.push(tracker);
- this.fleshTrackerQueue(tracker);
- }
- },
- err => {},
- () => {
- const active =
- this.trackers.filter(t => t.state() === 'active');
-
- // Continue updating the display with updated tracker
- // data as long as we have any active trackers.
- if (active.length > 0) {
- setTimeout(
- () => this.pollTrackers(), this.refreshInterval);
- }
- }
- );
- }
-
- fleshTrackerQueue(tracker: IdlObject) {
- const qClass = tracker.record_type() === 'bib' ? 'vbq' : 'vaq';
- this.pcrud.retrieve(qClass, tracker.queue())
- .subscribe(queue => tracker.queue(queue));
- }
-}
<div class="col-lg-3">
<input [(ngModel)]="sessionName" class="form-control" type="text"/>
</div>
- <div class="col-lg-3" *ngIf="bibTrashGroups.length">
+ <div class="col-lg-3">
<label i18n>Remove MARC Field Groups</label>
</div>
+ <div class="col-lg-3" *ngIf="bibTrashGroups.length == 0">
+ <span i18n class="font-italic">No Removal Groups Configured</span>
+ </div>
<div class="col-lg-3" *ngIf="bibTrashGroups.length">
<select multiple [(ngModel)]="selectedTrashGroups"
class="form-control" size="3">
--- /dev/null
+<div class="row mb-2">
+ <div class="col-lg-6">
+ <div class="input-group">
+ <div class="input-group-prepend">
+ <span class="input-group-text" i18n>Show Sessions Since: </span>
+ </div>
+ <eg-date-select
+ [initialIso]="sinceDate"
+ (onChangeAsIso)="dateFilterChange($event)">
+ </eg-date-select>
+ </div>
+ </div>
+</div>
+
+<div *ngIf="trackers.length == 0">
+ <div class="row">
+ <div class="col-lg-6">
+ <div class="alert alert-info">
+ <span i18n>No Imports In Progress</span>
+ </div>
+ </div>
+ </div>
+</div>
+
+ <div class="row" *ngFor="let tracker of trackers">
+ <div class="col-lg-12">
+ <div class="card tight-card">
+ <div class="card-header">
+ <div class="panel-title">
+ <span i18n>
+ {{tracker.create_time() | date:'short'}} :
+ <span class="font-weight-bold">{{tracker.name()}}</span>
+ </span>
+ </div>
+ </div>
+ <div class="card-body">
+ <div class="list-group">
+ <div class="list-group-item border-0 p-2">
+ <!-- .id (not .id()) check to see if it's fleshed yet -->
+ <span i18n *ngIf="tracker.queue().id">
+ <a class="font-weight-bold"
+ routerLink="/staff/cat/vandelay/queue/{{tracker.record_type()}}/{{tracker.queue().id()}}">
+ Queue {{tracker.queue().name()}}
+ </a>
+ </span>
+ <span class="pl-2" *ngIf="tracker.action_type() == 'enqueue'" i18n>Enqueuing...</span>
+ <span class="pl-2" *ngIf="tracker.action_type() == 'import'" i18n>Importing...</span>
+ <span *ngIf="tracker.state() == 'active'" i18n>Active</span>
+ <span *ngIf="tracker.state() == 'complete'" i18n>Complete</span>
+ <span *ngIf="tracker.state() == 'error'" i18n>Error</span>
+ <span class='pl-3' *ngIf="tracker.state() == 'complete'">
+ <span class="material-icons text-success">thumb_up</span>
+ </span>
+ </div>
+ <div class="list-group-item border-0 p-2">
+ <!-- ensure the progress shows 100% when complete -->
+ <eg-progress-inline
+ [max]="tracker.state() == 'complete' ? tracker.actions_performed() : tracker.total_actions() || null"
+ [value]="tracker.actions_performed()">
+ </eg-progress-inline>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+
--- /dev/null
+import {Component, OnInit} from '@angular/core';
+import {IdlService, IdlObject} from '@eg/core/idl.service';
+import {AuthService} from '@eg/core/auth.service';
+import {PcrudService} from '@eg/core/pcrud.service';
+import {VandelayService} from './vandelay.service';
+
+@Component({
+ templateUrl: 'recent-imports.component.html'
+})
+
+export class RecentImportsComponent implements OnInit {
+
+ trackers: IdlObject[];
+ refreshInterval = 2000; // ms
+ sinceDate: string;
+
+ constructor(
+ private idl: IdlService,
+ private auth: AuthService,
+ private pcrud: PcrudService,
+ private vandelay: VandelayService
+ ) {
+ this.trackers = [];
+ }
+
+ ngOnInit() {
+ this.pollTrackers();
+ let now = new Date();
+ now.setDate(now.getDate() - 1);
+ this.sinceDate = now.toISOString();
+ }
+
+ dateFilterChange(iso: string) {
+ this.sinceDate = iso;
+ // TODO: kill pending setTimeout and start a new poll loop.
+ }
+
+ pollTrackers() {
+
+ // Report on recent trackers for this workstation and for the
+ // logged in user. Always show active trackers.
+ const query: any = {
+ '-and': [
+ {
+ '-or': [
+ {workstation: this.auth.user().wsid()},
+ {usr: this.auth.user().id()}
+ ],
+ }, {
+ '-or': [
+ {create_time: {'>=': this.sinceDate}},
+ {state: 'active'}
+ ]
+ }
+ ]
+ };
+
+ this.pcrud.search('vst', query, {order_by: {vst: 'create_time'}})
+ .subscribe(
+ tracker => {
+ // The screen flickers less if the tracker array is
+ // updated inline instead of rebuilt every time.
+
+ const existing =
+ this.trackers.filter(t => t.id() === tracker.id())[0];
+
+ if (existing) {
+ existing.update_time(tracker.update_time());
+ existing.state(tracker.state());
+ existing.total_actions(tracker.total_actions());
+ existing.actions_performed(tracker.actions_performed());
+ } else {
+
+ // Only show the import tracker when both an enqueue
+ // and import tracker exist for a given session.
+ const sameSes = this.trackers.filter(
+ t => t.session_key() === tracker.session_key())[0];
+
+ if (sameSes) {
+ if (sameSes.action_type() === 'enqueue') {
+ // Remove the enqueueu tracker
+
+ for (let idx = 0; idx < this.trackers.length; idx++) {
+ const trkr = this.trackers[idx];
+ if (trkr.id() === sameSes.id()) {
+ this.trackers.splice(idx, 1);
+ break;
+ }
+ }
+ } else if (sameSes.action_type() === 'import') {
+ // Avoid adding the new enqueue tracker
+ return;
+ }
+ }
+
+ this.trackers.unshift(tracker);
+ this.fleshTrackerQueue(tracker);
+ }
+ },
+ err => {},
+ () => {
+ const active =
+ this.trackers.filter(t => t.state() === 'active');
+
+ // Continue updating the display with updated tracker
+ // data as long as we have any active trackers.
+ if (active.length > 0) {
+ setTimeout(
+ () => this.pollTrackers(), this.refreshInterval);
+ }
+ }
+ );
+ }
+
+ fleshTrackerQueue(tracker: IdlObject) {
+ const qClass = tracker.record_type() === 'bib' ? 'vbq' : 'vaq';
+ this.pcrud.retrieve(qClass, tracker.queue())
+ .subscribe(queue => tracker.queue(queue));
+ }
+
+}
import {QueueItemsComponent} from './queue-items.component';
import {MatchSetListComponent} from './match-set-list.component';
import {MatchSetComponent} from './match-set.component';
-import {ActiveImportsComponent} from './active-imports.component';
+import {RecentImportsComponent} from './recent-imports.component';
const routes: Routes = [{
path: '',
component: MatchSetComponent
}, {
path: 'active_imports',
- component: ActiveImportsComponent
+ component: RecentImportsComponent
}]
}];
<li class="nav-item">
<a class="nav-link" [ngClass]="{active: tab=='active_imports'}"
routerLink="/staff/cat/vandelay/active_imports"
- i18n>Active Imports</a>
+ i18n>Recent Imports</a>
</li>
</ul>
import {MatchSetExpressionComponent} from './match-set-expression.component';
import {MatchSetQualityComponent} from './match-set-quality.component';
import {MatchSetNewPointComponent} from './match-set-new-point.component';
-import {ActiveImportsComponent} from './active-imports.component';
+import {RecentImportsComponent} from './recent-imports.component';
@NgModule({
declarations: [
MatchSetExpressionComponent,
MatchSetQualityComponent,
MatchSetNewPointComponent,
- ActiveImportsComponent
+ RecentImportsComponent
],
imports: [
TreeModule,