Skip to content

Commit cec123f

Browse files
Copilotrenemadsen
andcommitted
Refactor components for better testability - extract complex logic into helper methods
Co-authored-by: renemadsen <[email protected]>
1 parent 30acab5 commit cec123f

File tree

4 files changed

+161
-44
lines changed

4 files changed

+161
-44
lines changed

eform-client/src/app/plugins/modules/time-planning-pn/components/plannings/time-plannings-container/time-plannings-container.component.spec.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,17 @@ describe('TimePlanningsContainerComponent', () => {
7070
expect(component.dateTo.getDate()).toBe(expectedDateTo.getDate());
7171
expect(mockPlanningsService.getPlannings).toHaveBeenCalled();
7272
});
73+
74+
it('should not mutate original dates when navigating', () => {
75+
const originalDateFrom = new Date(component.dateFrom);
76+
const originalDateTo = new Date(component.dateTo);
77+
78+
component.goForward();
79+
80+
// The internal dates should have changed
81+
expect(component.dateFrom.getTime()).not.toBe(originalDateFrom.getTime());
82+
expect(component.dateTo.getTime()).not.toBe(originalDateTo.getTime());
83+
});
7384
});
7485

7586
describe('Date Formatting', () => {

eform-client/src/app/plugins/modules/time-planning-pn/components/plannings/time-plannings-container/time-plannings-container.component.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,8 @@ export class TimePlanningsContainerComponent implements OnInit, OnDestroy {
101101
}
102102

103103
goBackward() {
104-
this.dateFrom = new Date(this.dateFrom.setDate(this.dateFrom.getDate() - 7));
105-
this.dateTo = new Date(this.dateTo.setDate(this.dateTo.getDate() - 7));
104+
this.dateFrom = this.addDays(this.dateFrom, -7);
105+
this.dateTo = this.addDays(this.dateTo, -7);
106106
this.getPlannings();
107107
}
108108

@@ -119,11 +119,17 @@ export class TimePlanningsContainerComponent implements OnInit, OnDestroy {
119119
}
120120

121121
goForward() {
122-
this.dateFrom = new Date(this.dateFrom.setDate(this.dateFrom.getDate() + 7));
123-
this.dateTo = new Date(this.dateTo.setDate(this.dateTo.getDate() + 7));
122+
this.dateFrom = this.addDays(this.dateFrom, 7);
123+
this.dateTo = this.addDays(this.dateTo, 7);
124124
this.getPlannings();
125125
}
126126

127+
private addDays(date: Date, days: number): Date {
128+
const result = new Date(date);
129+
result.setDate(result.getDate() + days);
130+
return result;
131+
}
132+
127133
formatDateRange(): string {
128134
const options = { year: 'numeric', month: 'numeric', day: 'numeric' } as const;
129135
//const from = this.dateFrom.toLocaleDateString(undefined, options);

eform-client/src/app/plugins/modules/time-planning-pn/components/plannings/time-plannings-table/time-plannings-table.component.spec.ts

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,63 @@ describe('TimePlanningsTableComponent', () => {
242242

243243
expect(component.getCellClass(row, '0')).toBe('red-background');
244244
});
245+
246+
it('should return grey-background when plannedStartOfShift1 is set but no work started', () => {
247+
const row = {
248+
planningPrDayModels: {
249+
'0': {
250+
planHours: 0,
251+
start1StartedAt: null,
252+
start2StartedAt: null,
253+
workDayEnded: false,
254+
plannedStartOfShift1: '08:00',
255+
message: null,
256+
workerComment: null,
257+
nettoHoursOverrideActive: false
258+
}
259+
}
260+
};
261+
262+
expect(component.getCellClass(row, '0')).toBe('grey-background');
263+
});
264+
265+
it('should return grey-background when message is set', () => {
266+
const row = {
267+
planningPrDayModels: {
268+
'0': {
269+
planHours: 0,
270+
start1StartedAt: null,
271+
start2StartedAt: null,
272+
workDayEnded: false,
273+
plannedStartOfShift1: null,
274+
message: 'Some message',
275+
workerComment: null,
276+
nettoHoursOverrideActive: false
277+
}
278+
}
279+
};
280+
281+
expect(component.getCellClass(row, '0')).toBe('grey-background');
282+
});
283+
284+
it('should return grey-background when workerComment is set', () => {
285+
const row = {
286+
planningPrDayModels: {
287+
'0': {
288+
planHours: 0,
289+
start1StartedAt: null,
290+
start2StartedAt: null,
291+
workDayEnded: false,
292+
plannedStartOfShift1: null,
293+
message: null,
294+
workerComment: 'Worker comment',
295+
nettoHoursOverrideActive: false
296+
}
297+
}
298+
};
299+
300+
expect(component.getCellClass(row, '0')).toBe('grey-background');
301+
});
245302
});
246303

247304
describe('isInOlderThanToday', () => {

eform-client/src/app/plugins/modules/time-planning-pn/components/plannings/time-plannings-table/time-plannings-table.component.ts

Lines changed: 83 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -126,69 +126,112 @@ export class TimePlanningsTableComponent implements OnInit, OnChanges {
126126

127127
getCellClass(row: any, field: string): string {
128128
try {
129-
const planHours = row.planningPrDayModels[field]?.planHours;
130-
const nettoHoursOverrideActive = row.planningPrDayModels[field]?.nettoHoursOverrideActive;
131-
const plannedStarted = row.planningPrDayModels[field]?.plannedStartOfShift1;
132-
let workDayStarted = row.planningPrDayModels[field]?.start1StartedAt || row.planningPrDayModels[field]?.start2StartedAt;
133-
let workDayEnded = row.planningPrDayModels[field]?.workDayEnded;
134-
if (nettoHoursOverrideActive && nettoHoursOverrideActive) {
135-
// If netto hours override is active, use the override value
129+
const cellData = row.planningPrDayModels[field];
130+
if (!cellData) {
131+
return '';
132+
}
133+
134+
const { planHours, nettoHoursOverrideActive, plannedStartOfShift1, message, workerComment } = cellData;
135+
let workDayStarted = cellData.start1StartedAt || cellData.start2StartedAt;
136+
let workDayEnded = cellData.workDayEnded;
137+
138+
// If netto hours override is active, use the override value
139+
if (nettoHoursOverrideActive) {
136140
workDayStarted = true;
137141
workDayEnded = true;
138142
}
139-
const message = row.planningPrDayModels[field]?.message;
140-
const workerComment = row.planningPrDayModels[field]?.workerComment;
143+
144+
// Case 1: Has planned hours
141145
if (planHours > 0) {
142146
if (workDayStarted) {
143-
//console.log('getCellClass', row, field, planHours, workDayStarted, workDayEnded);
144147
return workDayEnded ? 'green-background' : 'grey-background';
145-
}
146-
else {
148+
} else {
147149
return 'grey-background';
148150
}
149151
}
150-
else {
151-
return workDayStarted ? workDayEnded ? 'green-background' : 'red-background' : plannedStarted ? 'grey-background' : message || workerComment ? 'grey-background' : 'white-background';
152-
}
153-
}
154-
catch (e) {
155-
//console.error(e);
152+
153+
// Case 2: No planned hours
154+
return this.getCellClassForNoPlanHours(workDayStarted, workDayEnded, plannedStartOfShift1, message, workerComment);
155+
} catch (e) {
156156
return '';
157157
}
158158
}
159159

160+
private getCellClassForNoPlanHours(
161+
workDayStarted: boolean,
162+
workDayEnded: boolean,
163+
plannedStarted: any,
164+
message: any,
165+
workerComment: any
166+
): string {
167+
if (workDayStarted) {
168+
return workDayEnded ? 'green-background' : 'red-background';
169+
}
170+
171+
if (plannedStarted) {
172+
return 'grey-background';
173+
}
174+
175+
if (message || workerComment) {
176+
return 'grey-background';
177+
}
178+
179+
return 'white-background';
180+
}
181+
160182
getCellTextColor(row: any, field: string): string {
161-
const planHours = row.planningPrDayModels[field]?.planHours;
162-
const nettoHoursOverrideActive = row.planningPrDayModels[field]?.nettoHoursOverrideActive;
163-
const plannedStarted = row.planningPrDayModels[field]?.plannedStartOfShift1
164-
let workDayStarted = row.planningPrDayModels[field]?.start1StartedAt || row.planningPrDayModels[field]?.start2StartedAt;
165-
let workDayEnded = row.planningPrDayModels[field]?.workDayEnded;
166-
if (nettoHoursOverrideActive && nettoHoursOverrideActive) {
167-
// If netto hours override is active, use the override value
183+
const cellData = row.planningPrDayModels[field];
184+
if (!cellData) {
185+
return 'black-text';
186+
}
187+
188+
const { planHours, nettoHoursOverrideActive, plannedStartOfShift1, message, workerComment, date } = cellData;
189+
let workDayStarted = cellData.start1StartedAt || cellData.start2StartedAt;
190+
let workDayEnded = cellData.workDayEnded;
191+
192+
// If netto hours override is active, use the override value
193+
if (nettoHoursOverrideActive) {
168194
workDayStarted = true;
169195
workDayEnded = true;
170196
}
171-
const isInOlderThanToday = new Date(row.planningPrDayModels[field]?.date) < new Date();
172-
const message = row.planningPrDayModels[field]?.message;
173-
const workerComment = row.planningPrDayModels[field]?.workerComment;
197+
198+
const isInOlderThanToday = new Date(date) < new Date();
199+
200+
// Case 1: Has planned hours
174201
if (planHours > 0) {
175202
if (workDayStarted) {
176-
//console.log('getCellTextColor', row, field, planHours, workDayStarted, workDayEnded);
177203
return workDayEnded ? 'white-text' : 'red-text';
178-
}
179-
else {
204+
} else {
180205
return isInOlderThanToday ? 'red-text' : 'black-text';
181206
}
182-
} else {
183-
return workDayStarted ? workDayEnded ? 'black-text' : 'white-text' : plannedStarted ? message || workerComment ? 'black-text' : 'white-text' : message || workerComment ? 'black-text' : 'white-text';
184-
// if (workDayStarted) {
185-
// return 'black-text';
186-
// }
187-
// else {
188-
// return isInOlderThanToday ? 'red-text' : 'black-text';
189-
// }
190207
}
191-
// return 'black-text';
208+
209+
// Case 2: No planned hours
210+
return this.getCellTextColorForNoPlanHours(
211+
workDayStarted,
212+
workDayEnded,
213+
plannedStartOfShift1,
214+
message,
215+
workerComment
216+
);
217+
}
218+
219+
private getCellTextColorForNoPlanHours(
220+
workDayStarted: boolean,
221+
workDayEnded: boolean,
222+
plannedStarted: any,
223+
message: any,
224+
workerComment: any
225+
): string {
226+
if (workDayStarted) {
227+
return workDayEnded ? 'black-text' : 'white-text';
228+
}
229+
230+
if (plannedStarted) {
231+
return (message || workerComment) ? 'black-text' : 'white-text';
232+
}
233+
234+
return (message || workerComment) ? 'black-text' : 'white-text';
192235
}
193236

194237
getCellTextColorForDay(row: any, field: string): string {

0 commit comments

Comments
 (0)