Bir kullanıcının web uygulamasındaki düzeni tek bir tarayıcıya değil, kullanıcı hesabına aittir. İstemci modülü webapp/js/ui-state.js, adlandırılmış değerleri auth modülünün iki rotası üzerinden okur ve yazar; sunucu bunları kullanıcı başına auth_user_ui_state tablosunda saklar. Bu sayfa veri modelini, rotaları, yazma birleştirmesini, ana ekran düzeni için çakışma kuralını ve hangi tercihlerin sunucuda saklanmadığını açıklar.
Kısaca¶
- Bir satır bir kullanıcı için bir anahtar ve bir JSON değeri tutar; anahtar o kullanıcının canlı satırları arasında benzersizdir (
src/cluster_erp/modules/auth/ui_state/models.py:13-35). GET /api/v1/auth/ui-stateoturum açmış kullanıcının her anahtarını döndürür;PUT /api/v1/auth/ui-state/{key}bir değer saklar (src/cluster_erp/modules/auth/ui_state/routes.py:21-39).- İki rota da kullanıcı kimliğini istekten değil oturumdan alır ve yalnız kimlik doğrulama ister (
src/cluster_erp/modules/auth/ui_state/routes.py:15-18). - Saklanan bir değer JSON olarak en çok 262.144 bayt olabilir (
src/cluster_erp/modules/auth/ui_state/schemas.py:8-29). - İstemci yazmaları 600 ms boyunca toplar ve sayfa gizlendiğinde veya kapandığında bekleyen yazmaları gönderir (
webapp/js/ui-state.js:41-73).
Nasıl çalışır¶
Sunucu tarafı¶
| Parça | İçerik | Kaynak |
|---|---|---|
UserUiState modeli |
auth_user_ui_state tablosu; user_id (auth_users.id için yabancı anahtar), key (en çok 60 karakter), value (JSONB) ve temel sütunlar |
src/cluster_erp/modules/auth/ui_state/models.py:13-35 |
| Benzersiz dizin | deleted_at IS NULL olan satırlarda user_id ve key üzerinde uq_auth_user_ui_state_user_id_key_live |
src/cluster_erp/modules/auth/ui_state/models.py:24-29 |
UiStateWrite şeması |
Herhangi bir JSON biçiminde value; serileştirilemezse veya _MAX_UI_STATE_BYTES değerinden büyükse reddedilir |
src/cluster_erp/modules/auth/ui_state/schemas.py:10-29 |
UiStateService.all_for servisi |
Bir kullanıcının canlı satırları için {key: value} döndürür |
src/cluster_erp/modules/auth/ui_state/services.py:19-28 |
UiStateService.put servisi |
Bir satır ekler veya canlı satırın değerini günceller | src/cluster_erp/modules/auth/ui_state/services.py:30-44 |
| Rota kaydı | /api/v1/auth altında auth modülü yönlendiricisine katılır |
src/cluster_erp/modules/auth/module.py:55, src/cluster_erp/modules/auth/module.py:68, src/cluster_erp/core/module_base.py:37-38 |
Temel sütunlar ve yumuşak silme ortak temel modelden gelir; bkz. temel model ve kimlikler. Bir değerin güncellenmesi, eşlenmiş diğer her varlık gibi otomatik değişiklik geçmişine kaydedilir; bkz. değişiklik geçmişi.
İstemci tarafı¶
loadUiState() tüm anahtarları oturum başına bir kez okur ve erken çağıranlar arasında tek bir isteği paylaştırır. Başarısız bir okuma null döndürür ve yerel kopyayı kullanımda bırakır (webapp/js/ui-state.js:18-39). saveUiState(key, value) bellekteki kopyayı günceller, değeri kuyruğa alır ve 600 ms'lik bir zamanlayıcıyı yeniden başlatır; gönderim anahtar başına bir PUT ile ve bir yazma sayfa yenilemesinden sağ çıksın diye keepalive ile yapılır (webapp/js/ui-state.js:41-73). Gizliye geçen visibilitychange ve pagehide kuyruğu hemen gönderir (webapp/js/ui-state.js:58-65). Çıkış önbelleği ve kuyruğu düşürür (webapp/js/ui-state.js:75-85).
Web uygulamasının yazdığı anahtarlar¶
| Anahtar | İçerik | Yazan | Kaynak |
|---|---|---|---|
springboard |
PC ana ekran düzeni {pages, updatedAt} |
save |
webapp/js/home.js:609-616, webapp/js/device-class.js:23 |
springboard_tablet |
Tablet ana ekran düzeni | save |
webapp/js/device-class.js:24 |
springboard_phone |
Telefon ana ekran düzeni | save |
webapp/js/device-class.js:25 |
dock_pins |
Sabitlenmiş uygulama kimliklerinin sıralı listesi | setDockPins |
webapp/js/home.js:1004-1008 |
dock_switcher |
Yüzen tuşun dock'ta yaşayıp yaşamadığı | setSwitcherDocked |
webapp/js/home.js:1033-1038 |
launcher |
Dock kenarı ve otomatik gizleme bayrağı | applyAutohide, setEdge |
webapp/js/app-wheel.js:158-161, webapp/js/app-wheel.js:563-567 |
density |
Satır yoğunluğu kademesi | setDensity |
webapp/js/prefs.js:90-99 |
spot_recent |
Son en çok 8 arama seçimi | rememberRecent |
webapp/js/home.js:1135-1157 |
Benim veya Tümü kapsamı gibi bileşen ayarları düzen değerinin içinde, bileşen öğesinin cfg alanında saklanır (webapp/js/widget-scope.js:4-8).
Ana ekran düzeni çakışma kuralı¶
Ana ekran düzeni yerel depoda önbelleğe alınır ve sunucuda saklanır. Hangi kopyanın kazanacağına hydrateFromServer() karar verir (webapp/js/home.js:4565-4631):
- Dock sabitlemeleri, son aramalar, yoğunluk ve dock'taki tuş sunucudan olduğu gibi alınır (
webapp/js/home.js:4579-4589). - Sunucuda bu cihaz sınıfı için düzen yoksa, ilk kez görülen bir sınıf PC düzeninden başlar; aksi hâlde yerel kopya sunucuya yayımlanır (
webapp/js/home.js:4590-4615). - İkisi de varsa her biri bir
updatedAtdamgası taşır. Sunucu kopyası yerel kopyanın yerini yalnız kesinlikle daha yeniyse alır; daha yeni bir yerel kopya sunucuya gönderilir (webapp/js/home.js:4616-4631).
Başarısız bir istek hiçbir şeyi değiştirmez; yerel düzen sunucuya ulaşılamadı diye hiçbir zaman atılmaz (webapp/js/home.js:4565-4570).
Yalnız tarayıcıda tutulan tercihler¶
| Tercih | Depolama | Anahtar | Kaynak |
|---|---|---|---|
| Tema | yerel depo | cluster_theme |
webapp/js/prefs.js:5, webapp/js/prefs.js:61-65 |
| Saat dilimi | yerel depo | cluster_tz |
webapp/js/prefs.js:6, webapp/js/prefs.js:111-114 |
| Dil | yerel depo | cluster_lang |
webapp/js/i18n.js:9, webapp/js/i18n.js:80 |
| Erişilebilirlik ayarları | yerel depo | cluster_a11y |
webapp/js/a11y.js:5, webapp/js/a11y.js:44-46 |
| Yüzen tuş konumu | yerel depo | cluster_float_btn |
webapp/js/home.js:2936, webapp/js/home.js:2976-2979 |
| Yenilemeden sonra açık uygulamalar | oturum deposu | cluster.session.open_apps |
webapp/js/app-session.js:17 |
| Kaydedilmemiş form taslakları | bellek ve oturum deposu | cluster.session.form_drafts |
webapp/js/form-drafts.js:18 |
Neden böyle kurulu¶
webapp/js/ui-state.js:1-9içindeki yorum, yalnız yerel depoda tutulan bir düzenin tarayıcıya, cihaza ve ana makine adına göre farklılaştığını ve temizlenen bir önbelleğin sıfırlanma gibi göründüğünü belirtir.- Model belge dizesi, bir satırı yalnız sahibi olan kullanıcının veya onun adına hareket eden bir yöneticinin değiştirebileceğini belirtir (
src/cluster_erp/modules/auth/ui_state/models.py:14-21). - Şema yorumu, boyut tavanının bir kullanıcının kullanıcı başına ayrılan alanda keyfi miktarda veri saklamasını durdurduğunu belirtir (
src/cluster_erp/modules/auth/ui_state/schemas.py:8-9).
Kurallar ve sınırlar¶
- Projenin yazılı mühendislik kuralları tarayıcı test süitlerinin
web-client/_ui_state_guard.mjskullanmasını ister. Koruma, bir süitin gerçek bir kişinin düzenini hiç değiştirmemesi için süitleri ayrılmış bir test hesabıyla çalıştırır (web-client/_ui_state_guard.mjs:1-4). Bkz. e2e bataryası. - Tarayıcı testleri:
web-client/_e2e_dock_pins.mjs,web-client/_e2e_app_wheel.mjs,web-client/_e2e_density.mjs,web-client/_e2e_mobile_home.mjs,web-client/_e2e_command_palette.mjs.
Diğer parçalarla etkileşim¶
- Karar kaydı sunucu tarafı arayüz durumu sayfasıdır.
- İki rotanın kimlik doğrulaması kimlik doğrulama ve oturumlar sayfasında anlatılır.
Sınırlar ve açık noktalar¶
- Anahtarlar istemcinin seçtiği 1 ile 60 karakter arası serbest dizelerdir; daha uzun bir anahtar işleyici çalışmadan HTTP 422 ile reddedilir (
src/cluster_erp/modules/auth/ui_state/models.py:34,src/cluster_erp/modules/auth/ui_state/routes.py:33). - Hiçbir rota bir anahtarı silmez. Koddan belirlenemedi: kullanımdan kalkan özelliklerin anahtarlarının hiç kaldırılıp kaldırılmadığı.
Tanıtılan terimler¶
| Terim | Kod tanımlayıcısı | Tanım | Türkçe terim | Kaynak |
|---|---|---|---|---|
| UI state | UserUiState |
Bir kullanıcının arayüz düzeninin bir parçasını sunucuda saklayan adlandırılmış JSON değeri. | kullanıcı arayüz durumu | src/cluster_erp/modules/auth/ui_state/models.py:13 |
| layout stamp | updatedAt |
Ana ekran düzeninin sunucu mu tarayıcı kopyasının mı kazanacağına karar veren zaman damgası. | düzen damgası | webapp/js/home.js:612 |
İlgili sayfalar¶
- Web uygulaması platformu
- Ana ekran, dock ve başlatıcı
- Cihaz sınıfları
- Auth modülü
- Sunucu tarafı arayüz durumu
92f8051 numaralı commit ile 2026-11-13 tarihinde doğrulandı.