Skip to content

Commit 3eaedd8

Browse files
Step by step module creation (#78)
1 parent e3dcc2e commit 3eaedd8

107 files changed

Lines changed: 4089 additions & 1687 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.example.env

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,18 @@ APP_PORT=4200
1919
API_PORT=8080
2020
AUTH_PORT=8081
2121

22+
# EMAIL SENDING
23+
MAIL_ENABLED=true
24+
MAIL_SENDER=module-test@local.aet.cit.tum.de
25+
POSTFIX_HOST=localhost
26+
POSTFIX_PORT=1025
27+
POSTFIX_USERNAME=
28+
POSTFIX_PASSWORD=
29+
MAIL_STARTTLS_ENABLE=false
30+
MAIL_STARTTLS_REQUIRED=false
31+
# Public URL of the Angular app (used in email links)
32+
CLIENT_HOST=http://localhost:4200
33+
2234
# AI Service
2335
AZURE_ENDPOINT=https://your-azure-endpoint.openai.azure.com/
2436
AZURE_DEPLOYMENT_NAME=your-deployment-name

Client/client.Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
FROM node:24-alpine AS builder
22
WORKDIR /app
33
COPY package*.json ./
4-
RUN npm install --legacy-peer-deps
4+
RUN npm install
55

66
COPY . .
77
RUN npm run build

Client/src/app/app.routes.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ export const routes: Routes = [
2525
children: [
2626
{ path: '', component: ProfessorHomePageComponent },
2727
{ path: 'create', component: ProposalCreateComponent },
28-
{ path: 'view/:id', component: ProposalViewComponent },
29-
{ path: 'view/:id/version/:versionId', component: ModuleVersionViewComponent },
30-
{ path: 'view/:id/version/:versionId/edit', component: ModuleVersionEditComponent },
31-
{ path: 'view/:id/version/:versionId/overlap', component: SimilarModulesPage }
28+
{ path: ':id', component: ProposalViewComponent },
29+
{ path: ':id/version/:versionId', component: ModuleVersionViewComponent },
30+
{ path: ':id/version/:versionId/edit', component: ModuleVersionEditComponent },
31+
{ path: ':id/version/:versionId/overlap', component: SimilarModulesPage }
3232
]
3333
},
3434
{

Client/src/app/components/breadcrumb/breadcrumb.component.ts

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -85,37 +85,38 @@ export class BreadcrumbComponent {
8585
return items;
8686
}
8787

88-
if (segments[1] === 'view' && segments[2]) {
89-
const proposalId = segments[2];
90-
const proposalLabel = (this.breadcrumbLabels.proposalTitle() ?? '').trim() || `Proposal ${proposalId}`;
88+
// segments[1] is proposal id (e.g. /proposals/123 or /proposals/123/version/456/edit)
89+
const proposalId = segments[1];
90+
if (!proposalId) return items;
91+
92+
const proposalLabel = (this.breadcrumbLabels.proposalTitle() ?? '').trim() || `Proposal ${proposalId}`;
93+
items.push({
94+
label: proposalLabel,
95+
routerLink: ['/proposals', proposalId]
96+
});
97+
98+
if (segments.length <= 2) return items;
99+
100+
if (segments[2] === 'version' && segments[3]) {
101+
const versionId = segments[3];
102+
const versionSegmentLabel = (this.breadcrumbLabels.versionLabel() ?? '').trim() || `Version ${versionId}`;
91103
items.push({
92-
label: proposalLabel,
93-
routerLink: ['/proposals/view', proposalId]
104+
label: versionSegmentLabel,
105+
routerLink: ['/proposals', proposalId, 'version', versionId]
94106
});
95107

96-
if (segments.length <= 3) return items;
108+
if (segments.length <= 4) return items;
97109

98-
if (segments[3] === 'version' && segments[4]) {
99-
const versionId = segments[4];
100-
const versionSegmentLabel = (this.breadcrumbLabels.versionLabel() ?? '').trim() || `Version ${versionId}`;
110+
if (segments[4] === 'edit') {
111+
items.push({ label: 'Edit', routerLink: ['/proposals', proposalId, 'version', versionId, 'edit'] });
112+
return items;
113+
}
114+
if (segments[4] === 'overlap') {
101115
items.push({
102-
label: versionSegmentLabel,
103-
routerLink: ['/proposals/view', proposalId, 'version', versionId]
116+
label: 'Similar Modules',
117+
routerLink: ['/proposals', proposalId, 'version', versionId, 'overlap']
104118
});
105-
106-
if (segments.length <= 5) return items;
107-
108-
if (segments[5] === 'edit') {
109-
items.push({ label: 'Edit', routerLink: ['/proposals/view', proposalId, 'version', versionId, 'edit'] });
110-
return items;
111-
}
112-
if (segments[5] === 'overlap') {
113-
items.push({
114-
label: 'Similar Modules',
115-
routerLink: ['/proposals/view', proposalId, 'version', versionId, 'overlap']
116-
});
117-
return items;
118-
}
119+
return items;
119120
}
120121
}
121122

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
.module-edit-layout {
2+
display: grid;
3+
grid-template-columns: 280px 1fr;
4+
gap: 2rem;
5+
margin: 0 auto;
6+
}
7+
8+
@media (max-width: 768px) {
9+
.module-edit-layout {
10+
grid-template-columns: 1fr;
11+
}
12+
}
13+
14+
.module-edit-stepper-column {
15+
position: sticky;
16+
top: 1rem;
17+
align-self: start;
18+
}
19+
20+
.module-edit-form-column {
21+
min-width: 0;
22+
}
23+

0 commit comments

Comments
 (0)