diff --git a/angular.json b/angular.json
index af75ae1..ebda60c 100644
--- a/angular.json
+++ b/angular.json
@@ -91,7 +91,10 @@
"buildTarget": "hermes-web-angular:build:development"
}
},
- "defaultConfiguration": "development"
+ "defaultConfiguration": "development",
+ "options": {
+ "allowedHosts": ["*"]
+ }
},
"extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n"
diff --git a/package.json b/package.json
index 4e0b140..7bc7710 100644
--- a/package.json
+++ b/package.json
@@ -30,7 +30,6 @@
"rxjs-websockets": "^9.0.0",
"tslib": "^2.3.0",
"uuidv4": "^6.2.13",
- "vite": "^6.2.3",
"zone.js": "~0.15.0"
},
"devDependencies": {
diff --git a/src/app/actions/action-item-edit/action-item-edit.component.html b/src/app/actions/action-item-edit/action-item-edit.component.html
index bb3c0e7..4f800df 100644
--- a/src/app/actions/action-item-edit/action-item-edit.component.html
+++ b/src/app/actions/action-item-edit/action-item-edit.component.html
@@ -1,4 +1,4 @@
-
+
@@ -108,19 +108,26 @@
}
-
+
@if (!isNew) {
-
+
}
-
-
+
+ (click)="save()">
+ saveSave
+
@if (responseError) {
@@ -129,4 +136,4 @@
}
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/src/app/actions/action-item-edit/action-item-edit.component.scss b/src/app/actions/action-item-edit/action-item-edit.component.scss
index 3af1978..5fdd328 100644
--- a/src/app/actions/action-item-edit/action-item-edit.component.scss
+++ b/src/app/actions/action-item-edit/action-item-edit.component.scss
@@ -9,12 +9,6 @@
margin: 0;
}
-.actions {
- display: flex;
- flex-direction: row;
- justify-content: center;
-}
-
.delete {
background-color: #ea5151;
color: #ba1a1a;
diff --git a/src/app/actions/action-item-edit/action-item-edit.component.ts b/src/app/actions/action-item-edit/action-item-edit.component.ts
index 7e390fa..8a09d95 100644
--- a/src/app/actions/action-item-edit/action-item-edit.component.ts
+++ b/src/app/actions/action-item-edit/action-item-edit.component.ts
@@ -9,17 +9,19 @@ import { MatInputModule } from '@angular/material/input';
import { MatSelectModule } from '@angular/material/select';
import { createItemExistsInArrayValidator } from '../../shared/validators/item-exists-in-array';
import { HermesClientService } from '../../hermes-client.service';
+import { MatIconModule } from '@angular/material/icon';
@Component({
selector: 'action-item-edit',
imports: [
- ReactiveFormsModule,
MatButtonModule,
MatCardModule,
MatDialogModule,
MatFormFieldModule,
+ MatIconModule,
MatInputModule,
- MatSelectModule
+ MatSelectModule,
+ ReactiveFormsModule,
],
templateUrl: './action-item-edit.component.html',
styleUrl: './action-item-edit.component.scss'
diff --git a/src/app/actions/action-list/action-list.component.scss b/src/app/actions/action-list/action-list.component.scss
index 894a345..2d41734 100644
--- a/src/app/actions/action-list/action-list.component.scss
+++ b/src/app/actions/action-list/action-list.component.scss
@@ -1,3 +1,5 @@
+@use '@angular/material' as mat;
+
main {
display: grid;
grid-template-columns: repeat(1, 1fr);
@@ -15,7 +17,7 @@ main {
border: 1px solid grey;
padding: 1em;
cursor: pointer;
- background-color: white;
+ background-color: transparent;
& span {
display: block;
@@ -27,7 +29,6 @@ main {
& .subtitle {
font-size: smaller;
- color: lightgrey;
}
}
}
diff --git a/src/app/actions/action-list/action-list.component.theme.scss b/src/app/actions/action-list/action-list.component.theme.scss
new file mode 100644
index 0000000..e69de29
diff --git a/src/app/actions/action-list/action-list.component.ts b/src/app/actions/action-list/action-list.component.ts
index 87bc474..4f23e80 100644
--- a/src/app/actions/action-list/action-list.component.ts
+++ b/src/app/actions/action-list/action-list.component.ts
@@ -7,19 +7,28 @@ import { MatIconModule } from '@angular/material/icon';
import { MatDialog } from '@angular/material/dialog';
import { ActionItemEditComponent } from '../action-item-edit/action-item-edit.component';
import { HermesClientService } from '../../hermes-client.service';
+import { MatSelectModule } from '@angular/material/select';
@Component({
selector: 'action-list',
standalone: true,
- imports: [MatButtonModule, MatFormFieldModule, MatIconModule, MatListModule],
+ imports: [
+ MatButtonModule,
+ MatFormFieldModule,
+ MatIconModule,
+ MatListModule,
+ MatSelectModule,
+ ],
templateUrl: './action-list.component.html',
styleUrl: './action-list.component.scss'
})
export class ActionListComponent {
@Input() actions: RedeemableAction[] = []
@Output() actionsChange = new EventEmitter();
+
readonly dialog = inject(MatDialog);
readonly client = inject(HermesClientService);
+
opened = false;
create(): void {
diff --git a/src/app/actions/actions/actions.component.html b/src/app/actions/actions/actions.component.html
index 36d1266..1cee6b4 100644
--- a/src/app/actions/actions/actions.component.html
+++ b/src/app/actions/actions/actions.component.html
@@ -1,4 +1,4 @@
-
+
Redeemable Actions
@@ -31,4 +31,4 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/src/app/actions/actions/actions.component.theme.scss b/src/app/actions/actions/actions.component.theme.scss
new file mode 100644
index 0000000..e69de29
diff --git a/src/app/actions/actions/actions.component.ts b/src/app/actions/actions/actions.component.ts
index 7d9d008..dbd4a7f 100644
--- a/src/app/actions/actions/actions.component.ts
+++ b/src/app/actions/actions/actions.component.ts
@@ -1,4 +1,4 @@
-import { Component, inject, OnInit } from '@angular/core';
+import { Component, Inject, inject, OnInit } from '@angular/core';
import { ActionListComponent } from "../action-list/action-list.component";
import { MatSelectModule } from '@angular/material/select';
import { MatFormFieldModule } from '@angular/material/form-field';
@@ -9,6 +9,8 @@ import RedeemableAction from '../../shared/models/redeemable-action';
import { FormControl, ReactiveFormsModule } from '@angular/forms';
import { ActivatedRoute } from '@angular/router';
import RedeemableActionService from '../../shared/services/redeemable-action.service';
+import { MatButtonModule } from '@angular/material/button';
+import { DOCUMENT } from '@angular/common';
interface IActionFilter {
name: string
@@ -17,14 +19,15 @@ interface IActionFilter {
@Component({
selector: 'actions',
- standalone: true,
imports: [
ActionListComponent,
- ReactiveFormsModule,
+ MatButtonModule,
MatFormFieldModule,
MatIconModule,
MatInputModule,
- MatSelectModule
+ MatSelectModule,
+ ReactiveFormsModule,
+ ReactiveFormsModule,
],
templateUrl: './actions.component.html',
styleUrl: './actions.component.scss'
@@ -43,11 +46,15 @@ export class ActionsComponent implements OnInit {
private readonly client = inject(HermesClientService);
private readonly redeemableActionService = inject(RedeemableActionService);
private readonly route = inject(ActivatedRoute);
+
filter = this.filters[0];
searchControl = new FormControl('');
search = '';
items: RedeemableAction[] = [];
+ constructor(@Inject(DOCUMENT) private document: Document) { }
+
+
ngOnInit(): void {
this.route.data.subscribe(data => {
if (!data['redeemableActions'])
diff --git a/src/app/app.component.ts b/src/app/app.component.ts
index d4d24bc..0e36c9a 100644
--- a/src/app/app.component.ts
+++ b/src/app/app.component.ts
@@ -1,5 +1,5 @@
import { isPlatformBrowser } from '@angular/common';
-import { Component, OnInit, Inject, PLATFORM_ID, NgZone, OnDestroy, inject } from '@angular/core';
+import { Component, OnInit, Inject, PLATFORM_ID, NgZone, OnDestroy, inject, HostBinding } from '@angular/core';
import { ActivatedRoute, Router, RouterOutlet } from '@angular/router';
import { HermesClientService } from './hermes-client.service';
import { AuthUserGuard } from './shared/auth/auth.user.guard'
@@ -10,23 +10,42 @@ import { ApiAuthenticationService } from './shared/services/api/api-authenticati
import { AuthModule } from './auth/auth.module';
import { ApiKeyService } from './shared/services/api/api-key.service';
import ApiKey from './shared/models/api-key';
+import { ThemeService } from './shared/services/theme.service';
+import { OverlayContainer } from '@angular/cdk/overlay';
@Component({
selector: 'app-root',
standalone: true,
- imports: [RouterOutlet, AuthModule, NavigationComponent],
+ imports: [
+ RouterOutlet,
+ AuthModule,
+ NavigationComponent
+ ],
providers: [AuthUserGuard],
templateUrl: './app.component.html',
styleUrl: './app.component.scss'
})
export class AppComponent implements OnInit, OnDestroy {
private readonly keyService = inject(ApiKeyService);
+ private readonly overlayContainer = inject(OverlayContainer);
+ private readonly themeService = inject(ThemeService);
private isBrowser: boolean;
private ngZone: NgZone;
private subscriptions: Subscription[];
+ @HostBinding('class.dark-theme')
+ get isDarkTheme() {
+ return this.themeService.isDarkTheme();
+ }
+
+ @HostBinding('class.light-theme')
+ get isLightTheme() {
+ return this.themeService.isLightTheme();
+ }
+
+
constructor(private auth: ApiAuthenticationService, private client: HermesClientService, private events: EventService, private router: Router, ngZone: NgZone, @Inject(PLATFORM_ID) private platformId: Object) {
this.ngZone = ngZone;
this.isBrowser = isPlatformBrowser(this.platformId);
@@ -80,6 +99,8 @@ export class AppComponent implements OnInit, OnDestroy {
});
}));
+ this.overlayContainer.getContainerElement().classList.add(this.themeService.theme + '-theme');
+
this.ngZone.runOutsideAngular(() => setInterval(() => this.client.heartbeat(), 15000));
}
diff --git a/src/app/app.config.ts b/src/app/app.config.ts
index 83d3434..3d07852 100644
--- a/src/app/app.config.ts
+++ b/src/app/app.config.ts
@@ -17,6 +17,6 @@ export const appConfig: ApplicationConfig = {
}])
),
provideOAuthClient(),
- provideClientHydration(), provideAnimationsAsync()
+ provideClientHydration(), provideAnimationsAsync(), provideAnimationsAsync()
]
};
\ No newline at end of file
diff --git a/src/app/app.module.ts b/src/app/app.module.ts
new file mode 100644
index 0000000..54e1b98
--- /dev/null
+++ b/src/app/app.module.ts
@@ -0,0 +1,13 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { MatDialogModule } from '@angular/material/dialog';
+import { TtsFiltersModule } from './tts-filters/tts-filters.module';
+
+
+@NgModule({
+ declarations: [],
+ imports: [
+ CommonModule,
+ ]
+})
+export class AppModule { }
diff --git a/src/app/auth/login/login.component.scss b/src/app/auth/login/login.component.scss
index 95dec7b..773d650 100644
--- a/src/app/auth/login/login.component.scss
+++ b/src/app/auth/login/login.component.scss
@@ -18,6 +18,7 @@
.mat-mdc-card-content {
align-self: center;
+ justify-content: space-between;
}
a {
diff --git a/src/app/auth/tts-login/tts-login.component.html b/src/app/auth/tts-login/tts-login.component.html
index 05a01ab..7beae39 100644
--- a/src/app/auth/tts-login/tts-login.component.html
+++ b/src/app/auth/tts-login/tts-login.component.html
@@ -16,7 +16,7 @@
-
+
diff --git a/src/app/auth/user-card/user-card.component.html b/src/app/auth/user-card/user-card.component.html
index fe16d78..4edb800 100644
--- a/src/app/auth/user-card/user-card.component.html
+++ b/src/app/auth/user-card/user-card.component.html
@@ -8,8 +8,7 @@
-
+
@if (isTTSLoggedIn) {