diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 826b721e8f..ab8fc582e9 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -2,9 +2,9 @@ name: 'PR Flow' on: push: - branches: [feat/*, fix/*, custom/*] + branches: [feat/*, fix/*, custom/*, refactor/*] pull_request: - branches: [feat/*, fix/*, custom/*] + branches: [feat/*, fix/*, custom/*, refactor/*] # A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: diff --git a/apps/assistant-panel/src/app/app.component.ts b/apps/assistant-panel/src/app/app.component.ts new file mode 100644 index 0000000000..be7ad09471 --- /dev/null +++ b/apps/assistant-panel/src/app/app.component.ts @@ -0,0 +1,39 @@ +import { Component, inject, OnInit } from '@angular/core'; +import { PlaceOS_Service } from '@placeos/common'; + +@Component({ + selector: 'app-root', + template: ` + +
+ +
+ @if (has_chat) { + + } + + + `, + styles: [ + ` + :host { + display: flex; + flex-direction: column; + height: 100%; + width: 100%; + } + `, + ], + standalone: false, +}) +export class AppComponent implements OnInit { + private _placeos = inject(PlaceOS_Service); + + public get has_chat(): boolean { + return this._placeos.has_chat; + } + + public ngOnInit(): void { + this._placeos.init(); + } +} diff --git a/apps/assistant-panel/src/app/app.module.ts b/apps/assistant-panel/src/app/app.module.ts index c51b309032..c321b1cefa 100644 --- a/apps/assistant-panel/src/app/app.module.ts +++ b/apps/assistant-panel/src/app/app.module.ts @@ -7,54 +7,35 @@ import { NgModule, provideZonelessChangeDetection, } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { BrowserModule } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { Router, RouterModule } from '@angular/router'; import { ServiceWorkerModule } from '@angular/service-worker'; -import { MatRippleModule } from '@angular/material/core'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; - import * as Sentry from '@sentry/angular'; -import { AppComponent } from 'libs/components/src/lib/app.component'; +import { + GlobalBannerComponent, + GlobalLoadingComponent, +} from '@placeos/components'; import { environment } from '../environments/environment'; import { routes } from './app.routes'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { GlobalBannerComponent } from 'libs/components/src/lib/global-banner.component'; -import { GlobalLoadingComponent } from 'libs/components/src/lib/global-loading.component'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; -import { TranslatePipe } from 'libs/components/src/lib/translate.pipe'; - +import { AppComponent } from './app.component'; import { BootstrapComponent } from './bootstrap.component'; import { PanelViewComponent } from './panel-view.component'; -const MAT_MODULES: any[] = [ - MatFormFieldModule, - MatInputModule, - MatSnackBarModule, - MatRippleModule, - MatAutocompleteModule, -]; - @NgModule({ - declarations: [AppComponent, BootstrapComponent, PanelViewComponent], + declarations: [AppComponent], bootstrap: [AppComponent], imports: [ BrowserModule, BrowserAnimationsModule, RouterModule.forRoot(routes, { useHash: true }), - FormsModule, - ReactiveFormsModule, - ...MAT_MODULES, GlobalLoadingComponent, GlobalBannerComponent, - IconComponent, - TranslatePipe, + BootstrapComponent, + PanelViewComponent, ServiceWorkerModule.register('ngsw-worker.js', { enabled: environment.production, }), diff --git a/apps/assistant-panel/src/app/bootstrap.component.ts b/apps/assistant-panel/src/app/bootstrap.component.ts index e85f2bb8da..a764712e17 100644 --- a/apps/assistant-panel/src/app/bootstrap.component.ts +++ b/apps/assistant-panel/src/app/bootstrap.component.ts @@ -1,9 +1,14 @@ +import { CommonModule } from '@angular/common'; import { Component, OnInit, inject } from '@angular/core'; +import { MatAutocompleteModule } from '@angular/material/autocomplete'; +import { MatRippleModule } from '@angular/material/core'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { ActivatedRoute, Router } from '@angular/router'; -import { AsyncHandler } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { AsyncHandler, OrganisationService, Space } from '@placeos/common'; +import { TranslatePipe } from '@placeos/components'; import { querySystems } from '@placeos/ts-client'; -import { Space } from 'libs/events/src/lib/space.class'; import { BehaviorSubject, combineLatest, of } from 'rxjs'; import { debounceTime, map, shareReplay, switchMap } from 'rxjs/operators'; @@ -116,7 +121,15 @@ const SYS_ID_KEY = 'PLACEOS.ASSISTANT.system'; `, styles: [], - standalone: false, + imports: [ + MatAutocompleteModule, + MatFormFieldModule, + MatInputModule, + MatProgressSpinnerModule, + MatRippleModule, + CommonModule, + TranslatePipe, + ], }) export class BootstrapComponent extends AsyncHandler implements OnInit { private _org = inject(OrganisationService); diff --git a/apps/assistant-panel/src/app/panel-view.component.ts b/apps/assistant-panel/src/app/panel-view.component.ts index d451952016..23c194a9db 100644 --- a/apps/assistant-panel/src/app/panel-view.component.ts +++ b/apps/assistant-panel/src/app/panel-view.component.ts @@ -1,10 +1,17 @@ import { Component, ElementRef, inject, viewChild } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { AsyncHandler, currentUser } from '@placeos/common'; -import { ChatService } from 'libs/components/src/lib/chat/chat.service'; +import { + ChatService, + DateFromPipe, + IconComponent, + SanitizePipe, +} from '@placeos/components'; import { first, map, tap } from 'rxjs/operators'; -import { OrganisationService } from '@placeos/organisation'; +import { CommonModule } from '@angular/common'; +import { MatRippleModule } from '@angular/material/core'; +import { OrganisationService } from '@placeos/common'; import * as tf from '@tensorflow/tfjs'; declare let loadVosklet: any; @@ -219,7 +226,13 @@ declare let loadVosklet: any; } `, ], - standalone: false, + imports: [ + MatRippleModule, + CommonModule, + IconComponent, + SanitizePipe, + DateFromPipe, + ], }) export class PanelViewComponent extends AsyncHandler { private _route = inject(ActivatedRoute); @@ -480,7 +493,7 @@ export class PanelViewComponent extends AsyncHandler { this.interval('check_listening', () => this.startListening(), 500); } - public _last_text: string = ''; + public _last_text = ''; private _speakText(text: string) { if (this._last_text === text) return; diff --git a/apps/assistant-panel/src/test-setup.ts b/apps/assistant-panel/src/test-setup.ts index 6a82cc219f..958ebde662 100644 --- a/apps/assistant-panel/src/test-setup.ts +++ b/apps/assistant-panel/src/test-setup.ts @@ -6,8 +6,8 @@ globalThis.ngJest = { }, }; import { defineGlobalsInjections } from '@ngneat/spectator'; +import { TranslatePipe } from '@placeos/components'; import { setupZoneTestEnv } from 'jest-preset-angular/setup-env/zone'; -import { TranslatePipe } from 'libs/components/src/lib/translate.pipe'; import { MockPipe } from 'ng-mocks'; setupZoneTestEnv(); diff --git a/apps/booking-panel/src/app/app.component.ts b/apps/booking-panel/src/app/app.component.ts new file mode 100644 index 0000000000..a49e31cfa9 --- /dev/null +++ b/apps/booking-panel/src/app/app.component.ts @@ -0,0 +1,41 @@ +import { Component, inject, OnInit } from '@angular/core'; +import { PlaceOS_Service, setMocks } from '@placeos/common'; +import { mocksInit } from '@placeos/mocks'; + +@Component({ + selector: 'app-root', + template: ` + +
+ +
+ @if (has_chat) { + + } + + + `, + styles: [ + ` + :host { + display: flex; + flex-direction: column; + height: 100%; + width: 100%; + } + `, + ], + standalone: false, +}) +export class AppComponent implements OnInit { + private _placeos = inject(PlaceOS_Service); + + public get has_chat(): boolean { + return this._placeos.has_chat; + } + + public ngOnInit(): void { + setMocks(mocksInit); + this._placeos.init(); + } +} diff --git a/apps/booking-panel/src/app/app.module.ts b/apps/booking-panel/src/app/app.module.ts index b9802130ea..d488f90d92 100644 --- a/apps/booking-panel/src/app/app.module.ts +++ b/apps/booking-panel/src/app/app.module.ts @@ -4,37 +4,24 @@ import { NgModule, provideZonelessChangeDetection, } from '@angular/core'; -import { FormsModule } from '@angular/forms'; import { BrowserModule } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { Router } from '@angular/router'; import { ServiceWorkerModule } from '@angular/service-worker'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; - import { AppRoutingModule } from './app-routing.module'; -import { AppComponent } from 'libs/components/src/lib/app.component'; import { environment } from '../environments/environment'; -import { SharedOverlaysModule } from './overlays/overlays.module'; -import { MatRippleModule } from '@angular/material/core'; import * as Sentry from '@sentry/angular'; import { BootstrapComponent } from './bootstrap.component'; -import { AppCheckinModule } from './checkin/checkin.module'; import { EventPanelComponent } from './event-panel.component'; -import { AppPanelViewModule } from './new-panel/panel-view.module'; -import { LocaleService } from 'libs/common/src/lib/locale.service'; -import { AuthenticatedImageDirective } from 'libs/components/src/lib/authenticated-image.directive'; -import { GlobalBannerComponent } from 'libs/components/src/lib/global-banner.component'; -import { GlobalLoadingComponent } from 'libs/components/src/lib/global-loading.component'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; -import { SafePipe } from 'libs/components/src/lib/safe.pipe'; -import { TranslatePipe } from 'libs/components/src/lib/translate.pipe'; +import { LocaleService } from '@placeos/common'; +import { + GlobalBannerComponent, + GlobalLoadingComponent, +} from '@placeos/components'; import { registerLocaleData } from '@angular/common'; import localeAr from '@angular/common/locales/ar'; @@ -43,41 +30,25 @@ import localeFr from '@angular/common/locales/fr'; import localeIt from '@angular/common/locales/it'; import localeJa from '@angular/common/locales/ja'; import localeZh from '@angular/common/locales/zh'; -import { MatDialogModule } from '@angular/material/dialog'; -import { SanitizePipe } from 'libs/components/src/lib/sanitise.pipe'; - -const MAT_MODULES: any[] = [ - MatFormFieldModule, - MatInputModule, - MatAutocompleteModule, - MatSnackBarModule, - MatRippleModule, - MatDialogModule, -]; - -const STANDALONE_COMPONENTS = [ - GlobalBannerComponent, - GlobalLoadingComponent, - IconComponent, - AuthenticatedImageDirective, - TranslatePipe, - SafePipe, - SanitizePipe, -]; +import { AppComponent } from './app.component'; +import { CheckinViewComponent } from './checkin/checkin-view.component'; +import { PanelViewComponent } from './new-panel/panel-view.component'; @NgModule({ - declarations: [AppComponent, BootstrapComponent, EventPanelComponent], + declarations: [AppComponent], bootstrap: [AppComponent], imports: [ BrowserModule, BrowserAnimationsModule, AppRoutingModule, - FormsModule, - SharedOverlaysModule, - AppPanelViewModule, - AppCheckinModule, - ...MAT_MODULES, - ...STANDALONE_COMPONENTS, + GlobalBannerComponent, + GlobalLoadingComponent, + + BootstrapComponent, + EventPanelComponent, + CheckinViewComponent, + PanelViewComponent, + ServiceWorkerModule.register('ngsw-worker.js', { enabled: environment.production, }), diff --git a/apps/booking-panel/src/app/bootstrap.component.ts b/apps/booking-panel/src/app/bootstrap.component.ts index fe3dcc1943..3dc147646d 100644 --- a/apps/booking-panel/src/app/bootstrap.component.ts +++ b/apps/booking-panel/src/app/bootstrap.component.ts @@ -4,10 +4,17 @@ import { querySystems } from '@placeos/ts-client'; import { BehaviorSubject, combineLatest, of } from 'rxjs'; import { debounceTime, map, shareReplay, switchMap, tap } from 'rxjs/operators'; -import { AsyncHandler } from 'libs/common/src/lib/async-handler.class'; -import { OrganisationService } from 'libs/organisation/src/lib/organisation.service'; +import { AsyncHandler, OrganisationService } from '@placeos/common'; -import { Space } from 'libs/events/src/lib/space.class'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatAutocompleteModule } from '@angular/material/autocomplete'; +import { MatRippleModule } from '@angular/material/core'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { Space } from '@placeos/common'; +import { TranslatePipe } from '@placeos/components'; @Component({ selector: '[app-bootstrap]', @@ -121,7 +128,16 @@ import { Space } from 'libs/events/src/lib/space.class'; } `, ], - standalone: false, + imports: [ + CommonModule, + MatRippleModule, + TranslatePipe, + MatProgressSpinnerModule, + MatAutocompleteModule, + MatFormFieldModule, + MatInputModule, + FormsModule, + ], }) export class BootstrapComponent extends AsyncHandler implements OnInit { private route = inject(ActivatedRoute); diff --git a/apps/booking-panel/src/app/checkin/checkin-timetable.component.ts b/apps/booking-panel/src/app/checkin/checkin-timetable.component.ts index f5960a5bb4..a07b240fa4 100644 --- a/apps/booking-panel/src/app/checkin/checkin-timetable.component.ts +++ b/apps/booking-panel/src/app/checkin/checkin-timetable.component.ts @@ -5,8 +5,7 @@ import { input, output, } from '@angular/core'; -import { AsyncHandler } from '@placeos/common'; -import { CalendarEvent } from '@placeos/events'; +import { AsyncHandler, CalendarEvent } from '@placeos/common'; import { addHours, addMinutes, @@ -91,7 +90,7 @@ interface EventBlock { } `, ], - standalone: false, + imports: [], }) export class CheckinTimetableComponent extends AsyncHandler diff --git a/apps/booking-panel/src/app/checkin/checkin-view.component.ts b/apps/booking-panel/src/app/checkin/checkin-view.component.ts index 9e287ca3fd..a1494adf9e 100644 --- a/apps/booking-panel/src/app/checkin/checkin-view.component.ts +++ b/apps/booking-panel/src/app/checkin/checkin-view.component.ts @@ -5,9 +5,13 @@ import { startOfMinute } from 'date-fns'; import { combineLatest } from 'rxjs'; import { map } from 'rxjs/operators'; -import { getNextFreeTimeSlot } from 'libs/events/src/lib/helpers'; +import { CommonModule } from '@angular/common'; +import { MatRippleModule } from '@angular/material/core'; +import { IconComponent, TranslatePipe } from '@placeos/components'; +import { getNextFreeTimeSlot } from '@placeos/events'; import { currentPeriod, nextPeriod } from '../new-panel/helpers'; import { PanelStateService } from '../panel-state.service'; +import { CheckinTimetableComponent } from './checkin-timetable.component'; @Component({ selector: 'checkin-view', @@ -250,7 +254,13 @@ import { PanelStateService } from '../panel-state.service'; `, ], providers: [PanelStateService], - standalone: false, + imports: [ + CommonModule, + IconComponent, + TranslatePipe, + MatRippleModule, + CheckinTimetableComponent, + ], }) export class CheckinViewComponent extends AsyncHandler implements OnInit { private _state = inject(PanelStateService); diff --git a/apps/booking-panel/src/app/checkin/checkin.module.ts b/apps/booking-panel/src/app/checkin/checkin.module.ts deleted file mode 100644 index e70f4a528f..0000000000 --- a/apps/booking-panel/src/app/checkin/checkin.module.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; - -import { CheckinTimetableComponent } from './checkin-timetable.component'; -import { CheckinViewComponent } from './checkin-view.component'; - -import { IconComponent } from 'libs/components/src/lib/icon.component'; -import { SafePipe } from 'libs/components/src/lib/safe.pipe'; -import { TranslatePipe } from 'libs/components/src/lib/translate.pipe'; - -const COMPONENTS = [CheckinViewComponent, CheckinTimetableComponent]; - -@NgModule({ - declarations: [...COMPONENTS], - imports: [CommonModule, IconComponent, TranslatePipe, SafePipe], - exports: [...COMPONENTS], -}) -export class AppCheckinModule {} diff --git a/apps/booking-panel/src/app/event-panel.component.ts b/apps/booking-panel/src/app/event-panel.component.ts index 54a0002e2e..e64e7fd17a 100644 --- a/apps/booking-panel/src/app/event-panel.component.ts +++ b/apps/booking-panel/src/app/event-panel.component.ts @@ -6,12 +6,19 @@ import { debounceTime, map } from 'rxjs/operators'; import { AsyncHandler, firstTruthyValueFrom, + OrganisationService, SettingsService, } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; -import { generateQRCode } from 'libs/common/src/lib/qr-code'; -import { CalendarEvent } from 'libs/events/src/lib/event.class'; +import { CommonModule } from '@angular/common'; +import { MatRippleModule } from '@angular/material/core'; +import { CalendarEvent, generateQRCode } from '@placeos/common'; +import { + AuthenticatedImageDirective, + SafePipe, + SanitizePipe, + TranslatePipe, +} from '@placeos/components'; import { PanelStateService } from './panel-state.service'; @Component({ @@ -104,7 +111,7 @@ import { PanelStateService } from './panel-state.service'; [source]="(logo | async)?.src || (logo | async)" />

- {{ time | date: 'shortTime' }} + {{ time() | date: 'shortTime' }}

@if (!hide_qr && checkin) { @@ -124,7 +131,7 @@ import { PanelStateService } from './panel-state.service'; [class.w-56]="show_qr" >
- +
@@ -143,7 +150,14 @@ import { PanelStateService } from './panel-state.service'; } `, ], - standalone: false, + imports: [ + CommonModule, + MatRippleModule, + AuthenticatedImageDirective, + TranslatePipe, + SanitizePipe, + SafePipe, + ], }) export class EventPanelComponent extends AsyncHandler implements OnInit { private _settings = inject(SettingsService); diff --git a/apps/booking-panel/src/app/new-panel/helpers.ts b/apps/booking-panel/src/app/new-panel/helpers.ts index 495aef91b0..27500e8d98 100644 --- a/apps/booking-panel/src/app/new-panel/helpers.ts +++ b/apps/booking-panel/src/app/new-panel/helpers.ts @@ -1,7 +1,7 @@ import { addMinutes, differenceInSeconds, format } from 'date-fns'; -import { CalendarEvent } from 'libs/events/src/lib/event.class'; -import { getNextFreeTimeSlot } from 'libs/events/src/lib/helpers'; +import { CalendarEvent } from '@placeos/common'; +import { getNextFreeTimeSlot } from '@placeos/events'; export function nextPeriod(next: CalendarEvent) { const next_diff = Math.ceil( diff --git a/apps/booking-panel/src/app/new-panel/panel-view-details.component.ts b/apps/booking-panel/src/app/new-panel/panel-view-details.component.ts index 5d580eae36..53e54fe53a 100644 --- a/apps/booking-panel/src/app/new-panel/panel-view-details.component.ts +++ b/apps/booking-panel/src/app/new-panel/panel-view-details.component.ts @@ -1,8 +1,10 @@ import { Component, inject } from '@angular/core'; import { startOfMinute } from 'date-fns'; -import { generateQRCode } from 'libs/common/src/lib/qr-code'; +import { generateQRCode } from '@placeos/common'; +import { CommonModule } from '@angular/common'; +import { TranslatePipe } from '@placeos/components'; import { PanelStateService } from '../panel-state.service'; @Component({ @@ -83,7 +85,7 @@ import { PanelStateService } from '../panel-state.service'; } `, ], - standalone: false, + imports: [CommonModule, TranslatePipe], }) export class PanelViewDetailsComponent { private _state = inject(PanelStateService); diff --git a/apps/booking-panel/src/app/new-panel/panel-view-status.component.ts b/apps/booking-panel/src/app/new-panel/panel-view-status.component.ts index 8c0b8fcf8d..592267d134 100644 --- a/apps/booking-panel/src/app/new-panel/panel-view-status.component.ts +++ b/apps/booking-panel/src/app/new-panel/panel-view-status.component.ts @@ -1,4 +1,6 @@ +import { CommonModule } from '@angular/common'; import { Component, inject } from '@angular/core'; +import { IconComponent, SafePipe, TranslatePipe } from '@placeos/components'; import { combineLatest, interval } from 'rxjs'; import { map, shareReplay } from 'rxjs/operators'; import { PanelStateService } from '../panel-state.service'; @@ -187,7 +189,7 @@ import { currentPeriod, nextPeriod } from './helpers'; } `, ], - standalone: false, + imports: [CommonModule, TranslatePipe, SafePipe, IconComponent], }) export class PanelViewStatusComponent { private _state = inject(PanelStateService); diff --git a/apps/booking-panel/src/app/new-panel/panel-view.component.ts b/apps/booking-panel/src/app/new-panel/panel-view.component.ts index a667170152..2bfed296c1 100644 --- a/apps/booking-panel/src/app/new-panel/panel-view.component.ts +++ b/apps/booking-panel/src/app/new-panel/panel-view.component.ts @@ -1,7 +1,11 @@ +import { CommonModule } from '@angular/common'; import { Component, inject } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { AsyncHandler, RemoteLoggingService, VERSION } from '@placeos/common'; +import { SafePipe, TranslatePipe } from '@placeos/components'; import { PanelStateService } from '../panel-state.service'; +import { PanelViewDetailsComponent } from './panel-view-details.component'; +import { PanelViewStatusComponent } from './panel-view-status.component'; @Component({ selector: 'panel-view', @@ -56,7 +60,13 @@ import { PanelStateService } from '../panel-state.service'; `, styles: [``], providers: [PanelStateService], - standalone: false, + imports: [ + PanelViewStatusComponent, + PanelViewDetailsComponent, + CommonModule, + TranslatePipe, + SafePipe, + ], }) export class PanelViewComponent extends AsyncHandler { private _state = inject(PanelStateService); diff --git a/apps/booking-panel/src/app/new-panel/panel-view.module.ts b/apps/booking-panel/src/app/new-panel/panel-view.module.ts deleted file mode 100644 index 1fcd15406e..0000000000 --- a/apps/booking-panel/src/app/new-panel/panel-view.module.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { PanelViewDetailsComponent } from './panel-view-details.component'; -import { PanelViewStatusComponent } from './panel-view-status.component'; -import { PanelViewComponent } from './panel-view.component'; - -import { IconComponent } from 'libs/components/src/lib/icon.component'; -import { SafePipe } from 'libs/components/src/lib/safe.pipe'; -import { TranslatePipe } from 'libs/components/src/lib/translate.pipe'; - -const COMPONENTS = [ - PanelViewComponent, - PanelViewDetailsComponent, - PanelViewStatusComponent, -]; - -@NgModule({ - declarations: [...COMPONENTS], - imports: [CommonModule, IconComponent, TranslatePipe, SafePipe], - exports: [...COMPONENTS], -}) -export class AppPanelViewModule {} diff --git a/apps/booking-panel/src/app/overlays/booking-modal.component.ts b/apps/booking-panel/src/app/overlays/booking-modal.component.ts index f0fb23546d..c88d2b4a47 100644 --- a/apps/booking-panel/src/app/overlays/booking-modal.component.ts +++ b/apps/booking-panel/src/app/overlays/booking-modal.component.ts @@ -1,6 +1,19 @@ import { Component, EventEmitter, inject, OnInit, Output } from '@angular/core'; -import { FormControl, FormGroup, Validators } from '@angular/forms'; -import { MAT_DIALOG_DATA, MatDialog } from '@angular/material/dialog'; +import { + FormControl, + FormGroup, + ReactiveFormsModule, + Validators, +} from '@angular/forms'; +import { MatRippleModule } from '@angular/material/core'; +import { + MAT_DIALOG_DATA, + MatDialog, + MatDialogModule, +} from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { AsyncHandler, @@ -9,10 +22,16 @@ import { HashMap, i18n, notifyError, + Space, + User, } from '@placeos/common'; -import { Space } from '@placeos/events'; +import { IconComponent, TranslatePipe } from '@placeos/components'; +import { + DurationFieldComponent, + TimeFieldComponent, + UserSearchFieldComponent, +} from '@placeos/form-fields'; import { getModule } from '@placeos/ts-client'; -import { User } from '@placeos/users'; import { lastValueFrom, of } from 'rxjs'; import { first, shareReplay, switchMap } from 'rxjs/operators'; @@ -166,7 +185,19 @@ export async function openBookingModal( `, styles: [``], - standalone: false, + imports: [ + MatRippleModule, + TranslatePipe, + IconComponent, + MatProgressSpinnerModule, + MatFormFieldModule, + MatInputModule, + DurationFieldComponent, + TimeFieldComponent, + UserSearchFieldComponent, + ReactiveFormsModule, + MatDialogModule, + ], }) export class BookingModalComponent extends AsyncHandler implements OnInit { private _data: BookingModalData = inject(MAT_DIALOG_DATA); diff --git a/apps/booking-panel/src/app/overlays/embedded-control-modal.component.ts b/apps/booking-panel/src/app/overlays/embedded-control-modal.component.ts index 2f1fc52243..b7f350178d 100644 --- a/apps/booking-panel/src/app/overlays/embedded-control-modal.component.ts +++ b/apps/booking-panel/src/app/overlays/embedded-control-modal.component.ts @@ -1,8 +1,10 @@ import { animate, style, transition, trigger } from '@angular/animations'; -import { Component, OnInit, inject } from '@angular/core'; +import { Component, OnInit, inject, signal } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { AsyncHandler } from '@placeos/common'; +import { IconComponent, SafePipe } from '@placeos/components'; export interface EmbeddedControlModalData { control_url: string; @@ -26,7 +28,7 @@ export interface EmbeddedControlModalData {
-
{{ countdown }}
+
{{ countdown() }}
`, styles: [``], - standalone: false, + imports: [ + CommonModule, + MatRippleModule, + TranslatePipe, + IconComponent, + MatTooltipModule, + MatDialogModule, + ], }) export class AssetCategoryManagementModalComponent { private _data = inject<{ diff --git a/apps/concierge/src/app/asset-manager/asset-form.component.ts b/apps/concierge/src/app/asset-manager/asset-form.component.ts index 09f7cff1d4..cc3eb9505a 100644 --- a/apps/concierge/src/app/asset-manager/asset-form.component.ts +++ b/apps/concierge/src/app/asset-manager/asset-form.component.ts @@ -1,19 +1,26 @@ +import { CommonModule } from '@angular/common'; import { Component, OnInit, inject } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatSelectModule } from '@angular/material/select'; import { ActivatedRoute, Router } from '@angular/router'; import { - AssetGroup, generateAssetForm, saveAsset, showAsset, showAssetGroup, } from '@placeos/assets'; import { + AssetGroup, AsyncHandler, + OrganisationService, getInvalidFields, notifyError, notifySuccess, } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { TranslatePipe } from '@placeos/components'; +import { FullscreenModalShellComponent } from 'libs/components/src/lib/fullscreen-modal-shell.component'; import { AssetManagerStateService } from './asset-manager-state.service'; @Component({ @@ -149,7 +156,16 @@ import { AssetManagerStateService } from './asset-manager-state.service'; `, styles: [``], - standalone: false, + imports: [ + FullscreenModalShellComponent, + MatFormFieldModule, + MatInputModule, + MatSelectModule, + TranslatePipe, + CommonModule, + FormsModule, + ReactiveFormsModule, + ], }) export class AssetFormComponent extends AsyncHandler implements OnInit { private _state = inject(AssetManagerStateService); diff --git a/apps/concierge/src/app/asset-manager/asset-group-form.component.ts b/apps/concierge/src/app/asset-manager/asset-group-form.component.ts index 43000a55ad..24421cdf72 100644 --- a/apps/concierge/src/app/asset-manager/asset-group-form.component.ts +++ b/apps/concierge/src/app/asset-manager/asset-group-form.component.ts @@ -1,13 +1,25 @@ +import { CommonModule } from '@angular/common'; import { Component, inject, OnInit } from '@angular/core'; +import { ReactiveFormsModule } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatSelectModule } from '@angular/material/select'; import { ActivatedRoute, Router } from '@angular/router'; import { - AssetCategory, generateAssetGroupForm, saveAssetGroup, showAssetGroup, } from '@placeos/assets'; -import { AsyncHandler, notifyError, unique } from '@placeos/common'; +import { + AssetCategory, + AsyncHandler, + notifyError, + unique, +} from '@placeos/common'; +import { IconComponent, TranslatePipe } from '@placeos/components'; +import { ImageListFieldComponent } from '@placeos/form-fields'; +import { FullscreenModalShellComponent } from 'libs/components/src/lib/fullscreen-modal-shell.component'; import { BehaviorSubject, combineLatest, lastValueFrom } from 'rxjs'; import { map } from 'rxjs/operators'; import { AssetManagerStateService } from './asset-manager-state.service'; @@ -132,7 +144,17 @@ import { AssetManagerStateService } from './asset-manager-state.service'; `, styles: [``], - standalone: false, + imports: [ + CommonModule, + FullscreenModalShellComponent, + ImageListFieldComponent, + MatFormFieldModule, + ReactiveFormsModule, + MatInputModule, + MatSelectModule, + TranslatePipe, + IconComponent, + ], }) export class AssetGroupFormComponent extends AsyncHandler implements OnInit { private _state = inject(AssetManagerStateService); diff --git a/apps/concierge/src/app/asset-manager/asset-item-list.component.ts b/apps/concierge/src/app/asset-manager/asset-item-list.component.ts index 589c32945a..b2b7ed9a5a 100644 --- a/apps/concierge/src/app/asset-manager/asset-item-list.component.ts +++ b/apps/concierge/src/app/asset-manager/asset-item-list.component.ts @@ -1,4 +1,12 @@ +import { CommonModule } from '@angular/common'; import { Component, inject } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { RouterModule } from '@angular/router'; +import { + AuthenticatedImageDirective, + TranslatePipe, +} from '@placeos/components'; import { AssetManagerStateService } from './asset-manager-state.service'; @Component({ @@ -186,7 +194,14 @@ import { AssetManagerStateService } from './asset-manager-state.service'; } `, ], - standalone: false, + imports: [ + CommonModule, + MatProgressBarModule, + MatRippleModule, + RouterModule, + TranslatePipe, + AuthenticatedImageDirective, + ], }) export class AssetItemListComponent { private _state = inject(AssetManagerStateService); diff --git a/apps/concierge/src/app/asset-manager/asset-listing.component.ts b/apps/concierge/src/app/asset-manager/asset-listing.component.ts index 36aecb6ed0..ec49d4ab2b 100644 --- a/apps/concierge/src/app/asset-manager/asset-listing.component.ts +++ b/apps/concierge/src/app/asset-manager/asset-listing.component.ts @@ -1,7 +1,10 @@ import { Component, inject } from '@angular/core'; -import { NavigationEnd, Router } from '@angular/router'; +import { MatTabsModule } from '@angular/material/tabs'; +import { NavigationEnd, Router, RouterModule } from '@angular/router'; import { AsyncHandler } from '@placeos/common'; +import { TranslatePipe } from '@placeos/components'; import { AssetManagerStateService } from './asset-manager-state.service'; +import { AssetManagerTopbarComponent } from './asset-manager-topbar.component'; @Component({ selector: 'asset-listing', @@ -57,7 +60,12 @@ import { AssetManagerStateService } from './asset-manager-state.service'; } `, ], - standalone: false, + imports: [ + MatTabsModule, + RouterModule, + TranslatePipe, + AssetManagerTopbarComponent, + ], }) export class AssetListingComponent extends AsyncHandler { private _router = inject(Router); diff --git a/apps/concierge/src/app/asset-manager/asset-location-modal.component.ts b/apps/concierge/src/app/asset-manager/asset-location-modal.component.ts index 31908eeeba..25051b35a4 100644 --- a/apps/concierge/src/app/asset-manager/asset-location-modal.component.ts +++ b/apps/concierge/src/app/asset-manager/asset-location-modal.component.ts @@ -1,9 +1,20 @@ import { Component, inject } from '@angular/core'; -import { Booking } from '@placeos/bookings'; -import { MapPinComponent } from '@placeos/components'; -import { OrganisationService } from '@placeos/organisation'; -import { SpacePipe } from 'libs/events/src/lib/space.pipe'; +import { Booking, OrganisationService } from '@placeos/common'; +import { + IconComponent, + InteractiveMapComponent, + MapPinComponent, + SimpleTableComponent, +} from '@placeos/components'; + +import { CommonModule } from '@angular/common'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatMenuModule } from '@angular/material/menu'; +import { SpacePipe } from '@placeos/events'; import { AssetManagerStateService } from './asset-manager-state.service'; +import { SplitJoinPipe } from './split-join.pipe'; @Component({ selector: 'asset-location-modal', @@ -124,7 +135,17 @@ import { AssetManagerStateService } from './asset-manager-state.service'; `, styles: [``], - standalone: false, + imports: [ + MatDialogModule, + CommonModule, + MatMenuModule, + IconComponent, + SplitJoinPipe, + InteractiveMapComponent, + SimpleTableComponent, + MatFormFieldModule, + MatInputModule, + ], }) export class AssetLocationModalComponent { private _state = inject(AssetManagerStateService); diff --git a/apps/concierge/src/app/asset-manager/asset-manager-state.service.ts b/apps/concierge/src/app/asset-manager/asset-manager-state.service.ts index 186096847b..c07ba1d60f 100644 --- a/apps/concierge/src/app/asset-manager/asset-manager-state.service.ts +++ b/apps/concierge/src/app/asset-manager/asset-manager-state.service.ts @@ -1,10 +1,6 @@ import { Injectable, inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { - Asset, - AssetCategory, - AssetGroup, - AssetPurchaseOrder, deleteAssetGroup, generateAssetForm, getGroupsWithAssets, @@ -14,14 +10,20 @@ import { showGroupFull, } from '@placeos/assets'; import { - Booking, approveBooking, queryBookings, rejectBooking, updateBooking, } from '@placeos/bookings'; import { + Asset, + AssetCategory, + AssetGroup, + AssetPurchaseOrder, + AssetRequest, AsyncHandler, + Booking, + OrganisationService, SettingsService, flatten, nextValueFrom, @@ -34,7 +36,6 @@ import { AttachedResourceRuleset, } from '@placeos/components'; import { SpacesService } from '@placeos/events'; -import { OrganisationService } from '@placeos/organisation'; import { PlaceMetadata, cleanObject, @@ -42,7 +43,6 @@ import { updateMetadata, } from '@placeos/ts-client'; import { endOfDay, getUnixTime, startOfDay } from 'date-fns'; -import { AssetRequest } from 'libs/assets/src/lib/asset-request.class'; import { BehaviorSubject, Observable, combineLatest, of } from 'rxjs'; import { catchError, @@ -218,11 +218,11 @@ export class AssetManagerStateService extends AsyncHandler { this._org.active_building, this._change, ]).pipe( - filter(([{ active_item }]) => !!active_item), + filter(([{ active_item }, bld]) => !!active_item && !!bld), map(([options, t]) => [options.active_item, t] as any), distinctUntilChanged(), - switchMap(([active_item]) => - showGroupFull(active_item, { zone_id: this._org.building.id }), + switchMap(([active_item, bld]) => + showGroupFull(active_item, { zone_id: bld.id }), ), shareReplay(1), ); diff --git a/apps/concierge/src/app/asset-manager/asset-manager-topbar.component.ts b/apps/concierge/src/app/asset-manager/asset-manager-topbar.component.ts index 0f402ff6cf..c127606a28 100644 --- a/apps/concierge/src/app/asset-manager/asset-manager-topbar.component.ts +++ b/apps/concierge/src/app/asset-manager/asset-manager-topbar.component.ts @@ -1,13 +1,25 @@ +import { CommonModule } from '@angular/common'; import { Component, inject, input } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { MatRippleModule } from '@angular/material/core'; import { MatDialog } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatSelectModule } from '@angular/material/select'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { RouterModule } from '@angular/router'; import { AsyncHandler, nextValueFrom, notifySuccess, + OrganisationService, SettingsService, } from '@placeos/common'; -import { AvailableRoomsStateModalComponent } from '@placeos/components'; -import { OrganisationService } from '@placeos/organisation'; +import { + AvailableRoomsStateModalComponent, + IconComponent, + TranslatePipe, +} from '@placeos/components'; import { AssetManagerStateService } from './asset-manager-state.service'; @Component({ @@ -155,7 +167,18 @@ import { AssetManagerStateService } from './asset-manager-state.service'; } `, styles: [``], - standalone: false, + imports: [ + CommonModule, + MatFormFieldModule, + TranslatePipe, + FormsModule, + MatSelectModule, + IconComponent, + MatRippleModule, + MatTooltipModule, + RouterModule, + MatInputModule, + ], }) export class AssetManagerTopbarComponent extends AsyncHandler { private _state = inject(AssetManagerStateService); diff --git a/apps/concierge/src/app/asset-manager/asset-manager.component.ts b/apps/concierge/src/app/asset-manager/asset-manager.component.ts index 71157703aa..05e5d022fb 100644 --- a/apps/concierge/src/app/asset-manager/asset-manager.component.ts +++ b/apps/concierge/src/app/asset-manager/asset-manager.component.ts @@ -1,4 +1,7 @@ import { Component } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { ApplicationSidebarComponent } from '../ui/app-sidebar.component'; +import { ApplicationTopbarComponent } from '../ui/app-topbar.component'; @Component({ selector: '[asset-manager]', @@ -22,6 +25,10 @@ import { Component } from '@angular/core'; } `, ], - standalone: false, + imports: [ + ApplicationTopbarComponent, + ApplicationSidebarComponent, + RouterModule, + ], }) export class AssetManagerComponent {} diff --git a/apps/concierge/src/app/asset-manager/asset-manager.module.ts b/apps/concierge/src/app/asset-manager/asset-manager.module.ts index 314a4daf0c..f448598bf5 100644 --- a/apps/concierge/src/app/asset-manager/asset-manager.module.ts +++ b/apps/concierge/src/app/asset-manager/asset-manager.module.ts @@ -1,50 +1,17 @@ -import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { MatProgressBarModule } from '@angular/material/progress-bar'; -import { MatStepperModule } from '@angular/material/stepper'; import { Route, RouterModule } from '@angular/router'; -import { UIModule } from '../ui/ui.module'; -import { MatTabsModule } from '@angular/material/tabs'; -import { ComponentsModule } from '@placeos/components'; import { AssetBulkFormComponent } from './asset-bulk-form.component'; import { AssetCategoryFormComponent } from './asset-category-form.component'; -import { AssetCategoryManagementModalComponent } from './asset-category-management-modal.component'; import { AssetFormComponent } from './asset-form.component'; import { AssetGroupFormComponent } from './asset-group-form.component'; import { AssetItemListComponent } from './asset-item-list.component'; import { AssetListingComponent } from './asset-listing.component'; -import { AssetLocationModalComponent } from './asset-location-modal.component'; -import { AssetManagerTopbarComponent } from './asset-manager-topbar.component'; import { AssetManagerComponent } from './asset-manager.component'; import { AssetPurchaseOrderFormComponent } from './asset-purchase-order-form.component'; import { AssetPurchaseOrderListComponent } from './asset-purchase-order-list.component'; -import { AssetRequestDetailsComponent } from './asset-request-details.component'; import { AssetRequestListComponent } from './asset-request-list.component'; import { AssetViewComponent } from './asset-view.component'; -import { DurationFormatPipe } from './duration.pipe'; -import { SplitJoinPipe } from './split-join.pipe'; - -const COMPONENTS = [ - AssetManagerComponent, - AssetManagerTopbarComponent, - AssetListingComponent, - AssetViewComponent, - AssetRequestListComponent, - AssetItemListComponent, - AssetRequestDetailsComponent, - AssetLocationModalComponent, - SplitJoinPipe, - DurationFormatPipe, - - AssetFormComponent, - AssetBulkFormComponent, - AssetGroupFormComponent, - AssetCategoryFormComponent, - AssetPurchaseOrderFormComponent, - AssetPurchaseOrderListComponent, - AssetCategoryManagementModalComponent, -]; const children = [ { @@ -87,14 +54,18 @@ const ROUTES: Route[] = [ ]; @NgModule({ - declarations: [...COMPONENTS], + declarations: [], imports: [ - CommonModule, - UIModule, - ComponentsModule, - MatProgressBarModule, - MatTabsModule, - MatStepperModule, + AssetManagerComponent, + AssetItemListComponent, + AssetRequestListComponent, + AssetPurchaseOrderListComponent, + AssetViewComponent, + AssetGroupFormComponent, + AssetFormComponent, + AssetBulkFormComponent, + AssetCategoryFormComponent, + AssetPurchaseOrderFormComponent, RouterModule.forChild(ROUTES), ], }) diff --git a/apps/concierge/src/app/asset-manager/asset-purchase-order-form.component.ts b/apps/concierge/src/app/asset-manager/asset-purchase-order-form.component.ts index cabb425a1d..bda283b72b 100644 --- a/apps/concierge/src/app/asset-manager/asset-purchase-order-form.component.ts +++ b/apps/concierge/src/app/asset-manager/asset-purchase-order-form.component.ts @@ -1,7 +1,10 @@ +import { CommonModule } from '@angular/common'; import { Component, OnInit, inject } from '@angular/core'; +import { ReactiveFormsModule } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; import { ActivatedRoute, Router } from '@angular/router'; import { - AssetPurchaseOrder, generateAssetPurchaseOrderForm, queryAssetGroups, queryAssets, @@ -9,13 +12,17 @@ import { showAssetPurchaseOrder, } from '@placeos/assets'; import { + AssetPurchaseOrder, AsyncHandler, + OrganisationService, i18n, notifyError, notifySuccess, } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { SimpleTableComponent, TranslatePipe } from '@placeos/components'; +import { DateFieldComponent } from '@placeos/form-fields'; import { addYears, getUnixTime } from 'date-fns'; +import { FullscreenModalShellComponent } from 'libs/components/src/lib/fullscreen-modal-shell.component'; import { BehaviorSubject, combineLatest } from 'rxjs'; import { filter, shareReplay, switchMap } from 'rxjs/operators'; import { AssetManagerStateService } from './asset-manager-state.service'; @@ -178,7 +185,16 @@ import { AssetManagerStateService } from './asset-manager-state.service'; `, styles: [``], - standalone: false, + imports: [ + CommonModule, + FullscreenModalShellComponent, + SimpleTableComponent, + TranslatePipe, + DateFieldComponent, + MatFormFieldModule, + MatInputModule, + ReactiveFormsModule, + ], }) export class AssetPurchaseOrderFormComponent extends AsyncHandler diff --git a/apps/concierge/src/app/asset-manager/asset-purchase-order-list.component.ts b/apps/concierge/src/app/asset-manager/asset-purchase-order-list.component.ts index 2eb89678a9..195a13fc26 100644 --- a/apps/concierge/src/app/asset-manager/asset-purchase-order-list.component.ts +++ b/apps/concierge/src/app/asset-manager/asset-purchase-order-list.component.ts @@ -1,5 +1,7 @@ +import { CommonModule } from '@angular/common'; import { Component, inject } from '@angular/core'; import { Router } from '@angular/router'; +import { SimpleTableComponent, TranslatePipe } from '@placeos/components'; import { combineLatest } from 'rxjs'; import { map } from 'rxjs/operators'; import { AssetManagerStateService } from './asset-manager-state.service'; @@ -81,7 +83,7 @@ import { AssetManagerStateService } from './asset-manager-state.service'; } `, ], - standalone: false, + imports: [CommonModule, SimpleTableComponent, TranslatePipe], }) export class AssetPurchaseOrderListComponent { private _state = inject(AssetManagerStateService); diff --git a/apps/concierge/src/app/asset-manager/asset-request-details.component.ts b/apps/concierge/src/app/asset-manager/asset-request-details.component.ts index 9dfc5d68ff..3d896df2fd 100644 --- a/apps/concierge/src/app/asset-manager/asset-request-details.component.ts +++ b/apps/concierge/src/app/asset-manager/asset-request-details.component.ts @@ -1,7 +1,11 @@ -import { Component, inject, input, output } from '@angular/core'; -import { SettingsService } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { CommonModule } from '@angular/common'; +import { Component, inject, model, output } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; +import { MatMenuModule } from '@angular/material/menu'; +import { OrganisationService, SettingsService } from '@placeos/common'; +import { IconComponent, LevelPipe, TranslatePipe } from '@placeos/components'; import { AssetManagerStateService } from './asset-manager-state.service'; +import { SplitJoinPipe } from './split-join.pipe'; @Component({ selector: 'asset-request-details', @@ -9,7 +13,7 @@ import { AssetManagerStateService } from './asset-manager-state.service'; @if (request()) {
@@ -135,7 +139,9 @@ import { AssetManagerStateService } from './asset-manager-state.service';
Floor
- {{ level(request().zones)?.display_name || 'N/A' }} + {{ + (request().zones | level)?.display_name || 'N/A' + }}
(undefined); + public readonly request = model(undefined); public readonly requestChange = output(); public loading = false; @@ -275,10 +289,6 @@ export class AssetRequestDetailsComponent { return this._settings.time_format; } - public level(zones) { - return this._org.levelWithID(zones); - } - public async setStatus(status: string) { this.loading = true; await this._state.setStatus(this.request(), status); diff --git a/apps/concierge/src/app/asset-manager/asset-request-list.component.ts b/apps/concierge/src/app/asset-manager/asset-request-list.component.ts index e78c7a3c7c..8ecf5f2d39 100644 --- a/apps/concierge/src/app/asset-manager/asset-request-list.component.ts +++ b/apps/concierge/src/app/asset-manager/asset-request-list.component.ts @@ -1,10 +1,24 @@ +import { CommonModule } from '@angular/common'; import { Component, inject, OnInit } from '@angular/core'; -import { Booking } from '@placeos/bookings'; -import { AsyncHandler, SettingsService } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { MatRippleModule } from '@angular/material/core'; +import { MatMenuModule } from '@angular/material/menu'; +import { + AsyncHandler, + Booking, + OrganisationService, + SettingsService, +} from '@placeos/common'; +import { + IconComponent, + SimpleTableComponent, + TranslatePipe, +} from '@placeos/components'; import { startOfDay } from 'date-fns'; import { map } from 'rxjs/operators'; +import { DateOptionsComponent } from '../ui/date-options.component'; import { AssetManagerStateService } from './asset-manager-state.service'; +import { AssetRequestDetailsComponent } from './asset-request-details.component'; +import { SplitJoinPipe } from './split-join.pipe'; @Component({ selector: 'app-asset-request-list', @@ -258,7 +272,17 @@ import { AssetManagerStateService } from './asset-manager-state.service'; } `, ], - standalone: false, + imports: [ + CommonModule, + MatRippleModule, + DateOptionsComponent, + SimpleTableComponent, + AssetRequestDetailsComponent, + MatMenuModule, + IconComponent, + SplitJoinPipe, + TranslatePipe, + ], }) export class AssetRequestListComponent extends AsyncHandler implements OnInit { private _state = inject(AssetManagerStateService); diff --git a/apps/concierge/src/app/asset-manager/asset-view.component.ts b/apps/concierge/src/app/asset-manager/asset-view.component.ts index 4011414d96..acc653bb0f 100644 --- a/apps/concierge/src/app/asset-manager/asset-view.component.ts +++ b/apps/concierge/src/app/asset-manager/asset-view.component.ts @@ -1,19 +1,33 @@ -import { Component, inject, viewChild } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { Component, inject, signal, viewChild } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; import { MatDialog } from '@angular/material/dialog'; -import { ActivatedRoute, Router } from '@angular/router'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { MatTabsModule } from '@angular/material/tabs'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { ActivatedRoute, Router, RouterModule } from '@angular/router'; import { - Asset, - AssetPurchaseOrder, deleteAsset, deleteAssetPurchaseOrder, removeAssetRequests, } from '@placeos/assets'; -import { AsyncHandler, unique } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { + Asset, + AssetPurchaseOrder, + AsyncHandler, + OrganisationService, + unique, +} from '@placeos/common'; +import { + CustomTooltipComponent, + IconComponent, + ImageCarouselComponent, + openConfirmModal, + SimpleTableComponent, + TranslatePipe, +} from '@placeos/components'; import { addMinutes } from 'date-fns'; -import { openConfirmModal } from 'libs/components/src/lib/confirm-modal.component'; -import { CustomTooltipComponent } from 'libs/components/src/lib/custom-tooltip.component'; -import { combineLatest } from 'rxjs'; +import { combineLatest, lastValueFrom } from 'rxjs'; import { first, map } from 'rxjs/operators'; import { AssetLocationModalComponent } from './asset-location-modal.component'; import { AssetManagerStateService } from './asset-manager-state.service'; @@ -21,7 +35,7 @@ import { AssetManagerStateService } from './asset-manager-state.service'; @Component({ selector: 'asset-view', template: ` - @if (!loading && (item | async)) { + @if (!loading() && (item | async)) {
} @else {

{{ 'APP.CONCIERGE.ASSETS_ITEM_LOADING' | translate }}

@@ -434,7 +448,7 @@ import { AssetManagerStateService } from './asset-manager-state.service';
- @if (!deleting) { + @if (!deleting()) {

{{ 'APP.CONCIERGE.ASSETS_ITEM_DELETE_MSG' | translate }} @@ -463,7 +477,7 @@ import { AssetManagerStateService } from './asset-manager-state.service';

} @else {

@@ -483,7 +497,18 @@ import { AssetManagerStateService } from './asset-manager-state.service'; } `, ], - standalone: false, + imports: [ + CommonModule, + RouterModule, + MatProgressSpinnerModule, + TranslatePipe, + MatRippleModule, + SimpleTableComponent, + MatTabsModule, + MatTooltipModule, + ImageCarouselComponent, + IconComponent, + ], }) export class AssetViewComponent extends AsyncHandler { private _route = inject(ActivatedRoute); @@ -492,8 +517,8 @@ export class AssetViewComponent extends AsyncHandler { private _dialog = inject(MatDialog); private _org = inject(OrganisationService); - public loading = false; - public deleting = false; + public readonly loading = signal(false); + public readonly deleting = signal(false); public readonly item = this._state.active_product; public readonly asset_list = combineLatest([ this.item, @@ -523,9 +548,9 @@ export class AssetViewComponent extends AsyncHandler { public readonly _tooltip_el = viewChild(CustomTooltipComponent); public async deleteAsset() { - this.deleting = true; + this.deleting.set(true); await this._state.deleteActiveProduct(); - this.deleting = false; + this.deleting.set(false); this._router.navigate([this._state.base_route, 'list', 'items']); this.closeTooltip(); } @@ -547,7 +572,7 @@ export class AssetViewComponent extends AsyncHandler { } public ngOnInit() { - this.loading = true; + this.loading.set(true); this.subscription( 'route.params', this._route.paramMap.subscribe((params) => { @@ -563,7 +588,7 @@ export class AssetViewComponent extends AsyncHandler { ); this._state.active_product.pipe(first((_) => !!_)).subscribe(() => { this.clearTimeout('no_asset'); - this.loading = false; + this.loading.set(false); }); } @@ -579,9 +604,11 @@ export class AssetViewComponent extends AsyncHandler { ); if (resp.reason !== 'done') return; resp.loading('Deleting asset...'); - await deleteAsset(asset.id).toPromise(); + await lastValueFrom(deleteAsset(asset.id)); await removeAssetRequests(asset.id); - const item = await this._state.active_product.pipe(first()).toPromise(); + const item = await lastValueFrom( + this._state.active_product.pipe(first()), + ); this._state.setOptions({ active_item: '' }); setTimeout( () => this._state.setOptions({ active_item: item.id }), @@ -602,8 +629,10 @@ export class AssetViewComponent extends AsyncHandler { ); if (resp.reason !== 'done') return; resp.loading('Deleting purchase order...'); - await deleteAssetPurchaseOrder(asset.id).toPromise(); - const item = await this._state.active_product.pipe(first()).toPromise(); + await lastValueFrom(deleteAssetPurchaseOrder(asset.id)); + const item = await lastValueFrom( + this._state.active_product.pipe(first()), + ); this._state.setOptions({ active_item: '' }); setTimeout( () => this._state.setOptions({ active_item: item.id }), diff --git a/apps/concierge/src/app/asset-manager/duration.pipe.ts b/apps/concierge/src/app/asset-manager/duration.pipe.ts index 25ec5b144b..7ecefb475f 100644 --- a/apps/concierge/src/app/asset-manager/duration.pipe.ts +++ b/apps/concierge/src/app/asset-manager/duration.pipe.ts @@ -3,7 +3,6 @@ import { formatDuration } from '@placeos/common'; @Pipe({ name: 'duration', - standalone: false, }) export class DurationFormatPipe implements PipeTransform { public transform(value: number, short = true): string { diff --git a/apps/concierge/src/app/asset-manager/split-join.pipe.ts b/apps/concierge/src/app/asset-manager/split-join.pipe.ts index 20b410d1e8..1338c68ada 100644 --- a/apps/concierge/src/app/asset-manager/split-join.pipe.ts +++ b/apps/concierge/src/app/asset-manager/split-join.pipe.ts @@ -2,7 +2,6 @@ import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ name: 'splitjoin', - standalone: false, }) export class SplitJoinPipe implements PipeTransform { public transform(value: string, split = '_', join = ' '): string { diff --git a/apps/concierge/src/app/building-manager/auto-release-settings-modal.component.ts b/apps/concierge/src/app/building-manager/auto-release-settings-modal.component.ts index cd596ff7f7..00f6cfc9f0 100644 --- a/apps/concierge/src/app/building-manager/auto-release-settings-modal.component.ts +++ b/apps/concierge/src/app/building-manager/auto-release-settings-modal.component.ts @@ -2,10 +2,12 @@ import { Component, OnInit, inject, signal } from '@angular/core'; import { MAT_DIALOG_DATA, MatDialog, + MatDialogModule, MatDialogRef, } from '@angular/material/dialog'; import { SettingsService, + WorktimePreference, i18n, nextValueFrom, notifyError, @@ -20,7 +22,6 @@ import { updateMetadata, updateSettings, } from '@placeos/ts-client'; -import { WorktimePreference } from '@placeos/users'; import { set, setDay, @@ -29,11 +30,24 @@ import { startOfDay, startOfMinute, } from 'date-fns'; -import * as yaml from 'js-yaml'; -import { WFHSettingsModalComponent } from 'libs/users/src/lib/wfh-settings-modal.component'; import { lastValueFrom } from 'rxjs'; import { map } from 'rxjs/operators'; +import { WFHSettingsModalComponent } from '@placeos/users'; + +import { FormsModule } from '@angular/forms'; +import { MatRippleModule } from '@angular/material/core'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { MatSelectModule } from '@angular/material/select'; +import { SettingsToggleComponent, TranslatePipe } from '@placeos/components'; +import { + DurationFieldComponent, + TimeFieldComponent, +} from '@placeos/form-fields'; + +import { parse as parseYaml, stringify as stringifyYaml } from 'yaml'; + @Component({ selector: 'auto-release-modal', template: ` @@ -236,7 +250,18 @@ import { map } from 'rxjs/operators'; } `, styles: [``], - standalone: false, + imports: [ + DurationFieldComponent, + MatProgressSpinnerModule, + MatRippleModule, + SettingsToggleComponent, + MatFormFieldModule, + MatSelectModule, + TimeFieldComponent, + FormsModule, + MatDialogModule, + TranslatePipe, + ], }) export class AutoReleaseSettingsModalComponent implements OnInit { private _id = inject(MAT_DIALOG_DATA); @@ -342,7 +367,7 @@ export class AutoReleaseSettingsModalComponent implements OnInit { if (!unencrypted) return; try { this.settings = - yaml.load(unencrypted.settings_string)?.auto_release || {}; + parseYaml(unencrypted.settings_string)?.auto_release || {}; } catch {} if (!this.settings.custom) this.settings.custom = []; for (const name of this.types) { @@ -356,9 +381,9 @@ export class AutoReleaseSettingsModalComponent implements OnInit { public async save() { this.loading.set(i18n('APP.CONCIERGE.AUTO_RELEASE_SAVING')); - const settings = await querySettings({ parent_id: this.id }) - .pipe(map((_) => _.data)) - .toPromise(); + const settings = await lastValueFrom( + querySettings({ parent_id: this.id }).pipe(map((_) => _.data)), + ); let unencrypted = settings.find( (_) => _.encryption_level === EncryptionLevel.None, ); @@ -373,9 +398,9 @@ export class AutoReleaseSettingsModalComponent implements OnInit { delete new_settings.custom; let old_settings = {}; try { - old_settings = yaml.load(unencrypted.settings_string) || {}; + old_settings = parseYaml(unencrypted.settings_string) || {}; } catch {} - (unencrypted as any).settings_string = yaml.dump({ + (unencrypted as any).settings_string = stringifyYaml({ ...old_settings, auto_release: new_settings, }); diff --git a/apps/concierge/src/app/building-manager/building-form.component.ts b/apps/concierge/src/app/building-manager/building-form.component.ts index efb199202b..1edba9b74e 100644 --- a/apps/concierge/src/app/building-manager/building-form.component.ts +++ b/apps/concierge/src/app/building-manager/building-form.component.ts @@ -1,3 +1,4 @@ +import { CommonModule } from '@angular/common'; import { Component, OnChanges, @@ -8,16 +9,27 @@ import { model, output, } from '@angular/core'; -import { FormControl, FormGroup, Validators } from '@angular/forms'; +import { + FormControl, + FormGroup, + ReactiveFormsModule, + Validators, +} from '@angular/forms'; +import { MatAutocompleteModule } from '@angular/material/autocomplete'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatSelectModule } from '@angular/material/select'; import { AsyncHandler, + Building, + OrganisationService, TIMEZONES_IANA, getInvalidFields, i18n, notifyError, notifySuccess, } from '@placeos/common'; -import { Building, OrganisationService } from '@placeos/organisation'; +import { IconComponent, TranslatePipe } from '@placeos/components'; import { addZone, authority, updateZone } from '@placeos/ts-client'; @Component({ @@ -107,7 +119,16 @@ import { addZone, authority, updateZone } from '@placeos/ts-client'; } `, styles: [``], - standalone: false, + imports: [ + CommonModule, + TranslatePipe, + IconComponent, + ReactiveFormsModule, + MatFormFieldModule, + MatAutocompleteModule, + MatSelectModule, + MatInputModule, + ], }) export class BuildingFormComponent extends AsyncHandler diff --git a/apps/concierge/src/app/building-manager/building-list.component.ts b/apps/concierge/src/app/building-manager/building-list.component.ts index 6e17b29292..a0d31c1f6c 100644 --- a/apps/concierge/src/app/building-manager/building-list.component.ts +++ b/apps/concierge/src/app/building-manager/building-list.component.ts @@ -4,6 +4,13 @@ import { MatDialog } from '@angular/material/dialog'; import { i18n, notifySuccess } from '@placeos/common'; import { BuildingManagementService } from './building-management.service'; +import { MatMenuModule } from '@angular/material/menu'; +import { + AuthenticatedImageDirective, + IconComponent, + SimpleTableComponent, + TranslatePipe, +} from '@placeos/components'; import { BookingPanelSettingsModalComponent } from '../ui/app-settings/booking-panel-settings-modal.component'; import { ConciergeSettingsFormModalComponent } from '../ui/app-settings/concierge-settings-form-modal.component'; import { VisitorKioskSettingsFormModalComponent } from '../ui/app-settings/visitor-kiosk-settings-form-modal.component'; @@ -239,7 +246,13 @@ import { WorkplaceSettingsFormModalComponent } from '../ui/app-settings/workplac `, styles: [``], - standalone: false, + imports: [ + SimpleTableComponent, + AuthenticatedImageDirective, + MatMenuModule, + TranslatePipe, + IconComponent, + ], }) export class BuildingListComponent { private _manager = inject(BuildingManagementService); diff --git a/apps/concierge/src/app/building-manager/building-management.service.ts b/apps/concierge/src/app/building-manager/building-management.service.ts index 0cc3d23a19..ba44786b0f 100644 --- a/apps/concierge/src/app/building-manager/building-management.service.ts +++ b/apps/concierge/src/app/building-manager/building-management.service.ts @@ -1,9 +1,14 @@ import { Injectable, inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; -import { i18n, notifyError, notifySuccess } from '@placeos/common'; -import { Building, OrganisationService } from '@placeos/organisation'; +import { + Building, + OrganisationService, + i18n, + notifyError, + notifySuccess, +} from '@placeos/common'; +import { openConfirmModal } from '@placeos/components'; import { PlaceZone, removeZone } from '@placeos/ts-client'; -import { openConfirmModal } from 'libs/components/src/lib/confirm-modal.component'; import { BehaviorSubject, combineLatest } from 'rxjs'; import { map } from 'rxjs/operators'; import { AppSettingsModalComponent } from '../ui/app-settings-modal.component'; diff --git a/apps/concierge/src/app/building-manager/building-manager.component.ts b/apps/concierge/src/app/building-manager/building-manager.component.ts index a85cd205d7..41180d8758 100644 --- a/apps/concierge/src/app/building-manager/building-manager.component.ts +++ b/apps/concierge/src/app/building-manager/building-manager.component.ts @@ -1,4 +1,9 @@ import { Component, inject } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; +import { TranslatePipe } from '@placeos/components'; +import { ApplicationSidebarComponent } from '../ui/app-sidebar.component'; +import { ApplicationTopbarComponent } from '../ui/app-topbar.component'; +import { BuildingListComponent } from './building-list.component'; import { BuildingManagementService } from './building-management.service'; @Component({ @@ -47,7 +52,13 @@ import { BuildingManagementService } from './building-management.service'; } `, ], - standalone: false, + imports: [ + BuildingListComponent, + ApplicationTopbarComponent, + ApplicationSidebarComponent, + MatRippleModule, + TranslatePipe, + ], }) export class BuildingManagerComponent { private _state = inject(BuildingManagementService); diff --git a/apps/concierge/src/app/building-manager/building-manager.module.ts b/apps/concierge/src/app/building-manager/building-manager.module.ts index 58cb1cc562..0b6df9c8ac 100644 --- a/apps/concierge/src/app/building-manager/building-manager.module.ts +++ b/apps/concierge/src/app/building-manager/building-manager.module.ts @@ -1,40 +1,12 @@ -import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FormsModule } from '@angular/forms'; import { Route, RouterModule } from '@angular/router'; -import { UIModule } from '../ui/ui.module'; - -import { SharedUsersModule } from '@placeos/users'; - -import { MatChipsModule } from '@angular/material/chips'; -import { AutoReleaseSettingsModalComponent } from './auto-release-settings-modal.component'; -import { BuildingFormComponent } from './building-form.component'; -import { BuildingListComponent } from './building-list.component'; import { BuildingManagerComponent } from './building-manager.component'; -import { BuildingModalComponent } from './building-modal.component'; -import { InductionSettingsModalComponent } from './induction-settings-modal.component'; -import { ItemListModalComponent } from './item-list-modal.component'; const ROUTES: Route[] = [{ path: '', component: BuildingManagerComponent }]; @NgModule({ - declarations: [ - BuildingManagerComponent, - BuildingListComponent, - BuildingFormComponent, - BuildingModalComponent, - AutoReleaseSettingsModalComponent, - InductionSettingsModalComponent, - ItemListModalComponent, - ], - imports: [ - CommonModule, - FormsModule, - UIModule, - SharedUsersModule, - MatChipsModule, - RouterModule.forChild(ROUTES), - ], + declarations: [], + imports: [BuildingManagerComponent, RouterModule.forChild(ROUTES)], }) export class BuildingManagerModule {} diff --git a/apps/concierge/src/app/building-manager/building-modal.component.ts b/apps/concierge/src/app/building-manager/building-modal.component.ts index 077285ae7e..0fc237ef9e 100644 --- a/apps/concierge/src/app/building-manager/building-modal.component.ts +++ b/apps/concierge/src/app/building-manager/building-modal.component.ts @@ -1,6 +1,10 @@ +import { CommonModule } from '@angular/common'; import { Component, inject } from '@angular/core'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import { Building } from '@placeos/organisation'; +import { Building } from '@placeos/common'; +import { TranslatePipe } from '@placeos/components'; +import { FullscreenModalShellComponent } from 'libs/components/src/lib/fullscreen-modal-shell.component'; +import { BuildingFormComponent } from './building-form.component'; @Component({ selector: 'building-modal', @@ -28,7 +32,12 @@ import { Building } from '@placeos/organisation'; `, styles: [``], - standalone: false, + imports: [ + CommonModule, + FullscreenModalShellComponent, + BuildingFormComponent, + TranslatePipe, + ], }) export class BuildingModalComponent { private _data = inject(MAT_DIALOG_DATA); diff --git a/apps/concierge/src/app/building-manager/induction-settings-modal.component.ts b/apps/concierge/src/app/building-manager/induction-settings-modal.component.ts index fc6605d72f..c42d980cc3 100644 --- a/apps/concierge/src/app/building-manager/induction-settings-modal.component.ts +++ b/apps/concierge/src/app/building-manager/induction-settings-modal.component.ts @@ -1,12 +1,26 @@ import { Component, OnInit, inject, signal } from '@angular/core'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { FormsModule } from '@angular/forms'; +import { MatRippleModule } from '@angular/material/core'; import { + MAT_DIALOG_DATA, + MatDialogModule, + MatDialogRef, +} from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { + OrganisationService, SettingsService, i18n, notifyError, notifySuccess, } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { + IconComponent, + SettingsToggleComponent, + TranslatePipe, +} from '@placeos/components'; import { showMetadata, updateMetadata } from '@placeos/ts-client'; import { lastValueFrom } from 'rxjs'; @@ -64,7 +78,17 @@ import { lastValueFrom } from 'rxjs'; } `, styles: [``], - standalone: false, + imports: [ + MatDialogModule, + IconComponent, + TranslatePipe, + MatRippleModule, + MatProgressSpinnerModule, + MatFormFieldModule, + MatInputModule, + SettingsToggleComponent, + FormsModule, + ], }) export class InductionSettingsModalComponent implements OnInit { private _zone_id = inject(MAT_DIALOG_DATA); diff --git a/apps/concierge/src/app/building-manager/item-list-modal.component.ts b/apps/concierge/src/app/building-manager/item-list-modal.component.ts index 1c46a36054..2852bca77d 100644 --- a/apps/concierge/src/app/building-manager/item-list-modal.component.ts +++ b/apps/concierge/src/app/building-manager/item-list-modal.component.ts @@ -1,6 +1,13 @@ import { Component, OnInit, inject } from '@angular/core'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { FormsModule } from '@angular/forms'; +import { MatRippleModule } from '@angular/material/core'; +import { + MAT_DIALOG_DATA, + MatDialogModule, + MatDialogRef, +} from '@angular/material/dialog'; import { SettingsService, notifyError } from '@placeos/common'; +import { IconComponent, TranslatePipe } from '@placeos/components'; import { showMetadata, updateMetadata } from '@placeos/ts-client'; @Component({ @@ -60,7 +67,14 @@ import { showMetadata, updateMetadata } from '@placeos/ts-client'; `, styles: [``], - standalone: false, + imports: [ + MatDialogModule, + MatRippleModule, + IconComponent, + MatRippleModule, + FormsModule, + TranslatePipe, + ], }) export class ItemListModalComponent implements OnInit { private _bld_id = inject(MAT_DIALOG_DATA); diff --git a/apps/concierge/src/app/catering/catering-topbar.component.ts b/apps/concierge/src/app/catering/catering-topbar.component.ts index 45821514e8..acd7827d08 100644 --- a/apps/concierge/src/app/catering/catering-topbar.component.ts +++ b/apps/concierge/src/app/catering/catering-topbar.component.ts @@ -2,7 +2,13 @@ import { Component, inject, OnInit } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { first, map } from 'rxjs/operators'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatRippleModule } from '@angular/material/core'; import { MatDialog } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatSelectModule } from '@angular/material/select'; +import { MatTooltipModule } from '@angular/material/tooltip'; import { CateringOrdersService, CateringStateService, @@ -12,11 +18,17 @@ import { AsyncHandler, nextValueFrom, notifySuccess, + OrganisationService, SettingsService, } from '@placeos/common'; -import { AvailableRoomsStateModalComponent } from '@placeos/components'; -import { OrganisationService } from '@placeos/organisation'; +import { + AvailableRoomsStateModalComponent, + IconComponent, + TranslatePipe, +} from '@placeos/components'; import { combineLatest } from 'rxjs'; +import { DateOptionsComponent } from '../ui/date-options.component'; +import { SearchbarComponent } from '../ui/searchbar.component'; @Component({ selector: 'catering-topbar', @@ -162,7 +174,18 @@ import { combineLatest } from 'rxjs'; } `, ], - standalone: false, + imports: [ + CommonModule, + DateOptionsComponent, + MatRippleModule, + IconComponent, + MatTooltipModule, + MatFormFieldModule, + MatSelectModule, + FormsModule, + SearchbarComponent, + TranslatePipe, + ], }) export class CateringTopbarComponent extends AsyncHandler implements OnInit { private _orders = inject(CateringOrdersService); diff --git a/apps/concierge/src/app/catering/catering.component.ts b/apps/concierge/src/app/catering/catering.component.ts index 3c6f97ea2b..a944d7e759 100644 --- a/apps/concierge/src/app/catering/catering.component.ts +++ b/apps/concierge/src/app/catering/catering.component.ts @@ -1,7 +1,17 @@ import { Component, OnInit, inject } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; +import { MatRippleModule } from '@angular/material/core'; +import { ActivatedRoute, RouterModule } from '@angular/router'; import { AsyncHandler } from '@placeos/common'; +import { + CateringMenuComponent, + CateringOrderListComponent, +} from '@placeos/catering'; +import { TranslatePipe } from '@placeos/components'; +import { ApplicationSidebarComponent } from '../ui/app-sidebar.component'; +import { ApplicationTopbarComponent } from '../ui/app-topbar.component'; +import { CateringTopbarComponent } from './catering-topbar.component'; + @Component({ selector: '[app-new-catering]', template: ` @@ -118,7 +128,16 @@ import { AsyncHandler } from '@placeos/common'; } `, ], - standalone: false, + imports: [ + ApplicationTopbarComponent, + ApplicationSidebarComponent, + MatRippleModule, + RouterModule, + CateringTopbarComponent, + TranslatePipe, + CateringOrderListComponent, + CateringMenuComponent, + ], }) export class CateringComponent extends AsyncHandler implements OnInit { private _route = inject(ActivatedRoute); diff --git a/apps/concierge/src/app/catering/catering.module.ts b/apps/concierge/src/app/catering/catering.module.ts index e98f31ccda..f1ca0eedf1 100644 --- a/apps/concierge/src/app/catering/catering.module.ts +++ b/apps/concierge/src/app/catering/catering.module.ts @@ -1,15 +1,6 @@ -import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FormsModule } from '@angular/forms'; import { Route, RouterModule } from '@angular/router'; -import { MatChipsModule } from '@angular/material/chips'; -import { MatTabsModule } from '@angular/material/tabs'; - -import { UIModule } from '../ui/ui.module'; - -import { SharedCateringModule } from '@placeos/catering'; -import { CateringTopbarComponent } from './catering-topbar.component'; import { CateringComponent } from './catering.component'; const ROUTES: Route[] = [ @@ -18,15 +9,7 @@ const ROUTES: Route[] = [ ]; @NgModule({ - declarations: [CateringComponent, CateringTopbarComponent], - imports: [ - CommonModule, - FormsModule, - UIModule, - MatTabsModule, - MatChipsModule, - SharedCateringModule, - RouterModule.forChild(ROUTES), - ], + declarations: [], + imports: [CateringComponent, RouterModule.forChild(ROUTES)], }) export class CateringModule {} diff --git a/apps/concierge/src/app/day-view/booking-modal.component.ts b/apps/concierge/src/app/day-view/booking-modal.component.ts index 240e3e309c..541ea3a0ea 100644 --- a/apps/concierge/src/app/day-view/booking-modal.component.ts +++ b/apps/concierge/src/app/day-view/booking-modal.component.ts @@ -2,13 +2,14 @@ import { Component, OnInit, inject, output } from '@angular/core'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { + CalendarEvent, DialogEvent, SettingsService, currentUser, notifyError, notifySuccess, } from '@placeos/common'; -import { CalendarEvent, EventFormService, queryEvents } from '@placeos/events'; +import { EventFormService, queryEvents } from '@placeos/events'; export interface BookingModalData { event?: CalendarEvent; diff --git a/apps/concierge/src/app/day-view/day-view.component.ts b/apps/concierge/src/app/day-view/day-view.component.ts index e1d9d4cd2c..c064b5add1 100644 --- a/apps/concierge/src/app/day-view/day-view.component.ts +++ b/apps/concierge/src/app/day-view/day-view.component.ts @@ -1,4 +1,7 @@ import { Component } from '@angular/core'; +import { ApplicationSidebarComponent } from '../ui/app-sidebar.component'; +import { ApplicationTopbarComponent } from '../ui/app-topbar.component'; +import { RoomBookingsComponent } from './room-bookings.component'; @Component({ selector: '[app-new-dayview]', @@ -28,6 +31,10 @@ import { Component } from '@angular/core'; } `, ], - standalone: false, + imports: [ + ApplicationTopbarComponent, + ApplicationSidebarComponent, + RoomBookingsComponent, + ], }) export class DayViewComponent {} diff --git a/apps/concierge/src/app/day-view/day-view.module.ts b/apps/concierge/src/app/day-view/day-view.module.ts index 4e70a7e9cf..784c1d55d5 100644 --- a/apps/concierge/src/app/day-view/day-view.module.ts +++ b/apps/concierge/src/app/day-view/day-view.module.ts @@ -1,27 +1,7 @@ -import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FormsModule } from '@angular/forms'; import { Route, RouterModule } from '@angular/router'; -import { UIModule } from '../ui/ui.module'; - -import { DayviewEventComponent } from './dayview-event.component'; -import { DayviewSpaceComponent } from './dayview-space.component'; -import { DayviewTimelineComponent } from './dayview-timeline.component'; -import { DayviewTopbarComponent } from './dayview-topbar.component'; - -import { SharedCateringModule } from '@placeos/catering'; -import { SharedUsersModule } from '@placeos/users'; -import { MeetingFormDetailsComponent } from 'apps/workplace/src/app/book/meeting-flow/meeting-form-details.component'; -import { BookingModalComponent } from './booking-modal.component'; import { DayViewComponent } from './day-view.component'; -import { EventBookModalComponent } from './event-book-modal.component'; -import { EventFormComponent } from './event-form.component'; -import { RoomBookingsApprovalsComponent } from './room-approvals.component'; -import { RoomBookingSearchComponent } from './room-booking-search.component'; -import { RoomBookingsComponent } from './room-bookings.component'; -import { RoomBookingsTimelineComponent } from './room-timeline.component'; -import { RoomWeekBookingsTimelineComponent } from './room-week-timeline.component'; const ROUTES: Route[] = [ { path: '', component: DayViewComponent }, @@ -29,31 +9,7 @@ const ROUTES: Route[] = [ ]; @NgModule({ - declarations: [ - DayviewTopbarComponent, - DayviewTimelineComponent, - DayviewSpaceComponent, - DayviewEventComponent, - DayViewComponent, - - BookingModalComponent, - EventFormComponent, - - RoomBookingsComponent, - RoomBookingsTimelineComponent, - RoomBookingsApprovalsComponent, - RoomBookingSearchComponent, - EventBookModalComponent, - MeetingFormDetailsComponent, - RoomWeekBookingsTimelineComponent, - ], - imports: [ - CommonModule, - FormsModule, - UIModule, - SharedUsersModule, - SharedCateringModule, - RouterModule.forChild(ROUTES), - ], + declarations: [], + imports: [DayViewComponent, RouterModule.forChild(ROUTES)], }) export class DayViewModule {} diff --git a/apps/concierge/src/app/day-view/dayview-event.component.ts b/apps/concierge/src/app/day-view/dayview-event.component.ts index a824e04a01..293be1d5fe 100644 --- a/apps/concierge/src/app/day-view/dayview-event.component.ts +++ b/apps/concierge/src/app/day-view/dayview-event.component.ts @@ -7,8 +7,7 @@ import { } from '@angular/core'; import { addMinutes, differenceInMinutes, format, startOfDay } from 'date-fns'; -import { SettingsService } from '@placeos/common'; -import { CalendarEvent } from '@placeos/events'; +import { CalendarEvent, SettingsService } from '@placeos/common'; import { EventsStateService } from './events-state.service'; const DAY_IN_MINUTES = 24 * 60; diff --git a/apps/concierge/src/app/day-view/dayview-space.component.ts b/apps/concierge/src/app/day-view/dayview-space.component.ts index dd2344824f..b9fa7fb891 100644 --- a/apps/concierge/src/app/day-view/dayview-space.component.ts +++ b/apps/concierge/src/app/day-view/dayview-space.component.ts @@ -1,8 +1,7 @@ import { Component, OnInit, inject, input } from '@angular/core'; +import { AsyncHandler, CalendarEvent, Space } from '@placeos/common'; import { map } from 'rxjs/operators'; -import { AsyncHandler } from '@placeos/common'; -import { CalendarEvent, Space } from '@placeos/events'; import { EventsStateService } from './events-state.service'; @Component({ diff --git a/apps/concierge/src/app/day-view/dayview-timeline.component.ts b/apps/concierge/src/app/day-view/dayview-timeline.component.ts index 45d48c8d19..25c433e0f1 100644 --- a/apps/concierge/src/app/day-view/dayview-timeline.component.ts +++ b/apps/concierge/src/app/day-view/dayview-timeline.component.ts @@ -1,4 +1,5 @@ import { Component, OnDestroy, OnInit, inject } from '@angular/core'; +import { AsyncHandler, OrganisationService, Space } from '@placeos/common'; import { querySystems } from '@placeos/ts-client'; import { combineLatest, of } from 'rxjs'; import { @@ -9,9 +10,6 @@ import { switchMap, } from 'rxjs/operators'; -import { AsyncHandler } from '@placeos/common'; -import { Space } from '@placeos/events'; -import { OrganisationService } from '@placeos/organisation'; import { EventsStateService } from './events-state.service'; const HOUR_BLOCKS = new Array(24).fill(0).map((_, idx) => { diff --git a/apps/concierge/src/app/day-view/dayview-topbar.component.ts b/apps/concierge/src/app/day-view/dayview-topbar.component.ts index c9fdfa60f8..db6a62d6b4 100644 --- a/apps/concierge/src/app/day-view/dayview-topbar.component.ts +++ b/apps/concierge/src/app/day-view/dayview-topbar.component.ts @@ -2,8 +2,12 @@ import { Component, inject } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { first } from 'rxjs/operators'; -import { AsyncHandler, Identity, SettingsService } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { + AsyncHandler, + Identity, + OrganisationService, + SettingsService, +} from '@placeos/common'; import { BookingUIOptions, EventsStateService } from './events-state.service'; @Component({ diff --git a/apps/concierge/src/app/day-view/event-book-modal.component.ts b/apps/concierge/src/app/day-view/event-book-modal.component.ts index 5049afcffc..b496e979bc 100644 --- a/apps/concierge/src/app/day-view/event-book-modal.component.ts +++ b/apps/concierge/src/app/day-view/event-book-modal.component.ts @@ -6,6 +6,7 @@ import { } from '@angular/material/dialog'; import { ANIMATION_SHOW_CONTRACT_EXPAND, + CalendarEvent, DialogEvent, SettingsService, currentUser, @@ -13,12 +14,33 @@ import { notifyError, notifySuccess, } from '@placeos/common'; -import { CalendarEvent, EventFormService } from '@placeos/events'; +import { EventFormService } from '@placeos/events'; import { FindAvailabilityModalComponent } from '@placeos/users'; -import { CateringOrderStateService } from 'libs/catering/src/lib/catering-order-modal/catering-order-state.service'; import { BehaviorSubject, combineLatest } from 'rxjs'; import { map, tap } from 'rxjs/operators'; +import { CommonModule } from '@angular/common'; +import { ReactiveFormsModule } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { AssetListFieldComponent } from '@placeos/assets'; +import { + CateringListFieldComponent, + CateringOrderStateService, +} from '@placeos/catering'; +import { + FullscreenModalShellComponent, + IconComponent, + TranslatePipe, +} from '@placeos/components'; +import { + RichTextInputComponent, + SpaceListFieldComponent, + UserListFieldComponent, +} from '@placeos/form-fields'; + +import { MeetingFormDetailsComponent } from 'apps/workplace/src/app/book/meeting-flow/meeting-form-details.component'; + @Component({ selector: 'event-book-modal', template: ` @@ -369,7 +391,21 @@ import { map, tap } from 'rxjs/operators'; `, styles: [``], animations: [ANIMATION_SHOW_CONTRACT_EXPAND], - standalone: false, + imports: [ + CommonModule, + FullscreenModalShellComponent, + RichTextInputComponent, + SpaceListFieldComponent, + AssetListFieldComponent, + CateringListFieldComponent, + MatFormFieldModule, + MatInputModule, + TranslatePipe, + IconComponent, + ReactiveFormsModule, + MeetingFormDetailsComponent, + UserListFieldComponent, + ], }) export class EventBookModalComponent implements OnInit { private _data = inject<{ diff --git a/apps/concierge/src/app/day-view/event-form.component.ts b/apps/concierge/src/app/day-view/event-form.component.ts index 588efbbde2..905cfd7149 100644 --- a/apps/concierge/src/app/day-view/event-form.component.ts +++ b/apps/concierge/src/app/day-view/event-form.component.ts @@ -1,8 +1,24 @@ +import { CommonModule } from '@angular/common'; import { Component, inject, input } from '@angular/core'; import { FormGroup } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatSelectModule } from '@angular/material/select'; +import { AssetListFieldComponent } from '@placeos/assets'; +import { + CateringListFieldComponent, + CateringOrderStateService, +} from '@placeos/catering'; import { SettingsService } from '@placeos/common'; -import { CateringOrderStateService } from 'libs/catering/src/lib/catering-order-modal/catering-order-state.service'; +import { + DateFieldComponent, + DurationFieldComponent, + SpaceListFieldComponent, + TimeFieldComponent, + UserListFieldComponent, + UserSearchFieldComponent, +} from '@placeos/form-fields'; import { BehaviorSubject, combineLatest } from 'rxjs'; import { map, tap } from 'rxjs/operators'; @@ -212,7 +228,20 @@ import { map, tap } from 'rxjs/operators'; } `, styles: [``], - standalone: false, + imports: [ + CommonModule, + MatFormFieldModule, + MatInputModule, + DateFieldComponent, + TimeFieldComponent, + DurationFieldComponent, + MatSelectModule, + UserListFieldComponent, + UserSearchFieldComponent, + SpaceListFieldComponent, + AssetListFieldComponent, + CateringListFieldComponent, + ], }) export class EventFormComponent { private _dialog = inject(MatDialog); diff --git a/apps/concierge/src/app/day-view/events-state.service.ts b/apps/concierge/src/app/day-view/events-state.service.ts index a146203317..67875aa6bf 100644 --- a/apps/concierge/src/app/day-view/events-state.service.ts +++ b/apps/concierge/src/app/day-view/events-state.service.ts @@ -1,5 +1,23 @@ import { Injectable, inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; +import { + AsyncHandler, + CalendarEvent, + OrganisationService, + SettingsService, + Space, + flatten, + getTimezoneDifferenceInHours, + i18n, + notifyError, + notifySuccess, + timePeriodsIntersect, +} from '@placeos/common'; +import { + declineEvent, + queryEvents, + requestSpacesForZone, +} from '@placeos/events'; import { addMinutes, endOfDay, @@ -24,26 +42,7 @@ import { tap, } from 'rxjs/operators'; -import { - AsyncHandler, - SettingsService, - flatten, - getTimezoneDifferenceInHours, - i18n, - notifyError, - notifySuccess, - timePeriodsIntersect, -} from '@placeos/common'; -import { - CalendarEvent, - Space, - declineEvent, - queryEvents, - requestSpacesForZone, -} from '@placeos/events'; -import { OrganisationService } from '@placeos/organisation'; - -import { openConfirmModal } from 'libs/components/src/lib/confirm-modal.component'; +import { openConfirmModal } from '@placeos/components'; import { EventBookModalComponent } from './event-book-modal.component'; export type BookingType = diff --git a/apps/concierge/src/app/day-view/room-approvals.component.ts b/apps/concierge/src/app/day-view/room-approvals.component.ts index 31fcfd8e5a..3d71996496 100644 --- a/apps/concierge/src/app/day-view/room-approvals.component.ts +++ b/apps/concierge/src/app/day-view/room-approvals.component.ts @@ -1,10 +1,26 @@ import { Component, inject, OnInit, signal } from '@angular/core'; -import { getTimezoneOffsetString, SettingsService } from '@placeos/common'; -import { CalendarEvent } from '@placeos/events'; -import { OrganisationService } from '@placeos/organisation'; +import { + CalendarEvent, + getTimezoneOffsetString, + OrganisationService, + SettingsService, +} from '@placeos/common'; import { BehaviorSubject, combineLatest } from 'rxjs'; import { map } from 'rxjs/operators'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { + AuthenticatedImageDirective, + BuildingPipe, + IconComponent, + LevelPipe, + TranslatePipe, +} from '@placeos/components'; +import { SpacePipe } from '@placeos/events'; import { EventsStateService } from './events-state.service'; @Component({ @@ -43,7 +59,7 @@ import { EventsStateService } from './events-state.service'; }}

-
+
-
+
@if (!(filtered_pending | async)?.length) {
@if (event.recurring_event_id) {
`, styles: [``], - standalone: false, + imports: [ + CommonModule, + UserPipe, + MatRippleModule, + FormsModule, + IconComponent, + TranslatePipe, + ], }) export class RoomBookingSearchComponent extends AsyncHandler implements OnInit { private _state = inject(EventsStateService); diff --git a/apps/concierge/src/app/day-view/room-bookings.component.ts b/apps/concierge/src/app/day-view/room-bookings.component.ts index 8a3ec4619e..104e791a7e 100644 --- a/apps/concierge/src/app/day-view/room-bookings.component.ts +++ b/apps/concierge/src/app/day-view/room-bookings.component.ts @@ -1,15 +1,30 @@ +import { CommonModule } from '@angular/common'; import { Component, inject, OnInit } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatRippleModule } from '@angular/material/core'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatSelectModule } from '@angular/material/select'; import { ActivatedRoute, Router } from '@angular/router'; import { AsyncHandler, i18n, nextValueFrom, + OrganisationService, SettingsService, } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { + IconComponent, + SettingsToggleComponent, + TranslatePipe, +} from '@placeos/components'; import { combineLatest } from 'rxjs'; import { debounceTime, filter, map } from 'rxjs/operators'; import { EventsStateService } from './events-state.service'; +import { RoomBookingsApprovalsComponent } from './room-approvals.component'; +import { RoomBookingsTimelineComponent } from './room-timeline.component'; +import { RoomWeekBookingsTimelineComponent } from './room-week-timeline.component'; const EMPTY = []; @Component({ @@ -146,8 +161,7 @@ const EMPTY = [];
@if ((period | async) === 'day') { - } - @if ((period | async) === 'week') { + } @else if ((period | async) === 'week') { @@ -159,7 +173,21 @@ const EMPTY = [];
`, styles: [``], - standalone: false, + imports: [ + CommonModule, + TranslatePipe, + MatFormFieldModule, + MatSelectModule, + MatMenuModule, + IconComponent, + MatRippleModule, + MatCheckboxModule, + FormsModule, + RoomBookingsTimelineComponent, + RoomWeekBookingsTimelineComponent, + RoomBookingsApprovalsComponent, + SettingsToggleComponent, + ], }) export class RoomBookingsComponent extends AsyncHandler implements OnInit { private _org = inject(OrganisationService); diff --git a/apps/concierge/src/app/day-view/room-timeline.component.ts b/apps/concierge/src/app/day-view/room-timeline.component.ts index a929fb9323..dbd68c2a2f 100644 --- a/apps/concierge/src/app/day-view/room-timeline.component.ts +++ b/apps/concierge/src/app/day-view/room-timeline.component.ts @@ -1,21 +1,24 @@ -import { DatePipe } from '@angular/common'; +import { CommonModule, DatePipe } from '@angular/common'; import { Component, OnInit, inject } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; import { MatDialog } from '@angular/material/dialog'; +import { MatTooltipModule } from '@angular/material/tooltip'; import { AsyncHandler, + CalendarEvent, + OrganisationService, SettingsService, getTimezoneDifferenceInHours, getTimezoneOffsetString, notifyError, notifySuccess, } from '@placeos/common'; +import { TranslatePipe, openConfirmModal } from '@placeos/components'; import { - CalendarEvent, EventDetailsModalComponent, SetupBreakdownModalComponent, declineEvent, } from '@placeos/events'; -import { OrganisationService } from '@placeos/organisation'; import { addHours, differenceInMinutes, @@ -25,10 +28,11 @@ import { startOfDay, startOfMinute, } from 'date-fns'; -import { openConfirmModal } from 'libs/components/src/lib/confirm-modal.component'; import { combineLatest } from 'rxjs'; import { debounceTime, map, shareReplay, startWith } from 'rxjs/operators'; +import { DateOptionsComponent } from '../ui/date-options.component'; import { EventsStateService } from './events-state.service'; +import { RoomBookingSearchComponent } from './room-booking-search.component'; @Component({ selector: 'room-bookings-timeline', @@ -239,7 +243,14 @@ import { EventsStateService } from './events-state.service'; } `, ], - standalone: false, + imports: [ + CommonModule, + DateOptionsComponent, + TranslatePipe, + RoomBookingSearchComponent, + MatRippleModule, + MatTooltipModule, + ], }) export class RoomBookingsTimelineComponent extends AsyncHandler diff --git a/apps/concierge/src/app/day-view/room-week-timeline.component.ts b/apps/concierge/src/app/day-view/room-week-timeline.component.ts index 34f8e68f14..3dcf5483ee 100644 --- a/apps/concierge/src/app/day-view/room-week-timeline.component.ts +++ b/apps/concierge/src/app/day-view/room-week-timeline.component.ts @@ -1,19 +1,22 @@ -import { DatePipe } from '@angular/common'; +import { CommonModule, DatePipe } from '@angular/common'; import { Component, inject, OnInit } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; import { MatDialog } from '@angular/material/dialog'; import { AsyncHandler, + CalendarEvent, getTimezoneOffsetInMinutes, getTimezoneOffsetString, i18n, + OrganisationService, SettingsService, } from '@placeos/common'; +import { TranslatePipe } from '@placeos/components'; import { - CalendarEvent, EventDetailsModalComponent, SetupBreakdownModalComponent, } from '@placeos/events'; -import { OrganisationService } from '@placeos/organisation'; +import { UserPipe } from '@placeos/users'; import { addDays, isSameDay, @@ -24,7 +27,9 @@ import { } from 'date-fns'; import { combineLatest, lastValueFrom } from 'rxjs'; import { map, shareReplay, startWith } from 'rxjs/operators'; +import { DateOptionsComponent } from '../ui/date-options.component'; import { EventsStateService } from './events-state.service'; +import { RoomBookingSearchComponent } from './room-booking-search.component'; @Component({ selector: 'room-week-bookings-timeline', @@ -188,7 +193,14 @@ import { EventsStateService } from './events-state.service'; } `, ], - standalone: false, + imports: [ + CommonModule, + MatRippleModule, + RoomBookingSearchComponent, + DateOptionsComponent, + TranslatePipe, + UserPipe, + ], }) export class RoomWeekBookingsTimelineComponent extends AsyncHandler diff --git a/apps/concierge/src/app/deals/deal-modal.component.ts b/apps/concierge/src/app/deals/deal-modal.component.ts index 355168a954..438ad9b652 100644 --- a/apps/concierge/src/app/deals/deal-modal.component.ts +++ b/apps/concierge/src/app/deals/deal-modal.component.ts @@ -7,9 +7,11 @@ import { MatDialogRef, } from '@angular/material/dialog'; import { RouterModule } from '@angular/router'; -import { AuthenticatedImageDirective } from 'libs/components/src/lib/authenticated-image.directive'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; -import { TranslatePipe } from 'libs/components/src/lib/translate.pipe'; +import { + AuthenticatedImageDirective, + IconComponent, + TranslatePipe, +} from '@placeos/components'; @Component({ selector: 'app-deal-modal', diff --git a/apps/concierge/src/app/deals/deals-list.component.ts b/apps/concierge/src/app/deals/deals-list.component.ts index b1b6d91c7b..07b21911bc 100644 --- a/apps/concierge/src/app/deals/deals-list.component.ts +++ b/apps/concierge/src/app/deals/deals-list.component.ts @@ -8,11 +8,13 @@ import { MatSelectModule } from '@angular/material/select'; import { MatTooltipModule } from '@angular/material/tooltip'; import { RouterModule } from '@angular/router'; import { Deal, unique } from '@placeos/common'; +import { + AuthenticatedImageDirective, + IconComponent, + SimpleTableComponent, + TranslatePipe, +} from '@placeos/components'; import { addMonths, endOfMonth, startOfDay } from 'date-fns'; -import { AuthenticatedImageDirective } from 'libs/components/src/lib/authenticated-image.directive'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; -import { SimpleTableComponent } from 'libs/components/src/lib/simple-table.component'; -import { TranslatePipe } from 'libs/components/src/lib/translate.pipe'; import { BehaviorSubject, combineLatest, map } from 'rxjs'; import { DealsService } from './deals.service'; diff --git a/apps/concierge/src/app/deals/deals-manage.component.ts b/apps/concierge/src/app/deals/deals-manage.component.ts index 9eac5073b4..dd99aa6b41 100644 --- a/apps/concierge/src/app/deals/deals-manage.component.ts +++ b/apps/concierge/src/app/deals/deals-manage.component.ts @@ -21,16 +21,15 @@ import { nextValueFrom, notifyError, notifySuccess, + OrganisationService, } from '@placeos/common'; import { DateFieldComponent } from '@placeos/form-fields'; -import { OrganisationService } from '@placeos/organisation'; import { addMonths } from 'date-fns'; import { UploadButtonComponent } from '../ui/app-settings/upload-button.component'; import { DealsService } from './deals.service'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; -import { TranslatePipe } from 'libs/components/src/lib/translate.pipe'; +import { IconComponent, TranslatePipe } from '@placeos/components'; @Component({ selector: `deals-manage`, diff --git a/apps/concierge/src/app/deals/deals.component.ts b/apps/concierge/src/app/deals/deals.component.ts index 1634af407b..5067ee5535 100644 --- a/apps/concierge/src/app/deals/deals.component.ts +++ b/apps/concierge/src/app/deals/deals.component.ts @@ -1,4 +1,7 @@ import { Component } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { ApplicationSidebarComponent } from '../ui/app-sidebar.component'; +import { ApplicationTopbarComponent } from '../ui/app-topbar.component'; @Component({ selector: '[app-deals]', @@ -22,6 +25,10 @@ import { Component } from '@angular/core'; } `, ], - standalone: false, + imports: [ + ApplicationTopbarComponent, + ApplicationSidebarComponent, + RouterModule, + ], }) export class DealsComponent {} diff --git a/apps/concierge/src/app/deals/deals.module.ts b/apps/concierge/src/app/deals/deals.module.ts index 054e819b5e..1f1b744980 100644 --- a/apps/concierge/src/app/deals/deals.module.ts +++ b/apps/concierge/src/app/deals/deals.module.ts @@ -1,10 +1,7 @@ -import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { Route, RouterModule } from '@angular/router'; import { DealsComponent } from './deals.component'; -import { UIModule } from '../ui/ui.module'; -import { DealModalComponent } from './deal-modal.component'; import { DealsListComponent } from './deals-list.component'; import { DealsManageComponent } from './deals-manage.component'; @@ -19,18 +16,12 @@ const ROUTES: Route[] = [ { path: '**', redirectTo: '' }, ]; -const COMPONENTS = [ - DealsListComponent, - DealsManageComponent, - DealModalComponent, -]; - @NgModule({ - declarations: [DealsComponent], + declarations: [], imports: [ - CommonModule, - UIModule, - ...COMPONENTS, + DealsListComponent, + DealsManageComponent, + DealsComponent, RouterModule.forChild(ROUTES), ], }) diff --git a/apps/concierge/src/app/deals/deals.service.ts b/apps/concierge/src/app/deals/deals.service.ts index 103c675bd4..4e64498983 100644 --- a/apps/concierge/src/app/deals/deals.service.ts +++ b/apps/concierge/src/app/deals/deals.service.ts @@ -1,9 +1,14 @@ import { inject, Injectable, signal } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; -import { AsyncHandler, Deal, i18n, randomString } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { + AsyncHandler, + Deal, + i18n, + OrganisationService, + randomString, +} from '@placeos/common'; +import { openConfirmModal } from '@placeos/components'; import { showMetadata, updateMetadata } from '@placeos/ts-client'; -import { openConfirmModal } from 'libs/components/src/lib/confirm-modal.component'; import { BehaviorSubject, catchError, diff --git a/apps/concierge/src/app/desks/desk-book-modal.component.ts b/apps/concierge/src/app/desks/desk-book-modal.component.ts index c37a3354ba..a395d46d7e 100644 --- a/apps/concierge/src/app/desks/desk-book-modal.component.ts +++ b/apps/concierge/src/app/desks/desk-book-modal.component.ts @@ -8,8 +8,15 @@ import { notifySuccess, SettingsService, } from '@placeos/common'; +import { + FullscreenModalShellComponent, + TranslatePipe, +} from '@placeos/components'; import { BehaviorSubject } from 'rxjs'; +import { CommonModule } from '@angular/common'; +import { NewDeskFormDetailsComponent } from 'apps/workplace/src/app/book/desk-flow/desk-form-details.component'; + @Component({ selector: 'desk-book-modal', template: ` @@ -31,7 +38,12 @@ import { BehaviorSubject } from 'rxjs'; `, styles: [``], - standalone: false, + imports: [ + CommonModule, + FullscreenModalShellComponent, + NewDeskFormDetailsComponent, + TranslatePipe, + ], }) export class DeskBookModalComponent { private _booking_form = inject(BookingFormService); diff --git a/apps/concierge/src/app/desks/desk-bookings.component.ts b/apps/concierge/src/app/desks/desk-bookings.component.ts index 67033283e2..6c7921dce6 100644 --- a/apps/concierge/src/app/desks/desk-bookings.component.ts +++ b/apps/concierge/src/app/desks/desk-bookings.component.ts @@ -1,6 +1,16 @@ import { Component, inject } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { MatRippleModule } from '@angular/material/core'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatTooltipModule } from '@angular/material/tooltip'; import { SettingsService } from '@placeos/common'; +import { + IconComponent, + SimpleTableComponent, + TranslatePipe, +} from '@placeos/components'; +import { UserPipe } from '@placeos/users'; import { DesksStateService } from './desks-state.service'; @Component({ @@ -301,7 +311,16 @@ import { DesksStateService } from './desks-state.service'; } `, ], - standalone: false, + imports: [ + CommonModule, + TranslatePipe, + MatRippleModule, + MatMenuModule, + IconComponent, + MatTooltipModule, + SimpleTableComponent, + UserPipe, + ], }) export class DeskBookingsComponent { private _state = inject(DesksStateService); diff --git a/apps/concierge/src/app/desks/desk-map-view.component.ts b/apps/concierge/src/app/desks/desk-map-view.component.ts index 2f5971f0db..51bab83b4f 100644 --- a/apps/concierge/src/app/desks/desk-map-view.component.ts +++ b/apps/concierge/src/app/desks/desk-map-view.component.ts @@ -1,8 +1,15 @@ import { Component, OnInit, inject } from '@angular/core'; -import { ExploreDesksService, ExploreStateService } from '@placeos/explore'; +import { + ExploreDesksService, + ExploreStateService, + ExploreZoomControlComponent, +} from '@placeos/explore'; -import { AsyncHandler } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { AsyncHandler, OrganisationService } from '@placeos/common'; +import { InteractiveMapComponent } from '@placeos/components'; +import { UserSearchFieldComponent } from '@placeos/form-fields'; import { DesksStateService } from './desks-state.service'; @Component({ @@ -53,7 +60,13 @@ import { DesksStateService } from './desks-state.service'; `, ], providers: [ExploreDesksService], - standalone: false, + imports: [ + CommonModule, + InteractiveMapComponent, + ExploreZoomControlComponent, + UserSearchFieldComponent, + FormsModule, + ], }) export class DeskMapViewComponent extends AsyncHandler implements OnInit { private _state = inject(ExploreStateService); diff --git a/apps/concierge/src/app/desks/desk-modal.component.ts b/apps/concierge/src/app/desks/desk-modal.component.ts index 9723e3e309..9b99f7fd9b 100644 --- a/apps/concierge/src/app/desks/desk-modal.component.ts +++ b/apps/concierge/src/app/desks/desk-modal.component.ts @@ -1,13 +1,38 @@ import { Component, EventEmitter, inject, OnInit, Output } from '@angular/core'; -import { FormControl, FormGroup, Validators } from '@angular/forms'; +import { + FormControl, + FormGroup, + ReactiveFormsModule, + Validators, +} from '@angular/forms'; +import { MatRippleModule } from '@angular/material/core'; import { MAT_DIALOG_DATA, MatDialog, + MatDialogModule, MatDialogRef, } from '@angular/material/dialog'; -import { DialogEvent, notifyInfo, randomString, unique } from '@placeos/common'; -import { Desk, OrganisationService } from '@placeos/organisation'; -import { showStaff, User } from '@placeos/users'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { + Desk, + DialogEvent, + notifyInfo, + OrganisationService, + randomString, + unique, + User, +} from '@placeos/common'; +import { + IconComponent, + SettingsToggleComponent, + TranslatePipe, +} from '@placeos/components'; +import { UserSearchFieldComponent } from '@placeos/form-fields'; +import { showStaff } from '@placeos/users'; +import { ItemListFieldComponent } from 'libs/form-fields/src/lib/item-list-field.component'; import { lastValueFrom } from 'rxjs'; import { SelectMapItemModalComponent } from '../ui/select-map-item-modal.component'; @@ -56,7 +81,7 @@ const CHARS = '0123456789ABCDEF'; }}
-
+
`, styles: [``], - standalone: false, + imports: [ + MatDialogModule, + TranslatePipe, + IconComponent, + MatRippleModule, + MatFormFieldModule, + MatInputModule, + ReactiveFormsModule, + MatProgressSpinnerModule, + ItemListFieldComponent, + SettingsToggleComponent, + UserSearchFieldComponent, + MatTooltipModule, + ], }) export class DeskModalComponent implements OnInit { private _data = inject<{ diff --git a/apps/concierge/src/app/desks/desk-qr-code-modal.component.ts b/apps/concierge/src/app/desks/desk-qr-code-modal.component.ts index b5c0823c4d..744430da71 100644 --- a/apps/concierge/src/app/desks/desk-qr-code-modal.component.ts +++ b/apps/concierge/src/app/desks/desk-qr-code-modal.component.ts @@ -2,7 +2,11 @@ import { Component, inject } from '@angular/core'; import { SettingsService } from '@placeos/common'; import { DesksStateService } from './desks-state.service'; -import { generateQRCode } from 'libs/common/src/lib/qr-code'; +import { CommonModule } from '@angular/common'; +import { MatRippleModule } from '@angular/material/core'; +import { MatDialogModule } from '@angular/material/dialog'; +import { generateQRCode } from '@placeos/common'; +import { IconComponent, SafePipe, TranslatePipe } from '@placeos/components'; import { map } from 'rxjs/operators'; @Component({ @@ -45,7 +49,14 @@ import { map } from 'rxjs/operators';
`, styles: [``], - standalone: false, + imports: [ + CommonModule, + MatDialogModule, + MatRippleModule, + TranslatePipe, + IconComponent, + SafePipe, + ], }) export class DeskQrCodeModalComponent { private _settings = inject(SettingsService); diff --git a/apps/concierge/src/app/desks/desks-manage.component.ts b/apps/concierge/src/app/desks/desks-manage.component.ts index 5c26f40efd..080677a0ef 100644 --- a/apps/concierge/src/app/desks/desks-manage.component.ts +++ b/apps/concierge/src/app/desks/desks-manage.component.ts @@ -1,21 +1,34 @@ import { Clipboard } from '@angular/cdk/clipboard'; +import { CommonModule } from '@angular/common'; import { Component, ElementRef, inject } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; import { MatDialog } from '@angular/material/dialog'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { MatTooltipModule } from '@angular/material/tooltip'; import { AsyncHandler, - SettingsService, csvToJson, + Desk, + generateQRCode, i18n, loadTextFileFromInputEvent, nextValueFrom, notifyError, notifySuccess, + OrganisationService, randomInt, + SettingsService, } from '@placeos/common'; -import { Desk, OrganisationService } from '@placeos/organisation'; +import { + CustomTooltipComponent, + IconComponent, + openConfirmModal, + PrintableComponent, + SafePipe, + SimpleTableComponent, + TranslatePipe, +} from '@placeos/components'; import { updateMetadata } from '@placeos/ts-client'; -import { generateQRCode } from 'libs/common/src/lib/qr-code'; -import { openConfirmModal } from 'libs/components/src/lib/confirm-modal.component'; import { DesksStateService } from './desks-state.service'; const QR_CODES = {}; @@ -168,20 +181,22 @@ const QR_CODES = {};
-
- - - -
- {{ row.name || row.id }} -
+
+ + + + +
+ {{ row.name || row.id }} +
+
`, styles: [``], - standalone: false, + imports: [ + CommonModule, + TranslatePipe, + IconComponent, + SimpleTableComponent, + RouterModule, + MatMenuModule, + BuildingPipe, + ], }) export class EmailTemplatesListComponent { private _state = inject(EmailTemplatesStateService); diff --git a/apps/concierge/src/app/email-templates/email-templates-state.service.ts b/apps/concierge/src/app/email-templates/email-templates-state.service.ts index d232d5dc46..e4b6587b38 100644 --- a/apps/concierge/src/app/email-templates/email-templates-state.service.ts +++ b/apps/concierge/src/app/email-templates/email-templates-state.service.ts @@ -5,11 +5,11 @@ import { nextValueFrom, notifyError, notifySuccess, + OrganisationService, randomString, SettingsService, unique, } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; import { PlaceMetadata, showMetadata, diff --git a/apps/concierge/src/app/email-templates/email-templates.component.ts b/apps/concierge/src/app/email-templates/email-templates.component.ts index 71002d55fe..eba5c54210 100644 --- a/apps/concierge/src/app/email-templates/email-templates.component.ts +++ b/apps/concierge/src/app/email-templates/email-templates.component.ts @@ -1,4 +1,7 @@ import { Component } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { ApplicationSidebarComponent } from '../ui/app-sidebar.component'; +import { ApplicationTopbarComponent } from '../ui/app-topbar.component'; @Component({ selector: '[app-email-templates]', @@ -22,6 +25,10 @@ import { Component } from '@angular/core'; } `, ], - standalone: false, + imports: [ + ApplicationTopbarComponent, + ApplicationSidebarComponent, + RouterModule, + ], }) export class EmailTemplatesComponent {} diff --git a/apps/concierge/src/app/email-templates/email-templates.module.ts b/apps/concierge/src/app/email-templates/email-templates.module.ts index 471fdec342..bcfae9cac4 100644 --- a/apps/concierge/src/app/email-templates/email-templates.module.ts +++ b/apps/concierge/src/app/email-templates/email-templates.module.ts @@ -1,13 +1,6 @@ -import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FormsModule } from '@angular/forms'; import { Route, RouterModule } from '@angular/router'; -import { SharedBookingsModule } from '@placeos/bookings'; -import { FormFieldsModule } from '@placeos/form-fields'; - -import { UIModule } from '../ui/ui.module'; - import { EmailTemplateManageComponent } from './email-template-manage.component'; import { EmailTemplatesListComponent } from './email-templates-list.component'; import { EmailTemplatesComponent } from './email-templates.component'; @@ -24,17 +17,11 @@ const ROUTES: Route[] = [ ]; @NgModule({ - declarations: [ + declarations: [], + imports: [ EmailTemplatesComponent, EmailTemplatesListComponent, EmailTemplateManageComponent, - ], - imports: [ - CommonModule, - FormsModule, - UIModule, - SharedBookingsModule, - FormFieldsModule, RouterModule.forChild(ROUTES), ], }) diff --git a/apps/concierge/src/app/events/event-calendar.component.ts b/apps/concierge/src/app/events/event-calendar.component.ts index 7b453d53fe..55a293aa90 100644 --- a/apps/concierge/src/app/events/event-calendar.component.ts +++ b/apps/concierge/src/app/events/event-calendar.component.ts @@ -1,9 +1,14 @@ +import { CommonModule } from '@angular/common'; import { Component, inject } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; import { ActivatedRoute, Router } from '@angular/router'; import { nextValueFrom, SettingsService } from '@placeos/common'; +import { IconComponent, TranslatePipe } from '@placeos/components'; import { addMonths, addWeeks, format } from 'date-fns'; import { map, shareReplay } from 'rxjs/operators'; +import { EventMonthViewComponent } from './event-month-view.component'; import { EventStateService } from './event-state.service'; +import { EventWeekViewComponent } from './event-week-view.component'; @Component({ selector: 'event-calendar', @@ -70,7 +75,14 @@ import { EventStateService } from './event-state.service'; } `, ], - standalone: false, + imports: [ + CommonModule, + TranslatePipe, + MatRippleModule, + EventWeekViewComponent, + EventMonthViewComponent, + IconComponent, + ], }) export class EventCalendarComponent { private _settings = inject(SettingsService); diff --git a/apps/concierge/src/app/events/event-listing.component.ts b/apps/concierge/src/app/events/event-listing.component.ts index 738de269cd..c897085c7f 100644 --- a/apps/concierge/src/app/events/event-listing.component.ts +++ b/apps/concierge/src/app/events/event-listing.component.ts @@ -1,7 +1,20 @@ +import { CommonModule } from '@angular/common'; import { Component, inject } from '@angular/core'; -import { SettingsService } from '@placeos/common'; -import { CalendarEvent } from '@placeos/events'; -import { User } from '@placeos/users'; +import { MatRippleModule } from '@angular/material/core'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { RouterModule } from '@angular/router'; +import { CalendarEvent, SettingsService, User } from '@placeos/common'; +import { + AuthenticatedImageDirective, + BuildingPipe, + IconComponent, + LevelPipe, + SimpleTableComponent, + TranslatePipe, +} from '@placeos/components'; +import { SpacePipe } from '@placeos/events'; +import { AttendeeListComponent } from 'libs/events/src/lib/attendee-list.component'; import { EventStateService } from './event-state.service'; @Component({ @@ -289,7 +302,21 @@ import { EventStateService } from './event-state.service';
`, styles: [``], - standalone: false, + imports: [ + CommonModule, + SimpleTableComponent, + SpacePipe, + IconComponent, + MatMenuModule, + RouterModule, + MatRippleModule, + TranslatePipe, + AttendeeListComponent, + MatProgressBarModule, + AuthenticatedImageDirective, + LevelPipe, + BuildingPipe, + ], }) export class EventListingComponent { private _settings = inject(SettingsService); diff --git a/apps/concierge/src/app/events/event-manage.component.ts b/apps/concierge/src/app/events/event-manage.component.ts index 8440fe1091..f92ab7b410 100644 --- a/apps/concierge/src/app/events/event-manage.component.ts +++ b/apps/concierge/src/app/events/event-manage.component.ts @@ -1,10 +1,24 @@ import { COMMA, ENTER, SPACE } from '@angular/cdk/keycodes'; +import { CommonModule } from '@angular/common'; import { Component, OnInit, inject, signal } from '@angular/core'; -import { MatChipInputEvent } from '@angular/material/chips'; -import { ActivatedRoute, Router } from '@angular/router'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatAutocompleteModule } from '@angular/material/autocomplete'; +import { MatChipInputEvent, MatChipsModule } from '@angular/material/chips'; +import { MatRippleModule } from '@angular/material/core'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { MatSelectModule } from '@angular/material/select'; +import { ActivatedRoute, Router, RouterModule } from '@angular/router'; import { AsyncHandler, + Building, + BuildingLevel, + CalendarEvent, + OrganisationService, SettingsService, + Space, + StaffUser, TIMEZONES_IANA, currentUser, firstTruthyValueFrom, @@ -14,19 +28,23 @@ import { unique, } from '@placeos/common'; import { - CalendarEvent, + IconComponent, + SettingsToggleComponent, + TranslatePipe, +} from '@placeos/components'; +import { EventFormService, - Space, SpacePipe, showEvent, showEventMetadata, } from '@placeos/events'; import { - Building, - BuildingLevel, - OrganisationService, -} from '@placeos/organisation'; -import { StaffUser } from '@placeos/users'; + DateFieldComponent, + ImageListFieldComponent, + RichTextInputComponent, + TimeFieldComponent, + UserSearchFieldComponent, +} from '@placeos/form-fields'; import { differenceInMinutes, format, startOfDay } from 'date-fns'; import { lastValueFrom } from 'rxjs'; import { EventStateService } from './event-state.service'; @@ -67,395 +85,364 @@ const EMPTY = []; - - + + + + {{ 'FORM.TITLE_ERROR' | translate }} + + + +
+ +
+ + + + @for (tag of tag_list; track tag) { + + {{ tag }} + close + + } - - {{ 'FORM.TITLE_ERROR' | translate }} - - - +
+
+ -
- -
- - + - - @for (tag of tag_list; track tag) { - - {{ tag }} - close - - } - - - -
- - - - -
- +
+

{{ 'APP.CONCIERGE.EVENTS_DATE_TIME' | translate }}

- -
-
-
`, styles: [``], - standalone: false, + imports: [ + CommonModule, + TranslatePipe, + IconComponent, + MatRippleModule, + MatDialogModule, + MatProgressSpinnerModule, + MatFormFieldModule, + MatSelectModule, + MatInputModule, + MatChipsModule, + CounterComponent, + FormsModule, + ReactiveFormsModule, + ], }) export class LockerBankModalComponent { private _data = inject(MAT_DIALOG_DATA); diff --git a/apps/concierge/src/app/lockers/locker-booking-modal.component.ts b/apps/concierge/src/app/lockers/locker-booking-modal.component.ts index 534920e444..874c905e2f 100644 --- a/apps/concierge/src/app/lockers/locker-booking-modal.component.ts +++ b/apps/concierge/src/app/lockers/locker-booking-modal.component.ts @@ -1,22 +1,40 @@ import { Component, inject, OnInit } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatCheckboxModule } from '@angular/material/checkbox'; import { MAT_DIALOG_DATA, MatDialog, MatDialogRef, } from '@angular/material/dialog'; -import { Booking, BookingFormService, Locker } from '@placeos/bookings'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { + BookingFormService, + Locker, + LockerListFieldComponent, +} from '@placeos/bookings'; import { AsyncHandler, + Booking, + BuildingLevel, currentUser, getInvalidFields, i18n, notifyError, notifySuccess, + OrganisationService, SettingsService, + User, } from '@placeos/common'; -import { BuildingLevel, OrganisationService } from '@placeos/organisation'; -import { User } from '@placeos/users'; +import { TranslatePipe } from '@placeos/components'; +import { + DateFieldComponent, + DurationFieldComponent, + TimeFieldComponent, + UserSearchFieldComponent, +} from '@placeos/form-fields'; import { addDays, endOfDay } from 'date-fns'; +import { FullscreenModalShellComponent } from 'libs/components/src/lib/fullscreen-modal-shell.component'; import { combineLatest } from 'rxjs'; @Component({ @@ -141,7 +159,20 @@ import { combineLatest } from 'rxjs'; `, styles: [``], - standalone: false, + imports: [ + TranslatePipe, + FullscreenModalShellComponent, + LockerListFieldComponent, + DurationFieldComponent, + TimeFieldComponent, + MatCheckboxModule, + DateFieldComponent, + MatFormFieldModule, + MatInputModule, + UserSearchFieldComponent, + ReactiveFormsModule, + FormsModule, + ], }) export class LockerBookingModalComponent extends AsyncHandler diff --git a/apps/concierge/src/app/lockers/locker-bookings.component.ts b/apps/concierge/src/app/lockers/locker-bookings.component.ts index 381428e807..1cad662b68 100644 --- a/apps/concierge/src/app/lockers/locker-bookings.component.ts +++ b/apps/concierge/src/app/lockers/locker-bookings.component.ts @@ -1,6 +1,15 @@ import { Component, inject } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { MatRippleModule } from '@angular/material/core'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatTooltipModule } from '@angular/material/tooltip'; import { SettingsService } from '@placeos/common'; +import { + IconComponent, + SimpleTableComponent, + TranslatePipe, +} from '@placeos/components'; import { map } from 'rxjs/operators'; import { LockerStateService } from './locker-state.service'; @@ -250,7 +259,15 @@ import { LockerStateService } from './locker-state.service'; } `, ], - standalone: false, + imports: [ + CommonModule, + MatRippleModule, + MatMenuModule, + MatTooltipModule, + IconComponent, + TranslatePipe, + SimpleTableComponent, + ], }) export class LockerBookingsComponent { private _state = inject(LockerStateService); diff --git a/apps/concierge/src/app/lockers/locker-list.component.ts b/apps/concierge/src/app/lockers/locker-list.component.ts index 87ccd05094..4caacb12ef 100644 --- a/apps/concierge/src/app/lockers/locker-list.component.ts +++ b/apps/concierge/src/app/lockers/locker-list.component.ts @@ -1,7 +1,17 @@ import { Clipboard } from '@angular/cdk/clipboard'; +import { CommonModule } from '@angular/common'; import { Component, OnInit, inject } from '@angular/core'; -import { Booking, Locker } from '@placeos/bookings'; -import { AsyncHandler, i18n, notifySuccess } from '@placeos/common'; +import { MatRippleModule } from '@angular/material/core'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { Locker } from '@placeos/bookings'; +import { AsyncHandler, Booking, i18n, notifySuccess } from '@placeos/common'; +import { + IconComponent, + SimpleTableComponent, + TranslatePipe, +} from '@placeos/components'; import { combineLatest } from 'rxjs'; import { LockerStateService } from './locker-state.service'; @@ -128,7 +138,6 @@ import { LockerStateService } from './locker-state.service'; }} -
@@ -326,7 +335,16 @@ import { LockerStateService } from './locker-state.service'; `, styles: [], - standalone: false, + imports: [ + CommonModule, + MatMenuModule, + IconComponent, + MatRippleModule, + MatTooltipModule, + TranslatePipe, + SimpleTableComponent, + MatProgressBarModule, + ], }) export class LockerListComponent extends AsyncHandler implements OnInit { private _state = inject(LockerStateService); diff --git a/apps/concierge/src/app/lockers/locker-modal.component.ts b/apps/concierge/src/app/lockers/locker-modal.component.ts index dec49f8c2b..82c4731aeb 100644 --- a/apps/concierge/src/app/lockers/locker-modal.component.ts +++ b/apps/concierge/src/app/lockers/locker-modal.component.ts @@ -3,16 +3,28 @@ import { AbstractControl, FormControl, FormGroup, + FormsModule, Validators, } from '@angular/forms'; +import { MatChipsModule } from '@angular/material/chips'; +import { MatRippleModule } from '@angular/material/core'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { Locker, LockerBank } from '@placeos/bookings'; -import { AsyncHandler, DialogEvent } from '@placeos/common'; -import { showStaff, User } from '@placeos/users'; +import { AsyncHandler, DialogEvent, User } from '@placeos/common'; +import { + IconComponent, + SettingsToggleComponent, + TranslatePipe, +} from '@placeos/components'; import { addChipItem, + CounterComponent, removeChipItem, -} from 'libs/form-fields/src/lib/item-list-field.component'; +} from '@placeos/form-fields'; +import { showStaff } from '@placeos/users'; type Box = [number, number, number, number]; @@ -262,7 +274,18 @@ function validateNoOverlap(box: Box, check_boxes: Box[]): boolean {
`, styles: [``], - standalone: false, + imports: [ + TranslatePipe, + IconComponent, + MatRippleModule, + MatProgressSpinnerModule, + MatFormFieldModule, + MatChipsModule, + MatInputModule, + CounterComponent, + FormsModule, + SettingsToggleComponent, + ], }) export class LockerModalComponent extends AsyncHandler implements OnInit { private _data = inject<{ diff --git a/apps/concierge/src/app/lockers/locker-state.service.ts b/apps/concierge/src/app/lockers/locker-state.service.ts index 3cbb15c8a3..45f4fcc55a 100644 --- a/apps/concierge/src/app/lockers/locker-state.service.ts +++ b/apps/concierge/src/app/lockers/locker-state.service.ts @@ -1,21 +1,7 @@ import { inject, Injectable } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; -import { addHours, endOfDay, getUnixTime, set, startOfDay } from 'date-fns'; -import { BehaviorSubject, combineLatest, Observable, of, Subject } from 'rxjs'; -import { - debounceTime, - distinctUntilChanged, - first, - map, - scan, - shareReplay, - switchMap, - tap, -} from 'rxjs/operators'; - import { approveBooking, - Booking, checkinBooking, loadLockerBanks, loadLockers, @@ -23,29 +9,42 @@ import { LockerBank, queryBookings, queryPagedBookings, - RecurrenceDays, rejectBooking, removeBooking, saveBooking, } from '@placeos/bookings'; import { AsyncHandler, + Booking, i18n, nextValueFrom, notifyError, notifyInfo, notifySuccess, + OrganisationService, randomInt, + RecurrenceDays, SettingsService, + StaffUser, unique, + User, } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; - import { QueryResponse, updateMetadata } from '@placeos/ts-client'; -import { StaffUser } from '@placeos/users'; -import { User } from '@sentry/angular'; -import { openConfirmModal } from 'libs/components/src/lib/confirm-modal.component'; -import { SelectUserModalComponent } from 'libs/users/src/lib/select-user-modal.component'; +import { addHours, endOfDay, getUnixTime, set, startOfDay } from 'date-fns'; +import { BehaviorSubject, combineLatest, Observable, of, Subject } from 'rxjs'; +import { + debounceTime, + distinctUntilChanged, + first, + map, + scan, + shareReplay, + switchMap, + tap, +} from 'rxjs/operators'; + +import { openConfirmModal } from '@placeos/components'; +import { SelectUserModalComponent } from '@placeos/users'; import { LockerBankModalComponent } from './locker-bank-modal.component'; import { LockerBookingModalComponent } from './locker-booking-modal.component'; import { LockerModalComponent } from './locker-modal.component'; diff --git a/apps/concierge/src/app/lockers/locker-topbar.component.ts b/apps/concierge/src/app/lockers/locker-topbar.component.ts index 469c778be8..f53a91ad6e 100644 --- a/apps/concierge/src/app/lockers/locker-topbar.component.ts +++ b/apps/concierge/src/app/lockers/locker-topbar.component.ts @@ -5,13 +5,22 @@ import { AsyncHandler, firstTruthyValueFrom, nextValueFrom, + OrganisationService, SettingsService, } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatRippleModule } from '@angular/material/core'; import { MatDialog } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatSelectModule } from '@angular/material/select'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { IconComponent, TranslatePipe } from '@placeos/components'; import { lastValueFrom, timer } from 'rxjs'; import { BookingRulesModalComponent } from '../ui/booking-rules-modal.component'; +import { DateOptionsComponent } from '../ui/date-options.component'; +import { SearchbarComponent } from '../ui/searchbar.component'; import { LockerStateService } from './locker-state.service'; @Component({ @@ -142,7 +151,18 @@ import { LockerStateService } from './locker-state.service'; } `, ], - standalone: false, + imports: [ + CommonModule, + DateOptionsComponent, + IconComponent, + MatRippleModule, + MatTooltipModule, + MatFormFieldModule, + MatSelectModule, + FormsModule, + SearchbarComponent, + TranslatePipe, + ], }) export class LockersTopbarComponent extends AsyncHandler implements OnInit { private _state = inject(LockerStateService); diff --git a/apps/concierge/src/app/lockers/lockers.component.ts b/apps/concierge/src/app/lockers/lockers.component.ts index 04836950d6..ff89ab94e5 100644 --- a/apps/concierge/src/app/lockers/lockers.component.ts +++ b/apps/concierge/src/app/lockers/lockers.component.ts @@ -1,10 +1,20 @@ import { Component, OnInit, inject, signal } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; -import { ActivatedRoute, NavigationEnd, Router } from '@angular/router'; +import { + ActivatedRoute, + NavigationEnd, + Router, + RouterModule, +} from '@angular/router'; import { AsyncHandler, SettingsService } from '@placeos/common'; import { LockerStateService } from './locker-state.service'; +import { CommonModule } from '@angular/common'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { ApplicationSidebarComponent } from '../ui/app-sidebar.component'; +import { ApplicationTopbarComponent } from '../ui/app-topbar.component'; import { BookingRulesModalComponent } from '../ui/booking-rules-modal.component'; +import { LockersTopbarComponent } from './locker-topbar.component'; @Component({ selector: '[app-new-lockers]', @@ -39,7 +49,14 @@ import { BookingRulesModalComponent } from '../ui/booking-rules-modal.component' } `, ], - standalone: false, + imports: [ + CommonModule, + ApplicationTopbarComponent, + ApplicationSidebarComponent, + LockersTopbarComponent, + RouterModule, + MatProgressBarModule, + ], }) export class LockersComponent extends AsyncHandler implements OnInit { private _state = inject(LockerStateService); diff --git a/apps/concierge/src/app/lockers/lockers.module.ts b/apps/concierge/src/app/lockers/lockers.module.ts index 31ab851768..2a3645f33a 100644 --- a/apps/concierge/src/app/lockers/lockers.module.ts +++ b/apps/concierge/src/app/lockers/lockers.module.ts @@ -1,28 +1,10 @@ -import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { Route, RouterModule } from '@angular/router'; -import { MatRadioModule } from '@angular/material/radio'; -import { MatTabsModule } from '@angular/material/tabs'; - -import { SharedExploreModule } from '@placeos/explore'; -import { UIModule } from '../ui/ui.module'; - -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; import { LockerBookingsComponent } from './locker-bookings.component'; -import { LockersTopbarComponent } from './locker-topbar.component'; -import { SharedBookingsModule } from '@placeos/bookings'; -import { FormFieldsModule } from '@placeos/form-fields'; -import { LockerBankModalComponent } from './locker-bank-modal.component'; -import { LockerBookingModalComponent } from './locker-booking-modal.component'; import { LockerListComponent } from './locker-list.component'; -import { LockerModalComponent } from './locker-modal.component'; import { LockersComponent } from './lockers.component'; -import { ViewLockerBankModalComponent } from './view-locker-bank-modal.component'; const ROUTES: Route[] = [ { @@ -37,29 +19,11 @@ const ROUTES: Route[] = [ ]; @NgModule({ - declarations: [ + declarations: [], + imports: [ LockersComponent, LockerBookingsComponent, - LockersTopbarComponent, LockerListComponent, - LockerModalComponent, - LockerBookingModalComponent, - LockerBankModalComponent, - ViewLockerBankModalComponent, - ], - imports: [ - CommonModule, - FormsModule, - MatTabsModule, - ReactiveFormsModule, - UIModule, - SharedExploreModule, - SharedBookingsModule, - FormFieldsModule, - MatRadioModule, - MatFormFieldModule, - MatCheckboxModule, - MatInputModule, RouterModule.forChild(ROUTES), ], }) diff --git a/apps/concierge/src/app/lockers/view-locker-bank-modal.component.ts b/apps/concierge/src/app/lockers/view-locker-bank-modal.component.ts index 8183ea957f..a34905e65c 100644 --- a/apps/concierge/src/app/lockers/view-locker-bank-modal.component.ts +++ b/apps/concierge/src/app/lockers/view-locker-bank-modal.component.ts @@ -1,5 +1,8 @@ import { Component, inject } from '@angular/core'; -import { MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { MatRippleModule } from '@angular/material/core'; +import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog'; +import { LockerGridComponent } from '@placeos/bookings'; +import { IconComponent } from '@placeos/components'; @Component({ selector: 'view-locker-bank-modal', @@ -22,7 +25,12 @@ import { MAT_DIALOG_DATA } from '@angular/material/dialog'; `, styles: [``], - standalone: false, + imports: [ + MatDialogModule, + MatRippleModule, + IconComponent, + LockerGridComponent, + ], }) export class ViewLockerBankModalComponent { private _data = inject(MAT_DIALOG_DATA); diff --git a/apps/concierge/src/app/parking/parking-booking-modal.component.ts b/apps/concierge/src/app/parking/parking-booking-modal.component.ts index b8d5e10448..c17e49935e 100644 --- a/apps/concierge/src/app/parking/parking-booking-modal.component.ts +++ b/apps/concierge/src/app/parking/parking-booking-modal.component.ts @@ -1,19 +1,35 @@ import { Component, inject, OnInit, signal } from '@angular/core'; -import { Validators } from '@angular/forms'; +import { ReactiveFormsModule, Validators } from '@angular/forms'; +import { MatCheckboxModule } from '@angular/material/checkbox'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import { Booking, BookingFormService, ParkingSpace } from '@placeos/bookings'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { + BookingFormService, + ParkingSpace, + ParkingSpaceListFieldComponent, +} from '@placeos/bookings'; import { AsyncHandler, + Booking, + BuildingLevel, currentUser, getInvalidFields, i18n, notifyError, notifySuccess, SettingsService, + User, } from '@placeos/common'; -import { BuildingLevel } from '@placeos/organisation'; -import { User } from '@placeos/users'; +import { TranslatePipe } from '@placeos/components'; +import { + DateFieldComponent, + DurationFieldComponent, + TimeFieldComponent, + UserSearchFieldComponent, +} from '@placeos/form-fields'; import { addDays, endOfDay } from 'date-fns'; +import { FullscreenModalShellComponent } from 'libs/components/src/lib/fullscreen-modal-shell.component'; @Component({ selector: 'parking-booking-modal', @@ -151,7 +167,20 @@ import { addDays, endOfDay } from 'date-fns'; `, styles: [``], - standalone: false, + imports: [ + FullscreenModalShellComponent, + ReactiveFormsModule, + MatFormFieldModule, + MatInputModule, + DurationFieldComponent, + TimeFieldComponent, + MatCheckboxModule, + DateFieldComponent, + MatInputModule, + TranslatePipe, + UserSearchFieldComponent, + ParkingSpaceListFieldComponent, + ], }) export class ParkingBookingModalComponent extends AsyncHandler diff --git a/apps/concierge/src/app/parking/parking-bookings-list.component.ts b/apps/concierge/src/app/parking/parking-bookings-list.component.ts index 7a886d2049..fc1d926d4a 100644 --- a/apps/concierge/src/app/parking/parking-bookings-list.component.ts +++ b/apps/concierge/src/app/parking/parking-bookings-list.component.ts @@ -1,5 +1,15 @@ +import { CommonModule } from '@angular/common'; import { Component, OnInit, inject } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { MatTooltipModule } from '@angular/material/tooltip'; import { AsyncHandler, SettingsService } from '@placeos/common'; +import { + IconComponent, + SimpleTableComponent, + TranslatePipe, +} from '@placeos/components'; import { combineLatest, map } from 'rxjs'; import { ParkingStateService } from './parking-state.service'; @@ -221,7 +231,17 @@ import { ParkingStateService } from './parking-state.service';
`, styles: [``], - standalone: false, + imports: [ + CommonModule, + MatProgressBarModule, + SimpleTableComponent, + TranslatePipe, + MatRippleModule, + IconComponent, + MatMenuModule, + MatTooltipModule, + IconComponent, + ], }) export class ParkingBookingsListComponent extends AsyncHandler diff --git a/apps/concierge/src/app/parking/parking-map.component.ts b/apps/concierge/src/app/parking/parking-map.component.ts index 9b81beb6db..6bbd750ffd 100644 --- a/apps/concierge/src/app/parking/parking-map.component.ts +++ b/apps/concierge/src/app/parking/parking-map.component.ts @@ -1,7 +1,12 @@ +import { CommonModule } from '@angular/common'; import { Component, OnInit, inject } from '@angular/core'; -import { AsyncHandler, nextValueFrom } from '@placeos/common'; +import { + AsyncHandler, + OrganisationService, + nextValueFrom, +} from '@placeos/common'; +import { InteractiveMapComponent } from '@placeos/components'; import { ExploreParkingService, ExploreStateService } from '@placeos/explore'; -import { OrganisationService } from '@placeos/organisation'; import { first } from 'rxjs/operators'; import { ParkingStateService } from './parking-state.service'; @@ -24,7 +29,7 @@ import { ParkingStateService } from './parking-state.service'; `, styles: [``], providers: [ExploreParkingService], - standalone: false, + imports: [CommonModule, InteractiveMapComponent], }) export class ParkingMapComponent extends AsyncHandler implements OnInit { private _explore = inject(ExploreStateService); diff --git a/apps/concierge/src/app/parking/parking-space-list.component.ts b/apps/concierge/src/app/parking/parking-space-list.component.ts index 20b03df90b..240a8c2330 100644 --- a/apps/concierge/src/app/parking/parking-space-list.component.ts +++ b/apps/concierge/src/app/parking/parking-space-list.component.ts @@ -1,7 +1,15 @@ import { Clipboard } from '@angular/cdk/clipboard'; -import { Component, inject } from '@angular/core'; -import { Booking } from '@placeos/bookings'; -import { AsyncHandler, i18n, notifySuccess } from '@placeos/common'; +import { CommonModule } from '@angular/common'; +import { Component, inject, OnInit } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { AsyncHandler, Booking, i18n, notifySuccess } from '@placeos/common'; +import { + IconComponent, + SimpleTableComponent, + TranslatePipe, +} from '@placeos/components'; import { ParkingSpace } from '@placeos/explore'; import { combineLatest } from 'rxjs'; import { ParkingStateService } from './parking-state.service'; @@ -138,9 +146,17 @@ import { ParkingStateService } from './parking-state.service';
`, styles: [], - standalone: false, + imports: [ + CommonModule, + MatProgressBarModule, + IconComponent, + MatRippleModule, + MatTooltipModule, + SimpleTableComponent, + TranslatePipe, + ], }) -export class ParkingSpaceListComponent extends AsyncHandler { +export class ParkingSpaceListComponent extends AsyncHandler implements OnInit { private _state = inject(ParkingStateService); private _clipboard = inject(Clipboard); diff --git a/apps/concierge/src/app/parking/parking-space-modal.component.ts b/apps/concierge/src/app/parking/parking-space-modal.component.ts index f8cc1c05db..a5e825401e 100644 --- a/apps/concierge/src/app/parking/parking-space-modal.component.ts +++ b/apps/concierge/src/app/parking/parking-space-modal.component.ts @@ -1,8 +1,18 @@ import { Component, EventEmitter, inject, OnInit, Output } from '@angular/core'; import { FormControl, FormGroup, Validators } from '@angular/forms'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import { DialogEvent } from '@placeos/common'; -import { showStaff, User } from '@placeos/users'; +import { MatRippleModule } from '@angular/material/core'; +import { + MAT_DIALOG_DATA, + MatDialogModule, + MatDialogRef, +} from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { DialogEvent, User } from '@placeos/common'; +import { IconComponent, TranslatePipe } from '@placeos/components'; +import { UserSearchFieldComponent } from '@placeos/form-fields'; +import { showStaff } from '@placeos/users'; import { ParkingSpace } from './parking-state.service'; @Component({ @@ -117,7 +127,16 @@ import { ParkingSpace } from './parking-state.service';
`, styles: [``], - standalone: false, + imports: [ + MatDialogModule, + TranslatePipe, + MatRippleModule, + MatProgressSpinnerModule, + MatFormFieldModule, + MatInputModule, + IconComponent, + UserSearchFieldComponent, + ], }) export class ParkingSpaceModalComponent implements OnInit { private _data = inject(MAT_DIALOG_DATA); diff --git a/apps/concierge/src/app/parking/parking-state.service.ts b/apps/concierge/src/app/parking/parking-state.service.ts index 825f4b1cfe..6806b6b393 100644 --- a/apps/concierge/src/app/parking/parking-state.service.ts +++ b/apps/concierge/src/app/parking/parking-state.service.ts @@ -3,11 +3,9 @@ import { MatDialog } from '@angular/material/dialog'; import { approveBooking, approveBookingInstance, - Booking, checkinBooking, checkinBookingInstance, queryBookings, - RecurrenceDays, rejectBooking, rejectBookingInstance, removeBooking, @@ -15,20 +13,22 @@ import { } from '@placeos/bookings'; import { AsyncHandler, + Booking, i18n, nextValueFrom, notifyError, notifySuccess, + OrganisationService, randomInt, + RecurrenceDays, SettingsService, unique, + User, } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { openConfirmModal } from '@placeos/components'; import { showMetadata, updateMetadata } from '@placeos/ts-client'; -import { User } from '@placeos/users'; +import { UserPipe } from '@placeos/users'; import { addHours, endOfDay, getUnixTime, set, startOfDay } from 'date-fns'; -import { openConfirmModal } from 'libs/components/src/lib/confirm-modal.component'; -import { UserPipe } from 'libs/users/src/lib/user.pipe'; import { BehaviorSubject, combineLatest, of } from 'rxjs'; import { debounceTime, diff --git a/apps/concierge/src/app/parking/parking-topbar.component.ts b/apps/concierge/src/app/parking/parking-topbar.component.ts index e0e9aa7ec2..c4ccf0bbd5 100644 --- a/apps/concierge/src/app/parking/parking-topbar.component.ts +++ b/apps/concierge/src/app/parking/parking-topbar.component.ts @@ -1,18 +1,36 @@ import { Component, inject, OnInit, signal } from '@angular/core'; -import { ActivatedRoute, NavigationEnd, Router } from '@angular/router'; +import { + ActivatedRoute, + NavigationEnd, + Router, + RouterModule, +} from '@angular/router'; import { debounceTime } from 'rxjs/operators'; import { AsyncHandler, firstTruthyValueFrom, nextValueFrom, + OrganisationService, SettingsService, } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatRippleModule } from '@angular/material/core'; import { MatDialog } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatSelectModule } from '@angular/material/select'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { + BuildingPipe, + IconComponent, + TranslatePipe, +} from '@placeos/components'; import { lastValueFrom, timer } from 'rxjs'; import { BookingRulesModalComponent } from '../ui/booking-rules-modal.component'; +import { DateOptionsComponent } from '../ui/date-options.component'; +import { SearchbarComponent } from '../ui/searchbar.component'; import { ParkingStateService } from './parking-state.service'; @Component({ @@ -193,7 +211,21 @@ import { ParkingStateService } from './parking-state.service'; } `, ], - standalone: false, + imports: [ + CommonModule, + FormsModule, + DateOptionsComponent, + MatTooltipModule, + MatRippleModule, + IconComponent, + BuildingPipe, + MatFormFieldModule, + MatSelectModule, + FormsModule, + SearchbarComponent, + TranslatePipe, + RouterModule, + ], }) export class ParkingTopbarComponent extends AsyncHandler implements OnInit { private _state = inject(ParkingStateService); diff --git a/apps/concierge/src/app/parking/parking-user-modal.component.ts b/apps/concierge/src/app/parking/parking-user-modal.component.ts index 3f94ec7d00..231c0b27bd 100644 --- a/apps/concierge/src/app/parking/parking-user-modal.component.ts +++ b/apps/concierge/src/app/parking/parking-user-modal.component.ts @@ -1,8 +1,24 @@ import { Component, EventEmitter, OnInit, Output, inject } from '@angular/core'; -import { FormControl, FormGroup, Validators } from '@angular/forms'; +import { + FormControl, + FormGroup, + FormsModule, + ReactiveFormsModule, + Validators, +} from '@angular/forms'; +import { MatRippleModule } from '@angular/material/core'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import { AsyncHandler, DialogEvent } from '@placeos/common'; -import { User } from '@placeos/users'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { AsyncHandler, DialogEvent, User } from '@placeos/common'; +import { + IconComponent, + SettingsToggleComponent, + TranslatePipe, +} from '@placeos/components'; +import { UserSearchFieldComponent } from '@placeos/form-fields'; import { ParkingUser } from './parking-state.service'; @Component({ @@ -153,7 +169,19 @@ import { ParkingUser } from './parking-state.service';
`, styles: [``], - standalone: false, + imports: [ + IconComponent, + TranslatePipe, + MatProgressSpinnerModule, + MatRippleModule, + SettingsToggleComponent, + MatFormFieldModule, + MatInputModule, + ReactiveFormsModule, + FormsModule, + MatTooltipModule, + UserSearchFieldComponent, + ], }) export class ParkingUserModalComponent extends AsyncHandler implements OnInit { private _data = inject(MAT_DIALOG_DATA); diff --git a/apps/concierge/src/app/parking/parking-users-list.component.ts b/apps/concierge/src/app/parking/parking-users-list.component.ts index d19700e87e..cbcee37b12 100644 --- a/apps/concierge/src/app/parking/parking-users-list.component.ts +++ b/apps/concierge/src/app/parking/parking-users-list.component.ts @@ -1,7 +1,15 @@ import { Clipboard } from '@angular/cdk/clipboard'; +import { CommonModule } from '@angular/common'; import { Component, inject } from '@angular/core'; import { FormGroup } from '@angular/forms'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { MatTooltipModule } from '@angular/material/tooltip'; import { i18n, notifySuccess } from '@placeos/common'; +import { + IconComponent, + SimpleTableComponent, + TranslatePipe, +} from '@placeos/components'; import { BehaviorSubject } from 'rxjs'; import { ParkingStateService } from './parking-state.service'; @@ -103,7 +111,15 @@ import { ParkingStateService } from './parking-state.service';
`, styles: [``], - standalone: false, + imports: [ + CommonModule, + MatProgressBarModule, + SimpleTableComponent, + IconComponent, + TranslatePipe, + SimpleTableComponent, + MatTooltipModule, + ], }) export class ParkingUsersListComponent { private _state = inject(ParkingStateService); diff --git a/apps/concierge/src/app/parking/parking.component.ts b/apps/concierge/src/app/parking/parking.component.ts index 4d4dbf17ff..4605ff1deb 100644 --- a/apps/concierge/src/app/parking/parking.component.ts +++ b/apps/concierge/src/app/parking/parking.component.ts @@ -1,7 +1,13 @@ +import { CommonModule } from '@angular/common'; import { Component, OnInit, inject, signal } from '@angular/core'; -import { NavigationEnd, Router } from '@angular/router'; +import { MatTabsModule } from '@angular/material/tabs'; +import { NavigationEnd, Router, RouterModule } from '@angular/router'; import { AsyncHandler } from '@placeos/common'; +import { TranslatePipe } from '@placeos/components'; +import { ApplicationSidebarComponent } from '../ui/app-sidebar.component'; +import { ApplicationTopbarComponent } from '../ui/app-topbar.component'; import { ParkingStateService } from './parking-state.service'; +import { ParkingTopbarComponent } from './parking-topbar.component'; @Component({ selector: 'app-parking', @@ -111,7 +117,15 @@ import { ParkingStateService } from './parking-state.service'; } `, ], - standalone: false, + imports: [ + CommonModule, + ApplicationTopbarComponent, + ApplicationSidebarComponent, + MatTabsModule, + RouterModule, + ParkingTopbarComponent, + TranslatePipe, + ], }) export class ParkingComponent extends AsyncHandler implements OnInit { private _state = inject(ParkingStateService); diff --git a/apps/concierge/src/app/parking/parking.module.ts b/apps/concierge/src/app/parking/parking.module.ts index 6f4e2c332f..b00636fbf1 100644 --- a/apps/concierge/src/app/parking/parking.module.ts +++ b/apps/concierge/src/app/parking/parking.module.ts @@ -1,35 +1,12 @@ -import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatProgressBarModule } from '@angular/material/progress-bar'; -import { MatTabsModule } from '@angular/material/tabs'; import { Route, RouterModule } from '@angular/router'; -import { FormFieldsModule } from '@placeos/form-fields'; -import { UIModule } from '../ui/ui.module'; -import { SharedBookingsModule } from '@placeos/bookings'; -import { ParkingBookingModalComponent } from './parking-booking-modal.component'; import { ParkingBookingsListComponent } from './parking-bookings-list.component'; import { ParkingMapComponent } from './parking-map.component'; import { ParkingSpaceListComponent } from './parking-space-list.component'; -import { ParkingSpaceModalComponent } from './parking-space-modal.component'; -import { ParkingTopbarComponent } from './parking-topbar.component'; -import { ParkingUserModalComponent } from './parking-user-modal.component'; import { ParkingUsersListComponent } from './parking-users-list.component'; import { ParkingComponent } from './parking.component'; -const COMPONENTS = [ - ParkingComponent, - ParkingBookingsListComponent, - ParkingBookingModalComponent, - ParkingSpaceListComponent, - ParkingUsersListComponent, - ParkingTopbarComponent, - ParkingSpaceModalComponent, - ParkingUserModalComponent, - ParkingMapComponent, -]; - const ROUTES: Route[] = [ { path: '', @@ -59,16 +36,13 @@ const ROUTES: Route[] = [ ]; @NgModule({ - declarations: [...COMPONENTS], + declarations: [], imports: [ - CommonModule, - UIModule, - FormsModule, - ReactiveFormsModule, - FormFieldsModule, - MatTabsModule, - MatProgressBarModule, - SharedBookingsModule, + ParkingComponent, + ParkingBookingsListComponent, + ParkingSpaceListComponent, + ParkingUsersListComponent, + ParkingMapComponent, RouterModule.forChild(ROUTES), ], }) diff --git a/apps/concierge/src/app/poi-manager/map-show-element.component.ts b/apps/concierge/src/app/poi-manager/map-show-element.component.ts index 75678f315d..acf0cb5b11 100644 --- a/apps/concierge/src/app/poi-manager/map-show-element.component.ts +++ b/apps/concierge/src/app/poi-manager/map-show-element.component.ts @@ -1,5 +1,5 @@ import { Component, inject } from '@angular/core'; -import { MAP_FEATURE_DATA } from 'libs/common/src/lib/types'; +import { MAP_FEATURE_DATA } from '@placeos/common'; @Component({ selector: 'map-show-element', @@ -17,7 +17,7 @@ import { MAP_FEATURE_DATA } from 'libs/common/src/lib/types';
`, styles: [``], - standalone: false, + imports: [], }) export class MapShowElementComponent { private _data = inject<{ diff --git a/apps/concierge/src/app/poi-manager/poi-list.component.ts b/apps/concierge/src/app/poi-manager/poi-list.component.ts index 011b6829b4..388c8576a8 100644 --- a/apps/concierge/src/app/poi-manager/poi-list.component.ts +++ b/apps/concierge/src/app/poi-manager/poi-list.component.ts @@ -1,11 +1,27 @@ -import { Component, inject } from '@angular/core'; -import { SettingsService } from '@placeos/common'; -import { generateQRCode } from 'libs/common/src/lib/qr-code'; +import { CommonModule } from '@angular/common'; +import { Component, inject, OnInit, signal } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; +import { MatMenuModule } from '@angular/material/menu'; +import { AsyncHandler, generateQRCode, SettingsService } from '@placeos/common'; +import { + CustomTooltipComponent, + IconComponent, + LevelPipe, + PrintableComponent, + SafePipe, + SimpleTableComponent, + TranslatePipe, +} from '@placeos/components'; import { POIManagementService, PointOfInterest, } from './poi-management.service'; +interface QR_Codes { + public: { link: string; image: string }; + private: { link: string; image: string }; +} + @Component({ selector: 'poi-list', template: ` @@ -68,6 +84,7 @@ import { matRipple customTooltip [content]="qr_menu" + [data]="{ qr: qr_codes()[row.id]?.private, item: row }" (click)="loadQrCode(row)" > qr_code @@ -79,28 +96,34 @@ import { matRipple customTooltip [disabled]="!row.short_link_id" + [data]="{ qr: qr_codes()[row.id]?.public, item: row }" [content]="qr_menu" (click)="loadPublicQrCode(row)" > qr_code
- +
-
- - - -
- {{ row.name || row.id }} -
+
+ + + + +
+ {{ item.name || item.id }} +
+
- @@ -145,13 +168,25 @@ import { `, styles: [``], - standalone: false, + imports: [ + CommonModule, + SimpleTableComponent, + MatMenuModule, + TranslatePipe, + IconComponent, + MatRippleModule, + PrintableComponent, + LevelPipe, + CustomTooltipComponent, + SafePipe, + ], }) -export class POIListComponent { +export class POIListComponent extends AsyncHandler implements OnInit { private _manager = inject(POIManagementService); private _settings = inject(SettingsService); public readonly features = this._manager.filtered_features; + public readonly qr_codes = signal>({}); public readonly edit = (region) => this._manager.editPointOfInterest(region); @@ -165,6 +200,26 @@ export class POIListComponent { return `${window.location.origin}${path}`; } + public ngOnInit() { + this.subscription( + 'featrues', + this.features.subscribe(async (l) => { + for (const item of l) { + if (this.qr_codes()[item.id]) continue; + const qr_private = await this.loadQrCode(item); + const qr_public = await this.loadQrCode(item); + this.qr_codes.update((m) => { + m[item.id] = { + private: qr_private, + public: qr_public, + }; + return m; + }); + } + }), + ); + } + public loadQrCode(item: PointOfInterest) { const location = typeof item.location === 'string' @@ -173,14 +228,12 @@ export class POIListComponent { const link = `${this.kiosk_url}/#/explore?level=${encodeURIComponent( item.level_id, )}&locate=${encodeURIComponent(location)}`; - item.qr_link = link; - item.qr_code = generateQRCode(link); + return { link, image: generateQRCode(link) }; } public loadPublicQrCode(item: PointOfInterest) { const link = `${location.origin}/r/${item.short_link_id.split('-')[1]}`; - item.qr_link = link; - item.qr_code = generateQRCode(link); + return { link, image: generateQRCode(link) }; } public print() { diff --git a/apps/concierge/src/app/poi-manager/poi-management.service.ts b/apps/concierge/src/app/poi-manager/poi-management.service.ts index 64ea8e8f9c..491d9ed8ba 100644 --- a/apps/concierge/src/app/poi-manager/poi-management.service.ts +++ b/apps/concierge/src/app/poi-manager/poi-management.service.ts @@ -1,10 +1,14 @@ import { Injectable, inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; -import { flatten, notifyError, notifySuccess } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { + OrganisationService, + flatten, + notifyError, + notifySuccess, +} from '@placeos/common'; +import { openConfirmModal } from '@placeos/components'; +import { ExplorePointOfInterestModalComponent } from '@placeos/explore'; import { showMetadata, updateMetadata } from '@placeos/ts-client'; -import { openConfirmModal } from 'libs/components/src/lib/confirm-modal.component'; -import { ExplorePointOfInterestModalComponent } from 'libs/explore/src/lib/explore-poi-modal.component'; import { BehaviorSubject, combineLatest, of } from 'rxjs'; import { catchError, map, shareReplay, switchMap } from 'rxjs/operators'; import { POIModalComponent } from './poi-modal.component'; diff --git a/apps/concierge/src/app/poi-manager/poi-manager.component.ts b/apps/concierge/src/app/poi-manager/poi-manager.component.ts index 5623791dfc..cbea335de9 100644 --- a/apps/concierge/src/app/poi-manager/poi-manager.component.ts +++ b/apps/concierge/src/app/poi-manager/poi-manager.component.ts @@ -1,13 +1,25 @@ +import { CommonModule } from '@angular/common'; import { Component, inject } from '@angular/core'; -import { SettingsService } from '@placeos/common'; -import { Building, OrganisationService } from '@placeos/organisation'; +import { FormsModule } from '@angular/forms'; +import { MatRippleModule } from '@angular/material/core'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatSelectModule } from '@angular/material/select'; +import { + Building, + OrganisationService, + SettingsService, +} from '@placeos/common'; +import { TranslatePipe } from '@placeos/components'; +import { ApplicationSidebarComponent } from '../ui/app-sidebar.component'; +import { ApplicationTopbarComponent } from '../ui/app-topbar.component'; +import { POIListComponent } from './poi-list.component'; import { POIManagementService } from './poi-management.service'; @Component({ selector: '[app-poi-manager]', template: ` - -
+ +
`, styles: [``], - standalone: false, + imports: [ + CommonModule, + TranslatePipe, + IconComponent, + FullscreenModalShellComponent, + ReactiveFormsModule, + ImageFieldComponent, + MatRippleModule, + MatFormFieldModule, + MatInputModule, + FormsModule, + SettingsToggleComponent, + MatSelectModule, + UploadButtonComponent, + ], }) export class POIModalComponent extends AsyncHandler implements OnInit { private _org = inject(OrganisationService); diff --git a/apps/concierge/src/app/points/asset-modal.component.ts b/apps/concierge/src/app/points/asset-modal.component.ts index 28fac4971d..d9515f79e2 100644 --- a/apps/concierge/src/app/points/asset-modal.component.ts +++ b/apps/concierge/src/app/points/asset-modal.component.ts @@ -1,8 +1,20 @@ import { Component, EventEmitter, Output, inject } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { + FormControl, + FormGroup, + FormsModule, + ReactiveFormsModule, +} from '@angular/forms'; +import { MatAutocompleteModule } from '@angular/material/autocomplete'; +import { MatRippleModule } from '@angular/material/core'; import { MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { MatSelectModule } from '@angular/material/select'; import { AsyncHandler, DialogEvent } from '@placeos/common'; +import { SettingsToggleComponent, TranslatePipe } from '@placeos/components'; import { SpacesService } from '@placeos/events'; +import { CounterComponent, TimeFieldComponent } from '@placeos/form-fields'; import { addHours, startOfHour } from 'date-fns'; import { combineLatest } from 'rxjs'; import { map, shareReplay, tap } from 'rxjs/operators'; @@ -244,7 +256,20 @@ import { DesksStateService } from '../desks/desks-state.service'; } `, ], - standalone: false, + imports: [ + MatRippleModule, + TranslatePipe, + CounterComponent, + TimeFieldComponent, + TimeFieldComponent, + MatFormFieldModule, + MatSelectModule, + FormsModule, + SettingsToggleComponent, + MatAutocompleteModule, + MatProgressSpinnerModule, + ReactiveFormsModule, + ], }) export class PointsAssetModalComponent extends AsyncHandler { private _spaces = inject(SpacesService); @@ -300,11 +325,11 @@ export class PointsAssetModalComponent extends AsyncHandler { ); } - public renderPrice(value: number = 0) { + public renderPrice(value = 0) { return `$${(value / 100)?.toFixed(2)}`; } - public renderPercent(value: number = 0) { + public renderPercent(value = 0) { return `${value}%`; } diff --git a/apps/concierge/src/app/points/points-assets.component.ts b/apps/concierge/src/app/points/points-assets.component.ts index eb11f4be82..19ab6e0f27 100644 --- a/apps/concierge/src/app/points/points-assets.component.ts +++ b/apps/concierge/src/app/points/points-assets.component.ts @@ -1,5 +1,12 @@ +import { CommonModule } from '@angular/common'; import { Component, inject } from '@angular/core'; -import { OrganisationService } from '@placeos/organisation'; +import { MatRippleModule } from '@angular/material/core'; +import { OrganisationService } from '@placeos/common'; +import { + IconComponent, + SimpleTableComponent, + TranslatePipe, +} from '@placeos/components'; import { PointsStateService } from './points-state.service'; export interface CustomRate { @@ -102,7 +109,13 @@ export interface PointAsset { } `, ], - standalone: false, + imports: [ + CommonModule, + SimpleTableComponent, + MatRippleModule, + IconComponent, + TranslatePipe, + ], }) export class PointsAssetsComponent { private _state = inject(PointsStateService); diff --git a/apps/concierge/src/app/points/points-overview.component.ts b/apps/concierge/src/app/points/points-overview.component.ts index 49c5f96738..a1dc15fc1c 100644 --- a/apps/concierge/src/app/points/points-overview.component.ts +++ b/apps/concierge/src/app/points/points-overview.component.ts @@ -1,10 +1,14 @@ import { Component, OnInit } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { IconComponent, TranslatePipe } from '@placeos/components'; +import { CounterComponent } from '@placeos/form-fields'; @Component({ selector: 'points-overview', template: `

{{ 'APP.CONCIERGE.POINTS_OVERVIEW_HEADER' | translate }}

@@ -89,7 +93,13 @@ import { Component, OnInit } from '@angular/core'; } `, ], - standalone: false, + imports: [ + CounterComponent, + FormsModule, + TranslatePipe, + MatTooltipModule, + IconComponent, + ], }) export class PointsOverviewComponent implements OnInit { public points = { diff --git a/apps/concierge/src/app/points/points-topbar.component.ts b/apps/concierge/src/app/points/points-topbar.component.ts index f468c87c04..903d7b9377 100644 --- a/apps/concierge/src/app/points/points-topbar.component.ts +++ b/apps/concierge/src/app/points/points-topbar.component.ts @@ -1,7 +1,7 @@ -import { Component, inject } from '@angular/core'; +import { Component } from '@angular/core'; import { AsyncHandler } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; -import { first } from 'rxjs/operators'; +import { TranslatePipe } from '@placeos/components'; +import { DateOptionsComponent } from '../ui/date-options.component'; @Component({ selector: 'points-topbar', @@ -26,12 +26,6 @@ import { first } from 'rxjs/operators'; } `, ], - standalone: false, + imports: [DateOptionsComponent, TranslatePipe], }) -export class PointsTopbarComponent extends AsyncHandler { - private _org = inject(OrganisationService); - - public async ngOnInit() { - await this._org.initialised.pipe(first((_) => _)).toPromise(); - } -} +export class PointsTopbarComponent extends AsyncHandler {} diff --git a/apps/concierge/src/app/points/points.component.ts b/apps/concierge/src/app/points/points.component.ts index 5e66b88aeb..a4af09d843 100644 --- a/apps/concierge/src/app/points/points.component.ts +++ b/apps/concierge/src/app/points/points.component.ts @@ -1,7 +1,13 @@ import { Component, OnInit, inject } from '@angular/core'; -import { Router } from '@angular/router'; +import { MatRippleModule } from '@angular/material/core'; +import { MatTabsModule } from '@angular/material/tabs'; +import { Router, RouterModule } from '@angular/router'; import { AsyncHandler } from '@placeos/common'; +import { TranslatePipe } from '@placeos/components'; +import { ApplicationSidebarComponent } from '../ui/app-sidebar.component'; +import { ApplicationTopbarComponent } from '../ui/app-topbar.component'; import { PointsStateService } from './points-state.service'; +import { PointsTopbarComponent } from './points-topbar.component'; @Component({ selector: 'placeos-new-points', @@ -18,24 +24,33 @@ import { PointsStateService } from './points-state.service'; } `, styles: [``], - standalone: false, + imports: [ + SimpleTableComponent, + TranslatePipe, + IconComponent, + MatMenuModule, + ], }) export class RegionListComponent { private _manager = inject(RegionManagementService); diff --git a/apps/concierge/src/app/region-manager/region-management.service.ts b/apps/concierge/src/app/region-manager/region-management.service.ts index e1d3e59647..3e3ff628c3 100644 --- a/apps/concierge/src/app/region-manager/region-management.service.ts +++ b/apps/concierge/src/app/region-manager/region-management.service.ts @@ -1,9 +1,14 @@ import { Injectable, inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; -import { i18n, notifyError, notifySuccess } from '@placeos/common'; -import { OrganisationService, Region } from '@placeos/organisation'; +import { + OrganisationService, + Region, + i18n, + notifyError, + notifySuccess, +} from '@placeos/common'; +import { openConfirmModal } from '@placeos/components'; import { PlaceZone, removeZone } from '@placeos/ts-client'; -import { openConfirmModal } from 'libs/components/src/lib/confirm-modal.component'; import { BehaviorSubject, combineLatest } from 'rxjs'; import { map } from 'rxjs/operators'; import { AppSettingsModalComponent } from '../ui/app-settings-modal.component'; diff --git a/apps/concierge/src/app/region-manager/region-manager.component.ts b/apps/concierge/src/app/region-manager/region-manager.component.ts index 5a09235335..9cca714c77 100644 --- a/apps/concierge/src/app/region-manager/region-manager.component.ts +++ b/apps/concierge/src/app/region-manager/region-manager.component.ts @@ -1,10 +1,17 @@ import { Component, inject } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; import { MatDialog } from '@angular/material/dialog'; -import { OrganisationService } from '@placeos/organisation'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { OrganisationService } from '@placeos/common'; +import { IconComponent, TranslatePipe } from '@placeos/components'; import { BookingPanelSettingsModalComponent } from '../ui/app-settings/booking-panel-settings-modal.component'; import { ConciergeSettingsFormModalComponent } from '../ui/app-settings/concierge-settings-form-modal.component'; import { VisitorKioskSettingsFormModalComponent } from '../ui/app-settings/visitor-kiosk-settings-form-modal.component'; import { WorkplaceSettingsFormModalComponent } from '../ui/app-settings/workplace-settings-form-modal.component'; +import { ApplicationSidebarComponent } from '../ui/app-sidebar.component'; +import { ApplicationTopbarComponent } from '../ui/app-topbar.component'; +import { RegionListComponent } from './region-list.component'; import { RegionManagementService } from './region-management.service'; @Component({ @@ -121,7 +128,16 @@ import { RegionManagementService } from './region-management.service'; } `, ], - standalone: false, + imports: [ + ApplicationTopbarComponent, + ApplicationSidebarComponent, + MatMenuModule, + IconComponent, + MatRippleModule, + MatTooltipModule, + TranslatePipe, + RegionListComponent, + ], }) export class RegionManagerComponent { private readonly _state = inject(RegionManagementService); diff --git a/apps/concierge/src/app/region-manager/region-manager.module.ts b/apps/concierge/src/app/region-manager/region-manager.module.ts index 71b81a3858..82573efee8 100644 --- a/apps/concierge/src/app/region-manager/region-manager.module.ts +++ b/apps/concierge/src/app/region-manager/region-manager.module.ts @@ -1,32 +1,12 @@ -import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FormsModule } from '@angular/forms'; import { Route, RouterModule } from '@angular/router'; -import { UIModule } from '../ui/ui.module'; - -import { SharedUsersModule } from '@placeos/users'; - -import { MatChipsModule } from '@angular/material/chips'; -import { RegionListComponent } from './region-list.component'; import { RegionManagerComponent } from './region-manager.component'; -import { RegionModalComponent } from './region-modal.component'; const ROUTES: Route[] = [{ path: '', component: RegionManagerComponent }]; @NgModule({ - declarations: [ - RegionManagerComponent, - RegionListComponent, - RegionModalComponent, - ], - imports: [ - CommonModule, - FormsModule, - UIModule, - SharedUsersModule, - MatChipsModule, - RouterModule.forChild(ROUTES), - ], + declarations: [], + imports: [RegionManagerComponent, RouterModule.forChild(ROUTES)], }) export class RegionManagerModule {} diff --git a/apps/concierge/src/app/region-manager/region-modal.component.ts b/apps/concierge/src/app/region-manager/region-modal.component.ts index 1183638dc5..4b8e9fcd3a 100644 --- a/apps/concierge/src/app/region-manager/region-modal.component.ts +++ b/apps/concierge/src/app/region-manager/region-modal.component.ts @@ -1,14 +1,26 @@ +import { CommonModule } from '@angular/common'; import { Component, inject } from '@angular/core'; -import { FormControl, FormGroup, Validators } from '@angular/forms'; +import { + FormControl, + FormGroup, + ReactiveFormsModule, + Validators, +} from '@angular/forms'; +import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; import { AsyncHandler, + OrganisationService, + Region, TIMEZONES_IANA, getInvalidFields, notifyError, } from '@placeos/common'; -import { OrganisationService, Region } from '@placeos/organisation'; +import { IconComponent, TranslatePipe } from '@placeos/components'; import { addZone, authority, updateZone } from '@placeos/ts-client'; +import { FullscreenModalShellComponent } from 'libs/components/src/lib/fullscreen-modal-shell.component'; @Component({ selector: 'region-modal', @@ -71,7 +83,16 @@ import { addZone, authority, updateZone } from '@placeos/ts-client'; `, styles: [``], - standalone: false, + imports: [ + CommonModule, + FullscreenModalShellComponent, + MatAutocompleteModule, + MatFormFieldModule, + MatInputModule, + TranslatePipe, + IconComponent, + ReactiveFormsModule, + ], }) export class RegionModalComponent extends AsyncHandler { private _org = inject(OrganisationService); diff --git a/apps/concierge/src/app/reports/assets/asset-report-daily-usage.component.ts b/apps/concierge/src/app/reports/assets/asset-report-daily-usage.component.ts index b9d0d7f835..8e81c9ad2b 100644 --- a/apps/concierge/src/app/reports/assets/asset-report-daily-usage.component.ts +++ b/apps/concierge/src/app/reports/assets/asset-report-daily-usage.component.ts @@ -1,5 +1,13 @@ +import { CommonModule } from '@angular/common'; import { Component, inject, input } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; +import { MatTooltipModule } from '@angular/material/tooltip'; import { downloadFile, jsonToCsv, nextValueFrom } from '@placeos/common'; +import { + IconComponent, + SimpleTableComponent, + TranslatePipe, +} from '@placeos/components'; import { format } from 'date-fns'; import { map } from 'rxjs/operators'; import { AssetsReportService } from './assets-report.service'; @@ -68,7 +76,14 @@ import { AssetsReportService } from './assets-report.service';
`, styles: [``], - standalone: false, + imports: [ + CommonModule, + SimpleTableComponent, + TranslatePipe, + IconComponent, + MatRippleModule, + MatTooltipModule, + ], }) export class AssetReportDailyUsageComponent { private _state = inject(AssetsReportService); diff --git a/apps/concierge/src/app/reports/assets/asset-report-expired-items.component.ts b/apps/concierge/src/app/reports/assets/asset-report-expired-items.component.ts index 34cf876cf8..0b4d549c9d 100644 --- a/apps/concierge/src/app/reports/assets/asset-report-expired-items.component.ts +++ b/apps/concierge/src/app/reports/assets/asset-report-expired-items.component.ts @@ -1,5 +1,13 @@ +import { CommonModule } from '@angular/common'; import { Component, inject, input } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; +import { MatTooltipModule } from '@angular/material/tooltip'; import { downloadFile, jsonToCsv, nextValueFrom } from '@placeos/common'; +import { + IconComponent, + SimpleTableComponent, + TranslatePipe, +} from '@placeos/components'; import { AssetsReportService } from './assets-report.service'; @Component({ @@ -77,7 +85,14 @@ import { AssetsReportService } from './assets-report.service';
`, styles: [``], - standalone: false, + imports: [ + CommonModule, + SimpleTableComponent, + TranslatePipe, + IconComponent, + MatRippleModule, + MatTooltipModule, + ], }) export class AssetReportExpiredItemsComponent { private _state = inject(AssetsReportService); diff --git a/apps/concierge/src/app/reports/assets/asset-report-overall.component.ts b/apps/concierge/src/app/reports/assets/asset-report-overall.component.ts index b53b4a498c..86e65d6e8f 100644 --- a/apps/concierge/src/app/reports/assets/asset-report-overall.component.ts +++ b/apps/concierge/src/app/reports/assets/asset-report-overall.component.ts @@ -1,5 +1,7 @@ +import { CommonModule } from '@angular/common'; import { Component, inject } from '@angular/core'; import { formatDuration } from '@placeos/common'; +import { TranslatePipe } from '@placeos/components'; import { differenceInBusinessDays, endOfDay, startOfDay } from 'date-fns'; import { map } from 'rxjs/operators'; import { AssetsReportService } from './assets-report.service'; @@ -31,7 +33,7 @@ import { AssetsReportService } from './assets-report.service';
`, styles: [``], - standalone: false, + imports: [CommonModule, TranslatePipe], }) export class AssetReportOverallComponent { private _state = inject(AssetsReportService); diff --git a/apps/concierge/src/app/reports/assets/asset-report-product-usage.component.ts b/apps/concierge/src/app/reports/assets/asset-report-product-usage.component.ts index 8bd14a4027..c46eeeb4f5 100644 --- a/apps/concierge/src/app/reports/assets/asset-report-product-usage.component.ts +++ b/apps/concierge/src/app/reports/assets/asset-report-product-usage.component.ts @@ -1,5 +1,12 @@ import { Component, inject, input } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; +import { MatTooltipModule } from '@angular/material/tooltip'; import { downloadFile, jsonToCsv, nextValueFrom } from '@placeos/common'; +import { + IconComponent, + SimpleTableComponent, + TranslatePipe, +} from '@placeos/components'; import { map } from 'rxjs/operators'; import { AssetsReportService } from './assets-report.service'; @@ -58,7 +65,13 @@ import { AssetsReportService } from './assets-report.service';
`, styles: [``], - standalone: false, + imports: [ + SimpleTableComponent, + TranslatePipe, + IconComponent, + MatRippleModule, + MatTooltipModule, + ], }) export class AssetReportProductUsageComponent { private _state = inject(AssetsReportService); diff --git a/apps/concierge/src/app/reports/assets/asset-report-users.component.ts b/apps/concierge/src/app/reports/assets/asset-report-users.component.ts index b727969a75..e206f87c77 100644 --- a/apps/concierge/src/app/reports/assets/asset-report-users.component.ts +++ b/apps/concierge/src/app/reports/assets/asset-report-users.component.ts @@ -1,10 +1,17 @@ import { Component, inject, input } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; +import { MatTooltipModule } from '@angular/material/tooltip'; import { downloadFile, jsonToCsv, nextValueFrom, unique, } from '@placeos/common'; +import { + IconComponent, + SimpleTableComponent, + TranslatePipe, +} from '@placeos/components'; import { map } from 'rxjs/operators'; import { AssetsReportService } from './assets-report.service'; @@ -58,7 +65,13 @@ import { AssetsReportService } from './assets-report.service';
`, styles: [``], - standalone: false, + imports: [ + SimpleTableComponent, + TranslatePipe, + IconComponent, + MatRippleModule, + MatTooltipModule, + ], }) export class AssetReportUsersComponent { private _state = inject(AssetsReportService); diff --git a/apps/concierge/src/app/reports/assets/assets-report.component.ts b/apps/concierge/src/app/reports/assets/assets-report.component.ts index c93bb83a49..f115d9f463 100644 --- a/apps/concierge/src/app/reports/assets/assets-report.component.ts +++ b/apps/concierge/src/app/reports/assets/assets-report.component.ts @@ -1,10 +1,24 @@ +import { CommonModule } from '@angular/common'; import { Component, inject } from '@angular/core'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { ActivatedRoute } from '@angular/router'; +import { + AsyncHandler, + OrganisationService, + SettingsService, +} from '@placeos/common'; +import { + AuthenticatedImageDirective, + TranslatePipe, +} from '@placeos/components'; import { debounceTime, map } from 'rxjs/operators'; -import { AsyncHandler, SettingsService } from '@placeos/common'; - -import { ActivatedRoute } from '@angular/router'; -import { OrganisationService } from '@placeos/organisation'; +import { ReportsOptionsComponent } from '../reports-options.component'; +import { AssetReportDailyUsageComponent } from './asset-report-daily-usage.component'; +import { AssetReportExpiredItemsComponent } from './asset-report-expired-items.component'; +import { AssetReportOverallComponent } from './asset-report-overall.component'; +import { AssetReportProductUsageComponent } from './asset-report-product-usage.component'; +import { AssetReportUsersComponent } from './asset-report-users.component'; import { AssetsReportService } from './assets-report.service'; @Component({ @@ -74,7 +88,18 @@ import { AssetsReportService } from './assets-report.service'; } `, ], - standalone: false, + imports: [ + CommonModule, + TranslatePipe, + MatProgressSpinnerModule, + AuthenticatedImageDirective, + ReportsOptionsComponent, + AssetReportDailyUsageComponent, + AssetReportExpiredItemsComponent, + AssetReportOverallComponent, + AssetReportProductUsageComponent, + AssetReportUsersComponent, + ], }) export class AssetsReportComponent extends AsyncHandler { private _state = inject(AssetsReportService); diff --git a/apps/concierge/src/app/reports/assets/assets-report.service.ts b/apps/concierge/src/app/reports/assets/assets-report.service.ts index a1cfe534d1..b05dccfb00 100644 --- a/apps/concierge/src/app/reports/assets/assets-report.service.ts +++ b/apps/concierge/src/app/reports/assets/assets-report.service.ts @@ -1,22 +1,23 @@ import { formatDate } from '@angular/common'; import { inject, Injectable } from '@angular/core'; import { - AssetGroup, queryAssetGroupsExtended, queryAssetPurchaseOrders, } from '@placeos/assets'; -import { Booking, queryBookings } from '@placeos/bookings'; +import { queryBookings } from '@placeos/bookings'; import { + AssetGroup, + Booking, + CalendarEvent, downloadFile, i18n, jsonToCsv, nextValueFrom, notifyError, + OrganisationService, SettingsService, unique, } from '@placeos/common'; -import { CalendarEvent } from '@placeos/events'; -import { OrganisationService } from '@placeos/organisation'; import { addDays, endOfDay, diff --git a/apps/concierge/src/app/reports/catering/catering-report-items.component.ts b/apps/concierge/src/app/reports/catering/catering-report-items.component.ts index ca899d17c3..4892faf1f1 100644 --- a/apps/concierge/src/app/reports/catering/catering-report-items.component.ts +++ b/apps/concierge/src/app/reports/catering/catering-report-items.component.ts @@ -1,6 +1,7 @@ +import { CommonModule } from '@angular/common'; import { Component, inject, input } from '@angular/core'; -import { CateringOption } from '@placeos/catering'; -import { OrganisationService } from '@placeos/organisation'; +import { CateringOption, OrganisationService } from '@placeos/common'; +import { SimpleTableComponent, TranslatePipe } from '@placeos/components'; import { CateringReportStateService } from './catering-report-state.service'; @Component({ @@ -77,7 +78,7 @@ import { CateringReportStateService } from './catering-report-state.service';
`, styles: [``], - standalone: false, + imports: [CommonModule, SimpleTableComponent, TranslatePipe], }) export class CateringReportItemsComponent { private _report = inject(CateringReportStateService); diff --git a/apps/concierge/src/app/reports/catering/catering-report-orders.component.ts b/apps/concierge/src/app/reports/catering/catering-report-orders.component.ts index 8c5bf927c3..83145d0a78 100644 --- a/apps/concierge/src/app/reports/catering/catering-report-orders.component.ts +++ b/apps/concierge/src/app/reports/catering/catering-report-orders.component.ts @@ -1,6 +1,13 @@ +import { CommonModule } from '@angular/common'; import { Component, inject, input } from '@angular/core'; -import { SettingsService } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { MatRippleModule } from '@angular/material/core'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { OrganisationService, SettingsService } from '@placeos/common'; +import { + IconComponent, + SimpleTableComponent, + TranslatePipe, +} from '@placeos/components'; import { CateringReportStateService } from './catering-report-state.service'; @Component({ @@ -19,7 +26,8 @@ import { CateringReportStateService } from './catering-report-state.service'; }} } @if (!loading) {
@@ -64,14 +80,24 @@ import { PlaceSystem, showMetadata, updateMetadata } from '@placeos/ts-client'; } @if (!loading) {
-
} `, styles: [``], - standalone: false, + imports: [ + MatDialogModule, + MatRippleModule, + MatProgressSpinnerModule, + MatFormFieldModule, + MatInputModule, + MatSelectModule, + ReactiveFormsModule, + TranslatePipe, + IconComponent, + ], }) export class RoomAlertModalComponent { private _data = inject<{ diff --git a/apps/concierge/src/app/room-manager/room-list.component.ts b/apps/concierge/src/app/room-manager/room-list.component.ts index d1b13b352d..a90454a779 100644 --- a/apps/concierge/src/app/room-manager/room-list.component.ts +++ b/apps/concierge/src/app/room-manager/room-list.component.ts @@ -1,6 +1,14 @@ import { Clipboard } from '@angular/cdk/clipboard'; import { Component, inject } from '@angular/core'; +import { MatMenuModule } from '@angular/material/menu'; import { i18n, notifySuccess, SettingsService } from '@placeos/common'; +import { + IconComponent, + LevelPipe, + SanitizePipe, + SimpleTableComponent, + TranslatePipe, +} from '@placeos/components'; import { RoomManagementService } from './room-management.service'; @Component({ @@ -168,7 +176,14 @@ import { RoomManagementService } from './room-management.service'; `, styles: [``], - standalone: false, + imports: [ + SimpleTableComponent, + IconComponent, + MatMenuModule, + SanitizePipe, + TranslatePipe, + LevelPipe, + ], }) export class RoomListComponent { private _manager = inject(RoomManagementService); diff --git a/apps/concierge/src/app/room-manager/room-management.service.ts b/apps/concierge/src/app/room-manager/room-management.service.ts index e318ed9b54..f10354dc8c 100644 --- a/apps/concierge/src/app/room-manager/room-management.service.ts +++ b/apps/concierge/src/app/room-manager/room-management.service.ts @@ -1,7 +1,6 @@ import { Injectable, inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; -import { SettingsService } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { OrganisationService, SettingsService } from '@placeos/common'; import { PlaceSystem, querySystems, showMetadata } from '@placeos/ts-client'; import { BehaviorSubject, combineLatest, of } from 'rxjs'; import { diff --git a/apps/concierge/src/app/room-manager/room-manager-topbar.component.ts b/apps/concierge/src/app/room-manager/room-manager-topbar.component.ts index 463d4777f5..b55419ed5f 100644 --- a/apps/concierge/src/app/room-manager/room-manager-topbar.component.ts +++ b/apps/concierge/src/app/room-manager/room-manager-topbar.component.ts @@ -1,11 +1,26 @@ +import { CommonModule } from '@angular/common'; import { Component, OnInit, inject } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { MatRippleModule } from '@angular/material/core'; import { MatDialog } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatSelectModule } from '@angular/material/select'; +import { MatTooltipModule } from '@angular/material/tooltip'; import { ActivatedRoute, Router } from '@angular/router'; -import { AsyncHandler, SettingsService } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { + AsyncHandler, + OrganisationService, + SettingsService, +} from '@placeos/common'; +import { + BuildingPipe, + IconComponent, + TranslatePipe, +} from '@placeos/components'; import { combineLatest } from 'rxjs'; import { first, map } from 'rxjs/operators'; import { BookingRulesModalComponent } from '../ui/booking-rules-modal.component'; +import { SearchbarComponent } from '../ui/searchbar.component'; import { RoomManagementService } from './room-management.service'; @Component({ @@ -69,7 +84,18 @@ import { RoomManagementService } from './room-management.service'; } `, ], - standalone: false, + imports: [ + CommonModule, + IconComponent, + TranslatePipe, + MatRippleModule, + MatFormFieldModule, + MatSelectModule, + BuildingPipe, + SearchbarComponent, + FormsModule, + MatTooltipModule, + ], }) export class RoomManagerTopbarComponent extends AsyncHandler implements OnInit { private _manager = inject(RoomManagementService); diff --git a/apps/concierge/src/app/room-manager/room-manager.component.ts b/apps/concierge/src/app/room-manager/room-manager.component.ts index 5a79c3c12f..c93d70c8c1 100644 --- a/apps/concierge/src/app/room-manager/room-manager.component.ts +++ b/apps/concierge/src/app/room-manager/room-manager.component.ts @@ -1,4 +1,8 @@ import { Component } from '@angular/core'; +import { ApplicationSidebarComponent } from '../ui/app-sidebar.component'; +import { ApplicationTopbarComponent } from '../ui/app-topbar.component'; +import { RoomListComponent } from './room-list.component'; +import { RoomManagerTopbarComponent } from './room-manager-topbar.component'; @Component({ selector: '[app-new-room-manager]', @@ -37,6 +41,11 @@ import { Component } from '@angular/core'; } `, ], - standalone: false, + imports: [ + ApplicationTopbarComponent, + ApplicationSidebarComponent, + RoomManagerTopbarComponent, + RoomListComponent, + ], }) export class RoomManagerComponent {} diff --git a/apps/concierge/src/app/room-manager/room-manager.module.ts b/apps/concierge/src/app/room-manager/room-manager.module.ts index 67d4db5eba..fb672ce9b0 100644 --- a/apps/concierge/src/app/room-manager/room-manager.module.ts +++ b/apps/concierge/src/app/room-manager/room-manager.module.ts @@ -1,36 +1,12 @@ -import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FormsModule } from '@angular/forms'; import { Route, RouterModule } from '@angular/router'; -import { UIModule } from '../ui/ui.module'; - -import { SharedUsersModule } from '@placeos/users'; - -import { MatChipsModule } from '@angular/material/chips'; -import { RoomAlertModalComponent } from './room-alert-modal.component'; -import { RoomListComponent } from './room-list.component'; -import { RoomManagerTopbarComponent } from './room-manager-topbar.component'; import { RoomManagerComponent } from './room-manager.component'; -import { RoomModalComponent } from './room-modal.component'; const ROUTES: Route[] = [{ path: '', component: RoomManagerComponent }]; @NgModule({ - declarations: [ - RoomManagerComponent, - RoomManagerTopbarComponent, - RoomListComponent, - RoomModalComponent, - RoomAlertModalComponent, - ], - imports: [ - CommonModule, - FormsModule, - UIModule, - SharedUsersModule, - MatChipsModule, - RouterModule.forChild(ROUTES), - ], + declarations: [], + imports: [RoomManagerComponent, RouterModule.forChild(ROUTES)], }) export class RoomManagerModule {} diff --git a/apps/concierge/src/app/room-manager/room-modal.component.ts b/apps/concierge/src/app/room-manager/room-modal.component.ts index a631f956a2..c574ee76e3 100644 --- a/apps/concierge/src/app/room-manager/room-modal.component.ts +++ b/apps/concierge/src/app/room-manager/room-modal.component.ts @@ -1,6 +1,6 @@ import { COMMA, ENTER, SPACE } from '@angular/cdk/keycodes'; import { Component, OnInit, inject, signal } from '@angular/core'; -import { MatChipInputEvent } from '@angular/material/chips'; +import { MatChipInputEvent, MatChipsModule } from '@angular/material/chips'; import { EncryptionLevel, addSystem, @@ -11,14 +11,22 @@ import { } from '@placeos/ts-client'; import { map } from 'rxjs/operators'; -import { FormControl, FormGroup } from '@angular/forms'; +import { CommonModule } from '@angular/common'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { MAT_DIALOG_DATA, MatDialog, MatDialogRef, } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatSelectModule } from '@angular/material/select'; +import { MatTooltipModule } from '@angular/material/tooltip'; import { AsyncHandler, + OrganisationService, + Space, TIMEZONES_IANA, getInvalidFields, getItemWithKeys, @@ -27,8 +35,18 @@ import { notifyWarn, unique, } from '@placeos/common'; -import { Space, generateSystemsFormFields } from '@placeos/events'; -import { OrganisationService } from '@placeos/organisation'; +import { + IconComponent, + SettingsToggleComponent, + TranslatePipe, +} from '@placeos/components'; +import { generateSystemsFormFields } from '@placeos/events'; +import { + CounterComponent, + DurationFieldComponent, + ImageListFieldComponent, +} from '@placeos/form-fields'; +import { FullscreenModalShellComponent } from 'libs/components/src/lib/fullscreen-modal-shell.component'; import { lastValueFrom } from 'rxjs'; import { SelectMapItemModalComponent } from '../ui/select-map-item-modal.component'; @@ -177,12 +195,12 @@ import { SelectMapItemModalComponent } from '../ui/select-map-item-modal.compone 'APP.CONCIERGE.ROOMS_DEFAULT_SETUP' | translate }} - info_outline + info - info_outline + info `, styles: [``], - standalone: false, + imports: [FormsModule, IconComponent, MatRippleModule, TranslatePipe], }) export class SearchOverlayComponent { public readonly item_list = input([]); diff --git a/apps/concierge/src/app/signage/signage-approve-playlist-modal.component.ts b/apps/concierge/src/app/signage/signage-approve-playlist-modal.component.ts index aa8150ac00..fe48e79224 100644 --- a/apps/concierge/src/app/signage/signage-approve-playlist-modal.component.ts +++ b/apps/concierge/src/app/signage/signage-approve-playlist-modal.component.ts @@ -6,14 +6,14 @@ import { MatDialogModule, MatDialogRef, } from '@angular/material/dialog'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { i18n, nextValueFrom, notifySuccess } from '@placeos/common'; +import { IconComponent, TranslatePipe } from '@placeos/components'; import { approveSignagePlaylist, listSignagePlaylistMediaRevisions, updateSignagePlaylistMedia, } from '@placeos/ts-client'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; -import { TranslatePipe } from 'libs/components/src/lib/translate.pipe'; import { BehaviorSubject, combineLatest, @@ -151,6 +151,7 @@ import { SignageStateService } from './signage-state.service'; TranslatePipe, MatRippleModule, MatDialogModule, + MatProgressSpinnerModule, ], }) export class SignageApprovePlaylistModalComponent implements OnInit { diff --git a/apps/concierge/src/app/signage/signage-display-modal.component.ts b/apps/concierge/src/app/signage/signage-display-modal.component.ts index fe1aa806e8..c47e3a0f87 100644 --- a/apps/concierge/src/app/signage/signage-display-modal.component.ts +++ b/apps/concierge/src/app/signage/signage-display-modal.component.ts @@ -1,9 +1,18 @@ import { Component, inject } from '@angular/core'; -import { FormControl, FormGroup, Validators } from '@angular/forms'; +import { + FormControl, + FormGroup, + ReactiveFormsModule, + Validators, +} from '@angular/forms'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import { unique } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatSelectModule } from '@angular/material/select'; +import { OrganisationService, unique } from '@placeos/common'; +import { TranslatePipe } from '@placeos/components'; import { addSystem, PlaceSystem, updateSystem } from '@placeos/ts-client'; +import { FullscreenModalShellComponent } from 'libs/components/src/lib/fullscreen-modal-shell.component'; import { lastValueFrom } from 'rxjs'; @Component({ @@ -94,7 +103,14 @@ import { lastValueFrom } from 'rxjs'; `, styles: [``], - standalone: false, + imports: [ + FullscreenModalShellComponent, + MatFormFieldModule, + MatSelectModule, + MatInputModule, + ReactiveFormsModule, + TranslatePipe, + ], }) export class SignageDisplayModalComponent { private _data = inject<{ diff --git a/apps/concierge/src/app/signage/signage-displays.component.ts b/apps/concierge/src/app/signage/signage-displays.component.ts index 6b7caab926..94f2cb4a0d 100644 --- a/apps/concierge/src/app/signage/signage-displays.component.ts +++ b/apps/concierge/src/app/signage/signage-displays.component.ts @@ -1,7 +1,12 @@ import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'; +import { CommonModule } from '@angular/common'; import { Component, inject, OnInit } from '@angular/core'; +import { FormsModule } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; -import { ActivatedRoute } from '@angular/router'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatMenuModule } from '@angular/material/menu'; +import { ActivatedRoute, RouterModule } from '@angular/router'; import { AsyncHandler, i18n, @@ -11,6 +16,7 @@ import { SettingsService, unique, } from '@placeos/common'; +import { IconComponent, TranslatePipe } from '@placeos/components'; import { listSystemTriggers, SignagePlaylist, @@ -19,6 +25,8 @@ import { } from '@placeos/ts-client'; import { BehaviorSubject, combineLatest, lastValueFrom } from 'rxjs'; import { map, shareReplay, switchMap, tap } from 'rxjs/operators'; +import { SearchOverlayComponent } from './search-overlay.component'; +import { SignageItemPlaylistsComponent } from './signage-item-playlists.component'; import { SignageStateService } from './signage-state.service'; import { ZoneSelectModalComponent } from './zone-select-modal.component'; @@ -320,7 +328,18 @@ import { ZoneSelectModalComponent } from './zone-select-modal.component';
`, styles: [``], - standalone: false, + imports: [ + CommonModule, + TranslatePipe, + MatFormFieldModule, + MatInputModule, + FormsModule, + MatMenuModule, + IconComponent, + SearchOverlayComponent, + RouterModule, + SignageItemPlaylistsComponent, + ], }) export class SignageDisplaysComponent extends AsyncHandler implements OnInit { private _state = inject(SignageStateService); diff --git a/apps/concierge/src/app/signage/signage-item-playlists.component.ts b/apps/concierge/src/app/signage/signage-item-playlists.component.ts index e5b07cadb5..e5c663d193 100644 --- a/apps/concierge/src/app/signage/signage-item-playlists.component.ts +++ b/apps/concierge/src/app/signage/signage-item-playlists.component.ts @@ -1,3 +1,5 @@ +import { DragDropModule } from '@angular/cdk/drag-drop'; +import { CommonModule } from '@angular/common'; import { Component, OnChanges, @@ -6,6 +8,10 @@ import { input, output, } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { TranslatePipe } from '@placeos/components'; import { SignagePlaylist } from '@placeos/ts-client'; import { BehaviorSubject, combineLatest } from 'rxjs'; import { map, startWith, tap } from 'rxjs/operators'; @@ -165,7 +171,14 @@ const PLAYLIST_ITEM_COUNTS = {}; } `, ], - standalone: false, + imports: [ + CommonModule, + TranslatePipe, + MatRippleModule, + MatMenuModule, + DragDropModule, + MatTooltipModule, + ], }) export class SignageItemPlaylistsComponent implements OnChanges { private _state = inject(SignageStateService); diff --git a/apps/concierge/src/app/signage/signage-media-list.component.ts b/apps/concierge/src/app/signage/signage-media-list.component.ts index 5519203b78..2776883cd8 100644 --- a/apps/concierge/src/app/signage/signage-media-list.component.ts +++ b/apps/concierge/src/app/signage/signage-media-list.component.ts @@ -1,3 +1,5 @@ +import { DragDropModule } from '@angular/cdk/drag-drop'; +import { CommonModule } from '@angular/common'; import { Component, inject, @@ -6,7 +8,19 @@ import { signal, SimpleChanges, } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { MatRippleModule } from '@angular/material/core'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatTooltipModule } from '@angular/material/tooltip'; import { notifyError } from '@placeos/common'; +import { + CustomTooltipComponent, + IconComponent, + MediaDurationPipe, + TranslatePipe, +} from '@placeos/components'; import { isValidUrl } from '@placeos/events'; import { listSignagePlaylistMedia, SignageMedia } from '@placeos/ts-client'; import { getUnixTime, startOfMinute } from 'date-fns'; @@ -301,7 +315,20 @@ import { SignageStateService } from './signage-state.service'; } `, ], - standalone: false, + imports: [ + CommonModule, + TranslatePipe, + IconComponent, + MatMenuModule, + MatRippleModule, + MatFormFieldModule, + MatInputModule, + CustomTooltipComponent, + FormsModule, + DragDropModule, + MatTooltipModule, + MediaDurationPipe, + ], }) export class SignageMediaListComponent implements OnChanges { private _state = inject(SignageStateService); diff --git a/apps/concierge/src/app/signage/signage-media-modal.component.ts b/apps/concierge/src/app/signage/signage-media-modal.component.ts index 0db8dc1779..4a32d82e62 100644 --- a/apps/concierge/src/app/signage/signage-media-modal.component.ts +++ b/apps/concierge/src/app/signage/signage-media-modal.component.ts @@ -1,13 +1,29 @@ import { Component, OnDestroy, inject } from '@angular/core'; -import { FormControl, FormGroup, Validators } from '@angular/forms'; +import { + FormControl, + FormGroup, + ReactiveFormsModule, + Validators, +} from '@angular/forms'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatSelectModule } from '@angular/material/select'; +import { MatSliderModule } from '@angular/material/slider'; import { i18n, notifyError, notifySuccess } from '@placeos/common'; +import { + AuthenticatedImageDirective, + MediaDurationPipe, + TranslatePipe, +} from '@placeos/components'; +import { DateFieldComponent } from '@placeos/form-fields'; import { MediaAnimation, SignageMedia, updateSignageMedia, } from '@placeos/ts-client'; import { addYears, endOfDay, getUnixTime, startOfDay } from 'date-fns'; +import { FullscreenModalShellComponent } from 'libs/components/src/lib/fullscreen-modal-shell.component'; import { lastValueFrom } from 'rxjs'; @Component({ @@ -203,7 +219,18 @@ import { lastValueFrom } from 'rxjs'; `, styles: [``], - standalone: false, + imports: [ + FullscreenModalShellComponent, + ReactiveFormsModule, + DateFieldComponent, + TranslatePipe, + MatFormFieldModule, + MatInputModule, + MatSelectModule, + MatSliderModule, + AuthenticatedImageDirective, + MediaDurationPipe, + ], }) export class SignageMediaModalComponent implements OnDestroy { private _data = inject<{ diff --git a/apps/concierge/src/app/signage/signage-media-preview-modal.component.ts b/apps/concierge/src/app/signage/signage-media-preview-modal.component.ts index 0874d6ec4f..2c70c87e7c 100644 --- a/apps/concierge/src/app/signage/signage-media-preview-modal.component.ts +++ b/apps/concierge/src/app/signage/signage-media-preview-modal.component.ts @@ -1,10 +1,12 @@ import { Component, inject, output, signal } from '@angular/core'; import { MatRippleModule } from '@angular/material/core'; import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog'; -import { AuthenticatedImageDirective } from 'libs/components/src/lib/authenticated-image.directive'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; -import { SafePipe } from 'libs/components/src/lib/safe.pipe'; -import { TranslatePipe } from 'libs/components/src/lib/translate.pipe'; +import { + AuthenticatedImageDirective, + IconComponent, + SafePipe, + TranslatePipe, +} from '@placeos/components'; @Component({ selector: 'signage-media-preview-modal', diff --git a/apps/concierge/src/app/signage/signage-media.component.ts b/apps/concierge/src/app/signage/signage-media.component.ts index a2470a7a46..5a48d516b8 100644 --- a/apps/concierge/src/app/signage/signage-media.component.ts +++ b/apps/concierge/src/app/signage/signage-media.component.ts @@ -1,11 +1,19 @@ -import { Component, inject, OnInit } from '@angular/core'; +import { Component, inject, OnInit, signal } from '@angular/core'; -import { CdkDragDrop } from '@angular/cdk/drag-drop'; -import { ActivatedRoute, Router } from '@angular/router'; +import { CdkDragDrop, DragDropModule } from '@angular/cdk/drag-drop'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatRippleModule } from '@angular/material/core'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { ActivatedRoute, Router, RouterModule } from '@angular/router'; import { AsyncHandler } from '@placeos/common'; +import { IconComponent, TranslatePipe } from '@placeos/components'; import { listSignagePlaylistMedia, SignagePlaylist } from '@placeos/ts-client'; import { BehaviorSubject, combineLatest } from 'rxjs'; import { map } from 'rxjs/operators'; +import { SignageMediaListComponent } from './signage-media-list.component'; +import { SignagePlaylistMediaListComponent } from './signage-playlist-media-list.component'; import { SignageStateService } from './signage-state.service'; @Component({ @@ -115,16 +123,16 @@ import { SignageStateService } from './signage-state.service'; @if (!selected_playlist) { + /> } @if (selected_playlist) { + /> }
- @if (show_dropzone) { + @if (show_dropzone()) {
{ const result = await this._state.editPlaylist(); @@ -198,15 +218,15 @@ export class SignageMediaComponent extends AsyncHandler implements OnInit { public onEnter(e) { this.clearTimeout('hide_overlay'); - this.show_dropzone = e?.dataTransfer?.types.includes('Files'); + this.show_dropzone.set(e?.dataTransfer?.types.includes('Files')); } public hideOverlay(e) { - if (!this.show_dropzone) return; + if (!this.show_dropzone()) return; if (!(e.target instanceof HTMLInputElement)) { e.preventDefault(); } - this.timeout('hide_overlay', () => (this.show_dropzone = false)); + this.timeout('hide_overlay', () => this.show_dropzone.set(false)); } public ngOnInit() { diff --git a/apps/concierge/src/app/signage/signage-playlist-media-list.component.ts b/apps/concierge/src/app/signage/signage-playlist-media-list.component.ts index ec8df8d678..322f8d19d1 100644 --- a/apps/concierge/src/app/signage/signage-playlist-media-list.component.ts +++ b/apps/concierge/src/app/signage/signage-playlist-media-list.component.ts @@ -1,6 +1,14 @@ import { Clipboard } from '@angular/cdk/clipboard'; -import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'; +import { + CdkDragDrop, + DragDropModule, + moveItemInArray, +} from '@angular/cdk/drag-drop'; +import { CommonModule } from '@angular/common'; import { Component, inject, input, signal, SimpleChanges } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatTooltipModule } from '@angular/material/tooltip'; import { Router } from '@angular/router'; import { currentUser, @@ -8,6 +16,12 @@ import { notifyInfo, SettingsService, } from '@placeos/common'; +import { + AuthenticatedImageDirective, + IconComponent, + MediaDurationPipe, + TranslatePipe, +} from '@placeos/components'; import { listSignagePlaylistMedia, MediaAnimation, @@ -314,7 +328,17 @@ import { SignageStateService } from './signage-state.service'; } `, ], - standalone: false, + imports: [ + CommonModule, + TranslatePipe, + IconComponent, + MatMenuModule, + MatRippleModule, + AuthenticatedImageDirective, + DragDropModule, + MatTooltipModule, + MediaDurationPipe, + ], }) export class SignagePlaylistMediaListComponent { private _state = inject(SignageStateService); diff --git a/apps/concierge/src/app/signage/signage-playlist-modal.component.ts b/apps/concierge/src/app/signage/signage-playlist-modal.component.ts index 6ae4aec8bf..940c1c1d1a 100644 --- a/apps/concierge/src/app/signage/signage-playlist-modal.component.ts +++ b/apps/concierge/src/app/signage/signage-playlist-modal.component.ts @@ -6,9 +6,29 @@ import { signal, viewChild, } from '@angular/core'; -import { FormControl, FormGroup, Validators } from '@angular/forms'; +import { + FormControl, + FormGroup, + FormsModule, + ReactiveFormsModule, + Validators, +} from '@angular/forms'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatSelectModule } from '@angular/material/select'; +import { MatSliderModule } from '@angular/material/slider'; import { notifyError, padLength } from '@placeos/common'; +import { + MediaDurationPipe, + SettingsToggleComponent, + TranslatePipe, +} from '@placeos/components'; +import { + DateFieldComponent, + DurationFieldComponent, + TimeFieldComponent, +} from '@placeos/form-fields'; import { MediaAnimation, SignagePlaylist } from '@placeos/ts-client'; import { addDays, @@ -18,6 +38,8 @@ import { set, startOfDay, } from 'date-fns'; +import { FullscreenModalShellComponent } from 'libs/components/src/lib/fullscreen-modal-shell.component'; +import { CronInputFieldComponent } from 'libs/form-fields/src/lib/cron-input-field.component'; import { BehaviorSubject } from 'rxjs'; import { SignageStateService } from './signage-state.service'; @@ -350,7 +372,22 @@ import { SignageStateService } from './signage-state.service'; `, styles: [``], - standalone: false, + imports: [ + TranslatePipe, + FullscreenModalShellComponent, + SettingsToggleComponent, + DurationFieldComponent, + ReactiveFormsModule, + CronInputFieldComponent, + TimeFieldComponent, + DateFieldComponent, + MatFormFieldModule, + MatSelectModule, + MatInputModule, + MatSliderModule, + FormsModule, + MediaDurationPipe, + ], }) export class SignagePlaylistModalComponent implements OnInit { private _data: SignagePlaylist = diff --git a/apps/concierge/src/app/signage/signage-state.service.ts b/apps/concierge/src/app/signage/signage-state.service.ts index 3488c90c45..79019f76ed 100644 --- a/apps/concierge/src/app/signage/signage-state.service.ts +++ b/apps/concierge/src/app/signage/signage-state.service.ts @@ -1,13 +1,14 @@ import { inject, Injectable } from '@angular/core'; import { AsyncHandler, + Attachment, i18n, notifyError, notifySuccess, + OrganisationService, SettingsService, UploadsService, } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; import { addSignageMedia, addSignagePlaylist, @@ -27,7 +28,6 @@ import { updateSignagePlaylistMedia, updateSystem, } from '@placeos/ts-client'; -import { Attachment } from '@placeos/users'; import { BehaviorSubject, combineLatest, @@ -45,7 +45,7 @@ import { } from 'rxjs/operators'; import { MatDialog } from '@angular/material/dialog'; -import { openConfirmModal } from 'libs/components/src/lib/confirm-modal.component'; +import { openConfirmModal } from '@placeos/components'; import { SignageApprovePlaylistModalComponent } from './signage-approve-playlist-modal.component'; import { SignageDisplayModalComponent } from './signage-display-modal.component'; import { SignageMediaModalComponent } from './signage-media-modal.component'; diff --git a/apps/concierge/src/app/signage/signage-topbar.component.ts b/apps/concierge/src/app/signage/signage-topbar.component.ts index f683928ddf..89b2bffcbe 100644 --- a/apps/concierge/src/app/signage/signage-topbar.component.ts +++ b/apps/concierge/src/app/signage/signage-topbar.component.ts @@ -2,8 +2,7 @@ import { Component, OnInit, inject } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { first } from 'rxjs/operators'; -import { AsyncHandler } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { AsyncHandler, OrganisationService } from '@placeos/common'; import { SignageStateService } from './signage-state.service'; @Component({ @@ -48,7 +47,7 @@ import { SignageStateService } from './signage-state.service'; } `, ], - standalone: false, + imports: [], }) export class SignageTopbarComponent extends AsyncHandler implements OnInit { private _state = inject(SignageStateService); diff --git a/apps/concierge/src/app/signage/signage-zones.component.ts b/apps/concierge/src/app/signage/signage-zones.component.ts index e145797ee4..0877a1fb87 100644 --- a/apps/concierge/src/app/signage/signage-zones.component.ts +++ b/apps/concierge/src/app/signage/signage-zones.component.ts @@ -1,12 +1,18 @@ import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'; +import { CommonModule } from '@angular/common'; import { Component, inject, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; +import { FormsModule } from '@angular/forms'; +import { MatRippleModule } from '@angular/material/core'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { ActivatedRoute, RouterModule } from '@angular/router'; import { AsyncHandler, i18n, nextValueFrom, notifySuccess, } from '@placeos/common'; +import { IconComponent, TranslatePipe } from '@placeos/components'; import { listZoneTriggers, SignagePlaylist, @@ -15,6 +21,8 @@ import { } from '@placeos/ts-client'; import { BehaviorSubject, combineLatest } from 'rxjs'; import { map, shareReplay, switchMap, tap } from 'rxjs/operators'; +import { SearchOverlayComponent } from './search-overlay.component'; +import { SignageItemPlaylistsComponent } from './signage-item-playlists.component'; import { SignageStateService } from './signage-state.service'; @Component({ @@ -150,7 +158,18 @@ import { SignageStateService } from './signage-state.service';
`, styles: [``], - standalone: false, + imports: [ + TranslatePipe, + MatFormFieldModule, + MatInputModule, + MatRippleModule, + RouterModule, + IconComponent, + SearchOverlayComponent, + SignageItemPlaylistsComponent, + CommonModule, + FormsModule, + ], }) export class SignageZonesComponent extends AsyncHandler implements OnInit { private _state = inject(SignageStateService); diff --git a/apps/concierge/src/app/signage/signage.component.ts b/apps/concierge/src/app/signage/signage.component.ts index 08569ffbab..9a1ad1b00e 100644 --- a/apps/concierge/src/app/signage/signage.component.ts +++ b/apps/concierge/src/app/signage/signage.component.ts @@ -1,7 +1,13 @@ import { Component, OnInit, inject } from '@angular/core'; -import { NavigationEnd, Router } from '@angular/router'; +import { CommonModule } from '@angular/common'; +import { MatRippleModule } from '@angular/material/core'; +import { MatTabsModule } from '@angular/material/tabs'; +import { NavigationEnd, Router, RouterModule } from '@angular/router'; import { AsyncHandler, i18n } from '@placeos/common'; +import { TranslatePipe } from '@placeos/components'; +import { ApplicationSidebarComponent } from '../ui/app-sidebar.component'; +import { ApplicationTopbarComponent } from '../ui/app-topbar.component'; import { SignageStateService } from './signage-state.service'; @Component({ @@ -11,7 +17,7 @@ import { SignageStateService } from './signage-state.service';
-
+

{{ 'APP.CONCIERGE.SIGNAGE_HEADER' | translate }}

@@ -34,20 +40,22 @@ import { SignageStateService } from './signage-state.service'; }
- +
+ +
[] = [ - SignageComponent, - SignageTopbarComponent, - SignageMediaComponent, - SignageMediaModalComponent, - SignagePlaylistModalComponent, - SignageMediaListComponent, - SignagePlaylistMediaListComponent, - - SignageDisplaysComponent, - SignageDisplayModalComponent, - SignageZonesComponent, - SearchOverlayComponent, - SignageItemPlaylistsComponent, -]; - @NgModule({ - declarations: [...COMPONENTS], + declarations: [], imports: [ - CommonModule, - FormsModule, - UIModule, - ComponentsModule, + SignageComponent, + SignageMediaComponent, + SignageDisplaysComponent, + SignageZonesComponent, RouterModule.forChild(ROUTES), - MatTabsModule, - DragDropModule, - ZoneSelectModalComponent, - SignageApprovePlaylistModalComponent, - - SignageMediaPreviewModalComponent, ], }) export class SignageModule {} diff --git a/apps/concierge/src/app/signage/zone-select-modal.component.ts b/apps/concierge/src/app/signage/zone-select-modal.component.ts index dfc21c684e..8a2bedfacf 100644 --- a/apps/concierge/src/app/signage/zone-select-modal.component.ts +++ b/apps/concierge/src/app/signage/zone-select-modal.component.ts @@ -5,9 +5,8 @@ import { MatRippleModule } from '@angular/material/core'; import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; +import { IconComponent, TranslatePipe } from '@placeos/components'; import { queryZones } from '@placeos/ts-client'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; -import { TranslatePipe } from 'libs/components/src/lib/translate.pipe'; import { BehaviorSubject, catchError, diff --git a/apps/concierge/src/app/staff/emergency-contact-modal.component.ts b/apps/concierge/src/app/staff/emergency-contact-modal.component.ts index 652d612c0d..5e28543bb8 100644 --- a/apps/concierge/src/app/staff/emergency-contact-modal.component.ts +++ b/apps/concierge/src/app/staff/emergency-contact-modal.component.ts @@ -1,16 +1,36 @@ +import { CommonModule } from '@angular/common'; import { Component, inject, signal, viewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { + FormControl, + FormGroup, + FormsModule, + ReactiveFormsModule, +} from '@angular/forms'; +import { MatRippleModule } from '@angular/material/core'; +import { + MAT_DIALOG_DATA, + MatDialogModule, + MatDialogRef, +} from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { MatSelectModule } from '@angular/material/select'; import { i18n, nextValueFrom, notifyError, notifySuccess, + OrganisationService, randomString, } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { + CustomTooltipComponent, + IconComponent, + TranslatePipe, +} from '@placeos/components'; +import { UserSearchFieldComponent } from '@placeos/form-fields'; import { showMetadata, updateMetadata } from '@placeos/ts-client'; -import { CustomTooltipComponent } from 'libs/components/src/lib/custom-tooltip.component'; import { BehaviorSubject, combineLatest } from 'rxjs'; import { filter, map, shareReplay, switchMap } from 'rxjs/operators'; import { EmergencyContact } from './emergency-contacts.component'; @@ -169,7 +189,21 @@ import { EmergencyContact } from './emergency-contacts.component'; `, styles: [``], - standalone: false, + imports: [ + CommonModule, + TranslatePipe, + IconComponent, + MatDialogModule, + MatFormFieldModule, + MatInputModule, + MatSelectModule, + MatRippleModule, + FormsModule, + ReactiveFormsModule, + MatProgressSpinnerModule, + CustomTooltipComponent, + UserSearchFieldComponent, + ], }) export class EmergencyContactModalComponent { private _data = inject(MAT_DIALOG_DATA); diff --git a/apps/concierge/src/app/staff/emergency-contacts.component.ts b/apps/concierge/src/app/staff/emergency-contacts.component.ts index f473166f41..f10fdd8e90 100644 --- a/apps/concierge/src/app/staff/emergency-contacts.component.ts +++ b/apps/concierge/src/app/staff/emergency-contacts.component.ts @@ -1,12 +1,29 @@ import { Clipboard } from '@angular/cdk/clipboard'; +import { CommonModule } from '@angular/common'; import { Component, inject } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { MatRippleModule } from '@angular/material/core'; import { MatDialog } from '@angular/material/dialog'; -import { nextValueFrom, notifySuccess } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatSelectModule } from '@angular/material/select'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { + nextValueFrom, + notifySuccess, + OrganisationService, +} from '@placeos/common'; +import { + IconComponent, + openConfirmModal, + SimpleTableComponent, + TranslatePipe, +} from '@placeos/components'; import { showMetadata, updateMetadata } from '@placeos/ts-client'; -import { openConfirmModal } from 'libs/components/src/lib/confirm-modal.component'; import { BehaviorSubject, combineLatest } from 'rxjs'; import { filter, map, shareReplay, switchMap } from 'rxjs/operators'; +import { ApplicationSidebarComponent } from '../ui/app-sidebar.component'; +import { ApplicationTopbarComponent } from '../ui/app-topbar.component'; import { EmergencyContactModalComponent } from './emergency-contact-modal.component'; import { RoleManagementModalComponent } from './role-management-modal.component'; @@ -213,7 +230,20 @@ export interface EmergencyContactData { } `, ], - standalone: false, + imports: [ + CommonModule, + MatRippleModule, + IconComponent, + MatTooltipModule, + SimpleTableComponent, + MatFormFieldModule, + MatSelectModule, + MatInputModule, + ApplicationTopbarComponent, + ApplicationSidebarComponent, + FormsModule, + TranslatePipe, + ], }) export class EmergencyContactsComponent { private _org = inject(OrganisationService); diff --git a/apps/concierge/src/app/staff/role-management-modal.component.ts b/apps/concierge/src/app/staff/role-management-modal.component.ts index 4647ebb41f..e961d304c7 100644 --- a/apps/concierge/src/app/staff/role-management-modal.component.ts +++ b/apps/concierge/src/app/staff/role-management-modal.component.ts @@ -1,9 +1,16 @@ +import { CommonModule } from '@angular/common'; import { Component, inject, viewChild } from '@angular/core'; -import { MatDialogRef } from '@angular/material/dialog'; -import { nextValueFrom } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { MatRippleModule } from '@angular/material/core'; +import { MatDialogModule, MatDialogRef } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { nextValueFrom, OrganisationService } from '@placeos/common'; +import { + CustomTooltipComponent, + IconComponent, + TranslatePipe, +} from '@placeos/components'; import { showMetadata, updateMetadata } from '@placeos/ts-client'; -import { CustomTooltipComponent } from 'libs/components/src/lib/custom-tooltip.component'; import { BehaviorSubject, combineLatest } from 'rxjs'; import { filter, map, shareReplay, switchMap } from 'rxjs/operators'; @@ -82,7 +89,16 @@ import { filter, map, shareReplay, switchMap } from 'rxjs/operators'; `, styles: [``], - standalone: false, + imports: [ + CommonModule, + MatDialogModule, + MatRippleModule, + MatFormFieldModule, + MatInputModule, + TranslatePipe, + IconComponent, + CustomTooltipComponent, + ], }) export class RoleManagementModalComponent { private _org = inject(OrganisationService); diff --git a/apps/concierge/src/app/staff/staff-details.component.ts b/apps/concierge/src/app/staff/staff-details.component.ts index ecd530b860..8de11610ee 100644 --- a/apps/concierge/src/app/staff/staff-details.component.ts +++ b/apps/concierge/src/app/staff/staff-details.component.ts @@ -1,7 +1,13 @@ import { Component, inject, input } from '@angular/core'; -import { i18n, notifyError } from '@placeos/common'; -import { StaffUser } from '@placeos/users'; +import { i18n, notifyError, StaffUser } from '@placeos/common'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { + ActionIconComponent, + IconComponent, + TranslatePipe, + UserAvatarComponent, +} from '@placeos/components'; import { StaffStateService } from './staff-state.service'; @Component({ @@ -62,7 +68,13 @@ import { StaffStateService } from './staff-state.service'; } `, styles: [``], - standalone: false, + imports: [ + UserAvatarComponent, + ActionIconComponent, + IconComponent, + MatTooltipModule, + TranslatePipe, + ], }) export class StaffDetailsComponent { private _state = inject(StaffStateService); diff --git a/apps/concierge/src/app/staff/staff-listing.component.ts b/apps/concierge/src/app/staff/staff-listing.component.ts index 2c2dd39893..0085e89cc5 100644 --- a/apps/concierge/src/app/staff/staff-listing.component.ts +++ b/apps/concierge/src/app/staff/staff-listing.component.ts @@ -2,6 +2,10 @@ import { Component, ElementRef, inject, viewChild } from '@angular/core'; import { AsyncHandler } from '@placeos/common'; import { map } from 'rxjs/operators'; +import { CommonModule } from '@angular/common'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { TranslatePipe } from '@placeos/components'; +import { StaffDetailsComponent } from './staff-details.component'; import { StaffStateService } from './staff-state.service'; const CHARS = '#abcdefghijklmnopqrstuvwxyz'.split(''); @@ -23,7 +27,7 @@ const CHARS = '#abcdefghijklmnopqrstuvwxyz'.split(''); }
{{ group }}
@@ -101,7 +105,12 @@ const CHARS = '#abcdefghijklmnopqrstuvwxyz'.split(''); } `, ], - standalone: false, + imports: [ + CommonModule, + MatProgressBarModule, + StaffDetailsComponent, + TranslatePipe, + ], }) export class StaffListingComponent extends AsyncHandler { private _state = inject(StaffStateService); diff --git a/apps/concierge/src/app/staff/staff-state.service.ts b/apps/concierge/src/app/staff/staff-state.service.ts index 1fbcc7e7f9..5a634f2a37 100644 --- a/apps/concierge/src/app/staff/staff-state.service.ts +++ b/apps/concierge/src/app/staff/staff-state.service.ts @@ -1,15 +1,15 @@ import { inject, Injectable } from '@angular/core'; -import { searchStaff, StaffUser } from '@placeos/users'; +import { searchStaff } from '@placeos/users'; import { BehaviorSubject, combineLatest } from 'rxjs'; +import { checkinBooking, queryBookings, saveBooking } from '@placeos/bookings'; import { + AsyncHandler, Booking, - checkinBooking, - queryBookings, - saveBooking, -} from '@placeos/bookings'; -import { AsyncHandler, timePeriodsIntersect } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; + OrganisationService, + StaffUser, + timePeriodsIntersect, +} from '@placeos/common'; import { endOfDay, getUnixTime, startOfDay } from 'date-fns'; import { map, shareReplay, switchMap } from 'rxjs/operators'; @@ -27,13 +27,9 @@ export class StaffStateService extends AsyncHandler { private _onsite: Record = {}; private _events: Record = {}; - private _filters = new BehaviorSubject({}); - private _search = new BehaviorSubject(''); - private _loading = new BehaviorSubject(false); - private _users = new BehaviorSubject([]); public readonly loading = this._loading.asObservable(); diff --git a/apps/concierge/src/app/staff/staff-topbar.component.ts b/apps/concierge/src/app/staff/staff-topbar.component.ts index 48c1811ef5..628d0da567 100644 --- a/apps/concierge/src/app/staff/staff-topbar.component.ts +++ b/apps/concierge/src/app/staff/staff-topbar.component.ts @@ -2,17 +2,23 @@ import { Component, OnInit, inject } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { first } from 'rxjs/operators'; -import { AsyncHandler } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatSelectModule } from '@angular/material/select'; +import { MatSlideToggleModule } from '@angular/material/slide-toggle'; +import { AsyncHandler, OrganisationService } from '@placeos/common'; +import { TranslatePipe } from '@placeos/components'; +import { SearchbarComponent } from '../ui/searchbar.component'; import { StaffStateService } from './staff-state.service'; @Component({ selector: 'staff-topbar', template: `
- + [] = [ - StaffComponent, - StaffTopbarComponent, - StaffListingComponent, - StaffDetailsComponent, - EmergencyContactsComponent, - EmergencyContactModalComponent, - RoleManagementModalComponent, -]; - @NgModule({ - declarations: [...COMPONENTS], + declarations: [], imports: [ - CommonModule, - FormsModule, - UIModule, + StaffComponent, + EmergencyContactsComponent, RouterModule.forChild(ROUTES), ], }) diff --git a/apps/concierge/src/app/surveys/building-list.component.ts b/apps/concierge/src/app/surveys/building-list.component.ts index 99466c1035..5742d6e4d9 100644 --- a/apps/concierge/src/app/surveys/building-list.component.ts +++ b/apps/concierge/src/app/surveys/building-list.component.ts @@ -1,9 +1,13 @@ -import { Component, inject } from '@angular/core'; -import { flatten } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; -import { combineLatest } from 'rxjs'; -import { map, shareReplay, startWith } from 'rxjs/operators'; -import { NewSurveyService } from './new-survey.service'; +import { CommonModule } from '@angular/common'; +import { Component, computed, inject } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { AsyncHandler, flatten, OrganisationService } from '@placeos/common'; +import { + AuthenticatedImageDirective, + IconComponent, + TranslatePipe, +} from '@placeos/components'; +import { SurveyService } from './survey.service'; @Component({ selector: 'building-list', @@ -17,12 +21,14 @@ import { NewSurveyService } from './new-survey.service';
{{ 'APP.CONCIERGE.SURVEY_BUILDING_COUNT' - | translate: { count: (buildings$ | async)?.length } + | translate + : { count: buildings()?.length } + : buildings()?.length }}
-
- @for (building of buildings$ | async; track building.id) { - @let stats = (stats$ | async)[building.id]; +
+ @for (building of buildings(); track building.id) { + @let stats = bld_stats()?.[building.id]; } + @if (buildings().length <= 0) { +
+
+ {{ 'APP.CONCIERGE.SURVEY_NO_BLD' | translate }} +
+
+ }
`, @@ -112,44 +127,42 @@ import { NewSurveyService } from './new-survey.service'; } `, ], - standalone: false, + imports: [ + AuthenticatedImageDirective, + CommonModule, + TranslatePipe, + RouterModule, + IconComponent, + ], }) -export class BuildingListComponent { +export class BuildingListComponent extends AsyncHandler { private _org = inject(OrganisationService); - private _survey = inject(NewSurveyService); + private _survey = inject(SurveyService); - public readonly buildings$ = this._org.building_list; - public readonly surveys$ = this._survey.survey_list$; - public readonly answers$ = this._survey.answer_list$; + public readonly buildings = this._org.buildings_signal; + public readonly surveys = this._survey.survey_list; + public readonly answers = this._survey.answer_list; - public readonly stats$ = combineLatest([ - this.buildings$, - this.surveys$, - this.answers$, - ]).pipe( - map(([bld_list, surveys, answers]) => { - const mapping = {}; - const answers_list = flatten(answers); - for (let i = 0; i < bld_list.length; i++) { - const bld = bld_list[i]; - const survey_list = surveys.filter( - (_) => _.building_id === bld.id, - ); - mapping[bld.id] = { - live: survey_list.filter( - (_) => `${_.trigger}`.toLowerCase() !== 'none', - ).length, - drafts: survey_list.filter( - (_) => `${_.trigger}`.toLowerCase() === 'none', - ).length, - answers: answers_list.filter((resp) => - survey_list.find((_) => _.id === resp.survey_id), - ).length, - }; - } - return mapping; - }), - startWith({}), - shareReplay(1), - ); + public readonly bld_stats = computed(() => { + const mapping = {}; + const answers_list = flatten(this.answers()); + for (let i = 0; i < this.buildings().length; i++) { + const bld = this.buildings()[i]; + const survey_list = this.surveys().filter( + (_) => _.building_id === bld.id, + ); + mapping[bld.id] = { + live: survey_list.filter( + (_) => `${_.trigger}`.toLowerCase() !== 'none', + ).length, + drafts: survey_list.filter( + (_) => `${_.trigger}`.toLowerCase() === 'none', + ).length, + answers: answers_list.filter((resp) => + survey_list.find((_) => _.id === resp.survey_id), + ).length, + }; + } + return mapping; + }); } diff --git a/apps/concierge/src/app/surveys/new-survey-widget.component.ts b/apps/concierge/src/app/surveys/new-survey-widget.component.ts index 4e5631a1e5..d49bfc78a4 100644 --- a/apps/concierge/src/app/surveys/new-survey-widget.component.ts +++ b/apps/concierge/src/app/surveys/new-survey-widget.component.ts @@ -1,7 +1,7 @@ import { CommonModule } from '@angular/common'; import { Component, computed, input } from '@angular/core'; import { SurveyAnswer, SurveyQuestion } from '@placeos/ts-client'; -import { QuestionType } from './new-survey.service'; +import { QuestionType } from './types'; @Component({ selector: 'new-survey-widget', diff --git a/apps/concierge/src/app/surveys/new-survey.service.ts b/apps/concierge/src/app/surveys/new-survey.service.ts index 1a39825a7a..fa36efa405 100644 --- a/apps/concierge/src/app/surveys/new-survey.service.ts +++ b/apps/concierge/src/app/surveys/new-survey.service.ts @@ -1,7 +1,7 @@ -import { Injectable } from '@angular/core'; +import { computed, inject, Injectable, signal } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; -import { flatten, notifySuccess } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { flatten, notifySuccess, OrganisationService } from '@placeos/common'; +import { openConfirmModal } from '@placeos/components'; import { queryAnswers, queryQuestions, @@ -13,7 +13,6 @@ import { SurveyAnswer, SurveyQuestion, } from '@placeos/ts-client'; -import { openConfirmModal } from 'libs/components/src/lib/confirm-modal.component'; import { BehaviorSubject, combineLatest, @@ -27,50 +26,8 @@ import { tap, } from 'rxjs'; import { QuestionModalComponent } from './question-modal.component'; -import { updateQuestionMap } from './question.pipe'; - -export enum TriggerEnum { - None = 'NONE', - Reserved = 'RESERVED', - Checked_In = 'CHECKEDIN', - Checked_Out = 'CHECKEDOUT', - // No_Show = 'NOSHOW', - Rejected = 'REJECTED', - Cancelled = 'CANCELLED', - // Ended = 'ENDED' - Visitor = 'VISITOR', -} - -export enum QuestionType { - Single_Line_Text = 'text', - Comment_Box = 'comment', - Radio_Group = 'radiogroup', - Drop_Down = 'dropdown', - Check_Box = 'checkbox', - Rating = 'rating', - Empty = '0[EMPTY]', -} - -export const TriggerOptions = getEnumOptions(TriggerEnum); -export const QuestionTypeOptions = getEnumOptions(QuestionType); -export const QuestionTypeMap = getEnumMap(QuestionType); - -export function getEnumOptions(targetEnum: T) { - return Object.entries(targetEnum) - .filter((e) => isNaN(Number(e[0]))) - .map((e) => ({ - name: e[0].replace(/_/g, ' '), - id: e[1], - })); -} - -export function getEnumMap(targetEnum: T) { - const enum_map = {}; - Object.entries(targetEnum) - .filter((e) => isNaN(Number(e[0]))) - .forEach((e) => (enum_map[e[1]] = e[0].replace(/_/g, ' '))); - return enum_map; -} +// import { QuestionModalComponent } from './question-modal.component'; +// import { updateQuestionMap } from './question.pipe'; export interface QuestionFilters { search_text?: string; @@ -87,12 +44,30 @@ export interface QuestionFilters { providedIn: 'root', }) export class NewSurveyService { + private _org = inject(OrganisationService); + private _dialog = inject(MatDialog); + private _survey_id = new BehaviorSubject(''); private _bld_id = new BehaviorSubject(''); private _change = new BehaviorSubject(0); private _loading = new BehaviorSubject(false); private _question_filters = new BehaviorSubject({}); + public readonly survey_list = signal([]); + public readonly answer_list = signal([]); + public readonly building_surveys = computed(() => { + const bld_id = this._org.building_signal().id; + return this.survey_list().filter( + (survey) => survey.building_id === bld_id, + ); + }); + public readonly building_answers = computed(() => { + const surveys = this.building_surveys(); + return this.answer_list().filter((answer) => + surveys.find((s) => s.id === answer.survey_id), + ); + }); + public readonly survey_list$ = combineLatest([ this._org.building_list, this._change, @@ -102,6 +77,7 @@ export class NewSurveyService { forkJoin(list.map((bld) => querySurveys({ building_id: bld.id }))), ), map((data) => flatten(data) as Survey[]), + tap((list) => this.survey_list.set(list)), shareReplay(1), ); @@ -116,6 +92,7 @@ export class NewSurveyService { ), map((answers) => flatten(answers) as SurveyAnswer[]), tap(() => this._loading.next(false)), + tap((list) => this.answer_list.set(list)), shareReplay(1), ); @@ -145,7 +122,7 @@ export class NewSurveyService { public readonly questions$: Observable = queryQuestions({ limit: 1000, } as any).pipe( - tap((l) => updateQuestionMap(l)), + // tap((l) => updateQuestionMap(l)), shareReplay(1), ); @@ -182,11 +159,6 @@ export class NewSurveyService { public readonly loading$ = this._loading.asObservable(); - constructor( - private _org: OrganisationService, - private _dialog: MatDialog, - ) {} - public get building() { return this._org.buildings.find( (bld) => bld.id === this._bld_id.getValue(), diff --git a/apps/concierge/src/app/surveys/question-modal.component.ts b/apps/concierge/src/app/surveys/question-modal.component.ts index dc850859e8..4e096ddb6b 100644 --- a/apps/concierge/src/app/surveys/question-modal.component.ts +++ b/apps/concierge/src/app/surveys/question-modal.component.ts @@ -1,5 +1,5 @@ import { CommonModule } from '@angular/common'; -import { Component, Inject, viewChild } from '@angular/core'; +import { Component, inject, OnInit, viewChild } from '@angular/core'; import { MatRippleModule } from '@angular/material/core'; import { MAT_DIALOG_DATA, @@ -7,13 +7,12 @@ import { MatDialogRef, } from '@angular/material/dialog'; import { notifySuccess } from '@placeos/common'; +import { IconComponent, TranslatePipe } from '@placeos/components'; import { addQuestion, SurveyQuestion, updateQuestion, } from '@placeos/ts-client'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; -import { TranslatePipe } from 'libs/components/src/lib/translate.pipe'; import { lastValueFrom } from 'rxjs'; import { QuestionComponent } from './question.component'; @@ -63,17 +62,17 @@ import { QuestionComponent } from './question.component'; MatDialogModule, ], }) -export class QuestionModalComponent { - readonly question_el = viewChild('question_el'); +export class QuestionModalComponent implements OnInit { + private _data: SurveyQuestion = inject(MAT_DIALOG_DATA); + private _dialog_ref = inject(MatDialogRef); + + public readonly question_el = viewChild('question_el'); public is_edit = false; public loading = false; public question: SurveyQuestion; - constructor( - @Inject(MAT_DIALOG_DATA) private _data: SurveyQuestion, - private _dialog_ref: MatDialogRef, - ) { + public ngOnInit() { this.is_edit = !!(this._data?.id > 0); this.question = this._data || new SurveyQuestion({ type: 'text' }); console.log('Data', this._data, this.question); diff --git a/apps/concierge/src/app/surveys/question.component.ts b/apps/concierge/src/app/surveys/question.component.ts index 6ee39c69d5..39d49e1d54 100644 --- a/apps/concierge/src/app/surveys/question.component.ts +++ b/apps/concierge/src/app/surveys/question.component.ts @@ -10,19 +10,20 @@ import { } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatRippleModule } from '@angular/material/core'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; import { MatRadioModule } from '@angular/material/radio'; import { MatSelectModule } from '@angular/material/select'; - -import { IconComponent } from 'libs/components/src/lib/icon.component'; -import { SettingsToggleComponent } from 'libs/components/src/lib/settings-toggle.component'; -import { TranslatePipe } from 'libs/components/src/lib/translate.pipe'; -import { CounterComponent } from 'libs/form-fields/src/lib/counter.component'; - -import { MatRippleModule } from '@angular/material/core'; +import { + IconComponent, + SettingsToggleComponent, + TranslatePipe, +} from '@placeos/components'; +import { CounterComponent } from '@placeos/form-fields'; import { SurveyQuestion } from '@placeos/ts-client'; -import { QuestionType, QuestionTypeOptions } from './new-survey.service'; + +import { QuestionType, QuestionTypeOptions } from './types'; @Component({ selector: 'placeos-question', diff --git a/apps/concierge/src/app/surveys/question.pipe.ts b/apps/concierge/src/app/surveys/question.pipe.ts index 74399bfdba..b2638fe343 100644 --- a/apps/concierge/src/app/surveys/question.pipe.ts +++ b/apps/concierge/src/app/surveys/question.pipe.ts @@ -1,6 +1,7 @@ import { Pipe, PipeTransform } from '@angular/core'; import { AsyncHandler } from '@placeos/common'; import { showQuestion, SurveyQuestion } from '@placeos/ts-client'; +import { lastValueFrom } from 'rxjs'; const QUESTION_MAP: Record = {}; @@ -14,11 +15,8 @@ export function updateQuestionMap(list: SurveyQuestion[]) { export class QuestionPipe extends AsyncHandler implements PipeTransform { transform(id: string): SurveyQuestion | undefined { if (!QUESTION_MAP[id]) { - this.subscription( - id, - showQuestion(id).subscribe( - (question) => (QUESTION_MAP[id] = question), - ), + lastValueFrom(showQuestion(id)).then( + (question) => (QUESTION_MAP[id] = question), ); } return QUESTION_MAP[id]; diff --git a/apps/concierge/src/app/surveys/survey-builder.component.ts b/apps/concierge/src/app/surveys/survey-builder.component.ts index 82d7522ee0..4514b9d19c 100644 --- a/apps/concierge/src/app/surveys/survey-builder.component.ts +++ b/apps/concierge/src/app/surveys/survey-builder.component.ts @@ -1,5 +1,5 @@ import { CommonModule } from '@angular/common'; -import { ChangeDetectorRef, Component, OnInit, signal } from '@angular/core'; +import { Component, computed, inject, OnInit, signal } from '@angular/core'; import { FormControl, FormGroup, @@ -15,11 +15,12 @@ import { ActivatedRoute, RouterModule } from '@angular/router'; import { AsyncHandler, + Building, nextValueFrom, notifyError, notifySuccess, + OrganisationService, } from '@placeos/common'; -import { Building, OrganisationService } from '@placeos/organisation'; import { CdkDragDrop, @@ -37,17 +38,15 @@ import { } from '@placeos/ts-client'; import { first, lastValueFrom } from 'rxjs'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; -import { SurveyOutletComponent } from 'libs/components/src/lib/survey-outlet.component'; -import { TranslatePipe } from 'libs/components/src/lib/translate.pipe'; import { - NewSurveyService, - QuestionTypeMap, - QuestionTypeOptions, - TriggerOptions, -} from './new-survey.service'; + IconComponent, + SurveyOutletComponent, + TranslatePipe, +} from '@placeos/components'; +import { NewSurveyService } from './new-survey.service'; import { QuestionComponent } from './question.component'; import { QuestionPipe } from './question.pipe'; +import { QuestionTypeMap, QuestionTypeOptions, TriggerOptions } from './types'; @Component({ selector: 'survey-builder', @@ -157,24 +156,24 @@ import { QuestionPipe } from './question.pipe';
- @if (this.view === 'builder') { + @if (view() === 'builder') {
@for ( @@ -246,7 +245,7 @@ import { QuestionPipe } from './question.pipe'; (cdkDropListDropped)="drop($event)" class="space-y-2" > - @let page = page_forms[active_page].value; + @let page = active_page_form()?.value; @if (page?.question_order.length > 0) { @for ( q_id of page.question_order; @@ -354,7 +353,7 @@ import { QuestionPipe } from './question.pipe'; > @@ -490,7 +489,7 @@ import { QuestionPipe } from './question.pipe'; >
} - @if (loading) { + @if (loading()) {
@@ -532,11 +531,18 @@ import { QuestionPipe } from './question.pipe'; ], }) export class SurveyBuilderComponent extends AsyncHandler implements OnInit { - public view: 'builder' | 'preview' = 'builder'; - public active_page = 0; - public loading = false; - public selected_type = ''; - public search_text = ''; + private _org = inject(OrganisationService); + private _service = inject(NewSurveyService); + private _route = inject(ActivatedRoute); + + public readonly view = signal<'builder' | 'preview'>('builder'); + public readonly active_page = signal(0); + public readonly active_page_form = computed( + () => this.page_forms[this.active_page()], + ); + public readonly loading = signal(false); + public readonly selected_type = signal(''); + public readonly search_text = signal(''); public readonly questions = signal([]); public readonly buildings$ = this._org.building_list; @@ -565,15 +571,6 @@ export class SurveyBuilderComponent extends AsyncHandler implements OnInit { }), ]; - constructor( - private _org: OrganisationService, - private _service: NewSurveyService, - private _route: ActivatedRoute, - private _cdr: ChangeDetectorRef, - ) { - super(); - } - public ngOnInit(): void { this.subscription( 'route.params', @@ -628,7 +625,7 @@ export class SurveyBuilderComponent extends AsyncHandler implements OnInit { public onPageChange(event: MatTabChangeEvent) { const index = event.index; - this.active_page = index; + this.active_page.set(index); } public addPage() { @@ -666,21 +663,21 @@ export class SurveyBuilderComponent extends AsyncHandler implements OnInit { public removePage() { const pages = this.form.value.pages; - const page_form = this.page_forms[this.active_page]; - pages.splice(this.active_page, 1); - if (this.active_page >= pages.length) { + const page_form = this.page_forms[this.active_page()]; + pages.splice(this.active_page(), 1); + if (this.active_page() >= pages.length) { page_form.patchValue({ title: '', description: '', question_order: [], }); - this.active_page = pages.length - 1; + this.active_page.set(pages.length - 1); } this.form.patchValue({ pages }); } public removePageQuestion(idx: number) { - const page_form = this.page_forms[this.active_page]; + const page_form = this.page_forms[this.active_page()]; const order = page_form.get('question_order').value; order.splice(idx, 1); page_form.patchValue({ question_order: order }); @@ -689,25 +686,25 @@ export class SurveyBuilderComponent extends AsyncHandler implements OnInit { public async drop(event: CdkDragDrop) { if (event.previousContainer === event.container) { const order = - this.page_forms[this.active_page].get('question_order').value; + this.page_forms[this.active_page()].get('question_order').value; moveItemInArray(order, event.previousIndex, event.currentIndex); - this.page_forms[this.active_page].patchValue({ + this.page_forms[this.active_page()].patchValue({ question_order: order, }); } else { const questions = await nextValueFrom(this.questions$); const q_id = questions[event.previousIndex].id; const order = - this.page_forms[this.active_page].get('question_order').value; + this.page_forms[this.active_page()].get('question_order').value; order.splice(event.currentIndex, 0, q_id); - this.page_forms[this.active_page].patchValue({ + this.page_forms[this.active_page()].patchValue({ question_order: order, }); } } public onSearchChange(search_text: string) { - this.search_text = search_text; + this.search_text.set(search_text); this._service.setQuestionFilters({ search_text, type: this.selected_type as any, @@ -715,17 +712,17 @@ export class SurveyBuilderComponent extends AsyncHandler implements OnInit { } public onTypeChange(type: any) { - this.selected_type = type; + this.selected_type.set(type); this._service.setQuestionFilters({ type, - search_text: this.search_text, + search_text: this.search_text(), }); } public async saveSurvey() { this.form.markAllAsTouched(); if (!this.form.valid) return; - this.loading = true; + this.loading.set(true); const page_count = this.form.value.pages?.length || 0; const pages = []; for (let i = 0; i < page_count; i++) { @@ -742,6 +739,6 @@ export class SurveyBuilderComponent extends AsyncHandler implements OnInit { throw error; }); notifySuccess('Successfully saved survey details.'); - this.loading = false; + this.loading.set(false); } } diff --git a/apps/concierge/src/app/surveys/survey-listings.component.ts b/apps/concierge/src/app/surveys/survey-listings.component.ts index 02e8ab5d80..9cacb5518e 100644 --- a/apps/concierge/src/app/surveys/survey-listings.component.ts +++ b/apps/concierge/src/app/surveys/survey-listings.component.ts @@ -1,9 +1,18 @@ import { Component, OnInit, inject } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; +import { ActivatedRoute, RouterModule } from '@angular/router'; import { AsyncHandler } from '@placeos/common'; +import { CommonModule } from '@angular/common'; +import { MatMenuModule } from '@angular/material/menu'; +import { + BuildingPipe, + IconComponent, + LevelPipe, + SimpleTableComponent, + TranslatePipe, +} from '@placeos/components'; import { Survey } from '@placeos/ts-client'; -import { NewSurveyService } from './new-survey.service'; +import { SurveyService } from './survey.service'; @Component({ selector: 'survey-listings', @@ -18,7 +27,8 @@ import { NewSurveyService } from './new-survey.service'; 'APP.CONCIERGE.SURVEY_LIST_HEADER' | translate }} - {{ building?.display_name || building?.name }} + @let bld = building() | building; + {{ bld?.display_name || bld?.name }}
@@ -27,7 +37,7 @@ import { NewSurveyService } from './new-survey.service'; matRipple class="space-x-2" [routerLink]="['/surveys', 'builder']" - [queryParams]="{ building_id: building?.id }" + [queryParams]="{ building_id: building() }" > {{ 'APP.CONCIERGE.SURVEY_ADD' | translate @@ -38,7 +48,7 @@ import { NewSurveyService } from './new-survey.service';
+ querySurveys({ building_id: bld.id }), + ), + ), + ); + const survey_list = surveys.flat(); + this.survey_list.set(survey_list); + } + if (type === LoadType.ALL || type === LoadType.ANSWERS) { + const answers = await lastValueFrom( + forkJoin( + this.survey_list().map((survey) => + queryAnswers({ survey_id: survey.id }), + ), + ), + ); + this.answer_list.set(answers.flat()); + } + if (type === LoadType.ALL || type === LoadType.QUESTIONS) { + const questions = await lastValueFrom( + queryQuestions({ limit: 1000 } as any), + ); + this.question_list.set(questions); + } + this.loading.set(''); + } +} diff --git a/apps/concierge/src/app/surveys/surveys.module.ts b/apps/concierge/src/app/surveys/surveys.module.ts index a3e0f42a78..d38dd4c356 100644 --- a/apps/concierge/src/app/surveys/surveys.module.ts +++ b/apps/concierge/src/app/surveys/surveys.module.ts @@ -1,36 +1,15 @@ -import { DragDropModule } from '@angular/cdk/drag-drop'; -import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatMenuModule } from '@angular/material/menu'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSlideToggleModule } from '@angular/material/slide-toggle'; -import { MatTableModule } from '@angular/material/table'; -import { MatTabsModule } from '@angular/material/tabs'; import { Route, RouterModule } from '@angular/router'; -import { ComponentsModule } from '@placeos/components'; -import { UIModule } from '../ui/ui.module'; +import { SurveyOutletComponent } from '@placeos/components'; import { BuildingListComponent } from './building-list.component'; -import { SurveyOutletComponent } from 'libs/components/src/lib/survey-outlet.component'; -import { NewSurveyWidgetComponent } from './new-survey-widget.component'; -import { QuestionModalComponent } from './question-modal.component'; -import { QuestionComponent } from './question.component'; -import { QuestionPipe } from './question.pipe'; import { SurveyBuilderComponent } from './survey-builder.component'; import { SurveyListingsComponent } from './survey-listings.component'; import { SurveyResponsesComponent } from './survey-responses.component'; import { SurveyComponent } from './survey.component'; -// //SurveyJS styling -// StylesManager.applyTheme('modern'); - const routes: Route[] = [ - { path: 'run/:id', component: SurveyOutletComponent }, { path: '', component: SurveyComponent, @@ -43,45 +22,20 @@ const routes: Route[] = [ { path: '**', pathMatch: 'full', redirectTo: '' }, ], }, + { path: 'run/:id', component: SurveyOutletComponent }, { path: '**', pathMatch: 'full', redirectTo: '' }, ]; -const COMPONENTS = [ - SurveyComponent, - BuildingListComponent, - SurveyListingsComponent, - SurveyResponsesComponent, -]; - -const STANDALONE_COMPONENTS = [ - QuestionPipe, - SurveyOutletComponent, - SurveyBuilderComponent, - NewSurveyWidgetComponent, - QuestionComponent, - QuestionModalComponent, -]; - @NgModule({ - declarations: [...COMPONENTS], + declarations: [], imports: [ - CommonModule, + SurveyComponent, + SurveyOutletComponent, + BuildingListComponent, + SurveyListingsComponent, + SurveyBuilderComponent, + SurveyResponsesComponent, RouterModule.forChild(routes), - MatDialogModule, - MatCheckboxModule, - FormsModule, - ReactiveFormsModule, - MatTabsModule, - DragDropModule, - MatSelectModule, - MatSlideToggleModule, - ComponentsModule, - RouterModule, - MatTableModule, - MatMenuModule, - MatFormFieldModule, - UIModule, - ...STANDALONE_COMPONENTS, ], }) export class SurveysModule {} diff --git a/apps/concierge/src/app/surveys/types.ts b/apps/concierge/src/app/surveys/types.ts new file mode 100644 index 0000000000..991d388f9b --- /dev/null +++ b/apps/concierge/src/app/surveys/types.ts @@ -0,0 +1,42 @@ +export enum TriggerEnum { + None = 'NONE', + Reserved = 'RESERVED', + Checked_In = 'CHECKEDIN', + Checked_Out = 'CHECKEDOUT', + // No_Show = 'NOSHOW', + Rejected = 'REJECTED', + Cancelled = 'CANCELLED', + // Ended = 'ENDED' + Visitor = 'VISITOR', +} + +export enum QuestionType { + Single_Line_Text = 'text', + Comment_Box = 'comment', + Radio_Group = 'radiogroup', + Drop_Down = 'dropdown', + Check_Box = 'checkbox', + Rating = 'rating', + Empty = '0[EMPTY]', +} + +export const TriggerOptions = getEnumOptions(TriggerEnum); +export const QuestionTypeOptions = getEnumOptions(QuestionType); +export const QuestionTypeMap = getEnumMap(QuestionType); + +export function getEnumOptions(targetEnum: T) { + return Object.entries(targetEnum) + .filter((e) => isNaN(Number(e[0]))) + .map((e) => ({ + name: e[0].replace(/_/g, ' '), + id: e[1], + })); +} + +export function getEnumMap(targetEnum: T) { + const enum_map = {}; + Object.entries(targetEnum) + .filter((e) => isNaN(Number(e[0]))) + .forEach((e) => (enum_map[e[1]] = e[0].replace(/_/g, ' '))); + return enum_map; +} diff --git a/apps/concierge/src/app/ui/app-settings-modal.component.ts b/apps/concierge/src/app/ui/app-settings-modal.component.ts index 40ee0a5304..40fcb281ea 100644 --- a/apps/concierge/src/app/ui/app-settings-modal.component.ts +++ b/apps/concierge/src/app/ui/app-settings-modal.component.ts @@ -1,8 +1,19 @@ import { Component, inject } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import { SettingsService, notifyError, notifySuccess } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatRippleModule } from '@angular/material/core'; +import { + MAT_DIALOG_DATA, + MatDialogModule, + MatDialogRef, +} from '@angular/material/dialog'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { + OrganisationService, + SettingsService, + notifyError, + notifySuccess, +} from '@placeos/common'; import { PlaceZone, showMetadata, updateMetadata } from '@placeos/ts-client'; @Component({ @@ -212,7 +223,13 @@ import { PlaceZone, showMetadata, updateMetadata } from '@placeos/ts-client';
`, styles: [``], - standalone: false, + imports: [ + ReactiveFormsModule, + MatRippleModule, + MatDialogModule, + MatProgressSpinnerModule, + MatCheckboxModule, + ], }) export class AppSettingsModalComponent { private _data = inject<{ diff --git a/apps/concierge/src/app/ui/app-settings/booking-panel-settings-modal.component.ts b/apps/concierge/src/app/ui/app-settings/booking-panel-settings-modal.component.ts index a488cdfd0d..70e56fbe1c 100644 --- a/apps/concierge/src/app/ui/app-settings/booking-panel-settings-modal.component.ts +++ b/apps/concierge/src/app/ui/app-settings/booking-panel-settings-modal.component.ts @@ -1,12 +1,16 @@ import { Component, inject, OnInit, signal } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { + MAT_DIALOG_DATA, + MatDialogModule, + MatDialogRef, +} from '@angular/material/dialog'; import { AsyncHandler, getInvalidFields, notifyError, notifySuccess, - uploadFile, + UploadsService, } from '@placeos/common'; import { addSettings, @@ -19,255 +23,220 @@ import { import { lastValueFrom, of } from 'rxjs'; import { catchError, map } from 'rxjs/operators'; +import { MatRippleModule } from '@angular/material/core'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { + FullscreenModalShellComponent, + IconComponent, + SettingsToggleComponent, +} from '@placeos/components'; import { validateURL } from '@placeos/events'; -import * as yaml from 'js-yaml'; +import { DurationFieldComponent } from '@placeos/form-fields'; +import { parse as parseYaml, stringify as stringifyYaml } from 'yaml'; @Component({ selector: `booking-panel-settings-modal`, template: ` -
-
-

- Booking Panel Settings - - {{ zone.display_name || zone.name }} -

- @if (!loading()) { - - } -
-
- @if (!loading()) { - -
-

+ +
+

+ Booking Settings +

+
+ + +
+
+
+ - Booking Settings -

-
- - -
-
-
- - -
-
- - -
-
+
-
-
- - -
-
- - -
+
+ +
-
- +
+ + +
+
+ + +
+
+
+ - - - - -
-
- + + + + +
+
+ + + + + Custom QR Code URL must be a valid URL + + + Custom QR Code URL will replace the default Booking + QR Code + + +
+
+
+ +
+ - - Custom QR Code URL must be a valid URL + Room Image must be a valid URL - - Custom QR Code URL will replace the default - Booking QR Code - +
-
-
- -
- - - - Room Image must be a valid URL - - - -
-
-
- -
- - - - Offline Image must be a valid URL - - - -
-
+
+
+ +
+ + + + Offline Image must be a valid URL + + +
- - } @else { -
- -

{{ loading() }}

- } -
-
- @if (!loading()) { -
- -
- } -
+
+ + `, styles: [ ` @@ -277,12 +246,24 @@ don't detect presence in room after a period of time" } `, ], - standalone: false, + imports: [ + FullscreenModalShellComponent, + MatRippleModule, + IconComponent, + MatProgressSpinnerModule, + MatFormFieldModule, + MatInputModule, + SettingsToggleComponent, + DurationFieldComponent, + MatDialogModule, + ReactiveFormsModule, + ], }) export class BookingPanelSettingsModalComponent extends AsyncHandler implements OnInit { + private _uploads = inject(UploadsService); private _data = inject<{ zone: PlaceZone; }>(MAT_DIALOG_DATA); @@ -352,7 +333,7 @@ export class BookingPanelSettingsModalComponent } this.loading.set('Processing found panel settings...'); const setting_value = - yaml.load(unencrypted_settings.settings_string) || {}; + parseYaml(unencrypted_settings.settings_string) || {}; this.form.patchValue(setting_value); this.loading.set(''); } @@ -368,19 +349,19 @@ export class BookingPanelSettingsModalComponent if (!file.type.includes('image')) { return notifyError('File is not an image'); } - uploadFile(file).subscribe( - (s) => { + this._uploads.uploadFileWithProgress(file).subscribe({ + next: (s) => { this.uploading.set(s.progress); if (s.link) { this.uploading.set(0); field.setValue(s.link); } }, - () => { + error: () => { notifyError('Failed to upload image. Try again later'); this.uploading.set(0); }, - ); + }); } public async save() { @@ -407,7 +388,7 @@ export class BookingPanelSettingsModalComponent encryption_level: EncryptionLevel.None, }); const setting_value = - yaml.load(unencrypted_settings.settings_string) || {}; + parseYaml(unencrypted_settings.settings_string) || {}; const new_settings_blob = { ...setting_value, ...form_value, @@ -421,7 +402,7 @@ export class BookingPanelSettingsModalComponent const new_setting = { ...unencrypted_settings, parent_id: this._data.zone.id, - settings_string: yaml.dump(new_settings_blob), + settings_string: stringifyYaml(new_settings_blob), }; this.loading.set('Saving changes to booking panel settings...'); const update = unencrypted_settings.id diff --git a/apps/concierge/src/app/ui/app-settings/concierge-settings-form-modal.component.ts b/apps/concierge/src/app/ui/app-settings/concierge-settings-form-modal.component.ts index 8a2cc41ac8..ca2a918726 100644 --- a/apps/concierge/src/app/ui/app-settings/concierge-settings-form-modal.component.ts +++ b/apps/concierge/src/app/ui/app-settings/concierge-settings-form-modal.component.ts @@ -1,22 +1,49 @@ import { Component, inject, signal } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import { currentUser, notifySuccess, SettingsService } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { + FormControl, + FormGroup, + FormsModule, + ReactiveFormsModule, +} from '@angular/forms'; +import { + MAT_DIALOG_DATA, + MatDialogModule, + MatDialogRef, +} from '@angular/material/dialog'; +import { + currentUser, + notifySuccess, + OrganisationService, + SettingsService, +} from '@placeos/common'; import { PlaceZone, showMetadata, updateMetadata } from '@placeos/ts-client'; import { map } from 'rxjs/operators'; import { DEFAULT_SETTINGS } from 'apps/concierge/src/environments/settings'; import { format } from 'date-fns'; +import { MatRippleModule } from '@angular/material/core'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatSelectModule } from '@angular/material/select'; import { VERSION } from '@placeos/common'; +import { + IconComponent, + SettingsToggleComponent, + TranslatePipe, +} from '@placeos/components'; +import { FullscreenModalShellComponent } from 'libs/components/src/lib/fullscreen-modal-shell.component'; import { lastValueFrom } from 'rxjs'; +import { UploadButtonComponent } from './upload-button.component'; @Component({ selector: 'concierge-settings-form-modal', template: ` @@ -1241,7 +1268,20 @@ import { lastValueFrom } from 'rxjs'; } `, ], - standalone: false, + imports: [ + MatDialogModule, + FullscreenModalShellComponent, + SettingsToggleComponent, + ReactiveFormsModule, + MatRippleModule, + IconComponent, + TranslatePipe, + MatSelectModule, + MatFormFieldModule, + MatInputModule, + FormsModule, + UploadButtonComponent, + ], }) export class ConciergeSettingsFormModalComponent { private _data = inject<{ diff --git a/apps/concierge/src/app/ui/app-settings/upload-button.component.ts b/apps/concierge/src/app/ui/app-settings/upload-button.component.ts index 1a45337675..a5af44988d 100644 --- a/apps/concierge/src/app/ui/app-settings/upload-button.component.ts +++ b/apps/concierge/src/app/ui/app-settings/upload-button.component.ts @@ -1,10 +1,10 @@ import { CommonModule } from '@angular/common'; -import { Component, forwardRef, input, signal } from '@angular/core'; +import { Component, forwardRef, inject, input, signal } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { MatRippleModule } from '@angular/material/core'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { notifyError, uploadFile } from '@placeos/common'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; +import { notifyError, UploadsService } from '@placeos/common'; +import { IconComponent } from '@placeos/components'; @Component({ selector: 'upload-button', @@ -48,6 +48,8 @@ import { IconComponent } from 'libs/components/src/lib/icon.component'; ], }) export class UploadButtonComponent { + private _uploads = inject(UploadsService); + public readonly types = input(['image']); public uploading = signal(false); public progress = signal(0); @@ -99,7 +101,7 @@ export class UploadButtonComponent { this.progress.set(0); this.uploading.set(true); let status = null; - uploadFile(file).subscribe( + this._uploads.uploadFileWithProgress(file).subscribe( (s) => { console.log(`Progress:`, s); this.progress.set(s.progress); diff --git a/apps/concierge/src/app/ui/app-settings/visitor-kiosk-settings-form-modal.component.ts b/apps/concierge/src/app/ui/app-settings/visitor-kiosk-settings-form-modal.component.ts index 6d274c7a0e..1e5e8fcf61 100644 --- a/apps/concierge/src/app/ui/app-settings/visitor-kiosk-settings-form-modal.component.ts +++ b/apps/concierge/src/app/ui/app-settings/visitor-kiosk-settings-form-modal.component.ts @@ -1,478 +1,422 @@ import { Component, inject, signal } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { + FormControl, + FormGroup, + FormsModule, + ReactiveFormsModule, +} from '@angular/forms'; +import { + MAT_DIALOG_DATA, + MatDialogModule, + MatDialogRef, +} from '@angular/material/dialog'; import { currentUser, notifySuccess, + OrganisationService, SettingsService, VERSION, } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; import { PlaceZone, showMetadata, updateMetadata } from '@placeos/ts-client'; import { map } from 'rxjs/operators'; +import { MatRippleModule } from '@angular/material/core'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { MatSelectModule } from '@angular/material/select'; +import { + FullscreenModalShellComponent, + IconComponent, + SettingsToggleComponent, +} from '@placeos/components'; import { DEFAULT_SETTINGS } from 'apps/visitor-kiosk/src/environments/settings'; import { lastValueFrom } from 'rxjs'; +import { UploadButtonComponent } from './upload-button.component'; @Component({ selector: 'visitor-kiosk-settings-form-modal', template: ` -
-
-

- Visitor Kiosk Settings - - {{ zone.display_name || zone.name }} -

- @if (!loading()) { - - } -
-
- @if (!loading()) { -
-
-
- -
- - - - -
-
-
- -
- + +
+
+ +
+ + + + +
+
+
+ +
+ + + + +
+
+
+ +
+ + + + +
+
+
+ + + + +
+
+ + @if (form.value.induction_enabled) { + + } + + + +
+
+
+

+ PlaceOS Maps +

+
+ + + + Devices + Desks + + Lockers + + + parking + + Rooms + + Room Presence + + Zones + + +
+
+
+ + + + Devices - - - -
-
-
- -
- Desks + + Lockers + + + parking + + + Rooms + + + Room Presence + + Zones + + +
+
+ + + + Devices - - - -
-
-
- Desks + + Lockers + + + parking + + + Rooms + + + Room Presence + + Zones + + +
+
+
+
+ + + - Devices + Desks + + Lockers + + + parking + + + Rooms + + + Room Presence + + Zones + + +
+
+ + + - - -
-
- - @if (form.value.induction_enabled) { - - } - - - -
-
-
Devices + Desks + + Lockers + + + parking + + + Rooms + + + Room Presence + + Zones + + +
+
+ @if (form.value.explore?.show_legend) { +

- PlaceOS Maps + Legend

-
- - - - Devices - Desks - - Lockers - - - parking - - - Rooms - - - Room Presence - - Zones - - -
-
-
- - - +
+ - Devices - Desks - - Lockers - - - parking - - - Rooms - - - Room Presence - - Zones - - -
-
- - - - Devices - Desks - - Lockers - - - parking - - - Rooms - - - Room Presence - - Zones - - -
-
-
-
- - - - Devices - Desks - - Lockers - - - parking - - - Rooms - - - Room Presence - - Zones - - -
-
- - + +
+
- - Devices - Desks - - Lockers - - - parking - - - Rooms - - - Room Presence - - Zones - - -
-
- @if (form.value.explore?.show_legend) { -
-

- Legend -

- @for ( - item of form.value.explore?.legend || - []; - track item; - let i = $index - ) { -
-
- - - -
-
- -
- -
- } + +
} -
- - - - - - - -
- - - } @else { -
- -

{{ loading() }}

+ +
+ } +
+ + + + + + +
- } -
- - @if (!loading()) { -
- -
- } -
+ + + `, styles: [ ` @@ -482,7 +426,20 @@ import { lastValueFrom } from 'rxjs'; } `, ], - standalone: false, + imports: [ + FullscreenModalShellComponent, + MatDialogModule, + MatRippleModule, + IconComponent, + MatProgressSpinnerModule, + SettingsToggleComponent, + MatFormFieldModule, + MatSelectModule, + MatInputModule, + UploadButtonComponent, + ReactiveFormsModule, + FormsModule, + ], }) export class VisitorKioskSettingsFormModalComponent { private _data = inject<{ diff --git a/apps/concierge/src/app/ui/app-settings/workplace-settings-form-modal.component.ts b/apps/concierge/src/app/ui/app-settings/workplace-settings-form-modal.component.ts index 917db52033..f022227ad4 100644 --- a/apps/concierge/src/app/ui/app-settings/workplace-settings-form-modal.component.ts +++ b/apps/concierge/src/app/ui/app-settings/workplace-settings-form-modal.component.ts @@ -1,24 +1,48 @@ import { Component, inject, OnInit, signal } from '@angular/core'; -import { FormControl, FormGroup, Validators } from '@angular/forms'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { + FormControl, + FormGroup, + FormsModule, + ReactiveFormsModule, + Validators, +} from '@angular/forms'; +import { + MAT_DIALOG_DATA, + MatDialogModule, + MatDialogRef, +} from '@angular/material/dialog'; import { PlaceZone, showMetadata, updateMetadata } from '@placeos/ts-client'; import { map } from 'rxjs/operators'; -import { currentUser, notifySuccess, SettingsService } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { + currentUser, + notifySuccess, + OrganisationService, + SettingsService, +} from '@placeos/common'; import { validateURL } from '@placeos/events'; import { DEFAULT_SETTINGS } from 'apps/workplace/src/environments/settings'; import { format } from 'date-fns'; +import { MatRippleModule } from '@angular/material/core'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatSelectModule } from '@angular/material/select'; import { VERSION } from '@placeos/common'; +import { IconComponent, SettingsToggleComponent } from '@placeos/components'; +import { FullscreenModalShellComponent } from 'libs/components/src/lib/fullscreen-modal-shell.component'; import { lastValueFrom } from 'rxjs'; +import { UploadButtonComponent } from './upload-button.component'; @Component({ selector: 'workplace-settings-form-modal', template: ` @@ -1692,7 +1716,19 @@ import { lastValueFrom } from 'rxjs'; } `, ], - standalone: false, + imports: [ + MatDialogModule, + FullscreenModalShellComponent, + SettingsToggleComponent, + ReactiveFormsModule, + MatRippleModule, + IconComponent, + MatSelectModule, + MatFormFieldModule, + MatInputModule, + FormsModule, + UploadButtonComponent, + ], }) export class WorkplaceSettingsFormModalComponent implements OnInit { private _data = inject<{ diff --git a/apps/concierge/src/app/ui/app-sidebar.component.ts b/apps/concierge/src/app/ui/app-sidebar.component.ts index 37e4ea53e9..731991f219 100644 --- a/apps/concierge/src/app/ui/app-sidebar.component.ts +++ b/apps/concierge/src/app/ui/app-sidebar.component.ts @@ -1,14 +1,17 @@ import { Component, ElementRef, OnInit, inject, signal } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; +import { RouterModule } from '@angular/router'; import { ANIMATION_SHOW_CONTRACT_EXPAND, AsyncHandler, + OrganisationService, SettingsService, currentUser, firstTruthyValueFrom, i18n, unique, } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { IconComponent } from '@placeos/components'; import { debounceTime, filter } from 'rxjs/operators'; @Component({ @@ -90,7 +93,7 @@ import { debounceTime, filter } from 'rxjs/operators'; `, ], animations: [ANIMATION_SHOW_CONTRACT_EXPAND], - standalone: false, + imports: [RouterModule, MatRippleModule, IconComponent], }) export class ApplicationSidebarComponent extends AsyncHandler diff --git a/apps/concierge/src/app/ui/app-topbar.component.ts b/apps/concierge/src/app/ui/app-topbar.component.ts index 48e3a0ef2d..e6ce0dd8ff 100644 --- a/apps/concierge/src/app/ui/app-topbar.component.ts +++ b/apps/concierge/src/app/ui/app-topbar.component.ts @@ -1,7 +1,18 @@ import { Component, inject } from '@angular/core'; -import { SettingsService, currentUser } from '@placeos/common'; -import { UserControlsComponent } from '@placeos/components'; -import { OrganisationService } from '@placeos/organisation'; +import { MatRippleModule } from '@angular/material/core'; +import { RouterModule } from '@angular/router'; +import { + OrganisationService, + SettingsService, + currentUser, +} from '@placeos/common'; +import { + AuthenticatedImageDirective, + IconComponent, + UserControlsComponent, +} from '@placeos/components'; +import { CustomTooltipComponent } from 'libs/components/src/lib/custom-tooltip.component'; +import { UserAvatarComponent } from 'libs/components/src/lib/user-avatar.component'; @Component({ selector: 'app-topbar', @@ -48,7 +59,14 @@ import { OrganisationService } from '@placeos/organisation'; } `, ], - standalone: false, + imports: [ + RouterModule, + UserAvatarComponent, + CustomTooltipComponent, + MatRippleModule, + AuthenticatedImageDirective, + IconComponent, + ], }) export class ApplicationTopbarComponent { private _settings = inject(SettingsService); diff --git a/apps/concierge/src/app/ui/booking-rules-modal.component.ts b/apps/concierge/src/app/ui/booking-rules-modal.component.ts index bfa81cc803..e42e64b1cf 100644 --- a/apps/concierge/src/app/ui/booking-rules-modal.component.ts +++ b/apps/concierge/src/app/ui/booking-rules-modal.component.ts @@ -1,16 +1,31 @@ +import { CommonModule } from '@angular/common'; import { Component, inject } from '@angular/core'; -import { MAT_DIALOG_DATA, MatDialog } from '@angular/material/dialog'; +import { MatRippleModule } from '@angular/material/core'; +import { + MAT_DIALOG_DATA, + MatDialog, + MatDialogModule, +} from '@angular/material/dialog'; +import { MatTooltipModule } from '@angular/material/tooltip'; import { BookingRuleset, + OrganisationService, i18n, nextValueFrom, notifyError, notifySuccess, randomString, } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { + IconComponent, + LevelPipe, + SimpleTableComponent, + TranslatePipe, + openConfirmModal, +} from '@placeos/components'; import { showMetadata, updateMetadata } from '@placeos/ts-client'; -import { openConfirmModal } from 'libs/components/src/lib/confirm-modal.component'; +import { FullscreenModalShellComponent } from 'libs/components/src/lib/fullscreen-modal-shell.component'; +import { BookingRulesFormComponent } from 'libs/form-fields/src/lib/booking-rules-form.component'; import { BehaviorSubject, Observable, combineLatest, of } from 'rxjs'; import { catchError, @@ -39,194 +54,210 @@ import { " [hide_confirm]="true" > -
- {{ 'APP.CONCIERGE.BOOKING_RULES_NOTE' | translate }} -
- - -
- +
+
+ {{ 'APP.CONCIERGE.BOOKING_RULES_NOTE' | translate }}
- -
- {{ (index || 0) + 1 }} -
-
- -
- {{ - 'APP.CONCIERGE.BOOKING_RULES_CONDITIONS_COUNT' - | translate: { count: keyCount(data) } - }} + + +
+
- - -
-
{{ (data | level)?.display_name || data }}
-
- {{ data }} + +
+ {{ (index || 0) + 1 }}
-
-
- {{ - data === '*' - ? ('RESOURCE.ZONE_ALL' | translate) - : data - }} -
- - -
- {{ row.rules[key] ? 'done' : 'close' }} -
-
- -
- - - -
+
+ +
- delete - -
-
- -
- - - + + + +
+
+
+
- {{ 'APP.CONCIERGE.BOOKING_RULESET_SAVE' | translate }} - -
+ + + + +
`, styles: [``], - standalone: false, + imports: [ + MatDialogModule, + CommonModule, + MatRippleModule, + IconComponent, + TranslatePipe, + MatTooltipModule, + LevelPipe, + SimpleTableComponent, + BookingRulesFormComponent, + FullscreenModalShellComponent, + ], }) export class BookingRulesModalComponent { private _data = inject<{ diff --git a/apps/concierge/src/app/ui/date-options.component.ts b/apps/concierge/src/app/ui/date-options.component.ts index f5234f6b9d..845092c577 100644 --- a/apps/concierge/src/app/ui/date-options.component.ts +++ b/apps/concierge/src/app/ui/date-options.component.ts @@ -1,3 +1,4 @@ +import { CommonModule } from '@angular/common'; import { Component, OnChanges, @@ -8,8 +9,15 @@ import { model, output, } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; import { ActivatedRoute, Router } from '@angular/router'; import { AsyncHandler } from '@placeos/common'; +import { + CustomTooltipComponent, + IconComponent, + TranslatePipe, +} from '@placeos/components'; +import { DateCalendarComponent } from '@placeos/form-fields'; import { addDays, format, @@ -117,7 +125,14 @@ import { } `, ], - standalone: false, + imports: [ + CommonModule, + MatRippleModule, + TranslatePipe, + CustomTooltipComponent, + DateCalendarComponent, + IconComponent, + ], }) export class DateOptionsComponent extends AsyncHandler diff --git a/apps/concierge/src/app/ui/searchbar.component.ts b/apps/concierge/src/app/ui/searchbar.component.ts index d8a581faae..fdcebbfe2c 100644 --- a/apps/concierge/src/app/ui/searchbar.component.ts +++ b/apps/concierge/src/app/ui/searchbar.component.ts @@ -1,4 +1,8 @@ import { Component, model, output } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { IconComponent, TranslatePipe } from '@placeos/components'; @Component({ selector: 'searchbar', @@ -14,7 +18,13 @@ import { Component, model, output } from '@angular/core'; `, styles: [``], - standalone: false, + imports: [ + MatFormFieldModule, + MatInputModule, + FormsModule, + IconComponent, + TranslatePipe, + ], }) export class SearchbarComponent { /** Currently selected date */ diff --git a/apps/concierge/src/app/ui/select-map-item-modal.component.ts b/apps/concierge/src/app/ui/select-map-item-modal.component.ts index 1fddcaa887..afd30bdbac 100644 --- a/apps/concierge/src/app/ui/select-map-item-modal.component.ts +++ b/apps/concierge/src/app/ui/select-map-item-modal.component.ts @@ -1,12 +1,24 @@ +import { CommonModule } from '@angular/common'; import { Component, OnInit, inject } from '@angular/core'; -import { MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { FormsModule } from '@angular/forms'; +import { MatRippleModule } from '@angular/material/core'; +import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatSelectModule } from '@angular/material/select'; import { AsyncHandler, + BuildingLevel, MapsPeopleService, + OrganisationService, nextValueFrom, unique, } from '@placeos/common'; -import { BuildingLevel, OrganisationService } from '@placeos/organisation'; +import { + IconComponent, + InteractiveMapComponent, + TranslatePipe, +} from '@placeos/components'; import { Rect } from '@placeos/svg-viewer/dist/types'; import { BehaviorSubject, combineLatest, of } from 'rxjs'; import { debounceTime, map, shareReplay, switchMap, tap } from 'rxjs/operators'; @@ -20,16 +32,23 @@ declare let mapsindoors: any; @Component({ selector: 'select-map-item-modal', template: ` -
-

{{ 'APP.CONCIERGE.POI_MAP_SELECT_HEADER' | translate }}

+
+

+ {{ 'APP.CONCIERGE.POI_MAP_SELECT_HEADER' | translate }} +

-
+
0) {
-
- - - -
- {{ row.name || row.id }} -
+
+ + + @if (qr_codes()[row.id]) { + + } + +
+ {{ row.name || row.id }} +
+
} @if (form.controls.enabled) { -
+
`, styles: [``], - standalone: false, + imports: [ + FullscreenModalShellComponent, + SettingsToggleComponent, + RichTextInputComponent, + MatFormFieldModule, + MatInputModule, + TranslatePipe, + ReactiveFormsModule, + ], }) export class ShortUrlModalComponent extends AsyncHandler { private _data = inject(MAT_DIALOG_DATA); diff --git a/apps/concierge/src/app/visitors/guest-listing.component.ts b/apps/concierge/src/app/visitors/guest-listing.component.ts index 7f890c00c7..84cde22dd6 100644 --- a/apps/concierge/src/app/visitors/guest-listing.component.ts +++ b/apps/concierge/src/app/visitors/guest-listing.component.ts @@ -2,21 +2,33 @@ import { Component, inject, OnInit, signal } from '@angular/core'; import { showMetadata } from '@placeos/ts-client'; import { lastValueFrom } from 'rxjs'; -import { Booking, saveBooking } from '@placeos/bookings'; +import { MatDialog } from '@angular/material/dialog'; +import { saveBooking } from '@placeos/bookings'; import { AsyncHandler, + Booking, + generateQRCode, getTimezoneOffsetString, i18n, notifyError, notifySuccess, + OrganisationService, SettingsService, + User, } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; -import { User } from '@placeos/users'; -import { UserLabelModalComponent } from 'libs/users/src/lib/user-label-modal.component'; -import { MatDialog } from '@angular/material/dialog'; -import { generateQRCode } from 'libs/common/src/lib/qr-code'; +import { CommonModule } from '@angular/common'; +import { MatRippleModule } from '@angular/material/core'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { + IconComponent, + SimpleTableComponent, + TranslatePipe, +} from '@placeos/components'; +import { UserLabelModalComponent } from '@placeos/users'; import { ParkingStateService } from '../parking/parking-state.service'; import { VisitorsStateService } from './visitors-state.service'; @@ -646,7 +658,17 @@ import { VisitorsStateService } from './visitors-state.service';
`, styles: [``], - standalone: false, + imports: [ + CommonModule, + MatRippleModule, + MatTooltipModule, + MatMenuModule, + MatFormFieldModule, + MatInputModule, + TranslatePipe, + IconComponent, + SimpleTableComponent, + ], }) export class GuestListingComponent extends AsyncHandler implements OnInit { private _state = inject(VisitorsStateService); diff --git a/apps/concierge/src/app/visitors/invite-visitor-modal.component.ts b/apps/concierge/src/app/visitors/invite-visitor-modal.component.ts index 18242a4eaf..6fa5a05bd1 100644 --- a/apps/concierge/src/app/visitors/invite-visitor-modal.component.ts +++ b/apps/concierge/src/app/visitors/invite-visitor-modal.component.ts @@ -1,5 +1,6 @@ import { Component, inject } from '@angular/core'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { InviteVisitorFormComponent } from '@placeos/bookings'; @Component({ selector: 'invite-visitor-modal', @@ -12,7 +13,7 @@ import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
`, styles: [``], - standalone: false, + imports: [InviteVisitorFormComponent], }) export class InviteVisitorModalComponent { private _data = inject<{ diff --git a/apps/concierge/src/app/visitors/visitor-induction-modal.component.ts b/apps/concierge/src/app/visitors/visitor-induction-modal.component.ts index 76de2282b7..bb73f92dc7 100644 --- a/apps/concierge/src/app/visitors/visitor-induction-modal.component.ts +++ b/apps/concierge/src/app/visitors/visitor-induction-modal.component.ts @@ -1,4 +1,8 @@ import { Component, inject } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatRippleModule } from '@angular/material/core'; +import { MatDialogModule } from '@angular/material/dialog'; import { SettingsService } from '@placeos/common'; @Component({ @@ -40,7 +44,7 @@ import { SettingsService } from '@placeos/common';
`, styles: [``], - standalone: false, + imports: [MatDialogModule, MatRippleModule, MatCheckboxModule, FormsModule], }) export class VisitorInductionModalComponent { private _settings = inject(SettingsService); diff --git a/apps/concierge/src/app/visitors/visitor-notes-modal.component.ts b/apps/concierge/src/app/visitors/visitor-notes-modal.component.ts index 7f07b9e031..4016e679c5 100644 --- a/apps/concierge/src/app/visitors/visitor-notes-modal.component.ts +++ b/apps/concierge/src/app/visitors/visitor-notes-modal.component.ts @@ -1,7 +1,16 @@ import { Component, inject } from '@angular/core'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import { Booking, updateBooking } from '@placeos/bookings'; -import { i18n, notifyError, notifySuccess } from '@placeos/common'; +import { FormsModule } from '@angular/forms'; +import { MatRippleModule } from '@angular/material/core'; +import { + MAT_DIALOG_DATA, + MatDialogModule, + MatDialogRef, +} from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { updateBooking } from '@placeos/bookings'; +import { Booking, i18n, notifyError, notifySuccess } from '@placeos/common'; +import { IconComponent, TranslatePipe } from '@placeos/components'; @Component({ selector: 'visitor-notes-modal', @@ -57,7 +66,15 @@ import { i18n, notifyError, notifySuccess } from '@placeos/common'; } `, styles: [``], - standalone: false, + imports: [ + MatDialogModule, + MatRippleModule, + TranslatePipe, + MatFormFieldModule, + MatInputModule, + IconComponent, + FormsModule, + ], }) export class VisitorNotesModalComponent { private _data = inject<{ diff --git a/apps/concierge/src/app/visitors/visitors-state.service.ts b/apps/concierge/src/app/visitors/visitors-state.service.ts index 2a94abeef0..49f4b369ca 100644 --- a/apps/concierge/src/app/visitors/visitors-state.service.ts +++ b/apps/concierge/src/app/visitors/visitors-state.service.ts @@ -13,7 +13,6 @@ import { import { MatDialog } from '@angular/material/dialog'; import { - Booking, approveBooking, checkinBooking, queryBookings, @@ -23,6 +22,8 @@ import { } from '@placeos/bookings'; import { AsyncHandler, + Booking, + OrganisationService, SettingsService, downloadFile, i18n, @@ -31,8 +32,7 @@ import { notifyError, notifySuccess, } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; -import { openConfirmModal } from 'libs/components/src/lib/confirm-modal.component'; +import { openConfirmModal } from '@placeos/components'; import { VisitorInductionModalComponent } from './visitor-induction-modal.component'; import { VisitorNotesModalComponent } from './visitor-notes-modal.component'; diff --git a/apps/concierge/src/app/visitors/visitors-topbar.component.ts b/apps/concierge/src/app/visitors/visitors-topbar.component.ts index f7e7d1e963..4c31efe70f 100644 --- a/apps/concierge/src/app/visitors/visitors-topbar.component.ts +++ b/apps/concierge/src/app/visitors/visitors-topbar.component.ts @@ -2,8 +2,14 @@ import { Component, OnInit, inject } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { first } from 'rxjs/operators'; -import { AsyncHandler } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatSelectModule } from '@angular/material/select'; +import { AsyncHandler, OrganisationService } from '@placeos/common'; +import { TranslatePipe } from '@placeos/components'; +import { DateOptionsComponent } from '../ui/date-options.component'; +import { SearchbarComponent } from '../ui/searchbar.component'; import { VisitorsStateService } from './visitors-state.service'; @Component({ @@ -53,7 +59,15 @@ import { VisitorsStateService } from './visitors-state.service'; } `, ], - standalone: false, + imports: [ + CommonModule, + DateOptionsComponent, + SearchbarComponent, + MatFormFieldModule, + MatSelectModule, + FormsModule, + TranslatePipe, + ], }) export class VisitorsTopbarComponent extends AsyncHandler implements OnInit { private _state = inject(VisitorsStateService); diff --git a/apps/concierge/src/app/visitors/visitors.component.ts b/apps/concierge/src/app/visitors/visitors.component.ts index bdf890125a..604d787cfb 100644 --- a/apps/concierge/src/app/visitors/visitors.component.ts +++ b/apps/concierge/src/app/visitors/visitors.component.ts @@ -1,10 +1,25 @@ +import { CommonModule } from '@angular/common'; import { Component, inject, OnDestroy, OnInit } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { MatRippleModule } from '@angular/material/core'; import { MatDialog } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { MatSelectModule } from '@angular/material/select'; import { ActivatedRoute, Router } from '@angular/router'; -import { nextValueFrom, SettingsService } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { + nextValueFrom, + OrganisationService, + SettingsService, +} from '@placeos/common'; +import { TranslatePipe } from '@placeos/components'; import { combineLatest } from 'rxjs'; import { map } from 'rxjs/operators'; +import { ApplicationSidebarComponent } from '../ui/app-sidebar.component'; +import { ApplicationTopbarComponent } from '../ui/app-topbar.component'; +import { DateOptionsComponent } from '../ui/date-options.component'; +import { SearchbarComponent } from '../ui/searchbar.component'; +import { GuestListingComponent } from './guest-listing.component'; import { InviteVisitorModalComponent } from './invite-visitor-modal.component'; import { VisitorsStateService } from './visitors-state.service'; @@ -94,7 +109,20 @@ import { VisitorsStateService } from './visitors-state.service'; } `, ], - standalone: false, + imports: [ + CommonModule, + MatProgressBarModule, + MatFormFieldModule, + MatSelectModule, + DateOptionsComponent, + GuestListingComponent, + FormsModule, + MatRippleModule, + SearchbarComponent, + ApplicationSidebarComponent, + ApplicationTopbarComponent, + TranslatePipe, + ], }) export class VisitorsComponent implements OnInit, OnDestroy { private _state = inject(VisitorsStateService); diff --git a/apps/concierge/src/app/visitors/visitors.module.ts b/apps/concierge/src/app/visitors/visitors.module.ts index eb7fc2874f..c6cfb0f147 100644 --- a/apps/concierge/src/app/visitors/visitors.module.ts +++ b/apps/concierge/src/app/visitors/visitors.module.ts @@ -1,48 +1,12 @@ -import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FormsModule } from '@angular/forms'; import { Route, RouterModule } from '@angular/router'; -import { UIModule } from '../ui/ui.module'; - -import { SharedBookingsModule } from '@placeos/bookings'; -import { UserLabelComponent } from 'libs/users/src/lib/user-label.component'; -import { GuestListingComponent } from './guest-listing.component'; -import { InviteVisitorModalComponent } from './invite-visitor-modal.component'; -import { VisitorInductionModalComponent } from './visitor-induction-modal.component'; -import { VisitorNotesModalComponent } from './visitor-notes-modal.component'; -import { VisitorsTopbarComponent } from './visitors-topbar.component'; import { VisitorsComponent } from './visitors.component'; const ROUTES: Route[] = [{ path: '', component: VisitorsComponent }]; @NgModule({ - declarations: [ - VisitorsComponent, - VisitorsTopbarComponent, - GuestListingComponent, - InviteVisitorModalComponent, - VisitorInductionModalComponent, - VisitorNotesModalComponent, - ], - imports: [ - CommonModule, - FormsModule, - UIModule, - SharedBookingsModule, - UserLabelComponent, - RouterModule.forChild(ROUTES), - ], + declarations: [], + imports: [VisitorsComponent, RouterModule.forChild(ROUTES)], }) export class VisitorsModule {} - -/** -zone_ids: zone-EmWVhHG3Bhz -period_start: 1604926800 -period_end: 1605013199 - -period_start: 1605013200 -period_end: 1605099599 -zones: zone-EmWVhHG3Bhz - -*/ diff --git a/apps/concierge/src/styles.css b/apps/concierge/src/styles.css index 0cc4a6c499..1feaccc13c 100644 --- a/apps/concierge/src/styles.css +++ b/apps/concierge/src/styles.css @@ -1,7 +1,16 @@ +@import 'suneditor/dist/css/suneditor.min.css'; + @tailwind base; @tailwind components; @tailwind utilities; /* You can add global styles to this file, and also import other style files */ -html, body { height: 100%; } -body { margin: 0; font-family: Roboto, "Helvetica Neue", sans-serif; overflow: hidden; } +html, +body { + height: 100%; +} +body { + margin: 0; + font-family: Roboto, 'Helvetica Neue', sans-serif; + overflow: hidden; +} diff --git a/apps/concierge/src/test-setup.ts b/apps/concierge/src/test-setup.ts index 3ae9bf3e0f..44e371f64e 100644 --- a/apps/concierge/src/test-setup.ts +++ b/apps/concierge/src/test-setup.ts @@ -3,8 +3,8 @@ import { setupZoneTestEnv } from 'jest-preset-angular/setup-env/zone'; setupZoneTestEnv(); import { defineGlobalsInjections } from '@ngneat/spectator'; -import { setNotifyOutlet } from 'libs/common/src/lib/notifications'; -import { TranslatePipe } from 'libs/components/src/lib/translate.pipe'; +import { setNotifyOutlet } from '@placeos/common'; +import { TranslatePipe } from '@placeos/components'; import { MockPipe } from 'ng-mocks'; import { TextDecoder, TextEncoder } from 'util'; diff --git a/apps/concierge/src/tests/catering/catering-topbar.component.spec.ts b/apps/concierge/src/tests/catering/catering-topbar.component.spec.ts index b2b649d47a..45d9917e10 100644 --- a/apps/concierge/src/tests/catering/catering-topbar.component.spec.ts +++ b/apps/concierge/src/tests/catering/catering-topbar.component.spec.ts @@ -4,7 +4,7 @@ import { MatFormFieldModule } from '@angular/material/form-field'; import { MatSelectModule } from '@angular/material/select'; import { createRoutingFactory, SpectatorRouting } from '@ngneat/spectator/jest'; import { CateringOrdersService, CateringStateService } from '@placeos/catering'; -import { OrganisationService } from '@placeos/organisation'; +import { OrganisationService } from '@placeos/common'; import { MockComponent, MockProvider } from 'ng-mocks'; import { BehaviorSubject, of } from 'rxjs'; diff --git a/apps/concierge/src/tests/day-view/booking-modal.component.spec.ts b/apps/concierge/src/tests/day-view/booking-modal.component.spec.ts index 4cc96d0f36..054f4f5b4b 100644 --- a/apps/concierge/src/tests/day-view/booking-modal.component.spec.ts +++ b/apps/concierge/src/tests/day-view/booking-modal.component.spec.ts @@ -1,8 +1,8 @@ import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { createComponentFactory, Spectator } from '@ngneat/spectator/jest'; +import { IconComponent } from '@placeos/components'; import { EventFormService } from '@placeos/events'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; import { MockComponent, MockProvider } from 'ng-mocks'; import { BehaviorSubject } from 'rxjs'; diff --git a/apps/concierge/src/tests/day-view/dayview-event.component.spec.ts b/apps/concierge/src/tests/day-view/dayview-event.component.spec.ts index 4647ad3c84..2603d38bb6 100644 --- a/apps/concierge/src/tests/day-view/dayview-event.component.spec.ts +++ b/apps/concierge/src/tests/day-view/dayview-event.component.spec.ts @@ -1,6 +1,6 @@ import { createComponentFactory, Spectator } from '@ngneat/spectator/jest'; +import { IconComponent } from '@placeos/components'; import { CalendarEvent } from '@placeos/events'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; import { MockComponent, MockProvider } from 'ng-mocks'; import { BehaviorSubject } from 'rxjs'; diff --git a/apps/concierge/src/tests/day-view/dayview-timeline.component.spec.ts b/apps/concierge/src/tests/day-view/dayview-timeline.component.spec.ts index e4cd169dfd..344c333b23 100644 --- a/apps/concierge/src/tests/day-view/dayview-timeline.component.spec.ts +++ b/apps/concierge/src/tests/day-view/dayview-timeline.component.spec.ts @@ -1,7 +1,7 @@ import { MatProgressBarModule } from '@angular/material/progress-bar'; import { createComponentFactory, Spectator } from '@ngneat/spectator/jest'; +import { OrganisationService } from '@placeos/common'; import { SpacesService } from '@placeos/events'; -import { OrganisationService } from '@placeos/organisation'; import { MockComponent } from 'ng-mocks'; import { BehaviorSubject, of } from 'rxjs'; diff --git a/apps/concierge/src/tests/day-view/dayview-topbar.component.spec.ts b/apps/concierge/src/tests/day-view/dayview-topbar.component.spec.ts index 301c3562e5..7ac5b8cb7f 100644 --- a/apps/concierge/src/tests/day-view/dayview-topbar.component.spec.ts +++ b/apps/concierge/src/tests/day-view/dayview-topbar.component.spec.ts @@ -3,8 +3,8 @@ import { MatFormFieldModule } from '@angular/material/form-field'; import { MatSelectModule } from '@angular/material/select'; import { MatSlideToggleModule } from '@angular/material/slide-toggle'; import { createRoutingFactory, SpectatorRouting } from '@ngneat/spectator/jest'; -import { OrganisationService } from '@placeos/organisation'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; +import { OrganisationService } from '@placeos/common'; +import { IconComponent } from '@placeos/components'; import { MockComponent, MockProvider } from 'ng-mocks'; import { BehaviorSubject, of } from 'rxjs'; diff --git a/apps/concierge/src/tests/day-view/event-form.component.spec.ts b/apps/concierge/src/tests/day-view/event-form.component.spec.ts index 68004ae487..e5c65ffe10 100644 --- a/apps/concierge/src/tests/day-view/event-form.component.spec.ts +++ b/apps/concierge/src/tests/day-view/event-form.component.spec.ts @@ -13,11 +13,11 @@ import { } from '@placeos/form-fields'; import { MockComponent, MockProvider } from 'ng-mocks'; +import { AssetListFieldComponent } from '@placeos/assets'; +import { CateringListFieldComponent } from '@placeos/catering'; import { SettingsService } from '@placeos/common'; import { generateEventForm } from '@placeos/events'; -import { AssetListFieldComponent } from 'libs/assets/src/lib/asset-list-field.component'; -import { CateringListFieldComponent } from 'libs/catering/src/lib/catering-list-field.component'; -import { SpaceListFieldComponent } from 'libs/form-fields/src/lib/space-list-field.component'; +import { SpaceListFieldComponent } from '@placeos/form-fields'; import { EventFormComponent } from '../../app/day-view/event-form.component'; describe('EventFormComponent', () => { diff --git a/apps/concierge/src/tests/day-view/event-state.service.spec.ts b/apps/concierge/src/tests/day-view/event-state.service.spec.ts index d6f2ff6922..ed2b5a5925 100644 --- a/apps/concierge/src/tests/day-view/event-state.service.spec.ts +++ b/apps/concierge/src/tests/day-view/event-state.service.spec.ts @@ -18,11 +18,12 @@ jest.mock('@placeos/events'); import * as events_mod from '@placeos/events'; import { MockProvider } from 'ng-mocks'; -import { nextValueFrom } from '@placeos/common'; -import { SettingsService } from 'libs/common/src/lib/settings.service'; -import { Building } from 'libs/organisation/src/lib/building.class'; -import { OrganisationService } from 'libs/organisation/src/lib/organisation.service'; -import { Region } from 'libs/organisation/src/lib/region.class'; +import { + nextValueFrom, + OrganisationService, + SettingsService, +} from '@placeos/common'; +import { Building, Region } from '@placeos/organisation'; describe('EventsStateService', () => { let spectator: SpectatorService; diff --git a/apps/concierge/src/tests/desks/desk-bookings.component.spec.ts b/apps/concierge/src/tests/desks/desk-bookings.component.spec.ts index 2f37ed437a..85221232cf 100644 --- a/apps/concierge/src/tests/desks/desk-bookings.component.spec.ts +++ b/apps/concierge/src/tests/desks/desk-bookings.component.spec.ts @@ -5,8 +5,7 @@ import { MockComponent, MockProvider } from 'ng-mocks'; import { BehaviorSubject } from 'rxjs'; import { SettingsService } from '@placeos/common'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; -import { SimpleTableComponent } from 'libs/components/src/lib/simple-table.component'; +import { IconComponent, SimpleTableComponent } from '@placeos/components'; import { DeskBookingsComponent } from '../../app/desks/desk-bookings.component'; import { DesksStateService } from '../../app/desks/desks-state.service'; diff --git a/apps/concierge/src/tests/desks/desk-map-view.component.spec.ts b/apps/concierge/src/tests/desks/desk-map-view.component.spec.ts index 2e70667c5a..19a5636e41 100644 --- a/apps/concierge/src/tests/desks/desk-map-view.component.spec.ts +++ b/apps/concierge/src/tests/desks/desk-map-view.component.spec.ts @@ -3,15 +3,15 @@ import { createComponentFactory, Spectator } from '@ngneat/spectator/jest'; import { MockComponent } from 'ng-mocks'; import { BehaviorSubject, of } from 'rxjs'; +import { OrganisationService } from '@placeos/common'; import { ExploreDesksService, ExploreStateService, ExploreZoomControlComponent, } from '@placeos/explore'; import { UserSearchFieldComponent } from '@placeos/form-fields'; -import { OrganisationService } from '@placeos/organisation'; -import { InteractiveMapComponent } from 'libs/components/src/lib/interactive-map.component'; +import { InteractiveMapComponent } from '@placeos/components'; import { DeskMapViewComponent } from '../../app/desks/desk-map-view.component'; import { DesksStateService } from '../../app/desks/desks-state.service'; diff --git a/apps/concierge/src/tests/desks/desks-manage.component.spec.ts b/apps/concierge/src/tests/desks/desks-manage.component.spec.ts index 6c69918b30..c67f1cc8ef 100644 --- a/apps/concierge/src/tests/desks/desks-manage.component.spec.ts +++ b/apps/concierge/src/tests/desks/desks-manage.component.spec.ts @@ -4,12 +4,11 @@ import { MatInputModule } from '@angular/material/input'; import { MatMenuModule } from '@angular/material/menu'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { createComponentFactory, Spectator } from '@ngneat/spectator/jest'; -import { SettingsService } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { OrganisationService, SettingsService } from '@placeos/common'; import { MockComponent, MockProvider } from 'ng-mocks'; import { BehaviorSubject, of } from 'rxjs'; -import { ItemListFieldComponent } from 'libs/form-fields/src/lib/item-list-field.component'; +import { ItemListFieldComponent } from '@placeos/form-fields'; import { DesksManageComponent } from '../../app/desks/desks-manage.component'; import { DesksStateService } from '../../app/desks/desks-state.service'; @@ -17,8 +16,7 @@ jest.mock('@placeos/ts-client'); jest.mock('@placeos/common'); import { MatDialog } from '@angular/material/dialog'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; -import { SimpleTableComponent } from 'libs/components/src/lib/simple-table.component'; +import { IconComponent, SimpleTableComponent } from '@placeos/components'; describe('DesksManageComponent', () => { let spectator: Spectator; diff --git a/apps/concierge/src/tests/desks/desks-state.service.spec.ts b/apps/concierge/src/tests/desks/desks-state.service.spec.ts index 839ed63477..152124f2b5 100644 --- a/apps/concierge/src/tests/desks/desks-state.service.spec.ts +++ b/apps/concierge/src/tests/desks/desks-state.service.spec.ts @@ -1,6 +1,6 @@ import { MatDialog } from '@angular/material/dialog'; import { SpectatorService, createServiceFactory } from '@ngneat/spectator/jest'; -import { OrganisationService } from '@placeos/organisation'; +import { OrganisationService } from '@placeos/common'; import { of } from 'rxjs'; import { SettingsService } from '@placeos/common'; diff --git a/apps/concierge/src/tests/desks/desks-topbar.component.spec.ts b/apps/concierge/src/tests/desks/desks-topbar.component.spec.ts index 8a8dccb05b..9973115b06 100644 --- a/apps/concierge/src/tests/desks/desks-topbar.component.spec.ts +++ b/apps/concierge/src/tests/desks/desks-topbar.component.spec.ts @@ -3,7 +3,7 @@ import { MatFormFieldModule } from '@angular/material/form-field'; import { MatProgressBarModule } from '@angular/material/progress-bar'; import { MatSelectModule } from '@angular/material/select'; import { createRoutingFactory, SpectatorRouting } from '@ngneat/spectator/jest'; -import { OrganisationService } from '@placeos/organisation'; +import { OrganisationService } from '@placeos/common'; import { MockComponent, MockProvider } from 'ng-mocks'; import { BehaviorSubject, of, timer } from 'rxjs'; diff --git a/apps/concierge/src/tests/desks/desks.component.spec.ts b/apps/concierge/src/tests/desks/desks.component.spec.ts index cc48cf6965..cba5f3048d 100644 --- a/apps/concierge/src/tests/desks/desks.component.spec.ts +++ b/apps/concierge/src/tests/desks/desks.component.spec.ts @@ -7,7 +7,7 @@ import { FormsModule } from '@angular/forms'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatSelectModule } from '@angular/material/select'; import { SettingsService } from '@placeos/common'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; +import { IconComponent } from '@placeos/components'; import { DesksStateService } from '../../app/desks/desks-state.service'; import { DesksTopbarComponent } from '../../app/desks/desks-topbar.component'; import { DesksComponent } from '../../app/desks/desks.component'; diff --git a/apps/concierge/src/tests/points/asset-modal.component.spec.ts b/apps/concierge/src/tests/points/asset-modal.component.spec.ts index 7c42721a3e..937213b8ed 100644 --- a/apps/concierge/src/tests/points/asset-modal.component.spec.ts +++ b/apps/concierge/src/tests/points/asset-modal.component.spec.ts @@ -7,13 +7,13 @@ import { MatInputModule } from '@angular/material/input'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatSelectModule } from '@angular/material/select'; import { createComponentFactory, Spectator } from '@ngneat/spectator/jest'; +import { IconComponent } from '@placeos/components'; import { SpacesService } from '@placeos/events'; import { CounterComponent, TimeFieldComponent } from '@placeos/form-fields'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; import { MockComponent, MockProvider } from 'ng-mocks'; import { BehaviorSubject } from 'rxjs'; -import { SettingsToggleComponent } from 'libs/components/src/lib/settings-toggle.component'; +import { SettingsToggleComponent } from '@placeos/components'; import { DesksStateService } from '../../app/desks/desks-state.service'; import { PointsAssetModalComponent } from '../../app/points/asset-modal.component'; diff --git a/apps/concierge/src/tests/points/points-assets.component.spec.ts b/apps/concierge/src/tests/points/points-assets.component.spec.ts index c3a3622a51..71502e5663 100644 --- a/apps/concierge/src/tests/points/points-assets.component.spec.ts +++ b/apps/concierge/src/tests/points/points-assets.component.spec.ts @@ -1,9 +1,8 @@ import { createComponentFactory, Spectator } from '@ngneat/spectator/jest'; -import { OrganisationService } from '@placeos/organisation'; +import { OrganisationService } from '@placeos/common'; import { MockComponent, MockProvider } from 'ng-mocks'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; -import { SimpleTableComponent } from 'libs/components/src/lib/simple-table.component'; +import { IconComponent, SimpleTableComponent } from '@placeos/components'; import { PointsAssetsComponent } from '../../app/points/points-assets.component'; import { PointsStateService } from '../../app/points/points-state.service'; diff --git a/apps/concierge/src/tests/points/points-overview.component.spec.ts b/apps/concierge/src/tests/points/points-overview.component.spec.ts index 6293478415..651e8d2716 100644 --- a/apps/concierge/src/tests/points/points-overview.component.spec.ts +++ b/apps/concierge/src/tests/points/points-overview.component.spec.ts @@ -1,7 +1,7 @@ import { FormsModule } from '@angular/forms'; import { createComponentFactory, Spectator } from '@ngneat/spectator/jest'; +import { IconComponent } from '@placeos/components'; import { CounterComponent } from '@placeos/form-fields'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; import { MockComponent, MockModule } from 'ng-mocks'; import { MatTooltipModule } from '@angular/material/tooltip'; diff --git a/apps/concierge/src/tests/points/points-topbar.component.spec.ts b/apps/concierge/src/tests/points/points-topbar.component.spec.ts index f91bd2c37b..92dc1980a9 100644 --- a/apps/concierge/src/tests/points/points-topbar.component.spec.ts +++ b/apps/concierge/src/tests/points/points-topbar.component.spec.ts @@ -1,5 +1,5 @@ import { createComponentFactory, Spectator } from '@ngneat/spectator/jest'; -import { OrganisationService } from '@placeos/organisation'; +import { OrganisationService } from '@placeos/common'; import { MockComponent } from 'ng-mocks'; import { of } from 'rxjs'; import { PointsTopbarComponent } from '../../app/points/points-topbar.component'; diff --git a/apps/concierge/src/tests/reports/catering/catering-report-items.component.spec.ts b/apps/concierge/src/tests/reports/catering/catering-report-items.component.spec.ts index 09f1155c4a..b8438a1a66 100644 --- a/apps/concierge/src/tests/reports/catering/catering-report-items.component.spec.ts +++ b/apps/concierge/src/tests/reports/catering/catering-report-items.component.spec.ts @@ -5,9 +5,9 @@ import { BehaviorSubject } from 'rxjs'; import { Router } from '@angular/router'; import { SettingsService } from '@placeos/common'; +import { SimpleTableComponent } from '@placeos/components'; import { CateringReportItemsComponent } from 'apps/concierge/src/app/reports/catering/catering-report-items.component'; import { CateringReportStateService } from 'apps/concierge/src/app/reports/catering/catering-report-state.service'; -import { SimpleTableComponent } from 'libs/components/src/lib/simple-table.component'; describe('CateringReportItemsComponent', () => { let spectator: Spectator; diff --git a/apps/concierge/src/tests/reports/catering/catering-report-orders.component.spec.ts b/apps/concierge/src/tests/reports/catering/catering-report-orders.component.spec.ts index 1a7d8a4e0a..74ed9c5b84 100644 --- a/apps/concierge/src/tests/reports/catering/catering-report-orders.component.spec.ts +++ b/apps/concierge/src/tests/reports/catering/catering-report-orders.component.spec.ts @@ -6,10 +6,9 @@ import { MatTooltipModule } from '@angular/material/tooltip'; import { Router } from '@angular/router'; import { SettingsService } from '@placeos/common'; +import { IconComponent, SimpleTableComponent } from '@placeos/components'; import { CateringReportOrdersComponent } from 'apps/concierge/src/app/reports/catering/catering-report-orders.component'; import { CateringReportStateService } from 'apps/concierge/src/app/reports/catering/catering-report-state.service'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; -import { SimpleTableComponent } from 'libs/components/src/lib/simple-table.component'; describe('CateringReportOrdersComponent', () => { let spectator: Spectator; diff --git a/apps/concierge/src/tests/reports/catering/catering-report-overall.component.spec.ts b/apps/concierge/src/tests/reports/catering/catering-report-overall.component.spec.ts index aaed38a0c9..ff9e4fce55 100644 --- a/apps/concierge/src/tests/reports/catering/catering-report-overall.component.spec.ts +++ b/apps/concierge/src/tests/reports/catering/catering-report-overall.component.spec.ts @@ -2,7 +2,7 @@ import { createComponentFactory, Spectator } from '@ngneat/spectator/jest'; import { BehaviorSubject } from 'rxjs'; import { Router } from '@angular/router'; -import { OrganisationService } from '@placeos/organisation'; +import { OrganisationService } from '@placeos/common'; import { CateringReportOverallComponent } from 'apps/concierge/src/app/reports/catering/catering-report-overall.component'; import { CateringReportStateService } from 'apps/concierge/src/app/reports/catering/catering-report-state.service'; import { MockProvider } from 'ng-mocks'; diff --git a/apps/concierge/src/tests/reports/catering/catering-report.component.spec.ts b/apps/concierge/src/tests/reports/catering/catering-report.component.spec.ts index 75ebd5c811..c05252b5ce 100644 --- a/apps/concierge/src/tests/reports/catering/catering-report.component.spec.ts +++ b/apps/concierge/src/tests/reports/catering/catering-report.component.spec.ts @@ -4,13 +4,13 @@ import { MockComponent, MockDirective, MockProvider } from 'ng-mocks'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { Router } from '@angular/router'; import { SettingsService } from '@placeos/common'; +import { AuthenticatedImageDirective } from '@placeos/components'; import { CateringReportItemsComponent } from 'apps/concierge/src/app/reports/catering/catering-report-items.component'; import { CateringReportOrdersComponent } from 'apps/concierge/src/app/reports/catering/catering-report-orders.component'; import { CateringReportOverallComponent } from 'apps/concierge/src/app/reports/catering/catering-report-overall.component'; import { CateringReportComponent } from 'apps/concierge/src/app/reports/catering/catering-report.component'; import { ReportsOptionsComponent } from 'apps/concierge/src/app/reports/reports-options.component'; import { ReportsStateService } from 'apps/concierge/src/app/reports/reports-state.service'; -import { AuthenticatedImageDirective } from 'libs/components/src/lib/authenticated-image.directive'; import { BehaviorSubject } from 'rxjs'; describe('CateringReportComponent', () => { diff --git a/apps/concierge/src/tests/staff/staff-details.component.spec.ts b/apps/concierge/src/tests/staff/staff-details.component.spec.ts index d6df212c61..5ce6345be0 100644 --- a/apps/concierge/src/tests/staff/staff-details.component.spec.ts +++ b/apps/concierge/src/tests/staff/staff-details.component.spec.ts @@ -5,8 +5,7 @@ import { MockComponent } from 'ng-mocks'; import { ActionIconComponent } from '@placeos/components'; import { StaffUser } from '@placeos/users'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; -import { UserAvatarComponent } from 'libs/components/src/lib/user-avatar.component'; +import { IconComponent, UserAvatarComponent } from '@placeos/components'; import { StaffDetailsComponent } from '../../app/staff/staff-details.component'; import { StaffStateService } from '../../app/staff/staff-state.service'; diff --git a/apps/concierge/src/tests/staff/staff-state.service.spec.ts b/apps/concierge/src/tests/staff/staff-state.service.spec.ts index e2937dc695..26f95a1ed5 100644 --- a/apps/concierge/src/tests/staff/staff-state.service.spec.ts +++ b/apps/concierge/src/tests/staff/staff-state.service.spec.ts @@ -1,5 +1,5 @@ import { createServiceFactory, SpectatorService } from '@ngneat/spectator/jest'; -import { OrganisationService } from '@placeos/organisation'; +import { OrganisationService } from '@placeos/common'; import { of } from 'rxjs'; import { StaffStateService } from '../../app/staff/staff-state.service'; diff --git a/apps/concierge/src/tests/staff/staff-topbar.component.spec.ts b/apps/concierge/src/tests/staff/staff-topbar.component.spec.ts index 3ca462ec25..c6eb3dff89 100644 --- a/apps/concierge/src/tests/staff/staff-topbar.component.spec.ts +++ b/apps/concierge/src/tests/staff/staff-topbar.component.spec.ts @@ -3,7 +3,7 @@ import { MatFormFieldModule } from '@angular/material/form-field'; import { MatSelectModule } from '@angular/material/select'; import { MatSlideToggleModule } from '@angular/material/slide-toggle'; import { createRoutingFactory, SpectatorRouting } from '@ngneat/spectator/jest'; -import { OrganisationService } from '@placeos/organisation'; +import { OrganisationService } from '@placeos/common'; import { MockComponent } from 'ng-mocks'; import { of } from 'rxjs'; import { StaffStateService } from '../../app/staff/staff-state.service'; diff --git a/apps/concierge/src/tests/visitors/visitors-state.service.spec.ts b/apps/concierge/src/tests/visitors/visitors-state.service.spec.ts index 9dcc7d54bc..91002a5e92 100644 --- a/apps/concierge/src/tests/visitors/visitors-state.service.spec.ts +++ b/apps/concierge/src/tests/visitors/visitors-state.service.spec.ts @@ -14,8 +14,8 @@ jest.mock('@placeos/common'); import * as booking_mod from '@placeos/bookings'; import * as common_mod from '@placeos/common'; +import { OrganisationService } from '@placeos/common'; import * as event_mod from '@placeos/events'; -import { OrganisationService } from '@placeos/organisation'; describe('VisitorStateService', () => { let spectator: SpectatorService; diff --git a/apps/concierge/src/tests/visitors/visitors-topbar.component.spec.ts b/apps/concierge/src/tests/visitors/visitors-topbar.component.spec.ts index ae37c81f2d..6cb3e94ec0 100644 --- a/apps/concierge/src/tests/visitors/visitors-topbar.component.spec.ts +++ b/apps/concierge/src/tests/visitors/visitors-topbar.component.spec.ts @@ -3,7 +3,7 @@ import { MatFormFieldModule } from '@angular/material/form-field'; import { MatSelectModule } from '@angular/material/select'; import { MatSlideToggleModule } from '@angular/material/slide-toggle'; import { createRoutingFactory, SpectatorRouting } from '@ngneat/spectator/jest'; -import { OrganisationService } from '@placeos/organisation'; +import { OrganisationService } from '@placeos/common'; import { MockComponent } from 'ng-mocks'; import { of } from 'rxjs'; import { DateOptionsComponent } from '../../app/ui/date-options.component'; diff --git a/apps/control/src/app/advanced-view.component.ts b/apps/control/src/app/advanced-view.component.ts index 5ad7dccef2..181e37a0b6 100644 --- a/apps/control/src/app/advanced-view.component.ts +++ b/apps/control/src/app/advanced-view.component.ts @@ -1,7 +1,11 @@ import { Component, inject } from '@angular/core'; import { map } from 'rxjs/operators'; +import { CommonModule } from '@angular/common'; +import { MatRippleModule } from '@angular/material/core'; +import { TranslatePipe } from '@placeos/components'; import { ControlStateService } from './control-state.service'; +import { OutputDisplayComponent } from './ui/output-display.component'; @Component({ selector: 'control-advanced-view', @@ -59,7 +63,12 @@ import { ControlStateService } from './control-state.service'; } `, ], - standalone: false, + imports: [ + CommonModule, + TranslatePipe, + OutputDisplayComponent, + MatRippleModule, + ], }) export class ControlAdvancedViewComponent { private _state = inject(ControlStateService); diff --git a/apps/control/src/app/app.component.ts b/apps/control/src/app/app.component.ts new file mode 100644 index 0000000000..1d0ab40e6a --- /dev/null +++ b/apps/control/src/app/app.component.ts @@ -0,0 +1,34 @@ +import { Component, inject, OnInit } from '@angular/core'; +import { PlaceOS_Service, setMocks } from '@placeos/common'; +import { mocksInit } from '@placeos/mocks'; + +@Component({ + selector: 'app-root', + template: ` + +
+ +
+ + + `, + styles: [ + ` + :host { + display: flex; + flex-direction: column; + height: 100%; + width: 100%; + } + `, + ], + standalone: false, +}) +export class AppComponent implements OnInit { + private _placeos = inject(PlaceOS_Service); + + public ngOnInit(): void { + setMocks(mocksInit); + this._placeos.init(); + } +} diff --git a/apps/control/src/app/app.module.ts b/apps/control/src/app/app.module.ts index ce08053517..60e773a2d2 100644 --- a/apps/control/src/app/app.module.ts +++ b/apps/control/src/app/app.module.ts @@ -8,88 +8,41 @@ import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { Router } from '@angular/router'; import { ServiceWorkerModule } from '@angular/service-worker'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSliderModule } from '@angular/material/slider'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; - -import { AppComponent } from '../../../../libs/components/src/lib/app.component'; import { environment } from '../environments/environment'; import { ControlAdvancedViewComponent } from './advanced-view.component'; import { AppRoutingModule } from './app-routing.module'; import { BootstrapComponent } from './bootstrap.component'; import { ControlMainViewComponent } from './main-view.component'; -import { ControlPageViewComponent } from './page-view.component'; -import { ControlStatusBarComponent } from './status-bar.component'; -import { TopbarHeaderComponent } from './topbar-header.component'; -import { UIModule } from './ui/ui.module'; - -import { VideoCallPageComponent } from './video-call/video-call-page.component'; -import { ControlVideoCallViewComponent } from './video-call/video-call-view.component'; -import { DeviceOutputListItemComponent } from './tabbed-view/output-list-item.component'; -import { DeviceOutputListComponent } from './tabbed-view/output-list.component'; -import { TabOutletComponent } from './tabbed-view/tab-outlet.component'; import { ControlTabbedViewComponent } from './tabbed-view/tabbed-view.component'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import * as Sentry from '@sentry/angular'; -import { TVControlsComponent } from './tabbed-view/tv-controls.component'; -import { MatMenuModule } from '@angular/material/menu'; -import { AuthenticatedImageDirective } from 'libs/components/src/lib/authenticated-image.directive'; -import { BindingDirective } from 'libs/components/src/lib/binding.directive'; -import { CustomTooltipComponent } from 'libs/components/src/lib/custom-tooltip.component'; -import { GlobalBannerComponent } from 'libs/components/src/lib/global-banner.component'; -import { GlobalLoadingComponent } from 'libs/components/src/lib/global-loading.component'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; -import { SafePipe } from 'libs/components/src/lib/safe.pipe'; -import { TranslatePipe } from 'libs/components/src/lib/translate.pipe'; +import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { + GlobalBannerComponent, + GlobalLoadingComponent, +} from '@placeos/components'; +import { AppComponent } from './app.component'; +import { ControlVideoCallViewComponent } from './video-call/video-call-view.component'; const STANDALONE_COMPONENTS = [ - AuthenticatedImageDirective, GlobalBannerComponent, GlobalLoadingComponent, - IconComponent, - TranslatePipe, - BindingDirective, - SafePipe, - CustomTooltipComponent, -]; - -const MAT_MODULES = [ - MatMenuModule, - MatSnackBarModule, - MatDialogModule, - MatProgressSpinnerModule, - MatSliderModule, + BootstrapComponent, + ControlMainViewComponent, + ControlAdvancedViewComponent, + ControlTabbedViewComponent, + ControlVideoCallViewComponent, ]; @NgModule({ - declarations: [ - AppComponent, - BootstrapComponent, - ControlMainViewComponent, - ControlVideoCallViewComponent, - TopbarHeaderComponent, - ControlPageViewComponent, - ControlStatusBarComponent, - ControlAdvancedViewComponent, - VideoCallPageComponent, - ControlTabbedViewComponent, - DeviceOutputListComponent, - DeviceOutputListItemComponent, - TabOutletComponent, - TVControlsComponent, - ], + declarations: [AppComponent], imports: [ BrowserModule, BrowserAnimationsModule, AppRoutingModule, - FormsModule, - ReactiveFormsModule, - UIModule, - ...MAT_MODULES, + MatSnackBarModule, ...STANDALONE_COMPONENTS, ServiceWorkerModule.register('ngsw-worker.js', { enabled: environment.production, diff --git a/apps/control/src/app/bootstrap.component.ts b/apps/control/src/app/bootstrap.component.ts index 0076b46a25..52915f55d3 100644 --- a/apps/control/src/app/bootstrap.component.ts +++ b/apps/control/src/app/bootstrap.component.ts @@ -4,9 +4,15 @@ import { querySystems } from '@placeos/ts-client'; import { BehaviorSubject, of } from 'rxjs'; import { debounceTime, map, shareReplay, switchMap, tap } from 'rxjs/operators'; -import { AsyncHandler } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; -import { Space } from 'libs/events/src/lib/space.class'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatAutocompleteModule } from '@angular/material/autocomplete'; +import { MatRippleModule } from '@angular/material/core'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { AsyncHandler, OrganisationService, Space } from '@placeos/common'; +import { TranslatePipe } from '@placeos/components'; const STORE_KEY = 'PLACEOS.CONTROL.system'; @@ -76,6 +82,7 @@ const STORE_KEY = 'PLACEOS.CONTROL.system'; } + {{ system_id$ | async }}
- + {{ source?.icon || icons[source?.type] || @@ -43,8 +50,9 @@ const STATUS = {}; }} {{ source?.name || @@ -62,7 +70,7 @@ const STATUS = {}; } `, ], - standalone: false, + imports: [CommonModule, TranslatePipe, MatRippleModule, IconComponent], }) export class DeviceOutputListItemComponent extends AsyncHandler diff --git a/apps/control/src/app/tabbed-view/output-list.component.ts b/apps/control/src/app/tabbed-view/output-list.component.ts index 0d461f6eef..a11db5f369 100644 --- a/apps/control/src/app/tabbed-view/output-list.component.ts +++ b/apps/control/src/app/tabbed-view/output-list.component.ts @@ -1,6 +1,8 @@ +import { CommonModule } from '@angular/common'; import { Component, inject } from '@angular/core'; import { map } from 'rxjs/operators'; import { ControlStateService } from '../control-state.service'; +import { DeviceOutputListItemComponent } from './output-list-item.component'; @Component({ selector: 'device-output-list', @@ -18,7 +20,7 @@ import { ControlStateService } from '../control-state.service'; `, styles: [``], - standalone: false, + imports: [CommonModule, DeviceOutputListItemComponent], }) export class DeviceOutputListComponent { private _state = inject(ControlStateService); diff --git a/apps/control/src/app/tabbed-view/tab-outlet.component.ts b/apps/control/src/app/tabbed-view/tab-outlet.component.ts index 4cf736e252..5d9371f0b1 100644 --- a/apps/control/src/app/tabbed-view/tab-outlet.component.ts +++ b/apps/control/src/app/tabbed-view/tab-outlet.component.ts @@ -1,10 +1,25 @@ +import { CommonModule } from '@angular/common'; import { Component, OnInit, inject } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; +import { MatRippleModule } from '@angular/material/core'; +import { ActivatedRoute, Router, RouterModule } from '@angular/router'; import { AsyncHandler, log, nextValueFrom } from '@placeos/common'; +import { + BindingDirective, + IconComponent, + SafePipe, + TranslatePipe, +} from '@placeos/components'; import { BehaviorSubject, combineLatest } from 'rxjs'; import { debounceTime, map } from 'rxjs/operators'; import { ControlStateService } from '../control-state.service'; +import { CameraControlsComponent } from '../ui/camera-controls.component'; +import { MarkdownPipe } from '../ui/markdown.pipe'; +import { VoiceAssistantComponent } from '../ui/voice-assistant.component'; +import { VideoCallDialViewComponent } from '../video-call/video-call-dial-view.component'; +import { VideoCallPageComponent } from '../video-call/video-call-page.component'; import { VideoCallStateService } from '../video-call/video-call-state.service'; +import { DeviceOutputListComponent } from './output-list.component'; +import { TVControlsComponent } from './tv-controls.component'; @Component({ selector: 'tab-outlet,[tab-outlet]', @@ -207,7 +222,22 @@ import { VideoCallStateService } from '../video-call/video-call-state.service'; } `, ], - standalone: false, + imports: [ + CommonModule, + BindingDirective, + MatRippleModule, + IconComponent, + DeviceOutputListComponent, + TranslatePipe, + MarkdownPipe, + SafePipe, + TVControlsComponent, + VideoCallDialViewComponent, + CameraControlsComponent, + VideoCallPageComponent, + VoiceAssistantComponent, + RouterModule, + ], }) export class TabOutletComponent extends AsyncHandler implements OnInit { private _service = inject(ControlStateService); diff --git a/apps/control/src/app/tabbed-view/tabbed-view.component.ts b/apps/control/src/app/tabbed-view/tabbed-view.component.ts index 363a0fe60c..62927683a2 100644 --- a/apps/control/src/app/tabbed-view/tabbed-view.component.ts +++ b/apps/control/src/app/tabbed-view/tabbed-view.component.ts @@ -3,11 +3,22 @@ import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute } from '@angular/router'; import { AsyncHandler, SettingsService, VERSION } from '@placeos/common'; -import { ChangelogModalComponent } from 'libs/components/src/lib/changelog-modal.component'; +import { + AuthenticatedImageDirective, + ChangelogModalComponent, + IconComponent, + TranslatePipe, +} from '@placeos/components'; -import { OrganisationService } from '@placeos/organisation'; +import { CommonModule } from '@angular/common'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { OrganisationService } from '@placeos/common'; import { debounceTime, map } from 'rxjs/operators'; import { ControlStateService } from '../control-state.service'; +import { ControlStatusBarComponent } from '../status-bar.component'; +import { TopbarHeaderComponent } from '../topbar-header.component'; +import { VoiceAssistantComponent } from '../ui/voice-assistant.component'; +import { TabOutletComponent } from './tab-outlet.component'; @Component({ selector: 'app-control-tabbed-view', @@ -105,7 +116,17 @@ import { ControlStateService } from '../control-state.service'; } `, ], - standalone: false, + imports: [ + CommonModule, + TopbarHeaderComponent, + TabOutletComponent, + ControlStatusBarComponent, + MatProgressSpinnerModule, + TranslatePipe, + IconComponent, + AuthenticatedImageDirective, + VoiceAssistantComponent, + ], }) export class ControlTabbedViewComponent extends AsyncHandler implements OnInit { private _route = inject(ActivatedRoute); diff --git a/apps/control/src/app/tabbed-view/tv-controls.component.ts b/apps/control/src/app/tabbed-view/tv-controls.component.ts index ba56e6f4e7..0cb9b32af7 100644 --- a/apps/control/src/app/tabbed-view/tv-controls.component.ts +++ b/apps/control/src/app/tabbed-view/tv-controls.component.ts @@ -1,5 +1,10 @@ import { Component, inject, input } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; import { AsyncHandler } from '@placeos/common'; +import { + AuthenticatedImageDirective, + BindingDirective, +} from '@placeos/components'; import { getModule } from '@placeos/ts-client'; import { ControlStateService } from '../control-state.service'; @@ -35,7 +40,8 @@ import { ControlStateService } from '../control-state.service'; > @if (item?.icon) { } @@ -45,7 +51,7 @@ import { ControlStateService } from '../control-state.service'; } `, - standalone: false, + imports: [BindingDirective, MatRippleModule, AuthenticatedImageDirective], }) export class TVControlsComponent extends AsyncHandler { private _state = inject(ControlStateService); diff --git a/apps/control/src/app/topbar-header.component.ts b/apps/control/src/app/topbar-header.component.ts index 16a5d962e1..96209752d1 100644 --- a/apps/control/src/app/topbar-header.component.ts +++ b/apps/control/src/app/topbar-header.component.ts @@ -1,6 +1,17 @@ +import { CommonModule } from '@angular/common'; import { Component, inject, OnInit } from '@angular/core'; -import { AsyncHandler, i18n, SettingsService } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { MatMenuModule } from '@angular/material/menu'; +import { + AsyncHandler, + i18n, + OrganisationService, + SettingsService, +} from '@placeos/common'; +import { + AuthenticatedImageDirective, + CustomTooltipComponent, + IconComponent, +} from '@placeos/components'; import { isTrusted } from '@placeos/ts-client'; import { combineLatest } from 'rxjs'; import { debounceTime, map } from 'rxjs/operators'; @@ -123,7 +134,13 @@ enum TOOLTIP { } `, ], - standalone: false, + imports: [ + CommonModule, + MatMenuModule, + CustomTooltipComponent, + IconComponent, + AuthenticatedImageDirective, + ], }) export class TopbarHeaderComponent extends AsyncHandler implements OnInit { private _settings = inject(SettingsService); diff --git a/apps/control/src/app/ui/camera-controls.component.ts b/apps/control/src/app/ui/camera-controls.component.ts index 6406ad9749..a1505b6fc6 100644 --- a/apps/control/src/app/ui/camera-controls.component.ts +++ b/apps/control/src/app/ui/camera-controls.component.ts @@ -3,8 +3,18 @@ import { AsyncHandler } from '@placeos/common'; import { getModule } from '@placeos/ts-client'; import { combineLatest } from 'rxjs'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatRippleModule } from '@angular/material/core'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatSelectModule } from '@angular/material/select'; +import { IconComponent, TranslatePipe } from '@placeos/components'; import { ControlStateService, RoomInput } from '../control-state.service'; -import { JoystickPan, JoystickTilt } from './joystick.component'; +import { + JoystickComponent, + JoystickPan, + JoystickTilt, +} from './joystick.component'; export enum ZoomDirection { In = 'in', @@ -86,7 +96,16 @@ export enum ZoomDirection { } `, styles: [``], - standalone: false, + imports: [ + CommonModule, + TranslatePipe, + IconComponent, + MatRippleModule, + JoystickComponent, + MatFormFieldModule, + MatSelectModule, + FormsModule, + ], }) export class CameraControlsComponent extends AsyncHandler implements OnInit { private _state = inject(ControlStateService); diff --git a/apps/control/src/app/ui/camera-tooltip.component.ts b/apps/control/src/app/ui/camera-tooltip.component.ts index ddc7097794..68c2dc0e86 100644 --- a/apps/control/src/app/ui/camera-tooltip.component.ts +++ b/apps/control/src/app/ui/camera-tooltip.component.ts @@ -1,11 +1,27 @@ import { Component, OnInit, Renderer2, inject } from '@angular/core'; import { AsyncHandler } from '@placeos/common'; +import { + BindingDirective, + CustomTooltipData, + IconComponent, + TranslatePipe, +} from '@placeos/components'; import { getModule } from '@placeos/ts-client'; -import { CustomTooltipData } from 'libs/components/src/lib/custom-tooltip.component'; import { combineLatest } from 'rxjs'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatRippleModule } from '@angular/material/core'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatSelectModule } from '@angular/material/select'; import { ControlStateService, RoomInput } from '../control-state.service'; -import { JoystickPan, JoystickTilt } from './joystick.component'; +import { + JoystickComponent, + JoystickPan, + JoystickTilt, +} from './joystick.component'; export enum ZoomDirection { In = 'in', @@ -199,7 +215,19 @@ export enum ZoomDirection { } `, styles: [``], - standalone: false, + imports: [ + CommonModule, + BindingDirective, + FormsModule, + TranslatePipe, + MatRippleModule, + IconComponent, + JoystickComponent, + MatMenuModule, + MatFormFieldModule, + MatInputModule, + MatSelectModule, + ], }) export class CameraTooltipComponent extends AsyncHandler implements OnInit { private _state = inject(ControlStateService); diff --git a/apps/control/src/app/ui/dialpad.component.ts b/apps/control/src/app/ui/dialpad.component.ts index 1851db7455..8d97227fd5 100644 --- a/apps/control/src/app/ui/dialpad.component.ts +++ b/apps/control/src/app/ui/dialpad.component.ts @@ -1,4 +1,6 @@ import { Component, input, output } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; +import { TranslatePipe } from '@placeos/components'; @Component({ selector: 'dialpad', @@ -49,7 +51,7 @@ import { Component, input, output } from '@angular/core'; } `, ], - standalone: false, + imports: [MatRippleModule, TranslatePipe], }) export class DialpadComponent { public readonly backspace = input(true); diff --git a/apps/control/src/app/ui/duration.pipe.ts b/apps/control/src/app/ui/duration.pipe.ts index 204be76608..c2ae55577e 100644 --- a/apps/control/src/app/ui/duration.pipe.ts +++ b/apps/control/src/app/ui/duration.pipe.ts @@ -8,7 +8,6 @@ export function padLength(value: number | string, length = 2): string { @Pipe({ name: 'duration', - standalone: false, }) export class DurationPipe implements PipeTransform { public transform(length: number): string { diff --git a/apps/control/src/app/ui/help-modal.component.ts b/apps/control/src/app/ui/help-modal.component.ts index b4477a1dfa..70c3408668 100644 --- a/apps/control/src/app/ui/help-modal.component.ts +++ b/apps/control/src/app/ui/help-modal.component.ts @@ -1,7 +1,16 @@ +import { CommonModule } from '@angular/common'; import { Component, inject } from '@angular/core'; -import { MAT_DIALOG_DATA } from '@angular/material/dialog'; -import { SettingsService } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { FormsModule } from '@angular/forms'; +import { MatRippleModule } from '@angular/material/core'; +import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatSelectModule } from '@angular/material/select'; +import { OrganisationService, SettingsService } from '@placeos/common'; +import { + AuthenticatedImageDirective, + IconComponent, + SafePipe, +} from '@placeos/components'; import { marked } from 'marked'; import { debounceTime, map } from 'rxjs/operators'; @@ -85,7 +94,17 @@ import { debounceTime, map } from 'rxjs/operators'; } `, ], - standalone: false, + imports: [ + CommonModule, + MatDialogModule, + SafePipe, + MatFormFieldModule, + MatSelectModule, + FormsModule, + MatRippleModule, + IconComponent, + AuthenticatedImageDirective, + ], }) export class HelpModalComponent { private _data = inject<{ diff --git a/apps/control/src/app/ui/help-tooltip.component.ts b/apps/control/src/app/ui/help-tooltip.component.ts index c74c97d3f0..51582a7fda 100644 --- a/apps/control/src/app/ui/help-tooltip.component.ts +++ b/apps/control/src/app/ui/help-tooltip.component.ts @@ -1,5 +1,9 @@ import { Component, inject } from '@angular/core'; -import { CustomTooltipData } from 'libs/components/src/lib/custom-tooltip.component'; +import { + CustomTooltipData, + SanitizePipe, + TranslatePipe, +} from '@placeos/components'; import { ControlStateService } from '../control-state.service'; @@ -34,7 +38,7 @@ import { ControlStateService } from '../control-state.service'; } `, ], - standalone: false, + imports: [TranslatePipe, SanitizePipe], }) export class HelpTooltipComponent { private _state = inject(ControlStateService); diff --git a/apps/control/src/app/ui/join-room-tooltip.component.ts b/apps/control/src/app/ui/join-room-tooltip.component.ts index 65edd2db4a..6e23db25f8 100644 --- a/apps/control/src/app/ui/join-room-tooltip.component.ts +++ b/apps/control/src/app/ui/join-room-tooltip.component.ts @@ -1,4 +1,7 @@ +import { CommonModule } from '@angular/common'; import { Component, inject } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; +import { TranslatePipe } from '@placeos/components'; import { map } from 'rxjs/operators'; import { ControlStateService } from '../control-state.service'; @@ -27,7 +30,7 @@ import { ControlStateService } from '../control-state.service'; `, styles: [``], - standalone: false, + imports: [CommonModule, TranslatePipe, MatRippleModule], }) export class JoinRoomTooltipComponent { private _state = inject(ControlStateService); diff --git a/apps/control/src/app/ui/joystick.component.ts b/apps/control/src/app/ui/joystick.component.ts index 8fe4667f97..5493a9925e 100644 --- a/apps/control/src/app/ui/joystick.component.ts +++ b/apps/control/src/app/ui/joystick.component.ts @@ -8,6 +8,7 @@ import { viewChild, } from '@angular/core'; import { AsyncHandler } from '@placeos/common'; +import { IconComponent } from '@placeos/components'; import { Point } from '@placeos/svg-viewer'; /** @@ -80,7 +81,7 @@ export enum JoystickPan { `, styles: [``], - standalone: false, + imports: [IconComponent], }) export class JoystickComponent extends AsyncHandler { private _renderer = inject(Renderer2); diff --git a/apps/control/src/app/ui/lighting-levels-tooltip.component.ts b/apps/control/src/app/ui/lighting-levels-tooltip.component.ts index 8afe536a77..5420169888 100644 --- a/apps/control/src/app/ui/lighting-levels-tooltip.component.ts +++ b/apps/control/src/app/ui/lighting-levels-tooltip.component.ts @@ -1,6 +1,13 @@ import { Component, inject } from '@angular/core'; -import { CustomTooltipData } from 'libs/components/src/lib/custom-tooltip.component'; +import { + BindingDirective, + CustomTooltipData, + TranslatePipe, +} from '@placeos/components'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatSliderModule } from '@angular/material/slider'; import { AsyncHandler, nextValueFrom } from '@placeos/common'; import { getModule } from '@placeos/ts-client'; import { ControlStateService } from '../control-state.service'; @@ -51,7 +58,13 @@ import { ControlStateService } from '../control-state.service'; `, styles: [``], - standalone: false, + imports: [ + CommonModule, + TranslatePipe, + MatSliderModule, + FormsModule, + BindingDirective, + ], }) export class LightingLevelsTooltipComponent extends AsyncHandler { private _state = inject(ControlStateService); diff --git a/apps/control/src/app/ui/lighting-scene-tooltip.component.ts b/apps/control/src/app/ui/lighting-scene-tooltip.component.ts index 55f61e35a8..1cc5ec682c 100644 --- a/apps/control/src/app/ui/lighting-scene-tooltip.component.ts +++ b/apps/control/src/app/ui/lighting-scene-tooltip.component.ts @@ -1,7 +1,13 @@ import { Component, inject } from '@angular/core'; +import { + CustomTooltipData, + IconComponent, + TranslatePipe, +} from '@placeos/components'; import { getModule } from '@placeos/ts-client'; -import { CustomTooltipData } from 'libs/components/src/lib/custom-tooltip.component'; +import { CommonModule } from '@angular/common'; +import { MatRippleModule } from '@angular/material/core'; import { ControlStateService } from '../control-state.service'; @Component({ @@ -41,7 +47,7 @@ import { ControlStateService } from '../control-state.service'; `, styles: [``], - standalone: false, + imports: [CommonModule, TranslatePipe, IconComponent, MatRippleModule], }) export class LightingSceneTooltipComponent { private _state = inject(ControlStateService); diff --git a/apps/control/src/app/ui/lighting-tooltip.component.ts b/apps/control/src/app/ui/lighting-tooltip.component.ts index afed5ffb49..1cbe5e01e6 100644 --- a/apps/control/src/app/ui/lighting-tooltip.component.ts +++ b/apps/control/src/app/ui/lighting-tooltip.component.ts @@ -1,6 +1,12 @@ import { Component, inject } from '@angular/core'; -import { CustomTooltipData } from 'libs/components/src/lib/custom-tooltip.component'; +import { + BindingDirective, + CustomTooltipData, + TranslatePipe, +} from '@placeos/components'; +import { CommonModule } from '@angular/common'; +import { MatRippleModule } from '@angular/material/core'; import { ControlStateService, EnvironmentSource, @@ -52,7 +58,7 @@ import { `, styles: [``], - standalone: false, + imports: [CommonModule, BindingDirective, TranslatePipe, MatRippleModule], }) export class LightingTooltipComponent { private _state = inject(ControlStateService); diff --git a/apps/control/src/app/ui/markdown.pipe.ts b/apps/control/src/app/ui/markdown.pipe.ts index 73557a0777..1664002f36 100644 --- a/apps/control/src/app/ui/markdown.pipe.ts +++ b/apps/control/src/app/ui/markdown.pipe.ts @@ -4,7 +4,6 @@ import { marked } from 'marked'; @Pipe({ name: 'markdown', - standalone: false, }) export class MarkdownPipe implements PipeTransform { public transform(value: string): string { diff --git a/apps/control/src/app/ui/microphone-tooltip.component.ts b/apps/control/src/app/ui/microphone-tooltip.component.ts index 17c69cd02c..3470a99208 100644 --- a/apps/control/src/app/ui/microphone-tooltip.component.ts +++ b/apps/control/src/app/ui/microphone-tooltip.component.ts @@ -1,7 +1,17 @@ import { Component, inject } from '@angular/core'; import { AsyncHandler } from '@placeos/common'; -import { CustomTooltipData } from 'libs/components/src/lib/custom-tooltip.component'; +import { + BindingDirective, + CustomTooltipData, + IconComponent, + SettingsToggleComponent, + TranslatePipe, +} from '@placeos/components'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatRippleModule } from '@angular/material/core'; +import { MatSliderModule } from '@angular/material/slider'; import { getModule } from '@placeos/ts-client'; import { ControlStateService } from '../control-state.service'; @@ -218,7 +228,16 @@ import { ControlStateService } from '../control-state.service'; `, styles: [``], - standalone: false, + imports: [ + CommonModule, + TranslatePipe, + BindingDirective, + MatSliderModule, + FormsModule, + MatRippleModule, + SettingsToggleComponent, + IconComponent, + ], }) export class MicrophoneTooltipComponent extends AsyncHandler { private _state = inject(ControlStateService); diff --git a/apps/control/src/app/ui/output-display.component.ts b/apps/control/src/app/ui/output-display.component.ts index e9c8da8e5c..280900fc5d 100644 --- a/apps/control/src/app/ui/output-display.component.ts +++ b/apps/control/src/app/ui/output-display.component.ts @@ -9,6 +9,11 @@ import { AsyncHandler } from '@placeos/common'; import { BehaviorSubject, combineLatest } from 'rxjs'; import { map } from 'rxjs/operators'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatRippleModule } from '@angular/material/core'; +import { MatSliderModule } from '@angular/material/slider'; +import { IconComponent, TranslatePipe } from '@placeos/components'; import { ControlStateService, RoomOutput } from '../control-state.service'; export const ICON_MAP = { @@ -83,7 +88,14 @@ export const ICON_MAP = { } `, ], - standalone: false, + imports: [ + CommonModule, + MatSliderModule, + FormsModule, + IconComponent, + MatRippleModule, + TranslatePipe, + ], }) export class OutputDisplayComponent extends AsyncHandler implements OnChanges { private _state = inject(ControlStateService); diff --git a/apps/control/src/app/ui/phone-dialling-tooltip.component.ts b/apps/control/src/app/ui/phone-dialling-tooltip.component.ts index 8da2c572b5..3354334f11 100644 --- a/apps/control/src/app/ui/phone-dialling-tooltip.component.ts +++ b/apps/control/src/app/ui/phone-dialling-tooltip.component.ts @@ -1,6 +1,13 @@ +import { CommonModule } from '@angular/common'; import { Component, inject } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { MatRippleModule } from '@angular/material/core'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { IconComponent, TranslatePipe } from '@placeos/components'; import { getModule } from '@placeos/ts-client'; import { ControlStateService } from '../control-state.service'; +import { DialpadComponent } from './dialpad.component'; @Component({ selector: 'phone-dialling-tooltip', @@ -35,7 +42,16 @@ import { ControlStateService } from '../control-state.service'; `, styles: [``], - standalone: false, + imports: [ + CommonModule, + MatFormFieldModule, + MatInputModule, + MatRippleModule, + IconComponent, + TranslatePipe, + DialpadComponent, + FormsModule, + ], }) export class PhoneDiallingTooltipComponent { private _state = inject(ControlStateService); diff --git a/apps/control/src/app/ui/power-tooltip.component.ts b/apps/control/src/app/ui/power-tooltip.component.ts index c7882f3d7c..a9ca47eeb5 100644 --- a/apps/control/src/app/ui/power-tooltip.component.ts +++ b/apps/control/src/app/ui/power-tooltip.component.ts @@ -1,6 +1,11 @@ import { Component, inject } from '@angular/core'; -import { CustomTooltipData } from 'libs/components/src/lib/custom-tooltip.component'; +import { + CustomTooltipData, + SanitizePipe, + TranslatePipe, +} from '@placeos/components'; +import { MatRippleModule } from '@angular/material/core'; import { ControlStateService } from '../control-state.service'; @Component({ @@ -22,7 +27,7 @@ import { ControlStateService } from '../control-state.service'; `, styles: [``], - standalone: false, + imports: [TranslatePipe, SanitizePipe, MatRippleModule], }) export class PowerTooltipComponent { private _state = inject(ControlStateService); diff --git a/apps/control/src/app/ui/room-accessory-tooltip.component.ts b/apps/control/src/app/ui/room-accessory-tooltip.component.ts index b33137e784..a9da55dcc4 100644 --- a/apps/control/src/app/ui/room-accessory-tooltip.component.ts +++ b/apps/control/src/app/ui/room-accessory-tooltip.component.ts @@ -1,7 +1,14 @@ import { Component, inject } from '@angular/core'; +import { + CustomTooltipData, + IconComponent, + TranslatePipe, +} from '@placeos/components'; import { getModule } from '@placeos/ts-client'; -import { CustomTooltipData } from 'libs/components/src/lib/custom-tooltip.component'; +import { CommonModule } from '@angular/common'; +import { MatRippleModule } from '@angular/material/core'; +import { MatTooltipModule } from '@angular/material/tooltip'; import { ControlStateService } from '../control-state.service'; @Component({ @@ -45,7 +52,13 @@ import { ControlStateService } from '../control-state.service'; `, styles: [``], - standalone: false, + imports: [ + CommonModule, + TranslatePipe, + MatRippleModule, + IconComponent, + MatTooltipModule, + ], }) export class RoomAccessoryTooltipComponent { private _state = inject(ControlStateService); diff --git a/apps/control/src/app/ui/select-meeting-modal.component.ts b/apps/control/src/app/ui/select-meeting-modal.component.ts index cec2b8c167..d8476f7024 100644 --- a/apps/control/src/app/ui/select-meeting-modal.component.ts +++ b/apps/control/src/app/ui/select-meeting-modal.component.ts @@ -1,9 +1,18 @@ +import { CommonModule } from '@angular/common'; import { Component, inject } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { MatRippleModule } from '@angular/material/core'; import { MatDialog, MatDialogRef } from '@angular/material/dialog'; -import { i18n, notifySuccess } from '@placeos/common'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { MatSelectModule } from '@angular/material/select'; +import { CalendarEvent, i18n, notifySuccess } from '@placeos/common'; +import { + IconComponent, + openConfirmModal, + TranslatePipe, +} from '@placeos/components'; import { format } from 'date-fns'; -import { openConfirmModal } from 'libs/components/src/lib/confirm-modal.component'; -import { CalendarEvent } from 'libs/events/src/lib/event.class'; import { ControlStateService } from '../control-state.service'; @Component({ @@ -87,7 +96,16 @@ import { ControlStateService } from '../control-state.service'; `, styles: [``], - standalone: false, + imports: [ + CommonModule, + TranslatePipe, + MatProgressSpinnerModule, + MatRippleModule, + MatFormFieldModule, + MatSelectModule, + FormsModule, + IconComponent, + ], }) export class SelectMeetingModalComponent { private _service = inject(ControlStateService); diff --git a/apps/control/src/app/ui/source-select-modal.component.ts b/apps/control/src/app/ui/source-select-modal.component.ts index d3a9e8fec0..25edb56c43 100644 --- a/apps/control/src/app/ui/source-select-modal.component.ts +++ b/apps/control/src/app/ui/source-select-modal.component.ts @@ -1,5 +1,12 @@ import { Component, inject } from '@angular/core'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { MatRippleModule } from '@angular/material/core'; +import { + MAT_DIALOG_DATA, + MatDialogModule, + MatDialogRef, +} from '@angular/material/dialog'; +import { IconComponent } from '@placeos/components'; +import { SourceSelectComponent } from './source-select.component'; export class SourceSelectModalData { output: string; @@ -35,7 +42,12 @@ export class SourceSelectModalData { `, - standalone: false, + imports: [ + MatDialogModule, + IconComponent, + MatRippleModule, + SourceSelectComponent, + ], }) export class SourceSelectModalComponent { private _data = inject(MAT_DIALOG_DATA); diff --git a/apps/control/src/app/ui/source-select.component.ts b/apps/control/src/app/ui/source-select.component.ts index 45b5c00a88..a599ff35a9 100644 --- a/apps/control/src/app/ui/source-select.component.ts +++ b/apps/control/src/app/ui/source-select.component.ts @@ -1,3 +1,4 @@ +import { CommonModule } from '@angular/common'; import { Component, OnChanges, @@ -6,7 +7,10 @@ import { input, output, } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { unique } from '@placeos/common'; +import { TranslatePipe } from '@placeos/components'; import { BehaviorSubject, combineLatest } from 'rxjs'; import { map } from 'rxjs/operators'; import { ControlStateService, RoomInput } from '../control-state.service'; @@ -84,7 +88,12 @@ import { ControlStateService, RoomInput } from '../control-state.service'; } `, - standalone: false, + imports: [ + CommonModule, + TranslatePipe, + MatProgressSpinnerModule, + MatRippleModule, + ], }) export class SourceSelectComponent implements OnChanges { private _state = inject(ControlStateService); diff --git a/apps/control/src/app/ui/ui.module.ts b/apps/control/src/app/ui/ui.module.ts deleted file mode 100644 index 406f4107da..0000000000 --- a/apps/control/src/app/ui/ui.module.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule, Type } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatRippleModule } from '@angular/material/core'; -import { RouterModule } from '@angular/router'; - -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatSliderModule } from '@angular/material/slider'; - -import { VideoCallDialViewComponent } from '../video-call/video-call-dial-view.component'; -import { CameraControlsComponent } from './camera-controls.component'; -import { CameraTooltipComponent } from './camera-tooltip.component'; -import { DialpadComponent } from './dialpad.component'; -import { DurationPipe } from './duration.pipe'; -import { HelpModalComponent } from './help-modal.component'; -import { HelpTooltipComponent } from './help-tooltip.component'; -import { JoinRoomTooltipComponent } from './join-room-tooltip.component'; -import { JoystickComponent } from './joystick.component'; -import { LightingSceneTooltipComponent } from './lighting-scene-tooltip.component'; -import { LightingTooltipComponent } from './lighting-tooltip.component'; -import { MarkdownPipe } from './markdown.pipe'; -import { MicrophoneTooltipComponent } from './microphone-tooltip.component'; -import { OutputDisplayComponent } from './output-display.component'; -import { PhoneDiallingTooltipComponent } from './phone-dialling-tooltip.component'; -import { PowerTooltipComponent } from './power-tooltip.component'; -import { RoomAccessoryTooltipComponent } from './room-accessory-tooltip.component'; -import { SelectMeetingModalComponent } from './select-meeting-modal.component'; -import { SourceSelectModalComponent } from './source-select-modal.component'; -import { SourceSelectComponent } from './source-select.component'; -import { VideoConferenceTooltipComponent } from './video-conf-tooltip.component'; -import { VoiceAssistantComponent } from './voice-assistant.component'; - -import { MatDialogModule } from '@angular/material/dialog'; -import { MatMenuModule } from '@angular/material/menu'; -import { MatSelectModule } from '@angular/material/select'; -import { AuthenticatedImageDirective } from 'libs/components/src/lib/authenticated-image.directive'; -import { BindingDirective } from 'libs/components/src/lib/binding.directive'; -import { CustomTooltipComponent } from 'libs/components/src/lib/custom-tooltip.component'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; -import { SafePipe } from 'libs/components/src/lib/safe.pipe'; -import { SanitizePipe } from 'libs/components/src/lib/sanitise.pipe'; -import { SettingsToggleComponent } from 'libs/components/src/lib/settings-toggle.component'; -import { TranslatePipe } from 'libs/components/src/lib/translate.pipe'; -import { LightingLevelsTooltipComponent } from './lighting-levels-tooltip.component'; - -const COMPONENTS: Type[] = [ - LightingTooltipComponent, - LightingLevelsTooltipComponent, - PowerTooltipComponent, - HelpTooltipComponent, - RoomAccessoryTooltipComponent, - CameraTooltipComponent, - MicrophoneTooltipComponent, - SourceSelectComponent, - SourceSelectModalComponent, - OutputDisplayComponent, - JoystickComponent, - SelectMeetingModalComponent, - VideoConferenceTooltipComponent, - DialpadComponent, - HelpModalComponent, - VideoCallDialViewComponent, - CameraControlsComponent, - PhoneDiallingTooltipComponent, - JoinRoomTooltipComponent, - LightingSceneTooltipComponent, - VoiceAssistantComponent, - - DurationPipe, - MarkdownPipe, -]; - -const MAT_MODULES: any[] = [ - MatFormFieldModule, - MatInputModule, - MatAutocompleteModule, - MatSliderModule, - MatRippleModule, - - MatMenuModule, - MatSelectModule, - MatDialogModule, -]; - -const STANDALONE_COMPONENTS: any[] = [ - AuthenticatedImageDirective, - TranslatePipe, - IconComponent, - BindingDirective, - SanitizePipe, - SafePipe, - CustomTooltipComponent, - SettingsToggleComponent, -]; - -@NgModule({ - declarations: [...COMPONENTS], - imports: [ - CommonModule, - FormsModule, - ReactiveFormsModule, - ...MAT_MODULES, - ...STANDALONE_COMPONENTS, - RouterModule.forChild([]), - ], - exports: [...COMPONENTS, ...MAT_MODULES], -}) -export class UIModule {} diff --git a/apps/control/src/app/ui/video-conf-tooltip.component.ts b/apps/control/src/app/ui/video-conf-tooltip.component.ts index d2cb653699..0553e61d43 100644 --- a/apps/control/src/app/ui/video-conf-tooltip.component.ts +++ b/apps/control/src/app/ui/video-conf-tooltip.component.ts @@ -1,6 +1,10 @@ import { Component, inject } from '@angular/core'; -import { CustomTooltipData } from 'libs/components/src/lib/custom-tooltip.component'; +import { CustomTooltipData, TranslatePipe } from '@placeos/components'; +import { CommonModule } from '@angular/common'; +import { MatRippleModule } from '@angular/material/core'; +import { RouterModule } from '@angular/router'; +import { VideoCallDialViewComponent } from '../video-call/video-call-dial-view.component'; import { VideoCallStateService } from '../video-call/video-call-state.service'; @Component({ @@ -42,7 +46,13 @@ import { VideoCallStateService } from '../video-call/video-call-state.service'; } `, styles: [``], - standalone: false, + imports: [ + CommonModule, + RouterModule, + TranslatePipe, + MatRippleModule, + VideoCallDialViewComponent, + ], }) export class VideoConferenceTooltipComponent { private _vc_state = inject(VideoCallStateService); diff --git a/apps/control/src/app/ui/voice-assistant.component.ts b/apps/control/src/app/ui/voice-assistant.component.ts index 432a69a870..f5091d01d4 100644 --- a/apps/control/src/app/ui/voice-assistant.component.ts +++ b/apps/control/src/app/ui/voice-assistant.component.ts @@ -1,4 +1,7 @@ +import { CommonModule } from '@angular/common'; import { Component, SimpleChanges, inject, input } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; +import { IconComponent } from '@placeos/components'; import { combineLatest } from 'rxjs'; import { map } from 'rxjs/operators'; import { VoiceAssistantService } from './voice-assistant.service'; @@ -57,7 +60,7 @@ import { VoiceAssistantService } from './voice-assistant.service'; } `, ], - standalone: false, + imports: [CommonModule, MatRippleModule, IconComponent], }) export class VoiceAssistantComponent { private _service = inject(VoiceAssistantService); diff --git a/apps/control/src/app/ui/voice-assistant.service.ts b/apps/control/src/app/ui/voice-assistant.service.ts index 3adf0d414f..23405f6c02 100644 --- a/apps/control/src/app/ui/voice-assistant.service.ts +++ b/apps/control/src/app/ui/voice-assistant.service.ts @@ -3,7 +3,7 @@ import { AsyncHandler, currentUser, log, randomInt } from '@placeos/common'; import { BehaviorSubject } from 'rxjs'; import { distinctUntilChanged, filter, map, shareReplay } from 'rxjs/operators'; -import { ChatService } from 'libs/components/src/lib/chat/chat.service'; +import { ChatService } from '@placeos/components'; const WAITING_PHRASES = ['One second...', 'One moment...', 'Working on it...']; const DEFAULT_START_PHRASES = [ diff --git a/apps/control/src/app/video-call/video-call-dial-view.component.ts b/apps/control/src/app/video-call/video-call-dial-view.component.ts index e1e02b46da..df070e1b20 100644 --- a/apps/control/src/app/video-call/video-call-dial-view.component.ts +++ b/apps/control/src/app/video-call/video-call-dial-view.component.ts @@ -1,8 +1,14 @@ import { Component, inject, input, output } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { ActivatedRoute, Router } from '@angular/router'; import { nextValueFrom } from '@placeos/common'; +import { IconComponent, TranslatePipe } from '@placeos/components'; import { getModule } from '@placeos/ts-client'; import { ControlStateService } from '../control-state.service'; +import { DialpadComponent } from '../ui/dialpad.component'; import { VideoCallStateService } from './video-call-state.service'; @Component({ @@ -77,7 +83,15 @@ import { VideoCallStateService } from './video-call-state.service'; `, styles: [``], - standalone: false, + imports: [ + MatFormFieldModule, + MatInputModule, + MatProgressSpinnerModule, + TranslatePipe, + IconComponent, + MatRippleModule, + DialpadComponent, + ], }) export class VideoCallDialViewComponent { private _control = inject(ControlStateService); diff --git a/apps/control/src/app/video-call/video-call-page.component.ts b/apps/control/src/app/video-call/video-call-page.component.ts index 127cfd2703..6c24b31fa7 100644 --- a/apps/control/src/app/video-call/video-call-page.component.ts +++ b/apps/control/src/app/video-call/video-call-page.component.ts @@ -1,4 +1,9 @@ +import { CommonModule } from '@angular/common'; import { Component, OnInit, inject, input } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { MatSelectModule } from '@angular/material/select'; import { Router } from '@angular/router'; import { AsyncHandler, @@ -6,6 +11,7 @@ import { nextValueFrom, notifyError, } from '@placeos/common'; +import { IconComponent, TranslatePipe } from '@placeos/components'; import { getModule } from '@placeos/ts-client'; import { filter } from 'rxjs/operators'; import { ControlStateService } from '../control-state.service'; @@ -216,7 +222,15 @@ import { VideoCallStateService } from './video-call-state.service'; } `, ], - standalone: false, + imports: [ + CommonModule, + MatProgressSpinnerModule, + TranslatePipe, + MatRippleModule, + IconComponent, + MatFormFieldModule, + MatSelectModule, + ], }) export class VideoCallPageComponent extends AsyncHandler implements OnInit { private _state = inject(VideoCallStateService); diff --git a/apps/control/src/app/video-call/video-call-state.service.ts b/apps/control/src/app/video-call/video-call-state.service.ts index b98cfca99a..c1ac2c029d 100644 --- a/apps/control/src/app/video-call/video-call-state.service.ts +++ b/apps/control/src/app/video-call/video-call-state.service.ts @@ -1,10 +1,6 @@ import { Injectable, inject } from '@angular/core'; import { AsyncHandler, nextValueFrom } from '@placeos/common'; import { getModule } from '@placeos/ts-client'; -import { - VideoCallDetails, - VideoLayout, -} from 'libs/mocks/src/lib/realtime/video-conference'; import { Observable } from 'rxjs'; import { distinctUntilChanged, @@ -14,6 +10,39 @@ import { } from 'rxjs/operators'; import { ControlStateService } from '../control-state.service'; +export type VideoLayout = 'Auto' | 'Equal' | 'Overlay' | 'Prominent' | 'Single'; +export type CallStatus = + | 'Idle' + | 'Dialling' + | 'Ringing' + | 'Connecting' + | 'Connected' + | 'Disconnecting' + | 'OnHold' + | 'EarlyMedia' + | 'Preserved' + | 'RemotePreserved'; + +export interface VideoCallDetails { + AnswerState: string; + CallType: string; + CallbackNumber: string; + DeviceType: string; + Direction: string; + DisplayName: number; + Duration: number; + 'Encryption/Type': string; + FacilityServiceId: number; + HoldReason: string; + PlacedOnHold: boolean; + Protocol: string; + ReceiveCallRate: number; + RemoteNumber: string; + Status: CallStatus; + TransmitCallRate: number; + Ice: string; +} + @Injectable({ providedIn: 'root', }) diff --git a/apps/control/src/app/video-call/video-call-view.component.ts b/apps/control/src/app/video-call/video-call-view.component.ts index 16bb957b57..e2702d5724 100644 --- a/apps/control/src/app/video-call/video-call-view.component.ts +++ b/apps/control/src/app/video-call/video-call-view.component.ts @@ -3,7 +3,13 @@ import { ActivatedRoute } from '@angular/router'; import { AsyncHandler } from '@placeos/common'; +import { CommonModule } from '@angular/common'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { TranslatePipe } from '@placeos/components'; import { ControlStateService } from '../control-state.service'; +import { ControlStatusBarComponent } from '../status-bar.component'; +import { TopbarHeaderComponent } from '../topbar-header.component'; +import { VideoCallPageComponent } from './video-call-page.component'; @Component({ selector: 'app-control-main-view', @@ -63,7 +69,14 @@ import { ControlStateService } from '../control-state.service'; } `, ], - standalone: false, + imports: [ + CommonModule, + TopbarHeaderComponent, + VideoCallPageComponent, + ControlStatusBarComponent, + MatProgressSpinnerModule, + TranslatePipe, + ], }) export class ControlVideoCallViewComponent extends AsyncHandler diff --git a/apps/control/src/test-setup.ts b/apps/control/src/test-setup.ts index 3ae9bf3e0f..44e371f64e 100644 --- a/apps/control/src/test-setup.ts +++ b/apps/control/src/test-setup.ts @@ -3,8 +3,8 @@ import { setupZoneTestEnv } from 'jest-preset-angular/setup-env/zone'; setupZoneTestEnv(); import { defineGlobalsInjections } from '@ngneat/spectator'; -import { setNotifyOutlet } from 'libs/common/src/lib/notifications'; -import { TranslatePipe } from 'libs/components/src/lib/translate.pipe'; +import { setNotifyOutlet } from '@placeos/common'; +import { TranslatePipe } from '@placeos/components'; import { MockPipe } from 'ng-mocks'; import { TextDecoder, TextEncoder } from 'util'; diff --git a/apps/control/src/tests/status-bar.component.spec.ts b/apps/control/src/tests/status-bar.component.spec.ts index 54b2d6ee1e..9446f01ccc 100644 --- a/apps/control/src/tests/status-bar.component.spec.ts +++ b/apps/control/src/tests/status-bar.component.spec.ts @@ -11,8 +11,7 @@ import { import { BehaviorSubject } from 'rxjs'; import { ControlStateService } from '../app/control-state.service'; -import { BindingDirective } from 'libs/components/src/lib/binding.directive'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; +import { BindingDirective, IconComponent } from '@placeos/components'; import { ControlStatusBarComponent } from '../app/status-bar.component'; import { DurationPipe } from '../app/ui/duration.pipe'; diff --git a/apps/control/src/tests/topbar-header.component.spec.ts b/apps/control/src/tests/topbar-header.component.spec.ts index 5ca4ac13e0..ae4613a1a5 100644 --- a/apps/control/src/tests/topbar-header.component.spec.ts +++ b/apps/control/src/tests/topbar-header.component.spec.ts @@ -5,9 +5,11 @@ import { MockComponent, MockDirective, MockProvider } from 'ng-mocks'; import { BehaviorSubject } from 'rxjs'; import { ControlStateService } from '../app/control-state.service'; -import { AuthenticatedImageDirective } from 'libs/components/src/lib/authenticated-image.directive'; -import { CustomTooltipComponent } from 'libs/components/src/lib/custom-tooltip.component'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; +import { + AuthenticatedImageDirective, + CustomTooltipComponent, + IconComponent, +} from '@placeos/components'; import { TopbarHeaderComponent } from '../app/topbar-header.component'; import { VideoCallStateService } from '../app/video-call/video-call-state.service'; diff --git a/apps/control/src/tests/ui/camera-tooltip.component.spec.ts b/apps/control/src/tests/ui/camera-tooltip.component.spec.ts index d367e520fd..7f12643d8e 100644 --- a/apps/control/src/tests/ui/camera-tooltip.component.spec.ts +++ b/apps/control/src/tests/ui/camera-tooltip.component.spec.ts @@ -17,10 +17,12 @@ jest.mock('@placeos/ts-client', () => { return { getModule: jest.fn(), PlaceZone: ZONE }; }); +import { + BindingDirective, + CustomTooltipData, + IconComponent, +} from '@placeos/components'; import * as client from '@placeos/ts-client'; -import { BindingDirective } from 'libs/components/src/lib/binding.directive'; -import { CustomTooltipData } from 'libs/components/src/lib/custom-tooltip.component'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; describe('CameraTooltipComponent', () => { let spectator: Spectator; diff --git a/apps/control/src/tests/ui/help-tooltip.component.spec.ts b/apps/control/src/tests/ui/help-tooltip.component.spec.ts index 24e26efedf..e925eebfb4 100644 --- a/apps/control/src/tests/ui/help-tooltip.component.spec.ts +++ b/apps/control/src/tests/ui/help-tooltip.component.spec.ts @@ -2,8 +2,7 @@ import { createComponentFactory, Spectator } from '@ngneat/spectator/jest'; import { BehaviorSubject } from 'rxjs'; import { ControlStateService } from '../../app/control-state.service'; -import { CustomTooltipData } from 'libs/components/src/lib/custom-tooltip.component'; -import { SanitizePipe } from 'libs/components/src/lib/sanitise.pipe'; +import { CustomTooltipData, SanitizePipe } from '@placeos/components'; import { MockPipe } from 'ng-mocks'; import { HelpTooltipComponent } from '../../app/ui/help-tooltip.component'; diff --git a/apps/control/src/tests/ui/joystick.component.spec.ts b/apps/control/src/tests/ui/joystick.component.spec.ts index 9a9760ee57..bcdace03e8 100644 --- a/apps/control/src/tests/ui/joystick.component.spec.ts +++ b/apps/control/src/tests/ui/joystick.component.spec.ts @@ -1,5 +1,5 @@ import { createComponentFactory, Spectator } from '@ngneat/spectator/jest'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; +import { IconComponent } from '@placeos/components'; import { MockComponent } from 'ng-mocks'; import { JoystickComponent, diff --git a/apps/control/src/tests/ui/lighting-tooltip.component.spec.ts b/apps/control/src/tests/ui/lighting-tooltip.component.spec.ts index 91d8593b87..4ccdfa04df 100644 --- a/apps/control/src/tests/ui/lighting-tooltip.component.spec.ts +++ b/apps/control/src/tests/ui/lighting-tooltip.component.spec.ts @@ -2,8 +2,7 @@ import { createComponentFactory, Spectator } from '@ngneat/spectator/jest'; import { MockDirective } from 'ng-mocks'; import { BehaviorSubject } from 'rxjs'; -import { BindingDirective } from 'libs/components/src/lib/binding.directive'; -import { CustomTooltipData } from 'libs/components/src/lib/custom-tooltip.component'; +import { BindingDirective, CustomTooltipData } from '@placeos/components'; import { ControlStateService } from '../../app/control-state.service'; import { LightingTooltipComponent } from '../../app/ui/lighting-tooltip.component'; diff --git a/apps/control/src/tests/ui/microphone-tooltip.component.spec.ts b/apps/control/src/tests/ui/microphone-tooltip.component.spec.ts index 9a245fd381..3747dd7a09 100644 --- a/apps/control/src/tests/ui/microphone-tooltip.component.spec.ts +++ b/apps/control/src/tests/ui/microphone-tooltip.component.spec.ts @@ -4,9 +4,11 @@ import { createComponentFactory, Spectator } from '@ngneat/spectator/jest'; import { MockComponent, MockDirective } from 'ng-mocks'; import { BehaviorSubject } from 'rxjs'; -import { BindingDirective } from 'libs/components/src/lib/binding.directive'; -import { CustomTooltipData } from 'libs/components/src/lib/custom-tooltip.component'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; +import { + BindingDirective, + CustomTooltipData, + IconComponent, +} from '@placeos/components'; import { ControlStateService } from '../../app/control-state.service'; import { MicrophoneTooltipComponent } from '../../app/ui/microphone-tooltip.component'; diff --git a/apps/control/src/tests/ui/output-display.component.spec.ts b/apps/control/src/tests/ui/output-display.component.spec.ts index 1aed1bce9a..6b46072276 100644 --- a/apps/control/src/tests/ui/output-display.component.spec.ts +++ b/apps/control/src/tests/ui/output-display.component.spec.ts @@ -4,8 +4,7 @@ import { createComponentFactory, Spectator } from '@ngneat/spectator/jest'; import { MockComponent, MockDirective } from 'ng-mocks'; import { BehaviorSubject } from 'rxjs'; -import { BindingDirective } from 'libs/components/src/lib/binding.directive'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; +import { BindingDirective, IconComponent } from '@placeos/components'; import { ControlStateService } from '../../app/control-state.service'; import { OutputDisplayComponent } from '../../app/ui/output-display.component'; diff --git a/apps/control/src/tests/ui/power-tooltip.component.spec.ts b/apps/control/src/tests/ui/power-tooltip.component.spec.ts index 33c63f9588..f9cdecda6a 100644 --- a/apps/control/src/tests/ui/power-tooltip.component.spec.ts +++ b/apps/control/src/tests/ui/power-tooltip.component.spec.ts @@ -1,8 +1,7 @@ import { createComponentFactory, Spectator } from '@ngneat/spectator/jest'; import { ControlStateService } from '../../app/control-state.service'; -import { CustomTooltipData } from 'libs/components/src/lib/custom-tooltip.component'; -import { SanitizePipe } from 'libs/components/src/lib/sanitise.pipe'; +import { CustomTooltipData, SanitizePipe } from '@placeos/components'; import { MockPipe, MockProvider } from 'ng-mocks'; import { PowerTooltipComponent } from '../../app/ui/power-tooltip.component'; diff --git a/apps/control/src/tests/ui/source-select-modal.component.spec.ts b/apps/control/src/tests/ui/source-select-modal.component.spec.ts index 6e0bc64348..ca9cab0881 100644 --- a/apps/control/src/tests/ui/source-select-modal.component.spec.ts +++ b/apps/control/src/tests/ui/source-select-modal.component.spec.ts @@ -1,6 +1,6 @@ import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { createComponentFactory, Spectator } from '@ngneat/spectator/jest'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; +import { IconComponent } from '@placeos/components'; import { MockComponent } from 'ng-mocks'; import { SourceSelectModalComponent } from '../../app/ui/source-select-modal.component'; diff --git a/apps/enrolment/src/app/app.component.ts b/apps/enrolment/src/app/app.component.ts index 4ffe9ef476..e4e870b8f0 100644 --- a/apps/enrolment/src/app/app.component.ts +++ b/apps/enrolment/src/app/app.component.ts @@ -9,22 +9,22 @@ import { initialiseUploadService, OpenStack, } from '@placeos/cloud-uploads'; -import { first } from 'rxjs/operators'; import { AsyncHandler, currentUser, + firstTruthyValueFrom, log, + OrganisationService, setAppName, setNotifyOutlet, SettingsService, setupCache, setupPlace, } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; -import { setInternalUserDomain } from 'libs/users/src/lib/user.utilities'; +import { setInternalUserDomain } from '@placeos/users'; -import { SpacesService } from 'libs/events/src/lib/spaces.service'; +import { SpacesService } from '@placeos/events'; import * as MOCKS from '@placeos/mocks'; import { PlaceAuthority, token } from '@placeos/ts-client'; @@ -74,7 +74,7 @@ export class AppComponent extends AsyncHandler implements OnInit { await fetch('/auth/authority') ).json(); /** Wait for settings to initialise */ - await this._settings.initialised.pipe(first((_) => _)).toPromise(); + await firstTruthyValueFrom(this._settings.initialised); setAppName(this._settings.get('app.short_name')); const settings = this._settings.get('composer') || {}; settings.mock = diff --git a/apps/enrolment/src/app/app.module.ts b/apps/enrolment/src/app/app.module.ts index 755f54fc7b..6e036af4b7 100644 --- a/apps/enrolment/src/app/app.module.ts +++ b/apps/enrolment/src/app/app.module.ts @@ -16,18 +16,8 @@ import { EnrolmentEventDetailsComponent } from './enrolment-event-details.compon import { EnrolmentGuestConfirmComponent } from './enrolment-guest-confirm.component'; import { EnrolmentComponent } from './enrolment.component'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { GlobalBannerComponent } from '@placeos/components'; import * as Sentry from '@sentry/angular'; -import { AuthenticatedImageDirective } from 'libs/components/src/lib/authenticated-image.directive'; -import { GlobalBannerComponent } from 'libs/components/src/lib/global-banner.component'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; -import { TranslatePipe } from 'libs/components/src/lib/translate.pipe'; const ROUTES: Route[] = [ { path: '', component: EnrolmentComponent }, @@ -37,34 +27,17 @@ const ROUTES: Route[] = [ const STANADALONE_COMPONENTS = [ GlobalBannerComponent, - IconComponent, - TranslatePipe, - AuthenticatedImageDirective, -]; - -const MAT_MODULES = [ - MatSnackBarModule, - MatCheckboxModule, - MatProgressSpinnerModule, - MatFormFieldModule, - MatInputModule, - MatSelectModule, + EnrolmentComponent, + EnrolmentEventDetailsComponent, + EnrolmentGuestConfirmComponent, + EnrolmentErrorComponent, ]; @NgModule({ - declarations: [ - AppComponent, - EnrolmentComponent, - EnrolmentEventDetailsComponent, - EnrolmentGuestConfirmComponent, - EnrolmentErrorComponent, - ], + declarations: [AppComponent], imports: [ BrowserModule, BrowserAnimationsModule, - FormsModule, - ReactiveFormsModule, - ...MAT_MODULES, ...STANADALONE_COMPONENTS, RouterModule.forRoot(ROUTES, { initialNavigation: 'enabledBlocking', diff --git a/apps/enrolment/src/app/enrolment-error.component.ts b/apps/enrolment/src/app/enrolment-error.component.ts index 7b6d2a2606..4e4b21cfbc 100644 --- a/apps/enrolment/src/app/enrolment-error.component.ts +++ b/apps/enrolment/src/app/enrolment-error.component.ts @@ -1,3 +1,4 @@ +import { CommonModule } from '@angular/common'; import { Component, inject } from '@angular/core'; import { EnrolmentStateService } from './enrolment-state.service'; @@ -37,7 +38,7 @@ import { EnrolmentStateService } from './enrolment-state.service'; `, styles: [``], - standalone: false, + imports: [CommonModule], }) export class EnrolmentErrorComponent { private _state = inject(EnrolmentStateService); diff --git a/apps/enrolment/src/app/enrolment-event-details.component.ts b/apps/enrolment/src/app/enrolment-event-details.component.ts index f1047f6925..4cf17617f8 100644 --- a/apps/enrolment/src/app/enrolment-event-details.component.ts +++ b/apps/enrolment/src/app/enrolment-event-details.component.ts @@ -1,3 +1,4 @@ +import { CommonModule } from '@angular/common'; import { Component, inject } from '@angular/core'; import { EnrolmentStateService } from './enrolment-state.service'; @@ -26,7 +27,7 @@ import { EnrolmentStateService } from './enrolment-state.service'; `, styles: [``], - standalone: false, + imports: [CommonModule], }) export class EnrolmentEventDetailsComponent { private _state = inject(EnrolmentStateService); diff --git a/apps/enrolment/src/app/enrolment-guest-confirm.component.ts b/apps/enrolment/src/app/enrolment-guest-confirm.component.ts index a279169a03..81124e3a0a 100644 --- a/apps/enrolment/src/app/enrolment-guest-confirm.component.ts +++ b/apps/enrolment/src/app/enrolment-guest-confirm.component.ts @@ -1,5 +1,14 @@ import { Component, inject } from '@angular/core'; +import { ReactiveFormsModule } from '@angular/forms'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; import { SettingsService } from '@placeos/common'; +import { TranslatePipe } from '@placeos/components'; +import { + UploadFileFieldComponent, + UploadListFieldComponent, +} from '@placeos/form-fields'; import { EnrolmentStateService } from './enrolment-state.service'; @Component({ @@ -84,7 +93,15 @@ import { EnrolmentStateService } from './enrolment-state.service'; `, styles: [``], - standalone: false, + imports: [ + ReactiveFormsModule, + TranslatePipe, + MatCheckboxModule, + UploadFileFieldComponent, + UploadListFieldComponent, + MatFormFieldModule, + MatInputModule, + ], }) export class EnrolmentGuestConfirmComponent { private _state = inject(EnrolmentStateService); diff --git a/apps/enrolment/src/app/enrolment-state.service.ts b/apps/enrolment/src/app/enrolment-state.service.ts index d51fe535fe..d7bc5fd7be 100644 --- a/apps/enrolment/src/app/enrolment-state.service.ts +++ b/apps/enrolment/src/app/enrolment-state.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { FormControl, FormGroup, Validators } from '@angular/forms'; -import { nextValueFrom } from '@placeos/common'; -import { CalendarEvent, checkinEventGuest, showEvent } from '@placeos/events'; +import { CalendarEvent, nextValueFrom } from '@placeos/common'; +import { checkinEventGuest, showEvent } from '@placeos/events'; import { setToken } from '@placeos/ts-client'; import { showGuest, updateGuest } from '@placeos/users'; import { getUnixTime } from 'date-fns'; diff --git a/apps/enrolment/src/app/enrolment.component.ts b/apps/enrolment/src/app/enrolment.component.ts index 5181ac30c7..6f338fdf62 100644 --- a/apps/enrolment/src/app/enrolment.component.ts +++ b/apps/enrolment/src/app/enrolment.component.ts @@ -1,8 +1,17 @@ +import { CommonModule } from '@angular/common'; import { Component, inject } from '@angular/core'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { ActivatedRoute } from '@angular/router'; -import { AsyncHandler, SettingsService } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { + AsyncHandler, + OrganisationService, + SettingsService, +} from '@placeos/common'; +import { AuthenticatedImageDirective } from '@placeos/components'; import { debounceTime, map } from 'rxjs/operators'; +import { EnrolmentErrorComponent } from './enrolment-error.component'; +import { EnrolmentEventDetailsComponent } from './enrolment-event-details.component'; +import { EnrolmentGuestConfirmComponent } from './enrolment-guest-confirm.component'; import { EnrolmentStateService } from './enrolment-state.service'; @Component({ @@ -63,7 +72,14 @@ import { EnrolmentStateService } from './enrolment-state.service'; `, styles: [``], - standalone: false, + imports: [ + CommonModule, + MatProgressSpinnerModule, + EnrolmentErrorComponent, + EnrolmentGuestConfirmComponent, + EnrolmentEventDetailsComponent, + AuthenticatedImageDirective, + ], }) export class EnrolmentComponent extends AsyncHandler { private _state = inject(EnrolmentStateService); diff --git a/apps/enrolment/src/test-setup.ts b/apps/enrolment/src/test-setup.ts index 187166509a..9ef5be314d 100644 --- a/apps/enrolment/src/test-setup.ts +++ b/apps/enrolment/src/test-setup.ts @@ -1,6 +1,6 @@ import { defineGlobalsInjections } from '@ngneat/spectator'; +import { TranslatePipe } from '@placeos/components'; import { setupZoneTestEnv } from 'jest-preset-angular/setup-env/zone'; -import { TranslatePipe } from 'libs/components/src/lib/translate.pipe'; import { MockPipe } from 'ng-mocks'; setupZoneTestEnv(); diff --git a/apps/map-kiosk/src/app/accessibility-controls.component.ts b/apps/map-kiosk/src/app/accessibility-controls.component.ts index 7a31de4c42..f474afb33c 100644 --- a/apps/map-kiosk/src/app/accessibility-controls.component.ts +++ b/apps/map-kiosk/src/app/accessibility-controls.component.ts @@ -1,4 +1,6 @@ import { Component, inject } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; +import { MatSlideToggleModule } from '@angular/material/slide-toggle'; import { AsyncHandler, SettingsService } from '@placeos/common'; @Component({ @@ -52,7 +54,7 @@ import { AsyncHandler, SettingsService } from '@placeos/common'; --> `, styles: [``], - standalone: false, + imports: [MatRippleModule, MatSlideToggleModule], }) export class AccessibilityControlsComponent extends AsyncHandler { private _settings = inject(SettingsService); diff --git a/apps/map-kiosk/src/app/app-routing.module.ts b/apps/map-kiosk/src/app/app-routing.module.ts index 847509e163..fb1cfbe24c 100644 --- a/apps/map-kiosk/src/app/app-routing.module.ts +++ b/apps/map-kiosk/src/app/app-routing.module.ts @@ -1,6 +1,6 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { UnauthorisedComponent } from 'libs/components/src/lib/unauthorised.component'; +import { UnauthorisedComponent } from '@placeos/components'; import { BootstrapComponent } from './bootstrap.component'; import { DeskBookingComponent } from './desk-booking.component'; import { ExploreComponent } from './explore.component'; diff --git a/apps/map-kiosk/src/app/app.component.ts b/apps/map-kiosk/src/app/app.component.ts new file mode 100644 index 0000000000..a49e31cfa9 --- /dev/null +++ b/apps/map-kiosk/src/app/app.component.ts @@ -0,0 +1,41 @@ +import { Component, inject, OnInit } from '@angular/core'; +import { PlaceOS_Service, setMocks } from '@placeos/common'; +import { mocksInit } from '@placeos/mocks'; + +@Component({ + selector: 'app-root', + template: ` + +
+ +
+ @if (has_chat) { + + } + + + `, + styles: [ + ` + :host { + display: flex; + flex-direction: column; + height: 100%; + width: 100%; + } + `, + ], + standalone: false, +}) +export class AppComponent implements OnInit { + private _placeos = inject(PlaceOS_Service); + + public get has_chat(): boolean { + return this._placeos.has_chat; + } + + public ngOnInit(): void { + setMocks(mocksInit); + this._placeos.init(); + } +} diff --git a/apps/map-kiosk/src/app/app.module.ts b/apps/map-kiosk/src/app/app.module.ts index 592bf70a75..d1854a8000 100644 --- a/apps/map-kiosk/src/app/app.module.ts +++ b/apps/map-kiosk/src/app/app.module.ts @@ -3,23 +3,13 @@ import { NgModule, provideZonelessChangeDetection, } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { BrowserModule } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { Router } from '@angular/router'; import { ServiceWorkerModule } from '@angular/service-worker'; -import { MatRippleModule } from '@angular/material/core'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; - -import { SharedExploreModule } from 'libs/explore/src/lib/explore.module'; - -import { MatSlideToggleModule } from '@angular/material/slide-toggle'; import * as Sentry from '@sentry/angular'; -import { AppComponent } from 'libs/components/src/lib/app.component'; import { environment } from '../environments/environment'; import { AccessibilityControlsComponent } from './accessibility-controls.component'; import { AppRoutingModule } from './app-routing.module'; @@ -30,63 +20,32 @@ import { ExploreMapStackComponent } from './explore-map-stack.component'; import { ExploreComponent } from './explore.component'; import { FooterMenuComponent } from './footer-menu.component'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatMenuModule } from '@angular/material/menu'; -import { MatSelectModule } from '@angular/material/select'; -import { AuthenticatedImageDirective } from 'libs/components/src/lib/authenticated-image.directive'; -import { CustomTooltipComponent } from 'libs/components/src/lib/custom-tooltip.component'; -import { GlobalBannerComponent } from 'libs/components/src/lib/global-banner.component'; -import { GlobalLoadingComponent } from 'libs/components/src/lib/global-loading.component'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; -import { InteractiveMapComponent } from 'libs/components/src/lib/interactive-map.component'; -import { SettingsToggleComponent } from 'libs/components/src/lib/settings-toggle.component'; -import { TranslatePipe } from 'libs/components/src/lib/translate.pipe'; -import { VirtualKeyboardComponent } from 'libs/components/src/lib/virtual-keyboard.component'; +import { + GlobalBannerComponent, + GlobalLoadingComponent, +} from '@placeos/components'; +import { AppComponent } from './app.component'; import { ParkingComponent } from './parking.component'; -const MAT_MODULES = [ - MatSnackBarModule, - MatDialogModule, - MatProgressSpinnerModule, - MatRippleModule, - MatSlideToggleModule, - MatSelectModule, - MatFormFieldModule, - MatMenuModule, -]; - const STANDALONE_COMPONENTS = [ - AuthenticatedImageDirective, GlobalBannerComponent, GlobalLoadingComponent, - IconComponent, - TranslatePipe, - InteractiveMapComponent, - CustomTooltipComponent, - VirtualKeyboardComponent, - SettingsToggleComponent, + BootstrapComponent, + ExploreComponent, + ExploreLevelSelectComponent, + ExploreMapStackComponent, + DeskBookingComponent, + FooterMenuComponent, + AccessibilityControlsComponent, + ParkingComponent, ]; @NgModule({ - declarations: [ - AppComponent, - BootstrapComponent, - ExploreComponent, - ExploreLevelSelectComponent, - ExploreMapStackComponent, - DeskBookingComponent, - FooterMenuComponent, - AccessibilityControlsComponent, - ParkingComponent, - ], + declarations: [AppComponent], imports: [ BrowserModule, BrowserAnimationsModule, - FormsModule, - ReactiveFormsModule, AppRoutingModule, - SharedExploreModule, - ...MAT_MODULES, ...STANDALONE_COMPONENTS, ServiceWorkerModule.register('ngsw-worker.js', { enabled: environment.production, diff --git a/apps/map-kiosk/src/app/bootstrap.component.ts b/apps/map-kiosk/src/app/bootstrap.component.ts index cfaa245807..9dadcb3a7e 100644 --- a/apps/map-kiosk/src/app/bootstrap.component.ts +++ b/apps/map-kiosk/src/app/bootstrap.component.ts @@ -1,14 +1,24 @@ +import { CommonModule } from '@angular/common'; import { Component, OnInit, inject } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { MatRippleModule } from '@angular/material/core'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { MatSelectModule } from '@angular/material/select'; import { ActivatedRoute, Router } from '@angular/router'; -import { AsyncHandler, Identity } from '@placeos/common'; import { + AsyncHandler, Building, BuildingLevel, + Identity, OrganisationService, Region, -} from '@placeos/organisation'; -import { VirtualKeyboardComponent } from 'libs/components/src/lib/virtual-keyboard.component'; +} from '@placeos/common'; +import { + SettingsToggleComponent, + VirtualKeyboardComponent, +} from '@placeos/components'; import { first } from 'rxjs/operators'; @Component({ @@ -298,7 +308,15 @@ import { first } from 'rxjs/operators'; } `, ], - standalone: false, + imports: [ + MatRippleModule, + MatProgressSpinnerModule, + MatFormFieldModule, + MatSelectModule, + SettingsToggleComponent, + CommonModule, + FormsModule, + ], }) export class BootstrapComponent extends AsyncHandler implements OnInit { private _org = inject(OrganisationService); diff --git a/apps/map-kiosk/src/app/desk-booking.component.ts b/apps/map-kiosk/src/app/desk-booking.component.ts index 010214f177..bc39567950 100644 --- a/apps/map-kiosk/src/app/desk-booking.component.ts +++ b/apps/map-kiosk/src/app/desk-booking.component.ts @@ -2,6 +2,7 @@ import { Component, inject, OnInit } from '@angular/core'; import { Router } from '@angular/router'; import { AsyncHandler, current_user, SettingsService } from '@placeos/common'; import { first } from 'rxjs/operators'; +import { FooterMenuComponent } from './footer-menu.component'; @Component({ selector: '[desk-booking]', @@ -21,7 +22,7 @@ import { first } from 'rxjs/operators'; } `, ], - standalone: false, + imports: [FooterMenuComponent], }) export class DeskBookingComponent extends AsyncHandler implements OnInit { private _settings = inject(SettingsService); diff --git a/apps/map-kiosk/src/app/explore-level-select.component.ts b/apps/map-kiosk/src/app/explore-level-select.component.ts index ae31b9cd19..4dd6a619f6 100644 --- a/apps/map-kiosk/src/app/explore-level-select.component.ts +++ b/apps/map-kiosk/src/app/explore-level-select.component.ts @@ -1,7 +1,8 @@ +import { CommonModule } from '@angular/common'; import { Component, inject } from '@angular/core'; -import { nextValueFrom } from '@placeos/common'; +import { MatRippleModule } from '@angular/material/core'; +import { nextValueFrom, OrganisationService } from '@placeos/common'; import { ExploreStateService } from '@placeos/explore'; -import { OrganisationService } from '@placeos/organisation'; import { first } from 'rxjs/operators'; @Component({ @@ -37,7 +38,7 @@ import { first } from 'rxjs/operators'; } `, ], - standalone: false, + imports: [MatRippleModule, CommonModule], }) export class ExploreLevelSelectComponent { private _org = inject(OrganisationService); diff --git a/apps/map-kiosk/src/app/explore-map-stack.component.ts b/apps/map-kiosk/src/app/explore-map-stack.component.ts index 1a593f7027..0a7f305b98 100644 --- a/apps/map-kiosk/src/app/explore-map-stack.component.ts +++ b/apps/map-kiosk/src/app/explore-map-stack.component.ts @@ -1,11 +1,13 @@ +import { CommonModule } from '@angular/common'; import { Component, inject } from '@angular/core'; +import { OrganisationService } from '@placeos/common'; +import { InteractiveMapComponent } from '@placeos/components'; import { ExploreDesksService, ExploreSpacesService, ExploreStateService, ExploreZonesService, } from '@placeos/explore'; -import { OrganisationService } from '@placeos/organisation'; @Component({ selector: 'explore-map-stack', @@ -58,7 +60,7 @@ import { OrganisationService } from '@placeos/organisation'; } `, ], - standalone: false, + imports: [InteractiveMapComponent, CommonModule], }) export class ExploreMapStackComponent { private _orgs = inject(OrganisationService); diff --git a/apps/map-kiosk/src/app/explore.component.ts b/apps/map-kiosk/src/app/explore.component.ts index 0287bc67b2..c4564144ca 100644 --- a/apps/map-kiosk/src/app/explore.component.ts +++ b/apps/map-kiosk/src/app/explore.component.ts @@ -1,6 +1,9 @@ +import { CommonModule } from '@angular/common'; import { Component, HostListener, inject, OnInit } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; import { MatDialog } from '@angular/material/dialog'; -import { ActivatedRoute, Router } from '@angular/router'; +import { MatMenuModule } from '@angular/material/menu'; +import { ActivatedRoute, Router, RouterModule } from '@angular/router'; import { ANIMATION_SHOW_CONTRACT_EXPAND, AsyncHandler, @@ -9,9 +12,21 @@ import { MapsPeopleService, nextValueFrom, notifyError, + OrganisationService, SettingsService, unique, + User, } from '@placeos/common'; +import { + AuthenticatedImageDirective, + CustomTooltipComponent, + IconComponent, + InteractiveMapComponent, + MapPinComponent, + MapRadiusComponent, + VirtualKeyboardComponent, +} from '@placeos/components'; +import { SpacePipe, SpacesService } from '@placeos/events'; import { ExploreDesksService, ExploreParkingService, @@ -19,20 +34,13 @@ import { ExploreStateService, ExploreZonesService, } from '@placeos/explore'; -import { OrganisationService } from '@placeos/organisation'; import { Point } from '@placeos/svg-viewer'; import { getModule } from '@placeos/ts-client'; +import { MapLocation, showStaff } from '@placeos/users'; import { startOfMinute } from 'date-fns'; -import { MapPinComponent } from 'libs/components/src/lib/map-pin.component'; -import { MapRadiusComponent } from 'libs/components/src/lib/map-radius.component'; -import { VirtualKeyboardComponent } from 'libs/components/src/lib/virtual-keyboard.component'; -import { SpacePipe } from 'libs/events/src/lib/space.pipe'; -import { SpacesService } from 'libs/events/src/lib/spaces.service'; -import { MapLocation } from 'libs/users/src/lib/location.class'; -import { showStaff } from 'libs/users/src/lib/staff.fn'; -import { User } from 'libs/users/src/lib/user.class'; import { combineLatest } from 'rxjs'; import { first, map } from 'rxjs/operators'; +import { AccessibilityControlsComponent } from './accessibility-controls.component'; @Component({ selector: '[app-explore]', @@ -267,7 +275,17 @@ import { first, map } from 'rxjs/operators'; SpacePipe, ], animations: [ANIMATION_SHOW_CONTRACT_EXPAND], - standalone: false, + imports: [ + CommonModule, + AccessibilityControlsComponent, + MatRippleModule, + IconComponent, + InteractiveMapComponent, + AuthenticatedImageDirective, + CustomTooltipComponent, + RouterModule, + MatMenuModule, + ], }) export class ExploreComponent extends AsyncHandler implements OnInit { private _state = inject(ExploreStateService); @@ -286,9 +304,9 @@ export class ExploreComponent extends AsyncHandler implements OnInit { /** Number of seconds after a user action to reset the kiosk state */ public reset_delay = 180; - public show_levels: boolean = true; - public show_legend: boolean = false; - public show_accessibility: boolean = false; + public show_levels = true; + public show_legend = false; + public show_accessibility = false; public legend = [ { id: 'free', name: 'Space Available', color: '#43a047' }, { id: 'busy', name: 'Space In Use', color: '#e53935' }, diff --git a/apps/map-kiosk/src/app/footer-menu.component.ts b/apps/map-kiosk/src/app/footer-menu.component.ts index 10a49ef5dc..2bd8da813f 100644 --- a/apps/map-kiosk/src/app/footer-menu.component.ts +++ b/apps/map-kiosk/src/app/footer-menu.component.ts @@ -1,4 +1,7 @@ import { Component } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; +import { RouterModule } from '@angular/router'; +import { IconComponent } from '@placeos/components'; @Component({ selector: 'footer-menu', @@ -32,6 +35,6 @@ import { Component } from '@angular/core'; `, - standalone: false, + imports: [MatRippleModule, RouterModule, IconComponent], }) export class FooterMenuComponent {} diff --git a/apps/map-kiosk/src/app/parking.component.ts b/apps/map-kiosk/src/app/parking.component.ts index b4f52554e2..41c3bbdd91 100644 --- a/apps/map-kiosk/src/app/parking.component.ts +++ b/apps/map-kiosk/src/app/parking.component.ts @@ -6,14 +6,19 @@ import { AsyncHandler, firstTruthyValueFrom, log, + OrganisationService, SettingsService, } from '@placeos/common'; import { SpacesService } from '@placeos/events'; import { ExploreParkingService, ExploreStateService } from '@placeos/explore'; -import { OrganisationService } from '@placeos/organisation'; import { Point } from '@placeos/svg-viewer'; -import { VirtualKeyboardComponent } from 'libs/components/src/lib/virtual-keyboard.component'; +import { CommonModule } from '@angular/common'; +import { + IconComponent, + InteractiveMapComponent, + VirtualKeyboardComponent, +} from '@placeos/components'; import { combineLatest, map } from 'rxjs'; @Component({ @@ -63,7 +68,7 @@ import { combineLatest, map } from 'rxjs'; `, styles: [``], providers: [ExploreStateService, ExploreParkingService], - standalone: false, + imports: [CommonModule, InteractiveMapComponent, IconComponent], }) export class ParkingComponent extends AsyncHandler implements OnInit { private _explore = inject(ExploreStateService); diff --git a/apps/map-kiosk/src/test-setup.ts b/apps/map-kiosk/src/test-setup.ts index 3ae9bf3e0f..44e371f64e 100644 --- a/apps/map-kiosk/src/test-setup.ts +++ b/apps/map-kiosk/src/test-setup.ts @@ -3,8 +3,8 @@ import { setupZoneTestEnv } from 'jest-preset-angular/setup-env/zone'; setupZoneTestEnv(); import { defineGlobalsInjections } from '@ngneat/spectator'; -import { setNotifyOutlet } from 'libs/common/src/lib/notifications'; -import { TranslatePipe } from 'libs/components/src/lib/translate.pipe'; +import { setNotifyOutlet } from '@placeos/common'; +import { TranslatePipe } from '@placeos/components'; import { MockPipe } from 'ng-mocks'; import { TextDecoder, TextEncoder } from 'util'; diff --git a/apps/map-kiosk/src/tests/bootstrap.component.spec.ts b/apps/map-kiosk/src/tests/bootstrap.component.spec.ts index b4080234e9..4e72f5f52d 100644 --- a/apps/map-kiosk/src/tests/bootstrap.component.spec.ts +++ b/apps/map-kiosk/src/tests/bootstrap.component.spec.ts @@ -4,13 +4,13 @@ import { MatFormFieldModule } from '@angular/material/form-field'; import { MatSelectModule } from '@angular/material/select'; import { Router } from '@angular/router'; import { SpectatorRouting, createRoutingFactory } from '@ngneat/spectator/jest'; -import { nextValueFrom } from '@placeos/common'; import { Building, BuildingLevel, OrganisationService, Region, -} from '@placeos/organisation'; + nextValueFrom, +} from '@placeos/common'; import { MockProvider } from 'ng-mocks'; import { BehaviorSubject, of } from 'rxjs'; import { BootstrapComponent } from '../app/bootstrap.component'; diff --git a/apps/map-kiosk/src/tests/explore-level-select.component.spec.ts b/apps/map-kiosk/src/tests/explore-level-select.component.spec.ts index 2221da1f19..73b1866a56 100644 --- a/apps/map-kiosk/src/tests/explore-level-select.component.spec.ts +++ b/apps/map-kiosk/src/tests/explore-level-select.component.spec.ts @@ -1,8 +1,8 @@ import { createComponentFactory, Spectator } from '@ngneat/spectator/jest'; import { of } from 'rxjs'; +import { OrganisationService } from '@placeos/common'; import { ExploreStateService } from '@placeos/explore'; -import { OrganisationService } from '@placeos/organisation'; import { ExploreLevelSelectComponent } from '../app/explore-level-select.component'; diff --git a/apps/map-kiosk/src/tests/explore.component.spec.ts b/apps/map-kiosk/src/tests/explore.component.spec.ts index a5ba9b663f..424f68e6f9 100644 --- a/apps/map-kiosk/src/tests/explore.component.spec.ts +++ b/apps/map-kiosk/src/tests/explore.component.spec.ts @@ -1,5 +1,10 @@ import { createRoutingFactory, SpectatorRouting } from '@ngneat/spectator/jest'; -import { SettingsService } from '@placeos/common'; +import { + Building, + OrganisationService, + Region, + SettingsService, +} from '@placeos/common'; import { ExploreDesksService, ExploreParkingService, @@ -9,7 +14,6 @@ import { ExploreZonesService, ExploreZoomControlComponent, } from '@placeos/explore'; -import { Building, OrganisationService, Region } from '@placeos/organisation'; import { MockComponent, MockModule, MockProvider } from 'ng-mocks'; import { BehaviorSubject, of } from 'rxjs'; @@ -17,11 +21,12 @@ import { FormsModule } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { MatMenuModule } from '@angular/material/menu'; import { MatSlideToggleModule } from '@angular/material/slide-toggle'; -import { SpacesService } from '@placeos/events'; -import { CustomTooltipComponent } from 'libs/components/src/lib/custom-tooltip.component'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; -import { InteractiveMapComponent } from 'libs/components/src/lib/interactive-map.component'; -import { SpacePipe } from 'libs/events/src/lib/space.pipe'; +import { + CustomTooltipComponent, + IconComponent, + InteractiveMapComponent, +} from '@placeos/components'; +import { SpacePipe, SpacesService } from '@placeos/events'; import { AccessibilityControlsComponent } from '../app/accessibility-controls.component'; import { ExploreLevelSelectComponent } from '../app/explore-level-select.component'; import { ExploreComponent } from '../app/explore.component'; diff --git a/apps/map-kiosk/src/tests/footer-menu.component.spec.ts b/apps/map-kiosk/src/tests/footer-menu.component.spec.ts index 7f2a368949..8e2f52ab73 100644 --- a/apps/map-kiosk/src/tests/footer-menu.component.spec.ts +++ b/apps/map-kiosk/src/tests/footer-menu.component.spec.ts @@ -1,5 +1,5 @@ import { createRoutingFactory, SpectatorRouting } from '@ngneat/spectator/jest'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; +import { IconComponent } from '@placeos/components'; import { MockComponent } from 'ng-mocks'; import { FooterMenuComponent } from '../app/footer-menu.component'; diff --git a/apps/outlook-addin/src/app/app-routing.module.ts b/apps/outlook-addin/src/app/app-routing.module.ts index 05948944de..38aa191ce9 100644 --- a/apps/outlook-addin/src/app/app-routing.module.ts +++ b/apps/outlook-addin/src/app/app-routing.module.ts @@ -1,8 +1,8 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { AuthorisedUserGuard } from 'libs/components/src/lib/authorised-user.guard'; +import { AuthorisedUserGuard } from '@placeos/components'; -import { UnauthorisedComponent } from 'libs/components/src/lib/unauthorised.component'; +import { UnauthorisedComponent } from '@placeos/components'; import { DeskBookingComponent } from './desks/desk-booking.component'; import { DeskBookingSuccessComponent } from './desks/desk-success.component'; import { MeetingBookingComponent } from './meetings/meeting-booking.component'; diff --git a/apps/outlook-addin/src/app/app.component.ts b/apps/outlook-addin/src/app/app.component.ts index 31930df3c1..295ff425ed 100644 --- a/apps/outlook-addin/src/app/app.component.ts +++ b/apps/outlook-addin/src/app/app.component.ts @@ -8,17 +8,18 @@ import { firstTruthyValueFrom, LocaleService, log, + OrganisationService, setAppName, + setDefaultCreator, setNotifyOutlet, SettingsService, setTranslationService, setupCache, setupPlace, + UploadsService, } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; import { invalidateToken, isMock, setToken, token } from '@placeos/ts-client'; -import { setDefaultCreator } from 'libs/events/src/lib/event.class'; -import { setInternalUserDomain } from 'libs/users/src/lib/user.utilities'; +import { setInternalUserDomain } from '@placeos/users'; import { first } from 'rxjs/operators'; declare let Office: any; @@ -39,6 +40,7 @@ export class AppComponent extends AsyncHandler implements OnInit { private _cache = inject(SwUpdate); private _snackbar = inject(MatSnackBar); private _locales = inject(LocaleService); + private _uploads = inject(UploadsService); title = 'outlook-addin'; @@ -84,6 +86,7 @@ export class AppComponent extends AsyncHandler implements OnInit { await this._authenticateGraphAPI(); } } + if (this._settings.get('app.has_uploads')) this._uploads.init(); } private async _initialiseAuth(local = true) { diff --git a/apps/outlook-addin/src/app/app.module.ts b/apps/outlook-addin/src/app/app.module.ts index 4086b3efa1..f75a30b5ff 100644 --- a/apps/outlook-addin/src/app/app.module.ts +++ b/apps/outlook-addin/src/app/app.module.ts @@ -3,14 +3,9 @@ import { withInterceptorsFromDi, } from '@angular/common/http'; import { NgModule, provideZonelessChangeDetection } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { BrowserModule } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; import { ServiceWorkerModule } from '@angular/service-worker'; import { environment } from '../environments/environment'; @@ -27,76 +22,38 @@ import { MeetingBookingSuccessComponent } from './meetings/meeting-success.compo import { NotFoundComponent } from './not-found.component'; import { BookModule } from './rooms/book.module'; -import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { + GlobalBannerComponent, + GlobalLoadingComponent, +} from '@placeos/components'; import { MeetingFlowConfirmComponent } from 'apps/workplace/src/app/book/meeting-flow/meeting-flow-confirm.component'; -import { AssetListFieldComponent } from 'libs/assets/src/lib/asset-list-field.component'; -import { DeskListFieldComponent } from 'libs/bookings/src/lib/desk-list-field.component'; -import { CateringListFieldComponent } from 'libs/catering/src/lib/catering-list-field.component'; -import { GlobalBannerComponent } from 'libs/components/src/lib/global-banner.component'; -import { GlobalLoadingComponent } from 'libs/components/src/lib/global-loading.component'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; -import { TranslatePipe } from 'libs/components/src/lib/translate.pipe'; -import { SpacePipe } from 'libs/events/src/lib/space.pipe'; -import { DateFieldComponent } from 'libs/form-fields/src/lib/date-field.component'; -import { DurationFieldComponent } from 'libs/form-fields/src/lib/duration-field.component'; -import { HostSelectFieldComponent } from 'libs/form-fields/src/lib/host-select-field.component'; -import { RichTextInputComponent } from 'libs/form-fields/src/lib/rich-text-input.component'; -import { SpaceListFieldComponent } from 'libs/form-fields/src/lib/space-list-field.component'; -import { TimeFieldComponent } from 'libs/form-fields/src/lib/time-field.component'; -import { UserListFieldComponent } from 'libs/form-fields/src/lib/user-list-field.component'; -import { UserSearchFieldComponent } from 'libs/form-fields/src/lib/user-search-field.component'; - -const MAT_MODULES = [ - MatSnackBarModule, - MatSelectModule, - MatFormFieldModule, - MatInputModule, - MatSelectModule, - MatCheckboxModule, -]; const STANDALONE_COMPONENTS = [ GlobalLoadingComponent, GlobalBannerComponent, - IconComponent, - TranslatePipe, - MeetingFlowConfirmComponent, - SpacePipe, - DateFieldComponent, - TimeFieldComponent, - DurationFieldComponent, - UserSearchFieldComponent, - UserListFieldComponent, - HostSelectFieldComponent, - SpaceListFieldComponent, - DeskListFieldComponent, - CateringListFieldComponent, - AssetListFieldComponent, - RichTextInputComponent, + NotFoundComponent, + + DeskBookingComponent, + DeskBookingFormComponent, + DeskBookingSuccessComponent, + + MeetingFlowConfirmComponent, + MeetingBookingComponent, + MeetingBookingFormComponent, + MeetingBookingSuccessComponent, ]; @NgModule({ - declarations: [ - AppComponent, - NotFoundComponent, - DeskBookingComponent, - DeskBookingFormComponent, - DeskBookingSuccessComponent, - MeetingBookingComponent, - MeetingBookingFormComponent, - MeetingBookingSuccessComponent, - ], + declarations: [AppComponent], bootstrap: [AppComponent], imports: [ BrowserModule, BrowserAnimationsModule, AppRoutingModule, - BrowserAnimationsModule, - FormsModule, - ReactiveFormsModule, BookModule, - ...MAT_MODULES, + MatSnackBarModule, ...STANDALONE_COMPONENTS, ServiceWorkerModule.register('ngsw-worker.js', { enabled: environment.production, @@ -104,7 +61,6 @@ const STANDALONE_COMPONENTS = [ ], providers: [ provideZonelessChangeDetection(), - SpacePipe, provideHttpClient(withInterceptorsFromDi()), ], }) diff --git a/apps/outlook-addin/src/app/desks/desk-booking.component.ts b/apps/outlook-addin/src/app/desks/desk-booking.component.ts index 4b5f60fdf7..0cff3e95ac 100644 --- a/apps/outlook-addin/src/app/desks/desk-booking.component.ts +++ b/apps/outlook-addin/src/app/desks/desk-booking.component.ts @@ -1,6 +1,8 @@ import { Component, inject } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; import { Router } from '@angular/router'; import { BookingFormService } from '@placeos/bookings'; +import { DeskBookingFormComponent } from './desk-form.component'; @Component({ selector: 'desk-booking', @@ -40,7 +42,7 @@ import { BookingFormService } from '@placeos/bookings'; `, styles: [``], - standalone: false, + imports: [DeskBookingFormComponent, MatRippleModule], }) export class DeskBookingComponent { private _service = inject(BookingFormService); diff --git a/apps/outlook-addin/src/app/desks/desk-form.component.ts b/apps/outlook-addin/src/app/desks/desk-form.component.ts index 341fb8f1ee..0509a62544 100644 --- a/apps/outlook-addin/src/app/desks/desk-form.component.ts +++ b/apps/outlook-addin/src/app/desks/desk-form.component.ts @@ -1,7 +1,16 @@ -import { Component, inject } from '@angular/core'; -import { BookingFormService } from '@placeos/bookings'; -import { AsyncHandler, SettingsService } from '@placeos/common'; -import { Desk } from '@placeos/organisation'; +import { Component, inject, OnInit } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { AssetListFieldComponent } from '@placeos/assets'; +import { BookingFormService, DeskListFieldComponent } from '@placeos/bookings'; +import { AsyncHandler, Desk, SettingsService } from '@placeos/common'; +import { + DateFieldComponent, + DurationFieldComponent, + TimeFieldComponent, +} from '@placeos/form-fields'; @Component({ selector: 'desk-booking-form', @@ -128,9 +137,20 @@ import { Desk } from '@placeos/organisation'; } `, styles: [``], - standalone: false, + imports: [ + AssetListFieldComponent, + DeskListFieldComponent, + MatCheckboxModule, + FormsModule, + ReactiveFormsModule, + DurationFieldComponent, + TimeFieldComponent, + DateFieldComponent, + MatFormFieldModule, + MatInputModule, + ], }) -export class DeskBookingFormComponent extends AsyncHandler { +export class DeskBookingFormComponent extends AsyncHandler implements OnInit { private _service = inject(BookingFormService); private _settings = inject(SettingsService); diff --git a/apps/outlook-addin/src/app/desks/desk-success.component.ts b/apps/outlook-addin/src/app/desks/desk-success.component.ts index 4ec859220b..d0856176a2 100644 --- a/apps/outlook-addin/src/app/desks/desk-success.component.ts +++ b/apps/outlook-addin/src/app/desks/desk-success.component.ts @@ -1,4 +1,7 @@ +import { CommonModule } from '@angular/common'; import { Component, inject } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; +import { RouterModule } from '@angular/router'; import { BookingFormService } from '@placeos/bookings'; @Component({ @@ -25,7 +28,7 @@ import { BookingFormService } from '@placeos/bookings'; Please allow up to 5 minutes for you booking to be approved.

} - + New Booking @@ -38,7 +41,7 @@ import { BookingFormService } from '@placeos/bookings'; } `, ], - standalone: false, + imports: [MatRippleModule, RouterModule, CommonModule], }) export class DeskBookingSuccessComponent { private _service = inject(BookingFormService); diff --git a/apps/outlook-addin/src/app/meetings/meeting-booking.component.ts b/apps/outlook-addin/src/app/meetings/meeting-booking.component.ts index f333d0045b..2cc804fbfc 100644 --- a/apps/outlook-addin/src/app/meetings/meeting-booking.component.ts +++ b/apps/outlook-addin/src/app/meetings/meeting-booking.component.ts @@ -3,10 +3,12 @@ import { MatBottomSheet, MatBottomSheetRef, } from '@angular/material/bottom-sheet'; +import { MatRippleModule } from '@angular/material/core'; import { Router } from '@angular/router'; import { currentUser, getInvalidFields, notifyError } from '@placeos/common'; import { EventFormService } from '@placeos/events'; import { MeetingFlowConfirmComponent } from 'apps/workplace/src/app/book/meeting-flow/meeting-flow-confirm.component'; +import { MeetingBookingFormComponent } from './meeting-form.component'; @Component({ selector: 'meeting-booking', @@ -22,7 +24,7 @@ import { MeetingFlowConfirmComponent } from 'apps/workplace/src/app/book/meeting
`, styles: [``], - standalone: false, + imports: [ + CommonModule, + MatRippleModule, + MatCheckboxModule, + FormsModule, + ReactiveFormsModule, + DateFieldComponent, + TimeFieldComponent, + DurationFieldComponent, + MatFormFieldModule, + MatSelectModule, + ], }) export class FilterSpaceComponent implements OnInit { data = inject<{ diff --git a/apps/outlook-addin/src/app/rooms/find-space-item.component.ts b/apps/outlook-addin/src/app/rooms/find-space-item.component.ts index 56e528e18b..8a1617b41e 100644 --- a/apps/outlook-addin/src/app/rooms/find-space-item.component.ts +++ b/apps/outlook-addin/src/app/rooms/find-space-item.component.ts @@ -1,20 +1,24 @@ import { Component, input, output } from '@angular/core'; -import { Space } from '@placeos/events'; +import { MatRippleModule } from '@angular/material/core'; +import { Space } from '@placeos/common'; +import { BuildingPipe, IconComponent, LevelPipe } from '@placeos/components'; @Component({ selector: 'find-space-item', template: ` + @let level = space()?.zones | level; + @let bld = space()?.zones | building; + `, - styles: [``], - standalone: false, + styles: [ + ` + :host { + padding: 0 0.5rem; + } + `, + ], + imports: [MatRippleModule, IconComponent, LevelPipe, BuildingPipe], }) export class FindSpaceItemComponent { public readonly space = input(undefined); diff --git a/apps/outlook-addin/src/app/rooms/find-space.component.ts b/apps/outlook-addin/src/app/rooms/find-space.component.ts index 122261585f..9d1ddc0b6b 100644 --- a/apps/outlook-addin/src/app/rooms/find-space.component.ts +++ b/apps/outlook-addin/src/app/rooms/find-space.component.ts @@ -1,20 +1,171 @@ -import { Component, OnInit, inject } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { Component, OnInit, inject, signal } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { MatBottomSheet } from '@angular/material/bottom-sheet'; +import { MatButtonToggleModule } from '@angular/material/button-toggle'; +import { MatRippleModule } from '@angular/material/core'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { MatSelectModule } from '@angular/material/select'; +import { MatTooltipModule } from '@angular/material/tooltip'; import { Router } from '@angular/router'; -import { AsyncHandler, HashMap, i18n, nextValueFrom } from '@placeos/common'; -import { EventFormService, Space, SpacesService } from '@placeos/events'; -import { OrganisationService } from '@placeos/organisation'; +import { + AsyncHandler, + HashMap, + OrganisationService, + Space, + i18n, + nextValueFrom, +} from '@placeos/common'; +import { + IconComponent, + InteractiveMapComponent, + TranslatePipe, +} from '@placeos/components'; +import { EventFormService, SpacesService } from '@placeos/events'; import { ViewAction, ViewerFeature, ViewerStyles } from '@placeos/svg-viewer'; import { BehaviorSubject, Observable, combineLatest, of } from 'rxjs'; import { filter, first, map, tap } from 'rxjs/operators'; import { FeaturesFilterService } from './features-filter.service'; import { FilterSpaceComponent } from './filter-space.component'; +import { FindSpaceItemComponent } from './find-space-item.component'; import { Locatable, MapService, MapsList } from './map.service'; import { RoomConfirmService } from './room-confirm.service'; @Component({ selector: 'find-space', template: ` +
+
+
+
+

Find Space

+ +
+
+ +
+ + +
+
+
+
+ @if (!(loading | async)) { + @if ((spaces$ | async)?.length > 0) { + @if (view() === 'list') { +
+ @for ( + space of spaces$ | async; + track space + ) { + + + } +
+ } @else { + + + + {{ 'COMMON.LEVEL_ALL' | translate }} + + @for ( + map of maps_list$ | async; + track map + ) { + {{ + map.level + }} + } + + + } + } @else { +
+
+

No spaces

+
+
+ } + } @else { +
+ +

{{ loading | async }}

+
+ } +
+
+
+
@@ -55,31 +206,37 @@ import { RoomConfirmService } from './room-confirm.service'; }
- -
- + +
@@ -117,7 +274,7 @@ import { RoomConfirmService } from './room-confirm.service';
@if (!(loading | async)) { @if ((spaces$ | async)?.length > 0) { - @if (space_view == 'listView') { + @if (view() == 'list') {
@for ( space of spaces$ | async; @@ -141,7 +298,7 @@ import { RoomConfirmService } from './room-confirm.service';
} @if ( - space_view == 'mapView' && + view() == 'map' && (map_features$ | async)?.length > 0 ) {
@@ -320,7 +477,21 @@ import { RoomConfirmService } from './room-confirm.service'; } `, ], - standalone: false, + imports: [ + CommonModule, + MatRippleModule, + MatProgressSpinnerModule, + InteractiveMapComponent, + MatFormFieldModule, + MatSelectModule, + FindSpaceItemComponent, + MatButtonToggleModule, + FormsModule, + ReactiveFormsModule, + IconComponent, + TranslatePipe, + MatTooltipModule, + ], }) export class FindSpaceComponent extends AsyncHandler implements OnInit { private _bottomSheet = inject(MatBottomSheet); @@ -339,7 +510,7 @@ export class FindSpaceComponent extends AsyncHandler implements OnInit { filtered_spaces: Space[] = []; show_room_details$: Observable = of(false); selected_space: Space; - space_view?: string; + public readonly view = signal<'list' | 'map'>('list'); locatable_spaces$: Observable; maps_list$: Observable; map_features$: Observable; @@ -393,7 +564,7 @@ export class FindSpaceComponent extends AsyncHandler implements OnInit { public readonly setOptions = (o) => this._state.setOptions(o); public async ngOnInit() { - this.space_view = 'listView'; + this.view.set('list'); this.selected_features$ = this._featuresFilterService.selected_features$; @@ -432,7 +603,7 @@ export class FindSpaceComponent extends AsyncHandler implements OnInit { this.map_actions$ = this._mapService.map_actions$; } - public handleBookEvent(space: Space, book: boolean = true) { + public handleBookEvent(space: Space, book = true) { this.book_space[space.id] = book; this._roomConfirmService.book_space = this.book_space; this._roomConfirmService.handleBookEvent(space, book); diff --git a/apps/outlook-addin/src/app/rooms/map.service.ts b/apps/outlook-addin/src/app/rooms/map.service.ts index 86c39ca7cd..24a11caad8 100644 --- a/apps/outlook-addin/src/app/rooms/map.service.ts +++ b/apps/outlook-addin/src/app/rooms/map.service.ts @@ -1,9 +1,12 @@ import { Injectable, inject } from '@angular/core'; import { MatBottomSheet } from '@angular/material/bottom-sheet'; -import { AsyncHandler, nextValueFrom } from '@placeos/common'; +import { + AsyncHandler, + BuildingLevel, + Space, + nextValueFrom, +} from '@placeos/common'; import { MapPinComponent } from '@placeos/components'; -import { Space } from '@placeos/events'; -import { BuildingLevel } from '@placeos/organisation'; import { ViewAction, ViewerFeature, ViewerStyles } from '@placeos/svg-viewer'; import { BehaviorSubject, Observable } from 'rxjs'; import { first, map } from 'rxjs/operators'; diff --git a/apps/outlook-addin/src/app/rooms/room-booking.component.ts b/apps/outlook-addin/src/app/rooms/room-booking.component.ts index fad2c2ecf4..d5a59d4dbe 100644 --- a/apps/outlook-addin/src/app/rooms/room-booking.component.ts +++ b/apps/outlook-addin/src/app/rooms/room-booking.component.ts @@ -1,7 +1,17 @@ import { Component, DOCUMENT, OnInit, inject } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatRippleModule } from '@angular/material/core'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; import { Router } from '@angular/router'; import { currentUser } from '@placeos/common'; import { EventFormService } from '@placeos/events'; +import { + DateFieldComponent, + DurationFieldComponent, + TimeFieldComponent, + UserListFieldComponent, +} from '@placeos/form-fields'; import { FeaturesFilterService } from './features-filter.service'; @Component({ @@ -121,7 +131,17 @@ import { FeaturesFilterService } from './features-filter.service';
`, styles: [``], - standalone: false, + imports: [ + MatRippleModule, + UserListFieldComponent, + DurationFieldComponent, + TimeFieldComponent, + DateFieldComponent, + MatFormFieldModule, + MatInputModule, + ReactiveFormsModule, + FormsModule, + ], }) export class RoomBookingComponent implements OnInit { private _document = inject(DOCUMENT); diff --git a/apps/outlook-addin/src/app/rooms/room-confirm.component.ts b/apps/outlook-addin/src/app/rooms/room-confirm.component.ts index 8907edabc6..dbb7670eb8 100644 --- a/apps/outlook-addin/src/app/rooms/room-confirm.component.ts +++ b/apps/outlook-addin/src/app/rooms/room-confirm.component.ts @@ -1,10 +1,13 @@ +import { CommonModule } from '@angular/common'; import { Component, OnInit, inject } from '@angular/core'; import { MAT_BOTTOM_SHEET_DATA, MatBottomSheetRef, } from '@angular/material/bottom-sheet'; -import { CalendarEvent, EventFormService, Space } from '@placeos/events'; -import { User } from '@placeos/users'; +import { MatRippleModule } from '@angular/material/core'; +import { CalendarEvent, Space, User } from '@placeos/common'; +import { IconComponent } from '@placeos/components'; +import { EventFormService } from '@placeos/events'; import { RoomConfirmService } from './room-confirm.service'; @Component({ @@ -138,7 +141,7 @@ import { RoomConfirmService } from './room-confirm.service';
`, styles: [``], - standalone: false, + imports: [CommonModule, MatRippleModule, IconComponent], }) export class RoomConfirmComponent implements OnInit { data = inject(MAT_BOTTOM_SHEET_DATA); diff --git a/apps/outlook-addin/src/app/rooms/room-confirm.service.ts b/apps/outlook-addin/src/app/rooms/room-confirm.service.ts index fe5e752833..0975ecdf69 100644 --- a/apps/outlook-addin/src/app/rooms/room-confirm.service.ts +++ b/apps/outlook-addin/src/app/rooms/room-confirm.service.ts @@ -1,9 +1,8 @@ import { Injectable, inject } from '@angular/core'; import { MatBottomSheet } from '@angular/material/bottom-sheet'; import { Router } from '@angular/router'; -import { HashMap } from '@placeos/common'; -import { EventFormService, Space, SpacesService } from '@placeos/events'; -import { SpacePipe } from 'libs/events/src/lib/space.pipe'; +import { HashMap, Space } from '@placeos/common'; +import { EventFormService, SpacePipe, SpacesService } from '@placeos/events'; import { BehaviorSubject, Observable } from 'rxjs'; import { RoomConfirmComponent } from './room-confirm.component'; import { RoomDetailsComponent } from './room-details.component'; @@ -16,7 +15,7 @@ export class RoomConfirmService { private router = inject(Router); private _state = inject(EventFormService); private _spaces = inject(SpacesService); - private _space_pipe = inject(SpacePipe); + private _space_pipe = new SpacePipe(); space: Space; public book_space: HashMap = {}; diff --git a/apps/outlook-addin/src/app/rooms/room-details.component.ts b/apps/outlook-addin/src/app/rooms/room-details.component.ts index 5cb7c6b7ee..0f0b87e9bc 100644 --- a/apps/outlook-addin/src/app/rooms/room-details.component.ts +++ b/apps/outlook-addin/src/app/rooms/room-details.component.ts @@ -3,7 +3,12 @@ import { MAT_BOTTOM_SHEET_DATA, MatBottomSheetRef, } from '@angular/material/bottom-sheet'; -import { Space } from '@placeos/events'; +import { MatRippleModule } from '@angular/material/core'; +import { Space } from '@placeos/common'; +import { + AuthenticatedImageDirective, + IconComponent, +} from '@placeos/components'; @Component({ selector: 'placeos-room-details', @@ -155,7 +160,7 @@ import { Space } from '@placeos/events'; `, styles: [``], - standalone: false, + imports: [MatRippleModule, IconComponent, AuthenticatedImageDirective], }) export class RoomDetailsComponent implements OnInit { data = inject(MAT_BOTTOM_SHEET_DATA); diff --git a/apps/outlook-addin/src/app/rooms/room-tile.component.ts b/apps/outlook-addin/src/app/rooms/room-tile.component.ts index 4a8c1c2403..25fcaf0cfe 100644 --- a/apps/outlook-addin/src/app/rooms/room-tile.component.ts +++ b/apps/outlook-addin/src/app/rooms/room-tile.component.ts @@ -3,7 +3,12 @@ import { MAT_BOTTOM_SHEET_DATA, MatBottomSheetRef, } from '@angular/material/bottom-sheet'; -import { Space } from '@placeos/events'; +import { MatRippleModule } from '@angular/material/core'; +import { Space } from '@placeos/common'; +import { + AuthenticatedImageDirective, + IconComponent, +} from '@placeos/components'; import { RoomConfirmService } from './room-confirm.service'; @Component({ @@ -82,7 +87,7 @@ import { RoomConfirmService } from './room-confirm.service'; `, styles: [``], - standalone: false, + imports: [MatRippleModule, IconComponent, AuthenticatedImageDirective], }) export class RoomTileComponent implements OnInit { data = inject(MAT_BOTTOM_SHEET_DATA); diff --git a/apps/outlook-addin/src/app/rooms/upcoming-bookings.component.ts b/apps/outlook-addin/src/app/rooms/upcoming-bookings.component.ts index 23e9a296b4..a73f6c5501 100644 --- a/apps/outlook-addin/src/app/rooms/upcoming-bookings.component.ts +++ b/apps/outlook-addin/src/app/rooms/upcoming-bookings.component.ts @@ -1,6 +1,10 @@ +import { CommonModule } from '@angular/common'; import { Component, OnInit, inject } from '@angular/core'; -import { AsyncHandler, currentUser } from '@placeos/common'; -import { CalendarEvent } from '@placeos/events'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { BookingCardComponent } from '@placeos/bookings'; +import { AsyncHandler, CalendarEvent, currentUser } from '@placeos/common'; +import { TranslatePipe } from '@placeos/components'; +import { EventCardComponent } from '@placeos/events'; import { ScheduleStateService } from 'apps/workplace/src/app/schedule/schedule-state.service'; import { startOfMinute } from 'date-fns'; @@ -58,7 +62,13 @@ import { startOfMinute } from 'date-fns'; `, styles: [``], - standalone: false, + imports: [ + CommonModule, + TranslatePipe, + MatProgressSpinnerModule, + EventCardComponent, + BookingCardComponent, + ], }) export class UpcomingBookingsComponent extends AsyncHandler implements OnInit { private _schedule = inject(ScheduleStateService); diff --git a/apps/outlook-addin/src/styles.css b/apps/outlook-addin/src/styles.css index 40281c170b..af729839b5 100644 --- a/apps/outlook-addin/src/styles.css +++ b/apps/outlook-addin/src/styles.css @@ -1,3 +1,5 @@ +@import 'suneditor/dist/css/suneditor.min.css'; + @tailwind base; @tailwind components; @tailwind utilities; diff --git a/apps/outlook-addin/src/test-setup.ts b/apps/outlook-addin/src/test-setup.ts index 3ae9bf3e0f..44e371f64e 100644 --- a/apps/outlook-addin/src/test-setup.ts +++ b/apps/outlook-addin/src/test-setup.ts @@ -3,8 +3,8 @@ import { setupZoneTestEnv } from 'jest-preset-angular/setup-env/zone'; setupZoneTestEnv(); import { defineGlobalsInjections } from '@ngneat/spectator'; -import { setNotifyOutlet } from 'libs/common/src/lib/notifications'; -import { TranslatePipe } from 'libs/components/src/lib/translate.pipe'; +import { setNotifyOutlet } from '@placeos/common'; +import { TranslatePipe } from '@placeos/components'; import { MockPipe } from 'ng-mocks'; import { TextDecoder, TextEncoder } from 'util'; diff --git a/apps/redirect/src/app/app.component.ts b/apps/redirect/src/app/app.component.ts index d2a9baf1cf..2006fd72ca 100644 --- a/apps/redirect/src/app/app.component.ts +++ b/apps/redirect/src/app/app.component.ts @@ -1,11 +1,10 @@ import { Component, inject, OnInit } from '@angular/core'; import { ActivatedRoute, RouterModule } from '@angular/router'; +import { SettingsService } from '@placeos/common'; import { authority, setAPI_Key } from '@placeos/ts-client'; -import { SettingsService } from 'libs/common/src/lib/settings.service'; import { first, lastValueFrom } from 'rxjs'; -import { setupPlace } from 'libs/common/src/lib/placeos'; -import { current_user, currentUser } from 'libs/common/src/lib/user-state'; +import { current_user, currentUser, setupPlace } from '@placeos/common'; @Component({ imports: [RouterModule], diff --git a/apps/signage/src/app/app-routing.module.ts b/apps/signage/src/app/app-routing.module.ts index dd3542aef1..9e804dfbc5 100644 --- a/apps/signage/src/app/app-routing.module.ts +++ b/apps/signage/src/app/app-routing.module.ts @@ -1,6 +1,6 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { UnauthorisedComponent } from 'libs/components/src/lib/unauthorised.component'; +import { UnauthorisedComponent } from '@placeos/components'; import { BootstrapComponent } from './bootstrap.component'; import { SignagePanelComponent } from './signage.component'; diff --git a/apps/signage/src/app/app.component.ts b/apps/signage/src/app/app.component.ts new file mode 100644 index 0000000000..3bd1602a38 --- /dev/null +++ b/apps/signage/src/app/app.component.ts @@ -0,0 +1,32 @@ +import { Component, inject, OnInit } from '@angular/core'; +import { PlaceOS_Service } from '@placeos/common'; + +@Component({ + selector: 'app-root', + template: ` + +
+ +
+ + + `, + styles: [ + ` + :host { + display: flex; + flex-direction: column; + height: 100%; + width: 100%; + } + `, + ], + standalone: false, +}) +export class AppComponent implements OnInit { + private _placeos = inject(PlaceOS_Service); + + public ngOnInit(): void { + this._placeos.init(); + } +} diff --git a/apps/signage/src/app/app.module.ts b/apps/signage/src/app/app.module.ts index 2f00ce9253..a2e25c0e8b 100644 --- a/apps/signage/src/app/app.module.ts +++ b/apps/signage/src/app/app.module.ts @@ -4,67 +4,39 @@ import { NgModule, provideZonelessChangeDetection, } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { BrowserModule } from '@angular/platform-browser'; import { Router } from '@angular/router'; import { ServiceWorkerModule } from '@angular/service-worker'; -import { MatRippleModule } from '@angular/material/core'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatProgressBarModule } from '@angular/material/progress-bar'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; - -import { AppComponent } from 'libs/components/src/lib/app.component'; import { environment } from '../environments/environment'; import { AppRoutingModule } from './app-routing.module'; import { BootstrapComponent } from './bootstrap.component'; -import { MatTooltipModule } from '@angular/material/tooltip'; import { LocaleService } from '@placeos/common'; +import { + GlobalBannerComponent, + GlobalLoadingComponent, +} from '@placeos/components'; import * as Sentry from '@sentry/angular'; -import { GlobalBannerComponent } from 'libs/components/src/lib/global-banner.component'; -import { GlobalLoadingComponent } from 'libs/components/src/lib/global-loading.component'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; -import { MediaDurationPipe } from 'libs/components/src/lib/media-duration.pipe'; -import { TranslatePipe } from 'libs/components/src/lib/translate.pipe'; -import { MediaControlsComponent } from './media-controls.component'; +import { AppComponent } from './app.component'; import { MediaPlayerComponent } from './media-player.component'; -import { PlaylistDisplayComponent } from './playlist-display.component'; import { SignagePanelComponent } from './signage.component'; -import { TimeControlsComponent } from './time-controls.component'; const STANDALONE_COMPONENTS = [ - MediaControlsComponent, - TimeControlsComponent, - PlaylistDisplayComponent, - - IconComponent, GlobalLoadingComponent, GlobalBannerComponent, - TranslatePipe, - MediaDurationPipe, + + BootstrapComponent, + SignagePanelComponent, + MediaPlayerComponent, ]; @NgModule({ - declarations: [ - AppComponent, - BootstrapComponent, - SignagePanelComponent, - MediaPlayerComponent, - ], + declarations: [AppComponent], imports: [ BrowserModule, - FormsModule, - ReactiveFormsModule, AppRoutingModule, - MatProgressSpinnerModule, - MatProgressBarModule, - MatRippleModule, - MatFormFieldModule, - MatSelectModule, - MatTooltipModule, ...STANDALONE_COMPONENTS, ServiceWorkerModule.register('ngsw-worker.js', { enabled: environment.production, diff --git a/apps/signage/src/app/bootstrap.component.ts b/apps/signage/src/app/bootstrap.component.ts index e973e79d89..ac0dea4204 100644 --- a/apps/signage/src/app/bootstrap.component.ts +++ b/apps/signage/src/app/bootstrap.component.ts @@ -1,4 +1,4 @@ -import { Component, inject, OnInit } from '@angular/core'; +import { Component, inject, OnInit, signal } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { @@ -6,8 +6,8 @@ import { firstTruthyValueFrom, i18n, Identity, + OrganisationService, } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; import { PlaceSystem, querySystems } from '@placeos/ts-client'; import { of } from 'rxjs'; import { @@ -18,7 +18,13 @@ import { switchMap, } from 'rxjs/operators'; -import { VirtualKeyboardComponent } from 'libs/components/src/lib/virtual-keyboard.component'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatRippleModule } from '@angular/material/core'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { MatSelectModule } from '@angular/material/select'; +import { TranslatePipe, VirtualKeyboardComponent } from '@placeos/components'; const STORE_PREFIX = 'PlaceOS.SIGNAGE'; const STORE_DISPLAY_KEY = `${STORE_PREFIX}.display`; @@ -37,7 +43,7 @@ const STORE_BUILDING_KEY = `${STORE_PREFIX}.building`; > {{ 'APP.SIGNAGE.BOOTSTRAP_TITLE' | translate }} - @if (!loading) { + @if (!loading()) {
+ `, + styles: [ + ` + :host { + display: flex; + flex-direction: column; + height: 100%; + width: 100%; + } + `, + ], + standalone: false, +}) +export class AppComponent implements OnInit { + private _placeos = inject(PlaceOS_Service); + + public get has_chat(): boolean { + return this._placeos.has_chat; + } + + public ngOnInit(): void { + this._placeos.init(); + } +} diff --git a/apps/stagehand/src/app/app.module.ts b/apps/stagehand/src/app/app.module.ts index 878a0ec986..6bf91bb6f5 100644 --- a/apps/stagehand/src/app/app.module.ts +++ b/apps/stagehand/src/app/app.module.ts @@ -3,43 +3,34 @@ import { NgModule, provideZonelessChangeDetection, } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { BrowserModule } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { Router } from '@angular/router'; import { ServiceWorkerModule } from '@angular/service-worker'; -import { MatMenuModule } from '@angular/material/menu'; import { MatSnackBarModule } from '@angular/material/snack-bar'; -import { MatTooltipModule } from '@angular/material/tooltip'; import * as Sentry from '@sentry/angular'; -import { AppComponent } from 'libs/components/src/lib/app.component'; import { environment } from '../environments/environment'; import { AlertsComponent } from './alerts.component'; import { AnalyticsComponent } from './analytics.component'; import { AppRoutingModule } from './app-routing.module'; +import { AppComponent } from './app.component'; import { RemoteSupportComponent } from './remote-support.component'; import { UiModule } from './ui/ui.module'; @NgModule({ - declarations: [ - AppComponent, - AlertsComponent, - RemoteSupportComponent, - AnalyticsComponent, - ], + declarations: [AppComponent], imports: [ BrowserModule, BrowserAnimationsModule, - FormsModule, - ReactiveFormsModule, AppRoutingModule, MatSnackBarModule, - MatTooltipModule, - MatMenuModule, UiModule, + AlertsComponent, + RemoteSupportComponent, + AnalyticsComponent, ServiceWorkerModule.register('ngsw-worker.js', { enabled: environment.production, }), diff --git a/apps/stagehand/src/app/dashboard.component.ts b/apps/stagehand/src/app/dashboard.component.ts index 2289c25b57..743e5f9bbd 100644 --- a/apps/stagehand/src/app/dashboard.component.ts +++ b/apps/stagehand/src/app/dashboard.component.ts @@ -1,4 +1,6 @@ import { Component } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; +import { SidebarComponent } from './ui/sidebar.component'; @Component({ selector: 'app-dashboard', @@ -17,6 +19,6 @@ import { Component } from '@angular/core'; `, styles: [], - standalone: false, + imports: [MatRippleModule, SidebarComponent], }) export class DashboardComponent {} diff --git a/apps/stagehand/src/app/remote-support.component.ts b/apps/stagehand/src/app/remote-support.component.ts index e6abb1ab9e..2c63eefbd6 100644 --- a/apps/stagehand/src/app/remote-support.component.ts +++ b/apps/stagehand/src/app/remote-support.component.ts @@ -1,8 +1,21 @@ +import { CommonModule } from '@angular/common'; import { Component, computed, inject } from '@angular/core'; -import { settingSignal } from 'libs/common/src/lib/settings.service'; +import { FormsModule } from '@angular/forms'; +import { MatRippleModule } from '@angular/material/core'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatSelectModule } from '@angular/material/select'; +import { settingSignal } from '@placeos/common'; +import { + BindingDirective, + IconComponent, + SimpleTableComponent, +} from '@placeos/components'; import { BehaviorSubject, combineLatest, map } from 'rxjs'; import { AlertsService } from './alerts.service'; import { SupportService } from './support.service'; +import { SidebarComponent } from './ui/sidebar.component'; function contains(str: string, substr: string) { return str.toLowerCase().includes(substr.toLowerCase()); @@ -341,7 +354,19 @@ function contains(str: string, substr: string) { `, styles: [``], - standalone: false, + imports: [ + CommonModule, + MatRippleModule, + MatMenuModule, + IconComponent, + BindingDirective, + SimpleTableComponent, + MatFormFieldModule, + MatSelectModule, + MatInputModule, + SidebarComponent, + FormsModule, + ], }) export class RemoteSupportComponent { private readonly _alerts = inject(AlertsService); diff --git a/apps/stagehand/src/app/support.service.ts b/apps/stagehand/src/app/support.service.ts index 272a54a891..83baf22ab1 100644 --- a/apps/stagehand/src/app/support.service.ts +++ b/apps/stagehand/src/app/support.service.ts @@ -1,5 +1,5 @@ import { Injectable, inject } from '@angular/core'; -import { OrganisationService } from '@placeos/organisation'; +import { OrganisationService } from '@placeos/common'; import { querySystems } from '@placeos/ts-client'; import { catchError, first, map, of, shareReplay, switchMap } from 'rxjs'; diff --git a/apps/stagehand/src/app/ui/sidebar.component.ts b/apps/stagehand/src/app/ui/sidebar.component.ts index 040a4b5597..aeeb4eaec3 100644 --- a/apps/stagehand/src/app/ui/sidebar.component.ts +++ b/apps/stagehand/src/app/ui/sidebar.component.ts @@ -1,4 +1,8 @@ import { Component } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { RouterModule } from '@angular/router'; +import { IconComponent } from '@placeos/components'; let compact_state = false; @@ -133,7 +137,7 @@ let compact_state = false; } `, ], - standalone: false, + imports: [IconComponent, RouterModule, MatRippleModule, MatTooltipModule], }) export class SidebarComponent { public get is_compact() { diff --git a/apps/stagehand/src/app/ui/ui.module.ts b/apps/stagehand/src/app/ui/ui.module.ts index c7650c3b20..410792ba03 100644 --- a/apps/stagehand/src/app/ui/ui.module.ts +++ b/apps/stagehand/src/app/ui/ui.module.ts @@ -1,59 +1,23 @@ import { NgModule } from '@angular/core'; -import { MatRippleModule } from '@angular/material/core'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatTooltipModule } from '@angular/material/tooltip'; - -import { CommonModule } from '@angular/common'; import { RouterModule } from '@angular/router'; -import { BindingDirective } from 'libs/components/src/lib/binding.directive'; -import { BuildingPipe } from 'libs/components/src/lib/building.pipe'; -import { GlobalBannerComponent } from 'libs/components/src/lib/global-banner.component'; -import { GlobalLoadingComponent } from 'libs/components/src/lib/global-loading.component'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; -import { LevelPipe } from 'libs/components/src/lib/level.pipe'; -import { SimpleTableComponent } from 'libs/components/src/lib/simple-table.component'; -import { TranslatePipe } from 'libs/components/src/lib/translate.pipe'; -import { DateRangeFieldComponent } from 'libs/form-fields/src/lib/date-range-field.component'; +import { + GlobalBannerComponent, + GlobalLoadingComponent, +} from '@placeos/components'; import { SidebarComponent } from './sidebar.component'; -const MATERIAL_MODULES = [ - MatRippleModule, - MatFormFieldModule, - MatInputModule, - MatSelectModule, - MatTooltipModule, - MatDialogModule, - MatProgressSpinnerModule, -]; - -const COMPONENTS = [SidebarComponent]; const STANDALONE_COMPONENTS = [ GlobalLoadingComponent, GlobalBannerComponent, - TranslatePipe, - IconComponent, - SimpleTableComponent, - DateRangeFieldComponent, - BindingDirective, - LevelPipe, - BuildingPipe, + SidebarComponent, ]; @NgModule({ - declarations: [...COMPONENTS], - imports: [ - CommonModule, - ...MATERIAL_MODULES, - ...STANDALONE_COMPONENTS, - RouterModule, - ], - exports: [...MATERIAL_MODULES, ...COMPONENTS, ...STANDALONE_COMPONENTS], + declarations: [], + imports: [...STANDALONE_COMPONENTS, RouterModule], + exports: [...STANDALONE_COMPONENTS], }) export class UiModule {} diff --git a/apps/stagehand/src/test-setup.ts b/apps/stagehand/src/test-setup.ts index cd4240eeaf..44c75cff3a 100644 --- a/apps/stagehand/src/test-setup.ts +++ b/apps/stagehand/src/test-setup.ts @@ -6,8 +6,8 @@ setupZoneTestEnv({ }); import { defineGlobalsInjections } from '@ngneat/spectator'; -import { setNotifyOutlet } from 'libs/common/src/lib/notifications'; -import { TranslatePipe } from 'libs/components/src/lib/translate.pipe'; +import { setNotifyOutlet } from '@placeos/common'; +import { TranslatePipe } from '@placeos/components'; import { MockPipe } from 'ng-mocks'; import { TextDecoder, TextEncoder } from 'util'; diff --git a/apps/survey/src/app/app.component.ts b/apps/survey/src/app/app.component.ts index 57ed0d33fa..22ce45b89a 100644 --- a/apps/survey/src/app/app.component.ts +++ b/apps/survey/src/app/app.component.ts @@ -10,6 +10,7 @@ import { LocaleService, log, notifySuccess, + OrganisationService, setAppName, setNotifyOutlet, SettingsService, @@ -17,10 +18,11 @@ import { setupCache, setupPlace, } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; -import { GlobalBannerComponent } from 'libs/components/src/lib/global-banner.component'; -import { GlobalLoadingComponent } from 'libs/components/src/lib/global-loading.component'; +import { + GlobalBannerComponent, + GlobalLoadingComponent, +} from '@placeos/components'; import { convertPairStringToMap, setAPI_Key } from '@placeos/ts-client'; // import * as Sentry from '@sentry/angular'; diff --git a/apps/survey/src/app/app.config.ts b/apps/survey/src/app/app.config.ts index b11fb7a59e..e9e727e1cd 100644 --- a/apps/survey/src/app/app.config.ts +++ b/apps/survey/src/app/app.config.ts @@ -7,7 +7,7 @@ import { import { provideRouter, Route, withHashLocation } from '@angular/router'; import { provideServiceWorker } from '@angular/service-worker'; -import { LocaleService } from 'libs/common/src/lib/locale.service'; +import { LocaleService } from '@placeos/common'; import { environment } from '../environments/environment'; import { NotFoundComponent } from './not-found.component'; import { SurveyComponent } from './survey.component'; diff --git a/apps/survey/src/app/not-found.component.ts b/apps/survey/src/app/not-found.component.ts index 434d35700a..2abd8e2ecf 100644 --- a/apps/survey/src/app/not-found.component.ts +++ b/apps/survey/src/app/not-found.component.ts @@ -1,5 +1,5 @@ import { Component } from '@angular/core'; -import { AuthenticatedImageDirective } from 'libs/components/src/lib/authenticated-image.directive'; +import { AuthenticatedImageDirective } from '@placeos/components'; @Component({ selector: 'app-not-found', diff --git a/apps/survey/src/app/survey.component.ts b/apps/survey/src/app/survey.component.ts index 0195d55a5f..d697800619 100644 --- a/apps/survey/src/app/survey.component.ts +++ b/apps/survey/src/app/survey.component.ts @@ -2,7 +2,7 @@ import { CommonModule } from '@angular/common'; import { Component, inject } from '@angular/core'; import { Router, RouterModule } from '@angular/router'; -import { SurveyOutletComponent } from 'libs/components/src/lib/survey-outlet.component'; +import { SurveyOutletComponent } from '@placeos/components'; @Component({ selector: 'app-survey', diff --git a/apps/timetable/src/app/app.component.ts b/apps/timetable/src/app/app.component.ts new file mode 100644 index 0000000000..1d0ab40e6a --- /dev/null +++ b/apps/timetable/src/app/app.component.ts @@ -0,0 +1,34 @@ +import { Component, inject, OnInit } from '@angular/core'; +import { PlaceOS_Service, setMocks } from '@placeos/common'; +import { mocksInit } from '@placeos/mocks'; + +@Component({ + selector: 'app-root', + template: ` + +
+ +
+ + + `, + styles: [ + ` + :host { + display: flex; + flex-direction: column; + height: 100%; + width: 100%; + } + `, + ], + standalone: false, +}) +export class AppComponent implements OnInit { + private _placeos = inject(PlaceOS_Service); + + public ngOnInit(): void { + setMocks(mocksInit); + this._placeos.init(); + } +} diff --git a/apps/timetable/src/app/app.module.ts b/apps/timetable/src/app/app.module.ts index 6006e003c9..5b7f522cf6 100644 --- a/apps/timetable/src/app/app.module.ts +++ b/apps/timetable/src/app/app.module.ts @@ -9,13 +9,10 @@ import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { Router, RouterModule } from '@angular/router'; import { ServiceWorkerModule } from '@angular/service-worker'; -import { AppComponent } from 'libs/components/src/lib/app.component'; -import { AuthenticatedImageDirective } from 'libs/components/src/lib/authenticated-image.directive'; -import { BindingDirective } from 'libs/components/src/lib/binding.directive'; -import { ChatComponent } from 'libs/components/src/lib/chat/chat.component'; -import { GlobalBannerComponent } from 'libs/components/src/lib/global-banner.component'; -import { GlobalLoadingComponent } from 'libs/components/src/lib/global-loading.component'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; +import { + GlobalBannerComponent, + GlobalLoadingComponent, +} from '@placeos/components'; import { environment } from '../environments/environment'; import { SpaceEventDetailsComponent } from './space-event-details.component'; @@ -23,27 +20,19 @@ import { SpaceTimetableComponent } from './space-timetable.component'; import { AppTimetableComponent } from './timetable.component'; import * as Sentry from '@sentry/angular'; +import { AppComponent } from './app.component'; -const STANDALONE_COMPONENTS = [ - BindingDirective, - AuthenticatedImageDirective, - GlobalLoadingComponent, - GlobalBannerComponent, - ChatComponent, - IconComponent, -]; +const STANDALONE_COMPONENTS = [GlobalLoadingComponent, GlobalBannerComponent]; @NgModule({ - declarations: [ - AppComponent, - AppTimetableComponent, - SpaceTimetableComponent, - SpaceEventDetailsComponent, - ], + declarations: [AppComponent], imports: [ BrowserModule, BrowserAnimationsModule, MatSnackBarModule, + AppTimetableComponent, + SpaceTimetableComponent, + SpaceEventDetailsComponent, ...STANDALONE_COMPONENTS, RouterModule.forRoot( [ diff --git a/apps/timetable/src/app/space-event-details.component.ts b/apps/timetable/src/app/space-event-details.component.ts index e1d9493fb1..557dc07267 100644 --- a/apps/timetable/src/app/space-event-details.component.ts +++ b/apps/timetable/src/app/space-event-details.component.ts @@ -1,5 +1,6 @@ +import { CommonModule } from '@angular/common'; import { Component, computed, input } from '@angular/core'; -import { CalendarEvent } from '@placeos/events'; +import { CalendarEvent } from '@placeos/common'; import { getHours, getMinutes } from 'date-fns'; @Component({ @@ -27,7 +28,7 @@ import { getHours, getMinutes } from 'date-fns'; } `, styles: [``], - standalone: false, + imports: [CommonModule], }) export class SpaceEventDetailsComponent { public readonly event = input(null); diff --git a/apps/timetable/src/app/space-timetable.component.ts b/apps/timetable/src/app/space-timetable.component.ts index 35979f09ac..58946d458c 100644 --- a/apps/timetable/src/app/space-timetable.component.ts +++ b/apps/timetable/src/app/space-timetable.component.ts @@ -1,6 +1,7 @@ import { Component, input, signal } from '@angular/core'; -import { AsyncHandler } from '@placeos/common'; -import { Space } from '@placeos/events'; +import { AsyncHandler, Space } from '@placeos/common'; +import { BindingDirective } from '@placeos/components'; +import { SpaceEventDetailsComponent } from './space-event-details.component'; @Component({ selector: 'space-timetable', @@ -43,7 +44,7 @@ import { Space } from '@placeos/events'; } `, ], - standalone: false, + imports: [BindingDirective, SpaceEventDetailsComponent], }) export class SpaceTimetableComponent extends AsyncHandler { public readonly space = input(null); diff --git a/apps/timetable/src/app/timetable.component.ts b/apps/timetable/src/app/timetable.component.ts index 2298b0a60b..b1ea6a60f9 100644 --- a/apps/timetable/src/app/timetable.component.ts +++ b/apps/timetable/src/app/timetable.component.ts @@ -1,14 +1,21 @@ +import { CommonModule } from '@angular/common'; import { Component, computed, inject, OnInit, signal } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { AsyncHandler, firstTruthyValueFrom, + OrganisationService, SettingsService, + Space, } from '@placeos/common'; -import { Space, SpacesService } from '@placeos/events'; -import { OrganisationService } from '@placeos/organisation'; +import { + AuthenticatedImageDirective, + IconComponent, +} from '@placeos/components'; +import { SpacesService } from '@placeos/events'; import { getHours, getMinutes, startOfSecond } from 'date-fns'; import { debounceTime, map } from 'rxjs/operators'; +import { SpaceTimetableComponent } from './space-timetable.component'; @Component({ selector: 'app-timetable', @@ -112,7 +119,12 @@ import { debounceTime, map } from 'rxjs/operators'; } `, ], - standalone: false, + imports: [ + CommonModule, + AuthenticatedImageDirective, + SpaceTimetableComponent, + IconComponent, + ], }) export class AppTimetableComponent extends AsyncHandler implements OnInit { private _settings = inject(SettingsService); diff --git a/apps/timetable/src/test-setup.ts b/apps/timetable/src/test-setup.ts index 1cb8ef8576..2a12e2aa5f 100644 --- a/apps/timetable/src/test-setup.ts +++ b/apps/timetable/src/test-setup.ts @@ -1,7 +1,7 @@ import { defineGlobalsInjections } from '@ngneat/spectator'; +import { setNotifyOutlet } from '@placeos/common'; +import { TranslatePipe } from '@placeos/components'; import { setupZoneTestEnv } from 'jest-preset-angular/setup-env/zone'; -import { setNotifyOutlet } from 'libs/common/src/lib/notifications'; -import { TranslatePipe } from 'libs/components/src/lib/translate.pipe'; import { MockPipe } from 'ng-mocks'; import { TextDecoder, TextEncoder } from 'util'; diff --git a/apps/timetable/src/tests/timetable.component.spec.ts b/apps/timetable/src/tests/timetable.component.spec.ts index 37742913a5..a08a58863e 100644 --- a/apps/timetable/src/tests/timetable.component.spec.ts +++ b/apps/timetable/src/tests/timetable.component.spec.ts @@ -4,7 +4,7 @@ import { SpacesService } from '@placeos/events'; import { MockComponent, MockDirective, MockProvider } from 'ng-mocks'; import { of } from 'rxjs'; -import { AuthenticatedImageDirective } from 'libs/components/src/lib/authenticated-image.directive'; +import { AuthenticatedImageDirective } from '@placeos/components'; import { SpaceTimetableComponent } from '../app/space-timetable.component'; import { AppTimetableComponent } from '../app/timetable.component'; diff --git a/apps/visitor-kiosk/src/app/app.component.ts b/apps/visitor-kiosk/src/app/app.component.ts new file mode 100644 index 0000000000..a49e31cfa9 --- /dev/null +++ b/apps/visitor-kiosk/src/app/app.component.ts @@ -0,0 +1,41 @@ +import { Component, inject, OnInit } from '@angular/core'; +import { PlaceOS_Service, setMocks } from '@placeos/common'; +import { mocksInit } from '@placeos/mocks'; + +@Component({ + selector: 'app-root', + template: ` + +
+ +
+ @if (has_chat) { + + } + + + `, + styles: [ + ` + :host { + display: flex; + flex-direction: column; + height: 100%; + width: 100%; + } + `, + ], + standalone: false, +}) +export class AppComponent implements OnInit { + private _placeos = inject(PlaceOS_Service); + + public get has_chat(): boolean { + return this._placeos.has_chat; + } + + public ngOnInit(): void { + setMocks(mocksInit); + this._placeos.init(); + } +} diff --git a/apps/visitor-kiosk/src/app/app.module.ts b/apps/visitor-kiosk/src/app/app.module.ts index 1038bd5d6b..3681087d51 100644 --- a/apps/visitor-kiosk/src/app/app.module.ts +++ b/apps/visitor-kiosk/src/app/app.module.ts @@ -4,18 +4,11 @@ import { NgModule, provideZonelessChangeDetection, } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { BrowserModule } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { Router } from '@angular/router'; import { LocaleService } from '@placeos/common'; -import { MatRippleModule } from '@angular/material/core'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatMenuModule } from '@angular/material/menu'; -import { MatProgressSpinner } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; import { ServiceWorkerModule } from '@angular/service-worker'; import { registerLocaleData } from '@angular/common'; @@ -27,8 +20,6 @@ import localeIt from '@angular/common/locales/it'; import localeJa from '@angular/common/locales/ja'; import localeZh from '@angular/common/locales/zh'; -import { AppComponent } from '../../../../libs/components/src/lib/app.component'; - import { environment } from '../environments/environment'; import { AppRoutingModule } from './app-routing.module'; import { BootstrapComponent } from './bootstrap.component'; @@ -37,45 +28,24 @@ import { WelcomeComponent } from './welcome.component'; import * as Sentry from '@sentry/angular'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; -import { TranslatePipe } from 'libs/components/src/lib/translate.pipe'; - -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { AuthenticatedImageDirective } from 'libs/components/src/lib/authenticated-image.directive'; -import { GlobalBannerComponent } from 'libs/components/src/lib/global-banner.component'; -import { GlobalLoadingComponent } from 'libs/components/src/lib/global-loading.component'; -import { SanitizePipe } from 'libs/components/src/lib/sanitise.pipe'; -import { UserSearchFieldComponent } from 'libs/form-fields/src/lib/user-search-field.component'; +import { + GlobalBannerComponent, + GlobalLoadingComponent, +} from '@placeos/components'; +import { AppComponent } from './app.component'; import { TopbarHeaderComponent } from './components/topbar-header.component'; -const MAT_MODULES = [ - MatProgressSpinner, - MatRippleModule, - MatFormFieldModule, - MatSelectModule, - MatInputModule, - MatMenuModule, - MatCheckboxModule, -]; - const STANDALONE_COMPONENTS = [ GlobalLoadingComponent, GlobalBannerComponent, - IconComponent, - TranslatePipe, - SanitizePipe, - AuthenticatedImageDirective, - UserSearchFieldComponent, + BootstrapComponent, + WelcomeComponent, + VisitorRegistrationComponent, + TopbarHeaderComponent, ]; @NgModule({ - declarations: [ - AppComponent, - BootstrapComponent, - WelcomeComponent, - VisitorRegistrationComponent, - TopbarHeaderComponent, - ], + declarations: [AppComponent], bootstrap: [AppComponent], imports: [ BrowserModule, @@ -84,9 +54,6 @@ const STANDALONE_COMPONENTS = [ ServiceWorkerModule.register('ngsw-worker.js', { enabled: environment.production, }), - FormsModule, - ReactiveFormsModule, - ...MAT_MODULES, ...STANDALONE_COMPONENTS, ], providers: [ diff --git a/apps/visitor-kiosk/src/app/bootstrap.component.ts b/apps/visitor-kiosk/src/app/bootstrap.component.ts index a44b9a529e..bb3aa79f22 100644 --- a/apps/visitor-kiosk/src/app/bootstrap.component.ts +++ b/apps/visitor-kiosk/src/app/bootstrap.component.ts @@ -1,16 +1,23 @@ import { Component, OnInit, inject } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; -import { AsyncHandler, Identity, SettingsService } from '@placeos/common'; import { + AsyncHandler, Building, BuildingLevel, + Identity, OrganisationService, Region, -} from '@placeos/organisation'; + SettingsService, +} from '@placeos/common'; import { first } from 'rxjs/operators'; -import { VirtualKeyboardComponent } from 'libs/components/src/lib/virtual-keyboard.component'; +import { CommonModule } from '@angular/common'; +import { MatRippleModule } from '@angular/material/core'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { MatSelectModule } from '@angular/material/select'; +import { TranslatePipe, VirtualKeyboardComponent } from '@placeos/components'; @Component({ selector: '[bootstrap]', @@ -337,7 +344,14 @@ import { VirtualKeyboardComponent } from 'libs/components/src/lib/virtual-keyboa } `, ], - standalone: false, + imports: [ + CommonModule, + MatRippleModule, + TranslatePipe, + MatProgressSpinnerModule, + MatFormFieldModule, + MatSelectModule, + ], }) export class BootstrapComponent extends AsyncHandler implements OnInit { private _org = inject(OrganisationService); diff --git a/apps/visitor-kiosk/src/app/checkin/checkin-covid.component.ts b/apps/visitor-kiosk/src/app/checkin/checkin-covid.component.ts index eb70d435da..701fd302b1 100644 --- a/apps/visitor-kiosk/src/app/checkin/checkin-covid.component.ts +++ b/apps/visitor-kiosk/src/app/checkin/checkin-covid.component.ts @@ -1,6 +1,10 @@ import { Component, inject } from '@angular/core'; -import { Router } from '@angular/router'; +import { FormsModule } from '@angular/forms'; +import { MatRippleModule } from '@angular/material/core'; +import { MatRadioModule } from '@angular/material/radio'; +import { Router, RouterModule } from '@angular/router'; import { notifyError } from '@placeos/common'; +import { IconComponent } from '@placeos/components'; import { CheckinStateService } from './checkin-state.service'; @Component({ @@ -79,7 +83,13 @@ import { CheckinStateService } from './checkin-state.service'; } `, ], - standalone: false, + imports: [ + MatRadioModule, + MatRippleModule, + IconComponent, + RouterModule, + FormsModule, + ], }) export class CheckinCovidComponent { private _router = inject(Router); diff --git a/apps/visitor-kiosk/src/app/checkin/checkin-details.component.ts b/apps/visitor-kiosk/src/app/checkin/checkin-details.component.ts index a175210959..1704bbefa9 100644 --- a/apps/visitor-kiosk/src/app/checkin/checkin-details.component.ts +++ b/apps/visitor-kiosk/src/app/checkin/checkin-details.component.ts @@ -1,6 +1,12 @@ +import { CommonModule } from '@angular/common'; import { Component, inject, OnInit } from '@angular/core'; -import { Router } from '@angular/router'; +import { ReactiveFormsModule } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { Router, RouterModule } from '@angular/router'; import { nextValueFrom, SettingsService } from '@placeos/common'; +import { IconComponent, TranslatePipe } from '@placeos/components'; import { first } from 'rxjs/operators'; import { CheckinStateService } from './checkin-state.service'; @@ -154,7 +160,16 @@ import { CheckinStateService } from './checkin-state.service'; } `, ], - standalone: false, + imports: [ + CommonModule, + TranslatePipe, + IconComponent, + MatProgressSpinnerModule, + RouterModule, + MatFormFieldModule, + MatInputModule, + ReactiveFormsModule, + ], }) export class CheckinDetailsComponent implements OnInit { private _checkin = inject(CheckinStateService); diff --git a/apps/visitor-kiosk/src/app/checkin/checkin-error.component.ts b/apps/visitor-kiosk/src/app/checkin/checkin-error.component.ts index 8ddb795943..29f0511ac7 100644 --- a/apps/visitor-kiosk/src/app/checkin/checkin-error.component.ts +++ b/apps/visitor-kiosk/src/app/checkin/checkin-error.component.ts @@ -1,4 +1,8 @@ +import { CommonModule } from '@angular/common'; import { Component, inject } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; +import { RouterModule } from '@angular/router'; +import { TranslatePipe } from '@placeos/components'; import { CheckinStateService } from './checkin-state.service'; @Component({ @@ -25,7 +29,7 @@ import { CheckinStateService } from './checkin-state.service'; } `, ], - standalone: false, + imports: [CommonModule, TranslatePipe, MatRippleModule, RouterModule], }) export class CheckinErrorComponent { private _checkin = inject(CheckinStateService); diff --git a/apps/visitor-kiosk/src/app/checkin/checkin-induction.component.ts b/apps/visitor-kiosk/src/app/checkin/checkin-induction.component.ts index 81293f8dd7..c6ae98c712 100644 --- a/apps/visitor-kiosk/src/app/checkin/checkin-induction.component.ts +++ b/apps/visitor-kiosk/src/app/checkin/checkin-induction.component.ts @@ -1,12 +1,16 @@ import { Component, inject } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatRippleModule } from '@angular/material/core'; import { Router } from '@angular/router'; import { + OrganisationService, SettingsService, notifyError, notifyInfo, notifySuccess, } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { TranslatePipe } from '@placeos/components'; import { first } from 'rxjs/operators'; import { CheckinStateService } from './checkin-state.service'; @@ -49,7 +53,7 @@ import { CheckinStateService } from './checkin-state.service'; `, styles: [], - standalone: false, + imports: [TranslatePipe, MatRippleModule, MatCheckboxModule, FormsModule], }) export class CheckinInductionComponent { private _checkin = inject(CheckinStateService); diff --git a/apps/visitor-kiosk/src/app/checkin/checkin-photo.component.ts b/apps/visitor-kiosk/src/app/checkin/checkin-photo.component.ts index 418ef9d8ba..f581460788 100644 --- a/apps/visitor-kiosk/src/app/checkin/checkin-photo.component.ts +++ b/apps/visitor-kiosk/src/app/checkin/checkin-photo.component.ts @@ -1,6 +1,9 @@ import { Component, OnInit, inject } from '@angular/core'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { Router } from '@angular/router'; import { notifyError } from '@placeos/common'; +import { TranslatePipe } from '@placeos/components'; +import { TakePhotoComponent } from '../components/take-photo.component'; import { CheckinStateService } from './checkin-state.service'; @Component({ @@ -29,7 +32,7 @@ import { CheckinStateService } from './checkin-state.service'; } `, styles: [``], - standalone: false, + imports: [TranslatePipe, MatProgressSpinnerModule, TakePhotoComponent], }) export class CheckinPhotoComponent implements OnInit { private _checkin = inject(CheckinStateService); diff --git a/apps/visitor-kiosk/src/app/checkin/checkin-preferences.component.ts b/apps/visitor-kiosk/src/app/checkin/checkin-preferences.component.ts index eed61b6d27..0c059fd0a0 100644 --- a/apps/visitor-kiosk/src/app/checkin/checkin-preferences.component.ts +++ b/apps/visitor-kiosk/src/app/checkin/checkin-preferences.component.ts @@ -1,18 +1,7 @@ import { Component, inject, OnInit, signal } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; -import { lastValueFrom, of } from 'rxjs'; - -import { - AsyncHandler, - i18n, - log, - nextValueFrom, - notifyError, - notifySuccess, - SettingsService, -} from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { ActivatedRoute, Router, RouterModule } from '@angular/router'; import { setToken, showMetadata } from '@placeos/ts-client'; +import { lastValueFrom, of } from 'rxjs'; import { catchError, filter, @@ -23,17 +12,28 @@ import { switchMap, } from 'rxjs/operators'; +import { CommonModule } from '@angular/common'; +import { MatRippleModule } from '@angular/material/core'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { MatSelectModule } from '@angular/material/select'; +import { saveBooking, updateBooking } from '@placeos/bookings'; import { + AsyncHandler, Booking, + CateringItem, + CateringOrder, + i18n, LinkedCalendarEvent, -} from 'libs/bookings/src/lib/booking.class'; -import { saveBooking, updateBooking } from 'libs/bookings/src/lib/bookings.fn'; -import { CateringItem } from 'libs/catering/src/lib/catering-item.class'; -import { CateringOrder } from 'libs/catering/src/lib/catering-order.class'; -import { - showEventMetadata, - updateEventMetadata, -} from 'libs/events/src/lib/events.fn'; + log, + nextValueFrom, + notifyError, + notifySuccess, + OrganisationService, + SettingsService, +} from '@placeos/common'; +import { IconComponent, TranslatePipe } from '@placeos/components'; +import { showEventMetadata, updateEventMetadata } from '@placeos/events'; import { CheckinStateService } from './checkin-state.service'; @Component({ @@ -118,7 +118,16 @@ import { CheckinStateService } from './checkin-state.service'; } `, ], - standalone: false, + imports: [ + CommonModule, + TranslatePipe, + IconComponent, + MatProgressSpinnerModule, + MatRippleModule, + RouterModule, + MatFormFieldModule, + MatSelectModule, + ], }) export class CheckinPreferencesComponent extends AsyncHandler diff --git a/apps/visitor-kiosk/src/app/checkin/checkin-qr-scan.component.ts b/apps/visitor-kiosk/src/app/checkin/checkin-qr-scan.component.ts index 4abdb903d2..799f1799b0 100644 --- a/apps/visitor-kiosk/src/app/checkin/checkin-qr-scan.component.ts +++ b/apps/visitor-kiosk/src/app/checkin/checkin-qr-scan.component.ts @@ -6,15 +6,21 @@ import { inject, viewChild, } from '@angular/core'; -import { Router } from '@angular/router'; +import { Router, RouterModule } from '@angular/router'; import { AsyncHandler, SettingsService, nextValueFrom, notifyError, + scanForQRCode, } from '@placeos/common'; -import decodeQR from 'qr/decode.js'; +import { FormsModule } from '@angular/forms'; +import { MatRippleModule } from '@angular/material/core'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { IconComponent, TranslatePipe } from '@placeos/components'; import { CheckinStateService } from './checkin-state.service'; @Component({ @@ -101,7 +107,16 @@ import { CheckinStateService } from './checkin-state.service'; } `, ], - standalone: false, + imports: [ + TranslatePipe, + IconComponent, + MatProgressSpinnerModule, + RouterModule, + MatRippleModule, + MatFormFieldModule, + MatInputModule, + FormsModule, + ], }) export class CheckinQRScanComponent extends AsyncHandler @@ -145,13 +160,13 @@ export class CheckinQRScanComponent .getTracks() .forEach((track) => track?.stop()); } - this._stopQRReader(); + this.unsub('scan_for_qr_code'); } public async checkQRCode(raw_text: string) { if (this.checking_code) return; this.timeout('check_qr_code', async () => { - this._stopQRReader(); + this.unsub('scan_for_qr_code'); this.checking_code = true; const chunks = raw_text.split(','); let [visit_block, system_id, event_id, host_email] = chunks; @@ -225,88 +240,35 @@ export class CheckinQRScanComponent private setupQRReader() { this.timeout('setup_qr_reader', () => { - const _video_el = this._video_el(); - if (!_video_el?.nativeElement) return this.setupQRReader(); - if ( - navigator.mediaDevices?.getUserMedia && - !_video_el.nativeElement.srcObject - ) { + const _video_el = this._video_el()?.nativeElement; + if (!_video_el) return this.setupQRReader(); + if (navigator.mediaDevices?.getUserMedia && !_video_el.srcObject) { navigator.mediaDevices .getUserMedia({ video: true }) .then((stream) => { - this._video_el().nativeElement.srcObject = stream; - this._startQRScanning(); + _video_el.srcObject = stream; + this.subscription( + 'scan_for_qr_code', + scanForQRCode(_video_el).subscribe({ + next: (qr_code) => + qr_code ? this.checkQRCode(qr_code) : null, + error: (error: any) => + console.error( + 'Error scanning QR code:', + error, + ), + }), + ); }) .catch((e) => console.error('Unable to fetch media devices!', e), ); - } else if (_video_el.nativeElement.srcObject) { - this._startQRScanning(); + } else if (_video_el.srcObject) { + this.unsub('scan_for_qr_code'); } }); } - private _startQRScanning() { - const _video_el = this._video_el(); - if (!_video_el?.nativeElement) return; - - // Create canvas for image processing - if (!this._canvas) { - this._canvas = document.createElement('canvas'); - const ctx = this._canvas.getContext('2d'); - if (!ctx) { - console.error('Unable to get 2D context for QR scanning'); - return; - } - this._ctx = ctx; - } - - // Start scanning loop - this.interval('scan_frame', () => this._scanFrame()); - } - - private _scanFrame() { - const _video_el = this._video_el(); - if (!_video_el?.nativeElement || this.checking_code) return; - - const video = _video_el.nativeElement; - if (video.videoWidth === 0 || video.videoHeight === 0) return; - - // Set canvas size to video size - this._canvas.width = video.videoWidth; - this._canvas.height = video.videoHeight; - - // Draw current video frame to canvas - this._ctx.drawImage(video, 0, 0); - - try { - // Get image data - const imageData = this._ctx.getImageData( - 0, - 0, - this._canvas.width, - this._canvas.height, - ); - - // Create image object for qr library - const image = { - height: imageData.height, - width: imageData.width, - data: imageData.data, - }; - - // Try to decode QR code - const result = decodeQR(image); - if (result) this.checkQRCode(result); - } catch (error) { - // Ignore decoding errors - they're expected when no QR code is present - } - } - - private _stopQRReader() { - this.clearInterval('scan_frame'); - } - private handleError(message: any) { this._checkin.setError(message?.statusText || message); this._router.navigate(['/checkin', 'error']); diff --git a/apps/visitor-kiosk/src/app/checkin/checkin-result.component.ts b/apps/visitor-kiosk/src/app/checkin/checkin-result.component.ts index 4328d03e6f..b523c293c9 100644 --- a/apps/visitor-kiosk/src/app/checkin/checkin-result.component.ts +++ b/apps/visitor-kiosk/src/app/checkin/checkin-result.component.ts @@ -1,11 +1,22 @@ -import { DatePipe } from '@angular/common'; +import { CommonModule, DatePipe } from '@angular/common'; import { Component, inject, OnInit, signal } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; import { Router } from '@angular/router'; -import { Booking } from '@placeos/bookings'; -import { AsyncHandler, nextValueFrom, SettingsService } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { + AsyncHandler, + Booking, + generateQRCode, + nextValueFrom, + OrganisationService, + SettingsService, +} from '@placeos/common'; +import { + PrintableComponent, + SanitizePipe, + TranslatePipe, +} from '@placeos/components'; +import { UserLabelComponent } from '@placeos/users'; import { roundToNearestMinutes, startOfMinute } from 'date-fns'; -import { generateQRCode } from 'libs/common/src/lib/qr-code'; import { combineLatest, firstValueFrom } from 'rxjs'; import { filter, first, map, startWith } from 'rxjs/operators'; import { CheckinStateService } from './checkin-state.service'; @@ -39,25 +50,28 @@ const DEFAULT_TEMPLATE = ` [innerHTML]="result_template | async | sanitize: 'html'" > @if (printing()) { - `, styles: [``], - standalone: false, + imports: [MatRippleModule, TranslatePipe, RouterModule], }) export class CodeFlowErrorComponent extends AsyncHandler { private _route = inject(ActivatedRoute); diff --git a/apps/workplace/src/app/book/code-flow-success.component.ts b/apps/workplace/src/app/book/code-flow-success.component.ts index 4027ffa652..5b21c77cf9 100644 --- a/apps/workplace/src/app/book/code-flow-success.component.ts +++ b/apps/workplace/src/app/book/code-flow-success.component.ts @@ -1,4 +1,7 @@ import { Component } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; +import { RouterModule } from '@angular/router'; +import { TranslatePipe } from '@placeos/components'; @Component({ selector: 'code-flow-success', @@ -32,6 +35,6 @@ import { Component } from '@angular/core'; `, styles: [``], - standalone: false, + imports: [MatRippleModule, TranslatePipe, RouterModule], }) export class CodeFlowSuccessComponent {} diff --git a/apps/workplace/src/app/book/code-flow.component.ts b/apps/workplace/src/app/book/code-flow.component.ts index 456bb2584c..e91290cae1 100644 --- a/apps/workplace/src/app/book/code-flow.component.ts +++ b/apps/workplace/src/app/book/code-flow.component.ts @@ -11,29 +11,33 @@ import { } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { - Booking, BookingFormService, - BookingType, checkinBooking, queryBookings, } from '@placeos/bookings'; import { AsyncHandler, + Booking, + BookingType, + CalendarEvent, currentUser, firstTruthyValueFrom, notifyError, + scanForQRCode, } from '@placeos/common'; import { - CalendarEvent, checkinEventGuest, EventFormService, queryEvents, } from '@placeos/events'; import { showSystem } from '@placeos/ts-client'; import { addMinutes, endOfDay, getUnixTime } from 'date-fns'; -import decodeQR from 'qr/decode.js'; -import { OrganisationService } from '@placeos/organisation'; +import { FormsModule } from '@angular/forms'; +import { MatRippleModule } from '@angular/material/core'; +import { MatInputModule } from '@angular/material/input'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { OrganisationService } from '@placeos/common'; import { lastValueFrom } from 'rxjs'; @Component({ @@ -177,7 +181,12 @@ import { lastValueFrom } from 'rxjs'; } `, ], - standalone: false, + imports: [ + MatInputModule, + MatRippleModule, + MatProgressSpinnerModule, + FormsModule, + ], }) export class BookCodeFlowComponent extends AsyncHandler @@ -203,7 +212,7 @@ export class BookCodeFlowComponent viewChild>('video'); public ngOnDestroy() { - this._stopScanning(); + this.unsub('scan_for_qr_code'); } public async ngOnInit() { @@ -247,7 +256,7 @@ export class BookCodeFlowComponent type: BookingType = 'desk', ) { this.loading.set(true); - this._stopScanning(); + this.unsub('scan_for_qr_code'); let bookings = await lastValueFrom( queryBookings({ period_start: getUnixTime(Date.now()), @@ -307,7 +316,7 @@ export class BookCodeFlowComponent private async _checkinEvent(space_id: string, email?: string) { if (!email) email = currentUser().email; this.loading.set(true); - this._stopScanning(); + this.unsub('scan_for_qr_code'); const bookings = await lastValueFrom( queryEvents({ period_start: getUnixTime(Date.now()), @@ -350,74 +359,16 @@ export class BookCodeFlowComponent .getUserMedia({ video: true }) .then((stream) => { video_el.srcObject = stream; - this._startQRScanning(); + this.subscription( + 'scan_for_qr_code', + scanForQRCode(video_el).subscribe({ + next: (qr_code) => + qr_code ? this.handleQrCode(qr_code) : null, + error: (error: any) => + console.error('Error scanning QR code:', error), + }), + ); }) .catch((e) => console.error('Unable to fetch media devices!', e)); } - - private _startQRScanning() { - const video_el = this._video_el()?.nativeElement; - if (!video_el) return; - - // Create canvas for image processing - if (!this._canvas) { - this._canvas = document.createElement('canvas'); - const ctx = this._canvas.getContext('2d'); - if (!ctx) { - console.error('Unable to get 2D context for QR scanning'); - return; - } - this._ctx = ctx; - } - - // Start scanning loop - this.interval('scan_frame', () => this._scanFrame()); - } - - private _scanFrame() { - const video_el = this._video_el()?.nativeElement; - if (!video_el || this.loading()) return; - - if (video_el.videoWidth === 0 || video_el.videoHeight === 0) return; - - // Set canvas size to video size - this._canvas.width = video_el.videoWidth; - this._canvas.height = video_el.videoHeight; - - // Draw current video frame to canvas - this._ctx.drawImage(video_el, 0, 0); - - try { - // Get image data - const imageData = this._ctx.getImageData( - 0, - 0, - this._canvas.width, - this._canvas.height, - ); - - // Create image object for qr library - const image = { - height: imageData.height, - width: imageData.width, - data: imageData.data, - }; - - // Try to decode QR code - const result = decodeQR(image); - if (result) this.handleQrCode(result); - } catch (error) { - // Ignore decoding errors - they're expected when no QR code is present - } - } - - private _stopScanning() { - const video_el = this._video_el()?.nativeElement; - if (video_el?.srcObject) { - (video_el?.srcObject as MediaStream) - .getTracks() - .forEach((track) => track?.stop()); - } - this.clearInterval('scan_frame'); - } } diff --git a/apps/workplace/src/app/book/desk-flow.component.ts b/apps/workplace/src/app/book/desk-flow.component.ts index db812ddf52..d3e575c761 100644 --- a/apps/workplace/src/app/book/desk-flow.component.ts +++ b/apps/workplace/src/app/book/desk-flow.component.ts @@ -3,12 +3,15 @@ import { ActivatedRoute } from '@angular/router'; import { BookingFormService } from '@placeos/bookings'; import { AsyncHandler, + Desk, firstTruthyValueFrom, nextValueFrom, notifyInfo, + OrganisationService, } from '@placeos/common'; -import { Desk, OrganisationService } from '@placeos/organisation'; import { lastValueFrom, timer } from 'rxjs'; +import { NewDeskFlowFormComponent } from './desk-flow/desk-flow-form.component'; +import { NewDeskFlowSuccessComponent } from './desk-flow/desk-flow-success.component'; @Component({ selector: 'placeos-new-book-desk-flow', @@ -32,7 +35,7 @@ import { lastValueFrom, timer } from 'rxjs'; } `, ], - standalone: false, + imports: [NewDeskFlowSuccessComponent, NewDeskFlowFormComponent], }) export class NewDeskFlowComponent extends AsyncHandler implements OnInit { private _state = inject(BookingFormService); diff --git a/apps/workplace/src/app/book/desk-flow/desk-flow-confirm.component.ts b/apps/workplace/src/app/book/desk-flow/desk-flow-confirm.component.ts index 1e6bd083a0..a132f0fdd7 100644 --- a/apps/workplace/src/app/book/desk-flow/desk-flow-confirm.component.ts +++ b/apps/workplace/src/app/book/desk-flow/desk-flow-confirm.component.ts @@ -1,9 +1,14 @@ -import { DatePipe } from '@angular/common'; +import { CommonModule, DatePipe } from '@angular/common'; import { Component, inject, model } from '@angular/core'; import { MatBottomSheetRef } from '@angular/material/bottom-sheet'; +import { MatRippleModule } from '@angular/material/core'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { BookingFormService } from '@placeos/bookings'; import { + AssetRequest, AsyncHandler, + Desk, + OrganisationService, SettingsService, formatRecurrence, fromBookingRecurrence, @@ -12,9 +17,8 @@ import { nextValueFrom, notifyError, } from '@placeos/common'; -import { Desk, OrganisationService } from '@placeos/organisation'; +import { IconComponent, TranslatePipe } from '@placeos/components'; import { addMinutes, endOfDay } from 'date-fns'; -import { AssetRequest } from 'libs/assets/src/lib/asset-request.class'; import { map } from 'rxjs/operators'; @Component({ @@ -30,7 +34,7 @@ import { map } from 'rxjs/operators'; @if (loading | async) { } - @if (show_close()) { + @if (show_close() && !(loading | async)) { + + +
+
+ +
+ @if (!loading) { +
+ +
+
+ +
+ } @else { +
+ +
+ } +
+
+ +
+ + +
+
+ `, + styles: [ + ` + .heading { + flex: 1; + text-align: center; + } + + .not-mobile { + @media screen and (max-width: 639px) { + display: none; + } + } + + .mobile-only { + @media screen and (min-width: 640px) { + display: none; + } + } + + .date { + display: flex; + justify-content: center; + margin-bottom: 1em; + } + + .spinner { + display: flex; + justify-content: center; + width: 100%; + height: 3em; + } + `, + ], + imports: [ + MatDialogModule, + IconComponent, + DateFieldComponent, + VerticalTimelineComponent, + EventTimelineComponent, + MatProgressSpinnerModule, + MatRippleModule, + FormsModule, + ], +}) +export class UserAvailabilityModalComponent + extends AsyncHandler + implements OnInit +{ + private _data = inject(MAT_DIALOG_DATA); + + /** Emitter for user action on the modal */ + public readonly event = output(); + /** List of Users to check availability */ + public users: StaffUser[]; + /** Whether the users events are being loaded */ + public loading: boolean; + /** Selected date in unix ms */ + public date: number = new Date().valueOf(); + /** Groups */ + public groups: ITimelineEventGroup[]; + /** Duration */ + public duration: number; + /** Date subject */ + public date$ = new BehaviorSubject(this.date); + + public ngOnInit(): void { + this.users = this._data.users; + this.date = this._data.date; + this.duration = this._data.duration; + this.loadAvailability(); + this.date$ + .pipe( + debounceTime(500), + switchMap(() => this.loadAvailability()), + ) + .subscribe((res) => (this.groups = res)); + } + + /** Load events for all attendees */ + public async loadAvailability() { + this.loading = true; + const period_start = getUnixTime(startOfDay(this.date)); + const period_end = getUnixTime(endOfDay(this.date)); + const result: any[] = await Promise.all( + this.users.map(async (user) => { + if (!user.email) return []; + return { + name: user.name, + events: await queryEvents({ + period_start, + period_end, + calendars: user.email, + }) + .toPromise() + .then((res) => + res.map((i) => ({ + start: new Date(i.date).getHours(), + duration: i.duration, + })), + ) + .catch((err) => []), + }; + }), + ); + this.loading = false; + return result; + } + + /** Change date keeping hours and minutes */ + public changeDate(new_date: number) { + const date = new Date(this.date); + this.date = set(new_date, { + hours: date.getHours(), + minutes: date.getMinutes(), + }).valueOf(); + this.date$.next(this.date); + } + + /** Whether date is in the past */ + public get is_past(): boolean { + return isBefore(this.date, Date.now()); + } + + public save() { + if (this.is_past) { + return; + } + this.event.emit({ + reason: 'done', + metadata: { date: this.date, duration: this.duration }, + }); + } +} diff --git a/apps/workplace/src/app/components/vertical-timeline/vertical-timeline.component.ts b/apps/workplace/src/app/components/vertical-timeline.component.ts similarity index 59% rename from apps/workplace/src/app/components/vertical-timeline/vertical-timeline.component.ts rename to apps/workplace/src/app/components/vertical-timeline.component.ts index 4bc43f0780..46d00ea85c 100644 --- a/apps/workplace/src/app/components/vertical-timeline/vertical-timeline.component.ts +++ b/apps/workplace/src/app/components/vertical-timeline.component.ts @@ -23,13 +23,187 @@ import { import { AsyncHandler, formatDuration } from '@placeos/common'; -import { ITimelineEventGroup } from '../event-timeline/event-timeline.component'; +import { ITimelineEventGroup } from './event-timeline.component'; @Component({ selector: 'vertical-timeline', - templateUrl: './vertical-timeline.component.html', - styleUrls: ['./vertical-timeline.component.scss'], - standalone: false, + template: ` +
+
+
+ @for (item of blocks; track item) { +
+ @if (item.hour) { +
{{ item.display }}
+ } +
+ } +
+
+ @for (item of blocks; track item) { +
+ } +
+
+ {{ display }} +
+
+
+
+
+
+
+ `, + styles: [ + ` + .timeline { + position: relative; + width: 100%; + padding: 1em; + display: flex; + align-items: center; + justify-content: center; + overflow: auto; + + .content { + display: flex; + margin: auto; + width: 100%; + } + } + + .timeblocks, + .eventblocks { + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + } + + .timeblocks { + width: 3em; + } + + .eventblocks { + position: relative; + flex: 1; + border: 1px solid #ccc; + width: 50%; + overflow: hidden; + .blk { + position: relative; + } + } + + .blk { + position: relative; + min-height: 0.3em; + flex: 1; + width: 100%; + &.shown-block { + border-top: 1px dashed #ccc; + &.hour { + border-top: 1px solid #ccc; + } + &:first-child { + border: none; + } + } + + .text { + position: absolute; + top: 0; + right: 0.5em; + transform: translateY(-50%); + } + + &.unavailable { + background-color: rgba(var(--error), 0.1); + pointer-events: none; + } + + &.disabled { + background-color: rgba(#000, 0.05); + pointer-events: none; + } + } + + .selected-time { + position: absolute; + top: 0; + left: 0; + right: 0; + border: 2px solid var(--s); + background-color: var(--s); + color: #fff; + z-index: 100; + touch-action: none; + transition: + top 100ms, + height 100ms; + + .inner { + height: 100%; + width: 100%; + padding: 0.25em 1em; + } + + .handle { + position: absolute; + height: 1em; + width: 1em; + border-radius: 100%; + background-color: var(--s); + box-shadow: + 0 1px 3px 0 rgba(#000, 0.2), + 0 1px 1px 0 rgba(#000, 0.14), + 0 2px 1px -1px rgba(#000, 0.12); + &.top { + top: 0; + right: 1em; + transform: translateY(-50%); + } + &.bottom { + bottom: 0; + left: 1em; + transform: translateY(50%); + } + } + } + `, + ], + imports: [], }) export class VerticalTimelineComponent extends AsyncHandler diff --git a/apps/workplace/src/app/components/vertical-timeline/vertical-timeline.component.html b/apps/workplace/src/app/components/vertical-timeline/vertical-timeline.component.html deleted file mode 100644 index 7b8913f4c2..0000000000 --- a/apps/workplace/src/app/components/vertical-timeline/vertical-timeline.component.html +++ /dev/null @@ -1,52 +0,0 @@ -
-
-
- @for (item of blocks; track item) { -
- @if (item.hour) { -
{{ item.display }}
- } -
- } -
-
- @for (item of blocks; track item) { -
- } -
-
- {{ display }} -
-
-
-
-
-
-
diff --git a/apps/workplace/src/app/components/vertical-timeline/vertical-timeline.component.scss b/apps/workplace/src/app/components/vertical-timeline/vertical-timeline.component.scss deleted file mode 100644 index c76a6e919a..0000000000 --- a/apps/workplace/src/app/components/vertical-timeline/vertical-timeline.component.scss +++ /dev/null @@ -1,111 +0,0 @@ - -.timeline { - position: relative; - width: 100%; - padding: 1em; - display: flex; - align-items: center; - justify-content: center; - overflow: auto; - - .content { - display: flex; - margin: auto; - width: 100%; - } -} - -.timeblocks, -.eventblocks { - display: flex; - align-items: center; - justify-content: center; - flex-direction: column; -} - -.timeblocks { - width: 3em; -} - -.eventblocks { - position: relative; - flex: 1; - border: 1px solid #ccc; - width: 50%; - overflow: hidden; - .blk { - position: relative; - } -} - -.blk { - position: relative; - min-height: 0.3em; - flex: 1; - width: 100%; - &.shown-block { - border-top: 1px dashed #ccc; - &.hour { - border-top: 1px solid #ccc; - } - &:first-child { - border: none; - } - } - - .text { - position: absolute; - top: 0; - right: 0.5em; - transform: translateY(-50%); - } - - &.unavailable { - background-color: rgba(var(--error), 0.1); - pointer-events: none; - } - - &.disabled { - background-color: rgba(#000, 0.05); - pointer-events: none; - } -} - -.selected-time { - position: absolute; - top: 0; - left: 0; - right: 0; - border: 2px solid var(--s); - background-color: var(--s); - color: #fff; - z-index: 100; - touch-action: none; - transition: top 100ms, height 100ms; - - .inner { - height: 100%; - width: 100%; - padding: 0.25em 1em; - } - - .handle { - position: absolute; - height: 1em; - width: 1em; - border-radius: 100%; - background-color: var(--s); - box-shadow: 0 1px 3px 0 rgba(#000, 0.2), 0 1px 1px 0 rgba(#000, 0.14), - 0 2px 1px -1px rgba(#000, 0.12); - &.top { - top: 0; - right: 1em; - transform: translateY(-50%); - } - &.bottom { - bottom: 0; - left: 1em; - transform: translateY(50%); - } - } -} diff --git a/apps/workplace/src/app/components/view-attendees-modal.component.ts b/apps/workplace/src/app/components/view-attendees-modal.component.ts new file mode 100644 index 0000000000..1abc1f5028 --- /dev/null +++ b/apps/workplace/src/app/components/view-attendees-modal.component.ts @@ -0,0 +1,90 @@ +import { Component, OnInit, inject } from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog'; + +import { AsyncHandler, User } from '@placeos/common'; +import { IconComponent } from '@placeos/components'; + +@Component({ + selector: 'schedule-view-attendees', + template: ` +
+ +

Attendees

+
+ +
+ @for (item of attendees; track item) { +
+ + + {{ item.email }} +
+ } +
+
+ +
+ +
+
+ `, + styles: [ + ` + .body { + display: flex; + flex-direction: column; + row-gap: 0.5em; + + div { + display: grid; + grid-template-columns: 3em 1fr; + grid-template-rows: 1fr 1fr; + grid-template-areas: 'icon name' 'icon email'; + margin-bottom: 0.5em; + align-items: center; + + icon { + margin: auto; + grid-area: icon; + font-size: 2em; + } + label { + grid-area: name; + } + a { + grid-area: email; + } + } + } + `, + ], + imports: [MatDialogModule, IconComponent], +}) +export class ViewAttendeesModalComponent + extends AsyncHandler + implements OnInit +{ + private _data = inject<{ + attendees: User[]; + }>(MAT_DIALOG_DATA); + + public attendees: User[]; + + public ngOnInit() { + this.attendees = this._data.attendees; + } +} diff --git a/apps/workplace/src/app/components/view-catering-modal.component.ts b/apps/workplace/src/app/components/view-catering-modal.component.ts new file mode 100644 index 0000000000..8e6a5ce9d7 --- /dev/null +++ b/apps/workplace/src/app/components/view-catering-modal.component.ts @@ -0,0 +1,99 @@ +import { Component, OnInit, inject } from '@angular/core'; +import { + MAT_DIALOG_DATA, + MatDialog, + MatDialogModule, +} from '@angular/material/dialog'; +import { Router } from '@angular/router'; + +import { AsyncHandler, CateringItem } from '@placeos/common'; +import { IconComponent } from '@placeos/components'; + +@Component({ + selector: 'view-catering-modal', + template: ` +
+ room_service +

Catering

+
+
+ Item + Quantity + @for (item of catering; track item) { + + + } + Total Items + {{ catering_items_total }} + Note: +
+ {{ catering_note }} +
+
+
+ + +
+ `, + styles: [ + ` + .body { + display: grid; + grid-template-columns: 1fr 1fr; + row-gap: 0.5em; + + .note-box, + .note-label { + grid-column: 1/-1; + } + + .note-label { + margin-top: 0.5em; + } + + .qty, + .total { + text-align: right; + } + } + `, + ], + imports: [MatDialogModule, IconComponent], +}) +export class ViewCateringModalComponent extends AsyncHandler implements OnInit { + private _data = inject<{ + catering: CateringItem[]; + catering_note: string; + }>(MAT_DIALOG_DATA); + private _router = inject(Router); + private _dialog = inject(MatDialog); + + public catering: CateringItem[]; + public catering_note: string; + public catering_items_total = 0; + + public ngOnInit() { + const data = this._data; + + if (data) { + this.catering = this._data.catering; + this.catering_note = this._data.catering_note; + this.catering_items_total = this.catering.reduce( + (total, item) => item.quantity + total, + 0, + ); + } + } + + /** + * TODO: this makes no sense. catering is not a route to be accessed like this + */ + public edit() { + this._dialog.closeAll(); + this._router.navigate(['/catering/']); + } +} diff --git a/apps/workplace/src/app/control/control.component.ts b/apps/workplace/src/app/control/control.component.ts index ff9805f63c..1cab5f3f44 100644 --- a/apps/workplace/src/app/control/control.component.ts +++ b/apps/workplace/src/app/control/control.component.ts @@ -1,5 +1,8 @@ import { Component, OnInit, inject } from '@angular/core'; import { SettingsService } from '@placeos/common'; +import { FooterMenuComponent } from '../components/footer-menu.component'; +import { TopbarComponent } from '../components/topbar.component'; +import { ControlSpaceListComponent } from './space-list.component'; @Component({ selector: '[app-control]', @@ -25,7 +28,7 @@ import { SettingsService } from '@placeos/common'; } `, ], - standalone: false, + imports: [TopbarComponent, FooterMenuComponent, ControlSpaceListComponent], }) export class ControlComponent implements OnInit { private _settings = inject(SettingsService); diff --git a/apps/workplace/src/app/control/control.module.ts b/apps/workplace/src/app/control/control.module.ts index 301972afd8..ebf1ae7801 100644 --- a/apps/workplace/src/app/control/control.module.ts +++ b/apps/workplace/src/app/control/control.module.ts @@ -1,26 +1,12 @@ -import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { Route, RouterModule } from '@angular/router'; -import { FormsModule } from '@angular/forms'; -import { SharedComponentModule } from '../components/shared.module'; import { ControlComponent } from './control.component'; -import { ControlSpaceListItemComponent } from './list-item.component'; -import { ControlSpaceListComponent } from './space-list.component'; const ROUTES: Route[] = [{ path: '', component: ControlComponent }]; @NgModule({ - declarations: [ - ControlComponent, - ControlSpaceListComponent, - ControlSpaceListItemComponent, - ], - imports: [ - CommonModule, - FormsModule, - RouterModule.forChild(ROUTES), - SharedComponentModule, - ], + declarations: [], + imports: [ControlComponent, RouterModule.forChild(ROUTES)], }) export class ControlModule {} diff --git a/apps/workplace/src/app/control/list-item.component.ts b/apps/workplace/src/app/control/list-item.component.ts index 3e8ff8e3ad..546bf552ce 100644 --- a/apps/workplace/src/app/control/list-item.component.ts +++ b/apps/workplace/src/app/control/list-item.component.ts @@ -1,8 +1,9 @@ import { Component, inject, input } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; +import { RouterModule } from '@angular/router'; -import { SettingsService } from '@placeos/common'; -import { Space } from '@placeos/events'; -import { OrganisationService } from '@placeos/organisation'; +import { OrganisationService, SettingsService, Space } from '@placeos/common'; +import { IconComponent } from '@placeos/components'; @Component({ selector: 'a-control-space-list-item', @@ -53,7 +54,7 @@ import { OrganisationService } from '@placeos/organisation'; } `, styles: [``], - standalone: false, + imports: [MatRippleModule, RouterModule, IconComponent], }) export class ControlSpaceListItemComponent { private _settings = inject(SettingsService); diff --git a/apps/workplace/src/app/control/space-list.component.ts b/apps/workplace/src/app/control/space-list.component.ts index 67849b21dc..512eb64bc0 100644 --- a/apps/workplace/src/app/control/space-list.component.ts +++ b/apps/workplace/src/app/control/space-list.component.ts @@ -1,10 +1,16 @@ import { Component, inject } from '@angular/core'; import { filter, map, startWith } from 'rxjs/operators'; -import { AsyncHandler } from '@placeos/common'; -import { Space, SpacesService } from '@placeos/events'; -import { OrganisationService } from '@placeos/organisation'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { AsyncHandler, OrganisationService, Space } from '@placeos/common'; +import { IconComponent } from '@placeos/components'; +import { SpacesService } from '@placeos/events'; import { BehaviorSubject, combineLatest } from 'rxjs'; +import { ControlSpaceListItemComponent } from './list-item.component'; @Component({ selector: 'a-control-space-list', @@ -66,7 +72,15 @@ import { BehaviorSubject, combineLatest } from 'rxjs'; } `, ], - standalone: false, + imports: [ + CommonModule, + FormsModule, + MatFormFieldModule, + MatInputModule, + IconComponent, + ControlSpaceListItemComponent, + MatProgressSpinnerModule, + ], }) export class ControlSpaceListComponent extends AsyncHandler { private _spaces = inject(SpacesService); diff --git a/apps/workplace/src/app/deals/deal-details-modal.component.ts b/apps/workplace/src/app/deals/deal-details-modal.component.ts index ffa073a31d..38aebbcf6d 100644 --- a/apps/workplace/src/app/deals/deal-details-modal.component.ts +++ b/apps/workplace/src/app/deals/deal-details-modal.component.ts @@ -7,9 +7,11 @@ import { MatDialogRef, } from '@angular/material/dialog'; import { RouterModule } from '@angular/router'; -import { AuthenticatedImageDirective } from 'libs/components/src/lib/authenticated-image.directive'; -import { IconComponent } from 'libs/components/src/lib/icon.component'; -import { TranslatePipe } from 'libs/components/src/lib/translate.pipe'; +import { + AuthenticatedImageDirective, + IconComponent, + TranslatePipe, +} from '@placeos/components'; @Component({ selector: 'deal-details-modal', diff --git a/apps/workplace/src/app/deals/deals.component.ts b/apps/workplace/src/app/deals/deals.component.ts index 8a41ee9084..f70a88fdfd 100644 --- a/apps/workplace/src/app/deals/deals.component.ts +++ b/apps/workplace/src/app/deals/deals.component.ts @@ -1,8 +1,18 @@ +import { CommonModule } from '@angular/common'; import { Component, inject, OnInit } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; +import { MatMenuModule } from '@angular/material/menu'; import { Router } from '@angular/router'; -import { firstTruthyValueFrom, SettingsService, unique } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { + firstTruthyValueFrom, + OrganisationService, + SettingsService, + unique, +} from '@placeos/common'; +import { IconComponent, TranslatePipe } from '@placeos/components'; import { BehaviorSubject, combineLatest, map } from 'rxjs'; +import { FooterMenuComponent } from '../components/footer-menu.component'; +import { TopbarComponent } from '../components/topbar.component'; import { DealsService } from './deals.service'; @Component({ @@ -175,7 +185,15 @@ import { DealsService } from './deals.service'; `, styles: [``], - standalone: false, + imports: [ + CommonModule, + IconComponent, + TranslatePipe, + MatRippleModule, + MatMenuModule, + TopbarComponent, + FooterMenuComponent, + ], }) export class DealsComponent implements OnInit { private _service = inject(DealsService); diff --git a/apps/workplace/src/app/deals/deals.module.ts b/apps/workplace/src/app/deals/deals.module.ts index 689478e9b9..853a434de5 100644 --- a/apps/workplace/src/app/deals/deals.module.ts +++ b/apps/workplace/src/app/deals/deals.module.ts @@ -1,25 +1,12 @@ -import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FormsModule } from '@angular/forms'; import { Route, RouterModule } from '@angular/router'; -import { FormFieldsModule } from '@placeos/form-fields'; - -import { SharedComponentModule } from '../components/shared.module'; -import { DealDetailsModalComponent } from './deal-details-modal.component'; import { DealsComponent } from './deals.component'; const ROUTES: Route[] = [{ path: '', component: DealsComponent }]; @NgModule({ - declarations: [DealsComponent], - imports: [ - CommonModule, - FormsModule, - FormFieldsModule, - SharedComponentModule, - DealDetailsModalComponent, - RouterModule.forChild(ROUTES), - ], + declarations: [], + imports: [DealsComponent, RouterModule.forChild(ROUTES)], }) export class DealsModule {} diff --git a/apps/workplace/src/app/deals/deals.service.ts b/apps/workplace/src/app/deals/deals.service.ts index 00df97cd86..e71a7c681e 100644 --- a/apps/workplace/src/app/deals/deals.service.ts +++ b/apps/workplace/src/app/deals/deals.service.ts @@ -1,7 +1,6 @@ import { inject, Injectable, signal } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; -import { Deal } from '@placeos/common'; -import { OrganisationService } from '@placeos/organisation'; +import { Deal, OrganisationService } from '@placeos/common'; import { showMetadata } from '@placeos/ts-client'; import { catchError, diff --git a/apps/workplace/src/app/directory/directory.module.ts b/apps/workplace/src/app/directory/directory.module.ts index ac6599c310..0d640b4bfb 100644 --- a/apps/workplace/src/app/directory/directory.module.ts +++ b/apps/workplace/src/app/directory/directory.module.ts @@ -1,20 +1,12 @@ -import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { Route, RouterModule } from '@angular/router'; -import { FormsModule } from '@angular/forms'; -import { SharedComponentModule } from '../components/shared.module'; import { DirectoryUserListComponent } from './user-list.component'; const ROUTES: Route[] = [{ path: '', component: DirectoryUserListComponent }]; @NgModule({ - declarations: [DirectoryUserListComponent], - imports: [ - CommonModule, - FormsModule, - RouterModule.forChild(ROUTES), - SharedComponentModule, - ], + declarations: [], + imports: [DirectoryUserListComponent, RouterModule.forChild(ROUTES)], }) export class DirectoryModule {} diff --git a/apps/workplace/src/app/directory/user-list.component.ts b/apps/workplace/src/app/directory/user-list.component.ts index 49eda1b8dc..00f027b199 100644 --- a/apps/workplace/src/app/directory/user-list.component.ts +++ b/apps/workplace/src/app/directory/user-list.component.ts @@ -11,8 +11,20 @@ import { tap, } from 'rxjs/operators'; -import { AsyncHandler, SettingsService } from '@placeos/common'; -import { searchStaff, User } from '@placeos/users'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { AsyncHandler, SettingsService, User } from '@placeos/common'; +import { + IconComponent, + SafePipe, + UserAvatarComponent, +} from '@placeos/components'; +import { searchStaff } from '@placeos/users'; +import { FooterMenuComponent } from '../components/footer-menu.component'; +import { TopbarComponent } from '../components/topbar.component'; const LETTERS = `ABCDEFGHIJKLMNOPQRSTUVWXYZ`.split(''); @@ -156,7 +168,18 @@ const LETTERS = `ABCDEFGHIJKLMNOPQRSTUVWXYZ`.split(''); } `, ], - standalone: false, + imports: [ + CommonModule, + IconComponent, + FooterMenuComponent, + TopbarComponent, + SafePipe, + UserAvatarComponent, + MatFormFieldModule, + MatProgressSpinnerModule, + MatInputModule, + FormsModule, + ], }) export class DirectoryUserListComponent extends AsyncHandler { private _settings = inject(SettingsService); diff --git a/apps/workplace/src/app/events/group-events-filters-list.component.ts b/apps/workplace/src/app/events/group-events-filters-list.component.ts index eb55f61a63..3c66061285 100644 --- a/apps/workplace/src/app/events/group-events-filters-list.component.ts +++ b/apps/workplace/src/app/events/group-events-filters-list.component.ts @@ -1,5 +1,8 @@ +import { CommonModule } from '@angular/common'; import { Component, inject } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; import { nextValueFrom } from '@placeos/common'; +import { IconComponent, TranslatePipe } from '@placeos/components'; import { differenceInDays, endOfDay, startOfDay } from 'date-fns'; import { map } from 'rxjs/operators'; import { GroupEventsStateService } from './group-events-state.service'; @@ -46,7 +49,7 @@ import { GroupEventsStateService } from './group-events-state.service'; `, styles: [``], - standalone: false, + imports: [CommonModule, MatRippleModule, TranslatePipe, IconComponent], }) export class GroupEventsFiltersListComponent { private _state = inject(GroupEventsStateService); diff --git a/apps/workplace/src/app/events/group-events-sidebar.component.ts b/apps/workplace/src/app/events/group-events-sidebar.component.ts index 1056c98fb3..4d8df08469 100644 --- a/apps/workplace/src/app/events/group-events-sidebar.component.ts +++ b/apps/workplace/src/app/events/group-events-sidebar.component.ts @@ -1,5 +1,13 @@ +import { CommonModule } from '@angular/common'; import { Component, inject, OnInit } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatRippleModule } from '@angular/material/core'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatSelectModule } from '@angular/material/select'; import { AsyncHandler, nextValueFrom, SettingsService } from '@placeos/common'; +import { TranslatePipe } from '@placeos/components'; +import { DateCalendarComponent } from '@placeos/form-fields'; import { addDays, addMonths, @@ -93,7 +101,16 @@ import { GroupEventsStateService } from './group-events-state.service'; `, styles: [``], - standalone: false, + imports: [ + CommonModule, + FormsModule, + MatCheckboxModule, + MatRippleModule, + DateCalendarComponent, + MatFormFieldModule, + MatSelectModule, + TranslatePipe, + ], }) export class GroupEventsSidebarComponent extends AsyncHandler diff --git a/apps/workplace/src/app/events/group-events-state.service.ts b/apps/workplace/src/app/events/group-events-state.service.ts index 3817d7c898..00c098adf1 100644 --- a/apps/workplace/src/app/events/group-events-state.service.ts +++ b/apps/workplace/src/app/events/group-events-state.service.ts @@ -1,7 +1,11 @@ import { inject, Injectable } from '@angular/core'; -import { currentUser, SettingsService, unique } from '@placeos/common'; +import { + currentUser, + OrganisationService, + SettingsService, + unique, +} from '@placeos/common'; import { queryEvents } from '@placeos/events'; -import { OrganisationService } from '@placeos/organisation'; import { querySystemsWithEmails } from '@placeos/ts-client'; import { endOfDay, getUnixTime, startOfDay } from 'date-fns'; import { BehaviorSubject, combineLatest, of } from 'rxjs'; diff --git a/apps/workplace/src/app/events/group-events.component.ts b/apps/workplace/src/app/events/group-events.component.ts index 16d4fea8e2..ac53404cd9 100644 --- a/apps/workplace/src/app/events/group-events.component.ts +++ b/apps/workplace/src/app/events/group-events.component.ts @@ -1,7 +1,14 @@ +import { CommonModule } from '@angular/common'; import { Component, inject } from '@angular/core'; import { AsyncHandler } from '@placeos/common'; +import { TranslatePipe } from '@placeos/components'; +import { GroupEventCardComponent } from '@placeos/events'; import { combineLatest } from 'rxjs'; import { map } from 'rxjs/operators'; +import { FooterMenuComponent } from '../components/footer-menu.component'; +import { TopbarComponent } from '../components/topbar.component'; +import { GroupEventsFiltersListComponent } from './group-events-filters-list.component'; +import { GroupEventsSidebarComponent } from './group-events-sidebar.component'; import { GroupEventsStateService } from './group-events-state.service'; @Component({ @@ -72,7 +79,15 @@ import { GroupEventsStateService } from './group-events-state.service'; } `, ], - standalone: false, + imports: [ + CommonModule, + TopbarComponent, + FooterMenuComponent, + GroupEventCardComponent, + GroupEventsFiltersListComponent, + GroupEventsSidebarComponent, + TranslatePipe, + ], }) export class GroupEventsComponent extends AsyncHandler { private _state = inject(GroupEventsStateService); diff --git a/apps/workplace/src/app/events/group-events.module.ts b/apps/workplace/src/app/events/group-events.module.ts index 345c7d1c3e..d1e01f73bd 100644 --- a/apps/workplace/src/app/events/group-events.module.ts +++ b/apps/workplace/src/app/events/group-events.module.ts @@ -1,31 +1,12 @@ -import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FormsModule } from '@angular/forms'; import { Route, RouterModule } from '@angular/router'; -import { FormFieldsModule } from '@placeos/form-fields'; - -import { SharedBookingsModule } from '@placeos/bookings'; -import { SharedComponentModule } from '../components/shared.module'; -import { GroupEventsFiltersListComponent } from './group-events-filters-list.component'; -import { GroupEventsSidebarComponent } from './group-events-sidebar.component'; import { GroupEventsComponent } from './group-events.component'; const ROUTES: Route[] = [{ path: '', component: GroupEventsComponent }]; @NgModule({ - declarations: [ - GroupEventsComponent, - GroupEventsSidebarComponent, - GroupEventsFiltersListComponent, - ], - imports: [ - CommonModule, - FormsModule, - SharedComponentModule, - SharedBookingsModule, - FormFieldsModule, - RouterModule.forChild(ROUTES), - ], + declarations: [], + imports: [GroupEventsComponent, RouterModule.forChild(ROUTES)], }) export class GroupEventsModule {} diff --git a/apps/workplace/src/app/explore/explore.component.ts b/apps/workplace/src/app/explore/explore.component.ts index 77406d7cc5..d9082c9aca 100644 --- a/apps/workplace/src/app/explore/explore.component.ts +++ b/apps/workplace/src/app/explore/explore.component.ts @@ -1,5 +1,8 @@ import { Component, OnInit, inject } from '@angular/core'; import { DesksService } from '@placeos/bookings'; +import { ExploreMapViewComponent } from '@placeos/explore'; +import { FooterMenuComponent } from '../components/footer-menu.component'; +import { TopbarComponent } from '../components/topbar.component'; @Component({ selector: 'app-explore', @@ -33,7 +36,7 @@ import { DesksService } from '@placeos/bookings'; } `, ], - standalone: false, + imports: [TopbarComponent, FooterMenuComponent, ExploreMapViewComponent], }) export class ExploreComponent implements OnInit { private _desks = inject(DesksService); diff --git a/apps/workplace/src/app/explore/explore.module.ts b/apps/workplace/src/app/explore/explore.module.ts index 98d505abd8..3d45ad117d 100644 --- a/apps/workplace/src/app/explore/explore.module.ts +++ b/apps/workplace/src/app/explore/explore.module.ts @@ -1,14 +1,9 @@ -import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FormsModule } from '@angular/forms'; import { Route, RouterModule } from '@angular/router'; import { ExploreComponent } from './explore.component'; -import { SharedExploreModule } from '@placeos/explore'; - -import { MAP_FEATURE_DATA } from 'libs/common/src/lib/types'; -import { SharedComponentModule } from '../components/shared.module'; +import { MAP_FEATURE_DATA } from '@placeos/common'; const ROUTES: Route[] = [ { path: '', component: ExploreComponent }, @@ -16,14 +11,8 @@ const ROUTES: Route[] = [ ]; @NgModule({ - declarations: [ExploreComponent], - imports: [ - CommonModule, - RouterModule.forChild(ROUTES), - SharedComponentModule, - SharedExploreModule, - FormsModule, - ], + declarations: [], + imports: [ExploreComponent, RouterModule.forChild(ROUTES)], providers: [{ provide: MAP_FEATURE_DATA, useValue: {} }], }) export class ExploreModule {} diff --git a/apps/workplace/src/app/landing/landing-availability.component.ts b/apps/workplace/src/app/landing/landing-availability.component.ts index eec1e10c8e..6f05ec8c9b 100644 --- a/apps/workplace/src/app/landing/landing-availability.component.ts +++ b/apps/workplace/src/app/landing/landing-availability.component.ts @@ -1,7 +1,16 @@ +import { CommonModule } from '@angular/common'; import { Component, inject } from '@angular/core'; -import { Space } from '@placeos/events'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { RouterModule } from '@angular/router'; +import { settingSignal, Space } from '@placeos/common'; +import { + BuildingPipe, + IconComponent, + LevelPipe, + TranslatePipe, +} from '@placeos/components'; +import { SpacePipe } from '@placeos/events'; import { ExploreSpacesService } from '@placeos/explore'; -import { settingSignal } from 'libs/common/src/lib/settings.service'; import { LandingStateService } from './landing-state.service'; @Component({ @@ -31,7 +40,7 @@ import { LandingStateService } from './landing-state.service'; @@ -128,7 +140,7 @@ import { LandingStateService } from './landing-state.service'; /> } -
+
@@ -141,9 +153,9 @@ import { LandingStateService } from './landing-state.service'; >place @let level = space.zones | level; - {{ - level?.display_name || level?.name - }} +
+ {{ level?.display_name || level?.name }} +
@@ -168,7 +180,16 @@ import { LandingStateService } from './landing-state.service'; `, ], providers: [ExploreSpacesService], - standalone: false, + imports: [ + CommonModule, + TranslatePipe, + LevelPipe, + BuildingPipe, + SpacePipe, + MatProgressSpinnerModule, + RouterModule, + IconComponent, + ], }) export class LandingAvailabilityComponent { private _state = inject(LandingStateService); diff --git a/apps/workplace/src/app/landing/landing-colleagues.component.ts b/apps/workplace/src/app/landing/landing-colleagues.component.ts index 9b9a4d70c0..b35b8e8a9e 100644 --- a/apps/workplace/src/app/landing/landing-colleagues.component.ts +++ b/apps/workplace/src/app/landing/landing-colleagues.component.ts @@ -1,13 +1,23 @@ +import { CommonModule } from '@angular/common'; import { Component, ElementRef, inject, viewChild } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { MatRippleModule } from '@angular/material/core'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { Router } from '@angular/router'; import { AsyncHandler, i18n, notifySuccess, SettingsService, + User, } from '@placeos/common'; +import { + IconComponent, + TranslatePipe, + UserAvatarComponent, +} from '@placeos/components'; import { EventFormService } from '@placeos/events'; -import { User } from '@placeos/users'; import { combineLatest } from 'rxjs'; import { map } from 'rxjs/operators'; import { LandingStateService } from './landing-state.service'; @@ -217,7 +227,16 @@ import { LandingStateService } from './landing-state.service'; } `, ], - standalone: false, + imports: [ + CommonModule, + TranslatePipe, + IconComponent, + MatRippleModule, + MatProgressSpinnerModule, + UserAvatarComponent, + FormsModule, + MatMenuModule, + ], }) export class LandingColleaguesComponent extends AsyncHandler { private _state = inject(LandingStateService); diff --git a/apps/workplace/src/app/landing/landing-favourites.component.ts b/apps/workplace/src/app/landing/landing-favourites.component.ts index fbab40a764..fb6bcdaafe 100644 --- a/apps/workplace/src/app/landing/landing-favourites.component.ts +++ b/apps/workplace/src/app/landing/landing-favourites.component.ts @@ -3,19 +3,27 @@ import { Router } from '@angular/router'; import { BehaviorSubject, combineLatest, lastValueFrom } from 'rxjs'; import { map, shareReplay, tap } from 'rxjs/operators'; +import { BookingFormService, FAV_PARKING_KEY } from '@placeos/bookings'; import { - BookingFormService, + AsyncHandler, BookingType, - FAV_PARKING_KEY, -} from '@placeos/bookings'; -import { AsyncHandler, SettingsService } from '@placeos/common'; -import { EventFormService, Space } from '@placeos/events'; -import { OrganisationService } from '@placeos/organisation'; + OrganisationService, + SettingsService, + Space, +} from '@placeos/common'; +import { EventFormService } from '@placeos/events'; import { showMetadata } from '@placeos/ts-client'; -import { FAV_DESK_KEY } from 'libs/bookings/src/lib/desk-select-modal/desk-select-modal.component'; -import { FAV_LOCKER_KEY } from 'libs/bookings/src/lib/locker-select-modal/locker-select-modal.component'; -import { SpacePipe } from 'libs/events/src/lib/space.pipe'; +import { CommonModule } from '@angular/common'; +import { MatRippleModule } from '@angular/material/core'; +import { MatMenuModule } from '@angular/material/menu'; +import { FAV_DESK_KEY, FAV_LOCKER_KEY } from '@placeos/bookings'; +import { + AuthenticatedImageDirective, + IconComponent, + TranslatePipe, +} from '@placeos/components'; +import { SpacePipe } from '@placeos/events'; const EMPTY = []; @@ -272,7 +280,14 @@ const EMPTY = []; `, ], providers: [SpacePipe], - standalone: false, + imports: [ + CommonModule, + TranslatePipe, + IconComponent, + MatRippleModule, + MatMenuModule, + AuthenticatedImageDirective, + ], }) export class LandingFavouritesComponent extends AsyncHandler implements OnInit { private _org = inject(OrganisationService); diff --git a/apps/workplace/src/app/landing/landing-quick-book.component.ts b/apps/workplace/src/app/landing/landing-quick-book.component.ts index ce22109b57..ceb2a8c64d 100644 --- a/apps/workplace/src/app/landing/landing-quick-book.component.ts +++ b/apps/workplace/src/app/landing/landing-quick-book.component.ts @@ -1,8 +1,15 @@ import { Component, inject, signal } from '@angular/core'; +import { MatRippleModule } from '@angular/material/core'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { Router } from '@angular/router'; import { BookingFormService } from '@placeos/bookings'; -import { nextValueFrom, notifyError, SettingsService } from '@placeos/common'; -import { settingSignal } from 'libs/common/src/lib/settings.service'; +import { + nextValueFrom, + notifyError, + settingSignal, + SettingsService, +} from '@placeos/common'; +import { TranslatePipe } from '@placeos/components'; @Component({ selector: 'landing-quick-book', @@ -74,7 +81,7 @@ import { settingSignal } from 'libs/common/src/lib/settings.service';
`, styles: [``], - standalone: false, + imports: [TranslatePipe, MatRippleModule, MatProgressSpinnerModule], }) export class LandingQuickBookComponent { private _settings = inject(SettingsService); diff --git a/apps/workplace/src/app/landing/landing-quick-links.component.ts b/apps/workplace/src/app/landing/landing-quick-links.component.ts index 0316e87cc6..8c6d7cd83b 100644 --- a/apps/workplace/src/app/landing/landing-quick-links.component.ts +++ b/apps/workplace/src/app/landing/landing-quick-links.component.ts @@ -1,5 +1,8 @@ import { Component } from '@angular/core'; -import { settingSignal } from 'libs/common/src/lib/settings.service'; +import { MatRippleModule } from '@angular/material/core'; +import { RouterModule } from '@angular/router'; +import { settingSignal } from '@placeos/common'; +import { TranslatePipe } from '@placeos/components'; @Component({ selector: 'landing-quick-links', @@ -89,8 +92,8 @@ import { settingSignal } from 'libs/common/src/lib/settings.service'; `, styles: [``], - standalone: false, + imports: [TranslatePipe, MatRippleModule, RouterModule], }) export class LandingQuickLinksComponent { - public readonly features = settingSignal('features'); + public readonly features = settingSignal('features', []); } diff --git a/apps/workplace/src/app/landing/landing-state.service.ts b/apps/workplace/src/app/landing/landing-state.service.ts index 8e03a65749..20ea36f9d1 100644 --- a/apps/workplace/src/app/landing/landing-state.service.ts +++ b/apps/workplace/src/app/landing/landing-state.service.ts @@ -29,18 +29,20 @@ import { import { AsyncHandler, BookingRuleset, + BuildingLevel, currentUser, filterResourcesFromRules, firstTruthyValueFrom, HashMap, + OrganisationService, SettingsService, + StaffUser, unique, + User, } from '@placeos/common'; -import { requestSpacesForZone } from '@placeos/events'; -import { BuildingLevel, OrganisationService } from '@placeos/organisation'; -import { searchStaff, StaffUser, User } from '@placeos/users'; +import { CalendarService, requestSpacesForZone } from '@placeos/events'; +import { searchStaff } from '@placeos/users'; import { isSameDay } from 'date-fns'; -import { CalendarService } from 'libs/common/src/lib/calendar.service'; import { ScheduleStateService } from '../schedule/schedule-state.service'; export interface LandingOptions { diff --git a/apps/workplace/src/app/landing/landing-upcoming.component.ts b/apps/workplace/src/app/landing/landing-upcoming.component.ts index 5e5ce4e604..7ea66f0712 100644 --- a/apps/workplace/src/app/landing/landing-upcoming.component.ts +++ b/apps/workplace/src/app/landing/landing-upcoming.component.ts @@ -1,28 +1,31 @@ +import { CommonModule } from '@angular/common'; import { Component, inject, OnDestroy, OnInit } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; -import { Router } from '@angular/router'; +import { Router, RouterModule } from '@angular/router'; import { - Booking, + BookingCardComponent, BookingFormService, checkinBooking, removeBooking, } from '@placeos/bookings'; import { AsyncHandler, + Booking, + CalendarEvent, currentUser, i18n, notifyError, notifySuccess, SettingsService, } from '@placeos/common'; +import { openConfirmModal, TranslatePipe } from '@placeos/components'; import { - CalendarEvent, + EventCardComponent, EventFormService, queryEvents, removeEvent, } from '@placeos/events'; import { format } from 'date-fns'; -import { openConfirmModal } from 'libs/components/src/lib/confirm-modal.component'; import { lastValueFrom } from 'rxjs'; import { LandingStateService } from './landing-state.service'; @@ -90,7 +93,13 @@ import { LandingStateService } from './landing-state.service'; `, styles: [``], - standalone: false, + imports: [ + CommonModule, + RouterModule, + EventCardComponent, + BookingCardComponent, + TranslatePipe, + ], }) export class LandingUpcomingComponent extends AsyncHandler diff --git a/apps/workplace/src/app/landing/landing.component.ts b/apps/workplace/src/app/landing/landing.component.ts index 4f6d400257..5416bbd4c5 100644 --- a/apps/workplace/src/app/landing/landing.component.ts +++ b/apps/workplace/src/app/landing/landing.component.ts @@ -1,9 +1,25 @@ +import { CommonModule } from '@angular/common'; import { Component, computed, inject, OnInit, signal } from '@angular/core'; -import { AsyncHandler, SettingsService, userSignal } from '@placeos/common'; -import { Building, OrganisationService } from '@placeos/organisation'; +import { MatRippleModule } from '@angular/material/core'; +import { + AsyncHandler, + Building, + OrganisationService, + settingSignal, + SettingsService, + userSignal, +} from '@placeos/common'; +import { IconComponent, TranslatePipe } from '@placeos/components'; import { startOfMinute } from 'date-fns'; -import { settingSignal } from 'libs/common/src/lib/settings.service'; import { debounceTime } from 'rxjs'; +import { FooterMenuComponent } from '../components/footer-menu.component'; +import { TopbarComponent } from '../components/topbar.component'; +import { LandingAvailabilityComponent } from './landing-availability.component'; +import { LandingColleaguesComponent } from './landing-colleagues.component'; +import { LandingFavouritesComponent } from './landing-favourites.component'; +import { LandingQuickBookComponent } from './landing-quick-book.component'; +import { LandingQuickLinksComponent } from './landing-quick-links.component'; +import { LandingUpcomingComponent } from './landing-upcoming.component'; @Component({ selector: 'app-landing', @@ -126,7 +142,20 @@ import { debounceTime } from 'rxjs'; } `, ], - standalone: false, + imports: [ + CommonModule, + TopbarComponent, + FooterMenuComponent, + MatRippleModule, + TranslatePipe, + IconComponent, + LandingColleaguesComponent, + LandingFavouritesComponent, + LandingQuickLinksComponent, + LandingQuickBookComponent, + LandingAvailabilityComponent, + LandingUpcomingComponent, + ], }) export class LandingComponent extends AsyncHandler implements OnInit { private _org = inject(OrganisationService); diff --git a/apps/workplace/src/app/landing/landing.module.ts b/apps/workplace/src/app/landing/landing.module.ts index 75772b6441..cf84d2fedb 100644 --- a/apps/workplace/src/app/landing/landing.module.ts +++ b/apps/workplace/src/app/landing/landing.module.ts @@ -1,36 +1,12 @@ -import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FormsModule } from '@angular/forms'; import { RouterModule } from '@angular/router'; -import { SharedComponentModule } from '../components/shared.module'; -import { LandingAvailabilityComponent } from './landing-availability.component'; -import { LandingColleaguesComponent } from './landing-colleagues.component'; -import { LandingFavouritesComponent } from './landing-favourites.component'; -import { LandingQuickBookComponent } from './landing-quick-book.component'; -import { LandingQuickLinksComponent } from './landing-quick-links.component'; -import { LandingUpcomingComponent } from './landing-upcoming.component'; import { LandingComponent } from './landing.component'; -const COMPONENTS = [ - LandingComponent, - LandingColleaguesComponent, - LandingAvailabilityComponent, - LandingUpcomingComponent, - LandingFavouritesComponent, - LandingQuickLinksComponent, - LandingQuickBookComponent, -]; - const ROUTES = [{ path: '', component: LandingComponent }]; @NgModule({ - declarations: [...COMPONENTS], - imports: [ - CommonModule, - SharedComponentModule, - FormsModule, - RouterModule.forChild(ROUTES), - ], + declarations: [], + imports: [LandingComponent, RouterModule.forChild(ROUTES)], }) export class AppLandingModule {} diff --git a/apps/workplace/src/app/overlays/overlays.module.ts b/apps/workplace/src/app/overlays/overlays.module.ts deleted file mode 100644 index 26153755ac..0000000000 --- a/apps/workplace/src/app/overlays/overlays.module.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule, Type } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; - -import { SharedComponentModule } from '../components/shared.module'; -import { UserAvailabilityModalComponent } from './user-availability-modal/user-availability.modal.component'; -import { ViewAttendeesModalComponent } from './view-attendees-modal/view-attendees-modal.component'; -import { ViewCateringModalComponent } from './view-catering-modal/view-catering-modal.component'; - -const OVERLAYS: Type[] = [ - ViewAttendeesModalComponent, - ViewCateringModalComponent, - UserAvailabilityModalComponent, -]; - -@NgModule({ - declarations: [...OVERLAYS], - imports: [ - CommonModule, - FormsModule, - ReactiveFormsModule, - SharedComponentModule, - ], - exports: [...OVERLAYS], -}) -export class SharedOverlaysModule {} diff --git a/apps/workplace/src/app/overlays/user-availability-modal/user-availability.modal.component.html b/apps/workplace/src/app/overlays/user-availability-modal/user-availability.modal.component.html deleted file mode 100644 index 6bc5f64100..0000000000 --- a/apps/workplace/src/app/overlays/user-availability-modal/user-availability.modal.component.html +++ /dev/null @@ -1,56 +0,0 @@ -
-
Attendees Availability
- -
- -
-
- -
- @if (!loading) { -
- -
-
- -
- } @else { -
- -
- } -
-
- -
- - -
-
diff --git a/apps/workplace/src/app/overlays/user-availability-modal/user-availability.modal.component.scss b/apps/workplace/src/app/overlays/user-availability-modal/user-availability.modal.component.scss deleted file mode 100644 index 5e5bbaf327..0000000000 --- a/apps/workplace/src/app/overlays/user-availability-modal/user-availability.modal.component.scss +++ /dev/null @@ -1,30 +0,0 @@ - -.heading { - flex: 1; - text-align: center; -} - -.not-mobile { - @media screen and (max-width: 639px) { - display: none; - } -} - -.mobile-only { - @media screen and (min-width: 640px) { - display: none; - } -} - -.date { - display: flex; - justify-content: center; - margin-bottom: 1em; -} - -.spinner { - display: flex; - justify-content: center; - width: 100%; - height: 3em; -} diff --git a/apps/workplace/src/app/overlays/user-availability-modal/user-availability.modal.component.ts b/apps/workplace/src/app/overlays/user-availability-modal/user-availability.modal.component.ts deleted file mode 100644 index 5eb4c4fc32..0000000000 --- a/apps/workplace/src/app/overlays/user-availability-modal/user-availability.modal.component.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { Component, OnInit, inject, output } from '@angular/core'; -import { MAT_DIALOG_DATA } from '@angular/material/dialog'; -import { endOfDay, getUnixTime, isBefore, set, startOfDay } from 'date-fns'; -import { BehaviorSubject } from 'rxjs'; -import { debounceTime, switchMap } from 'rxjs/operators'; - -import { AsyncHandler, DialogEvent } from '@placeos/common'; -import { StaffUser } from '@placeos/users'; -import { ITimelineEventGroup } from '../../components/event-timeline/event-timeline.component'; - -import { queryEvents } from '@placeos/events'; - -@Component({ - selector: 'app-user-availability-modal', - templateUrl: './user-availability.modal.component.html', - styleUrls: ['./user-availability.modal.component.scss'], - standalone: false, -}) -export class UserAvailabilityModalComponent - extends AsyncHandler - implements OnInit -{ - private _data = inject(MAT_DIALOG_DATA); - - /** Emitter for user action on the modal */ - public readonly event = output(); - /** List of Users to check availability */ - public users: StaffUser[]; - /** Whether the users events are being loaded */ - public loading: boolean; - /** Selected date in unix ms */ - public date: number = new Date().valueOf(); - /** Groups */ - public groups: ITimelineEventGroup[]; - /** Duration */ - public duration: number; - /** Date subject */ - public date$ = new BehaviorSubject(this.date); - - public ngOnInit(): void { - this.users = this._data.users; - this.date = this._data.date; - this.duration = this._data.duration; - this.loadAvailability(); - this.date$ - .pipe( - debounceTime(500), - switchMap(() => this.loadAvailability()), - ) - .subscribe((res) => (this.groups = res)); - } - - /** Load events for all attendees */ - public async loadAvailability() { - this.loading = true; - const period_start = getUnixTime(startOfDay(this.date)); - const period_end = getUnixTime(endOfDay(this.date)); - const result: any[] = await Promise.all( - this.users.map(async (user) => { - if (!user.email) return []; - return { - name: user.name, - events: await queryEvents({ - period_start, - period_end, - calendars: user.email, - }) - .toPromise() - .then((res) => - res.map((i) => ({ - start: new Date(i.date).getHours(), - duration: i.duration, - })), - ) - .catch((err) => []), - }; - }), - ); - this.loading = false; - return result; - } - - /** Change date keeping hours and minutes */ - public changeDate(new_date: number) { - const date = new Date(this.date); - this.date = set(new_date, { - hours: date.getHours(), - minutes: date.getMinutes(), - }).valueOf(); - this.date$.next(this.date); - } - - /** Whether date is in the past */ - public get is_past(): boolean { - return isBefore(this.date, Date.now()); - } - - public save() { - if (this.is_past) { - return; - } - this.event.emit({ - reason: 'done', - metadata: { date: this.date, duration: this.duration }, - }); - } -} diff --git a/apps/workplace/src/app/overlays/view-attendees-modal/view-attendees-modal.component.html b/apps/workplace/src/app/overlays/view-attendees-modal/view-attendees-modal.component.html deleted file mode 100644 index b51a339342..0000000000 --- a/apps/workplace/src/app/overlays/view-attendees-modal/view-attendees-modal.component.html +++ /dev/null @@ -1,32 +0,0 @@ -
- -

Attendees

-
- -
- @for (item of attendees; track item) { -
- - - {{ item.email }} -
- } -
-
- -
- -
-
diff --git a/apps/workplace/src/app/overlays/view-attendees-modal/view-attendees-modal.component.scss b/apps/workplace/src/app/overlays/view-attendees-modal/view-attendees-modal.component.scss deleted file mode 100644 index 8f7c7158d3..0000000000 --- a/apps/workplace/src/app/overlays/view-attendees-modal/view-attendees-modal.component.scss +++ /dev/null @@ -1,26 +0,0 @@ -.body { - display: flex; - flex-direction: column; - row-gap: 0.5em; - - div { - display: grid; - grid-template-columns: 3em 1fr; - grid-template-rows: 1fr 1fr; - grid-template-areas: 'icon name' 'icon email'; - margin-bottom: 0.5em; - align-items: center; - - icon { - margin: auto; - grid-area: icon; - font-size: 2em; - } - label { - grid-area: name; - } - a { - grid-area: email; - } - } -} diff --git a/apps/workplace/src/app/overlays/view-attendees-modal/view-attendees-modal.component.ts b/apps/workplace/src/app/overlays/view-attendees-modal/view-attendees-modal.component.ts deleted file mode 100644 index ceda026f86..0000000000 --- a/apps/workplace/src/app/overlays/view-attendees-modal/view-attendees-modal.component.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Component, OnChanges, OnInit, inject } from '@angular/core'; -import { MAT_DIALOG_DATA } from '@angular/material/dialog'; - -import { AsyncHandler } from '@placeos/common'; -import { User } from '@placeos/users'; - -@Component({ - selector: 'schedule-view-attendees', - templateUrl: './view-attendees-modal.component.html', - styleUrls: ['./view-attendees-modal.component.scss'], - standalone: false, -}) -export class ViewAttendeesModalComponent - extends AsyncHandler - implements OnChanges, OnInit -{ - private _data = inject<{ - attendees: User[]; - }>(MAT_DIALOG_DATA); - - public attendees: User[]; - - public ngOnChanges() {} - - public ngOnInit() { - this.attendees = this._data.attendees; - } -} diff --git a/apps/workplace/src/app/overlays/view-catering-modal/view-catering-modal.component.html b/apps/workplace/src/app/overlays/view-catering-modal/view-catering-modal.component.html deleted file mode 100644 index 6252f2b594..0000000000 --- a/apps/workplace/src/app/overlays/view-catering-modal/view-catering-modal.component.html +++ /dev/null @@ -1,26 +0,0 @@ -
- room_service -

Catering

-
-
- Item - Quantity - @for (item of catering; track item) { - - - } - Total Items - {{ catering_items_total }} - Note: -
- {{ catering_note }} -
-
-
- - -
diff --git a/apps/workplace/src/app/overlays/view-catering-modal/view-catering-modal.component.scss b/apps/workplace/src/app/overlays/view-catering-modal/view-catering-modal.component.scss deleted file mode 100644 index a90bc7d114..0000000000 --- a/apps/workplace/src/app/overlays/view-catering-modal/view-catering-modal.component.scss +++ /dev/null @@ -1,19 +0,0 @@ -.body { - display: grid; - grid-template-columns: 1fr 1fr; - row-gap: 0.5em; - - .note-box, - .note-label { - grid-column: 1/-1; - } - - .note-label { - margin-top: 0.5em; - } - - .qty, .total { - text-align: right; - } - -} diff --git a/apps/workplace/src/app/overlays/view-catering-modal/view-catering-modal.component.ts b/apps/workplace/src/app/overlays/view-catering-modal/view-catering-modal.component.ts deleted file mode 100644 index 2d978cf6c3..0000000000 --- a/apps/workplace/src/app/overlays/view-catering-modal/view-catering-modal.component.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Component, OnInit, inject } from '@angular/core'; -import { MAT_DIALOG_DATA, MatDialog } from '@angular/material/dialog'; -import { Router } from '@angular/router'; - -import { CateringItem } from '@placeos/catering'; -import { AsyncHandler } from '@placeos/common'; - -@Component({ - selector: 'view-catering-modal', - templateUrl: './view-catering-modal.component.html', - styleUrls: ['./view-catering-modal.component.scss'], - standalone: false, -}) -export class ViewCateringModalComponent extends AsyncHandler implements OnInit { - private _data = inject<{ - catering: CateringItem[]; - catering_note: string; - }>(MAT_DIALOG_DATA); - private _router = inject(Router); - private _dialog = inject(MatDialog); - - public catering: CateringItem[]; - public catering_note: string; - public catering_items_total = 0; - - public ngOnInit() { - const data = this._data; - - if (data) { - this.catering = this._data.catering; - this.catering_note = this._data.catering_note; - this.catering_items_total = this.catering.reduce( - (total, item) => item.quantity + total, - 0, - ); - } - } - - /** - * TODO: this makes no sense. catering is not a route to be accessed like this - */ - public edit() { - this._dialog.closeAll(); - this._router.navigate(['/catering/']); - } -} diff --git a/apps/workplace/src/app/schedule/schedule-filter-card.component.ts b/apps/workplace/src/app/schedule/schedule-filter-card.component.ts index 7c21aa982b..0dbf1c0591 100644 --- a/apps/workplace/src/app/schedule/schedule-filter-card.component.ts +++ b/apps/workplace/src/app/schedule/schedule-filter-card.component.ts @@ -1,6 +1,11 @@ +import { CommonModule } from '@angular/common'; import { Component, inject } from '@angular/core'; +import { FormsModule } from '@angular/forms'; import { MatBottomSheetRef } from '@angular/material/bottom-sheet'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatRippleModule } from '@angular/material/core'; import { SettingsService } from '@placeos/common'; +import { IconComponent, TranslatePipe } from '@placeos/components'; import { ScheduleStateService } from './schedule-state.service'; @Component({ @@ -214,7 +219,14 @@ import { ScheduleStateService } from './schedule-state.service'; } `, ], - standalone: false, + imports: [ + CommonModule, + TranslatePipe, + IconComponent, + MatCheckboxModule, + FormsModule, + MatRippleModule, + ], }) export class ScheduleFilterCardComponent { private _state = inject(ScheduleStateService); diff --git a/apps/workplace/src/app/schedule/schedule-filters.component.ts b/apps/workplace/src/app/schedule/schedule-filters.component.ts index 0fa0a06c1c..03c028a4b2 100644 --- a/apps/workplace/src/app/schedule/schedule-filters.component.ts +++ b/apps/workplace/src/app/schedule/schedule-filters.component.ts @@ -1,6 +1,9 @@ +import { CommonModule } from '@angular/common'; import { Component, inject } from '@angular/core'; import { MatBottomSheet } from '@angular/material/bottom-sheet'; +import { MatRippleModule } from '@angular/material/core'; import { SettingsService } from '@placeos/common'; +import { IconComponent, TranslatePipe } from '@placeos/components'; import { ScheduleFilterCardComponent } from './schedule-filter-card.component'; import { ScheduleStateService } from './schedule-state.service'; @@ -28,6 +31,7 @@ import { ScheduleStateService } from './schedule-state.service';