- {{ 'Transfer' | i18n }}
+
{{ 'Transfer' | i18n }}
{{ 'Transfer data from an existing StartOS data drive' | i18n }}
diff --git a/web/projects/setup-wizard/src/app/pages/success.page.ts b/web/projects/setup-wizard/src/app/pages/success.page.ts
index 3f3bd4254..f21d5f4ba 100644
--- a/web/projects/setup-wizard/src/app/pages/success.page.ts
+++ b/web/projects/setup-wizard/src/app/pages/success.page.ts
@@ -29,20 +29,20 @@ import { StateService } from '../services/state.service'
@if (!result) {
@@ -52,15 +52,15 @@ import { StateService } from '../services/state.service'
@if (!stateService.kiosk) {
@@ -177,12 +177,6 @@ import { StateService } from '../services/state.service'
`,
styles: `
- .inline-title {
- display: inline-flex;
- align-items: center;
- gap: 0.5rem;
- }
-
[tuiCell].disabled {
opacity: var(--tui-disabled-opacity);
pointer-events: none;
diff --git a/web/projects/setup-wizard/src/styles.scss b/web/projects/setup-wizard/src/styles.scss
index 24743eccd..b173372da 100644
--- a/web/projects/setup-wizard/src/styles.scss
+++ b/web/projects/setup-wizard/src/styles.scss
@@ -67,10 +67,6 @@ button:disabled {
}
}
-[tuiCell]:not([tuiOption]):not(:last-of-type) {
- box-shadow: 0 calc(0.5rem + 1px) 0 -0.5rem var(--tui-border-normal);
-}
-
// TODO: Remove in Taiga v5.0
[tuiButton] {
min-block-size: var(--t-size);
diff --git a/web/projects/start-tunnel/src/app/app.config.ts b/web/projects/start-tunnel/src/app/app.config.ts
index ce1b94b8e..63e673f3c 100644
--- a/web/projects/start-tunnel/src/app/app.config.ts
+++ b/web/projects/start-tunnel/src/app/app.config.ts
@@ -37,7 +37,7 @@ export const appConfig: ApplicationConfig = {
provideRouter(routes, withRouterConfig({ onSameUrlNavigation: 'reload' })),
provideTaiga({ mode: 'dark' }),
tuiDropdownOptionsProvider({ appearance: 'start-9' }),
- tuiDialogOptionsProvider({ appearance: 'start-9 taiga' }),
+ tuiDialogOptionsProvider({ appearance: 'start-9 taiga', size: 's' }),
{
provide: PatchDB,
deps: [PatchDbSource, PATCH_CACHE],
diff --git a/web/projects/start-tunnel/src/app/routes/home/components/placeholder.ts b/web/projects/start-tunnel/src/app/routes/home/components/placeholder.ts
new file mode 100644
index 000000000..ee8326c6a
--- /dev/null
+++ b/web/projects/start-tunnel/src/app/routes/home/components/placeholder.ts
@@ -0,0 +1,35 @@
+import { ChangeDetectionStrategy, Component, input } from '@angular/core'
+import { TuiIcon } from '@taiga-ui/core'
+
+@Component({
+ selector: 'app-placeholder',
+ template: `
+ @if (icon(); as icon) {
+
+ }
+
+ `,
+ styles: `
+ :host {
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+ gap: 0.5rem;
+ align-items: center;
+ justify-content: center;
+ text-align: center;
+ padding: 1rem;
+ font: var(--tui-typography-body-l);
+ color: var(--tui-text-tertiary);
+
+ tui-icon {
+ font-size: 2.5rem;
+ }
+ }
+ `,
+ changeDetection: ChangeDetectionStrategy.OnPush,
+ imports: [TuiIcon],
+})
+export class PlaceholderComponent {
+ readonly icon = input
()
+}
diff --git a/web/projects/start-tunnel/src/app/routes/home/routes/devices/add.ts b/web/projects/start-tunnel/src/app/routes/home/routes/devices/add.ts
index 230be734d..790ea6f9c 100644
--- a/web/projects/start-tunnel/src/app/routes/home/routes/devices/add.ts
+++ b/web/projects/start-tunnel/src/app/routes/home/routes/devices/add.ts
@@ -168,7 +168,9 @@ export class DevicesAdd {
ip,
})
- this.dialogs.open(DEVICES_CONFIG, { data: config }).subscribe()
+ this.dialogs
+ .open(DEVICES_CONFIG, { data: config, closable: false })
+ .subscribe()
}
} catch (e: any) {
console.error(e)
diff --git a/web/projects/start-tunnel/src/app/routes/home/routes/devices/index.ts b/web/projects/start-tunnel/src/app/routes/home/routes/devices/index.ts
index 6fbdb58c8..6867d00f7 100644
--- a/web/projects/start-tunnel/src/app/routes/home/routes/devices/index.ts
+++ b/web/projects/start-tunnel/src/app/routes/home/routes/devices/index.ts
@@ -3,24 +3,28 @@ import {
Component,
computed,
inject,
- Signal,
} from '@angular/core'
import { toSignal } from '@angular/core/rxjs-interop'
import { ErrorService } from '@start9labs/shared'
import { TuiResponsiveDialogService } from '@taiga-ui/addon-mobile'
import { TuiButton, TuiDataList, TuiDropdown } from '@taiga-ui/core'
-import { TUI_CONFIRM, TuiNotificationMiddleService } from '@taiga-ui/kit'
+import {
+ TUI_CONFIRM,
+ TuiNotificationMiddleService,
+ TuiSkeleton,
+} from '@taiga-ui/kit'
import { PatchDB } from 'patch-db-client'
import { filter, map } from 'rxjs'
+import { PlaceholderComponent } from 'src/app/routes/home/components/placeholder'
import { ApiService } from 'src/app/services/api/api.service'
import { TunnelData } from 'src/app/services/patch-db/data-model'
import { DEVICES_ADD } from './add'
import { DEVICES_CONFIG } from './config'
-import { MappedDevice, MappedSubnet } from './utils'
+import { MappedDevice } from './utils'
@Component({
template: `
-
+
| Name |
@@ -49,7 +53,11 @@ import { MappedDevice, MappedSubnet } from './utils'
iconStart="@tui.ellipsis-vertical"
>
Actions
-
+
} @empty {
- No devices
+
+ |
+ No devices
+ |
+
}
`,
changeDetection: ChangeDetectionStrategy.OnPush,
- imports: [TuiButton, TuiDropdown, TuiDataList],
+ imports: [
+ TuiButton,
+ TuiDropdown,
+ TuiDataList,
+ PlaceholderComponent,
+ TuiSkeleton,
+ ],
})
export default class Devices {
private readonly dialogs = inject(TuiResponsiveDialogService)
@@ -90,7 +108,7 @@ export default class Devices {
private readonly loading = inject(TuiNotificationMiddleService)
private readonly errorService = inject(ErrorService)
- protected readonly subnets: Signal = toSignal(
+ protected readonly subnets = toSignal(
inject>(PatchDB)
.watch$('wg', 'subnets')
.pipe(
@@ -102,11 +120,11 @@ export default class Devices {
})),
),
),
- { initialValue: [] },
+ { initialValue: null },
)
protected readonly devices = computed(() =>
- this.subnets().flatMap(subnet =>
+ this.subnets()?.flatMap(subnet =>
Object.entries(subnet.clients).map(([ip, { name }]) => ({
subnet: {
name: subnet.name,
@@ -141,7 +159,7 @@ export default class Devices {
try {
const data = await this.api.showDeviceConfig({ subnet: subnet.range, ip })
- this.dialogs.open(DEVICES_CONFIG, { data }).subscribe()
+ this.dialogs.open(DEVICES_CONFIG, { data, closable: false }).subscribe()
} catch (e: any) {
console.log(e)
this.errorService.handleError(e)
diff --git a/web/projects/start-tunnel/src/app/routes/home/routes/port-forwards/add.ts b/web/projects/start-tunnel/src/app/routes/home/routes/port-forwards/add.ts
index 8e6e7c69f..21d203947 100644
--- a/web/projects/start-tunnel/src/app/routes/home/routes/port-forwards/add.ts
+++ b/web/projects/start-tunnel/src/app/routes/home/routes/port-forwards/add.ts
@@ -15,6 +15,7 @@ import {
TuiCheckbox,
TuiDialogContext,
TuiError,
+ TuiInput,
TuiNumberFormat,
} from '@taiga-ui/core'
import {
@@ -35,7 +36,7 @@ import { MappedDevice, PortForwardsData } from './utils'