43 lines
1.4 KiB
JavaScript
43 lines
1.4 KiB
JavaScript
import { getOwner } from '@ember/application';
|
|
import Service, { inject as service } from '@ember/service';
|
|
import { computed } from '@ember/object';
|
|
|
|
export default Service.extend({
|
|
router: service(),
|
|
|
|
// 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.
|
|
breadcrumbs: computed('router.currentURL', 'router.currentRouteName', function() {
|
|
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.get('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.get('breadcrumbs') || [];
|
|
if (typeof breadcrumbs === 'function') {
|
|
breadcrumbs = breadcrumbs(route.get('controller.model')) || [];
|
|
}
|
|
|
|
crumbs.push(...breadcrumbs);
|
|
});
|
|
|
|
return crumbs;
|
|
}),
|
|
});
|