import { Component, Attributes } from "armature"; import { $html } from "ekma"; import * as moment from "moment"; import * as API from "./API"; import { DayEvent } from "./"; import Month from "./Month"; // The maximum number of events that are represented in indicators // This should be the highest number data-indicator can be const MAX_EVENT_REPRESENTED = 99; const template = (day: CalendarDay) => $html`
See events for ${ API.monthNumberToMoment(day.state.month) .date(day.state.date).format('dddd MMMM') }${ day.state.date.toString() }
`; interface State { month: number; date: number; events?: DayEvent[]; } @Attributes({ tag: "calendar-day", classes: ["current"], template }) export default class CalendarDay extends Component { parent: Month; constructor(state: State) { super(state); if (!this.state.events) { this.state.events = []; } } addEvent(event: DayEvent) { this.state.events.push(event); this.reify(); } getIndicator(count: number) { return Math.min(count, MAX_EVENT_REPRESENTED).toString(); } installed() { super.installed(); // Workaround for installed() not working with root click handlers if (this.element.getAttribute("data-arm-root-installed") == null) { this.element.setAttribute("data-arm-root-installed", ""); this.element.setAttribute("tabindex", "0"); this.element.setAttribute("aria-selected", "false"); this.element.addEventListener("click", () => { this.selectDay(); }); this.element.addEventListener("keydown", (e) => { if (e.keyCode === 13 || e.keyCode === 32) { this.selectDay(); this.highlightEvents(); } }); } const visibleEvents = this.state.events.filter(v => v.visible); if (visibleEvents.length > 0) { this.element.querySelector('.indicator').setAttribute("data-indicator", this.getIndicator(this.state.events.length)); } } selectDay() { this.parent.selectDay(this); this.element.setAttribute("aria-selected", "true"); const time = API.monthNumberToMoment(this.state.month) .date(this.state.date); } highlightEvents() { const eventsList = document.querySelectorAll("event-summary .events .event"); if (eventsList.length > 0) { const el : any = eventsList[0]; el.focus(); } } markSelected() { this.element.setAttribute("data-selected", ""); } markDeselected() { this.element.removeAttribute("data-selected"); } }