main
parent
ce35981244
commit
224b4fc783
|
|
@ -1,4 +1,120 @@
|
||||||
<script>
|
<!DOCTYPE html>
|
||||||
|
<html lang="ru">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Органайзер АйТи-Депо</title>
|
||||||
|
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.3.12/jstree.min.js"></script>
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script> <!-- Библиотека для Markdown -->
|
||||||
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.3.12/themes/default/style.min.css">
|
||||||
|
<style>
|
||||||
|
body { display: flex; font-family: Arial, sans-serif; margin: 0; }
|
||||||
|
#tree-container { width: 20%; padding: 10px; border-right: 1px solid #ccc; }
|
||||||
|
#installs-container { width: 50%; padding: 10px; position: relative; }
|
||||||
|
.install-item { padding: 5px; margin: 2px; border: 1px solid #ddd; cursor: move; position: relative; }
|
||||||
|
.install-item.selected { background-color: #e6f7ff; } /* Подсветка выбранного пункта */
|
||||||
|
.form-container { margin-bottom: 20px; }
|
||||||
|
.jstree-node { position: relative; }
|
||||||
|
.folder-actions { display: none; position: absolute; right: 5px; top: 50%; transform: translateY(-50%); margin-left: 0; } /* Сдвигаем кнопки вправо и центрируем по вертикали */
|
||||||
|
#search-container { position: absolute; top: 10px; right: 10px; text-align: right; }
|
||||||
|
#search-input { width: 200px; margin-bottom: 5px; }
|
||||||
|
#installs-list { margin-top: 0; } /* Убираем верхний отступ, чтобы таблица начиналась сразу после заголовка */
|
||||||
|
.header { display: flex; justify-content: space-between; font-weight: bold; padding: 5px; background: #f0f0f0; cursor: pointer; }
|
||||||
|
.header div { flex: 1; text-align: center; }
|
||||||
|
.header div:hover { background: #e0e0e0; }
|
||||||
|
.sort-arrow { font-size: 12px; margin-left: 5px; }
|
||||||
|
.protocol-icon { margin-right: 5px; height: 16px; width: 16px; vertical-align: middle; }
|
||||||
|
.connection-link { color: blue; text-decoration: underline; cursor: pointer; }
|
||||||
|
.edit-button { display: none; position: absolute; right: 5px; top: 50%; transform: translateY(-50%); background: #007bff; color: white; border: none; padding: 2px 5px; border-radius: 3px; cursor: pointer; }
|
||||||
|
.edit-button:hover { background: #0056b3; }
|
||||||
|
.install-item:hover .edit-button { display: inline-block; }
|
||||||
|
.action-buttons { display: none; }
|
||||||
|
.install-item:hover .action-buttons { display: inline; }
|
||||||
|
#import-form { margin-top: 5px; }
|
||||||
|
#import-file { display: none; }
|
||||||
|
#import-label { cursor: pointer; background: #007bff; color: white; padding: 5px 10px; border-radius: 3px; margin-left: 5px; }
|
||||||
|
#import-label:hover { background: #0056b3; }
|
||||||
|
.folder-select { margin-bottom: 5px; width: 150px; }
|
||||||
|
.time-hint { font-size: 12px; color: #666; margin-top: 5px; }
|
||||||
|
#notes-panel { width: 30%; padding: 10px; border-left: 1px solid #ccc; background: #f9f9f9; min-height: 200px; margin-top: 240px; } /* Смещаем ниже, чтобы начиналось на уровне заголовка таблицы */
|
||||||
|
#notes-content { margin-top: 10px; }
|
||||||
|
#note-modal { display: none; position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); background: white; padding: 20px; border: 1px solid #ccc; box-shadow: 0 0 10px rgba(0,0,0,0.3); z-index: 1000; width: 500px; }
|
||||||
|
#note-modal .markdown-buttons { margin-bottom: 10px; }
|
||||||
|
#note-modal .markdown-buttons button { margin-right: 5px; padding: 5px 10px; }
|
||||||
|
#note-modal textarea { width: 100%; height: 200px; margin-bottom: 10px; }
|
||||||
|
#note-modal button { margin-right: 10px; }
|
||||||
|
#modal-overlay { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.5); z-index: 999; }
|
||||||
|
.header-logo { display: flex; align-items: center; }
|
||||||
|
.header-logo img { height: 50px; margin-right: 10px; } /* Логотип 50x50 пикселей */
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="tree-container">
|
||||||
|
<h2>Папки</h2>
|
||||||
|
<div id="folder-tree"></div>
|
||||||
|
<button onclick="addFolder()">Добавить папку</button>
|
||||||
|
</div>
|
||||||
|
<div id="installs-container">
|
||||||
|
<h1 class="header-logo">
|
||||||
|
<img src="/icons/it-depo-logo.png" alt="АйТи-Депо логотип"> <!-- Логотип -->
|
||||||
|
Органайзер АйТи-Депо
|
||||||
|
</h1>
|
||||||
|
<div id="search-container">
|
||||||
|
<input type="text" id="search-input" placeholder="Поиск по ID или имени">
|
||||||
|
<select id="folder-select" class="folder-select">
|
||||||
|
<option value="">Все папки</option>
|
||||||
|
</select>
|
||||||
|
<button onclick="exportCSV()">Экспорт CSV</button>
|
||||||
|
<form id="import-form" enctype="multipart/form-data">
|
||||||
|
<input type="file" id="import-file" accept=".csv" onchange="importCSV(this.files[0])">
|
||||||
|
<label for="import-file" id="import-label">Импорт CSV</label>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div class="form-container">
|
||||||
|
<h2>Добавить запись</h2>
|
||||||
|
<input type="text" id="rustId" placeholder="ID подключения" required>
|
||||||
|
<input type="text" id="computerName" placeholder="Имя компьютера" required>
|
||||||
|
<input type="text" id="installTime" placeholder="Время (опционально, формат: ГГГГ-ММ-ДД ЧЧ:ММ:СС)">
|
||||||
|
<select id="protocol">
|
||||||
|
<option value="rustdesk" selected>RustDesk</option>
|
||||||
|
<option value="anydesk">AnyDesk</option>
|
||||||
|
<option value="ammyy">Ammyy Admin</option>
|
||||||
|
<option value="teamviewer">TeamViewer</option>
|
||||||
|
<option value="vnc">VNC</option>
|
||||||
|
<option value="rdp">RDP</option>
|
||||||
|
</select>
|
||||||
|
<textarea id="note" placeholder="Заметка (Markdown поддерживается)"></textarea>
|
||||||
|
<button onclick="addInstall()">Добавить</button>
|
||||||
|
<div class="time-hint">Пример: 2025-03-05 14:30:00</div>
|
||||||
|
</div>
|
||||||
|
<div class="header">
|
||||||
|
<div onclick="sortInstalls('computer_name')">Имя компьютера<span class="sort-arrow"></span></div>
|
||||||
|
<div onclick="sortInstalls('rust_id')">ID подключения<span class="sort-arrow"></span></div>
|
||||||
|
<div onclick="sortInstalls('install_time')">Время установки<span class="sort-arrow"></span></div>
|
||||||
|
<div>Действия</div>
|
||||||
|
</div>
|
||||||
|
<div id="installs-list"></div>
|
||||||
|
</div>
|
||||||
|
<div id="notes-panel">
|
||||||
|
<h2>Заметка</h2>
|
||||||
|
<div id="notes-content"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Модальное окно для редактирования заметок -->
|
||||||
|
<div id="modal-overlay"></div>
|
||||||
|
<div id="note-modal">
|
||||||
|
<h3>Редактировать заметку</h3>
|
||||||
|
<div class="markdown-buttons">
|
||||||
|
<button onclick="formatBold()">Жирный</button>
|
||||||
|
<button onclick="formatItalic()">Курсив</button>
|
||||||
|
<button onclick="formatLink()">Ссылка</button>
|
||||||
|
</div>
|
||||||
|
<textarea id="note-textarea" placeholder="Введите заметку (Markdown поддерживается)"></textarea>
|
||||||
|
<button onclick="saveNote()">Сохранить</button>
|
||||||
|
<button onclick="closeNoteModal()">Закрыть</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
const API_URL = "http://<server-ip>:8002/api"; // Замени <server-ip> на IP или домен сервера
|
const API_URL = "http://<server-ip>:8002/api"; // Замени <server-ip> на IP или домен сервера
|
||||||
let selectedFolderId = null;
|
let selectedFolderId = null;
|
||||||
let allInstalls = [];
|
let allInstalls = [];
|
||||||
|
|
@ -163,8 +279,6 @@
|
||||||
updateSortArrows();
|
updateSortArrows();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Остальные функции (selectInstall, sortInstalls, updateSortArrows, addFolder, editFolder, deleteFolder, addInstall, editField, deleteInstall, moveInstallToFolder, openRemote, exportCSV, importCSV, openNoteModal, saveNote, closeNoteModal, updateNotesPanel, updateFolderActions, updateFolderSelect, formatBold, formatItalic, formatLink) остаются без изменений, но я их включу для полноты кода ниже.
|
|
||||||
|
|
||||||
function selectInstall(installId, rustId, protocol) {
|
function selectInstall(installId, rustId, protocol) {
|
||||||
selectedInstallId = installId;
|
selectedInstallId = installId;
|
||||||
$('.install-item').removeClass('selected');
|
$('.install-item').removeClass('selected');
|
||||||
|
|
@ -505,4 +619,6 @@
|
||||||
textarea[0].selectionEnd = start + newText.length - (selected ? 0 : '[текст]'.length);
|
textarea[0].selectionEnd = start + newText.length - (selected ? 0 : '[текст]'.length);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Loading…
Reference in New Issue