feat(ui): display current git branch in browser tab, header, and nav tabs

- Add branch indicator in browser tab title ([test-gay] GaC-Srtool...)
- Add dynamic tab switching updates preserving branch prefix in browser title
- Add branch badge in brand header and right-aligned branch pill in navigation tabs
- Add scripts/sync-branch.js and version.json for automated branch detection
This commit is contained in:
CAtlas0784 committed 2026-10-17 11:56:50 +07:00
1 parent ba4398fe42
commit fbe6a5f47e
6 files changed
+170 -4

No files matched your search

+82
View File
@@ -841,6 +841,7 @@ function applyTranslations() {
renderAvatarsGrid();
}
loadEquipment();
updateDocumentTitle();
}
// Setup Language Selector
@@ -6328,6 +6329,7 @@ function setupTabs() {
if (targetContent) {
targetContent.classList.add('active');
state.activeTab = targetId;
updateDocumentTitle(targetId);
// On-demand tab refresh
if (targetId === 'tab-avatars') {
@@ -7278,6 +7280,85 @@ function setupEvents() {
});
}
// ==========================================
// Git Branch Detection & Browser Tab Title
// ==========================================
let currentGitBranch = 'test-gay';
function updateDocumentTitle(tabId = state.activeTab || 'tab-dashboard') {
const branchPrefix = currentGitBranch ? `[${currentGitBranch}] ` : '';
const tabNames = {
'tab-dashboard': 'GaC-Srtool — Ultimate Star Rail Server & Build Manager',
'tab-avatars': `👥 ${t('tabAvatars') || 'ตัวละคร'} | GaC-Srtool`,
'tab-equipment': `🗡️ ${t('tabEquipment') || 'กรวยแสง & รีลิกส์'} | GaC-Srtool`,
'tab-persistent': `💾 ${t('tabPersistent') || 'จัดการเซฟ GaC'} | GaC-Srtool`,
'tab-exrank': `⚡ ${t('tabExrank') || 'สกิลพิเศษ Ex-Rank'} | GaC-Srtool`,
'tab-json': `📝 ${t('tabJson') || 'จัดการไฟล์ JSON'} | GaC-Srtool`,
'tab-settings': `⚙️ ${t('tabSettings') || 'ตั้งค่า'} | GaC-Srtool`
};
const titleBody = tabNames[tabId] || 'GaC-Srtool — Ultimate Star Rail Server & Build Manager';
document.title = `${branchPrefix}${titleBody}`;
}
function applyBranchToUI(branch) {
state.currentBranch = branch;
currentGitBranch = branch;
// 1. Browser Tab Title (<title> & document.title)
updateDocumentTitle();
// 2. Header Brand Badge
const headerBadge = document.getElementById('header-branch-badge');
if (headerBadge) {
headerBadge.textContent = branch;
headerBadge.style.display = 'inline-flex';
}
// 3. Nav Tabs Branch Indicator
const navBadge = document.getElementById('nav-branch-name');
if (navBadge) {
navBadge.textContent = branch;
}
}
async function initGitBranchDisplay() {
// 1. URL Query Param ?branch=...
const urlParams = new URLSearchParams(window.location.search);
const branchFromUrl = urlParams.get('branch');
if (branchFromUrl) {
applyBranchToUI(branchFromUrl.trim());
return;
}
// 2. version.json (Generated by sync-branch or git commit)
try {
const res = await fetch('version.json?t=' + Date.now());
if (res.ok) {
const data = await res.json();
if (data && data.branch) {
applyBranchToUI(data.branch.trim());
return;
}
}
} catch (_) {}
// 3. .git/HEAD (if served locally by dev server)
try {
const headRes = await fetch('.git/HEAD?t=' + Date.now());
if (headRes.ok) {
const headText = await headRes.text();
const match = headText.match(/ref:\s*refs\/heads\/([^\r\n]+)/);
if (match && match[1]) {
applyBranchToUI(match[1].trim());
return;
}
}
} catch (_) {}
// 4. Fallback
applyBranchToUI(currentGitBranch);
}
// Background Ping Loop
function startPingLoop() {
setInterval(() => {
@@ -7287,6 +7368,7 @@ function startPingLoop() {
// Initialize Application
async function init() {
await initGitBranchDisplay();
await loadCachedGachabaseData({
idbGet,
idbSet,