Compare commits

...

2 Commits

Author SHA1 Message Date
Chris Witterholt ee9392cc01 Merge branch 'use-angular17-template-syntax' into 'master'
Use the new Angular 17 template syntax and property 'styleUrl'

See merge request openlp/web-remote!102
2024-04-24 16:44:06 +00:00
Chris Witterholt ea39bbc3d7 Use the new Angular 17 template syntax and property 'styleUrl' 2024-04-24 16:44:06 +00:00
74 changed files with 1036 additions and 774 deletions

View File

@ -35,7 +35,7 @@
"@angular/platform-browser": "^17.3.5",
"@angular/platform-browser-dynamic": "^17.3.5",
"@angular/router": "^17.3.5",
"@fontsource/roboto": "^5.0.12",
"@fontsource/roboto": "^5.0.13",
"@ngx-translate/core": "^15.0.0",
"@ngx-translate/http-loader": "^8.0.0",
"core-js": "^3.37.0",
@ -58,8 +58,8 @@
"@types/jasmine": "~5.1.4",
"@types/jasminewd2": "~2.0.13",
"@types/node": "~20.12.7",
"@typescript-eslint/eslint-plugin": "7.7.0",
"@typescript-eslint/parser": "7.7.0",
"@typescript-eslint/eslint-plugin": "7.7.1",
"@typescript-eslint/parser": "7.7.1",
"axios": "^1.6.8",
"browserslist": "^4.23.0",
"browserslist-useragent-regexp": "^4.1.3",

View File

@ -1,23 +1,35 @@
<mat-toolbar color="primary">
<mat-toolbar-row>
<button mat-icon-button (click)="menu.toggle()"><mat-icon>menu</mat-icon></button>
<button mat-icon-button (click)="menu.toggle()">
<mat-icon>menu</mat-icon>
</button>
<span class="page-title">{{ pageTitle | translate }}</span>
<span class="spacer"></span>
<button *ngIf="showLogin" mat-button (click)="login()">{{ 'LOGIN' | translate }}</button>
<button *ngIf="webSocketOpen"
mat-icon-button
(click)="forceWebSocketReconnection()"
class="connection-status"
matTooltip="{{ 'CONNECTED_TO_OPENLP' | translate }}">
<mat-icon *ngIf="webSocketOpen">link</mat-icon>
</button>
<button *ngIf="!webSocketOpen"
mat-icon-button
(click)="forceWebSocketReconnection()"
class="connection-status"
matTooltip="{{ 'DISCONNECTED' | translate }}">
<mat-icon *ngIf="!webSocketOpen">link_off</mat-icon>
</button>
@if (showLogin) {
<button
mat-button
(click)="login()">
{{ 'LOGIN' | translate }}
</button>
}
@if (webSocketOpen) {
<button
mat-icon-button
(click)="forceWebSocketReconnection()"
class="connection-status"
matTooltip="{{ 'CONNECTED_TO_OPENLP' | translate }}">
<mat-icon>link</mat-icon>
</button>
}
@else {
<button
mat-icon-button
(click)="forceWebSocketReconnection()"
class="connection-status"
matTooltip="{{ 'DISCONNECTED' | translate }}">
<mat-icon>link_off</mat-icon>
</button>
}
<span class="app-version">v{{appVersion}}</span>
</mat-toolbar-row>
</mat-toolbar>
@ -92,188 +104,214 @@
</main>
<!-- These two toolbars are for padding the content so the real toolbars do not block content when scrolled down -->
<mat-toolbar class="toolbar-padding"></mat-toolbar>
<mat-toolbar *ngIf="fastSwitching" class="toolbar-padding"></mat-toolbar>
@if (fastSwitching) {
<mat-toolbar class="toolbar-padding"></mat-toolbar>
}
<footer>
<mat-toolbar class="footer">
<button *ngIf="bigDisplayButtons"
mat-fab color="primary"
(click)="previousItem()"
matTooltip="{{ 'PREVIOUS_ITEM' | translate }}"
matTooltipPosition="above">
<mat-icon>first_page</mat-icon>
</button>
<button *ngIf="!bigDisplayButtons"
mat-icon-button (click)="previousItem()"
matTooltip="{{ 'PREVIOUS_ITEM' | translate }}"
matTooltipPosition="above">
<mat-icon>first_page</mat-icon>
</button>
<button *ngIf="bigDisplayButtons"
mat-fab color="primary"
(click)="nextItem()"
matTooltip="{{ 'NEXT_ITEM' | translate }}"
matTooltipPosition="above">
<mat-icon>last_page</mat-icon>
</button>
<button *ngIf="!bigDisplayButtons"
mat-icon-button (click)="nextItem()"
matTooltip="{{ 'NEXT_ITEM' | translate }}"
matTooltipPosition="above">
<mat-icon>last_page</mat-icon>
</button>
<button *ngIf="bigDisplayButtons"
mat-fab color="primary"
(click)="previousSlide()"
matTooltip="{{ 'PREVIOUS_SLIDE' | translate }}"
matTooltipPosition="above">
<mat-icon>navigate_before</mat-icon>
</button>
<button *ngIf="!bigDisplayButtons"
mat-icon-button (click)="previousSlide()"
matTooltip="{{ 'PREVIOUS_SLIDE' | translate }}"
matTooltipPosition="above">
<mat-icon>navigate_before</mat-icon>
</button>
<button *ngIf="bigDisplayButtons"
mat-fab color="primary"
(click)="nextSlide()"
matTooltip="{{ 'NEXT_SLIDE' | translate }}"
matTooltipPosition="above">
<mat-icon>navigate_next</mat-icon>
</button>
<button *ngIf="!bigDisplayButtons"
mat-icon-button (click)="nextSlide()"
matTooltip="{{ 'NEXT_SLIDE' | translate }}"
matTooltipPosition="above">
<mat-icon>navigate_next</mat-icon>
</button>
<button *ngIf="bigDisplayButtons"
mat-fab color="primary"
#squashedDisplayButton
(click)="openDisplayModeSelector()"
class="squashed-display-button"
matTooltip="{{ 'CHANGE_DISPLAY_MODE' | translate }}"
matTooltipPosition="above">
<mat-icon *ngIf="state.blank">videocam_off</mat-icon>
<mat-icon *ngIf="state.theme">wallpaper</mat-icon>
<mat-icon *ngIf="state.display">desktop_windows</mat-icon>
<mat-icon *ngIf="state.live()">videocam</mat-icon>
</button>
<button *ngIf="!bigDisplayButtons"
mat-icon-button
#squashedDisplayButton
(click)="openDisplayModeSelector()"
class="squashed-display-button"
matTooltip="{{ 'CHANGE_DISPLAY_MODE' | translate }}"
matTooltipPosition="above">
<mat-icon *ngIf="state.blank">videocam_off</mat-icon>
<mat-icon *ngIf="state.theme">wallpaper</mat-icon>
<mat-icon *ngIf="state.display">desktop_windows</mat-icon>
<mat-icon *ngIf="state.live()">videocam</mat-icon>
</button>
<button *ngIf="bigDisplayButtons"
mat-fab color="primary"
(click)="blankDisplay()"
class="displayButton"
[class.active]="state.blank"
[disabled]="state.blank"
matTooltip="{{ 'SHOW_BLACK' | translate }}"
matTooltipPosition="above">
<mat-icon>videocam_off</mat-icon>
</button>
<button *ngIf="!bigDisplayButtons"
mat-icon-button (click)="blankDisplay()"
class="displayButton"
[class.active]="state.blank"
[disabled]="state.blank"
matTooltip="{{ 'SHOW_BLACK' | translate }}"
matTooltipPosition="above">
<mat-icon>videocam_off</mat-icon>
</button>
<button *ngIf="bigDisplayButtons"
mat-fab color="primary"
(click)="themeDisplay()"
class="displayButton"
[class.active]="state.theme"
[disabled]="state.theme"
matTooltip="{{ 'SHOW_BACKGROUND' | translate }}"
matTooltipPosition="above">
<mat-icon>wallpaper</mat-icon>
</button>
<button *ngIf="!bigDisplayButtons"
mat-icon-button
(click)="themeDisplay()"
class="displayButton"
[class.active]="state.theme"
[disabled]="state.theme"
matTooltip="{{ 'SHOW_BACKGROUND' | translate }}"
matTooltipPosition="above">
<mat-icon>wallpaper</mat-icon>
</button>
<button *ngIf="bigDisplayButtons"
mat-fab color="primary"
(click)="desktopDisplay()"
class="displayButton"
[class.active]="state.display"
[disabled]="state.display"
matTooltip="{{ 'SHOW_DESKTOP' | translate }}"
matTooltipPosition="above">
<mat-icon>desktop_windows</mat-icon>
</button>
<button *ngIf="!bigDisplayButtons"
mat-icon-button (click)="desktopDisplay()"
class="displayButton"
[class.active]="state.display"
[disabled]="state.display"
matTooltip="{{ 'SHOW_DESKTOP' | translate }}"
matTooltipPosition="above">
<mat-icon>desktop_windows</mat-icon>
</button>
<button *ngIf="bigDisplayButtons"
mat-fab color="primary"
(click)="showDisplay()"
class="displayButton"
[class.active]="state.display"
[disabled]="state.live()"
matTooltip="{{ 'SHOW_PRESENTATION' | translate }}"
matTooltipPosition="above">
<mat-icon>videocam</mat-icon>
</button>
<button *ngIf="!bigDisplayButtons"
mat-icon-button (click)="showDisplay()"
class="displayButton"
[class.active]="state.display"
[disabled]="state.live()"
matTooltip="{{ 'SHOW_PRESENTATION' | translate }}"
matTooltipPosition="above">
<mat-icon>videocam</mat-icon>
</button>
@if (bigDisplayButtons) {
<button
mat-fab color="primary"
(click)="previousItem()"
matTooltip="{{ 'PREVIOUS_ITEM' | translate }}"
matTooltipPosition="above">
<mat-icon>first_page</mat-icon>
</button>
<button
mat-fab color="primary"
(click)="nextItem()"
matTooltip="{{ 'NEXT_ITEM' | translate }}"
matTooltipPosition="above">
<mat-icon>last_page</mat-icon>
</button>
<button
mat-fab color="primary"
(click)="previousSlide()"
matTooltip="{{ 'PREVIOUS_SLIDE' | translate }}"
matTooltipPosition="above">
<mat-icon>navigate_before</mat-icon>
</button>
<button
mat-fab color="primary"
(click)="nextSlide()"
matTooltip="{{ 'NEXT_SLIDE' | translate }}"
matTooltipPosition="above">
<mat-icon>navigate_next</mat-icon>
</button>
<button
mat-fab color="primary"
#squashedDisplayButton
(click)="openDisplayModeSelector()"
class="squashed-display-button"
matTooltip="{{ 'CHANGE_DISPLAY_MODE' | translate }}"
matTooltipPosition="above">
@if (state.blank) {
<mat-icon>videocam_off</mat-icon>
}
@else if (state.theme) {
<mat-icon>wallpaper</mat-icon>
}
@else if (state.display) {
<mat-icon>desktop_windows</mat-icon>
}
@else if (state.live) {
<mat-icon>videocam</mat-icon>
}
</button>
<button
mat-fab color="primary"
(click)="blankDisplay()"
class="displayButton"
[class.active]="state.blank"
[disabled]="state.blank"
matTooltip="{{ 'SHOW_BLACK' | translate }}"
matTooltipPosition="above">
<mat-icon>videocam_off</mat-icon>
</button>
<button
mat-fab color="primary"
(click)="themeDisplay()"
class="displayButton"
[class.active]="state.theme"
[disabled]="state.theme"
matTooltip="{{ 'SHOW_BACKGROUND' | translate }}"
matTooltipPosition="above">
<mat-icon>wallpaper</mat-icon>
</button>
<button
mat-fab color="primary"
(click)="desktopDisplay()"
class="displayButton"
[class.active]="state.display"
[disabled]="state.display"
matTooltip="{{ 'SHOW_DESKTOP' | translate }}"
matTooltipPosition="above">
<mat-icon>desktop_windows</mat-icon>
</button>
<button
mat-fab color="primary"
(click)="showDisplay()"
class="displayButton"
[class.active]="state.display"
[disabled]="state.live"
matTooltip="{{ 'SHOW_PRESENTATION' | translate }}"
matTooltipPosition="above">
<mat-icon>videocam</mat-icon>
</button>
}
@else {
<button
mat-icon-button
(click)="previousItem()"
matTooltip="{{ 'PREVIOUS_ITEM' | translate }}"
matTooltipPosition="above">
<mat-icon>first_page</mat-icon>
</button>
<button
mat-icon-button
(click)="nextItem()"
matTooltip="{{ 'NEXT_ITEM' | translate }}"
matTooltipPosition="above">
<mat-icon>last_page</mat-icon>
</button>
<button
mat-icon-button (click)="previousSlide()"
matTooltip="{{ 'PREVIOUS_SLIDE' | translate }}"
matTooltipPosition="above">
<mat-icon>navigate_before</mat-icon>
</button>
<button
mat-icon-button (click)="nextSlide()"
matTooltip="{{ 'NEXT_SLIDE' | translate }}"
matTooltipPosition="above">
<mat-icon>navigate_next</mat-icon>
</button>
<button
mat-icon-button
#squashedDisplayButton
(click)="openDisplayModeSelector()"
class="squashed-display-button"
matTooltip="{{ 'CHANGE_DISPLAY_MODE' | translate }}"
matTooltipPosition="above">
@if (state.blank) {
<mat-icon>videocam_off</mat-icon>
}
@else if (state.theme) {
<mat-icon>wallpaper</mat-icon>
}
@else if (state.display) {
<mat-icon>desktop_windows</mat-icon>
}
@else if (state.live) {
<mat-icon>videocam</mat-icon>
}
</button>
<button
mat-icon-button (click)="blankDisplay()"
class="displayButton"
[class.active]="state.blank"
[disabled]="state.blank"
matTooltip="{{ 'SHOW_BLACK' | translate }}"
matTooltipPosition="above">
<mat-icon>videocam_off</mat-icon>
</button>
<button
mat-icon-button
(click)="themeDisplay()"
class="displayButton"
[class.active]="state.theme"
[disabled]="state.theme"
matTooltip="{{ 'SHOW_BACKGROUND' | translate }}"
matTooltipPosition="above">
<mat-icon>wallpaper</mat-icon>
</button>
<button
mat-icon-button (click)="desktopDisplay()"
class="displayButton"
[class.active]="state.display"
[disabled]="state.display"
matTooltip="{{ 'SHOW_DESKTOP' | translate }}"
matTooltipPosition="above">
<mat-icon>desktop_windows</mat-icon>
</button>
<button
mat-icon-button (click)="showDisplay()"
class="displayButton"
[class.active]="state.display"
[disabled]="state.live"
matTooltip="{{ 'SHOW_PRESENTATION' | translate }}"
matTooltipPosition="above">
<mat-icon>videocam</mat-icon>
</button>
}
</mat-toolbar>
<nav *ngIf="fastSwitching"
mat-tab-nav-bar mat-stretch-tabs
class="fast-switcher"
[tabPanel]="tabPanel">
<a mat-tab-link
routerLink="/service"
routerLinkActive #serviceRoute="routerLinkActive"
[active]="serviceRoute.isActive"><mat-icon>list</mat-icon></a>
<a mat-tab-link
routerLink="/slides"
routerLinkActive #slidesRoute="routerLinkActive"
[active]="slidesRoute.isActive"><mat-icon>collections</mat-icon></a>
<a mat-tab-link
routerLink="/alerts"
routerLinkActive #alertsRoute="routerLinkActive"
[active]="alertsRoute.isActive"><mat-icon>error</mat-icon></a>
<a mat-tab-link
routerLink="/search"
routerLinkActive #searchRoute="routerLinkActive"
[active]="searchRoute.isActive"><mat-icon>search</mat-icon></a>
<a mat-tab-link
routerLink="/themes"
routerLinkActive #themesRoute="routerLinkActive"
[active]="themesRoute.isActive"><mat-icon>image</mat-icon></a>
</nav>
@if (fastSwitching) {
<nav
mat-tab-nav-bar mat-stretch-tabs
class="fast-switcher"
[tabPanel]="tabPanel">
<a mat-tab-link
routerLink="/service"
routerLinkActive #serviceRoute="routerLinkActive"
[active]="serviceRoute.isActive"><mat-icon>list</mat-icon></a>
<a mat-tab-link
routerLink="/slides"
routerLinkActive #slidesRoute="routerLinkActive"
[active]="slidesRoute.isActive"><mat-icon>collections</mat-icon></a>
<a mat-tab-link
routerLink="/alerts"
routerLinkActive #alertsRoute="routerLinkActive"
[active]="alertsRoute.isActive"><mat-icon>error</mat-icon></a>
<a mat-tab-link
routerLink="/search"
routerLinkActive #searchRoute="routerLinkActive"
[active]="searchRoute.isActive"><mat-icon>search</mat-icon></a>
<a mat-tab-link
routerLink="/themes"
routerLinkActive #themesRoute="routerLinkActive"
[active]="themesRoute.isActive"><mat-icon>image</mat-icon></a>
</nav>
}
</footer>
</mat-sidenav-content>
</mat-sidenav-container>

