diff --git a/projects/demos/app/demo-app.module.ts b/projects/demos/app/demo-app.module.ts index ef61b3805..91dd69ae1 100644 --- a/projects/demos/app/demo-app.module.ts +++ b/projects/demos/app/demo-app.module.ts @@ -303,13 +303,13 @@ import { ClipboardModule } from 'ngx-clipboard'; } }, { - path: 'group-month-view-events', + path: 'group-similar-events', loadChildren: () => - import('./demo-modules/group-month-view-events/module').then( + import('./demo-modules/group-similar-events/module').then( m => m.DemoModule ), data: { - label: 'Group month view events' + label: 'Group similar events' } }, { diff --git a/projects/demos/app/demo-modules/group-month-view-events/component.ts b/projects/demos/app/demo-modules/group-month-view-events/component.ts deleted file mode 100644 index ad280ccee..000000000 --- a/projects/demos/app/demo-modules/group-month-view-events/component.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { Component, ChangeDetectionStrategy } from '@angular/core'; -import { - CalendarEvent, - CalendarMonthViewDay, - CalendarView -} from 'angular-calendar'; -import { colors } from '../demo-utils/colors'; - -@Component({ - selector: 'mwl-demo-component', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: 'template.html', - styles: [ - ` - .cell-totals { - margin: 5px; - text-align: center; - } - .badge { - margin-right: 5px; - } - ` - ] -}) -export class DemoComponent { - view: CalendarView = CalendarView.Month; - - viewDate: Date = new Date(); - - events: CalendarEvent[] = [ - { - title: 'Event 1', - color: colors.yellow, - start: new Date(), - meta: { - type: 'warning' - } - }, - { - title: 'Event 2', - color: colors.yellow, - start: new Date(), - meta: { - type: 'warning' - } - }, - { - title: 'Event 3', - color: colors.blue, - start: new Date(), - meta: { - type: 'info' - } - }, - { - title: 'Event 4', - color: colors.red, - start: new Date(), - meta: { - type: 'danger' - } - }, - { - title: 'Event 5', - color: colors.red, - start: new Date(), - meta: { - type: 'danger' - } - } - ]; - - beforeMonthViewRender({ body }: { body: CalendarMonthViewDay[] }): void { - body.forEach(cell => { - const groups: any = {}; - cell.events.forEach((event: CalendarEvent<{ type: string }>) => { - groups[event.meta.type] = groups[event.meta.type] || []; - groups[event.meta.type].push(event); - }); - cell['eventGroups'] = Object.entries(groups); - }); - } -} diff --git a/projects/demos/app/demo-modules/group-month-view-events/template.html b/projects/demos/app/demo-modules/group-month-view-events/template.html deleted file mode 100644 index 267558cda..000000000 --- a/projects/demos/app/demo-modules/group-month-view-events/template.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - -
- {{ day.badgeTotal }} - {{ day.date | calendarDate:'monthViewDayNumber':locale }} -
-
- - {{ group[1].length }} - -
-
- -
- - - - - - -
diff --git a/projects/demos/app/demo-modules/group-similar-events/component.ts b/projects/demos/app/demo-modules/group-similar-events/component.ts new file mode 100644 index 000000000..e907693f6 --- /dev/null +++ b/projects/demos/app/demo-modules/group-similar-events/component.ts @@ -0,0 +1,135 @@ +import { Component, ChangeDetectionStrategy, OnInit } from '@angular/core'; +import { + CalendarEvent, + CalendarMonthViewDay, + CalendarView +} from 'angular-calendar'; +import { colors } from '../demo-utils/colors'; +import { isSameMinute, startOfDay } from 'date-fns'; + +interface EventGroupMeta { + type: string; +} + +@Component({ + selector: 'mwl-demo-component', + changeDetection: ChangeDetectionStrategy.OnPush, + templateUrl: './template.html', + styles: [ + ` + .cell-totals { + margin: 5px; + text-align: center; + } + .badge { + margin-right: 5px; + } + ` + ] +}) +export class DemoComponent implements OnInit { + view: CalendarView = CalendarView.Month; + + viewDate: Date = new Date(); + + events: CalendarEvent[] = [ + { + title: 'Event 1', + color: colors.yellow, + start: startOfDay(new Date()), + meta: { + type: 'warning' + } + }, + { + title: 'Event 2', + color: colors.yellow, + start: startOfDay(new Date()), + meta: { + type: 'warning' + } + }, + { + title: 'Event 3', + color: colors.blue, + start: startOfDay(new Date()), + meta: { + type: 'info' + } + }, + { + title: 'Event 4', + color: colors.red, + start: startOfDay(new Date()), + meta: { + type: 'danger' + } + }, + { + title: 'Event 5', + color: colors.red, + start: startOfDay(new Date()), + meta: { + type: 'danger' + } + } + ]; + + groupedSimilarEvents: CalendarEvent[] = []; + + ngOnInit() { + // group any events together that have the same type and dates + // use for when you have a lot of events on the week or day view at the same time + this.groupedSimilarEvents = []; + const processedEvents = new Set(); + this.events.forEach(event => { + if (processedEvents.has(event)) { + return; + } + const similarEvents = this.events.filter(otherEvent => { + return ( + otherEvent !== event && + !processedEvents.has(otherEvent) && + isSameMinute(otherEvent.start, event.start) && + (isSameMinute(otherEvent.end, event.end) || + (!otherEvent.end && !event.end)) && + otherEvent.color.primary === event.color.primary && + otherEvent.color.secondary === event.color.secondary + ); + }); + processedEvents.add(event); + similarEvents.forEach(otherEvent => { + processedEvents.add(otherEvent); + }); + if (similarEvents.length > 0) { + this.groupedSimilarEvents.push({ + title: `${similarEvents.length + 1} events`, + color: event.color, + start: event.start, + end: event.end, + meta: { + groupedEvents: [event, ...similarEvents] + } + }); + } else { + this.groupedSimilarEvents.push(event); + } + }); + } + + beforeMonthViewRender({ + body + }: { + body: Array>; + }): void { + // month view has a different UX from the week and day view so we only really need to group by the type + body.forEach(cell => { + const groups = {}; + cell.events.forEach((event: CalendarEvent) => { + groups[event.meta.type] = groups[event.meta.type] || []; + groups[event.meta.type].push(event); + }); + cell['eventGroups'] = Object.entries(groups); + }); + } +} diff --git a/projects/demos/app/demo-modules/group-month-view-events/module.ts b/projects/demos/app/demo-modules/group-similar-events/module.ts similarity index 89% rename from projects/demos/app/demo-modules/group-month-view-events/module.ts rename to projects/demos/app/demo-modules/group-similar-events/module.ts index 2e487440e..efc9575df 100644 --- a/projects/demos/app/demo-modules/group-month-view-events/module.ts +++ b/projects/demos/app/demo-modules/group-similar-events/module.ts @@ -5,6 +5,7 @@ import { CalendarModule, DateAdapter } from 'angular-calendar'; import { DemoUtilsModule } from '../demo-utils/module'; import { DemoComponent } from './component'; import { adapterFactory } from 'angular-calendar/date-adapters/date-fns'; +import { NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap'; @NgModule({ imports: [ @@ -13,6 +14,7 @@ import { adapterFactory } from 'angular-calendar/date-adapters/date-fns'; provide: DateAdapter, useFactory: adapterFactory }), + NgbPopoverModule, DemoUtilsModule, RouterModule.forChild([{ path: '', component: DemoComponent }]) ], diff --git a/projects/demos/app/demo-modules/group-month-view-events/sources.ts b/projects/demos/app/demo-modules/group-similar-events/sources.ts similarity index 100% rename from projects/demos/app/demo-modules/group-month-view-events/sources.ts rename to projects/demos/app/demo-modules/group-similar-events/sources.ts diff --git a/projects/demos/app/demo-modules/group-similar-events/template.html b/projects/demos/app/demo-modules/group-similar-events/template.html new file mode 100644 index 000000000..062dc9095 --- /dev/null +++ b/projects/demos/app/demo-modules/group-similar-events/template.html @@ -0,0 +1,101 @@ + + + + +
+ {{ day.badgeTotal }} + {{ day.date | calendarDate:'monthViewDayNumber':locale }} +
+
+ + {{ group[1].length }} + +
+
+ + + +
+
+ + + &ngsp; + + +
+
+
+ +
+ + + + &ngsp; + + + +
+
+ +
+ + + + + + +