Durum: Kabul edildi; projenin yazılı mühendislik kurallarında belirtilir. Bu kayıt Cluster ERP'nin arayüz durumunu nerede tuttuğunu kapsar. Kullanıcının sahip olduğu düzen (ana ekran, dock, bileşenler) sunucudaki kullanıcı hesabına aittir; tek bir cihazın tercihleri (tema, dil, saat dilimi, erişilebilirlik, yüzen düğme konumu) o cihazda kalır. İstemci ve rotalar kullanıcı arayüz durumu sayfasında açıklanır.
Bağlam¶
İstemci modülü kurala yol açan sorunu belirtir: ana ekran yerleşimi bir zamanlar yalnız tarayıcının yerel deposunda yaşıyordu; bu yüzden "silently differed per browser, per device and even per host name" ve temizlenen bir önbellek sıfırlama gibi görünüyordu (webapp/js/ui-state.js:1-7). Model belge dizesi amacı belirtir: düzen kişiyi cihazlar ve tarayıcılar arasında izler ve yeniden başlatmaya, temizlenen önbelleğe veya farklı bir ana makine adına dayanır (src/cluster_erp/modules/auth/ui_state/models.py:13-21). Projenin yazılı mühendislik kuralları ayrıca tarayıcı testlerinin arayüz durumu bekçisini kullanmasını ister.
Karar¶
- Kullanıcı başına yerleşim değerleri, kullanıcı ve anahtar başına bir canlı satırla
auth_user_ui_statetablosunda durur (src/cluster_erp/modules/auth/ui_state/models.py:23-35). GET /api/v1/auth/ui-statevePUT /api/v1/auth/ui-state/{key}rotaları oturum açmış kullanıcının kendi değerlerini okur ve yazar. Kullanıcı kimliği istekten değil, belirteçten gelir (src/cluster_erp/modules/auth/ui_state/routes.py:15-39,src/cluster_erp/modules/auth/module.py:58,src/cluster_erp/modules/auth/module.py:68).- Cihaz tercihleri
localStorageiçinde kalır: tema ve saat dilimi (webapp/js/prefs.js:5-6), dil (webapp/js/i18n.js:9), erişilebilirlik (webapp/js/a11y.js:33) ve yüzen düğme konumu (webapp/js/home.js:2965). Masaüstü istemci pencere ve bölme yerleşiminiQSettingsiçinde tutar (src/cluster_erp/desktop/core/settings_store.py:10).
Sıra şeması web uygulamasında bir yerleşim değişikliğini gösterir.
sequenceDiagram participant UI as ana ekran participant St as ui-state.js participant API as auth ui-state rotaları participant Svc as UiStateService UI->>St: saveUiState(key, value) St->>St: kuyruğa al, 600 ms bekle St->>API: keepalive ile PUT /auth/ui-state/key API->>Svc: put(user.id, key, value) Svc->>Svc: canlı satırı ekle veya güncelle
Düzyazıyla: saveUiState yerel önbelleği günceller, değeri kuyruğa alır ve 600 ms'lik bir zamanlayıcı başlatır; böylece bir sürükleme sırasındaki birçok kayıt tek bir yazma olur (webapp/js/ui-state.js:68-73). flush, kuyruktaki her anahtar için keepalive ile bir PUT gönderir ve sayfa gizlendiğinde veya kapandığında da kuyruk boşaltılır (webapp/js/ui-state.js:41-65). Servis o kullanıcı ve anahtarın canlı satırını ekler veya günceller (src/cluster_erp/modules/auth/ui_state/services.py:30-44).
Sonuçlar¶
- Bir kişi başka bir kişinin yerleşimini okuyamaz ve üzerine yazamaz; rotaları yalnız kimlik doğrulama korur (
src/cluster_erp/modules/auth/ui_state/routes.py:15-18). - Bir değer 256 KiB JSON ile (
src/cluster_erp/modules/auth/ui_state/schemas.py:8-29), bir anahtar 60 karakterle sınırlıdır (src/cluster_erp/modules/auth/ui_state/routes.py:32-33). - Her cihaz sınıfı kendi ana ekran düzenini kendi anahtarı altında tutar, örneğin
springboard_phone(webapp/js/device-class.js:22-26). - İlk okuma başarısız olduğunda istemci düzeni silmek yerine yerel kopyasını korur (
webapp/js/ui-state.js:29-34). - Tarayıcı testleri gerçek bir hesabın sunucu tarafı durumunu değiştirir; bu yüzden onu geri yükleyen bir bekçiye ihtiyaç duyar.
Kodun uyguladığı yerler¶
| Mekanizma | Neyi denetler | Kaynak |
|---|---|---|
UiStateService |
Her okuma ve yazma tek bir kullanıcı kimliğiyle sınırlıdır | src/cluster_erp/modules/auth/ui_state/services.py:12-44 |
UiStateWrite._bounded |
Saklanan değer JSON'dur ve en fazla 256 KiB'tır | src/cluster_erp/modules/auth/ui_state/schemas.py:13-29 |
guardUiState |
Tarayıcı süitleri test hesabıyla, bilinen bir tahtada çalışır ve özgün durumu geri yükler | web-client/_ui_state_guard.mjs:114-195 |
test_board_touching_suites_use_the_ui_state_guard |
Yerleşime dokunan her süit bekçiyi kullanır | tests/test_e2e_db_isolation.py:177-200 |
İlgili sayfalar¶
92f8051 numaralı commit ile 2026-11-13 tarihinde doğrulandı.