From: Bill Erickson Date: Thu, 4 Jun 2020 16:36:09 +0000 (-0400) Subject: LPXXX Angular Volcopy X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=eb5e266b7d4be430add66aeb742cb4faeea6c4cc;p=working%2FEvergreen.git LPXXX Angular Volcopy Signed-off-by: Bill Erickson --- diff --git a/Open-ILS/src/eg2/src/app/staff/cat/routing.module.ts b/Open-ILS/src/eg2/src/app/staff/cat/routing.module.ts index 67fb59b56c..c0ab1b2b3c 100644 --- a/Open-ILS/src/eg2/src/app/staff/cat/routing.module.ts +++ b/Open-ILS/src/eg2/src/app/staff/cat/routing.module.ts @@ -7,6 +7,9 @@ const routes: Routes = [ }, { path: 'authority', loadChildren: '@eg/staff/cat/authority/authority.module#AuthorityModule' + }, { + path: 'volcopy', + loadChildren: '@eg/staff/cat/volcopy/volcopy.module#VolCopyModule' } ]; diff --git a/Open-ILS/src/eg2/src/app/staff/cat/volcopy/routing.module.ts b/Open-ILS/src/eg2/src/app/staff/cat/volcopy/routing.module.ts new file mode 100644 index 0000000000..edaf0d75ab --- /dev/null +++ b/Open-ILS/src/eg2/src/app/staff/cat/volcopy/routing.module.ts @@ -0,0 +1,28 @@ +import {NgModule} from '@angular/core'; +import {RouterModule, Routes} from '@angular/router'; +import {VolCopyComponent} from './volcopy.component'; + +const routes: Routes = [{ + path: 'edit/item/:item_id', + component: VolCopyComponent + }, { + path: 'edit/session/:session', + component: VolCopyComponent + /* + }, { + path: 'templates' + component: VolCopyComponent + }, { + path: 'configure' + component: VolCopyComponent + */ +}]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], + providers: [] +}) + +export class VolCopyRoutingModule {} + diff --git a/Open-ILS/src/eg2/src/app/staff/cat/volcopy/volcopy.component.html b/Open-ILS/src/eg2/src/app/staff/cat/volcopy/volcopy.component.html new file mode 100644 index 0000000000..0945cf3379 --- /dev/null +++ b/Open-ILS/src/eg2/src/app/staff/cat/volcopy/volcopy.component.html @@ -0,0 +1,2 @@ + +VOLCOPY diff --git a/Open-ILS/src/eg2/src/app/staff/cat/volcopy/volcopy.component.ts b/Open-ILS/src/eg2/src/app/staff/cat/volcopy/volcopy.component.ts new file mode 100644 index 0000000000..36c2b67477 --- /dev/null +++ b/Open-ILS/src/eg2/src/app/staff/cat/volcopy/volcopy.component.ts @@ -0,0 +1,73 @@ +import {Component, OnInit, AfterViewInit, ViewChild, Renderer2} from '@angular/core'; +import {Router, ActivatedRoute, ParamMap} from '@angular/router'; +import {IdlObject} from '@eg/core/idl.service'; +import {OrgService} from '@eg/core/org.service'; +import {PcrudService} from '@eg/core/pcrud.service'; +import {VolCopyContext} from './volcopy'; + +const ITEM_FLESH = { + flesh: 1, + flesh_fields: { + acp: ['call_number', 'location'] + } +} + +@Component({ + templateUrl: 'volcopy.component.html' +}) +export class VolCopyComponent implements OnInit { + + context: VolCopyContext; + itemId: number; + session: string; + loading = false; + + constructor( + private router: Router, + private route: ActivatedRoute, + private renderer: Renderer2, + private org: OrgService, + private pcrud: PcrudService + ) { } + + ngOnInit() { + this.context = new VolCopyContext(); + this.context.org = this.org; // inject; + + this.route.paramMap.subscribe( + (params: ParamMap) => this.negotiateRoute(params)); + } + + negotiateRoute(params: ParamMap) { + const itemId = +params.get('item_id'); + if (itemId) { + if (itemId !== this.itemId) { + this.itemId = itemId; + this.load(); + } + } else { + this.itemId = null; + } + } + + load() { + this.loading = true; + this.context.reset(); + this.fetchHoldings() + .then(_ => this.loading = false); + } + + fetchHoldings(): Promise { + if (this.itemId) { + return this.fetchItem(); + } + } + + fetchItem(): Promise { + return this.pcrud.retrieve('acp', this.itemId, ITEM_FLESH) + .toPromise().then(item => { + this.context.findOrCreateItemNode(item); + }); + } +} + diff --git a/Open-ILS/src/eg2/src/app/staff/cat/volcopy/volcopy.module.ts b/Open-ILS/src/eg2/src/app/staff/cat/volcopy/volcopy.module.ts new file mode 100644 index 0000000000..3e31b8ad40 --- /dev/null +++ b/Open-ILS/src/eg2/src/app/staff/cat/volcopy/volcopy.module.ts @@ -0,0 +1,23 @@ +import {NgModule} from '@angular/core'; +import {StaffCommonModule} from '@eg/staff/common.module'; +import {CommonWidgetsModule} from '@eg/share/common-widgets.module'; +import {HoldingsModule} from '@eg/staff/share/holdings/holdings.module'; +import {VolCopyRoutingModule} from './routing.module'; +import {VolCopyComponent} from './volcopy.component'; + +@NgModule({ + declarations: [ + VolCopyComponent + ], + imports: [ + StaffCommonModule, + CommonWidgetsModule, + HoldingsModule, + VolCopyRoutingModule + ], + providers: [ + ] +}) + +export class VolCopyModule { +} diff --git a/Open-ILS/src/eg2/src/app/staff/cat/volcopy/volcopy.ts b/Open-ILS/src/eg2/src/app/staff/cat/volcopy/volcopy.ts new file mode 100644 index 0000000000..5824d1da42 --- /dev/null +++ b/Open-ILS/src/eg2/src/app/staff/cat/volcopy/volcopy.ts @@ -0,0 +1,114 @@ +import {IdlObject} from '@eg/core/idl.service'; +import {OrgService} from '@eg/core/org.service'; + +class HoldingsTreeNode { + children: HoldingsTreeNode[]; + nodeType: 'org' | 'callNum' | 'item'; + target: any; + parentNode: HoldingsTreeNode; + constructor() { + this.children = []; + } +} + +class HoldingsTree { + root: HoldingsTreeNode; + constructor() { + this.root = new HoldingsTreeNode(); + } +} + +export class VolCopyContext { + + autoId = -1; + holdings: HoldingsTree = new HoldingsTree(); + org: OrgService; // injected + + reset() { + this.holdings = new HoldingsTree(); + } + + orgNodes(): HoldingsTreeNode[] { + return this.holdings.root.children; + } + + // Adds an org unit node; unsorted. + findOrCreateOrgNode(orgId: number): HoldingsTreeNode { + + const existing: HoldingsTreeNode = + this.orgNodes().filter(n => n.target.id() === orgId)[0]; + + if (existing) { return existing; } + + const node: HoldingsTreeNode = new HoldingsTreeNode(); + node.nodeType = 'org'; + node.target = this.org.get(orgId); + node.parentNode = this.holdings.root; + + this.orgNodes().push(node); + + return node; + } + + findOrCreateCallNumNode(callNum: IdlObject): HoldingsTreeNode { + const orgId = callNum.owning_lib(); + const orgNode = this.findOrCreateOrgNode(orgId); + + const existing = orgNode.children.filter( + n => n.target.id() === callNum.id())[0]; + + if (existing) { return existing; } + + const node: HoldingsTreeNode = new HoldingsTreeNode(); + node.nodeType = 'callNum'; + node.target = callNum; + node.parentNode = orgNode; + + orgNode.children.push(node); + + return node; + } + + + findOrCreateItemNode(item: IdlObject): HoldingsTreeNode { + + const callNumNode = this.findOrCreateCallNumNode(item.call_number()); + + const existing = callNumNode.children.filter( + c => c.target.id() === item.id())[0]; + + if (existing) { return existing; } + + const node: HoldingsTreeNode = new HoldingsTreeNode(); + node.nodeType = 'item'; + node.target = item. + node.parentNode = callNumNode; + + callNumNode.children.push(node); + + return node; + } + + + sortHoldings() { + + this.orgNodes().forEach(orgNode => { + orgNode.children.forEach(callNumNode => { + + // Sort items by barcode code + callNumNode.children = callNumNode.children.sort((c1, c2) => + c1.target.barcode() < c2.target.barcode() ? -1 : 1); + + }); + + // Sort call numbers by label + orgNode.children = orgNode.children.sort((c1, c2) => + c1.target.label() < c2.target.label() ? -1 : 1); + }); + + + // sort org units by shortname + this.holdings.root.children = this.orgNodes().sort((o1, o2) => + o1.target.shortname() < o2.target.shortname() ? -1 : 1); + } +}