Add ability to fetch menu items for a virtual root
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone Build is passing

This commit is contained in:
Garrett Mills 2020-11-23 10:57:45 -06:00
parent 5eb68b9338
commit 37468489fb
Signed by: garrettmills
GPG Key ID: D2BF5FBA8298F246
3 changed files with 34 additions and 4 deletions

View File

@ -19,9 +19,12 @@
<ion-button fill="outline" color="light" (click)="onDeleteClick()" [disabled]="!deleteTarget"> <ion-button fill="outline" color="light" (click)="onDeleteClick()" [disabled]="!deleteTarget">
<ion-icon color="danger" name="trash"></ion-icon> <ion-icon color="danger" name="trash"></ion-icon>
</ion-button> </ion-button>
<ion-button fill="outline" color="light" (click)="onNodeMenuClick($event)" [disabled]="!menuTarget"> <ion-button fill="outline" color="light" (click)="onNodeMenuClick($event)" [disabled]="!menuTarget || !menuTarget.data || !menuTarget.data.id">
<i class="fa fa-ellipsis-v" style="color: darkgrey"></i> <i class="fa fa-ellipsis-v" style="color: darkgrey"></i>
</ion-button> </ion-button>
<ion-button fill="outline" color="light" (click)="onVirtualRootClear($event)" *ngIf="virtualRootPageId" title="Show entire tree">
<i class="fa fa-search-minus" style="color: darkgrey"></i>
</ion-button>
</ion-buttons> </ion-buttons>
</ion-list-header> </ion-list-header>
</ion-list> </ion-list>

View File

@ -40,9 +40,11 @@ export class AppComponent implements OnInit {
public lastClickEvent: Array<any> = []; public lastClickEvent: Array<any> = [];
public nodes = []; public nodes = [];
public currentPageId: string; public currentPageId: string;
public virtualRootPageId?: string;
public options = { public options = {
isExpandedField: 'expanded', isExpandedField: 'expanded',
animateExpand: true, animateExpand: true,
scrollOnActivate: false,
actionMapping: { actionMapping: {
mouse: { mouse: {
dblClick: (tree, node, $event) => { dblClick: (tree, node, $event) => {
@ -208,6 +210,7 @@ export class AppComponent implements OnInit {
} }
const options = [ const options = [
{name: 'Make Virtual Root', icon: 'fa fa-search-plus', value: 'virtual_root'},
{name: 'Export to HTML', icon: 'fa fa-file-export', value: 'export_html'}, {name: 'Export to HTML', icon: 'fa fa-file-export', value: 'export_html'},
]; ];
@ -245,12 +248,27 @@ export class AppComponent implements OnInit {
}); });
} else if ( result.data === 'export_html' ) { } else if ( result.data === 'export_html' ) {
this.exportTargetAsHTML(); this.exportTargetAsHTML();
} else if ( result.data === 'virtual_root' ) {
this.setVirtualRoot();
} }
}); });
await popover.present(); await popover.present();
} }
async setVirtualRoot() {
if ( this.menuTarget && this.menuTarget.data?.type === 'page' ) {
debug('virtual root menu target', this.menuTarget);
this.virtualRootPageId = this.menuTarget.data.id;
this.reloadMenuItems().subscribe();
}
}
onVirtualRootClear(event) {
delete this.virtualRootPageId;
this.reloadMenuItems().subscribe();
}
async exportTargetAsHTML() { async exportTargetAsHTML() {
const exportRecord: any = await new Promise((res, rej) => { const exportRecord: any = await new Promise((res, rej) => {
const reqData = { const reqData = {
@ -440,7 +458,7 @@ export class AppComponent implements OnInit {
reloadMenuItems() { reloadMenuItems() {
return new Observable(sub => { return new Observable(sub => {
this.api.getMenuItems().then(nodes => { this.api.getMenuItems(false, this.virtualRootPageId).then(nodes => {
this.nodes = nodes; this.nodes = nodes;
sub.next(); sub.next();
sub.complete(); sub.complete();

View File

@ -530,7 +530,7 @@ export class ApiService {
}); });
} }
public getMenuItems(pageOnly: boolean = false): Promise<any[]> { public getMenuItems(pageOnly: boolean = false, virtualRootPageId?: string): Promise<any[]> {
return new Promise(async (res, rej) => { return new Promise(async (res, rej) => {
await this.db.createSchemata(); await this.db.createSchemata();
@ -541,9 +541,18 @@ export class ApiService {
return res(nodes); return res(nodes);
} }
let loadUrl = '/menu/items';
if ( virtualRootPageId ) {
loadUrl += `?virtualRootPageId=${virtualRootPageId}`;
}
if ( pageOnly ) {
loadUrl += (virtualRootPageId ? '&' : '?') + 'type=page';
}
// Download the latest menu items // Download the latest menu items
const tree: any[] = await new Promise(res2 => { const tree: any[] = await new Promise(res2 => {
this.get(pageOnly ? '/menu/items?type=page' : '/menu/items').subscribe({ this.get(loadUrl).subscribe({
next: async result => { next: async result => {
const nodes = result.data as any[]; const nodes = result.data as any[];
const items = MenuItem.deflateTree(nodes); const items = MenuItem.deflateTree(nodes);