@appaflytech/zeyrek-ai-mcp 0.0.40 → 0.0.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/knowledge/componentCatalog.js +95 -104
- package/dist/knowledge/componentEvents.js +34 -18
- package/dist/knowledge/mobileComponentCatalog.js +119 -20
- package/dist/knowledge/mobileComponentEvents.js +41 -0
- package/dist/knowledge/motionResolve.js +252 -0
- package/dist/knowledge/normalize.js +117 -71
- package/dist/knowledge/pageDiscover.js +2 -2
- package/dist/knowledge/platform/batchOps.js +70 -0
- package/dist/knowledge/platform/heroTag.js +153 -0
- package/dist/knowledge/platform/lint.js +128 -6
- package/dist/knowledge/platform/mobile.js +1 -1
- package/dist/knowledge/platform/mobileLayoutLint.js +8 -1
- package/dist/knowledge/platform/mobileRules.js +18 -0
- package/dist/knowledge/platform/pageTransition.js +57 -0
- package/dist/knowledge/platform/web.js +1 -1
- package/dist/knowledge/rules.js +217 -24
- package/dist/knowledge/styleResolve.js +0 -1
- package/dist/knowledge/styleResolveNative.js +88 -4
- package/dist/platform/capture/actions.js +27 -1
- package/dist/platform/capture/capture.js +10 -13
- package/dist/platform/capture/persistent-browser.js +130 -0
- package/dist/platform/capture/summary.js +4 -1
- package/dist/resources/examples/flow-list-to-form.json +8 -10
- package/dist/resources/examples/flow-load-table.json +1 -1
- package/dist/resources/examples/mobile-app-shell-drawer.json +1 -0
- package/dist/resources/examples/mobile-list-detail-form.json +7 -3
- package/dist/resources/examples/mobile-scan-code.json +285 -0
- package/dist/resources/guides/component.md +3 -3
- package/dist/resources/guides/entity.md +16 -0
- package/dist/resources/guides/expressions.md +8 -7
- package/dist/resources/guides/merge.md +98 -18
- package/dist/resources/guides/microservice.md +3 -3
- package/dist/resources/guides/middleware.md +2 -0
- package/dist/resources/guides/mobile-layout.md +2 -1
- package/dist/resources/guides/mobile-publish.md +1 -0
- package/dist/resources/guides/mobile-steps.md +67 -0
- package/dist/resources/guides/mobile.md +51 -70
- package/dist/resources/guides/page.md +229 -137
- package/dist/resources/guides/translation.md +67 -1
- package/dist/resources/guides/workflow.md +31 -1
- package/dist/resources/schema-fingerprint.json +2 -2
- package/dist/resources/schemas/ResolveMergeConflictsCommand.json +30 -1
- package/dist/tools/activities.js +3 -1
- package/dist/tools/applications.js +16 -2
- package/dist/tools/components.js +12 -6
- package/dist/tools/designSchemaPatch.js +18 -13
- package/dist/tools/entities.js +41 -4
- package/dist/tools/layouts.js +29 -9
- package/dist/tools/merges.js +29 -9
- package/dist/tools/mobile.js +15 -1
- package/dist/tools/pages.js +156 -168
- package/dist/tools/platformInfo.js +3 -2
- package/dist/tools/profileWrite.js +2 -2
- package/dist/tools/queries.js +1 -1
- package/dist/tools/rows.js +14 -3
- package/dist/tools/schemaOps.js +132 -34
- package/dist/tools/screenWrite.js +3 -3
- package/dist/tools/screens.js +42 -3
- package/dist/tools/translations.js +148 -6
- package/package.json +2 -2
|
@@ -9,30 +9,7 @@
|
|
|
9
9
|
* lg|pill) YA DA doğrudan CSS uzunluğu ('18px') yazılabilir.
|
|
10
10
|
*/
|
|
11
11
|
/**
|
|
12
|
-
*
|
|
13
|
-
* Katalog tipleri yalnız ADIYLA listeliyordu; 09-05 koşusunda altı avatar yüklenip satırlara
|
|
14
|
-
* bağlandığı hâlde `image` kolonu eklenmedi, çünkü kolonun dosya alanı mı yoksa URL mi beklediği
|
|
15
|
-
* hiçbir yerde yazmıyordu. Kaynak: `packages/ng-apps-ui/src/components/table/components/renderers/*`
|
|
16
|
-
* ve `column-format.functions.ts`.
|
|
17
|
-
*/
|
|
18
|
-
export const TABLE_COLUMN_TYPE_NOTE = "KOLON TİPİ SÖZLÜĞÜ (bekler → çizer). " +
|
|
19
|
-
"text/long-text: metin → düz metin (long-text hücreye sığdırıp kırpar). " +
|
|
20
|
-
"number/time: sayı ya da metin → olduğu gibi. " +
|
|
21
|
-
"money: sayı → para biçimi, ayıraçlar dile göre (tr '₺1.250,00', en '₺1,250.00'); para birimi kolonun currency alanından gelir (ISO 4217: 'USD' → en '$1,250.00', tr '$1.250,00'), boş ya da geçersiz değer TRY'ye düşer. " +
|
|
22
|
-
"pertance: SAYI → yüzde metni; 0..1 arası değer ORAN sayılıp 100'le çarpılır, 1'den büyük değer zaten yüzdedir (tam 1 = %100). Çubuk ÇİZMEZ — çubuk için progress. " +
|
|
23
|
-
"progress: ham sayı → hücrede oransal çubuk (value/max, max varsayılanı 100); progressVariant/progressLabel/progressColor/thresholds ile ayarlanır. " +
|
|
24
|
-
"date/datetime: ISO metni ya da Date → dile göre biçimli tarih (locale prop'undan). " +
|
|
25
|
-
"switch: boolean → yeşil onay / kırmızı çarpı ikonu (metin değil). " +
|
|
26
|
-
"image: entity'nin FILE alanının nesnesi (uçtan geldiği gibi) YA DA mutlak URL metni → satır yüksekliğine sığdırılmış görsel (object-fit contain, köşe yuvarlatma). Kolon url'yi kendisi çözer: metin olduğu gibi kullanılır, nesnede `type:'file'` ise `data`/`value`, değilse `absolute_path` okunur — table-source bir uç FILE alanını `{ id, absolute_path, value, type:'ref', … }` olarak döndürür ve mapping'de alanı OLDUĞU GİBİ taşımak yeter (ölçüldü 2026-09-05: altı avatar `image` kolonunda çizildi). Yüklenemezse hücrede hata metni çıkar; datatable'ın image kolonu daha katıdır (düz URL kabul etmez). " +
|
|
27
|
-
"file: dosya alanı ya da url metni → dosya adı + ikon, yeni sekmede açılan bağlantı. " +
|
|
28
|
-
"url: metin → tıklanabilir bağlantı (ikonlu, http ise yeni sekme). link: metin → tıklanmayan düz bağlantı görünümü. " +
|
|
29
|
-
"email: metin → düz metin. " +
|
|
30
|
-
"dropdown: option value'su → kolonun options listesinden LABEL, appearance renginde rozet. multiselect: value dizisi → DEĞER SIRASIYLA label rozetleri; options'ta karşılığı olmayan değer olduğu gibi yazılır (düşürülmez), tek bir değer tek elemanlı dizi sayılır. " +
|
|
31
|
-
"tag: metin → appearance renginde TEK rozet; renk kolonun appearance prop'undan gelir (satır bazında rows[i]._columns[<indeks>].appearance ile ezilir), serbest hex ALMAZ. " +
|
|
32
|
-
"tags: [{ value, color }] dizisi ya da metin dizisi → çok rozet, renk SATIR VERİSİNDEN (serbest hex burada geçer), sığmayanlar +N ile toplanır. " +
|
|
33
|
-
"action: veri kolonu DEĞİL — aksiyon sütunu ayrı çizilir; kolon tanımında seçilirse ham değer metin olarak görünür.";
|
|
34
|
-
/**
|
|
35
|
-
* KORUMALI DEĞER (f-31, kompleks proje) — table · datatable · detailview · text ortak davranışı.
|
|
12
|
+
* KORUMALI DEĞER (f-31, kompleks proje) — datatable · detailview · text ortak davranışı.
|
|
36
13
|
* Kaynak: `packages/ng-apps-ui/src/shared/protected-value.functions.ts`,
|
|
37
14
|
* `shared/components/protected-value/ProtectedValue.svelte`, `packages/ng-apps-flow/src/access/`.
|
|
38
15
|
*/
|
|
@@ -41,7 +18,7 @@ export const PROTECTED_VALUE_NOTE = "KORUMALI DEĞER (kompleks proje, f-31): tab
|
|
|
41
18
|
"Tasarımcı kanvasında 'View as user' ile seçilen kullanıcının özeti de yüklenir: 'Göster' o kullanıcıya sunulacağı yerde ETKİSİZ çizilir (tıklama bileşeni seçer, diyalog açılmaz; gerçek açma önizlemede); kullanıcı seçili değilken tasarımcının project.data.reveal izni karar verir. " +
|
|
42
19
|
"'Göster' kuralı moda göre: 'off' (basit proje HEP 'off') ya da özet yüklenemediyse ÇIKMAZ (backend her reveal'i 403 AccessRevealDeniedException ile reddeder); 'shadow'da ÇIKAR (özet her şeyi açık döner, backend reveal'i yine denetler — yetkisiz kullanıcı ret mesajını görür); 'enforce'ta yalnız entity'nin actions'ında reveal varsa. Page.can('reveal', …) bu kuralın yerini tutmaz: 'enforce' dışında hep true'dur. " +
|
|
43
20
|
"Açılan değer prop'a, akışa, olaya, yerel depoya ya da URL'e YAZILMAZ; olay yayılmaz, akış bağlanamaz. 403/404/422/429 mesajları bileşenin dil sözlüğündendir. 'plain' alan düz değerdir, normal çizilir. " +
|
|
44
|
-
"Maskeli değeri forma isMasked'sız BAĞLAMA: güncelleme formunda textinput'un value'su kaydın alanına, isMasked'ı satır metasına birlikte bağlanır (textinput.propNotes.isMasked). Gizleme arayüzdür; yetki backend'de denetlenir. Izgaralarda (bağlı datatable, Studio satır listesi) maskeli hücre politika yazma izni veriyorsa KÖR ÜZERİNE YAZILIR (ADR 0007): editör boş açılır, yalnız yazılan değer gider
|
|
21
|
+
"Maskeli değeri forma isMasked'sız BAĞLAMA: güncelleme formunda textinput'un value'su kaydın alanına, isMasked'ı satır metasına birlikte bağlanır (textinput.propNotes.isMasked). Gizleme arayüzdür; yetki backend'de denetlenir. Izgaralarda (bağlı datatable, Studio satır listesi) maskeli hücre politika yazma izni veriyorsa KÖR ÜZERİNE YAZILIR (ADR 0007): editör boş açılır, yalnız yazılan değer gider.";
|
|
45
22
|
export const REVEAL_ENTITY_NOTE = "Maskeli değerin açılacağı entity: slug ('musteriler') ya da id. BOŞSA runtime erişim özetinden bulunur — satırın korumalı alanlarını okunur alan olarak taşıyan TEK entity. İki entity aynı alan adını taşıyorsa ya da mod 'shadow' iken (özet alan listesi boş) bulunamaz ve 'Göster' ÇIKMAZ; o durumda doldur. Korumasız veride etkisizdir.";
|
|
46
23
|
export const STYLE_GROUP_NOTES = {
|
|
47
24
|
surfaceStyle: "{ background, radius, borderTop, borderRight, borderBottom, borderLeft, shadow, contentOverflow(visible|hidden|auto), opacity(0–100 yüzde; 100/boş yazılmaz), rotate(derece, −360…360), scale(YÜZDE 10–500; 100 aynı boy ve varsayılan — 1.1 değil 110), translateX/translateY(px, −1000…1000) }. radius: tema kademesi ('var(--ng-radius-md)'; sm/lg 'Border radius'un oranı, md temanın kendisi), tek uzunluk ('18px') YA DA dört köşe ('90px 14px 14px 14px' — sol-üst, sağ-üst, sağ-alt, sol-alt). KENARLIK YÖN BAŞINADIR: her yön kendi CSS kısayolunu taşır ('1px solid var(--ng-border-primary)'), 'none' o kenarı kapatır; eski borderWidth/borderStyle/borderColor üçlüsü EMEKLİ (yalnız hiçbir yön yazılmamışsa okunur). shadow: çok katmanlı `box-shadow` metni ('0px 2px 5px 0px rgba(0,0,0,.2), inset 8px 5px 7px 0px #000'), tema token'ı ('var(--ng-shadow-md)') ya da eski preset anahtarı (none|sm|md|lg). DÖNDÜR/ÖLÇEKLE/KAYDIR (ADR 0005): dört alan TEK transform'a derlenir — sıra kaydır → döndür → ölçekle, köken merkez, düğüm çocuklarıyla döner; nötr değer (0°, 100, 0 px) hiçbir şey yazmaz. Değer BİRİMSİZ sayıdır ('15deg', '20px', '110%' yazılmaz) ve aralık dışı yazılmaz — mobilde ikisi de nativeStyle.warnings'e düşer. Transform'lu düğümün İÇİNDEKİ portal açmayan açılır menü/liste düğümün kutusuna hapsolur. hoverStyle.lift düğümün transform'unu ezmez, önüne eklenir. Katmanlar (modal, drawer, popover) ve uygulama kabukları (layout, layout-region, layout-shell, auth-layout, qm-content, qm-sidebar) bu dört alanı TAŞIMAZ: transform'lu ata position:fixed katmanı ekrandan koparır. Döndürmeyi serbest style.transform'a yazma — mobil yalnız tipli alanı çizer (MOB-002).",
|
|
@@ -72,6 +49,7 @@ export const componentKnowledge = {
|
|
|
72
49
|
behavior: [
|
|
73
50
|
'KAPSAYICI DEĞİL: children kabul etmez, şema doğrulayıcı çocuk yazılan html düğümünde not-droppable hatası verir. Serbest komponent yerleştirmek için container ya da box kullan; html yalnız kendi markup’ını çizer.',
|
|
74
51
|
"content `{{` içeriyorsa Mustache şablonu olarak context prop'uyla render edilir; şablon hatasında ham içerik basılır (sayfa ölmez).",
|
|
52
|
+
"ÇEVİRİ: content'te {{#t}}anahtar{{/t}} sayfanın sözlüğünden etkin dildeki metni basar (etkin dil → varsayılan dil → anahtar), HTML kaçışlı; dil değişince yeniden çizilir. Bölümün içi önce çizilir: {{#t}}common.status.{{durum}}{{/t}} anahtarı context'ten kurar. context'i akış yeniden yazsa da şablon metni etkilenmez. Lambda yalnız {{#t}} geçen şablona eklenir (eski şablonlar aynen çizilir); context kendi t alanını taşıyorsa o kazanır, {{#t}} kullanan şablonda t ayrılmış addır; markup taşıyan cümle context + {{{…}}} ile. 2026-10-14 frontend'i (ADR 0021); uzak kurulumda dağıtımdan sonra.",
|
|
75
53
|
"Flow'dan HTML'e veri DÖNER: setter adımı context prop'una yazınca içerik otomatik yeniden render olur — dinamik gösterimin doğru yolu budur.",
|
|
76
54
|
"HTML içinden flow tetikleme: actions dizisine { key, text, flow } satırı ekle, HTML'de fireEvent('<key>', {...}) çağır. Flow'da event.name = key, event.data = ikinci argüman.",
|
|
77
55
|
"Satır içi <script> etiketleri çalışır ve içerik her değiştiğinde yeniden çalışır; script gövdesinde komponent-bağlı fireEvent / onCleanup(fn) / loadScript(url) yerelleri hazırdır.",
|
|
@@ -96,47 +74,15 @@ export const componentKnowledge = {
|
|
|
96
74
|
isLoading: 'Yükleme iskeleti anahtarı. Geri YAZILMAZ (komponentin change olayı yok), yalnız akış sürer: fetch öncesi setter ile aç, veriyi context’e yazan setter’dan sonra kapat.'
|
|
97
75
|
}
|
|
98
76
|
},
|
|
99
|
-
table: {
|
|
100
|
-
summary: 'LEGACY (2026-09-18): paletten kaldırıldı, yeni ekranlarda datatable kullan; mevcut sayfalardaki table çizilmeye devam eder. Etkileşimli veri ızgarası: satır seçimi, çift tık, hücre içi düzenleme, kolon filtreleme/sıralama, araç çubuğunda arama — her etkileşim AYRI olay olarak akışa bağlanır.',
|
|
101
|
-
behavior: [
|
|
102
|
-
'Süzme/sıralama/arama/sayfalama sunucu taraflıdır: filters/sortField/searchText/offset akışla uca gider, dönen satırlar rows prop’una setter ile yazılır.',
|
|
103
|
-
'AKIŞ BAĞLANMAZSA KONTROL ÇİZİLİR AMA SATIR DEĞİŞMEZ: showSort başlığa ok, filterMode filtre satırı/paneli, isSearchable arama kutusu koyar; tablo rows’u KENDİSİ sıralamaz, süzmez, aramaz, sayfalamaz. İlgili olay (sort · filter · search · pagination) mount akışıyla aynı sorguya bağlanmadıysa ok döner, kutu dolar, satırlar yerinde kalır. Üçünün de yazdığı offset 0’a döner.',
|
|
104
|
-
'SATIR TIKLAMASI HER KİPTE self.selectedRow’a yazar ve select’i çalıştırır — rowSelection:none dahil; rowSelection yalnız VURGUYU ve onay kutularını belirler (none: vurgu yok · single: tıklanan satır boyanır · multi: kutu kolonu). self.selectedRows YALNIZ multi kutularıyla değişir ve selectionChange’i çalıştırır; başlık kutusu yalnız o sayfanın satırlarını seçer/bırakır. Seçimin yeniden sorgudan sonra da tutması için bir kolon isKey olmalı (tipik: gizli id kolonu) — yoksa nesne kimliğiyle eşleşir ve yeni gelen satır nesneleri seçili görünmez.',
|
|
105
|
-
'isReadonly:true HÜCRE DÜZENLEMEYİ KAPATIR (isEditable:true’yu ezer; çift tık ve Enter editör açmaz), satır tıklamasının select/doubleClick’ini, multi onay kutularını (kilitli çizilir) ve aksiyon kolonunu (hiç çizilmez) kapatır. Filtre, sıralama, arama ve sayfalama salt okunur tabloda da çalışır.',
|
|
106
|
-
'Satır aksiyonu (actions[i].flow) tıklanınca ÖNCE self.selectedRow o satıra yazılır, SONRA aksiyonun kendi akışı çalışır — olay adı yoktur, akış aksiyon kaydının flow alanındadır. emptyActions satırsız çalışır ve selectedRow YAZMAZ. actionType:"dropdown" aksiyonları ⋯ menüsüne toplar.',
|
|
107
|
-
"totalRows yazılmazsa (0/boş) tablo elindeki satırlardan fazlasını bilemez: sayfalayıcı TEK SAYFA kalır ve gösterge o satırları sayar ('12 / 12'); ileri oku pasiftir. limit sayfa boyu listesinde (10·20·30·40·50) yoksa (25, 100) listeye eklenir. rows/filters/selectedRows akıştan null ya da dizi olmayan bir değerle gelirse boş liste sayılır, tablo çökmez (selectedRows'a tek satır nesnesi yazma — dizi yaz).",
|
|
108
|
-
"isPaginated:true + akışta limit/offset parametreleri + pagination olayı üçlüsü birlikte kurulmalı; biri eksikse tablo tek sayfa kalır (platform_guide('page') Kural 1c).",
|
|
109
|
-
"SATIR BAZLI GÖRÜNÜM EZMESİ: bir satır kendi _columns DİZİSİNİ taşıyabilir — rows[i]._columns[<kolonun columns dizisindeki İNDEKSİ>] = { appearance:'error', isBold:true, options:[...] } kolon tanımıyla birleşir (column-view.ts resolveColumn → Table.svelte <TableCell {column}>). İndeks TANIM sırasıdır: buildViewColumns index'i isHidden kolonlar elenmeden ÖNCE atar, görünür sıra değil. Kullanıcı kolon menüsünden kolon gizlese bile indeksler kaymaz (hideColumns buildViewColumns'dan SONRA uygulanır). Ezilebilen alanlar appearance · options · isBold; CSV export'u da ezmeyi uygular. Aynı kalıp _actions[i] ile satır bazlı aksiyon ezmesinde de çalışır (rowActions). ŞEMA PROP'U DEĞİLDİR — component_get prop listesinde görünmez, satır verisinin içinde taşınır.",
|
|
110
|
-
"Koşullu/satır bazlı renk table'da _columns ile kurulur ve style prop'unu KAYBETTİRMEZ — datatable'ın colorMap'i statiktir. Hem CSS hem satıra göre renk isteyen tablo table'dır; renk için datatable'a mecbur değilsin.",
|
|
111
|
-
PROTECTED_VALUE_NOTE + " Tabloda: maskeli hücre DÜZENLENMEZ (çift tık/Enter editör açmaz) ve hover ipucu vermez; satır kimliği `id`, yoksa isKey kolonu."
|
|
112
|
-
],
|
|
113
|
-
propNotes: {
|
|
114
|
-
surfaceStyle: NODE_SURFACE_NOTE,
|
|
115
|
-
rows: 'Satır dizisi; mount/filter/sort/pagination akışlarının setter adımıyla doldurulur.',
|
|
116
|
-
revealEntity: REVEAL_ENTITY_NOTE,
|
|
117
|
-
appearance: "YÜKSEKLİK/GENİŞLİK ELLE HESAPLANMAZ (ölçüldü 2026-09-05, f11-repro). heightType:'auto' tablo içeriği kadar uzar — satır sayısı × satır yüksekliği hesabı gerekmez. heightType:'fixed' gövdeyi KAYDIRIR (grid-container overflow:auto), satır kaybolmaz; kare'de görünmeyen satır kırpılmış değil kaydırılmıştır. KOLONLAR KARTI TAŞIRMAZ: genişlik toplamı kabı aşarsa tablo kendi içinde YATAY kaydırır; kabın scrollWidth'i değişmez. KAYDIRMA ÇUBUKLARI VARSAYILAN GİZLİDİR (kaydırma Shift+tekerlek, trackpad, dokunma ve klavyeyle çalışır) ve sağda gizli kolon olduğunu gösteren tek işaret sabitlenmiş aksiyon kolonunun (actionsPinned) sol çizgisidir — kolonları sağa taşan tabloda kullanıcının görmesi için showScrollbar:true yaz. Toplam kaptan KÜÇÜKSE kolonlar orantılı büyütülüp kap tam doldurulur (stretchColumns) — bu yüzden 'kolonu daraltayım da sığsın' yamalarına gerek yok. Tek gerçek tuzak yerleşim tarafındadır: FLEX ebeveynde blocks[].size yok sayılır, ölçü appearance'tan gelir; IZGARA ebeveynde tersi (gateway PAGE-019 ile uyarır).",
|
|
118
|
-
totalRows: "Toplam kayıt: Number(Steps.<adım>?.headers?.[\"total-count\"] ?? 0) guard'lı ifadesiyle yazılır. Yazılmazsa sayfalayıcı tek sayfa kalır ve gösterge eldeki satırları sayar.",
|
|
119
|
-
rowSelection: "none | single | multi — seçim self.selectedRow / self.selectedRows prop'larından okunur. none 'satır seçilemez' DEMEK DEĞİL: satır tıklaması yine selectedRow'a yazar ve select'i çalıştırır, yalnız vurgu yoktur.",
|
|
120
|
-
isSearchable: "Araç çubuğuna arama kutusu koyar. Kutu yalnız searchText'i yazar ve search olayını { searchText, offset:0 } ile çalıştırır; SÜZMEYİ AKIŞ YAPAR — search olayını mount'la aynı sorguya bağla ve metni akışta self.searchText ile okuyup uca parametre olarak geçir. Metin kırpılmadan gelir.",
|
|
121
|
-
searchText: "Uygulanan arama metni. Kutu yazar, akış okur. Tasarımda doldurulursa kutu O METİNLE açılır — ama tablo kendisi aramadığı için ilk sayfa ancak mount akışı da self.searchText'i sorguya geçiriyorsa aranmış gelir. Akıştan yazılırsa kutu o metni gösterir.",
|
|
122
|
-
size: "Satır YOĞUNLUĞU (panel etiketi 'Row density'): sm sıkı · md ve boş = temanın normal satır yüksekliği · lg ferah. Form bileşenlerinin temadaki varsayılan girdi boyutunu İZLEMEZ. Yalnız satır ve başlık yüksekliğini değiştirir (yazı boyu değişmez); filtre satırı her yoğunlukta aynı kalır.",
|
|
123
|
-
showScrollbar: "Izgaranın kaydırma çubuklarını çizer (ince, tema kenarlık renginde; hangi eksen taşıyorsa o). Varsayılan false: çubuklar gizli ama kaydırma yine çalışır. Kolon genişlikleri toplamı kabı aşan (sağa taşan) ya da heightType:'fixed' ile dikey kayan tablolarda aç — yoksa kullanıcı sağdaki kolonların varlığını fark etmez.",
|
|
124
|
-
isReadonly: "Düzenlemeyi (isEditable'ı ezer), satır tıklamasının select/doubleClick'ini, multi onay kutularını ve aksiyon kolonunu kapatır; filtre/sıralama/arama/sayfalama çalışmaya devam eder.",
|
|
125
|
-
limit: "Sayfa boyu. Sayfalayıcıdaki liste 10·20·30·40·50'dir; başka bir değer (25, 100) listeye eklenir ve seçili görünür. pagination olayı { offset, limit } yazar.",
|
|
126
|
-
columns: TABLE_COLUMN_TYPE_NOTE + " Kolon tanımları; mapping anahtarları kolonların name'iyle birebir eşleşmeli. HİZA: kolonun align alanı left|center|right (boş = left) başlığı ve hücreyi birlikte hizalar — sayı/para kolonlarını sağa yaslamak için; tags kolonu hizalanmaz (rozetler taşma ölçümü için soldan dizilir); progress çubuğu hücreyi doldurur, circle varyantı varsayılan olarak ortalıdır. isBold tag · tags · url · link · switch · image · progress DIŞINDAKİ kolonlarda hücreyi kalın yazar (onlar kendi kalınlığını çizer ya da metin taşımaz). progress ayarları (max, progressVariant, progressLabel, progressColor, customProgressColor, thresholds) YALNIZ type:'progress' kolonunda okunur. RENK: tag kolonu appearance ile 5 token alır (primary · info · success · warning · error) ve satır bazında _columns ezmesiyle değişir; serbest hex gerekiyorsa tags kolonunu kullan ve satır verisine [{ value, color:'#da1e28' }] yaz. Sayı/tarih biçimlendirmesi (prefix/suffix/precision/thousands/dateFormat/imageShape) table'da YOK — o datatable'ın kolon şemasındadır. ORANSAL ÇUBUK: type:'progress' hücrede çubuk çizer ve HAM SAYI bekler (yüzdeyi kendisi hesaplar): value/max. max varsayılanı 100, yani 0..100 arası yüzde alanını doğrudan bağlayabilirsin; sayı 25/40 gibi bir orandan geliyorsa max'ı paydaya ver. Ayarlar: progressVariant(bar|circle) · progressLabel(none|percent|fraction|value) · progressColor(primary|info|success|warning|error|custom) + customProgressColor · thresholds[{from(%), color}] — eşik listesi doluysa çubuğun DOLULUK YÜZDESİNE göre son eşiğin rengi kazanır, yani tek kolon 80'in altında yeşil üstünde kırmızı olur. Sayıya çevrilemeyen değer 0'dır, hücre boş çubuk çizer.",
|
|
127
|
-
style: "İKİ AYRI YAZIM KURALI: style.root emotion css() bloğudur (camelCase çalışır, iç seçici yazılabilir); style.thead|th|tr|td ise satır içi style attribute'una basılır (column-view.ts toStyleString anahtarı olduğu gibi yazar) — bu dördünde KEBAB-CASE zorunludur, fontSize sessizce düşer, font-size çalışır.",
|
|
128
|
-
isEditable: "Hücre içi düzenleme: çift tık ya da Enter editörü açar, Enter/dışarı tıklama işler, Escape vazgeçer. Değer GERÇEKTEN değiştiyse rowChange çalışır (saklı değer de aynı normalleştirmeden geçer: '1250' metni tutan money hücresini açıp kapatmak olay üretmez) ve düzenlenen satır YENİ değeriyle self.selectedRow'dadır (satır self.rows içinde de yerinde güncellenir). number · money · pertance · progress kolonları sayı olarak yazılır; tag · tags · link kolonları düzenlenmez. isReadonly:true iken hiçbir hücre düzenlenmez."
|
|
129
|
-
}
|
|
130
|
-
},
|
|
131
77
|
datatable: {
|
|
132
|
-
summary: 'Kendi filtre paneli/sıralaması/sayfalaması İÇİNDE olan tablo: tek mount akışı yazılır, komponent etkileşimde prop’larını güncelleyip mount’u yeniden tetikler.',
|
|
78
|
+
summary: 'Kendi filtre paneli/sıralaması/sayfalaması İÇİNDE olan tablo: tek mount akışı yazılır, komponent etkileşimde prop’larını güncelleyip mount’u yeniden tetikler. Satıra tık/çift tık rowClick / rowDoubleClick olarak yayılır.',
|
|
133
79
|
behavior: [
|
|
134
|
-
"
|
|
135
|
-
'Zengin kolon biçimlendirme (renk haritası, prefix/suffix, tarih formatı, avatar) kolon şemasındadır — ama renk haritası STATİKTİR
|
|
136
|
-
"Liste→form
|
|
80
|
+
"Süzme/sıralama/sayfalama için AYRI olay yoktur, tasarımdır: kullanıcı süzünce/sıralayınca filters/sortField/sortType/offset prop'larını node'a yazar ve mount'u yeniden tetikler — akış bu prop'ları uca parametre geçirir. Yani mount/filter/sort/pagination için AYRI akışlar kurmak gerekmez.",
|
|
81
|
+
'Zengin kolon biçimlendirme (renk haritası, prefix/suffix, tarih formatı, avatar) kolon şemasındadır — ama renk haritası STATİKTİR (propNotes.colorMap).',
|
|
82
|
+
"Liste→form geçişinin iki yolu var: satır AKSİYONU — actions:[{ text, kind, icon, flow:{ type:'flow', ref:<flowId> } }] — ya da satır OLAYI: rowClick (veri hücresine tık) · rowDoubleClick (çift tık). Satır olayı da olaydan ÖNCE tıklanan satırı selectedRow'a yazar (Table.svelte emitRowEvent → setNode + onEmit); onay kutusu, ✏/🗑 ve aksiyon düğmeleri satır olayını tetiklemez. editMode none DIŞINDAYKEN çift tık satırı ayrıca düzenlemeye açar — detay sayfasına geçiş için editMode none bırak. Kaldırılan table bileşeninin doubleClick/select adları burada YOKTUR: bağlamak PAGE-008 ile istek gitmeden reddedilir.",
|
|
137
83
|
"Aksiyona tıklanınca komponent ÖNCE tıklanan satırı kendi selectedRow prop'una yazar, SONRA akışı çalıştırır (Table.svelte:72 setNode + onEmit) — akışta satır '<elementId>.selectedRow.<alan>' ile okunur. selectedRow katalogda hidden'dır; setter ile yazılmaz, komponent doldurur.",
|
|
138
|
-
"style prop'u 2026-08-27'de EKLENDİ: parçalar &__toolbar · &__title · &__head · &__th · &__body · &__row · &__td.
|
|
139
|
-
"Satır bazlı _columns görünüm ezmesi YOKTUR
|
|
84
|
+
"style prop'u 2026-08-27'de EKLENDİ: parçalar &__toolbar · &__title · &__head · &__th · &__body · &__row · &__td. Tek yazım kuralı vardır — hepsi designerCss'ten geçer, yani camelCase yazılır ve iç seçici alır. (Bu tarihten önce datatable stillendirilemiyordu; eski notlar 'style YOKTUR' diyorsa güncel değildir.)",
|
|
85
|
+
"Satır bazlı _columns görünüm ezmesi YOKTUR; renk kolonun colorMap/autoColor sözlüğünden ya da hücre değerinin kendi color alanından gelir (sıra propNotes.colorMap'te: veri objesindeki color → colorMap → autoColor). Aksiyon ise satıra göre değişebilir: rows[i]._actions[<aksiyon index>] = { isHidden, isDisabled, text … } o satırda aksiyonun üstüne biner (rowActions).",
|
|
140
86
|
"SATIR KOŞULLU AKSİYON (2026-09-25): actions[i].isHidden / isDisabled bir kod ifadesi olabilir — { type:'code', ref:'{{ !item.isCustomizable }}' }; tablo onu HER SATIR için item = o satır ile çözer (machine.evaluateExpression). Connect Data'ya bağlı tabloda satırlar _actions taşıyamadığı için tek yol budur. Sıra: tanım → ifade → satırın _actions'ı. Sütun çizilen satırlardan hesaplanır: aksiyon en az bir satırda görünüyorsa sayılır, her satırda gizliyse (koşul ya da _actions) sütun hiç çizilmez (2026-10-02); satır yokken koşullu aksiyon aday sayılır. Kanvasta ifade çözülmez, aksiyon her satırda görünür.",
|
|
141
87
|
"HÜCRE ŞABLONU (2026-09-21): bir kolonun hücresi serbest tasarlanabilir — tablonun ÇOCUĞU olarak bir datatable-cell düğümü (props.column = o kolonun name'i) eklenir, içine bırakılan bileşenler o kolonda her satırda çizilir ve satırı item olarak okur ({{ item.title }}). Tablonun başka türde çocuğu olmaz. Ayrıntı: datatable-cell kaydı.",
|
|
142
88
|
"keepSampleData (gizli switch, 2026-09-21) bir TASARIMCI kararıdır: true iken studio kanvasında bağlı olmayan tablonun üstündeki 'Örnek veri gösteriliyor · Connect data' çağrısı ve perdesi çizilmez. Runtime okumaz, veriyi etkilemez; örnek satırlarla bırakılacak bir tabloda true yazılabilir, rows bağlanınca anlamı kalmaz. Kanvasta tablo kendi içinde yatay kayar ve kolon başlığı tıklaması o kolonun panelini açar (designer.interactive) — bu da yalnız studio davranışıdır.",
|
|
@@ -163,11 +109,11 @@ export const componentKnowledge = {
|
|
|
163
109
|
rowErrors: "Salt okunur: [{ rowId, field?, message }] — bağlantı son kaydın satır hatalarını yazar; field varsa o hücre kırmızı çerçeve + mesaj.",
|
|
164
110
|
selectedCells: "Salt okunur: { column, rowIds[], anchorRowId } — aynı kolonda çoklu hücre seçimi (D-25); farklı kolona tıklamak seçimi sıfırlar. Doldurma f-22.",
|
|
165
111
|
revealEntity: REVEAL_ENTITY_NOTE,
|
|
166
|
-
columns: "Kolon tipleri: text · number · date · datetime · time · switch · tag · email · url · link · image · file · progress · relation · html. HTML (2026-09-18) html bileşeninin modelini hücreye taşır: satır değeri { content, style } — content ham HTML'dir ve SATIRIN alanlarıyla Mustache'ten geçer ('<b>{{name}}</b>'), style o hücreye scoped CSS bloğudur (emotion; 'color:red; b { … }' iç seçici alır, designerCss/!important YOK); bağlı kaynaktan düz metin gelirse content sayılır. İşaretleme TEMİZLENMEDEN basılır (html bileşeniyle aynı güven modeli; <script> hücrede ÇALIŞMAZ, satır içi on* handler'lar çalışır) — son kullanıcının yazdığı bir alanı html kolonuna eşleme. Satır içi düzenlenmez (editable gizli); sıralama/filtre/CSV etiketsiz metni görür. Studio Rows editöründe html kolonu için 'HTML content' + 'Style' iki metin alanı çıkar. RELATION (Connect Data) ilişki alanının hedef nesnesini ({ id, ad }) görünen alanıyla metin olarak, m2m dizisini ilk 3 chip + “+N” olarak çizer; hedef tabloyu okuyamayan kullanıcıya gri “—” + kilit basar. BAĞLI TABLO: rows connectData ile bağlıysa runtime her kolona gizli capability yazar (işleçler, sortable, enabled, relation, enum) — sıralama/filtre anahtarını ve filtre işleç listesini sunucu belirler, enum değerleri etiket+renkle çizilir; capability elle yazılmaz.
|
|
112
|
+
columns: "Kolon tipleri: text · number · date · datetime · time · switch · tag · email · url · link · image · file · progress · relation · html. HTML (2026-09-18) html bileşeninin modelini hücreye taşır: satır değeri { content, style } — content ham HTML'dir ve SATIRIN alanlarıyla Mustache'ten geçer ('<b>{{name}}</b>'), style o hücreye scoped CSS bloğudur (emotion; 'color:red; b { … }' iç seçici alır, designerCss/!important YOK); bağlı kaynaktan düz metin gelirse content sayılır. İşaretleme TEMİZLENMEDEN basılır (html bileşeniyle aynı güven modeli; <script> hücrede ÇALIŞMAZ, satır içi on* handler'lar çalışır) — son kullanıcının yazdığı bir alanı html kolonuna eşleme. Satır içi düzenlenmez (editable gizli); sıralama/filtre/CSV etiketsiz metni görür. Studio Rows editöründe html kolonu için 'HTML content' + 'Style' iki metin alanı çıkar. RELATION (Connect Data) ilişki alanının hedef nesnesini ({ id, ad }) görünen alanıyla metin olarak, m2m dizisini ilk 3 chip + “+N” olarak çizer; hedef tabloyu okuyamayan kullanıcıya gri “—” + kilit basar. BAĞLI TABLO: rows connectData ile bağlıysa runtime her kolona gizli capability yazar (işleçler, sortable, enabled, relation, enum) — sıralama/filtre anahtarını ve filtre işleç listesini sunucu belirler, enum değerleri etiket+renkle çizilir; capability elle yazılmaz. image/file düz URL kabul etmez (aşağıdaki image notu); renk satır bazında değil colorMap ile kurulur. PROGRESS (2026-08-27) hücrenin içine çubuk ya da halka çizer: progressVariant bar|circle · max (varsayılan 100) · progressLabel none|percent|fraction|value · progressColor + customProgressColor · thresholds [{from,color}] (yüzdeyi geçmeyen en yüksek eşik kazanır) · captionField BAŞKA bir satır alanının metnini çubuğun ÜSTÜNE yazar, yani ad ve çubuk tek hücrede durur. Sıralama/dışa aktarım ham sayıyı görür, çizimi değil. KİŞİ HÜCRESİ (2026-09-18): text kolonunda showAvatar metnin önüne baş harfli renkli daire çizer (renk addan türer, aynı ad hep aynı renk); avatarField BAŞKA bir satır alanından görsel okur (dosya nesnesi ya da URL; yüklenemezse baş harfe düşer) — ayrı image kolonu açmadan 'avatar + ad' tek hücrede durur. TAG appearance subtle: açık zemin + koyu yazı + renkli nokta (durum rozeti); colorMap'te semantik ad (success/warning/info) tema token'ına çözülür — DİKKAT: temalarda info neredeyse beyazdır (#F8F8F8), mavi için primary kullan; çok açık bir renk subtle'da gri rozete sınırlanır; colorMap satırının mode'u solid ise o değer kolonun görünümünden bağımsız renkli zemin + beyaz yazıyla çizilir (varsayılan soft = kolonun appearance'ı). SWITCH kolonu (2026-09-18) kontrol değil durum işaretidir: booleanStyle icon (varsayılan; true yeşil dolu daire + ✓, false kırmızı dolu daire + ×) · text (dile göre Evet/Hayır, Hayır kırmızı) · switch (eski toggle görünümü); booleanFalseColor muted false'u sönük griye çeker (varsayılan error/kırmızı — false'un sorun olmadığı alanlarda muted kullan). number kolonu eşit genişlikli rakamla çizilir; url kolonu adresi protokolsüz gösterir. HİZA (2026-09-18): kolonun align alanı left|center|right başlığı ve hücreyi birlikte hizalar (avatar+metin ve halka progress da kayar); boş = her tipte solda (number dahil — tutarları sağa yaslamak için align:right yaz); bağlı tablonun birincil anahtar kolonu (capability.isKey) yeni bağlamada 80px dar gelir.",
|
|
167
113
|
image: "IMAGE/FILE kolonu düz URL string'i KABUL ETMEZ: hücre `{ absolute_path, display_name }` (ya da `fileName`) alanlarını taşıyan bir DOSYA NESNESİ (veya nesne dizisi) bekler — `DisplayCellView.svelte:10` `file.absolute_path ?? ''` okur, düz string verilince kaynak boş kalır ve hücre SESSİZCE boş çizilir (09-04 Y-21). Satır verisi bir metin kolonunda URL taşıyorsa kolonu 'url'/'link' yap ya da veriyi { absolute_path: '<url>', display_name: '<ad>' } biçimine çevir; entity'nin FILE alanı zaten bu şekli döner.",
|
|
168
114
|
actions: "Satır aksiyonları. kind sözlüğü BUTON'unkinden farklıdır: error · information · solid · transparent · dark · danger · warning (butonda success/error/info/primary/warning). Yanlış sözlükten değer invalid-enum-value verir.",
|
|
169
|
-
selectedRow: "Salt okunur: satır aksiyonu
|
|
170
|
-
colorMap: "Kolon içi değer→renk sözlüğü: [{ value:'Active', color:'#16a34a' }]. ETİKET (2026-10-01): satıra label yazılırsa hücre ham değer yerine onu çizer — [{ value:'Approved', label:'Onaylandı', color:'success' }] veritabanındaki İngilizce durumu Türkçe rozetle gösterir; filtre seçenekleri de etiketi gösterir, sıralama/filtre ham değerle çalışır. Bağlı kolonda aynı değerin enum etiketini EZER. Etiketli değerin solid modu etikete göre uygulanır. STATİKTİR — hücrenin kendi değerine bakar, satırın başka alanına göre hesaplanamaz. Satıra göre koşullu renk gerekiyorsa
|
|
115
|
+
selectedRow: "Salt okunur: satır aksiyonu, rowClick ya da rowDoubleClick'te komponentin kendisi doldurur; akış ifadesinde '<elementId>.selectedRow' (olayın kendi akışında self.selectedRow) ile okunur.",
|
|
116
|
+
colorMap: "Kolon içi değer→renk sözlüğü: [{ value:'Active', color:'#16a34a' }]. ETİKET (2026-10-01): satıra label yazılırsa hücre ham değer yerine onu çizer — [{ value:'Approved', label:'Onaylandı', color:'success' }] veritabanındaki İngilizce durumu Türkçe rozetle gösterir; filtre seçenekleri de etiketi gösterir, sıralama/filtre ham değerle çalışır. Bağlı kolonda aynı değerin enum etiketini EZER. Etiketli değerin solid modu etikete göre uygulanır. STATİKTİR — hücrenin kendi değerine bakar, satırın başka alanına göre hesaplanamaz. Satıra göre koşullu renk gerekiyorsa satır verisinde rengi taşı ({ label, color }) — render sırası: veri objesindeki color → colorMap[etiket] → autoColor. TAG HÜCRE ŞEKLİ: metin, { label, color? } ya da { value, color? } (label yoksa value okunur; ikisi de yoksa obje ham JSON basılır) veya bunların dizisi. RENK (veri objesinde de colorMap'te de): semantik ad primary · info · success · warning · error TEMA TOKEN'INA çözülür (tema değişince izler, ham hex yazmaya gerek yok); hex/rgb/'var(--ng-…)'/CSS renk adı olduğu gibi geçer; başka bir değer (yazım hatası, çözülmemiş '{{ }}') o kademeyi ATLAR ve sıradakine düşer. Veri objesindeki variant OKUNMAZ — outline/solid kolonun appearance'ından gelir. Solid rozetin yazısı BEYAZDIR, yalnız gerçekten açık zeminde (sarı/amber, açık gri; LCH açıklığı > 70) siyah seçilir — token'da CSS ile, hex'te ölçülerek. SATIR MODU (2026-09-18): [{ value, color, mode:'solid' }] o değeri kolonun appearance'ı (subtle/outline) ne olursa olsun dolu zemin + BEYAZ yazıyla çizer; mode yazılmazsa ya da 'soft' ise kolonun görünümü geçerlidir. Renksiz satırın solid modu yok sayılır.",
|
|
171
117
|
tableStyle: "zebra | plain — satır zemini varyantı; CSS DEĞİL. Serbest CSS için ayrı `style` prop'u vardır (parça bazlı).",
|
|
172
118
|
style: "Parça bazlı CSS: &__toolbar · &__title · &__footer · &__summary · &__filter-bar · &__filter-panel · &__head · &__th · &__body · &__row · &__td. designerCss her bildirime !important ekler, yani komponentin kendi çerçeve/ayraç varsayılanlarını ezer — Figma tipi düz tablo bununla kurulur.",
|
|
173
119
|
filterMode: "column | bar | none — satır içi filtre arayüzü; gelişmiş koşul oluşturucu ondan bağımsız advancedFilter anahtarıdır, ikisi birlikte açılabilir. Hepsi aynı filters dizisini yazar, akış/bağlantı farkı görmez. column/bar modunda VE/VEYA ve grup kurulamaz (kök kurallar and ile bağlanır); oradan uygulanan filtre yalnız o kolonun kök kurallarını değiştirir, gelişmiş paneldeki grup/or kuralları KORUNUR ve kolon/bar kuralları panelde kural olarak görünür. Bar'ın 'Filtreleri temizle'si yalnız bar kurallarını kaldırır. Eski düğümdeki filterMode=advanced (advancedFilter yazılmamışken) gelişmiş oluşturucu olarak okunur.",
|
|
@@ -903,7 +849,7 @@ export const componentKnowledge = {
|
|
|
903
849
|
value: "Tek dosyada NESNE, isMultiple açıkken nesnelerin DİZİSİ. Kullanıcının seçtiği YENİ dosya { type:'file', fileName, value:<base64 data URL> } olarak gelir ve uca böyle gider; çoklu kipte yeni seçim dizinin sonuna eklenir ve kayıtta yalnız o dosya açılır. Kayıtlı dosyayı forma geri basarken uç ya da workflow table get adımının döndüğü FILE değerini OLDUĞU GİBİ yaz — tekil alanda nesne ({ type:'ref', value:<fileId>, fileName, absolute_path, … }), çoka-çok alanda bu nesnelerin dizisi: kullanıcı dokunmadan kaydederse aynı değer uca gider, dosyalar referans olarak korunur, yeni dosya açılmaz; X ile silinen dosya gövdeden düşer. Tek dosyada çip adıyla çizilir; 2+ dosyada çip 'N dosya seçildi' yazar, adlar çipe tıklayınca açılan listededir. Kayıtlı dosyayı type:'file' ile (value'da URL ya da guid) YAZMA: ekranda fark görünmez ama backend value'yu base64 diye çözer ve kayıt 500 FormatException ile düşer. Asgari { type:'ref', value:<fileId> } kaydı geçirir ama tek dosya çipi 'undefined' yazar; fileName ve absolute_path da taşınmalı. row_get/row_list şekillerini uca geri yazma: tekil alanda düz guid ya da { id, display_name } tablo kaynaklı uçta alanı SESSİZCE NULL'lar (200; workflow table adımı bu ikisini doğru bağlar); çoka-çok alanda row_get/row_list'in [{ id, display_name }] dizisi uçta DA workflow table adımında DA bütün dosyaları sessizce siler, düz guid dizisi 500 JsonException verir. Boşaltmak için tekil alanda { type:'ref', value:null }, çoklu alanda [{ type:'ref', value:null }] ya da []. (ölçüldü 2026-10-02) Tasarımda value'ya drive dosyası BAĞLAMA ({ type:'file', ref:<fileId> } — Studio panelinin dosya seçicisi de bunu yazar): çalışma anı değeri { type:'file', ref, data:<URL> } olur, çip dosya adı yerine URL yazar ve kullanıcı dokunmadan kaydederse backend type:'file' kaydında yalnız value'yu okuduğu için tekil alan sessizce NULL'lanır (200 döner, mevcut dosya silinir; NOT NULL alanda 400 InvalidParameterException). Varsayılan dosya gerekiyorsa value'yu static ref nesnesi olarak ver: { type:'static', data:{ type:'ref', value:'<fileId>', fileName, absolute_path } } — çip adıyla çizilir, dokunmadan kayıt dosyayı yazar (ölçüldü 2026-10-02).",
|
|
904
850
|
button_text: 'Gözat butonunun metni (varsayılan Browse); boşaltılırsa buton HİÇ çizilmez, görüntüleme ve salt okunur kiplerde de çizilmez. Adın snake_case olması kayıtlı sayfalar yüzündendir (ARC-085); buttonText yazmak unknown-prop verir.',
|
|
905
851
|
placeholder: 'Dosya seçilmemişken gösterilen metin; boş bırakılırsa uygulama dilinde hazır metin yazar (Dosya seçiniz / Choose a file).',
|
|
906
|
-
allowedFiletypes: 'Sabit listeden seçilen uzantılar (pdf, docx, doc, xlsx, xls, pptx, ppt, txt, csv, jpg, png, heic, zip…). Boş bırakmak her tür serbest demektir; listede olmayan uzantı için customFiletypes. Liste 2026-09-17’den beri bir ipucu değil gerçek bir ENGEL olduğu için her uzantı AYRI satırdır: jpg seçip jpeg seçmemek .jpeg dosyasını reddettirir, doc/docx ve xls/xlsx çiftleri de ayrıdır.',
|
|
852
|
+
allowedFiletypes: 'Sabit listeden seçilen uzantılar (pdf, docx, doc, xlsx, xls, pptx, ppt, txt, csv, jpg, png, heic, zip…). Boş bırakmak her tür serbest demektir; listede olmayan uzantı için customFiletypes. Liste 2026-09-17’den beri bir ipucu değil gerçek bir ENGEL olduğu için her uzantı AYRI satırdır: jpg seçip jpeg seçmemek .jpeg dosyasını reddettirir, doc/docx ve xls/xlsx çiftleri de ayrıdır. Biçim: statik değer seçenek anahtarlarının JSON dizisidir ({type:"static", data:["pdf","png"]}) ya da tek virgüllü metin ("pdf,png"); nesne, seçenek nesnesi dizisi ({label,value}), satır sarmalı ve sayı invalid-multiselect-value ile reddedilir (g-23 / b-23; öncesinde 500 veriyordu).',
|
|
907
853
|
customFiletypes: 'Listede olmayan uzantılar için serbest metin (2026-09-17): heic, dwg;psd gibi — virgül, noktalı virgül ve boşluk ayraçtır, baştaki nokta ve yıldız atılır, büyük/küçük harf önemsizdir. allowedFiletypes ile BİRLEŞİR, onun yerini almaz.',
|
|
908
854
|
maxFileCount: 'Yalnız isMultiple açıkken okunur; alanda zaten duran dosyalar sayıya dahildir.'
|
|
909
855
|
}
|
|
@@ -922,7 +868,7 @@ export const componentKnowledge = {
|
|
|
922
868
|
value: "Seçili dosya(lar). Panelde ÇİZİLİR ve akıştan yazılabilir (2026-09-17'ye kadar gizliydi, bu yüzden AI sözlüğünde de görünmüyordu): kayıtlı bir dosyayı forma geri basmanın yolu budur. Tekli kipte nesne, çoklu kipte dizi; boşaltmak için null (çoklu kipte []). Kipiyle uyuşmayan şekil de OKUNUR: çoklu kipte yazılan tek nesne listelenir, tekli kipte yazılan dizinin ilk dosyası çizilir (2026-09-17'ye kadar ikisi de sessizce hiçbir şey göstermiyordu). İçeriği olmayan kayıt (ne value ne data ne absolute_path) hiç çizilmez. Tasarımda value'ya drive dosyası BAĞLAMA ({ type:'file', ref:<fileId> } — Studio panelinin dosya seçicisi de bunu yazar): çalışma anı değeri { type:'file', ref, data:<URL> } olur, çip dosya adı yerine URL yazar ve kullanıcı dokunmadan kaydederse backend type:'file' kaydında yalnız value'yu okuduğu için tekil alan sessizce NULL'lanır (200 döner, mevcut dosya silinir; NOT NULL alanda 400 InvalidParameterException). Varsayılan dosya gerekiyorsa value'yu static ref nesnesi olarak ver: { type:'static', data:{ type:'ref', value:'<fileId>', fileName, absolute_path } } — çip adıyla çizilir, dokunmadan kayıt dosyayı yazar (ölçüldü 2026-10-02).",
|
|
923
869
|
text: 'Butonun üzerindeki metin (varsayılan "Attach File"); ikon sabittir. Alanın başlığı ayrı bir prop\'tur: label.',
|
|
924
870
|
description: 'Butonun altındaki yardım metni. Dosya seçilir seçilmez yerini dosya listesi alır, seçim temizlenince geri gelir (fileInput ile aynı kural).',
|
|
925
|
-
allowedFiletypes: 'İzin verilen uzantılar (çoklu seçim, kapalı liste). Hem dosya diyaloğunun accept süzgecini hem de seçimden SONRAKİ denetimi besler: liste dışı bir dosya seçilirse değere girmez ve komponentin içinde "desteklenmiyor" uyarısı çizilir (2026-09-17; öncesinde yalnız diyalog süzgeciydi, "Tüm dosyalar" ile aşılabiliyordu). Hem allowedFiletypes hem customFiletypes boşsa her tür serbesttir. Akış prop\'a düz metin yazabilir ("pdf,png", customFiletypes ile aynı ayraçlar) — 2026-09-25`e kadar bu komponenti `input.map is not a function` ile düşürüyordu (fileInput okuyordu).',
|
|
871
|
+
allowedFiletypes: 'İzin verilen uzantılar (çoklu seçim, kapalı liste). Hem dosya diyaloğunun accept süzgecini hem de seçimden SONRAKİ denetimi besler: liste dışı bir dosya seçilirse değere girmez ve komponentin içinde "desteklenmiyor" uyarısı çizilir (2026-09-17; öncesinde yalnız diyalog süzgeciydi, "Tüm dosyalar" ile aşılabiliyordu). Hem allowedFiletypes hem customFiletypes boşsa her tür serbesttir. Akış prop\'a düz metin yazabilir ("pdf,png", customFiletypes ile aynı ayraçlar) — 2026-09-25`e kadar bu komponenti `input.map is not a function` ile düşürüyordu (fileInput okuyordu). Biçim: statik değer seçenek anahtarlarının JSON dizisidir ({type:"static", data:["pdf","png"]}) ya da tek virgüllü metin ("pdf,png"); nesne, seçenek nesnesi dizisi ({label,value}), satır sarmalı ve sayı invalid-multiselect-value ile reddedilir (g-23 / b-23; öncesinde 500 veriyordu).',
|
|
926
872
|
customFiletypes: 'Listede olmayan uzantılar, serbest metin ("heic, dwg;psd"). Virgül, noktalı virgül ve boşluk ayraçtır; baştaki nokta ve yıldız atılır, büyük/küçük harf fark etmez. allowedFiletypes ile BİRLEŞİR, onun yerine geçmez (fileInput ile aynı ad ve aynı kural). Çok parçalı uzantı da yazılabilir ("tar.gz"): eşleşme adın SONUNA bakar, son noktadan sonrasına değil.',
|
|
927
873
|
maxFileSizeMb: 'Dosya BAŞINA en büyük boyut (MB). Boş/0/negatif değer sınırsız demektir; aşan dosya değere girmez, uyarı komponentin içinde çizilir.',
|
|
928
874
|
maxFileCount: "Çoklu kipte toplam dosya sayısı sınırı — zaten seçili olanlar da sayılır. Boş/0/negatif sınırsız. Tekli kipte hiç okunmaz ve panelde de gizlidir (isMultiple'a bağlı).",
|
|
@@ -1269,7 +1215,7 @@ export const componentKnowledge = {
|
|
|
1269
1215
|
'Etiket eklemek/silmek gereken ekranda tag-input kullan; tags değer yazmaz, change yaymaz.',
|
|
1270
1216
|
"UZUN METİN: boşluksuz 300 karakterlik etiket de kabın içinde satır kırar; etiket en çok kabın genişliği kadar olur — &__tag'a maxWidth/overflowWrap yazmak GEREKMEZ. Etiketler satır sonunda alt satıra sarar; kökte flexWrap:'nowrap' verirsen etiketler yine sözcüğün genişliğine kadar daralır (sözcük ortasından kırılmaz, yalnız kabı aşan tek etiket kırılır).",
|
|
1271
1217
|
"ERİŞİLEBİLİRLİK: isActive olan etiket aria-current='true' taşır; seçili durumu ekran okuyucuya iletmesi tıklanabilir (button) etikette güvenilirdir, salt metin (span) etikette öznitelik taşınır ama okunması ekran okuyucuya bağlıdır — durumu başka bir yolla da anlatmak istersen etiket metnine yaz. Tıklanabilir etiket kendi metniyle adlanan bir button'dır; basılı tutulan Enter olayı BİR kez tetikler. Kök bir liste değildir (rolsüz div).",
|
|
1272
|
-
"VERİ YAZIMI: values'a statik düz metin/sayı dizisi (['billing','critical']) ve karışık dizi KAYDEDİLEMEZ (500) — values'u kod tipinde bağla: {{ ['billing','critical'] }}. Statik öğenin label'ında {{ }} yorumlanmaz, ham basılır; ifade gerekiyorsa values'un kendisini ifade olarak yaz ({{ [{ label: state.page.x }] }}). Akış values'ı okuyup geri yazarsa label'daki çeviri sarmalı boşalır
|
|
1218
|
+
"VERİ YAZIMI: values'a statik düz metin/sayı dizisi (['billing','critical']) ve karışık dizi KAYDEDİLEMEZ (500) — values'u kod tipinde bağla: {{ ['billing','critical'] }}. Statik öğenin label'ında {{ }} yorumlanmaz, ham basılır; ifade gerekiyorsa values'un kendisini ifade olarak yaz ({{ [{ label: state.page.x }] }}). Akış values'ı okuyup geri yazarsa: 2026-10-14 frontend'inden (dağıtımdan) sonra okuma çözülmüş metni verir ve aynı metni geri yazmak çeviri bağını korur; daha eski kurulumda label'daki çeviri sarmalı boşalır — orada akışta t(anahtar) ile çözülmüş metni yaz.",
|
|
1273
1219
|
"STİL HEDEFLERİ: kök CSS (gap, justifyContent, flexDirection, padding, border, fontSize, fontFamily, color…) çalışır; kökün fontSize/fontFamily'si etiketlere iner, color'ı yalnız renksiz (nötr) etikete iner — durum renkleri kendi rengini korur. '&__tag' HER etiketi hedefler (backgroundColor, color, border, borderRadius, padding, fontFamily, fontSize, fontWeight, textTransform, letterSpacing, boxShadow, textShadow, maxWidth ve linear-gradient çalışır; varyantın ve rengin zeminini ezer). Etiketin öznitelikleri durum hedefidir: &__tag[data-active='true'] (seçili), &__tag[data-color='success'] (renk), &__tag[data-variant='outline'] (varyant); bunlarla :hover, :focus-visible, ::before, :nth-child(n) ve @media birlikte yazılır. '&__tag:hover' salt metin (span) etiketine de uygulanır; YALNIZ tıklanabilirleri hedeflemek için '&__tag.ng-tag--clickable:hover'. Çakışan durum kuralları (aktif + hover aynı özellik) için kazanan anahtar sırasına bağlıdır: aynı özelliği tek seçicide ver. Etiket başına simge icon, etiket başına renk customColor/color ile verilir; renkli nokta isteniyorsa '&__tag[data-custom]::before' ile content:'', display:inline-block, width/height:8px, borderRadius:50%, marginInlineEnd:6px ve background:'var(--ng-tag-color)' yazılır (serbest renkli etiket CSS değişkeni --ng-tag-color taşır, data-custom='true' alır). Etiket başına GRADYAN özelliği YOKTUR: ':nth-child' ile yazılır (veriye bağlı değil).",
|
|
1274
1220
|
"isDisabled:true (yalnız boolean true) etiketi soluk çizer ve tıklanamaz yapar: düğme disabled olur, clickItem çalışmaz. Sayısı 0 olan süzgeç çipi için akıştan yaz (2026-09-30)."
|
|
1275
1221
|
],
|
|
@@ -2410,7 +2356,7 @@ export const componentKnowledge = {
|
|
|
2410
2356
|
"Veri tek yönlü girer: record prop'u {{ }} ifadesiyle (sorgu çıktısı ya da tablonun selectedRow'u) ya da akıştaki setter ile beslenir; tıklama/seçim olayı yoktur — satır tıklaması gerekiyorsa tıklanabilir bir kapsayıcıya sar. Tek olay mount'tur (yük yok).",
|
|
2411
2357
|
"Boş nesne ({}) 'kayıt yok' sayılır ve emptyText basılır; geçerli kayıt olsa da fields boşsa (ya da tüm alanlar isHidden ise) yine boş durum çizilir. isLoading her dalı ezer ve alan başına iskelet gösterir.",
|
|
2412
2358
|
"fields[].field nokta ayraçlı iç içe yol alır (department.title, items.0.name); yol kopuksa hücre '-' basar, patlamaz. Aynı alanı iki satırda iki ayrı formatla göstermek geçerlidir (2026-09-16'dan önce sayfayı düşürüyordu).",
|
|
2413
|
-
"format: money/pertance/date/datetime/number biçimlenir, 'text' ham String basar. number dilin ayıraçlarını kullanır (tr 84.500), sayıya çevrilemezse ham metne düşer; money fields[].currency'den (ISO 4217: 'USD', 'EUR') para birimini alır, boş ya da geçersiz değer TRY'dir; pertance (yazımı böyle) <=1'i oran, >1'i yüzde sayar; geçersiz tarih ham metne düşer. boolean değeri ✓/✗ işaretine çevirir — yalnız false/0/'false'/'0' hayırdır, tanınmayan dolu metin evettir (
|
|
2359
|
+
"format: money/pertance/date/datetime/number biçimlenir, 'text' ham String basar. number dilin ayıraçlarını kullanır (tr 84.500), sayıya çevrilemezse ham metne düşer; money fields[].currency'den (ISO 4217: 'USD', 'EUR') para birimini alır, boş ya da geçersiz değer TRY'dir; pertance (yazımı böyle) <=1'i oran, >1'i yüzde sayar; geçersiz tarih ham metne düşer. boolean değeri ✓/✗ işaretine çevirir — yalnız false/0/'false'/'0' hayırdır, tanınmayan dolu metin evettir (datatable'ın 'switch' kolon tipinin detailview'daki adı 'boolean').",
|
|
2414
2360
|
"locale boşken uygulama diline CANLI bağlıdır (dil değişince yeniden biçimler); size boş kaydedilir ve 'md' varsayılanı komponentin içinde çözülür.",
|
|
2415
2361
|
"columns 1-4'tür ama sınırı zorlayan tek yüzey kanvas toolbar'ıdır: sağ panel büyük değeri uyarı ikonuyla KABUL EDER ve öyle kaydeder, runtime yine 1-4'e kırpar ve kesirli değeri tam sayıya indirir — yani 8 yazılmış bir sayfa 4 kolon çizer. link formatı görünen metni ham bırakır ama href'i düzeltir: şemasız değer https:// alır, e-posta gibi duran değer mailto: olur, '/...' ve '#...' olduğu gibi kalır; BEYAZ LİSTE dışındaki şema (javascript:, data:…) hiç bağlantı olmaz, değer düz metin basılır.",
|
|
2416
2362
|
"style parçaları: &__grid (ızgara), &__item (alan satırı), &__label, &__value, &__empty (boş durum) ve biçim işaretleri &__badge, &__tag, &__link, &__boolean, &__image ayrı ayrı hedeflenir. Rozetin değere göre rengi için fields[].colorMap kullan (aşağıda), style ile değer→renk yazılmaz. tag kendi açık zemini ve kendi yazı jetonuyla çizilir (kökte color vermek onu okunmaz yapmaz); koyu ya da gradyan zeminde istersen &__tag ile boya.",
|
|
@@ -2655,6 +2601,46 @@ export const componentKnowledge = {
|
|
|
2655
2601
|
showRemind: 'Hatırlat düğmesi; varsayılan true.'
|
|
2656
2602
|
}
|
|
2657
2603
|
},
|
|
2604
|
+
'version-compare': {
|
|
2605
|
+
summary: 'Sürüm karşılaştırma çekmecesi (ADR 0018): iki sürümün dosyasını TARAYICIDA okuyup farkını gösterir — sürüm kartları + seçici + yer değiştir, bağlam notu, İçerik sekmesi (türe göre görünüm: belge kâğıdı, pdf sayfaları, txt satırları, xlsx/csv ızgarası, pptx slaytları, tür değişmiş, karşılaştırılamaz görüntüleyici; değişiklik listesi, tür süzgeci, sayaç, Alt+↓/↑) ve Alanlar ve ayarlar sekmesi; mode: inline okuma modudur: işaretli kâğıt, "İşaretli / Standart görünüm" anahtarı ve gezinme, aynı satırda uygulamanın araçları (inlineTools) ve kâğıdın yakınlaştırması (inlineZoom). Ölçüler her temada tasarımın px değeridir (temanın spacing ayarını izlemez). Veriyi KENDİSİ çekmez: sürüm listesi, çift, dosyalar, alanlar, bağlam notu ve metinler prop’tan gelir; hangi sürümün görüneceği ve hak kuralı uygulamanındır.',
|
|
2606
|
+
behavior: [
|
|
2607
|
+
"Dosya yolu: files[versionId] = { name, type, url | data, size?, error?, missing? }. Seçili çiftte bir sürümün dosyası yoksa komponent fileRequest { id } yayar (kimlik başına bir kez; dosya gelip sonra files'tan düşerse yeniden; editörde yayılmaz); akış dosyayı uçtan alıp files'a yazar. data verilirse (data URI ya da çıplak base64) dosya gelmiş sayılır; url verilirse komponent dosyayı KENDİSİ çeker (indirme ilerlemesi gösterilmez, 'Dosyalar alınıyor' yalnız aşamadır; iki dosya gelince toplam boyut yazılır). Akış dosyayı alamadıysa files[id].error = { message, at } yazar (at: deneme zamanı) → 'Dosya alınamadı' kartı; Tekrar dene fileRequest'i yeniden yayar (url'de yeniden çeker) ve files[id]'nin İÇERİĞİ tekrar denemeden öncekinden farklı olana dek bekleme kartını gösterir — platform bağlı prop'u her yazımda yeni nesneyle verdiği için karşılaştırma içerikle yapılır; hata kaydı her denemede ayırt edilebilir olmalı (aynı { error: true } yeniden yazılırsa kart beklemede kalır).",
|
|
2608
|
+
"Okuma ve fark Web Worker'da koşar (okuyucular: docx, txt, xlsx, csv, pptx, pdf; png/jpg/jpeg, metin katmanı olmayan (taranmış) pdf ve okuyucusu olmayan tür karşılaştırılamaz): iki aşamalı yükleme 'Dosyalar alınıyor' → 'Karşılaştırılıyor' (bölüm sayacı), sayfa donmaz; bitince summary { all, add, del, mod } yayar. Okunamayan dosyada (çözülemeyen data dahil) error { id, kind: read, message } yayar ve 'Dosya okunamadı' kartı çıkar; karşılaştırılamaz türde error { id, kind: unsupported, message: <tür> }, summary yok, iki dosya yan yana görüntüleyicide. Akışın yazdığı hata kaydında error { id, kind: fetch, message: error.message }; komponent url'yi çekemezse de error { id, kind: fetch, message: HTTP durumu ya da çekme hatası }. Worker yüklenemez, çökerse ya da karşılaştırmanın kendisi hata verirse (ör. çok büyük dosya) error { kind: read, message } (id yok) ve okunamadı kartı — kart sonsuz beklemez.",
|
|
2609
|
+
"Durum kartları (İçerik sekmesi): dosya alınamadı (Tekrar dene); okunamadı ('<ad> açılamıyor: dosya parola korumalı ya da bozuk…' — aynı bozuk sürüme dönünce de adıyla; iki sürüm de canOpen ise 'Dosyaları yan yana aç' — iki dosya bantsız görüntüleyicide, okunabilen taraf işaretsiz kendi görünümünde, verisi (data) çözülemeyen tarafın karşısı da; odak görüntüleyiciye); fark yok (kart DEĞİL: belge hazırdaki gibi işaretsiz çizilir, üstünde yeşil bant 'Bu iki versiyonun metni aynı', alan farkı varsa sayısı ve adlarıyla 'Alanlar ve ayarlara geç' — inline'da alan cümlesi ve düğmesi yok; boş değişiklik listesi çizilmez, slayt listesi kalır; sekme sayısı 0); dosya yok (files[id].missing → istenmez, \"Versiyon 1'de dosya yok\" + sözlüğün noFileText'i, ezilebilir; çekmecede ardından noFileFields 'Alanlar ve ayarlar karşılaştırılabilir.', inline'da yok); hak yok (SEÇİLİ sürüm disabled → dosyası istenmez, kartında kilit + disabledReason, 'Bu versiyonu aç' yok, '<etiket> ile karşılaştırma hakkınız yok' + texts.permissionNote). Sıra: hak yok → dosya yok → alınamadı → okunamadı; missing aynı sürümde disabled'ı geçer.",
|
|
2610
|
+
"Çok sayıda değişiklik (100+, bütün görünümlerde: belge, pdf, txt, xlsx/csv, pptx, tür değişmiş): belge, pdf sayfası ve tür değişmişte bölüm bölüm (bant '312 değişiklik bulundu. Bölümler sırayla çiziliyor (14 / 46)…'), txt ve ızgarada 40'ar satır ('Satırlar sırayla çiziliyor (400 / 20000)…') animasyon karelerinde kademeli çizilir, kalanı iskelet; pptx'te slayt bir seferde çizilir, yalnız slayt listesi kaydırdıkça yüklenir; görünüm anahtarı yok (birleşiği olan türde birleşik, txt yan yana). Liste '46 bölümde 312 değişiklik · liste kaydırdıkça yüklenir' (ızgarada 'n sayfada', slaytta 'n slaytta', txt'de yalnız sayı; 60'ar öğe, slayt listesi de); seçilen değişiklik (liste, Alt+↓/↑, selected) çizilmemişse ona dek çizilir/yüklenir. Sayaç tek satır.",
|
|
2611
|
+
"Ekran genişliği (viewport): 1200–1439 px'te sol liste 240 px; 1200 px altında birleşik varsayılan (yan yana seçilebilir), liste gizli, 'Değişiklikler <sayı>' düğmesi listeyi soldan açılan panelde açar (seçince ve Esc ile kapanır). Çekmecenin kendi genişliği (1440'tan 1200 px, 1200–1439'da ekran − 72 px, altında tam) barındıran çerçevenindir; komponent düğümünü doldurur.",
|
|
2612
|
+
"mode: inline (okuma modu): başlık, sürüm şeridi, sekmeler, liste ve alt bilgi yok, dialog değildir (açılışta odak almaz, Esc kapatmaz). Üstte bölüm menüsü ('Bölüm: <ad> ▾', değişikliği olan bölümler; seçilince bölümün ilk değişikliği; hiçbir bölümün adı yoksa — başlıksız belge — menü çizilmez) + önceki / 'n / N' / sonraki; altında \"<eski etiket>'e göre işaretli · yalnız metin farkları\" + lejant ve bütün belge tek birleşik 680 px kâğıtta (daralma yok). Öbür türler aynı etiketle kendi görünümünde: birleşiği olan türde birleşik (pdf sayfaları, ızgara, slayt, tür değişmiş), txt iki satır sütunu (yalnız yan yana); karşılaştırılamaz sonuçta iki dosya yan yana görüntüleyicide, işaret satırı ve lejant yok (tasarım 21). Üst satırın başında 'İşaretli görünüm / Standart görünüm' anahtarı (tasarım B 7, gezinmeyle aynı satır): inlineView ('marked' | 'standard') prop'u açık olanı söyler, tıklayınca inlineViewChange { inlineView } (setter) yayılır; 'standard'da bileşen yalnız anahtar satırını çizer (kâğıt gizli, durumu korunur; gizliyken seçilen değişikliğe kâğıt yeniden görününce kayar), standart görünümün kendisi (PDF görüntüleyici) ve görev çubuğu sayfanındır. Satır yükleme ve durum kartlarında da durur. Karşılaştırılamaz bandında 'Alanlar ve ayarlar karşılaştırması kullanılabilir.' cümlesi inline'da yok (Alanlar sekmesi yok). Gezinme selected / selectionChange / summary ile.",
|
|
2613
|
+
"inline satırında uygulamanın araçları (tasarım B 7, ADR 0019): inlineTools = [{ key, kind: button | text | separator, text, icon: { name }, isDisabled, place: end | start }]. place end (varsayılan) satırın sağında, iki görünümde, dizinin sırasıyla 4 px arayla; place start anahtarın yanında (14 px) ve YALNIZ standart görünümde (işaretli görünümde orada bölüm menüsü ve sayaç durur — B 7 'Sayfa x / n'). button 28 px simge düğme (16 px simge, ikincil renk), text erişilebilir adı ve ipucu, düğmede yazı yok; text 12,5 px ikincil metin, sağ grupta en az 44 px ve ortalı ('100%'); separator 1 × 20 px çizgi, iki yanında 6 px. Basılan düğme inlineToolClick { key } yayar (setter yok); isDisabled düğme basılmaz, yaymaz. Bileşen öğenin anlamını bilmez: sayfa numarası, yüzde, indir / yazdır / tam ekran akışın işidir. Akış diziyi bozuk yazarsa (null, tek nesne, metin öğe) satır düşmez, kayıt olmayan öğe atlanır; bilinmeyen kind button, bilinmeyen place end sayılır. Satır yükleme ve durum kartlarında da araçları çizer.",
|
|
2614
|
+
"inline satırında menü öğesi ve taşma menüsü (ADR 0020, qm S-30 / S-24): kind menu = bölüm menüsü görünümünde kenarlı 30 px düğme (text + ▾), açılan liste sağa yaslı, başlığı title, satırları options [{ key, text, isDisabled }]; seçenek seçilince inlineToolClick { key: <öğe>, item: <seçenek> }; seçeneksiz menu pasif. showText: true olan button simgenin yanında text'i yazar (ör. 'Düzenle'). Sağ grubun TAM genişliği (gizli ölçü kopyası) satırın iç genişliğine sol grup + 12 px aralıkla sığmıyorsa menu öğeleri satırda kalır, bütün button'lar (yazılı olanlar dahil) sırayla tek '⋯' düğmesinin (28 px, ad 'Diğer araçlar' / 'More tools') listesine girer: simge + menuText (yoksa text); text ve separator listede yok; pasif düğme listede pasif; seçilen satır satırdaki düğmeyle AYNI inlineToolClick { key }'i yayar — uygulamanın akışı değişmez. Satır, sol grup ya da sağ grup boyu değişince (ResizeObserver) yeniden karar verilir. Liste Esc ve dışarı tıklamayla kapanır, Esc'te odak düğmeye döner.",
|
|
2615
|
+
"inlineZoom (yüzde, varsayılan 100): inline kipte işaretli görünümün çizimi o ölçekle çizilir (CSS zoom; %100 = 680 px kâğıt, 150 = 1020 px); yerleşim ve kaydırma büyür, alana sığmayan kâğıt sola yaslanıp yatay kaydırılır. Etiket satırı ve lejant ölçeklenmez; karşılaştırılamaz görüntüleyicinin (21) kendi yakınlaştırması kalır (inlineZoom ona uygulanmaz). Boş / 0 / eksi / sayı değil → 100; 10–500'e çekilir. Adım ve uygulamanın sınırları akıştadır: ör. − / + düğmeleri inlineToolClick'te değeri hesaplayıp inlineZoom'a ve kendi PDF görüntüleyicisine yazar, metin öğesini ('125%') günceller.",
|
|
2616
|
+
"Yan yana kâğıtlar blok hizalıdır: her blok çifti (tabloda her satır) aynı satırda başlar; bir tarafta olmayan bloğun kesik çizgili yer tutucusu karşı taraftaki blokların satırlarını kaplar. Listeden seçince iki kâğıt o bloğa kayar. Belge her zaman bütün bölümleriyle çizilir: 'Yalnız değişen bölümler' anahtarı ve 'n bölüm değişmedi · Göster' daralması kullanıcı kararıyla kaldırıldı (2026-10-09, qm S-32; onlyChanged prop'u yok). Yalnız eski tarafta olan blok, yeni belgede içinde durduğu başlığın bölüm adını alır (başlıksız txt tarafı docx bölümünü bölmez, S-6). Değişiklik sınırı 5000 (S-8): değişmiş olarak eşleştirilecek öğe ya da sonuçtaki değişiklik sayısı 5000'i aşarsa karşılaştırma gösterilmez, 'Çok fazla değişiklik olduğu için karşılaştırma gösterilemiyor' kartı çıkar ve error { kind: 'tooMany' } yayılır (summary yok). Sürüm seçici bileşenin alt kenarına kadar uzar ve kendi içinde kayar (S-33). Esc dar ekran panelini yalnız görünüyorsa kapatır (S-7). Karşılaştırılamaz görüntüleyicinin pdf.js'i sayfanın globalThis'ine bir şey bırakmaz (S-34).",
|
|
2617
|
+
"pairChange setter'dır: seçiciden seçme ya da yer değiştirme oldId/newId'yi self'e yazar ve event.data = { oldId, newId } ile akışı çalıştırır; akış yeni çiftin files/fields/contextNote'unu yeniler. Kimlikler versions'taki tipiyle (sayı ya da metin) gider. Karşı tarafta seçili ve disabled sürüm seçilemez.",
|
|
2618
|
+
"selectionChange setter'dır: listeden seçme, önceki/sonraki, bölüm menüsü, Alt+↓/↑ ve değişikliği olan sayfa sekmesi (ızgara, pdf) ya da slayt seçimi (ilk değişikliği seçilir) selected'ı self'e yazar; akışa event.data = { selected (n), section, kind: add | del | mod } gider (prop'a yalnız selected yazılır). selected boş ya da listede yoksa ilk değişiklik seçilir. Sayaç tür süzgecine bağlıdır ('n / N'), sonda başa döner. selected dışarıdan (akış) değişince liste ve kâğıt o değişikliğe kayar; ancak komponent kendi seçimini setter'la yazdıktan sonra state'e bağlı selected'ın sonraki akış yazımları prop'a ulaşmıyor (platform davranışı, zeyrek-frontend docs/issues.md ARC-258). selectionChange kendi gezinme dışında da yayılır, SETTER'SIZ (prop'a yazmaz, yük aynı): karşılaştırma hazır olup ilk seçim yapılınca (açılış, çift değişimi — yeni sonuçta aynı n de yeni seçimdir) ve selected dışarıdan yazılıp seçim gerçekten değişince; aynı sonuçta aynı seçim yeniden bildirilmez, akış event.data.selected'ı state'e geri yazınca döngü olmaz. Okuma modunda görev kartının 'Seçili: <bölüm> · <tür>' satırı açılışta bundan dolar (tasarım B 7).",
|
|
2619
|
+
"Alanlar sekmesi dosya beklemeden açılır; durumu (Değişti / Eklendi / Kaldırıldı / Aynı) komponent HESAPLAR: gruplar grup adıyla, alanlar key ile eşlenir; boş → dolu Eklendi, dolu → boş Kaldırıldı; dizi değer öğe öğe (açılan öğe altı çizili yeşil + '· açıldı', kapanan üstü çizili turuncu). 'Yalnız değişenleri göster' varsayılan açık.",
|
|
2620
|
+
"Esc önce açık sürüm seçicisini, sonra açık bölüm menüsünü / liste panelini, sonra çekmeceyi kapatır (close yayar; Vazgeç de close; inline'da kapatmaz). Bileşenin kendi denetimi tıklanınca kalkarsa odak bileşende kalır (seçiciden seçince seçici düğmesi, bölüm menüsünden seçince menü düğmesi, liste panelinden seçince 'Değişiklikler' düğmesi, karttan Alanlar'a geçince Alanlar sekmesi, 'Dosyaları yan yana aç'ta görüntüleyici; öbür kartlarda çekmecenin kökü, inline'da görünüm anahtarı) — Alt+↓/↑ ve Esc çalışmaya devam eder. Açılışta odak başlığa gider, komponent kaldırılınca açan öğeye döner (inline'da ikisi de yok). 'Bu versiyonu aç' yalnız Eski kartta ve canOpen:true sürümde görünür → openVersion { id }.",
|
|
2621
|
+
"mode: drawer (tam görünüm) | inline (okuma modu kâğıdı); inlineView (marked | standard) yalnız inline'da, durumu uygulama tutar (inlineViewChange). view (side | unified) başlangıç değeridir, kullanıcı çekmecede değiştirir (olay yayılmaz); dar ekranda başlangıç birleşiktir.",
|
|
2622
|
+
"xlsx ↔ csv: csv tek sayfasıyla, karşı taraf çok sayfalıysa en benzer sayfayla eşlenir; öbür sayfalar sayfa sekmelerinde 'Karşılaştırılmadı' durumuyla görünür (değişiklik sayısına girmez, satırları işaretsiz), bant 'n sayfa karşılaştırılmadı.' der; csv tarafında adsız eşlenen sayfanın sekmesi listedeki grubun adıyla ('Liste'). Karşılaştırılmayan sayfa yoksa csv'de sekme yok.",
|
|
2623
|
+
"docx ↔ docx'te biçim farkı da 'Değişti' sayılır (f-10): metni aynı, kalınlığı / italiği / altı ya da üstü çizgisi / yazı rengi / vurgu rengi farklı paragraf, başlık, madde ya da tablo satırı mor çizgi + 'Değişti' alır, sözcük işareti yok, neyin değiştiği yazılmaz. Yazı tipi, punto ve stil tanımından gelen biçim sayılmaz; tür değişmişte, pdf ve pptx'te biçim karşılaştırılmaz.",
|
|
2624
|
+
"Dosya türü değişmişse (ör. docx → pdf, xlsx → csv; iki taraftan da metin çıkıyorsa) yalnız birleşik görünüm ve bilgi bandı: 'Dosya türü değişti: <eski etiket> <tür> → <yeni etiket> <tür>.' + 'İki dosyanın da metni çıkarıldı ve metin karşılaştırıldı.' (bir taraf pdf ise 'Bölüm başlıkları pdf'te sayfa içinden okunur; gezinme sayfa ve bölüm bazlıdır.') + 'Biçim ve sayfa düzeni farkı işaretlenmez.' + 'Belge formatı değiştiği için tam karşılaştırma yapılamıyor.'; çok sayfalı xlsx ↔ csv'de ardından 'n sayfa karşılaştırılmadı.'. Excel başka türe dönünce sayfa adı başlık sayılmaz (format kaynaklı).",
|
|
2625
|
+
"Metinler: arayüz metinleri uygulama dilinde (tr, en; diğer diller İngilizce) gelir; texts aynı anahtarlarla bunları ezer (ör. noFileText, lockedReason) ve uygulamaya özgü metinleri taşır: footer (alt bilgi sınır metni — verilirse her türde türün kendi metninin yerine geçer), pickerNote (seçicinin alt notu), fieldsNote (alanlar notu), permissionNote (hak yok kartının açıklaması), groups (seçici grup anahtarı → başlık, ör. { archive: 'Arşiv' })."
|
|
2626
|
+
],
|
|
2627
|
+
propNotes: {
|
|
2628
|
+
header: '{ code, title, type, ext } — başlığın altındaki rozet satırı (kod mono, ad, tür, dosya türü çipi).',
|
|
2629
|
+
versions: "[{ id, label, date, statusText, tone: ok | warn | info | mute | err, meta, note, group, disabled, disabledReason, canOpen }] — uygulamanın sürüm listesi (fazla alanlar yok sayılır). group boş ya da 'main' ana liste; diğer gruplar seçicide ayrı başlıkla (texts.groups) ve kesik çerçeveli rozetle. disabled sürüm pasif, nedeni disabledReason; SEÇİLİ sürüm disabled ise o sürümle karşılaştırma hakkı yoktur (kilit, hak yok kartı).",
|
|
2630
|
+
oldId: 'Eski taraftaki sürümün id’si; pairChange setter hedefi.',
|
|
2631
|
+
newId: 'Yeni taraftaki sürümün id’si; pairChange setter hedefi.',
|
|
2632
|
+
files: "{ [versionId]: { name, type: uzantı (docx, txt, xlsx, csv, pptx, pdf, png…), url | data, size (bayt), error ({ message, at } — her denemede ayırt edilebilir), missing (true: sürümün dosyası yok, istenmez) } } — yalnız seçili iki sürümün dosyası gerekir.",
|
|
2633
|
+
fields: "{ old: [{ group, items: [{ key, label, value }] }], new: [...] } — value metin ya da metin dizisi, boşsa null; durum komponentte hesaplanır.",
|
|
2634
|
+
contextNote: "{ title, rows: [{ label, value }] } — yeni sürümün bağlam notu (başlık ve etiket/değer satırları).",
|
|
2635
|
+
texts: "Arayüz metni ezmeleri (anahtar → metin, '{ad}' yer tutuculu) + footer, pickerNote, fieldsNote, permissionNote, groups.",
|
|
2636
|
+
mode: 'drawer — tam görünüm; inline — okuma modu: yalnız işaretli kâğıt + görünüm anahtarı, bölüm menüsü ve gezinme.',
|
|
2637
|
+
inlineView: "marked (varsayılan) | standard — inline kipte açık görünüm; inlineViewChange setter hedefi. standard'da bileşen yalnız anahtar satırını çizer, sayfa kendi standart görünümünü gösterir. State'e bağlıysa inlineViewChange akışı state'i de yazmalı (oldId/newId gibi).",
|
|
2638
|
+
inlineTools: "[{ key, kind: button | text | separator | menu, text, icon: { name }, isDisabled, place: end | start, showText, menuText, title, options: [{ key, text, isDisabled }] }] — inline satırında uygulamanın araçları; button'a basılınca inlineToolClick { key }, menu seçeneğinde inlineToolClick { key, item }. place start yalnız standart görünümde, anahtarın yanında. Sağ grup sığmayınca menu dışındaki düğmeler '⋯' listesine girer (ADR 0020).",
|
|
2639
|
+
inlineZoom: 'Yüzde, varsayılan 100 (10–500) — inline kipte işaretli görünümün ölçeği; adım ve sınırları akış belirler.',
|
|
2640
|
+
view: 'side | unified — başlangıç görünümü.',
|
|
2641
|
+
selected: 'Seçili değişikliğin n’si (1’den); selectionChange setter hedefi. Akış yazınca liste ve kâğıt o değişikliğe kayar.'
|
|
2642
|
+
}
|
|
2643
|
+
},
|
|
2658
2644
|
'process-timeline': {
|
|
2659
2645
|
summary: 'Süreç örneğinin defteri (kim, ne, hangi karar, yorum) ardından sıradaki ve gelecek adımlar; bölge yeniden başlatma turları ve geçersizleşen görevler işaretli.',
|
|
2660
2646
|
guide: 'bpm',
|
|
@@ -2825,24 +2811,6 @@ export const componentKnowledge = {
|
|
|
2825
2811
|
* `ComponentHeightType` · `ComponentAlignType`) — platformun kabul ettiği kümenin tek tanımı
|
|
2826
2812
|
* orasıdır ve backend artık tanımadığı jetonu 400 ile reddeder.
|
|
2827
2813
|
*/
|
|
2828
|
-
/**
|
|
2829
|
-
* SATIR İÇİ stil alanları — `style` prop'unun KEBAB-CASE isteyen dalları (TB-129 · S2-39).
|
|
2830
|
-
*
|
|
2831
|
-
* Kural tek komponente özgü değil bir YAZIM SÖZLEŞMESİDİR: `style.root` emotion `css()` bloğudur ve
|
|
2832
|
-
* camelCase okur, `style.thead|th|tr|td` ise satır içi `style` attribute'una basılır
|
|
2833
|
-
* (`column-view.ts` `toStyleString` anahtarı OLDUĞU GİBİ yazar) — orada `fontSize` sessizce düşer,
|
|
2834
|
-
* `font-size` çalışır. Gateway'in F-06 çevirisi bu dalları da camelCase yapıp stili öldürüyordu
|
|
2835
|
-
* (ölçüm: otomotiv liste tablosu, 2026-09-20); artık bu sözlükteki alanların ALTINA hiç dokunulmaz.
|
|
2836
|
-
*
|
|
2837
|
-
* Sözlüğe yeni satır eklerken ölçüt: alanın değeri DOM'un `style` attribute'una string olarak mı
|
|
2838
|
-
* yazılıyor? Öyleyse buraya girer; emotion bloğuysa girmez.
|
|
2839
|
-
*/
|
|
2840
|
-
export const INLINE_STYLE_FIELDS_BY_TYPE = {
|
|
2841
|
-
table: ['thead', 'th', 'tr', 'td']
|
|
2842
|
-
};
|
|
2843
|
-
export function inlineStyleFields(componentType) {
|
|
2844
|
-
return componentType === undefined ? undefined : INLINE_STYLE_FIELDS_BY_TYPE[componentType];
|
|
2845
|
-
}
|
|
2846
2814
|
export const APPEARANCE_TOKEN_SETS = {
|
|
2847
2815
|
paddingType: {
|
|
2848
2816
|
values: ['none', 'normal', 'custom'],
|
|
@@ -2898,17 +2866,6 @@ export const STATE_FLAG_NOTES = {
|
|
|
2898
2866
|
* başlık çeviriye bağlıdır.
|
|
2899
2867
|
*/
|
|
2900
2868
|
export const INTERNAL_ROLES_BY_TYPE = {
|
|
2901
|
-
table: [
|
|
2902
|
-
'pager-prev',
|
|
2903
|
-
'pager-next',
|
|
2904
|
-
'pager-page (sayfa numarası kutusu)',
|
|
2905
|
-
'pager-limit (sayfa boyu seçimi)',
|
|
2906
|
-
'pager-refresh',
|
|
2907
|
-
"sort-<kolon slug'ı>",
|
|
2908
|
-
'colmenu',
|
|
2909
|
-
'search (arama kutusu, isSearchable)',
|
|
2910
|
-
'row-<0 tabanlı sıra; sayfa değişince yeniden numaralanır>'
|
|
2911
|
-
],
|
|
2912
2869
|
kanban: [
|
|
2913
2870
|
"card-<kart id'si (idField değeri; yoksa 'card-<sıra>' yani '__card-card-<sıra>')>",
|
|
2914
2871
|
"col-<kolon value'su> (bırakma hedefi)"
|
|
@@ -2942,6 +2899,19 @@ export const knowledgeNote = 'knowledge alanı elle doğrulanmış davranış bi
|
|
|
2942
2899
|
export function knowledgeFor(slug) {
|
|
2943
2900
|
return slug ? componentKnowledge[slug] : undefined;
|
|
2944
2901
|
}
|
|
2902
|
+
export const RETIRED_COMPONENTS = {
|
|
2903
|
+
table: {
|
|
2904
|
+
replacedBy: 'datatable',
|
|
2905
|
+
note: "KALDIRILDI (2026-09-30): bu tip frontend kataloğunda yok; kayıt defterinde eşitleme silmediği için duruyor. Yeni düğümde KULLANMAYIN — datatable kullanın (bu tipte yeni düğüm — add_component, page_create, layout_create — PAGE-051 ile reddedilir). Runtime bu tiple kayıtlı düğümü datatable ile çizer (takma ad): aşağıdaki prop'lar ve olaylar eski bileşenindir, doubleClick · select · selectionChange · pagination · filter · sort · search · rowChange HİÇ yayılmaz (bağ kaydedilir, ölü kalır). Karşılıkları: tek mount akışı (süzme/sıralama/sayfa değişimi onu yeniden tetikler), rowClick / rowDoubleClick, editMode + save — component_get('datatable'), platform_guide('page') Kural 1e ve 7b."
|
|
2906
|
+
},
|
|
2907
|
+
'incremental-input': {
|
|
2908
|
+
replacedBy: 'incrementalinput',
|
|
2909
|
+
note: "KALDIRILDI: bu bir ESKİ TİP ADIDIR — bileşenin slug'ı incrementalinput oldu. Yeni düğümde KULLANMAYIN (bu adla yeni düğüm PAGE-051 ile reddedilir); bu adla kayıtlı düğümü runtime incrementalinput ile çizer. Sözlük: component_get('incrementalinput')."
|
|
2910
|
+
}
|
|
2911
|
+
};
|
|
2912
|
+
export function retiredComponent(slug) {
|
|
2913
|
+
return slug !== undefined && Object.hasOwn(RETIRED_COMPONENTS, slug) ? RETIRED_COMPONENTS[slug] : undefined;
|
|
2914
|
+
}
|
|
2945
2915
|
/* ─────────────────────────── TB-123 · katalog doğrulaması ─────────────────────────── */
|
|
2946
2916
|
/**
|
|
2947
2917
|
* ENUM TİPLERİ — seçenek listesi gerçekten bir DEĞER KÜMESİ olan prop tipleri.
|
|
@@ -2950,8 +2920,8 @@ export function knowledgeFor(slug) {
|
|
|
2950
2920
|
* `switcher` (78/78) prop'larının HEPSİ seçenek taşır ve seçeneklerin hepsi string'dir. `number`
|
|
2951
2921
|
* tipinde ise `options` bir ENUM DEĞİL sınır çiftidir (`opacity` → [0, 100], `transitionMs` →
|
|
2952
2922
|
* [0, 1000]) ve `component` tipinde izinli komponent tipi filtresidir — ikisi de denetlenmez.
|
|
2953
|
-
* `multiselect` kapalı bir küme taşır ama değeri dizidir;
|
|
2954
|
-
*
|
|
2923
|
+
* `multiselect` kapalı bir küme taşır ama değeri dizidir; DEĞER denetimine girmez (serbest değer —
|
|
2924
|
+
* `"image/*"` — platformda da geçer), yalnız BİÇİMİ denetlenir: `multiselect` haritası (g-23).
|
|
2955
2925
|
*/
|
|
2956
2926
|
const ENUM_PROP_TYPES = new Set(['dropdown', 'radio', 'switcher']);
|
|
2957
2927
|
/**
|
|
@@ -2967,17 +2937,22 @@ export function catalogTypeRules(components) {
|
|
|
2967
2937
|
if (slug === undefined || !Array.isArray(declared))
|
|
2968
2938
|
continue;
|
|
2969
2939
|
const props = new Map();
|
|
2940
|
+
const multiselect = new Map();
|
|
2970
2941
|
for (const entry of declared) {
|
|
2971
2942
|
const name = typeof entry?.name === 'string' ? entry.name : undefined;
|
|
2972
2943
|
if (name === undefined || name === '')
|
|
2973
2944
|
continue;
|
|
2974
|
-
const
|
|
2945
|
+
const type = String(entry.type ?? '');
|
|
2946
|
+
const declaredOptions = Array.isArray(entry.options)
|
|
2975
2947
|
? entry.options.map(option => option?.value).filter((value) => typeof value === 'string')
|
|
2976
|
-
:
|
|
2948
|
+
: [];
|
|
2949
|
+
const options = ENUM_PROP_TYPES.has(type) ? declaredOptions : undefined;
|
|
2977
2950
|
props.set(name, options !== undefined && options.length > 0 ? options : undefined);
|
|
2951
|
+
if (type === 'multiselect')
|
|
2952
|
+
multiselect.set(name, declaredOptions);
|
|
2978
2953
|
}
|
|
2979
2954
|
if (props.size > 0)
|
|
2980
|
-
rules.set(slug, { props });
|
|
2955
|
+
rules.set(slug, { props, multiselect });
|
|
2981
2956
|
}
|
|
2982
2957
|
return rules;
|
|
2983
2958
|
}
|
|
@@ -3032,6 +3007,22 @@ export function schemaCatalogErrors(nodes, rules) {
|
|
|
3032
3007
|
}
|
|
3033
3008
|
const options = typeRules.props.get(name);
|
|
3034
3009
|
const value = staticPropValue(raw);
|
|
3010
|
+
const multiselectOptions = typeRules.multiselect.get(name);
|
|
3011
|
+
if (multiselectOptions !== undefined) {
|
|
3012
|
+
const wellFormed = value === undefined || value === null || typeof value === 'string'
|
|
3013
|
+
|| (Array.isArray(value) && value.every(item => typeof item === 'string'));
|
|
3014
|
+
if (!wellFormed) {
|
|
3015
|
+
const example = JSON.stringify(multiselectOptions.length > 0 ? multiselectOptions.slice(0, 2) : ['pdf', 'docx']);
|
|
3016
|
+
errors.push({
|
|
3017
|
+
componentId,
|
|
3018
|
+
path: `props.${name}`,
|
|
3019
|
+
rule: 'invalid-multiselect-value',
|
|
3020
|
+
message: `'${name}' seçenek değerlerinin JSON dizisini (örn. ${example}) ya da tek virgüllü metni alır; gelen ${JSON.stringify(value)} ikisi de değil.`,
|
|
3021
|
+
suggestions: [...multiselectOptions]
|
|
3022
|
+
});
|
|
3023
|
+
}
|
|
3024
|
+
continue;
|
|
3025
|
+
}
|
|
3035
3026
|
if (options === undefined || value === undefined || value === null || value === '')
|
|
3036
3027
|
continue;
|
|
3037
3028
|
if (options.includes(String(value)))
|
|
@@ -1,23 +1,6 @@
|
|
|
1
1
|
const NO_DATA = { payload: {} };
|
|
2
2
|
const valueChange = (type) => ({ payload: { value: type } });
|
|
3
3
|
export const componentEventContracts = {
|
|
4
|
-
table: {
|
|
5
|
-
mount: NO_DATA,
|
|
6
|
-
pagination: { payload: { offset: 'number', limit: 'number' } },
|
|
7
|
-
filter: { payload: { filters: 'Array<{ field, operator, value, filterType, conditionType }>', offset: 'number' } },
|
|
8
|
-
sort: { payload: { sortField: 'string (kolonun name alanı)', sortType: "'asc' | 'desc' | '' (temizlendi)", offset: 'number' } },
|
|
9
|
-
search: {
|
|
10
|
-
payload: {
|
|
11
|
-
searchText: 'string (kutuya yazılan metin, KIRPILMAZ; kutu temizlenince "")',
|
|
12
|
-
offset: 'number (0’a döner)'
|
|
13
|
-
},
|
|
14
|
-
reads: 'isSearchable:true iken araç çubuğundaki kutudan: yazmaya ara verince (400 ms), Enter’da ve kutu boşaltılınca hemen yayılır; aynı metin ikinci kez yayılmaz (Enter dahil). Enter formu göndermez. Tablo satırları kendisi SÜZMEZ — akış self.searchText ile sorguyu yeniden çalıştırıp rows’u yazar'
|
|
15
|
-
},
|
|
16
|
-
select: { payload: {}, reads: 'self.selectedRow — satır tıklaması rowSelection:none dahil HER kipte yazar ve bu olayı çalıştırır; isReadonly:true iken hiç çalışmaz' },
|
|
17
|
-
selectionChange: { payload: {}, reads: 'self.selectedRows (dizi) + self.selectedRow — yalnız multi kipindeki onay kutularından (satır tıklaması tetiklemez)' },
|
|
18
|
-
doubleClick: { payload: {}, reads: 'self.selectedRow' },
|
|
19
|
-
rowChange: { payload: {}, reads: 'self.selectedRow (düzenlenen satır, YENİ değeriyle) — satır nesnesi self.rows içinde de yerinde güncellenir; değer gerçekten değişmediyse olay çalışmaz' }
|
|
20
|
-
},
|
|
21
4
|
datatable: {
|
|
22
5
|
mount: { payload: {}, reads: 'self.filters · self.sortField · self.sortType · self.offset · self.limit' },
|
|
23
6
|
save: {
|
|
@@ -524,7 +507,7 @@ export const componentEventContracts = {
|
|
|
524
507
|
}
|
|
525
508
|
},
|
|
526
509
|
'language-selector': {
|
|
527
|
-
mount: { ...NO_DATA, reads: 'self.value BOŞTUR: enjekte edilen geçerli dil düğümün prop kaydına yazılmıyor, oraya yalnız change yükü yazılıyor (ölçüldü 2026-09-18
|
|
510
|
+
mount: { ...NO_DATA, reads: 'self.value BOŞTUR: enjekte edilen geçerli dil düğümün prop kaydına yazılmıyor, oraya yalnız change yükü yazılıyor (ölçüldü 2026-09-18). Dili mount’ta okumak için Page.language (2026-10-14 frontend, uzak kurulumda dağıtımdan sonra); eski kurulumda dili okuyacak akışı change’e bağla' },
|
|
528
511
|
change: {
|
|
529
512
|
payload: { value: 'string (seçilen dil kodu, projenin yazdığı biçimde)' },
|
|
530
513
|
reads: 'Yük düğümün kendi value prop’una yazılır (yazmayı machine.onEmit yapar, çünkü olayda data var), akış self.value ile okur; aynı yük params kanalından da iner, yani event.data.value da dolu. Dili DEĞİŞTİREN yazma bu değildir: render katmanı aynı olayda machine.setLanguage(value) + setAppLocale(value) çağırır. Yalnız kullanıcı seçiminde yayılır; akışın value’ya yazması hiçbir şeyi değiştirmez (enjekte edilen değer ezer)'
|
|
@@ -798,6 +781,39 @@ export const componentEventContracts = {
|
|
|
798
781
|
reads: "self'e yazılmaz — event.data ile oku; okumayanlara bildirim gönderen akışı çağır"
|
|
799
782
|
}
|
|
800
783
|
},
|
|
784
|
+
'version-compare': {
|
|
785
|
+
mount: NO_DATA,
|
|
786
|
+
pairChange: {
|
|
787
|
+
payload: { oldId: 'string | number', newId: 'string | number' },
|
|
788
|
+
reads: "setter: oldId/newId self'e yazılır; event.data = { oldId, newId } — akış yeni çiftin files/fields/contextNote'unu yeniler"
|
|
789
|
+
},
|
|
790
|
+
fileRequest: {
|
|
791
|
+
payload: { id: 'string | number (dosyası gereken sürüm)' },
|
|
792
|
+
reads: "self'e yazılmaz — event.data.id ile oku; akış dosyayı alıp files[id] = { name, type, data, size } yazar, alamazsa files[id].error = { message, at } yazar (at: deneme zamanı). Tekrar dene fileRequest'i yeniden yayar ve files[id]'nin İÇERİĞİ öncekinden farklı olana dek bekler — hata kaydı her denemede ayırt edilebilir olmalı (aynı { error: true } yeniden yazılırsa kart beklemede kalır). Dosya gelip sonra files'tan düşerse yeniden istenir"
|
|
793
|
+
},
|
|
794
|
+
openVersion: { payload: { id: 'string | number' }, reads: "self'e yazılmaz — event.data.id ile oku" },
|
|
795
|
+
summary: {
|
|
796
|
+
payload: { all: 'number', add: 'number', del: 'number', mod: 'number' },
|
|
797
|
+
reads: "self'e yazılmaz — event.data ile oku; karşılaştırma bitince bir kez — karşılaştırılamaz sonuçta (görsel, taranmış pdf) yayılmaz"
|
|
798
|
+
},
|
|
799
|
+
selectionChange: {
|
|
800
|
+
payload: { selected: 'number (değişikliğin n’si)', section: 'string (değişikliğin bölümü / grubu)', kind: "'add' | 'del' | 'mod'" },
|
|
801
|
+
reads: "kendi gezinmede setter: yalnız selected self'e yazılır; event.data = { selected, section, kind } — okuma modunda görev çubuğunun 'Seçili: <bölüm> · <tür>' satırı. Açılışta / çift değişince (ilk seçim) ve selected dışarıdan yazılıp seçim değişince de yayılır, setter'sız (self'e yazılmaz); aynı seçim yeniden yayılmaz — akış selected'ı geri yazınca döngü olmaz"
|
|
802
|
+
},
|
|
803
|
+
inlineViewChange: {
|
|
804
|
+
payload: { inlineView: "'marked' | 'standard'" },
|
|
805
|
+
reads: "setter: inlineView self'e yazılır; event.data = { inlineView } — inline kipte 'İşaretli / Standart görünüm' anahtarı; sayfa standard'da kendi görüntüleyicisini gösterir, durumu (state) akış tutar"
|
|
806
|
+
},
|
|
807
|
+
inlineToolClick: {
|
|
808
|
+
payload: { key: 'string (basılan inlineTools düğmesinin ya da seçeneği seçilen menu öğesinin key’i)', item: 'string? (yalnız menu öğesinde: seçilen options[].key)' },
|
|
809
|
+
reads: "self'e yazılmaz — event.data.key (menu öğesinde ayrıca event.data.item) ile oku; inline satırındaki uygulama düğmesi (ör. yakınlaştır, indir, yazdır, tam ekran) ya da menu öğesinin seçeneği (ör. versiyon). Sağ grup sığmayınca '⋯' listesinden seçilen düğme satırdakiyle AYNI yükü yayar (ADR 0020). isDisabled düğme / seçenek yaymaz; text / separator öğesi basılmaz"
|
|
810
|
+
},
|
|
811
|
+
close: { payload: {}, reads: 'yük yok — kapat düğmesi, Esc ya da yüklemede Vazgeç' },
|
|
812
|
+
error: {
|
|
813
|
+
payload: { id: 'string | number? (karşılaştırma worker’ı çökerse ya da karşılaştırmanın kendisi hata verirse yok)', kind: "'fetch' | 'read' | 'unsupported' | 'tooMany'", message: 'string? (fetch: files[id].error.message ya da HTTP durumu; read: çözme/okuma hatası; unsupported: dosya türü; tooMany: değişiklik sayısı 5000 sınırını aştı — kimliksiz, kart gösterilir)' },
|
|
814
|
+
reads: "self'e yazılmaz — event.data ile oku"
|
|
815
|
+
}
|
|
816
|
+
},
|
|
801
817
|
'case-view': {
|
|
802
818
|
mount: NO_DATA,
|
|
803
819
|
action: {
|