import { LitElementWw } from "@webwriter/lit"; import { html, TemplateResult } from "lit"; import { localized, msg } from "@lit/localize"; // @ts-ignore import LOCALIZE from "localization/generated"; import styles from "./options.styles"; import SlIcon from "@shoelace-style/shoelace/dist/components/icon/icon.component.js"; import SlTooltip from "@shoelace-style/shoelace/dist/components/tooltip/tooltip.component.js"; import SlSelect from "@shoelace-style/shoelace/dist/components/select/select.component.js"; import SlOption from "@shoelace-style/shoelace/dist/components/option/option.component.js"; import SlDivider from "@shoelace-style/shoelace/dist/components/divider/divider.component.js"; import SlCheckbox from "@shoelace-style/shoelace/dist/components/checkbox/checkbox.component.js"; import SlDetails from "@shoelace-style/shoelace/dist/components/details/details.component.js"; import SlSwitch from "@shoelace-style/shoelace/dist/components/switch/switch.component.js"; import { permissionGroups } from "utils/permissions"; import { property } from "lit/decorators.js"; import { PermissionsType } from "types"; import { SlChangeEvent } from "@shoelace-style/shoelace"; @localized() export class OptionsComponent extends LitElementWw { public static get scopedElements() { return { "sl-icon": SlIcon, "sl-tooltip": SlTooltip, "sl-select": SlSelect, "sl-option": SlOption, "sl-divider": SlDivider, "sl-checkbox": SlCheckbox, "sl-details": SlDetails, "sl-switch": SlSwitch, }; } static styles = styles; @property({ type: Object }) accessor permissions: PermissionsType = null!; private _setPermission( permissionGroup: string, permissionId: string, value: boolean | string[], ) { this.dispatchEvent( new CustomEvent("permission-change", { bubbles: true, composed: true, detail: { group: permissionGroup, id: permissionId, value: value, }, }), ); } protected renderPermissionGroup( group: ReturnType[0], ): TemplateResult { const groupPerms = this.permissions?.[group.id] as Record | undefined; return html`
${group.name}
${group.permissions.map((permission) => { if (permission.type === "checkbox") return html` this._setPermission( group.id, permission.id, !groupPerms?.[permission.id], )} > ${permission.name} `; if (permission.type === "multiselect") { return html` { const value = (e.target as SlSelect) .value as string[]; this._setPermission( group.id, permission.id, value, ); }} > ${permission.options?.map( (option) => html` ${option.name} `, )} `; } })}
`; } protected render(): TemplateResult { return html`

${msg("Permissions")}

${permissionGroups().map((group) => this.renderPermissionGroup(group), )} `; } }