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

Açıklama

Kapılı uygulama paketleri

Lisanslı uygulamaların özel ekranlarının gated_apps paketleri olarak nasıl geldiği, tarayıcıya nasıl ulaştığı ve bileşen kaydettiği.

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, production ve projects (ls gated_apps/*/app.js ile sayıldı). Manifestoları gated_entry: true taşır (src/cluster_erp/modules/app_store/catalog.json).
  • Paketler /app statik bağlamasının dışında yaşar ve GET /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 ctx içinde, 42 farklı üyeli PLATFORM_CTX nesnesiyle gelir (webapp/js/custom-widgets.js:50-121, nesnenin anahtarlarından sayıldı; icon iki 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:

  1. 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).
  2. Modül kapılı bir uygulamaya aitse istemci /app_store/assets/<app_key>/app.js dosyasını oturum çereziyle blob olarak getirir (webapp/js/custom-widgets.js:134-141).
  3. 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).
  4. 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).
  5. 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-98 iç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-13 içindeki yorum, blob içe aktarımlarının göreli yolları çözemediğini, bu yüzden her bağımlılığın ctx üzerinden geldiğini belirtir.
  • webapp/js/custom-widgets.js:125-129 iç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:158 bunu her HomeWidgetMeta iç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_results gösterir ve lisanssız bir sahip error.entitlement.module_not_installed gö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

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 apiFetchBlob tarafı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


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

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