{"version":3,"file":"components.3436f27380bd72386eb6.js","mappings":"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","sources":["webpack://ClientApp/./src/components/category-edit.ts","webpack://ClientApp/./src/components/category-item.ts","webpack://ClientApp/./src/components/category-list.ts","webpack://ClientApp/./src/components/close-button.ts","webpack://ClientApp/./src/components/confirmation-dialog.ts","webpack://ClientApp/./src/components/content-editor/ctx-content-button-group.ts","webpack://ClientApp/./src/components/content-editor/ctx-content-button.ts","webpack://ClientApp/./src/components/content-editor/ctx-content-editor-examples.ts","webpack://ClientApp/./src/components/content-editor/ctx-content-editor.ts","webpack://ClientApp/./src/components/content-editor/ctx-content-heading-select.ts","webpack://ClientApp/./src/components/content-editor/ctx-content-preview.ts","webpack://ClientApp/./src/components/content-editor/ctx-content-select-option.ts","webpack://ClientApp/./src/components/content-editor/ctx-content-select.ts","webpack://ClientApp/./src/components/content-editor/ctx-content-snippet-button.ts","webpack://ClientApp/./src/components/content-editor/ctx-content-snippets-select-option.ts","webpack://ClientApp/./src/components/content-editor/ctx-content-snippets-select.ts","webpack://ClientApp/./src/components/content-editor/ctx-content-textarea.ts","webpack://ClientApp/./src/components/content-editor/ctx-content-toolbar.ts","webpack://ClientApp/./src/components/content-editor/ctx-editor-content-event.ts","webpack://ClientApp/./src/components/content-editor/ctx-snippets.ts","webpack://ClientApp/./src/components/ctx-card.ts","webpack://ClientApp/./src/components/ctx-checkbox.ts","webpack://ClientApp/./src/components/ctx-hero.ts","webpack://ClientApp/./src/components/dca-select.ts","webpack://ClientApp/./src/components/dca-wizard.ts","webpack://ClientApp/./src/components/dialog-wrapper.ts","webpack://ClientApp/./src/components/display-select.ts","webpack://ClientApp/./src/components/embedded-powerbi-manager.ts","webpack://ClientApp/./src/components/embedded-powerbi-wrapper.ts","webpack://ClientApp/./src/components/feedback/feedback-manager.ts","webpack://ClientApp/./src/components/feedback/page-feedback.ts","webpack://ClientApp/./src/components/fluentComponentRegistration.ts","webpack://ClientApp/./src/components/form-input.ts","webpack://ClientApp/./src/components/group-user-item.ts","webpack://ClientApp/./src/components/info-details.ts","webpack://ClientApp/./src/components/input-select.ts","webpack://ClientApp/./src/components/download-bar.ts","webpack://ClientApp/./src/components/message-list.ts","webpack://ClientApp/./src/components/alert-message.ts","webpack://ClientApp/./src/components/message-manager.ts","webpack://ClientApp/./src/components/permission-changes.ts","webpack://ClientApp/./src/components/radio-button-list.ts","webpack://ClientApp/./src/components/report-news.ts","webpack://ClientApp/./src/components/router/router.ts","webpack://ClientApp/./src/components/router/routes.ts","webpack://ClientApp/./src/components/show-component-wrapper.ts","webpack://ClientApp/./src/components/side-panel.ts","webpack://ClientApp/./src/components/thalamus-card.ts","webpack://ClientApp/./src/components/thalamus-hero.ts","webpack://ClientApp/./src/components/thalamus-powerbi-report.ts","webpack://ClientApp/./src/components/youtube-element.ts","webpack://ClientApp/./src/components/youtube-card.ts"],"sourcesContent":["import { html, css, LitElement } from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\n\nimport { Dialog } from \"@material/mwc-dialog\";\nimport { TextField } from \"@material/mwc-textfield\";\nimport { Icon } from \"@material/mwc-icon\";\nimport { Button } from \"@material/mwc-button\";\nDialog; TextField; Icon; Button;\n\nexport interface CategoryEventDetail {\n description: string\n icon: string\n}\n\n@customElement('category-edit')\nexport class CategoryEdit extends LitElement {\n static styles = css`\n\n :root {\n --mdc-dialog-max-width :50vw\n }\n\n .dialog-content{\n display:flex;\n flex-direction:column; \n width: 80vw;\n max-width: 493px;\n row-gap: 2rem; \n }\n\n mwc-icon {\n --mdc-icon-size: 16px;\n }\n `;\n\n @property() heading: string;\n\n @property() description: string;\n\n @property() icon: string;\n\n show = () => this._dialog.show();\n\n @query(\"mwc-dialog\") private _dialog: Dialog;\n\n @query(\"mwc-textfield\") private _textField: TextField;\n\n @query(\"#iconName\") private _iconName: TextField;\n\n #iconChanged = (event: Event) => {\n this.requestUpdate();\n };\n\n #accepted = async (event: Event) => {\n this.dispatchEvent(new CustomEvent<CategoryEventDetail>(\"accepted\", { detail: { description: this._textField.value, icon: this._iconName.value } }));\n }\n\n #closed = (event: CustomEvent) => {\n let myEvent = new CustomEvent(event.type, {\n detail: event.detail,\n bubbles: true,\n composed: true\n });\n this.dispatchEvent(myEvent);\n }\n\n render() {\n return html`\n <mwc-dialog @closed=${this.#closed} heading=\"${this.heading}\">\n <div class=\"dialog-content\" >\n <mwc-textfield label=\"Name\" value=\"${this.description}\" required dialogInitialFocus ></mwc-textfield>\n <mwc-textfield\n id=\"iconName\"\n label=\"Icon\"\n value=\"${this.icon}\"\n @input=\"${this.#iconChanged}\"\n iconTrailing=\"${this._iconName?.value ?? this.icon}\" required>\n </mwc-textfield>\n <span>Help: <a href=\"https://fonts.google.com/icons?selected=Material+Icons\" target=\"_blank\" >Material icon list<mwc-icon>open_in_new<mwc-icon></a></span>\n </div>\n <mwc-button\n slot=\"primaryAction\"\n @click=\"${this.#accepted}\"\n dialogAction=\"accepted\">Save</mwc-button>\n <mwc-button slot=\"secondaryAction\" dialogAction=\"close\">Cancel</mwc-button>\n </mwc-dialog>\n `;\n }\n}\n","import { html, css, LitElement, nothing } from \"lit\";\nimport { customElement, property, query } from \"lit/decorators.js\";\nimport { Dialog } from \"@material/mwc-dialog\";\nimport { TextField } from \"@material/mwc-textfield\";\nimport { Icon } from \"@material/mwc-icon\";\nimport { LinearProgress } from \"@material/mwc-linear-progress\";\nimport { IconButton } from \"@material/mwc-icon-button\";\n\nTextField; Dialog; Icon; LinearProgress; IconButton;\n\nimport { updateCategory, deleteCategory } from \"./../services\";\nimport { CategoryEdit, CategoryEventDetail } from \"./category-edit\";\n\n@customElement(\"category-item\")\nexport class CategoryItem extends LitElement {\n static styles = css`\n :host([hidden]){\n display:none\n }\n\n mwc-linear-progress{\n zoom:0.5\n }\n\n mwc-icon-button\n {\n position: relative;\n top: -11px; \n right: 10px;\n }\n `;\n\n @property({ type: Number }) key: number;\n\n @property() description: string;\n\n @property() icon: string;\n\n @property({ type: Boolean }) deletable: boolean\n\n @property({ type: Boolean }) updating = false;\n\n\n @query(\"mwc-dialog\")\n private _dialog: Dialog;\n\n @query(\"category-edit\")\n private _categoryEdit: CategoryEdit;\n\n editCategory = (event: Event) => {\n this._dialog.show();\n };\n\n clickCategory = (event: CustomEvent) => {\n // todo we should reset changes here\n this._categoryEdit.show();\n };\n\n updateCategoryHandler = async (event: CustomEvent<CategoryEventDetail>) => {\n this.icon = event.detail.icon;\n this.description = event.detail.description\n this.updating = true;\n await updateCategory(this.key, this.description, this.icon);\n this.updating = false;\n };\n\n requestDeleteHandler = async (event: Event) => {\n event.cancelBubble = true;\n this.updating = true;\n await deleteCategory(this.key)\n this.updating = false;\n this.hidden = true;\n }\n\n render() {\n return html`\n <mwc-list-item @click=${this.clickCategory} graphic=\"icon\" hasMeta>\n <mwc-icon slot=\"graphic\">${this.icon}</mwc-icon>\n <span>${this.description}</span>\n <mwc-linear-progress ?closed=${!this.updating} indeterminate ></mwc-linear-progress>\n\n <!-- don't know why mwc-button stopped the parent ripple, but not not mwc-icon -->\n ${(this.deletable) ? html`<mwc-icon-button slot=\"meta\" @click=${this.requestDeleteHandler} icon=\"delete\"></mwc-icon-button>` : nothing}\n \n </mwc-list-item>\n <category-edit heading=\"Update Category\" description=${this.description} icon=${this.icon} @accepted=${this.updateCategoryHandler} ></category-edit>\n `;\n }\n}\n","import { html, css, LitElement, nothing } from \"lit\";\nimport { customElement, property, query } from \"lit/decorators.js\";\n\nimport \"./category-edit\";\nimport \"./category-item\";\n\nimport \"@material/mwc-list/mwc-list\";\nimport \"@material/mwc-list/mwc-list-item\";\nimport '@material/mwc-fab';\n\nimport { CategoryEdit, CategoryEventDetail } from \"./category-edit\";\n\nimport { createCategory } from \"./../services\";\n\ninterface CategoryDetail {\n description: string\n icon: string\n busy: boolean\n key?: number\n}\n\n@customElement(\"category-list\")\nexport class CategoryList extends LitElement {\n\n @query(\"category-edit\")\n private _newCategory: CategoryEdit;\n\n @property({ attribute: false })\n private categoryItems: CategoryDetail[] = [];\n\n createCategoryHandler = async (event: CustomEvent<CategoryEventDetail>) => {\n console.log(event.detail)\n const newItem: CategoryDetail = { ...event.detail, busy: true };\n this.categoryItems = [newItem, ...this.categoryItems];\n const response = await createCategory(event.detail.description, event.detail.icon);\n newItem.busy = false;\n newItem.key = response.key;\n this.requestUpdate();\n }\n\n displayCreateCategory = () => {\n this._newCategory.show();\n }\n\n render() {\n return html`\n <category-edit heading=\"Create Category\" @accepted=${this.createCategoryHandler}></category-edit> \n <mwc-fab extended mini icon=\"add\" label=\"Create Category\" @click=${this.displayCreateCategory}></mwc-fab>\n <mwc-list>\n ${this.categoryItems.map(cat => html`<category-item description=\"${cat.description}\" icon=\"${cat.icon}\" ?updating=${cat.busy} key=${cat.key} deletable >`)}\n <slot></slot>\n </mwc-list>\n `;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property } from 'lit/decorators.js'\nimport { CloseViewEvent } from 'src/events/close-view';\nimport { IconButton } from '@material/mwc-icon-button';\n\nIconButton;\n\n@customElement('close-button')\nexport class CloseButton extends LitElement {\n static styles = [\n css`\n :host {\n display: block;\n }\n `\n ];\n\n render() {\n return html`\n <mwc-icon-button icon=\"close\" @click=${()=> this.dispatchEvent(new CloseViewEvent())}></mwc-icon-button>\n `;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js'\nimport { CloseViewEvent } from 'src/events/close-view';\n\nimport { CloseButton } from './close-button';\nCloseButton;\nimport { Divider } from '@fluentui/web-components';\nimport { actionBarStyles } from 'src/styles/action-bar';\nDivider;\n\n@customElement('confirmation-dialog')\nexport class ConfirmationDialog extends LitElement {\n static styles = [actionBarStyles,\n css`\n :host {\n display: contents;\n }\n\n .dialog-inner {\n display:flex;\n flex-direction:column;\n }\n\n .dialog-header {\n text-decoration:underline\n }\n\n .dialog-footer {\n margin-top:1em;\n }\n \n `\n ];\n\n @property({ type: String }) heading: string;\n\n @property({ type: String, attribute:\"confirm-text\" }) confirmText: string;\n\n @query(\"#dialog\") dialog:HTMLDialogElement \n okHandler = (e:Event) =>{\n this.dispatchEvent(new ConfirmedEvent());\n this.dialog.close(); \n }\n\n openDialogHandler = (e:Event) =>{\n e.stopPropagation();\n e.preventDefault();\n this.dialog.showModal();\n }\n\n closeEventHandler = (e:CloseViewEvent) => { \n this.dialog.close(); \n e.stopPropagation(); \n e.preventDefault(); \n }\n\n\n render() {\n return html`\n <slot @click=${this.openDialogHandler}></slot>\n <dialog id=\"dialog\" @close-view=${this.closeEventHandler}>\n <div class=\"dialog-inner\">\n <div class=\"action-bar dialog-header\">\n <div> ${this.heading ?? \"Confirm\"}</div>\n <close-button class=\"right\"></close-button>\n </div>\n <slot name=\"dialog-content\">\n <div class=\"content\">\n Are You Sure?\n </div>\n </slot>\n \n <div class=\"action-bar dialog-footer\">\n <fluent-button class=\"push-right\" @click=${this.okHandler} appearance=\"accent\" >\n ${this.confirmText ??\"Ok\"}\n </fluent-button>\n <fluent-button @click=${this.closeEventHandler} autofocus >\n Cancel\n </fluent-button>\n </div>\n </div>\n \n </dialog>\n `;\n }\n}\nexport class ConfirmedEvent extends Event {\n static readonly eventName = 'confirmed';\n onDisconnect?: () => void;\n\n constructor() {\n super(ConfirmedEvent.eventName, {\n bubbles: true,\n composed: true,\n cancelable: false,\n });\n }\n}\n\ndeclare global {\n interface HTMLElementEventMap {\n [ConfirmedEvent.eventName]: ConfirmedEvent;\n }\n}","import { LitElement, html, css } from 'lit';\nimport { customElement } from 'lit/decorators.js'\n\n@customElement('ctx-content-button-group')\nexport class CtxContentButtonGroup extends LitElement {\n static styles = [\n css`\n .button-group {\n align-items: center;\n cursor: pointer;\n display: flex;\n gap: 0.125rem;\n min-height: 2.25rem;\n }\n `\n ];\n\n render() {\n return html`<div class=\"button-group\">\n <slot></slot>\n </div>`;\n }\n}","import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js'\nimport { SnippetInsertValue, SnippetWrapValue } from './ctx-snippet-types';\nimport { EditorContentEvent } from './ctx-editor-content-event';\nimport { EditorBehaviour } from './ctx-editor-types';\n\n@customElement('ctx-content-button')\nexport class CtxContentButton extends LitElement {\n static styles = [\n css`\n .button {\n align-items: center;\n background-color: #FFFFFF;\n border: 0.5px solid #d1d5db;\n cursor: pointer;\n display: flex;\n justify-content: center;\n min-height: 2.25rem;\n min-width: 2.25rem;\n padding-inline: 0.5rem;\n }\n\n .button:hover {\n color: #0069d9;\n }\n\n .flex {\n align-items: center;\n display: flex;\n gap: 0.25rem;\n }\n `\n ];\n\n @property() behaviour: EditorBehaviour = \"wrap\";\n @property() displayIcon: string;\n @property() displayText: string;\n @property() value: SnippetInsertValue | SnippetWrapValue;\n\n private _clicked = async () => {\n this.dispatchEvent(new EditorContentEvent({\n behaviour: this.behaviour,\n value: this.value\n }));\n }\n\n render() {\n return html`<div class=\"button\" @click=${this._clicked}>\n ${ this._renderDisplayContent() }\n </div>`;\n }\n\n private _renderDisplayContent() {\n return this.displayIcon || this.displayText ? html`<div class=\"flex\">${this._renderDisplayIcon()} ${this.displayText}</div>` : html`<slot></slot>`;\n }\n\n private _renderDisplayIcon() {\n return this.displayIcon ? html`<mwc-icon>${this.displayIcon}</mwc-icon>` : nothing;\n }\n}","const newlines = `\\n\\n`;\n\nexport const boldSnippet = `**An example of bold text**${newlines}`;\nexport const italicSnippet = `*An example of italic text*${newlines}`;\nexport const linkSnippet = `[An example of a link to Google](https://www.google.com/)${newlines}`;\n\n// Headings\nexport const heading1Snippet = `# Heading 1${newlines}`;\nexport const heading2Snippet = `## Heading 2${newlines}`;\nexport const heading3Snippet = `### Heading 3${newlines}`;\nexport const heading4Snippet = `#### Heading 4${newlines}`;\nexport const heading5Snippet = `##### Heading 5${newlines}`;\nexport const heading6Snippet = `###### Heading 6${newlines}`;\n\n// Lists\nexport const orderedListSnippet = `1. Item 1\n2. Item 2\n a. Item 2A\n b. Item 2B\n3. Item 3${newlines}`;\n\nexport const unOrderedListSnippet = `* Item 1\n* Item 2\n * Item 2A\n * Item 2B\n* Item 3${newlines}`;\n\n// Tables\nexport const tableSnippet = `|Heading 1|Heading 2|Heading 3|\n|---------|---------|---------|\n|Row 1, Column 1|Row 1, Column 2|Row 1, Column 3|\n|Row 2, Column 1|Row 2, Column 2|Row 2, Column 3|${newlines}`;\n\nexport const tableOfContentsSnippet = `## Table of Contents\n\n* [Section 1](#section-1)\n* [Section 2](#section-2)\n * [Section 1A](#section-1-a)\n * [Section 1B](#section-1-b)\n* [Section 3](#section-3)${newlines}`;\n\n\n// Components\nexport const heroSnippet = `\n\n<span>\n<ctx-hero \n title=\"An example hero component\" \n call-to-action=\"Read more\" \n call-to-action-url=\"/\" \n src=\"/images/DatacraftAnalytics-Icon-Final-RGB-twitter-min.png\">\n\n* Add your Description here.\n\n</ctx-hero>\n</span>\n${newlines}`;\nexport const informationMessageSnippet = `<alert-message level='information'>The information goes here</alert-message>${newlines}`;\nexport const warningMessageSnippet = `<alert-message level='warning'>The warning goes here</alert-message>${newlines}`;\nexport const errorMessageSnippet = `<alert-message level='error'>The error goes here</alert-message>${newlines}`;\n\nexport const reportNewsSnippet = `<report-news></report-news>`;\n\nexport const colleagueAuditSnippet = `<colleague-audit></colleague-audit>${newlines}`;\n\n// Documentation\nexport const documentationSnippet = `# An example of a document layout\n\n## Table of contents\n\n* [Creating a table of contents](#creating-a-table-of-contents)\n* [Creating headings](#creating-headings)\n* [Creating lists](#creating-lists)\n * [Creating an ordered list](#creating-an-ordered-list)\n * [Creating an unordered list](#creating-an-unordered-list)\n* [Creating tables](#creating-tables)\n* [Creating alerts](#creating-alerts)\n * [Creating information alerts](#creating-information-alerts)\n * [Creating warning alerts](#creating-warning-alerts)\n * [Creating error alerts](#creating-error-alerts)\n\n## Creating a table of contents\n\nA table of contents begins with a heading, followed by a list of sections. Each section must start with the '*' character, followed by a description enclosed in square brackets and the ID of the corresponding heading. The ID should start with the '#' character, followed by the exact wording of the heading, with spaces replaced by '-' characters.\n\n## Creating headings\n\nHeadings are created by placing the '#' character followed by a space at the beginning of the text. You can create headings from Level 1 to Level 6 by increasing the number of '#' characters; more '#' characters indicate a smaller heading.\n\n${ heading4Snippet }\n${ heading5Snippet }\n${ heading6Snippet }\n\n## Creating lists\n\nA list is a collection of items that can start with either a numerical value or the '*' character, depending on the type of list. Below are examples of how to create both ordered and unordered lists.\n\n### Creating an ordered list\n\n${ orderedListSnippet }\n\n### Creating an unordered list\n\n${ unOrderedListSnippet }\n\n\n## Creating tables\n\nTables are used to organise data into rows and columns. They are constructed by arranging headings, rows, and columns, with each element separated by the '|' character, as illustrated below.\n\n${ tableSnippet }\n\n## Creating alerts\n\nAlerts are components used to convey standard information or to notify users about warnings or errors. To display a specific type of alert, set the level property to either 'information', 'warning', or 'error'.\n\n### Creating information alerts\n\n${ informationMessageSnippet }\n\n### Creating warning alerts\n\n${ warningMessageSnippet }\n\n### Creating error alerts\n\n${ errorMessageSnippet }${newlines}`;","import { LitElement, html, css, nothing } from 'lit';\nimport { provide } from '@lit/context';\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js';\nimport { CtxContentTextArea } from './ctx-content-textarea';\nimport { EditorContentEvent } from './ctx-editor-content-event';\nimport { CtxContentPreview } from './ctx-content-preview';\nimport { editModeContext } from 'src/context/content-context';\nimport { subscriberKeyContext } from 'src/context/subscriber-context';\n\nexport type PreviewPosition = \"right\" | \"below\";\n\n@customElement('ctx-content-editor')\nexport class CtxContentEditor extends LitElement {\n static styles = [\n css`\n :host {\n position: relative;\n height: 100%;\n }\n\n .content-editor {\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n height: 100%;\n padding: 0;\n position: relative;\n }\n\n .preview {\n min-height: 200px;\n overflow-y: auto;\n position: relative;\n padding: 0.5rem;\n width: auto;\n }\n\n .preview-below {\n display: block;\n }\n\n .preview-right {\n display: grid;\n grid-template-columns: calc(50% - 4px) calc(50% - 4px); /* To account for the gap */\n gap: 8px;\n height: 100%;\n }\n\n .slot {\n width: 100%;\n padding: 0;\n }\n\n .textarea-and-preview {\n flex-grow: 1;\n height: 100%;\n }\n\n .top-slot {\n position: sticky;\n top: 0;\n z-index: 999;\n }\n `\n ];\n\n static formAssociated = true;\n\n @property({ type: Boolean }) readonly: boolean = false;\n @property({ type: Boolean }) showPreview: boolean = true;\n @property({ type: String }) previewPosition: string = \"bottom\";\n\n @provide({ context: subscriberKeyContext })\n @property({ type: Number, attribute: 'subscriber-key' }) subscriberKey?: number;\n\n @provide({ context: editModeContext }) editMode = true;\n\n @query(\"#text-area\") textArea: CtxContentTextArea;\n\n @state() private _preview: CtxContentPreview;\n\n @state() private _value: string = '';\n\n get value(): string {\n return this._value;\n }\n\n set value(newValue: string) {\n this._value = newValue;\n\n this._internals.setFormValue(newValue);\n this.requestUpdate();\n }\n\n private _internals: ElementInternals;\n\n private _handlePreviewSlotChange(e: Event) {\n const slot = e.target as HTMLSlotElement;\n const slottedElements = slot.assignedElements();\n \n slottedElements.forEach(element => {\n if (element instanceof HTMLElement && element.tagName.toLowerCase() === 'ctx-content-preview') {\n this._preview = element as CtxContentPreview;\n this._preview.scrollToCursor = this.previewPosition !== \"bottom\";\n this._setPreviewValueAndCursorPosition(this.value);\n }\n });\n }\n\n private _handleContentFromToolbar = async (event: EditorContentEvent) => {\n this.textArea.handleContentChange(event.content);\n }\n\n private _setPreviewValueAndCursorPosition(value: string, cursorPosition: number = 0) {\n if (this._preview) {\n this._preview.cursorPosition = cursorPosition;\n this._preview.value = value;\n }\n }\n\n private _textAreaContentChanged = async (event: CustomEvent<{cursorPosition:number, content:string}>) => {\n var content = event.detail.content;\n this._internals.setFormValue(content);\n this._setPreviewValueAndCursorPosition(content, event.detail.cursorPosition);\n }\n\n constructor() {\n super();\n this._internals = this.attachInternals();\n this.addEventListener('handle-editor-content', this._handleContentFromToolbar);\n }\n\n connectedCallback() {\n super.connectedCallback();\n if (this.hasAttribute('value')) {\n this.value = this.getAttribute('value') || '';\n }\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n document.removeEventListener('handle-editor-content', this._handleContentFromToolbar);\n }\n\n render() {\n return html`<div class=\"content-editor\">\n <div class=\"top-slot\">\n <slot name=\"top\"></slot>\n </div>\n <div class=\"textarea-and-preview\">\n ${this._renderTextAreaAndPreviewSlot()}\n </div>\n </div>`;\n }\n\n private _renderBottomSlot() {\n return html`<slot name=\"bottom\" class=\"slot\"></slot>`;\n }\n\n private _renderTextArea() {\n return html`<ctx-content-textarea id=\"text-area\" value=${this.value} @content-changed=${this._textAreaContentChanged}></ctx-content-textarea>`; \n }\n\n private _renderTextAreaAndPreviewSlot() {\n const classes = { 'preview-below': this.previewPosition === 'below', 'preview-right': this.previewPosition === 'right' };\n return html`<div class=${classMap(classes)}>\n <div>\n ${ this._renderTextArea() }\n ${ this._renderBottomSlot() }\n </div>\n ${ this._renderPreviewSlot() }\n </div>`;\n }\n\n private _renderPreviewSlot() {\n return this.showPreview ? html`<div class=\"preview\">\n <slot @slotchange=${this._handlePreviewSlotChange}></slot>\n </div>` : nothing;\n }\n}","import { LitElement, html, css } from 'lit';\nimport { customElement } from 'lit/decorators.js'\nimport { heading1Snippet, heading2Snippet, heading3Snippet, heading4Snippet, heading5Snippet, heading6Snippet } from './ctx-content-editor-examples';\n\n@customElement('ctx-content-heading-select')\nexport class CtxContentHeadingSelect extends LitElement {\n static styles = [\n css`\n .heading-1 {\n font-size: 20px;\n }\n\n .heading-2 {\n font-size: 19px;\n }\n\n .heading-3 {\n font-size: 18px;\n }\n\n .heading-4 {\n font-size: 17px;\n }\n\n .heading-5 {\n font-size: 16px;\n }\n\n .heading-6 {\n font-size: 15px;\n }\n `\n ];\n\n render() {\n return html`<ctx-content-select headingIcon=\"short_text\" heading=\"Headings\">\n <ctx-content-select-option value=${ heading1Snippet }>\n <div class=\"heading-1\">\n Heading 1\n </div>\n </ctx-content-select-option>\n <ctx-content-select-option value=${ heading2Snippet }>\n <div class=\"heading-2\">\n Heading 2\n </div>\n </ctx-content-select-option>\n <ctx-content-select-option value=${ heading3Snippet }>\n <div class=\"heading-3\">\n Heading 3\n </div>\n </ctx-content-select-option>\n <ctx-content-select-option value=${ heading4Snippet }>\n <div class=\"heading-4\">\n Heading 4\n </div>\n </ctx-content-select-option>\n <ctx-content-select-option value=${ heading5Snippet }>\n <div class=\"heading-5\">\n Heading 5\n </div>\n </ctx-content-select-option>\n <ctx-content-select-option value=${ heading6Snippet }>\n <div class=\"heading-6\">\n Heading 6\n </div>\n </ctx-content-select-option>\n </ctx-content-select>`;\n }\n}","import { LitElement, html } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { Task } from '@lit/task';\nimport { services } from \"src/services\";\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport { raiseFetchResponseError } from 'src/modules/helpers/response-helpers';\n\n@customElement('ctx-content-preview')\nexport class CtxContentPreview extends LitElement {\n createRenderRoot() {\n return this;\n }\n\n @property({ type: Boolean }) grow: boolean = false;\n @property({ type: Boolean }) scrollToCursor: boolean = true;\n @property({ type: Number }) cursorPosition: number;\n\n @state() private _value: string = \"\";\n @state() htmlContent: string = \"\";\n\n get value(): string {\n return this._value;\n }\n\n set value(newValue: string) {\n this._value = newValue;\n this.requestUpdate();\n }\n\n private _markdownPreviewTask: Task = new Task(this, {\n task: async ([value], { signal }) => {\n var response = await services.management.markdown.preview(value).catch(raiseFetchResponseError);\n if(signal.aborted)\n {\n return this._value;\n }\n this.htmlContent = response.markup;\n return response.markup;\n },\n args: () => [this._value],\n });\n\n private _scrollToCursor() {\n if (this.scrollToCursor) {\n const bottomOffset = 100; // We want to check if the cursor is within the last 100 characters.\n const contentLength = this.value.length;\n let bottomPosition = contentLength <= bottomOffset ? contentLength : contentLength - bottomOffset;\n\n // If the cursor position is withing the last 100 characters of the content, add a scroll marker.\n if (this.cursorPosition > bottomPosition) {\n this.scrollIntoView({ behavior: 'smooth', block: 'end' });\n }\n }\n }\n\n // This component is rendered using the light DOM to ensure the markdown being previewed renders as expected.\n // So styles are added to the render method to get it applied.\n render() {\n return html`\n <style>\n .ctx-content-preview {\n position: relative;\n max-height: 200px;\n }\n </style>\n ${ this.grow ? this._renderPerview() : html`<div class=\"ctx-content-preview\"> ${ this._renderPerview() }</div>` }`;\n }\n\n private _renderPerview() {\n return html`${this._markdownPreviewTask.render({\n initial: () => html``,\n pending: () => unsafeHTML(this.htmlContent),\n complete: () => html`${unsafeHTML(this.htmlContent)}${this._scrollToCursor()}`,\n error: (error) => html`<p>Oops, something went wrong: ${error}</p>`,\n })}`;\n }\n}","import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js'\nimport { SnippetInsertValue, SnippetWrapValue } from './ctx-snippet-types';\nimport { EditorContentEvent } from './ctx-editor-content-event';\n\n@customElement('ctx-content-select-option')\nexport class CtxContentSelectOption extends LitElement {\n static styles = [\n css`\n .flex {\n align-items: center;\n display: flex;\n gap: 0.25rem;\n }\n\n .option {\n cursor: pointer;\n }\n\n .option:hover {\n background-color: #f3f4f6;\n } \n `\n ];\n\n @property() displayIcon: string;\n @property() displayText: string;\n @property() value: string | SnippetInsertValue | SnippetWrapValue;\n\n private _selected = async () => {\n this.dispatchEvent(new EditorContentEvent({\n behaviour: \"insert\",\n value: this.value\n }));\n\n\n this.dispatchEvent(new CustomEvent(\"option-selected\", { detail: {\n value: this.value\n }, bubbles: true, composed: true }));\n }\n\n render() {\n return html`<div class=\"option\">\n ${this._renderDisplayContent()}\n </div>`;\n }\n\n private _renderDisplayContent() {\n return this.displayIcon || this.displayText ? html`<div class=\"flex\" @click=${this._selected}>${this._renderDisplayIcon()} ${this.displayText}</div>` : html`<slot @click=${this._selected}></slot>`;\n }\n\n private _renderDisplayIcon() {\n return this.displayIcon ? html`<mwc-icon>${this.displayIcon}</mwc-icon>` : nothing;\n }\n}","import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js'\n\n@customElement('ctx-content-select')\nexport class CtxContentSelect extends LitElement {\n static styles = [\n css`\n .flex {\n align-items: center;\n display: flex;\n gap: 0.25rem;\n }\n\n .heading {\n flex-grow: 1;\n }\n\n .options {\n background-color: #FFFFFF;\n border: 0.5px solid #d1d5db;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n margin-top: 0.25rem;\n min-width: 11rem;\n padding-block: 0.25rem;\n padding-inline: 0.5rem;\n position: absolute;\n user-select: none;\n z-index: 999;\n }\n\n .select {\n align-items: center;\n background-color: #FFFFFF;\n border: 0.5px solid #d1d5db;\n cursor: pointer;\n display: flex;\n min-height: 1.75rem;\n min-width: 11rem;\n padding-block: 0.25rem;\n padding-inline: 0.5rem;\n user-select: none;\n }\n\n .select-container {\n position: relative;\n }\n `\n ];\n\n @property() heading: string;\n @property() headingIcon: string;\n\n @state() showOptions: boolean = false;\n\n private _boundHandleOutsideClick: (event: MouseEvent) => void;\n\n private _handleOutsideClick(event: MouseEvent) {\n if (!this.showOptions) return; // Don't do anything if options are already hidden\n\n const path = event.composedPath();\n if (!path.includes(this)) {\n this.showOptions = false;\n this.requestUpdate();\n }\n }\n\n private _optionSelected = async (event: CustomEvent) => {\n this._toggleShowOptions();\n }\n\n private _toggleShowOptions() {\n this.showOptions = !this.showOptions;\n }\n\n constructor() {\n super();\n this.addEventListener('option-selected', this._optionSelected);\n this._boundHandleOutsideClick = this._handleOutsideClick.bind(this);\n }\n\n connectedCallback() {\n super.connectedCallback();\n document.addEventListener('click', this._boundHandleOutsideClick);\n }\n\n disconnectedCallback() {\n document.removeEventListener('click', this._boundHandleOutsideClick);\n super.disconnectedCallback();\n }\n\n render() {\n return html`<div class=\"select-container\" @click=${(e: Event) => e.stopPropagation()}>\n <div class=\"select\" @click=${this._toggleShowOptions}> \n ${this._renderHeading()}\n ${this._renderIcon()}\n </div>\n ${this._renderOptions()}\n </div>`;\n }\n\n private _renderHeading() {\n return html`<div class=\"heading\">\n ${this.headingIcon || this.heading ? html`<div class=\"flex\">${this._renderHeadingIcon()} ${this.heading}</div>` : html`<slot name=\"heading\">${this.heading}</slot>`}\n </div>`;\n }\n\n private _renderHeadingIcon() {\n return this.headingIcon ? html`<mwc-icon>${this.headingIcon}</mwc-icon>` : nothing;\n }\n\n private _renderIcon() {\n return !this.showOptions ? html`<mwc-icon>keyboard_arrow_right</mwc-icon>` : html`<mwc-icon>keyboard_arrow_down</mwc-icon>`;\n }\n\n private _renderOptions() {\n return this.showOptions ? html`<slot class=\"options\"></slot>` : nothing;\n }\n}","import { LitElement, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js'\nimport { SnippetKeys } from './ctx-snippet-types';\nimport { snippets } from './ctx-snippets';\nimport { EditorBehaviour } from './ctx-editor-types';\n\n@customElement('ctx-content-snippet-button')\nexport class CtxContentSnippetButton extends LitElement {\n @property() snippet: SnippetKeys;\n @property() behaviour: EditorBehaviour = \"wrap\";\n\n render() {\n var currentSnippet = snippets[this.snippet];\n return html`<ctx-content-button displayIcon=${ currentSnippet.icon } .value=${ currentSnippet[this.behaviour] } behaviour=${ this.behaviour }></ctx-content-button>`;\n }\n}","import { LitElement, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js'\nimport { snippets } from './ctx-snippets';\nimport { SnippetKeys } from './ctx-snippet-types';\n\n@customElement('ctx-content-snippets-select-option')\nexport class CtxContentSnippetsSelectOption extends LitElement {\n @property() snippet: SnippetKeys;\n\n render() {\n var currentSnippet = snippets[this.snippet];\n return html`<ctx-content-select-option displayIcon=${ currentSnippet.icon } displayText=${ currentSnippet.description } .value=${ currentSnippet.insert }></ctx-content-select-option>`;\n }\n}","import { LitElement, html } from 'lit';\nimport { customElement } from 'lit/decorators.js'\n\n@customElement('ctx-content-snippets-select')\nexport class CtxContentSnippetsSelect extends LitElement {\n render() {\n return html`<ctx-content-select headingIcon=\"code\" heading=\"Snippets\">\n <slot></slot>\n </ctx-content-select>`;\n }\n}","import { LitElement, html, css } from 'lit';\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { EditorContent } from './ctx-editor-content-event';\nimport { SnippetInsertValue, SnippetWrapValue } from './ctx-snippet-types';\n\n@customElement('ctx-content-textarea')\nexport class CtxContentTextArea extends LitElement {\n static styles = [\n css`\n textarea {\n border: 0.5px solid #d1d5db;\n box-sizing: border-box;\n height: 100%;\n max-height: 100%;\n min-height: 200px;\n overflow-y: auto;\n padding: 0.5rem;\n width: 100%;\n }\n `\n ];\n\n @query(\"#editor\") editor: HTMLTextAreaElement;\n\n @property({ type: Boolean }) readonly: boolean = false;\n\n @property({attribute:\"value\"}) private initialValue: string = '';\n\n handleContentChange(content: EditorContent) {\n if (content.behaviour === \"insert\") {\n this._insertContent(content.value as SnippetInsertValue);\n }\n\n if (content.behaviour === \"wrap\") {\n this._wrapSelectedContent(content.value as SnippetWrapValue);\n }\n }\n\n private _contentChanged = async (event: InputEvent) => {\n this.#raiseContentChanged();\n }\n\n #raiseContentChanged = () => {\n this.dispatchEvent(new CustomEvent(\"content-changed\", { detail: {\n content: this.editor.value,\n cursorPosition: this.editor.selectionStart\n }, bubbles:true, composed:true }));\n }\n\n private _insertContent(content: string | SnippetInsertValue) {\n var contentToInsert = typeof content === 'string' ? content : content.snippet; \n this.editor.setRangeText(contentToInsert, this.editor.selectionStart, this.editor.selectionEnd, \"preserve\");\n this.editor.setSelectionRange(this.editor.selectionStart, this.editor.selectionStart + contentToInsert.length)\n this.editor.focus();\n this.#raiseContentChanged();\n }\n\n\n private _wrapSelectedContent(value: SnippetWrapValue) {\n const start = this.editor.selectionStart;\n const end = this.editor.selectionEnd;\n\n const selectedContent = this.editor.value.slice(start, end);\n const wrappedContent = `${value.pre}${selectedContent}${value.post}`;\n\n this.editor.setRangeText(wrappedContent, start, end, \"preserve\");\n this.#raiseContentChanged();\n }\n\n render() {\n return html`<textarea ?readonly=${this.readonly} id=\"editor\" class=\"component\" @input=${this._contentChanged}>${this.initialValue}</textarea>`;\n }\n}","import { LitElement, html, css } from 'lit';\nimport { customElement } from 'lit/decorators.js'\nimport { EditorContentEvent } from './ctx-editor-content-event';\n\n@customElement('ctx-content-toolbar')\nexport class CtxContentToolbar extends LitElement {\n static styles = [\n css`\n .grow {\n align-items: center;\n display: flex;\n flex-grow: 1;\n justify-content: right;\n }\n\n .help-icon {\n color: #111827;\n }\n\n .help-icon:hover {\n cursor: pointer;\n color: #0069d9;\n }\n\n .help-icon-container {\n padding-top: 0.5rem;\n }\n\n select {\n border: 0.5px solid #d1d5db;\n padding: 0.250rem;\n }\n\n .toolbar {\n align-items: center;\n background-color: #f9fafb;\n border: 0.5px solid #d1d5db;\n box-sizing: border-box;\n display: flex;\n gap: 0.5rem;\n margin-bottom: 0.250rem;\n padding: 0.5rem;\n width: 100%;\n }\n `\n ];\n\n private _selectedToolbarContentChanged = async (event: CustomEvent) => {\n this.dispatchEvent(new EditorContentEvent(event.detail.value))\n }\n\n constructor() {\n super();\n this.addEventListener('selected-content-changed', this._selectedToolbarContentChanged);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener('selected-content-changed', this._selectedToolbarContentChanged);\n }\n\n render() {\n return html`<div class=\"toolbar\">\n <slot></slot>\n ${this._renderRightSlot()}\n </div>`;\n }\n\n private _renderHelpIcon() {\n return html`<div class=\"help-icon-container\">\n <a href=\"https://www.markdownguide.org/basic-syntax/\" target=\"_blank\">\n <mwc-icon class=\"help-icon\">help</mwc-icon>\n </a>\n </div>`;\n }\n\n private _renderRightSlot() {\n return html`<div class=\"grow\">\n <slot name=\"right\"></slot>\n ${ this._renderHelpIcon() }\n </div>`;\n }\n}","import { EditorBehaviour } from \"./ctx-editor-types\";\nimport { SnippetInsertValue, SnippetWrapValue } from \"./ctx-snippet-types\";\n\nexport type EditorContent = {\n behaviour: EditorBehaviour, \n value: string | SnippetInsertValue | SnippetWrapValue\n}\n\nexport class EditorContentEvent extends Event {\n static readonly eventName = 'handle-editor-content';\n onDisconnect?: () => void;\n \n public readonly content:EditorContent;\n constructor(content:EditorContent) {\n super(EditorContentEvent.eventName, {\n bubbles: true,\n composed: true,\n cancelable: false,\n });\n this.content = content;\n }\n }\n \n declare global {\n interface HTMLElementEventMap {\n [EditorContentEvent.eventName]: EditorContentEvent;\n }\n }","import { boldSnippet, colleagueAuditSnippet, documentationSnippet, errorMessageSnippet, heroSnippet, informationMessageSnippet, italicSnippet, linkSnippet, orderedListSnippet, reportNewsSnippet, tableOfContentsSnippet, unOrderedListSnippet, warningMessageSnippet } from \"./ctx-content-editor-examples\";\nimport { SnippetCollection } from \"./ctx-snippet-types\";\n\nexport const snippets: SnippetCollection = {\n bold: {\n icon: 'format_bold',\n description: 'Bold',\n insert: {\n snippet: boldSnippet\n },\n wrap: {\n pre: '**',\n post: '**'\n }\n },\n documentLayout: {\n icon: 'dashboard',\n description: 'Document Layout',\n insert: {\n snippet: documentationSnippet\n }\n },\n errorAlert: {\n icon: 'cancel',\n description: 'Error Message',\n insert: {\n snippet: errorMessageSnippet\n }\n },\n hero: {\n icon: 'filter',\n description: 'Hero',\n insert: {\n snippet: heroSnippet\n }\n },\n infoAlert: {\n icon: 'info',\n description: 'Info Message',\n insert: {\n snippet: informationMessageSnippet\n }\n },\n italic: {\n icon: 'format_italic',\n description: 'Italic',\n insert: {\n snippet: italicSnippet\n },\n wrap: {\n pre: '*',\n post: '*'\n }\n },\n link: {\n icon: 'link',\n description: 'Link',\n insert: {\n snippet: linkSnippet\n }\n },\n orderedList: {\n icon: 'format_list_numbered',\n description: 'Ordered List',\n insert: {\n snippet: orderedListSnippet\n }\n },\n tableOfContents: {\n icon: 'format_list_bulleted',\n description: 'Table of Contents',\n insert: {\n snippet: tableOfContentsSnippet\n }\n },\n unorderedList: {\n icon: 'format_list_bulleted',\n description: 'Unordered List',\n insert: {\n snippet: unOrderedListSnippet\n }\n },\n warningAlert: {\n icon: 'warning',\n description: 'Warning Message',\n insert: {\n snippet: warningMessageSnippet\n }\n },\n reportNews: {\n icon: 'newspaper', \n description: 'Report News',\n insert: {\n snippet: reportNewsSnippet\n }\n },\n colleagueAudit: {\n icon: 'checklist', \n description: 'Colleague Audit',\n insert: {\n snippet: colleagueAuditSnippet\n }\n }\n}","import {css, html, LitElement, nothing} from \"lit\";\nimport {customElement, property} from \"lit/decorators.js\";\nimport \"@material/mwc-icon\"\n\n@customElement('ctx-card')\nexport class CtxCard extends LitElement {\n static styles = css`\n :host {\n box-sizing: border-box;\n display: block;\n\n border: 0 solid rgba(0, 0, 0, .125);\n border-radius: 0.25rem;\n\n background-color: var(--card-background-color);\n box-shadow: var(--card-box-shadow);\n }\n\n .body {\n padding: 1.25rem;\n }\n\n header {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n\n font-weight: 500;\n line-height: 1.2;\n font-size: 1.25rem;\n align-items: center;\n gap: 1em;\n }\n\n hr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n border: 0;\n border-top: 1px solid rgba(0, 0, 0, .1);\n }\n `;\n\n @property() heading: string;\n @property() icon: string;\n @property({type: Boolean}) underline: boolean;\n\n render() {\n return html`\n <slot name=\"media\"></slot>\n <div class=\"body\">\n <header>\n <div>\n ${this.heading}\n </div>\n <slot name=\"header-content\"></slot>\n <mwc-icon>\n ${this.icon}\n </mwc-icon>\n </header>\n ${this.underline ? html`\n <hr/>` : nothing}\n <slot></slot>\n </div>\n `\n }\n}","import { LitElement, html, css } from 'lit';\nimport { customElement } from 'lit/decorators.js'\nimport { choose } from 'lit/directives/choose.js';\n\ntype CheckboxState = boolean | null;\n@customElement('ctx-checkbox')\nexport class CtxCheckbox extends LitElement {\n static styles = [\n css`\n :host {\n display: inline-block;\n }\n\n .checkbox-container {\n display: flex;\n align-items: center;\n cursor: pointer;\n user-select: none; /* Prevents text selection */\n }\n\n .checkbox {\n width: 20px;\n height: 20px;\n border: 0.5px solid var(--checkbox-border-color, #4b5563);\n border-radius: 2px;\n margin-right: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s;\n }\n\n .icon {\n font-size: 16px;\n color: var(--icon-color, #4b5563);\n }\n `\n ];\n\n static formAssociated = true;\n\n private _internals: ElementInternals;\n private _value: CheckboxState = null;\n\n get value(): CheckboxState {\n return this._value;\n }\n\n set value(newValue: CheckboxState) {\n this._value = newValue;\n this._internals.setFormValue(newValue?.toString());\n this._dispatchChangeEvent(newValue);\n this.requestUpdate();\n }\n\n constructor() {\n super();\n this._internals = this.attachInternals();\n }\n\n connectedCallback() {\n super.connectedCallback();\n this.setAttribute('role', 'checkbox');\n this._setValue();\n }\n\n private _dispatchChangeEvent(value: CheckboxState) {\n this.dispatchEvent(new CustomEvent('change', {\n detail: { value },\n bubbles: true,\n composed: true\n }));\n }\n\n private _setValue() {\n if (this.hasAttribute('value')) {\n const attrValue = this.getAttribute('value').toLowerCase();\n if (attrValue === 'true') {\n this.value = true;\n } else if (attrValue === 'false') {\n this.value = false;\n } else {\n this.value = null;\n }\n }\n }\n \n private _toggleState() {\n if (this.value === null) {\n this.value = true;\n } else if (this.value === true) {\n this.value = false;\n } else {\n this.value = null;\n }\n }\n\n render() {\n return html`<div class=\"checkbox-container\" @click=${ this._toggleState }>\n <div class=\"checkbox\">\n ${ this.renderIcon() }\n </div>\n ${ this.renderStateContentSlot() }\n </div>`;\n }\n\n renderIcon() {\n return html`\n ${choose(this.value, [\n [true, () => html`<mwc-icon class=\"icon\">check</mwc-icon>`],\n [false, () => html`<mwc-icon class=\"icon\">close</mwc-icon>`]\n ],\n () => html``)}\n `;\n }\n\n renderStateContentSlot() {\n const slotName = this.value === null ? 'not-set' : this.value === true ? 'on' : 'off';\n return html`<slot name=${ slotName }></slot>`;\n }\n}\n\n","import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js'\n\n@customElement('ctx-hero')\nexport class CtxHero extends LitElement {\n static styles = [\n css`\n :host {\n display: block;\n \n /* padding: 1em;*/\n\n /*background-color:#dbeeff;*/\n box-shadow:0px 10px 25px -10px rgba(0,0,0,0.52);\n\n \n padding: clamp(1em, 5%, 6em);\n }\n\n :host([short]){\n padding-block: 0;\n }\n\n .grid{\n display:grid;\n grid-template-columns:1fr 1fr;\n gap:1em;\n }\n\n .left {\n display:flex;\n flex-direction: column;\n justify-content: space-evenly;\n gap:0.8em;\n }\n\n .title {\n font-size:2em;\n font-weight:700;\n }\n\n .cta{\n \n }\n .cta fluent-button {\n border-radius:0;\n --control-corner-radius:0;\n /*box-shadow: 5px 10px;*/\n box-shadow:0px 10px 25px -10px rgba(0,0,0,0.52);\n }\n\n img{\n display: block;\n width: 100%; /* or any custom size */\n /*height: 100%; \n object-fit: contain;*/\n }\n\n .image{\n align-self: center;\n justify-self: center;\n }\n\n a {\n //just to make it hidden\n display:contents\n }\n `\n ];\n\n@property({ type: String }) title: string;\n@property({ type: String }) description: string;\n@property({ type: String, attribute:\"call-to-action\" }) callToAction: string;\n@property({ type: String, attribute:\"call-to-action-url\" }) callToActionUrl: string;\n@property({ type: String, attribute:\"src\" }) src: string;\n\n@property({ type: Boolean, attribute:\"short\" }) short:boolean=false;\n\n render() {\n return html`\n \n <div class=\"grid\">\n <div class=\"left\">\n <div class=\"title\">${this.title}</div>\n <div class=\"description\">\n <slot name=\"description\">\n <slot>\n ${this.description}\n </slot>\n </slot>\n </div>\n <slot name=\"cta\">\n ${this.callToActionUrl != null ? html`\n <div class=\"cta\">\n <a href=\"${this.callToActionUrl}\" >\n <fluent-button type=\"button\" appearance=\"outline\">${this.callToAction}</fluent-button>\n </a>\n </div>\n `:nothing} \n </slot>\n </div>\n \n <div class=\"image\">\n <slot name=\"image\">\n <img src=${this.src}>\n </slot>\n </div>\n\n </div>\n \n \n `;\n }\n}\n\n","import { css, html, LitElement } from \"lit\";\nimport { customElement, property, query, state } from \"lit/decorators.js\";\n\n/*\n\nhttps://css-tricks.com/creating-custom-form-controls-with-elementinternals/\n\ntodo\n provider improved standard styles\n better documentation\ntodo low\n support <option data-value value>sub heading</option>\n obsolete input-select\n*/\n\n\n@customElement(\"dca-select\")\nexport class DcaSelect extends LitElement {\n\n static styles = css`\n :host{\n display: inline-flex;\n }\n \n :host([hidden]){\n display:none;\n }\n\n input {\n box-sizing:border-box;\n flex-grow:1\n }\n `;\n\n @property({ type: Boolean }) required: boolean = false;\n @property({ type: Boolean }) autofocus: boolean = false;\n @property() placeholder: string;\n\n @query(\"input\")\n private _input: HTMLInputElement;\n\n static formAssociated = true;\n\n //https://github.com/microsoft/TypeScript/issues/33218\n internals?: any;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n super.connectedCallback()\n }\n\n protected _options(): HTMLOptionElement[] {\n return Array.from(this.querySelectorAll(\"option\"));\n }\n\n firstUpdated(value: any) {\n this.internals = (this as any).attachInternals();;\n\n /** Make sure validations are set up */\n /** This ensures our element always participates in the form */\n this._manageRequired();\n }\n\n _onInput(event: Event) {\n this._manageRequired();\n }\n\n protected _manageRequired() {\n var match = this._findOptionMatch(this._input.value)\n this.internals.setFormValue(match?.value);\n if (match == null && this.required) {\n this.internals.setValidity({\n valueMissing: true\n }, 'This field is required', this._input);\n\n } else {\n this.internals.setValidity({});\n }\n }\n\n protected _findOptionMatch(value: string): HTMLOptionElement {\n // potentially have more ways to match if there are more ways to set data\n // e.g <option data-value value>extra info</option>\n return this._options().find(option => option.innerText === value);\n }\n\n render() {\n return html`\n <input id=\"input\" list=\"selectList\" part=\"input\" ?autofocus=${this.autofocus} placeholder=${this.placeholder} required autocomplete=\"off\" @input=\"${this._onInput}\" >\n <datalist id=\"selectList\">\n ${this._options().map(option => html`<option data-value=${option.value} value=\"${option.text}\"></option>`)}\n </datalist>\n `;\n }\n}","import { html, css, LitElement } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport '@material/mwc-button';\nimport '@material/mwc-textfield';\n\n/*\n [] remove step-id,activeStep no need at the moment\n [] add cancel or swap previous to cancel, or only show if cancel function as implementation\n [] next button spin while progressing\n [] consider better event naming (show, checkValidity, displayValidity, complete)\n [] avoid RequestUpdate by integrating component\n\n [] is the a way to avoid/ignore nullable (e.g in final step everything will be set, why should i go x.y?.z?.value)\n \n\n [] support host:hidden {display:none}\n [] show step progress\n [] we might need a concept of Summary step, which shows the result of the Complete Step(or Summary and Conclusion step)\n\n [] how do i split the ui so can have any presentation but the same logic\n [] support adding steps dynamically\n [] reset/start \n [] think about step reuse (e.g select-category-step) would either have to bind to parent or onprogress( wizard.cat = currentStep.cat )\n [] add checkValidity(wizardStep) on dca-wizard \n [] consider auto-progress for steps that only have one option\n\nQuestions\n[] in _getSteps, why does \n this.shadowRoot.querySelector('slot').assignedNodes({flatten: true})[0];\n not work for finding DcaWizardStep[]. the current method may be descendent nodes, and we only want child\n\n\n*/\n\n@customElement(\"dca-wizard\")\nexport class DcaWizard extends LitElement {\n\n @property({ type: String, attribute: \"complete-label\" }) CompleteLabel: string = \"Complete\";\n @state() activeStep: number = 0;\n @state() canNavigatePrevious: boolean = false;\n @state() private _isLastStep: boolean;\n\n constructor() {\n super();\n }\n\n protected _getSteps(): NodeListOf<DcaWizardStep> {\n return this.querySelectorAll(\"dca-wizard-step\");\n }\n\n protected get Steps(): DcaWizardStep[] { return Array.from(this._getSteps()) }\n\n protected _getActiveStep(): DcaWizardStep {\n let activeStep: DcaWizardStep;\n this._getSteps().forEach(step => {\n if (step.step === this.activeStep) {\n activeStep = step;\n }\n });\n return activeStep;\n }\n\n protected setSteps() {\n this._getSteps().forEach(step => {\n step.hidden = step.step !== this.activeStep;\n });\n this.canNavigatePrevious = this._getActiveStep().step != 0;\n }\n\n previousStepHandler = async (event: Event) => {\n console.log(\"previous step\")\n const activeStep = this._getActiveStep();\n var index = this.Steps.findIndex(i => i=== activeStep);\n var previousStep = this.Steps[index-1];\n this.activeStep = previousStep.step;\n this._setLastStep();\n }\n\n // todo rename to progress handler\n protected nextStepHandler = async (event: Event) => {\n //get current\n const activeStep = this._getActiveStep();\n const isValid = activeStep.checkValidity();\n if (isValid) {\n if (activeStep.completeStep) {\n await activeStep.completeStep();\n }\n var index = this.Steps.findIndex(i => i=== activeStep);\n var nextStep = this.Steps[index+1];\n this.activeStep = nextStep.step;\n\n this._setLastStep();\n }\n }\n\n\n private _setLastStep() {\n const lastStep = Array.from(this._getSteps()).slice(-1)[0];\n const currentStep = this._getActiveStep();\n this._isLastStep = lastStep == currentStep;\n }\n\n\n render() {\n // todo move setSteps out of here, but would need to make sure changing property activeStep triggers set-step\n this.setSteps();\n const currentStep = this._getActiveStep();\n return html`\n <header>\n <h3>\n ${currentStep.title}\n </h3>\n </header>\n <slot></slot>\n <hr/>\n <footer style=\"display:flex;justify-content: space-between;\">\n <mwc-button label=\"Previous\" icon=\"arrow_back\" @click=${this.previousStepHandler} ?disabled=${!this.canNavigatePrevious} ></mwc-button>\n ${this._isLastStep ?\n html`<mwc-button label=\"${this.CompleteLabel}\" ?hidden=${!this._isLastStep} trailingIcon icon=\"check_circle_outline\" @click=${this.nextStepHandler}></mwc-button>` :\n html`<mwc-button label=\"Next\" ?hidden=${this._isLastStep} trailingIcon icon=\"arrow_forward\" @click=${this.nextStepHandler}></mwc-button>`} \n </footer>\n `;\n }\n}\n\n\n@customElement(\"dca-wizard-step\")\nexport class DcaWizardStep extends LitElement {\n @property({ type: Number }) step: number = 0;\n @property() title: string;\n\n // named generically as it may be used for Next|Finish\n @property({ attribute: false }) completeStep: () => Promise<void>;\n\n checkValidity(): boolean {\n const event = new CustomEvent<{ isValid: boolean }>('validate', { detail: { isValid: true }, bubbles: true, composed: true, cancelable: true });\n this.dispatchEvent(event);\n return event.detail.isValid\n }\n\n render() {\n return html`\n <slot></slot>\n `;\n }\n}\n\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js'\nimport { CloseViewEvent } from 'src/events/close-view';\n\n@customElement('dialog-wrapper')\nexport class DialogWrapper extends LitElement {\n static styles = [\n css`\n :host {\n display: block;\n }\n `\n ];\n\n @query(\"#dialog\") dialog:HTMLDialogElement \n\n openDialogHandler = (e:Event) =>{\n e.stopPropagation();\n e.preventDefault();\n this.dialog.showModal();\n }\n\n closeEventHandler = (e:CloseViewEvent) => { \n this.dialog.close(); \n e.stopPropagation(); \n e.preventDefault(); \n }\n \n render() {\n return html`\n <slot @click=${this.openDialogHandler}></slot>\n <dialog id=\"dialog\" @close-view=${this.closeEventHandler}>\n <slot name=\"dialog-content\"></slot>\n </dialog>\n `;\n }\n}\n","import { Menu, MenuItem } from \"@fluentui/web-components\";\nimport { LitElement, html, css } from \"lit\";\nimport { customElement, property, query, state } from \"lit/decorators.js\"\nimport { downSvg } from \"src/modules/svg/svgIcons\";\n\n@customElement(\"display-select\")\nexport class DisplaySelect extends LitElement {\n static styles = [\n css`\n :host {\n display: block;\n }\n\n .anchor-button {\n anchor-name: --anchor-el;\n }\n\n .menu {\n position-anchor: --anchor-el;\n top: anchor(bottom);\n margin: 0;\n justify-self: anchor-center;\n position-area: right span-bottom;\n border: 0;\n padding: 10px 50px 50px;\n background-color: transparent;\n }\n `\n ];\n\n @state() iconSlotName?:string = \"default\";\n\n @query(\"#menu\") menu:Menu & { hidePopover:()=> void, togglePopover:()=> void }\n\n buttonClickHandler = (e: Event)=>{\n this.menu.togglePopover();\n }\n\n menuClickHandler = (e:Event) =>{\n const targetMenuItem =(e.target as HTMLElement).closest(\"fluent-menu-item\") as MenuItem;\n var iconSlot = `${targetMenuItem.id}-icon`;\n this.iconSlotName =iconSlot;\n this.close()\n } \n\n close = () => this.menu.hidePopover();\n\n render() {\n return html`\n <fluent-button class=\"anchor-button\" id=\"measure-button\" @click=${this.buttonClickHandler}>\n <div style=\"display:flex\">\n <slot name=\"${this.iconSlotName}\"></slot>\n ${downSvg(24)}\n </div>\n </fluent-button>\n \n <div id=\"menu\" class=\"menu\" popover>\n <fluent-menu style=\"max-width:none;width:max-content\" @click=${this.menuClickHandler}>\n <slot name=\"menu-item\"></slot>\n </fluent-menu> \n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"display-select\": DisplaySelect;\n }\n}\n","import appInsights from './../application-insights';\n\nimport { css, html, LitElement } from \"lit\";\nimport { repeat } from 'lit/directives/repeat.js';\nimport { customElement, query, state } from \"lit/decorators.js\";\nimport './embedded-powerbi-wrapper'\nimport { EmbeddedPowerBiWrapper } from \"./embedded-powerbi-wrapper\";\nimport * as pbi from 'powerbi-client';\nimport { DashboardReportAccessor, IReportApiEmbedAccessor, IReportRequest } from \"src/modules/DashboardReportAccessor\";\nimport { IEmbedCodeResponse } from \"./../services\";\nimport { PowerBiTokenUpdater } from 'src/modules/PowerBiTokenUpdater';\nimport { createEmbedConfig, isMobileView } from 'src/modules/helpers/powerbi-client-helpers';\nimport { IEmbedSettings } from './../services';\nimport { IEmbedConfigurationBase } from 'embed';\n\nexport type PageChangedAfterLoadDetail = { newPage: pbi.Page };\ntype EmbedItem = { powerBiType?:\"Report\"|\"Dashboard\", clientGroup?: string, name?: string, isMobile: boolean, loadedDatasets:Map<string,string> };\n@customElement(\"embedded-powerbi-manager\")\nexport class EmbeddedPowerBiManager extends LitElement {\n\n\n static styles = css`\n :host{\n display:flex\n }\n\n embedded-powerbi-wrapper{\n flex-grow:1\n }\n \n`;\n\n private _report: pbi.Report;\n private reportKey: number;\n private _loaded: boolean = false;\n\n private readonly _reportAccessor: IReportApiEmbedAccessor;\n get reportAccessor() {\n return this._reportAccessor;\n }\n\n private _embeddedList: EmbedItem[]\n @state() _activeEmbed: EmbedItem;\n\n @query(\"#default\") protected _firstPowerBiReport: EmbeddedPowerBiWrapper\n\n\n private _tokenUpdater: PowerBiTokenUpdater;\n\n constructor() {\n super();\n const isMobile= false;\n const defaultEmbed: EmbedItem = { name: \"default\", isMobile, loadedDatasets:new Map<string,string>() };\n\n this._embeddedList = [defaultEmbed];\n this._activeEmbed = defaultEmbed;\n this._reportAccessor = new DashboardReportAccessor();\n }\n\n bootstrap = async () => {\n await this._firstPowerBiReport.updateComplete\n\n var bootstrapConfig: IEmbedConfigurationBase = {\n type: 'report',\n hostname: \"https://app.powerbi.com\",\n embedUrl: \"https://app.powerbi.com/reportEmbed\", //fake because bookmarks don't work https://community.powerbi.com/t5/Issues/Javascript-API-Problem-with-BookmarksManager-when-Bootstrap-API/idi-p/1168698\n };\n\n // uncomment when/if we bring in screen detect\n // no need now as there are no mobile reports\n // if (this._embeddedList[0].isMobile) {\n // bootstrapConfig.settings = {\n // layoutType: pbi.models.LayoutType.MobilePortrait\n // }\n // }\n\n this._embeddedList[0].powerBiType = \"Report\";\n var config = this._firstPowerBiReport.bootstrap(bootstrapConfig);\n console.log(config);\n console.log(\"bootstrapped\");\n }\n\n\n loadReport = async (reportRequest: IReportRequest,clientEmbedSettings?: IEmbedSettings, bookmarkName?:string) => {\n\n\n await this.firstUpdated\n this.initializeDefaultActiveEmbed(reportRequest);\n\n\n const reportKey = reportRequest.reportKey;\n if (!this._tokenUpdater) {\n this._tokenUpdater = new PowerBiTokenUpdater(this);\n }\n\n this._loaded = false;\n if (slowLoadTimeout != null) {\n window.clearTimeout(slowLoadTimeout);\n\n appInsights.stopTrackEvent(\"report-load-event\", { reportKey: this.reportKey?.toString(), action: \"new-report\" })\n slowLoadTimeout = null;\n }\n\n\n this.reportAccessor.SetEmbedRequestData(reportRequest);\n var embedResponse = await this.reportAccessor.GetCachedEmbedCode();\n\n const isMobile = clientEmbedSettings?.layoutType != null ? clientEmbedSettings?.layoutType === pbi.models.LayoutType.MobilePortrait : isMobileView();\n\n const mobileSettings = isMobile ? { layoutType: pbi.models.LayoutType.MobilePortrait }:{}\n await this.setOrCreateActiveEmbed(reportRequest.clientGroup, embedResponse.reportId, isMobile, reportRequest.reportKey, embedResponse.powerBiType, new Map<string,string>(Object.entries(embedResponse.datasets)))\n\n let config = this.getEmbedConfiguration(embedResponse);\n config.settings = { ...mobileSettings, ...config.settings, ...clientEmbedSettings };\n\n if(bookmarkName)\n {\n config.bookmark= { name :bookmarkName };\n }\n\n appInsights.startTrackEvent(\"LoadFrame\")\n appInsights.startTrackEvent(\"report-load-event\");\n\n var slowLoadTimeout = window.setTimeout(function () {\n console.log(\"report-load-event timer\");\n appInsights.stopTrackEvent(\"report-load-event\", { reportKey: reportKey.toString(), action: \"slowtimer\" })\n window.clearTimeout(slowLoadTimeout);\n slowLoadTimeout = null;\n }, 50000);\n\n const loadedReport = await this.loadFrame(config);\n\n if (slowLoadTimeout !== null) {\n // loaded ok so clear\n window.clearTimeout(slowLoadTimeout);\n slowLoadTimeout = null;\n }\n appInsights.stopTrackEvent(\"report-load-event\", { reportKey: reportKey.toString(), action: \"loaded\" })\n\n\n appInsights.stopTrackEvent(\"LoadFrame\", { reportKey: reportKey.toString() })\n\n this.reportKey = reportKey;\n this._report = loadedReport;\n this._loaded = true;\n this._tokenUpdater.AttachInterval(embedResponse.expiration);\n return this._report;\n };\n\n\n private initializeDefaultActiveEmbed(reportRequest: IReportRequest) {\n // this bootstrapped embed to be loaded assumes the reportData\n if (this._activeEmbed.clientGroup == null) {\n this._activeEmbed.clientGroup = reportRequest.clientGroup;\n }\n }\n\n private setOrCreateActiveEmbed = async (clientGroup: string, reportId: string, isMobile: boolean, reportKey: number, powerBiType: \"Report\"|\"Dashboard\", datasets:Map<string,string>): Promise<void> => {\n let currentEmbed: EmbedItem;\n\n // find embed to place compatible report\n if (currentEmbed == null) {\n for (const embed of this._embeddedList) {\n if (embed.powerBiType === powerBiType && embed.clientGroup === clientGroup && embed.isMobile === isMobile) // must be same client group\n {\n //should check that all loaded datasets are compatible (i.e the same dataset but with different config has not already been loaded)\n if(this.#checkDataSetsAreCompatible(embed.loadedDatasets, datasets))\n {\n console.log(\"compatible dataset found!\");\n embed.loadedDatasets = new Map<string,string>([...embed.loadedDatasets, ...datasets])\n currentEmbed = embed;\n break;\n }\n }\n }\n }\n\n // could not find embed, so create a new one\n if (currentEmbed == null) {\n // create new embed and assign it, name to be unique but can hold many reports\n currentEmbed = { name: `${reportId}_${reportKey}`, loadedDatasets: new Map(datasets), clientGroup: clientGroup, isMobile, powerBiType };\n this._embeddedList.push(currentEmbed);\n console.log(this._embeddedList.length ==1? \"first embed required\" : \"new embedded-powerbi-wrapper required\");\n }\n\n // todo might only need to updateComplete when new nodes are created,\n if (this._activeEmbed != currentEmbed) {\n this._activeEmbed = currentEmbed;\n await this.updateComplete;\n }\n }\n\n #checkDataSetsAreCompatible(existingDataset:Map<string,string>, incomingDatasets:Map<string,string>) {\n for(var incomingDatasetKey of incomingDatasets.keys())\n {\n if(existingDataset.has(incomingDatasetKey)){\n if(existingDataset.get(incomingDatasetKey) !== incomingDatasets.get(incomingDatasetKey)){\n console.log(\"dataset: already loaded with a different configuration\")\n return false;\n }\n }\n\n }\n return true;\n\n }\n\n fullscreen = () => this.getCurrentReport().fullscreen();\n\n\n getReportBookmarks = async (): Promise<pbi.models.IReportBookmark[]> => await this.getCurrentReport().bookmarksManager.getBookmarks();\n\n getReportState = async (): Promise<{ reportKey: number, state: string }> => {\n const capturedBookmark = await this.getCurrentReport().bookmarksManager.capture();\n return { reportKey: this.reportKey, state: capturedBookmark.state };\n };\n\n getReport = () => this.getCurrentReport();\n\n getPages = async (): Promise<pbi.Page[]> => {\n return this._report.getPages();\n }\n\n\n // page must be active\n getTableColumns = async (visualDescriptor: pbi.VisualDescriptor): Promise<string[]> => {\n const data = await visualDescriptor.exportData(pbi.models.ExportDataType.Summarized, 1);\n const firstRow = (data as any).data.split(\"\\r\\n\")[0];\n return firstRow.split(\",\");\n }\n\n setReportState = async (state: string) => {\n await this.getCurrentReport().bookmarksManager.applyState(state);\n }\n\n setAccessToken = async (accessToken: string) => await this.getCurrentReport().setAccessToken(accessToken);\n\n applyBookmark = async (bookmarkName: string) => await this.getCurrentReport().bookmarksManager.apply(bookmarkName)\n\n private getCurrentReport = (): pbi.Report => this._report;\n\n\n private getCurrentEmbedElement = (): EmbeddedPowerBiWrapper => {\n\n const activeEmbedElement = this.shadowRoot.querySelector(`embedded-powerbi-wrapper:not([hidden])`) as EmbeddedPowerBiWrapper\n return activeEmbedElement ?? this.shadowRoot.querySelector(\"embedded-powerbi-wrapper\");\n }\n\n getActivePageInfo = async (): Promise<{ displayName: string, name: string }> => {\n const activePage = await this._report.getActivePage()\n return { displayName: activePage.displayName, name: activePage.name };\n };\n\n\n private getEmbedConfiguration = (embedResponse: IEmbedCodeResponse) => {\n console.log(\"embed\", embedResponse);\n return createEmbedConfig(embedResponse.powerBiType, embedResponse.reportId, embedResponse.embedToken, embedResponse.url)\n }\n\n\n private loadFrame = (config: pbi.IEmbedConfiguration): Promise<pbi.Report> => {\n\n return new Promise((resolve, reject) => {\n // todo could add a reject timeout here or somewhere\n\n var oldReport = this._report;\n if (oldReport) {\n console.log(\"unloading previous report\");\n oldReport.off(\"loaded\"); // todo remove specific event instead of all\n oldReport.off(\"rendered\"); // todo remove specific event instead of all\n oldReport.off(\"pageChanged\");\n oldReport.off(\"selectionChanged\");\n oldReport.off(\"visualClicked\");\n oldReport.off(\"error\");\n }\n\n var report = this.getCurrentEmbedElement().embed(config) as pbi.Report;\n this._report = report;\n\n console.log(\"report\", report.getId());\n\n if(config.type === \"report\")\n {\n report.on(\"pageChanged\", this.pageChangedEventHandler);\n report.on(\"selectionChanged\", this.selectionChangedEventHandler);\n report.on(\"visualClicked\", this.visualClickedEventHandler);\n }\n \n\n report.on(\"error\", (event) => {\n console.log(\"error\", event);\n\n if (event instanceof Error) {\n appInsights.trackException({\n exception: event\n });\n } else {\n appInsights.trackTrace({ message: \"powerbi error\", properties: event })\n appInsights.trackException({\n exception: new Error(\"powerbi error\")\n });\n }\n\n reject(event);\n });\n\n report.on(\"loaded\", (event) => {\n console.log(\"loaded [%o] [%o]\", event, report.getId());\n\n appInsights.stopTrackEvent(\"report-loaded\", { reportId: report.getId() })\n resolve(report);\n });\n\n\n report.on(\"rendered\", this.renderedEventHandler);\n console.log(\"loadFrame end\")\n });\n };\n\n private selectionChangedEventHandler = (event: Event) => {\n console.log(\"selectionChanged\", event);\n\n this.raiseUserActivityEvent(\"selectionChanged\");\n }\n\n private visualClickedEventHandler = (event: Event) => {\n console.log(\"visualClicked\", event);\n this.raiseUserActivityEvent(\"visualClicked\");\n };\n\n private renderedEventHandler = (event: pbi.service.ICustomEvent<{ newPage: { displayname: string } }>) => {\n appInsights.stopTrackEvent(\"report-rendered\", { reportId: this._report.getId() })\n console.log(\"rendered [%o] [%o]\", event, this._report.getId());\n };\n\n\n private pageChangedEventHandler = (event: CustomEvent<{ newPage: pbi.Page }>) => {\n console.log(\"pageChanged\", event)\n if (this._loaded) {\n const pageChangeEvent = new CustomEvent<PageChangedAfterLoadDetail>(\"page-changed-after-load\", { detail: event.detail, bubbles: true, composed: true })\n this.getCurrentEmbedElement().dispatchEvent(pageChangeEvent);\n }\n }\n\n private raiseUserActivityEvent = (activityType: string) => {\n const activityEvent = new CustomEvent(\"userActivity\", {\n detail: {\n activityType: activityType\n },\n bubbles: true\n });\n this.getCurrentEmbedElement().dispatchEvent(activityEvent);\n }\n\n render = () => html`\n ${repeat(this._embeddedList, (item) => item.name, (embedItem, index) => {\n const hideReport: boolean = embedItem !== this._activeEmbed;\n return html`<embedded-powerbi-wrapper ?hidden=${hideReport} .ad-key=${embedItem.clientGroup} .id=${embedItem.name} .ad-type=${embedItem.powerBiType}></embedded-powerbi-wrapper>`\n })\n }\n `;\n\n}","import { IEmbedConfigurationBase } from \"embed\";\nimport { css, html, LitElement } from \"lit\";\nimport { customElement, query } from \"lit/decorators.js\";\nimport { IComponentEmbedConfiguration } from \"service\";\nimport { Embed } from \"embed\";\n\n@customElement(\"embedded-powerbi-wrapper\")\nexport class EmbeddedPowerBiWrapper extends LitElement {\n\n // iframe background-color may not be needed anymore... but leaving for now\n static styles = css`\n :host{\n display:block\n }\n \n :host([hidden]) { display: none }\n \n #reportContainer {\n height:100%;\n display:flex;\n }\n\n iframe {\n border: 0px;\n background-color: var(--background-theme-color);\n }\n\n iframe:fullscreen {\n background-color: var(--background-theme-color);\n }\n `;\n\n @query('#reportContainer') private reportContainer: HTMLElement\n\n \n pageChangedEventHandler = (event:CustomEvent) => {\n console.log(\"EmbeddedPowerBiWrapper page changed\",event )\n const replayEvent = new CustomEvent(event.type, { bubbles:true,composed:true, detail: event.detail})\n this.dispatchEvent(replayEvent);\n }\n\n bootstrap = (config?: IComponentEmbedConfiguration | IEmbedConfigurationBase): Embed => window.powerbi.bootstrap(this.reportContainer, config);\n \n embed = (config?: IComponentEmbedConfiguration | IEmbedConfigurationBase): Embed => window.powerbi.embed(this.reportContainer, config);\n\n render = () => html`<div id=\"reportContainer\" @pageChanged=\"${this.pageChangedEventHandler}\"></div>`;\n}\n","import { LitElement, html, css, nothing } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\"\nimport { createRef, ref, Ref } from \"lit/directives/ref.js\";\nimport { WebComponentEvent } from \"src/events/WebComponentEvent\";\nimport { PageFeedback } from \"src/components/feedback/page-feedback\";\n\n@customElement(\"feedback-manager\")\nexport class FeedbackManager extends LitElement {\n static styles = [\n css`\n :host {\n display: contents\n }\n `\n ];\n\n connectedCallback() {\n super.connectedCallback();\n window.addEventListener(DisplayFeedbackEvent.eventName, this.showFeedbackHandler);\n }\n \n @state() pageFeedback: { ref:Ref<PageFeedback>, reportKey?:number }[] = [];\n\n showFeedbackHandler = async (displayFeedbackEvent: DisplayFeedbackEvent) => {\n const feedbackRef: Ref<PageFeedback> = createRef();\n this.pageFeedback = [...this.pageFeedback, { ref:feedbackRef, reportKey:displayFeedbackEvent.reportKey }];\n await this.updateComplete;\n feedbackRef.value.showModal();\n }\n\n removeFeedback = (value:Ref<PageFeedback>) => {\n this.pageFeedback = this.pageFeedback.filter(x=> x.ref !== value);\n }\n\n render() {\n return html`\n ${this.pageFeedback.map(x=> html`<page-feedback ${ref(x.ref)} .reportKey=${x.reportKey} @close-view=${() => this.removeFeedback(x.ref)}></page-feedback>`)} \n `;\n }\n\n disconnectedCallback() {\n window.removeEventListener(DisplayFeedbackEvent.eventName, this.showFeedbackHandler);;\n super.disconnectedCallback();\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"feedback-manager\": FeedbackManager;\n }\n}\nexport class DisplayFeedbackEvent extends WebComponentEvent {\n static readonly eventName = 'display-feedback-event';\n onDisconnect?: () => void;\n constructor(public reportKey?:number) {\n super(DisplayFeedbackEvent.eventName);\n }\n}","import appInsights from 'src/application-insights';\nimport { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js'\nimport { actionBarStyles } from 'src/styles/action-bar';\nimport { services } from 'src/services';\nimport { TextArea } from '@microsoft/fast-foundation';\nimport {RadioButtonList, RadioButton} from 'src/components/radio-button-list'\nimport { raisePromiseEvent } from 'src/modules/helpers/message-helper';\nimport '../close-button';\nimport { CloseViewEvent } from 'src/events/close-view';\nTextArea;\nRadioButtonList; RadioButton;\n@customElement('page-feedback')\nexport class PageFeedback extends LitElement {\n static styles = [actionBarStyles,\n css`\n :host {\n box-sizing:border-box;\n }\n\n dialog[open] {\n border:0px;\n box-shadow: rgb(0 0 0 / 22%) 0px 25.6px 57.6px 0px, rgb(0 0 0 / 18%) 0px 4.8px 14.4px 0px;\n\n display:flex;\n flex-direction:column;\n gap:1rem;\n }\n\n dialog::backdrop {\n background: rgba(0, 0, 0, 0.4); \n }\n\n .title-text {\n font-size:20px;\n font-weight:600;\n }\n\n .button-text {\n font-weight:600;\n }\n\n\n fluent-text-area::part(control)\n {\n width: 70vw;\n height:30vh;\n max-width:1000px;\n }\n `\n ];\n\n @query(\"dialog\") private _dialog: HTMLDialogElement;\n @query(\"fluent-text-area\") private _textArea: TextArea;\n @query(\"radio-button-list\") private _RadioButtons: RadioButtonList;\n\n @property({type:Number}) reportKey?:number;\n\n private reset = ()=> {\n this._textArea.value = \"\";\n }\n\n protected submit = async () =>{\n if(this._textArea.reportValidity() === true)\n {\n\n try {\n this.#close();\n var task = async () => {\n if(this.reportKey && this._RadioButtons.selectedValue == \"report\" )\n {\n await services.users.sendFeedback(window.location.href,this._textArea.value,this.reportKey )\n } else {\n await services.users.sendFeedback(window.location.href,this._textArea.value)\n }\n }\n \n raisePromiseEvent<void>(this, { task: task(), messages: { success: \"Feedback sent\", failed: \"Could not send feedback\", progress: \"Sending\" } })\n this.reportKey = null;\n this.reset();\n\n } \n catch(er) {\n appInsights.trackException(er);\n throw er;\n }\n }\n }\n\n showModal = () => {\n const selectedValue = this.reportKey ? \"report\" : \"general\";\n this._RadioButtons.selectValue(selectedValue)\n this._dialog.showModal();\n }\n\n #close =()=>{\n this._dialog.close();\n this.dispatchEvent(new CloseViewEvent())\n }\n render() {\n return html`\n <dialog>\n <div class=\"action-bar\">\n <mwc-icon>contact_support</mwc-icon> \n <div class=\"title-text\">Feedback</div>\n <close-button class=\"push-right\" @close-view=${this.#close}></close-button>\n </div>\n <div .hidden=${this.reportKey == null}>\n <radio-button-list label=\"Send Feedback for:\" >\n <radio-button class=\"currentReport-button\" active value=\"report\">This Report</radio-button>\n <radio-button class=\"general-button\" value=\"general\">General Feedback</radio-button>\n </radio-button-list>\n </div>\n <div>\n <fluent-text-area placeholder=\"Describe your experience\" required></fluent-text-area>\n </div>\n <div class=\"action-bar\">\n <fluent-button class=\"push-right button-text\" appearance=\"accent\" style=\"--control-corner-radius:0\" @click=${this.submit} >Submit</fluent-button>\n <fluent-button class=\"button-text\" appearance=\"outline\"style=\"--control-corner-radius:0\" @click=${() => this.#close()}>Cancel</fluent-button>\n </div>\n </dialog>\n `;\n }\n}\n","import {\n provideFluentDesignSystem,\n fluentAnchor,\n fluentBadge,\n fluentButton,\n fluentProgress,\n fluentProgressRing,\n fluentSwitch,\n fluentTab,\n fluentTabPanel,\n fluentTabs,\n fluentTextField,\n fluentTextArea,\n fluentSelect,\n fluentOption,\n fluentMenu,\n fluentMenuItem,\n fluentDivider,\n fluentCombobox,\n fluentCheckbox,\n fluentRadioGroup,\n fluentRadio,\n fluentListbox,\n fluentAnchoredRegion\n \n\n} from \"@fluentui/web-components\";\n\n\n/*\nimport {css} from \"@microsoft/fast-element\"\n\nimport {\n provideFASTDesignSystem,\n fastDisclosure,\n disclosureStyles,\n \n\n} from \"@microsoft/fast-components\";\n\nprovideFASTDesignSystem()\n .register(\n fastDisclosure({\n styles: (ctx, def) => css`\n ${disclosureStyles(ctx, def)}\n\n :host(.success) {\n --accent-foreground-rest: #0f5132;\n --accent-foreground-hover: #badbcc;\n }\n `})\n );\n*/\n\n\n\n//var accentBaseColor = \"#DA1A5F\";\n//accentPalette.withDefault(PaletteRGB.from(SwatchRGB.from({r:16,g:124,b:16 })));\n\nprovideFluentDesignSystem()\n .register(\n fluentAnchor(),\n fluentBadge(),\n fluentButton(),\n fluentProgress(),\n fluentProgressRing(),\n fluentSwitch(),\n fluentTab(),\n fluentTabPanel(),\n fluentTabs(),\n fluentTextField(),\n fluentTextArea(),\n fluentSelect(),\n fluentOption(),\n fluentMenu(),\n fluentMenuItem(),\n fluentDivider(),\n fluentCombobox(),\n fluentCheckbox(),\n fluentRadioGroup(),\n fluentRadio(),\n fluentListbox(),\n fluentAnchoredRegion()\n );\n\n","import { css, html, LitElement } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\n\n@customElement(\"form-input\")\nexport class FormInput extends LitElement {\n static styles = css`\n :host { \n display: contents; \n }\n `;\n\n @property() name: string;\n @property() query: string;\n @property() property: string;\n // @property() for:string;\n\n @property({type:Boolean}) stringify:boolean = false;\n\n constructor() {\n super();\n this._handleFormDataEvent = this._handleFormDataEvent.bind(this);\n }\n\n connectedCallback() {\n super.connectedCallback()\n this.closest(\"form\").addEventListener(\"formdata\", this._handleFormDataEvent);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n // no idea it's been removed, or is being removed, and it won't be able to find the form if it's already removed\n this.closest(\"form\").removeEventListener(\"formdata\", this._handleFormDataEvent);\n }\n\n protected _slottedChildren() {\n const slot = this.shadowRoot.querySelector('slot');\n const childNodes = slot.assignedNodes({ flatten: true });\n return childNodes.filter((node: Node) => node.nodeType == Node.ELEMENT_NODE) as Element[];\n }\n\n protected _handleFormDataEvent(event: FormDataEvent) {\n const propertyName = this.property ? this.property : \"value\";\n const nodes = this.query ? this.querySelectorAll(this.query) : this._slottedChildren();\n\n\n //remove any existing formdata\n nodes.forEach(n => {\n event.formData.delete((n as any)[\"name\"] ?? this.name);\n })\n\n nodes.forEach(n => {\n let name = (n as any)[\"name\"];\n if (name == null || name === '') {\n name = this.name;\n }\n\n const formValue =this.stringify ? JSON.stringify((n as any)[propertyName]) : (n as any)[propertyName];\n event.formData.append(name ?? this.name, formValue);\n })\n }\n\n render() {\n return html`\n <slot></slot>\n `;\n }\n}","\nimport type { Switch } from '@fluentui/web-components';\nimport 'src/components/fluentComponentRegistration';\n\nimport { LinearProgress } from \"@material/mwc-linear-progress\";\nLinearProgress;\nimport { Icon } from \"@material/mwc-icon\";\nIcon\n\nimport { html, css, LitElement, nothing } from \"lit\";\nimport { customElement, property, query } from \"lit/decorators.js\";\nimport { updateGroupUser } from 'src/services';\nimport styleSheet from \"src/styles/group-user-item-css\"\nimport { classMap } from 'lit/directives/class-map.js';\n\n@customElement(\"group-user-item\")\nexport class GroupUserItem extends LitElement {\n static styles = [styleSheet, css`\n :host([hidden]){\n display:none\n }\n\n mwc-linear-progress{\n zoom:0.5;\n }\n\n mwc-icon-button\n {\n position: relative;\n top: -11px; \n right: 10px;\n }\n\n mwc-linear-progress.failure {\n --mdc-theme-primary: red;\n } \n\n `];\n\n @property({ type: Number }) groupUserKey: number\n //todo change to drill-down\n @property({ type: Boolean }) drilldown: boolean\n @property({ type: Boolean }) readonly: boolean\n\n @property() username: string\n\n @property() failedState= false;\n\n @query(\"fluent-switch\") private _switch: Switch;\n @query(\"mwc-linear-progress\") private _progress: LinearProgress;\n\n requestToggleDrillDownHandler = async (event: Event) => {\n console.log(\"DrillDownHandler\", event);\n await this.ProgressPromise<void>(updateGroupUser(this.groupUserKey, this._switch.checked))\n }\n\n private ProgressPromise = async <T>(innerPromise: Promise<T>): Promise<T> => {\n this.failedState = false;\n this._progress.indeterminate = true;\n try {\n const result = await innerPromise;\n return result; \n } catch {\n debugger;\n this.failedState = true;\n } finally{\n this._progress.indeterminate = false;\n this._progress.progress =1;\n\n }\n \n \n \n }\n\n render() {\n return html`\n<div class=\"grid-container\" >\n <slot name=\"front-slot\">${this.username}</slot>\n ${this.readonly ? this.drilldown ? html`<mwc-icon class=\"gp-col-2\" slot=\"checked-message\">lock_open</mwc-icon>`:nothing :html`\n <fluent-switch class=\"gp-col-2\" @change=${this.requestToggleDrillDownHandler} style=\"width:100px;min-height:28px\" ?checked=${this.drilldown}>\n <mwc-icon slot=\"checked-message\">lock_open</mwc-icon>\n </fluent-switch>\n `}\n <slot name=\"end-slot\"></slot>\n</div>\n <mwc-linear-progress class=\"${classMap({failure:this.failedState})}\" style=\"width:100%;zoom:0.25; margin-bottom:35px;\"></mwc-linear-progress>\n `;\n }\n}\n\n","import { css, html, LitElement, nothing } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\n\n/*\n A twist on the traditional details component, \n - allowing the details to exist outside of the element\n\n Usage\n <info-summary for=\"my-details\">click me for info</info-summary>\n <info-details id=\"my-details\">i can be anywhere in the document</info-details>\n\n - while is not good practice for components to directly talk to each other, I'll make an exception here.\n\ntodo:\n[] needs show/hide animation\n[] support details slot or(summary slot)\n[] consider adding title and rendering a default style (like disclosure)\n\n[] add title summary slot (which is any div that is wrapped in a info-summary)\n[] add title text which creates a summary slot if not exists\n */\n\n\ndeclare global {\n interface WindowEventMap {\n \"info-detail-change\": CustomEvent<InfoDetailChangeEvent>\n }\n}\nexport interface InfoDetailChangeEvent {\n open: boolean\n}\n\n@customElement(\"info-summary\")\nexport class InfoSummary extends LitElement {\n @property() for: string;\n\n @state() open: boolean;\n\n static styles = css`\n :host{\n display:block;\n cursor:pointer;\n }\n ::slotted(:hover){\n cursor:pointer\n }\n `\n\n connectedCallback() {\n super.connectedCallback()\n window.addEventListener(\"info-detail-change\", this._infoDetailChangeEventHandler);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback()\n window.removeEventListener(\"info-detail-change\", this._infoDetailChangeEventHandler);\n }\n\n private _infoDetailChangeEventHandler = (event: CustomEvent<InfoDetailChangeEvent>) => {\n const target = this.#findTarget();\n if (target === event.target) {\n this.open = event.detail.open;\n }\n };\n\n clickEventHandler(event: Event) {\n const target = this.#findTarget();\n\n if (target instanceof InfoDetails) {\n target.toggle();\n }\n }\n\n render() {\n return html`\n <slot @click=${this.clickEventHandler}></slot>\n ${this.open ? html`<slot @click=${this.clickEventHandler} name=\"open\"></slot>` : html`<slot @click=${this.clickEventHandler} name=\"closed\"></slot>`}\n `\n }\n\n #findTarget = () => {\n var closestDocumentFragment = closestNode(this.parentNode, isDocumentFragment)\n if (closestDocumentFragment) {\n return closestDocumentFragment.getElementById(this.for)\n }\n return null;\n }\n}\n\n@customElement(\"info-details\")\nexport class InfoDetails extends LitElement {\n @property({ type: Boolean, reflect: true }) open: boolean;\n\n static styles = css`\n :host{\n display:block\n }\n `\n toggle() {\n this.open = !this.open;\n const downloadReportEvent = new CustomEvent<InfoDetailChangeEvent>(\"info-detail-change\", { detail: { open: this.open }, bubbles: true });\n this.dispatchEvent(downloadReportEvent);\n }\n\n render() {\n return html`\n ${this.open ? html`<slot></slot>` : nothing}\n `\n }\n}\n\n\n\n\nfunction isDocumentFragment(element: Node): element is DocumentFragment {\n return (element as any)?.getElementById;\n}\n\n\n\n/** Returns the first (starting at node) inclusive ancestor that matches selectors, and null otherwise. */\nconst closestNode = <T extends Node>(node: Node, predicate: (node: Node) => node is T): T | null => {\n if (predicate(node)) {\n return node;\n } else {\n if (node.parentNode) {\n return closestNode(node.parentNode, predicate);\n } else {\n return null;\n }\n }\n};\n\n","\n// OBSOLETE PLEASE USE <dca-select>\n\n//requirements:\n// input with datalist and data-value-name\n/*\n <input type=\"text\" class=\"form-control\" id=\"pratice-name-input\" list=\"praticeList\" placeholder=\"Choose Practice\" autofocus required data-value-name=\"@Html.NameFor(m => m.AddPracticeKey)\" >\n <datalist id=\"praticeList\">\n @foreach (var practice in Model.Practices)\n {\n <option data-value=\"@practice.Value\">@practice.Text</option>\n }\n </datalist>\n*/\nexport function RegisterInput(inputElement: HTMLInputElement) {\n //todo learn about memory deallocation\n new InputSelect(inputElement);\n}\n\n\nclass InputSelect {\n inputElement: HTMLInputElement\n constructor(inputElement: HTMLInputElement) {\n this.inputElement = inputElement;\n this.applyRequiredDataListItem();\n this.submitFormData();\n }\n\n applyRequiredDataListItem() {\n this.inputElement.addEventListener(\"change\", function (event: Event) {\n\n var datalist = this.list as HTMLDataListElement;\n // Determine whether an option exists with the current value of the input.\n const optionFound = findOption(datalist, this.value) != null;\n // use the setCustomValidity function of the Validation API\n // to provide an user feedback if the value does not exist in the datalist\n if (optionFound) {\n this.setCustomValidity(\"\");\n } else {\n this.setCustomValidity(\"Please select an item in the list.\");\n }\n });\n }\n\n\n submitFormData() {\n const inputName = this.inputElement.dataset[\"valueName\"];\n if (inputName) {\n this.inputElement.form.addEventListener(\"formdata\", (event: FormDataEvent) => {\n const option = findOption(this.inputElement.list as HTMLDataListElement, this.inputElement.value);\n event.formData.append(inputName, option.dataset[\"value\"]);\n });\n }\n }\n}\n\n\nfunction findOption(datalist: HTMLDataListElement, value: string) {\n // todo why not for??\n for (var j = 0; j < datalist.options.length; j++) {\n if (value == datalist.options[j].value) {\n return datalist.options[j];\n }\n }\n}\n\n","/*\ntodo:\nshould be download-item\n2px height https://nolanlawson.com/2021/01/03/options-for-styling-web-components/\n*/\n\nimport { html, css, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport '@material/mwc-linear-progress'\n\n@customElement('download-bar')\nexport class DownloadBar extends LitElement {\n static styles = css`\n :host { \n display: block; \n }\n\n .description{\n color: rgb(96, 94, 92);\n font-size: 12px;\n line-height: 18px;\n }\n `;\n\n @property()\n title: string;\n @property()\n description: string;\n\n //0-100\n @property()\n progress: number;\n\n render() {\n const showBuffer = this.progress == 0 ? 0 : 1;\n return html`\n <div>${this.title}</div>\n <mwc-linear-progress determinate progress=\"${this.progress / 100}\" buffer=\"${showBuffer}\" ></mwc-linear-progress>\n <div class=\"description\">${this.description}</div>\n `;\n }\n}\n","import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { DownloadReportEvent } from './../download-manager';\n\ndeclare global {\n interface WindowEventMap {\n \"download-report\": CustomEvent<DownloadReportEvent>\n }\n}\n\n/*\ntodo: \nconsider controller for updating\nconsider litstate\nnew download-bar per download\ndismiss animation\n*/\n\nimport { DownloadBar } from './download-bar';\nDownloadBar;\nimport { Button } from '@material/mwc-button'\nButton;\n\n\n@customElement('message-list')\nexport class MessageList extends LitElement {\n static styles = css`\n :host { \n display: block; \n background-color: rgb(250, 249, 248);\n }\n\n \n .danger {\n --mdc-theme-primary: var(--bootstrap-danger);\n color:var(--bootstrap-danger);\n }\n\n :host([hidden]) { \n display: none; \n }\n\n div {\n display:flex;\n flex-direction:row;\n align-items: center;\n padding-left:10px;\n padding-right:10px;\n }\n .content{\n width:100%;\n margin-left:20px;\n margin-right:20px;\n }\n `;\n\n @property()\n title = \"Starting Download\";\n\n private _progress = 0;\n private _visible = false;\n private _failed = false;\n connectedCallback() {\n super.connectedCallback()\n window.addEventListener(\"download-report\", this._downloadReportEvent);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback()\n window.removeEventListener(\"download-report\", this._downloadReportEvent);\n }\n\n\n private _getDescriptionText = () => {\n switch (true) {\n case (this._progress < 15):\n return 'Initializing';\n case (this._progress < 25):\n return 'Queuing Report';\n case (this._progress < 45):\n return 'Analyzing Report';\n case (this._progress < 65):\n return 'Retrieving Data';\n case (this._progress < 75):\n return 'Preparing Download';\n case (this._progress >= 100):\n return 'Completed';\n default:\n return 'Rendering Report';\n }\n }\n\n private _downloadReportEvent = (event: CustomEvent<DownloadReportEvent>) => {\n console.log(\"DownloadReportEvent status Event triggered\");\n console.log(event);\n this._progress = event.detail.progress;\n this.title = `Downloading: ${event.detail.reportName} `;\n\n if (event.detail.newDownload === true) {\n this._visible = true;\n }\n this._failed = event.detail.failed ? true : false;\n this.requestUpdate();\n }\n\n dismissHandler(event: Event) {\n console.log(event.target);\n // todo might be nicer to have an animation\n this._visible = false;\n this.requestUpdate();\n }\n\n dismissTemplate = html`<mwc-button @click=${this.dismissHandler}>Dismiss</mwc-button>`\n failedTemplate = html`<div class=\"danger\"><span class=\"content\">Error: Unable to download report</span>\n ${this.dismissTemplate}\n </div>`\n\n render() {\n return this._visible ?\n this._failed ? this.failedTemplate :\n html`\n <div>\n <download-bar class=\"content\" title=\"${this.title}\" progress=${this._progress} description=\"${this._getDescriptionText()}\"></download-bar>${this.dismissTemplate}\n </div>`\n : nothing\n }\n\n}","import { css, html, LitElement } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\n\n@customElement('alert-message')\nexport class AlertMessage extends LitElement {\n static styles = css`\n\n :host {\n padding:1em;\n box-sizing: border-box;\n display: grid;\n grid-template-columns: auto 1fr auto;\n align-items: center;\n gap: 1em;\n box-shadow: rgba(0, 0, 0, 0.52) 0px 8px 10px -6px;\n border: 0.5px solid #f3f4f6;\n border-radius: 2px;\n }\n \n :host {\n background-color: white;\n color:#084298;\n }\n\n :host([level=warning]){\n color:#664d03;\n }\n \n :host([level=error]){\n color:#842029;\n }\n \n :host([height=flat]){\n box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;\n }\n\n :host([height=short]){\n box-shadow: rgba(0, 0, 0, 0.52) 0px 2px 4px -2px;\n }\n\n :host([height=average]){\n }\n\n :host([height=tall]){\n box-shadow: rgba(0, 0, 0, 0.52) 0px 25px 50px -12px;\n }\n\n .end-wrapper\n {\n display:flex;gap: 1em;\n }\n`;\n\n @property() level: \"information\" | \"warning\" | \"error\";\n @property() height: \"flat\" | \"short\" | \"average\" | \"tall\" = \"average\";\n \n render() {\n return html`\n <slot name=\"start\">\n <mwc-icon slot=\"start\">${this.#getIcon(this.level)}</mwc-icon>\n </slot>\n <slot></slot>\n <div class=\"end-wrapper\">\n <slot name=\"end\">\n </slot>\n </div>\n `\n }\n\n #getIcon = (level: string) => {\n switch (level) {\n case \"information\":\n return \"info\"\n case \"warning\":\n return \"warning\";\n case \"error\":\n return \"report\";\n default:\n return \"info\"\n }\n }\n}","import appInsights from './../application-insights';\nimport { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { MessagePromiseEvent, MessageDetail, MessagePromise } from 'src/modules/helpers/message-helper';\nimport { later } from 'src/modules/helpers/promise-helper';\nimport { AlertMessage } from './alert-message';\nAlertMessage;\nimport \"@material/mwc-icon\";\n\n//cancelable promise\n//https://stackoverflow.com/questions/22707475/how-to-make-a-promise-from-settimeout \n\ntype MessageType = { message: string, level: \"error\" | \"success\" | \"information\", timer: Promise<MessageType>, showProgress: boolean }\n\n@customElement('message-manager')\nexport class MessageManager extends LitElement {\n static styles = [\n css`\n :host {\n display: flex;\n position: fixed;\n z-index: 1;\n flex-direction: column;\n gap: 1vh;\n inset-block-end: 1em;\n inset-inline-end: 1em;\n\n width:320px;\n }\n\n .alert-message {\n box-shadow: rgba(0, 0, 0, 0.52) 0px 6px 13px -2px;\n }\n\n fluent-progress-ring {\n --density: -3;\n }\n `\n ];\n\n @state() Messages: MessageType[] = []\n\n messageHandler = (e: CustomEvent<MessageDetail>) => {\n this.#addMessage(e.detail.message, e.detail.level);\n }\n\n #addMessage = (message: string, level: \"error\" | \"success\") => {\n var newMessage: MessageType = {\n message: message,\n level: level,\n showProgress: false,\n get timer() {\n return later(3000, this)\n }\n }\n\n this.Messages = [...this.Messages, newMessage];\n newMessage.timer.then((x) =>\n this.removeMessage(x)\n )\n\n console.log(\"message added\")\n\n }\n actionMessageHandler = async (e:MessagePromiseEvent<any>)=> {\n console.log(\"message-manage-action start\");\n\n var newMessage: MessageType = {\n message: e.messages.progress,\n level: \"information\",\n timer: null,\n showProgress: e.messages.progress == null\n }\n this.Messages = [...this.Messages, newMessage];\n \n try {\n await e.promise;\n this.removeMessage(newMessage);\n // maybe it would be better to update message, or replace message (but at this stage it's unlikely to be there for long)\n this.#addMessage(e.messages.success, \"success\")\n } catch (ex) {\n console.log(\"promise error\")\n this.removeMessage(newMessage);\n this.#addMessage(e.messages.failed, \"error\")\n appInsights.trackException(ex)\n } finally {\n console.log(\"message-manage-action end\");\n }\n \n }\n\n promiseMessageHandler = async (e: CustomEvent<MessagePromise<any>>) => {\n var newMessage: MessageType = {\n message: e.detail.messages.progress,\n level: \"information\",\n timer: null,\n showProgress: e.detail.messages.progress == null\n }\n this.Messages = [...this.Messages, newMessage];\n\n try {\n await e.detail.task;\n this.removeMessage(newMessage);\n\n // maybe it would be better to update message, or replace message (but at this stage it's unlikely to be there for long)\n this.#addMessage(e.detail.messages.success, \"success\")\n } catch (ex) {\n console.log(\"promise error\")\n this.removeMessage(newMessage);\n this.#addMessage(e.detail.messages.failed, \"error\")\n appInsights.trackException(ex)\n }\n }\n\n removeMessage = (message: MessageType) => {\n this.Messages = this.Messages.filter(m => m !== message);\n }\n\n\n\n connectedCallback() {\n super.connectedCallback();\n window.addEventListener(\"interface-message\", this.messageHandler);\n window.addEventListener(\"message-promise\", this.promiseMessageHandler);\n window.addEventListener(MessagePromiseEvent.eventName, this.actionMessageHandler);\n }\n\n disconnectedCallback(): void {\n window.removeEventListener(\"interface-message\", this.messageHandler);\n window.removeEventListener(\"message-promise\", this.promiseMessageHandler);\n window.removeEventListener(MessagePromiseEvent.eventName, this.actionMessageHandler);\n }\n render() {\n if (this.Messages.length === 0) {\n return nothing;\n }\n\n return html`\n ${this.Messages.map(m => html`<alert-message level=${m.level}>\n ${m.showProgress ? html`<fluent-progress-ring slot=\"start\"></fluent-progress-ring>` : nothing}\n ${m.message}\n </alert-message>`)}\n `;\n }\n\n\n}\n","import {css, html, LitElement} from 'lit';\nimport {customElement, property, state} from 'lit/decorators.js';\nimport {ChangeType, ReportPermissionChange} from '../services';\n\n@customElement('permission-changes')\nexport class PermissionChanges extends LitElement {\n static styles = css`\n .container {\n box-sizing: border-box;\n padding: 0.25rem;\n max-height: 500px;\n overflow: auto;\n }\n\n .entry {\n border-radius: 0.5rem;\n overflow: hidden;\n transition: box-shadow 0.1s ease-in-out;\n\n &.expanded {\n box-shadow: var(--card-box-shadow);\n }\n }\n\n .expandable {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.25rem;\n cursor: pointer;\n\n &:hover {\n background-color: rgba(0, 0, 0, 0.05);\n }\n\n &.expanded {\n background-color: rgba(0, 0, 0, 0.03);\n }\n\n .expand-icon {\n transition: transform 0.3s ease-in-out;\n\n &.expanded {\n transform: rotate(180deg);\n }\n }\n }\n\n .expandable-content {\n max-height: 0;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n margin-left: 0.5rem;\n gap: 0.5rem;\n transition: max-height 0.2s ease-in-out, padding 0.2s ease-in-out;\n\n &.expanded {\n max-height: 200px;\n overflow: auto;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n animation: hide-scroll 0.2s backwards;\n }\n }\n\n .diff {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n\n &.added {\n color: rgb(15, 62, 15);\n }\n\n &.removed {\n color: rgb(86, 21, 21);\n }\n\n &.updated {\n color: rgb(21, 70, 86);\n }\n }\n\n .count-badge {\n opacity: 0.5;\n font-size: 0.75rem;\n }\n\n @keyframes hide-scroll {\n from, to {\n overflow: hidden;\n }\n }\n `;\n\n @property({type: Object, attribute: \"data\"}) permissionChanges: ReportPermissionChange[];\n\n @state() expandedItem: string | null = null;\n\n toggleExpand(reportKey: number, userKey: number) {\n const itemKey = this.getItemKey(reportKey, userKey);\n this.expandedItem = this.expandedItem === itemKey ? null : itemKey;\n }\n\n getItemKey(reportKey: number, userKey: number): string {\n return `${reportKey}-${userKey}`;\n }\n\n getIconName(changeType: ChangeType) {\n switch (changeType) {\n case ChangeType.Added:\n return 'add_circle';\n case ChangeType.Removed:\n return 'remove_circle';\n case ChangeType.Updated:\n return 'swap_vertical_circle';\n default:\n return 'help_outline';\n }\n }\n\n render() {\n return html`\n <div class=\"container\">\n ${this.permissionChanges.map(pc => {\n const expanded = this.expandedItem === this.getItemKey(pc.reportKey, pc.userKey) ? 'expanded' : '';\n return html`\n <div class=\"entry ${expanded}\">\n <div class=\"expandable ${expanded}\"\n @click=\"${() => this.toggleExpand(pc.reportKey, pc.userKey)}\">\n <div class=\"diff ${pc.changeType.toLowerCase()}\">\n <mwc-icon>${this.getIconName(pc.changeType)}</mwc-icon>\n <span>${pc.changeType} access to report <b>${pc.reportName}</b> for user <b>${pc.userName}</b></span>\n </div>\n <div style=\"display: flex; align-items: center\">\n <b class=\"count-badge\">${pc.facilityChanges.length}</b>\n <mwc-icon class=\"expand-icon ${expanded}\" style=\"user-select: none\">arrow_drop_down</mwc-icon>\n </div>\n </div>\n\n <div class=\"expandable-content ${expanded}\">\n ${pc.facilityChanges.map(fac => html`\n <div class=\"diff ${fac.changeType.toLowerCase()}\">\n <mwc-icon style=\"color: lightgray\">subdirectory_arrow_right</mwc-icon>\n <mwc-icon>${this.getIconName(fac.changeType)}</mwc-icon>\n <span>\n ${fac.changeType} ${fac.decrypt ? 'decrypt' : 'non-decrypt'} access\n ${fac.facilityKey\n ? html` to facility <b>${fac.facilityName}</b>`\n : html` (report only)`\n }\n </span>\n </div>\n `)}\n </div>\n </div>\n `;\n })}\n </div>\n `;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, queryAssignedElements } from 'lit/decorators.js'\n\nexport type RadioButtonListChangeDetail = { value:any, index:number }\n\n@customElement('radio-button-list')\nexport class RadioButtonList extends LitElement {\n static styles = [\n css`\n :host {\n display: block;\n }\n\n div {\n display: flex;\n flex-direction:row;\n \n }\n \n :host([grow]) ::slotted(*) { flex-grow: 1; }\n `\n ];\n\n @property({ attribute:\"selected-value\", type:Object }) selectedValue: any;\n @property({ attribute:\"selected-index\", type:Number }) selectedIndex: number;\n\n @property() label: string;\n\n @queryAssignedElements({selector: 'radio-button'}) buttons: Array<RadioButton>;\n\n\n public selectValue = (value:any) => {\n var valueButton = this.buttons.find(rb => rb.value == value)\n this.selectItem(valueButton);\n }\n\n private selectItem = (item:RadioButton) => {\n this.buttons.forEach((rb, i) => {\n if(item ==rb)\n {\n rb.active = true\n this.selectedValue = rb.value\n this.selectedIndex = i;\n } else{\n rb.active = false;\n }\n });\n }\n\n private clickHandler = (e: MouseEvent) => {\n this.selectItem(e.target as RadioButton)\n this.dispatchEvent(new CustomEvent<RadioButtonListChangeDetail>(\"change\",{ detail:{ value:this.selectedValue, index:this.selectedIndex } }))\n };\n\n render() {\n return html`\n <div>${this.label}</div>\n <div @click=${this.clickHandler}>\n <slot></slot> \n </div>`;\n }\n}\n\n@customElement('radio-button')\nexport class RadioButton extends LitElement {\n static styles = [\n css`\n :host {\n display: flex;\n }\n\n :host([grow]){\n flex-grow:1;\n }\n\n fluent-button {\n --control-corner-radius: 0;\n flex-grow:1;\n }\n `\n ];\n\n @property({ type:Boolean}) active: boolean;\n \n @property({ type: String }) value: string;\n \n private clickHandler = (event:Event) =>{\n }\n render() {\n var appearance = this.active ? \"accent\":\"outline\"\n return html`\n <fluent-button @click=${this.clickHandler} appearance=${appearance} role=\"switch\" >\n <slot name=\"start\" slot=\"start\"></slot>\n <slot name=\"end\" slot=\"end\"></slot>\n <label><slot></slot></label>\n </fluent-button>\n `;\n }\n}\n","import {css, html, LitElement} from 'lit';\nimport {consume} from '@lit/context';\nimport {customElement, state} from 'lit/decorators.js'\nimport {classMap} from 'lit/directives/class-map.js';\nimport {unsafeHTML} from 'lit/directives/unsafe-html.js';\nimport {IReportNews, services} from 'src/services';\nimport {editModeContext} from 'src/context/content-context';\nimport {subscriberKeyContext} from 'src/context/subscriber-context';\n\n@customElement('report-news')\nexport class ReportNews extends LitElement {\n static styles = [\n css`\n .news {\n position: relative;\n margin-bottom: 16px;\n }\n\n .overlap-top-right {\n position: absolute;\n top: 0;\n right: 0;\n }\n\n .preview {\n &[source] {\n position: relative;\n }\n\n &[source]:hover {\n outline: black 1px solid;\n }\n\n &[source]:hover::before {\n content: attr(source);\n width: max-content;\n background-color: black;\n outline: black 1px solid;\n color: #fff;\n text-align: center;\n bottom: 0;\n right: 0;\n padding: 1em;\n position: absolute;\n }\n }\n `\n ];\n\n private static editModeCache = new Map<number, IReportNews[]>();\n\n @consume({context: editModeContext}) public editMode: boolean = false;\n @consume({context: subscriberKeyContext}) public subscriberKey?: number;\n\n @state() reportNews: IReportNews[] = [];\n\n connectedCallback() {\n super.connectedCallback();\n\n const useEditModeCache = this.editMode && !!this.subscriberKey;\n\n if (useEditModeCache) {\n const cachedReportNews = ReportNews.editModeCache.get(this.subscriberKey);\n if (cachedReportNews) {\n this.reportNews = cachedReportNews;\n return;\n }\n }\n\n services.report.news(this.editMode, this.subscriberKey).then((reportNews: IReportNews[]) => {\n this.reportNews = reportNews;\n if (useEditModeCache) {\n ReportNews.editModeCache.set(this.subscriberKey, reportNews);\n }\n });\n }\n\n dismissNews = async (reportKey: number) => {\n this.reportNews = this.reportNews.filter(news => news.reportKey !== reportKey);\n await services.report.dismissNews(reportKey);\n }\n\n render() {\n const classes = {news: true, preview: this.editMode};\n return this.reportNews.length > 0\n ? html`\n <div>\n <slot></slot>\n ${this.reportNews.map((news) =>\n html`\n <div class=${classMap(classes)} source=\"${news.name}\">\n ${unsafeHTML(news.html)}\n ${!this.editMode ? html`\n <close-button class=\"overlap-top-right\" title=\"Dismiss\" @close-view=${async (e: Event) => {\n e.stopPropagation();\n await this.dismissNews(news.reportKey);\n }}>\n </close-button>` : ''}\n </div>`\n )}\n </div>`\n : html``;\n }\n}\n","/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\nimport {Routes} from './routes';\n\n\ntype URLParts = {pathname:string,search:string,hash:string}\n// We cache the origin since it can't change\nconst origin = location.origin || location.protocol + '//' + location.host;\n\n/**\n * A root-level router that installs global event listeners to intercept\n * navigation.\n *\n * This class extends Routes so that it can also have a route configuration.\n *\n * There should only be one Router instance on a page, since the Router\n * installs global event listeners on `window` and `document`. Nested\n * routes should be configured with the `Routes` class.\n */\nexport class Router extends Routes {\n // used to detect if it is a hashchange link, because popstate is called(an we want to ignore)\n // when clicking a hash link <a href=\"#data-sources\">Data Sources</a> popstate is triggered\n isHashChangeNavigation:boolean= false;\n override hostConnected() {\n super.hostConnected();\n window.addEventListener('click', this._onClick);\n window.addEventListener('popstate', this._onPopState);\n window.addEventListener('lit-routes-goto', this._onGoTo)\n // Kick off routed rendering by going to the current URL\n this.goto(`${window.location.pathname}${window.location.search}${window.location.hash}`);\n }\n\n override hostDisconnected() {\n super.hostDisconnected();\n window.removeEventListener('click', this._onClick);\n window.removeEventListener('popstate', this._onPopState);\n }\n\n private _onClick = (e: MouseEvent) => {\n this.isHashChangeNavigation = false;\n const isNonNavigationClick =\n e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey;\n if (e.defaultPrevented || isNonNavigationClick) {\n return;\n }\n\n const anchor = e\n .composedPath()\n .find((n) => (n as HTMLElement).tagName === 'A') as\n | HTMLAnchorElement\n | undefined;\n if (\n anchor === undefined ||\n anchor.target !== '' ||\n anchor.hasAttribute('download') ||\n anchor.getAttribute('rel') === 'external'\n ) {\n return;\n }\n\n const href = anchor.href;\n if (href === '' || href.startsWith('mailto:')) {\n return;\n }\n\n const location = window.location;\n if (anchor.origin !== origin) {\n return;\n }\n\n const path = `${anchor.pathname}${anchor.search}${anchor.hash}` \n if(this.isRouteMatch(path))\n {\n \n if(this.isHashChange(window.location,anchor)){\n // at this point we are going to ignore any \"hash routing\" \n // and let the browser take over\n // maybe be able to change this in the future (once we support child routes)\n console.log(\"router hashchange detected\")\n this.isHashChangeNavigation = true;\n } else {\n e.preventDefault();\n if (href !== location.href) {\n window.history.pushState({}, '', href);\n this.goto(`${anchor.pathname}${anchor.search}${anchor.hash}`);\n }\n } \n \n }\n };\n\n private _onPopState = (_e: PopStateEvent) => {\n if(this.isHashChangeNavigation) { //skip navigation on hashchange event, as currently \"router enter()\" can reload a report\n this.isHashChangeNavigation = false;\n } else {\n this.goto(`${window.location.pathname}${window.location.search}${window.location.hash}`);\n }\n };\n\n private _onGoTo= (_e:RouterGoToEvent) => {\n this.gotoWithPush(_e.url)\n }\n\n isHashChange = (currentUrl:URLParts,newUrl:URLParts) => {\n if(currentUrl.pathname === newUrl.pathname && currentUrl.search === newUrl.search)\n {\n return currentUrl.hash !== newUrl.hash;\n }\n return false;\n }\n}\n\nexport class RouterGoToEvent extends Event {\n static readonly eventName = 'lit-routes-goto';\n onDisconnect?: () => void;\n\n url:string /*| URL*/;\n\n constructor(url:string/*| URL*/) {\n super(RouterGoToEvent.eventName, {\n bubbles: true,\n composed: true,\n cancelable: false,\n });\n this.url = url;\n }\n}\n\ndeclare global {\n interface WindowEventMap {\n [RouterGoToEvent.eventName]:RouterGoToEvent\n }\n}\n","/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/// <reference types=\"urlpattern-polyfill\" />\n\nimport type {ReactiveController, ReactiveControllerHost} from 'lit';\n\n// We cache the origin since it can't change\nconst origin = location.origin || location.protocol + '//' + location.host;\n\nexport interface BaseRouteConfig {\n name?: string | undefined;\n render?: (params: {[key: string]: string | undefined}) => unknown;\n enter?: (params: {\n [key: string]: string | undefined;\n }) => Promise<boolean> | boolean;\n}\n\n/**\n * A RouteConfig that matches against a `path` string. `path` must be a\n * [`URLPattern` compatible pathname pattern](https://developer.mozilla.org/en-US/docs/Web/API/URLPattern/pathname).\n */\nexport interface PathRouteConfig extends BaseRouteConfig {\n path: string;\n}\n\n/**\n * A RouteConfig that matches against a given [`URLPattern`](https://developer.mozilla.org/en-US/docs/Web/API/URLPattern)\n *\n * While `URLPattern` can match against protocols, hostnames, and ports,\n * routes will only be checked for matches if they're part of the current\n * origin. This means that the pattern is limited to checking `pathname` and\n * `search`.\n */\nexport interface URLPatternRouteConfig extends BaseRouteConfig {\n pattern: URLPattern;\n}\n\n/**\n * A description of a route, which path or pattern to match against, and a\n * render() callback used to render a match to the outlet.\n */\nexport type RouteConfig = PathRouteConfig | URLPatternRouteConfig;\n\n// A cache of URLPatterns created for PathRouteConfig.\n// Rather than converting all given RoutConfigs to URLPatternRouteConfig, this\n// lets us make `routes` mutable so users can add new PathRouteConfigs\n// dynamically.\nconst patternCache = new WeakMap<PathRouteConfig, URLPattern>();\n\nconst isPatternConfig = (route: RouteConfig): route is URLPatternRouteConfig =>\n (route as URLPatternRouteConfig).pattern !== undefined;\n\nconst getPattern = (route: RouteConfig) => {\n if (isPatternConfig(route)) {\n return route.pattern;\n }\n let pattern = patternCache.get(route);\n if (pattern === undefined) {\n patternCache.set(route, (pattern = new URLPattern({pathname: route.path})));\n }\n return pattern;\n};\n\n/**\n * A reactive controller that performs location-based routing using a\n * configuration of URL patterns and associated render callbacks.\n */\nexport class Routes implements ReactiveController {\n private readonly _host: ReactiveControllerHost & HTMLElement;\n\n /*\n * The currently installed set of routes in precedence order.\n *\n * This array is mutable. To dynamically add a new route you can write:\n *\n * ```ts\n * this._routes.routes.push({\n * path: '/foo',\n * render: () => html`<p>Foo</p>`,\n * });\n * ```\n *\n * Mutating this property does not trigger any route transitions. If the\n * changes may result is a different route matching for the current path, you\n * must instigate a route update with `goto()`.\n */\n routes: Array<RouteConfig> = [];\n\n /**\n * A default fallback route which will always be matched if none of the\n * {@link routes} match. Implicitly matches to the path \"/*\".\n */\n fallback?: BaseRouteConfig;\n\n ignoreUnknownRoutes:boolean =false;\n /*\n * The current set of child Routes controllers. These are connected via\n * the routes-connected event.\n */\n private readonly _childRoutes: Array<Routes> = [];\n\n private _parentRoutes: Routes | undefined;\n\n /*\n * State related to the current matching route.\n *\n * We keep this so that consuming code can access current parameters, and so\n * that we can propagate tail matches to child routes if they are added after\n * navigation / matching.\n */\n private _currentPathname: string | undefined;\n private _currentRoute: RouteConfig | undefined;\n private _currentParams: {\n [key: string]: string | undefined;\n } = {};\n\n /**\n * Callback to call when this controller is disconnected.\n *\n * It's critical to call this immediately in hostDisconnected so that this\n * controller instance doesn't receive a tail match meant for another route.\n */\n // TODO (justinfagnani): Do we need this now that we have a direct reference\n // to the parent? We can call `this._parentRoutes.disconnect(this)`.\n private _onDisconnect: (() => void) | undefined;\n\n constructor(\n host: ReactiveControllerHost & HTMLElement,\n routes: Array<RouteConfig>,\n options?: {fallback?: BaseRouteConfig, ignoreUnknownRoutes:boolean}\n ) {\n (this._host = host).addController(this);\n this.routes = [...routes];\n this.fallback = options?.fallback;\n this.ignoreUnknownRoutes = options?.ignoreUnknownRoutes ?? false;\n }\n\n /**\n * Returns a URL string of the current route, including parent routes,\n * optionally replacing the local path with `pathname`.\n */\n link(pathname?: string): string {\n if (pathname?.startsWith('/')) {\n return pathname;\n }\n if (pathname?.startsWith('.')) {\n throw new Error('Not implemented');\n }\n pathname ??= this._currentPathname;\n return (this._parentRoutes?.link() ?? '') + pathname;\n }\n\n\n isActiveRoute = (routeName:string) =>this._currentRoute?.name === routeName\n \n\n async gotoWithPush(pathname: string, data?:any) {\n window.history.pushState(data, null,pathname);\n return this.goto(pathname)\n }\n\n\n\n /**\n * Navigates this routes controller to `pathname`.\n *\n * This does not navigate parent routes, so it isn't (yet) a general page\n * navigation API. It does navigate child routes if pathname matches a\n * pattern with a tail wildcard pattern (`/*`).\n */\n async goto(pathname: string) {\n // TODO (justinfagnani): handle absolute vs relative paths separately.\n // TODO (justinfagnani): do we need to detect when goto() is called while\n // a previous goto() call is still pending?\n\n // TODO (justinfagnani): generalize this to handle query params and\n // fragments. It currently only handles path names because it's easier to\n // completely disregard the origin for now. The click handler only does\n // an in-page navigation if the origin matches anyway.\n let tailGroup: string | undefined;\n\n if (this.routes.length === 0 && this.fallback === undefined) {\n // If a routes controller has none of its own routes it acts like it has\n // one route of `/*` so that it passes the whole pathname as a tail\n // match.\n tailGroup = pathname;\n this._currentPathname = '';\n // Simulate a tail group with the whole pathname\n this._currentParams = {0: tailGroup};\n } else {\n const route = this._getRoute(pathname);\n if (route === undefined) {\n if(this.ignoreUnknownRoutes){\n console.error(`No route found for ${pathname}`)\n return;\n } else {\n throw new Error(`No route found for ${pathname}`);\n }\n }\n\n const pattern = getPattern(route);\n const result = pattern.exec(pathname, origin);\n const params = { ...result?.pathname.groups, ...result?.search.groups } ;\n tailGroup = getTailGroup(params);\n if (typeof route.enter === 'function') {\n const success = await route.enter(params);\n // If enter() returns false, cancel this navigation\n if (success === false) {\n return;\n }\n }\n // Only update route state if the enter handler completes successfully\n this._currentRoute = route;\n this._currentParams = params;\n this._currentPathname =\n tailGroup === undefined\n ? pathname\n : pathname.substring(0, pathname.length - tailGroup.length);\n }\n\n // Propagate the tail match to children\n if (tailGroup !== undefined) {\n for (const childRoutes of this._childRoutes) {\n childRoutes.goto(tailGroup);\n }\n }\n this._host.requestUpdate();\n }\n\n /**\n * The result of calling the current route's render() callback.\n */\n outlet() {\n return this._currentRoute?.render?.(this._currentParams);\n }\n\n /**\n * The current parsed route parameters.\n */\n get params() {\n return this._currentParams;\n }\n\n isRouteMatch = (pathname: string):boolean => this._getRoute(pathname) != undefined;\n \n /**\n * Matches `url` against the installed routes and returns the first match.\n */\n private _getRoute(pathname: string): RouteConfig | undefined {\n const url = new URL(pathname, origin);\n \n const matchedRoute = this.routes.find((r) =>\n getPattern(r).test({pathname:url.pathname,search:url.search})\n );\n if (matchedRoute || this.fallback === undefined) {\n return matchedRoute;\n }\n if (this.fallback) {\n // The fallback route behaves like it has a \"/*\" path. This is hidden from\n // the public API but is added here to return a valid RouteConfig.\n return {...this.fallback, path: '/*'};\n }\n return undefined;\n }\n\n hostConnected() {\n this._host.addEventListener(\n RoutesConnectedEvent.eventName,\n this._onRoutesConnected\n );\n const event = new RoutesConnectedEvent(this);\n this._host.dispatchEvent(event);\n this._onDisconnect = event.onDisconnect;\n }\n\n hostDisconnected() {\n // When this child routes controller is disconnected because a parent\n // outlet rendered a different template, disconnecting will ensure that\n // this controller doesn't receive a tail match meant for another route.\n this._onDisconnect?.();\n this._parentRoutes = undefined;\n }\n\n private _onRoutesConnected = (e: RoutesConnectedEvent) => {\n // Don't handle the event fired by this routes controller, which we get\n // because we do this.dispatchEvent(...)\n if (e.routes === this) {\n return;\n }\n\n const childRoutes = e.routes;\n this._childRoutes.push(childRoutes);\n childRoutes._parentRoutes = this;\n\n e.stopImmediatePropagation();\n e.onDisconnect = () => {\n // Remove route from this._childRoutes:\n // `>>> 0` converts -1 to 2**32-1\n this._childRoutes?.splice(\n this._childRoutes.indexOf(childRoutes) >>> 0,\n 1\n );\n };\n\n const tailGroup = getTailGroup(this._currentParams);\n if (tailGroup !== undefined) {\n childRoutes.goto(tailGroup);\n }\n };\n}\n\n/**\n * Returns the tail of a pathname groups object. This is the match from a\n * wildcard at the end of a pathname pattern, like `/foo/*`\n */\nconst getTailGroup = (groups: {[key: string]: string | undefined}) => {\n let tailKey: string | undefined;\n for (const key of Object.keys(groups)) {\n if (/\\d+/.test(key) && (tailKey === undefined || key > tailKey!)) {\n tailKey = key;\n }\n }\n return tailKey && groups[tailKey];\n};\n\n/**\n * This event is fired from Routes controllers when their host is connected to\n * announce the child route and potentially connect to a parent routes controller.\n */\nexport class RoutesConnectedEvent extends Event {\n static readonly eventName = 'lit-routes-connected';\n readonly routes: Routes;\n onDisconnect?: () => void;\n\n constructor(routes: Routes) {\n super(RoutesConnectedEvent.eventName, {\n bubbles: true,\n composed: true,\n cancelable: false,\n });\n this.routes = routes;\n }\n}\n\ndeclare global {\n interface HTMLElementEventMap {\n [RoutesConnectedEvent.eventName]: RoutesConnectedEvent;\n }\n}","import { html, LitElement } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\n\n/**\n * Attaches to click and calls show on target component\n */\n@customElement(\"show-component-wrapper\")\nexport class ShowComponentWrapper extends LitElement {\n @property() for: string;\n\n clickEventHandler(event: Event) {\n const target = document.getElementById(this.for);\n // todo should deal with target === null or show not existing\n (target as any).show();\n }\n\n render() {\n return html`\n <slot @click=${this.clickEventHandler}></slot>\n `\n }\n}","import { LitElement, html, css, nothing } from 'lit';\nimport { property, customElement } from 'lit/decorators.js';\nimport { Icon } from '@material/mwc-icon';\nIcon;\n\n// todo can panels go on top of each other (dynamic z-index?)\n// todo better sizing (maybe 100% for small screens)\n// todo -- background theme color\n// todo consider moving the the other content\n// todo disablebutton property\n// todo escape closes panel\n\n@customElement('side-panel')\nexport class SidePanel extends LitElement {\n\n @property({ type: Boolean, reflect: true }) open = false;\n @property({ type: Boolean, attribute: \"open-window\" }) openWindow = false;\n @property({ attribute: \"open-window-link\" }) openWindowLink:string;\n\n static styles = css`\n :host { \n display: block; \n position:fixed;\n top:0;\n left:0;\n transition: 0.5s; \n width:min-content;\n min-width:50%;\n max-width:100%;\n left: -100%;\n z-index:1;\n height:100vh;\n overflow:auto;\n background-color:white;\n\n box-sizing: border-box;\n border:2px;\n border-right-style:solid;\n border-right: 2px solid rgb(192, 192, 192);\n\n }\n\n .content-wrapper{\n padding: 2rem;\n isolation:isolate;\n }\n\n .close-button{\n position: sticky;\n top: 14px;\n float: right;\n border-radius: 30px;\n margin: 14px;\n background-color:transparent;\n backdrop-filter: grayscale(1) brightness(1.8) blur(15px);\n\n z-index: 1;\n }\n\n :host([open]) {\n left:0;\n }\n\n `;\n\n show = () => {\n this.open = true;\n }\n\n toggle = () => {\n this.open = !this.open;\n }\n\n hide = () => {\n this.open = false;\n }\n\n render() {\n return html`\n <mwc-icon-button icon=\"close\" class=\"close-button\" @click=${this.hide}></mwc-icon-button>\n ${this.openWindow ? html`<mwc-icon-button icon=\"open_in_new\" class=\"close-button\" @click=${() =>{ this.open=false;window.open(this.openWindowLink); }} ></mwc-icon-button>`:nothing}\n <div class=\"content-wrapper\">\n <slot>\n </slot>\n </div>\n `;\n }\n}","import { css, html, LitElement, nothing } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\n\nimport \"@material/mwc-icon\"\n\n@customElement('thalamus-card')\nexport class ThalamusCard extends LitElement {\n\n static styles = css`\n :host {\n\n box-sizing:border-box;\n display: block;\n\n border: 0px solid rgba(0,0,0,.125);\n border-radius: 0.25rem;\n\n background-color: var( --card-background-color);\n box-shadow: var(--card-box-shadow);\n }\n\n .body {\n padding: 1.25rem;\n }\n\n header {\n display:flex;\n flex-direction: row;\n justify-content: space-between;\n\n font-weight: 500;\n line-height: 1.2;\n font-size: 1.25rem;\n align-items: center;\n gap: 1em;\n }\n\n hr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n border: 0;\n border-top: 1px solid rgba(0,0,0,.1);\n }\n`;\n\n @property() title: string;\n @property() icon: string;\n @property({ type:Boolean}) underline: boolean;\n render() {\n return html`\n <slot name=\"media\"></slot>\n <div class=\"body\">\n <header>\n <div>\n ${this.title}\n </div>\n <slot name=\"header-content\"></slot>\n <mwc-icon>\n ${this.icon}\n </mwc-icon>\n </header>\n ${this.underline? html`<hr/>`:nothing}\n <slot></slot>\n </div>\n`\n }\n}","import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js'\n\n@customElement('thalamus-hero')\nexport class ThalamusHero extends LitElement {\n static styles = [\n css`\n :host {\n display: block;\n \n /* padding: 1em;*/\n\n /*background-color:#dbeeff;*/\n box-shadow:0px 10px 25px -10px rgba(0,0,0,0.52);\n\n \n padding: clamp(1em, 5%, 6em);\n }\n\n :host([short]){\n padding-block: 0;\n }\n\n .grid{\n display:grid;\n grid-template-columns:1fr 1fr;\n gap:1em;\n }\n\n .left {\n display:flex;\n flex-direction: column;\n justify-content: space-evenly;\n gap:0.8em;\n }\n\n .title {\n font-size:2em;\n font-weight:700;\n }\n\n .cta{\n \n }\n .cta fluent-button {\n border-radius:0;\n --control-corner-radius:0;\n /*box-shadow: 5px 10px;*/\n box-shadow:0px 10px 25px -10px rgba(0,0,0,0.52);\n }\n\n img{\n display: block;\n width: 100%; /* or any custom size */\n /*height: 100%; \n object-fit: contain;*/\n }\n\n .image{\n align-self: center;\n justify-self: center;\n }\n\n a {\n //just to make it hidden\n display:contents\n }\n `\n ];\n\n@property({ type: String }) title: string;\n@property({ type: String }) description: string;\n@property({ type: String, attribute:\"call-to-action\" }) callToAction: string;\n@property({ type: String, attribute:\"call-to-action-url\" }) callToActionUrl: string;\n@property({ type: String, attribute:\"src\" }) src: string;\n\n@property({ type: Boolean, attribute:\"short\" }) short:boolean=false;\n\n render() {\n return html`\n \n <div class=\"grid\">\n <div class=\"left\">\n <div class=\"title\">${this.title}</div>\n <div class=\"description\">\n <slot name=\"description\">\n ${this.description}\n </slot>\n </div>\n <slot name=\"cta\">\n ${this.callToActionUrl != null ? html`\n <div class=\"cta\">\n <a href=\"${this.callToActionUrl}\" >\n <fluent-button type=\"button\" appearance=\"outline\">${this.callToAction}</fluent-button>\n </a>\n </div>\n `:nothing} \n </slot>\n </div>\n \n \n <div class=\"image\">\n <slot name=\"image\">\n <img src=${this.src}>\n <slot>\n </div>\n\n </div>\n \n \n `;\n }\n}\n","import { css, html, LitElement } from \"lit\";\nimport { customElement, property, query } from \"lit/decorators.js\";\nimport * as pbi from 'powerbi-client';\nimport appInsights from \"src/application-insights\";\nimport { IEmbedSettings } from \"src/services\";\nimport { EmbeddedPowerBiManager } from \"./embedded-powerbi-manager\";\n\nEmbeddedPowerBiManager;\n@customElement(\"thalamus-powerbi-report\")\nexport class ThalamusPowerBiReport extends LitElement {\n\n static styles = css`\n :host{\n display:flex\n }\n\n embedded-powerbi-manager{\n flex-grow:1\n }\n `;\n\n constructor() {\n super();\n }\n\n @property({ attribute: \"report-key\", type: Number }) reportKey: number;\n @property({ attribute: \"username\", }) username: string;\n @property({ attribute: \"facility-reference\", }) facilityReference?: string;\n @property({ attribute: \"embed-settings\", type: Object }) embedSettings: IEmbedSettings;\n\n @query('#embedded-powerbi-manager-id') protected _powerbiManager: EmbeddedPowerBiManager\n\n private _report: pbi.Report;\n\n\n async firstUpdated() {\n this._report = await this._powerbiManager.loadReport({ reportKey: this.reportKey, username: this.username, facilityReference:this.facilityReference }, this.embedSettings);\n }\n\n getCurrentState = async (): Promise<string> => (await this._report.bookmarksManager.capture()).state;\n\n get report() {\n return this._report;\n }\n\n\n fullscreen = () => this._powerbiManager.fullscreen();\n\n loadContainerDataFromActivePage = async (containerName: string) => {\n const activePage = await this._report.getActivePage();\n const visuals = await activePage.getVisuals();\n // todo this is currently kinda bugged, as there is a ton of incorrectly named pages in the database\n var visual = visuals?.find((visual) => visual.name == containerName);\n if(visual == null)\n {\n appInsights.trackEvent({ name:\"power-bi-report-visual-not-found\", properties: { containerName: containerName, page:activePage?.name, reportId:activePage?.report?.config?.id, error:true } } )\n }\n return await visual.exportData(pbi.models.ExportDataType.Summarized)\n }\n\n render = () => html`<embedded-powerbi-manager id=\"embedded-powerbi-manager-id\" ></embedded-powerbi-manager>`;\n}\n","import { LitElement, html } from 'lit';\nimport { property, customElement } from 'lit/decorators.js';\n\nimport '@justinribeiro/lite-youtube';\n@customElement('youtube-element')\nexport class YouTubeElement extends LitElement {\n @property() videoid: string;\n\n render() {\n return html`\n <lite-youtube videoid=\"${this.videoid}\"></lite-youtube>\n `;\n }\n}","import { LitElement, html, css } from 'lit';\nimport { property, customElement } from 'lit/decorators.js';\nimport { YouTubeElement } from './youtube-element';\nYouTubeElement;\n\nimport './thalamus-card';\nimport { bootstrap4Styles } from '../styles/bootstrap4';\n//https://codingyaar.com/bootstrap-video-card/\n//render root is dom and we need bootstrap css for now\n\n@customElement('youtube-card')\nexport class YouTubeCard extends LitElement {\n @property() title: string;\n @property() videoid: string;\n @property() description: string;\n\n static styles = [bootstrap4Styles,\n css`\n h5 {\n margin-block-start: 0;\n }\n `]\n\n render() {\n return html`\n <thalamus-card title=${this.title} style=\"--card-background-color:white\">\n <youtube-element videoid=\"${this.videoid}\" slot=media></youtube-element>\n </thalamus-card>\n `;\n }\n\n}"],"names":["I","CategoryEdit","show","this","_dialog","event","requestUpdate","async","dispatchEvent","CustomEvent","detail","description","_textField","value","icon","_iconName","myEvent","type","bubbles","composed","render","heading","styles","CategoryItem","updating","editCategory","clickCategory","_categoryEdit","updateCategoryHandler","key","requestDeleteHandler","cancelBubble","hidden","Number","Boolean","CategoryList","categoryItems","createCategoryHandler","console","log","newItem","busy","response","displayCreateCategory","_newCategory","map","cat","attribute","CloseButton","ConfirmationDialog","okHandler","e","ConfirmedEvent","dialog","close","openDialogHandler","stopPropagation","preventDefault","showModal","closeEventHandler","confirmText","String","Event","constructor","super","eventName","cancelable","CtxContentButtonGroup","CtxContentButton","behaviour","_clicked","_renderDisplayContent","displayIcon","displayText","_renderDisplayIcon","newlines","boldSnippet","italicSnippet","linkSnippet","heading1Snippet","heading2Snippet","heading3Snippet","heading4Snippet","heading5Snippet","heading6Snippet","orderedListSnippet","unOrderedListSnippet","tableSnippet","tableOfContentsSnippet","heroSnippet","informationMessageSnippet","warningMessageSnippet","errorMessageSnippet","reportNewsSnippet","colleagueAuditSnippet","documentationSnippet","CtxContentEditor","_value","newValue","_internals","setFormValue","_handlePreviewSlotChange","target","assignedElements","forEach","element","HTMLElement","tagName","toLowerCase","_preview","scrollToCursor","previewPosition","_setPreviewValueAndCursorPosition","cursorPosition","readonly","showPreview","editMode","_handleContentFromToolbar","textArea","handleContentChange","content","_textAreaContentChanged","attachInternals","addEventListener","connectedCallback","hasAttribute","getAttribute","disconnectedCallback","document","removeEventListener","_renderTextAreaAndPreviewSlot","_renderBottomSlot","_renderTextArea","classes","_renderPreviewSlot","formAssociated","context","CtxContentHeadingSelect","CtxContentPreview","grow","htmlContent","_markdownPreviewTask","task","signal","management","markdown","preview","catch","aborted","markup","args","createRenderRoot","_scrollToCursor","bottomOffset","contentLength","length","bottomPosition","scrollIntoView","behavior","block","_renderPerview","initial","pending","complete","error","CtxContentSelectOption","_selected","CtxContentSelect","_handleOutsideClick","showOptions","composedPath","includes","_toggleShowOptions","_optionSelected","_boundHandleOutsideClick","bind","_renderHeading","_renderIcon","_renderOptions","headingIcon","_renderHeadingIcon","CtxContentSnippetButton","currentSnippet","snippet","CtxContentSnippetsSelectOption","insert","CtxContentSnippetsSelect","CtxContentTextArea","initialValue","_contentChanged","editor","selectionStart","_insertContent","_wrapSelectedContent","contentToInsert","setRangeText","selectionEnd","setSelectionRange","focus","start","end","selectedContent","slice","wrappedContent","pre","post","CtxContentToolbar","_selectedToolbarContentChanged","_renderRightSlot","_renderHelpIcon","EditorContentEvent","snippets","bold","wrap","documentLayout","errorAlert","hero","infoAlert","italic","link","orderedList","tableOfContents","unorderedList","warningAlert","reportNews","colleagueAudit","CtxCard","underline","CtxCheckbox","toString","_dispatchChangeEvent","setAttribute","_setValue","attrValue","_toggleState","renderIcon","renderStateContentSlot","slotName","CtxHero","short","title","callToActionUrl","callToAction","src","DcaSelect","required","autofocus","_options","Array","from","querySelectorAll","firstUpdated","internals","_manageRequired","_onInput","match","_findOptionMatch","_input","setValidity","valueMissing","find","option","innerText","placeholder","text","DcaWizard","CompleteLabel","activeStep","canNavigatePrevious","previousStepHandler","_getActiveStep","index","Steps","findIndex","i","previousStep","step","_setLastStep","nextStepHandler","checkValidity","completeStep","nextStep","_getSteps","setSteps","lastStep","currentStep","_isLastStep","DcaWizardStep","isValid","DialogWrapper","DisplaySelect","iconSlotName","buttonClickHandler","menu","togglePopover","menuClickHandler","iconSlot","closest","id","hidePopover","EmbeddedPowerBiManager","reportAccessor","_reportAccessor","_loaded","bootstrap","_firstPowerBiReport","updateComplete","_embeddedList","powerBiType","config","hostname","embedUrl","loadReport","reportRequest","clientEmbedSettings","bookmarkName","initializeDefaultActiveEmbed","reportKey","_tokenUpdater","slowLoadTimeout","window","clearTimeout","stopTrackEvent","action","SetEmbedRequestData","embedResponse","GetCachedEmbedCode","isMobile","layoutType","LayoutType","MobilePortrait","mobileSettings","setOrCreateActiveEmbed","clientGroup","reportId","Map","Object","entries","datasets","getEmbedConfiguration","settings","bookmark","name","startTrackEvent","setTimeout","loadedReport","loadFrame","_report","AttachInterval","expiration","currentEmbed","embed","loadedDatasets","push","_activeEmbed","fullscreen","getCurrentReport","getReportBookmarks","bookmarksManager","getBookmarks","getReportState","capturedBookmark","capture","state","getReport","getPages","getTableColumns","visualDescriptor","exportData","ExportDataType","Summarized","data","split","setReportState","applyState","setAccessToken","accessToken","applyBookmark","apply","getCurrentEmbedElement","shadowRoot","querySelector","getActivePageInfo","activePage","getActivePage","displayName","embedToken","url","Promise","resolve","reject","oldReport","off","report","getId","on","pageChangedEventHandler","selectionChangedEventHandler","visualClickedEventHandler","Error","trackException","exception","trackTrace","message","properties","renderedEventHandler","raiseUserActivityEvent","pageChangeEvent","activityType","activityEvent","item","embedItem","hideReport","defaultEmbed","existingDataset","incomingDatasets","incomingDatasetKey","keys","has","get","EmbeddedPowerBiWrapper","replayEvent","powerbi","reportContainer","FeedbackManager","pageFeedback","showFeedbackHandler","displayFeedbackEvent","feedbackRef","ref","removeFeedback","filter","x","DisplayFeedbackEvent","PageFeedback","reset","_textArea","submit","reportValidity","_RadioButtons","selectedValue","users","sendFeedback","location","href","messages","success","failed","progress","er","selectValue","register","FormInput","stringify","_handleFormDataEvent","_slottedChildren","assignedNodes","flatten","node","nodeType","Node","ELEMENT_NODE","propertyName","property","nodes","query","n","formData","delete","formValue","JSON","append","GroupUserItem","failedState","requestToggleDrillDownHandler","ProgressPromise","groupUserKey","_switch","checked","innerPromise","_progress","indeterminate","username","drilldown","failure","InfoSummary","_infoDetailChangeEventHandler","open","closestDocumentFragment","closestNode","parentNode","isDocumentFragment","getElementById","for","clickEventHandler","InfoDetails","toggle","downloadReportEvent","reflect","predicate","RegisterInput","inputElement","InputSelect","applyRequiredDataListItem","submitFormData","findOption","list","setCustomValidity","inputName","dataset","form","datalist","j","options","DownloadBar","showBuffer","MessageList","_visible","_failed","_getDescriptionText","_downloadReportEvent","reportName","newDownload","dismissTemplate","dismissHandler","failedTemplate","AlertMessage","height","level","MessageManager","Messages","messageHandler","newMessage","showProgress","timer","then","removeMessage","actionMessageHandler","promise","ex","promiseMessageHandler","m","PermissionChanges","expandedItem","toggleExpand","userKey","itemKey","getItemKey","getIconName","changeType","Added","Removed","Updated","permissionChanges","pc","expanded","userName","facilityChanges","fac","decrypt","facilityKey","facilityName","RadioButtonList","valueButton","buttons","rb","selectItem","active","selectedIndex","clickHandler","label","selector","RadioButton","appearance","ReportNews","dismissNews","news","useEditModeCache","subscriberKey","cachedReportNews","editModeCache","set","html","origin","protocol","host","Router","isHashChangeNavigation","_onClick","isNonNavigationClick","button","metaKey","ctrlKey","shiftKey","defaultPrevented","anchor","undefined","startsWith","path","pathname","search","hash","isRouteMatch","isHashChange","history","pushState","goto","_onPopState","_e","_onGoTo","gotoWithPush","currentUrl","newUrl","hostConnected","hostDisconnected","RouterGoToEvent","patternCache","WeakMap","getPattern","route","pattern","isPatternConfig","URLPattern","Routes","routes","ignoreUnknownRoutes","_childRoutes","_currentParams","isActiveRoute","routeName","_currentRoute","_getRoute","_onRoutesConnected","childRoutes","_parentRoutes","stopImmediatePropagation","onDisconnect","splice","indexOf","tailGroup","getTailGroup","_host","addController","fallback","_currentPathname","result","exec","params","groups","enter","substring","outlet","URL","matchedRoute","r","test","RoutesConnectedEvent","_onDisconnect","tailKey","ShowComponentWrapper","SidePanel","openWindow","hide","openWindowLink","ThalamusCard","ThalamusHero","ThalamusPowerBiReport","getCurrentState","_powerbiManager","loadContainerDataFromActivePage","containerName","visuals","getVisuals","visual","trackEvent","page","facilityReference","embedSettings","YouTubeElement","videoid","YouTubeCard","bootstrap4"],"sourceRoot":""}