Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,9 @@ Het Rapport-tabblad (`ReportPanel.tsx`) kent elf rapporttypen (`ReportType` in
(issue #113: dezelfde Gantt-render met als rijenbron `computeResourceGanttRows` uit
`src/engine/reports/resourceGantt.ts` — per resource-IDENTITEIT een band (niet per naam, zoals de
schermgroepering: gelijknamigen krijgen `#n`, naamlozen een surrogaat), daaronder zijn bladtaken op
start; relaties staan bij dit type uit omdat een taak onder meerdere banden kan staan; optie "blad
start; relaties staan bij dit type uit omdat een taak onder meerdere banden kan staan, en het vinkje
*Kritiek pad* is er verborgen en geforceerd aan (`reportTypeShowsCriticalToggle`: het vinkje kleurt alleen
relatielijnen en legendaregel, de balken volgen `barColorSelection` via `criticalFill`); optie "blad
per resource" = `PrintOptions.pageBreakBeforeGroups`
→ `RenderReportResult.forcedBreakOffsets` → `forcedBreakOffsetsPx` in `tileLayout`, waar een gedwongen
positie zonder vulgraaddrempel wint; `isGanttReportType()` bundelt beide Gantt-achtige typen; de voet
Expand Down
13 changes: 8 additions & 5 deletions public/docs/en/gids-rapporten-printen.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,9 @@ A full, formatted printout of the Gantt bars — this is the only report type wi

Relationship lines in the report use the same visual language as the Gantt view: a **solid** line is
a driving relationship, a **dashed** line a non-driving one, and a driving relationship between two
critical tasks is **red**. Turn *critical path* off and those lines go neutral as well. The legend at
the bottom summarises the difference. Before the first calculation every line is drawn neutral and
critical tasks is **red**. Turn *critical path* off and those lines go neutral and the legend entry
disappears; the bar colour itself follows the **Bar colors** choice. The legend at the bottom
summarises the difference. Before the first calculation every line is drawn neutral and
solid — press *Calculate* (F5) first.

The summary block above it shows the live count of tasks, leaf tasks, critical tasks and relations
Expand All @@ -103,9 +104,11 @@ left out — an assignment on a summary task (which an import can produce) is no
at the bottom, so the meeting can see at a glance what nobody owns yet.

The settings of the Gantt print apply here too — critical path, float, bar colours, status line,
paper, header repeat — with two exceptions: *Follow view* (this report doesn't take its rows from
the screen) and *Dependencies* (a task can sit under several bands, and with one sheet per resource arrows
would run off the sheet; so this report draws none). So there's no need to group the Gantt view by
paper, header repeat — with three exceptions: *Follow view* (this report doesn't take its rows from
the screen), *Dependencies* (a task can sit under several bands, and with one sheet per resource arrows
would run off the sheet; so this report draws none) and *Critical path* (that toggle only colours
relationship lines, and there are none here — the bars simply follow the **Bar colors** choice, and
the legend explains them). So there's no need to group the Gantt view by
resource yourself first. Bands are per resource, not per name: two resources that happen to share a
name each get their own band (*Jan #1*, *Jan #2*), and a resource without a name gets a sequence
number. The summary block counts the resources, the assignments and the tasks without a resource —
Expand Down
11 changes: 7 additions & 4 deletions public/docs/nl/gids-rapporten-printen.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,8 @@ instellingenblok:
De relatielijnen in het rapport gebruiken dezelfde tekentaal als het Gantt-scherm: een
**doorgetrokken** lijn is een bepalende (driving) relatie, een **gestreepte** lijn een
niet-bepalende, en een bepalende relatie tussen twee kritieke taken is **rood**. Zet je *kritiek pad*
uit, dan worden ook die lijnen neutraal. De legenda onderaan vat het verschil samen. Is er nog niet
uit, dan worden die lijnen neutraal en verdwijnt de legendaregel; de balkkleur zelf volgt de keuze
**Balkkleuren**. De legenda onderaan vat het verschil samen. Is er nog niet
gerekend, dan staan alle lijnen neutraal doorgetrokken — druk eerst op *Bereken* (F5).

Het overzichtsblok erboven toont live het aantal taken, bladtaken, kritieke taken en relaties in
Expand All @@ -106,9 +107,11 @@ resource meenemen** komt er onderaan een band *(geen)* bij, zodat je in het over
nog niemand heeft.

De instellingen van de Gantt-afdruk gelden hier ook — kritiek pad, speling, balkkleuren, statuslijn,
papier, kopherhaling — op twee na: *Volg weergave* (de rijen komen bij dit rapport niet van het
scherm) en *Afhankelijkheden* (een taak kan onder meerdere banden staan en pijlen zouden bij een blad per
resource van het vel af lopen; dit rapport tekent er daarom geen). Je hoeft de Gantt-weergave dus
papier, kopherhaling — op drie na: *Volg weergave* (de rijen komen bij dit rapport niet van het
scherm), *Afhankelijkheden* (een taak kan onder meerdere banden staan en pijlen zouden bij een blad per
resource van het vel af lopen; dit rapport tekent er daarom geen) en *Kritiek pad* (dat vinkje kleurt
alleen relatielijnen, en die zijn er hier niet — de balken volgen gewoon de keuze **Balkkleuren**, en
de legenda verklaart ze). Je hoeft de Gantt-weergave dus
niet eerst zelf op resource te groeperen. Banden zijn per resource, niet per naam: twee resources die
toevallig hetzelfde heten krijgen elk een eigen band (*Jan #1*, *Jan #2*), en een resource zonder
naam een volgnummer. Het overzichtsblok telt de resources, de toewijzingen en de taken zonder
Expand Down
20 changes: 14 additions & 6 deletions src/components/panels/ReportPanel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ import { encodeFieldRef, decodeFieldRef } from '@/components/layout/Ribbon/ribbo
import { useSplitter } from '@/hooks/useSplitter';
import { saveBytesDialog } from '@/services/fileAccess';
import {
DEFAULT_REPORT_SETTINGS, isGanttReportType, loadReportSettings, reportTypeDrawsRelations, saveReportSettings, TABLE_REPORT_TYPES,
DEFAULT_REPORT_SETTINGS, isGanttReportType, loadReportSettings, reportTypeDrawsRelations, reportTypeShowsCriticalToggle, saveReportSettings,
TABLE_REPORT_TYPES,
type ReportType, type ResourceGanttReportOptions, type TableReportOptions,
} from '@/utils/reportSettings';
import { computeResourceGanttRows } from '@/engine/reports';
Expand Down Expand Up @@ -522,7 +523,11 @@ export function ReportPanel() {
// vervangt die één render later. Bewust geen "leeg" tussenframe.
const effectiveNameColumnWidth = truncateTaskNames ? taskNameColumnWidth : (autoNameColumnWidth ?? taskNameColumnWidth);
const options = useMemo<PrintOptions>(() => ({
showCritical, showFloat, showWeekends, showLegend,
// Resourcediagram: het vinkje *Kritiek pad* stuurt alleen relatielijnen en legendaregel, en dit
// type tekent geen lijnen — vinkje verborgen, waarde geforceerd zodat de legenda de rode balken
// blijft verklaren (zie `reportTypeShowsCriticalToggle`).
showCritical: reportTypeShowsCriticalToggle(reportType) ? showCritical : true,
showFloat, showWeekends, showLegend,
// Resourcediagram: geen relatiepijlen (zie `reportTypeDrawsRelations`).
showDeps: reportTypeDrawsRelations(reportType) && showDeps,
showTaskNames, showCompletion, showBaselineOverlay, autoFit, customZoom,
Expand Down Expand Up @@ -1486,10 +1491,13 @@ export function ReportPanel() {
<input data-ops-report-baseline-overlay type="checkbox" checked={showBaselineOverlay} onChange={e => setShowBaselineOverlay(e.target.checked)} className="accent-accent flex-shrink-0" />
<span className="min-w-0">{t('showBaselineOverlay')}</span>
</label>
<label className="flex items-center gap-2 min-w-0">
<input type="checkbox" checked={showCritical} onChange={e => setShowCritical(e.target.checked)} className="accent-accent flex-shrink-0" />
<span className="min-w-0">{t('showCriticalPath')}</span>
</label>
{/* Kritiek pad niet bij het resourcediagram — hetzelfde predicaat als de forcering in `options`. */}
{reportTypeShowsCriticalToggle(reportType) && (
<label className="flex items-center gap-2 min-w-0">
<input type="checkbox" checked={showCritical} onChange={e => setShowCritical(e.target.checked)} className="accent-accent flex-shrink-0" />
<span className="min-w-0">{t('showCriticalPath')}</span>
</label>
)}
<label className="flex items-center gap-2 min-w-0">
<input type="checkbox" checked={showFloat} onChange={e => setShowFloat(e.target.checked)} className="accent-accent flex-shrink-0" />
<span className="min-w-0">{t('showFloat')}</span>
Expand Down
7 changes: 4 additions & 3 deletions src/services/print/printPreview.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1971,9 +1971,10 @@ function drawTaskTable(
* 1. GRIJSTINT. Papier vraagt een lichtere neutrale lijn dan een beeldscherm; `PRINT_PALETTE`
* houdt daarom bewust `#9CA3AF` waar het schermpalet `#6B7280` gebruikt (zie de waarschuwing
* bovenin themePalette.ts). Alleen het KRITIEK-rood is in beide paletten dezelfde merk-hex.
* 2. `options.showCritical`. Zet de gebruiker "kritiek pad tonen" uit, dan tekent de balklaag
* hierboven ook de kritieke taken neutraal blauw; rode lijnen tussen blauwe balken zou een
* kritiek pad tonen dat de gebruiker net heeft uitgezet.
* 2. `options.showCritical` stuurt hier alléén de lijnkleur (en de legendaregel). De balken
* volgen sinds de balkkleurkeuze `computeBarColors` (barColors.ts: `criticalFill` in de modus
* *Kritiek pad*, een rode rand daarbuiten) en kijken niet naar het vinkje — een rapporttype
* zonder lijnen verbergt het vinkje daarom (`reportTypeShowsCriticalToggle`).
* 3. TRACE-DIMMING wordt NIET overgenomen: dat is interactieve state (het gedimd tonen van alles
* buiten een aangeklikt pad) waar een statisch papieren rapport niets aan heeft.
*
Expand Down
12 changes: 12 additions & 0 deletions src/utils/reportSettings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,18 @@ export function reportTypeDrawsRelations(type: ReportType): boolean {
return type !== 'resourceGantt';
}

/**
* Toont dit rapporttype het vinkje *Kritiek pad*? Sinds de balkkleurkeuze (`barColorSelection`)
* stuurt dat vinkje alléén de relatielijnen (rood tussen twee kritieke taken) en de legendaregel;
* de balken zelf volgen `criticalFill` in `barColors.ts`, ongeacht het vinkje. Bij een type zonder
* relatiepijlen zou het vinkje dus nog uitsluitend de legendaregel wegnemen terwijl de balken rood
* blijven — misleidend (manuvarkey op #113). Daarom hetzelfde predicaat als de relaties; het paneel
* forceert `showCritical` dan op `true`, zodat de legenda bij de rode balken past.
*/
export function reportTypeShowsCriticalToggle(type: ReportType): boolean {
return reportTypeDrawsRelations(type);
}

/** De rapporttypen die via het gedeelde tabelrapport (`TableReportView`) lopen. */
export const TABLE_REPORT_TYPES: readonly ReportType[] = [
'lookAhead', 'critical', 'progress', 'health', 'resourceLoading', 'resourceAssignments', 'wbsSummary',
Expand Down
8 changes: 7 additions & 1 deletion tests/browser/resource-gantt-report.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ test('resourcediagram: rapporttype rendert per resource, opties sturen samenvatt
});

await page.getByRole('button', { name: /^(Report|Rapport)$/ }).click();
// Bij het gewone Gantt-rapport (standaardtype) staat het vinkje Kritiek pad er wél — de negatieve
// assertie hieronder zegt anders niets.
await expect(page.getByLabel(/^(Critical path|Kritiek pad)$/)).toHaveCount(1);
const typePicker = page.getByLabel(/^(Report type|Rapporttype)$/).first();
await typePicker.click();
await page.getByRole('option', { name: /^(Resource diagram|Resourcediagram)$/ }).click();
Expand All @@ -33,9 +36,12 @@ test('resourcediagram: rapporttype rendert per resource, opties sturen samenvatt
await expect(count('resources')).toHaveText('2');
await expect(count('assignments')).toHaveText('3');
await expect(count('unassigned')).toHaveText('1');
// Geen relatie-optie bij dit type (een taak kan onder meerdere banden staan); Volg weergave evenmin.
// Geen relatie-optie bij dit type (een taak kan onder meerdere banden staan); Volg weergave evenmin,
// en ook geen Kritiek pad: dat vinkje kleurt alleen relatielijnen en zou hier enkel de legendaregel
// wegnemen terwijl de balken rood blijven (manuvarkey op #113). Bij het gewone Gantt-rapport staat het wel.
await expect(page.getByLabel(/^(Dependencies|Afhankelijkheden)$/)).toHaveCount(0);
await expect(page.getByLabel(/^(Follow view|Volg weergave)/)).toHaveCount(0);
await expect(page.getByLabel(/^(Critical path|Kritiek pad)$/)).toHaveCount(0);

// Preview: alles past op één pagina, en die pagina is een echte gerasterde afbeelding.
const pages = page.locator('[data-preview-page]');
Expand Down
5 changes: 4 additions & 1 deletion tests/planning/check-report-resource-gantt-setting.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import './domStub';
import {
DEFAULT_REPORT_SETTINGS, DEFAULT_RESOURCE_GANTT_OPTIONS, isGanttReportType, loadReportSettings, reportTypeDrawsRelations,
saveReportSettings,
reportTypeShowsCriticalToggle, saveReportSettings,
} from '@/utils/reportSettings';

const failures: string[] = [];
Expand All @@ -21,6 +21,9 @@ expect('isGanttReportType: gantt én resourceGantt', [isGanttReportType('gantt')
// verborgen vinkje hangen er allebei aan; showDeps staat standaard aan, dus de forcering is dragend.
expect('reportTypeDrawsRelations: alleen het resourcediagram tekent geen relaties', [reportTypeDrawsRelations('gantt'), reportTypeDrawsRelations('resourceGantt'), reportTypeDrawsRelations('lookAhead')], [true, false, true]);
expect('showDeps staat standaard aan (de forcering doet dus echt iets)', DEFAULT_REPORT_SETTINGS.showDeps, true);
// manuvarkey op #113: het kritiek-pad-vinkje stuurt alleen relatielijnen + legendaregel (de balken volgen
// barColorSelection), dus zonder lijnen is het misleidend — verborgen op hetzelfde predicaat als de relaties.
expect('reportTypeShowsCriticalToggle: verborgen waar geen relaties getekend worden', [reportTypeShowsCriticalToggle('gantt'), reportTypeShowsCriticalToggle('resourceGantt'), reportTypeShowsCriticalToggle('milestones')], [true, false, true]);

localStorage.setItem('ops-reportSettings', JSON.stringify({ reportType: 'resourceGantt', resourceGantt: { pageBreakPerResource: true, includeUnassigned: true } }));
const loaded = await loadReportSettings();
Expand Down