344 lines
24 KiB
HTML
344 lines
24 KiB
HTML
<app-page-header
|
|
[eyebrow]="'routers.profileEyebrow' | translate"
|
|
[title]="routerItem?.name || ('routers.detailTitle' | translate)"
|
|
[subtitle]="subtitle"
|
|
>
|
|
<div header-actions class="header-actions-row router-header-actions router-header-actions--desktop">
|
|
<button pButton type="button" severity="secondary" icon="pi pi-pencil" [label]="'common.edit' | translate" (click)="openEdit()"></button>
|
|
<button *ngIf="!isSwitchos" pButton type="button" icon="pi pi-upload" [label]="'routers.exportOne' | translate" [loading]="exporting" [disabled]="routerItem?.disable_all_backups || routerItem?.disable_export_backups" (click)="runExport()"></button>
|
|
<button pButton type="button" severity="secondary" icon="pi pi-database" [label]="(isSwitchos ? 'routers.downloadSwitchBackup' : 'routers.binaryOne') | translate" [loading]="runningBinary" [disabled]="routerItem?.disable_all_backups || routerItem?.disable_binary_backups" (click)="runBinary()"></button>
|
|
<button pButton type="button" severity="info" icon="pi pi-wifi" [label]="'routers.testConnection' | translate" [loading]="testing" (click)="testConnection()"></button>
|
|
<button pButton type="button" severity="danger" icon="pi pi-trash" [label]="'routers.deleteDevice' | translate" [loading]="deletingRouter" (click)="deleteRouter()"></button>
|
|
</div>
|
|
|
|
<div header-actions class="router-header-actions router-header-actions--mobile">
|
|
<details class="mobile-actions-menu">
|
|
<summary>
|
|
<i class="pi pi-ellipsis-v"></i>
|
|
<span>{{ 'common.actions' | translate }}</span>
|
|
</summary>
|
|
<div class="mobile-actions-menu__list">
|
|
<button pButton type="button" severity="secondary" icon="pi pi-pencil" [label]="'common.edit' | translate" (click)="openEdit()"></button>
|
|
<button *ngIf="!isSwitchos" pButton type="button" icon="pi pi-upload" [label]="'routers.exportOne' | translate" [loading]="exporting" [disabled]="routerItem?.disable_all_backups || routerItem?.disable_export_backups" (click)="runExport()"></button>
|
|
<button pButton type="button" severity="secondary" icon="pi pi-database" [label]="(isSwitchos ? 'routers.downloadSwitchBackup' : 'routers.binaryOne') | translate" [loading]="runningBinary" [disabled]="routerItem?.disable_all_backups || routerItem?.disable_binary_backups" (click)="runBinary()"></button>
|
|
<button pButton type="button" severity="info" icon="pi pi-wifi" [label]="'routers.testConnection' | translate" [loading]="testing" (click)="testConnection()"></button>
|
|
<button pButton type="button" severity="danger" icon="pi pi-trash" [label]="'routers.deleteDevice' | translate" [loading]="deletingRouter" (click)="deleteRouter()"></button>
|
|
</div>
|
|
</details>
|
|
</div>
|
|
</app-page-header>
|
|
|
|
<div class="stats-grid compact-grid">
|
|
<app-stat-card [label]="'routers.deviceType' | translate" [value]="deviceTypeLabel" [hint]="'routers.listSubtitle' | translate" severity="info" icon="pi pi-sitemap" iconClass="icon-blue"></app-stat-card>
|
|
<app-stat-card [label]="'routers.binaryLabel' | translate" [value]="binaryBackups.length" [hint]="'routers.binaryLabelHint' | translate" severity="warn" icon="pi pi-database" iconClass="icon-amber"></app-stat-card>
|
|
<app-stat-card [label]="'routers.connectionLabel' | translate" [value]="connectionStateLabel" [hint]="'routers.connectionLabelHint' | translate" severity="info" icon="pi pi-bolt" iconClass="icon-blue"></app-stat-card>
|
|
<app-stat-card [label]="'routers.sshUser' | translate" [value]="routerItem?.effective_username || '-'" [hint]="'routers.sshUserHint' | translate" severity="secondary" icon="pi pi-user" iconClass="icon-violet"></app-stat-card>
|
|
</div>
|
|
|
|
<div class="dashboard-grid router-detail-grid router-detail-grid--inspection">
|
|
<app-section-card [title]="'routers.deviceStatusTitle' | translate" [subtitle]="'routers.deviceStatusSubtitle' | translate">
|
|
<div class="router-status-panel" *ngIf="connection; else noConnection">
|
|
<div class="metric-grid-2">
|
|
<div class="metric-tile"><span>{{ 'routers.connectionStateTitle' | translate }}</span><strong>{{ connection.success ? ('common.ok' | translate) : ('common.failed' | translate) }}</strong></div>
|
|
<div class="metric-tile"><span>{{ 'routers.lastTestAt' | translate }}</span><strong>{{ connection.tested_at | date:'short' }}</strong></div>
|
|
<div class="metric-tile"><span>{{ 'routers.hostname' | translate }}</span><strong>{{ connection.hostname }}</strong></div>
|
|
<div class="metric-tile"><span>{{ 'routers.model' | translate }}</span><strong>{{ connection.model }}</strong></div>
|
|
<div class="metric-tile"><span>{{ 'routers.version' | translate }}</span><strong>{{ connection.version || 'n/a' }}</strong></div>
|
|
<div class="metric-tile"><span>{{ 'routers.uptime' | translate }}</span><strong>{{ connection.uptime }}</strong></div>
|
|
<div class="metric-tile" *ngIf="isSwitchos"><span>{{ 'routers.httpStatus' | translate }}</span><strong>{{ connection.http_status || '—' }}</strong></div>
|
|
<div class="metric-tile" *ngIf="isSwitchos"><span>{{ 'routers.serverHeader' | translate }}</span><strong>{{ connection.server || '—' }}</strong></div>
|
|
<div class="metric-tile" *ngIf="isSwitchos"><span>{{ 'routers.authMode' | translate }}</span><strong>{{ connection.auth_mode || '—' }}</strong></div>
|
|
<div class="metric-tile" *ngIf="isSwitchos"><span>{{ 'routers.backupEndpoint' | translate }}</span><strong>{{ connection.backup_available ? ('routers.backupAvailable' | translate) : ('routers.backupUnavailable' | translate) }}</strong></div>
|
|
</div>
|
|
<div class="router-status-error" *ngIf="!connection.success && connection.error">
|
|
<strong>{{ 'routers.lastError' | translate }}</strong>
|
|
<span>{{ connection.error }}</span>
|
|
</div>
|
|
</div>
|
|
<ng-template #noConnection>
|
|
<div class="empty-state compact-empty">
|
|
<i class="pi pi-sitemap"></i>
|
|
<p>{{ 'routers.noConnection' | translate }}</p>
|
|
</div>
|
|
</ng-template>
|
|
</app-section-card>
|
|
|
|
<app-section-card [title]="'routers.backupSettingsTitle' | translate" [subtitle]="'routers.backupSettingsHint' | translate">
|
|
<form [formGroup]="settingsForm" class="device-settings-form" (ngSubmit)="saveSettings()">
|
|
<div class="device-settings-stack">
|
|
<label class="device-toggle device-toggle--primary" [class.is-active]="settingsForm.controls.disable_all_backups.value">
|
|
<input type="checkbox" formControlName="disable_all_backups" />
|
|
<span class="device-toggle__switch" aria-hidden="true"></span>
|
|
<span class="device-toggle__icon"><i class="pi pi-ban"></i></span>
|
|
<span class="device-toggle__content">
|
|
<strong>{{ 'routers.disableAllBackups' | translate }}</strong>
|
|
<small>{{ 'routers.disableAllBackupsHint' | translate }}</small>
|
|
</span>
|
|
</label>
|
|
<label class="device-toggle" *ngIf="!isSwitchos" [class.is-active]="settingsForm.controls.disable_export_backups.value">
|
|
<input type="checkbox" formControlName="disable_export_backups" />
|
|
<span class="device-toggle__switch" aria-hidden="true"></span>
|
|
<span class="device-toggle__icon"><i class="pi pi-file-export"></i></span>
|
|
<span class="device-toggle__content">
|
|
<strong>{{ 'routers.disableExports' | translate }}</strong>
|
|
<small>{{ 'routers.disableExportsHint' | translate }}</small>
|
|
</span>
|
|
</label>
|
|
<label class="device-toggle" [class.is-active]="settingsForm.controls.disable_binary_backups.value">
|
|
<input type="checkbox" formControlName="disable_binary_backups" />
|
|
<span class="device-toggle__switch" aria-hidden="true"></span>
|
|
<span class="device-toggle__icon"><i class="pi pi-database"></i></span>
|
|
<span class="device-toggle__content">
|
|
<strong>{{ 'routers.disableBinaryBackups' | translate }}</strong>
|
|
<small>{{ 'routers.disableBinaryBackupsHint' | translate }}</small>
|
|
</span>
|
|
</label>
|
|
<label class="device-toggle" [class.is-active]="settingsForm.controls.disable_ping.value">
|
|
<input type="checkbox" formControlName="disable_ping" />
|
|
<span class="device-toggle__switch" aria-hidden="true"></span>
|
|
<span class="device-toggle__icon"><i class="pi pi-wifi"></i></span>
|
|
<span class="device-toggle__content">
|
|
<strong>{{ 'routers.disablePing' | translate }}</strong>
|
|
<small>{{ 'routers.disablePingHint' | translate }}</small>
|
|
</span>
|
|
</label>
|
|
</div>
|
|
<div class="dialog-actions device-settings-actions">
|
|
<button pButton type="submit" [loading]="savingSettings" [disabled]="savingSettings" [label]="'common.save' | translate"></button>
|
|
</div>
|
|
</form>
|
|
</app-section-card>
|
|
</div>
|
|
|
|
<div class="router-detail-split-grid" *ngIf="!isSwitchos">
|
|
<app-section-card [title]="'routers.previewTitle' | translate" [subtitle]="'routers.previewSubtitle' | translate">
|
|
<div class="router-modal-summary" *ngIf="hasPreview; else noPreview">
|
|
<div>
|
|
<strong>{{ previewTitle }}</strong>
|
|
<small>{{ 'routers.previewModalHint' | translate }}</small>
|
|
</div>
|
|
<div class="dialog-actions">
|
|
<button pButton type="button" severity="info" icon="pi pi-eye" [label]="'routers.openPreviewModal' | translate" (click)="openPreviewModal()"></button>
|
|
</div>
|
|
</div>
|
|
<ng-template #noPreview>
|
|
<div class="empty-state compact-empty">
|
|
<i class="pi pi-eye"></i>
|
|
<p>{{ 'routers.noPreview' | translate }}</p>
|
|
</div>
|
|
</ng-template>
|
|
</app-section-card>
|
|
|
|
<app-section-card [title]="'routers.diffTitle' | translate" [subtitle]="'routers.diffSubtitle' | translate">
|
|
<div class="router-modal-summary" *ngIf="hasDiff && diffData; else noDiff">
|
|
<div>
|
|
<strong>{{ diffData.left_file_name }} → {{ diffData.right_file_name }}</strong>
|
|
<small>{{ 'routers.diffModalHint' | translate }}</small>
|
|
</div>
|
|
<div class="dialog-actions">
|
|
<button pButton type="button" severity="help" icon="pi pi-code" [label]="'routers.openDiffModal' | translate" (click)="openDiffModal()"></button>
|
|
</div>
|
|
</div>
|
|
<ng-template #noDiff>
|
|
<div class="empty-state compact-empty">
|
|
<i class="pi pi-code"></i>
|
|
<p>{{ 'routers.noDiff' | translate }}</p>
|
|
</div>
|
|
</ng-template>
|
|
</app-section-card>
|
|
</div>
|
|
|
|
<div class="dashboard-grid router-detail-grid router-detail-grid--stack" *ngIf="!isSwitchos">
|
|
<app-section-card [title]="'routers.exportsTableTitle' | translate" [subtitle]="'routers.exportsTableSubtitle' | translate">
|
|
<p-table [value]="exportBackups" responsiveLayout="stack" [breakpoint]="'960px'" styleClass="app-table repository-table repository-table--router-detail">
|
|
<ng-template pTemplate="header">
|
|
<tr><th>{{ 'files.fileColumn' | translate }}</th><th>{{ 'files.createdColumn' | translate }}</th><th>{{ 'common.actions' | translate }}</th></tr>
|
|
</ng-template>
|
|
<ng-template pTemplate="body" let-item let-i="rowIndex">
|
|
<tr>
|
|
<td>
|
|
<span class="p-column-title">{{ 'files.fileColumn' | translate }}</span>
|
|
<div class="table-primary table-primary--ellipsis" [attr.title]="item.file_name">{{ item.file_name }}</div>
|
|
<small class="table-secondary">{{ 'files.exportType' | translate }}</small>
|
|
</td>
|
|
<td>
|
|
<span class="p-column-title">{{ 'files.createdColumn' | translate }}</span>
|
|
{{ item.created_at }}
|
|
</td>
|
|
<td>
|
|
<span class="p-column-title">{{ 'common.actions' | translate }}</span>
|
|
<div class="table-actions table-actions--labels table-actions--tight table-actions--desktop-row">
|
|
<button pButton type="button" size="small" styleClass="table-action-btn table-action-btn--wide table-action-btn--compact" icon="pi pi-download" [label]="'common.download' | translate" (click)="download(item.id)"></button>
|
|
<button pButton type="button" size="small" styleClass="table-action-btn table-action-btn--wide table-action-btn--compact" severity="info" icon="pi pi-eye" [label]="'common.preview' | translate" (click)="viewExport(item.id)"></button>
|
|
<button pButton type="button" size="small" styleClass="table-action-btn table-action-btn--wide table-action-btn--compact" severity="secondary" icon="pi pi-envelope" [label]="'common.email' | translate" (click)="sendEmail(item.id)"></button>
|
|
<button pButton *ngIf="i > 0" type="button" size="small" styleClass="table-action-btn table-action-btn--wide table-action-btn--compact" severity="help" icon="pi pi-code" [label]="'common.diff' | translate" (click)="compareToLatest(item.id)"></button>
|
|
<button pButton type="button" size="small" styleClass="table-action-btn table-action-btn--wide table-action-btn--compact" severity="danger" icon="pi pi-trash" [label]="'common.delete' | translate" (click)="remove(item.id)"></button>
|
|
</div>
|
|
<details class="table-row-menu">
|
|
<summary><i class="pi pi-ellipsis-h"></i><span>{{ 'common.actions' | translate }}</span></summary>
|
|
<div class="table-row-menu__list">
|
|
<button pButton type="button" size="small" styleClass="table-action-btn table-action-btn--wide table-action-btn--compact" icon="pi pi-download" [label]="'common.download' | translate" (click)="download(item.id)"></button>
|
|
<button pButton type="button" size="small" styleClass="table-action-btn table-action-btn--wide table-action-btn--compact" severity="info" icon="pi pi-eye" [label]="'common.preview' | translate" (click)="viewExport(item.id)"></button>
|
|
<button pButton type="button" size="small" styleClass="table-action-btn table-action-btn--wide table-action-btn--compact" severity="secondary" icon="pi pi-envelope" [label]="'common.email' | translate" (click)="sendEmail(item.id)"></button>
|
|
<button pButton *ngIf="i > 0" type="button" size="small" styleClass="table-action-btn table-action-btn--wide table-action-btn--compact" severity="help" icon="pi pi-code" [label]="'common.diff' | translate" (click)="compareToLatest(item.id)"></button>
|
|
<button pButton type="button" size="small" styleClass="table-action-btn table-action-btn--wide table-action-btn--compact" severity="danger" icon="pi pi-trash" [label]="'common.delete' | translate" (click)="remove(item.id)"></button>
|
|
</div>
|
|
</details>
|
|
</td>
|
|
</tr>
|
|
</ng-template>
|
|
</p-table>
|
|
</app-section-card>
|
|
</div>
|
|
|
|
<div class="dashboard-grid router-detail-grid router-detail-grid--stack">
|
|
<app-section-card [title]="'routers.binaryTableTitle' | translate" [subtitle]="'routers.binaryTableSubtitle' | translate">
|
|
<p-table [value]="binaryBackups" responsiveLayout="stack" [breakpoint]="'960px'" styleClass="app-table repository-table repository-table--router-detail">
|
|
<ng-template pTemplate="header">
|
|
<tr><th>{{ 'files.fileColumn' | translate }}</th><th>{{ 'files.createdColumn' | translate }}</th><th>{{ 'common.actions' | translate }}</th></tr>
|
|
</ng-template>
|
|
<ng-template pTemplate="body" let-item>
|
|
<tr>
|
|
<td>
|
|
<span class="p-column-title">{{ 'files.fileColumn' | translate }}</span>
|
|
<div class="table-primary table-primary--ellipsis" [attr.title]="item.file_name">{{ item.file_name }}</div>
|
|
<small class="table-secondary">{{ 'files.binaryType' | translate }}</small>
|
|
</td>
|
|
<td>
|
|
<span class="p-column-title">{{ 'files.createdColumn' | translate }}</span>
|
|
{{ item.created_at }}
|
|
</td>
|
|
<td>
|
|
<span class="p-column-title">{{ 'common.actions' | translate }}</span>
|
|
<div class="table-actions table-actions--labels table-actions--tight table-actions--desktop-row">
|
|
<button pButton type="button" size="small" styleClass="table-action-btn table-action-btn--wide table-action-btn--compact" icon="pi pi-download" [label]="'common.download' | translate" (click)="download(item.id)"></button>
|
|
<button *ngIf="!isSwitchos" pButton type="button" size="small" styleClass="table-action-btn table-action-btn--wide table-action-btn--compact" severity="help" icon="pi pi-upload" [label]="'common.restore' | translate" (click)="upload(item.id)"></button>
|
|
<button pButton type="button" size="small" styleClass="table-action-btn table-action-btn--wide table-action-btn--compact" severity="secondary" icon="pi pi-envelope" [label]="'common.email' | translate" (click)="sendEmail(item.id)"></button>
|
|
<button pButton type="button" size="small" styleClass="table-action-btn table-action-btn--wide table-action-btn--compact" severity="danger" icon="pi pi-trash" [label]="'common.delete' | translate" (click)="remove(item.id)"></button>
|
|
</div>
|
|
<details class="table-row-menu">
|
|
<summary><i class="pi pi-ellipsis-h"></i><span>{{ 'common.actions' | translate }}</span></summary>
|
|
<div class="table-row-menu__list">
|
|
<button pButton type="button" size="small" styleClass="table-action-btn table-action-btn--wide table-action-btn--compact" icon="pi pi-download" [label]="'common.download' | translate" (click)="download(item.id)"></button>
|
|
<button *ngIf="!isSwitchos" pButton type="button" size="small" styleClass="table-action-btn table-action-btn--wide table-action-btn--compact" severity="help" icon="pi pi-upload" [label]="'common.restore' | translate" (click)="upload(item.id)"></button>
|
|
<button pButton type="button" size="small" styleClass="table-action-btn table-action-btn--wide table-action-btn--compact" severity="secondary" icon="pi pi-envelope" [label]="'common.email' | translate" (click)="sendEmail(item.id)"></button>
|
|
<button pButton type="button" size="small" styleClass="table-action-btn table-action-btn--wide table-action-btn--compact" severity="danger" icon="pi pi-trash" [label]="'common.delete' | translate" (click)="remove(item.id)"></button>
|
|
</div>
|
|
</details>
|
|
</td>
|
|
</tr>
|
|
</ng-template>
|
|
</p-table>
|
|
</app-section-card>
|
|
</div>
|
|
|
|
<p-dialog [(visible)]="previewVisible" [modal]="true" [header]="previewTitle || ('files.previewDialogTitle' | translate)" [style]="{ width: 'min(1100px, 92vw)' }" styleClass="preview-dialog">
|
|
<pre class="code-preview preview-dialog__content">{{ exportContent }}</pre>
|
|
</p-dialog>
|
|
|
|
<p-dialog [(visible)]="diffVisible" [modal]="true" [header]="'files.diffDialogTitle' | translate" [style]="{ width: 'min(1200px, 94vw)' }" styleClass="preview-dialog preview-dialog--diff">
|
|
<div class="diff-layout" *ngIf="diffData as diff; else plainDiffOnly">
|
|
<div class="diff-layout__summary">
|
|
<div>
|
|
<div class="table-primary">{{ diff.left_file_name }}</div>
|
|
<small class="table-secondary">{{ 'files.compareOlder' | translate }}</small>
|
|
</div>
|
|
<div class="diff-layout__summary-arrow"><i class="pi pi-arrow-right"></i></div>
|
|
<div>
|
|
<div class="table-primary">{{ diff.right_file_name }}</div>
|
|
<small class="table-secondary">{{ 'files.compareNewer' | translate }}</small>
|
|
</div>
|
|
<div class="diff-stats" *ngIf="diff.stats">
|
|
<span class="diff-stats__pill diff-stats__pill--added">+{{ diff.stats.added }}</span>
|
|
<span class="diff-stats__pill diff-stats__pill--removed">-{{ diff.stats.removed }}</span>
|
|
<span class="diff-stats__pill diff-stats__pill--modified">~{{ diff.stats.modified }}</span>
|
|
</div>
|
|
</div>
|
|
<pre class="code-preview preview-dialog__content">{{ diff.diff_text }}</pre>
|
|
</div>
|
|
<ng-template #plainDiffOnly>
|
|
<pre class="code-preview preview-dialog__content">{{ diffText }}</pre>
|
|
</ng-template>
|
|
</p-dialog>
|
|
|
|
|
|
<p-dialog [(visible)]="editVisible" [modal]="true" [draggable]="false" [resizable]="false" [style]="{ width: 'min(760px, 96vw)' }" styleClass="router-dialog">
|
|
<ng-template pTemplate="header">
|
|
<div class="router-dialog-header">
|
|
<div class="router-dialog-header__icon">
|
|
<i class="pi" [ngClass]="selectedDeviceType === 'switchos' ? 'pi-sitemap' : 'pi-server'"></i>
|
|
</div>
|
|
<div class="router-dialog-header__text">
|
|
<div class="router-dialog-header__eyebrow">
|
|
{{ 'routers.deviceType' | translate }} · {{ selectedDeviceType === 'switchos' ? ('routers.switchos' | translate) : ('routers.routeros' | translate) }}
|
|
</div>
|
|
<div class="router-dialog-header__title">{{ 'routers.editDialogTitle' | translate }}</div>
|
|
<small>
|
|
{{
|
|
selectedDeviceType === 'switchos'
|
|
? ('routers.switchDialogSubtitle' | translate)
|
|
: ('routers.routerDialogSubtitle' | translate)
|
|
}}
|
|
</small>
|
|
</div>
|
|
</div>
|
|
</ng-template>
|
|
|
|
<form [formGroup]="form" (ngSubmit)="saveEdit()" class="router-dialog-form">
|
|
<section class="router-dialog-panel">
|
|
<div class="router-dialog-panel__header">
|
|
<div>
|
|
<strong>{{ 'routers.connectionSectionTitle' | translate }}</strong>
|
|
<p>{{ 'routers.connectionSectionHint' | translate }}</p>
|
|
</div>
|
|
</div>
|
|
<div class="form-grid-2 router-dialog-grid">
|
|
<span class="form-field">
|
|
<label>{{ 'routers.name' | translate }}</label>
|
|
<input pInputText formControlName="name" />
|
|
<small class="form-field-error" *ngIf="form.controls.name.invalid && (form.controls.name.dirty || form.controls.name.touched)">{{ 'routers.nameValidationHint' | translate }}</small>
|
|
</span>
|
|
<span class="form-field">
|
|
<label>{{ 'routers.deviceType' | translate }}</label>
|
|
<p-select [appendTo]="'body'" [options]="deviceTypeOptions" formControlName="device_type" optionLabel="label" optionValue="value"></p-select>
|
|
</span>
|
|
<span class="form-field">
|
|
<label>{{ 'routers.host' | translate }}</label>
|
|
<input pInputText formControlName="host" />
|
|
</span>
|
|
<span class="form-field">
|
|
<label>{{ 'routers.port' | translate }}</label>
|
|
<input pInputText type="number" formControlName="port" />
|
|
</span>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="router-dialog-panel">
|
|
<div class="router-dialog-panel__header">
|
|
<div>
|
|
<strong>{{ 'routers.credentialsSectionTitle' | translate }}</strong>
|
|
<p>{{ selectedDeviceType === 'switchos' ? ('routers.switchDialogSubtitle' | translate) : ('routers.routerDialogSubtitle' | translate) }}</p>
|
|
</div>
|
|
</div>
|
|
<div class="form-grid-2 router-dialog-grid">
|
|
<span class="form-field">
|
|
<label>{{ 'routers.sshUser' | translate }}</label>
|
|
<input pInputText formControlName="ssh_user" [placeholder]="selectedDeviceType === 'switchos' ? ('routers.switchUserPlaceholder' | translate) : 'admin'" />
|
|
</span>
|
|
<span class="form-field">
|
|
<label>{{ 'routers.sshPassword' | translate }}</label>
|
|
<input pInputText type="password" formControlName="ssh_password" [placeholder]="selectedDeviceType === 'switchos' ? ('routers.switchPasswordPlaceholder' | translate) : ('routers.optionalPassword' | translate)" />
|
|
</span>
|
|
<span class="form-field form-field--full" *ngIf="selectedDeviceType === 'routeros'">
|
|
<label>{{ 'routers.sshPrivateKey' | translate }}</label>
|
|
<textarea pTextarea formControlName="ssh_key" rows="8" [placeholder]="'routers.optionalPrivateKey' | translate"></textarea>
|
|
</span>
|
|
</div>
|
|
</section>
|
|
|
|
<div class="dialog-actions router-dialog-actions">
|
|
<button pButton type="button" severity="secondary" [label]="'common.cancel' | translate" (click)="editVisible=false"></button>
|
|
<button pButton type="submit" [disabled]="form.invalid || saving" [loading]="saving" [label]="'routers.saveRouter' | translate"></button>
|
|
</div>
|
|
</form>
|
|
</p-dialog> |