import { t } from "@lingui/macro"; import { css, CSSResult, customElement, html, LitElement, property, TemplateResult } from "lit-element"; import { EventsApi, Notification } from "authentik-api"; import { AKResponse } from "../../api/Client"; import { DEFAULT_CONFIG } from "../../api/Config"; import PFBase from "@patternfly/patternfly/patternfly-base.css"; import PFNotificationDrawer from "@patternfly/patternfly/components/NotificationDrawer/notification-drawer.css"; import PFDropdown from "@patternfly/patternfly/components/Dropdown/dropdown.css"; import PFButton from "@patternfly/patternfly/components/Button/button.css"; import AKGlobal from "../../authentik.css"; import PFContent from "@patternfly/patternfly/components/Content/content.css"; import { EVENT_NOTIFICATION_TOGGLE } from "../../constants"; import { ActionToLabel } from "../../pages/events/utils"; @customElement("ak-notification-drawer") export class NotificationDrawer extends LitElement { @property({attribute: false}) notifications?: AKResponse; @property({type: Number}) unread = 0; static get styles(): CSSResult[] { return [PFBase, PFButton, PFNotificationDrawer, PFContent, PFDropdown, AKGlobal].concat( css` .pf-c-notification-drawer__header { height: 114px; align-items: center; } .pf-c-notification-drawer__header-action, .pf-c-notification-drawer__header-action-close, .pf-c-notification-drawer__header-action-close > .pf-c-button.pf-m-plain { height: 100%; } .pf-c-notification-drawer__list-item-description { white-space: pre-wrap; } ` ); } firstUpdated(): void { new EventsApi(DEFAULT_CONFIG).eventsNotificationsList({ seen: false, ordering: "-created", }).then(r => { this.notifications = r; this.unread = r.results.length; }); } renderItem(item: Notification): TemplateResult { let level = ""; switch (item.severity) { case "notice": level = "pf-m-info"; break; case "warning": level = "pf-m-warning"; break; case "alert": level = "pf-m-danger"; break; default: break; } return html`
  • ${ActionToLabel(item.event?.action)}

    ${item.event && html` `}

    ${item.body}

    ${item.created?.toLocaleString()}
  • `; } render(): TemplateResult { if (!this.notifications) { return html``; } return html`

    ${t`Notifications`}

    ${t`${this.unread} unread`}
      ${this.notifications.results.map(n => this.renderItem(n))}
    `; } }