View File

@ -20,7 +20,7 @@ import * as supportedBrowsers from '../assets/supportedBrowsers';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
styleUrl: './app.component.scss'
})
export class AppComponent implements OnInit {
// Make DisplayMode enum visible to html code
@ -39,7 +39,7 @@ export class AppComponent implements OnInit {
constructor(private translateService: TranslateService, private pageTitleService: PageTitleService,
private openlpService: OpenLPService, private dialog: MatDialog, private bottomSheet: MatBottomSheet,
private windowRef: WindowRef, private shortcutsService: ShortcutsService, private settingsService: SettingsService) {
this.pageTitleService.pageTitleChanged$.subscribe(pageTitle => this.pageTitle = pageTitle.toUpperCase());
this.pageTitleService.pageTitleChanged$.subscribe(pageTitle => this.pageTitle = pageTitle);
this.openlpService.stateChanged$.subscribe(item => this.state = item);
this.openlpService.webSocketStateChanged$.subscribe(status => this.webSocketOpen = status === WebSocketStatus.Open);
this.shortcutsService.shortcutsChanged$.subscribe(shortcuts => this.addShortcuts(shortcuts));

View File

@ -1,14 +1,16 @@
<h3>{{ 'SEND_AN_ALERT' | translate }}</h3>
<form #alertForm="ngForm">
<mat-form-field>
<input matInput
<input
matInput
[(ngModel)]="alert"
type="text"
name="alert"
placeholder="{{ 'ALERT' | translate }}"
required>
</mat-form-field>
<button mat-raised-button color="primary"
<button
mat-raised-button color="primary"
id="sendButton"
[disabled]="!alertForm.form.valid"
(click)="onSubmit(); alertForm.reset()">

View File

@ -1,5 +1,6 @@
import { Component } from '@angular/core';
import { MatSnackBar } from '@angular/material/snack-bar';
import { TranslateService } from '@ngx-translate/core';
import { PageTitleService } from '../../page-title.service';
import { OpenLPService } from '../../openlp.service';
@ -7,20 +8,31 @@ import { OpenLPService } from '../../openlp.service';
@Component({
selector: 'openlp-alert',
templateUrl: './alert.component.html',
styleUrls: ['./alert.component.scss'],
styleUrl: './alert.component.scss',
providers: [OpenLPService]
})
export class AlertComponent {
public alert: string;
public alertMessage: string;
constructor(private pageTitleService: PageTitleService, private openlpService: OpenLPService,
private snackBar: MatSnackBar) {
pageTitleService.changePageTitle('Alerts');
constructor(
private pageTitleService: PageTitleService,
private openlpService: OpenLPService,
private snackBar: MatSnackBar,
private translateService: TranslateService) {
this.translateService.get('ALERTS').subscribe(res => {
this.pageTitleService.changePageTitle(res);
});
this.translateService.get('ALERT_SUBMITTED').subscribe(res => {
this.alertMessage = res;
});
}
onSubmit() {
this.openlpService.showAlert(this.alert).subscribe(() => this.snackBar.open('Alert submitted', '', {duration: 2000}));
this.openlpService.showAlert(this.alert).subscribe(
() => this.snackBar.open(this.alertMessage, '', { duration: 2000 })
);
}
}

View File

@ -1,7 +1,7 @@
<div
class="slide song"
[class.currentSlide]="active"
[class.mat-headline-2]="active"
[class.first]="!active && slide.first_slide_of_tag"
[innerHTML]="chordproFormatted(slide)|chordpro">
</div>
class="slide song"
[class.currentSlide]="active"
[class.mat-headline-2]="active"
[class.first]="!active && slide.first_slide_of_tag"
[innerHTML]="chordproFormatted(slide)|chordpro">
</div>

View File

@ -1,53 +1,74 @@
<div
class="overlay"
[class.embedded]="embedded"
[style.--openlp-stage-font-scale]="fontScale"
>
[style.--openlp-stage-font-scale]="fontScale">
<div class="overlay-content">
<div class="tags">
<span *ngFor="let tag of tags" [class.active]="tag.active">{{ tag.text }}</span>
@for (tag of tags; track tag) {
<span [class.active]="tag.active">{{ tag.text }}</span>
}
</div>
<div class="container">
<app-chord-view-item
[slide]="currentSlides[activeSlide]"
[active]="true"
*ngIf="currentSlides[activeSlide]?.chords; else elseSlideNoChords"
></app-chord-view-item>
<ng-template #elseSlideNoChords>
<app-stage-view-item [slide]="currentSlides[activeSlide]" [active]="true"></app-stage-view-item>
</ng-template>
@if (currentSlides[activeSlide]?.chords) {
<app-chord-view-item
[slide]="currentSlides[activeSlide]"
[active]="true">
</app-chord-view-item>
}
@else {
<app-stage-view-item
[slide]="currentSlides[activeSlide]"
[active]="true">
</app-stage-view-item>
}
<div class="nextSlides">
<ng-container *ngFor="let slide of nextSlides; trackBy: trackByIndex">
<app-chord-view-item [slide]="slide" *ngIf="slide?.chords; else elseNextSlideNoChords"></app-chord-view-item>
<ng-template #elseNextSlideNoChords>
<app-stage-view-item [slide]="slide"></app-stage-view-item>
</ng-template>
</ng-container>
@for (slide of nextSlides; track trackByIndex) {
<ng-container>
@if (slide?.chords) {
<app-chord-view-item
[slide]="slide">
</app-chord-view-item>
}
@else {
<app-stage-view-item
[slide]="slide">
</app-stage-view-item>
}
</ng-container>
}
</div>
</div>
</div>
<div class="toolbar">
<a *ngIf="!embedded"
mat-mini-fab color=""
class="back-button"
routerLink="/"
matTooltip="{{ 'GO_BACK_TO_CONTROLLER' | translate }}">
<mat-icon>arrow_back</mat-icon>
</a>
@if (!embedded) {
<a
mat-mini-fab color=""
class="back-button"
routerLink="/"
matTooltip="{{ 'GO_BACK_TO_CONTROLLER' | translate }}">
<mat-icon>arrow_back</mat-icon>
</a>
}
<div class="transpose">
<button mat-icon-button (click)="transposeDown()">
<button
mat-icon-button
(click)="transposeDown()">
<mat-icon>keyboard_arrow_down</mat-icon>
</button>
<span>{{ transposeLevel }}</span>
<button mat-icon-button (click)="transposeUp()">
<button
mat-icon-button
(click)="transposeUp()">
<mat-icon>keyboard_arrow_up</mat-icon>
</button>
</div>
<div *ngIf="!embedded && activeSlide+1 === currentSlides.length"
class="next-service-item"
matTooltip="{{ 'NEXT_ITEM' | translate }}">
{{ nextServiceItemTitle }}
</div>
@if (!embedded && activeSlide+1 === currentSlides.length) {
<div
class="next-service-item"
matTooltip="{{ 'NEXT_ITEM' | translate }}">
{{ nextServiceItemTitle }}
</div>
}
<div class="time">{{ (openlpService.getIsTwelveHourTime()) ? (time|date:'h:mm a') : (time|date:'HH:mm') }}</div>
</div>
</div>

View File

@ -1,84 +1,98 @@
<mat-action-list *ngIf="!display.bigDisplayButtons">
<button mat-list-item
aria-labelledby="caption-blank"
class="display-button"
(click)="setMode(DisplayMode.Blank)"
[disabled]="displayMode === DisplayMode.Blank">
<mat-icon class="small-icon">videocam_off</mat-icon>
<span id="caption-blank" class="caption">{{ 'SHOW_BLACK' | translate }}</span>
</button>
<button mat-list-item
aria-labelledby="caption-theme"
class="display-button"
(click)="setMode(DisplayMode.Theme)"
[disabled]="displayMode === DisplayMode.Theme">
<mat-icon class="small-icon">wallpaper</mat-icon>
<span id="caption-theme" class="caption">{{ 'SHOW_BACKGROUND' | translate }}</span>
</button>
<button mat-list-item
aria-labelledby="caption-desktop"
class="display-button"
(click)="setMode(DisplayMode.Desktop)"
[disabled]="displayMode === DisplayMode.Desktop">
<mat-icon class="small-icon">desktop_windows</mat-icon>
<span id="caption-desktop" class="caption">{{ 'SHOW_DESKTOP' | translate }}</span>
</button>
<button mat-list-item
aria-labelledby="caption-presentation"
class="display-button"
(click)="setMode(DisplayMode.Presentation)"
[disabled]="displayMode === DisplayMode.Presentation">
<mat-icon class="small-icon">videocam</mat-icon>
<span id="caption-presentation" class="caption">{{ 'SHOW_PRESENTATION' | translate }}</span>
</button>
</mat-action-list>
<mat-grid-list *ngIf="display.bigDisplayButtons" cols="2" rowHeight="2:1">
<mat-grid-tile>
<button mat-fab color="primary"
@if (display.bigDisplayButtons) {
<mat-grid-list
cols="2"
rowHeight="2:1">
<mat-grid-tile>
<button
mat-fab color="primary"
aria-labelledby="caption-blank"
class="display-button"
(click)="setMode(displayMode.Blank)"
[disabled]="display.displayMode === displayMode.Blank">
<mat-icon class="big-icon">videocam_off</mat-icon>
</button>
</mat-grid-tile>
<mat-grid-tile>
<div id="caption-blank" class="caption">{{ 'SHOW_BLACK' | translate }}</div>
</mat-grid-tile>
<mat-grid-tile>
<button
mat-fab color="primary"
aria-labelledby="caption-theme"
class="display-button"
(click)="setMode(displayMode.Theme)"
[disabled]="display.displayMode === displayMode.Theme">
<mat-icon class="big-icon">wallpaper</mat-icon>
</button>
</mat-grid-tile>
<mat-grid-tile>
<div id="caption-theme" class="caption">{{ 'SHOW_BACKGROUND' | translate }}</div>
</mat-grid-tile>
<mat-grid-tile>
<button
mat-fab color="primary"
aria-labelledby="caption-desktop"
class="display-button"
(click)="setMode(displayMode.Desktop)"
[disabled]="display.displayMode === displayMode.Desktop">
<mat-icon class="big-icon">desktop_windows</mat-icon>
</button>
</mat-grid-tile>
<mat-grid-tile>
<div id="caption-desktop" class="caption">{{ 'SHOW_DESKTOP' | translate }}</div>
</mat-grid-tile>
<mat-grid-tile>
<button
mat-fab color="primary"
aria-labelledby="caption-presentation"
class="display-button"
(click)="setMode(displayMode.Presentation)"
[disabled]="display.displayMode === displayMode.Presentation">
<mat-icon class="big-icon">videocam</mat-icon>
</button>
</mat-grid-tile>
<mat-grid-tile>
<div id="caption-presentation" class="caption">{{ 'SHOW_PRESENTATION' | translate }}</div>
</mat-grid-tile>
</mat-grid-list>
}
@else {
<mat-action-list>
<button
mat-list-item
aria-labelledby="caption-blank"
class="display-button"
(click)="setMode(DisplayMode.Blank)"
[disabled]="displayMode === DisplayMode.Blank">
<mat-icon class="big-icon">videocam_off</mat-icon>
(click)="setMode(displayMode.Blank)"
[disabled]="display.displayMode === displayMode.Blank">
<mat-icon class="small-icon">videocam_off</mat-icon>
<span id="caption-blank" class="caption">{{ 'SHOW_BLACK' | translate }}</span>
</button>
</mat-grid-tile>
<mat-grid-tile>
<div id="caption-blank" class="caption">{{ 'SHOW_BLACK' | translate }}</div>
</mat-grid-tile>
<mat-grid-tile>
<button mat-fab color="primary"
<button
mat-list-item
aria-labelledby="caption-theme"
class="display-button"
(click)="setMode(DisplayMode.Theme)"
[disabled]="displayMode === DisplayMode.Theme">
<mat-icon class="big-icon">wallpaper</mat-icon>
(click)="setMode(displayMode.Theme)"
[disabled]="display.displayMode === displayMode.Theme">
<mat-icon class="small-icon">wallpaper</mat-icon>
<span id="caption-theme" class="caption">{{ 'SHOW_BACKGROUND' | translate }}</span>
</button>
</mat-grid-tile>
<mat-grid-tile>
<div id="caption-theme" class="caption">{{ 'SHOW_BACKGROUND' | translate }}</div>
</mat-grid-tile>
<mat-grid-tile>
<button mat-fab color="primary"
<button
mat-list-item
aria-labelledby="caption-desktop"
class="display-button"
(click)="setMode(DisplayMode.Desktop)"
[disabled]="displayMode === DisplayMode.Desktop">
<mat-icon class="big-icon">desktop_windows</mat-icon>
(click)="setMode(displayMode.Desktop)"
[disabled]="display.displayMode === displayMode.Desktop">
<mat-icon class="small-icon">desktop_windows</mat-icon>
<span id="caption-desktop" class="caption">{{ 'SHOW_DESKTOP' | translate }}</span>
</button>
</mat-grid-tile>
<mat-grid-tile>
<div id="caption-desktop" class="caption">{{ 'SHOW_DESKTOP' | translate }}</div>
</mat-grid-tile>
<mat-grid-tile>
<button mat-fab color="primary"
<button
mat-list-item
aria-labelledby="caption-presentation"
class="display-button"
(click)="setMode(DisplayMode.Presentation)"
[disabled]="displayMode === DisplayMode.Presentation">
<mat-icon class="big-icon">videocam</mat-icon>
(click)="setMode(displayMode.Presentation)"
[disabled]="display.displayMode === displayMode.Presentation">
<mat-icon class="small-icon">videocam</mat-icon>
<span id="caption-presentation" class="caption">{{ 'SHOW_PRESENTATION' | translate }}</span>
</button>
</mat-grid-tile>
<mat-grid-tile>
<div id="caption-presentation" class="caption">{{ 'SHOW_PRESENTATION' | translate }}</div>
</mat-grid-tile>
</mat-grid-list>
</mat-action-list>
}

View File

@ -5,11 +5,11 @@ import { Display, DisplayMode } from 'src/app/responses';
@Component({
selector: 'openlp-display-mode-sheet',
templateUrl: 'display-mode-selector.component.html',
styleUrls: ['./display-mode-selector.component.scss']
styleUrl: './display-mode-selector.component.scss'
})
export class DisplayModeSelectorComponent {
// Make DisplayMode enum visible in HTML template.
DisplayMode = DisplayMode;
displayMode = DisplayMode;
constructor(
private bottomSheetRef: MatBottomSheetRef<DisplayModeSelectorComponent>,

View File

@ -3,14 +3,16 @@
<form #loginForm="ngForm">
<div mat-dialog-content>
<mat-form-field>
<input matInput
<input
matInput
placeholder="{{ 'USER_NAME' | translate }}"
[(ngModel)]="username"
name="username"
required>
</mat-form-field>
<mat-form-field>
<input matInput
<input
matInput
placeholder="{{ 'PASSWORD' | translate }}"
type="password"
[(ngModel)]="password"

View File

@ -6,7 +6,7 @@ import { OpenLPService } from '../../openlp.service';
@Component({
selector: 'app-login',
templateUrl: './login.component.html',
styleUrls: ['./login.component.scss']
styleUrl: './login.component.scss'
})
export class LoginComponent implements OnInit {
username: string;

View File

@ -1,6 +1,9 @@
<div class="lower-third">
<div class="slide">
<div class="slide-item" [style.font-size]="fontSize" [style.font-family]="fontFamily">
<div
class="slide-item"
[style.font-size]="fontSize"
[style.font-family]="fontFamily">
{{currentSlides[activeSlide]?.text}}
</div>
</div>

View File

@ -8,7 +8,7 @@ import { ServiceItem, Slide } from '../../responses';
@Component({
selector: 'app-lower-third',
templateUrl: './lower-third.component.html',
styleUrls: ['./lower-third.component.scss'],
styleUrl: './lower-third.component.scss',
encapsulation: ViewEncapsulation.None
})
export class LowerThirdComponent implements OnInit, OnDestroy {

View File

@ -1,8 +1,16 @@
<mat-form-field >
<mat-select [(ngModel)]="selectedSearchOption" (selectionChange)="setSearchOption($event)" name="selectedSearchOption" [placeholder]="searchOptionsTitle">
<mat-option *ngFor="let option of searchOptions" name="searchOptions" [value]="option">
{{option}}
</mat-option>
<mat-select
[(ngModel)]="selectedSearchOption"
(selectionChange)="setSearchOption($event)"
name="selectedSearchOption"
[placeholder]="searchOptionsTitle">
@for (option of searchOptions; track option) {
<mat-option
name="searchOptions"
[value]="option">
{{ option }}
</mat-option>
}
</mat-select>
</mat-form-field>
<br>

View File

@ -5,7 +5,7 @@ import { OpenLPService } from '../../../openlp.service';
@Component({
selector: 'openlp-search-options',
templateUrl: './search-options.component.html',
styleUrls: ['./search-options.component.scss'],
styleUrl: './search-options.component.scss',
providers: [OpenLPService]
})
export class SearchOptionsComponent {

View File

@ -1,10 +1,18 @@
<h3>Search</h3>
<form #searchForm="ngForm">
<mat-form-field>
<mat-select [(ngModel)]="selectedPlugin" (selectionChange)="onPluginChange()" name="selectedPlugin" placeholder="Search for:">
<mat-option *ngFor="let plugin of searchPlugins" name="searchPlugins" [value]="plugin.key">
{{plugin.name}}
</mat-option>
<mat-select
[(ngModel)]="selectedPlugin"
(selectionChange)="onPluginChange()"
name="selectedPlugin"
placeholder="Search for:">
@for (plugin of searchPlugins; track plugin.name) {
<mat-option
name="searchPlugins"
[value]="plugin.key">
{{ plugin.name }}
</mat-option>
}
</mat-select>
</mat-form-field>
<br>
@ -12,36 +20,53 @@
<openlp-search-options></openlp-search-options>
</div>
<mat-form-field>
<input matInput [(ngModel)]="searchText" name="searchText" placeholder="{{ 'SEARCH_TEXT' | translate }}" required>
<input
matInput
[(ngModel)]="searchText"
name="searchText"
placeholder="{{ 'SEARCH_TEXT' | translate }}"
required>
</mat-form-field>
<br>
<button mat-raised-button id="searchButton"
<button
mat-raised-button
id="searchButton"
color="primary"
[disabled]="!searchForm.form.valid"
(click)="onSubmit()">
{{ 'SEARCH' | translate }}
</button>
</form>
<div *ngIf="searchResults">
<h3>{{ 'SEARCH_RESULTS' | translate }}:</h3>
<div *ngIf="!searchResults.length">
{{ 'NO_SEARCH_RESULTS' | translate }}...
@if (searchResults) {
<div>
<h3>{{ 'SEARCH_RESULTS' | translate }}:</h3>
@if (searchResults.length) {
<table>
@for (item of searchResults; track item) {
<tr>
<td>{{ item[1] }}</td>
<td>
<button
mat-button color="primary"
(click)="addToService(item[0])">
{{ 'ADD_TO_SERVICE' | translate }}
</button>
</td>
<td>
<button
mat-button color="accent"
(click)="sendLive(item[0])">
{{ 'SEND_LIVE' | translate }}
</button>
</td>
</tr>
}
</table>
}
@else {
<div>
{{ 'NO_SEARCH_RESULTS' | translate }}...
</div>
}
</div>
<table *ngIf="searchResults.length">
<tr *ngFor="let item of searchResults">
<td>{{item[1]}}</td>
<td>
<button mat-button color="primary"
(click)="addToService(item[0])">
{{ 'ADD_TO_SERVICE' | translate }}
</button>
</td>
<td>
<button mat-button color="accent"
(click)="sendLive(item[0])">
{{ 'SEND_LIVE' | translate }}
</button>
</td>
</tr>
</table>
</div>
}

View File

@ -1,4 +1,5 @@
import { AfterViewInit, ChangeDetectorRef, Component, OnInit, ViewChild } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';
import { OpenLPService } from '../../openlp.service';
import { PageTitleService } from '../../page-title.service';
@ -8,7 +9,7 @@ import { SearchOptionsComponent } from './search-options/search-options.componen
@Component({
selector: 'openlp-search',
templateUrl: './search.component.html',
styleUrls: ['./search.component.scss'],
styleUrl: './search.component.scss',
providers: [OpenLPService]
})
export class SearchComponent implements OnInit, AfterViewInit {
@ -20,9 +21,14 @@ export class SearchComponent implements OnInit, AfterViewInit {
public displaySearchOptions = false;
@ViewChild(SearchOptionsComponent, {static: false}) searchOptions: SearchOptionsComponent;
constructor(private pageTitleService: PageTitleService, private openlpService: OpenLPService,
private cdr: ChangeDetectorRef) {
pageTitleService.changePageTitle('Search');
constructor(
private pageTitleService: PageTitleService,
private openlpService: OpenLPService,
private cdr: ChangeDetectorRef,
private translateService: TranslateService) {
this.translateService.get('SEARCH').subscribe(res => {
this.pageTitleService.changePageTitle(res);
});
}
onSubmit() {

View File

@ -1,4 +1,7 @@
<mat-card (click)="onItemSelected(item)" class="service-item no-select" [class.selected]="selected">
<mat-card
(click)="onItemSelected(item)"
class="service-item no-select"
[class.selected]="selected">
<mat-card-content>
<mat-icon>{{ getIcon(item) }}</mat-icon> {{ item.title }}
</mat-card-content>

View File

@ -5,7 +5,7 @@ import { ServiceItem } from '../../../responses';
@Component({
selector: 'openlp-service-item',
templateUrl: './service-item.component.html',
styleUrls: ['./service-item.component.scss'],
styleUrl: './service-item.component.scss',
changeDetection: ChangeDetectionStrategy.OnPush
})

View File

@ -1,22 +1,29 @@
<ng-container *ngIf="items?.length; else noServiceItems">
<openlp-service-item
*ngFor="let item of items"
[item]="item"
[selected]="item.selected"
(selectItem)="onItemSelected($event)"
[tabindex]="item.id"></openlp-service-item>
</ng-container>
<ng-template #noServiceItems>
<div class="no-items" *ngIf="!loading">
@if (items?.length) {
<ng-container>
@for (item of items; track item) {
<openlp-service-item
[item]="item"
[selected]="item.selected"
(selectItem)="onItemSelected($event)"
[tabindex]="item.id">
</openlp-service-item>
}
</ng-container>
}
@else if (!loading) {
<div class="no-items">
<div class="no-items-title">
<span class="material-icons icon">info</span>
{{ 'NO_SERVICE_ITEMS' | translate }}.
</div>
<div class="no-items-actions">
<a routerLink="/search" mat-stroked-button color="primary" size="small">
<a
routerLink="/search"
mat-stroked-button color="primary"
size="small">
<span class="material-icons">add</span>
{{ 'ADD_ITEM' | translate }}
</a>
</div>
</div>
</ng-template>
}

View File

@ -1 +1,3 @@
<openlp-service-list (itemSelected)="this.onItemSelected($event)"></openlp-service-list>
<openlp-service-list
(itemSelected)="this.onItemSelected($event)">
</openlp-service-list>

View File

@ -1,5 +1,6 @@
import { Component } from '@angular/core';
import { Router } from '@angular/router';
import { TranslateService } from '@ngx-translate/core';
import { OpenLPService } from '../../openlp.service';
import { PageTitleService } from '../../page-title.service';
@ -8,7 +9,7 @@ import { ServiceItem } from '../../responses';
@Component({
selector: 'openlp-service',
templateUrl: './service.component.html',
styleUrls: ['./service.component.scss'],
styleUrl: './service.component.scss',
})
export class ServiceComponent {
@ -19,8 +20,13 @@ export class ServiceComponent {
}
}
constructor(protected pageTitleService: PageTitleService, protected openlpService: OpenLPService,
protected router: Router) {
pageTitleService.changePageTitle('Service');
constructor(
protected pageTitleService: PageTitleService,
protected openlpService: OpenLPService,
protected router: Router,
private translateService: TranslateService) {
this.translateService.get('SERVICE').subscribe(res => {
this.pageTitleService.changePageTitle(res);
});
}
}

View File

@ -1,64 +1,70 @@
<div class="settings-panel">
<mat-card>
<mat-card-header>
{{ 'USER_INTERFACE' | translate }}
</mat-card-header>
<mat-card-content>
<div class="settings-item">
<mat-slide-toggle
color="primary"
[checked]="settings.fastSwitching"
(change)="setSetting('fastSwitching', $event.checked)">
{{ 'ENABLE_FAST_SWITCHING_PANEL' | translate }}
</mat-slide-toggle>
</div>
<div class="settings-item">
<mat-slide-toggle
color="primary"
[checked]="settings.bigDisplayButtons"
(change)="setSetting('bigDisplayButtons', $event.checked)">
{{ 'ENABLE_BIG_DISPLAY_BUTTONS' | translate }}
</mat-slide-toggle>
</div>
</mat-card-content>
<mat-card>
<mat-card-header>
{{ 'USER_INTERFACE' | translate }}
</mat-card-header>
<mat-card-content>
<div class="settings-item">
<mat-slide-toggle
color="primary"
[checked]="settings.fastSwitching"
(change)="setSetting('fastSwitching', $event.checked)">
{{ 'ENABLE_FAST_SWITCHING_PANEL' | translate }}
</mat-slide-toggle>
</div>
<div class="settings-item">
<mat-slide-toggle
color="primary"
[checked]="settings.bigDisplayButtons"
(change)="setSetting('bigDisplayButtons', $event.checked)">
{{ 'ENABLE_BIG_DISPLAY_BUTTONS' | translate }}
</mat-slide-toggle>
</div>
</mat-card-content>
</mat-card>
<mat-card>
<mat-card-header>
{{ 'STAGE_AND_CHORDS_APPEARANCE' | translate }}
</mat-card-header>
<mat-card-content>
<mat-tab-group>
<mat-tab label="{{ 'STAGE' | translate }}">
<ng-template matTabContent>
<ng-container>
<openlp-stage-chord-preview stageType="stage"></openlp-stage-chord-preview>
<ng-container *ngTemplateOutlet="stageSettings; context: {prefix: 'stage'}"></ng-container>
</ng-container>
</ng-template>
</mat-tab>
<mat-tab label="{{ 'CHORDS' | translate }}">
<ng-template matTabContent>
<openlp-stage-chord-preview stageType="chords"></openlp-stage-chord-preview>
<ng-container *ngTemplateOutlet="stageSettings; context: {prefix: 'chords'}"></ng-container>
</ng-template>
</mat-tab>
</mat-tab-group>
</mat-card-content>
<mat-card-header>
{{ 'STAGE_AND_CHORDS_APPEARANCE' | translate }}
</mat-card-header>
<mat-card-content>
<mat-tab-group>
<mat-tab label="{{ 'STAGE' | translate }}">
<ng-template matTabContent>
<ng-container>
<openlp-stage-chord-preview stageType="stage">
</openlp-stage-chord-preview>
<ng-container *ngTemplateOutlet="stageSettings; context: {prefix: 'stage'}">
</ng-container>
</ng-container>
</ng-template>
</mat-tab>
<mat-tab label="{{ 'CHORDS' | translate }}">
<ng-template matTabContent>
<openlp-stage-chord-preview stageType="chords">
</openlp-stage-chord-preview>
<ng-container *ngTemplateOutlet="stageSettings; context: {prefix: 'chords'}">
</ng-container>
</ng-template>
</mat-tab>
</mat-tab-group>
</mat-card-content>
</mat-card>
</div>
<ng-template #stageSettings let-prefix="prefix">
<div class="stage-settings">
<div class="settings-item">
<label>{{ 'FONT_SCALE' | translate }}: {{settings[prefix + 'FontScale'] ?? 100}}%</label>
<mat-slider
min="25"
max="200"
step="6.25">
<input
matSliderThumb
[value]="settings[prefix + 'FontScale']"
(valueChange)="setSetting(prefix + 'FontScale', $event)">
</mat-slider>
</div>
<ng-template
#stageSettings
let-prefix="prefix">
<div class="stage-settings">
<div class="settings-item">
<label>{{ 'FONT_SCALE' | translate }}: {{settings[prefix + 'FontScale'] ?? 100}}%</label>
<mat-slider
min="25"
max="200"
step="6.25">
<input
matSliderThumb
[value]="settings[prefix + 'FontScale']"
(valueChange)="setSetting(prefix + 'FontScale', $event)">
</mat-slider>
</div>
</div>
</ng-template>

View File

@ -1,4 +1,5 @@
import { Component, OnDestroy } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';
import { Subscription } from 'rxjs';
import { OpenLPService } from '../../openlp.service';
import { PageTitleService } from '../../page-title.service';
@ -6,17 +7,19 @@ import { SettingsProperties, SettingsPropertiesItem, SettingsService } from '../
@Component({
selector: 'openlp-settings',
templateUrl: `./settings.component.html`,
styleUrls: [`./settings.component.scss`]
templateUrl: './settings.component.html',
styleUrl: './settings.component.scss'
})
export class SettingsComponent implements OnDestroy {
constructor(
protected pageTitleService: PageTitleService,
protected openlpService: OpenLPService,
protected settingsService: SettingsService,
) {
private translateService: TranslateService) {
this.settingsSubscription$ = settingsService.settingChanged$.subscribe(this._settingChanged);
pageTitleService.changePageTitle('Settings');
this.translateService.get('SETTINGS').subscribe(res => {
this.pageTitleService.changePageTitle(res);
});
}
protected settingsSubscription$: Subscription;
@ -36,5 +39,4 @@ export class SettingsComponent implements OnDestroy {
ngOnDestroy(): void {
this.settingsSubscription$.unsubscribe();
}
}

View File

@ -1,14 +1,18 @@
<div class="stage-preview-container" #stageViewContainer>
<div
class="stage-preview-container"
#stageViewContainer>
@if (stageType === 'stage') {
<app-stage-view
#stageView
*ngIf="stageType === 'stage'"
[embedded]="true"
[style.--openlp-stage-font-scale]="fontScale"
></app-stage-view>
#stageView
[embedded]="true"
[style.--openlp-stage-font-scale]="fontScale">
</app-stage-view>
}
@else if (stageType === 'chords') {
<app-chord-view
#chordsView
*ngIf="stageType === 'chords'"
[embedded]="true"
[style.--openlp-stage-font-scale]="fontScale"
></app-chord-view>
#chordsView
[embedded]="true"
[style.--openlp-stage-font-scale]="fontScale">
</app-chord-view>
}
</div>

View File

@ -17,7 +17,7 @@ import { SettingsProperties, SettingsService } from 'src/app/settings.service';
@Component({
selector: 'openlp-stage-chord-preview',
templateUrl: './stage-chord-preview.component.html',
styleUrls: ['./stage-chord-preview.component.scss'],
styleUrl: './stage-chord-preview.component.scss',
})
export class StageChordPreviewComponent implements OnInit, AfterViewInit, OnDestroy, OnChanges {
constructor(

View File

@ -1,14 +1,20 @@
<mat-card class="slide no-select" mat-list-item (click)="onSlideSelected(slide)" [class.selected]="selected">
<mat-card
class="slide no-select"
mat-list-item
(click)="onSlideSelected(slide)"
[class.selected]="selected">
<mat-card-content>
<div class="verse-tag">{{ slide?.tag }}</div>
<div *ngIf="slide?.img; else onlySlideText" class="verse-img-container">
<img src="{{ slide?.img }}" />
<div class="img-verse-text">
{{ slide?.text }}
@if (slide?.img) {
<div class="verse-img-container">
<img src="{{ slide?.img }}" />
<div class="img-verse-text">
{{ slide?.text }}
</div>
</div>
</div>
<ng-template #onlySlideText>
}
@else {
<div class="verse-text">{{ slide?.text }}</div>
</ng-template>
}
</mat-card-content>
</mat-card>

View File

@ -4,7 +4,7 @@ import { Slide } from '../../../responses';
@Component({
selector: 'openlp-slide-item',
templateUrl: './slide-item.component.html',
styleUrls: ['./slide-item.component.scss'],
styleUrl: './slide-item.component.scss',
changeDetection: ChangeDetectionStrategy.OnPush
})

View File

@ -1,23 +1,32 @@
<ng-container *ngIf="slides?.length; else noSlideItems">
<openlp-slide-item
*ngFor="let slide of slides; let index = index"
[slide]="slide"
[tabindex]="counter"
[selected]="slide.selected"
(selectSlide)="onSlideSelected($event, index)"
></openlp-slide-item>
</ng-container>
<ng-template #noSlideItems>
<div class="no-items" *ngIf="!loading">
<div class="no-items-title">
<span class="material-icons icon">info</span>
{{ 'NO_SLIDE_ITEMS' | translate }}.
@if (slides?.length) {
<ng-container>
@for (slide of slides; track slide; let index = $index) {
<openlp-slide-item
[slide]="slide"
[tabindex]="index"
[selected]="slide.selected"
(selectSlide)="onSlideSelected($event, index)">
</openlp-slide-item>
}
</ng-container>
}
@else {
@if (!loading) {
<div class="no-items">
<div class="no-items-title">
<span class="material-icons icon">info</span>
{{ 'NO_SLIDE_ITEMS' | translate }}.
</div>
<div class="no-items-actions">
<a
routerLink="/search"
mat-stroked-button
color="primary"
size="small">
<span class="material-icons">add</span>
{{ 'ADD_ITEM_TO_SERVICE' | translate }}
</a>
</div>
</div>
<div class="no-items-actions">
<a routerLink="/search" mat-stroked-button color="primary" size="small">
<span class="material-icons">add</span>
{{ 'ADD_ITEM_TO_SERVICE' | translate }}
</a>
</div>
</div>
</ng-template>
}
}

View File

@ -1 +1,2 @@
<openlp-slide-list (slideSelected)="onSlideSelected($event)"></openlp-slide-list>
<openlp-slide-list (slideSelected)="onSlideSelected($event)">
</openlp-slide-list>

View File

@ -1,4 +1,5 @@
import { Component } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';
import { OpenLPService } from '../../openlp.service';
import { PageTitleService } from '../../page-title.service';
@ -7,12 +8,17 @@ import { SlideListItem } from './slide-list/slide-list.component';
@Component({
selector: 'openlp-slides',
templateUrl: './slides.component.html',
styleUrls: ['./slides.component.scss'],
styleUrl: './slides.component.scss',
})
export class SlidesComponent {
constructor(protected pageTitleService: PageTitleService, protected openlpService: OpenLPService) {
pageTitleService.changePageTitle('Slides');
constructor(
protected pageTitleService: PageTitleService,
protected openlpService: OpenLPService,
private translateService: TranslateService) {
this.translateService.get('SLIDES').subscribe(res => {
this.pageTitleService.changePageTitle(res);
});
}
onSlideSelected(item: SlideListItem) {

View File

@ -1,14 +1,21 @@
<div
class="slide"
[class.mat-headline-2]="active"
[class.currentSlide]="active"
[class.mat-headline-4]="!active"
[class.first]="!active && slide.first_slide_of_tag">
<ng-container *ngIf="!(slide?.img); else elseImage">
{{slide?.text}}
class="slide"
[class.mat-headline-2]="active"
[class.currentSlide]="active"
[class.mat-headline-4]="!active"
[class.first]="!active && slide.first_slide_of_tag">
@if (slide?.img) {
<img
src="{{slide?.img}}"
[class.active-slide-img]="active"
[class.next-slides-img]="!active"/>
<div
[class.active-slide-img-text]="active"
[class.next-slides-text]="!active">{{ slide?.text }}</div>
}
@else {
<ng-container>
{{ slide?.text }}
</ng-container>
<ng-template #elseImage>
<img src="{{slide?.img}}" [class.active-slide-img]="active" [class.next-slides-img]="!active"/>
<div [class.active-slide-img-text]="active" [class.next-slides-text]="!active">{{ slide?.text }}</div>
</ng-template>
}
</div>

View File

@ -4,49 +4,67 @@
[style.--openlp-stage-font-scale]="fontScale">
<div class="overlay-content">
<div class="tags">
<span *ngFor="let tag of tags" [class.active]="tag.active">{{ tag.text }}</span>
@for (tag of tags; track tag) {
<span [class.active]="tag.active">{{ tag.text }}</span>
}
</div>
<div class="container">
<app-stage-view-item [slide]="currentSlides[activeSlide]" [active]="true"></app-stage-view-item>
<app-stage-view-item
[slide]="currentSlides[activeSlide]"
[active]="true">
</app-stage-view-item>
<div class="nextSlides">
<app-stage-view-item [slide]="slide" *ngFor="let slide of nextSlides; trackBy: trackByIndex"></app-stage-view-item>
@for (slide of nextSlides; track trackByIndex) {
<app-stage-view-item [slide]="slide">
</app-stage-view-item>
}
</div>
</div>
</div>
<div class="toolbar">
<a *ngIf="!embedded"
class="back-button"
mat-mini-fab color=""
routerLink="/"
matTooltip="{{ 'GO_BACK_TO_CONTROLLER' | translate }}">
<mat-icon>arrow_back</mat-icon>
</a>
<button *ngIf="showNotes"
mat-mini-fab
class="show-notes"
matTooltip="{{ 'HIDE_NOTES' | translate }}"
[color]="primary"
[class.show-notes-disabled]="false"
(click)="showNotes = false">
<mat-icon>sticky_note_2</mat-icon>
</button>
<button *ngIf="!showNotes"
mat-mini-fab
class="show-notes"
matTooltip="{{ 'SHOW_NOTES' | translate }}"
[color]=""
[class.show-notes-disabled]="true"
(click)="showNotes = true">
<mat-icon>sticky_note_2</mat-icon>
</button>
<div *ngIf="!embedded && activeSlide+1 === currentSlides.length"
class="next-service-item"
matTooltip="{{ 'NEXT_ITEM' | translate }}">
{{ nextServiceItemTitle }}
</div>
@if (!embedded) {
<a
class="back-button"
mat-mini-fab color=""
routerLink="/"
matTooltip="{{ 'GO_BACK_TO_CONTROLLER' | translate }}">
<mat-icon>arrow_back</mat-icon>
</a>
}
@if (showNotes) {
<button
mat-mini-fab
class="show-notes"
matTooltip="{{ 'HIDE_NOTES' | translate }}"
color="primary"
[class.show-notes-disabled]="false"
(click)="showNotes = false">
<mat-icon>sticky_note_2</mat-icon>
</button>
}
@else {
<button
mat-mini-fab
class="show-notes"
matTooltip="{{ 'SHOW_NOTES' | translate }}"
color=""
[class.show-notes-disabled]="true"
(click)="showNotes = true">
<mat-icon>sticky_note_2</mat-icon>
</button>
}
@if (!embedded && activeSlide+1 === currentSlides.length) {
<div
class="next-service-item"
matTooltip="{{ 'NEXT_ITEM' | translate }}">
{{ nextServiceItemTitle }}
</div>
}
<div class="time">{{ (openlpService.getIsTwelveHourTime()) ? (time|date:'h:mm a') : (time|date:'HH:mm') }}</div>
</div>
<div class="sidebar" *ngIf="(showNotes || embedded) && notes">
<div class="notes" [innerHTML]="notes|nl2br"></div>
</div>
@if ((showNotes || embedded) && notes) {
<div class="sidebar">
<div class="notes" [innerHTML]="notes|nl2br"></div>
</div>
}
</div>

View File

@ -97,7 +97,7 @@ export class StageViewComponent implements OnInit, OnDestroy {
}
setNewSlides(slides: Slide[], _currentSlide: number): void { /* eslint-disable-line @typescript-eslint/no-unused-vars */
if (slides.length === 0) {
if ((slides?.length ?? 0) === 0) {
return;
}
this.currentSlides = slides;

View File

@ -10,17 +10,26 @@
</mat-select>
</mat-form-field>
</div>
<div class="theme-container content" *ngIf="isThemeLevelSupported()">
<div *ngFor="let theme of themeList;">
<mat-card class="theme-card" (click)='setTheme(theme.name)' [class.selected]="theme.selected">
<mat-card-content>
<img [src]="theme.thumbnail"/>
<div class="theme-title">{{ theme.name }}</div>
</mat-card-content>
</mat-card>
@if (isThemeLevelSupported()) {
<div class="theme-container content">
@for (theme of themeList; track theme) {
<div>
<mat-card
class="theme-card"
(click)='setTheme(theme.name)'
[class.selected]="theme.selected">
<mat-card-content>
<img [src]="theme.thumbnail"/>
<div class="theme-title">{{ theme.name }}</div>
</mat-card-content>
</mat-card>
</div>
}
</div>
</div>
<mat-error *ngIf="!isThemeLevelSupported()">
{{ 'SONG_LEVEL_THEME_CHANGING_NOT_SUPPORTED' | translate }}
</mat-error>
}
@else {
<mat-error>
{{ 'SONG_LEVEL_THEME_CHANGING_NOT_SUPPORTED' | translate }}
</mat-error>
}
</form>

View File

@ -1,11 +1,14 @@
import { Component, OnInit } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';
import { OpenLPService } from '../../openlp.service';
import { PageTitleService } from '../../page-title.service';
import { Theme } from '../../responses';
@Component({
selector: 'openlp-themes',
templateUrl: './themes.component.html',
styleUrls: ['./themes.component.scss'],
styleUrl: './themes.component.scss',
providers: [OpenLPService]
})
export class ThemesComponent implements OnInit {
@ -13,8 +16,13 @@ export class ThemesComponent implements OnInit {
private _themeList = [];
private _themeLevel = null;
constructor(private pageTitleService: PageTitleService, private openlpService: OpenLPService) {
pageTitleService.changePageTitle('Themes');
constructor(
private pageTitleService: PageTitleService,
private openlpService: OpenLPService,
private translateService: TranslateService) {
this.translateService.get('THEMES').subscribe(res => {
this.pageTitleService.changePageTitle(res);
});
}
ngOnInit() {
@ -22,7 +30,7 @@ export class ThemesComponent implements OnInit {
this.getThemes();
}
get themeList(): Array<string> {
get themeList(): Array<Theme> {
return this._themeList;
}

View File

@ -63,8 +63,9 @@ export interface ServiceItem {
}
export interface Theme {
selected: boolean;
name: string;
selected: boolean;
thumbnail: object;
}
export interface Language {

View File

@ -4,6 +4,7 @@
"ADD_ITEM_TO_SERVICE": "Add Item to Service",
"ADD_TO_SERVICE": "Add to Service",
"ALERT": "Alert",
"ALERT_SUBMITTED": "Alert Submitted",
"ALERTS": "Alerts",
"CHANGE_DISPLAY_MODE": "Change Display Mode",
"CHORD_VIEW": "Chord View",

View File

@ -3,6 +3,7 @@
"ADD_ITEM_TO_SERVICE": "Voeg Item By Diens",
"ADD_TO_SERVICE": "Voeg By Diens",
"ALERT": "Waarskuwing",
"ALERT_SUBMITTED": "Waarskuwing Ingedien",
"ALERTS": "Waarskuwings",
"CHANGE_DISPLAY_MODE": "Verander Vertoonmodus",
"CHORD_VIEW": "Akkoordaansig",

View File

@ -3,6 +3,7 @@
"ADD_ITEM_TO_SERVICE": "Добави елемент към услугата",
"ADD_TO_SERVICE": "Добави към услугата",
"ALERT": "Предупреждение",
"ALERT_SUBMITTED": "Подадено предупреждение",
"ALERTS": "Предупреждения",
"CHANGE_DISPLAY_MODE": "Промени режима на дисплея",
"CHORD_VIEW": "Преглед на акорди",

View File

@ -3,6 +3,7 @@
"ADD_ITEM_TO_SERVICE": "Přidat Položku do Služby",
"ADD_TO_SERVICE": "Přidat do Služby",
"ALERT": "Upozornění",
"ALERT_SUBMITTED": "Výstraha Odeslána",
"ALERTS": "Upozornění",
"CHANGE_DISPLAY_MODE": "Změnit Režim Zobrazení",
"CHORD_VIEW": "Zobrazení Akordů",

View File

@ -3,6 +3,7 @@
"ADD_ITEM_TO_SERVICE": "Tilføj Emne til Tjeneste",
"ADD_TO_SERVICE": "Tilføj til Tjeneste",
"ALERT": "Advarsel",
"ALERT_SUBMITTED": "Advarsel Indsendt",
"ALERTS": "Advarsler",
"CHANGE_DISPLAY_MODE": "Skift Visningstilstand",
"CHORD_VIEW": "Akkordvisning",

View File

@ -3,6 +3,7 @@
"ADD_ITEM_TO_SERVICE": "Element zum Ablauf Hinzufügen",
"ADD_TO_SERVICE": "Zum Ablauf Hinzufügen",
"ALERT": "Hinweise",
"ALERT_SUBMITTED": "Hinweise Übermittelt",
"ALERTS": "Hinweisen",
"CHANGE_DISPLAY_MODE": "Anzeigemodus Ändern",
"CHORD_VIEW": "Akkordansicht",

View File

@ -3,6 +3,7 @@
"ADD_ITEM_TO_SERVICE": "Προσθήκη στοιχείου στην υπηρεσία",
"ADD_TO_SERVICE": "Προσθήκη στην υπηρεσία",
"ALERT": "Ειδοποίηση",
"ALERT_SUBMITTED": "Η ειδοποίηση υποβλήθηκε",
"ALERTS": "Ειδοποιήσεις",
"CHANGE_DISPLAY_MODE": "Αλλαγή λειτουργίας εμφάνισης",
"CHORD_VIEW": "Προβολή συγχορδιών",

View File

@ -3,6 +3,7 @@
"ADD_ITEM_TO_SERVICE": "Add Item to Service",
"ADD_TO_SERVICE": "Add to Service",
"ALERT": "Alert",
"ALERT_SUBMITTED": "Alert Submitted",
"ALERTS": "Alerts",
"CHANGE_DISPLAY_MODE": "Change Display Mode",
"CHORD_VIEW": "Chord View",

View File

@ -3,6 +3,7 @@
"ADD_ITEM_TO_SERVICE": "Add Item to Service",
"ADD_TO_SERVICE": "Add to Service",
"ALERT": "Alert",
"ALERT_SUBMITTED": "Alert Submitted",
"ALERTS": "Alerts",
"CHANGE_DISPLAY_MODE": "Change Display Mode",
"CHORD_VIEW": "Chord View",

View File

@ -3,6 +3,7 @@
"ADD_ITEM_TO_SERVICE": "Agregar Elemento al Servicio",
"ADD_TO_SERVICE": "Agregar al Servicio",
"ALERT": "Alerta",
"ALERT_SUBMITTED": "Alerta Enviada",
"ALERTS": "Alertas",
"CHANGE_DISPLAY_MODE": "Cambiar Modo de Visualización",
"CHORD_VIEW": "Vista de Acordes",

View File

@ -3,6 +3,7 @@
"ADD_ITEM_TO_SERVICE": "Agregar Elemento al Servicio",
"ADD_TO_SERVICE": "Agregar al Servicio",
"ALERT": "Alerta",
"ALERT_SUBMITTED": "Alerta Enviada",
"ALERTS": "Alertas",
"CHANGE_DISPLAY_MODE": "Cambiar Modo de Visualización",
"CHORD_VIEW": "Vista de Acordes",

View File

@ -3,6 +3,7 @@
"ADD_ITEM_TO_SERVICE": "Üksuse Lisamine Teenusesse",
"ADD_TO_SERVICE": "Lisa Teenusesse",
"ALERT": "Teatise",
"ALERT_SUBMITTED": "Hoiatusteade on Esitatud",
"ALERTS": "Teatised",
"CHANGE_DISPLAY_MODE": "Muuda Kuvamisrežiimi",
"CHORD_VIEW": "Akordi Vaade",

View File

@ -3,6 +3,7 @@
"ADD_ITEM_TO_SERVICE": "Lisää Tuote Palveluun",
"ADD_TO_SERVICE": "Lisää Palveluun",
"ALERT": "Huomio Viesti",
"ALERT_SUBMITTED": "Ilmoitus Lähetetty",
"ALERTS": "Huomio Viestit",
"CHANGE_DISPLAY_MODE": "Vaihda Näyttötilaa",
"CHORD_VIEW": "Sointunäkymä",

View File

@ -3,6 +3,7 @@
"ADD_ITEM_TO_SERVICE": "Ajouter un Élément au Service",
"ADD_TO_SERVICE": "Ajouter au Service",
"ALERT": "Alerte",
"ALERT_SUBMITTED": "Alerte Soumise",
"ALERTS": "Alertes",
"CHANGE_DISPLAY_MODE": "Changer le Mode dAffichage",
"CHORD_VIEW": "Vue des Accords",

View File

@ -3,6 +3,7 @@
"ADD_ITEM_TO_SERVICE": "Elem Hozzáadása a Szolgáltatáshoz",
"ADD_TO_SERVICE": "Hozzáadás a Szolgáltatáshoz",
"ALERT": "Riasztási",
"ALERT_SUBMITTED": "Riasztás Elküldve",
"ALERTS": "Riasztások",
"CHANGE_DISPLAY_MODE": "Megjelenítési mód Módosítása",
"CHORD_VIEW": "Akkord Nézet",

View File

@ -3,6 +3,7 @@
"ADD_ITEM_TO_SERVICE": "Tambahkan Item ke Layanan",
"ADD_TO_SERVICE": "Tambahkan ke Layanan",
"ALERT": "Peringatan",
"ALERT_SUBMITTED": "Peringatan Dikirim",
"ALERTS": "Peringatan",
"CHANGE_DISPLAY_MODE": "Ubah Mode Tampilan",
"CHORD_VIEW": "Tampilan Kunci",

View File

@ -3,6 +3,7 @@
"ADD_ITEM_TO_SERVICE": "Aggiungi Elemento al Servizio",
"ADD_TO_SERVICE": "Aggiungi al Servizio",
"ALERT": "Allarme",
"ALERT_SUBMITTED": "Avviso Inviato",
"ALERTS": "Avvisi",
"CHANGE_DISPLAY_MODE": "Cambia Modalità di Visualizzazione",
"CHORD_VIEW": "Vista degli Accordi",

View File

@ -3,6 +3,7 @@
"ADD_ITEM_TO_SERVICE": "Aggiungi Elemento al Servizio",
"ADD_TO_SERVICE": "Aggiungi al Servizio",
"ALERT": "Allarme",
"ALERT_SUBMITTED": "Avviso Inviato",
"ALERTS": "Avvisi",
"CHANGE_DISPLAY_MODE": "Cambia Modalità di Visualizzazione",
"CHORD_VIEW": "Vista degli Accordi",

View File

@ -3,6 +3,7 @@
"ADD_ITEM_TO_SERVICE": "Aggiungi Elemento al Servizio",
"ADD_TO_SERVICE": "Aggiungi al Servizio",
"ALERT": "Allarme",
"ALERT_SUBMITTED": "Avviso Inviato",
"ALERTS": "Avvisi",
"CHANGE_DISPLAY_MODE": "Cambia Modalità di Visualizzazione",
"CHORD_VIEW": "Vista degli Accordi",

View File

@ -3,6 +3,7 @@
"ADD_ITEM_TO_SERVICE": "サービスにアイテムを追加",
"ADD_TO_SERVICE": "サービスに追加",
"ALERT": "アラート",
"ALERT_SUBMITTED": "アラート送信済み",
"ALERTS": "アラート",
"CHANGE_DISPLAY_MODE": "表示モードを変更",
"CHORD_VIEW": "コード表示",

View File

@ -3,6 +3,7 @@
"ADD_ITEM_TO_SERVICE": "서비스에 항목 추가",
"ADD_TO_SERVICE": "서비스에 추가",
"ALERT": "경고",
"ALERT_SUBMITTED": "경고가 제출됨",
"ALERTS": "경고",
"CHANGE_DISPLAY_MODE": "디스플레이 모드 변경",
"CHORD_VIEW": "코드 보기",

View File

@ -3,6 +3,7 @@
"ADD_ITEM_TO_SERVICE": "Pridėti Elementą prie Paslaugos",
"ADD_TO_SERVICE": "Pridėti prie Paslaugos",
"ALERT": "Įspėjimas",
"ALERT_SUBMITTED": "Pateiktas Įspėjimas",
"ALERTS": "Įspėjimai",
"CHANGE_DISPLAY_MODE": "Keisti Rodymo Režimą",
"CHORD_VIEW": "Akordei",

View File

@ -3,6 +3,7 @@
"ADD_ITEM_TO_SERVICE": "Legg til Element i Tjenesten",
"ADD_TO_SERVICE": "Legg til i Tjenesten",
"ALERT": "Varsel",
"ALERT_SUBMITTED": "Varsel Sendt Inn",
"ALERTS": "Varsler",
"CHANGE_DISPLAY_MODE": "Endre Visningsmodus",
"CHORD_VIEW": "Akkordvisning",

View File

@ -3,6 +3,7 @@
"ADD_ITEM_TO_SERVICE": "Voeg Item Toe aan Liturgie",
"ADD_TO_SERVICE": "Voeg Toe aan Liturgie",
"ALERT": "Waarschuwing",
"ALERT_SUBMITTED": "Waarschuwing Verstuurd",
"ALERTS": "Waarschuwingen",
"CHANGE_DISPLAY_MODE": "Wijzig Weergave",
"CHORD_VIEW": "Akkoordenscherm",
@ -46,7 +47,7 @@
"STAGE_VIEW": "Podiumscherm",
"THEMES": "Thema's",
"THEME_LEVEL": "Thema Niveau",
"THEME_OPTIONS": "Theme Opties",
"THEME_OPTIONS": "Thema Opties",
"USER_NAME": "Gebruikersnaam",
"USER_INTERFACE": "Gebruikersinterface"
}

View File

@ -3,6 +3,7 @@
"ADD_ITEM_TO_SERVICE": "Dodaj Element do Usługi",
"ADD_TO_SERVICE": "Dodaj do Usługi",
"ALERT": "Alert",
"ALERT_SUBMITTED": "Przesłano Alert",
"ALERTS": "Alerty",
"CHANGE_DISPLAY_MODE": "Zmień Tryb Wyświetlania",
"CHORD_VIEW": "Widok Akordów",

View File

@ -3,6 +3,7 @@
"ADD_ITEM_TO_SERVICE": "Adicionar Item ao Serviço",
"ADD_TO_SERVICE": "Adicionar ao Serviço",
"ALERT": "Alerta",
"ALERT_SUBMITTED": "Alerta Enviado",
"ALERTS": "Alertas",
"CHANGE_DISPLAY_MODE": "Alterar Modo de Exibição",
"CHORD_VIEW": "Visualização de Acordes",

View File

@ -3,6 +3,7 @@
"ADD_ITEM_TO_SERVICE": "Adăugați Element la Serviciu",
"ADD_TO_SERVICE": "Adăugați la Serviciu",
"ALERT": "Alertă",
"ALERT_SUBMITTED": "Alertă Transmisă",
"ALERTS": "Alerte",
"CHANGE_DISPLAY_MODE": "Schimbați Modul de Afișare",
"CHORD_VIEW": "Vizualizare Acorduri",

View File

@ -3,6 +3,7 @@
"ADD_ITEM_TO_SERVICE": "Добавить элемент в службу",
"ADD_TO_SERVICE": "Добавить в службу",
"ALERT": "Оповещение",
"ALERT_SUBMITTED": "Оповещение отправлено",
"ALERTS": "Оповещения",
"CHANGE_DISPLAY_MODE": "Изменить режим отображения",
"CHORD_VIEW": "Просмотр аккордов",

View File

@ -3,6 +3,7 @@
"ADD_ITEM_TO_SERVICE": "Pridať Položku do Služby",
"ADD_TO_SERVICE": "Pridať do Služby",
"ALERT": "Upozornenie",
"ALERT_SUBMITTED": "Upozornenie Bolo Odoslané",
"ALERTS": "Upozornenia",
"CHANGE_DISPLAY_MODE": "Zmeniť Režim Zobrazenia",
"CHORD_VIEW": "Zobrazenie Akordov",

View File

@ -3,6 +3,7 @@
"ADD_ITEM_TO_SERVICE": "Dodaj Predmet v Spored",
"ADD_TO_SERVICE": "Dodaj v Spored",
"ALERT": "Opozorilo",
"ALERT_SUBMITTED": "Predloženo Opozorilo",
"ALERTS": "Opozorila",
"CHANGE_DISPLAY_MODE": "Spremeni Način Prikaza",
"CHORD_VIEW": "Pogled s Sozvoki",

View File

@ -3,6 +3,7 @@
"ADD_ITEM_TO_SERVICE": "Lägg till Objekt i Tjänsten",
"ADD_TO_SERVICE": "Lägg till i Tjänsten",
"ALERT": "Varning",
"ALERT_SUBMITTED": "Avisering Skickad",
"ALERTS": "Varningar",
"CHANGE_DISPLAY_MODE": "Ändra Visningsläge",
"CHORD_VIEW": "Ackordvy",

View File

@ -3,6 +3,7 @@
"ADD_ITEM_TO_SERVICE": "பொருள் சேர்க்க சேவைக்கு",
"ADD_TO_SERVICE": "சேவைக்கு சேர்க்கவும்",
"ALERT": "எச்சரிக்கை",
"ALERT_SUBMITTED": "எச்சரிக்கை சமர்ப்பிக்கப்பட்டது",
"ALERTS": "எச்சரிக்கைகள்",
"CHANGE_DISPLAY_MODE": "காட்சி முறையை மாற்று",
"CHORD_VIEW": "கார்டு காட்சி",

View File

@ -3,6 +3,7 @@
"ADD_ITEM_TO_SERVICE": "เพิ่มรายการในบริการ",
"ADD_TO_SERVICE": "เพิ่มในบริการ",
"ALERT": "แจ้งเตือน",
"ALERT_SUBMITTED": "ส่งการแจ้งเตือนแล้ว",
"ALERTS": "การแจ้งเตือน",
"CHANGE_DISPLAY_MODE": "เปลี่ยนโหมดการแสดงผล",
"CHORD_VIEW": "มุมมองคอร์ด",

View File

@ -3,6 +3,7 @@
"ADD_ITEM_TO_SERVICE": "Thêm mục vào Dịch vụ",
"ADD_TO_SERVICE": "Thêm vào Dịch vụ",
"ALERT": "Cảnh báo",
"ALERT_SUBMITTED": "Cảnh báo đã Gửi",
"ALERTS": "Các cảnh báo",
"CHANGE_DISPLAY_MODE": "Thay đổi Chế độ Hiển thị",
"CHORD_VIEW": "Xem hợp âm",

View File

@ -3,6 +3,7 @@
"ADD_ITEM_TO_SERVICE": "添加项目到服务",
"ADD_TO_SERVICE": "添加到服务",
"ALERT": "警报",
"ALERT_SUBMITTED": "警报已提交",
"ALERTS": "警报",
"CHANGE_DISPLAY_MODE": "更改显示模式",
"CHORD_VIEW": "和弦视图",

View File

@ -3,6 +3,7 @@
"ADD_ITEM_TO_SERVICE": "新增項目至服務",
"ADD_TO_SERVICE": "新增至服務",
"ALERT": "警示",
"ALERT_SUBMITTED": "警報已提交",
"ALERTS": "警示訊息",
"CHANGE_DISPLAY_MODE": "變更顯示模式",
"CHORD_VIEW": "和弦檢視",

440
yarn.lock
View File

@ -1675,10 +1675,10 @@
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f"
integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==
"@fontsource/roboto@^5.0.12":
version "5.0.12"
resolved "https://registry.yarnpkg.com/@fontsource/roboto/-/roboto-5.0.12.tgz#418f7305a3be7fc567dd154db20090f7ece7fc6c"
integrity sha512-x0o17jvgoSSbS9OZnUX2+xJmVRvVCfeaYJjkS7w62iN7CuJWtMf5vJj8LqgC7ibqIkitOHVW+XssRjgrcHn62g==
"@fontsource/roboto@^5.0.13":
version "5.0.13"
resolved "https://registry.yarnpkg.com/@fontsource/roboto/-/roboto-5.0.13.tgz#2d6ec431a2f9dfe38ca76525c2d6bf12241f575b"
integrity sha512-j61DHjsdUCKMXSdNLTOxcG701FWnF0jcqNNQi2iPCDxU8seN/sMxeh62dC++UiagCWq9ghTypX+Pcy7kX+QOeQ==
"@humanwhocodes/config-array@^0.11.14":
version "0.11.14"
@ -2613,27 +2613,27 @@
node-gyp "^10.0.0"
which "^4.0.0"
"@nrwl/devkit@18.3.2":
version "18.3.2"
resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-18.3.2.tgz#21aa1db02ddc1d26856d964526e1120ca7479612"
integrity sha512-srguS6WNE/sP99OTfPqUdI22CNEocvxyz4TOB6Uj5zcFiKIFOlWn0NFwathdWVKwvsszY1Zvt/YiVjzYNUDqWw==
"@nrwl/devkit@18.3.3":
version "18.3.3"
resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-18.3.3.tgz#9ec5575afe6d14b17acd5e8da4e98a0de27704c6"
integrity sha512-3zZLE1vfwsNie7qjVUt9lqaM1slU0RTr/dW+Yt/2lxe8Peu6f8bnCM1Pf3kSlzoxQroctfocRtVHFXJsAuAt4g==
dependencies:
"@nx/devkit" "18.3.2"
"@nx/devkit" "18.3.3"
"@nrwl/tao@18.3.2":
version "18.3.2"
resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-18.3.2.tgz#20f99fb5ee76aacb0efda7a1c264f890c4e6c163"
integrity sha512-TQmaUMEIlKcytBpaHVG3VMPhfoJl09u3KaE6F1eJcFi7+za8rivH+HM+jlhwCAOlaC9bmnvJy0GvnFa5WtScsg==
"@nrwl/tao@18.3.3":
version "18.3.3"
resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-18.3.3.tgz#2d0c60d233f2cc07c85ba08126dd46f21dda1ef0"
integrity sha512-f/PUDLpSMEObiLQ5sIDySJM+5DxSCNunkxxbY1R9rmQ1cFcgrHaXIHQqbSj91mMa3mmtbKACk8u1LbI+oQV0Tg==
dependencies:
nx "18.3.2"
nx "18.3.3"
tslib "^2.3.0"
"@nx/devkit@18.3.2", "@nx/devkit@^17.2.8 || ^18.0.0":
version "18.3.2"
resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-18.3.2.tgz#f2515620b87a6880096ae59f9899f23844370ba6"
integrity sha512-H55m7R6zKteZ5DE0o2IOwpwo8RQXiH4RkBELWn9YkSQPvps8K7psyMzPQofP37qD5S0u7pYjGIWiJDzij+OeEQ==
"@nx/devkit@18.3.3", "@nx/devkit@^17.2.8 || ^18.0.0":
version "18.3.3"
resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-18.3.3.tgz#2ec37855020da74ad1e77b51711b057b3cb12fec"
integrity sha512-FtkZ6mA5//vEA5lcbT80m080ROVacHYV5F1peztTRA+IY2JZGJoqx425kn5ylDO8aCSAIAwcn2qIdhI8BnpG3Q==
dependencies:
"@nrwl/devkit" "18.3.2"
"@nrwl/devkit" "18.3.3"
ejs "^3.1.7"
enquirer "~2.3.6"
ignore "^5.0.4"
@ -2642,140 +2642,140 @@
tslib "^2.3.0"
yargs-parser "21.1.1"
"@nx/nx-darwin-arm64@18.3.2":
version "18.3.2"
resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-18.3.2.tgz#2aee0898234376bdd2c9b7928b18c4ce2c9afc99"
integrity sha512-x+C4a+DMGxHks/aKtyYa5+muF5BrJcDwxSPazRmrI9c80vo3J8TYjryXPHyZ/L3/3oNp72FtyPR46z3qf8NpQQ==
"@nx/nx-darwin-arm64@18.3.3":
version "18.3.3"
resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-18.3.3.tgz#dcdbcfe2796bbe3f1dfd61bce81389b05a50e69b"
integrity sha512-NpA2/7o1uUuaocMYopX9muxKif9HlGfWaXo2UeiR918usF6xri4aUqweZbaXVc9iqCAEbVMWUsjaLYGKPXHAjw==
"@nx/nx-darwin-x64@18.3.2":
version "18.3.2"
resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-18.3.2.tgz#45f8bc9fdd071138f513ad6b88f1988736747eb6"
integrity sha512-5krmqFbsaeDLpSRaonEqlAiL4MBIWVguE9vs0/lp6vlnyIXT3TRftk4B4Tpi+PqIN6tC/Ll8gGoHzSdwHboAcg==
"@nx/nx-darwin-x64@18.3.3":
version "18.3.3"
resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-18.3.3.tgz#aa7bdd1a3ea0bb81682422b805914efccab3b179"
integrity sha512-aydPLbc7DeceJ6szRf6DLT4ERoPvwfWyFiGXdAlEZYWhjEuNZLeG8K6jA3yHeWltKfX/qJqhnyKbnubBNzBKlQ==
"@nx/nx-freebsd-x64@18.3.2":
version "18.3.2"
resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-18.3.2.tgz#0e8722f29ad49f114b1b486fdc17878a40549868"
integrity sha512-FenZBqJ5FK/QoExmngolq3q5NsOmJgrhy1Q3NiG0yOTcXnwIZO9pHmRDTZ33niTxuXSRvCgvJE4uBAM9YvptYw==
"@nx/nx-freebsd-x64@18.3.3":
version "18.3.3"
resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-18.3.3.tgz#331f5dbb56c90b08e99c1ce9ff51e0c5b956f030"
integrity sha512-sEYEWsK/fwC1l7wzls7RNOjhmrooH0lK0mpgj1vDXesLBSZ7k+pddAqaHFECN4QXBSbHZI2PWOEhbnIH+Errsg==
"@nx/nx-linux-arm-gnueabihf@18.3.2":
version "18.3.2"
resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-18.3.2.tgz#a8ea0482f034ca34354b7cdd4a3311ee986edde1"
integrity sha512-xjh4WvRIN1vZpsL4tFlaAoZ15R/R4a7e+4Ai8h8evRA7Mz31k/iUEpfcF+6EJfwFX0IjI59QnWzZ19Z5XFfl0Q==
"@nx/nx-linux-arm-gnueabihf@18.3.3":
version "18.3.3"
resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-18.3.3.tgz#d66d4787f5cfc56b5a7aa9a0453174b96b4729a8"
integrity sha512-B9GGMkrrzwiAfvew22x85ITO9TiNxbgRbKJQWQaoopNpXrnSWpY8WTNxpDT24fwV1qdQfsPKcY3F4O0NOUgPRA==
"@nx/nx-linux-arm64-gnu@18.3.2":
version "18.3.2"
resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-18.3.2.tgz#798409918ffb0096f07540a080e7001793e3b607"
integrity sha512-Y82fDCuIjirdsS1tKfqC91qLdVhYS6NcU310fzMP4HI4A4WwdcMqHnn6E/O2glYW9CTYRQANo89fB44Zqbg7Cg==
"@nx/nx-linux-arm64-gnu@18.3.3":
version "18.3.3"
resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-18.3.3.tgz#2ab08df1d052a55d4a52ba910fe41c25701d5361"
integrity sha512-1EucHf5/0JeqZmhritqkpEdOcdo9Dl32gpFvhNfS6kCAYmaDlEl4zqedz3VIoj4C7+C0pV3mcRO9qB9H7GM5bQ==
"@nx/nx-linux-arm64-musl@18.3.2":
version "18.3.2"
resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-18.3.2.tgz#976e8d01229cccb76e738fab69a6b7218c59f60a"
integrity sha512-iaGfejem22yJI707jlWMDwlUFStT3zzm+hUJOWcTH/owREVDDcX9SrYOcNoqecipGFttwEow7jtgg2E/9mb20A==
"@nx/nx-linux-arm64-musl@18.3.3":
version "18.3.3"
resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-18.3.3.tgz#69376454bb9759c376d0a90aa876dfff6bbf4d15"
integrity sha512-HPgOgnYYLPVCBEaAkSEGPGzZqTDCiyCAF/qtvx5z0f1U/hZYb1ubgxw70ogY82Cafr7X4gQBz5k4/ZCnoCXlOQ==
"@nx/nx-linux-x64-gnu@18.3.2":
version "18.3.2"
resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-18.3.2.tgz#d41644efe55fa7d8c9d0a1a5d8eff7283d51377c"
integrity sha512-VV6T/tXURZ0r2N6VArI0JW4+Lf6Zq4UssCn6GS3cj75q7OhsQDqgcVIjET7zjqRhrc6ndZdi7d4YdEndOEMU+Q==
"@nx/nx-linux-x64-gnu@18.3.3":
version "18.3.3"
resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-18.3.3.tgz#0b8ba8ec0c2371f0df462742460d52d63b1cc715"
integrity sha512-FgYTQ3VEE6EUOGtJT9riRK8IBwPGFjKS+N2mudQJn2bB/9IumUvVRYQUIX08gqGLlqZPO6uUUhUjwZY8SnjRLQ==
"@nx/nx-linux-x64-musl@18.3.2":
version "18.3.2"
resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-18.3.2.tgz#9ad2492a4b9b5fb4ccea513b8c554d0645ee93f3"
integrity sha512-Pg3/HmNbCTd5Hm/EXHu+FRl4OInbqX44qh0pMpSuCSIjVPbyCXlKCQRsQWo6d3KQIUOvYsBZRAKjHVhhywcScg==
"@nx/nx-linux-x64-musl@18.3.3":
version "18.3.3"
resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-18.3.3.tgz#c96d6f8d2d94b99ac8da723077ebbc92f833beea"
integrity sha512-QnWjGViR1Wj9gJXa1RJ9mXyy2/JzQ7NF2C4ulTYSH5St1HoxhkfnLsV0+uNLFEV9PSZq+2BfxmQuT8Appefv1A==
"@nx/nx-win32-arm64-msvc@18.3.2":
version "18.3.2"
resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-18.3.2.tgz#fff2b1a856f91ce3e36d6a4cd9d358a20a776feb"
integrity sha512-c1aOj27HjQPDrGwHm2ytQfHQNMFJ8AyKLtWOEGMhUwDsRRqHd61Pg8kqSac1A9sdrSq4jRfVYsbzaGl1bE+gcw==
"@nx/nx-win32-arm64-msvc@18.3.3":
version "18.3.3"
resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-18.3.3.tgz#0d2c7396e7a063849edbd6e3d34ea81445c389b5"
integrity sha512-Xn3LUaPsF8QkEYUVV3lc693NTCMWrfZBFXTy1cQpvLzQ+idsXQ/EGWoq93cIM3Nc2YWyblT2hHHelb8dHCZAlw==
"@nx/nx-win32-x64-msvc@18.3.2":
version "18.3.2"
resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-18.3.2.tgz#58e9fd9ab952794b098b7081e0b2b617b3ba52e6"
integrity sha512-yDSYZch5RUQKFeGBloAbIKIeYNg8862ZX/lT54GeSYnI/32KqFABwuCV+tGjvPoTgA4Q0sI/F8i0NPhYwsC1Ww==
"@nx/nx-win32-x64-msvc@18.3.3":
version "18.3.3"
resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-18.3.3.tgz#ea1a60ae1ffe805529d5cb95e7b28e6b8ae24621"
integrity sha512-t8HvOnQEiaaoTFOOIrql30NPhIwDFO7jg0Jtz3Tbneulh7ceswJp71yFHsRGGrYZ23Tgg+Sna6M9qLRGzlRGkg==
"@pkgjs/parseargs@^0.11.0":
version "0.11.0"
resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33"
integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==
"@rollup/rollup-android-arm-eabi@4.14.3":
version "4.14.3"
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.3.tgz#bddf05c3387d02fac04b6b86b3a779337edfed75"
integrity sha512-X9alQ3XM6I9IlSlmC8ddAvMSyG1WuHk5oUnXGw+yUBs3BFoTizmG1La/Gr8fVJvDWAq+zlYTZ9DBgrlKRVY06g==
"@rollup/rollup-android-arm-eabi@4.16.2":
version "4.16.2"
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.16.2.tgz#29b7b3c70ddf532fe6dcf859cbfc3e4714c34842"
integrity sha512-VGodkwtEuZ+ENPz/CpDSl091koMv8ao5jHVMbG1vNK+sbx/48/wVzP84M5xSfDAC69mAKKoEkSo+ym9bXYRK9w==
"@rollup/rollup-android-arm64@4.14.3":
version "4.14.3"
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.3.tgz#b26bd09de58704c0a45e3375b76796f6eda825e4"
integrity sha512-eQK5JIi+POhFpzk+LnjKIy4Ks+pwJ+NXmPxOCSvOKSNRPONzKuUvWE+P9JxGZVxrtzm6BAYMaL50FFuPe0oWMQ==
"@rollup/rollup-android-arm64@4.16.2":
version "4.16.2"
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.16.2.tgz#f50f65d0c3b8b30d070d8616b2dfc0978dd588bd"
integrity sha512-5/W1xyIdc7jw6c/f1KEtg1vYDBWnWCsLiipK41NiaWGLG93eH2edgE6EgQJ3AGiPERhiOLUqlDSfjRK08C9xFg==
"@rollup/rollup-darwin-arm64@4.14.3":
version "4.14.3"
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.3.tgz#c5f3fd1aa285b6d33dda6e3f3ca395f8c37fd5ca"
integrity sha512-Od4vE6f6CTT53yM1jgcLqNfItTsLt5zE46fdPaEmeFHvPs5SjZYlLpHrSiHEKR1+HdRfxuzXHjDOIxQyC3ptBA==
"@rollup/rollup-darwin-arm64@4.16.2":
version "4.16.2"
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.16.2.tgz#be3d9fffbf6fc5b9d5f0642f1f0250e0ecab8d3e"
integrity sha512-vOAKMqZSTbPfyPVu1jBiy+YniIQd3MG7LUnqV0dA6Q5tyhdqYtxacTHP1+S/ksKl6qCtMG1qQ0grcIgk/19JEA==
"@rollup/rollup-darwin-x64@4.14.3":
version "4.14.3"
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.3.tgz#8e4673734d7dc9d68f6d48e81246055cda0e840f"
integrity sha512-0IMAO21axJeNIrvS9lSe/PGthc8ZUS+zC53O0VhF5gMxfmcKAP4ESkKOCwEi6u2asUrt4mQv2rjY8QseIEb1aw==
"@rollup/rollup-darwin-x64@4.16.2":
version "4.16.2"
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.16.2.tgz#fe45a772526b2c03d545e20f97a1e5cd60a46e52"
integrity sha512-aIJVRUS3Dnj6MqocBMrcXlatKm64O3ITeQAdAxVSE9swyhNyV1dwnRgw7IGKIkDQofatd8UqMSyUxuFEa42EcA==
"@rollup/rollup-linux-arm-gnueabihf@4.14.3":
version "4.14.3"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.3.tgz#53ed38eb13b58ababdb55a7f66f0538a7f85dcba"
integrity sha512-ge2DC7tHRHa3caVEoSbPRJpq7azhG+xYsd6u2MEnJ6XzPSzQsTKyXvh6iWjXRf7Rt9ykIUWHtl0Uz3T6yXPpKw==
"@rollup/rollup-linux-arm-gnueabihf@4.16.2":
version "4.16.2"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.16.2.tgz#450ecf66f30a51514413aafa79d28561db73151c"
integrity sha512-/bjfUiXwy3P5vYr6/ezv//Yle2Y0ak3a+Av/BKoi76nFryjWCkki8AuVoPR7ZU/ckcvAWFo77OnFK14B9B5JsA==
"@rollup/rollup-linux-arm-musleabihf@4.14.3":
version "4.14.3"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.14.3.tgz#0706ee38330e267a5c9326956820f009cfb21fcd"
integrity sha512-ljcuiDI4V3ySuc7eSk4lQ9wU8J8r8KrOUvB2U+TtK0TiW6OFDmJ+DdIjjwZHIw9CNxzbmXY39wwpzYuFDwNXuw==
"@rollup/rollup-linux-arm-musleabihf@4.16.2":
version "4.16.2"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.16.2.tgz#1e8807d220047084579cd01499c5476a325e0700"
integrity sha512-S24b+tJHwpq2TNRz9T+r71FjMvyBBApY8EkYxz8Cwi/rhH6h+lu/iDUxyc9PuHf9UvyeBFYkWWcrDahai/NCGw==
"@rollup/rollup-linux-arm64-gnu@4.14.3":
version "4.14.3"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.3.tgz#426fce7b8b242ac5abd48a10a5020f5a468c6cb4"
integrity sha512-Eci2us9VTHm1eSyn5/eEpaC7eP/mp5n46gTRB3Aar3BgSvDQGJZuicyq6TsH4HngNBgVqC5sDYxOzTExSU+NjA==
"@rollup/rollup-linux-arm64-gnu@4.16.2":
version "4.16.2"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.16.2.tgz#128adb9dbf0057b989127d2e7fd73931a6729410"
integrity sha512-UN7VAXLyeyGbCQWiOtQN7BqmjTDw1ON2Oos4lfk0YR7yNhFEJWZiwGtvj9Ay4lsT/ueT04sh80Sg2MlWVVZ+Ug==
"@rollup/rollup-linux-arm64-musl@4.14.3":
version "4.14.3"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.3.tgz#65bf944530d759b50d7ffd00dfbdf4125a43406f"
integrity sha512-UrBoMLCq4E92/LCqlh+blpqMz5h1tJttPIniwUgOFJyjWI1qrtrDhhpHPuFxULlUmjFHfloWdixtDhSxJt5iKw==
"@rollup/rollup-linux-arm64-musl@4.16.2":
version "4.16.2"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.16.2.tgz#fddc7730045301a7fb0132532890e5edcb23d2bc"
integrity sha512-ZBKvz3+rIhQjusKMccuJiPsStCrPOtejCHxTe+yWp3tNnuPWtyCh9QLGPKz6bFNFbwbw28E2T6zDgzJZ05F1JQ==
"@rollup/rollup-linux-powerpc64le-gnu@4.14.3":
version "4.14.3"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.3.tgz#494ba3b31095e9a45df9c3f646d21400fb631a95"
integrity sha512-5aRjvsS8q1nWN8AoRfrq5+9IflC3P1leMoy4r2WjXyFqf3qcqsxRCfxtZIV58tCxd+Yv7WELPcO9mY9aeQyAmw==
"@rollup/rollup-linux-powerpc64le-gnu@4.16.2":
version "4.16.2"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.16.2.tgz#7154fe9ffc6405b2a6555ca931c42c0aa5198c2a"
integrity sha512-LjMMFiVBRL3wOe095vHAekL4b7nQqf4KZEpdMWd3/W+nIy5o9q/8tlVKiqMbfieDypNXLsxM9fexOxd9Qcklyg==
"@rollup/rollup-linux-riscv64-gnu@4.14.3":
version "4.14.3"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.3.tgz#8b88ed0a40724cce04aa15374ebe5ba4092d679f"
integrity sha512-sk/Qh1j2/RJSX7FhEpJn8n0ndxy/uf0kI/9Zc4b1ELhqULVdTfN6HL31CDaTChiBAOgLcsJ1sgVZjWv8XNEsAQ==
"@rollup/rollup-linux-riscv64-gnu@4.16.2":
version "4.16.2"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.16.2.tgz#7a7d091a94fa7c50ebf72d5578475093e01c739e"
integrity sha512-ohkPt0lKoCU0s4B6twro2aft+QROPdUiWwOjPNTzwTsBK5w+2+iT9kySdtOdq0gzWJAdiqsV4NFtXOwGZmIsHA==
"@rollup/rollup-linux-s390x-gnu@4.14.3":
version "4.14.3"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.3.tgz#09c9e5ec57a0f6ec3551272c860bb9a04b96d70f"
integrity sha512-jOO/PEaDitOmY9TgkxF/TQIjXySQe5KVYB57H/8LRP/ux0ZoO8cSHCX17asMSv3ruwslXW/TLBcxyaUzGRHcqg==
"@rollup/rollup-linux-s390x-gnu@4.16.2":
version "4.16.2"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.16.2.tgz#39b87bd355dfafbc062ca856d3d6bc5aa1905d89"
integrity sha512-jm2lvLc+/gqXfndlpDw05jKvsl/HKYxUEAt1h5UXcMFVpO4vGpoWmJVUfKDtTqSaHcCNw1his1XjkgR9aort3w==
"@rollup/rollup-linux-x64-gnu@4.14.3":
version "4.14.3"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.3.tgz#197f27fd481ad9c861021d5cbbf21793922a631c"
integrity sha512-8ybV4Xjy59xLMyWo3GCfEGqtKV5M5gCSrZlxkPGvEPCGDLNla7v48S662HSGwRd6/2cSneMQWiv+QzcttLrrOA==
"@rollup/rollup-linux-x64-gnu@4.16.2":
version "4.16.2"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.16.2.tgz#30b88169db18dec202ab9662d5148523d59da553"
integrity sha512-oc5/SlITI/Vj/qL4UM+lXN7MERpiy1HEOnrE+SegXwzf7WP9bzmZd6+MDljCEZTdSY84CpvUv9Rq7bCaftn1+g==
"@rollup/rollup-linux-x64-musl@4.14.3":
version "4.14.3"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.14.3.tgz#5cc0522f4942f2df625e9bfb6fb02c6580ffbce6"
integrity sha512-s+xf1I46trOY10OqAtZ5Rm6lzHre/UiLA1J2uOhCFXWkbZrJRkYBPO6FhvGfHmdtQ3Bx793MNa7LvoWFAm93bg==
"@rollup/rollup-linux-x64-musl@4.16.2":
version "4.16.2"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.16.2.tgz#d4fd52a28d5ce4aaed436311d89a9a1eaff87c2d"
integrity sha512-/2VWEBG6mKbS2itm7hzPwhIPaxfZh/KLWrYg20pCRLHhNFtF+epLgcBtwy3m07bl/k86Q3PFRAf2cX+VbZbwzQ==
"@rollup/rollup-win32-arm64-msvc@4.14.3":
version "4.14.3"
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.3.tgz#a648122389d23a7543b261fba082e65fefefe4f6"
integrity sha512-+4h2WrGOYsOumDQ5S2sYNyhVfrue+9tc9XcLWLh+Kw3UOxAvrfOrSMFon60KspcDdytkNDh7K2Vs6eMaYImAZg==
"@rollup/rollup-win32-arm64-msvc@4.16.2":
version "4.16.2"
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.16.2.tgz#edd352302e3fa6a2d612447590b0a0887cdbf762"
integrity sha512-Wg7ANh7+hSilF0lG3e/0Oy8GtfTIfEk1327Bw8juZOMOoKmJLs3R+a4JDa/4cHJp2Gs7QfCDTepXXcyFD0ubBg==
"@rollup/rollup-win32-ia32-msvc@4.14.3":
version "4.14.3"
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.3.tgz#34727b5c7953c35fc6e1ae4f770ad3a2025f8e03"
integrity sha512-T1l7y/bCeL/kUwh9OD4PQT4aM7Bq43vX05htPJJ46RTI4r5KNt6qJRzAfNfM+OYMNEVBWQzR2Gyk+FXLZfogGw==
"@rollup/rollup-win32-ia32-msvc@4.16.2":
version "4.16.2"
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.16.2.tgz#f17cc1db108f364bf6ef427f98844b5f742d31f0"
integrity sha512-J/jCDKVMWp0Y2ELnTjpQFYUCUWv1Jr+LdFrJVZtdqGyjDo0PHPa7pCamjHvJel6zBFM3doFFqAr7cmXYWBAbfw==
"@rollup/rollup-win32-x64-msvc@4.14.3":
version "4.14.3"
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.3.tgz#5b2fb4d8cd44c05deef8a7b0e6deb9ccb8939d18"
integrity sha512-/BypzV0H1y1HzgYpxqRaXGBRqfodgoBBCcsrujT6QRcakDQdfU+Lq9PENPh5jB4I44YWq+0C2eHsHya+nZY1sA==
"@rollup/rollup-win32-x64-msvc@4.16.2":
version "4.16.2"
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.16.2.tgz#98fb87589960075d39c44784e3a99f67138602f4"
integrity sha512-3nIf+SJMs2ZzrCh+SKNqgLVV9hS/UY0UjT1YU8XQYFGLiUfmHYJ/5trOU1XSvmHjV5gTF/K3DjrWxtyzKKcAHA==
"@schematics/angular@17.3.5":
version "17.3.5"
@ -3074,16 +3074,16 @@
dependencies:
"@types/node" "*"
"@typescript-eslint/eslint-plugin@7.7.0":
version "7.7.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.7.0.tgz#bf34a02f221811505b8bf2f31060c8560c1bb0a3"
integrity sha512-GJWR0YnfrKnsRoluVO3PRb9r5aMZriiMMM/RHj5nnTrBy1/wIgk76XCtCKcnXGjpZQJQRFtGV9/0JJ6n30uwpQ==
"@typescript-eslint/eslint-plugin@7.7.1":
version "7.7.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.7.1.tgz#50a9044e3e5fe76b22caf64fb7fc1f97614bdbfd"
integrity sha512-KwfdWXJBOviaBVhxO3p5TJiLpNuh2iyXyjmWN0f1nU87pwyvfS0EmjC6ukQVYVFJd/K1+0NWGPDXiyEyQorn0Q==
dependencies:
"@eslint-community/regexpp" "^4.10.0"
"@typescript-eslint/scope-manager" "7.7.0"
"@typescript-eslint/type-utils" "7.7.0"
"@typescript-eslint/utils" "7.7.0"
"@typescript-eslint/visitor-keys" "7.7.0"
"@typescript-eslint/scope-manager" "7.7.1"
"@typescript-eslint/type-utils" "7.7.1"
"@typescript-eslint/utils" "7.7.1"
"@typescript-eslint/visitor-keys" "7.7.1"
debug "^4.3.4"
graphemer "^1.4.0"
ignore "^5.3.1"
@ -3091,15 +3091,15 @@
semver "^7.6.0"
ts-api-utils "^1.3.0"
"@typescript-eslint/parser@7.7.0":
version "7.7.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.7.0.tgz#6b1b3ce76c5de002c43af8ae933613b0f2b4bcc6"
integrity sha512-fNcDm3wSwVM8QYL4HKVBggdIPAy9Q41vcvC/GtDobw3c4ndVT3K6cqudUmjHPw8EAp4ufax0o58/xvWaP2FmTg==
"@typescript-eslint/parser@7.7.1":
version "7.7.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.7.1.tgz#f940e9f291cdca40c46cb75916217d3a42d6ceea"
integrity sha512-vmPzBOOtz48F6JAGVS/kZYk4EkXao6iGrD838sp1w3NQQC0W8ry/q641KU4PrG7AKNAf56NOcR8GOpH8l9FPCw==
dependencies:
"@typescript-eslint/scope-manager" "7.7.0"
"@typescript-eslint/types" "7.7.0"
"@typescript-eslint/typescript-estree" "7.7.0"
"@typescript-eslint/visitor-keys" "7.7.0"
"@typescript-eslint/scope-manager" "7.7.1"
"@typescript-eslint/types" "7.7.1"
"@typescript-eslint/typescript-estree" "7.7.1"
"@typescript-eslint/visitor-keys" "7.7.1"
debug "^4.3.4"
"@typescript-eslint/scope-manager@7.2.0":
@ -3110,13 +3110,13 @@
"@typescript-eslint/types" "7.2.0"
"@typescript-eslint/visitor-keys" "7.2.0"
"@typescript-eslint/scope-manager@7.7.0":
version "7.7.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.7.0.tgz#3f0db079b275bb8b0cb5be7613fb3130cfb5de77"
integrity sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw==
"@typescript-eslint/scope-manager@7.7.1":
version "7.7.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.7.1.tgz#07fe59686ca843f66e3e2b5c151522bc38effab2"
integrity sha512-PytBif2SF+9SpEUKynYn5g1RHFddJUcyynGpztX3l/ik7KmZEv19WCMhUBkHXPU9es/VWGD3/zg3wg90+Dh2rA==
dependencies:
"@typescript-eslint/types" "7.7.0"
"@typescript-eslint/visitor-keys" "7.7.0"
"@typescript-eslint/types" "7.7.1"
"@typescript-eslint/visitor-keys" "7.7.1"
"@typescript-eslint/type-utils@7.2.0":
version "7.2.0"
@ -3128,13 +3128,13 @@
debug "^4.3.4"
ts-api-utils "^1.0.1"
"@typescript-eslint/type-utils@7.7.0":
version "7.7.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.7.0.tgz#36792ff4209a781b058de61631a48df17bdefbc5"
integrity sha512-bOp3ejoRYrhAlnT/bozNQi3nio9tIgv3U5C0mVDdZC7cpcQEDZXvq8inrHYghLVwuNABRqrMW5tzAv88Vy77Sg==
"@typescript-eslint/type-utils@7.7.1":
version "7.7.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.7.1.tgz#2f8094edca3bebdaad009008929df645ed9c8743"
integrity sha512-ZksJLW3WF7o75zaBPScdW1Gbkwhd/lyeXGf1kQCxJaOeITscoSl0MjynVvCzuV5boUz/3fOI06Lz8La55mu29Q==
dependencies:
"@typescript-eslint/typescript-estree" "7.7.0"
"@typescript-eslint/utils" "7.7.0"
"@typescript-eslint/typescript-estree" "7.7.1"
"@typescript-eslint/utils" "7.7.1"
debug "^4.3.4"
ts-api-utils "^1.3.0"
@ -3143,10 +3143,10 @@
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.2.0.tgz#0feb685f16de320e8520f13cca30779c8b7c403f"
integrity sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==
"@typescript-eslint/types@7.7.0":
version "7.7.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.7.0.tgz#23af4d24bf9ce15d8d301236e3e3014143604f27"
integrity sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w==
"@typescript-eslint/types@7.7.1":
version "7.7.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.7.1.tgz#f903a651fb004c75add08e4e9e207f169d4b98d7"
integrity sha512-AmPmnGW1ZLTpWa+/2omPrPfR7BcbUU4oha5VIbSbS1a1Tv966bklvLNXxp3mrbc+P2j4MNOTfDffNsk4o0c6/w==
"@typescript-eslint/typescript-estree@7.2.0":
version "7.2.0"
@ -3162,13 +3162,13 @@
semver "^7.5.4"
ts-api-utils "^1.0.1"
"@typescript-eslint/typescript-estree@7.7.0":
version "7.7.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.7.0.tgz#b5dd6383b4c6a852d7b256a37af971e8982be97f"
integrity sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ==
"@typescript-eslint/typescript-estree@7.7.1":
version "7.7.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.7.1.tgz#5cafde48fe390fe1c1b329b2ce0ba8a73c1e87b2"
integrity sha512-CXe0JHCXru8Fa36dteXqmH2YxngKJjkQLjxzoj6LYwzZ7qZvgsLSc+eqItCrqIop8Vl2UKoAi0StVWu97FQZIQ==
dependencies:
"@typescript-eslint/types" "7.7.0"
"@typescript-eslint/visitor-keys" "7.7.0"
"@typescript-eslint/types" "7.7.1"
"@typescript-eslint/visitor-keys" "7.7.1"
debug "^4.3.4"
globby "^11.1.0"
is-glob "^4.0.3"
@ -3189,17 +3189,17 @@
"@typescript-eslint/typescript-estree" "7.2.0"
semver "^7.5.4"
"@typescript-eslint/utils@7.7.0":
version "7.7.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.7.0.tgz#3d2b6606a60ac34f3c625facfb3b3ab7e126f58d"
integrity sha512-LKGAXMPQs8U/zMRFXDZOzmMKgFv3COlxUQ+2NMPhbqgVm6R1w+nU1i4836Pmxu9jZAuIeyySNrN/6Rc657ggig==
"@typescript-eslint/utils@7.7.1":
version "7.7.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.7.1.tgz#5d161f2b4a55e1bc38b634bebb921e4bd4e4a16e"
integrity sha512-QUvBxPEaBXf41ZBbaidKICgVL8Hin0p6prQDu6bbetWo39BKbWJxRsErOzMNT1rXvTll+J7ChrbmMCXM9rsvOQ==
dependencies:
"@eslint-community/eslint-utils" "^4.4.0"
"@types/json-schema" "^7.0.15"
"@types/semver" "^7.5.8"
"@typescript-eslint/scope-manager" "7.7.0"
"@typescript-eslint/types" "7.7.0"
"@typescript-eslint/typescript-estree" "7.7.0"
"@typescript-eslint/scope-manager" "7.7.1"
"@typescript-eslint/types" "7.7.1"
"@typescript-eslint/typescript-estree" "7.7.1"
semver "^7.6.0"
"@typescript-eslint/visitor-keys@7.2.0":
@ -3210,12 +3210,12 @@
"@typescript-eslint/types" "7.2.0"
eslint-visitor-keys "^3.4.1"
"@typescript-eslint/visitor-keys@7.7.0":
version "7.7.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.0.tgz#950148cf1ac11562a2d903fdf7acf76714a2dc9e"
integrity sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA==
"@typescript-eslint/visitor-keys@7.7.1":
version "7.7.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.1.tgz#da2294796220bb0f3b4add5ecbb1b9c3f4f65798"
integrity sha512-gBL3Eq25uADw1LQ9kVpf3hRM+DWzs0uZknHYK3hq4jcTPqVCClHGDnB6UUUV2SFeBeA4KWHWbbLqmbGcZ4FYbw==
dependencies:
"@typescript-eslint/types" "7.7.0"
"@typescript-eslint/types" "7.7.1"
eslint-visitor-keys "^3.4.3"
"@ungap/structured-clone@^1.2.0":
@ -3919,9 +3919,9 @@ camelcase@^5.3.1:
integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001591:
version "1.0.30001611"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001611.tgz#4dbe78935b65851c2d2df1868af39f709a93a96e"
integrity sha512-19NuN1/3PjA3QI8Eki55N8my4LzfkMCRLgCVfrl/slbSAchQfV0+GwjPrK3rq37As4UCLlM/DHajbKkAqbv92Q==
version "1.0.30001612"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001612.tgz#d34248b4ec1f117b70b24ad9ee04c90e0b8a14ae"
integrity sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g==
chalk@^2.4.2:
version "2.4.2"
@ -4193,7 +4193,7 @@ core-js-compat@^3.31.0, core-js-compat@^3.34.0:
dependencies:
browserslist "^4.23.0"
core-js@^3.37.0:
core-js@^3.35.0, core-js@^3.37.0:
version "3.37.0"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.37.0.tgz#d8dde58e91d156b2547c19d8a4efd5c7f6c426bb"
integrity sha512-fu5vHevQ8ZG4og+LXug8ulUtVxjOcEYvifJr7L5Bfq9GOztVqsKd9/59hUk2ZSbCrS3BqUr3EpaYGIYzq7g3Ug==
@ -4538,9 +4538,9 @@ ejs@^3.1.7:
jake "^10.8.5"
electron-to-chromium@^1.4.668:
version "1.4.744"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.744.tgz#d19cdfdbd81bd800b71773702bcbaa129a3b2e8f"
integrity sha512-nAGcF0yeKKfrP13LMFr5U1eghfFSvFLg302VUFzWlcjPOnUYd52yU5x6PBYrujhNbc4jYmZFrGZFK+xasaEzVA==
version "1.4.745"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.745.tgz#9c202ce9cbf18a5b5e0ca47145fd127cc4dd2290"
integrity sha512-tRbzkaRI5gbUn5DEvF0dV4TQbMZ5CLkWeTAXmpC9IrYT+GE+x76i9p+o3RJ5l9XmdQlI1pPhVtE9uNcJJ0G0EA==
emoji-regex@^8.0.0:
version "8.0.0"
@ -5789,9 +5789,9 @@ ipaddr.js@1.9.1:
integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
ipaddr.js@^2.0.1:
version "2.1.0"
resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.1.0.tgz#2119bc447ff8c257753b196fc5f1ce08a4cdf39f"
integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==
version "2.2.0"
resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.2.0.tgz#d33fa7bac284f4de7af949638c9d68157c6b92e8"
integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==
is-array-buffer@^3.0.4:
version "3.0.4"
@ -6950,12 +6950,12 @@ nth-check@^2.0.1:
dependencies:
boolbase "^1.0.0"
nx@18.3.2, "nx@^17.2.8 || ^18.0.0":
version "18.3.2"
resolved "https://registry.yarnpkg.com/nx/-/nx-18.3.2.tgz#4ce7b2dae228c0515d21c5d834883e60a8296635"
integrity sha512-kgkfmkwJQQ8Fp5AkvoZlnRaUrdJhckte8RyFhy86VeYjUcWYzV6shrbasKxTB0ZvCikHYjbI7QnmVYmZujEjhQ==
nx@18.3.3, "nx@^17.2.8 || ^18.0.0":
version "18.3.3"
resolved "https://registry.yarnpkg.com/nx/-/nx-18.3.3.tgz#ab96811961b631efd4f0c83550e92f7b0a625e83"
integrity sha512-GqC5ANfTWV6SFbgquZwuRMI2Z2nO0c0Yx4JzM3x32aJOgXsmRml3WcV0a5648bIXSen34gylHYl2EHaxVWkzNQ==
dependencies:
"@nrwl/tao" "18.3.2"
"@nrwl/tao" "18.3.3"
"@yarnpkg/lockfile" "^1.1.0"
"@yarnpkg/parsers" "3.0.0-rc.46"
"@zkochan/js-yaml" "0.0.6"
@ -6990,16 +6990,16 @@ nx@18.3.2, "nx@^17.2.8 || ^18.0.0":
yargs "^17.6.2"
yargs-parser "21.1.1"
optionalDependencies:
"@nx/nx-darwin-arm64" "18.3.2"
"@nx/nx-darwin-x64" "18.3.2"
"@nx/nx-freebsd-x64" "18.3.2"
"@nx/nx-linux-arm-gnueabihf" "18.3.2"
"@nx/nx-linux-arm64-gnu" "18.3.2"
"@nx/nx-linux-arm64-musl" "18.3.2"
"@nx/nx-linux-x64-gnu" "18.3.2"
"@nx/nx-linux-x64-musl" "18.3.2"
"@nx/nx-win32-arm64-msvc" "18.3.2"
"@nx/nx-win32-x64-msvc" "18.3.2"
"@nx/nx-darwin-arm64" "18.3.3"
"@nx/nx-darwin-x64" "18.3.3"
"@nx/nx-freebsd-x64" "18.3.3"
"@nx/nx-linux-arm-gnueabihf" "18.3.3"
"@nx/nx-linux-arm64-gnu" "18.3.3"
"@nx/nx-linux-arm64-musl" "18.3.3"
"@nx/nx-linux-x64-gnu" "18.3.3"
"@nx/nx-linux-x64-musl" "18.3.3"
"@nx/nx-win32-arm64-msvc" "18.3.3"
"@nx/nx-win32-x64-msvc" "18.3.3"
object-assign@^4:
version "4.1.1"
@ -7750,28 +7750,28 @@ rimraf@^3.0.2:
glob "^7.1.3"
rollup@^4.2.0:
version "4.14.3"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.14.3.tgz#bcbb7784b35826d3164346fa6d5aac95190d8ba9"
integrity sha512-ag5tTQKYsj1bhrFC9+OEWqb5O6VYgtQDO9hPDBMmIbePwhfSr+ExlcU741t8Dhw5DkPCQf6noz0jb36D6W9/hw==
version "4.16.2"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.16.2.tgz#43bcbd225d0a6bc68df97a6e41c45003188a3845"
integrity sha512-sxDP0+pya/Yi5ZtptF4p3avI+uWCIf/OdrfdH2Gbv1kWddLKk0U7WE3PmQokhi5JrektxsK3sK8s4hzAmjqahw==
dependencies:
"@types/estree" "1.0.5"
optionalDependencies:
"@rollup/rollup-android-arm-eabi" "4.14.3"
"@rollup/rollup-android-arm64" "4.14.3"
"@rollup/rollup-darwin-arm64" "4.14.3"
"@rollup/rollup-darwin-x64" "4.14.3"
"@rollup/rollup-linux-arm-gnueabihf" "4.14.3"
"@rollup/rollup-linux-arm-musleabihf" "4.14.3"
"@rollup/rollup-linux-arm64-gnu" "4.14.3"
"@rollup/rollup-linux-arm64-musl" "4.14.3"
"@rollup/rollup-linux-powerpc64le-gnu" "4.14.3"
"@rollup/rollup-linux-riscv64-gnu" "4.14.3"
"@rollup/rollup-linux-s390x-gnu" "4.14.3"
"@rollup/rollup-linux-x64-gnu" "4.14.3"
"@rollup/rollup-linux-x64-musl" "4.14.3"
"@rollup/rollup-win32-arm64-msvc" "4.14.3"
"@rollup/rollup-win32-ia32-msvc" "4.14.3"
"@rollup/rollup-win32-x64-msvc" "4.14.3"
"@rollup/rollup-android-arm-eabi" "4.16.2"
"@rollup/rollup-android-arm64" "4.16.2"
"@rollup/rollup-darwin-arm64" "4.16.2"
"@rollup/rollup-darwin-x64" "4.16.2"
"@rollup/rollup-linux-arm-gnueabihf" "4.16.2"
"@rollup/rollup-linux-arm-musleabihf" "4.16.2"
"@rollup/rollup-linux-arm64-gnu" "4.16.2"
"@rollup/rollup-linux-arm64-musl" "4.16.2"
"@rollup/rollup-linux-powerpc64le-gnu" "4.16.2"
"@rollup/rollup-linux-riscv64-gnu" "4.16.2"
"@rollup/rollup-linux-s390x-gnu" "4.16.2"
"@rollup/rollup-linux-x64-gnu" "4.16.2"
"@rollup/rollup-linux-x64-musl" "4.16.2"
"@rollup/rollup-win32-arm64-msvc" "4.16.2"
"@rollup/rollup-win32-ia32-msvc" "4.16.2"
"@rollup/rollup-win32-x64-msvc" "4.16.2"
fsevents "~2.3.2"
run-async@^3.0.0:
@ -8412,9 +8412,9 @@ terser@5.29.1:
source-map-support "~0.5.20"
terser@^5.26.0:
version "5.30.3"
resolved "https://registry.yarnpkg.com/terser/-/terser-5.30.3.tgz#f1bb68ded42408c316b548e3ec2526d7dd03f4d2"
integrity sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==
version "5.30.4"
resolved "https://registry.yarnpkg.com/terser/-/terser-5.30.4.tgz#62b4d16a819424e6317fd5ceffb4ee8dc769803a"
integrity sha512-xRdd0v64a8mFK9bnsKVdoNP9GQIKUAaJPTaqEQDL4w/J8WaW4sWXXoMZ+6SimPkfT5bElreXf8m9HnmPc3E1BQ==
dependencies:
"@jridgewell/source-map" "^0.3.3"
acorn "^8.8.2"