Skip to content

Commit 7989aa8

Browse files
committed
Merge branch 'main' into 26.4
2 parents 5f09b17 + 3cc91e2 commit 7989aa8

118 files changed

Lines changed: 2547 additions & 888 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

index.html

Lines changed: 72 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,18 @@
1919
<link rel="stylesheet" href="resources/custom.css">
2020
<script src="manifest/app.js"></script>
2121
<title>Backend.AI</title>
22+
<!-- Critical inline CSS: ensures splash is visible before external CSS loads -->
23+
<style>
24+
body { margin: 0; background-color: rgba(247, 247, 246, 1); }
25+
body.dark-theme { background-color: #191919; }
26+
#splash {
27+
position: fixed; top: 0; left: 0; width: 100%; height: 100%;
28+
z-index: 10000; display: flex; align-items: center; justify-content: center;
29+
background-color: rgba(247, 247, 246, 1); transition: opacity 0.3s ease-out;
30+
}
31+
body.dark-theme #splash { background-color: #191919; }
32+
.splash-hidden { opacity: 0; pointer-events: none; }
33+
</style>
2234
<script nonce="{{nonce}}">
2335
globalThis.isElectron = isElectron();
2436
if (isElectron) {
@@ -56,12 +68,15 @@
5668
if (globalThis.isDarkMode) {
5769
document.body.classList.add('dark-theme');
5870
}
71+
// Set body background immediately to prevent white flash before CSS loads
72+
document.body.style.backgroundColor = globalThis.isDarkMode ? '#191919' : 'rgba(247, 247, 246, 1)';
5973
</script>
6074
<div>
61-
<div id="react-root">
62-
<div class="splash">
75+
<div id="react-root"></div>
76+
<div id="splash" class="splash">
77+
<div class="splash-drag-area"></div>
78+
<div class="splash-card">
6379
<div class="splash-header">
64-
<!-- <img src="manifest/backend.ai-text.svg" style="height:50px;padding:35px 20px;"> -->
6580
<div class="logo"></div>
6681
</div>
6782
<div class="splash-information">
@@ -75,13 +90,15 @@
7590
<li class="copyright">Copyright &copy; 2015-2026 Lablup Inc.</li>
7691
</ul>
7792
</div>
78-
<div class="sk-folding-cube">
79-
<div class="sk-cube1 sk-cube"></div>
80-
<div class="sk-cube2 sk-cube"></div>
81-
<div class="sk-cube4 sk-cube"></div>
82-
<div class="sk-cube3 sk-cube"></div>
93+
<div class="splash-loading">
94+
<div class="sk-folding-cube">
95+
<div class="sk-cube1 sk-cube"></div>
96+
<div class="sk-cube2 sk-cube"></div>
97+
<div class="sk-cube3 sk-cube"></div>
98+
<div class="sk-cube4 sk-cube"></div>
99+
</div>
100+
<div id="loading-message" class="loading-message">Loading components...</div>
83101
</div>
84-
<div id="loading-message" class="loading-message">Loading components...</div>
85102
</div>
86103
</div>
87104
<noscript>
@@ -112,6 +129,52 @@
112129
});
113130
}
114131
}
132+
133+
// Splash fade-out: React-driven dismissal.
134+
// React calls window.__dismissSplash() when meaningful UI is ready
135+
// (sider/header for logged-in, login form for logged-out).
136+
// MutationObserver serves as a fallback for independent routes
137+
// (/verify-email, /change-password, etc.) that render content quickly.
138+
(function () {
139+
var splash = document.getElementById('splash');
140+
if (!splash) return;
141+
var dismissed = false;
142+
var observer = null;
143+
var fallbackTimer = null;
144+
function dismiss() {
145+
if (dismissed) return;
146+
dismissed = true;
147+
if (observer) observer.disconnect();
148+
if (fallbackTimer) clearTimeout(fallbackTimer);
149+
splash.classList.add('splash-hidden');
150+
splash.addEventListener('transitionend', function handler(e) {
151+
if (e.propertyName === 'opacity') {
152+
splash.removeEventListener('transitionend', handler);
153+
splash.remove();
154+
}
155+
});
156+
// Safety net: remove even if transitionend never fires (e.g. prefers-reduced-motion)
157+
setTimeout(function () { if (splash.parentNode) splash.remove(); }, 1000);
158+
}
159+
// Primary trigger: called by React when the visible UI is ready.
160+
// Cancels the MutationObserver fallback timer to prevent premature dismissal.
161+
window.__dismissSplash = dismiss;
162+
// Fallback: MutationObserver for routes that don't explicitly call __dismissSplash
163+
// (e.g. /verify-email, /change-password). Uses a longer delay to avoid racing
164+
// with React-driven dismissal on normal routes.
165+
var reactRoot = document.getElementById('react-root');
166+
if (reactRoot) {
167+
observer = new MutationObserver(function () {
168+
if (reactRoot.childNodes.length > 0) {
169+
observer.disconnect();
170+
fallbackTimer = setTimeout(dismiss, 3000);
171+
}
172+
});
173+
observer.observe(reactRoot, { childList: true });
174+
}
175+
// Ultimate safety fallback
176+
setTimeout(dismiss, 10000);
177+
})();
115178
</script>
116179
</body>
117180

packages/backend.ai-webui-docs/TERMINOLOGY.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,19 @@ Backend.AI's GPU virtualization technology that allows sharing a single physical
138138

139139
**Do NOT use** "container" and "kernel" interchangeably. They refer to different concepts.
140140

141+
### RBAC (Role-Based Access Control)
142+
143+
| Term | EN | KO | JA | TH | Description |
144+
|------|----|----|----|----|-------------|
145+
| RBAC | RBAC | RBAC | RBAC | RBAC | Keep as abbreviation across all languages |
146+
| Role | role | 권한 | ロール | บทบาท | A named set of permissions assignable to users |
147+
| Permission | permission | 세부 권한 | 権限 | สิทธิ์ | A fine-grained access rule within a role |
148+
| Role Assignment | role assignment | 권한 할당 | ロール割り当て | การมอบหมายบทบาท | The association of a user to a role |
149+
| Scope Type | scope type | 적용 범위 타입 | スコープタイプ | ประเภทขอบเขต | The level at which a permission applies |
150+
| Permission Type | permission type | 권한 타입 | 権限タイプ | ประเภทสิทธิ์ | The category of resource a permission controls |
151+
152+
**Note**: The Korean i18n uses "권한" for both "Role" and "Permission" in different contexts. "세부 권한" is used specifically for fine-grained permissions within a role. Always check `resources/i18n/ko.json` for the exact UI labels.
153+
141154
## User Roles
142155

143156
| Role | EN | KO | JA | Scope |
@@ -158,6 +171,7 @@ These terms match sidebar menu items. Keep documentation references consistent w
158171
| Model Serving | 모델 서빙 | モデルサービス | model_serving/model_serving.md |
159172
| Statistics | 통계 | 統計 | statistics/statistics.md |
160173
| User Settings | 사용자 설정 | ユーザー設定 | user_settings/user_settings.md |
174+
| RBAC Management | RBAC 관리 | RBAC管理 | rbac_management/rbac_management.md |
161175

162176
**Important**: Always check `resources/i18n/{lang}.json` in the main project for current UI label translations. The i18n files are the source of truth for UI labels.
163177

packages/backend.ai-webui-docs/src/book.config.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ navigation:
5757
path: user_settings/user_settings.md
5858
- title: Cluster Session
5959
path: cluster_session/cluster_session.md
60+
- title: RBAC Management
61+
path: rbac_management/rbac_management.md
6062
- title: Admin Menu
6163
path: admin_menu/admin_menu.md
6264
- title: Trouble Shooting
@@ -114,6 +116,8 @@ navigation:
114116
path: user_settings/user_settings.md
115117
- title: クラスターセッション
116118
path: cluster_session/cluster_session.md
119+
- title: RBAC管理
120+
path: rbac_management/rbac_management.md
117121
- title: 管理者メニュー
118122
path: admin_menu/admin_menu.md
119123
- title: FAQ&トラブルシューティング
@@ -171,6 +175,8 @@ navigation:
171175
path: user_settings/user_settings.md
172176
- title: 클러스터 세션
173177
path: cluster_session/cluster_session.md
178+
- title: RBAC 관리
179+
path: rbac_management/rbac_management.md
174180
- title: 관리자 메뉴
175181
path: admin_menu/admin_menu.md
176182
- title: FAQ 및 문제 해결
@@ -228,6 +234,8 @@ navigation:
228234
path: user_settings/user_settings.md
229235
- title: เซสชันคลัสเตอร์
230236
path: cluster_session/cluster_session.md
237+
- title: การจัดการ RBAC
238+
path: rbac_management/rbac_management.md
231239
- title: เมนูผู้ดูแลระบบ
232240
path: admin_menu/admin_menu.md
233241
- title: FAQ และการแก้ไขปัญหา

0 commit comments

Comments
 (0)