diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 90a5a028..3f3af45a 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -35,6 +35,12 @@ const routes: Routes = [ canActivate: [AuthGuard.forPermissions("read")] }, + {path: "genre/:slug", component: ItemsGridComponent, pathMatch: "full", + resolve: {items: PageResolver.forResource("shows", ["genres", "studio"], "genres=ctn::slug")}, + canLoad: [AuthGuard.forPermissions("read")], + canActivate: [AuthGuard.forPermissions("read")] + }, + {path: "show/:slug", component: ShowDetailsComponent, resolve: {show: ItemResolver.forResource("shows/:slug")}, canLoad: [AuthGuard.forPermissions("read")], diff --git a/src/app/components/items-grid/items-grid.component.ts b/src/app/components/items-grid/items-grid.component.ts index c7dfaa72..0f5f8eaf 100644 --- a/src/app/components/items-grid/items-grid.component.ts +++ b/src/app/components/items-grid/items-grid.component.ts @@ -58,10 +58,12 @@ export class ItemsGridComponent implements OnInit }); } - static routeMapper(route: ActivatedRouteSnapshot, endpoint: string): string + static routeMapper(route: ActivatedRouteSnapshot, endpoint: string, query: [string, string][]): string { const filter: string[] = ["genres", "studio"]; let queryParams: [string, string][] = Object.entries(route.queryParams).filter(x => filter.includes(x[0])); + if (query) + queryParams.push(...query) if (queryParams.length > 0) endpoint = "shows"; diff --git a/src/app/services/page-resolver.service.ts b/src/app/services/page-resolver.service.ts index 5720ac9c..c91e5148 100644 --- a/src/app/services/page-resolver.service.ts +++ b/src/app/services/page-resolver.service.ts @@ -7,14 +7,16 @@ import {catchError, map} from 'rxjs/operators'; import {Page} from "../../models/page"; import {IResource} from "../../models/resources/resource"; -type RouteMapper = (route: ActivatedRouteSnapshot, endpoint: string) => string; +type RouteMapper = (route: ActivatedRouteSnapshot, endpoint: string, queryParams: [string, string][]) => string; @Injectable() export class PageResolver { public static resolvers: any[] = []; - static forResource(resource: string, copyParams: boolean | string[] | RouteMapper = false) + static forResource(resource: string, + copyParams: boolean | string[] | RouteMapper = false, + defaultQuery: string = null) { @Injectable() class Resolver implements Resolve> @@ -25,17 +27,23 @@ export class PageResolver resolve(route: ActivatedRouteSnapshot): Page | Observable> | Promise> { - let res: string = resource.replace(/:(.*?)(\/|$)/, (x, y) => `${route.paramMap.get(y)}/`); + let res: string = resource.replace(/:([^:]*?)(\/|$|&)/, (x, y, z) => `${route.paramMap.get(y)}${z}`); + let query: [string, string][] = defaultQuery + ?.replace(/:([^:]*?)(\/|$|&)/, (x, y, z) => `${route.paramMap.get(y)}${z}`) + .split('&') + .map(x => x.split('=') as [string, string]); let uri: string; if (typeof copyParams == "function") - uri = copyParams(route, res); + uri = copyParams(route, res, query); else { - let queryParams: [string, string][] = copyParams == true + let entries: [string, string][] = copyParams == true ? Object.entries(route.queryParams) : Object.entries(route.queryParams).filter(x => copyParams && copyParams.includes(x[0])); - let params: string = queryParams.length > 0 - ? '?' + queryParams.map(x => `${x[0]}=${x[1]}`).join('&') + if (query) + entries.push(...query); + let params: string = entries.length > 0 + ? '?' + entries.map(x => `${x[0]}=${x[1]}`).join('&') : ""; uri = `api/${res}${params}`; }