--- /dev/null
+
+<div class="d-flex mb-3">
+ <div>
+ <div class="input-group">
+ <div class="input-group-prepend">
+ <span class="input-group-text">Owner</span>
+ </div>
+ <eg-org-select
+ [initialOrg]="contextOrg"
+ (onChange)="orgOnChange($event)">
+ </eg-org-select>
+ </div>
+ </div>
+</div>
+
+<ng-template #nameTmpl let-row="row">
+ <a routerLink="/staff/cat/vandelay/match_sets/{{row.id()}}/editor">
+ {{row.name()}}
+ </a>
+</ng-template>
+
+<eg-grid #grid [dataSource]="gridSource"
+ persistKey="cat.vandelay.match_set.list"
+ idlClass="vms" [dataSource]="queueSource">
+ <eg-grid-toolbar-button label="New Match Set" i18n-label [action]="createNew">
+ </eg-grid-toolbar-button>
+ <eg-grid-toolbar-action label="Delete Selected" i18n-label
+ [action]="deleteSelected"></eg-grid-toolbar-action>
+ <eg-grid-column name="name" [cellTemplate]="nameTmpl">
+ </eg-grid-column>
+</eg-grid>
+
+<eg-fm-record-editor #editDialog idlClass="vms">
+</eg-fm-record-editor>
+
+
+
--- /dev/null
+import {Component, AfterViewInit, ViewChild} from '@angular/core';
+import {Router} from '@angular/router';
+import {Pager} from '@eg/share/util/pager';
+import {IdlObject} from '@eg/core/idl.service';
+import {PcrudService} from '@eg/core/pcrud.service';
+import {OrgService} from '@eg/core/org.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 {FmRecordEditorComponent} from '@eg/share/fm-editor/fm-editor.component';
+
+@Component({
+ templateUrl: 'match-set-list.component.html'
+})
+export class MatchSetListComponent implements AfterViewInit {
+
+ contextOrg: IdlObject;
+ gridSource: GridDataSource;
+ deleteSelected: (rows: IdlObject[]) => void;
+ createNew: () => void;
+ @ViewChild('grid') grid: GridComponent;
+ @ViewChild('editDialog') editDialog: FmRecordEditorComponent;
+
+ constructor(
+ private router: Router,
+ private pcrud: PcrudService,
+ private auth: AuthService,
+ private org: OrgService) {
+
+ this.gridSource = new GridDataSource();
+ this.contextOrg = this.org.get(this.auth.user().ws_ou());
+
+ this.gridSource.getRows = (pager: Pager) => {
+ const orgs = this.org.descendants(this.contextOrg, true);
+ return this.pcrud.search('vms', {owner: orgs}, {
+ order_by: {vms: ['name']},
+ limit: pager.limit,
+ offset: pager.offset
+ });
+ }
+
+ this.createNew = () => {
+ this.editDialog.mode = 'create';
+ this.editDialog.open({size: 'lg'}).then(
+ ok => this.grid.reload(),
+ err => {}
+ );
+ };
+
+ this.deleteSelected = (matchSets: IdlObject[]) => {
+ matchSets.forEach(matchSet => matchSet.isdeleted(true));
+ this.pcrud.autoApply(matchSets).subscribe(
+ val => console.debug('deleted: ' + val),
+ err => {},
+ () => this.grid.reload()
+ );
+ };
+ }
+
+ ngAfterViewInit() {
+ this.grid.onRowActivate.subscribe(
+ (matchSet: IdlObject) => {
+ this.editDialog.mode = 'update';
+ this.editDialog.recId = matchSet.id();
+ this.editDialog.open({size: 'lg'}).then(
+ ok => this.grid.reload(),
+ err => {}
+ );
+ }
+ );
+ }
+
+ orgOnChange(org: IdlObject) {
+ this.contextOrg = org;
+ this.grid.reload();
+ }
+}
+
--- /dev/null
+
+<ngb-tabset [activeId]="matchSetTab" (tabChange)="onTabChange($event)">
+ <ngb-tab title="Match Set Editor" i18n-title id="editor">
+ <ng-template ngbTabContent>
+ </ng-template>
+ </ngb-tab>
+ <ngb-tab title="Match Set Quality Metrics" i18n-title id="quality">
+ <ng-template ngbTabContent>
+ </ng-template>
+ </ngb-tab>
+</ngb-tabset>
--- /dev/null
+import {Component, OnInit, ViewChild} from '@angular/core';
+import {Router, ActivatedRoute, ParamMap} from '@angular/router';
+import {NgbTabset, NgbTabChangeEvent} from '@ng-bootstrap/ng-bootstrap';
+
+@Component({
+ templateUrl: 'match-set.component.html'
+})
+export class MatchSetComponent {
+
+ matchSetId: number;
+ matchSetTab: string;
+
+ constructor(
+ private router: Router,
+ private route: ActivatedRoute) {
+ this.route.paramMap.subscribe((params: ParamMap) => {
+ this.matchSetId = +params.get('id');
+ this.matchSetTab = params.get('matchSetTab');
+ });
+ }
+
+ // Changing a tab in the UI means changing the route.
+ // Changing the route ultimately results in changing the tab.
+ onTabChange(evt: NgbTabChangeEvent) {
+ this.matchSetTab = evt.nextId;
+
+ // prevent tab changing until after route navigation
+ evt.preventDefault();
+
+ const url =
+ `/staff/cat/vandelay/match_sets/${this.matchSetId}/${this.matchSetTab}`;
+
+ this.router.navigate([url]);
+ }
+}
+
import {MergeProfilesComponent} from './merge-profiles.component';
import {HoldingsProfilesComponent} from './holdings-profiles.component';
import {QueueItemsComponent} from './queue-items.component';
+import {MatchSetListComponent} from './match-set-list.component';
+import {MatchSetComponent} from './match-set.component';
const routes: Routes = [{
path: '',
}, {
path: 'holdings_profiles',
component: HoldingsProfilesComponent
+ }, {
+ path: 'match_sets',
+ component: MatchSetListComponent
+ }, {
+ path: 'match_sets/:id/:matchSetTab',
+ component: MatchSetComponent
}]
}];
i18n>Merge / Overlay Profiles</a>
</li>
<li class="nav-item">
- <a class="nav-link disabled" [ngClass]="{active: tab=='match_sets'}"
+ <a class="nav-link" [ngClass]="{active: tab=='match_sets'}"
routerLink="/staff/cat/vandelay/match_sets"
i18n>Record Match Sets</a>
</li>
import {HoldingsProfilesComponent} from './holdings-profiles.component';
import {QueueItemsComponent} from './queue-items.component';
import {RecordItemsComponent} from './record-items.component';
+import {MatchSetListComponent} from './match-set-list.component';
+import {MatchSetComponent} from './match-set.component';
@NgModule({
declarations: [
MergeProfilesComponent,
HoldingsProfilesComponent,
QueueItemsComponent,
- RecordItemsComponent
+ RecordItemsComponent,
+ MatchSetListComponent,
+ MatchSetComponent
],
imports: [
StaffCommonModule,