Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0b59c0fa88 | |||
| d300b6353e | |||
| a8826853e7 | |||
| 08017ad6be | |||
| 27bc8de54b | |||
| 5f5f8305ec | |||
| df61028185 |
@ -1,6 +1,7 @@
|
|||||||
@use './variables' as *;
|
@use './variables' as *;
|
||||||
@use './mixins' as *;
|
@use './mixins' as *;
|
||||||
|
|
||||||
|
|
||||||
body {
|
body {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
|
|||||||
@ -62,5 +62,4 @@
|
|||||||
font-size: $font-size-sm;
|
font-size: $font-size-sm;
|
||||||
font-weight: $font-weight-semibold;
|
font-weight: $font-weight-semibold;
|
||||||
background-color: rgba($color, 0.1);
|
background-color: rgba($color, 0.1);
|
||||||
// color: darken($color, 20%);
|
|
||||||
}
|
}
|
||||||
@ -1,6 +1,8 @@
|
|||||||
@use '../../assets/scss/variables' as *;
|
@use '../../assets/scss/variables' as *;
|
||||||
@use '../../assets/scss/mixins' as *;
|
@use '../../assets/scss/mixins' as *;
|
||||||
@use '../../assets/scss/global' as *;
|
@use '../../assets/scss/global' as *;
|
||||||
|
@use "sass:color";
|
||||||
|
|
||||||
|
|
||||||
.app-detail-page {
|
.app-detail-page {
|
||||||
@extend .page-wrapper;
|
@extend .page-wrapper;
|
||||||
@ -69,7 +71,7 @@
|
|||||||
|
|
||||||
&.primary {
|
&.primary {
|
||||||
background: $primary;
|
background: $primary;
|
||||||
color: white;
|
color: $text-primary;
|
||||||
border-color: $primary;
|
border-color: $primary;
|
||||||
|
|
||||||
&:hover:not(:disabled) {
|
&:hover:not(:disabled) {
|
||||||
@ -82,10 +84,6 @@
|
|||||||
background: $bg-secondary;
|
background: $bg-secondary;
|
||||||
color: $text-primary;
|
color: $text-primary;
|
||||||
border-color: $border-color;
|
border-color: $border-color;
|
||||||
|
|
||||||
&:hover:not(:disabled) {
|
|
||||||
background: darken($bg-secondary, 5%);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
&.danger {
|
&.danger {
|
||||||
@ -94,7 +92,7 @@
|
|||||||
border-color: $error;
|
border-color: $error;
|
||||||
|
|
||||||
&:hover:not(:disabled) {
|
&:hover:not(:disabled) {
|
||||||
background: darken($error, 10%);
|
background: color.adjust($error, $lightness: -10%);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -163,13 +161,13 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.chaos-active {
|
.chaos-active {
|
||||||
color: darken($info, 10%);
|
background: color.adjust($info, $lightness: -10%);
|
||||||
font-weight: $font-weight-medium;
|
font-weight: $font-weight-medium;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.domain-link {
|
.link {
|
||||||
color: $primary;
|
color: $primary-dark;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
font-size: $font-size-base;
|
font-size: $font-size-base;
|
||||||
transition: color $transition-base;
|
transition: color $transition-base;
|
||||||
@ -180,22 +178,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.server-link {
|
|
||||||
background: none;
|
|
||||||
border: none;
|
|
||||||
color: $primary;
|
|
||||||
cursor: pointer;
|
|
||||||
padding: 0;
|
|
||||||
font-size: $font-size-base;
|
|
||||||
text-align: left;
|
|
||||||
transition: color $transition-base;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
color: $primary-light;
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Version information
|
// Version information
|
||||||
.version-info {
|
.version-info {
|
||||||
display: flex;
|
display: flex;
|
||||||
@ -286,7 +268,7 @@
|
|||||||
transition: all $transition-base;
|
transition: all $transition-base;
|
||||||
|
|
||||||
&:hover:not(:disabled) {
|
&:hover:not(:disabled) {
|
||||||
background: darken($warning, 10%);
|
background: color.adjust($warning, $lightness: -10%);
|
||||||
transform: translateY(-1px);
|
transform: translateY(-1px);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -301,7 +283,7 @@
|
|||||||
.version-latest {
|
.version-latest {
|
||||||
padding: $spacing-md;
|
padding: $spacing-md;
|
||||||
background: rgba($success, 0.1);
|
background: rgba($success, 0.1);
|
||||||
color: darken($success, 10%);
|
background: color.adjust($success, $lightness: -10%);
|
||||||
border-radius: $radius-md;
|
border-radius: $radius-md;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
font-size: $font-size-base;
|
font-size: $font-size-base;
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import React, { useEffect, useState } from 'react';
|
import React, { useEffect, useState } from 'react';
|
||||||
import { useParams, useNavigate } from 'react-router-dom';
|
import { useParams, useNavigate, Link } from 'react-router-dom';
|
||||||
import { Header } from '../../components/Header/Header';
|
import { Header } from '../../components/Header/Header';
|
||||||
import { Terminal } from '../../components/Terminal/Terminal';
|
import { Terminal } from '../../components/Terminal/Terminal';
|
||||||
import { apiService } from '../../services/api';
|
import { apiService } from '../../services/api';
|
||||||
@ -158,7 +158,7 @@ export const AppDetail: React.FC = () => {
|
|||||||
<span className="recipe-badge">{app.recipe}</span>
|
<span className="recipe-badge">{app.recipe}</span>
|
||||||
<span className={`status-badge status-${app.status}`}>{app.status}</span>
|
<span className={`status-badge status-${app.status}`}>{app.status}</span>
|
||||||
{app.chaos === 'true' && (
|
{app.chaos === 'true' && (
|
||||||
<span className="chaos-badge" title="Chaos mode enabled">🔬 Chaos</span>
|
<span className="chaos-badge" title="Chaos mode enabled"> Chaos</span>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -203,7 +203,7 @@ export const AppDetail: React.FC = () => {
|
|||||||
<div className="info-item">
|
<div className="info-item">
|
||||||
<label>Domain</label>
|
<label>Domain</label>
|
||||||
{app.domain ? (
|
{app.domain ? (
|
||||||
<a href={`https://${app.domain}`} target="_blank" rel="noopener noreferrer" className="domain-link">
|
<a href={`https://${app.domain}`} target="_blank" rel="noopener noreferrer" className="link">
|
||||||
{app.domain} ↗
|
{app.domain} ↗
|
||||||
</a>
|
</a>
|
||||||
) : (
|
) : (
|
||||||
@ -212,13 +212,14 @@ export const AppDetail: React.FC = () => {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="info-item">
|
<div className="info-item">
|
||||||
<label>Server</label>
|
<label htmlFor="server-link">Server</label>
|
||||||
<button
|
<Link
|
||||||
onClick={() => navigate(`/servers/${app.server}`)}
|
id="server-link"
|
||||||
className="server-link"
|
to={`/servers/${app.server}`}
|
||||||
|
className="link"
|
||||||
>
|
>
|
||||||
{app.server} →
|
{app.server} ↗
|
||||||
</button>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="info-item">
|
<div className="info-item">
|
||||||
@ -236,7 +237,7 @@ export const AppDetail: React.FC = () => {
|
|||||||
<div className="info-item">
|
<div className="info-item">
|
||||||
<label>Chaos Mode</label>
|
<label>Chaos Mode</label>
|
||||||
<span className={app.chaos === 'true' ? 'chaos-active' : ''}>
|
<span className={app.chaos === 'true' ? 'chaos-active' : ''}>
|
||||||
{app.chaos === 'true' ? '🔬 Enabled' : 'Disabled'}
|
{app.chaos === 'true' ? '☠️ Enabled' : 'Disabled'}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -144,7 +144,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.domain-link {
|
.domain-link {
|
||||||
color: $primary;
|
color: $primary-dark;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
transition: color $transition-base;
|
transition: color $transition-base;
|
||||||
|
|
||||||
|
|||||||
@ -211,7 +211,7 @@ export const Apps: React.FC = () => {
|
|||||||
<th>Server</th>
|
<th>Server</th>
|
||||||
<th>Version</th>
|
<th>Version</th>
|
||||||
<th>Status</th>
|
<th>Status</th>
|
||||||
<th>Actions</th>
|
{/* <th>Actions</th> */}
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
@ -269,7 +269,7 @@ export const Apps: React.FC = () => {
|
|||||||
{app.status}
|
{app.status}
|
||||||
</span>
|
</span>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
{/* <td>
|
||||||
<div className="actions">
|
<div className="actions">
|
||||||
<button
|
<button
|
||||||
className="action-btn"
|
className="action-btn"
|
||||||
@ -294,7 +294,7 @@ export const Apps: React.FC = () => {
|
|||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td> */}
|
||||||
</tr>
|
</tr>
|
||||||
))
|
))
|
||||||
)}
|
)}
|
||||||
|
|||||||
@ -89,7 +89,6 @@ export const Dashboard: React.FC = () => {
|
|||||||
<button onClick={() => navigate('/apps')} className="nav-link bland-button">
|
<button onClick={() => navigate('/apps')} className="nav-link bland-button">
|
||||||
<div className="stat-card">
|
<div className="stat-card">
|
||||||
<h3>Apps</h3>
|
<h3>Apps</h3>
|
||||||
<p className="stat-number">{apps.length}</p>
|
|
||||||
<p className="stat-label">
|
<p className="stat-label">
|
||||||
{deployedAppsCount} deployed
|
{deployedAppsCount} deployed
|
||||||
</p>
|
</p>
|
||||||
@ -99,7 +98,6 @@ export const Dashboard: React.FC = () => {
|
|||||||
<button onClick={() => navigate('/servers')} className="nav-link bland-button">
|
<button onClick={() => navigate('/servers')} className="nav-link bland-button">
|
||||||
<div className="stat-card">
|
<div className="stat-card">
|
||||||
<h3>Servers</h3>
|
<h3>Servers</h3>
|
||||||
<p className="stat-number">{servers.length}</p>
|
|
||||||
<p className="stat-label">
|
<p className="stat-label">
|
||||||
{serversWithAppsCount} connected
|
{serversWithAppsCount} connected
|
||||||
</p>
|
</p>
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
@use '../../assets/scss/variables' as *;
|
@use '../../assets/scss/variables' as *;
|
||||||
@use '../../assets/scss/mixins' as *;
|
@use '../../assets/scss/mixins' as *;
|
||||||
@use '../../assets/scss/global' as *;
|
@use '../../assets/scss/global' as *;
|
||||||
|
@use "sass:color";
|
||||||
|
|
||||||
.server-detail-page {
|
.server-detail-page {
|
||||||
@extend .page-wrapper;
|
@extend .page-wrapper;
|
||||||
@ -84,7 +85,7 @@
|
|||||||
border-color: $border-color;
|
border-color: $border-color;
|
||||||
|
|
||||||
&:hover:not(:disabled) {
|
&:hover:not(:disabled) {
|
||||||
background: darken($bg-secondary, 5%);
|
background: color.adjust($bg-secondary, $lightness: -10%);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -94,7 +95,7 @@
|
|||||||
border-color: $error;
|
border-color: $error;
|
||||||
|
|
||||||
&:hover:not(:disabled) {
|
&:hover:not(:disabled) {
|
||||||
background: darken($error, 10%);
|
background: color.adjust($error, $lightness: -10%);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -124,7 +125,7 @@
|
|||||||
gap: $spacing-xs;
|
gap: $spacing-xs;
|
||||||
padding: $spacing-xs $spacing-md;
|
padding: $spacing-xs $spacing-md;
|
||||||
background: rgba($warning, 0.1);
|
background: rgba($warning, 0.1);
|
||||||
color: darken($warning, 20%);
|
background: color.adjust($error, $lightness: -20%);
|
||||||
border-radius: $radius-md;
|
border-radius: $radius-md;
|
||||||
font-size: $font-size-sm;
|
font-size: $font-size-sm;
|
||||||
font-weight: $font-weight-medium;
|
font-weight: $font-weight-medium;
|
||||||
@ -189,11 +190,11 @@
|
|||||||
color: $text-primary;
|
color: $text-primary;
|
||||||
|
|
||||||
&.warning {
|
&.warning {
|
||||||
color: darken($warning, 10%);
|
background: color.adjust($warning, $lightness: -10%);
|
||||||
}
|
}
|
||||||
|
|
||||||
&.chaos {
|
&.chaos {
|
||||||
color: darken($info, 10%);
|
background: color.adjust($info, $lightness: -10%);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -190,7 +190,7 @@ export const Server: React.FC = () => {
|
|||||||
{actionLoading === 'refresh' ? 'Refreshing...' : 'Refresh'}
|
{actionLoading === 'refresh' ? 'Refreshing...' : 'Refresh'}
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
className="action-btn primary"
|
className="action-btn"
|
||||||
onClick={() => handleAction('deploy-all')}
|
onClick={() => handleAction('deploy-all')}
|
||||||
disabled={!!actionLoading}
|
disabled={!!actionLoading}
|
||||||
>
|
>
|
||||||
@ -280,7 +280,7 @@ export const Server: React.FC = () => {
|
|||||||
{app.status}
|
{app.status}
|
||||||
</span>
|
</span>
|
||||||
{app.chaos === 'true' && (
|
{app.chaos === 'true' && (
|
||||||
<span className="chaos-badge">🔬</span>
|
<span className="chaos-badge">☠️</span>
|
||||||
)}
|
)}
|
||||||
{app.upgrade !== 'latest' && (
|
{app.upgrade !== 'latest' && (
|
||||||
<span className="upgrade-badge">⬆️</span>
|
<span className="upgrade-badge">⬆️</span>
|
||||||
@ -335,7 +335,7 @@ export const Server: React.FC = () => {
|
|||||||
onClick={() => handleAction('upgrade-all')}
|
onClick={() => handleAction('upgrade-all')}
|
||||||
disabled={!!actionLoading || server.upgradeCount === 0}
|
disabled={!!actionLoading || server.upgradeCount === 0}
|
||||||
>
|
>
|
||||||
<span className="action-text">⬆Upgrade All Apps</span>
|
<span className="action-text">Upgrade All Apps</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|||||||
@ -169,9 +169,9 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
&.primary {
|
&.primary {
|
||||||
background-color: $primary;
|
// background-color: $primary;
|
||||||
color: white;
|
// color: white;
|
||||||
border-color: $primary;
|
// border-color: $primary;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
background-color: $primary-light;
|
background-color: $primary-light;
|
||||||
|
|||||||
@ -252,27 +252,6 @@ const resetFilters = () => {
|
|||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="server-actions">
|
|
||||||
<button
|
|
||||||
className="action-btn primary"
|
|
||||||
onClick={(e) => {
|
|
||||||
e.stopPropagation();
|
|
||||||
navigate(`/servers/${server.name}`);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
View Apps
|
|
||||||
</button>
|
|
||||||
<button
|
|
||||||
className="action-btn"
|
|
||||||
onClick={(e) => {
|
|
||||||
e.stopPropagation();
|
|
||||||
navigate(`/servers/${server.name}`);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
Manage
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{server.upgradeCount > 0 && (
|
{server.upgradeCount > 0 && (
|
||||||
<div className="server-alert">
|
<div className="server-alert">
|
||||||
<span className="alert-text">
|
<span className="alert-text">
|
||||||
|
|||||||
Reference in New Issue
Block a user