@@ -3,7 +3,7 @@ import { Router, RouterModule, NavigationEnd } from '@angular/router';
33import { filter } from 'rxjs/operators' ;
44import { BreadcrumbModule } from 'primeng/breadcrumb' ;
55import type { MenuItem } from 'primeng/api' ;
6- import { SecurityStore } from '../../core/security/security-store .service' ;
6+ import { BreadcrumbLabelsService } from './breadcrumb-labels .service' ;
77
88@Component ( {
99 selector : 'app-breadcrumb' ,
@@ -13,7 +13,7 @@ import { SecurityStore } from '../../core/security/security-store.service';
1313} )
1414export class BreadcrumbComponent {
1515 private router = inject ( Router ) ;
16- private securityStore = inject ( SecurityStore ) ;
16+ private breadcrumbLabels = inject ( BreadcrumbLabelsService ) ;
1717
1818 private url = signal ( this . router . url ) ;
1919
@@ -27,15 +27,49 @@ export class BreadcrumbComponent {
2727
2828 showBreadcrumb = computed ( ( ) => {
2929 const u = this . url ( ) ;
30- return u . startsWith ( '/proposals' ) || u . startsWith ( '/feedbacks' ) ;
30+ return u . startsWith ( '/proposals' ) || u . startsWith ( '/feedbacks' ) || u . startsWith ( '/admin' ) ;
3131 } ) ;
3232
3333 private buildItems ( url : string ) : MenuItem [ ] {
3434 if ( url . startsWith ( '/proposals' ) ) return this . buildProposalItems ( url ) ;
3535 if ( url . startsWith ( '/feedbacks' ) ) return this . buildFeedbackItems ( url ) ;
36+ if ( url . startsWith ( '/admin' ) ) return this . buildAdminItems ( url ) ;
3637 return [ ] ;
3738 }
3839
40+ private buildAdminItems ( url : string ) : MenuItem [ ] {
41+ const segments = url . split ( '/' ) . filter ( Boolean ) ; // ['admin', 'degree-programs', ...]
42+ const items : MenuItem [ ] = [ ] ;
43+
44+ if ( segments . length < 2 ) return items ;
45+
46+ if ( segments [ 1 ] === 'users' ) {
47+ items . push ( { label : 'Users' , routerLink : [ '/admin/users' ] } ) ;
48+ return items ;
49+ }
50+
51+ if ( segments [ 1 ] === 'degree-programs' ) {
52+ items . push ( { label : 'Degree Programs' , routerLink : [ '/admin/degree-programs' ] } ) ;
53+ if ( segments . length <= 2 ) return items ;
54+
55+ if ( segments [ 2 ] === 'specializations' ) {
56+ items . push ( { label : 'All areas of specializations' , routerLink : [ '/admin/degree-programs/specializations' ] } ) ;
57+ return items ;
58+ }
59+
60+ // degree-programs/:id (program details page) – label from details page when it loads the program
61+ const programId = segments [ 2 ] ;
62+ const name = ( this . breadcrumbLabels . degreeProgramName ( ) ?? '' ) . trim ( ) || `Program ${ programId } ` ;
63+ items . push ( {
64+ label : name ,
65+ routerLink : [ '/admin/degree-programs' , programId ]
66+ } ) ;
67+ return items ;
68+ }
69+
70+ return items ;
71+ }
72+
3973 private buildProposalItems ( url : string ) : MenuItem [ ] {
4074 const segments = url . split ( '/' ) . filter ( Boolean ) ; // ['proposals', ...]
4175 const items : MenuItem [ ] = [ ] ;
@@ -53,17 +87,19 @@ export class BreadcrumbComponent {
5387
5488 if ( segments [ 1 ] === 'view' && segments [ 2 ] ) {
5589 const proposalId = segments [ 2 ] ;
90+ const proposalLabel = ( this . breadcrumbLabels . proposalTitle ( ) ?? '' ) . trim ( ) || `Proposal ${ proposalId } ` ;
5691 items . push ( {
57- label : 'Proposal ' + proposalId ,
92+ label : proposalLabel ,
5893 routerLink : [ '/proposals/view' , proposalId ]
5994 } ) ;
6095
6196 if ( segments . length <= 3 ) return items ;
6297
6398 if ( segments [ 3 ] === 'version' && segments [ 4 ] ) {
6499 const versionId = segments [ 4 ] ;
100+ const versionSegmentLabel = ( this . breadcrumbLabels . versionLabel ( ) ?? '' ) . trim ( ) || `Version ${ versionId } ` ;
65101 items . push ( {
66- label : 'Version ' + versionId ,
102+ label : versionSegmentLabel ,
67103 routerLink : [ '/proposals/view' , proposalId , 'version' , versionId ]
68104 } ) ;
69105
@@ -97,7 +133,8 @@ export class BreadcrumbComponent {
97133 }
98134
99135 if ( segments [ 1 ] === 'view' && segments [ 2 ] ) {
100- items . push ( { label : 'Feedback ' + segments [ 2 ] , routerLink : [ '/feedbacks/view' , segments [ 2 ] ] } ) ;
136+ const label = ( this . breadcrumbLabels . feedbackLabel ( ) ?? '' ) . trim ( ) || `Feedback ${ segments [ 2 ] } ` ;
137+ items . push ( { label, routerLink : [ '/feedbacks/view' , segments [ 2 ] ] } ) ;
101138 }
102139
103140 if ( segments [ 3 ] === 'overlap' && segments [ 4 ] ) {
0 commit comments