@@ -33,21 +33,23 @@
{{ element.email }}
@if (element.emailVerified) {
-
verified
+
}
Name
- {{ element.displayName }}
+
+ {{ element.displayName }}
+
Active
@if (element.disabled) {
- block
+
} @else {
- check
+
}
@@ -57,10 +59,10 @@
@for (provider of element.providers; track provider) {
@switch (provider) {
@case ('password') {
-
email
+
}
@default {
-
verified_user
+
}
}
}
@@ -93,11 +95,11 @@
Actions
-
diff --git a/src/app/features/admin/users/users.component.scss b/src/app/features/admin/users/users.component.scss
index 9d2cad55..b93454f8 100644
--- a/src/app/features/admin/users/users.component.scss
+++ b/src/app/features/admin/users/users.component.scss
@@ -33,6 +33,6 @@ mat-cell {
}
&.mat-column-actions {
- max-width: 125px;
+ max-width: 115px;
}
}
diff --git a/src/app/features/admin/users/users.component.ts b/src/app/features/admin/users/users.component.ts
index ea8b67f9..d42f684f 100644
--- a/src/app/features/admin/users/users.component.ts
+++ b/src/app/features/admin/users/users.component.ts
@@ -1,23 +1,26 @@
import { CommonModule } from '@angular/common';
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, DestroyRef, inject, OnInit, signal, viewChild } from '@angular/core';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
-import { MatButtonModule } from '@angular/material/button';
import { MatDialog } from '@angular/material/dialog';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatIconModule } from '@angular/material/icon';
import { MatInputModule } from '@angular/material/input';
import { MatPaginator, MatPaginatorModule } from '@angular/material/paginator';
-import { MatProgressBarModule } from '@angular/material/progress-bar';
import { MatSort, MatSortModule } from '@angular/material/sort';
import { MatTableDataSource, MatTableModule } from '@angular/material/table';
-import { MatToolbarModule } from '@angular/material/toolbar';
import { MatTooltipModule } from '@angular/material/tooltip';
+import { provideIcons } from '@ng-icons/core';
+import { lucideCheck, lucideMail, lucidePencil, lucideRefreshCcw, lucideTrash, lucideUserPlus, lucideX } from '@ng-icons/lucide';
import { ConfirmationDialogComponent } from '@shared/components/confirmation-dialog/confirmation-dialog.component';
import { ConfirmationDialogModel } from '@shared/components/confirmation-dialog/confirmation-dialog.model';
-import { AnimateDirective } from '@shared/directives/animate.directive';
import { User } from '@shared/models/user.model';
import { NotificationService } from '@shared/services/notification.service';
import { UserService } from '@shared/services/user.service';
+import { HlmButtonImports } from '@spartan-ng/helm/button';
+import { HlmIconImports } from '@spartan-ng/helm/icon';
+import { HlmProgressImports } from '@spartan-ng/helm/progress';
+import { HlmSpinnerImports } from '@spartan-ng/helm/spinner';
+import { HlmTooltipImports } from '@spartan-ng/helm/tooltip';
import { filter, switchMap } from 'rxjs/operators';
import { UserDialogComponent } from './user-dialog/user-dialog.component';
import { UserDialogModel } from './user-dialog/user-dialog.model';
@@ -30,18 +33,30 @@ import { UserInviteDialogResponse } from './user-invite-dialog/user-invite-dialo
styleUrls: ['./users.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [
- MatToolbarModule,
MatTooltipModule,
MatTableModule,
- MatProgressBarModule,
MatFormFieldModule,
MatInputModule,
MatSortModule,
MatIconModule,
CommonModule,
- MatButtonModule,
MatPaginatorModule,
- AnimateDirective,
+ HlmButtonImports,
+ HlmIconImports,
+ HlmTooltipImports,
+ HlmProgressImports,
+ HlmSpinnerImports,
+ ],
+ providers: [
+ provideIcons({
+ lucideUserPlus,
+ lucideRefreshCcw,
+ lucidePencil,
+ lucideTrash,
+ lucideCheck,
+ lucideX,
+ lucideMail,
+ }),
],
})
export class UsersComponent implements OnInit {
diff --git a/src/app/features/features-routing.module.ts b/src/app/features/features-routing.module.ts
index f8e5d5e9..a35b6870 100644
--- a/src/app/features/features-routing.module.ts
+++ b/src/app/features/features-routing.module.ts
@@ -1,10 +1,11 @@
import { NgModule } from '@angular/core';
import { AuthGuard, customClaims } from '@angular/fire/auth-guard';
import { RouterModule, Routes } from '@angular/router';
+import { BreadcrumbItem } from '@shared/models/breadcrumb.model';
import { UserPermission } from '@shared/models/user.model';
import { pipe } from 'rxjs';
import { map } from 'rxjs/operators';
-import { FeaturesComponent } from './features.component';
+import FeaturesComponent from './features.component';
const ROLE_ADMIN = 'admin';
const ROLE_CUSTOM = 'custom';
@@ -154,6 +155,12 @@ const routes: Routes = [
path: 'welcome',
title: 'Welcome',
loadComponent: () => import('./welcome/welcome.component').then(m => m.WelcomeComponent),
+ data: {
+ breadcrumb: {
+ label: 'Welcome',
+ route: '/welcome',
+ } satisfies BreadcrumbItem,
+ },
},
{
path: 'spaces/:spaceId/dashboard',
@@ -167,6 +174,10 @@ const routes: Routes = [
canActivate: [AuthGuard],
data: {
authGuardPipe: hasPermissionTranslationRead,
+ breadcrumb: {
+ label: 'Translations',
+ helpUrl: 'https://localess.org/docs/translations/overview',
+ } satisfies BreadcrumbItem,
},
},
{
@@ -176,6 +187,10 @@ const routes: Routes = [
canActivate: [AuthGuard],
data: {
authGuardPipe: hasPermissionContentRead,
+ breadcrumb: {
+ label: 'Contents',
+ helpUrl: 'https://localess.org/docs/content/overview',
+ } satisfies BreadcrumbItem,
},
},
{
@@ -185,6 +200,10 @@ const routes: Routes = [
canActivate: [AuthGuard],
data: {
authGuardPipe: hasPermissionAssetRead,
+ breadcrumb: {
+ label: 'Assets',
+ helpUrl: 'https://localess.org/docs/assets/overview',
+ } satisfies BreadcrumbItem,
},
},
{
@@ -194,6 +213,10 @@ const routes: Routes = [
canActivate: [AuthGuard],
data: {
authGuardPipe: hasPermissionSchemaRead,
+ breadcrumb: {
+ label: 'Schemas',
+ helpUrl: 'https://localess.org/docs/schemas/overview',
+ } satisfies BreadcrumbItem,
},
},
{
@@ -203,12 +226,20 @@ const routes: Routes = [
canActivate: [AuthGuard],
data: {
authGuardPipe: hasPermissionTranslationRead,
+ breadcrumb: {
+ label: 'Tasks',
+ } satisfies BreadcrumbItem,
},
},
{
path: 'spaces/:spaceId/open-api',
title: 'Open API',
loadChildren: () => import('./spaces/open-api/open-api.module').then(m => m.OpenApiModule),
+ data: {
+ breadcrumb: {
+ label: 'Open API',
+ } satisfies BreadcrumbItem,
+ },
},
{
path: 'spaces/:spaceId/settings',
@@ -217,6 +248,9 @@ const routes: Routes = [
canActivate: [AuthGuard],
data: {
authGuardPipe: hasPermissionSpaceManagement,
+ breadcrumb: {
+ label: 'Settings',
+ } satisfies BreadcrumbItem,
},
},
{
@@ -226,6 +260,9 @@ const routes: Routes = [
canActivate: [AuthGuard],
data: {
authGuardPipe: hasPermissionUserManagement,
+ breadcrumb: {
+ label: 'Users',
+ } satisfies BreadcrumbItem,
},
},
{
@@ -235,6 +272,9 @@ const routes: Routes = [
canActivate: [AuthGuard],
data: {
authGuardPipe: hasPermissionSpaceManagement,
+ breadcrumb: {
+ label: 'Spaces',
+ } satisfies BreadcrumbItem,
},
},
{
@@ -244,6 +284,9 @@ const routes: Routes = [
canActivate: [AuthGuard],
data: {
authGuardPipe: hasPermissionSettingsManagement,
+ breadcrumb: {
+ label: 'Settings',
+ } satisfies BreadcrumbItem,
},
},
],
diff --git a/src/app/features/features.component.html b/src/app/features/features.component.html
index 9db3b108..c6439884 100644
--- a/src/app/features/features.component.html
+++ b/src/app/features/features.component.html
@@ -1,153 +1,245 @@
-
-
-
- {{ settingsStore.mainMenuExpended() ? 'menu_open' : 'menu' }}
-
-
- @if (appSettingsStore.ui(); as ui) {
- @if (ui.text) {
-
-
- {{ ui.text }}
-
- }
- }
-
-
- @if (spaceStore.spaces(); as spaces) {
- @if (spaceStore.selectedSpace(); as selectedSpace) {
-
- @if (selectedSpace.icon) {
- {{ selectedSpace.icon }}
- }
- {{ selectedSpace.name }}
- arrow_drop_down
-
-
- @for (space of spaces; track space.id) {
-
- @if (space.icon) {
- {{ space.icon }}
- }
- {{ space.name }}
-
+
+
+
+
+
+
+ @if (sidebarService.open() || sidebarService.openMobile()) {
+ @if (appSettingsStore.ui(); as ui) {
+ @if (ui.text) {
+
+
+ {{ ui.text }}
+
+
}
-
+ }
}
- } @else {
-
No Spaces. Click here to create one.
- }
-
-
-
-
- waving_hand
-
-
- volunteer_activism
-
-
- public
-
-
- help_center
-
-
- @for (item of communitySideMenu; track item.label) {
-
- {{ item.icon }}
- {{ item.label }}
-
+
+
+
+
+
+ @if (spaceStore.spaces().length > 0) {
+ -
+
+
+ {{ spaceStore.selectedSpace()?.name }}
+
+
+
+
+ @for (space of spaceStore.spaces(); track space.id) {
+
+