ccvmMap: {[ccvm:string] : EgIdlObject[]} = {};
cmfMap: {[cmf:string] : EgIdlObject} = {};
+ // Keep a reference to the most recently retrieved facet data,
+ // since facet data is consistent across a given search.
+ // No need to re-fetch with every page of search data.
+ lastFacetData: any;
+ lastFacetKey: string;
+
constructor(
private net: EgNetService,
private org: EgOrgService,
ctx.searchState = CatalogSearchState.COMPLETE;
let promises = [];
- result.ids.forEach(blob => {
+ result.ids.forEach((blob, idx) => {
promises.push(
this.getBibSummary(blob[0],
ctx.searchOrg.id(),
ctx.org.root().ou_type().depth() :
ctx.searchOrg.ou_type().depth()
).then(
- summary => ctx.result.records.push(summary)
+ // idx maintains result sort order
+ summary => ctx.result.records[idx] = summary
)
);
});
fetchFacets(ctx: CatalogSearchContext): Promise<void> {
- if (!ctx.result) return Promise.resolve();
+ if (!ctx.result)
+ return Promise.reject('Cannot fetch facets without results');
+
+ if (this.lastFacetKey == ctx.result.facet_key) {
+ ctx.result.facetData = this.lastFacetData;
+ return Promise.resolve();
+ }
return new Promise((resolve, reject) => {
this.net.request('open-ils.search',
};
});
- ctx.result.facetData = facetData;
+ this.lastFacetKey = ctx.result.facet_key;
+ this.lastFacetData = ctx.result.facetData = facetData;
resolve();
});
})
while(node = result.iterateNext()) {
response.ccvms[node.getAttribute('name')] = {
- code : node.getAttribute('value'),
+ code : node.textContent,
label : node.getAttribute('coded-value')
}
}
import {ResultFacetsComponent} from './result/facets.component';
import {ResultRecordComponent} from './result/record.component';
import {StaffCatalogService} from './staff-catalog.service';
+import {StaffRecordService} from './record/record.service';
@NgModule({
declarations: [
EgUnapiService,
EgCatalogService,
EgCatalogUrlService,
- StaffCatalogService
+ StaffCatalogService,
+ StaffRecordService
]
})
<div id="staff-catalog-record-container">
- RECORD {{recordId}}
- <div class="d-flex flex-row">
- <div class="flex-2 p-2 border">SMALL</div>
- <div class="flex-1 p-2 border">MED</div>
- <div class="flex-3 p-2 border">asdf</div>
- <div class="flex-cell p-2 border">asdfsada</div>
+ <!-- TODO MOVE RECORD SUMMARY TO SHARE MODULE -->
+ <style>
+ .eg-bib-record-summary {
+ }
+ .eg-bib-record-summary .card-body {
+ padding: .25rem;
+ }
+ .eg-bib-record-summary .list-group-item {
+ padding: .25rem;
+ }
+ </style>
+ <div class='eg-bib-record-summary card w-100' *ngIf="staffRecord.bibSummary">
+ <div class="card-header font-weight-bold" i18n>
+ Record Summary
+ <!-- TODO expandy at right-->
+ </div>
+ <div class="card-body">
+ <ul class="list-group list-group-flush">
+ <li class="list-group-item">
+ <div class="d-flex">
+ <div class="flex-1 font-weight-bold" i18n>Title</div>
+ <div class="flex-3">{{staffRecord.bibSummary.title}}</div>
+ <div class="flex-1 font-weight-bold pl-1" i18n>Edition</div>
+ <div class="flex-2">{{staffRecord.bibSummary.edition}}</div>
+ <div class="flex-1 font-weight-bold" i18n>TCN</div>
+ <div class="flex-1">{{staffRecord.bibSummary.tcn_value}}</div>
+ <div class="flex-1 font-weight-bold pl-1" i18n>Created By</div>
+ <div class="flex-2" *ngIf="staffRecord.bibSummary.creator.usrname">
+ {{staffRecord.bibSummary.creator.usrname()}}
+ </div>
+ </div>
+ </li>
+ <li class="list-group-item">
+ <div class="d-flex">
+ <div class="flex-1 font-weight-bold" i18n>Author</div>
+ <div class="flex-3">{{staffRecord.bibSummary.author}}</div>
+ <div class="flex-1 font-weight-bold pl-1" i18n>Pubdate</div>
+ <div class="flex-2">{{staffRecord.bibSummary.pubdate}}</div>
+ <div class="flex-1 font-weight-bold" i18n>Database ID</div>
+ <div class="flex-1">{{staffRecord.bibSummary.id}}</div>
+ <div class="flex-1 font-weight-bold pl-1" i18n>Last Edited By</div>
+ <div class="flex-2" *ngIf="staffRecord.bibSummary.editor.usrname">
+ {{staffRecord.bibSummary.editor.usrname()}}
+ </div>
+ </div>
+ </li>
+ </ul>
+ </div>
</div>
+
</div>
import {CatalogSearchContext, CatalogSearchState}
from '@eg/share/catalog/search-context';
import {StaffCatalogService} from '../staff-catalog.service';
+import {StaffRecordService} from './record.service';
@Component({
selector: 'eg-catalog-record',
recordId: number;
searchContext: CatalogSearchContext;
- // Cache record creator/editor since this will likely be a
- // reasonably small set of data w/ lots of repitition.
- userCache: {[id:number] : EgIdlObject} = {};
-
constructor(
private route: ActivatedRoute,
private pcrud: EgPcrudService,
- private staffCat: StaffCatalogService
+ private staffCat: StaffCatalogService,
+ private staffRecord: StaffRecordService
) {}
ngOnInit() {
- this.recordId = +this.route.snapshot.paramMap.get('id');
+ this.searchContext = this.staffCat.searchContext;
+ this.staffRecord.setRecord(+this.route.snapshot.paramMap.get('id'));
}
}
align-items: center;
}
+.card-body {
+ padding: 7px;
+}
+
<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:;' routerLink="/staff/catalog/record/{{bibSummary.id}}">
{{bibSummary.title || ' '}}
</a>
</div>
<div class="row pt-2">
<div class="col-12">
+ <!--
<span>#{{index + 1 + searchContext.pager.offset}}</span>
+ -->
<span>
- <img class="pad-right-min" ng-cloak
+ <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>
</div>
- <div class="col-1"></div>
- <div class="col-3">
+ <div class="col-1">
<div class="row">
- <div class="col-4">
- <div class="float-right weak-text-1">
- TCN: {{bibSummary.tcn_value}}
- </div>
+ <div class="w-100">
+ TCN: {{bibSummary.tcn_value}}
</div>
- <div class="col-8">
+ </div>
+ <div class="row">
+ <div class="w-100">
+ Holds: {{bibSummary.holdCount}}
+ </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 -->
</div>
</div>
<div class="row pt-2">
- <div class="col-4">
- <div class="float-right weak-text-1">
- Holds: {{bibSummary.holdCount}}
- </div>
- </div>
- <div class="col-8">
+ <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"
-<div id="staff-catalog-results-container" class="mt-3" *ngIf="searchIsDone()">
+<div id="staff-catalog-results-container" *ngIf="searchIsDone()">
<div class="row">
<div class="col-2"><!--match pagination margin-->
<h3 i18n>Search Results ({{searchContext.result.count}})</h3>
<div class="col-10">
<div *ngIf="searchContext.result">
<div *ngFor="let bibSummary of searchContext.result.records; let idx = index">
- <eg-catalog-result-record [bibSummary]="bibSummary" [index]="idx">
- </eg-catalog-result-record>
+ <div *ngIf="bibSummary">
+ <eg-catalog-result-record [bibSummary]="bibSummary" [index]="idx">
+ </eg-catalog-result-record>
+ </div>
</div>
</div>
</div>
export class ResultsComponent implements OnInit {
searchContext: CatalogSearchContext;
- facetCache: any;
- facetKey: string;
// Cache record creator/editor since this will likely be a
// reasonably small set of data w/ lots of repitition.
if (!this.searchContext.query[0]) return;
this.cat.search(this.searchContext).then(ok => {
- // Only need to fetch facets once per search
- // TODO: move last-facet cache to this.cat.fetchFacets;
- if (this.facetKey == this.searchContext.result.facet_key) {
- this.searchContext.result.facetData = this.facetCache;
- } else {
- this.cat.fetchFacets(this.searchContext).then(ok => {;
- this.facetKey = this.searchContext.result.facet_key;
- this.facetCache = this.searchContext.result.facetData;
- });
- }
+ this.cat.fetchFacets(this.searchContext);
this.fleshSearchResults();
});
}
.checkbox label {
margin-bottom: .1rem;
}
+
+#staffcat-search-form {
+ border-bottom: 2px dashed rgba(0,0,0,.225);
+}
<!--
TODO focus search input
-->
-<div id='staffcat-search-form' class='mb-3'>
+<div id='staffcat-search-form' class='pb-2 mb-3'>
<div class="row"
*ngFor="let q of searchContext.query; let idx = index; trackBy:trackByIdx">
<div class="col-9 d-flex flex-row">