<eg-progress-dialog #progressDialog></eg-progress-dialog>
-<div class="import-form">
+<div class="import-form form-validated">
<h2 i18n>MARC File Upload</h2>
<div class="row">
<div class="col-lg-3">
<label i18n>Record Type</label>
</div>
<div class="col-lg-3">
- <eg-combobox (onChange)="recordType=$event.id" [startId]="recordType"
- placeholder="Record Type..." i18n-placeholder>
+ <eg-combobox (onChange)="recordType=$event ? $event.id : null"
+ [required]="true"
+ [startId]="recordType" placeholder="Record Type..." i18n-placeholder>
<eg-combobox-entry entryId="bib" entryLabel="Bibliographic Records"
i18n-entryLabel></eg-combobox-entry>
<eg-combobox-entry entryId="auth" entryLabel="Authority Records"
</div>
<div class="col-lg-3">
<eg-combobox [entries]="formatEntries('bibSources')"
- (onChange)="selectedBibSource=$event.id"
+ (onChange)="selectedBibSource=$event ? event.id : null"
[startId]="selectedBibSource"
placeholder="Record Source..." i18n-placeholder>
</eg-combobox>
<div class="col-lg-3">
<eg-combobox [entries]="formatEntries('activeQueues')"
(onChange)="selectedQueue=$event" i18n-placeholder
+ [required]="true"
[allowFreeText]="true" placeholder="Select or Create a Queue...">
</eg-combobox>
</div>
</div>
<div class="col-lg-3">
<eg-combobox [entries]="formatEntries('bibBuckets')"
+ [disabled]="selectedQueue && !selectedQueue.freetext"
(onChange)="selectedBucket=$event.id"
placeholder="Buckets..." i18n-placeholder></eg-combobox>
</div>
</div>
<div class="col-lg-3">
<eg-combobox [entries]="formatEntries('matchSets')"
+ [disabled]="selectedQueue && !selectedQueue.freetext"
[startId]="defaultMatchSet"
(onChange)="selectedMatchSet=$event.id"
placeholder="Match Set..." i18n-placeholder></eg-combobox>
</div>
<div class="col-lg-3"> <!-- TODO disable for authority -->
<eg-combobox [entries]="formatEntries('importItemDefs')"
+ [disabled]="selectedQueue && !selectedQueue.freetext"
(onChange)="selectedHoldingsProfile=$event.id"
placeholder="Holdings Import Profile..." i18n-placeholder>
</eg-combobox>
<div class="col-lg-3">
<eg-combobox [entries]="formatEntries('mergeProfiles')"
(onChange)="selectedFallThruMergeProfile=$event.id"
- placeholder="Merge Profile..." i18n-placeholder>
+ placeholder="Fall-Through Merge Profile..." i18n-placeholder>
</eg-combobox>
</div>
<div class="col-lg-3"><label i18n>Merge On Best Match</label></div>
</div>
<div class="col-lg-3">
<input #fileSelector (change)="fileSelected($event)"
- class="form-control" type="file"/>
+ required class="form-control" type="file"/>
</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" (click)="upload()" i18n>Upload</button>
+ [disabled]="isUploading || !hasNeededData()"
+ (click)="upload()" i18n>Upload</button>
</div>
</div>
<!-- hide instead of *ngIf so ViewChild can find the progress bars -->
}
// Required form data varies depending on context.
- confirmNeededData(): boolean {
- if (!this.selectedQueue || !this.selectedBibSource) {
- return false;
- }
- return true;
+ hasNeededData(): boolean {
+ return this.selectedQueue
+ && Boolean(this.recordType)
+ && Boolean(this.selectedFile);
}
// 1. create queue if necessary
// 3. Enqueue MARC records
// 4. Import records
upload() {
- if (!this.confirmNeededData()) { return; }
-
this.sessionKey = null;
this.showProgress = true;
this.isUploading = true;
-<h2 i18n>Queue {{queueSummary ? queueSummary.queue.name() : ''}}</h2>
+<ng-container *ngIf="queueSummary">
+ <h2 i18n>Queue {{queueSummary.queue.name()}}</h2>
+
+ <div class="row pb-2">
+ <div class="col-lg-3">
+ <div class="card tight-card">
+ <h5 class="card-header" i18n>Queue Actions</h5>
+ <ul class="list-group list-group-flush">
+ </ul>
+ </div>
+ </div>
+ <div class="col-lg-3">
+ <div class="card tight-card">
+ <h5 class="card-header" i18n>Queue Summary</h5>
+ <ul class="list-group list-group-flush">
+ <li class="list-group-item">
+ <div class="row">
+ <div class="col-lg-10" i18n>Records in Queue:</div>
+ <div class="col-lg-2">{{queueSummary.total}}</div>
+ </div>
+ </li>
+ <li class="list-group-item">
+ <div class="row">
+ <div class="col-lg-10" i18n>Records Imported:</div>
+ <div class="col-lg-2">{{queueSummary.imported}}</div>
+ </div>
+ </li>
+ <li class="list-group-item">
+ <div class="row">
+ <div class="col-lg-10" i18n>Records Import Failures:</div>
+ <div class="col-lg-2">{{queueSummary.rec_import_errors}}</div>
+ </div>
+ </li>
+ <li class="list-group-item">
+ <div class="row">
+ <div class="col-lg-10" i18n>Items in Queue:</div>
+ <div class="col-lg-2">{{queueSummary.total_items}}</div>
+ </div>
+ </li>
+ <li class="list-group-item">
+ <div class="row">
+ <div class="col-lg-10" i18n>Items Imported:</div>
+ <div class="col-lg-2">{{queueSummary.total_items_imported}}</div>
+ </div>
+ </li>
+ <li class="list-group-item">
+ <div class="row">
+ <div class="col-lg-10" i18n>Item Import Failures:</div>
+ <div class="col-lg-2">{{queueSummary.item_import_errors}}</div>
+ </div>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <div class="col-lg-3">
+ <div class="card tight-card">
+ <h5 class="card-header" i18n>Queue Filters</h5>
+ <ul class="list-group list-group-flush">
+ <li class="list-group-item">
+ <div class="row">
+ <div class="col-lg-10" i18n>Limit to Records with Matches:</div>
+ <div class="col-lg-2">
+ <input type="checkbox" class="form-control"
+ [(ngModel)]="limitToMatches"/>
+ </div>
+ </div>
+ </li>
+ <li class="list-group-item">
+ <div class="row">
+ <div class="col-lg-10" i18n>Limit to Non-Imported Records:</div>
+ <div class="col-lg-2">
+ <input type="checkbox" class="form-control"
+ [(ngModel)]="limitToNonImported"/>
+ </div>
+ </div>
+ </li>
+ <li class="list-group-item">
+ <div class="row">
+ <div class="col-lg-10" i18n>
+ Limit to Records with Import Errors</div>
+ <div class="col-lg-2">
+ <input type="checkbox" class="form-control"
+ [(ngModel)]="limitToImportErrors"/>
+ </div>
+ </div>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+</ng-container>
<ng-template #viewMarcTmpl let-row="row">
<!-- TODO click -->
queueSource: GridDataSource;
queuedRecClass: string;
queueSummary: any;
+
+ // Filters
+ limitToMatches: boolean;
+ limitToNonImported: boolean;
+ limitToImportErrors: boolean;
// keep a local copy for convenience
attrDefs: IdlObject[];