Factorizer/Cluster ERP WikiCluster ERP English
Ana sayfa / Web uygulaması

Açıklama

Kullanıcı arayüz durumu

ui-state.js ve auth ui_state rotaları kullanıcının düzenini sunucuda nasıl tutar ve hangi tercihler tarayıcıda kalır.

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-state oturum 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):

  1. Dock sabitlemeleri, son aramalar, yoğunluk ve dock'taki tuş sunucudan olduğu gibi alınır (webapp/js/home.js:4579-4589).
  2. 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).
  3. İkisi de varsa her biri bir updatedAt damgası 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-9 iç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.mjs kullanması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

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


92f8051 numaralı commit ile 2026-11-13 tarihinde doğrulandı.

Doğrulanan commit 92f8051 · 2026-11-13