UNPKG

@rxap/window-system

Version:

A module for creating and managing windows within an Angular application. It provides components for window containers, toolbars, resizers, action bars, and task bars, along with services for managing window instances and configurations. This library allo

1 lines 79.2 kB
{"version":3,"file":"rxap-window-system.mjs","sources":["../../../../../packages/angular/window-system/src/lib/tokens.ts","../../../../../packages/angular/window-system/src/lib/window-tool-bar/window-tool-bar.component.ts","../../../../../packages/angular/window-system/src/lib/window-tool-bar/window-tool-bar.component.html","../../../../../packages/angular/window-system/src/lib/window-content/window-content.component.ts","../../../../../packages/angular/window-system/src/lib/window-content/window-content.component.html","../../../../../packages/angular/window-system/src/lib/window-resizer/window-resizer.component.ts","../../../../../packages/angular/window-system/src/lib/window-resizer/window-resizer.component.html","../../../../../packages/angular/window-system/src/lib/window-container/window-container.component.ts","../../../../../packages/angular/window-system/src/lib/window-container/window-container.component.html","../../../../../packages/angular/window-system/src/lib/default-window/default-window.component.ts","../../../../../packages/angular/window-system/src/lib/default-window/default-window.component.html","../../../../../packages/angular/window-system/src/lib/utilities.ts","../../../../../packages/angular/window-system/src/lib/window-config.ts","../../../../../packages/angular/window-system/src/lib/window-ref.ts","../../../../../packages/angular/window-system/src/lib/window.service.ts","../../../../../packages/angular/window-system/src/lib/window-task-bar/window-task/window-task.component.ts","../../../../../packages/angular/window-system/src/lib/window-task-bar/window-task/window-task.component.html","../../../../../packages/angular/window-system/src/lib/window-task-bar/window-task-bar.component.ts","../../../../../packages/angular/window-system/src/lib/window-task-bar/window-task-bar.component.html","../../../../../packages/angular/window-system/src/lib/window-task-bar/window-task-bar-container/window-task-bar-container.component.ts","../../../../../packages/angular/window-system/src/lib/window-task-bar/window-task-bar-container/window-task-bar-container.component.html","../../../../../packages/angular/window-system/src/lib/window-task-bar/window-task-bar.module.ts","../../../../../packages/angular/window-system/src/lib/window-action-bar/window-action-bar.component.ts","../../../../../packages/angular/window-system/src/lib/window-action-bar/window-action-bar.component.html","../../../../../packages/angular/window-system/src/lib/window-footer.directive.ts","../../../../../packages/angular/window-system/src/lib/window-instance.service.ts","../../../../../packages/angular/window-system/src/lib/window-system.module.ts","../../../../../packages/angular/window-system/src/lib/window-title.directive.ts","../../../../../packages/angular/window-system/src/index.ts","../../../../../packages/angular/window-system/src/rxap-window-system.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport type {\n WindowContainerContext,\n WindowContext,\n} from './window-context';\nimport type { WindowRef } from './window-ref';\nimport { WindowSettings } from './window-config';\n\nexport const RXAP_WINDOW_CONTEXT = new InjectionToken<WindowContext<any>>('rxap/core/window/WINDOW_CONTEXT');\nexport const RXAP_WINDOW_DATA = new InjectionToken<any>('rxap/core/window/WINDOW_DATA');\nexport const RXAP_WINDOW_CONTAINER_CONTEXT = new InjectionToken<WindowContainerContext<any>>(\n 'rxap/core/window/WINDOW_CONTAINER_CONTEXT');\nexport const RXAP_WINDOW_REF = new InjectionToken<WindowRef>('rxap/window-system/WINDOW_REF');\nexport const RXAP_WINDOW_SETTINGS = new InjectionToken<WindowSettings>('rxap/window-system/window-settings');\nexport const RXAP_WINDOW_DEFAULT_SETTINGS = new InjectionToken<WindowSettings>(\n 'rxap/window-system/default-window-settings');\n","import {\n ChangeDetectionStrategy,\n Component,\n Inject,\n} from '@angular/core';\nimport { WindowRef } from '../window-ref';\nimport { RXAP_WINDOW_CONTEXT } from '../tokens';\nimport { MatButtonModule } from '@angular/material/button';\nimport { IconDirective } from '@rxap/material-directives/icon';\nimport { MatIconModule } from '@angular/material/icon';\nimport { PortalModule } from '@angular/cdk/portal';\nimport {\n AsyncPipe,\n NgIf,\n} from '@angular/common';\nimport { MatToolbarModule } from '@angular/material/toolbar';\n\n@Component({\n selector: 'rxap-window-tool-bar',\n templateUrl: './window-tool-bar.component.html',\n styleUrls: ['./window-tool-bar.component.scss'],\n changeDetection: ChangeDetectionStrategy.Default,\n imports: [\n MatToolbarModule,\n NgIf,\n PortalModule,\n MatIconModule,\n IconDirective,\n MatButtonModule,\n AsyncPipe,\n ]\n})\nexport class WindowToolBarComponent<D> {\n\n public windowRef: WindowRef<D>;\n\n constructor(@Inject(RXAP_WINDOW_CONTEXT) context: any) {\n this.windowRef = context.windowRef;\n }\n\n}\n","<mat-toolbar class=\"header flex flex-row items-center justify-between gap-x-4\">\n <div class=\"flex flex-row justify-end items-center gap-x-3\">\n <ng-template [ngIfElse]=\"titleFromSettings\" [ngIf]=\"windowRef.titlePortal$ | async\" let-titlePortal>\n <ng-template [cdkPortalOutlet]=\"titlePortal\"></ng-template>\n </ng-template>\n <ng-template #titleFromSettings>\n <ng-template [ngIf]=\"windowRef.settings$ | async\" let-settings>\n <mat-icon *ngIf=\"settings.icon\" [rxapIcon]=\"settings.icon\"></mat-icon>\n <h3 *ngIf=\"settings.title\">{{settings.title}}</h3>\n </ng-template>\n </ng-template>\n </div>\n <div class=\"flex flex-row justify-end items-center\">\n <button (click)=\"windowRef.minimize()\" *ngIf=\"windowRef.minimizable !== false\"\n mat-icon-button type=\"button\">\n <mat-icon>minimize</mat-icon>\n </button>\n <button (click)=\"windowRef.fullScreen()\" mat-icon-button type=\"button\">\n <mat-icon>fullscreen</mat-icon>\n </button>\n <button (click)=\"windowRef.complete()\" mat-icon-button type=\"button\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n</mat-toolbar>\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ComponentRef,\n Inject,\n Injector,\n isDevMode,\n OnInit,\n ViewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport {\n RXAP_WINDOW_CONTAINER_CONTEXT,\n RXAP_WINDOW_REF,\n} from '../tokens';\nimport { WindowContainerContext } from '../window-context';\nimport {\n CdkPortalOutlet,\n ComponentPortal,\n Portal,\n PortalModule,\n TemplatePortal,\n} from '@angular/cdk/portal';\nimport type { WindowRef } from '../window-ref';\nimport {\n catchError,\n delay,\n filter,\n startWith,\n take,\n tap,\n timeout,\n} from 'rxjs/operators';\nimport {\n isObservable,\n throwError,\n TimeoutError,\n} from 'rxjs';\nimport { LoadingIndicatorService } from '@rxap/services';\nimport { isDefined } from '@rxap/rxjs';\n\n@Component({\n selector: 'rxap-window-content',\n templateUrl: './window-content.component.html',\n styleUrls: ['./window-content.component.scss'],\n changeDetection: ChangeDetectionStrategy.Default,\n imports: [PortalModule]\n})\nexport class WindowContentComponent implements AfterViewInit, OnInit {\n\n public context: WindowContainerContext<any>;\n\n public portal: Portal<any> | null = null;\n\n @ViewChild(CdkPortalOutlet)\n public portalOutlet!: CdkPortalOutlet;\n\n constructor(\n @Inject(RXAP_WINDOW_CONTAINER_CONTEXT)\n context: any,\n @Inject(RXAP_WINDOW_REF)\n private readonly windowRef: WindowRef,\n private readonly injector: Injector,\n private readonly viewContainerRef: ViewContainerRef,\n private readonly loadingIndicatorService: LoadingIndicatorService,\n ) {\n this.context = context;\n }\n\n public ngOnInit() {\n if (this.context.template) {\n this.portal = new TemplatePortal(this.context.template, this.viewContainerRef);\n } else if (this.context.component) {\n this.portal = new ComponentPortal<any>(this.context.component, this.viewContainerRef, this.injector);\n }\n }\n\n public ngAfterViewInit() {\n this.portalOutlet.attached.pipe(\n startWith(this.portalOutlet.attachedRef),\n isDefined(),\n take(1),\n tap(attachedRef => this.windowRef.setAttachedRef(attachedRef)),\n tap(attachedRef => {\n const promise: Promise<any>[] = [];\n if (attachedRef instanceof ComponentRef) {\n attachedRef.changeDetectorRef.detectChanges();\n const loading$ = attachedRef.instance.loading$;\n if (loading$ && isObservable(loading$)) {\n if (isDevMode()) {\n console.warn('The component has a loading indicator member');\n }\n this.loadingIndicatorService.attachLoading(loading$);\n promise.push(loading$.pipe(\n filter(Boolean),\n take(1),\n delay(100),\n tap(() => attachedRef.changeDetectorRef.detectChanges()),\n ).toPromise());\n } else {\n this.loadingIndicatorService.disable();\n }\n } else {\n this.loadingIndicatorService.disable();\n }\n return Promise.all(promise);\n }),\n timeout(10000),\n catchError(error => {\n\n if (error instanceof TimeoutError) {\n if (isDevMode()) {\n console.warn('The window content never resolved the attached ref');\n }\n }\n\n return throwError(error);\n }),\n ).subscribe();\n }\n\n}\n","<div class=\"p-4\">\n <ng-template [cdkPortalOutlet]=\"portal\"></ng-template>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n Inject,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ViewChild,\n} from '@angular/core';\nimport {\n fromEvent,\n Subscription,\n} from 'rxjs';\nimport {\n filter,\n finalize,\n map,\n switchMap,\n takeUntil,\n tap,\n} from 'rxjs/operators';\nimport { RXAP_WINDOW_CONTEXT } from '../tokens';\nimport { WindowRef } from '../window-ref';\nimport {\n AsyncPipe,\n NgClass,\n} from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\n\n@Component({\n selector: 'rxap-window-resizer',\n templateUrl: './window-resizer.component.html',\n styleUrls: ['./window-resizer.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MatIconModule, AsyncPipe, NgClass]\n})\nexport class WindowResizerComponent implements OnInit, OnDestroy {\n\n @Input({ required: true }) public containerRef!: ElementRef<any>;\n\n public windowRef: WindowRef<any>;\n\n @ViewChild('resizer', { static: true }) public resizerRef!: ElementRef<any>;\n\n // eslint-disable-next-line @angular-eslint/no-output-rename\n @Output('width') public width$ = new EventEmitter<string>();\n // eslint-disable-next-line @angular-eslint/no-output-rename\n @Output('height') public height$ = new EventEmitter<string>();\n // eslint-disable-next-line @angular-eslint/no-output-rename\n @Output('resizing') public resizing$ = new EventEmitter<boolean>();\n\n private _subscription = new Subscription();\n\n constructor(\n @Inject(RXAP_WINDOW_CONTEXT) context: any,\n ) {\n this.windowRef = context.windowRef;\n }\n\n ngOnDestroy(): void {\n this._subscription.unsubscribe();\n }\n\n ngOnInit() {\n\n let originalMouseX = 0;\n let originalMouseY = 0;\n let originalWidth = 0;\n let originalHeight = 0;\n\n this._subscription.add(\n fromEvent<MouseEvent>(this.resizerRef.nativeElement, 'mousedown').pipe(\n tap(event => {\n this.resizing$.emit(true);\n originalMouseX = event.pageX;\n originalMouseY = event.pageY;\n originalWidth = parseFloat(\n getComputedStyle(this.containerRef.nativeElement, null)\n .getPropertyValue('width')\n .replace('px', ''),\n );\n originalHeight = parseFloat(\n getComputedStyle(this.containerRef.nativeElement, null)\n .getPropertyValue('height')\n .replace('px', ''),\n );\n }),\n switchMap(() => fromEvent<MouseEvent>(window, 'mousemove').pipe(\n takeUntil(fromEvent(window, 'mouseup')),\n map((event) => ({\n width: originalWidth + (event.pageX - originalMouseX),\n height: originalHeight + (event.pageY - originalMouseY),\n })),\n filter(size => (Number(this.windowRef.getSizeConfig().minHeight) || 0) <=\n size.height &&\n (Number(this.windowRef.getSizeConfig().minWidth) || 0) <=\n size.width),\n map(size => ({\n width: size.width + 'px',\n height: size.height + 'px',\n })),\n tap(size => {\n this.width$.emit(size.width);\n this.height$.emit(size.height);\n }),\n tap(size => {\n this.windowRef.setHeight(size.height);\n this.windowRef.setWidth(size.width);\n }),\n finalize(() => this.resizing$.emit(false)),\n ),\n ),\n ).subscribe(),\n );\n\n }\n\n}\n","<div #resizer class=\"resizer\">\n <mat-icon [ngClass]=\"{ hidden: (resizing$ | async) === false }\">texture</mat-icon>\n</div>\n","import {\n CdkDrag,\n CdkDragEnd,\n CdkDragHandle,\n} from '@angular/cdk/drag-drop';\nimport { PortalModule } from '@angular/cdk/portal';\nimport {\n AsyncPipe,\n NgStyle,\n} from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n ContentChild,\n ElementRef,\n HostBinding,\n inject,\n INJECTOR,\n OnInit,\n runInInjectionContext,\n Signal,\n ViewChild,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { isDefined } from '@rxap/rxjs';\nimport { LoadingIndicatorService } from '@rxap/services';\nimport { merge } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport {\n RXAP_WINDOW_CONTEXT,\n RXAP_WINDOW_REF,\n} from '../tokens';\nimport { WindowResizerComponent } from '../window-resizer/window-resizer.component';\nimport { WindowToolBarComponent } from '../window-tool-bar/window-tool-bar.component';\n\n@Component({\n selector: 'rxap-window-container',\n templateUrl: './window-container.component.html',\n styleUrls: ['./window-container.component.scss'],\n changeDetection: ChangeDetectionStrategy.Default,\n\n host: {\n class: 'rxap-window-container',\n },\n imports: [\n CdkDrag,\n NgStyle,\n CdkDragHandle,\n WindowToolBarComponent,\n MatToolbarModule,\n PortalModule,\n MatProgressBarModule,\n WindowResizerComponent,\n AsyncPipe,\n ],\n})\nexport class WindowContainerComponent implements OnInit {\n\n @ContentChild('[footer]', { static: true }) public footerContent!: ElementRef;\n\n @ViewChild('container', { static: true }) public containerRef!: ElementRef;\n @ViewChild(WindowResizerComponent, { static: true }) public windowContainerResizer!: WindowResizerComponent;\n\n public width!: Signal<string>;\n public height!: Signal<string>;\n\n private readonly injector = inject(INJECTOR);\n public readonly context = inject(RXAP_WINDOW_CONTEXT);\n public readonly windowRef = inject(RXAP_WINDOW_REF);\n public readonly windowInstance = inject(LoadingIndicatorService);\n\n @HostBinding('attr.data-id')\n public get id(): string {\n return this.context.id;\n }\n\n ngOnInit() {\n runInInjectionContext(this.injector, () => {\n this.width = toSignal(\n merge(\n this.windowContainerResizer.width$,\n this.windowRef.width$,\n ).pipe(isDefined(), filter(value => !!value?.match(/^\\d+/))),\n { initialValue: '100%' },\n );\n\n this.height = toSignal(\n merge(\n this.windowContainerResizer.height$,\n this.windowRef.height$,\n ).pipe(isDefined(), filter(value => !!value?.match(/^\\d+/))),\n { initialValue: '100%' },\n );\n });\n }\n\n public onDragEnded($event: CdkDragEnd) {\n const nativeElement = $event.source.element.nativeElement;\n const pos = nativeElement.getBoundingClientRect();\n $event.source.reset();\n this.windowRef.setPos(pos.left + 'px', pos.top + 'px');\n }\n\n}\n","<div #container\n (cdkDragEnded)=\"onDragEnded($event)\"\n [cdkDragDisabled]=\"windowRef.draggable === false\"\n [ngStyle]=\"{\n 'width': width(),\n 'height': height(),\n 'minWidth': windowRef.minWidth,\n 'minHeight': windowRef.minHeight,\n 'maxWidth': windowRef.maxWidth,\n 'maxHeight': windowRef.maxHeight\n }\"\n cdkDrag\n cdkDragBoundary=\".cdk-overlay-container\"\n class=\"drop-shadow-2xl bg-white dark:bg-black border-2 border-gray-400 dark:border-gray-800 rounded-xl overflow-hidden\">\n <div class=\"flex flex-col h-full max-h-full\">\n\n <div cdkDragHandle class=\"grow-0 w-full h-[64px] min-h-[64px] cursor-move\">\n <rxap-window-tool-bar></rxap-window-tool-bar>\n </div>\n\n <div class=\"grow overflow-auto w-full\">\n <ng-content></ng-content>\n </div>\n\n @if (windowRef.footerPortal$ | async; as footerPortal) {\n <mat-toolbar class=\"mat-elevation-z1 grow-0 w-full h-[64px] min-h-[64px]\">\n <ng-template [cdkPortalOutlet]=\"footerPortal\"></ng-template>\n </mat-toolbar>\n }\n\n @if (windowInstance.isLoading$ | async) {\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n }\n\n <rxap-window-resizer [containerRef]=\"containerRef\"></rxap-window-resizer>\n </div>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n} from '@angular/core';\nimport { WindowContentComponent } from '../window-content/window-content.component';\nimport { WindowContainerComponent } from '../window-container/window-container.component';\n\n@Component({\n selector: 'rxap-default-window',\n templateUrl: './default-window.component.html',\n styleUrls: ['./default-window.component.scss'],\n changeDetection: ChangeDetectionStrategy.Default,\n imports: [WindowContainerComponent, WindowContentComponent]\n})\nexport class DefaultWindowComponent {\n}\n","<rxap-window-container>\n <rxap-window-content></rxap-window-content>\n</rxap-window-container>\n","export function GetWindowStartPos(): { top: string, left: string } {\n let top = '16px';\n let left = '16px';\n\n // TODO : remove hack to get a better window starting position\n\n const rxapLayoutHeaderElements = document.getElementsByClassName('rxap-layout-header');\n\n if (rxapLayoutHeaderElements) {\n const rxapLayoutHeaderElement = rxapLayoutHeaderElements.item(0);\n if (rxapLayoutHeaderElement && rxapLayoutHeaderElement instanceof HTMLElement) {\n top = (rxapLayoutHeaderElement.offsetHeight + 16) + 'px';\n }\n }\n\n const rxapLayoutSidenavs = document.getElementsByClassName('rxap-layout-sidenav');\n\n if (rxapLayoutSidenavs) {\n const rxapLayoutSidenav = rxapLayoutSidenavs.item(0);\n if (rxapLayoutSidenav && rxapLayoutSidenav instanceof HTMLElement) {\n const container = rxapLayoutSidenav.firstElementChild;\n if (container && container instanceof HTMLElement) {\n left = (container.offsetWidth + 16) + 'px';\n }\n }\n }\n\n return {\n top,\n left,\n };\n}\n","import { ComponentType } from '@angular/cdk/portal';\nimport {\n ComponentFactoryResolver,\n Injector,\n TemplateRef,\n ViewContainerRef,\n} from '@angular/core';\nimport { ButtonDefinition } from '@rxap/rxjs';\nimport { IconConfig } from '@rxap/utilities';\n\nexport interface WindowActions<A> {\n position?: 'start' | 'end';\n definitions: ButtonDefinition<[ A ]>[];\n}\n\nexport interface WindowSettings<D = any> {\n id?: string;\n title?: string;\n icon?: IconConfig;\n width?: string;\n height?: string;\n minWidth?: string;\n minHeight?: string;\n maxWidth?: string;\n maxHeight?: string;\n resizeable?: boolean;\n minimizable?: boolean;\n draggable?: boolean;\n panelClass?: string;\n data?: D;\n actions?: WindowActions<D>;\n}\n\nexport interface WindowConfig<D = any, T = any> extends WindowSettings<D> {\n windowComponent?: ComponentType<T>;\n component?: ComponentType<T>;\n template?: TemplateRef<T>;\n injector?: Injector | null;\n injectorName?: string;\n componentFactoryResolver?: ComponentFactoryResolver | null;\n viewContainerRef?: ViewContainerRef | null;\n}\n\nexport const DEFAULT_WINDOW_CONFIG: WindowConfig<any, any> = {\n resizeable: true,\n draggable: true,\n injector: null,\n componentFactoryResolver: null,\n minWidth: '384px',\n minHeight: '192px',\n maxWidth: '100vw',\n maxHeight: '100vh',\n minimizable: false,\n};\n","import {\n Overlay,\n OverlayRef,\n OverlaySizeConfig,\n} from '@angular/cdk/overlay';\nimport { Portal } from '@angular/cdk/portal';\nimport {\n ComponentRef,\n EmbeddedViewRef,\n InjectFlags,\n} from '@angular/core';\nimport {\n BehaviorSubject,\n ReplaySubject,\n Subject,\n} from 'rxjs';\nimport { RXAP_WINDOW_SETTINGS } from './tokens';\nimport { GetWindowStartPos } from './utilities';\nimport { WindowSettings } from './window-config';\n\nexport class WindowRef<D = any, R = any> extends Subject<R> {\n\n public readonly width$ = new BehaviorSubject<string>(this.getWidth());\n public readonly height$ = new BehaviorSubject<string>(this.getHeight());\n\n /**\n * @deprecated removed. use the subscribe method and wait for the resolve event\n */\n public readonly closed$ = new Subject<R | undefined>();\n\n public attachedRef$ = new ReplaySubject<ComponentRef<any> | EmbeddedViewRef<any>>(1);\n /**\n * @internal\n */\n public footerPortal$ = new ReplaySubject<Portal<any>>(1);\n /**\n * @internal\n */\n public titlePortal$ = new ReplaySubject<Portal<any>>(1);\n public settings$ = new ReplaySubject<WindowSettings>(1);\n /**\n * stores the window size before fullScreen\n * @internal\n */\n private oldSizes: { width: string, height: string, pos: { x: string, y: string } } | null = null;\n\n constructor(\n protected readonly overlayRef: OverlayRef,\n protected readonly overlay: Overlay,\n protected readonly settings: WindowSettings<D>,\n ) {\n super();\n }\n\n public get id(): string | undefined {\n return this.settings.id;\n }\n\n public get minimizable(): boolean | undefined {\n return this.settings.minimizable;\n }\n\n public get draggable(): boolean | undefined {\n return this.settings.draggable;\n }\n\n public get minWidth(): string | undefined {\n return this.settings.minWidth;\n }\n\n public get minHeight(): string | undefined {\n return this.settings.minHeight;\n }\n\n public get maxWidth(): string | undefined {\n return this.settings.maxWidth;\n }\n\n public get maxHeight(): string | undefined {\n return this.settings.maxHeight;\n }\n\n public get isMinimized(): boolean {\n return this.overlayRef.hostElement.style.display === 'none';\n }\n\n /**\n * @deprecated removed. use the complete method\n * @param result\n */\n public close(result?: R): void {\n this.closed$.next(result);\n if (result !== undefined) {\n this.next(result);\n }\n this.complete();\n }\n\n public override complete() {\n this.overlayRef.dispose();\n super.complete();\n }\n\n public minimize(): void {\n this.overlayRef.hostElement.style.display = 'none';\n }\n\n public reopen(): void {\n const startPos = GetWindowStartPos();\n this.setPos(startPos.left, startPos.top);\n this.overlayRef.hostElement.style.display = 'flex';\n }\n\n public getSizeConfig(): OverlaySizeConfig {\n const config = this.overlayRef.getConfig();\n return {\n width: config.width,\n height: config.height,\n minHeight: config.minHeight,\n minWidth: config.minWidth,\n maxHeight: config.maxHeight,\n maxWidth: config.maxWidth,\n };\n }\n\n public setWidth(width: string): void {\n this.overlayRef.updateSize({\n ...this.getSizeConfig(),\n width,\n });\n this.width$.next(width);\n }\n\n public setHeight(height: string): void {\n this.overlayRef.updateSize({\n ...this.getSizeConfig(),\n height,\n });\n this.height$.next(height);\n }\n\n public getWidth(): string {\n return this.getSizeConfig().width! + '';\n // return this.overlayRef.overlayElement.offsetWidth + 'px'\n }\n\n public getHeight(): string {\n return this.getSizeConfig().height! + '';\n // return this.overlayRef.overlayElement.offsetHeight + 'px';\n }\n\n public setPos(x: string, y: string): void {\n this.overlayRef.updatePositionStrategy(this\n .overlay\n .position()\n .global()\n .top(y)\n .left(x),\n );\n this.overlayRef.updatePosition();\n }\n\n public getPos(): { x: string, y: string } {\n const pos = this.overlayRef.overlayElement.getBoundingClientRect();\n return {\n x: pos.left + 'px',\n y: pos.top + 'px',\n };\n }\n\n public fullScreen(): void {\n if (this.oldSizes === null) {\n this.oldSizes = {\n width: this.overlayRef.overlayElement.offsetWidth + 'px',\n height: this.overlayRef.overlayElement.offsetHeight + 'px',\n pos: this.getPos(),\n };\n this.setWidth('100vw');\n this.setHeight('100vh');\n this.setPos('0px', '0px');\n } else {\n this.setWidth(this.oldSizes.width);\n this.setHeight(this.oldSizes.height);\n this.setPos(this.oldSizes.pos.x, this.oldSizes.pos.y);\n this.oldSizes = null;\n }\n }\n\n /**\n * @param portal\n */\n public setFooterPortal(portal: Portal<any>) {\n setTimeout(() => {\n this.footerPortal$.next(portal);\n });\n }\n\n public setTitlePortal(portal: Portal<any>) {\n setTimeout(() => {\n this.titlePortal$.next(portal);\n });\n }\n\n public setAttachedRef(attachedRef: ComponentRef<any> | EmbeddedViewRef<any>) {\n if (attachedRef instanceof ComponentRef) {\n this.updateWindowSettings(attachedRef);\n } else {\n this.updateWindowSettings();\n }\n this.attachedRef$.next(attachedRef);\n }\n\n\n /**\n * Injects the window settings from the component ref injector and overwrites\n * the settings\n * @private\n */\n private updateWindowSettings(componentRef?: ComponentRef<any>) {\n const settings = componentRef?.injector.get(RXAP_WINDOW_SETTINGS, null, InjectFlags.Optional) ?? this.settings;\n if (settings) {\n // prevent change diction error: ExpressionChangedAfterItHasBeenCheckedError\n setTimeout(() => {\n this.settings$.next(Object.assign({}, this.settings, settings));\n });\n }\n }\n\n}\n","import {\n Overlay,\n OverlayConfig,\n} from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport {\n ComponentFactoryResolver,\n Inject,\n Injectable,\n InjectFlags,\n Injector,\n Optional,\n ViewContainerRef,\n} from '@angular/core';\nimport { LoadingIndicatorService } from '@rxap/services';\nimport { GenerateRandomString } from '@rxap/utilities';\nimport { Subject } from 'rxjs';\nimport {\n finalize,\n take,\n tap,\n} from 'rxjs/operators';\nimport { DefaultWindowComponent } from './default-window/default-window.component';\nimport {\n RXAP_WINDOW_CONTAINER_CONTEXT,\n RXAP_WINDOW_CONTEXT,\n RXAP_WINDOW_DATA,\n RXAP_WINDOW_DEFAULT_SETTINGS,\n RXAP_WINDOW_REF,\n} from './tokens';\nimport { GetWindowStartPos } from './utilities';\nimport {\n DEFAULT_WINDOW_CONFIG,\n WindowConfig,\n WindowSettings,\n} from './window-config';\nimport {\n WindowContainerContext,\n WindowContext,\n} from './window-context';\nimport { WindowRef } from './window-ref';\n\n@Injectable({ providedIn: 'root' })\nexport class WindowService {\n public readonly activeCount$ = new Subject<number>();\n private readonly active = new Map<string, WindowRef<any>>();\n\n constructor(\n @Inject(Injector) private readonly injector: Injector,\n @Inject(Overlay) private readonly overlay: Overlay,\n @Inject(ComponentFactoryResolver)\n private readonly componentFactoryResolver: ComponentFactoryResolver,\n @Optional()\n @Inject(RXAP_WINDOW_DEFAULT_SETTINGS)\n private readonly defaultWindowSettings?: WindowSettings,\n ) {\n }\n\n public get hasActiveWindows(): boolean {\n return this.active.size !== 0;\n }\n\n public get activeWindowCount(): number {\n return this.active.size;\n }\n\n public get allActiveWindows(): Array<WindowRef<any>> {\n return Array.from(this.active.values());\n }\n\n public get<D>(id: string): WindowRef<D> {\n if (!this.has(id)) {\n throw new Error(`Active Window with id '${ id }' not found`);\n }\n return this.active.get(id)!;\n }\n\n public close(id: string): void {\n const windowRef = this.get(id);\n windowRef.complete();\n }\n\n public has(id: string): boolean {\n return this.active.has(id);\n }\n\n public open<D, T>(config: WindowConfig<D, T>): WindowRef<D> {\n // Override default configuration\n const windowConfig = {\n id: GenerateRandomString(),\n ...DEFAULT_WINDOW_CONFIG,\n ...(this.defaultWindowSettings ?? {}),\n ...config,\n };\n\n if (this.has(windowConfig.id)) {\n return this.get(windowConfig.id);\n }\n\n // Returns an OverlayRef which is a PortalHost\n const overlayRef = this.createOverlay(windowConfig);\n\n // Instantiate remote control\n const windowRef = new WindowRef<D>(overlayRef, this.overlay, windowConfig);\n\n const context: WindowContext<any> = {\n id: windowConfig.id,\n overlayRef,\n windowRef,\n data: windowConfig.data,\n };\n\n const containerContext: WindowContainerContext<any> = {\n template: windowConfig.template,\n component: windowConfig.component,\n };\n\n const injector = Injector.create({\n parent: windowConfig.injector ?? this.injector,\n providers: [\n {\n provide: RXAP_WINDOW_CONTAINER_CONTEXT,\n useValue: containerContext,\n },\n {\n provide: RXAP_WINDOW_CONTEXT,\n useValue: context,\n },\n {\n provide: RXAP_WINDOW_DATA,\n useValue: windowConfig.data,\n },\n {\n provide: RXAP_WINDOW_REF,\n useValue: windowRef,\n },\n {\n provide: LoadingIndicatorService,\n useClass: LoadingIndicatorService,\n },\n ],\n name: windowConfig?.injectorName ?? 'WindowService',\n });\n\n const containerPortal = new ComponentPortal(\n windowConfig.windowComponent ?? DefaultWindowComponent,\n injector.get(ViewContainerRef, null, InjectFlags.Optional) ??\n windowConfig.viewContainerRef ??\n null,\n injector,\n injector.get(ComponentFactoryResolver, null, InjectFlags.Optional) ??\n windowConfig.componentFactoryResolver ??\n this.componentFactoryResolver,\n );\n\n overlayRef.attach(containerPortal);\n\n overlayRef\n .backdropClick()\n .pipe(\n take(1),\n tap(() => windowRef.complete()),\n )\n .subscribe();\n\n windowRef.pipe(finalize(() => this.remove(windowConfig.id))).subscribe();\n\n this.add(windowRef);\n\n return windowRef;\n }\n\n public remove(id: string) {\n const result = this.active.delete(id);\n this.activeCount$.next(this.active.size);\n return result;\n }\n\n public add(windowRef: WindowRef<any>): void {\n this.active.set(windowRef.id!, windowRef);\n this.activeCount$.next(this.active.size);\n }\n\n private createOverlay({\n panelClass,\n width,\n height,\n minHeight,\n minWidth,\n maxHeight,\n maxWidth,\n }: OverlayConfig) {\n const startPos = GetWindowStartPos();\n\n const positionStrategy = this.overlay\n .position()\n .global()\n .top(startPos.top)\n .left(startPos.left);\n\n const overlayConfig = new OverlayConfig({\n hasBackdrop: false,\n panelClass,\n scrollStrategy: this.overlay.scrollStrategies.block(),\n width,\n height,\n maxWidth: maxWidth ?? this.defaultWindowSettings?.maxWidth ?? '100vw',\n maxHeight: maxHeight ?? this.defaultWindowSettings?.maxHeight ?? '100vh',\n minWidth: minWidth ?? this.defaultWindowSettings?.minWidth ?? '384px',\n minHeight: minHeight ?? this.defaultWindowSettings?.minHeight ?? '192px',\n positionStrategy,\n });\n\n return this.overlay.create(overlayConfig);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n Input,\n} from '@angular/core';\nimport { WindowRef } from '../../window-ref';\nimport { StopPropagationDirective } from '@rxap/directives';\nimport { MatButtonModule } from '@angular/material/button';\nimport { IconDirective } from '@rxap/material-directives/icon';\nimport { MatIconModule } from '@angular/material/icon';\nimport {\n AsyncPipe,\n NgClass,\n NgIf,\n} from '@angular/common';\n\n@Component({\n selector: 'rxap-window-task',\n templateUrl: './window-task.component.html',\n styleUrls: ['./window-task.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n NgClass,\n NgIf,\n MatIconModule,\n IconDirective,\n MatButtonModule,\n StopPropagationDirective,\n AsyncPipe,\n ]\n})\nexport class WindowTaskComponent {\n\n @Input({ required: true }) public window!: WindowRef<any>;\n\n public close() {\n this.window.complete();\n }\n\n public reopen() {\n this.window.reopen();\n }\n\n}\n","<div (click)=\"reopen()\" [ngClass]=\"{ minimized: window.isMinimized }\"\n class=\"rxap-container mat-elevation-z2 flex flex-row justify-start items-center gap-2\">\n <ng-template [ngIf]=\"window.settings$ | async\" let-settings>\n <mat-icon *ngIf=\"settings.icon\" [rxapIcon]=\"settings.icon\"></mat-icon>\n <h3 *ngIf=\"settings.title\" class=\"grow\">{{settings.title}}</h3>\n </ng-template>\n <button (click)=\"close()\" mat-icon-button rxapStopPropagation type=\"button\">\n <mat-icon>close</mat-icon>\n </button>\n</div>\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Inject,\n OnDestroy,\n OnInit,\n} from '@angular/core';\nimport { WindowService } from '../window.service';\nimport { Subscription } from 'rxjs';\nimport { tap } from 'rxjs/operators';\nimport { WindowTaskComponent } from './window-task/window-task.component';\nimport { NgFor } from '@angular/common';\n\n@Component({\n selector: 'rxap-window-task-bar',\n templateUrl: './window-task-bar.component.html',\n styleUrls: ['./window-task-bar.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgFor, WindowTaskComponent]\n})\nexport class WindowTaskBarComponent implements OnInit, OnDestroy {\n\n public subscriptions = new Subscription();\n\n constructor(\n @Inject(WindowService) public windowService: WindowService,\n @Inject(ChangeDetectorRef) public cdr: ChangeDetectorRef,\n ) {\n }\n\n public ngOnInit(): void {\n this.subscriptions.add(this.windowService.activeCount$.pipe(\n tap(() => this.cdr.markForCheck()),\n ).subscribe());\n }\n\n public ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n }\n\n}\n","<div class=\"tasks grow-0 flex flex-row flex-wrap\">\n <rxap-window-task *ngFor=\"let window of windowService.allActiveWindows\"\n [window]=\"window\"\n class=\"grow-0\">\n </rxap-window-task>\n</div>\n","import {\n Component,\n Inject,\n InjectionToken,\n Optional,\n} from '@angular/core';\nimport { WindowService } from '../../window.service';\nimport { WindowTaskBarComponent } from '../window-task-bar.component';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatBadgeModule } from '@angular/material/badge';\nimport { MatButtonModule } from '@angular/material/button';\nimport {\n NgClass,\n NgIf,\n} from '@angular/common';\n\nexport interface WindowTaskBarContainerSettings {\n expand?: boolean;\n}\n\nexport const RXAP_WINDOW_TASK_BAR_CONTAINER_SETTINGS = new InjectionToken('rxap/window-system/task-bar-container');\n\n@Component({\n selector: 'rxap-window-task-bar-container',\n templateUrl: './window-task-bar-container.component.html',\n styleUrls: ['./window-task-bar-container.component.scss'],\n imports: [\n NgIf,\n MatButtonModule,\n MatBadgeModule,\n MatIconModule,\n MatToolbarModule,\n WindowTaskBarComponent,\n NgClass,\n ]\n})\nexport class WindowTaskBarContainerComponent {\n\n public expand = true;\n\n constructor(\n @Inject(WindowService)\n public windowService: WindowService,\n @Optional()\n @Inject(RXAP_WINDOW_TASK_BAR_CONTAINER_SETTINGS)\n settings: WindowTaskBarContainerSettings | null = null,\n ) {\n if (settings) {\n if (settings.expand !== undefined) {\n this.expand = settings.expand;\n }\n }\n }\n\n}\n","<div *ngIf=\"windowService.hasActiveWindows\" class=\"rxap-container flex flex-col\">\n <div class=\"flex flex-row justify-end items-end\">\n <button (click)=\"expand = !expand\"\n [matBadgeHidden]=\"!windowService.hasActiveWindows\"\n [matBadge]=\"windowService.activeWindowCount.toFixed(0)\"\n class=\"pin\"\n color=\"primary\"\n mat-icon-button\n matBadgePosition=\"above before\"\n type=\"button\">\n <mat-icon *ngIf=\"!expand\">keyboard_arrow_up</mat-icon>\n <mat-icon *ngIf=\"expand\">keyboard_arrow_down</mat-icon>\n </button>\n </div>\n <mat-toolbar [ngClass]=\"{ hidden: !expand }\" class=\"tasks\">\n <rxap-window-task-bar></rxap-window-task-bar>\n </mat-toolbar>\n</div>\n","import { NgModule } from '@angular/core';\nimport { WindowTaskBarComponent } from './window-task-bar.component';\nimport { WindowTaskComponent } from './window-task/window-task.component';\nimport { WindowTaskBarContainerComponent } from './window-task-bar-container/window-task-bar-container.component';\n\n@NgModule({\n imports: [\n WindowTaskBarComponent, WindowTaskComponent, WindowTaskBarContainerComponent,\n ],\n exports: [ WindowTaskBarComponent, WindowTaskBarContainerComponent ],\n})\nexport class WindowTaskBarModule {}\n","import {\n Component,\n Inject,\n Injector,\n} from '@angular/core';\nimport { RXAP_WINDOW_CONTEXT } from '../tokens';\nimport { ButtonDefinition } from '@rxap/rxjs';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { NgIf } from '@angular/common';\n\n@Component({\n selector: 'rxap-window-action-bar',\n templateUrl: './window-action-bar.component.html',\n styleUrls: ['./window-action-bar.component.scss'],\n imports: [NgIf, MatToolbarModule]\n})\nexport class WindowActionBarComponent {\n\n public definitions: ButtonDefinition<any>[] | null = null;\n public position = 'start';\n\n constructor(@Inject(RXAP_WINDOW_CONTEXT) context: any, public injector: Injector) {\n if (context.windowRef.settings.actions) {\n this.definitions = context.windowRef.settings.actions.definitions;\n this.position = context.windowRef.settings.actions.position || this.position;\n }\n }\n\n}\n","<mat-toolbar-row *ngIf=\"definitions\" class=\"p-2 flex flex-row gap-2 justify-{{position}} items-center\">\n <span>this feature is removed</span>\n</mat-toolbar-row>\n","import {\n Directive,\n Inject,\n OnInit,\n TemplateRef,\n ViewContainerRef,\n} from '@angular/core';\nimport { WindowRef } from './window-ref';\nimport { RXAP_WINDOW_REF } from './tokens';\nimport { TemplatePortal } from '@angular/cdk/portal';\n\nexport interface WindowFooterTemplateContext {\n $implicit: WindowRef;\n}\n\n@Directive({\n selector: '[rxapWindowFooter]',\n standalone: true,\n})\nexport class WindowFooterDirective implements OnInit {\n\n constructor(\n @Inject(RXAP_WINDOW_REF)\n private readonly windowRef: WindowRef,\n @Inject(TemplateRef)\n private readonly template: TemplateRef<WindowFooterTemplateContext>,\n @Inject(ViewContainerRef)\n private readonly viewContainerRef: ViewContainerRef,\n ) {\n }\n\n /**\n * Asserts the correct type of the context for the template that `NgForOf` will render.\n *\n * The presence of this method is a signal to the Ivy template type-check compiler that the\n * `NgForOf` structural directive renders its template with a specific context type.\n */\n static ngTemplateContextGuard(dir: WindowFooterDirective, ctx: any):\n ctx is WindowFooterTemplateContext {\n return true;\n }\n\n public ngOnInit() {\n this.windowRef.setFooterPortal(new TemplatePortal<WindowFooterTemplateContext>(\n this.template,\n this.viewContainerRef,\n {\n $implicit: this.windowRef,\n },\n ));\n }\n\n}\n\n\n","import {\n Injectable,\n OnDestroy,\n} from '@angular/core';\nimport {\n Observable,\n Subscription,\n} from 'rxjs';\nimport {\n delay,\n map,\n} from 'rxjs/operators';\nimport { ToggleSubject } from '@rxap/rxjs';\n\n@Injectable()\nexport class WindowInstanceService implements OnDestroy {\n\n public readonly loading$ = new ToggleSubject(false);\n\n private readonly _attachedLoadingSubscription = new Subscription();\n\n public attachLoading(loading$: Observable<any>) {\n this._attachedLoadingSubscription.add(\n loading$.pipe(map(Boolean), delay(0)).subscribe(this.loading$.next),\n );\n }\n\n public ngOnDestroy() {\n this._attachedLoadingSubscription.unsubscribe();\n }\n\n}\n","import { NgModule } from '@angular/core';\nimport { DefaultWindowComponent } from './default-window/default-window.component';\nimport { WindowActionBarComponent } from './window-action-bar/window-action-bar.component';\nimport { WindowContainerComponent } from './window-container/window-container.component';\nimport { WindowContentComponent } from './window-content/window-content.component';\nimport { WindowResizerComponent } from './window-resizer/window-resizer.component';\nimport { WindowTaskBarModule } from './window-task-bar/window-task-bar.module';\nimport { WindowToolBarComponent } from './window-tool-bar/window-tool-bar.component';\n\n// TODO : refactor to be used without a central module\n@NgModule({\n imports: [\n WindowContainerComponent,\n WindowToolBarComponent,\n WindowResizerComponent,\n DefaultWindowComponent,\n WindowContentComponent,\n WindowActionBarComponent,\n ],\n exports: [\n WindowContainerComponent,\n WindowToolBarComponent,\n WindowResizerComponent,\n DefaultWindowComponent,\n WindowContentComponent,\n WindowTaskBarModule,\n ],\n})\nexport class RxapWindowSystemModule {}\n","import { TemplatePortal } from '@angular/cdk/portal';\nimport {\n Directive,\n inject,\n OnInit,\n TemplateRef,\n ViewContainerRef,\n} from '@angular/core';\nimport { RXAP_WINDOW_REF } from './tokens';\nimport { WindowRef } from './window-ref';\n\nexport interface WindowTitleTemplateContext {\n $implicit: WindowRef;\n}\n\n@Directive({\n selector: '[rxapWindowTitle]',\n standalone: true,\n})\nexport class WindowTitleDirective implements OnInit {\n\n private readonly windowRef: WindowRef = inject(RXAP_WINDOW_REF);\n private readonly template: TemplateRef<WindowTitleTemplateContext> = inject(TemplateRef);\n private readonly viewContainerRef = inject(ViewContainerRef);\n\n /**\n * Asserts the correct type of the context for the template that `NgForOf` will render.\n *\n * The presence of this method is a signal to the Ivy template type-check compiler that the\n * `NgForOf` structural directive renders its template with a specific context type.\n */\n static ngTemplateContextGuard(dir: WindowTitleDirective, ctx: any):\n ctx is WindowTitleTemplateContext {\n return true;\n }\n\n public ngOnInit() {\n this.windowRef.setTitlePortal(new TemplatePortal<WindowTitleTemplateContext>(\n this.template,\n this.viewContainerRef,\n {\n $implicit: this.windowRef,\n },\n ));\n }\n\n}\n\n\n","// region window-tool-bar\nexport * from './lib/window-tool-bar/window-tool-bar.component';\n// endregion\n\n// region window-task-bar window-task-bar-container\nexport * from './lib/window-task-bar/window-task-bar-container/window-task-bar-container.component';\n// endregion\n\n// region window-task-bar window-task\nexport * from './lib/window-task-bar/window-task/window-task.component';\n// endregion\n\n// region window-task-bar\nexport * from './lib/window-task-bar/window-task-bar.component';\nexport * from './lib/window-task-bar/window-task-bar.module';\n// endregion\n\n// region window-resizer\nexport * from './lib/window-resizer/window-resizer.component';\n// endregion\n\n// region window-content\nexport * from './lib/window-content/window-content.component';\n// endregion\n\n// region window-container\nexport * from './lib/window-container/window-container.component';\n// endregion\n\n// region window-action-bar\nexport * from './lib/window-action-bar/window-action-bar.component';\n// endregion\n\n// region default-window\nexport * from './lib/default-window/default-window.component';\n// endregion\n\n// region \nexport * from './lib/tokens';\nexport * from './lib/utilities';\nexport * from './lib/window-config';\nexport * from './lib/window-context';\nexport * from './lib/window-footer.directive';\nexport * from './lib/window-instance.service';\nexport * from './lib/window-ref';\nexport * from './lib/window-system.module';\nexport * from './lib/window-title.directive';\nexport * from './lib/window.service';\n// endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i3","i1","i2","i4"],"mappings":"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