wip
This commit is contained in:
parent
c16e432b29
commit
2ec4b93fa5
9 changed files with 187 additions and 249 deletions
|
|
@ -1,36 +1,38 @@
|
|||
import { IEnumerable } from 'ts-linq-light';
|
||||
import { IGroupingRenderer, RenderContext } from '../../core/IGroupingRenderer';
|
||||
import { NextFunction, RenderData } from '../../core/RenderBuilder';
|
||||
import { Renderer, RenderContext } from '../../core/IGroupingRenderer';
|
||||
import { DateService } from '../../core/DateService';
|
||||
|
||||
export class DateRenderer implements IGroupingRenderer<string> {
|
||||
export class DateRenderer implements Renderer {
|
||||
readonly type = 'date';
|
||||
next: Renderer | null = null;
|
||||
|
||||
constructor(private dateService: DateService) {}
|
||||
|
||||
render(
|
||||
dates: IEnumerable<string>,
|
||||
_data: RenderData,
|
||||
_next: NextFunction,
|
||||
context: RenderContext
|
||||
): void {
|
||||
for (const dateStr of dates) {
|
||||
const date = this.dateService.parseISO(dateStr);
|
||||
render(context: RenderContext): void {
|
||||
const dates = context.filter['date'] || [];
|
||||
const resourceCount = context.filter['resource']?.length || 1;
|
||||
|
||||
const headerCell = document.createElement('swp-day-header');
|
||||
headerCell.dataset.date = dateStr;
|
||||
headerCell.innerHTML = `
|
||||
<swp-day-name>${this.dateService.getDayName(date, 'short')}</swp-day-name>
|
||||
<swp-day-date>${date.getDate()}</swp-day-date>
|
||||
`;
|
||||
context.headerContainer.appendChild(headerCell);
|
||||
// Render dates for HVER resource (resourceCount gange)
|
||||
for (let r = 0; r < resourceCount; r++) {
|
||||
for (const dateStr of dates) {
|
||||
const date = this.dateService.parseISO(dateStr);
|
||||
|
||||
const column = document.createElement('swp-day-column');
|
||||
column.dataset.date = dateStr;
|
||||
column.innerHTML = '<swp-events-layer></swp-events-layer>';
|
||||
context.columnContainer.appendChild(column);
|
||||
// Header
|
||||
const header = document.createElement('swp-day-header');
|
||||
header.dataset.date = dateStr;
|
||||
header.innerHTML = `
|
||||
<swp-day-name>${this.dateService.getDayName(date, 'short')}</swp-day-name>
|
||||
<swp-day-date>${date.getDate()}</swp-day-date>
|
||||
`;
|
||||
context.headerContainer.appendChild(header);
|
||||
|
||||
// Leaf renderer - ingen next.render() kald
|
||||
// Column
|
||||
const column = document.createElement('swp-day-column');
|
||||
column.dataset.date = dateStr;
|
||||
column.innerHTML = '<swp-events-layer></swp-events-layer>';
|
||||
context.columnContainer.appendChild(column);
|
||||
}
|
||||
}
|
||||
|
||||
// Leaf - ingen next
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,37 +1,37 @@
|
|||
import { from, IEnumerable } from 'ts-linq-light';
|
||||
import { IGroupingRenderer, RenderContext } from '../../core/IGroupingRenderer';
|
||||
import { NextFunction, RenderData } from '../../core/RenderBuilder';
|
||||
import { Renderer, RenderContext } from '../../core/IGroupingRenderer';
|
||||
|
||||
interface Resource {
|
||||
id: string;
|
||||
name?: string;
|
||||
name: string;
|
||||
}
|
||||
|
||||
export class ResourceRenderer implements IGroupingRenderer<Resource> {
|
||||
export class ResourceRenderer implements Renderer {
|
||||
readonly type = 'resource';
|
||||
next: Renderer | null = null;
|
||||
|
||||
render(
|
||||
resources: IEnumerable<Resource>,
|
||||
data: RenderData,
|
||||
next: NextFunction,
|
||||
context: RenderContext
|
||||
): void {
|
||||
const dates = data.dates || from([]);
|
||||
// Hardcoded data
|
||||
private resources: Resource[] = [
|
||||
{ id: 'res1', name: 'Anders' },
|
||||
{ id: 'res2', name: 'Bente' },
|
||||
{ id: 'res3', name: 'Carsten' }
|
||||
];
|
||||
|
||||
for (const resource of resources) {
|
||||
const colspan = next.count(dates);
|
||||
render(context: RenderContext): void {
|
||||
const allowedIds = context.filter['resource'] || [];
|
||||
const filteredResources = this.resources.filter(r => allowedIds.includes(r.id));
|
||||
|
||||
const cell = document.createElement('swp-resource-header');
|
||||
cell.dataset.resourceId = resource.id;
|
||||
cell.textContent = resource.name || resource.id;
|
||||
const dateCount = context.filter['date']?.length || 1;
|
||||
|
||||
if (colspan > 1) {
|
||||
cell.style.gridColumn = `span ${colspan}`;
|
||||
}
|
||||
|
||||
context.headerContainer.appendChild(cell);
|
||||
|
||||
next.render(dates);
|
||||
// Render ALLE resource headers
|
||||
for (const resource of filteredResources) {
|
||||
const header = document.createElement('swp-resource-header');
|
||||
header.dataset.resourceId = resource.id;
|
||||
header.textContent = resource.name;
|
||||
header.style.gridColumn = `span ${dateCount}`;
|
||||
context.headerContainer.appendChild(header);
|
||||
}
|
||||
|
||||
// Derefter kald next ÉN gang
|
||||
if (this.next) this.next.render(context);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,47 +1,42 @@
|
|||
import { from, IEnumerable } from 'ts-linq-light';
|
||||
import { IGroupingRenderer, RenderContext } from '../../core/IGroupingRenderer';
|
||||
import { NextFunction, RenderData } from '../../core/RenderBuilder';
|
||||
import { Renderer, RenderContext } from '../../core/IGroupingRenderer';
|
||||
|
||||
interface Team {
|
||||
id: string;
|
||||
name?: string;
|
||||
name: string;
|
||||
resourceIds: string[];
|
||||
}
|
||||
|
||||
interface Resource {
|
||||
id: string;
|
||||
teamId?: string;
|
||||
}
|
||||
|
||||
export class TeamRenderer implements IGroupingRenderer<Team> {
|
||||
export class TeamRenderer implements Renderer {
|
||||
readonly type = 'team';
|
||||
next: Renderer | null = null;
|
||||
|
||||
render(
|
||||
teams: IEnumerable<Team>,
|
||||
data: RenderData,
|
||||
next: NextFunction,
|
||||
context: RenderContext
|
||||
): void {
|
||||
const resources = data.resources as IEnumerable<Resource> || from([]);
|
||||
const resourcesByTeam = from(resources).groupBy((r: Resource) => r.teamId || '');
|
||||
// Hardcoded data
|
||||
private teams: Team[] = [
|
||||
{ id: 'team1', name: 'Team Alpha', resourceIds: ['res1', 'res2'] },
|
||||
{ id: 'team2', name: 'Team Beta', resourceIds: ['res3'] }
|
||||
];
|
||||
|
||||
for (const team of teams) {
|
||||
const teamResources = from(resourcesByTeam)
|
||||
.firstOrDefault(g => g.key === team.id);
|
||||
render(context: RenderContext): void {
|
||||
const allowedIds = context.filter['team'] || [];
|
||||
const filteredTeams = this.teams.filter(t => allowedIds.includes(t.id));
|
||||
|
||||
const teamResourcesEnum = teamResources ? from(teamResources) : from([]);
|
||||
const colspan = next.count(teamResourcesEnum);
|
||||
const dateCount = context.filter['date']?.length || 1;
|
||||
const resourceIds = context.filter['resource'] || [];
|
||||
|
||||
const cell = document.createElement('swp-team-header');
|
||||
cell.dataset.teamId = team.id;
|
||||
cell.textContent = team.name || team.id;
|
||||
// Render ALLE team headers først
|
||||
for (const team of filteredTeams) {
|
||||
// Tæl resources der tilhører dette team OG er i filter
|
||||
const teamResourceCount = team.resourceIds.filter(id => resourceIds.includes(id)).length;
|
||||
const colspan = teamResourceCount * dateCount;
|
||||
|
||||
if (colspan > 1) {
|
||||
cell.style.gridColumn = `span ${colspan}`;
|
||||
}
|
||||
|
||||
context.headerContainer.appendChild(cell);
|
||||
|
||||
next.render(teamResourcesEnum);
|
||||
const header = document.createElement('swp-team-header');
|
||||
header.dataset.teamId = team.id;
|
||||
header.textContent = team.name;
|
||||
header.style.setProperty('--team-cols', String(colspan));
|
||||
context.headerContainer.appendChild(header);
|
||||
}
|
||||
|
||||
// Derefter kald next ÉN gang
|
||||
if (this.next) this.next.render(context);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue