procler 0.2.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- procler/__init__.py +3 -0
- procler/__main__.py +6 -0
- procler/api/__init__.py +5 -0
- procler/api/app.py +261 -0
- procler/api/deps.py +21 -0
- procler/api/routes/__init__.py +5 -0
- procler/api/routes/config.py +290 -0
- procler/api/routes/groups.py +62 -0
- procler/api/routes/logs.py +43 -0
- procler/api/routes/processes.py +185 -0
- procler/api/routes/recipes.py +69 -0
- procler/api/routes/snippets.py +134 -0
- procler/api/routes/ws.py +459 -0
- procler/cli.py +1478 -0
- procler/config/__init__.py +65 -0
- procler/config/changelog.py +148 -0
- procler/config/loader.py +256 -0
- procler/config/schema.py +315 -0
- procler/core/__init__.py +54 -0
- procler/core/context_base.py +117 -0
- procler/core/context_docker.py +384 -0
- procler/core/context_local.py +287 -0
- procler/core/daemon_detector.py +325 -0
- procler/core/events.py +74 -0
- procler/core/groups.py +419 -0
- procler/core/health.py +280 -0
- procler/core/log_tailer.py +262 -0
- procler/core/process_manager.py +1277 -0
- procler/core/recipes.py +330 -0
- procler/core/snippets.py +231 -0
- procler/core/variable_substitution.py +65 -0
- procler/db.py +96 -0
- procler/logging.py +41 -0
- procler/models.py +130 -0
- procler/py.typed +0 -0
- procler/settings.py +29 -0
- procler/static/assets/AboutView-BwZnsfpW.js +4 -0
- procler/static/assets/AboutView-UHbxWXcS.css +1 -0
- procler/static/assets/Code-HTS-H1S6.js +74 -0
- procler/static/assets/ConfigView-CGJcmp9G.css +1 -0
- procler/static/assets/ConfigView-aVtbRDf8.js +1 -0
- procler/static/assets/DashboardView-C5jw9Nsd.css +1 -0
- procler/static/assets/DashboardView-Dab7Cu9v.js +1 -0
- procler/static/assets/DataTable-z39TOAa4.js +746 -0
- procler/static/assets/DescriptionsItem-B2E8YbqJ.js +74 -0
- procler/static/assets/Divider-Dk-6aD2Y.js +42 -0
- procler/static/assets/Empty-MuygEHZM.js +24 -0
- procler/static/assets/Grid-CZ9QVKAT.js +1 -0
- procler/static/assets/GroupsView-BALG7i1X.js +1 -0
- procler/static/assets/GroupsView-gXAI1CVC.css +1 -0
- procler/static/assets/Input-e0xaxoWE.js +259 -0
- procler/static/assets/PhArrowsClockwise.vue-DqDg31az.js +1 -0
- procler/static/assets/PhCheckCircle.vue-Fwj9sh9m.js +1 -0
- procler/static/assets/PhEye.vue-JcPHciC2.js +1 -0
- procler/static/assets/PhPlay.vue-CZm7Gy3u.js +1 -0
- procler/static/assets/PhPlus.vue-yTWqKlSh.js +1 -0
- procler/static/assets/PhStop.vue-DxsqwIki.js +1 -0
- procler/static/assets/PhTrash.vue-DcqQbN1_.js +125 -0
- procler/static/assets/PhXCircle.vue-BXWmrabV.js +1 -0
- procler/static/assets/ProcessDetailView-DDbtIWq9.css +1 -0
- procler/static/assets/ProcessDetailView-DPtdNV-q.js +1 -0
- procler/static/assets/ProcessesView-B3a6Umur.js +1 -0
- procler/static/assets/ProcessesView-goLmghbJ.css +1 -0
- procler/static/assets/RecipesView-D2VxdneD.js +166 -0
- procler/static/assets/RecipesView-DXnFDCK4.css +1 -0
- procler/static/assets/Select-BBR17AHq.js +317 -0
- procler/static/assets/SnippetsView-B3a9q3AI.css +1 -0
- procler/static/assets/SnippetsView-DBCB2yGq.js +1 -0
- procler/static/assets/Spin-BXTjvFUk.js +90 -0
- procler/static/assets/Tag-Bh_qV63A.js +71 -0
- procler/static/assets/changelog-KkTT4H9-.js +1 -0
- procler/static/assets/groups-Zu-_v8ey.js +1 -0
- procler/static/assets/index-BsN-YMXq.css +1 -0
- procler/static/assets/index-BzW1XhyH.js +1282 -0
- procler/static/assets/procler-DOrSB1Vj.js +1 -0
- procler/static/assets/recipes-1w5SseGb.js +1 -0
- procler/static/index.html +17 -0
- procler/static/procler.png +0 -0
- procler-0.2.0.dist-info/METADATA +545 -0
- procler-0.2.0.dist-info/RECORD +83 -0
- procler-0.2.0.dist-info/WHEEL +4 -0
- procler-0.2.0.dist-info/entry_points.txt +2 -0
- procler-0.2.0.dist-info/licenses/LICENSE +21 -0
procler/db.py
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"""Database initialization for Procler using sqler."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
from sqler import SQLerDB
|
|
7
|
+
|
|
8
|
+
from .models import LogEntry, Process, Snippet
|
|
9
|
+
from .settings import get_db_path
|
|
10
|
+
|
|
11
|
+
logger = logging.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
# Global database instance
|
|
14
|
+
_db: SQLerDB | None = None
|
|
15
|
+
|
|
16
|
+
# Current schema version - increment when making breaking changes
|
|
17
|
+
SCHEMA_VERSION = 1
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def _get_schema_version(db: SQLerDB) -> int:
|
|
21
|
+
"""Get the current schema version from database metadata."""
|
|
22
|
+
try:
|
|
23
|
+
result = db.execute_sql(
|
|
24
|
+
"SELECT value FROM procler_meta WHERE key = 'schema_version'"
|
|
25
|
+
)
|
|
26
|
+
if result and len(result) > 0:
|
|
27
|
+
return int(result[0].get("value", 0))
|
|
28
|
+
return 0
|
|
29
|
+
except Exception:
|
|
30
|
+
# Table doesn't exist yet
|
|
31
|
+
return 0
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def _set_schema_version(db: SQLerDB, version: int) -> None:
|
|
35
|
+
"""Set the schema version in database metadata."""
|
|
36
|
+
db.execute_sql("""
|
|
37
|
+
CREATE TABLE IF NOT EXISTS procler_meta (
|
|
38
|
+
key TEXT PRIMARY KEY,
|
|
39
|
+
value TEXT
|
|
40
|
+
)
|
|
41
|
+
""")
|
|
42
|
+
db.execute_sql(
|
|
43
|
+
f"INSERT OR REPLACE INTO procler_meta (key, value) VALUES ('schema_version', '{version}')"
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def _run_migrations(db: SQLerDB, from_version: int, to_version: int) -> None:
|
|
48
|
+
"""Run any necessary migrations between versions."""
|
|
49
|
+
# Future migrations would go here
|
|
50
|
+
# Example:
|
|
51
|
+
# if from_version < 2 and to_version >= 2:
|
|
52
|
+
# db._conn.execute("ALTER TABLE processes ADD COLUMN new_field TEXT")
|
|
53
|
+
pass
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def init_database(db_path: Path | None = None) -> SQLerDB:
|
|
57
|
+
"""Initialize the database and register models."""
|
|
58
|
+
global _db
|
|
59
|
+
|
|
60
|
+
if _db is not None:
|
|
61
|
+
return _db
|
|
62
|
+
|
|
63
|
+
path = db_path or get_db_path()
|
|
64
|
+
_db = SQLerDB.on_disk(str(path))
|
|
65
|
+
|
|
66
|
+
# Check and update schema version
|
|
67
|
+
current_version = _get_schema_version(_db)
|
|
68
|
+
if current_version < SCHEMA_VERSION:
|
|
69
|
+
logger.info(f"Upgrading database schema from v{current_version} to v{SCHEMA_VERSION}")
|
|
70
|
+
_run_migrations(_db, current_version, SCHEMA_VERSION)
|
|
71
|
+
_set_schema_version(_db, SCHEMA_VERSION)
|
|
72
|
+
elif current_version > SCHEMA_VERSION:
|
|
73
|
+
logger.warning(
|
|
74
|
+
f"Database schema v{current_version} is newer than app v{SCHEMA_VERSION}. "
|
|
75
|
+
"Some features may not work correctly."
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
# Register models with the database
|
|
79
|
+
Process.set_db(_db)
|
|
80
|
+
LogEntry.set_db(_db)
|
|
81
|
+
Snippet.set_db(_db)
|
|
82
|
+
|
|
83
|
+
return _db
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def get_database() -> SQLerDB:
|
|
87
|
+
"""Get the global database instance, initializing if needed."""
|
|
88
|
+
if _db is None:
|
|
89
|
+
return init_database()
|
|
90
|
+
return _db
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def reset_database() -> None:
|
|
94
|
+
"""Reset the global database instance (useful for testing)."""
|
|
95
|
+
global _db
|
|
96
|
+
_db = None
|
procler/logging.py
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"""Logging configuration using loguru."""
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import sys
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
7
|
+
from loguru import logger
|
|
8
|
+
|
|
9
|
+
# Remove default handler
|
|
10
|
+
logger.remove()
|
|
11
|
+
|
|
12
|
+
# Determine log level from environment
|
|
13
|
+
LOG_LEVEL = os.environ.get("PROCLER_LOG_LEVEL", "INFO").upper()
|
|
14
|
+
LOG_FILE = os.environ.get("PROCLER_LOG_FILE", "")
|
|
15
|
+
|
|
16
|
+
# Console handler with color
|
|
17
|
+
logger.add(
|
|
18
|
+
sys.stderr,
|
|
19
|
+
level=LOG_LEVEL,
|
|
20
|
+
format=(
|
|
21
|
+
"<green>{time:HH:mm:ss}</green> | <level>{level: <8}</level> | "
|
|
22
|
+
"<cyan>{name}</cyan>:<cyan>{function}</cyan> - <level>{message}</level>"
|
|
23
|
+
),
|
|
24
|
+
colorize=True,
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
# File handler if specified
|
|
28
|
+
if LOG_FILE:
|
|
29
|
+
log_path = Path(LOG_FILE)
|
|
30
|
+
log_path.parent.mkdir(parents=True, exist_ok=True)
|
|
31
|
+
logger.add(
|
|
32
|
+
LOG_FILE,
|
|
33
|
+
level=LOG_LEVEL,
|
|
34
|
+
format="{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {name}:{function}:{line} - {message}",
|
|
35
|
+
rotation="10 MB",
|
|
36
|
+
retention="7 days",
|
|
37
|
+
compression="gz",
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
# Export configured logger
|
|
41
|
+
__all__ = ["logger"]
|
procler/models.py
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"""Data models for Procler using sqler."""
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from datetime import datetime
|
|
5
|
+
from enum import Enum
|
|
6
|
+
|
|
7
|
+
from sqler import SQLerModel
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class ProcessStatus(str, Enum):
|
|
11
|
+
"""Status of a managed process."""
|
|
12
|
+
|
|
13
|
+
STOPPED = "stopped"
|
|
14
|
+
STARTING = "starting"
|
|
15
|
+
RUNNING = "running"
|
|
16
|
+
STOPPING = "stopping"
|
|
17
|
+
ERROR = "error"
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class ContextType(str, Enum):
|
|
21
|
+
"""Execution context type."""
|
|
22
|
+
|
|
23
|
+
LOCAL = "local"
|
|
24
|
+
DOCKER = "docker"
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class LogStream(str, Enum):
|
|
28
|
+
"""Log stream type."""
|
|
29
|
+
|
|
30
|
+
STDOUT = "stdout"
|
|
31
|
+
STDERR = "stderr"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
# SQLer Models for database persistence
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class Process(SQLerModel):
|
|
38
|
+
"""Process definition stored in database."""
|
|
39
|
+
|
|
40
|
+
name: str
|
|
41
|
+
command: str
|
|
42
|
+
context_type: str = "local"
|
|
43
|
+
display_name: str | None = None
|
|
44
|
+
container_name: str | None = None
|
|
45
|
+
cwd: str | None = None
|
|
46
|
+
env: dict[str, str] | None = None
|
|
47
|
+
auto_restart: bool = False
|
|
48
|
+
restart_delay_seconds: int = 5
|
|
49
|
+
tags: list[str] | None = None
|
|
50
|
+
created_at: str | None = None
|
|
51
|
+
updated_at: str | None = None
|
|
52
|
+
|
|
53
|
+
# Daemon mode configuration
|
|
54
|
+
daemon_mode: bool = False
|
|
55
|
+
daemon_match_pattern: str | None = None
|
|
56
|
+
daemon_pidfile: str | None = None
|
|
57
|
+
daemon_container: str | None = None # Container for daemon detection
|
|
58
|
+
adopt_existing: bool = False
|
|
59
|
+
|
|
60
|
+
# Log file for capturing output (used when process started via CLI or adopted)
|
|
61
|
+
log_file: str | None = None # Default: /tmp/procler/{name}.log
|
|
62
|
+
|
|
63
|
+
# Runtime state (stored with the process)
|
|
64
|
+
status: str = "stopped"
|
|
65
|
+
pid: int | None = None
|
|
66
|
+
started_at: str | None = None
|
|
67
|
+
exit_code: int | None = None
|
|
68
|
+
error_message: str | None = None
|
|
69
|
+
adopted: bool = False # Was this process adopted from an existing daemon?
|
|
70
|
+
|
|
71
|
+
def get_context_type(self) -> ContextType:
|
|
72
|
+
return ContextType(self.context_type)
|
|
73
|
+
|
|
74
|
+
def get_status(self) -> ProcessStatus:
|
|
75
|
+
return ProcessStatus(self.status)
|
|
76
|
+
|
|
77
|
+
@property
|
|
78
|
+
def uptime_seconds(self) -> int | None:
|
|
79
|
+
if self.started_at and self.status == ProcessStatus.RUNNING.value:
|
|
80
|
+
started = datetime.fromisoformat(self.started_at)
|
|
81
|
+
return int((datetime.now() - started).total_seconds())
|
|
82
|
+
return None
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class LogEntry(SQLerModel):
|
|
86
|
+
"""Log entry stored in database."""
|
|
87
|
+
|
|
88
|
+
process_id: int
|
|
89
|
+
stream: str = "stdout"
|
|
90
|
+
line: str = ""
|
|
91
|
+
timestamp: str | None = None
|
|
92
|
+
|
|
93
|
+
def get_stream(self) -> LogStream:
|
|
94
|
+
return LogStream(self.stream)
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
class Snippet(SQLerModel):
|
|
98
|
+
"""Command snippet stored in database."""
|
|
99
|
+
|
|
100
|
+
name: str
|
|
101
|
+
command: str
|
|
102
|
+
description: str | None = None
|
|
103
|
+
context_type: str = "local"
|
|
104
|
+
container_name: str | None = None
|
|
105
|
+
tags: list[str] | None = None
|
|
106
|
+
created_at: str | None = None
|
|
107
|
+
|
|
108
|
+
def get_context_type(self) -> ContextType:
|
|
109
|
+
return ContextType(self.context_type)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
# JSON response envelope types (not stored in DB)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
@dataclass
|
|
116
|
+
class SuccessResponse:
|
|
117
|
+
"""Successful JSON response."""
|
|
118
|
+
|
|
119
|
+
success: bool = True
|
|
120
|
+
data: dict | None = None
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
@dataclass
|
|
124
|
+
class ErrorResponse:
|
|
125
|
+
"""Error JSON response."""
|
|
126
|
+
|
|
127
|
+
success: bool = False
|
|
128
|
+
error: str = ""
|
|
129
|
+
error_code: str | None = None
|
|
130
|
+
suggestion: str | None = None
|
procler/py.typed
ADDED
|
File without changes
|
procler/settings.py
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"""Default settings for Procler."""
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
# Default paths
|
|
7
|
+
DEFAULT_DATA_DIR = Path(os.environ.get("PROCLER_DATA_DIR", Path.home() / ".procler"))
|
|
8
|
+
DEFAULT_DB_PATH = DEFAULT_DATA_DIR / "procler.db"
|
|
9
|
+
|
|
10
|
+
# Server defaults
|
|
11
|
+
DEFAULT_HOST = "127.0.0.1"
|
|
12
|
+
DEFAULT_PORT = 8000
|
|
13
|
+
|
|
14
|
+
# Process defaults
|
|
15
|
+
DEFAULT_RESTART_DELAY_SECONDS = 5
|
|
16
|
+
DEFAULT_LOG_TAIL_LINES = 100
|
|
17
|
+
DEFAULT_LOG_RETENTION_LINES = 10000
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def get_data_dir() -> Path:
|
|
21
|
+
"""Get the data directory, creating it if necessary."""
|
|
22
|
+
data_dir = Path(os.environ.get("PROCLER_DATA_DIR", DEFAULT_DATA_DIR))
|
|
23
|
+
data_dir.mkdir(parents=True, exist_ok=True)
|
|
24
|
+
return data_dir
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def get_db_path() -> Path:
|
|
28
|
+
"""Get the database file path."""
|
|
29
|
+
return Path(os.environ.get("PROCLER_DB_PATH", get_data_dir() / "procler.db"))
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{_ as N}from"./procler-DOrSB1Vj.js";import{d as H,m as c,p as v,c as i,f as r,q as y,j as _,a,s as w,r as z,o as C,b as s,t as o,w as n,e as l,y as B,B as L,h as g,N as $,_ as P}from"./index-BzW1XhyH.js";import{N as V}from"./Tag-Bh_qV63A.js";import{N as q,a as b}from"./Grid-CZ9QVKAT.js";import{N as j}from"./Code-HTS-H1S6.js";const I=["width","height","fill","transform"],D={key:0},E=a("path",{d:"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z"},null,-1),F=[E],G={key:1},W=a("path",{d:"M184,80V208a8,8,0,0,1-8,8H48a8,8,0,0,1-8-8V80a8,8,0,0,1,8-8H176A8,8,0,0,1,184,80Z",opacity:"0.2"},null,-1),T=a("path",{d:"M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z"},null,-1),O=[W,T],Q={key:2},R=a("path",{d:"M192,136v72a16,16,0,0,1-16,16H48a16,16,0,0,1-16-16V80A16,16,0,0,1,48,64h72a8,8,0,0,1,0,16H48V208H176V136a8,8,0,0,1,16,0Zm32-96a8,8,0,0,0-8-8H152a8,8,0,0,0-5.66,13.66L172.69,72l-42.35,42.34a8,8,0,0,0,11.32,11.32L184,83.31l26.34,26.35A8,8,0,0,0,224,104Z"},null,-1),J=[R],K={key:3},U=a("path",{d:"M222,104a6,6,0,0,1-12,0V54.49l-69.75,69.75a6,6,0,0,1-8.48-8.48L201.51,46H152a6,6,0,0,1,0-12h64a6,6,0,0,1,6,6Zm-38,26a6,6,0,0,0-6,6v72a2,2,0,0,1-2,2H48a2,2,0,0,1-2-2V80a2,2,0,0,1,2-2h72a6,6,0,0,0,0-12H48A14,14,0,0,0,34,80V208a14,14,0,0,0,14,14H176a14,14,0,0,0,14-14V136A6,6,0,0,0,184,130Z"},null,-1),X=[U],Y={key:4},x=a("path",{d:"M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z"},null,-1),a0=[x],e0={key:5},t0=a("path",{d:"M220,104a4,4,0,0,1-8,0V49.66l-73.16,73.17a4,4,0,0,1-5.66-5.66L206.34,44H152a4,4,0,0,1,0-8h64a4,4,0,0,1,4,4Zm-36,28a4,4,0,0,0-4,4v72a4,4,0,0,1-4,4H48a4,4,0,0,1-4-4V80a4,4,0,0,1,4-4h72a4,4,0,0,0,0-8H48A12,12,0,0,0,36,80V208a12,12,0,0,0,12,12H176a12,12,0,0,0,12-12V136A4,4,0,0,0,184,132Z"},null,-1),l0=[t0],s0={name:"PhArrowSquareOut"},S=H({...s0,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(f){const u=f,h=c("weight","regular"),e=c("size","1em"),t=c("color","currentColor"),A=c("mirrored",!1),d=v(()=>u.weight??h),p=v(()=>u.size??e),Z=v(()=>u.color??t),k=v(()=>u.mirrored!==void 0?u.mirrored?"scale(-1, 1)":void 0:A?"scale(-1, 1)":void 0);return(m,M)=>(r(),i("svg",w({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:p.value,height:p.value,fill:Z.value,transform:k.value},m.$attrs),[y(m.$slots,"default"),d.value==="bold"?(r(),i("g",D,F)):d.value==="duotone"?(r(),i("g",G,O)):d.value==="fill"?(r(),i("g",Q,J)):d.value==="light"?(r(),i("g",K,X)):d.value==="regular"?(r(),i("g",Y,a0)):d.value==="thin"?(r(),i("g",e0,l0)):_("",!0)],16,I))}}),o0=["width","height","fill","transform"],i0={key:0},r0=a("path",{d:"M212.62,75.17A63.7,63.7,0,0,0,206.39,26,12,12,0,0,0,196,20a63.71,63.71,0,0,0-50,24H126A63.71,63.71,0,0,0,76,20a12,12,0,0,0-10.39,6,63.7,63.7,0,0,0-6.23,49.17A61.5,61.5,0,0,0,52,104v8a60.1,60.1,0,0,0,45.76,58.28A43.66,43.66,0,0,0,92,192v4H76a20,20,0,0,1-20-20,44.05,44.05,0,0,0-44-44,12,12,0,0,0,0,24,20,20,0,0,1,20,20,44.05,44.05,0,0,0,44,44H92v12a12,12,0,0,0,24,0V192a20,20,0,0,1,40,0v40a12,12,0,0,0,24,0V192a43.66,43.66,0,0,0-5.76-21.72A60.1,60.1,0,0,0,220,112v-8A61.5,61.5,0,0,0,212.62,75.17ZM196,112a36,36,0,0,1-36,36H112a36,36,0,0,1-36-36v-8a37.87,37.87,0,0,1,6.13-20.12,11.65,11.65,0,0,0,1.58-11.49,39.9,39.9,0,0,1-.4-27.72,39.87,39.87,0,0,1,26.41,17.8A12,12,0,0,0,119.82,68h32.35a12,12,0,0,0,10.11-5.53,39.84,39.84,0,0,1,26.41-17.8,39.9,39.9,0,0,1-.4,27.72,12,12,0,0,0,1.61,11.53A37.85,37.85,0,0,1,196,104Z"},null,-1),n0=[r0],u0={key:1},d0=a("path",{d:"M208,104v8a48,48,0,0,1-48,48H136a32,32,0,0,1,32,32v40H104V192a32,32,0,0,1,32-32H112a48,48,0,0,1-48-48v-8a49.28,49.28,0,0,1,8.51-27.3A51.92,51.92,0,0,1,76,32a52,52,0,0,1,43.83,24h32.34A52,52,0,0,1,196,32a51.92,51.92,0,0,1,3.49,44.7A49.28,49.28,0,0,1,208,104Z",opacity:"0.2"},null,-1),c0=a("path",{d:"M208.3,75.68A59.74,59.74,0,0,0,202.93,28,8,8,0,0,0,196,24a59.75,59.75,0,0,0-48,24H124A59.75,59.75,0,0,0,76,24a8,8,0,0,0-6.93,4,59.78,59.78,0,0,0-5.38,47.68A58.14,58.14,0,0,0,56,104v8a56.06,56.06,0,0,0,48.44,55.47A39.8,39.8,0,0,0,96,192v8H72a24,24,0,0,1-24-24A40,40,0,0,0,8,136a8,8,0,0,0,0,16,24,24,0,0,1,24,24,40,40,0,0,0,40,40H96v16a8,8,0,0,0,16,0V192a24,24,0,0,1,48,0v40a8,8,0,0,0,16,0V192a39.8,39.8,0,0,0-8.44-24.53A56.06,56.06,0,0,0,216,112v-8A58,58,0,0,0,208.3,75.68ZM200,112a40,40,0,0,1-40,40H112a40,40,0,0,1-40-40v-8a41.74,41.74,0,0,1,6.9-22.48A8,8,0,0,0,80,73.83a43.81,43.81,0,0,1,.79-33.58,43.88,43.88,0,0,1,32.32,20.06A8,8,0,0,0,119.82,64h32.35a8,8,0,0,0,6.74-3.69,43.87,43.87,0,0,1,32.32-20.06A43.81,43.81,0,0,1,192,73.83a8.09,8.09,0,0,0,1,7.65A41.76,41.76,0,0,1,200,104Z"},null,-1),v0=[d0,c0],h0={key:2},p0=a("path",{d:"M216,104v8a56.06,56.06,0,0,1-48.44,55.47A39.8,39.8,0,0,1,176,192v40a8,8,0,0,1-8,8H104a8,8,0,0,1-8-8V216H72a40,40,0,0,1-40-40A24,24,0,0,0,8,152a8,8,0,0,1,0-16,40,40,0,0,1,40,40,24,24,0,0,0,24,24H96v-8a39.8,39.8,0,0,1,8.44-24.53A56.06,56.06,0,0,1,56,112v-8a58.14,58.14,0,0,1,7.69-28.32A59.78,59.78,0,0,1,69.07,28,8,8,0,0,1,76,24a59.75,59.75,0,0,1,48,24h24a59.75,59.75,0,0,1,48-24,8,8,0,0,1,6.93,4,59.74,59.74,0,0,1,5.37,47.68A58,58,0,0,1,216,104Z"},null,-1),m0=[p0],g0={key:3},A0=a("path",{d:"M206.13,75.92A57.79,57.79,0,0,0,201.2,29a6,6,0,0,0-5.2-3,57.77,57.77,0,0,0-47,24H123A57.77,57.77,0,0,0,76,26a6,6,0,0,0-5.2,3,57.79,57.79,0,0,0-4.93,46.92A55.88,55.88,0,0,0,58,104v8a54.06,54.06,0,0,0,50.45,53.87A37.85,37.85,0,0,0,98,192v10H72a26,26,0,0,1-26-26A38,38,0,0,0,8,138a6,6,0,0,0,0,12,26,26,0,0,1,26,26,38,38,0,0,0,38,38H98v18a6,6,0,0,0,12,0V192a26,26,0,0,1,52,0v40a6,6,0,0,0,12,0V192a37.85,37.85,0,0,0-10.45-26.13A54.06,54.06,0,0,0,214,112v-8A55.88,55.88,0,0,0,206.13,75.92ZM202,112a42,42,0,0,1-42,42H112a42,42,0,0,1-42-42v-8a43.86,43.86,0,0,1,7.3-23.69,6,6,0,0,0,.81-5.76,45.85,45.85,0,0,1,1.43-36.42,45.85,45.85,0,0,1,35.23,21.1A6,6,0,0,0,119.83,62h32.34a6,6,0,0,0,5.06-2.76,45.83,45.83,0,0,1,35.23-21.11,45.85,45.85,0,0,1,1.43,36.42,6,6,0,0,0,.79,5.74A43.78,43.78,0,0,1,202,104Z"},null,-1),f0=[A0],$0={key:4},V0=a("path",{d:"M208.31,75.68A59.78,59.78,0,0,0,202.93,28,8,8,0,0,0,196,24a59.75,59.75,0,0,0-48,24H124A59.75,59.75,0,0,0,76,24a8,8,0,0,0-6.93,4,59.78,59.78,0,0,0-5.38,47.68A58.14,58.14,0,0,0,56,104v8a56.06,56.06,0,0,0,48.44,55.47A39.8,39.8,0,0,0,96,192v8H72a24,24,0,0,1-24-24A40,40,0,0,0,8,136a8,8,0,0,0,0,16,24,24,0,0,1,24,24,40,40,0,0,0,40,40H96v16a8,8,0,0,0,16,0V192a24,24,0,0,1,48,0v40a8,8,0,0,0,16,0V192a39.8,39.8,0,0,0-8.44-24.53A56.06,56.06,0,0,0,216,112v-8A58.14,58.14,0,0,0,208.31,75.68ZM200,112a40,40,0,0,1-40,40H112a40,40,0,0,1-40-40v-8a41.74,41.74,0,0,1,6.9-22.48A8,8,0,0,0,80,73.83a43.81,43.81,0,0,1,.79-33.58,43.88,43.88,0,0,1,32.32,20.06A8,8,0,0,0,119.82,64h32.35a8,8,0,0,0,6.74-3.69,43.87,43.87,0,0,1,32.32-20.06A43.81,43.81,0,0,1,192,73.83a8.09,8.09,0,0,0,1,7.65A41.72,41.72,0,0,1,200,104Z"},null,-1),b0=[V0],Z0={key:5},k0=a("path",{d:"M203.94,76.16A55.73,55.73,0,0,0,199.46,30,4,4,0,0,0,196,28a55.78,55.78,0,0,0-46,24H122A55.78,55.78,0,0,0,76,28a4,4,0,0,0-3.46,2,55.73,55.73,0,0,0-4.48,46.16A53.78,53.78,0,0,0,60,104v8a52.06,52.06,0,0,0,52,52h1.41A36,36,0,0,0,100,192v12H72a28,28,0,0,1-28-28A36,36,0,0,0,8,140a4,4,0,0,0,0,8,28,28,0,0,1,28,28,36,36,0,0,0,36,36h28v20a4,4,0,0,0,8,0V192a28,28,0,0,1,56,0v40a4,4,0,0,0,8,0V192a36,36,0,0,0-13.41-28H160a52.06,52.06,0,0,0,52-52v-8A53.78,53.78,0,0,0,203.94,76.16ZM204,112a44.05,44.05,0,0,1-44,44H112a44.05,44.05,0,0,1-44-44v-8a45.76,45.76,0,0,1,7.71-24.89,4,4,0,0,0,.53-3.84,47.82,47.82,0,0,1,2.1-39.21,47.8,47.8,0,0,1,38.12,22.1A4,4,0,0,0,119.83,60h32.34a4,4,0,0,0,3.37-1.84,47.8,47.8,0,0,1,38.12-22.1,47.82,47.82,0,0,1,2.1,39.21,4,4,0,0,0,.53,3.83A45.85,45.85,0,0,1,204,104Z"},null,-1),H0=[k0],y0={name:"PhGithubLogo"},_0=H({...y0,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(f){const u=f,h=c("weight","regular"),e=c("size","1em"),t=c("color","currentColor"),A=c("mirrored",!1),d=v(()=>u.weight??h),p=v(()=>u.size??e),Z=v(()=>u.color??t),k=v(()=>u.mirrored!==void 0?u.mirrored?"scale(-1, 1)":void 0:A?"scale(-1, 1)":void 0);return(m,M)=>(r(),i("svg",w({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:p.value,height:p.value,fill:Z.value,transform:k.value},m.$attrs),[y(m.$slots,"default"),d.value==="bold"?(r(),i("g",i0,n0)):d.value==="duotone"?(r(),i("g",u0,v0)):d.value==="fill"?(r(),i("g",h0,m0)):d.value==="light"?(r(),i("g",g0,f0)):d.value==="regular"?(r(),i("g",$0,b0)):d.value==="thin"?(r(),i("g",Z0,H0)):_("",!0)],16,o0))}}),w0=["width","height","fill","transform"],M0={key:0},L0=a("path",{d:"M225.6,62.64l-88-48.17a19.91,19.91,0,0,0-19.2,0l-88,48.17A20,20,0,0,0,20,80.19v95.62a20,20,0,0,0,10.4,17.55l88,48.17a19.89,19.89,0,0,0,19.2,0l88-48.17A20,20,0,0,0,236,175.81V80.19A20,20,0,0,0,225.6,62.64ZM128,36.57,200,76,178.57,87.73l-72-39.42Zm0,78.83L56,76,81.56,62l72,39.41ZM44,96.79l72,39.4v76.67L44,173.44Zm96,116.07V136.19l24-13.13V152a12,12,0,0,0,24,0V109.92l24-13.13v76.65Z"},null,-1),S0=[L0],N0={key:1},z0=a("path",{d:"M128,129.09V232a8,8,0,0,1-3.84-1l-88-48.18a8,8,0,0,1-4.16-7V80.18a8,8,0,0,1,.7-3.25Z",opacity:"0.2"},null,-1),C0=a("path",{d:"M223.68,66.15,135.68,18a15.88,15.88,0,0,0-15.36,0l-88,48.17a16,16,0,0,0-8.32,14v95.64a16,16,0,0,0,8.32,14l88,48.17a15.88,15.88,0,0,0,15.36,0l88-48.17a16,16,0,0,0,8.32-14V80.18A16,16,0,0,0,223.68,66.15ZM128,32l80.34,44-29.77,16.3-80.35-44ZM128,120,47.66,76l33.9-18.56,80.34,44ZM40,90l80,43.78v85.79L40,175.82Zm176,85.78h0l-80,43.79V133.82l32-17.51V152a8,8,0,0,0,16,0V107.55L216,90v85.77Z"},null,-1),B0=[z0,C0],P0={key:2},q0=a("path",{d:"M223.68,66.15,135.68,18a15.88,15.88,0,0,0-15.36,0l-88,48.17a16,16,0,0,0-8.32,14v95.64a16,16,0,0,0,8.32,14l88,48.17a15.88,15.88,0,0,0,15.36,0l88-48.17a16,16,0,0,0,8.32-14V80.18A16,16,0,0,0,223.68,66.15ZM128,32l80.35,44L178.57,92.29l-80.35-44Zm0,88L47.65,76,81.56,57.43l80.35,44Zm88,55.85h0l-80,43.79V133.83l32-17.51V152a8,8,0,0,0,16,0V107.56l32-17.51v85.76Z"},null,-1),j0=[q0],I0={key:3},D0=a("path",{d:"M222.72,67.91l-88-48.18a13.9,13.9,0,0,0-13.44,0l-88,48.18A14,14,0,0,0,26,80.18v95.64a14,14,0,0,0,7.28,12.27l88,48.18a13.92,13.92,0,0,0,13.44,0l88-48.18A14,14,0,0,0,230,175.82V80.18A14,14,0,0,0,222.72,67.91ZM127,30.25a2,2,0,0,1,1.92,0L212.51,76,178.57,94.57,94.05,48.31ZM122,223,39,177.57a2,2,0,0,1-1-1.75V86.66l84,46ZM43.49,76,81.56,55.15l84.51,46.26L128,122.24ZM218,175.82a2,2,0,0,1-1,1.75h0L134,223V132.64l36-19.71V152a6,6,0,0,0,12,0V106.37l36-19.71Z"},null,-1),E0=[D0],F0={key:4},G0=a("path",{d:"M223.68,66.15,135.68,18a15.88,15.88,0,0,0-15.36,0l-88,48.17a16,16,0,0,0-8.32,14v95.64a16,16,0,0,0,8.32,14l88,48.17a15.88,15.88,0,0,0,15.36,0l88-48.17a16,16,0,0,0,8.32-14V80.18A16,16,0,0,0,223.68,66.15ZM128,32l80.34,44-29.77,16.3-80.35-44ZM128,120,47.66,76l33.9-18.56,80.34,44ZM40,90l80,43.78v85.79L40,175.82Zm176,85.78h0l-80,43.79V133.82l32-17.51V152a8,8,0,0,0,16,0V107.55L216,90v85.77Z"},null,-1),W0=[G0],T0={key:5},O0=a("path",{d:"M221.76,69.66l-88-48.18a12,12,0,0,0-11.52,0l-88,48.18A12,12,0,0,0,28,80.18v95.64a12,12,0,0,0,6.24,10.52l88,48.18a11.95,11.95,0,0,0,11.52,0l88-48.18A12,12,0,0,0,228,175.82V80.18A12,12,0,0,0,221.76,69.66ZM126.08,28.5a3.94,3.94,0,0,1,3.84,0L216.67,76,178.5,96.89a4,4,0,0,0-.58-.4l-88-48.18Zm1.92,96L39.33,76,81.56,52.87l88.67,48.54Zm-89.92,54.8a4,4,0,0,1-2.08-3.5V83.29l88,48.16v94.91Zm179.84,0h0l-85.92,47V131.45l40-21.89V152a4,4,0,0,0,8,0V105.18l40-21.89v92.53A4,4,0,0,1,217.92,179.32Z"},null,-1),Q0=[O0],R0={name:"PhPackage"},J0=H({...R0,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(f){const u=f,h=c("weight","regular"),e=c("size","1em"),t=c("color","currentColor"),A=c("mirrored",!1),d=v(()=>u.weight??h),p=v(()=>u.size??e),Z=v(()=>u.color??t),k=v(()=>u.mirrored!==void 0?u.mirrored?"scale(-1, 1)":void 0:A?"scale(-1, 1)":void 0);return(m,M)=>(r(),i("svg",w({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:p.value,height:p.value,fill:Z.value,transform:k.value},m.$attrs),[y(m.$slots,"default"),d.value==="bold"?(r(),i("g",M0,S0)):d.value==="duotone"?(r(),i("g",N0,B0)):d.value==="fill"?(r(),i("g",P0,j0)):d.value==="light"?(r(),i("g",I0,E0)):d.value==="regular"?(r(),i("g",F0,W0)):d.value==="thin"?(r(),i("g",T0,Q0)):_("",!0)],16,w0))}}),K0={class:"about-view"},U0={class:"hero"},X0={class:"hero-content"},Y0={class:"hero-copy"},x0={class:"hero-kicker"},a1={class:"hero-tagline"},e1={class:"hero-actions"},t1={class:"hero-tags"},l1={class:"bullet-list"},s1={class:"tech-grid"},o1={class:"tech-item"},i1={class:"tech-label"},r1={class:"tech-item"},n1={class:"tech-label"},u1={class:"tech-item"},d1={class:"tech-label"},c1={class:"tech-item"},v1={class:"tech-label"},h1={class:"tech-item"},p1={class:"tech-label"},m1={class:"links-list"},g1={href:"https://github.com/gabu-quest/procler",target:"_blank",rel:"noopener noreferrer",class:"link-item"},A1={href:"https://pypi.org/project/procler/",target:"_blank",rel:"noopener noreferrer",class:"link-item"},f1={class:"version-grid"},$1={class:"version-item"},V1={class:"version-label"},b1={class:"version-item"},Z1={class:"version-label"},k1=`procler define --name api --command "uvicorn main:app"
|
|
2
|
+
procler start api
|
|
3
|
+
procler status api
|
|
4
|
+
procler logs api --tail 50`,H1=H({__name:"AboutView",setup(f){const u=B(),h=z("0.1.0");return C(async()=>{try{const e=await fetch("/api/health");if(e.ok){const t=await e.json();t.version&&(h.value=t.version)}}catch{}}),(e,t)=>(r(),i("div",K0,[a("section",U0,[t[4]||(t[4]=a("div",{class:"hero-glow"},null,-1)),a("div",X0,[t[3]||(t[3]=a("div",{class:"logo-frame"},[a("img",{src:N,alt:"Procler logo",class:"hero-logo"})],-1)),a("div",Y0,[a("div",x0,o(e.$t("about.tagline")),1),t[2]||(t[2]=a("h1",null,"Procler",-1)),a("p",a1,o(e.$t("about.description")),1),a("div",e1,[s(l(L),{type:"primary",onClick:t[0]||(t[0]=A=>l(u).push("/processes"))},{default:n(()=>[g(o(e.$t("about.openProcesses")),1)]),_:1}),s(l(L),{secondary:"",onClick:t[1]||(t[1]=A=>l(u).push("/config"))},{default:n(()=>[g(o(e.$t("about.viewConfig")),1)]),_:1})]),a("div",t1,[s(l(V),{size:"small",bordered:!1},{default:n(()=>[g(o(e.$t("about.tags.local")),1)]),_:1}),s(l(V),{size:"small",bordered:!1},{default:n(()=>[g(o(e.$t("about.tags.docker")),1)]),_:1}),s(l(V),{size:"small",bordered:!1},{default:n(()=>[g(o(e.$t("about.tags.recipes")),1)]),_:1}),s(l(V),{size:"small",bordered:!1},{default:n(()=>[g(o(e.$t("about.tags.vars")),1)]),_:1})])])])]),s(l(q),{cols:3,"x-gap":20,"y-gap":20,responsive:"screen","item-responsive":!0},{default:n(()=>[s(l(b),{span:"3 m:1"},{default:n(()=>[s(l($),{title:e.$t("about.whatItDoes.title"),class:"info-card"},{default:n(()=>[a("p",null,o(e.$t("about.whatItDoes.description")),1)]),_:1},8,["title"])]),_:1}),s(l(b),{span:"3 m:1"},{default:n(()=>[s(l($),{title:e.$t("about.concepts.title"),class:"info-card"},{default:n(()=>[a("ul",l1,[a("li",null,o(e.$t("about.concepts.items.processes")),1),a("li",null,o(e.$t("about.concepts.items.contexts")),1),a("li",null,o(e.$t("about.concepts.items.recipes")),1),a("li",null,o(e.$t("about.concepts.items.vars")),1)])]),_:1},8,["title"])]),_:1}),s(l(b),{span:"3 m:1"},{default:n(()=>[s(l($),{title:e.$t("about.quickStart.title"),class:"info-card"},{default:n(()=>[s(l(j),{code:k1,class:"quick-code"})]),_:1},8,["title"])]),_:1}),s(l(b),{span:"3 m:1"},{default:n(()=>[s(l($),{title:e.$t("about.techStack.title"),class:"info-card tech-stack-card"},{default:n(()=>[a("div",s1,[a("div",o1,[a("span",i1,o(e.$t("about.techStack.backend")),1),t[5]||(t[5]=a("span",{class:"tech-value"},"Python 3.12+, FastAPI",-1))]),a("div",r1,[a("span",n1,o(e.$t("about.techStack.database")),1),t[6]||(t[6]=a("span",{class:"tech-value"},"SQLite + sqler",-1))]),a("div",u1,[a("span",d1,o(e.$t("about.techStack.frontend")),1),t[7]||(t[7]=a("span",{class:"tech-value"},"Vue 3, Vite, Pinia",-1))]),a("div",c1,[a("span",v1,o(e.$t("about.techStack.cli")),1),t[8]||(t[8]=a("span",{class:"tech-value"},"Click",-1))]),a("div",h1,[a("span",p1,o(e.$t("about.techStack.realtime")),1),t[9]||(t[9]=a("span",{class:"tech-value"},"WebSockets",-1))])])]),_:1},8,["title"])]),_:1}),s(l(b),{span:"3 m:1"},{default:n(()=>[s(l($),{title:e.$t("about.links.title"),class:"info-card links-card"},{default:n(()=>[a("div",m1,[a("a",g1,[s(l(_0),{class:"link-icon"}),a("span",null,o(e.$t("about.links.github")),1),s(l(S),{class:"link-external"})]),a("a",A1,[s(l(J0),{class:"link-icon"}),a("span",null,o(e.$t("about.links.pypi")),1),s(l(S),{class:"link-external"})])])]),_:1},8,["title"])]),_:1}),s(l(b),{span:"3 m:1"},{default:n(()=>[s(l($),{class:"info-card version-card"},{default:n(()=>[a("div",f1,[a("div",$1,[a("span",V1,o(e.$t("about.version")),1),s(l(V),{type:"primary",size:"small"},{default:n(()=>[g("v"+o(h.value),1)]),_:1})]),a("div",b1,[a("span",Z1,o(e.$t("about.license")),1),s(l(V),{size:"small"},{default:n(()=>[...t[10]||(t[10]=[g("MIT",-1)])]),_:1})])])]),_:1})]),_:1})]),_:1})]))}}),S1=P(H1,[["__scopeId","data-v-233d7d05"]]);export{S1 as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.about-view[data-v-233d7d05]{max-width:1200px;margin:0 auto}.hero[data-v-233d7d05]{position:relative;padding:2.5rem 2rem;border-radius:18px;background:radial-gradient(circle at top left,rgba(0,229,255,.16),transparent 45%),radial-gradient(circle at 20% 120%,rgba(255,43,214,.12),transparent 55%),var(--n-card-color);border:1px solid var(--n-border-color);margin-bottom:2rem;overflow:hidden}.hero-glow[data-v-233d7d05]{position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(120deg,rgba(0,229,255,.1),transparent 60%);pointer-events:none}.hero-content[data-v-233d7d05]{position:relative;display:grid;grid-template-columns:auto 1fr;gap:2rem;align-items:center}.logo-frame[data-v-233d7d05]{width:160px;height:160px;border-radius:24px;padding:10px;background:#07080d99;border:1px solid rgba(0,229,255,.25);box-shadow:0 24px 48px #0006;display:flex;align-items:center;justify-content:center}.hero-logo[data-v-233d7d05]{width:100%;height:100%;border-radius:18px;object-fit:cover}.hero-copy h1[data-v-233d7d05]{margin:0 0 .5rem;font-size:2.5rem}.hero-kicker[data-v-233d7d05]{font-size:.75rem;letter-spacing:.3em;text-transform:uppercase;color:var(--n-text-color-3);margin-bottom:.5rem}.hero-tagline[data-v-233d7d05]{color:var(--n-text-color-2);font-size:1rem;max-width:560px;margin:0 0 1.25rem}.hero-actions[data-v-233d7d05]{display:flex;gap:.75rem;flex-wrap:wrap;margin-bottom:1rem}.hero-tags[data-v-233d7d05]{display:flex;gap:.5rem;flex-wrap:wrap}.info-card p[data-v-233d7d05]{margin:0;color:var(--n-text-color-2);line-height:1.6}.bullet-list[data-v-233d7d05]{margin:0;padding-left:1.25rem;color:var(--n-text-color-2);display:grid;gap:.5rem}.quick-code[data-v-233d7d05]{display:block;font-size:.85rem;line-height:1.6;white-space:pre}.tech-grid[data-v-233d7d05]{display:grid;gap:.75rem}.tech-item[data-v-233d7d05]{display:flex;justify-content:space-between;align-items:center;padding:.5rem 0;border-bottom:1px solid var(--n-border-color)}.tech-item[data-v-233d7d05]:last-child{border-bottom:none}.tech-label[data-v-233d7d05]{font-size:.8125rem;color:var(--n-text-color-3)}.tech-value[data-v-233d7d05]{font-size:.875rem;color:var(--n-text-color-1);font-family:var(--n-font-family-mono)}.links-list[data-v-233d7d05]{display:flex;flex-direction:column;gap:.5rem}.link-item[data-v-233d7d05]{display:flex;align-items:center;gap:.75rem;padding:.75rem 1rem;border-radius:var(--n-border-radius);background:var(--n-code-color);color:var(--n-text-color-1);text-decoration:none;transition:all .15s ease}.link-item[data-v-233d7d05]:hover{background:var(--n-primary-color);color:var(--n-base-color)}.link-icon[data-v-233d7d05]{font-size:1.25rem}.link-external[data-v-233d7d05]{margin-left:auto;font-size:.875rem;opacity:.6}.version-grid[data-v-233d7d05]{display:flex;justify-content:space-around;gap:2rem}.version-item[data-v-233d7d05]{display:flex;flex-direction:column;align-items:center;gap:.5rem}.version-label[data-v-233d7d05]{font-size:.75rem;text-transform:uppercase;letter-spacing:.1em;color:var(--n-text-color-3)}@media(max-width:900px){.hero-content[data-v-233d7d05]{grid-template-columns:1fr}.logo-frame[data-v-233d7d05]{width:120px;height:120px}}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import{p as f,m as k,a$ as M,bx as W,U as g,V as F,X as x,ac as I,d as O,x as w,Y as V,r as q,o as U,E as j,ag as _,Z as y,a1 as D}from"./index-BzW1XhyH.js";function K(n,e){const o=k(M,null);return f(()=>n.hljs||(o==null?void 0:o.mergedHljsRef.value))}function X(n){const{textColor2:e,fontSize:o,fontWeightStrong:c,textColor3:a}=n;return{textColor:e,fontSize:o,fontWeightStrong:c,"mono-3":"#a0a1a7","hue-1":"#0184bb","hue-2":"#4078f2","hue-3":"#a626a4","hue-4":"#50a14f","hue-5":"#e45649","hue-5-2":"#c91243","hue-6":"#986801","hue-6-2":"#c18401",lineNumberTextColor:a}}const Y={common:W,self:X},Z=g([F("code",`
|
|
2
|
+
font-size: var(--n-font-size);
|
|
3
|
+
font-family: var(--n-font-family);
|
|
4
|
+
`,[x("show-line-numbers",`
|
|
5
|
+
display: flex;
|
|
6
|
+
`),I("line-numbers",`
|
|
7
|
+
user-select: none;
|
|
8
|
+
padding-right: 12px;
|
|
9
|
+
text-align: right;
|
|
10
|
+
transition: color .3s var(--n-bezier);
|
|
11
|
+
color: var(--n-line-number-text-color);
|
|
12
|
+
`),x("word-wrap",[g("pre",`
|
|
13
|
+
white-space: pre-wrap;
|
|
14
|
+
word-break: break-all;
|
|
15
|
+
`)]),g("pre",`
|
|
16
|
+
margin: 0;
|
|
17
|
+
line-height: inherit;
|
|
18
|
+
font-size: inherit;
|
|
19
|
+
font-family: inherit;
|
|
20
|
+
`),g("[class^=hljs]",`
|
|
21
|
+
color: var(--n-text-color);
|
|
22
|
+
transition:
|
|
23
|
+
color .3s var(--n-bezier),
|
|
24
|
+
background-color .3s var(--n-bezier);
|
|
25
|
+
`)]),({props:n})=>{const e=`${n.bPrefix}code`;return[`${e} .hljs-comment,
|
|
26
|
+
${e} .hljs-quote {
|
|
27
|
+
color: var(--n-mono-3);
|
|
28
|
+
font-style: italic;
|
|
29
|
+
}`,`${e} .hljs-doctag,
|
|
30
|
+
${e} .hljs-keyword,
|
|
31
|
+
${e} .hljs-formula {
|
|
32
|
+
color: var(--n-hue-3);
|
|
33
|
+
}`,`${e} .hljs-section,
|
|
34
|
+
${e} .hljs-name,
|
|
35
|
+
${e} .hljs-selector-tag,
|
|
36
|
+
${e} .hljs-deletion,
|
|
37
|
+
${e} .hljs-subst {
|
|
38
|
+
color: var(--n-hue-5);
|
|
39
|
+
}`,`${e} .hljs-literal {
|
|
40
|
+
color: var(--n-hue-1);
|
|
41
|
+
}`,`${e} .hljs-string,
|
|
42
|
+
${e} .hljs-regexp,
|
|
43
|
+
${e} .hljs-addition,
|
|
44
|
+
${e} .hljs-attribute,
|
|
45
|
+
${e} .hljs-meta-string {
|
|
46
|
+
color: var(--n-hue-4);
|
|
47
|
+
}`,`${e} .hljs-built_in,
|
|
48
|
+
${e} .hljs-class .hljs-title {
|
|
49
|
+
color: var(--n-hue-6-2);
|
|
50
|
+
}`,`${e} .hljs-attr,
|
|
51
|
+
${e} .hljs-variable,
|
|
52
|
+
${e} .hljs-template-variable,
|
|
53
|
+
${e} .hljs-type,
|
|
54
|
+
${e} .hljs-selector-class,
|
|
55
|
+
${e} .hljs-selector-attr,
|
|
56
|
+
${e} .hljs-selector-pseudo,
|
|
57
|
+
${e} .hljs-number {
|
|
58
|
+
color: var(--n-hue-6);
|
|
59
|
+
}`,`${e} .hljs-symbol,
|
|
60
|
+
${e} .hljs-bullet,
|
|
61
|
+
${e} .hljs-link,
|
|
62
|
+
${e} .hljs-meta,
|
|
63
|
+
${e} .hljs-selector-id,
|
|
64
|
+
${e} .hljs-title {
|
|
65
|
+
color: var(--n-hue-2);
|
|
66
|
+
}`,`${e} .hljs-emphasis {
|
|
67
|
+
font-style: italic;
|
|
68
|
+
}`,`${e} .hljs-strong {
|
|
69
|
+
font-weight: var(--n-font-weight-strong);
|
|
70
|
+
}`,`${e} .hljs-link {
|
|
71
|
+
text-decoration: underline;
|
|
72
|
+
}`]}]),A=Object.assign(Object.assign({},y.props),{language:String,code:{type:String,default:""},trim:{type:Boolean,default:!0},hljs:Object,uri:Boolean,inline:Boolean,wordWrap:Boolean,showLineNumbers:Boolean,internalFontSize:Number,internalNoHighlight:Boolean}),J=O({name:"Code",props:A,setup(n,{slots:e}){const{internalNoHighlight:o}=n,{mergedClsPrefixRef:c,inlineThemeDisabled:a}=V(),h=q(null),b=o?{value:void 0}:K(n),N=(t,r,l)=>{const{value:s}=b;return!s||!(t&&s.getLanguage(t))?null:s.highlight(l?r.trim():r,{language:t}).value},z=f(()=>n.inline||n.wordWrap?!1:n.showLineNumbers),m=()=>{if(e.default)return;const{value:t}=h;if(!t)return;const{language:r}=n,l=n.uri?window.decodeURIComponent(n.code):n.code;if(r){const i=N(r,l,n.trim);if(i!==null){if(n.inline)t.innerHTML=i;else{const $=t.querySelector(".__code__");$&&t.removeChild($);const d=document.createElement("pre");d.className="__code__",d.innerHTML=i,t.appendChild(d)}return}}if(n.inline){t.textContent=l;return}const s=t.querySelector(".__code__");if(s)s.textContent=l;else{const i=document.createElement("pre");i.className="__code__",i.textContent=l,t.innerHTML="",t.appendChild(i)}};U(m),j(_(n,"language"),m),j(_(n,"code"),m),o||j(b,m);const R=y("Code","-code",Z,Y,n,c),v=f(()=>{const{common:{cubicBezierEaseInOut:t,fontFamilyMono:r},self:{textColor:l,fontSize:s,fontWeightStrong:i,lineNumberTextColor:$,"mono-3":d,"hue-1":S,"hue-2":L,"hue-3":p,"hue-4":H,"hue-5":E,"hue-5-2":P,"hue-6":B,"hue-6-2":T}}=R.value,{internalFontSize:C}=n;return{"--n-font-size":C?`${C}px`:s,"--n-font-family":r,"--n-font-weight-strong":i,"--n-bezier":t,"--n-text-color":l,"--n-mono-3":d,"--n-hue-1":S,"--n-hue-2":L,"--n-hue-3":p,"--n-hue-4":H,"--n-hue-5":E,"--n-hue-5-2":P,"--n-hue-6":B,"--n-hue-6-2":T,"--n-line-number-text-color":$}}),u=a?D("code",f(()=>`${n.internalFontSize||"a"}`),v,n):void 0;return{mergedClsPrefix:c,codeRef:h,mergedShowLineNumbers:z,lineNumbers:f(()=>{let t=1;const r=[];let l=!1;for(const s of n.code)s===`
|
|
73
|
+
`?(l=!0,r.push(t++)):l=!1;return l||r.push(t++),r.join(`
|
|
74
|
+
`)}),cssVars:a?void 0:v,themeClass:u==null?void 0:u.themeClass,onRender:u==null?void 0:u.onRender}},render(){var n,e;const{mergedClsPrefix:o,wordWrap:c,mergedShowLineNumbers:a,onRender:h}=this;return h==null||h(),w("code",{class:[`${o}-code`,this.themeClass,c&&`${o}-code--word-wrap`,a&&`${o}-code--show-line-numbers`],style:this.cssVars,ref:"codeRef"},a?w("pre",{class:`${o}-code__line-numbers`},this.lineNumbers):null,(e=(n=this.$slots).default)===null||e===void 0?void 0:e.call(n))}});export{J as N};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.config-view[data-v-6f76d041]{max-width:1400px;margin:0 auto}.page-header[data-v-6f76d041]{display:flex;justify-content:space-between;align-items:center;margin-bottom:1.5rem}.header-title[data-v-6f76d041]{display:flex;align-items:center;gap:.5rem}.config-logo[data-v-6f76d041]{width:22px;height:22px;border-radius:6px;opacity:.75;box-shadow:0 0 0 1px #00e5ff40}.page-header h1[data-v-6f76d041]{margin:0}.error-state[data-v-6f76d041]{padding:2rem 0}.stats-grid[data-v-6f76d041]{display:grid;grid-template-columns:repeat(4,1fr);gap:1rem}.stat-item[data-v-6f76d041]{display:flex;flex-direction:column;align-items:center;padding:1rem;background:var(--n-code-color);border-radius:var(--n-border-radius)}.stat-icon[data-v-6f76d041]{font-size:1.5rem;color:var(--n-primary-color);margin-bottom:.5rem}.stat-value[data-v-6f76d041]{font-size:1.75rem;font-weight:600;color:var(--n-text-color-1)}.stat-label[data-v-6f76d041]{font-size:.75rem;text-transform:uppercase;letter-spacing:.05em;color:var(--n-text-color-3)}.changelog-empty[data-v-6f76d041],.vars-empty[data-v-6f76d041]{padding:1rem 0}.vars-hint[data-v-6f76d041]{color:var(--n-text-color-3);font-size:.8125rem;margin:0 0 .75rem}.empty-hint[data-v-6f76d041]{color:var(--n-text-color-3);font-size:.8125rem;margin:.5rem 0 0}.empty-hint code[data-v-6f76d041]{background:var(--n-code-color);padding:.125rem .375rem;border-radius:3px}.changelog-viewer[data-v-6f76d041]{max-height:400px;overflow-y:auto;font-family:var(--n-font-family-mono);font-size:.75rem;line-height:1.6;background:var(--n-code-color);border-radius:var(--n-border-radius);padding:.75rem}.changelog-entry[data-v-6f76d041]{padding:.25rem .5rem;border-left:3px solid transparent;white-space:pre-wrap;word-break:break-all}.changelog-entry[data-v-6f76d041]:hover{background:var(--n-hover-color)}.changelog-entry.action-execute[data-v-6f76d041]{border-left-color:var(--n-primary-color)}.changelog-entry.action-start[data-v-6f76d041]{border-left-color:var(--n-success-color)}.changelog-entry.action-stop[data-v-6f76d041]{border-left-color:var(--n-warning-color)}.changelog-entry.action-create[data-v-6f76d041]{border-left-color:var(--n-info-color)}@media(max-width:640px){.stats-grid[data-v-6f76d041]{grid-template-columns:repeat(2,1fr)}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as G}from"./procler-DOrSB1Vj.js";import{d as I,v as P,p as y,x as $,o as R,c as d,a as n,b as t,t as i,w as a,e,B as w,f as c,h as r,l as z,j as E,N as u,at as H,J as j,i as M,z as O,F as U,k as J,n as L,_ as X}from"./index-BzW1XhyH.js";import{G as V}from"./PhArrowsClockwise.vue-DqDg31az.js";import{u as q,g as K,a as Q}from"./changelog-KkTT4H9-.js";import{u as W,N as Y,a as Z,b as x}from"./Spin-BXTjvFUk.js";import{N as g}from"./Tag-Bh_qV63A.js";import{N as C}from"./Code-HTS-H1S6.js";import{a as m,N as ee}from"./Grid-CZ9QVKAT.js";import{N as se,a as b}from"./DescriptionsItem-B2E8YbqJ.js";import{N}from"./Empty-MuygEHZM.js";import{N as T}from"./DataTable-z39TOAa4.js";import"./Input-e0xaxoWE.js";import"./Select-BBR17AHq.js";const te={class:"config-view"},ae={class:"page-header"},oe={class:"header-title"},ne={key:0,class:"error-state"},ie={class:"stats-grid"},le={class:"stat-item"},re={class:"stat-value"},ce={class:"stat-label"},de={class:"stat-item"},fe={class:"stat-value"},ge={class:"stat-label"},ue={class:"stat-item"},me={class:"stat-value"},pe={class:"stat-label"},he={class:"stat-item"},ve={class:"stat-value"},_e={class:"stat-label"},ye={key:0,class:"vars-empty"},$e={class:"empty-hint"},Ce={key:1},be={class:"vars-hint"},Ne={key:0,class:"changelog-empty"},ke={class:"empty-hint"},we={key:1,class:"changelog-empty"},ze={key:2,class:"changelog-viewer"},Ee=I({__name:"ConfigView",setup(Ve){const{t:f}=P(),o=q(),k=W(),p=y(()=>{var l;const s=((l=o.info)==null?void 0:l.vars)??{};return Object.entries(s).map(([h,_])=>({name:h,value:_}))}),D=y(()=>[{title:f("config.columns.name"),key:"name",width:160,render:s=>$(g,{size:"small",bordered:!1},{default:()=>s.name})},{title:f("config.columns.value"),key:"value",ellipsis:{tooltip:!0},render:s=>$(C,null,{default:()=>s.value})}]),B=y(()=>[{title:f("config.columns.name"),key:"name",width:150},{title:f("config.columns.context"),key:"context",width:100,render:s=>$(g,{size:"small",bordered:!1},{default:()=>s.context})},{title:f("config.columns.command"),key:"command",ellipsis:{tooltip:!0}},{title:f("config.columns.container"),key:"container",width:120,render:s=>s.container??"-"}]);function F(s){const l=K(s);return l==="EXECUTE"?"action-execute":l==="START"?"action-start":l==="STOP"?"action-stop":l==="CREATE"?"action-create":""}function S(s){return Q(s)}async function v(){await o.fetchChangelog(100)}async function A(){const s=await o.reloadConfig();s.success?(k.success(f("config.messages.reloaded")),await v(),await o.fetchProcesses()):k.error(s.error||f("config.messages.reloadFailed"))}return R(async()=>{await o.fetchInfo(),await o.fetchProcesses(),await v()}),(s,l)=>(c(),d("div",te,[n("div",ae,[n("div",oe,[l[0]||(l[0]=n("img",{src:G,alt:"Procler logo",class:"config-logo"},null,-1)),n("h1",null,i(s.$t("config.title")),1)]),t(e(w),{type:"primary",onClick:A,loading:e(o).loading},{icon:a(()=>[t(e(V))]),default:a(()=>[r(" "+i(s.$t("config.reloadConfig")),1)]),_:1},8,["loading"])]),t(e(Y),{show:e(o).loading&&!e(o).info},{default:a(()=>[e(o).error?(c(),d("div",ne,[t(e(Z),{type:"error",title:e(o).error},null,8,["title"])])):e(o).info?(c(),z(e(ee),{key:1,cols:2,"x-gap":20,"y-gap":20,responsive:"screen","item-responsive":!0},{default:a(()=>[t(e(m),{span:"2 m:1"},{default:a(()=>[t(e(u),{title:s.$t("config.configuration"),class:"status-card"},{"header-extra":a(()=>[t(e(g),{type:e(o).info.config_exists?"success":"warning",size:"small"},{default:a(()=>[r(i(e(o).info.config_exists?s.$t("common.active"):s.$t("common.notFound")),1)]),_:1},8,["type"])]),default:a(()=>[t(e(se),{column:1,"label-placement":"left"},{default:a(()=>[t(e(b),{label:s.$t("config.labels.configDirectory")},{default:a(()=>[t(e(C),null,{default:a(()=>[r(i(e(o).info.config_dir),1)]),_:1})]),_:1},8,["label"]),t(e(b),{label:s.$t("config.labels.configFile")},{default:a(()=>[t(e(C),null,{default:a(()=>[r(i(e(o).info.config_file),1)]),_:1}),t(e(g),{type:e(o).info.config_exists?"success":"default",size:"small",style:{"margin-left":"0.5rem"}},{default:a(()=>[r(i(e(o).info.config_exists?s.$t("common.exists"):s.$t("common.missing")),1)]),_:1},8,["type"])]),_:1},8,["label"]),t(e(b),{label:s.$t("config.labels.version")},{default:a(()=>[r(" v"+i(e(o).info.version),1)]),_:1},8,["label"])]),_:1})]),_:1},8,["title"])]),_:1}),t(e(m),{span:"2 m:1"},{default:a(()=>[t(e(u),{title:s.$t("config.definedInConfig"),class:"stats-card"},{default:a(()=>[n("div",ie,[n("div",le,[t(e(H),{class:"stat-icon"}),n("div",re,i(e(o).info.stats.processes),1),n("div",ce,i(s.$t("nav.processes")),1)]),n("div",de,[t(e(j),{class:"stat-icon"}),n("div",fe,i(e(o).info.stats.groups),1),n("div",ge,i(s.$t("nav.groups")),1)]),n("div",ue,[t(e(M),{class:"stat-icon"}),n("div",me,i(e(o).info.stats.recipes),1),n("div",pe,i(s.$t("nav.recipes")),1)]),n("div",he,[t(e(O),{class:"stat-icon"}),n("div",ve,i(e(o).info.stats.snippets),1),n("div",_e,i(s.$t("nav.snippets")),1)])])]),_:1},8,["title"])]),_:1}),t(e(m),{span:"2 m:1"},{default:a(()=>[t(e(u),{title:s.$t("config.variables"),class:"vars-card"},{"header-extra":a(()=>[t(e(g),{type:p.value.length>0?"info":"default",size:"small"},{default:a(()=>[r(i(s.$t("config.variablesCount",{count:p.value.length})),1)]),_:1},8,["type"])]),default:a(()=>[p.value.length===0?(c(),d("div",ye,[t(e(N),{description:s.$t("config.noVariables"),size:"small"},{extra:a(()=>[n("p",$e,[r(i(s.$t("config.addVarsHint",{vars:"",config:""})),1),l[1]||(l[1]=n("code",null,"vars:",-1)),l[2]||(l[2]=r()),l[3]||(l[3]=n("code",null,".procler/config.yaml",-1))])]),_:1},8,["description"])])):(c(),d("div",Ce,[n("p",be,[r(i(s.$t("config.varsUsageHint",{syntax:""})),1),l[4]||(l[4]=n("code",null,"${VAR}",-1))]),t(e(T),{columns:D.value,data:p.value,bordered:!1,size:"small"},null,8,["columns","data"])]))]),_:1},8,["title"])]),_:1}),t(e(m),{span:"2"},{default:a(()=>[t(e(u),{title:s.$t("config.changelog"),class:"changelog-card"},{"header-extra":a(()=>[t(e(x),{size:"small"},{default:a(()=>[t(e(w),{size:"small",onClick:v},{icon:a(()=>[t(e(V))]),default:a(()=>[r(" "+i(s.$t("common.refresh")),1)]),_:1}),t(e(g),{type:e(o).info.changelog_exists?"success":"default",size:"small"},{default:a(()=>[r(i(e(o).info.changelog_exists?s.$t("common.tracking"):s.$t("common.noChangelog")),1)]),_:1},8,["type"])]),_:1})]),default:a(()=>[e(o).info.changelog_exists?e(o).changelog.length===0?(c(),d("div",we,[t(e(N),{description:s.$t("config.changelogEmpty"),size:"small"},null,8,["description"])])):(c(),d("div",ze,[(c(!0),d(U,null,J(e(o).changelog,(h,_)=>(c(),d("div",{key:_,class:L(["changelog-entry",F(h)])},i(S(h)),3))),128))])):(c(),d("div",Ne,[t(e(N),{description:s.$t("config.noChangelog"),size:"small"},{extra:a(()=>[n("p",ke,[r(i(s.$t("config.changelogHint",{file:""})),1),l[5]||(l[5]=n("code",null,"changelog.log",-1))])]),_:1},8,["description"])]))]),_:1},8,["title"])]),_:1}),e(o).processes.length>0?(c(),z(e(m),{key:0,span:"2"},{default:a(()=>[t(e(u),{title:s.$t("config.processDefinitions")},{default:a(()=>[t(e(T),{columns:B.value,data:e(o).processes,bordered:!1,size:"small"},null,8,["columns","data"])]),_:1},8,["title"])]),_:1})):E("",!0)]),_:1})):E("",!0)]),_:1},8,["show"])]))}}),Oe=X(Ee,[["__scopeId","data-v-6f76d041"]]);export{Oe as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.dashboard-view[data-v-b23c65b5]{max-width:1400px;margin:0 auto}.page-header[data-v-b23c65b5]{display:flex;justify-content:space-between;align-items:center;margin-bottom:1.5rem}.header-title[data-v-b23c65b5]{display:flex;align-items:center;gap:.75rem}.dashboard-logo[data-v-b23c65b5]{width:72px;height:72px;border-radius:14px;box-shadow:0 0 0 1px #00e5ff38,0 18px 32px #0006}.page-header h1[data-v-b23c65b5]{margin:0}.stats-row[data-v-b23c65b5]{display:grid;grid-template-columns:repeat(4,1fr);gap:1rem;margin-bottom:1.5rem}@media(max-width:768px){.stats-row[data-v-b23c65b5]{grid-template-columns:repeat(2,1fr)}}.stat-card[data-v-b23c65b5]{transition:transform .15s ease,box-shadow .15s ease}.stat-card[data-v-b23c65b5]:hover{transform:translateY(-2px)}.stat-card.has-running[data-v-b23c65b5]{border-color:var(--n-success-color);box-shadow:0 0 20px #a8ff6026}.stat-content[data-v-b23c65b5]{display:flex;align-items:center;gap:1rem}.stat-icon-wrapper[data-v-b23c65b5]{width:48px;height:48px;display:flex;align-items:center;justify-content:center;border-radius:12px;background:var(--n-code-color)}.stat-icon-wrapper.running[data-v-b23c65b5]{background:#a8ff6026;color:var(--n-success-color)}.stat-icon-wrapper.processes[data-v-b23c65b5]{background:#00e5ff26;color:var(--n-primary-color)}.stat-icon-wrapper.groups[data-v-b23c65b5]{background:#ff2bd626;color:var(--n-info-color)}.stat-icon-wrapper.recipes[data-v-b23c65b5]{background:#ffcc0026;color:var(--n-warning-color)}.stat-icon[data-v-b23c65b5]{font-size:1.5rem}.stat-info[data-v-b23c65b5]{display:flex;flex-direction:column}.stat-value[data-v-b23c65b5]{font-size:1.75rem;font-weight:600;line-height:1}.stat-label[data-v-b23c65b5]{font-size:.75rem;text-transform:uppercase;letter-spacing:.05em;color:var(--n-text-color-3);margin-top:.25rem}.view-all-link[data-v-b23c65b5]{font-size:.8125rem;color:var(--n-primary-color);text-decoration:none}.view-all-link[data-v-b23c65b5]:hover{text-decoration:underline}.empty-placeholder[data-v-b23c65b5]{padding:1.5rem 0}.empty-hint[data-v-b23c65b5]{color:var(--n-text-color-3);font-size:.8125rem;margin:.5rem 0 0}.empty-hint code[data-v-b23c65b5]{background:var(--n-code-color);padding:.125rem .375rem;border-radius:3px}.process-list[data-v-b23c65b5]{display:flex;flex-direction:column;gap:.5rem}.process-item[data-v-b23c65b5]{display:flex;align-items:center;gap:.75rem;padding:.5rem;border-radius:var(--n-border-radius);cursor:pointer;transition:background .15s ease}.process-item[data-v-b23c65b5]:hover{background:var(--n-hover-color)}.status-dot[data-v-b23c65b5]{width:8px;height:8px;border-radius:50%;flex-shrink:0}.status-dot.running[data-v-b23c65b5]{background:var(--n-success-color);box-shadow:0 0 8px var(--n-success-color)}.status-dot.stopped[data-v-b23c65b5]{background:var(--n-text-color-3)}.status-dot.failed[data-v-b23c65b5]{background:var(--n-error-color)}.process-name[data-v-b23c65b5]{flex:1;font-family:var(--n-font-family-mono);font-size:.875rem}.status-tags[data-v-b23c65b5]{display:flex;align-items:center;gap:.35rem;flex-wrap:wrap}.more-indicator[data-v-b23c65b5]{text-align:center;font-size:.8125rem;color:var(--n-text-color-3);padding:.5rem}.quick-actions[data-v-b23c65b5]{display:flex;flex-direction:column;gap:1rem}.action-section[data-v-b23c65b5]{display:flex;flex-direction:column;gap:.5rem}.section-label[data-v-b23c65b5]{font-size:.75rem;text-transform:uppercase;letter-spacing:.05em;color:var(--n-text-color-3)}.action-buttons[data-v-b23c65b5]{display:flex;flex-wrap:wrap;gap:.5rem}.activity-list[data-v-b23c65b5]{display:flex;flex-direction:column;gap:.25rem}.activity-item[data-v-b23c65b5]{display:flex;align-items:center;gap:.5rem;padding:.375rem .5rem;font-size:.8125rem;font-family:var(--n-font-family-mono);border-left:3px solid transparent;border-radius:0 var(--n-border-radius-small) var(--n-border-radius-small) 0}.activity-item[data-v-b23c65b5]:hover{background:var(--n-hover-color)}.activity-item.execute[data-v-b23c65b5]{border-left-color:var(--n-primary-color)}.activity-item.start[data-v-b23c65b5]{border-left-color:var(--n-success-color)}.activity-item.stop[data-v-b23c65b5]{border-left-color:var(--n-warning-color)}.activity-item.create[data-v-b23c65b5]{border-left-color:var(--n-info-color)}.activity-icon[data-v-b23c65b5]{font-size:1rem;flex-shrink:0}.activity-item.execute .activity-icon[data-v-b23c65b5]{color:var(--n-primary-color)}.activity-item.start .activity-icon[data-v-b23c65b5]{color:var(--n-success-color)}.activity-item.stop .activity-icon[data-v-b23c65b5]{color:var(--n-warning-color)}.activity-item.create .activity-icon[data-v-b23c65b5]{color:var(--n-info-color)}.activity-text[data-v-b23c65b5]{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as L}from"./procler-DOrSB1Vj.js";import{G as U}from"./PhArrowsClockwise.vue-DqDg31az.js";import{H as X}from"./PhCheckCircle.vue-Fwj9sh9m.js";import{d as j,u as J,r as M,o as Z,c,a as e,b as a,t as l,w as o,e as s,B as C,n as S,N as _,f as n,g as K,h as u,G as Q,J as I,i as W,j as v,F as g,k as y,l as p,_ as Y}from"./index-BzW1XhyH.js";import{H as N}from"./PhPlay.vue-CZm7Gy3u.js";import{I as x}from"./PhPlus.vue-yTWqKlSh.js";import{I as ss}from"./PhStop.vue-DxsqwIki.js";import{u as ts}from"./groups-Zu-_v8ey.js";import{u as es}from"./recipes-1w5SseGb.js";import{u as as,g as V,f as os}from"./changelog-KkTT4H9-.js";import{N as is,a as T}from"./Grid-CZ9QVKAT.js";import{N as A}from"./Empty-MuygEHZM.js";import{N as D}from"./Tag-Bh_qV63A.js";const ns={class:"dashboard-view"},ls={class:"page-header"},rs={class:"header-title"},cs={class:"stats-row"},ds={class:"stat-content"},us={class:"stat-icon-wrapper running"},_s={class:"stat-info"},ps={class:"stat-value"},hs={class:"stat-label"},fs={class:"stat-content"},ms={class:"stat-icon-wrapper processes"},vs={class:"stat-info"},gs={class:"stat-value"},ys={class:"stat-label"},ks={class:"stat-content"},$s={class:"stat-icon-wrapper groups"},bs={class:"stat-info"},ws={class:"stat-value"},Cs={class:"stat-label"},Ss={class:"stat-content"},Ns={class:"stat-icon-wrapper recipes"},Ts={class:"stat-info"},As={class:"stat-value"},Gs={class:"stat-label"},zs={key:0,class:"empty-placeholder"},Es={key:1,class:"process-list"},Ps=["onClick"],Rs={class:"process-name"},Bs={class:"status-tags"},Is={key:0,class:"more-indicator"},Vs={key:0,class:"empty-placeholder"},Ds={class:"empty-hint"},Hs={key:1,class:"quick-actions"},Os={key:0,class:"action-section"},qs={class:"section-label"},Fs={class:"action-buttons"},Ls={key:1,class:"action-section"},Us={class:"section-label"},Xs={class:"action-buttons"},js={key:0,class:"empty-placeholder"},Js={key:1,class:"activity-list"},Ms={class:"activity-text"},Zs=j({__name:"DashboardView",setup(Ks){const d=J(),f=ts(),m=es(),k=as(),$=M(!1);function H(t){switch(t){case"running":return"success";case"stopped":return"default";case"failed":return"error";default:return"default"}}function O(t){switch(t){case"D":case"Z":return"error";case"T":case"t":return"warning";case"S":case"I":return"info";default:return"default"}}function G(t,r){return!t||!r||t==="R"?"":`${t} ${r}`}function q(t){const r=V(t);return r==="EXECUTE"?"execute":r==="START"?"start":r==="STOP"?"stop":"create"}function b(t,r){return V(t)===r}function F(t){return os(t)}async function z(){$.value=!0;try{await Promise.all([d.fetchProcesses(),f.fetchGroups(),m.fetchRecipes(),k.fetchChangelog(20)])}finally{$.value=!1}}return Z(z),(t,r)=>{const E=K("router-link");return n(),c("div",ns,[e("div",ls,[e("div",rs,[r[2]||(r[2]=e("img",{src:L,alt:"Procler logo",class:"dashboard-logo"},null,-1)),e("h1",null,l(t.$t("dashboard.title")),1)]),a(s(C),{onClick:z,loading:$.value},{icon:o(()=>[a(s(U))]),default:o(()=>[u(" "+l(t.$t("common.refresh")),1)]),_:1},8,["loading"])]),e("div",cs,[a(s(_),{class:S(["stat-card",{"has-running":s(d).runningCount>0}])},{default:o(()=>[e("div",ds,[e("div",us,[a(s(N),{weight:"fill",class:"stat-icon"})]),e("div",_s,[e("div",ps,l(s(d).runningCount),1),e("div",hs,l(t.$t("dashboard.stats.running")),1)])])]),_:1},8,["class"]),a(s(_),{class:"stat-card"},{default:o(()=>[e("div",fs,[e("div",ms,[a(s(Q),{class:"stat-icon"})]),e("div",vs,[e("div",gs,l(s(d).processes.length),1),e("div",ys,l(t.$t("dashboard.stats.processes")),1)])])]),_:1}),a(s(_),{class:"stat-card"},{default:o(()=>[e("div",ks,[e("div",$s,[a(s(I),{class:"stat-icon"})]),e("div",bs,[e("div",ws,l(s(f).groups.length),1),e("div",Cs,l(t.$t("dashboard.stats.groups")),1)])])]),_:1}),a(s(_),{class:"stat-card"},{default:o(()=>[e("div",Ss,[e("div",Ns,[a(s(W),{class:"stat-icon"})]),e("div",Ts,[e("div",As,l(s(m).recipes.length),1),e("div",Gs,l(t.$t("dashboard.stats.recipes")),1)])])]),_:1})]),a(s(is),{cols:2,"x-gap":20,"y-gap":20,responsive:"screen","item-responsive":!0},{default:o(()=>[a(s(T),{span:"2 m:1"},{default:o(()=>[a(s(_),{title:t.$t("dashboard.processStatus")},{"header-extra":o(()=>[a(E,{to:"/processes",class:"view-all-link"},{default:o(()=>[u(l(t.$t("common.viewAll")),1)]),_:1})]),default:o(()=>[s(d).processes.length===0?(n(),c("div",zs,[a(s(A),{description:t.$t("dashboard.noProcesses"),size:"small"},null,8,["description"])])):(n(),c("div",Es,[(n(!0),c(g,null,y(s(d).processes.slice(0,8),i=>{var h,P,R;return n(),c("div",{key:i.id,class:"process-item",onClick:w=>t.$router.push(`/process/${i.name}`)},[e("div",{class:S(["status-dot",i.status])},null,2),e("span",Rs,l(i.name),1),e("div",Bs,[a(s(D),{type:H(i.status),size:"small"},{default:o(()=>[u(l(i.status),1)]),_:2},1032,["type"]),G((h=i.linux_state)==null?void 0:h.state_code,(P=i.linux_state)==null?void 0:P.state_name)?(n(),p(s(D),{key:0,type:O((R=i.linux_state)==null?void 0:R.state_code),size:"small"},{default:o(()=>{var w,B;return[u(l(G((w=i.linux_state)==null?void 0:w.state_code,(B=i.linux_state)==null?void 0:B.state_name)),1)]}),_:2},1032,["type"])):v("",!0)])],8,Ps)}),128)),s(d).processes.length>8?(n(),c("div",Is,l(t.$t("common.more",{count:s(d).processes.length-8})),1)):v("",!0)]))]),_:1},8,["title"])]),_:1}),a(s(T),{span:"2 m:1"},{default:o(()=>[a(s(_),{title:t.$t("dashboard.quickActions")},{default:o(()=>[s(f).groups.length===0&&s(m).recipes.length===0?(n(),c("div",Vs,[a(s(A),{description:t.$t("dashboard.noGroupsOrRecipes"),size:"small"},{extra:o(()=>[e("p",Ds,[u(l(t.$t("dashboard.defineInConfig",{config:""})),1),r[3]||(r[3]=e("code",null,".procler/config.yaml",-1))])]),_:1},8,["description"])])):(n(),c("div",Hs,[s(f).groups.length>0?(n(),c("div",Os,[e("div",qs,l(t.$t("nav.groups")),1),e("div",Fs,[(n(!0),c(g,null,y(s(f).groups.slice(0,4),i=>(n(),p(s(C),{key:i.name,size:"small",onClick:r[0]||(r[0]=h=>t.$router.push("/groups"))},{icon:o(()=>[a(s(I))]),default:o(()=>[u(" "+l(i.name),1)]),_:2},1024))),128))])])):v("",!0),s(m).recipes.length>0?(n(),c("div",Ls,[e("div",Us,l(t.$t("nav.recipes")),1),e("div",Xs,[(n(!0),c(g,null,y(s(m).recipes.slice(0,4),i=>(n(),p(s(C),{key:i.name,size:"small",type:"primary",secondary:"",onClick:r[1]||(r[1]=h=>t.$router.push("/recipes"))},{icon:o(()=>[a(s(N),{weight:"fill"})]),default:o(()=>[u(" "+l(i.name),1)]),_:2},1024))),128))])])):v("",!0)]))]),_:1},8,["title"])]),_:1}),a(s(T),{span:"2"},{default:o(()=>[a(s(_),{title:t.$t("dashboard.recentActivity")},{"header-extra":o(()=>[a(E,{to:"/config",class:"view-all-link"},{default:o(()=>[u(l(t.$t("dashboard.viewChangelog")),1)]),_:1})]),default:o(()=>[s(k).changelog.length===0?(n(),c("div",js,[a(s(A),{description:t.$t("dashboard.noRecentActivity"),size:"small"},null,8,["description"])])):(n(),c("div",Js,[(n(!0),c(g,null,y(s(k).changelog.slice(-10).reverse(),(i,h)=>(n(),c("div",{key:h,class:S(["activity-item",q(i)])},[b(i,"EXECUTE")?(n(),p(s(X),{key:0,weight:"fill",class:"activity-icon"})):b(i,"START")?(n(),p(s(N),{key:1,weight:"fill",class:"activity-icon"})):b(i,"STOP")?(n(),p(s(ss),{key:2,weight:"fill",class:"activity-icon"})):(n(),p(s(x),{key:3,weight:"fill",class:"activity-icon"})),e("span",Ms,l(F(i)),1)],2))),128))]))]),_:1},8,["title"])]),_:1})]),_:1})])}}}),ct=Y(Zs,[["__scopeId","data-v-b23c65b5"]]);export{ct as default};
|