View Upload
-Export Zone Tree
-
{{ item().commit }}
@@ -99,7 +97,7 @@ import { DriverStateService } from './driver-state.service';
{{ 'DRIVERS.LOADING_SETTINGS' | translate }}
{{ loading() | translate }}
{{
driver.commit | slice: 0 : 9
}}
{{
@@ -132,7 +133,7 @@ import { TranslatePipe } from '../ui/translate.pipe';
-
+
{{ loading() }}
}
@@ -142,7 +143,7 @@ import { TranslatePipe } from '../ui/translate.pipe';
>
@@ -161,15 +162,12 @@ import { TranslatePipe } from '../ui/translate.pipe';
`,
],
imports: [
- LoadingLabelDirective,
+ DialogCloseDirective,
+ SpinnerComponent,
+ TooltipDirective,
DialogTitleDirective,
- MatDialogModule,
TranslatePipe,
IconComponent,
- MatRippleModule,
- MatProgressSpinnerModule,
- MatCheckboxModule,
- MatTooltipModule,
FormsModule,
DateFromPipe,
SlicePipe,
@@ -177,7 +175,7 @@ import { TranslatePipe } from '../ui/translate.pipe';
})
export class DriverUpdateListModalComponent {
private _dialog_ref =
- inject>(MatDialogRef);
+ inject>(DialogRef);
public readonly loading = signal(i18n('DRIVERS.LOADING'));
private readonly _change = signal(0);
diff --git a/src/app/drivers/drivers.component.ts b/src/app/drivers/drivers.component.ts
index 211d2f432..ca3dfb277 100644
--- a/src/app/drivers/drivers.component.ts
+++ b/src/app/drivers/drivers.component.ts
@@ -1,8 +1,7 @@
import { Component, computed, inject } from '@angular/core';
-import { MatRippleModule } from '@angular/material/core';
-import { MatTooltipModule } from '@angular/material/tooltip';
import { extensionsForItem } from '../common/api';
import { i18n } from '../common/locale.service';
+import { TooltipDirective } from '../ui/controls/tooltip.directive';
import { IconComponent } from '../ui/icon.component';
import { ItemShellComponent } from '../ui/item-shell.component';
import { ItemTab } from '../ui/item-tablist.component';
@@ -16,9 +15,9 @@ import { DriverStateService } from './driver-state.service';
@if (updates_available()) {
update
@@ -27,10 +26,9 @@ import { DriverStateService } from './driver-state.service';
`,
imports: [
+ TooltipDirective,
ItemShellComponent,
IconComponent,
- MatRippleModule,
- MatTooltipModule,
TranslatePipe,
],
})
diff --git a/src/app/groups/group-about.component.ts b/src/app/groups/group-about.component.ts
index b14288d5a..de518d7f2 100644
--- a/src/app/groups/group-about.component.ts
+++ b/src/app/groups/group-about.component.ts
@@ -1,6 +1,5 @@
import { AsyncPipe } from '@angular/common';
import { Component, computed, effect, inject, signal } from '@angular/core';
-import { MatTooltipModule } from '@angular/material/tooltip';
import { RouterModule } from '@angular/router';
import {
PlaceDomain,
@@ -8,6 +7,7 @@ import {
showDomain,
showGroup,
} from '@placeos/ts-client';
+import { TooltipDirective } from '../ui/controls/tooltip.directive';
import { DateFromPipe } from '../ui/pipes/date-from.pipe';
import { MarkdownPipe } from '../ui/pipes/markdown.pipe';
import { TranslatePipe } from '../ui/translate.pipe';
@@ -139,7 +139,7 @@ import { GroupStateService } from './group-state.service';
{{ created_at() * 1000 | dateFrom }}
@@ -150,7 +150,7 @@ import { GroupStateService } from './group-state.service';
{{ updated_at() * 1000 | dateFrom }}
@@ -181,7 +181,7 @@ import { GroupStateService } from './group-state.service';
`,
],
imports: [
- MatTooltipModule,
+ TooltipDirective,
TranslatePipe,
DateFromPipe,
MarkdownPipe,
diff --git a/src/app/groups/group-ad-groups-field.component.ts b/src/app/groups/group-ad-groups-field.component.ts
index bd993378a..86aa56ffe 100644
--- a/src/app/groups/group-ad-groups-field.component.ts
+++ b/src/app/groups/group-ad-groups-field.component.ts
@@ -1,3 +1,4 @@
+import { Dialog } from '@angular/cdk/dialog';
import {
Component,
computed,
@@ -7,18 +8,18 @@ import {
signal,
} 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 { MatTooltipModule } from '@angular/material/tooltip';
import { PlaceGroupAdMappings } from '@placeos/ts-client';
import { waitForEvent } from '../common/signals';
+import { FormFieldComponent } from '../ui/controls/form-field.component';
+import { TooltipDirective } from '../ui/controls/tooltip.directive';
import { ItemSearchFieldComponent } from '../ui/custom-fields/item-search-field.component';
import { IconComponent } from '../ui/icon.component';
import { TranslatePipe } from '../ui/translate.pipe';
import { groupPermissionLabels } from './group-permissions';
-import { GroupPermissionsModalComponent } from './group-permissions-modal.component';
+import {
+ GroupPermissionsModalComponent,
+ GroupPermissionsResult,
+} from './group-permissions-modal.component';
import {
removeAdGroupMapping,
searchStaffGroups,
@@ -47,38 +48,30 @@ import {
/>
} @else if (searchable() === false) {
-
+
-
-
+
+
-
+
add
@@ -112,8 +105,8 @@ import {
edit
@@ -122,8 +115,8 @@ import {
type="button"
icon
error
- matRipple
- [matTooltip]="'GROUPS.AD_GROUP_REMOVE' | translate"
+ ripple
+ [appTooltip]="'GROUPS.AD_GROUP_REMOVE' | translate"
(click)="removeGroup(row.id)"
>
delete
@@ -138,18 +131,16 @@ import {
`,
styles: [``],
imports: [
+ TooltipDirective,
+ FormFieldComponent,
FormsModule,
IconComponent,
ItemSearchFieldComponent,
- MatFormFieldModule,
- MatInputModule,
- MatRippleModule,
- MatTooltipModule,
TranslatePipe,
],
})
export class GroupAdGroupsFieldComponent {
- private _dialog = inject(MatDialog);
+ private _dialog = inject(Dialog);
public readonly mappings = model({});
public readonly default_permissions = input(0);
@@ -200,14 +191,15 @@ export class GroupAdGroupsFieldComponent {
permissions: number;
}) {
const result = await waitForEvent(
- this._dialog
- .open(GroupPermissionsModalComponent, {
+ this._dialog.open(
+ GroupPermissionsModalComponent,
+ {
data: {
title: 'GROUPS.AD_GROUP_PERMISSIONS',
permissions: row.permissions,
},
- })
- .afterClosed(),
+ },
+ ).closed,
);
if (!result) return;
this.mappings.update((mappings) =>
diff --git a/src/app/groups/group-bulk-add-modal.component.ts b/src/app/groups/group-bulk-add-modal.component.ts
index 2648e229e..ffcccbf2e 100644
--- a/src/app/groups/group-bulk-add-modal.component.ts
+++ b/src/app/groups/group-bulk-add-modal.component.ts
@@ -1,18 +1,12 @@
+import { DIALOG_DATA, DialogRef } from '@angular/cdk/dialog';
import { Component, computed, inject, resource, signal } from '@angular/core';
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 { MatTabsModule } from '@angular/material/tabs';
+import { DialogCloseDirective } from '../ui/controls/dialog';
+import { FormFieldComponent } from '../ui/controls/form-field.component';
+import { SpinnerComponent } from '../ui/controls/spinner.component';
+import { TabsComponent } from '../ui/controls/tabs.component';
import { DialogTitleDirective } from '../ui/dialog-title.directive';
import { IconComponent } from '../ui/icon.component';
-import { LoadingLabelDirective } from '../ui/loading-label.directive';
import { SettingsToggleComponent } from '../ui/settings-toggle.component';
import { TranslatePipe } from '../ui/translate.pipe';
import {
@@ -59,51 +53,50 @@ export interface GroupBulkAddResult {
close
@if (show_permissions) {
-
-
-
-
+ [labels]="[
+ 'GROUPS.TAB_USERS' | translate,
+ 'GROUPS.FIELD_PERMISSIONS' | translate,
+ ]"
+ [(selectedIndex)]="tab"
+ />
}
@if (!show_permissions || tab() === 0) {
-
+
-
+
search
@if (loading()) {
-
-
+
+
}
-
+
@if (list_items().length) {
@for (item of list_items(); track item.id) {
{
>
{{ 'COMMON.CANCEL' | translate }}
{
`,
],
imports: [
- LoadingLabelDirective,
+ DialogCloseDirective,
+ SpinnerComponent,
+ FormFieldComponent,
DialogTitleDirective,
FormsModule,
IconComponent,
- MatDialogModule,
- MatFormFieldModule,
- MatInputModule,
- MatProgressSpinnerModule,
- MatRippleModule,
- MatTabsModule,
+ TabsComponent,
SettingsToggleComponent,
TranslatePipe,
],
})
export class GroupBulkAddModalComponent {
private _dialog_ref =
- inject<
- MatDialogRef, GroupBulkAddResult>
- >(MatDialogRef);
- private _data = inject>(MAT_DIALOG_DATA);
+ inject, GroupBulkAddModalComponent>>(
+ DialogRef,
+ );
+ private _data = inject>(DIALOG_DATA);
public readonly selected = signal([]);
public readonly search = signal('');
diff --git a/src/app/groups/group-form.component.ts b/src/app/groups/group-form.component.ts
index 57a9b0576..eec712c20 100644
--- a/src/app/groups/group-form.component.ts
+++ b/src/app/groups/group-form.component.ts
@@ -1,4 +1,4 @@
-import { COMMA, ENTER } from '@angular/cdk/keycodes';
+import { DIALOG_DATA, DialogRef } from '@angular/cdk/dialog';
import {
Component,
computed,
@@ -11,11 +11,6 @@ import {
} from '@angular/core';
import { FormsModule } from '@angular/forms';
import { disabled, form, FormField } from '@angular/forms/signals';
-import { MatChipInputEvent, MatChipsModule } from '@angular/material/chips';
-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 {
addGroup,
cleanObject,
@@ -26,18 +21,16 @@ import {
showGroup,
updateGroup,
} from '@placeos/ts-client';
-import {
- addSignalChipItem,
- onSaveHotkey,
- removeSignalChipItem,
- submitFormDialog,
-} from '../common/forms';
+import { onSaveHotkey, submitFormDialog } from '../common/forms';
import { subtreeFilter } from '../common/hierarchy';
import { i18n } from '../common/locale.service';
import { DialogEvent } from '../common/types';
+import { ChipListComponent } from '../ui/controls/chip-list.component';
+import { FormFieldComponent } from '../ui/controls/form-field.component';
+import { OptionComponent } from '../ui/controls/option.component';
+import { SelectComponent } from '../ui/controls/select.component';
import { ItemSearchFieldComponent } from '../ui/custom-fields/item-search-field.component';
import { FullscreenModalShellComponent } from '../ui/fullscreen-modal-shell.component';
-import { IconComponent } from '../ui/icon.component';
import { SettingsToggleComponent } from '../ui/settings-toggle.component';
import { TranslatePipe } from '../ui/translate.pipe';
import { GroupAdGroupsFieldComponent } from './group-ad-groups-field.component';
@@ -70,32 +63,30 @@ import {
>
{{ 'COMMON.FIELD_NAME' | translate }}*
-
+
- {{
- 'GROUPS.NAME_REQUIRED' | translate
- }}
-
+
+ {{ 'GROUPS.NAME_REQUIRED' | translate }}
+
+
-
+
-
+
@@ -120,8 +111,8 @@ import {
id="group-authority-label"
>{{ 'GROUPS.AUTHORITY_ID' | translate }}
-
-
+
+
{{ domain.name }}
-
+
}
-
-
+
+
-
-
- @for (
- subsystem of subsystem_list();
- track subsystem
- ) {
-
-
- {{ subsystem }}
-
-
- cancel
-
-
- }
-
-
+
-
+
@@ -205,7 +203,7 @@ import { ModuleStateService } from './module-state.service';
-
+
{{ 'MODULES.LOADING_SETTINGS' | translate }}
}
@@ -224,13 +222,11 @@ import { ModuleStateService } from './module-state.service';
`,
],
imports: [
+ SpinnerComponent,
+ TooltipDirective,
ItemTimestampsComponent,
- LoadingLabelDirective,
TranslatePipe,
- MatProgressSpinnerModule,
SettingsFormComponent,
- MatRippleModule,
- MatTooltipModule,
CustomTooltipComponent,
IconComponent,
RouterModule,
@@ -239,7 +235,7 @@ import { ModuleStateService } from './module-state.service';
export class ModuleAboutComponent {
public readonly hasSupportRole = hasSupportRole;
private _service = inject(ModuleStateService);
- private _dialog = inject(MatDialog);
+ private _dialog = inject(Dialog);
/** Driver for the active item */
public readonly driver = this._service.driver;
@@ -263,7 +259,7 @@ export class ModuleAboutComponent {
}
public viewErrors() {
- this._dialog.open(
+ this._dialog.open(
ModuleRuntimeErrorsModalComponent,
{ data: this.item.id },
);
diff --git a/src/app/modules/module-form.component.ts b/src/app/modules/module-form.component.ts
index fc2dd7c2d..2156b8397 100644
--- a/src/app/modules/module-form.component.ts
+++ b/src/app/modules/module-form.component.ts
@@ -25,13 +25,13 @@ import {
querySupportSystems as querySystems,
} from '../common/support-access';
-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 { DIALOG_DATA, DialogRef } from '@angular/cdk/dialog';
import { mergeFormItem, onSaveHotkey, submitFormDialog } from '../common/forms';
import { i18n } from '../common/locale.service';
import { DialogEvent } from '../common/types';
+import { FormFieldComponent } from '../ui/controls/form-field.component';
+import { OptionComponent } from '../ui/controls/option.component';
+import { SelectComponent } from '../ui/controls/select.component';
import { ItemSearchFieldComponent } from '../ui/custom-fields/item-search-field.component';
import { FullscreenModalShellComponent } from '../ui/fullscreen-modal-shell.component';
import { SettingsToggleComponent } from '../ui/settings-toggle.component';
@@ -142,19 +142,18 @@ import {
{{ 'MODULES.URI' | translate
}}*
-
+
- {{
- 'MODULES.URI_REQUIRED' | translate
- }}
-
+
+ {{ 'MODULES.URI_REQUIRED' | translate }}
+
+
}
@@ -173,22 +172,21 @@ import {
{{ 'MODULES.FIELD_IP' | translate }}
*
-
+
@if (form.ip().invalid()) {
-
+
{{
'MODULES.IP_REQUIRED'
| translate
}}
-
+
}
-
+
}
@if (
@@ -206,9 +204,8 @@ import {
{{ 'MODULES.PORT_NUMBER' | translate }}
*
-
+
@if (form.port().invalid()) {
-
+
{{
'MODULES.PORT_REQUIRED'
| translate
}}
-
+
}
-
+
}
@@ -272,8 +269,8 @@ import {
-
-
+
+
{{ level.name | translate }}
-
+
}
-
-
+
+
}
@if (form.notes) {
@@ -295,16 +292,15 @@ import {
-
+
-
+
}
@if (form.custom_name) {
@@ -312,16 +308,15 @@ import {
-
+
-
+
}
@if (form.edge && !formModel().id) {
@@ -348,21 +343,21 @@ import {
`,
styles: [``],
imports: [
+ OptionComponent,
+ SelectComponent,
+ FormFieldComponent,
ItemSearchFieldComponent,
TranslatePipe,
FormField,
- MatFormFieldModule,
- MatInputModule,
- MatSelectModule,
SettingsToggleComponent,
FullscreenModalShellComponent,
],
})
export class ModuleFormComponent implements OnInit {
private _dialog_ref =
- inject>(MatDialogRef);
+ inject>(DialogRef);
private _data = inject<{ item: PlaceModule; readonly?: string }>(
- MAT_DIALOG_DATA,
+ DIALOG_DATA,
);
private readonly _name = 'MODULES';
diff --git a/src/app/modules/module-state.service.ts b/src/app/modules/module-state.service.ts
index b7e1af1c9..3305306ef 100644
--- a/src/app/modules/module-state.service.ts
+++ b/src/app/modules/module-state.service.ts
@@ -1,5 +1,5 @@
+import { Dialog } from '@angular/cdk/dialog';
import { computed, inject, resource, Service, signal } from '@angular/core';
-import { MatDialog } from '@angular/material/dialog';
import {
moduleSettings,
PlaceModule,
@@ -19,7 +19,7 @@ import { ViewResponseModalComponent } from '../overlays/view-response-modal.comp
@Service()
export class ModuleStateService {
private _state = inject(ActiveItemService);
- private _dialog = inject(MatDialog);
+ private _dialog = inject(Dialog);
private _loading = signal(false);
@@ -132,7 +132,7 @@ export class ModuleStateService {
/** View Results of the execute */
private viewDetails(content: unknown) {
- this._dialog.open(
+ this._dialog.open(
ViewResponseModalComponent,
{
data: { content },
diff --git a/src/app/modules/module-systems.component.ts b/src/app/modules/module-systems.component.ts
index 4f29e281b..5a6c7a9d2 100644
--- a/src/app/modules/module-systems.component.ts
+++ b/src/app/modules/module-systems.component.ts
@@ -1,12 +1,10 @@
import { Component, computed, inject, model } from '@angular/core';
import { FormsModule } from '@angular/forms';
-import { MatFormFieldModule } from '@angular/material/form-field';
-import { MatInputModule } from '@angular/material/input';
-import { MatProgressBarModule } from '@angular/material/progress-bar';
import { RouterModule } from '@angular/router';
+import { FormFieldComponent } from '../ui/controls/form-field.component';
+import { ProgressBarComponent } from '../ui/controls/progress-bar.component';
import { IconComponent } from '../ui/icon.component';
-import { LoadingLabelDirective } from '../ui/loading-label.directive';
import { DateFromPipe } from '../ui/pipes/date-from.pipe';
import { SimpleTableComponent } from '../ui/simple-table.component';
import { TranslatePipe } from '../ui/translate.pipe';
@@ -17,22 +15,21 @@ import { ModuleStateService } from './module-state.service';
template: `
-
-
+
+
search
-
+
- {{ 'DOMAINS.AUTHENTICATION_SOURCE_TYPE' | translate }}:
-
-
+
@for (type of source_types; track type.id) {
-
+
{{ type.name }}
-
+
}
-
-
+
+
}
@if (item()) {
@@ -112,9 +113,10 @@ export type AuthSourceTypes = 'oauth' | 'saml' | 'ldap';
`,
styles: [``],
imports: [
+ OptionComponent,
+ SelectComponent,
+ FormFieldComponent,
FullscreenModalShellComponent,
- MatFormFieldModule,
- MatSelectModule,
TranslatePipe,
FormsModule,
SamlSourceFormComponent,
@@ -124,8 +126,8 @@ export type AuthSourceTypes = 'oauth' | 'saml' | 'ldap';
})
export class AuthSourceModalComponent implements OnInit {
private _dialog =
- inject>(MatDialogRef);
- private _data = inject(MAT_DIALOG_DATA);
+ inject>(DialogRef);
+ private _data = inject(DIALOG_DATA);
/** List of available authentication sources */
public source_types: Identity[] = [
diff --git a/src/app/overlays/bulk-item-modal/bulk-item-modal.component.ts b/src/app/overlays/bulk-item-modal/bulk-item-modal.component.ts
index e5d489634..d9e2c8bac 100644
--- a/src/app/overlays/bulk-item-modal/bulk-item-modal.component.ts
+++ b/src/app/overlays/bulk-item-modal/bulk-item-modal.component.ts
@@ -1,11 +1,6 @@
import { Component, Type, computed, inject, signal } from '@angular/core';
-import {
- MAT_DIALOG_DATA,
- MatDialogModule,
- MatDialogRef,
-} from '@angular/material/dialog';
-import { MatRippleModule } from '@angular/material/core';
+import { DIALOG_DATA, DialogRef } from '@angular/cdk/dialog';
import {
PlaceDriver,
PlaceModule,
@@ -17,6 +12,7 @@ import {
import { unique } from '../../common/general';
import { notifyError, notifyWarn } from '../../common/notifications';
import { HashMap, Identity } from '../../common/types';
+import { DialogCloseDirective } from '../../ui/controls/dialog';
import { DialogTitleDirective } from '../../ui/dialog-title.directive';
import { IconComponent } from '../../ui/icon.component';
import { TranslatePipe } from '../../ui/translate.pipe';
@@ -69,8 +65,8 @@ export interface BulkItemModalData> {
@if (!loading) {
close
@@ -156,11 +152,10 @@ export interface BulkItemModalData> {
`,
],
imports: [
+ DialogCloseDirective,
DialogTitleDirective,
- MatDialogModule,
TranslatePipe,
IconComponent,
- MatRippleModule,
StatusListComponent,
ListComponent,
MatchFieldsComponent,
@@ -171,8 +166,8 @@ export class BulkItemModalComponent<
T extends HashMap = HashMap,
> {
private _dialog_ref =
- inject>(MatDialogRef);
- private _data = inject>(MAT_DIALOG_DATA);
+ inject>(DialogRef);
+ private _data = inject>(DIALOG_DATA);
/** Current step in the bulk add flow */
public readonly flow_step = signal('upload');
diff --git a/src/app/overlays/bulk-item-modal/csv-upload.component.ts b/src/app/overlays/bulk-item-modal/csv-upload.component.ts
index 5eccb42b4..46bd39556 100644
--- a/src/app/overlays/bulk-item-modal/csv-upload.component.ts
+++ b/src/app/overlays/bulk-item-modal/csv-upload.component.ts
@@ -1,12 +1,10 @@
import { Component, input, output, signal } from '@angular/core';
-import { MatRippleModule } from '@angular/material/core';
-import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { downloadFile, jsonToCsv, parseCSV } from '../../common/general';
import { notifyError, notifyWarn } from '../../common/notifications';
import { HashMap } from '../../common/types';
+import { SpinnerComponent } from '../../ui/controls/spinner.component';
import { IconComponent } from '../../ui/icon.component';
-import { LoadingLabelDirective } from '../../ui/loading-label.directive';
import { TranslatePipe } from '../../ui/translate.pipe';
@Component({
@@ -15,7 +13,7 @@ import { TranslatePipe } from '../../ui/translate.pipe';
@if (!loading) {
@@ -117,11 +115,9 @@ const BATCH_SIZE = 5;
`,
],
imports: [
- LoadingLabelDirective,
- MatRippleModule,
- MatProgressSpinnerModule,
+ SpinnerComponent,
+ TooltipDirective,
IconComponent,
- MatTooltipModule,
TranslatePipe,
VirtualScrollComponent,
],
diff --git a/src/app/overlays/changelog-modal.component.ts b/src/app/overlays/changelog-modal.component.ts
index c26bf5dfe..c49bdaae4 100644
--- a/src/app/overlays/changelog-modal.component.ts
+++ b/src/app/overlays/changelog-modal.component.ts
@@ -1,7 +1,7 @@
import { AsyncPipe } from '@angular/common';
import { Component, inject } from '@angular/core';
-import { MAT_DIALOG_DATA } from '@angular/material/dialog';
+import { DIALOG_DATA } from '@angular/cdk/dialog';
import { FullscreenModalShellComponent } from '../ui/fullscreen-modal-shell.component';
import { IconComponent } from '../ui/icon.component';
import { MarkdownPipe } from '../ui/pipes/markdown.pipe';
@@ -45,7 +45,7 @@ export interface ChangelogModalData {
],
})
export class ChangelogModalComponent {
- private _data = inject(MAT_DIALOG_DATA);
+ private _data = inject(DIALOG_DATA);
public readonly changelog = this._data.changelog;
}
diff --git a/src/app/overlays/confirm-modal.component.ts b/src/app/overlays/confirm-modal.component.ts
index 17909b1c1..1b467c486 100644
--- a/src/app/overlays/confirm-modal.component.ts
+++ b/src/app/overlays/confirm-modal.component.ts
@@ -8,17 +8,9 @@ import {
inject,
signal,
} from '@angular/core';
-import {
- MAT_DIALOG_DATA,
- MatDialog,
- MatDialogModule,
- MatDialogRef,
-} from '@angular/material/dialog';
import { Clipboard } from '@angular/cdk/clipboard';
-import { MatCheckboxModule } from '@angular/material/checkbox';
-import { MatRippleModule } from '@angular/material/core';
-import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
+import { DIALOG_DATA, Dialog, DialogRef } from '@angular/cdk/dialog';
import { lastValueFrom } from 'rxjs';
import { describeError, readError } from '../common/errors';
import { i18n } from '../common/locale.service';
@@ -29,9 +21,10 @@ import {
} from '../common/notifications';
import { waitForEvent } from '../common/signals';
import { ApplicationIcon, DialogEvent } from '../common/types';
+import { DialogCloseDirective } from '../ui/controls/dialog';
+import { SpinnerComponent } from '../ui/controls/spinner.component';
import { DialogTitleDirective } from '../ui/dialog-title.directive';
import { IconComponent } from '../ui/icon.component';
-import { LoadingLabelDirective } from '../ui/loading-label.directive';
import { TranslatePipe } from '../ui/translate.pipe';
/** Breakdown of what enabling a `ConfirmModalOption` would do */
@@ -157,23 +150,25 @@ export interface ConfirmResponse {
*/
export async function openConfirmModal(
data: ConfirmModalData,
- dialog: MatDialog,
+ dialog: Dialog,
): Promise {
- const ref = dialog.open(
+ const ref = dialog.open(
ConfirmModalComponent,
{
...CONFIRM_METADATA,
data,
},
);
+ // Only a 'done' event passes the filter, and a dismissal closes empty
+ const result = (await Promise.race([
+ waitForEvent(
+ ref.componentInstance.event,
+ (_: DialogEvent) => _.reason === 'done',
+ ),
+ lastValueFrom(ref.closed),
+ ])) as Pick | undefined;
return {
- ...(await Promise.race([
- waitForEvent(
- ref.componentInstance.event,
- (_: DialogEvent) => _.reason === 'done',
- ),
- lastValueFrom(ref.afterClosed()),
- ])),
+ ...result,
loading: (s) => ref.componentInstance?.loading.set(s),
close: () => ref.close(),
};
@@ -186,7 +181,7 @@ export async function openConfirmModal(
* @returns Whether the action ran and succeeded
*/
export async function confirmAndRun(
- dialog: MatDialog,
+ dialog: Dialog,
data: ConfirmModalData,
options: {
loading: string;
@@ -290,20 +285,14 @@ export async function confirmAndRun(
@if (receipt.note) {
{{ receipt.note }}
}
-
+
{{ 'CASCADE.RECEIPT_COPY' | translate }}
@@ -324,15 +313,20 @@ export async function confirmAndRun(
class="border-base-200 bg-base-200/40 w-full space-y-2 rounded-sm border p-3"
[attr.data-option]="option.id"
>
-
+
+
@if (option.description) {
-
+
{{ option.description }}
}
@@ -343,7 +337,7 @@ export async function confirmAndRun(
details-loading
class="flex items-center space-x-2 opacity-60"
>
-
+
{{
'CASCADE.RESOLVING' | translate
@@ -403,7 +397,7 @@ export async function confirmAndRun(
-
+
{{ loading() }}
@@ -414,15 +408,15 @@ export async function confirmAndRun(
>
{{ cancel_text | translate }}
>(MatDialogRef);
- private _data = inject(MAT_DIALOG_DATA);
+ inject>(DialogRef);
+ private _data = inject(DIALOG_DATA);
private _clipboard = inject(Clipboard);
/** Loading state */
@@ -582,10 +573,10 @@ export class ConfirmModalComponent implements OnInit {
public readonly enableClose = () => (this._dialog_ref.disableClose = false);
constructor() {
- // Block Escape and backdrop dismissal while the action runs. Material
- // nulls `componentInstance` on close, so a dismissal mid-action makes
- // the caller's later `loading.set()` throw. The receipt stays
- // dismissable.
+ // Block Escape and backdrop dismissal while the action runs. The CDK
+ // dialog nulls `componentInstance` on close, so a dismissal
+ // mid-action makes the caller's later `loading.set()` throw. The
+ // receipt stays dismissable.
effect(() => {
this._dialog_ref.disableClose = !!this.loading() && !this.result();
});
diff --git a/src/app/overlays/duplicate-modal.component.ts b/src/app/overlays/duplicate-modal.component.ts
index 83814c312..31f1bb851 100644
--- a/src/app/overlays/duplicate-modal.component.ts
+++ b/src/app/overlays/duplicate-modal.component.ts
@@ -5,20 +5,17 @@ import {
signal,
WritableSignal,
} from '@angular/core';
-import {
- MAT_DIALOG_DATA,
- MatDialogModule,
- MatDialogRef,
- MatDialogState,
-} from '@angular/material/dialog';
+import { DIALOG_DATA, DialogRef } from '@angular/cdk/dialog';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
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 { describeError } from '../common/errors';
import { notifyError } from '../common/notifications';
import { DialogEvent, HashMap } from '../common/types';
+import { DialogCloseDirective } from '../ui/controls/dialog';
+import { FormFieldComponent } from '../ui/controls/form-field.component';
+import { SpinnerComponent } from '../ui/controls/spinner.component';
+import { DialogTitleDirective } from '../ui/dialog-title.directive';
import { IconComponent } from '../ui/icon.component';
export interface DuplicateModalData {
@@ -30,15 +27,16 @@ export interface DuplicateModalData {
selector: 'app-duplicate-modal',
template: `
- Duplicate Item
+
+ Duplicate Item
+
-
+
@if (!loading()) {
How many times would you like to duplicate this item?
-
+
-
+
} @else {
@@ -65,7 +63,7 @@ export interface DuplicateModalData {
{{ item.name }} ({{ i + 1 }})
@if (status()[i] === 'loading') {
-
+
} @else if (status()[i] === 'done') {
done
} @else {
@@ -75,10 +73,10 @@ export interface DuplicateModalData {
}
}
-
+
@if (!loading()) {
-
-
+
+
Cancel
Duplicate
-
+
}
`,
imports: [
- MatDialogModule,
+ DialogCloseDirective,
+ DialogTitleDirective,
+ SpinnerComponent,
+ FormFieldComponent,
IconComponent,
- MatFormFieldModule,
- MatInputModule,
FormsModule,
- MatProgressSpinnerModule,
],
})
export class DuplicateModalComponent {
- private _data = inject(MAT_DIALOG_DATA);
+ private _data = inject(DIALOG_DATA);
private _dialog_ref =
- inject>(MatDialogRef);
+ inject>(DialogRef);
+ /** Whether the user closed the dialog */
+ private _closed = false;
+
+ constructor() {
+ this._dialog_ref.closed
+ .pipe(takeUntilDestroyed())
+ .subscribe(() => (this._closed = true));
+ }
/** Emitter for user action on the modal */
public readonly event = output();
@@ -151,7 +157,7 @@ export class DuplicateModalComponent {
this.temp.set(new Array(this.times).fill({}));
for (let i = 0; i < this.times; i++) {
// Stop creating duplicates if the user closes the dialog
- if (this._dialog_ref.getState() !== MatDialogState.OPEN) break;
+ if (this._closed) break;
const new_item = new ItemConstructor({
...item,
id: '',
diff --git a/src/app/overlays/metadata-details-modal.component.ts b/src/app/overlays/metadata-details-modal.component.ts
index c14e3fb3a..b2a24c29a 100644
--- a/src/app/overlays/metadata-details-modal.component.ts
+++ b/src/app/overlays/metadata-details-modal.component.ts
@@ -1,4 +1,4 @@
-import { COMMA, ENTER, SPACE } from '@angular/cdk/keycodes';
+import { DIALOG_DATA, DialogRef } from '@angular/cdk/dialog';
import { Component, inject, OnInit, signal } from '@angular/core';
import { FormsModule } from '@angular/forms';
import {
@@ -8,16 +8,9 @@ import {
submit,
validate,
} from '@angular/forms/signals';
-import { MatChipInputEvent, MatChipsModule } from '@angular/material/chips';
-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 { addSignalChipItem, removeSignalChipItem } from '../common/forms';
+import { ChipListComponent } from '../ui/controls/chip-list.component';
+import { DialogCloseDirective } from '../ui/controls/dialog';
+import { FormFieldComponent } from '../ui/controls/form-field.component';
import { DialogTitleDirective } from '../ui/dialog-title.directive';
import { IconComponent } from '../ui/icon.component';
import type { MetadataFormModel } from '../ui/metadata-display.component';
@@ -42,7 +35,7 @@ export interface MetadataDetailsModalData {
close
@@ -57,61 +50,46 @@ export interface MetadataDetailsModalData {
"
>Name*:
-
+
- {{
+
+ {{
form.name().errors().find((error) => error.kind === 'name')
? 'Property name must be unique'
: 'Property name is required'
- }}
-
+ }}
+
+
-
+
-
+
-
-
- @for (item of editors; track item) {
-
- {{ item }}
-
- cancel
-
-
- }
-
-
+
-
+
-
+
-
+
}
-
-
+
+
@@ -158,16 +160,16 @@ import { TranslatePipe } from '../ui/translate.pipe';
>
{{ item.description }}
-
+
}
}
-
+
@if (second()) {
- {{
- second()?.description
- }}
+
+ {{ second()?.description }}
+
}
-
+
@if (first_details() || second_details()) {
@@ -189,11 +191,12 @@ import { TranslatePipe } from '../ui/translate.pipe';
`,
styles: [``],
imports: [
+ DialogCloseDirective,
+ OptionComponent,
+ SelectComponent,
+ FormFieldComponent,
DialogTitleDirective,
- MatDialogModule,
DiffViewerComponent,
- MatFormFieldModule,
- MatSelectModule,
FormsModule,
TranslatePipe,
IconComponent,
@@ -205,7 +208,7 @@ export class MetadataHistoryModalComponent implements OnInit {
id: string;
parent_name: string;
name: string;
- }>(MAT_DIALOG_DATA);
+ }>(DIALOG_DATA);
public readonly id = this._data.id;
public readonly parent_name = this._data.parent_name;
@@ -216,7 +219,7 @@ export class MetadataHistoryModalComponent implements OnInit {
public first = null;
public readonly second = signal(null);
// The history can hold thousands of versions. A closed select renders
- // only a few options and the selected one; mat-select does not open
+ // only a few options and the selected one; a select does not open
// without options.
public readonly CLOSED_OPTIONS = 20;
public readonly first_open = signal(false);
diff --git a/src/app/overlays/select-item-modal.component.ts b/src/app/overlays/select-item-modal.component.ts
index 66f1979e0..b1df274ce 100644
--- a/src/app/overlays/select-item-modal.component.ts
+++ b/src/app/overlays/select-item-modal.component.ts
@@ -1,13 +1,12 @@
import { Component, EventEmitter, Output, inject } from '@angular/core';
-import { MatRippleModule } from '@angular/material/core';
-import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';
+import { DIALOG_DATA } from '@angular/cdk/dialog';
import { FormsModule } from '@angular/forms';
-import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { DialogEvent } from '../common/types';
+import { DialogCloseDirective } from '../ui/controls/dialog';
+import { SpinnerComponent } from '../ui/controls/spinner.component';
import { ItemSearchFieldComponent } from '../ui/custom-fields/item-search-field.component';
import { IconComponent } from '../ui/icon.component';
-import { LoadingLabelDirective } from '../ui/loading-label.directive';
import { TranslatePipe } from '../ui/translate.pipe';
export interface SelectItemModalData {
@@ -27,8 +26,8 @@ export interface SelectItemModalData {
@if (!loading) {
close
@@ -50,7 +49,7 @@ export interface SelectItemModalData {
class="flex w-full flex-col items-center justify-center p-16 opacity-30"
>
-
+
{{ 'COMMON.PROCESSING_REQUEST' | translate }}
@@ -61,7 +60,7 @@ export interface SelectItemModalData {
-
+
{{ 'MODULES.STATE_UPDATE' | translate }}
@@ -103,7 +97,7 @@ export interface ModuleStateModalData {
-
+
{{ 'MODULES.STATE_LOADING' | translate }}
@@ -112,19 +106,17 @@ export interface ModuleStateModalData {
`,
styles: [``],
imports: [
- LoadingLabelDirective,
+ DialogCloseDirective,
+ SpinnerComponent,
DialogTitleDirective,
- MatDialogModule,
- MatProgressSpinnerModule,
TranslatePipe,
SettingsFieldComponent,
FormsModule,
- MatRippleModule,
IconComponent,
],
})
export class ViewModuleStateModalComponent implements OnInit {
- private _data = inject(MAT_DIALOG_DATA);
+ private _data = inject(DIALOG_DATA);
/** Current state of the selected module */
public readonly state = signal(null);
diff --git a/src/app/overlays/view-response-modal.component.ts b/src/app/overlays/view-response-modal.component.ts
index 631c5c63d..10516da52 100644
--- a/src/app/overlays/view-response-modal.component.ts
+++ b/src/app/overlays/view-response-modal.component.ts
@@ -1,6 +1,6 @@
+import { DIALOG_DATA } from '@angular/cdk/dialog';
import { Component, inject, signal } from '@angular/core';
import { FormsModule } from '@angular/forms';
-import { MAT_DIALOG_DATA } from '@angular/material/dialog';
import { SettingsFieldComponent } from '../ui/custom-fields/settings-field.component';
import { FullscreenModalShellComponent } from '../ui/fullscreen-modal-shell.component';
import { TranslatePipe } from '../ui/translate.pipe';
@@ -36,7 +36,7 @@ export interface ViewResponseModalData {
],
})
export class ViewResponseModalComponent {
- private _data = inject(MAT_DIALOG_DATA);
+ private _data = inject(DIALOG_DATA);
public readonly title = this._data.title || '';
public readonly content_string = signal(null);
diff --git a/src/app/repositories/repositories-state.service.ts b/src/app/repositories/repositories-state.service.ts
index 331004bf6..5aa7546d3 100644
--- a/src/app/repositories/repositories-state.service.ts
+++ b/src/app/repositories/repositories-state.service.ts
@@ -1,5 +1,4 @@
import { computed, inject, resource, Service, signal } from '@angular/core';
-import { MatDialog } from '@angular/material/dialog';
import {
listRepositoryCommits,
listRepositoryDrivers,
@@ -10,6 +9,7 @@ import {
showRepository,
} from '@placeos/ts-client';
+import { Dialog } from '@angular/cdk/dialog';
import { describeError } from '../common/errors';
import { ActiveItemService } from '../common/item.service';
import { i18n } from '../common/locale.service';
@@ -20,7 +20,7 @@ import { DriverFormComponent } from '../drivers/driver-form.component';
@Service()
export class RepositoriesStateService {
private _state = inject(ActiveItemService);
- private _dialog = inject(MatDialog);
+ private _dialog = inject(Dialog);
private _loading = signal(false);
private _driver_list_error = signal('');
diff --git a/src/app/repositories/repositories.component.ts b/src/app/repositories/repositories.component.ts
index f0dee9ddb..9311554f8 100644
--- a/src/app/repositories/repositories.component.ts
+++ b/src/app/repositories/repositories.component.ts
@@ -9,11 +9,7 @@ import { RepositoriesStateService } from './repositories-state.service';
@Component({
selector: 'new-repositories-view',
template: `
-
+
`,
imports: [ItemShellComponent],
})
diff --git a/src/app/repositories/repositories.utilities.ts b/src/app/repositories/repositories.utilities.ts
index eccd57c07..8b9f37dbb 100644
--- a/src/app/repositories/repositories.utilities.ts
+++ b/src/app/repositories/repositories.utilities.ts
@@ -1,5 +1,5 @@
-import { PlaceRepository, PlaceRepositoryType } from '@placeos/ts-client';
import { required, SchemaFn, validate } from '@angular/forms/signals';
+import { PlaceRepository, PlaceRepositoryType } from '@placeos/ts-client';
export interface RepositoryFormModel {
id: string;
diff --git a/src/app/repositories/repository-about.component.ts b/src/app/repositories/repository-about.component.ts
index 4ad2b82fa..f33e37822 100644
--- a/src/app/repositories/repository-about.component.ts
+++ b/src/app/repositories/repository-about.component.ts
@@ -1,12 +1,10 @@
import { AsyncPipe } from '@angular/common';
import { Component, computed, inject, signal } from '@angular/core';
-import { MatRippleModule } from '@angular/material/core';
-import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
-import { MatTooltipModule } from '@angular/material/tooltip';
import { PlaceRepositoryType } from '@placeos/ts-client';
+import { SpinnerComponent } from '../ui/controls/spinner.component';
+import { TooltipDirective } from '../ui/controls/tooltip.directive';
import { IconComponent } from '../ui/icon.component';
import { ItemTimestampsComponent } from '../ui/item-timestamps.component';
-import { LoadingLabelDirective } from '../ui/loading-label.directive';
import { MarkdownPipe } from '../ui/pipes/markdown.pipe';
import { TranslatePipe } from '../ui/translate.pipe';
import { RepositoriesStateService } from './repositories-state.service';
@@ -94,7 +92,7 @@ import { maskUriCredentials } from './repositories.utilities';
{{ item().branch }}
@@ -105,7 +103,7 @@ import { maskUriCredentials } from './repositories.utilities';
+
}
}
@@ -195,13 +193,11 @@ import { maskUriCredentials } from './repositories.utilities';
`,
],
imports: [
+ SpinnerComponent,
+ TooltipDirective,
ItemTimestampsComponent,
- LoadingLabelDirective,
MarkdownPipe,
TranslatePipe,
- MatProgressSpinnerModule,
- MatRippleModule,
- MatTooltipModule,
AsyncPipe,
IconComponent,
],
diff --git a/src/app/repositories/repository-changelog.component.ts b/src/app/repositories/repository-changelog.component.ts
index 4fb425aff..74ad23212 100644
--- a/src/app/repositories/repository-changelog.component.ts
+++ b/src/app/repositories/repository-changelog.component.ts
@@ -1,8 +1,7 @@
import { AsyncPipe } from '@angular/common';
import { Component, inject } from '@angular/core';
-import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
+import { SpinnerComponent } from '../ui/controls/spinner.component';
import { IconComponent } from '../ui/icon.component';
-import { LoadingLabelDirective } from '../ui/loading-label.directive';
import { MarkdownPipe } from '../ui/pipes/markdown.pipe';
import { TranslatePipe } from '../ui/translate.pipe';
import { RepositoriesStateService } from './repositories-state.service';
@@ -17,7 +16,7 @@ import { RepositoriesStateService } from './repositories-state.service';
role="status"
aria-label="Loading changelog"
>
-
+
} @else if (changelog()) {
{{ 'REPOS.AVAILABLE_DRIVERS' | translate }}
-
add
@@ -92,14 +90,12 @@ import { RepositoriesStateService } from './repositories-state.service';
`,
],
imports: [
- LoadingLabelDirective,
+ ProgressBarComponent,
+ TooltipDirective,
IconComponent,
TranslatePipe,
- MatTooltipModule,
DriverFormatPipe,
SimpleTableComponent,
- MatProgressBarModule,
- MatRippleModule,
],
})
export class RepositoryDriversComponent {
diff --git a/src/app/repositories/repository-form.component.ts b/src/app/repositories/repository-form.component.ts
index 6f45190ba..980b96212 100644
--- a/src/app/repositories/repository-form.component.ts
+++ b/src/app/repositories/repository-form.component.ts
@@ -15,13 +15,8 @@ import {
import { FormsModule } from '@angular/forms';
import { FormField, disabled, form } from '@angular/forms/signals';
+import { DIALOG_DATA, DialogRef } from '@angular/cdk/dialog';
import { DatePipe, SlicePipe } from '@angular/common';
-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 { MatSelectModule } from '@angular/material/select';
-import { MatTooltipModule } from '@angular/material/tooltip';
import {
GitCommitDetails,
PlaceRepository,
@@ -41,9 +36,16 @@ import { i18n } from '../common/locale.service';
import { notifyError } from '../common/notifications';
import { DialogEvent, Identity } from '../common/types';
import { isValidUrl } from '../common/validation';
+import { FormFieldComponent } from '../ui/controls/form-field.component';
+import { OptionComponent } from '../ui/controls/option.component';
+import {
+ SelectComponent,
+ SelectTriggerDirective,
+} from '../ui/controls/select.component';
+import { SpinnerComponent } from '../ui/controls/spinner.component';
+import { TooltipDirective } from '../ui/controls/tooltip.directive';
import { FullscreenModalShellComponent } from '../ui/fullscreen-modal-shell.component';
import { IconComponent } from '../ui/icon.component';
-import { LoadingLabelDirective } from '../ui/loading-label.directive';
import { SettingsToggleComponent } from '../ui/settings-toggle.component';
import { TranslatePipe } from '../ui/translate.pipe';
import {
@@ -78,19 +80,18 @@ interface RepositoryCommit extends Partial {
{{ 'COMMON.FIELD_NAME' | translate
}}*
-
+
- {{
- 'REPOS.NAME_REQUIRED' | translate
- }}
-
+
+ {{ 'REPOS.NAME_REQUIRED' | translate }}
+
+
}
@@ -101,8 +102,8 @@ interface RepositoryCommit extends Partial {
-
-
+ {
type of repo_types();
track type
) {
-
+
{{ type.name }}
-
+
}
-
-
+
+
}
@if (!is_editing() && form.folder_name) {
@@ -131,19 +132,21 @@ interface RepositoryCommit extends Partial {
{{ 'REPOS.FOLDER_NAME' | translate
}}*
-
+
- {{
- 'REPOS.FOLDER_NAME_REQUIRED' | translate
- }}
-
+
+ {{
+ 'REPOS.FOLDER_NAME_REQUIRED'
+ | translate
+ }}
+
+
}
@@ -157,18 +160,17 @@ interface RepositoryCommit extends Partial {
>
{{ 'REPOS.URI' | translate }}*
-
+
- {{
- 'REPOS.URI_REQUIRED' | translate
- }}
-
+
+ {{ 'REPOS.URI_REQUIRED' | translate }}
+
+
}
@@ -177,9 +179,8 @@ interface RepositoryCommit extends Partial {
-
+
{
[formField]="form.username"
(blur)="markCredentialsBlur()"
/>
-
+
}
@if (form.password) {
@@ -196,9 +197,8 @@ interface RepositoryCommit extends Partial {
-
+
{
/>
{
>
visibility
-
+
}
@@ -239,15 +239,15 @@ interface RepositoryCommit extends Partial {
>
{{ 'REPOS.BRANCH' | translate }}*
-
-
+
-
{
: { name: 'branches' }
"
/>
-
+
@for (
branch of filtered_branch_list();
track branch
) {
-
+
{{ branch }}
-
+
}
-
+
@if (loading_branches()) {
-
-
+
+
}
- {{
- 'REPOS.BRANCH_REQUIRED' | translate
- }}
-
+
+ {{ 'REPOS.BRANCH_REQUIRED' | translate }}
+
+
}
@if (is_interface()) {
@@ -304,15 +304,15 @@ interface RepositoryCommit extends Partial {
-
-
+
-
+
@@ -331,8 +331,8 @@ interface RepositoryCommit extends Partial {
}}
-
-
+
{
: { name: 'commits' }
"
/>
-
+
@for (
commit of filtered_commit_list();
track commit
) {
-
+
{
>
@@ -416,15 +416,15 @@ interface RepositoryCommit extends Partial {
}}
-
+
}
-
+
@if (loading_commits()) {
-
-
+
+
}
-
+
{
-
+
-
+
}
@if (form.root_path) {
@@ -458,16 +457,15 @@ interface RepositoryCommit extends Partial {
-
+
-
+
}
@@ -488,15 +486,15 @@ interface RepositoryCommit extends Partial {
`,
],
imports: [
- LoadingLabelDirective,
- MatFormFieldModule,
- MatInputModule,
- MatProgressSpinnerModule,
+ SpinnerComponent,
+ TooltipDirective,
+ SelectTriggerDirective,
+ OptionComponent,
+ SelectComponent,
+ FormFieldComponent,
FormField,
TranslatePipe,
FormsModule,
- MatSelectModule,
- MatTooltipModule,
IconComponent,
SettingsToggleComponent,
FullscreenModalShellComponent,
@@ -506,9 +504,9 @@ interface RepositoryCommit extends Partial {
})
export class RepositoryFormComponent extends AsyncHandler implements OnInit {
private _dialog_ref =
- inject>(MatDialogRef);
+ inject>(DialogRef);
private _data = inject<{ item: PlaceRepository; readonly?: string }>(
- MAT_DIALOG_DATA,
+ DIALOG_DATA,
);
private _injector = inject(Injector);
private readonly _name = 'REPOS';
diff --git a/src/app/systems/system-about.component.ts b/src/app/systems/system-about.component.ts
index 26b87d8f9..373d80efd 100644
--- a/src/app/systems/system-about.component.ts
+++ b/src/app/systems/system-about.component.ts
@@ -1,12 +1,10 @@
import { AsyncPipe } from '@angular/common';
import { Component, inject } from '@angular/core';
-import { MatRippleModule } from '@angular/material/core';
-import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
-import { MatTooltipModule } from '@angular/material/tooltip';
+import { SpinnerComponent } from '../ui/controls/spinner.component';
+import { TooltipDirective } from '../ui/controls/tooltip.directive';
import { SettingsFormComponent } from '../ui/forms/settings-form.component';
import { IconComponent } from '../ui/icon.component';
import { ItemTimestampsComponent } from '../ui/item-timestamps.component';
-import { LoadingLabelDirective } from '../ui/loading-label.directive';
import { MarkdownPipe } from '../ui/pipes/markdown.pipe';
import { TranslatePipe } from '../ui/translate.pipe';
import { SystemStateService } from './system-state.service';
@@ -141,9 +139,9 @@ import { SystemStateService } from './system-state.service';
icon
default
start
- matRipple
+ ripple
(click)="start()"
- [matTooltip]="'SYSTEMS.START' | translate"
+ [appTooltip]="'SYSTEMS.START' | translate"
>
play_arrow
@@ -152,9 +150,9 @@ import { SystemStateService } from './system-state.service';
default
error
stop
- matRipple
+ ripple
(click)="stop()"
- [matTooltip]="'SYSTEMS.STOP' | translate"
+ [appTooltip]="'SYSTEMS.STOP' | translate"
>
stop
@@ -189,13 +187,13 @@ import { SystemStateService } from './system-state.service';
} @else {
-
+
{{ 'SYSTEMS.LOADING_SETTINGS' | translate }}
}
} @placeholder {
-
+
{{ 'SYSTEMS.LOADING_SETTINGS' | translate }}
}
@@ -210,14 +208,12 @@ import { SystemStateService } from './system-state.service';
`,
],
imports: [
+ SpinnerComponent,
+ TooltipDirective,
ItemTimestampsComponent,
- LoadingLabelDirective,
TranslatePipe,
MarkdownPipe,
- MatProgressSpinnerModule,
SettingsFormComponent,
- MatRippleModule,
- MatTooltipModule,
IconComponent,
AsyncPipe,
],
diff --git a/src/app/systems/system-form.component.ts b/src/app/systems/system-form.component.ts
index 4df0fe4ac..306c5a3b1 100644
--- a/src/app/systems/system-form.component.ts
+++ b/src/app/systems/system-form.component.ts
@@ -1,4 +1,3 @@
-import { COMMA, ENTER, SPACE } from '@angular/cdk/keycodes';
import {
Component,
computed,
@@ -9,12 +8,6 @@ import {
signal,
} from '@angular/core';
import { form, FormField } from '@angular/forms/signals';
-import {
- MatChipEditedEvent,
- MatChipInputEvent,
- MatChipsModule,
-} from '@angular/material/chips';
-import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import {
addSystem,
PlaceResource,
@@ -23,21 +16,19 @@ import {
} from '@placeos/ts-client';
import { querySupportZones as queryZones } from '../common/support-access';
-import { MatAutocompleteModule } from '@angular/material/autocomplete';
-import { MatFormFieldModule } from '@angular/material/form-field';
-import { MatInputModule } from '@angular/material/input';
-import {
- addSignalChipItem,
- editSignalChipItem,
- mergeFormItem,
- onSaveHotkey,
- removeSignalChipItem,
- submitFormDialog,
-} from '../common/forms';
+import { mergeFormItem, onSaveHotkey, submitFormDialog } from '../common/forms';
import { i18n } from '../common/locale.service';
import { TIMEZONES_IANA } from '../common/timezones';
import { DialogEvent } from '../common/types';
+import { DIALOG_DATA, DialogRef } from '@angular/cdk/dialog';
+import {
+ AutocompleteComponent,
+ AutocompleteTriggerDirective,
+} from '../ui/controls/autocomplete.component';
+import { ChipListComponent } from '../ui/controls/chip-list.component';
+import { FormFieldComponent } from '../ui/controls/form-field.component';
+import { OptionComponent } from '../ui/controls/option.component';
import { CounterComponent } from '../ui/counter.component';
import { ImageListFieldComponent } from '../ui/custom-fields/image-list-field.component';
import { ItemSearchFieldComponent } from '../ui/custom-fields/item-search-field.component';
@@ -104,19 +95,21 @@ const TIMEZONE_OPTION_LIMIT = 50;
{{ 'COMMON.FIELD_NAME' | translate
}}*
-
+
@if (form.name().invalid()) {
- {{
- 'SYSTEMS.NAME_REQUIRED' | translate
- }}
+
+ {{
+ 'SYSTEMS.NAME_REQUIRED'
+ | translate
+ }}
+
}
-
+
}
@if (form.email) {
@@ -130,9 +123,8 @@ const TIMEZONE_OPTION_LIMIT = 50;
>
{{ 'COMMON.FIELD_EMAIL' | translate }}
-
+
@if (form.email().invalid()) {
- {{
- 'SYSTEMS.EMAIL_REQUIRED' | translate
- }}
+
+ {{
+ 'SYSTEMS.EMAIL_REQUIRED'
+ | translate
+ }}
+
}
-
+
}
@@ -154,16 +149,15 @@ const TIMEZONE_OPTION_LIMIT = 50;
-
+
-
+
}
@if (form.code) {
@@ -171,16 +165,15 @@ const TIMEZONE_OPTION_LIMIT = 50;
-
+
-
+
}
@@ -195,19 +188,18 @@ const TIMEZONE_OPTION_LIMIT = 50;
>
{{ 'SYSTEMS.SUPPORT_URL' | translate }}
-
+
-
+
{{ 'SYSTEMS.URL_VALID' | translate }}
-
-
+
+
}
@@ -278,16 +270,15 @@ const TIMEZONE_OPTION_LIMIT = 50;
-
+
-
+
}
@if (form.features) {
@@ -301,45 +292,19 @@ const TIMEZONE_OPTION_LIMIT = 50;
>
{{ 'SYSTEMS.FEATURES' | translate }}
-
-
+
- @for (item of feature_list(); track item) {
-
-
- {{ item }}
-
-
- cancel
-
-
- }
-
-
-
+
}
@if (form.security_groups) {
@@ -353,50 +318,17 @@ const TIMEZONE_OPTION_LIMIT = 50;
>
{{ 'SYSTEMS.SECURITY_GROUPS' | translate }}
-
-
+
- @for (
- item of security_group_list();
- track item
- ) {
-
-
- {{ item }}
-
-
- cancel
-
-
- }
-
-
-
+
}
@if (form.map_id) {
@@ -404,46 +336,44 @@ const TIMEZONE_OPTION_LIMIT = 50;
-
+
-
+
}
-
-
+
+
search
-
-
+
+
@for (tz of filtered_timezones(); track tz) {
-
+
{{ tz }}
-
+
}
@if (!filtered_timezones().length) {
-
+
{{ 'COMMON.TIMEZONE_EMPTY' | translate }}
-
+
}
-
+
@if (form.images) {
@@ -469,19 +399,18 @@ const TIMEZONE_OPTION_LIMIT = 50;
>
{{ 'SYSTEMS.TIMETABLE_URL' | translate }}
-
+
-
+
{{ 'SYSTEMS.URL_VALID' | translate }}
-
-
+
+
}
@if (form.camera_url) {
@@ -495,19 +424,18 @@ const TIMEZONE_OPTION_LIMIT = 50;
>
{{ 'SYSTEMS.CAMERA_URL' | translate }}
-
+
-
+
{{ 'SYSTEMS.URL_VALID' | translate }}
-
-
+
+
}
@if (form.camera_snapshot_urls) {
@@ -521,75 +449,24 @@ const TIMEZONE_OPTION_LIMIT = 50;
>
{{ 'SYSTEMS.CAMERA_SNAPSHOT_URL' | translate }}
-
-
+
- @for (
- item of camera_snapshot_url_list();
- track item
- ) {
-
-
- edit
-
-
- {{ item }}
-
-
- cancel
-
-
- }
-
-
@if (form.camera_snapshot_urls().invalid()) {
-
+
{{ 'SYSTEMS.URL_VALID' | translate }}
-
+
}
-
+
}
@if (form.room_booking_url) {
@@ -603,64 +480,45 @@ const TIMEZONE_OPTION_LIMIT = 50;
>
{{ 'SYSTEMS.ROOM_BOOKING_URL' | translate }}
-
+
-
+
{{ 'SYSTEMS.URL_VALID' | translate }}
-
-
+
+
}
}
`,
- styles: [
- `
- mat-checkbox {
- margin-top: 2.5em;
- margin-bottom: 1.5em;
- }
-
- /* Material's chip touch target paints over the leading edit button */
- .mat-mdc-chip-edit {
- z-index: 1;
- }
-
- @media screen and (max-width: 640px) {
- mat-checkbox {
- margin-top: 0;
- }
- }
- `,
- ],
imports: [
+ OptionComponent,
+ FormFieldComponent,
ImageListFieldComponent,
FormField,
TranslatePipe,
- MatFormFieldModule,
- MatInputModule,
IconComponent,
- MatChipsModule,
+ ChipListComponent,
SettingsToggleComponent,
CounterComponent,
ItemSearchFieldComponent,
- MatAutocompleteModule,
+ AutocompleteComponent,
+ AutocompleteTriggerDirective,
FullscreenModalShellComponent,
],
})
export class SystemFormComponent {
private _dialog_ref =
- inject>(MatDialogRef);
+ inject>(DialogRef);
private _data = inject<{ item: PlaceSystem; readonly?: string }>(
- MAT_DIALOG_DATA,
+ DIALOG_DATA,
);
private readonly _name = 'SYSTEMS';
public readonly item = signal(this._data.item);
@@ -676,19 +534,10 @@ export class SystemFormComponent {
public heading = i18n(
`${this._name}.${this._data.item.id ? 'EDIT' : 'NEW'}`,
);
- public feature_list = computed(() => this.formModel().features || []);
- public camera_snapshot_url_list = computed(
- () => this.formModel().camera_snapshot_urls || [],
- );
- public security_group_list = computed(
- () => this.formModel().security_groups || [],
- );
/** Function for querying zones */
public readonly query_fn = (_: string) =>
queryZones({ q: _ }).then((resp) => resp.data);
- /** List of separator characters for features */
- public readonly separators: number[] = [ENTER, COMMA, SPACE];
private _timezone = computed(() => this.formModel().timezone || '');
public filtered_timezones = computed(() => {
@@ -747,73 +596,6 @@ export class SystemFormComponent {
);
}
- /**
- * Add a feature to the list of features for the item
- * @param event Input event
- */
- public addFeature(event: MatChipInputEvent): void {
- this.formModel.update((value) => ({
- ...value,
- features: addSignalChipItem(value.features, event),
- }));
- }
-
- /**
- * Remove feature from the list
- * @param existing_feature Feature to remove
- */
- public removeFeature(existing_feature: string): void {
- this.formModel.update((value) => ({
- ...value,
- features: removeSignalChipItem(value.features, existing_feature),
- }));
- }
-
- public addCameraSnapshotUrl(event: MatChipInputEvent): void {
- this.formModel.update((value) => ({
- ...value,
- camera_snapshot_urls: addSignalChipItem(
- value.camera_snapshot_urls,
- event,
- ),
- }));
- }
-
- public editCameraSnapshotUrl(url: string, event: MatChipEditedEvent): void {
- this.formModel.update((value) => ({
- ...value,
- camera_snapshot_urls: editSignalChipItem(
- value.camera_snapshot_urls,
- url,
- event,
- ),
- }));
- }
-
- public removeCameraSnapshotUrl(url: string): void {
- this.formModel.update((value) => ({
- ...value,
- camera_snapshot_urls: removeSignalChipItem(
- value.camera_snapshot_urls,
- url,
- ),
- }));
- }
-
- public addSecurityGroup(event: MatChipInputEvent): void {
- this.formModel.update((value) => ({
- ...value,
- security_groups: addSignalChipItem(value.security_groups, event),
- }));
- }
-
- public removeSecurityGroup(group: string): void {
- this.formModel.update((value) => ({
- ...value,
- security_groups: removeSignalChipItem(value.security_groups, group),
- }));
- }
-
private processURL(system: PlaceSystem, url: string): string {
for (const key in system) {
url = url.replace(
diff --git a/src/app/systems/system-modules.component.ts b/src/app/systems/system-modules.component.ts
index 88bbd2591..ac5aeb46d 100644
--- a/src/app/systems/system-modules.component.ts
+++ b/src/app/systems/system-modules.component.ts
@@ -1,3 +1,5 @@
+import { Dialog } from '@angular/cdk/dialog';
+import { CdkMenu, CdkMenuItem, CdkMenuTrigger } from '@angular/cdk/menu';
import {
Component,
computed,
@@ -7,13 +9,6 @@ import {
untracked,
} from '@angular/core';
import { FormsModule } from '@angular/forms';
-import { MatCheckboxModule } from '@angular/material/checkbox';
-import { MatRippleModule } from '@angular/material/core';
-import { MatDialog } from '@angular/material/dialog';
-import { MatMenuModule } from '@angular/material/menu';
-import { MatProgressBarModule } from '@angular/material/progress-bar';
-import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
-import { MatTooltipModule } from '@angular/material/tooltip';
import { RouterModule } from '@angular/router';
import {
loadModule,
@@ -33,10 +28,12 @@ import {
} from '../overlays/view-module-state.component';
import { BindingDirective } from '../ui/binding.directive';
import { ContextMenuComponent } from '../ui/context-menu.component';
+import { ProgressBarComponent } from '../ui/controls/progress-bar.component';
+import { SpinnerComponent } from '../ui/controls/spinner.component';
+import { TooltipDirective } from '../ui/controls/tooltip.directive';
import { ItemSearchFieldComponent } from '../ui/custom-fields/item-search-field.component';
import { ExecuteMethodFieldComponent } from '../ui/custom-fields/system-exec/execute-method-field.component';
import { IconComponent } from '../ui/icon.component';
-import { LoadingLabelDirective } from '../ui/loading-label.directive';
import { ModuleRuntimeErrorsModalComponent } from '../ui/module-runtime-errors-modal.component';
import { SimpleTableComponent } from '../ui/simple-table.component';
import { TranslatePipe } from '../ui/translate.pipe';
@@ -76,7 +73,7 @@ import { SystemStateService } from './system-state.service';
/>
@@ -96,42 +93,47 @@ import { SystemStateService } from './system-state.service';
device-list
class="min-h-[calc(100%-20rem)] overflow-y-auto p-4"
>
-
-
- @if (active_item()) {
- @for (
- m_item of active_item().running
- ? menu_options
- : offline_options;
- track m_item
- ) {
-
-
-
-
- {{ m_item.name | translate }}
+
+
+ @if (active_item()) {
+ @for (
+ m_item of active_item().running
+ ? menu_options
+ : offline_options;
+ track m_item
+ ) {
+
+
+
+
+ {{ m_item.name | translate }}
+
-
-
+
+ }
}
- }
-
+
+
@@ -155,21 +150,21 @@ import {
`,
styles: [``],
imports: [
- MatFormFieldModule,
- MatSelectModule,
+ OptionComponent,
+ SelectComponent,
+ FormFieldComponent,
FormField,
CounterComponent,
SettingsToggleComponent,
- MatInputModule,
TranslatePipe,
FullscreenModalShellComponent,
],
})
export class TriggerFormComponent implements OnInit {
private _dialog_ref =
- inject>(MatDialogRef);
+ inject>(DialogRef);
private _data = inject<{ item: PlaceTrigger; readonly?: string }>(
- MAT_DIALOG_DATA,
+ DIALOG_DATA,
);
private readonly _name = 'TRIGGERS';
diff --git a/src/app/triggers/trigger-instances.component.ts b/src/app/triggers/trigger-instances.component.ts
index 380defc9e..9beae029c 100644
--- a/src/app/triggers/trigger-instances.component.ts
+++ b/src/app/triggers/trigger-instances.component.ts
@@ -2,12 +2,10 @@ import { Component, inject } from '@angular/core';
import { HashMap } from '../common/types';
-import { MatRippleModule } from '@angular/material/core';
-import { MatProgressBarModule } from '@angular/material/progress-bar';
-import { MatTooltipModule } from '@angular/material/tooltip';
import { RouterModule } from '@angular/router';
+import { ProgressBarComponent } from '../ui/controls/progress-bar.component';
+import { TooltipDirective } from '../ui/controls/tooltip.directive';
import { IconComponent } from '../ui/icon.component';
-import { LoadingLabelDirective } from '../ui/loading-label.directive';
import { DateFromPipe } from '../ui/pipes/date-from.pipe';
import { SimpleTableComponent } from '../ui/simple-table.component';
import { TranslatePipe } from '../ui/translate.pipe';
@@ -17,7 +15,7 @@ import { TriggerStateService } from './trigger-state.service';
selector: 'trigger-systems',
template: `
@@ -224,9 +214,9 @@ import { TranslatePipe } from '../translate.pipe';
`,
],
imports: [
- MatFormFieldModule,
- MatInputModule,
- MatSelectModule,
+ OptionComponent,
+ SelectComponent,
+ FormFieldComponent,
FormField,
TranslatePipe,
],
diff --git a/src/app/ui/forms/oauth-source-form.component.ts b/src/app/ui/forms/oauth-source-form.component.ts
index cdc0df993..13fa95ac5 100644
--- a/src/app/ui/forms/oauth-source-form.component.ts
+++ b/src/app/ui/forms/oauth-source-form.component.ts
@@ -9,11 +9,11 @@ import {
import { FormsModule } from '@angular/forms';
import { FieldTree, FormField } from '@angular/forms/signals';
-import { MatFormFieldModule } from '@angular/material/form-field';
-import { MatInputModule } from '@angular/material/input';
-import { MatSelectModule } from '@angular/material/select';
import { HashMap, Identity } from '../../common/types';
import { OAuthSourceFormModel } from '../../domains/auth-sources.utilities';
+import { FormFieldComponent } from '../controls/form-field.component';
+import { OptionComponent } from '../controls/option.component';
+import { SelectComponent } from '../controls/select.component';
import { ObjectListFieldComponent } from '../custom-fields/object-list-field.component';
import { TranslatePipe } from '../translate.pipe';
@@ -33,21 +33,20 @@ import { TranslatePipe } from '../translate.pipe';
>
{{ 'COMMON.FIELD_NAME' | translate }}*:
-
+
@if (form().name().invalid()) {
-
+
{{
'DOMAINS.AUTHENTICATION_NAME_REQUIRED'
| translate
}}
-
+
}
-
+
}
@@ -56,15 +55,14 @@ import { TranslatePipe } from '../translate.pipe';
-
+
-
+
}
@if (form().client_secret) {
@@ -72,15 +70,14 @@ import { TranslatePipe } from '../translate.pipe';
-
+
-
+
}
@@ -90,16 +87,15 @@ import { TranslatePipe } from '../translate.pipe';
-
+
-
+
}
@if (form().scope) {
@@ -109,15 +105,14 @@ import { TranslatePipe } from '../translate.pipe';
'DOMAINS.OAUTH_SCOPES' | translate
}}:
-
+
-
+
}
@@ -127,15 +122,15 @@ import { TranslatePipe } from '../translate.pipe';
-
-
+
+
@for (type of token_methods; track type) {
-
+
{{ type.name }}
-
+
}
-
-
+
+
}
@if (form().auth_scheme) {
@@ -143,20 +138,20 @@ import { TranslatePipe } from '../translate.pipe';
-
-
+
+
@for (type of auth_schemes; track type) {
-
+
{{
(type.id === 'request_body'
? 'DOMAINS.OAUTH_SCHEME_BODY'
: 'DOMAINS.OAUTH_SCHEME_BASIC'
) | translate
}}
-
+
}
-
-
+
+
}
@@ -165,15 +160,14 @@ import { TranslatePipe } from '../translate.pipe';
-
+
-
+
}
@@ -184,16 +178,15 @@ import { TranslatePipe } from '../translate.pipe';
'DOMAINS.OAUTH_AUTHORISE_URL' | translate
}}:
-
+
-
+
}
@if (form().raw_info_url) {
@@ -203,15 +196,14 @@ import { TranslatePipe } from '../translate.pipe';
'DOMAINS.OAUTH_PROFILE_URL' | translate
}}:
-
+
-
+
}
@@ -287,13 +279,13 @@ import { TranslatePipe } from '../translate.pipe';
`,
],
imports: [
+ OptionComponent,
+ SelectComponent,
+ FormFieldComponent,
ObjectListFieldComponent,
FormsModule,
TranslatePipe,
FormField,
- MatFormFieldModule,
- MatInputModule,
- MatSelectModule,
],
})
export class OauthSourceFormComponent implements OnChanges {
diff --git a/src/app/ui/forms/saml-source-form.component.ts b/src/app/ui/forms/saml-source-form.component.ts
index d79727cb8..e9a93f0ff 100644
--- a/src/app/ui/forms/saml-source-form.component.ts
+++ b/src/app/ui/forms/saml-source-form.component.ts
@@ -8,12 +8,11 @@ import {
} from '@angular/core';
import { FormsModule } from '@angular/forms';
import { FieldTree, FormField } from '@angular/forms/signals';
-import { MatFormFieldModule } from '@angular/material/form-field';
-import { MatInputModule } from '@angular/material/input';
import { AsyncHandler } from '../../common/async-handler.class';
import { HashMap } from '../../common/types';
import { SAMLSourceFormModel } from '../../domains/auth-sources.utilities';
+import { FormFieldComponent } from '../controls/form-field.component';
import { ObjectListFieldComponent } from '../custom-fields/object-list-field.component';
import { TranslatePipe } from '../translate.pipe';
@@ -35,23 +34,22 @@ import { TranslatePipe } from '../translate.pipe';
{{ 'COMMON.FIELD_NAME' | translate
}}*:
-
+
@if (form().name().invalid()) {
-
+
{{
'DOMAINS.AUTHENTICATION_NAME_REQUIRED'
| translate
}}
-
+
}
-
+
}
@if (form().issuer) {
@@ -66,23 +64,22 @@ import { TranslatePipe } from '../translate.pipe';
{{ 'DOMAINS.SAML_ISSUER' | translate
}}*:
-
+
@if (form().issuer().invalid()) {
-
+
{{
'DOMAINS.SAML_ISSUER_REQUIRED'
| translate
}}
-
+
}
-
+
}
@@ -99,9 +96,8 @@ import { TranslatePipe } from '../translate.pipe';
{{ 'DOMAINS.SAML_IDP_TARGET_URL' | translate
}}*:
-
+
@if (form().idp_sso_target_url().invalid()) {
-
+
{{
'DOMAINS.SAML_IDP_TARGET_URL_REQUIRED'
| translate
}}
-
+
}
-
+
}
@if (form().name_identifier_format) {
@@ -130,9 +126,8 @@ import { TranslatePipe } from '../translate.pipe';
>
{{ 'DOMAINS.SAML_NAME_ID_FORMAT' | translate }}:
-
+
+
{{
'DOMAINS.SAML_NAME_ID_FORMAT_REQUIRED'
| translate
}}
-
+
}
-
+
}
@@ -198,9 +193,8 @@ import { TranslatePipe } from '../translate.pipe';
{{ 'DOMAINS.SAML_ASSERTION_URL' | translate
}}*:
-
+
+
{{
'DOMAINS.SAML_ASSERTION_URL_REQUIRED'
| translate
}}
-
+
}
-
+
}
@if (form().idp_cert_fingerprint) {
@@ -230,16 +224,15 @@ import { TranslatePipe } from '../translate.pipe';
'DOMAINS.SAML_CERT_FINGERPRINT' | translate
}}:
-
+
-
+
}
@@ -248,15 +241,14 @@ import { TranslatePipe } from '../translate.pipe';
-
+
-
+
}
@@ -267,15 +259,14 @@ import { TranslatePipe } from '../translate.pipe';
'DOMAINS.SAML_UID_ATTRIBUTE' | translate
}}:
-
+
-
+
}
@if (form().attribute_service_name) {
@@ -286,16 +277,15 @@ import { TranslatePipe } from '../translate.pipe';
| translate
}}:
-
+
-
+
}
@@ -339,16 +329,15 @@ import { TranslatePipe } from '../translate.pipe';
| translate
}}:
-
+
-
+
}
@if (form().slo_default_relay_state) {
@@ -359,16 +348,15 @@ import { TranslatePipe } from '../translate.pipe';
| translate
}}:
-
+
-
+
}
@@ -390,12 +378,11 @@ import { TranslatePipe } from '../translate.pipe';
`,
],
imports: [
- MatFormFieldModule,
+ FormFieldComponent,
FormField,
TranslatePipe,
FormsModule,
ObjectListFieldComponent,
- MatInputModule,
],
})
export class SamlSourceFormComponent extends AsyncHandler implements OnChanges {
diff --git a/src/app/ui/forms/settings-form.component.ts b/src/app/ui/forms/settings-form.component.ts
index dd5a77786..e1881d154 100644
--- a/src/app/ui/forms/settings-form.component.ts
+++ b/src/app/ui/forms/settings-form.component.ts
@@ -27,16 +27,14 @@ import { validateYAML } from '../../systems/systems.utilities';
import { BackofficeUsersService } from '../../users/users.service';
import { AsyncPipe, DatePipe } from '@angular/common';
-import { MatRippleModule } from '@angular/material/core';
-import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
-import { MatTabsModule } from '@angular/material/tabs';
-import { MatTooltipModule } from '@angular/material/tooltip';
import * as yaml from 'js-yaml';
import { readError } from '../../common/errors';
import { i18n } from '../../common/locale.service';
+import { SpinnerComponent } from '../controls/spinner.component';
+import { TabsComponent } from '../controls/tabs.component';
+import { TooltipDirective } from '../controls/tooltip.directive';
import { SettingsFieldComponent } from '../custom-fields/settings-field.component';
import { IconComponent } from '../icon.component';
-import { LoadingLabelDirective } from '../loading-label.directive';
import { DateFromPipe } from '../pipes/date-from.pipe';
import { UserPipe } from '../pipes/user.pipe';
import { TranslatePipe } from '../translate.pipe';
@@ -61,32 +59,32 @@ type SettingsArray = [
icon
default
error
- matRipple
+ ripple
[disabled]="edited_count() <= 0"
- [matTooltip]="'COMMON.CLEAR' | translate"
+ [appTooltip]="'COMMON.CLEAR' | translate"
(click)="clearChanges()"
>
@if (!saving()[shown_option().id]) {
delete_sweep
} @else {
-
+
}
@if (!saving()[shown_option().id]) {
save
} @else {
-
+
}
@@ -94,24 +92,14 @@ type SettingsArray = [
@if (used_settings() && used_settings().length) {