--- /dev/null
+import {Component} from '@angular/core';
+
+@Component({
+ selector: 'eg-root',
+ template: '<router-outlet></router-outlet>'
+})
+
+export class EgBaseComponent {
+}
+
+
--- /dev/null
+/**
+ * EgBaseModule is the shared starting point for all apps.
+ * It provides the root router and a simple welcome page for
+ * users that end up here accidentally.
+ */
+import {BrowserModule} from '@angular/platform-browser';
+import {NgModule} from '@angular/core';
+import {Router} from '@angular/router'; // Debugging
+import {NgbModule} from '@ng-bootstrap/ng-bootstrap'; // ng-bootstrap
+import {CookieModule} from 'ngx-cookie'; // import CookieMonster
+
+import {EgBaseComponent} from './app.component';
+import {EgBaseRoutingModule} from './routing.module';
+import {WelcomeComponent} from './welcome.component';
+
+// Import and 'provide' globally required services.
+import {EgEventService} from '@eg/core/event';
+import {EgStoreService} from '@eg/core/store';
+import {EgIdlService} from '@eg/core/idl';
+import {EgNetService} from '@eg/core/net';
+import {EgAuthService} from '@eg/core/auth';
+import {EgPcrudService} from '@eg/core/pcrud';
+import {EgOrgService} from '@eg/core/org';
+
+@NgModule({
+ declarations: [
+ EgBaseComponent,
+ WelcomeComponent
+ ],
+ imports: [
+ EgBaseRoutingModule,
+ BrowserModule,
+ NgbModule.forRoot(),
+ CookieModule.forRoot()
+ ],
+ providers: [
+ EgEventService,
+ EgStoreService,
+ EgIdlService,
+ EgNetService,
+ EgAuthService,
+ EgPcrudService,
+ EgOrgService
+ ],
+ exports: [],
+ bootstrap: [EgBaseComponent]
+})
+
+export class EgBaseModule {
+ constructor(router: Router) {
+ /*
+ console.debug('Routes: ',
+ JSON.stringify(router.config, undefined, 2));
+ */
+ }
+}
+++ /dev/null
-import { Component } from '@angular/core';
-
-@Component({
- selector: 'eg-root',
- template: '<router-outlet></router-outlet>'
-})
-
-export class EgBaseComponent {
-}
-
-
+++ /dev/null
-/**
- * EgBaseModule is the shared starting point for all apps.
- * It provides the root router and a simple welcome page for
- * users that end up here accidentally.
- */
-import {BrowserModule} from '@angular/platform-browser';
-import {NgModule} from '@angular/core';
-import {Router} from '@angular/router'; // Debugging
-import {NgbModule} from '@ng-bootstrap/ng-bootstrap';
-import {CookieModule} from 'ngx-cookie'; // import CookieMonster
-import {HttpClientModule} from '@angular/common/http';
-
-import {EgBaseComponent} from './base.component';
-import {EgBaseRoutingModule} from './routing.module';
-import {WelcomeComponent} from './welcome.component';
-
-// Import and 'provide' globally required services.
-import {EgEventService} from '@eg/core/event';
-import {EgStoreService} from '@eg/core/store';
-import {EgIdlService} from '@eg/core/idl';
-import {EgNetService} from '@eg/core/net';
-import {EgAuthService} from '@eg/core/auth';
-import {EgPcrudService} from '@eg/core/pcrud';
-import {EgOrgService} from '@eg/core/org';
-
-@NgModule({
- declarations: [
- EgBaseComponent,
- WelcomeComponent
- ],
- imports: [
- EgBaseRoutingModule,
- BrowserModule,
- NgbModule.forRoot(),
- CookieModule.forRoot(),
- HttpClientModule
- ],
- providers: [
- EgEventService,
- EgStoreService,
- EgIdlService,
- EgNetService,
- EgAuthService,
- EgPcrudService,
- EgOrgService
- ],
- exports: [
- ],
- bootstrap: [EgBaseComponent]
-})
-
-export class EgBaseModule {
- constructor(router: Router) {
- /*
- console.debug('Routes: ',
- JSON.stringify(router.config, undefined, 2));
- */
- }
-}
console.debug('EgBaseResolver:resolve()');
- // Safe to assume some data is needed by all applications.
+ // Load data common to all applications.
+
this.idl.parseIdl();
return this.org.fetchOrgs();
- // load other common stuff...
+ // Note that authentication happens at a deeper level, since
+ // some applications (e.g. a public catalog) do not require
+ // up-front authentication to access.
}
}
}, {
path: 'staff',
resolve : {startup : EgBaseResolver},
- loadChildren: './staff/staff.module#EgStaffModule'
+ loadChildren: './staff/app.module#EgStaffModule'
}
];
import {Injectable, EventEmitter} from '@angular/core';
import {EgOrgService} from '@eg/core/org';
-import {HttpClient} from '@angular/common/http';
/*
TODO: Add Display Fields to UNAPI
@Injectable()
export class EgUnapiService {
- constructor(
- private org: EgOrgService,
- private http: HttpClient
- ) {}
+ constructor(private org: EgOrgService) {}
createUrl(params: EgUnapiParams): string {
let depth = params.depth || 0;
+++ /dev/null
-import { CommonModule } from '@angular/common';
-import { NgModule } from '@angular/core';
-import { EgAdminRoutingModule } from './routing.module';
-
-@NgModule({
- declarations: [],
- imports: [ EgAdminRoutingModule ]
-})
-
-export class EgAdminModule {}
--- /dev/null
+import {CommonModule} from '@angular/common';
+import {NgModule} from '@angular/core';
+import {EgAdminRoutingModule} from './routing.module';
+
+@NgModule({
+ declarations: [],
+ imports: [EgAdminRoutingModule]
+})
+
+export class EgAdminModule {}
-import { NgModule } from '@angular/core';
-import { RouterModule, Routes } from '@angular/router';
+import {NgModule} from '@angular/core';
+import {RouterModule, Routes} from '@angular/router';
const routes: Routes = [{
path: '',
children : [{
path: 'workstation',
- loadChildren: '@eg/staff/admin/workstation/admin-ws.module#EgAdminWsModule'
+ loadChildren: '@eg/staff/admin/workstation/app.module#EgAdminWsModule'
}]
}];
@NgModule({
- imports: [ RouterModule.forChild(routes) ],
- exports: [ RouterModule ]
+ imports: [RouterModule.forChild(routes)],
+ exports: [RouterModule]
})
export class EgAdminRoutingModule {}
+++ /dev/null
-import {NgModule} from '@angular/core';
-import {CommonModule} from '@angular/common';
-import {EgStaffModule} from '../../staff.module';
-import {EgAdminWsRoutingModule} from './routing.module';
-import {EgWorkstationsComponent} from './workstations.component';
-
-@NgModule({
- declarations: [
- EgWorkstationsComponent
- ],
- imports: [
- EgStaffModule,
- EgAdminWsRoutingModule,
- CommonModule
- ]
-})
-
-export class EgAdminWsModule {}
-
--- /dev/null
+import {NgModule} from '@angular/core';
+import {CommonModule} from '@angular/common';
+import {EgStaffModule} from '../../app.module';
+import {EgAdminWsRoutingModule} from './routing.module';
+import {EgWorkstationsComponent} from './workstations.component';
+
+@NgModule({
+ declarations: [
+ EgWorkstationsComponent
+ ],
+ imports: [
+ EgStaffModule,
+ EgAdminWsRoutingModule,
+ CommonModule
+ ]
+})
+
+export class EgAdminWsModule {}
+
-import { NgModule } from '@angular/core';
-import { RouterModule, Routes } from '@angular/router';
-import { EgWorkstationsComponent } from './workstations.component';
+import {NgModule} from '@angular/core';
+import {RouterModule, Routes} from '@angular/router';
+import {EgWorkstationsComponent} from './workstations.component';
const routes: Routes = [
+ // TODO: load each sub-app lazily
{ path: 'workstations',
component: EgWorkstationsComponent
}
];
@NgModule({
- imports: [ RouterModule.forChild(routes) ],
- exports: [ RouterModule ]
+ imports: [RouterModule.forChild(routes)],
+ exports: [RouterModule]
})
export class EgAdminWsRoutingModule {}
--- /dev/null
+#staff-content-container {
+ width: 95%;
+ margin-top:56px;
+ padding-right: 10px;
+ padding-left: 10px;
+ margin-right: auto;
+ margin-left: auto;
+}
--- /dev/null
+<!-- top navigation bar -->
+<eg-staff-nav-bar></eg-staff-nav-bar>
+
+<div id='staff-content-container'>
+ <!-- page content -->
+ <router-outlet></router-outlet>
+</div>
+
--- /dev/null
+import { Component, OnInit } from '@angular/core';
+import { Router, ActivatedRoute, NavigationEnd } from '@angular/router';
+import { EgAuthService, EgAuthWsState } from '@eg/core/auth';
+import { EgNetService } from '@eg/core/net';
+
+@Component({
+ templateUrl: 'app.component.html',
+ styleUrls: ['app.component.css']
+})
+
+export class EgStaffComponent implements OnInit {
+
+ readonly loginPath = '/staff/login';
+ readonly wsAdminPath = '/staff/admin/workstation/workstations';
+
+ constructor(
+ private router: Router,
+ private route: ActivatedRoute,
+ private net: EgNetService,
+ private auth: EgAuthService
+ ) {}
+
+ ngOnInit() {
+
+ console.debug('EgStaffComponent:ngOnInit()');
+
+ // Fires on all in-app router navigation, but not initial page load.
+ this.router.events.subscribe(routeEvent => {
+ if (routeEvent instanceof NavigationEnd) {
+ //console.debug(`EgStaffComponent routing to ${routeEvent.url}`);
+ this.basicAuthChecks(routeEvent);
+ }
+ });
+
+ // Redirect to the login page on any auth timeout events.
+ this.net.authExpired$.subscribe(uhOh => {
+ console.debug('Auth session has expired. Redirecting to login');
+ this.auth.redirectUrl = this.router.url;
+ this.router.navigate(['/staff/login']);
+ });
+
+ this.route.data.subscribe((data: {staffResolver : any}) => {
+ console.debug('EgStaff ngOnInit complete');
+
+ });
+ }
+
+ /**
+ * Verifying auth token on every route is overkill, since an expired
+ * token will make itself known with the first API call, but we do
+ * want to prevent navigation from the login or workstation admin
+ * page, since these can be accessed without a valid authtoken or
+ * workstation, respectively, once the initial route resolvers
+ * have done their jobs.
+ */
+ basicAuthChecks(routeEvent: NavigationEnd): void {
+
+ // Access to login page is always granted
+ if (routeEvent.url == this.loginPath) return;
+
+ if (!this.auth.token())
+ this.router.navigate([this.loginPath]);
+
+ // Access to workstation admin page is granted regardless
+ // of workstation validity.
+ if (routeEvent.url == this.wsAdminPath) return;
+
+ if (this.auth.workstationState != EgAuthWsState.VALID)
+ this.router.navigate([this.wsAdminPath]);
+ }
+}
+
+
--- /dev/null
+import {CommonModule} from '@angular/common';
+import {NgModule} from '@angular/core';
+import {FormsModule} from '@angular/forms';
+import {NgbModule} from '@ng-bootstrap/ng-bootstrap';
+import {EgBaseModule} from '@eg/app.module';
+
+import {EgStaffComponent} from './app.component';
+import {EgStaffRoutingModule} from './routing.module';
+import {EgStaffNavComponent} from './nav.component';
+import {EgStaffLoginComponent} from './login.component';
+import {EgStaffSplashComponent} from './splash.component';
+import {EgOrgSelectComponent} from '@eg/share/org-select.component';
+
+@NgModule({
+ declarations: [
+ EgStaffComponent,
+ EgStaffNavComponent,
+ EgStaffSplashComponent,
+ EgStaffLoginComponent,
+ EgOrgSelectComponent
+ ],
+ imports: [
+ EgStaffRoutingModule,
+ FormsModule,
+ NgbModule
+ ],
+ exports: [
+ // Components available to all staff/sub modules
+ EgOrgSelectComponent,
+ FormsModule,
+ NgbModule
+ ]
+})
+
+export class EgStaffModule {
+
+}
--- /dev/null
+<!-- search form sits atop every catalog page -->
+<eg-catalog-search-form></eg-catalog-search-form>
+
+<!-- search results, record details, etc. -->
+<router-outlet></router-outlet>
+
--- /dev/null
+import {Component, OnInit} from '@angular/core';
+import {StaffCatalogService} from './app.service';
+
+@Component({
+ templateUrl: 'app.component.html'
+})
+export class EgCatalogComponent implements OnInit {
+
+ constructor(private staffCat: StaffCatalogService) {}
+
+ ngOnInit() {
+ // Create the search context that will be used by all
+ // of my child components.
+ this.staffCat.createContext();
+ }
+}
+
--- /dev/null
+import {CommonModule} from '@angular/common';
+import {NgModule} from '@angular/core';
+import {EgStaffModule} from '../app.module';
+import {EgUnapiService} from '@eg/share/unapi';
+import {EgCatalogRoutingModule} from './routing.module';
+import {EgCatalogService} from '@eg/share/catalog/catalog.service';
+import {EgCatalogUrlService} from '@eg/share/catalog/catalog-url.service';
+import {EgCatalogComponent} from './app.component';
+import {SearchFormComponent} from './search-form.component';
+import {ResultsComponent} from './result/results.component';
+import {RecordComponent} from './record/record.component';
+import {CopiesComponent} from './record/copies.component';
+import {EgBibSummaryComponent} from '../share/bib-summary.component';
+import {ResultPaginationComponent} from './result/pagination.component';
+import {ResultFacetsComponent} from './result/facets.component';
+import {ResultRecordComponent} from './result/record.component';
+import {StaffCatalogService} from './app.service';
+import {RecordPaginationComponent} from './record/pagination.component';
+
+@NgModule({
+ declarations: [
+ EgCatalogComponent,
+ ResultsComponent,
+ RecordComponent,
+ CopiesComponent,
+ EgBibSummaryComponent,
+ SearchFormComponent,
+ ResultRecordComponent,
+ ResultFacetsComponent,
+ ResultPaginationComponent,
+ RecordPaginationComponent
+ ],
+ imports: [
+ EgStaffModule,
+ CommonModule,
+ EgCatalogRoutingModule
+ ],
+ providers: [
+ EgUnapiService,
+ EgCatalogService,
+ EgCatalogUrlService,
+ StaffCatalogService
+ ]
+})
+
+export class EgCatalogModule {
+
+}
--- /dev/null
+import {Injectable} from '@angular/core';
+import {Router, ActivatedRoute} from '@angular/router';
+import {EgOrgService} from '@eg/core/org';
+import {EgCatalogService} from '@eg/share/catalog/catalog.service';
+import {EgCatalogUrlService} from '@eg/share/catalog/catalog-url.service';
+import {CatalogSearchContext} from '@eg/share/catalog/search-context';
+
+/**
+ * Shared bits needed by the staff version of the catalog.
+ */
+
+@Injectable()
+export class StaffCatalogService {
+
+ searchContext: CatalogSearchContext;
+ routeIndex: number = 0;
+
+ constructor(
+ private router: Router,
+ private route: ActivatedRoute,
+ private org: EgOrgService,
+ private cat: EgCatalogService,
+ private catUrl: EgCatalogUrlService
+ ) { }
+
+ createContext(): void {
+ // Initialize the search context from the load-time URL params.
+ // Do this here so the search form and other context data are
+ // applied on every page, not just the search results page. The
+ // search results pages will handle running the actual search.
+ this.searchContext =
+ this.catUrl.fromUrlParams(this.route.snapshot.queryParamMap);
+
+ this.searchContext.org = this.org;
+ this.searchContext.isStaff = true;
+
+ // TODO: UI / settings
+ if (!this.searchContext.pager.limit)
+ this.searchContext.pager.limit = 20;
+ }
+
+ /**
+ * Redirect to the search results page while propagating the current
+ * search paramters into the URL. Let the search results component
+ * execute the actual search.
+ */
+ search(): void {
+ let params = this.catUrl.toUrlParams(this.searchContext);
+
+ // Avoid redirect on empty-query searches
+ if (params.query[0] == '') return;
+
+ // Force a new search every time this method is called, even if
+ // it's the same as the active search. Since router navigation
+ // exits early when the route + params is identical, add a
+ // random token to the route params to force a full navigation.
+ // This also resolves a problem where only removing secondary+
+ // versions of a query param fail to cause a route navigation.
+ // (E.g. going from two query= params to one). Investigation
+ // pending.
+ params.ridx=''+this.routeIndex++;
+
+ this.router.navigate(
+ ['/staff/catalog/search'], {queryParams: params});
+ }
+
+}
+
+
+++ /dev/null
-<!-- search form sits atop every catalog page -->
-<eg-catalog-search-form></eg-catalog-search-form>
-
-<!-- search results, record details, etc. -->
-<router-outlet></router-outlet>
-
+++ /dev/null
-import {Component, OnInit} from '@angular/core';
-import {StaffCatalogService} from './staff-catalog.service';
-
-@Component({
- templateUrl: 'catalog.component.html'
-})
-export class EgCatalogComponent implements OnInit {
-
- constructor(private staffCat: StaffCatalogService) {}
-
- ngOnInit() {
- // Create the search context that will be used by all
- // of my child components.
- this.staffCat.createContext();
- }
-}
-
+++ /dev/null
-import {CommonModule} from '@angular/common';
-import {NgModule} from '@angular/core';
-import {EgStaffModule} from '../staff.module';
-import {EgUnapiService} from '@eg/share/unapi';
-import {EgCatalogRoutingModule} from './routing.module';
-import {EgCatalogService} from '@eg/share/catalog/catalog.service';
-import {EgCatalogUrlService} from '@eg/share/catalog/catalog-url.service';
-import {EgCatalogComponent} from './catalog.component';
-import {SearchFormComponent} from './search-form.component';
-import {ResultsComponent} from './result/results.component';
-import {RecordComponent} from './record/record.component';
-import {CopiesComponent} from './record/copies.component';
-import {EgBibSummaryComponent} from '../share/bib-summary.component';
-import {ResultPaginationComponent} from './result/pagination.component';
-import {ResultFacetsComponent} from './result/facets.component';
-import {ResultRecordComponent} from './result/record.component';
-import {StaffCatalogService} from './staff-catalog.service';
-import {RecordPaginationComponent} from './record/pagination.component';
-
-@NgModule({
- declarations: [
- EgCatalogComponent,
- ResultsComponent,
- RecordComponent,
- CopiesComponent,
- EgBibSummaryComponent,
- SearchFormComponent,
- ResultRecordComponent,
- ResultFacetsComponent,
- ResultPaginationComponent,
- RecordPaginationComponent
- ],
- imports: [
- EgStaffModule,
- CommonModule,
- EgCatalogRoutingModule
- ],
- providers: [
- EgUnapiService,
- EgCatalogService,
- EgCatalogUrlService,
- StaffCatalogService
- ]
-})
-
-export class EgCatalogModule {
-
-}
+++ /dev/null
-
-.d-flex > div:not(first-child) {
- padding-left: 3px;
- /*
- border-left: 1px solid rgba(0,0,0,0.2);
- */
-}
-/*
-.eg-copies .pagination {margin: 0px 0px 0px 0px}
-*/
-<style>
- /* common card-tight class, see also bib-summary.css */
-.eg-copies .card-body {
- padding: .25rem;
-}
-.eg-copies .list-group-item {
- padding: .25rem;
-}
-</style>
<div class='eg-copies w-100'>
<ul class="pagination mb-1">
<li class="page-item" [ngClass]="{disabled : pager.offset == 0}">
</a>
</li>
</ul>
- <div class='card w-100'>
+ <div class='card tight-card w-100'>
<div class="card-header font-weight-bold d-flex bg-info">
<div class="flex-1" i18n>Location</div>
- <div class="flex-1" i18n>Call Number / Copy Notes</div>
- <div class="flex-1" i18n>Barcode</div>
- <div class="flex-1" i18n>Shelving Location</div>
- <div class="flex-1" i18n>Circulation Modifier</div>
- <div class="flex-1" i18n>Age Hold Protection</div>
- <div class="flex-1" i18n>Active/Create Date</div>
- <div class="flex-1" i18n>Holdable?</div>
- <div class="flex-1" i18n>Status</div>
- <div class="flex-1" i18n>Due Date</div>
+ <div class="flex-1 pl-1" i18n>Call Number / Copy Notes</div>
+ <div class="flex-1 pl-1" i18n>Barcode</div>
+ <div class="flex-1 pl-1" i18n>Shelving Location</div>
+ <div class="flex-1 pl-1" i18n>Circulation Modifier</div>
+ <div class="flex-1 pl-1" i18n>Age Hold Protection</div>
+ <div class="flex-1 pl-1" i18n>Active/Create Date</div>
+ <div class="flex-1 pl-1" i18n>Holdable?</div>
+ <div class="flex-1 pl-1" i18n>Status</div>
+ <div class="flex-1 pl-1" i18n>Due Date</div>
</div>
<div class="card-body">
<ul class="list-group list-group-flush" *ngIf="copies && copies.length">
[ngClass]="{'list-group-item-info': (idx % 2) == 1}">
<div class="d-flex">
<div class="flex-1" i18n>{{orgName(copy.circ_lib)}}</div>
- <div class="flex-1" i18n>
+ <div class="flex-1 pl-1" i18n>
{{copy.call_number_prefix_label}}
{{copy.call_number_label}}
{{copy.call_number_suffix_label}}
</div>
- <div class="flex-1" i18n>
+ <div class="flex-1 pl-1" i18n>
{{copy.barcode}}
<a class="pl-1" href="/eg/staff/cat/item/{{copy.id}}" i18n>View</a>
|
<a class="pl-1" href="/eg/staff/cat/item/{{copy.id}}/edit" i18n>Edit</a>
</div>
- <div class="flex-1" i18n>{{copy.copy_location}}</div>
- <div class="flex-1" i18n>{{copy.circ_modifier || ''}}</div>
- <div class="flex-1" i18n>{{copy.age_protect}}</div>
- <div class="flex-1" i18n>
+ <div class="flex-1 pl-1" i18n>{{copy.copy_location}}</div>
+ <div class="flex-1 pl-1" i18n>{{copy.circ_modifier || ''}}</div>
+ <div class="flex-1 pl-1" i18n>{{copy.age_protect}}</div>
+ <div class="flex-1 pl-1" i18n>
{{copy.active_date || copy.create_date | date:'shortDate'}}
</div>
- <div class="flex-1">
+ <div class="flex-1 pl-1">
<span *ngIf="holdable(copy)" i18n>Yes</span>
<span *ngIf="!holdable(copy)" i18n>No</span>
</div>
- <div class="flex-1" i18n>{{copy.copy_status}}</div>
- <div class="flex-1" i18n>{{copy.due_date | date:'shortDate'}}</div>
+ <div class="flex-1 pl-1" i18n>{{copy.copy_status}}</div>
+ <div class="flex-1 pl-1" i18n>{{copy.due_date | date:'shortDate'}}</div>
</div>
</li>
</ul>
import {Component, OnInit, Input} from '@angular/core';
import {EgNetService} from '@eg/core/net';
-import {StaffCatalogService} from '../staff-catalog.service';
+import {StaffCatalogService} from '../app.service';
import {Pager} from '@eg/share/util/pager';
import {EgOrgService} from '@eg/core/org';
@Component({
selector: 'eg-catalog-copies',
- styleUrls: ['copies.component.css'],
templateUrl: 'copies.component.html'
})
export class CopiesComponent implements OnInit {
+++ /dev/null
-
-/* Bootstrap default is 20px */
-/*
-.pagination {margin: 0px 0px 0px 0px}
-*/
-
-
import {EgCatalogService} from '@eg/share/catalog/catalog.service';
import {CatalogSearchContext} from '@eg/share/catalog/search-context';
import {EgCatalogUrlService} from '@eg/share/catalog/catalog-url.service';
-import {StaffCatalogService} from '../staff-catalog.service';
+import {StaffCatalogService} from '../app.service';
import {Pager} from '@eg/share/util/pager';
@Component({
selector: 'eg-catalog-record-pagination',
- styleUrls: ['pagination.component.css'],
templateUrl: 'pagination.component.html'
})
export class RecordPaginationComponent implements OnInit {
import {CatalogSearchContext, CatalogSearchState}
from '@eg/share/catalog/search-context';
import {EgCatalogService} from '@eg/share/catalog/catalog.service';
-import {StaffCatalogService} from '../staff-catalog.service';
+import {StaffCatalogService} from '../app.service';
import {EgBibSummaryComponent} from '../../share/bib-summary.component';
@Component({
selector: 'eg-catalog-record',
- styleUrls: ['record.component.css'],
templateUrl: 'record.component.html'
})
export class RecordComponent implements OnInit {
import {Component, OnInit, Input} from '@angular/core';
import {EgCatalogService} from '@eg/share/catalog/catalog.service';
import {CatalogSearchContext, FacetFilter} from '@eg/share/catalog/search-context';
-import {StaffCatalogService} from '../staff-catalog.service';
+import {StaffCatalogService} from '../app.service';
export const FACET_CONFIG = {
display: [
@Component({
selector: 'eg-catalog-result-facets',
- styleUrls: ['facets.component.css'],
templateUrl: 'facets.component.html'
})
export class ResultFacetsComponent implements OnInit {
import {Component, OnInit, Input} from '@angular/core';
import {EgCatalogService} from '@eg/share/catalog/catalog.service';
import {CatalogSearchContext} from '@eg/share/catalog/search-context';
-import {StaffCatalogService} from '../staff-catalog.service';
+import {StaffCatalogService} from '../app.service';
@Component({
selector: 'eg-catalog-result-pagination',
+++ /dev/null
-
-.cat-record-row {
- margin-bottom:10px;
- padding:9px;
- /*
- background-color: #f5f5f5;
- border: 1px solid #e3e3e3;
- */
-}
-
-.weak-text-1 {
- font-size: 85%;
-}
-
-
-.with-material-icon {
- display: inline-flex;
- vertical-align: middle;
- align-items: center;
-}
-
-.card-body {
- padding: 7px;
-}
-
egDateFilter's
-->
-<div class="cat-record-row col-12 card card-body bg-light">
- <div class="row">
- <div class="col-1">
- <!-- TODO router links -->
- <a href="./cat/catalog/record/{{bibSummary.id}}">
- <img style="height:80px"
- src="/opac/extras/ac/jacket/small/r/{{bibSummary.id}}"/>
- </a>
- </div>
- <div class="col-5">
- <div class="row">
- <div class="col-12 font-weight-bold">
- <!-- nbsp allows the column to take shape when no value exists -->
- <span class="font-weight-light font-italic">
- #{{index + 1 + searchContext.pager.offset}}
- </span>
- <a href="javascript:void(0)"
- (click)="navigatToRecord(bibSummary.id)">
- {{bibSummary.title || ' '}}
- </a>
- </div>
+<div class="col-12 card tight-card mb-2 bg-light">
+ <div class="card-body">
+ <div class="row">
+ <div class="col-1">
+ <!-- TODO router links -->
+ <a href="./cat/catalog/record/{{bibSummary.id}}">
+ <img style="height:80px"
+ src="/opac/extras/ac/jacket/small/r/{{bibSummary.id}}"/>
+ </a>
</div>
- <div class="row pt-2">
- <div class="col-12">
- <!-- nbsp allows the column to take shape when no value exists -->
- <a href="javascript:void(0)"
- (click)="searchAuthor(bibSummary)">
- {{bibSummary.author || ' '}}
- </a>
+ <div class="col-5">
+ <div class="row">
+ <div class="col-12 font-weight-bold">
+ <!-- nbsp allows the column to take shape when no value exists -->
+ <span class="font-weight-light font-italic">
+ #{{index + 1 + searchContext.pager.offset}}
+ </span>
+ <a href="javascript:void(0)"
+ (click)="navigatToRecord(bibSummary.id)">
+ {{bibSummary.title || ' '}}
+ </a>
+ </div>
</div>
- </div>
- <div class="row pt-2">
- <div class="col-12">
- <span>
- <img class="pad-right-min"
- src="/images/format_icons/icon_format/{{bibSummary.ccvms.icon_format.code}}.png"/>
- <span>{{bibSummary.ccvms.icon_format.label}}</span>
- </span>
- <span style='pl-2'>{{bibSummary.edition}}</span>
- <span style='pl-2'>{{bibSummary.pubdate}}</span>
+ <div class="row pt-2">
+ <div class="col-12">
+ <!-- nbsp allows the column to take shape when no value exists -->
+ <a href="javascript:void(0)"
+ (click)="searchAuthor(bibSummary)">
+ {{bibSummary.author || ' '}}
+ </a>
+ </div>
</div>
- </div>
- </div>
- <div class="col-2">
- <div class="row" [ngClass]="{'pt-2':copyIndex > 0}"
- *ngFor="let copyCount of bibSummary.copyCounts; let copyIdx = index">
- <div class="w-100" *ngIf="copyCount.type == 'staff'">
- <div class="float-left text-left w-50">
- <span class="pr-1">
- {{copyCount.available}} / {{copyCount.count}} items
+ <div class="row pt-2">
+ <div class="col-12">
+ <span>
+ <img class="pad-right-min"
+ src="/images/format_icons/icon_format/{{bibSummary.ccvms.icon_format.code}}.png"/>
+ <span>{{bibSummary.ccvms.icon_format.label}}</span>
</span>
- </div>
- <div class="float-left w-50">
- @ {{orgName(copyCount.org_unit)}}
+ <span style='pl-2'>{{bibSummary.edition}}</span>
+ <span style='pl-2'>{{bibSummary.pubdate}}</span>
</div>
</div>
</div>
- </div>
- <div class="col-1">
- <div class="row">
- <div class="w-100">
- TCN: {{bibSummary.tcn_value}}
+ <div class="col-2">
+ <div class="row" [ngClass]="{'pt-2':copyIndex > 0}"
+ *ngFor="let copyCount of bibSummary.copyCounts; let copyIdx = index">
+ <div class="w-100" *ngIf="copyCount.type == 'staff'">
+ <div class="float-left text-left w-50">
+ <span class="pr-1">
+ {{copyCount.available}} / {{copyCount.count}} items
+ </span>
+ </div>
+ <div class="float-left w-50">
+ @ {{orgName(copyCount.org_unit)}}
+ </div>
+ </div>
</div>
</div>
- <div class="row">
- <div class="w-100">
- Holds: {{bibSummary.holdCount}}
+ <div class="col-1">
+ <div class="row">
+ <div class="w-100">
+ TCN: {{bibSummary.tcn_value}}
+ </div>
</div>
- </div>
- </div>
- <div class="col-3">
- <div class="row">
- <div class="col-12">
- <div class="float-right weak-text-1">
- Created {{bibSummary.create_date | date:'shortDate'}} by
- <!-- creator if fleshed after the initial data set is loaded -->
- <a *ngIf="bibSummary.creator.usrname" target="_self"
- href="./staff/circ/patron/{{bibSummary.creator.id()}}/checkout">
- {{bibSummary.creator.usrname()}}
- </a>
- <!-- add a spacer pending data to reduce page shuffle -->
- <span *ngIf="!bibSummary.creator.usrname"> ... </span>
+ <div class="row">
+ <div class="w-100">
+ Holds: {{bibSummary.holdCount}}
</div>
</div>
</div>
- <div class="row pt-2">
- <div class="col-12">
- <div class="float-right weak-text-1">
- Edited {{bibSummary.edit_date | date:'shortDate'}} by
- <a *ngIf="bibSummary.editor.usrname" target="_self"
- href="./staff/circ/patron/{{bibSummary.editor.id()}}/checkout">
- {{bibSummary.editor.usrname()}}
- </a>
- <span *ngIf="!bibSummary.editor.usrname"> ... </span>
+ <div class="col-3">
+ <div class="row">
+ <div class="col-12">
+ <div class="float-right small-text-1">
+ Created {{bibSummary.create_date | date:'shortDate'}} by
+ <!-- creator if fleshed after the initial data set is loaded -->
+ <a *ngIf="bibSummary.creator.usrname" target="_self"
+ href="./staff/circ/patron/{{bibSummary.creator.id()}}/checkout">
+ {{bibSummary.creator.usrname()}}
+ </a>
+ <!-- add a spacer pending data to reduce page shuffle -->
+ <span *ngIf="!bibSummary.creator.usrname"> ... </span>
+ </div>
</div>
</div>
- </div>
- <div class="row pt-2">
- <div class="col-12">
- <div class="float-right">
- <span>
- <button (click)="placeHold()"
- class="btn btn-sm btn-success with-material-icon weak-text-1">
- <span class="material-icons">check</span>
- <span i18n>Place Hold</span>
- </button>
- </span>
- <span>
- <button (click)="addToList()"
- class="btn btn-sm btn-info with-material-icon weak-text-1">
- <span class="material-icons">playlist_add_check</span>
- <span i18n>Add to List</span>
- </button>
- </span>
+ <div class="row pt-2">
+ <div class="col-12">
+ <div class="float-right small-text-1">
+ Edited {{bibSummary.edit_date | date:'shortDate'}} by
+ <a *ngIf="bibSummary.editor.usrname" target="_self"
+ href="./staff/circ/patron/{{bibSummary.editor.id()}}/checkout">
+ {{bibSummary.editor.usrname()}}
+ </a>
+ <span *ngIf="!bibSummary.editor.usrname"> ... </span>
+ </div>
</div>
</div>
- </div>
- </div><!-- col -->
- </div><!-- row -->
-</div><!-- col -->
+ <div class="row pt-2">
+ <div class="col-12">
+ <div class="float-right">
+ <span>
+ <button (click)="placeHold()"
+ class="btn btn-sm btn-success label-with-material-icon small-text-1">
+ <span class="material-icons">check</span>
+ <span i18n>Place Hold</span>
+ </button>
+ </span>
+ <span>
+ <button (click)="addToList()"
+ class="btn btn-sm btn-info label-with-material-icon small-text-1">
+ <span class="material-icons">playlist_add_check</span>
+ <span i18n>Add to List</span>
+ </button>
+ </span>
+ </div>
+ </div>
+ </div>
+ </div><!-- col -->
+ </div><!-- row -->
+ </div><!-- card-body -->
+</div><!-- card -->
import {CatalogSearchContext} from '@eg/share/catalog/search-context';
import {EgNetService} from '@eg/core/net';
import {EgCatalogUrlService} from '@eg/share/catalog/catalog-url.service';
-import {StaffCatalogService} from '../staff-catalog.service';
+import {StaffCatalogService} from '../app.service';
@Component({
selector: 'eg-catalog-result-record',
- styleUrls: ['record.component.css'],
templateUrl: 'record.component.html'
})
export class ResultRecordComponent implements OnInit {
import {CatalogSearchContext, CatalogSearchState}
from '@eg/share/catalog/search-context';
import {EgPcrudService} from '@eg/core/pcrud';
-import {StaffCatalogService} from '../staff-catalog.service';
+import {StaffCatalogService} from '../app.service';
import {EgIdlObject} from '@eg/core/idl';
@Component({
selector: 'eg-catalog-results',
- styleUrls: ['results.component.css'],
templateUrl: 'results.component.html'
})
export class ResultsComponent implements OnInit {
import {NgModule} from '@angular/core';
import {RouterModule, Routes} from '@angular/router';
-import {EgCatalogComponent} from './catalog.component';
+import {EgCatalogComponent} from './app.component';
import {ResultsComponent} from './result/results.component';
import {RecordComponent} from './record/record.component';
import {EgCatalogResolver} from './resolver.service';
import {EgCatalogService,} from '@eg/share/catalog/catalog.service';
import {CatalogSearchContext, CatalogSearchState}
from '@eg/share/catalog/search-context';
-import {StaffCatalogService} from './staff-catalog.service';
+import {StaffCatalogService} from './app.service';
@Component({
selector: 'eg-catalog-search-form',
+++ /dev/null
-import {Injectable} from '@angular/core';
-import {Router, ActivatedRoute} from '@angular/router';
-import {EgOrgService} from '@eg/core/org';
-import {EgCatalogService} from '@eg/share/catalog/catalog.service';
-import {EgCatalogUrlService} from '@eg/share/catalog/catalog-url.service';
-import {CatalogSearchContext} from '@eg/share/catalog/search-context';
-
-/**
- * Shared bits needed by the staff version of the catalog.
- */
-
-@Injectable()
-export class StaffCatalogService {
-
- searchContext: CatalogSearchContext;
- routeIndex: number = 0;
-
- constructor(
- private router: Router,
- private route: ActivatedRoute,
- private org: EgOrgService,
- private cat: EgCatalogService,
- private catUrl: EgCatalogUrlService
- ) { }
-
- createContext(): void {
- // Initialize the search context from the load-time URL params.
- // Do this here so the search form and other context data are
- // applied on every page, not just the search results page. The
- // search results pages will handle running the actual search.
- this.searchContext =
- this.catUrl.fromUrlParams(this.route.snapshot.queryParamMap);
-
- this.searchContext.org = this.org;
- this.searchContext.isStaff = true;
-
- // TODO: UI / settings
- if (!this.searchContext.pager.limit)
- this.searchContext.pager.limit = 20;
- }
-
- /**
- * Redirect to the search results page while propagating the current
- * search paramters into the URL. Let the search results component
- * execute the actual search.
- */
- search(): void {
- let params = this.catUrl.toUrlParams(this.searchContext);
-
- // Avoid redirect on empty-query searches
- if (params.query[0] == '') return;
-
- // Force a new search every time this method is called, even if
- // it's the same as the active search. Since router navigation
- // exits early when the route + params is identical, add a
- // random token to the route params to force a full navigation.
- // This also resolves a problem where only removing secondary+
- // versions of a query param fail to cause a route navigation.
- // (E.g. going from two query= params to one). Investigation
- // pending.
- params.ridx=''+this.routeIndex++;
-
- this.router.navigate(
- ['/staff/catalog/search'], {queryParams: params});
- }
-
-}
-
-
--- /dev/null
+import { CommonModule } from '@angular/common';
+import { NgModule } from '@angular/core';
+import { EgCircRoutingModule } from './routing.module';
+
+@NgModule({
+ declarations: [
+ ],
+ imports: [
+ EgCircRoutingModule
+ ],
+ providers: []
+})
+
+export class EgCircModule {
+
+}
+++ /dev/null
-import { CommonModule } from '@angular/common';
-import { NgModule } from '@angular/core';
-import { EgCircRoutingModule } from './routing.module';
-
-@NgModule({
- declarations: [
- ],
- imports: [
- EgCircRoutingModule
- ],
- providers: []
-})
-
-export class EgCircModule {
-
-}
--- /dev/null
+<h2 i18n="Barcode Search Header">Search for Patron by Barcode</h2>
+
+<span i18n>Barcode:</span><input type='text' [ngModel]='barcode'/>
+
+<br/>
+<ul>
+ <li *ngFor="let str of strList">{{str}}</li>
+</ul>
--- /dev/null
+import { Component, OnInit } from '@angular/core';
+import { ActivatedRoute } from '@angular/router';
+import { EgNetService } from '@eg/core/net';
+import { EgAuthService } from '@eg/core/auth';
+
+@Component({
+ templateUrl: 'app.component.html'
+})
+
+export class EgBcSearchComponent implements OnInit {
+
+ barcode: String = '';
+ strList: String[] = [];
+
+ constructor(
+ private route: ActivatedRoute,
+ private net: EgNetService,
+ private auth: EgAuthService
+ ) {}
+
+ ngOnInit() {
+
+ this.barcode = this.route.snapshot.paramMap.get('barcode');
+
+ if (this.barcode) {
+ // Find the user and redirect to the
+ }
+
+ this.route.data.subscribe((data: { startup : any }) => {
+ console.debug('EgBcSearch ngOnInit complete');
+ });
+
+ this.net.request(
+ 'open-ils.actor',
+ 'opensrf.system.echo',
+ 'hello', 'goodbye', 'in the middle'
+ ).subscribe(res => this.strList.push(res));
+ }
+
+ findUser(): void {
+ // find user by this.barcode;
+ }
+}
+
+
--- /dev/null
+import { CommonModule } from '@angular/common';
+import { NgModule } from '@angular/core';
+import { FormsModule } from '@angular/forms';
+import { EgBcSearchComponent } from './app.component';
+import { EgBcSearchRoutingModule } from './routing.module';
+
+@NgModule({
+ declarations: [
+ EgBcSearchComponent
+ ],
+ imports: [
+ EgBcSearchRoutingModule,
+ CommonModule,
+ FormsModule
+ ],
+})
+
+export class EgBcSearchModule {}
+
+++ /dev/null
-import { NgModule } from '@angular/core';
-import { RouterModule, Routes } from '@angular/router';
-import { EgBcSearchComponent } from './bcsearch.component';
-
-const routes: Routes = [
- { path: '',
- component: EgBcSearchComponent
- },
- { path: ':barcode',
- component: EgBcSearchComponent
- },
-];
-
-@NgModule({
- imports: [ RouterModule.forChild(routes) ],
- exports: [ RouterModule ]
-})
-
-export class EgBcSearchRoutingModule {}
+++ /dev/null
-<h2 i18n="Barcode Search Header">Search for Patron by Barcode</h2>
-
-<span i18n>Barcode:</span><input type='text' [ngModel]='barcode'/>
-
-<br/>
-<ul>
- <li *ngFor="let str of strList">{{str}}</li>
-</ul>
+++ /dev/null
-import { Component, OnInit } from '@angular/core';
-import { ActivatedRoute } from '@angular/router';
-import { EgNetService } from '@eg/core/net';
-import { EgAuthService } from '@eg/core/auth';
-
-@Component({
- templateUrl: 'bcsearch.component.html'
-})
-
-export class EgBcSearchComponent implements OnInit {
-
- barcode: String = '';
- strList: String[] = [];
-
- constructor(
- private route: ActivatedRoute,
- private net: EgNetService,
- private auth: EgAuthService
- ) {}
-
- ngOnInit() {
-
- this.barcode = this.route.snapshot.paramMap.get('barcode');
-
- if (this.barcode) {
- // Find the user and redirect to the
- }
-
- this.route.data.subscribe((data: { startup : any }) => {
- console.debug('EgBcSearch ngOnInit complete');
- });
-
- this.net.request(
- 'open-ils.actor',
- 'opensrf.system.echo',
- 'hello', 'goodbye', 'in the middle'
- ).subscribe(res => this.strList.push(res));
- }
-
- findUser(): void {
- // find user by this.barcode;
- }
-}
-
-
+++ /dev/null
-import { CommonModule } from '@angular/common';
-import { NgModule } from '@angular/core';
-import { FormsModule } from '@angular/forms';
-import { EgBcSearchComponent } from './bcsearch.component';
-import { EgBcSearchRoutingModule } from './bcsearch-routing.module';
-
-@NgModule({
- declarations: [
- EgBcSearchComponent
- ],
- imports: [
- EgBcSearchRoutingModule,
- CommonModule,
- FormsModule
- ],
-})
-
-export class EgBcSearchModule {}
-
--- /dev/null
+import { NgModule } from '@angular/core';
+import { RouterModule, Routes } from '@angular/router';
+import { EgBcSearchComponent } from './app.component';
+
+const routes: Routes = [
+ { path: '',
+ component: EgBcSearchComponent
+ },
+ { path: ':barcode',
+ component: EgBcSearchComponent
+ },
+];
+
+@NgModule({
+ imports: [ RouterModule.forChild(routes) ],
+ exports: [ RouterModule ]
+})
+
+export class EgBcSearchRoutingModule {}
path: 'patron',
children: [{
path: 'bcsearch',
- loadChildren: '@eg/staff/circ/patron/bcsearch/bcsearch.module#EgBcSearchModule'
+ loadChildren: '@eg/staff/circ/patron/bcsearch/app.module#EgBcSearchModule'
}]
}]
}];
-import { Injectable } from '@angular/core';
-import { Location } from '@angular/common';
-import { Observable, Observer } from 'rxjs/Rx';
-import { Router, Resolve, RouterStateSnapshot,
- ActivatedRouteSnapshot } from '@angular/router';
-import { EgStoreService } from '@eg/core/store';
-import { EgNetService } from '@eg/core/net';
-import { EgAuthService } from '@eg/core/auth';
+import {Injectable} from '@angular/core';
+import {Location} from '@angular/common';
+import {Observable, Observer} from 'rxjs/Rx';
+import {Router, Resolve, RouterStateSnapshot,
+ ActivatedRouteSnapshot} from '@angular/router';
+import {EgStoreService} from '@eg/core/store';
+import {EgNetService} from '@eg/core/net';
+import {EgAuthService} from '@eg/core/auth';
/**
* Apply configuration, etc. required by all staff components.
-import { NgModule } from '@angular/core';
-import { RouterModule, Routes } from '@angular/router';
-import { EgStaffResolver } from './resolver.service';
-import { EgStaffComponent } from './staff.component';
-import { EgStaffLoginComponent } from './login.component';
-import { EgStaffSplashComponent } from './splash.component';
+import {NgModule} from '@angular/core';
+import {RouterModule, Routes} from '@angular/router';
+import {EgStaffResolver} from './resolver.service';
+import {EgStaffComponent} from './app.component';
+import {EgStaffLoginComponent} from './login.component';
+import {EgStaffSplashComponent} from './splash.component';
// Not using 'canActivate' because it's called before all resolvers,
// but the resolvers parse the IDL, etc.
component: EgStaffSplashComponent
}, {
path: 'circ',
- loadChildren : '@eg/staff/circ/circ.module#EgCircModule'
+ loadChildren : '@eg/staff/circ/app.module#EgCircModule'
}, {
path: 'catalog',
- loadChildren : '@eg/staff/catalog/catalog.module#EgCatalogModule'
+ loadChildren : '@eg/staff/catalog/app.module#EgCatalogModule'
}, {
path: 'admin',
- loadChildren : '@eg/staff/admin/admin.module#EgAdminModule'
+ loadChildren : '@eg/staff/admin/app.module#EgAdminModule'
}]
}];
+++ /dev/null
-.eg-bib-summary {
-}
-.eg-bib-summary .card-body {
- padding: .25rem;
-}
-.eg-bib-summary .list-group-item {
- padding: .25rem;
-}
-<div class='eg-bib-summary card w-100' *ngIf="summary">
+<div class='eg-bib-summary card tight-card w-100' *ngIf="summary">
<div class="card-header d-flex">
<div class="font-weight-bold">
Record Summary
@Component({
selector: 'eg-bib-summary',
- styleUrls: ['bib-summary.component.css'],
templateUrl: 'bib-summary.component.html'
})
export class EgBibSummaryComponent implements OnInit {
-import { Component, OnInit } from '@angular/core';
-import { ActivatedRoute, Router } from '@angular/router';
+import {Component, OnInit} from '@angular/core';
@Component({
- styleUrls: ['splash.component.css'],
templateUrl: 'splash.component.html'
})
export class EgStaffSplashComponent implements OnInit {
- constructor(private route: ActivatedRoute) {}
ngOnInit() {
}
+++ /dev/null
-#staff-content-container {
- width: 95%;
- margin-top:56px;
- padding-right: 10px;
- padding-left: 10px;
- margin-right: auto;
- margin-left: auto;
-}
+++ /dev/null
-<!-- top navigation bar -->
-<eg-staff-nav-bar></eg-staff-nav-bar>
-
-<div id='staff-content-container'>
- <!-- page content -->
- <router-outlet></router-outlet>
-</div>
-
+++ /dev/null
-import { Component, OnInit } from '@angular/core';
-import { Router, ActivatedRoute, NavigationEnd } from '@angular/router';
-import { EgAuthService, EgAuthWsState } from '@eg/core/auth';
-import { EgNetService } from '@eg/core/net';
-
-@Component({
- templateUrl: 'staff.component.html',
- styleUrls: ['staff.component.css']
-})
-
-export class EgStaffComponent implements OnInit {
-
- readonly loginPath = '/staff/login';
- readonly wsAdminPath = '/staff/admin/workstation/workstations';
-
- constructor(
- private router: Router,
- private route: ActivatedRoute,
- private net: EgNetService,
- private auth: EgAuthService
- ) {}
-
- ngOnInit() {
-
- console.debug('EgStaffComponent:ngOnInit()');
-
- // Fires on all in-app router navigation, but not initial page load.
- this.router.events.subscribe(routeEvent => {
- if (routeEvent instanceof NavigationEnd) {
- //console.debug(`EgStaffComponent routing to ${routeEvent.url}`);
- this.basicAuthChecks(routeEvent);
- }
- });
-
- // Redirect to the login page on any auth timeout events.
- this.net.authExpired$.subscribe(uhOh => {
- console.debug('Auth session has expired. Redirecting to login');
- this.auth.redirectUrl = this.router.url;
- this.router.navigate(['/staff/login']);
- });
-
- this.route.data.subscribe((data: {staffResolver : any}) => {
- console.debug('EgStaff ngOnInit complete');
-
- });
- }
-
- /**
- * Verifying auth token on every route is overkill, since an expired
- * token will make itself known with the first API call, but we do
- * want to prevent navigation from the login or workstation admin
- * page, since these can be accessed without a valid authtoken or
- * workstation, respectively, once the initial route resolvers
- * have done their jobs.
- */
- basicAuthChecks(routeEvent: NavigationEnd): void {
-
- // Access to login page is always granted
- if (routeEvent.url == this.loginPath) return;
-
- if (!this.auth.token())
- this.router.navigate([this.loginPath]);
-
- // Access to workstation admin page is granted regardless
- // of workstation validity.
- if (routeEvent.url == this.wsAdminPath) return;
-
- if (this.auth.workstationState != EgAuthWsState.VALID)
- this.router.navigate([this.wsAdminPath]);
- }
-}
-
-
+++ /dev/null
-import {CommonModule} from '@angular/common';
-import {NgModule} from '@angular/core';
-import {FormsModule} from '@angular/forms';
-import {NgbModule} from '@ng-bootstrap/ng-bootstrap';
-import {EgBaseModule} from '@eg/base.module';
-
-import {EgStaffComponent} from './staff.component';
-import {EgStaffRoutingModule} from './routing.module';
-import {EgStaffNavComponent} from './nav.component';
-import {EgStaffLoginComponent} from './login.component';
-import {EgStaffSplashComponent} from './splash.component';
-import {EgOrgSelectComponent} from '@eg/share/org-select.component';
-
-@NgModule({
- declarations: [
- EgStaffComponent,
- EgStaffNavComponent,
- EgStaffSplashComponent,
- EgStaffLoginComponent,
- EgOrgSelectComponent
- ],
- imports: [
- EgStaffRoutingModule,
- FormsModule,
- NgbModule
- ],
- exports: [
- // Components available to all staff modules
- EgOrgSelectComponent,
- FormsModule,
- NgbModule
- ]
-})
-
-export class EgStaffModule {
-
-}
import { enableProdMode } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
-import { EgBaseModule } from './app/base.module';
+import { EgBaseModule } from './app/app.module';
import { environment } from './environments/environment';
if (environment.production) {
h4 {font-size: 1.05rem}
h5 {font-size: .95rem}
+.small-text-1 {font-size: 85%}
+
/** Ang5 routes on clicks to href's with no values, so we can't have
* bare href's to force anchor styling. Use this for anchors w/ no href.
padding-left: .25rem;
padding-right: .25rem; /* default .5rem */
}
+
+/* allow spans/labels to vertically orient with material icons */
+.label-with-material-icon {
+ display: inline-flex;
+ vertical-align: middle;
+ align-items: center;
+}
+
+/* Default .card padding is extreme */
+.tight-card .card-body,
+.tight-card .list-group-item {
+ padding: .25rem;
+}
+