Compare commits

2 Commits

Author SHA1 Message Date
Murat Özkorkmaz
5d029221db Updated menu visibility
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 1m1s
Build and Push Docker Image / deploy (push) Successful in 4s
2025-11-04 17:50:16 +01:00
Murat Özkorkmaz
21a6b7da8c Updated menu visibility 2025-11-04 17:48:26 +01:00
18 changed files with 135 additions and 70 deletions

View File

@@ -57,3 +57,17 @@ Angular CLI does not come with an end-to-end testing framework by default. You c
## Additional Resources ## Additional Resources
For more information on using the Angular CLI, including detailed command references, visit the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page. For more information on using the Angular CLI, including detailed command references, visit the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page.
## Cheat sheet
### Create new component
```bash
ng generate c pages/immo-manager/billing
CREATE src/app/pages/immo-manager/billing/billing.scss (0 bytes)
CREATE src/app/pages/immo-manager/billing/billing.spec.ts (535 bytes)
CREATE src/app/pages/immo-manager/billing/billing.ts (190 bytes)
CREATE src/app/pages/immo-manager/billing/billing.html (22 bytes)
```

View File

@@ -19,35 +19,35 @@ export const appRoutes: Routes = [
children: [ children: [
{ {
path: '', component: Dashboard, path: '', component: Dashboard,
// data: { role: ['admin', 'can-view-dashboard'] }, canActivate: [canActivateAuthRole] // data: { role: ['dev', 'admin', 'can-view-dashboard'] }, canActivate: [canActivateAuthRole]
}, },
{ {
path: 'projects', component: Projects, path: 'projects', component: Projects,
data: { role: ['admin', 'can-view-projects'] }, canActivate: [canActivateAuthRole] data: { role: ['dev', 'admin', 'can-view-projects'] }, canActivate: [canActivateAuthRole]
}, },
{ {
path: 'projects/:id', component: ProjectDetails, path: 'projects/:id', component: ProjectDetails,
data: { role: ['admin', 'can-view-projects'] }, canActivate: [canActivateAuthRole] data: { role: ['dev', 'admin', 'can-view-projects'] }, canActivate: [canActivateAuthRole]
}, },
{ {
path: 'contacts', component: Contacts, path: 'contacts', component: Contacts,
data: { role: ['admin', 'can-view-contacts'] }, canActivate: [canActivateAuthRole] data: { role: ['dev', 'admin', 'can-view-contacts'] }, canActivate: [canActivateAuthRole]
}, },
// admin pages // admin pages
{ {
path: 'properties', component: Properties, path: 'properties', component: Properties,
data: { role: ['admin', 'can-view-properties'] }, canActivate: [canActivateAuthRole] data: { role: ['dev', 'admin', 'can-view-properties'] }, canActivate: [canActivateAuthRole]
}, },
{ {
path: 'properties/:id', component: PropertyDetails, path: 'properties/:id', component: PropertyDetails,
data: { role: ['admin', 'can-view-properties'] }, canActivate: [canActivateAuthRole] data: { role: ['dev', 'admin', 'can-view-properties'] }, canActivate: [canActivateAuthRole]
}, },
{ {
path: 'admin/properties', component: PropertyManager, path: 'admin/properties', component: PropertyManager,
data: { role: ['admin', 'can-manage-properties'] }, canActivate: [canActivateAuthRole] data: { role: ['dev', 'admin', 'can-manage-properties'] }, canActivate: [canActivateAuthRole]
}, },
{ path: 'uikit', loadChildren: () => import('./app/pages/uikit/uikit.routes') }, { path: 'uikit', loadChildren: () => import('./app/pages/uikit/uikit.routes') },

View File

@@ -45,9 +45,24 @@ export class AppMenu {
items: [ items: [
{ label: 'Dashboard', icon: 'pi pi-fw pi-home', routerLink: ['/'] }, { label: 'Dashboard', icon: 'pi pi-fw pi-home', routerLink: ['/'] },
{ label: 'Projekte', icon: 'pi pi-fw pi-list', routerLink: ['/projects'], roles: ['dev', 'admin', 'can-view-projects'] }, { label: 'Projekte', icon: 'pi pi-fw pi-list', routerLink: ['/projects'], roles: ['dev', 'admin', 'can-view-projects'] },
{ label: 'Organisationen', icon: 'pi pi-fw pi-list', routerLink: ['/organizations'], roles: ['dev', 'admin', 'can-view-organizations'] },
{ label: 'Kontakte', icon: 'pi pi-fw pi-id-card', routerLink: ['/contacts'], roles: ['dev', 'admin', 'can-view-contacts'] } { label: 'Kontakte', icon: 'pi pi-fw pi-id-card', routerLink: ['/contacts'], roles: ['dev', 'admin', 'can-view-contacts'] }
] ]
}, },
{
roles: ['dev', 'real_estate_agent'],
label: 'Immo Manager',
items: [
{ label: 'Kontaktverwaltung', icon: 'pi pi-fw pi-list', routerLink: ['/immo-manager/contacts'], roles: ['dev', 'admin', 'can-view-projects'] },
{ label: 'Objektverwaltung', icon: 'pi pi-fw pi-id-card', routerLink: ['/immo-manager/objects'], roles: ['dev', 'admin', 'can-view-contacts'] },
{ label: 'Abrechnungen & Auswertung', icon: 'pi pi-fw pi-id-card', routerLink: ['/immo-manager/billing'], roles: ['dev', 'admin', 'can-view-contacts'] },
{ label: 'Ticketsystem', icon: 'pi pi-fw pi-id-card', routerLink: ['/immo-manager/ticket-system'], roles: ['dev', 'admin', 'can-view-contacts'] },
{ label: 'Buchhaltung & Rechnungswesen', icon: 'pi pi-fw pi-id-card', routerLink: ['/immo-manager/accounting'], roles: ['dev', 'admin', 'can-view-contacts'] },
{ label: 'Effizienz-Features', icon: 'pi pi-fw pi-id-card', routerLink: ['/immo-manager/efficiency-features'], roles: ['dev', 'admin', 'can-view-contacts'] },
{ label: 'Dokumenten-Management-System', icon: 'pi pi-fw pi-id-card', routerLink: ['/immo-manager/dms'], roles: ['dev', 'admin', 'can-view-contacts'] },
{ label: 'Service-Portal', icon: 'pi pi-fw pi-id-card', routerLink: ['/immo-manager/service-portal'], roles: ['dev', 'admin', 'can-view-contacts'] }
]
},
{ {
roles: ['dev', 'admin'], roles: ['dev', 'admin'],
label: 'Admin', label: 'Admin',

View File

@@ -47,9 +47,12 @@ import { Tag } from 'primeng/tag';
@if (keycloak.authenticated) { @if (keycloak.authenticated) {
<p-tag severity="success" value="Authenticated" /> <p-tag severity="success" value="Authenticated" />
@if(keycloak) {
<p-tag severity="info" value="Realm: {{ keycloak.realm }}" />
}
@for (item of keycloak.realmAccess?.roles; track $index) { @for (item of keycloak.realmAccess?.roles; track $index) {
<p-tag severity="info" value="{{ item }}" /> <p-tag severity="warn" value="{{ item }}" />
} }
} }
@if (!keycloak.authenticated) { @if (!keycloak.authenticated) {
@@ -104,17 +107,13 @@ import { Tag } from 'primeng/tag';
@if (loggedIn) { @if (loggedIn) {
<div> <div>
Logged in as <span Logged in as <span
class="font-medium text-surface-900 dark:text-surface-0 block mb-2">{{ firstName }} {{ lastName }}</span> class="font-medium text-surface-900 dark:text-surface-0 block mb-2">{{ firstName }} {{ lastName }} <{{ email }}></span>
</div> </div>
<div> <div>
<p-button icon="pi pi-sign-out" label="Logout" severity="danger" <p-button icon="pi pi-sign-out" label="Logout" severity="danger"
(click)="logout()" /> (click)="logout()" />
</div> </div>
} }
<div>
<span class="font-medium text-surface-900 dark:text-surface-0 block mb-2">Team Members</span>
...
</div>
</div> </div>
</p-popover> </p-popover>
</div> </div>
@@ -130,14 +129,18 @@ export class AppTopbar {
public loggedIn: boolean = false; public loggedIn: boolean = false;
public firstName?: string = 'unknown'; public firstName?: string = 'unknown';
public lastName?: string = 'unknown'; public lastName?: string = 'unknown';
public email?: string = 'unknown';
constructor(public layoutService: LayoutService) { constructor(public layoutService: LayoutService) {
if (this.keycloak.authenticated) { if (this.keycloak.authenticated) {
// console.log('KC', this.keycloak);
this.loggedIn = true; this.loggedIn = true;
this.keycloak.loadUserProfile().then((userProfile) => { this.keycloak.loadUserProfile().then((userProfile) => {
this.firstName = userProfile.firstName; this.firstName = userProfile.firstName;
this.lastName = userProfile.lastName; this.lastName = userProfile.lastName;
this.email = userProfile.email;
}); });
} }
} }

View File

@@ -1,20 +1,20 @@
<div class="flex"> <div class="flex">
<div class="flex-1 text-left"> <div class="flex-1 text-left">
<div class="mb-5"> <div class="mb-5">
<h1 i18n>Contacts</h1> <h1 >Contacts</h1>
<p class="my-4 text-lg text-gray-500">Verwalten Sie Personen und Organisationen in Ihrem Netzwerk</p> <p class="my-4 text-lg text-gray-500">Verwalten Sie Personen und Organisationen in Ihrem Netzwerk</p>
</div> </div>
</div> </div>
<div class="flex-1 text-right"> <div class="flex-1 text-right">
<p-button i18n-label label="Exportieren" class="p-button-outlined"> <p-button label="Exportieren" class="p-button-outlined">
<span class="flex items-center gap-2"> <span class="flex items-center gap-2">
<span class="material-icons !text-base">download</span> <span class="material-icons !text-base">download</span>
</span> </span>
</p-button> </p-button>
<p-button i18n-label label="Kontakt hinzufügen" class="p-button-outlined ml-4"> <p-button label="Kontakt hinzufügen" class="p-button-outlined ml-4">
<span class="flex items-center gap-2"> <span class="flex items-center gap-2">
<span class="material-icons !text-base">person_add</span> <span class="material-icons !text-base">person_add</span>
</span> </span>
@@ -300,7 +300,7 @@
<!-- Content --> <!-- Content -->
<div class="ml-4 flex flex-col"> <div class="ml-4 flex flex-col">
<span class="text-2xl font-bold text-gray-800 leading-none">1</span> <span class="text-2xl font-bold text-gray-800 leading-none">1</span>
<span class="text-sm text-gray-500" i18n>Contacts total</span> <span class="text-sm text-gray-500" >Contacts total</span>
</div> </div>
</div> </div>
</div> </div>
@@ -315,7 +315,7 @@
<!-- Content --> <!-- Content -->
<div class="ml-4 flex flex-col"> <div class="ml-4 flex flex-col">
<span class="text-2xl font-bold text-gray-800 leading-none">0</span> <span class="text-2xl font-bold text-gray-800 leading-none">0</span>
<span class="text-sm text-gray-500" i18n>Persons</span> <span class="text-sm text-gray-500" >Persons</span>
</div> </div>
</div> </div>
</div> </div>
@@ -330,7 +330,7 @@
<!-- Content --> <!-- Content -->
<div class="ml-4 flex flex-col"> <div class="ml-4 flex flex-col">
<span class="text-2xl font-bold text-gray-800 leading-none">0</span> <span class="text-2xl font-bold text-gray-800 leading-none">0</span>
<span class="text-sm text-gray-500" i18n>Organisations</span> <span class="text-sm text-gray-500" >Organisations</span>
</div> </div>
</div> </div>
</div> </div>
@@ -345,7 +345,7 @@
<!-- Content --> <!-- Content -->
<div class="ml-4 flex flex-col"> <div class="ml-4 flex flex-col">
<span class="text-2xl font-bold text-gray-800 leading-none">12</span> <span class="text-2xl font-bold text-gray-800 leading-none">12</span>
<span class="text-sm text-gray-500" i18n>With notes</span> <span class="text-sm text-gray-500" >With notes</span>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -8,14 +8,14 @@ import { MenuModule } from 'primeng/menu';
imports: [ButtonModule, MenuModule], imports: [ButtonModule, MenuModule],
template: `<div class="card"> template: `<div class="card">
<div class="flex items-center justify-between mb-6"> <div class="flex items-center justify-between mb-6">
<div class="font-semibold text-xl" i18n>Letzte Aktivitäten</div> <div class="font-semibold text-xl" >Letzte Aktivitäten</div>
<div> <div>
<button pButton type="button" icon="pi pi-ellipsis-v" class="p-button-rounded p-button-text p-button-plain" (click)="menu.toggle($event)"></button> <button pButton type="button" icon="pi pi-ellipsis-v" class="p-button-rounded p-button-text p-button-plain" (click)="menu.toggle($event)"></button>
<p-menu #menu [popup]="true" [model]="items"></p-menu> <p-menu #menu [popup]="true" [model]="items"></p-menu>
</div> </div>
</div> </div>
<span class="block text-muted-color font-medium mb-4" i18n>HEUTE</span> <span class="block text-muted-color font-medium mb-4" >HEUTE</span>
<ul class="space-y-4 mb-10"> <ul class="space-y-4 mb-10">
<li class="flex items-start mb-10"> <li class="flex items-start mb-10">
<div class="w-12 h-12 flex items-center justify-center bg-blue-100 dark:bg-blue-400/10 rounded-full mr-4 shrink-0"> <div class="w-12 h-12 flex items-center justify-center bg-blue-100 dark:bg-blue-400/10 rounded-full mr-4 shrink-0">
@@ -23,9 +23,9 @@ import { MenuModule } from 'primeng/menu';
</div> </div>
<div class="ml-3"> <div class="ml-3">
<p class="text-gray-800 font-bold">Ereignis "vor Ort Aufnahme " hinzugefügt</p> <p class="text-muted-color font-bold">Ereignis "vor Ort Aufnahme " hinzugefügt</p>
<p class="text-gray-700 font-medium">Ein neues Ereignis wurde zu Projekt "Heizungsmodernisierung " hinzugefügt</p> <p class="text-muted-color font-medium">Ein neues Ereignis wurde zu Projekt "Heizungsmodernisierung " hinzugefügt</p>
<p class="text-gray-500 text-sm">01.09.2025</p> <p class="text-muted-color text-sm">01.09.2025</p>
</div> </div>
</li> </li>
@@ -35,14 +35,14 @@ import { MenuModule } from 'primeng/menu';
</div> </div>
<div class="ml-3"> <div class="ml-3">
<p class="text-gray-800 font-bold">Ereignis "Antrag Bafa iSFP" hinzugefügt</p> <p class="text-muted-color font-bold">Ereignis "Antrag Bafa iSFP" hinzugefügt</p>
<p class="text-gray-700 font-medium">Ein neues Ereignis wurde zu Projekt "Heizungsmodernisierung " hinzugefügt</p> <p class="text-muted-color font-medium">Ein neues Ereignis wurde zu Projekt "Heizungsmodernisierung " hinzugefügt</p>
<p class="text-gray-500 text-sm">01.09.2025</p> <p class="text-muted-color text-sm">01.09.2025</p>
</div> </div>
</li> </li>
</ul> </ul>
<span class="block text-muted-color font-medium mb-4" i18n>GESTERN</span> <span class="block text-muted-color font-medium mb-4" >GESTERN</span>
<ul class="p-0 m-0 list-none mb-6"> <ul class="p-0 m-0 list-none mb-6">
<li class="flex items-start mb-10"> <li class="flex items-start mb-10">
<div class="w-12 h-12 flex items-center justify-center bg-blue-100 dark:bg-blue-400/10 rounded-full mr-4 shrink-0"> <div class="w-12 h-12 flex items-center justify-center bg-blue-100 dark:bg-blue-400/10 rounded-full mr-4 shrink-0">
@@ -50,14 +50,14 @@ import { MenuModule } from 'primeng/menu';
</div> </div>
<div class="ml-3"> <div class="ml-3">
<p class="text-gray-800 font-bold">Eier gekrault</p> <p class="text-muted-color font-bold">Eier gekrault</p>
<p class="text-gray-700 font-medium">kwt</p> <p class="text-muted-color font-medium">kwt</p>
<p class="text-gray-500 text-sm">01.09.2025</p> <p class="text-muted-color text-sm">01.09.2025</p>
</div> </div>
</li> </li>
</ul> </ul>
<span class="block text-muted-color font-medium mb-4" i18n>LETZTE WOCHE</span> <span class="block text-muted-color font-medium mb-4" >LETZTE WOCHE</span>
<ul class="p-0 m-0 list-none"> <ul class="p-0 m-0 list-none">
<li class="flex items-start mb-10"> <li class="flex items-start mb-10">
<div class="w-12 h-12 flex items-center justify-center bg-blue-100 dark:bg-blue-400/10 rounded-full mr-4 shrink-0"> <div class="w-12 h-12 flex items-center justify-center bg-blue-100 dark:bg-blue-400/10 rounded-full mr-4 shrink-0">
@@ -65,9 +65,9 @@ import { MenuModule } from 'primeng/menu';
</div> </div>
<div class="ml-3"> <div class="ml-3">
<p class="text-gray-800 font-bold">Lorem Ipsum</p> <p class="text-muted-color font-bold">Lorem Ipsum</p>
<p class="text-gray-700 font-medium">yadda yadda yadda</p> <p class="text-muted-color font-medium">yadda yadda yadda</p>
<p class="text-gray-500 text-sm">01.09.2025</p> <p class="text-muted-color text-sm">01.09.2025</p>
</div> </div>
</li> </li>
</ul> </ul>

View File

@@ -12,7 +12,7 @@ import { ProgressBar } from 'primeng/progressbar';
template: ` template: `
<div class="card"> <div class="card">
<div class="flex justify-between items-center mb-6"> <div class="flex justify-between items-center mb-6">
<div class="font-semibold text-xl" i18n>Aktuelle Projekte</div> <div class="font-semibold text-xl" >Aktuelle Projekte</div>
<div> <div>
<button pButton type="button" icon="pi pi-ellipsis-v" <button pButton type="button" icon="pi pi-ellipsis-v"
class="p-button-rounded p-button-text p-button-plain" class="p-button-rounded p-button-text p-button-plain"
@@ -38,13 +38,13 @@ import { ProgressBar } from 'primeng/progressbar';
<ng-template #icons> <ng-template #icons>
<p-button icon="pi pi-cog" severity="secondary" rounded text (click)="menu.toggle($event)" /> <p-button icon="pi pi-cog" severity="secondary" rounded text (click)="menu.toggle($event)" />
<p-menu #menu id="config_menu" [model]="items" [popup]="true" /> <p-menu #menu id="config_menu" [model]="items" [popup]="true" />
<p-button i18n-label label="Vorbereitung" variant="text" severity="info" [rounded]="true" size="small"/> <p-button label="Vorbereitung" variant="text" severity="info" [rounded]="true" size="small"/>
</ng-template> </ng-template>
<p class="m-0"> <p class="m-0">
<span class="text-surface-500 dark:text-surface-400"><i class="pi pi-map-marker"></i> Nicht-Wohngebäude mit Mischnutzung</span> <span class="text-surface-500 dark:text-surface-400"><i class="pi pi-map-marker"></i> Nicht-Wohngebäude mit Mischnutzung</span>
</p> </p>
<p> <p>
<span i18n>Fortschritt:</span> <span >Fortschritt:</span>
<p-progress-bar [value]="25"></p-progress-bar> <p-progress-bar [value]="25"></p-progress-bar>
</p> </p>
</p-panel> </p-panel>

View File

@@ -9,35 +9,35 @@ import { CommonModule } from '@angular/common';
<div class="card mb-0"> <div class="card mb-0">
<div class="flex justify-between mb-4"> <div class="flex justify-between mb-4">
<div> <div>
<span class="min-h-10 block text-muted-color font-medium mb-4" i18n>Gebäude verwaltet</span> <span class="min-h-10 block text-muted-color font-medium mb-4">Gebäude verwaltet</span>
<div class="text-surface-900 dark:text-surface-0 font-medium text-xl">152</div> <div class="text-surface-900 dark:text-surface-0 font-medium text-xl">152</div>
</div> </div>
<div class="flex items-center justify-center bg-blue-100 dark:bg-blue-400/10 rounded-border" style="width: 2.5rem; height: 2.5rem"> <div class="flex items-center justify-center bg-blue-100 dark:bg-blue-400/10 rounded-border" style="width: 2.5rem; height: 2.5rem">
<i class="pi pi-home text-blue-500 text-xl!"></i> <i class="pi pi-home text-blue-500 text-xl!"></i>
</div> </div>
</div> </div>
<span class="text-muted-color" i18n>Gesamt im Portfolio</span> <span class="text-muted-color">Gesamt im Portfolio</span>
</div> </div>
</div> </div>
<div class="col-span-12 lg:col-span-6 xl:col-span-3"> <div class="col-span-12 lg:col-span-6 xl:col-span-3">
<div class="card mb-0"> <div class="card mb-0">
<div class="flex justify-between mb-4"> <div class="flex justify-between mb-4">
<div> <div>
<span class="min-h-10 block text-muted-color font-medium mb-4" i18n>Aktive Projekte</span> <span class="min-h-10 block text-muted-color font-medium mb-4">Aktive Projekte</span>
<div class="text-surface-900 dark:text-surface-0 font-medium text-xl">12</div> <div class="text-surface-900 dark:text-surface-0 font-medium text-xl">12</div>
</div> </div>
<div class="flex items-center justify-center bg-orange-100 dark:bg-orange-400/10 rounded-border" style="width: 2.5rem; height: 2.5rem"> <div class="flex items-center justify-center bg-orange-100 dark:bg-orange-400/10 rounded-border" style="width: 2.5rem; height: 2.5rem">
<i class="pi pi-wrench text-orange-500 text-xl!"></i> <i class="pi pi-wrench text-orange-500 text-xl!"></i>
</div> </div>
</div> </div>
<span class="text-muted-color" i18n>von 73 insgesamt</span> <span class="text-muted-color">von 73 insgesamt</span>
</div> </div>
</div> </div>
<div class="col-span-12 lg:col-span-6 xl:col-span-3"> <div class="col-span-12 lg:col-span-6 xl:col-span-3">
<div class="card mb-0"> <div class="card mb-0">
<div class="flex justify-between mb-4"> <div class="flex justify-between mb-4">
<div> <div>
<span class="min-h-10 block text-muted-color font-medium mb-4" i18n>Kontakte</span> <span class="min-h-10 block text-muted-color font-medium mb-4">Kontakte</span>
<div class="text-surface-900 dark:text-surface-0 font-medium text-xl">28441</div> <div class="text-surface-900 dark:text-surface-0 font-medium text-xl">28441</div>
</div> </div>
<div class="flex items-center justify-center bg-cyan-100 dark:bg-cyan-400/10 rounded-border" style="width: 2.5rem; height: 2.5rem"> <div class="flex items-center justify-center bg-cyan-100 dark:bg-cyan-400/10 rounded-border" style="width: 2.5rem; height: 2.5rem">
@@ -51,14 +51,14 @@ import { CommonModule } from '@angular/common';
<div class="card mb-0"> <div class="card mb-0">
<div class="flex justify-between mb-4"> <div class="flex justify-between mb-4">
<div> <div>
<span class="min-h-10 block text-muted-color font-medium mb-4" i18n>Projekte abgeschlossen</span> <span class="min-h-10 block text-muted-color font-medium mb-4">Projekte abgeschlossen</span>
<div class="text-surface-900 dark:text-surface-0 font-medium text-xl">152</div> <div class="text-surface-900 dark:text-surface-0 font-medium text-xl">152</div>
</div> </div>
<div class="flex items-center justify-center bg-purple-100 dark:bg-purple-400/10 rounded-border" style="width: 2.5rem; height: 2.5rem"> <div class="flex items-center justify-center bg-purple-100 dark:bg-purple-400/10 rounded-border" style="width: 2.5rem; height: 2.5rem">
<i class="pi pi-list-check text-purple-500 text-xl!"></i> <i class="pi pi-list-check text-purple-500 text-xl!"></i>
</div> </div>
</div> </div>
<span class="text-muted-color" i18n>Erfolgreich beendet</span> <span class="text-muted-color">Erfolgreich beendet</span>
</div> </div>
</div>` </div>`
}) })

View File

@@ -8,7 +8,7 @@ import { CurrentProjectsWidget } from './components/current-projects-widget.comp
imports: [StatsWidget, CurrentProjectsWidget, ActivitiesWidget], imports: [StatsWidget, CurrentProjectsWidget, ActivitiesWidget],
template: ` template: `
<div class="mb-5"> <div class="mb-5">
<h1 i18n>Dashboard</h1> <h1 >Dashboard</h1>
<p class="my-4 text-lg text-gray-500">Willkommen zurück! Hier ist ein Überblick über Ihr Portfolio.</p> <p class="my-4 text-lg text-gray-500">Willkommen zurück! Hier ist ein Überblick über Ihr Portfolio.</p>
</div> </div>

View File

@@ -0,0 +1 @@
<p>billing works!</p>

View File

@@ -0,0 +1,23 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { Billing } from './billing';
describe('Billing', () => {
let component: Billing;
let fixture: ComponentFixture<Billing>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [Billing]
})
.compileComponents();
fixture = TestBed.createComponent(Billing);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@@ -0,0 +1,11 @@
import { Component } from '@angular/core';
@Component({
selector: 'app-billing',
imports: [],
templateUrl: './billing.html',
styleUrl: './billing.scss'
})
export class Billing {
}

View File

@@ -1,7 +1,7 @@
<div class="flex flex-wrap items-center justify-between gap-4"> <div class="flex flex-wrap items-center justify-between gap-4">
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<div class="mb-5"> <div class="mb-5">
<h1 i18n>Projekt Details</h1> <h1 >Projekt Details</h1>
<h4>{{ projectDetailsDTO?.name }}</h4> <h4>{{ projectDetailsDTO?.name }}</h4>
<p class="my-4 text-lg text-gray-500">Erstellt: {{ projectDetailsDTO?.createdAt | date: 'dd.MM.yyyy HH:mm' }}</p> <p class="my-4 text-lg text-gray-500">Erstellt: {{ projectDetailsDTO?.createdAt | date: 'dd.MM.yyyy HH:mm' }}</p>
</div> </div>

View File

@@ -1,11 +1,11 @@
<p-toolbar styleClass="mb-6"> <p-toolbar styleClass="mb-6">
<ng-template #start> <ng-template #start>
<p-button i18n-label label="Neu" icon="pi pi-plus" severity="secondary" class="mr-2" (onClick)="openNew()" /> <p-button label="Neu" icon="pi pi-plus" severity="secondary" class="mr-2" (onClick)="openNew()" />
<p-button i18n-label label="Löschen" icon="pi pi-trash" severity="danger" outlined (onClick)="deleteSelected()" [disabled]="!selectedProperties || !selectedProperties.length" /> <p-button label="Löschen" icon="pi pi-trash" severity="danger" outlined (onClick)="deleteSelected()" [disabled]="!selectedProperties || !selectedProperties.length" />
</ng-template> </ng-template>
<ng-template #end> <ng-template #end>
<p-button i18n-label label="Exportieren" icon="pi pi-upload" severity="secondary" (onClick)="exportCSV()" /> <p-button label="Exportieren" icon="pi pi-upload" severity="secondary" (onClick)="exportCSV()" />
</ng-template> </ng-template>
</p-toolbar> </p-toolbar>
@@ -26,7 +26,7 @@
> >
<ng-template #caption> <ng-template #caption>
<div class="flex items-center justify-between"> <div class="flex items-center justify-between">
<h5 class="m-0" i18n>Verwalte Liegenschaften</h5> <h5 class="m-0" >Verwalte Liegenschaften</h5>
<p-iconfield> <p-iconfield>
<p-inputicon styleClass="pi pi-search" /> <p-inputicon styleClass="pi pi-search" />
<input pInputText type="text" (input)="onGlobalFilter(dt, $event)" i18n-placeholder placeholder="Suche..." /> <input pInputText type="text" (input)="onGlobalFilter(dt, $event)" i18n-placeholder placeholder="Suche..." />
@@ -39,39 +39,39 @@
<th style="width: 3rem"> <th style="width: 3rem">
<p-tableHeaderCheckbox /> <p-tableHeaderCheckbox />
</th> </th>
<th pSortableColumn="nr" style="min-width:8rem" i18n> <th pSortableColumn="nr" style="min-width:8rem" >
Nr. Nr.
<p-sortIcon field="nr" /> <p-sortIcon field="nr" />
</th> </th>
<th pSortableColumn="name" style="min-width:8rem" i18n> <th pSortableColumn="name" style="min-width:8rem" >
Name Name
<p-sortIcon field="name" /> <p-sortIcon field="name" />
</th> </th>
<th pSortableColumn="owner" style="min-width:8rem" i18n> <th pSortableColumn="owner" style="min-width:8rem" >
Eigentümer Eigentümer
<p-sortIcon field="owner" /> <p-sortIcon field="owner" />
</th> </th>
<th pSortableColumn="street" style="min-width: 8rem" i18n> <th pSortableColumn="street" style="min-width: 8rem" >
Straße Straße
<p-sortIcon field="street" /> <p-sortIcon field="street" />
</th> </th>
<th pSortableColumn="houseNumber" style="min-width:8rem" i18n> <th pSortableColumn="houseNumber" style="min-width:8rem" >
Hausnummer Hausnummer
<p-sortIcon field="houseNumber" /> <p-sortIcon field="houseNumber" />
</th> </th>
<th pSortableColumn="zipCode" style="min-width: 12rem" i18n> <th pSortableColumn="zipCode" style="min-width: 12rem" >
Postleitzahl Postleitzahl
<p-sortIcon field="zipCode" /> <p-sortIcon field="zipCode" />
</th> </th>
<th pSortableColumn="city" style="min-width: 12rem" i18n> <th pSortableColumn="city" style="min-width: 12rem" >
Stadt Stadt
<p-sortIcon field="city" /> <p-sortIcon field="city" />
</th> </th>
<th pSortableColumn="bundesland" style="min-width:8rem" i18n> <th pSortableColumn="bundesland" style="min-width:8rem" >
Bundesland Bundesland
<p-sortIcon field="bundesland" /> <p-sortIcon field="bundesland" />
</th> </th>
<th pSortableColumn="Einheiten" style="min-width:8rem" i18n> <th pSortableColumn="Einheiten" style="min-width:8rem" >
Einheiten Einheiten
<p-sortIcon field="Einheiten" /> <p-sortIcon field="Einheiten" />
</th> </th>
@@ -244,8 +244,8 @@
</ng-template> </ng-template>
<ng-template #footer> <ng-template #footer>
<p-button i18n-label label="Abbrechen" icon="pi pi-times" text (click)="hideDialog()" /> <p-button label="Abbrechen" icon="pi pi-times" text (click)="hideDialog()" />
<p-button i18n-label label="Speichern" icon="pi pi-check" (click)="saveProperty()" /> <p-button label="Speichern" icon="pi pi-check" (click)="saveProperty()" />
</ng-template> </ng-template>
</p-dialog> </p-dialog>

View File

@@ -26,14 +26,13 @@ body {
// Default the application to a light color theme. This can be changed to // Default the application to a light color theme. This can be changed to
// `dark` to enable the dark color theme, or to `light dark` to defer to the // `dark` to enable the dark color theme, or to `light dark` to defer to the
// user's system settings. // user's system settings.
color-scheme: light; color-scheme: dark;
// Set a default background, font and text colors for the application using // Set a default background, font and text colors for the application using
// Angular Material's system-level CSS variables. Learn more about these // Angular Material's system-level CSS variables. Learn more about these
// variables at https://material.angular.dev/guide/system-variables // variables at https://material.angular.dev/guide/system-variables
background-color: var(--mat-sys-surface); background-color: var(--surface-ground);
color: var(--mat-sys-on-surface); color: var(--text-color);
font: var(--mat-sys-body-medium);
// Reset the user agent margin. // Reset the user agent margin.
margin: 0; margin: 0;

View File

@@ -3,7 +3,6 @@ const keycloakBaseUrl = 'https://auth.dev.localhost';
const keycloakRealm = 'skamp'; const keycloakRealm = 'skamp';
const keycloakClientId = 'skamp-app'; const keycloakClientId = 'skamp-app';
export const environment = { export const environment = {
production: false, production: false,
bearerTokenUrlCondition: `^(${apiBaseUrl})(/.*)?$`, bearerTokenUrlCondition: `^(${apiBaseUrl})(/.*)?$`,

View File

@@ -1,5 +1,5 @@
const apiBaseUrl = 'http://localhost:8080'; const apiBaseUrl = 'http://localhost:8180';
const keycloakBaseUrl = 'http://localhost:8280'; const keycloakBaseUrl = 'https://kc.dev.localhost';
const keycloakRealm = 'skamp'; const keycloakRealm = 'skamp';
const keycloakClientId = 'skamp-app'; const keycloakClientId = 'skamp-app';