Replace manual upsert logic with SQLite native upsert in Docker CRUD repositories, enhance Ansible backup playbook with better error handling and file permissions, add favicon endpoint, and improve playbook editor UI with syntax highlighting, lint integration, quality badges, and enhanced code editing features
Tests / Backend Tests (Python) (3.10) (push) Has been cancelled
Tests / Backend Tests (Python) (3.11) (push) Has been cancelled
Tests / Backend Tests (Python) (3.12) (push) Has been cancelled
Tests / Frontend Tests (JS) (push) Has been cancelled
Tests / Integration Tests (push) Has been cancelled
Tests / All Tests Passed (push) Has been cancelled
Tests / Backend Tests (Python) (3.10) (push) Has been cancelled
Tests / Backend Tests (Python) (3.11) (push) Has been cancelled
Tests / Backend Tests (Python) (3.12) (push) Has been cancelled
Tests / Frontend Tests (JS) (push) Has been cancelled
Tests / Integration Tests (push) Has been cancelled
Tests / All Tests Passed (push) Has been cancelled
This commit is contained in:
+314
-3
@@ -1239,6 +1239,45 @@
|
||||
background-color: rgba(156, 163, 175, 0.2);
|
||||
color: #9ca3af;
|
||||
}
|
||||
|
||||
.playbook-lint-badge {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 0.75rem;
|
||||
padding: 3px 8px;
|
||||
border-radius: 9999px;
|
||||
font-weight: 700;
|
||||
border: 1px solid rgba(255, 255, 255, 0.12);
|
||||
background: rgba(75, 85, 99, 0.35);
|
||||
color: #e5e7eb;
|
||||
line-height: 1;
|
||||
cursor: help;
|
||||
}
|
||||
|
||||
.playbook-lint-badge.ok {
|
||||
background: rgba(59, 130, 246, 0.18);
|
||||
color: #93c5fd;
|
||||
border-color: rgba(59, 130, 246, 0.35);
|
||||
}
|
||||
|
||||
.playbook-lint-badge.good {
|
||||
background: rgba(34, 197, 94, 0.18);
|
||||
color: #86efac;
|
||||
border-color: rgba(34, 197, 94, 0.35);
|
||||
}
|
||||
|
||||
.playbook-lint-badge.warn {
|
||||
background: rgba(245, 158, 11, 0.18);
|
||||
color: #fcd34d;
|
||||
border-color: rgba(245, 158, 11, 0.35);
|
||||
}
|
||||
|
||||
.playbook-lint-badge.poor {
|
||||
background: rgba(239, 68, 68, 0.18);
|
||||
color: #fca5a5;
|
||||
border-color: rgba(239, 68, 68, 0.35);
|
||||
}
|
||||
|
||||
/* Monaco Editor Modal */
|
||||
.playbook-editor-modal {
|
||||
@@ -1255,21 +1294,26 @@
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* Simple code textarea fallback */
|
||||
/* Enhanced code textarea editor */
|
||||
.playbook-code-editor {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
min-height: 400px;
|
||||
background: #1e1e1e;
|
||||
background: linear-gradient(to right, #252526 50px, #1e1e1e 50px);
|
||||
color: #d4d4d4;
|
||||
font-family: 'JetBrains Mono', 'Fira Code', 'Cascadia Code', 'Consolas', monospace;
|
||||
font-size: 14px;
|
||||
line-height: 1.6;
|
||||
padding: 16px;
|
||||
padding: 16px 16px 16px 60px;
|
||||
border: none;
|
||||
resize: none;
|
||||
outline: none;
|
||||
tab-size: 2;
|
||||
-moz-tab-size: 2;
|
||||
white-space: pre;
|
||||
overflow-wrap: normal;
|
||||
overflow-x: auto;
|
||||
caret-color: #a78bfa;
|
||||
}
|
||||
|
||||
.playbook-code-editor:focus {
|
||||
@@ -1277,6 +1321,37 @@
|
||||
box-shadow: inset 0 0 0 2px rgba(139, 92, 246, 0.3);
|
||||
}
|
||||
|
||||
.playbook-code-editor::selection {
|
||||
background: rgba(139, 92, 246, 0.4);
|
||||
}
|
||||
|
||||
.playbook-code-editor::-moz-selection {
|
||||
background: rgba(139, 92, 246, 0.4);
|
||||
}
|
||||
|
||||
/* Scrollbar styling for editor */
|
||||
.playbook-code-editor::-webkit-scrollbar {
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
}
|
||||
|
||||
.playbook-code-editor::-webkit-scrollbar-track {
|
||||
background: #1e1e1e;
|
||||
}
|
||||
|
||||
.playbook-code-editor::-webkit-scrollbar-thumb {
|
||||
background: #424242;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.playbook-code-editor::-webkit-scrollbar-thumb:hover {
|
||||
background: #555;
|
||||
}
|
||||
|
||||
.playbook-code-editor::-webkit-scrollbar-corner {
|
||||
background: #1e1e1e;
|
||||
}
|
||||
|
||||
/* Syntax highlighting hint text */
|
||||
.yaml-hint {
|
||||
background: rgba(139, 92, 246, 0.1);
|
||||
@@ -1294,6 +1369,239 @@
|
||||
padding: 12px 16px;
|
||||
}
|
||||
|
||||
/* ===== ENHANCED PLAYBOOK EDITOR STYLES ===== */
|
||||
|
||||
/* Lint button states */
|
||||
.lint-button {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
padding: 6px 12px;
|
||||
border-radius: 6px;
|
||||
font-size: 0.875rem;
|
||||
font-weight: 500;
|
||||
transition: all 0.2s ease;
|
||||
background: rgba(107, 114, 128, 0.3);
|
||||
color: #d1d5db;
|
||||
border: 1px solid rgba(107, 114, 128, 0.5);
|
||||
}
|
||||
|
||||
.lint-button:hover:not(:disabled) {
|
||||
background: rgba(139, 92, 246, 0.3);
|
||||
border-color: rgba(139, 92, 246, 0.5);
|
||||
}
|
||||
|
||||
.lint-button:disabled {
|
||||
opacity: 0.6;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
.lint-button.success {
|
||||
background: rgba(16, 185, 129, 0.2);
|
||||
border-color: rgba(16, 185, 129, 0.5);
|
||||
color: #10b981;
|
||||
}
|
||||
|
||||
.lint-button.warnings {
|
||||
background: rgba(245, 158, 11, 0.2);
|
||||
border-color: rgba(245, 158, 11, 0.5);
|
||||
color: #f59e0b;
|
||||
}
|
||||
|
||||
.lint-button.errors {
|
||||
background: rgba(239, 68, 68, 0.2);
|
||||
border-color: rgba(239, 68, 68, 0.5);
|
||||
color: #ef4444;
|
||||
}
|
||||
|
||||
/* Quality badge */
|
||||
.quality-badge {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
padding: 4px 10px;
|
||||
border-radius: 9999px;
|
||||
font-size: 0.75rem;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.quality-badge.excellent {
|
||||
background: rgba(16, 185, 129, 0.2);
|
||||
color: #10b981;
|
||||
}
|
||||
|
||||
.quality-badge.good {
|
||||
background: rgba(59, 130, 246, 0.2);
|
||||
color: #3b82f6;
|
||||
}
|
||||
|
||||
.quality-badge.warning {
|
||||
background: rgba(245, 158, 11, 0.2);
|
||||
color: #f59e0b;
|
||||
}
|
||||
|
||||
.quality-badge.poor {
|
||||
background: rgba(239, 68, 68, 0.2);
|
||||
color: #ef4444;
|
||||
}
|
||||
|
||||
/* Problems panel */
|
||||
.problems-panel {
|
||||
max-height: 200px;
|
||||
overflow-y: auto;
|
||||
background: rgba(17, 24, 39, 0.8);
|
||||
border: 1px solid #374151;
|
||||
border-radius: 8px;
|
||||
scrollbar-width: thin;
|
||||
scrollbar-color: rgba(139, 92, 246, 0.5) rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
|
||||
.problems-panel::-webkit-scrollbar {
|
||||
width: 6px;
|
||||
}
|
||||
|
||||
.problems-panel::-webkit-scrollbar-track {
|
||||
background: rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
|
||||
.problems-panel::-webkit-scrollbar-thumb {
|
||||
background: rgba(139, 92, 246, 0.5);
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.problem-item {
|
||||
cursor: pointer;
|
||||
transition: background 0.15s ease;
|
||||
}
|
||||
|
||||
.problem-item:hover {
|
||||
background: rgba(139, 92, 246, 0.1);
|
||||
}
|
||||
|
||||
/* Lint gutter markers */
|
||||
.cm-lint-gutter {
|
||||
width: 20px;
|
||||
}
|
||||
|
||||
.lint-gutter-marker {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
font-size: 12px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.lint-gutter-marker.lint-error {
|
||||
color: #ef4444;
|
||||
}
|
||||
|
||||
.lint-gutter-marker.lint-warning {
|
||||
color: #f59e0b;
|
||||
}
|
||||
|
||||
.lint-gutter-marker.lint-info {
|
||||
color: #3b82f6;
|
||||
}
|
||||
|
||||
/* CodeMirror 6 custom styles */
|
||||
.cm-editor {
|
||||
height: 100%;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.cm-editor .cm-scroller {
|
||||
font-family: 'JetBrains Mono', 'Fira Code', 'Cascadia Code', monospace;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.cm-editor .cm-gutters {
|
||||
background: #1e1e1e;
|
||||
border-right: 1px solid #333;
|
||||
}
|
||||
|
||||
.cm-editor .cm-activeLineGutter {
|
||||
background: rgba(139, 92, 246, 0.1);
|
||||
}
|
||||
|
||||
.cm-editor .cm-activeLine {
|
||||
background: rgba(139, 92, 246, 0.05);
|
||||
}
|
||||
|
||||
/* Ansible syntax highlighting */
|
||||
.cm-ansible-module {
|
||||
color: #82aaff;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.cm-ansible-key {
|
||||
color: #c792ea;
|
||||
}
|
||||
|
||||
.cm-jinja-var {
|
||||
color: #c3e88d;
|
||||
background: rgba(195, 232, 141, 0.1);
|
||||
border-radius: 2px;
|
||||
padding: 0 2px;
|
||||
}
|
||||
|
||||
.cm-jinja-block {
|
||||
color: #89ddff;
|
||||
background: rgba(137, 221, 255, 0.1);
|
||||
border-radius: 2px;
|
||||
padding: 0 2px;
|
||||
}
|
||||
|
||||
/* Editor tabs */
|
||||
.editor-tabs {
|
||||
display: flex;
|
||||
gap: 2px;
|
||||
background: rgba(17, 24, 39, 0.5);
|
||||
padding: 4px;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
.editor-tab {
|
||||
padding: 6px 12px;
|
||||
border-radius: 6px;
|
||||
font-size: 0.75rem;
|
||||
font-weight: 500;
|
||||
color: #9ca3af;
|
||||
cursor: pointer;
|
||||
transition: all 0.15s ease;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
.editor-tab:hover {
|
||||
background: rgba(107, 114, 128, 0.3);
|
||||
color: #e5e7eb;
|
||||
}
|
||||
|
||||
.editor-tab.active {
|
||||
background: rgba(139, 92, 246, 0.3);
|
||||
color: #a78bfa;
|
||||
}
|
||||
|
||||
.editor-tab .tab-count {
|
||||
padding: 1px 6px;
|
||||
border-radius: 9999px;
|
||||
font-size: 0.65rem;
|
||||
background: rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
|
||||
.editor-tab.errors .tab-count {
|
||||
background: rgba(239, 68, 68, 0.3);
|
||||
color: #fca5a5;
|
||||
}
|
||||
|
||||
.editor-tab.warnings .tab-count {
|
||||
background: rgba(245, 158, 11, 0.3);
|
||||
color: #fcd34d;
|
||||
}
|
||||
|
||||
/* File size indicator */
|
||||
.file-size-badge {
|
||||
font-size: 0.7rem;
|
||||
@@ -5043,5 +5351,8 @@
|
||||
|
||||
<!-- Containers Page JavaScript -->
|
||||
<script src="/static/containers_page.js"></script>
|
||||
|
||||
<!-- CodeMirror Editor Bundle -->
|
||||
<script src="/static/codemirror-editor.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user