try to implement fullscreen support for xCard Component ...

This commit is contained in:
2026-08-29 00:53:50 +03:30
parent 2574c98c65
commit 7c5fcb8f06
3 changed files with 112 additions and 5 deletions
@@ -20,6 +20,20 @@ export class XCardComponent extends XCardContainerComponent {
//#region Props ... //#region Props ...
// //
private ACTION_PROVIDER_SUBSCRIPTION: Subscription; private ACTION_PROVIDER_SUBSCRIPTION: Subscription;
//
// Full Screen ...
private IS_FULLSCREEN: boolean = false;
public set isFullscreen(v: boolean) {
//
const isChanged = v != this.IS_FULLSCREEN;
//
this.IS_FULLSCREEN = v;
}
public get isFullscreen() {
return this.IS_FULLSCREEN;
}
//#endregion //#endregion
// //
@@ -31,7 +45,7 @@ export class XCardComponent extends XCardContainerComponent {
//#region Action Provider Changed ... //#region Action Provider Changed ...
// //
const isActionProviderChanged = changeKeys.includes( const isActionProviderChanged = changeKeys.includes(
nameof<XCardComponent>('actionProvider') nameof<XCardComponent>('actionProvider'),
); );
if (isActionProviderChanged) { if (isActionProviderChanged) {
this.registerActionProvider(); this.registerActionProvider();
@@ -71,13 +85,72 @@ export class XCardComponent extends XCardContainerComponent {
isNullOrEmptyString(object.title) && isNullOrEmptyString(object.title) &&
isNullOrEmptyString(object.subTitle) isNullOrEmptyString(object.subTitle)
); );
}) }),
) ),
) ),
); );
} }
//#endregion //#endregion
//
//#region Actions ...
public async enterFullscreen(options?: FullscreenOptions) {
//
if (this.isFullscreen) {
return;
}
//
const element: HTMLElement = this.element?.nativeElement;
if (!element) {
return;
}
//
try {
//
if (!this.canUseFullscreen()) {
return;
}
//
await element.requestFullscreen(options);
//
this.isFullscreen = true;
this.detectChanges();
} catch {}
}
public async exitFullscreen() {
//
if (!this.isFullscreen) {
return;
}
//
try {
//
if (document.fullscreenElement) {
await document.exitFullscreen();
}
//
this.isFullscreen = false;
this.detectChanges();
} catch {}
}
public async toggleFullscreen() {
//
if (this.isFullscreen) {
await this.exitFullscreen();
} else {
await this.enterFullscreen();
}
}
//#endregion
// //
//#region Private ... //#region Private ...
// //
@@ -94,7 +167,7 @@ export class XCardComponent extends XCardContainerComponent {
// //
// Handle Action Provider ... // Handle Action Provider ...
this.ACTION_PROVIDER_SUBSCRIPTION = this.applyTakeUntilWrapper( this.ACTION_PROVIDER_SUBSCRIPTION = this.applyTakeUntilWrapper(
this.actionProvider.asObservable() this.actionProvider.asObservable(),
).subscribe(async (model) => { ).subscribe(async (model) => {
// //
if (!model) { if (!model) {
@@ -107,6 +180,21 @@ export class XCardComponent extends XCardContainerComponent {
case XCardAction.Refresh: case XCardAction.Refresh:
this.detectChanges(); this.detectChanges();
break; break;
//
case XCardAction.EnterFullScreen:
await this.enterFullscreen();
break;
//
case XCardAction.ExitFullScreen:
await this.exitFullscreen();
break;
//
case XCardAction.ToggleFullScreen:
await this.toggleFullscreen();
break;
} }
}); });
} }
@@ -122,5 +210,14 @@ export class XCardComponent extends XCardContainerComponent {
this.ACTION_PROVIDER_SUBSCRIPTION = null; this.ACTION_PROVIDER_SUBSCRIPTION = null;
} }
//#endregion //#endregion
private canUseFullscreen(): boolean {
return !!(
document.fullscreenEnabled ||
(document as any).webkitFullscreenEnabled ||
(document as any).mozFullScreenEnabled ||
(document as any).msFullscreenEnabled
);
}
//#endregion //#endregion
} }
@@ -34,6 +34,9 @@ import { XFrameworkComponentsConfig } from '../config/x-framework-components.con
export enum XCardAction { export enum XCardAction {
Refresh = 'refresh', Refresh = 'refresh',
ExitFullScreen = 'exit_full_screen',
EnterFullScreen = 'enter_full_screen',
ToggleFullScreen = 'toggle_full_screen',
} }
export type XCardActionIdentifier = XCardAction | string; export type XCardActionIdentifier = XCardAction | string;
@@ -38,6 +38,7 @@ import {
XActionBarActionFiredModel, XActionBarActionFiredModel,
} from '../x-action-bar/x-action-bar.typings'; } from '../x-action-bar/x-action-bar.typings';
import { XIconNames } from '../x-icon/x-icon.typings'; import { XIconNames } from '../x-icon/x-icon.typings';
import { XCardAction } from '../x-card/x-card.typings';
@Component({ @Component({
selector: 'x-chart', selector: 'x-chart',
@@ -670,6 +671,12 @@ export class XChartComponent extends XChartContainerComponent {
return; return;
} }
//
this.cardActionProvider.next({ action: XCardAction.ToggleFullScreen });
//
return;
// //
const chartWrapper = this.chartContainer.nativeElement; const chartWrapper = this.chartContainer.nativeElement;
const doc = document as any; const doc = document as any;