feat: 项目自动选中、重命名接口与长配置值展开;页面显示版本号 v1.0.<commit> build <时间>
build-and-deploy / build-and-deploy (push) Successful in 28s
build-and-deploy / build-and-deploy (push) Successful in 28s
This commit is contained in:
+66
-3
@@ -26,6 +26,8 @@
|
||||
.projects-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 14px; }
|
||||
.project-card { background: #fff; border: 1px solid #dcdcdc; border-radius: 6px; padding: 14px 16px 12px; cursor: pointer; transition: border-color 0.15s, box-shadow 0.15s, transform 0.15s; display: flex; flex-direction: column; }
|
||||
.project-card:hover { border-color: #5b9bd5; box-shadow: 0 4px 14px rgba(0,120,212,0.15); transform: translateY(-1px); }
|
||||
.project-card.selected { border-color: #0078d4; box-shadow: 0 0 0 1px #0078d4 inset, 0 4px 14px rgba(0,120,212,0.2); }
|
||||
.project-card.selected .project-card-title::after { content: "✓"; margin-left: 6px; font-size: 13px; color: #0078d4; font-weight: 700; }
|
||||
.project-card-top { display: flex; align-items: flex-start; gap: 10px; }
|
||||
.project-icon { width: 34px; height: 34px; border-radius: 6px; background: #e5f1fb; color: #0078d4; display: flex; align-items: center; justify-content: center; font-size: 17px; flex-shrink: 0; }
|
||||
.project-card-title { font-size: 15px; font-weight: 600; color: #003a70; line-height: 1.3; }
|
||||
@@ -80,8 +82,11 @@
|
||||
</div>
|
||||
|
||||
<footer class="statusbar">
|
||||
<span id="status-text">加载中...</span>
|
||||
<span id="status-user"></span>
|
||||
<div class="statusbar-left">
|
||||
<span id="status-text">加载中...</span>
|
||||
<span id="status-user"></span>
|
||||
</div>
|
||||
<span class="statusbar-version" id="version-text"></span>
|
||||
</footer>
|
||||
|
||||
<!-- 新建项目模态框(复用 index.html 中的结构) -->
|
||||
@@ -138,7 +143,28 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 重命名项目模态框 -->
|
||||
<div class="modal-overlay" id="modal-rename" style="display:none">
|
||||
<div class="modal" style="width:360px">
|
||||
<div class="modal-header">
|
||||
<h3>重命名项目</h3>
|
||||
<button class="modal-close" onclick="closeModal('modal-rename')">✕</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="form-group">
|
||||
<label>项目名称 <span class="required">*</span></label>
|
||||
<input type="text" id="rename-project-name" placeholder="新的项目名称">
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button class="btn btn-secondary" onclick="closeModal('modal-rename')">取消</button>
|
||||
<button class="btn btn-primary" id="btn-save-rename">保存</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="/js/api.js"></script>
|
||||
<script src="/js/version.js"></script>
|
||||
<script>
|
||||
var currentUser = null;
|
||||
var confirmCallback = null;
|
||||
@@ -203,6 +229,9 @@
|
||||
return;
|
||||
}
|
||||
|
||||
var selectedId = null;
|
||||
try { selectedId = localStorage.getItem("registry_selected_project") || null; } catch (e) {}
|
||||
|
||||
var dims = [];
|
||||
grid.innerHTML = projects.map(function (p) {
|
||||
dims = [];
|
||||
@@ -211,7 +240,8 @@
|
||||
if (p.enableGroup) dims.push("🗂 分组");
|
||||
var badges = dims.map(function (d) { return '<span class="dim-chip">' + d + "</span>"; }).join("");
|
||||
var time = p.updatedAt ? new Date(p.updatedAt).toLocaleDateString("zh-CN") : "";
|
||||
return '<div class="project-card" data-id="' + p.id + '" onclick="openProject(\'' + p.id + "')\">" +
|
||||
var selectedCls = p.id === selectedId ? " selected" : "";
|
||||
return '<div class="project-card' + selectedCls + '" data-id="' + p.id + '" onclick="selectProject(\'' + p.id + "')\">" +
|
||||
'<div class="project-card-top">' +
|
||||
'<div class="project-icon">📦</div>' +
|
||||
'<div><div class="project-card-title">' + esc(p.name) + '</div>' +
|
||||
@@ -223,6 +253,7 @@
|
||||
"<span>" + time + "</span>" +
|
||||
'<div class="project-card-actions">' +
|
||||
'<button class="row-btn" onclick="event.stopPropagation();openProject(\'' + p.id + "')\">进入</button>" +
|
||||
'<button class="row-btn" onclick="event.stopPropagation();openRename(\'' + p.id + "', '" + esc(p.name) + "')\">重命名</button>" +
|
||||
'<button class="row-btn danger" onclick="event.stopPropagation();confirmDelete(\'' + p.id + "', '" + esc(p.name) + "')\">删除</button>" +
|
||||
"</div>" +
|
||||
"</div>" +
|
||||
@@ -240,9 +271,26 @@
|
||||
}
|
||||
|
||||
function openProject(id) {
|
||||
try { localStorage.setItem("registry_selected_project", id); } catch (e) {}
|
||||
window.location.href = "/index.html?project=" + encodeURIComponent(id);
|
||||
}
|
||||
|
||||
function selectProject(id) {
|
||||
try { localStorage.setItem("registry_selected_project", id); } catch (e) {}
|
||||
var cards = document.querySelectorAll(".project-card");
|
||||
cards.forEach(function (c) { c.classList.remove("selected"); });
|
||||
var card = document.querySelector('.project-card[data-id="' + id + '"]');
|
||||
if (card) card.classList.add("selected");
|
||||
openProject(id);
|
||||
}
|
||||
|
||||
var renameProjectId = null;
|
||||
function openRename(id, name) {
|
||||
renameProjectId = id;
|
||||
document.getElementById("rename-project-name").value = name;
|
||||
openModal("modal-rename");
|
||||
}
|
||||
|
||||
function confirmDelete(id, name) {
|
||||
openConfirm("确认删除项目「" + name + "」?此操作将同时删除该项目下的所有配置,且不可恢复。", async function () {
|
||||
try {
|
||||
@@ -259,6 +307,21 @@
|
||||
document.getElementById("btn-new-project").addEventListener("click", function () { openModal("modal-project"); });
|
||||
document.getElementById("btn-new-project-2").addEventListener("click", function () { openModal("modal-project"); });
|
||||
|
||||
document.getElementById("btn-save-rename").addEventListener("click", async function () {
|
||||
var name = document.getElementById("rename-project-name").value.trim();
|
||||
if (!name) { toast("请输入项目名称", "error"); return; }
|
||||
if (!renameProjectId) { toast("缺少项目信息", "error"); return; }
|
||||
try {
|
||||
await API.updateProject(renameProjectId, { name: name });
|
||||
closeModal("modal-rename");
|
||||
renameProjectId = null;
|
||||
toast("项目已重命名", "success");
|
||||
loadProjects();
|
||||
} catch (err) {
|
||||
toast("重命名失败: " + err.message, "error");
|
||||
}
|
||||
});
|
||||
|
||||
document.getElementById("btn-save-project").addEventListener("click", async function () {
|
||||
var name = document.getElementById("project-name").value.trim();
|
||||
var desc = document.getElementById("project-description").value.trim();
|
||||
|
||||
Reference in New Issue
Block a user