-<eg-staff-banner bannerText="Manage Patrons" i18n-bannerText></eg-staff-banner>
-<div class="row">
- <div class="col-lg-3">
- <h3 *ngIf="context.patron" class="font-weight-bold" i18n>
- {{patronService.namePart(context.patron, 'family_name')}},
- {{patronService.namePart(context.patron, 'first_given_name')}}
- {{patronService.namePart(context.patron, 'second_given_name')}}
- </h3>
- </div>
- <div class="col-lg-9">
- <ul ngbNav #patronNav="ngbNav" class="nav-tabs"
- [activeId]="patronTab" (navChange)="beforeTabChange($event)">
-
- <li ngbNavItem="checkout">
- <a ngbNavLink i18n>Checkout</a>
- <ng-template ngbNavContent>
- <div class="patron-content-pane">
- <eg-patron-checkout></eg-patron-checkout>
- </div>
- </ng-template>
- </li>
-
- <li ngbNavItem="edit">
- <a ngbNavLink i18n>Edit</a>
- <ng-template ngbNavContent>
- <eg-patron-edit contentPaneClass="patron-content-pane">
- </eg-patron-edit>
- </ng-template>
- </li>
-
- <li ngbNavItem="search">
- <a ngbNavLink i18n>Patron Search</a>
- <ng-template ngbNavContent>
- <div class="patron-content-pane">
- <eg-patron-search
- (selectionChange)="patronSelectionChange($event)"
- (patronsSelected)="patronsSelected($event)">
- </eg-patron-search>
- </div>
- </ng-template>
- </li>
+<ng-container *ngIf="!context.patron">
+ <eg-staff-banner bannerText="Manage Patrons" i18n-bannerText>
+ </eg-staff-banner>
+</ng-container>
- </ul>
- </div>
-</div>
+<ng-container *ngIf="context.patron">
+ <eg-staff-banner i18n-bannerText bannerText="
+ {{patronService.namePart(context.patron, 'family_name')}},
+ {{patronService.namePart(context.patron, 'first_given_name')}}
+ {{patronService.namePart(context.patron, 'second_given_name')}}">
+ </eg-staff-banner>
+</ng-container>
+
+<div class="row">
-<div class="row" *ngIf="viewInitDone">
- <ng-container *ngIf="showSummary">
+ <ng-container *ngIf="showSummaryPane()">
<div class="col-lg-3">
- <ng-container *ngIf="context.patron">
- <eg-patron-summary></eg-patron-summary>
- </ng-container>
- </div>
- <div class="col-lg-9">
- <div [ngbNavOutlet]="patronNav"></div>
+ <div class="sticky-top-with-nav bg-white">
+ <ng-container *ngIf="context.patron">
+ <eg-patron-summary></eg-patron-summary>
+ </ng-container>
+ </div>
</div>
</ng-container>
- <ng-container *ngIf="!showSummary">
- <div class="col-lg-12">
+
+ <div [ngClass]="{'col-lg-9': showSummaryPane(), 'col-lg-12': !showSummaryPane()}">
+
+ <div class="sticky-top-with-nav bg-white">
+ <ul ngbNav #patronNav="ngbNav" class="nav-tabs"
+ [activeId]="patronTab" (navChange)="beforeTabChange($event)">
+
+ <li ngbNavItem="checkout">
+ <a ngbNavLink i18n>Checkout</a>
+ <ng-template ngbNavContent>
+ <div class="">
+ <eg-patron-checkout></eg-patron-checkout>
+ </div>
+ </ng-template>
+ </li>
+
+ <li ngbNavItem="items_out">
+ <a ngbNavLink i18n>Items Out</a>
+ <ng-template ngbNavContent>
+ <div class="">
+ </div>
+ </ng-template>
+ </li>
+
+ <li ngbNavItem="holds">
+ <a ngbNavLink i18n>Holds</a>
+ <ng-template ngbNavContent>
+ <div class="">
+ </div>
+ </ng-template>
+ </li>
+
+ <li ngbNavItem="bills">
+ <a ngbNavLink i18n>Bills</a>
+ <ng-template ngbNavContent>
+ <div class="">
+ </div>
+ </ng-template>
+ </li>
+
+ <li ngbNavItem="messages">
+ <a ngbNavLink i18n>Messages</a>
+ <ng-template ngbNavContent>
+ <div class="">
+ </div>
+ </ng-template>
+ </li>
+
+ <li ngbNavItem="edit">
+ <a ngbNavLink i18n>Edit</a>
+ <ng-template ngbNavContent>
+ <eg-patron-edit
+ contentPaneClass="patron-content-pane div-scroll-vert">
+ </eg-patron-edit>
+ </ng-template>
+ </li>
+
+ <li ngbDropdown ngbNavItem="other">
+ <a href (click)="false" class="nav-link" ngbDropdownToggle>Other</a>
+ <div ngbDropdownMenu>
+ <a routerLink="/staff/circ/patron/{{patronId}}/alerts"
+ ngbDropdownItem i18n>Alerts</a>
+ <a routerLink="/staff/circ/patron/{{patronId}}/notes"
+ ngbDropdownItem i18n>Notes</a>
+ <a routerLink="/staff/circ/patron/{{patronId}}/triggered_events"
+ ngbDropdownItem i18n>Triggered Events / Notifications</a>
+ <a routerLink="/staff/circ/patron/{{patronId}}/message_center"
+ ngbDropdownItem i18n>Message Center</a>
+ <a routerLink="/staff/circ/patron/{{patronId}}/stat_cats"
+ ngbDropdownItem i18n>Statistical Categories</a>
+ <a routerLink="/staff/circ/patron/{{patronId}}/surveys"
+ ngbDropdownItem i18n>Surveys</a>
+ <a routerLink="/staff/circ/patron/{{patronId}}/group"
+ ngbDropdownItem i18n>Group Member Details</a>
+ <a routerLink="/staff/circ/patron/{{patronId}}/edit_perms"
+ ngbDropdownItem i18n>User Permission Editor</a>
+ <a routerLink="/staff/circ/patron/{{patronId}}/credentials"
+ ngbDropdownItem i18n>Test Password</a>
+ <a href="/eg/staff/acq/requests/user/{{patronId}}"
+ target="_top"
+ ngbDropdownItem i18n>Acquisition Patron Requests</a>
+ <a routerLink="/staff/booking/manage_reservations/by_patron/{{patronId}}"
+ target="_top"
+ ngbDropdownItem i18n>Booking: Manage Reservations</a>
+ <a routerLink="/staff/booking/create_reservation/for_patron/{{patronId}}"
+ target="_top"
+ ngbDropdownItem i18n>Booking: Create Reservation</a>
+ <a routerLink="/staff/booking/pickup/by_patron/{{patronId}}"
+ target="_top"
+ ngbDropdownItem i18n>Booking: Pick Up Reservations</a>
+ <a routerLink="/staff/booking/return/by_patron/{{patronId}}"
+ target="_top"
+ ngbDropdownItem i18n></a>
+ <a href='javascript:;' (click)="purgeAccount()"
+ [disabled]="disablePurge()"
+ ngbDropdownItem i18n>Completely Purge Account</a>
+ </div>
+ <ng-template ngbNavContent>
+ <!-- display selected altTab component -->
+ OTHER STUFF: {{altTab}}
+ </ng-template>
+ </li>
+
+ <li ngbNavItem="search" class="ml-auto">
+ <a ngbNavLink i18n>Patron Search</a>
+ <ng-template ngbNavContent>
+ <div class="">
+ <eg-patron-search
+ (selectionChange)="patronSelectionChange($event)"
+ (patronsActivated)="patronsActivated($event)">
+ </eg-patron-search>
+ </div>
+ </ng-template>
+ </li>
+ </ul>
+
+ <ng-container *ngIf="patronTab === 'edit'">
+ <!-- put the editor toolbar up here in the sticky section -->
+ <eg-patron-edit-toolbar></eg-patron-edit-toolbar>
+ </ng-container>
+
+ </div><!-- end of sticky top -->
+
+ <div class="pt-3">
<div [ngbNavOutlet]="patronNav"></div>
</div>
- </ng-container>
+ </div>
</div>
import {PatronManagerService} from './patron.service';
import {PatronSearchComponent} from '@eg/staff/share/patron/search.component';
+const MAIN_TABS =
+ ['checkout', 'items_out', 'holds', 'bills', 'messages', 'edit', 'search'];
+
@Component({
templateUrl: 'patron.component.html',
styleUrls: ['patron.component.css']
})
export class PatronComponent implements OnInit, AfterViewInit {
- patronTab = 'search';
patronId: number;
+ patronTab = 'search';
+ altTab: string;
showSummary = true;
- viewInitDone = false;
constructor(
private router: Router,
this.patronTab = params.get('tab') || 'search';
this.patronId = +params.get('id');
+ if (MAIN_TABS.includes(this.patronTab)) {
+ this.altTab = null;
+ } else {
+ this.altTab = this.patronTab;
+ this.patronTab = 'other';
+ }
+
const prevId =
this.context.patron ? this.context.patron.id() : null;
});
}
- // Trick that allows us to set a value for ngbNavOutlet, whose
- // component is not avilable until after view init, without
- // firing "expression changed after check" errors.
ngAfterViewInit() {
- setTimeout(() => this.viewInitDone = true);
}
beforeTabChange(evt: NgbNavChangeEvent) {
case 'bcsearch':
url += this.patronTab;
break;
+ case 'other':
+ url += `${this.patronId}/${this.altTab}`;
+ break;
default:
url += `${this.patronId}/${this.patronTab}`;
}
this.router.navigate([url]);
}
+ showSummaryPane(): boolean {
+ return this.showSummary || this.patronTab === 'search';
+ }
+
// Patron row single-clicked in the grid. Load the patron without
// leaving the search tab.
patronSelectionChange(ids: number[]) {
}
// Route to checkout tab for selected patron.
- patronsSelected(rows: any[]) {
+ patronsActivated(rows: any[]) {
if (rows.length !== 1) { return; }
const id = rows[0].id();
this.routeToTab();
}
+ disablePurge(): boolean {
+ return
+ this.context.patron.super_user() === 't' ||
+ this.patronId === this.auth.user().id();
+ }
+
+ purgeAccount() {
+ // show scary warning, etc.
+ }
}