Compare commits

...
5 Commits
6 changed files with 1725 additions and 308 deletions
@@ -6,6 +6,7 @@
[class.no-text]="isNoTextCard() | async" [class.no-text]="isNoTextCard() | async"
[class.page-card]="getValue(isInPage) | async" [class.page-card]="getValue(isInPage) | async"
[isForeground]="getValue(foregroundColor) | async" [isForeground]="getValue(foregroundColor) | async"
[class.fullscreen]="getValue(isFullscreen) | async"
> >
<!-- Card Header --> <!-- Card Header -->
<mat-card-header class="x-header" *ngIf="getValue(showHeader) | async"> <mat-card-header class="x-header" *ngIf="getValue(showHeader) | async">
@@ -1,5 +1,43 @@
// //
@import '../theme/theme.scss'; @import "../theme/theme.scss";
:host {
display: block;
width: inherit;
height: inherit;
}
.x-wrapper {
position: relative;
display: flex;
flex-direction: column;
width: 100%;
height: 100%;
transition: all 0.3s ease-in-out;
border-radius: var(--card-border-radius, 8px);
overflow: hidden;
&:fullscreen {
border-radius: 0;
background-color: var(--full-screen-bg, #ffffff);
width: 100vw;
height: 100vh;
.x-header {
padding: 16px 24px;
}
.x-content {
flex: 1;
overflow: auto;
}
.x-image {
max-height: 60vh;
object-fit: contain;
}
}
}
// //
:host::ng-deep.x-card.no-text { :host::ng-deep.x-card.no-text {
@@ -20,7 +58,7 @@
@include push-auto(); @include push-auto();
@include applyWidthHeight(); @include applyWidthHeight();
@include m-tb($d-l); @include m-tb($d-l);
@include animation('fadeInUp'); @include animation("fadeInUp");
&.mobile { &.mobile {
box-sizing: border-box; box-sizing: border-box;
@@ -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;
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff