Web uygulamasının ekranlarının çoğu metadata'dan gelir, ama bazı uygulamaların özel ekranlara ihtiyacı vardır: panolar, tahtalar, kurucular ve ana ekran bileşenleri. Bu kod genel web uygulamasıyla birlikte gelmez. Böyle her uygulamanın depo kökünde gated_apps/<app>/app.js içinde bir JavaScript paketi vardır ve yalnız şirketi uygulamayı çalıştırabilen bir kullanıcıya sunulur. Bu sayfa bir paketin nasıl bildirildiğini, getirildiğini, yüklendiğini ve platform işlevlerine nasıl erişim aldığını açıklar. Lisans ve haklar uygulama mağazası, lisans ve haklar sayfasında anlatılır.
Kısaca¶
- 9 paket vardır:
analytics,bom,calendars,intranet,inventory,nesting,procurement,productionveprojects(ls gated_apps/*/app.jsile sayıldı). Manifestolarıgated_entry: truetaşır (src/cluster_erp/modules/app_store/catalog.json). - Paketler
/appstatik bağlamasının dışında yaşar veGET /api/v1/app_store/assets/{app_key}/{filename}ile sunulur (src/cluster_erp/modules/app_store/routes.py:94-155). - İstemci bir paketi blob olarak getirir, bir nesne URL'sinden içe aktarır ve
widgets(ctx)dışa aktarımını çağırır (webapp/js/custom-widgets.js:134-157). - Bir paketin içe aktarımı yoktur. Kullandığı her platform işlevi
ctxiçinde, 42 farklı üyeliPLATFORM_CTXnesnesiyle gelir (webapp/js/custom-widgets.js:50-121, nesnenin anahtarlarından sayıldı;iconiki kez listelenir).
Nasıl çalışır¶
Bildirim¶
loadAppCatalog() kaydı okur ve gated_entry taşıyan her uygulamanın her modülünü setGatedApps ile o uygulamanın anahtarına eşler (webapp/js/home.js:452-457, webapp/js/custom-widgets.js:44-48). Özel bileşen kaydı boş başlar; her özel bileşen bir paketten gelir (webapp/js/custom-widgets.js:40-42).
| Paket | Satır | Manifesto |
|---|---|---|
gated_apps/analytics/app.js |
4.253 | src/cluster_erp/modules/app_store/catalog.json:705-757 |
gated_apps/bom/app.js |
3.774 | src/cluster_erp/modules/app_store/catalog.json:808-854 |
gated_apps/calendars/app.js |
1.020 | src/cluster_erp/modules/app_store/catalog.json:609-622 |
gated_apps/intranet/app.js |
1.409 | src/cluster_erp/modules/app_store/catalog.json:1195-1241 |
gated_apps/inventory/app.js |
172 | src/cluster_erp/modules/app_store/catalog.json:462-508 |
gated_apps/nesting/app.js |
280 | src/cluster_erp/modules/app_store/catalog.json:657-670 |
gated_apps/procurement/app.js |
1.657 | src/cluster_erp/modules/app_store/catalog.json:953-999 |
gated_apps/production/app.js |
1.282 | src/cluster_erp/modules/app_store/catalog.json:560-606 |
gated_apps/projects/app.js |
1.037 | src/cluster_erp/modules/app_store/catalog.json:317-363 |
Satır sayıları wc -l ile yapıldı. fleet uygulaması gated_entry: false bildirir ve paketi yoktur (src/cluster_erp/modules/app_store/catalog.json:511-557).
Yükleme¶
Sıra diyagramı bir paketin ilk kullanımını gösterir.
sequenceDiagram participant V as module-app.js veya gen-detail.js participant R as custom-widgets.js participant S as app_store rotaları V->>R: ensureModuleWidgets(module) R->>S: GET /app_store/assets/key/app.js S-->>R: paket veya 403 R->>R: Blob, createObjectURL, import R->>R: mod.widgets(PLATFORM_CTX) R->>R: REGISTRY[module.key] = üretici V->>R: getCustomWidget(module, key) R-->>V: çizim işlevi
Sözle:
- Bir modül uygulaması, özel bir ayrıntı sekmesi veya bir modül ana ekran bileşeni sekmelerini kurmadan veya boyamadan önce
ensureModuleWidgets(moduleName)çağırır (webapp/js/module-app.js:79-81,webapp/js/gen-detail.js:372-379,webapp/js/home.js:255-258). - Modül kapılı bir uygulamaya aitse istemci
/app_store/assets/<app_key>/app.jsdosyasını oturum çereziyle blob olarak getirir (webapp/js/custom-widgets.js:134-141). - Metin bir JavaScript blobuna sarılır, bir nesne URL'sinden içe aktarılır ve URL ardından iptal edilir (
webapp/js/custom-widgets.js:142-152). - Paketin varsayılan dışa aktarımı, bileşen adından üreticiye bir eşleme döndüren
widgets(ctx)sağlar. Her üretici<module>.<name>altında saklanır (webapp/js/custom-widgets.js:145-149,gated_apps/inventory/app.js:1-6). getCustomWidget(module, key)üreticiyi modül adıyla çağırır ve çizim işlevini döndürür (webapp/js/custom-widgets.js:159-162).
Her paket oturum başına bir kez yüklenir; eşzamanlı çağıranlar tek bir yüklemeyi paylaşır (webapp/js/custom-widgets.js:123, webapp/js/custom-widgets.js:137-156). Çıkış yüklenenler kümesini temizler; böylece sonraki giriş yeni dağıtılan kodu getirir (webapp/js/custom-widgets.js:125-132).
Sunucu rotası¶
Varlık rotası oturum açmış bir kullanıcı ister. Dosyayı yalnız uygulama kuruluysa, şirket için lisanslıysa veya sistem uygulaması olarak işaretliyse ve kullanıcının rollerinden birine atanmışsa sunar; aksi hâlde entitlement.asset_denied koduyla 403 yanıt verir (src/cluster_erp/modules/app_store/routes.py:103-130). Yalnız gated_apps klasörü içindeki düz dosya adlarını sunar ve diğer her şey için 404 yanıt verir (src/cluster_erp/modules/app_store/routes.py:131-144). Yanıtlar Cache-Control: no-cache ve bir ETag taşır; böylece hak denetimi her istekte çalışır ve değişmemiş bir paket bir 304'e mal olur (src/cluster_erp/modules/app_store/routes.py:145-155).
İçerik güvenlik ilkesi bu içe aktarım için blob: kaynaklı betiklere izin verir (92f8051 commit'inde src/cluster_erp/server/app.py:1325-1338).
Platform bağlamı¶
PLATFORM_CTX bir paketin kullanabileceği yüzeyin tamamıdır. Yorum, onun bilinçli olarak genişletildiğini ve sözleşmenin belgesi işlevi de gördüğünü belirtir (webapp/js/custom-widgets.js:50-51).
| Alan | Üyeler |
|---|---|
| API ve veri | apiFetch, apiFetchBlob, apiUpload, apiErrorText, GenApi, fkItems, fkPreload, fkInvalidate, resolveMissingLabels |
| Metadata | metaEntity, resolveLabel, providerOf, hasPermission |
| Genel motorlar | makeGenDetail, makeGenList, makeGenSettings, openActionSheet |
| Gezinme | pushView, popView |
| Veri sinyali | emitDataChanged, watchData, dataSeq, canPaint |
| Dil ve biçim | getLang, t, formatDate, formatDateTime, formatDateTimeShort, getTimezone, COMMON_TIMEZONES |
| Arayüz yardımcıları | esc, safeUrl, showToast, confirmAlert, bindLongPress, createTouchGate, selectInput, icon, a11y, getTheme |
| Bileşen kapsamı | resolveScope, scopeSegmentHtml, wireScope, noEmployeeHtml |
Kaynak: webapp/js/custom-widgets.js:52-121.
Neden böyle kurulu¶
src/cluster_erp/modules/app_store/routes.py:94-98içindeki yorum, lisanssız veya koltuksuz bir kiracının tarayıcısının modülün kodundan tek bir bayt bile almadığını belirtir: kayıt uygulamayı listelemez ve rota onu reddeder.webapp/js/custom-widgets.js:7-13içindeki yorum, blob içe aktarımlarının göreli yolları çözemediğini, bu yüzden her bağımlılığınctxüzerinden geldiğini belirtir.webapp/js/custom-widgets.js:125-129içindeki yorum, paketleri yeniden girişler boyunca tutmanın bir dağıtımdan sonra kullanıcıları eski kodda bıraktığını belirtir.
Kurallar ve sınırlar¶
- Metadata'da bildirilen bir ana ekran bileşeni modülünün paketinde kayıtlı olmalıdır.
tests/test_metadata_driven_rules.py:158bunu herHomeWidgetMetaiçin denetler. - Eksik bir bileşen hiçbir zaman bozuk bir sekme olarak gösterilmez: modül uygulaması bölümü atlar, bir ayrıntı sekmesi
common.no_resultsgösterir ve lisanssız bir sahiperror.entitlement.module_not_installedgösterir (webapp/js/module-app.js:126-137,webapp/js/gen-detail.js:375-391,webapp/js/home.js:259-276). - Paketler kabukla aynı veri değişti sinyalini ve dokunma kapısını izler; bkz. veri tazeleme ve değişiklik sinyalleri ve ana ekran, dock ve başlatıcı.
Diğer parçalarla etkileşim¶
- Uygulama kataloğu ve kurulu, lisanslı ve koltuk atanmış katmanları uygulama mağazası modülü sayfasındadır.
- Modül uygulamalarının içindeki özel bölümler modül uygulamaları ve uygulama kapsamı sayfasında anlatılır.
Sınırlar ve açık noktalar¶
- Bir paketin getirilmesi veya içe aktarılması başarısız olursa reddedilen söz yüklenenler kümesinde kalır; bu yüzden aynı oturumdaki sonraki çağrılar çıkışa kadar hemen başarısız olur (
webapp/js/custom-widgets.js:137-156). - Başlık yorumu ile getirme uyumludur: giriş dosyası, yetkilendirme denetimli varlık rotası üzerinden oturum çerezi ile
apiFetchBlobtarafından getirilir (webapp/js/custom-widgets.js:7-11,webapp/js/api.js:151-152).
Tanıtılan terimler¶
| Terim | Kod tanımlayıcısı | Tanım | Türkçe terim | Kaynak |
|---|---|---|---|---|
| gated bundle | gated_apps/<app>/app.js |
Lisanslı bir uygulamanın yalnız hakkı olan kullanıcılara sunulan özel kodu. | kapılı paket | src/cluster_erp/modules/app_store/routes.py:100 |
| platform context | PLATFORM_CTX |
Her kapılı pakete verilen platform işlevleri nesnesi. | platform bağlamı | webapp/js/custom-widgets.js:52 |
| custom widget | getCustomWidget |
Bir paketin <module>.<name> altında kaydettiği çizim işlevi. |
özel bileşen | webapp/js/custom-widgets.js:159 |
İlgili sayfalar¶
- Web uygulaması platformu
- Uygulama mağazası, lisans ve haklar
- Modül uygulamaları ve uygulama kapsamı
- Ana ekran bileşenleri
- Uygulama mağazası modülü
92f8051 numaralı commit ile 2026-11-13 tarihinde doğrulandı.