+ (click)="toggleClientSelection(client)"
+ [ngClass]="{'selected-client': client.selected}" >
![]()
{
- if (client.status === 'og-live') {
- client.selected = true;
- }
- });
+ this.data.clients.forEach((client: { selected: boolean; status: string }) => client.selected = true);
- this.selectedClients = this.data.clients.filter(
- (client: { status: string }) => client.status === 'og-live'
- );
+ this.selectedClients = this.data.clients.filter((client: { selected: boolean }) => client.selected);
- this.selectedModelClient = this.data.clients.find(
- (client: { status: string }) => client.status === 'og-live'
- ) || null;
+ this.selectedModelClient = this.data.clients.find((client: { selected: boolean }) => client.selected) || null;
if (this.selectedModelClient) {
this.loadPartitions(this.selectedModelClient);
diff --git a/ogWebconsole/src/app/components/groups/components/client-main-view/partition-assistant/partition-assistant.component.css b/ogWebconsole/src/app/components/groups/components/client-main-view/partition-assistant/partition-assistant.component.css
index aa7ed80..baaa2b0 100644
--- a/ogWebconsole/src/app/components/groups/components/client-main-view/partition-assistant/partition-assistant.component.css
+++ b/ogWebconsole/src/app/components/groups/components/client-main-view/partition-assistant/partition-assistant.component.css
@@ -1,138 +1,420 @@
+/* ===== ESTILOS PRINCIPALES ===== */
.partition-assistant {
- padding: 40px;
+ padding: 32px;
margin: 20px;
- background-color: #eaeff6;
- border-radius: 12px;
+ background: white !important;
+ border-radius: 16px;
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
+ border: 1px solid #bbdefb;
}
+/* ===== HEADER ===== */
.header-container {
display: flex;
justify-content: space-between;
align-items: center;
- padding: 10px 10px;
- border-bottom: 1px solid #ddd;
+ padding: 24px 32px;
+ background: white;
+ border-radius: 12px;
+ margin-bottom: 20px;
+}
+
+.header-container-title {
+ flex-grow: 1;
+ text-align: left;
+}
+
+.header-container-title h2 {
+ margin: 0 0 8px 0;
+ color: #333;
+ font-weight: 600;
+}
+
+.header-container-title h4 {
+ margin: 0;
+ font-size: 16px;
+ opacity: 0.9;
+ font-weight: 400;
+}
+
+/* ===== DESTINATION BADGE ===== */
+.destination-info {
+ margin-top: 12px;
+}
+
+.destination-badge {
+ display: inline-flex;
+ align-items: center;
+ background: #e3f2fd;
+ color: #1565c0;
+ padding: 12px 16px;
+ border-radius: 12px;
+ border: 1px solid #bbdefb;
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
+ transition: all 0.2s ease;
+}
+
+.destination-icon {
+ font-size: 20px;
+ width: 20px;
+ height: 20px;
+ margin-right: 12px;
+ color: #1976d2;
+}
+
+.destination-content {
+ display: flex;
+ flex-direction: column;
+ gap: 2px;
+}
+
+.destination-label {
+ font-size: 11px;
+ font-weight: 500;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ color: #1976d2;
+ line-height: 1;
+}
+
+.destination-value {
+ font-size: 14px;
+ font-weight: 600;
+ line-height: 1.2;
+ max-width: 200px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ color: #0d47a1;
+}
+
+/* ===== BOTONES ===== */
+.button-row {
+ display: flex;
+ gap: 12px;
+ align-items: center;
+}
+
+.action-button {
+ color: white;
+ border: none;
+ padding: 12px 24px;
+ border-radius: 8px;
+ font-weight: 500;
+ transition: all 0.3s ease;
+ cursor: pointer;
+ margin-top: 10px;
+ margin-bottom: 10px;
+ margin-right: 16px;
+}
+
+.action-button:hover:not(:disabled) {
+ transform: translateY(-1px);
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
+}
+
+.action-button:disabled {
+ opacity: 0.5;
+ cursor: not-allowed;
+}
+
+.row-button {
+ display: flex;
+ align-items: center;
+ gap: 30px;
+}
+
+/* ===== SELECTOR DE DISCO ===== */
+.disk-selector-card {
+ padding: 32px;
+ margin: 20px;
+ background: white !important;
+ border-radius: 16px;
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
+ border: 1px solid #bbdefb;
+ overflow: hidden;
+}
+
+.card-header {
+ display: flex;
+ align-items: center;
+ padding: 24px 32px;
+ background: transparent;
+ color: #1976d2;
+ border-bottom: 1.5px solid #1976d2;
+}
+
+.card-icon {
+ font-size: 28px;
+ width: 28px;
+ height: 28px;
+ margin-right: 16px;
+ color: #1976d2;
+}
+
+.card-title h3 {
+ margin: 0 0 4px 0;
+ font-size: 20px;
+ font-weight: 600;
+ color: #1976d2;
+}
+
+.card-title p {
+ margin: 0;
+ font-size: 14px;
+ opacity: 0.9;
+ color: #1976d2;
+}
+
+.card-content {
+ padding: 24px 32px;
+}
+
+.disk-select-field {
+ width: 100%;
+ margin-bottom: 20px;
+}
+
+/* Opciones del select */
+::ng-deep .disk-option {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ width: 100%;
+ padding: 8px 0;
+}
+
+.disk-info {
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+}
+
+.disk-name {
+ font-weight: 600;
+ font-size: 16px;
+ color: #2c3e50;
}
.disk-size {
- font-size: 1rem;
- font-weight: 600;
- color: #555;
+ font-size: 14px;
+ color: #6c757d;
+ font-weight: 500;
}
-.partition-table {
- width: 100%;
- border-collapse: collapse;
- overflow: hidden;
- margin-bottom: 20px;
-}
-
-.partition-table th {
- color: #333;
- padding: 12px;
- font-weight: 600;
-}
-
-.partition-table td {
- padding: 10px;
- text-align: center;
-}
-
-.partition-table select,
-.partition-table input[type="number"],
-.partition-table input[type="checkbox"] {
- padding: 5px;
- width: 100%;
-}
-
-.actions {
+.disk-details {
display: flex;
- justify-content: flex-end;
- padding-top: 10px;
+ flex-direction: column;
+ align-items: flex-end;
+ gap: 4px;
}
-button.mat-button {
- background-color: #007bff;
- color: white;
+.partitions-count {
+ font-size: 12px;
+ color: #667eea;
+ font-weight: 500;
+ background: rgba(102, 126, 234, 0.1);
+ padding: 2px 8px;
+ border-radius: 12px;
}
-button.mat-button:hover {
- background-color: #0056b3;
+.usage-percent {
+ font-size: 12px;
+ color: #6c757d;
+ font-weight: 500;
}
-button.mat-flat-button {
- background-color: #28a745;
- color: white;
-}
-
-button.mat-flat-button:hover {
- background-color: #218838;
-}
-
-button.remove-btn {
- background-color: #dc3545;
- color: white;
- border-radius: 4px;
- padding: 7px 10px;
-}
-
-button.remove-btn:hover {
- background-color: #c82333;
-}
-
-.error-message {
- color: #dc3545;
- font-size: 0.9rem;
- padding: 10px;
- background-color: #f8d7da;
- border-radius: 4px;
- margin-top: 10px;
-}
-
-.partition-assistant .row {
+/* Información de selección */
+.selection-info {
display: flex;
- flex-wrap: wrap;
- margin-bottom: 20px;
-}
-
-.form-container {
- flex: 0 0 65%;
- max-width: 65%;
- padding-right: 20px;
- box-sizing: border-box;
-}
-
-.chart-container {
- flex: 0 0 35%;
- max-width: 35%;
-}
-
-.partition-bar {
- display: flex;
- height: 40px;
- margin: 20px 0;
-}
-
-.partition-segment {
- display: flex;
- justify-content: center;
align-items: center;
- text-align: center;
- font-size: 10px;
- color: white;
- height: 100%;
+ padding: 16px 20px;
+ background: #e8f5e8;
+ border: 1px solid #c8e6c9;
+ border-radius: 12px;
+ margin-top: 16px;
}
-.chart-container ngx-charts-pie-chart {
- display: block;
- align-content: center;
- justify-self: center;
+.info-icon {
+ font-size: 20px;
+ width: 20px;
+ height: 20px;
+ margin-right: 12px;
+ color: #388e3c;
}
-.disk-select {
+.info-text {
+ display: flex;
+ flex-direction: column;
+ gap: 2px;
+}
+
+.info-title {
+ font-size: 14px;
+ font-weight: 600;
+ color: #2e7d32;
+}
+
+.info-subtitle {
+ font-size: 12px;
+ color: #388e3c;
+}
+
+/* Mensaje cuando no hay discos */
+.no-disks-message {
+ display: flex;
+ align-items: center;
+ padding: 16px 20px;
+ background: #fff3e0;
+ border: 1px solid #ffcc02;
+ border-radius: 12px;
+ margin-top: 16px;
+}
+
+.warning-icon {
+ font-size: 20px;
+ width: 20px;
+ height: 20px;
+ margin-right: 12px;
+ color: #f57c00;
+}
+
+.message-text {
+ display: flex;
+ flex-direction: column;
+ gap: 2px;
+}
+
+.message-title {
+ font-size: 14px;
+ font-weight: 600;
+ color: #e65100;
+}
+
+.message-subtitle {
+ font-size: 12px;
+ color: #f57c00;
+}
+
+/* ===== INFO BADGES ===== */
+.info-badge {
+ display: inline-flex;
+ align-items: center;
+ background: #e8f5e8;
+ color: #2e7d32;
+ padding: 12px 16px;
+ border-radius: 12px;
+ border: 1px solid #c8e6c9;
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
+ transition: all 0.2s ease;
+ margin: 0 8px;
+}
+
+.info-badge:hover {
+ transform: translateY(-1px);
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
+}
+
+.info-content {
+ display: flex;
+ flex-direction: column;
+ gap: 2px;
+}
+
+.info-label {
+ font-size: 11px;
+ font-weight: 500;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ color: #388e3c;
+ line-height: 1;
+}
+
+.info-value {
+ font-size: 14px;
+ font-weight: 600;
+ line-height: 1.2;
+ max-width: 150px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ color: #1b5e20;
+}
+
+/* Badge específico para firmware */
+.info-badge:first-of-type {
+ background: #e3f2fd;
+ border-color: #bbdefb;
+}
+
+.info-badge:first-of-type .info-icon {
+ color: #1976d2;
+}
+
+.info-badge:first-of-type .info-label {
+ color: #1976d2;
+}
+
+.info-badge:first-of-type .info-value {
+ color: #0d47a1;
+}
+
+/* Badge específico para tabla de particiones */
+.info-badge:last-of-type {
+ background: #fff3e0;
+ border-color: #ffcc02;
+}
+
+.info-badge:last-of-type .info-icon {
+ color: #f57c00;
+}
+
+.info-badge:last-of-type .info-label {
+ color: #f57c00;
+}
+
+.info-badge:last-of-type .info-value {
+ color: #e65100;
+}
+
+/* ===== SELECTOR DE CLIENTES ===== */
+.select-container {
+ margin-top: 20px;
+ align-items: center;
+ width: 100%;
+ box-sizing: border-box;
padding: 20px;
- margin: 10px auto;
}
+/* Expansion panel */
+::ng-deep .mat-expansion-panel {
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08) !important;
+ border-radius: 12px !important;
+ margin-bottom: 20px;
+ background: #f7fbff !important;
+ border: 1px solid #bbdefb !important;
+}
+
+::ng-deep .mat-expansion-panel-header {
+ padding: 20px 24px !important;
+ border-radius: 12px !important;
+}
+
+::ng-deep .mat-expansion-panel-header-title {
+ font-weight: 600 !important;
+ color: #2c3e50 !important;
+}
+
+::ng-deep .mat-expansion-panel-header-description {
+ color: #6c757d !important;
+}
+
+.mat-expansion-panel-header-description {
+ justify-content: space-between;
+ align-items: center;
+}
+
+/* Grid de clientes */
.clients-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
@@ -143,6 +425,40 @@ button.remove-btn:hover {
position: relative;
}
+.client-card {
+ background: #ffffff;
+ border-radius: 6px;
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+ overflow: hidden;
+ position: relative;
+ padding: 8px;
+ text-align: center;
+ cursor: pointer;
+ transition: background-color 0.3s, transform 0.2s;
+}
+
+.client-card:hover {
+ background-color: #f0f0f0;
+ transform: scale(1.02);
+}
+
+.selected-client {
+ background: linear-gradient(135deg, #8fa1f0 0%, #9b7bc8 100%);
+ color: white;
+ border-color: #667eea;
+}
+
+.selected-client .client-name,
+.selected-client .client-ip {
+ color: white;
+}
+
+.client-image {
+ width: 40px;
+ height: 40px;
+ margin: 0 auto 8px;
+}
+
.client-details {
margin-top: 4px;
}
@@ -165,38 +481,7 @@ button.remove-btn:hover {
color: #666;
}
-.header-container-title {
- flex-grow: 1;
- text-align: left;
- padding-left: 1em;
-}
-
-.select-container {
- margin-top: 20px;
- align-items: center;
- width: 100%;
- box-sizing: border-box;
- padding-left: 1em;
- padding-right: 1em;
-}
-
-.client-card {
- background: #ffffff;
- border-radius: 6px;
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
- overflow: hidden;
- position: relative;
- padding: 8px;
- text-align: center;
- cursor: pointer;
- transition: background-color 0.3s, transform 0.2s;
-
- &:hover {
- background-color: #f0f0f0;
- transform: scale(1.02);
- }
-}
-
+/* Tooltip personalizado */
::ng-deep .custom-tooltip {
white-space: pre-line !important;
max-width: 200px;
@@ -206,67 +491,267 @@ button.remove-btn:hover {
border-radius: 4px;
}
-.selected-client {
- background-color: #a0c2e5 !important;
- color: white !important;
-}
-
-.button-row {
+/* ===== LAYOUT PRINCIPAL ===== */
+.row {
display: flex;
- padding-right: 1em;
+ flex-wrap: wrap;
+ margin-bottom: 20px;
}
-.disabled-client {
- pointer-events: none;
- opacity: 0.5;
-}
-
-.row-button {
- display: flex;
- align-items: center;
- gap: 30px;
-}
-
-
-.action-button {
- margin-top: 10px;
- margin-bottom: 10px;
-}
-
-.mat-expansion-panel-header-description {
- justify-content: space-between;
- align-items: center;
+.form-container {
+ flex: 0 0 65%;
+ max-width: 65%;
+ padding-right: 20px;
+ box-sizing: border-box;
+ background: white;
+ border-radius: 16px;
+ border: none;
}
+/* ===== INFORMACIÓN DEL DISCO ===== */
.disk-space-info-container {
- display: flex;
- justify-self: start;
- margin-top: 10px;
- gap: 10px;
+ margin: 24px 0;
+ background: none;
+ border-radius: 0;
+ border: none;
+ padding: 0;
}
-.disk-space-info {
- padding: 16px;
- background-color: #f9f9f9;
- border-radius: 12px;
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
+.disk-space-card {
display: flex;
+ gap: 24px;
+ margin-bottom: 20px;
+ flex-wrap: wrap;
+}
+
+.space-info-item {
+ display: flex;
+ align-items: center;
gap: 12px;
- margin: 16px auto;
+ padding: 16px 20px;
+ background: #f8f9fa;
+ border-radius: 12px;
+ border: 1px solid #e9ecef;
+ min-width: 180px;
}
-.chip-free {
- background-color: #d0f0c0; /* verde claro */
- color: #2e7d32;
+.space-icon {
+ font-size: 24px;
+ width: 24px;
+ height: 24px;
+}
+
+.used-icon {
+ color: #dc3545;
+}
+
+.free-icon {
+ color: #28a745;
+}
+
+.total-icon {
+ color: #007bff;
+}
+
+.space-details {
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+}
+
+.space-label {
+ font-size: 12px;
font-weight: 500;
+ color: #6c757d;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
}
-.chip-full {
- background-color: #ffcccb; /* rojo claro */
- color: #c62828;
- font-weight: 500;
+.space-value {
+ font-size: 16px;
+ font-weight: 600;
+ color: #212529;
}
+/* Barra de uso del disco */
+.disk-usage-bar {
+ margin-top: 16px;
+}
+
+.usage-bar-container {
+ width: 100%;
+ height: 12px;
+ background: #e9ecef;
+ border-radius: 6px;
+ overflow: hidden;
+ margin-bottom: 8px;
+}
+
+.usage-bar-fill {
+ height: 100%;
+ background: linear-gradient(90deg, #28a745, #20c997);
+ border-radius: 6px;
+ transition: width 0.3s ease;
+}
+
+.usage-percentage {
+ font-size: 14px;
+ font-weight: 600;
+ color: #666;
+ margin-top: 8px;
+ text-align: center;
+}
+
+/* ===== TABLA DE PARTICIONES ===== */
+.partition-table {
+ width: 100%;
+ border-collapse: collapse;
+ table-layout: fixed;
+}
+
+.partition-table th {
+ background: white !important;
+ color: #495057;
+ padding: 16px 12px;
+ font-weight: 600;
+ text-align: left;
+ border-bottom: 2px solid #e9ecef;
+ font-size: 14px;
+}
+
+.partition-table th:nth-child(1), .partition-table td:nth-child(1) { width: 5%; }
+.partition-table th:nth-child(2), .partition-table td:nth-child(2) { width: 20%; }
+.partition-table th:nth-child(3), .partition-table td:nth-child(3) { width: 20%; }
+.partition-table th:nth-child(4), .partition-table td:nth-child(4) { width: 15%; }
+.partition-table th:nth-child(5), .partition-table td:nth-child(5) { width: 15%; }
+.partition-table th:nth-child(6), .partition-table td:nth-child(6) { width: 5%; }
+.partition-table th:nth-child(7), .partition-table td:nth-child(7) { width: 5%; }
+
+.partition-table td {
+ padding: 6px 8px;
+ border-bottom: 1px solid #f1f3f4;
+ vertical-align: middle;
+}
+
+.partition-table select,
+.partition-table input[type="number"],
+.partition-table input[type="checkbox"] {
+ padding: 5px;
+ width: 100%;
+}
+
+.remove-btn {
+ background-color: #dc3545;
+ color: white !important;
+ border-radius: 4px !important;
+ border: none !important;
+ cursor: pointer !important;
+ border-radius: 4px !important;
+ padding: 7px 10px !important;
+}
+
+.remove-btn:hover {
+ background-color: #c82333;
+}
+
+/* ===== GRÁFICA ===== */
+.chart-container {
+ flex: 0 0 35%;
+ max-width: 35%;
+ align-self: center;
+ justify-self: center;
+}
+
+.chart-header {
+ text-align: center;
+ margin-bottom: 20px;
+}
+
+.chart-header h3 {
+ margin: 0 0 8px 0;
+ color: #2c3e50;
+ font-weight: 600;
+ font-size: 18px;
+}
+
+.chart-header p {
+ margin: 0;
+ color: #6c757d;
+ font-size: 14px;
+}
+
+.chart-container ngx-charts-pie-chart {
+ width: 100% !important;
+ min-width: 0;
+}
+
+/* Forzar la leyenda debajo del gráfico */
+::ng-deep .chart-container ngx-charts-pie-chart .chart-legend {
+ position: relative !important;
+ top: auto !important;
+ left: auto !important;
+ right: auto !important;
+ bottom: auto !important;
+ display: block !important;
+ margin-top: 20px !important;
+}
+
+::ng-deep .chart-container ngx-charts-pie-chart .chart-legend .legend-labels {
+ display: flex !important;
+ flex-direction: column !important;
+ align-items: center !important;
+ justify-content: center !important;
+}
+
+::ng-deep .chart-container ngx-charts-pie-chart .chart-legend .legend-label {
+ display: flex !important;
+ align-items: center !important;
+ margin: 5px 0 !important;
+}
+
+/* ===== ESTADOS DE ADVERTENCIA ===== */
+/* Advertencia (90% a 99% usado) */
+.warning {
+ color: #ff9800 !important;
+}
+
+.usage-bar-fill.warning {
+ background: linear-gradient(90deg, #ff9800, #ffb74d) !important;
+}
+
+.free-icon.warning {
+ color: #ff9800 !important;
+}
+
+/* Peligro (100% o más usado) */
+.danger {
+ color: #f44336 !important;
+ font-weight: bold !important;
+}
+
+.usage-bar-fill.danger {
+ background: linear-gradient(90deg, #f44336, #ef5350) !important;
+ animation: pulse 2s infinite;
+}
+
+.free-icon.danger {
+ color: #f44336 !important;
+ animation: pulse 2s infinite;
+}
+
+@keyframes pulse {
+ 0% {
+ opacity: 1;
+ }
+ 50% {
+ opacity: 0.7;
+ }
+ 100% {
+ opacity: 1;
+ }
+}
+
+/* ===== INSTRUCCIONES ===== */
.instructions-box {
margin-top: 15px;
background-color: #f5f5f5;
@@ -275,15 +760,88 @@ button.remove-btn:hover {
border-radius: 6px;
}
-.instructions-textarea textarea {
+.instructions-card {
+ background: #f5f5f5;
+ box-shadow: none !important;
+ margin-top: 20px;
+ border-radius: 16px;
+ border: none;
+}
+
+.instructions-card pre {
font-family: monospace;
white-space: pre;
+ background: #f8f9fa;
+ padding: 16px;
+ border-radius: 8px;
+ border: 1px solid #e9ecef;
+ overflow-x: auto;
+ font-size: 14px;
+ line-height: 1.5;
}
-.instructions-card {
- background-color: #f5f5f5;
- box-shadow: none !important;
- margin-top: 15px;
+/* ===== RESPONSIVE ===== */
+@media (max-width: 768px) {
+ .header-container {
+ flex-direction: column;
+ gap: 16px;
+ text-align: center;
+ }
+
+ .button-row {
+ flex-direction: column;
+ gap: 8px;
+ }
+
+ .destination-badge {
+ flex-direction: column;
+ text-align: center;
+ }
+
+ .destination-icon {
+ margin-right: 0;
+ margin-bottom: 8px;
+ }
+
+ .destination-value {
+ max-width: none;
+ }
+
+ .destination-label {
+ text-align: center;
+ }
+
+ .form-section {
+ padding: 20px;
+ }
+
+ .disk-space-card {
+ flex-direction: column;
+ gap: 12px;
+ }
+
+ .space-info-item {
+ min-width: auto;
+ }
+
+ .row {
+ flex-direction: column;
+ }
+
+ .chart-container {
+ flex: none;
+ width: 100%;
+ margin-top: 20px;
+ }
+
+ .partition-table {
+ font-size: 12px;
+ }
+
+ .partition-table th,
+ .partition-table td {
+ padding: 8px 4px;
+ }
}
diff --git a/ogWebconsole/src/app/components/groups/components/client-main-view/partition-assistant/partition-assistant.component.html b/ogWebconsole/src/app/components/groups/components/client-main-view/partition-assistant/partition-assistant.component.html
index 76c4a11..4624d67 100644
--- a/ogWebconsole/src/app/components/groups/components/client-main-view/partition-assistant/partition-assistant.component.html
+++ b/ogWebconsole/src/app/components/groups/components/client-main-view/partition-assistant/partition-assistant.component.html
@@ -5,9 +5,15 @@
{{ 'partitionTitle' | translate }}
-
- {{ runScriptTitle }}
-
+
+
+
cloud_download
+
+ Destino
+ {{ runScriptTitle }}
+
+
+