@oicl/openbridge-webcomponents 2.0.0-next.100 → 2.0.0-next.101
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -100,10 +100,10 @@ let ObcAlertList = class extends LitElement {
|
|
|
100
100
|
}
|
|
101
101
|
handleElementsChange() {
|
|
102
102
|
this.mutationObserver?.takeRecords();
|
|
103
|
+
this.updateEmpty();
|
|
103
104
|
if (!this.checkVisibility()) {
|
|
104
105
|
return;
|
|
105
106
|
}
|
|
106
|
-
this.updateEmpty();
|
|
107
107
|
const elements = this.getAlertItems();
|
|
108
108
|
const oldElementTop = new Map(this.oldElementTop);
|
|
109
109
|
requestAnimationFrame(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alert-list.js","sources":["../../../src/building-blocks/alert-list/alert-list.ts"],"sourcesContent":["import {LitElement, PropertyValues, html, nothing, unsafeCSS} from 'lit';\nimport {queryAssignedElements, query, property, state} from 'lit/decorators.js';\nimport {customElement} from '../../decorator.js';\nimport compentStyle from './alert-list.css?inline';\nimport '../../components/scrollbar/scrollbar.js';\nimport {ObcScrollbar} from '../../components/scrollbar/scrollbar.js';\nimport {ObcAlertMenuItem} from '../../components/alert-menu-item/alert-menu-item.js';\n\n/**\n * @slot - Default slot for the alert list items.\n * @slot empty-icon - Icon shown when the list is empty.\n * @slot empty-title - Title shown when the list is empty.\n * @slot empty-description - Description shown when the list is empty.\n * @stable\n */\n@customElement('obc-alert-list')\nexport class ObcAlertList extends LitElement {\n @property({attribute: false}) filter: (item: HTMLElement) => boolean = () =>\n true;\n\n private oldElementTop: Map<HTMLElement, number> = new Map();\n private mutationObserver: MutationObserver | null = null;\n private intersectionObserver: IntersectionObserver | null = null;\n private hasRenderedPanel = false;\n @state() _empty = false;\n\n @queryAssignedElements({flatten: true})\n private alertItems!: HTMLElement[];\n\n @query('#scrollbar', true)\n private scrollbar!: ObcScrollbar;\n\n override firstUpdated() {\n this.updateEmpty();\n this.setupMutationObserver();\n }\n\n override connectedCallback() {\n super.connectedCallback();\n const intersectionObserver = new IntersectionObserver((entries) => {\n // If intersectionRatio is 0, the target is out of view\n if (entries[0].intersectionRatio === 0) {\n this.hasRenderedPanel = false;\n }\n });\n intersectionObserver.observe(this);\n this.intersectionObserver = intersectionObserver;\n\n this.setupMutationObserver();\n }\n\n override disconnectedCallback() {\n if (this.mutationObserver) {\n this.mutationObserver.disconnect();\n this.mutationObserver = null;\n }\n if (this.intersectionObserver) {\n this.intersectionObserver.disconnect();\n this.intersectionObserver = null;\n }\n }\n\n protected override willUpdate(_changedProperties: PropertyValues): void {\n if (_changedProperties.has('filter')) {\n this.updateEmpty();\n this.updateOldElementTop();\n }\n }\n\n private updateEmpty() {\n this._empty = this.getAlertItems().length === 0;\n }\n\n private getAlertItems() {\n return this.alertItems.filter(this.filter);\n }\n\n private updateOldElementTop() {\n const elements = this.getAlertItems();\n if (elements.length === 0) {\n return;\n }\n\n // Get the top of the element,\n // the element may be in an animation\n // we therefor sum the height of each element\n const firstElement = elements[0];\n const firstElementRect = firstElement.getBoundingClientRect();\n let top = firstElementRect.top;\n this.oldElementTop.clear();\n elements.forEach((element) => {\n const elementRect = element.getBoundingClientRect();\n if (elementRect.height === 0) {\n return;\n }\n this.oldElementTop.set(element, top);\n top += elementRect.height;\n });\n }\n\n private setupMutationObserver() {\n if (this.mutationObserver) {\n // Make a new observer to avoid memory leaks\n this.mutationObserver.disconnect();\n this.mutationObserver = null;\n }\n this.mutationObserver = new MutationObserver(() => {\n this.handleElementsChange();\n });\n\n const slotElements = this.alertItems;\n slotElements.forEach((element) => {\n // Earlier observed elements are just updated, and not registered twice.\n this.mutationObserver?.observe(element, {\n attributes: true,\n attributeFilter: ['status', 'shelved'],\n });\n });\n }\n\n private handleSlotChange() {\n this.handleElementsChange();\n this.setupMutationObserver();\n }\n\n private handleElementsChange() {\n // Take records to ensure the observer is not triggered again\n this.mutationObserver?.takeRecords();\n if (!this.checkVisibility()) {\n return;\n }\n\n this.updateEmpty();\n const elements = this.getAlertItems();\n // Animate the elements to their new positions\n const oldElementTop: Map<HTMLElement, number> = new Map(this.oldElementTop);\n\n requestAnimationFrame(() => {\n this.updateOldElementTop();\n let hasNewElements = false;\n elements.forEach((element) => {\n const elementRect = element.getBoundingClientRect();\n const oldTop = oldElementTop.get(element);\n if (oldTop === undefined) {\n // New element\n (element as ObcAlertMenuItem).animateIntro = this.hasRenderedPanel;\n hasNewElements = true;\n setTimeout(() => {\n (element as ObcAlertMenuItem).animateIntro = false;\n }, 101);\n return;\n }\n const diff = oldTop - elementRect.top;\n if (diff === 0) return;\n element.style.transform = `translateY(${diff}px)`;\n element.style.transition = 'none';\n\n // Force a reflow to ensure the animation is applied\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n element.offsetHeight;\n\n // Remove the transition after the animation is complete\n element.style.transition = 'transform 100ms ease-in-out';\n element.style.transform = 'translateY(0px)';\n });\n this.hasRenderedPanel = true;\n if (hasNewElements) {\n setTimeout(() => {\n this.updateOldElementTop();\n }, 101);\n }\n });\n }\n\n public getVisibleElements(): {element: HTMLElement; index: number}[] {\n // Get all slotted elements in the visible tab's scrollbar\n\n const scrollbarRect = this.scrollbar.getBoundingClientRect();\n const slottedElements = this.getAlertItems();\n\n // Filter for only visible elements that are within the scrollbar viewport\n return slottedElements\n .map((element, index) => ({element, index}))\n .filter(({element}) => {\n const style = window.getComputedStyle(element);\n if (style.display === 'none' || style.visibility === 'hidden') {\n return false;\n }\n\n // Check if the element is within the scrollbar's viewport\n const elementRect = element.getBoundingClientRect();\n\n // Check if element overlaps with scrollbar viewport\n const isVisible = !(\n elementRect.top < scrollbarRect.top ||\n elementRect.bottom > scrollbarRect.bottom\n );\n\n return isVisible;\n });\n }\n\n override render() {\n return html` <obc-scrollbar class=\"alert-list\" id=\"scrollbar\">\n <slot @slotchange=${this.handleSlotChange}></slot>\n ${this._empty\n ? html` <div class=\"empty-list\">\n <div class=\"icon\">\n <slot name=\"empty-icon\"></slot>\n </div>\n <div class=\"empty-title\">\n <slot name=\"empty-title\"></slot>\n </div>\n <div class=\"empty-description\">\n <slot name=\"empty-description\"></slot>\n </div>\n </div>`\n : nothing}\n </obc-scrollbar>`;\n }\n\n static override styles = unsafeCSS(compentStyle);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'obc-alert-list': ObcAlertList;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"alert-list.js","sources":["../../../src/building-blocks/alert-list/alert-list.ts"],"sourcesContent":["import {LitElement, PropertyValues, html, nothing, unsafeCSS} from 'lit';\nimport {queryAssignedElements, query, property, state} from 'lit/decorators.js';\nimport {customElement} from '../../decorator.js';\nimport compentStyle from './alert-list.css?inline';\nimport '../../components/scrollbar/scrollbar.js';\nimport {ObcScrollbar} from '../../components/scrollbar/scrollbar.js';\nimport {ObcAlertMenuItem} from '../../components/alert-menu-item/alert-menu-item.js';\n\n/**\n * @slot - Default slot for the alert list items.\n * @slot empty-icon - Icon shown when the list is empty.\n * @slot empty-title - Title shown when the list is empty.\n * @slot empty-description - Description shown when the list is empty.\n * @stable\n */\n@customElement('obc-alert-list')\nexport class ObcAlertList extends LitElement {\n @property({attribute: false}) filter: (item: HTMLElement) => boolean = () =>\n true;\n\n private oldElementTop: Map<HTMLElement, number> = new Map();\n private mutationObserver: MutationObserver | null = null;\n private intersectionObserver: IntersectionObserver | null = null;\n private hasRenderedPanel = false;\n @state() _empty = false;\n\n @queryAssignedElements({flatten: true})\n private alertItems!: HTMLElement[];\n\n @query('#scrollbar', true)\n private scrollbar!: ObcScrollbar;\n\n override firstUpdated() {\n this.updateEmpty();\n this.setupMutationObserver();\n }\n\n override connectedCallback() {\n super.connectedCallback();\n const intersectionObserver = new IntersectionObserver((entries) => {\n // If intersectionRatio is 0, the target is out of view\n if (entries[0].intersectionRatio === 0) {\n this.hasRenderedPanel = false;\n }\n });\n intersectionObserver.observe(this);\n this.intersectionObserver = intersectionObserver;\n\n this.setupMutationObserver();\n }\n\n override disconnectedCallback() {\n if (this.mutationObserver) {\n this.mutationObserver.disconnect();\n this.mutationObserver = null;\n }\n if (this.intersectionObserver) {\n this.intersectionObserver.disconnect();\n this.intersectionObserver = null;\n }\n }\n\n protected override willUpdate(_changedProperties: PropertyValues): void {\n if (_changedProperties.has('filter')) {\n this.updateEmpty();\n this.updateOldElementTop();\n }\n }\n\n private updateEmpty() {\n this._empty = this.getAlertItems().length === 0;\n }\n\n private getAlertItems() {\n return this.alertItems.filter(this.filter);\n }\n\n private updateOldElementTop() {\n const elements = this.getAlertItems();\n if (elements.length === 0) {\n return;\n }\n\n // Get the top of the element,\n // the element may be in an animation\n // we therefor sum the height of each element\n const firstElement = elements[0];\n const firstElementRect = firstElement.getBoundingClientRect();\n let top = firstElementRect.top;\n this.oldElementTop.clear();\n elements.forEach((element) => {\n const elementRect = element.getBoundingClientRect();\n if (elementRect.height === 0) {\n return;\n }\n this.oldElementTop.set(element, top);\n top += elementRect.height;\n });\n }\n\n private setupMutationObserver() {\n if (this.mutationObserver) {\n // Make a new observer to avoid memory leaks\n this.mutationObserver.disconnect();\n this.mutationObserver = null;\n }\n this.mutationObserver = new MutationObserver(() => {\n this.handleElementsChange();\n });\n\n const slotElements = this.alertItems;\n slotElements.forEach((element) => {\n // Earlier observed elements are just updated, and not registered twice.\n this.mutationObserver?.observe(element, {\n attributes: true,\n attributeFilter: ['status', 'shelved'],\n });\n });\n }\n\n private handleSlotChange() {\n this.handleElementsChange();\n this.setupMutationObserver();\n }\n\n private handleElementsChange() {\n // Take records to ensure the observer is not triggered again\n this.mutationObserver?.takeRecords();\n this.updateEmpty();\n if (!this.checkVisibility()) {\n return;\n }\n\n const elements = this.getAlertItems();\n // Animate the elements to their new positions\n const oldElementTop: Map<HTMLElement, number> = new Map(this.oldElementTop);\n\n requestAnimationFrame(() => {\n this.updateOldElementTop();\n let hasNewElements = false;\n elements.forEach((element) => {\n const elementRect = element.getBoundingClientRect();\n const oldTop = oldElementTop.get(element);\n if (oldTop === undefined) {\n // New element\n (element as ObcAlertMenuItem).animateIntro = this.hasRenderedPanel;\n hasNewElements = true;\n setTimeout(() => {\n (element as ObcAlertMenuItem).animateIntro = false;\n }, 101);\n return;\n }\n const diff = oldTop - elementRect.top;\n if (diff === 0) return;\n element.style.transform = `translateY(${diff}px)`;\n element.style.transition = 'none';\n\n // Force a reflow to ensure the animation is applied\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n element.offsetHeight;\n\n // Remove the transition after the animation is complete\n element.style.transition = 'transform 100ms ease-in-out';\n element.style.transform = 'translateY(0px)';\n });\n this.hasRenderedPanel = true;\n if (hasNewElements) {\n setTimeout(() => {\n this.updateOldElementTop();\n }, 101);\n }\n });\n }\n\n public getVisibleElements(): {element: HTMLElement; index: number}[] {\n // Get all slotted elements in the visible tab's scrollbar\n\n const scrollbarRect = this.scrollbar.getBoundingClientRect();\n const slottedElements = this.getAlertItems();\n\n // Filter for only visible elements that are within the scrollbar viewport\n return slottedElements\n .map((element, index) => ({element, index}))\n .filter(({element}) => {\n const style = window.getComputedStyle(element);\n if (style.display === 'none' || style.visibility === 'hidden') {\n return false;\n }\n\n // Check if the element is within the scrollbar's viewport\n const elementRect = element.getBoundingClientRect();\n\n // Check if element overlaps with scrollbar viewport\n const isVisible = !(\n elementRect.top < scrollbarRect.top ||\n elementRect.bottom > scrollbarRect.bottom\n );\n\n return isVisible;\n });\n }\n\n override render() {\n return html` <obc-scrollbar class=\"alert-list\" id=\"scrollbar\">\n <slot @slotchange=${this.handleSlotChange}></slot>\n ${this._empty\n ? html` <div class=\"empty-list\">\n <div class=\"icon\">\n <slot name=\"empty-icon\"></slot>\n </div>\n <div class=\"empty-title\">\n <slot name=\"empty-title\"></slot>\n </div>\n <div class=\"empty-description\">\n <slot name=\"empty-description\"></slot>\n </div>\n </div>`\n : nothing}\n </obc-scrollbar>`;\n }\n\n static override styles = unsafeCSS(compentStyle);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'obc-alert-list': ObcAlertList;\n }\n}\n"],"names":[],"mappings":"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"}
|