@yuuvis/client-framework 2.6.1 → 2.6.3
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.
- package/common/lib/directives/busy-overlay.directive.d.ts +4 -4
- package/fesm2022/yuuvis-client-framework-common.mjs +8 -11
- package/fesm2022/yuuvis-client-framework-common.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-forms.mjs +10 -6
- package/fesm2022/yuuvis-client-framework-forms.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-object-summary.mjs +4 -2
- package/fesm2022/yuuvis-client-framework-object-summary.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-renderer.mjs +4 -9
- package/fesm2022/yuuvis-client-framework-renderer.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-tile-list.mjs +15 -7
- package/fesm2022/yuuvis-client-framework-tile-list.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework.mjs +41 -2
- package/fesm2022/yuuvis-client-framework.mjs.map +1 -1
- package/lib/assets/i18n/en.json +19 -19
- package/lib/services/halo-focus/halo-focus.service.d.ts +25 -0
- package/package.json +21 -21
- package/renderer/lib/property-renderer/organization.renderer.d.ts +1 -1
- package/tile-list/lib/tile-config/property-select/property-select.component.d.ts +3 -1
|
@@ -17,14 +17,40 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
|
|
|
17
17
|
}]
|
|
18
18
|
}] });
|
|
19
19
|
|
|
20
|
+
/**
|
|
21
|
+
* The purpose of this service is to create and manage a "halo focus" element that visually
|
|
22
|
+
* highlights the currently focused element on the page, enhancing keyboard navigation visibility.
|
|
23
|
+
* It listens for focus and blur events, and when an element receives focus, it positions
|
|
24
|
+
* and styles the halo element around it. The halo updates its position and size in response
|
|
25
|
+
* to window scrolls, resizes, and changes to the focused element itself.
|
|
26
|
+
*
|
|
27
|
+
* This service is initialized once and operates globally, ensuring that any focusable
|
|
28
|
+
* element on the page can be highlighted when focused.
|
|
29
|
+
*
|
|
30
|
+
* Usage:
|
|
31
|
+
* 1. Add provideHaloFocus() to your providers array in your app.config.ts
|
|
32
|
+
* 2. The service will automatically append a halo element to the DOM and manage its visibility
|
|
33
|
+
*
|
|
34
|
+
* Note: This service assumes that the application uses focus-visible styles to differentiate
|
|
35
|
+
* between keyboard and mouse focus. It only shows the halo for elements that match :focus-visible.
|
|
36
|
+
*/
|
|
20
37
|
class HaloFocusService {
|
|
21
38
|
#haloEl = null;
|
|
22
39
|
#currentEl = null;
|
|
40
|
+
#lastInteractionWasKeyboard = false;
|
|
23
41
|
#rafId = null; //Request Animation Frame ID
|
|
24
42
|
#resizeObserver;
|
|
25
43
|
#mutationObserver;
|
|
26
44
|
#defaultPadding = 3;
|
|
27
45
|
#noPaddingComponents = ['yuv-shell-logo'];
|
|
46
|
+
/**
|
|
47
|
+
* Initializes the HaloFocusService by appending the halo element to the DOM
|
|
48
|
+
* and setting up necessary event listeners and observers.
|
|
49
|
+
*
|
|
50
|
+
* This method should be called once during the application startup.
|
|
51
|
+
*
|
|
52
|
+
* @returns void
|
|
53
|
+
*/
|
|
28
54
|
init() {
|
|
29
55
|
this.#appendHaloElementToDOM();
|
|
30
56
|
this.#initListeners();
|
|
@@ -53,6 +79,7 @@ class HaloFocusService {
|
|
|
53
79
|
window.addEventListener('scroll', this.#scheduleUpdate, true);
|
|
54
80
|
window.addEventListener('resize', this.#scheduleUpdate);
|
|
55
81
|
document.addEventListener('keydown', this.#onKeydown, true);
|
|
82
|
+
document.addEventListener('mousedown', this.#onMouseDown, true);
|
|
56
83
|
}
|
|
57
84
|
#initObservers() {
|
|
58
85
|
if ('ResizeObserver' in window) {
|
|
@@ -78,10 +105,13 @@ class HaloFocusService {
|
|
|
78
105
|
}
|
|
79
106
|
#matchesFocusVisible(el) {
|
|
80
107
|
try {
|
|
81
|
-
|
|
108
|
+
const matches = el.matches(':focus-visible');
|
|
109
|
+
if (!matches)
|
|
110
|
+
return false;
|
|
111
|
+
return matches && this.#lastInteractionWasKeyboard;
|
|
82
112
|
}
|
|
83
113
|
catch {
|
|
84
|
-
return
|
|
114
|
+
return this.#lastInteractionWasKeyboard;
|
|
85
115
|
}
|
|
86
116
|
}
|
|
87
117
|
#isElementVisible(el) {
|
|
@@ -163,12 +193,21 @@ class HaloFocusService {
|
|
|
163
193
|
this.#rafId = requestAnimationFrame(this.#updateHaloRect);
|
|
164
194
|
};
|
|
165
195
|
#onKeydown = (e) => {
|
|
196
|
+
this.#lastInteractionWasKeyboard = true;
|
|
166
197
|
// Track arrow keys and other navigation keys that might move focused element
|
|
167
198
|
const navigationKeys = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Home', 'End', 'PageUp', 'PageDown'];
|
|
168
199
|
if (this.#currentEl && navigationKeys.includes(e.key)) {
|
|
169
200
|
this.#scheduleUpdate();
|
|
170
201
|
}
|
|
171
202
|
};
|
|
203
|
+
#onMouseDown = () => {
|
|
204
|
+
this.#lastInteractionWasKeyboard = false;
|
|
205
|
+
if (this.#haloEl) {
|
|
206
|
+
this.#haloEl.style.opacity = '0';
|
|
207
|
+
this.#currentEl = null;
|
|
208
|
+
this.#stopTracking();
|
|
209
|
+
}
|
|
210
|
+
};
|
|
172
211
|
#startTracking(target) {
|
|
173
212
|
this.#currentEl = target;
|
|
174
213
|
this.#scheduleUpdate();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yuuvis-client-framework.mjs","sources":["../../../../../libs/yuuvis/client-framework/src/lib/yuuvis-client-framework.module.ts","../../../../../libs/yuuvis/client-framework/src/lib/services/halo-focus/halo-focus.service.ts","../../../../../libs/yuuvis/client-framework/src/lib/services/snack-bar/snack-bar.service.ts","../../../../../libs/yuuvis/client-framework/src/lib/providers/halo-focus/provide-halo-focus.ts","../../../../../libs/yuuvis/client-framework/src/yuuvis-client-framework.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@NgModule({\n imports: [CommonModule],\n})\nexport class YuuvisClientFrameworkModule {}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class HaloFocusService {\n #haloEl: HTMLDivElement | null = null;\n #currentEl: HTMLElement | null = null;\n #rafId: number | null = null; //Request Animation Frame ID\n #resizeObserver?: ResizeObserver;\n #mutationObserver?: MutationObserver;\n\n readonly #defaultPadding = 3;\n readonly #noPaddingComponents = ['yuv-shell-logo'];\n\n init() {\n this.#appendHaloElementToDOM();\n this.#initListeners();\n this.#initObservers();\n }\n\n #appendHaloElementToDOM(): void {\n this.#haloEl = document.createElement('div');\n this.#haloEl.id = 'focus-halo';\n this.#haloEl.setAttribute('aria-hidden', 'true');\n Object.assign(this.#haloEl.style, {\n position: 'fixed',\n pointerEvents: 'none',\n zIndex: '9999',\n border: '2px solid var(--ymt-primary)',\n boxShadow: '0 0 0 4px rgba(from var(--ymt-primary) r g b / 0.2)',\n borderRadius: '8px',\n opacity: '0',\n transform: 'translateZ(0)'\n // transition: 'opacity 120ms ease, transform 120ms ease, width 120ms ease, height 120ms ease, left 120ms ease, top 120ms ease'\n });\n document.body.appendChild(this.#haloEl);\n }\n\n #initListeners(): void {\n document.addEventListener('focus', this.#onFocus, true);\n document.addEventListener('blur', this.#onBlur, true);\n window.addEventListener('scroll', this.#scheduleUpdate, true);\n window.addEventListener('resize', this.#scheduleUpdate);\n document.addEventListener('keydown', this.#onKeydown, true);\n }\n\n #initObservers(): void {\n if ('ResizeObserver' in window) {\n this.#resizeObserver = new ResizeObserver(() => {\n if (this.#currentEl) this.#scheduleUpdate();\n });\n }\n\n if ('MutationObserver' in window) {\n this.#mutationObserver = new MutationObserver(() => {\n if (this.#currentEl) this.#scheduleUpdate();\n });\n }\n }\n\n #isFocusable(el: Element | null): el is HTMLElement {\n if (!el) return false;\n const h = el as HTMLElement;\n if (h.tabIndex >= 0) return true;\n return /^(A|BUTTON|INPUT|SELECT|TEXTAREA)$/.test(h.tagName) || h.isContentEditable;\n }\n\n #matchesFocusVisible(el: HTMLElement): boolean {\n try {\n return el.matches(':focus-visible');\n } catch {\n return true;\n }\n }\n\n #isElementVisible(el: HTMLElement): boolean {\n const rect = el.getBoundingClientRect();\n\n // Check if element has dimensions\n if (rect.width === 0 || rect.height === 0) {\n return false;\n }\n\n // Check computed style on element itself\n const style = getComputedStyle(el);\n if (style.visibility === 'hidden' || style.display === 'none' || parseFloat(style.opacity) === 0) {\n return false;\n }\n\n // Check if element is clipped by overflow:hidden parent OR if any parent is hidden\n return this.#isParentVisible(el, rect);\n }\n\n #isParentVisible(el: HTMLElement, rect: DOMRect): boolean {\n let parent = el.parentElement;\n while (parent && parent !== document.body) {\n const parentStyle = getComputedStyle(parent);\n\n // Check if parent is hidden\n if (parentStyle.display === 'none' || parentStyle.visibility === 'hidden' || parseFloat(parentStyle.opacity) === 0) {\n return false;\n }\n\n const parentOverflow = parentStyle.overflow + parentStyle.overflowX + parentStyle.overflowY;\n\n if (parentOverflow.includes('hidden') || parentOverflow.includes('clip')) {\n const parentRect = parent.getBoundingClientRect();\n // Calculate intersection - if there's no visible area, element is hidden\n const visibleRight = Math.min(rect.right, parentRect.right);\n const visibleLeft = Math.max(rect.left, parentRect.left);\n const visibleBottom = Math.min(rect.bottom, parentRect.bottom);\n const visibleTop = Math.max(rect.top, parentRect.top);\n\n const visibleWidth = visibleRight - visibleLeft;\n const visibleHeight = visibleBottom - visibleTop;\n\n // If no intersection or intersection is too small (less than 1px), element is not visible\n if (visibleWidth <= 0 || visibleHeight <= 0) {\n return false;\n }\n }\n parent = parent.parentElement;\n }\n return true;\n }\n\n #updateHaloRect = () => {\n if (!this.#currentEl || !this.#haloEl || !document.contains(this.#currentEl)) {\n this.#haloEl && (this.#haloEl.style.opacity = '0');\n this.#currentEl = null;\n return;\n }\n\n // Check if element is actually visible\n if (!this.#isElementVisible(this.#currentEl)) {\n this.#haloEl.style.opacity = '0';\n return;\n }\n\n const rect = this.#currentEl.getBoundingClientRect();\n const padding = this.#getTargetPadding();\n\n const left = Math.floor(rect.left - padding);\n const top = Math.floor(rect.top - padding);\n const width = Math.ceil(rect.width + padding * 2);\n const height = Math.ceil(rect.height + padding * 2);\n\n const cs = getComputedStyle(this.#currentEl);\n this.#haloEl.style.left = `${left}px`;\n this.#haloEl.style.top = `${top}px`;\n this.#haloEl.style.width = `${width}px`;\n this.#haloEl.style.height = `${height}px`;\n this.#haloEl.style.borderRadius = cs.borderRadius || '8px';\n this.#haloEl.style.opacity = '1';\n };\n\n #getTargetPadding(): number {\n const parent = this.#currentEl?.parentElement;\n if (parent && this.#noPaddingComponents.includes(parent.nodeName.toLowerCase())) {\n return 0;\n }\n return this.#defaultPadding;\n }\n\n #scheduleUpdate = () => {\n if (this.#rafId != null) cancelAnimationFrame(this.#rafId);\n this.#rafId = requestAnimationFrame(this.#updateHaloRect);\n };\n\n #onKeydown = (e: KeyboardEvent) => {\n // Track arrow keys and other navigation keys that might move focused element\n const navigationKeys = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Home', 'End', 'PageUp', 'PageDown'];\n if (this.#currentEl && navigationKeys.includes(e.key)) {\n this.#scheduleUpdate();\n }\n };\n\n #startTracking(target: HTMLElement) {\n this.#currentEl = target;\n this.#scheduleUpdate();\n\n // Track size changes on target element\n if (this.#resizeObserver) {\n this.#resizeObserver.observe(target);\n\n // Also observe all parent elements with overflow (they might clip the element)\n let parent = target.parentElement;\n while (parent && parent !== document.body) {\n const style = getComputedStyle(parent);\n const overflow = style.overflow + style.overflowX + style.overflowY;\n if (overflow.includes('hidden') || overflow.includes('clip') || overflow.includes('auto') || overflow.includes('scroll')) {\n this.#resizeObserver.observe(parent);\n }\n parent = parent.parentElement;\n }\n }\n\n // Track style/attribute changes (for position, transform changes)\n if (this.#mutationObserver) {\n this.#mutationObserver.observe(target, {\n attributes: true,\n attributeFilter: ['style', 'class'],\n subtree: false\n });\n }\n }\n\n #stopTracking() {\n if (this.#resizeObserver) this.#resizeObserver.disconnect();\n if (this.#mutationObserver) this.#mutationObserver.disconnect();\n }\n\n #onFocus = (e: FocusEvent) => {\n const target = e.target as HTMLElement;\n if (!this.#isFocusable(target)) return;\n if (!this.#matchesFocusVisible(target)) {\n this.#haloEl && (this.#haloEl.style.opacity = '0');\n this.#currentEl = null;\n return;\n }\n this.#stopTracking();\n this.#startTracking(target);\n };\n\n #onBlur = (e: FocusEvent) => {\n if ((e.target as HTMLElement) === this.#currentEl && this.#haloEl) {\n this.#haloEl.style.opacity = '0';\n this.#currentEl = null;\n this.#stopTracking();\n }\n };\n\n /** Optional: allow manual control from directives/components */\n // public showFor(el: HTMLElement) {\n // this.#currentEl = el;\n // this.#scheduleUpdate();\n // if (this.#ro) {\n // this.#ro.disconnect();\n // this.#ro.observe(el);\n // }\n // }\n\n // public hide() {\n // if (this.#haloEl) this.#haloEl.style.opacity = '0';\n // this.#currentEl = null;\n // if (this.#ro) this.#ro.disconnect();\n // }\n}\n","import { Component, inject, Injectable, signal } from '@angular/core';\nimport { MAT_SNACK_BAR_DATA, MatSnackBar, MatSnackBarAction, MatSnackBarActions, MatSnackBarLabel, MatSnackBarRef } from '@angular/material/snack-bar';\nimport { SnackBarData, SnackBarLevel, SnackBarOptions } from './snack-bar.interface';\nimport { MatButtonModule } from '@angular/material/button';\n@Injectable({\n providedIn: 'root'\n})\nexport class SnackBarService {\n #snackBar = inject(MatSnackBar);\n\n info(message: string, action?: string): MatSnackBarRef<SnackBarComponent> {\n return this.snack(message, { action, level: 'info' });\n }\n\n success(message: string, action?: string): MatSnackBarRef<SnackBarComponent> {\n return this.snack(message, { action, level: 'success' });\n }\n\n warning(message: string, action?: string): MatSnackBarRef<SnackBarComponent> {\n return this.snack(message, { action, level: 'warning' });\n }\n\n danger(message: string, action?: string): MatSnackBarRef<SnackBarComponent> {\n return this.snack(message, { action, level: 'danger' });\n }\n\n snack(message: string, options: SnackBarOptions): MatSnackBarRef<SnackBarComponent> {\n return this.#snackBar.openFromComponent(SnackBarComponent, {\n data: {\n level: options.level,\n message,\n action: options.action\n },\n duration: options.duration || 3000,\n horizontalPosition: options.horizontalPosition,\n verticalPosition: options.verticalPosition,\n panelClass: ['yuv-snack-bar', 'level-' + options.level]\n });\n }\n}\n\n@Component({\n selector: 'yuv-snack-bar-component',\n template: `\n <span matSnackBarLabel (click)=\"dismiss()\"> {{ message() }} </span>\n @let a = action();\n @if (a) {\n <span matSnackBarActions>\n <button mat-button matSnackBarAction (click)=\"dismiss(!!a)\">{{ action() }}</button>\n </span>\n }\n `,\n styles: `\n :host {\n display: flex;\n }\n `,\n imports: [MatButtonModule, MatSnackBarLabel, MatSnackBarActions, MatSnackBarAction],\n host: {\n '[class.info]': \"level() === 'info'\",\n '[class.success]': \"level() === 'success'\",\n '[class.warning]': \"level() === 'warning'\",\n '[class.danger]': \"level() === 'danger'\"\n }\n})\nexport class SnackBarComponent {\n #snackBarRef = inject(MatSnackBarRef);\n #snackData = inject<SnackBarData>(MAT_SNACK_BAR_DATA);\n level = signal<SnackBarLevel>(this.#snackData.level);\n message = signal<string>(this.#snackData.message);\n action = signal<string | undefined>(this.#snackData.action);\n\n dismiss(withAction = false) {\n if (withAction) {\n this.#snackBarRef.dismissWithAction();\n } else if (!this.action()) {\n this.#snackBarRef.dismiss();\n }\n }\n}\n","import { EnvironmentProviders, inject, NgZone, provideAppInitializer } from '@angular/core';\nimport { HaloFocusService } from '../../services';\n\n/**\n * Provides and initializes the HaloFocusService.\n * By calling this function in your ApplicationConfig providers,\n * the Halo Focus feature will be activated, allowing users to see a visual focus indicator.\n * The service will be initialized outside Angular zone for optimal performance.\n *\n * @returns EnvironmentProviders\n */\nexport function provideHaloFocus(): EnvironmentProviders {\n return provideAppInitializer(() => {\n const zone = inject(NgZone);\n const haloFocus = inject(HaloFocusService);\n zone.runOutsideAngular(() => haloFocus.init());\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"yuuvis-client-framework.mjs","sources":["../../../../../libs/yuuvis/client-framework/src/lib/yuuvis-client-framework.module.ts","../../../../../libs/yuuvis/client-framework/src/lib/services/halo-focus/halo-focus.service.ts","../../../../../libs/yuuvis/client-framework/src/lib/services/snack-bar/snack-bar.service.ts","../../../../../libs/yuuvis/client-framework/src/lib/providers/halo-focus/provide-halo-focus.ts","../../../../../libs/yuuvis/client-framework/src/yuuvis-client-framework.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@NgModule({\n imports: [CommonModule],\n})\nexport class YuuvisClientFrameworkModule {}\n","import { Injectable } from '@angular/core';\n\n/**\n * The purpose of this service is to create and manage a \"halo focus\" element that visually\n * highlights the currently focused element on the page, enhancing keyboard navigation visibility.\n * It listens for focus and blur events, and when an element receives focus, it positions\n * and styles the halo element around it. The halo updates its position and size in response\n * to window scrolls, resizes, and changes to the focused element itself.\n *\n * This service is initialized once and operates globally, ensuring that any focusable\n * element on the page can be highlighted when focused.\n *\n * Usage:\n * 1. Add provideHaloFocus() to your providers array in your app.config.ts\n * 2. The service will automatically append a halo element to the DOM and manage its visibility\n *\n * Note: This service assumes that the application uses focus-visible styles to differentiate\n * between keyboard and mouse focus. It only shows the halo for elements that match :focus-visible.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class HaloFocusService {\n #haloEl: HTMLDivElement | null = null;\n #currentEl: HTMLElement | null = null;\n #lastInteractionWasKeyboard = false;\n #rafId: number | null = null; //Request Animation Frame ID\n #resizeObserver?: ResizeObserver;\n #mutationObserver?: MutationObserver;\n\n readonly #defaultPadding = 3;\n readonly #noPaddingComponents = ['yuv-shell-logo'];\n\n /**\n * Initializes the HaloFocusService by appending the halo element to the DOM\n * and setting up necessary event listeners and observers.\n *\n * This method should be called once during the application startup.\n *\n * @returns void\n */\n public init(): void {\n this.#appendHaloElementToDOM();\n this.#initListeners();\n this.#initObservers();\n }\n\n #appendHaloElementToDOM(): void {\n this.#haloEl = document.createElement('div');\n this.#haloEl.id = 'focus-halo';\n this.#haloEl.setAttribute('aria-hidden', 'true');\n Object.assign(this.#haloEl.style, {\n position: 'fixed',\n pointerEvents: 'none',\n zIndex: '9999',\n border: '2px solid var(--ymt-primary)',\n boxShadow: '0 0 0 4px rgba(from var(--ymt-primary) r g b / 0.2)',\n borderRadius: '8px',\n opacity: '0',\n transform: 'translateZ(0)'\n // transition: 'opacity 120ms ease, transform 120ms ease, width 120ms ease, height 120ms ease, left 120ms ease, top 120ms ease'\n });\n document.body.appendChild(this.#haloEl);\n }\n\n #initListeners(): void {\n document.addEventListener('focus', this.#onFocus, true);\n document.addEventListener('blur', this.#onBlur, true);\n window.addEventListener('scroll', this.#scheduleUpdate, true);\n window.addEventListener('resize', this.#scheduleUpdate);\n document.addEventListener('keydown', this.#onKeydown, true);\n document.addEventListener('mousedown', this.#onMouseDown, true);\n }\n\n #initObservers(): void {\n if ('ResizeObserver' in window) {\n this.#resizeObserver = new ResizeObserver(() => {\n if (this.#currentEl) this.#scheduleUpdate();\n });\n }\n\n if ('MutationObserver' in window) {\n this.#mutationObserver = new MutationObserver(() => {\n if (this.#currentEl) this.#scheduleUpdate();\n });\n }\n }\n\n #isFocusable(el: Element | null): el is HTMLElement {\n if (!el) return false;\n const h = el as HTMLElement;\n if (h.tabIndex >= 0) return true;\n return /^(A|BUTTON|INPUT|SELECT|TEXTAREA)$/.test(h.tagName) || h.isContentEditable;\n }\n\n #matchesFocusVisible(el: HTMLElement): boolean {\n try {\n const matches = el.matches(':focus-visible');\n if (!matches) return false;\n return matches && this.#lastInteractionWasKeyboard;\n } catch {\n return this.#lastInteractionWasKeyboard;\n }\n }\n\n #isElementVisible(el: HTMLElement): boolean {\n const rect = el.getBoundingClientRect();\n\n // Check if element has dimensions\n if (rect.width === 0 || rect.height === 0) {\n return false;\n }\n\n // Check computed style on element itself\n const style = getComputedStyle(el);\n if (style.visibility === 'hidden' || style.display === 'none' || parseFloat(style.opacity) === 0) {\n return false;\n }\n\n // Check if element is clipped by overflow:hidden parent OR if any parent is hidden\n return this.#isParentVisible(el, rect);\n }\n\n #isParentVisible(el: HTMLElement, rect: DOMRect): boolean {\n let parent = el.parentElement;\n while (parent && parent !== document.body) {\n const parentStyle = getComputedStyle(parent);\n\n // Check if parent is hidden\n if (parentStyle.display === 'none' || parentStyle.visibility === 'hidden' || parseFloat(parentStyle.opacity) === 0) {\n return false;\n }\n\n const parentOverflow = parentStyle.overflow + parentStyle.overflowX + parentStyle.overflowY;\n\n if (parentOverflow.includes('hidden') || parentOverflow.includes('clip')) {\n const parentRect = parent.getBoundingClientRect();\n // Calculate intersection - if there's no visible area, element is hidden\n const visibleRight = Math.min(rect.right, parentRect.right);\n const visibleLeft = Math.max(rect.left, parentRect.left);\n const visibleBottom = Math.min(rect.bottom, parentRect.bottom);\n const visibleTop = Math.max(rect.top, parentRect.top);\n\n const visibleWidth = visibleRight - visibleLeft;\n const visibleHeight = visibleBottom - visibleTop;\n\n // If no intersection or intersection is too small (less than 1px), element is not visible\n if (visibleWidth <= 0 || visibleHeight <= 0) {\n return false;\n }\n }\n parent = parent.parentElement;\n }\n return true;\n }\n\n #updateHaloRect = () => {\n if (!this.#currentEl || !this.#haloEl || !document.contains(this.#currentEl)) {\n this.#haloEl && (this.#haloEl.style.opacity = '0');\n this.#currentEl = null;\n return;\n }\n\n // Check if element is actually visible\n if (!this.#isElementVisible(this.#currentEl)) {\n this.#haloEl.style.opacity = '0';\n return;\n }\n\n const rect = this.#currentEl.getBoundingClientRect();\n const padding = this.#getTargetPadding();\n\n const left = Math.floor(rect.left - padding);\n const top = Math.floor(rect.top - padding);\n const width = Math.ceil(rect.width + padding * 2);\n const height = Math.ceil(rect.height + padding * 2);\n\n const cs = getComputedStyle(this.#currentEl);\n this.#haloEl.style.left = `${left}px`;\n this.#haloEl.style.top = `${top}px`;\n this.#haloEl.style.width = `${width}px`;\n this.#haloEl.style.height = `${height}px`;\n this.#haloEl.style.borderRadius = cs.borderRadius || '8px';\n this.#haloEl.style.opacity = '1';\n };\n\n #getTargetPadding(): number {\n const parent = this.#currentEl?.parentElement;\n if (parent && this.#noPaddingComponents.includes(parent.nodeName.toLowerCase())) {\n return 0;\n }\n return this.#defaultPadding;\n }\n\n #scheduleUpdate = () => {\n if (this.#rafId != null) cancelAnimationFrame(this.#rafId);\n this.#rafId = requestAnimationFrame(this.#updateHaloRect);\n };\n\n #onKeydown = (e: KeyboardEvent) => {\n this.#lastInteractionWasKeyboard = true;\n\n // Track arrow keys and other navigation keys that might move focused element\n const navigationKeys = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Home', 'End', 'PageUp', 'PageDown'];\n if (this.#currentEl && navigationKeys.includes(e.key)) {\n this.#scheduleUpdate();\n }\n };\n\n #onMouseDown = () => {\n this.#lastInteractionWasKeyboard = false;\n if (this.#haloEl) {\n this.#haloEl.style.opacity = '0';\n this.#currentEl = null;\n this.#stopTracking();\n }\n };\n\n #startTracking(target: HTMLElement) {\n this.#currentEl = target;\n this.#scheduleUpdate();\n\n // Track size changes on target element\n if (this.#resizeObserver) {\n this.#resizeObserver.observe(target);\n\n // Also observe all parent elements with overflow (they might clip the element)\n let parent = target.parentElement;\n while (parent && parent !== document.body) {\n const style = getComputedStyle(parent);\n const overflow = style.overflow + style.overflowX + style.overflowY;\n if (overflow.includes('hidden') || overflow.includes('clip') || overflow.includes('auto') || overflow.includes('scroll')) {\n this.#resizeObserver.observe(parent);\n }\n parent = parent.parentElement;\n }\n }\n\n // Track style/attribute changes (for position, transform changes)\n if (this.#mutationObserver) {\n this.#mutationObserver.observe(target, {\n attributes: true,\n attributeFilter: ['style', 'class'],\n subtree: false\n });\n }\n }\n\n #stopTracking() {\n if (this.#resizeObserver) this.#resizeObserver.disconnect();\n if (this.#mutationObserver) this.#mutationObserver.disconnect();\n }\n\n #onFocus = (e: FocusEvent) => {\n const target = e.target as HTMLElement;\n if (!this.#isFocusable(target)) return;\n if (!this.#matchesFocusVisible(target)) {\n this.#haloEl && (this.#haloEl.style.opacity = '0');\n this.#currentEl = null;\n return;\n }\n this.#stopTracking();\n this.#startTracking(target);\n };\n\n #onBlur = (e: FocusEvent) => {\n if ((e.target as HTMLElement) === this.#currentEl && this.#haloEl) {\n this.#haloEl.style.opacity = '0';\n this.#currentEl = null;\n this.#stopTracking();\n }\n };\n\n /** Optional: allow manual control from directives/components */\n // public showFor(el: HTMLElement) {\n // this.#currentEl = el;\n // this.#scheduleUpdate();\n // if (this.#ro) {\n // this.#ro.disconnect();\n // this.#ro.observe(el);\n // }\n // }\n\n // public hide() {\n // if (this.#haloEl) this.#haloEl.style.opacity = '0';\n // this.#currentEl = null;\n // if (this.#ro) this.#ro.disconnect();\n // }\n}\n","import { Component, inject, Injectable, signal } from '@angular/core';\nimport { MAT_SNACK_BAR_DATA, MatSnackBar, MatSnackBarAction, MatSnackBarActions, MatSnackBarLabel, MatSnackBarRef } from '@angular/material/snack-bar';\nimport { SnackBarData, SnackBarLevel, SnackBarOptions } from './snack-bar.interface';\nimport { MatButtonModule } from '@angular/material/button';\n@Injectable({\n providedIn: 'root'\n})\nexport class SnackBarService {\n #snackBar = inject(MatSnackBar);\n\n info(message: string, action?: string): MatSnackBarRef<SnackBarComponent> {\n return this.snack(message, { action, level: 'info' });\n }\n\n success(message: string, action?: string): MatSnackBarRef<SnackBarComponent> {\n return this.snack(message, { action, level: 'success' });\n }\n\n warning(message: string, action?: string): MatSnackBarRef<SnackBarComponent> {\n return this.snack(message, { action, level: 'warning' });\n }\n\n danger(message: string, action?: string): MatSnackBarRef<SnackBarComponent> {\n return this.snack(message, { action, level: 'danger' });\n }\n\n snack(message: string, options: SnackBarOptions): MatSnackBarRef<SnackBarComponent> {\n return this.#snackBar.openFromComponent(SnackBarComponent, {\n data: {\n level: options.level,\n message,\n action: options.action\n },\n duration: options.duration || 3000,\n horizontalPosition: options.horizontalPosition,\n verticalPosition: options.verticalPosition,\n panelClass: ['yuv-snack-bar', 'level-' + options.level]\n });\n }\n}\n\n@Component({\n selector: 'yuv-snack-bar-component',\n template: `\n <span matSnackBarLabel (click)=\"dismiss()\"> {{ message() }} </span>\n @let a = action();\n @if (a) {\n <span matSnackBarActions>\n <button mat-button matSnackBarAction (click)=\"dismiss(!!a)\">{{ action() }}</button>\n </span>\n }\n `,\n styles: `\n :host {\n display: flex;\n }\n `,\n imports: [MatButtonModule, MatSnackBarLabel, MatSnackBarActions, MatSnackBarAction],\n host: {\n '[class.info]': \"level() === 'info'\",\n '[class.success]': \"level() === 'success'\",\n '[class.warning]': \"level() === 'warning'\",\n '[class.danger]': \"level() === 'danger'\"\n }\n})\nexport class SnackBarComponent {\n #snackBarRef = inject(MatSnackBarRef);\n #snackData = inject<SnackBarData>(MAT_SNACK_BAR_DATA);\n level = signal<SnackBarLevel>(this.#snackData.level);\n message = signal<string>(this.#snackData.message);\n action = signal<string | undefined>(this.#snackData.action);\n\n dismiss(withAction = false) {\n if (withAction) {\n this.#snackBarRef.dismissWithAction();\n } else if (!this.action()) {\n this.#snackBarRef.dismiss();\n }\n }\n}\n","import { EnvironmentProviders, inject, NgZone, provideAppInitializer } from '@angular/core';\nimport { HaloFocusService } from '../../services';\n\n/**\n * Provides and initializes the HaloFocusService.\n * By calling this function in your ApplicationConfig providers,\n * the Halo Focus feature will be activated, allowing users to see a visual focus indicator.\n * The service will be initialized outside Angular zone for optimal performance.\n *\n * @returns EnvironmentProviders\n */\nexport function provideHaloFocus(): EnvironmentProviders {\n return provideAppInitializer(() => {\n const zone = inject(NgZone);\n const haloFocus = inject(HaloFocusService);\n zone.runOutsideAngular(() => haloFocus.init());\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/lib/assets/i18n/en.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"yuv.action-menu.action.cut.dms.object.description": "",
|
|
5
5
|
"yuv.action-menu.action.cut.dms.object.label": "Cut",
|
|
6
6
|
"yuv.action-menu.action.delete.dms.object.confirm.cancel": "Cancel",
|
|
7
|
-
"yuv.action-menu.action.delete.dms.object.confirm.message": "
|
|
7
|
+
"yuv.action-menu.action.delete.dms.object.confirm.message": "Are you sure you want to delete the selected object(s)?",
|
|
8
8
|
"yuv.action-menu.action.delete.dms.object.confirm.ok": "Delete",
|
|
9
9
|
"yuv.action-menu.action.delete.dms.object.description": "Deletes the object.",
|
|
10
10
|
"yuv.action-menu.action.delete.dms.object.label": "Delete",
|
|
@@ -119,28 +119,28 @@
|
|
|
119
119
|
"yuv.object-flavor.picker.text": "Types are extensions for files that provide additional information about their content/meaning.",
|
|
120
120
|
"yuv.object-flavor.picker.title": "Add type",
|
|
121
121
|
"yuv.object-preview.tiff-warning": "This document is not the original *.tiff file, but only a representation. The preview does not support *.tiff files. Please download the document to view the original.",
|
|
122
|
-
"cm.app.cases.action.add-link.search.relation.label": "
|
|
122
|
+
"cm.app.cases.action.add-link.search.relation.label": "Reference type",
|
|
123
123
|
"yuv.object-relationship.action.add-relationship.description": "",
|
|
124
|
-
"yuv.object-relationship.action.add-relationship.label": "Add
|
|
125
|
-
"yuv.object-relationship.add-relation.error-message": "
|
|
124
|
+
"yuv.object-relationship.action.add-relationship.label": "Add reference",
|
|
125
|
+
"yuv.object-relationship.add-relation.error-message": "Error while adding the reference.",
|
|
126
126
|
"yuv.object-relationship.add-relationship.action.cancel": "Cancel",
|
|
127
|
-
"yuv.object-relationship.add-relationship.action.submit": "Add
|
|
128
|
-
"yuv.object-relationship.add-relationship.error.invalidRelationTargetCombination": "The selected
|
|
129
|
-
"yuv.object-relationship.add-relationship.headline": "Add new
|
|
130
|
-
"yuv.object-relationship.add-relationship.target-search.label": "Target",
|
|
131
|
-
"yuv.object-relationship.add.tooltip": "
|
|
132
|
-
"yuv.object-relationship.delete-relation.confirm-message": "
|
|
133
|
-
"yuv.object-relationship.delete-relation.error-message": "
|
|
134
|
-
"yuv.object-relationship.delete-relation.tooltip": "
|
|
135
|
-
"yuv.object-relationship.download.tooltip": "Download as
|
|
136
|
-
"yuv.object-relationship.list.incoming": "Incoming
|
|
137
|
-
"yuv.object-relationship.list.outgoing": "Outgoing
|
|
127
|
+
"yuv.object-relationship.add-relationship.action.submit": "Add reference",
|
|
128
|
+
"yuv.object-relationship.add-relationship.error.invalidRelationTargetCombination": "The selected reference type is not valid for the selected target object.",
|
|
129
|
+
"yuv.object-relationship.add-relationship.headline": "Add new reference",
|
|
130
|
+
"yuv.object-relationship.add-relationship.target-search.label": "Target object",
|
|
131
|
+
"yuv.object-relationship.add.tooltip": "Add new reference",
|
|
132
|
+
"yuv.object-relationship.delete-relation.confirm-message": "Do you really want to delete the selected reference?",
|
|
133
|
+
"yuv.object-relationship.delete-relation.error-message": "Error while deleting the selected reference.",
|
|
134
|
+
"yuv.object-relationship.delete-relation.tooltip": "Delete selected reference",
|
|
135
|
+
"yuv.object-relationship.download.tooltip": "Download as image",
|
|
136
|
+
"yuv.object-relationship.list.incoming": "Incoming references",
|
|
137
|
+
"yuv.object-relationship.list.outgoing": "Outgoing references",
|
|
138
138
|
"yuv.object-relationship.mode.graph.tooltip": "Graph view",
|
|
139
139
|
"yuv.object-relationship.mode.list.tooltip": "List view",
|
|
140
|
-
"yuv.object-relationship.no-relations": "No
|
|
140
|
+
"yuv.object-relationship.no-relations": "No references found.",
|
|
141
141
|
"yuv.object-relationship.node-summary.open-object.button": "Open",
|
|
142
|
-
"yuv.object-relationship.selected.add-relationship.tooltip": "
|
|
143
|
-
"yuv.object-relationship.selected.expand.tooltip": "
|
|
142
|
+
"yuv.object-relationship.selected.add-relationship.tooltip": "Add new reference",
|
|
143
|
+
"yuv.object-relationship.selected.expand.tooltip": "Expand selected reference",
|
|
144
144
|
"yuv.object-summary-data.base.headline": "Basic metadata",
|
|
145
145
|
"yuv.object-summary.load.error": "Error while loading the summary",
|
|
146
146
|
"yuv.object-versions.actions.download": "Download version",
|
|
@@ -175,7 +175,7 @@
|
|
|
175
175
|
"yuv.upload-progress.header.uploading": "Upload of {{count}} file(s)",
|
|
176
176
|
"yuv.widget-grid.button.cancel": "Cancel",
|
|
177
177
|
"yuv.widget-grid.button.save": "Save",
|
|
178
|
-
"yuv.widget-grid.empty": "No widgets have been added to this workspace.",
|
|
178
|
+
"yuv.widget-grid.empty": "No widgets have been added to this workspace yet.",
|
|
179
179
|
"yuv.widget-grid.empty.create": "Edit workspace",
|
|
180
180
|
"yuv.widget-grid.widget-picker.empty": "No widgets available.",
|
|
181
181
|
"yuv.widget-grid.widget-picker.title": "Widgets",
|
|
@@ -1,6 +1,31 @@
|
|
|
1
1
|
import * as i0 from "@angular/core";
|
|
2
|
+
/**
|
|
3
|
+
* The purpose of this service is to create and manage a "halo focus" element that visually
|
|
4
|
+
* highlights the currently focused element on the page, enhancing keyboard navigation visibility.
|
|
5
|
+
* It listens for focus and blur events, and when an element receives focus, it positions
|
|
6
|
+
* and styles the halo element around it. The halo updates its position and size in response
|
|
7
|
+
* to window scrolls, resizes, and changes to the focused element itself.
|
|
8
|
+
*
|
|
9
|
+
* This service is initialized once and operates globally, ensuring that any focusable
|
|
10
|
+
* element on the page can be highlighted when focused.
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* 1. Add provideHaloFocus() to your providers array in your app.config.ts
|
|
14
|
+
* 2. The service will automatically append a halo element to the DOM and manage its visibility
|
|
15
|
+
*
|
|
16
|
+
* Note: This service assumes that the application uses focus-visible styles to differentiate
|
|
17
|
+
* between keyboard and mouse focus. It only shows the halo for elements that match :focus-visible.
|
|
18
|
+
*/
|
|
2
19
|
export declare class HaloFocusService {
|
|
3
20
|
#private;
|
|
21
|
+
/**
|
|
22
|
+
* Initializes the HaloFocusService by appending the halo element to the DOM
|
|
23
|
+
* and setting up necessary event listeners and observers.
|
|
24
|
+
*
|
|
25
|
+
* This method should be called once during the application startup.
|
|
26
|
+
*
|
|
27
|
+
* @returns void
|
|
28
|
+
*/
|
|
4
29
|
init(): void;
|
|
5
30
|
static ɵfac: i0.ɵɵFactoryDeclaration<HaloFocusService, never>;
|
|
6
31
|
static ɵprov: i0.ɵɵInjectableDeclaration<HaloFocusService>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yuuvis/client-framework",
|
|
3
|
-
"version": "2.6.
|
|
3
|
+
"version": "2.6.3",
|
|
4
4
|
"author": "OPTIMAL SYSTEMS GmbH <npm@optimal-systems.de>",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"peerDependencies": {
|
|
@@ -8,15 +8,15 @@
|
|
|
8
8
|
"@angular/common": "^19.2.1",
|
|
9
9
|
"@angular/core": "^19.2.1",
|
|
10
10
|
"angular-gridster2": "^19.0.0",
|
|
11
|
-
"@yuuvis/client-core": "^2.6.
|
|
12
|
-
"@yuuvis/client-shell-core": "^2.6.
|
|
11
|
+
"@yuuvis/client-core": "^2.6.3",
|
|
12
|
+
"@yuuvis/client-shell-core": "^2.6.3",
|
|
13
13
|
"ng-dynamic-component": "^10.8.2",
|
|
14
14
|
"modern-normalize": "^3.0.1"
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
17
|
"@angular/material": "^19.2.15",
|
|
18
18
|
"@ngrx/signals": "^19.2.0",
|
|
19
|
-
"@yuuvis/material": "2.6.
|
|
19
|
+
"@yuuvis/material": "2.6.3",
|
|
20
20
|
"@yuuvis/media-viewer": "^2.0.12",
|
|
21
21
|
"angular-split": "^19.0.0",
|
|
22
22
|
"vis-network": "^10.0.2",
|
|
@@ -100,13 +100,17 @@
|
|
|
100
100
|
"types": "./object-relationship/index.d.ts",
|
|
101
101
|
"default": "./fesm2022/yuuvis-client-framework-object-relationship.mjs"
|
|
102
102
|
},
|
|
103
|
+
"./object-summary": {
|
|
104
|
+
"types": "./object-summary/index.d.ts",
|
|
105
|
+
"default": "./fesm2022/yuuvis-client-framework-object-summary.mjs"
|
|
106
|
+
},
|
|
103
107
|
"./object-versions": {
|
|
104
108
|
"types": "./object-versions/index.d.ts",
|
|
105
109
|
"default": "./fesm2022/yuuvis-client-framework-object-versions.mjs"
|
|
106
110
|
},
|
|
107
|
-
"./
|
|
108
|
-
"types": "./
|
|
109
|
-
"default": "./fesm2022/yuuvis-client-framework-
|
|
111
|
+
"./overflow-menu": {
|
|
112
|
+
"types": "./overflow-menu/index.d.ts",
|
|
113
|
+
"default": "./fesm2022/yuuvis-client-framework-overflow-menu.mjs"
|
|
110
114
|
},
|
|
111
115
|
"./overflow-hidden": {
|
|
112
116
|
"types": "./overflow-hidden/index.d.ts",
|
|
@@ -116,18 +120,14 @@
|
|
|
116
120
|
"types": "./pagination/index.d.ts",
|
|
117
121
|
"default": "./fesm2022/yuuvis-client-framework-pagination.mjs"
|
|
118
122
|
},
|
|
119
|
-
"./
|
|
120
|
-
"types": "./
|
|
121
|
-
"default": "./fesm2022/yuuvis-client-framework-
|
|
123
|
+
"./popout": {
|
|
124
|
+
"types": "./popout/index.d.ts",
|
|
125
|
+
"default": "./fesm2022/yuuvis-client-framework-popout.mjs"
|
|
122
126
|
},
|
|
123
127
|
"./renderer": {
|
|
124
128
|
"types": "./renderer/index.d.ts",
|
|
125
129
|
"default": "./fesm2022/yuuvis-client-framework-renderer.mjs"
|
|
126
130
|
},
|
|
127
|
-
"./popout": {
|
|
128
|
-
"types": "./popout/index.d.ts",
|
|
129
|
-
"default": "./fesm2022/yuuvis-client-framework-popout.mjs"
|
|
130
|
-
},
|
|
131
131
|
"./sequence-list": {
|
|
132
132
|
"types": "./sequence-list/index.d.ts",
|
|
133
133
|
"default": "./fesm2022/yuuvis-client-framework-sequence-list.mjs"
|
|
@@ -140,22 +140,22 @@
|
|
|
140
140
|
"types": "./sort/index.d.ts",
|
|
141
141
|
"default": "./fesm2022/yuuvis-client-framework-sort.mjs"
|
|
142
142
|
},
|
|
143
|
-
"./split-view": {
|
|
144
|
-
"types": "./split-view/index.d.ts",
|
|
145
|
-
"default": "./fesm2022/yuuvis-client-framework-split-view.mjs"
|
|
146
|
-
},
|
|
147
143
|
"./tile-list": {
|
|
148
144
|
"types": "./tile-list/index.d.ts",
|
|
149
145
|
"default": "./fesm2022/yuuvis-client-framework-tile-list.mjs"
|
|
150
146
|
},
|
|
151
|
-
"./
|
|
152
|
-
"types": "./
|
|
153
|
-
"default": "./fesm2022/yuuvis-client-framework-
|
|
147
|
+
"./split-view": {
|
|
148
|
+
"types": "./split-view/index.d.ts",
|
|
149
|
+
"default": "./fesm2022/yuuvis-client-framework-split-view.mjs"
|
|
154
150
|
},
|
|
155
151
|
"./upload-progress": {
|
|
156
152
|
"types": "./upload-progress/index.d.ts",
|
|
157
153
|
"default": "./fesm2022/yuuvis-client-framework-upload-progress.mjs"
|
|
158
154
|
},
|
|
155
|
+
"./tree": {
|
|
156
|
+
"types": "./tree/index.d.ts",
|
|
157
|
+
"default": "./fesm2022/yuuvis-client-framework-tree.mjs"
|
|
158
|
+
},
|
|
159
159
|
"./widget-grid": {
|
|
160
160
|
"types": "./widget-grid/index.d.ts",
|
|
161
161
|
"default": "./fesm2022/yuuvis-client-framework-widget-grid.mjs"
|
|
@@ -5,7 +5,7 @@ export declare class OrganizationRendererComponent extends AbstractRendererCompo
|
|
|
5
5
|
resolvedValue: import("@angular/core").Signal<string[]>;
|
|
6
6
|
userAndRole: import("@angular/core").WritableSignal<{
|
|
7
7
|
type: string;
|
|
8
|
-
label:
|
|
8
|
+
label: string | undefined;
|
|
9
9
|
}[] | undefined>;
|
|
10
10
|
userAndRoleLoading: import("@angular/core").Signal<boolean>;
|
|
11
11
|
static ɵfac: i0.ɵɵFactoryDeclaration<OrganizationRendererComponent, never>;
|
|
@@ -15,7 +15,9 @@ export declare class PropertySelectComponent {
|
|
|
15
15
|
selectedProperty: import("@angular/core").InputSignal<ObjectConfigProperty | undefined>;
|
|
16
16
|
propertySelect: import("@angular/core").OutputEmitterRef<TypeProperty | undefined>;
|
|
17
17
|
selectProperty(field: TypeProperty): void;
|
|
18
|
-
|
|
18
|
+
selectPropertyOnKeydown(event: Event, field: TypeProperty): void;
|
|
19
|
+
removeProperty(event: Event): void;
|
|
20
|
+
removePropertyOnKeydown(event: Event): void;
|
|
19
21
|
private getObjectTypeFields;
|
|
20
22
|
private _getLabel;
|
|
21
23
|
static ɵfac: i0.ɵɵFactoryDeclaration<PropertySelectComponent, never>;
|