46 lines
1.5 KiB
JavaScript
46 lines
1.5 KiB
JavaScript
import { getOwner } from '@ember/application';
|
|
import Service, { inject as service } from '@ember/service';
|
|
import { computed } from '@ember/object';
|
|
import classic from 'ember-classic-decorator';
|
|
|
|
@classic
|
|
export default class BreadcrumbsService extends Service {
|
|
@service router;
|
|
|
|
// currentURL is only used to listen to all transitions.
|
|
// currentRouteName has all information necessary to compute breadcrumbs,
|
|
// but it doesn't change when a transition to the same route with a different
|
|
// model occurs.
|
|
@computed('router.{currentURL,currentRouteName}')
|
|
get breadcrumbs() {
|
|
const owner = getOwner(this);
|
|
const allRoutes = (this.get('router.currentRouteName') || '')
|
|
.split('.')
|
|
.without('')
|
|
.map((segment, index, allSegments) => allSegments.slice(0, index + 1).join('.'));
|
|
|
|
let crumbs = [];
|
|
allRoutes.forEach(routeName => {
|
|
const route = owner.lookup(`route:${routeName}`);
|
|
|
|
// Routes can reset the breadcrumb trail to start anew even
|
|
// if the route is deeply nested.
|
|
if (route.resetBreadcrumbs) {
|
|
crumbs = [];
|
|
}
|
|
|
|
// Breadcrumbs are either an array of static crumbs
|
|
// or a function that returns breadcrumbs given the current
|
|
// model for the route's controller.
|
|
let breadcrumbs = route.breadcrumbs || [];
|
|
if (typeof breadcrumbs === 'function') {
|
|
breadcrumbs = breadcrumbs(route.get('controller.model')) || [];
|
|
}
|
|
|
|
crumbs.push(...breadcrumbs);
|
|
});
|
|
|
|
return crumbs;
|
|
}
|
|
}
|