@appaflytech/zeyrek-ai-mcp 0.0.41 → 0.0.43
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 +27 -97
- package/dist/knowledge/componentEvents.js +1 -18
- package/dist/knowledge/mobileComponentCatalog.js +114 -15
- package/dist/knowledge/mobileComponentEvents.js +41 -0
- package/dist/knowledge/motionResolve.js +252 -0
- package/dist/knowledge/normalize.js +87 -59
- 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 +52 -1
- package/dist/knowledge/styleResolveNative.js +88 -4
- package/dist/platform/capture/actions.js +4 -1
- package/dist/platform/capture/capture.js +10 -13
- package/dist/platform/capture/persistent-browser.js +130 -0
- 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-list-detail-form.json +4 -3
- package/dist/resources/examples/mobile-scan-code.json +285 -0
- package/dist/resources/guides/component.md +3 -3
- package/dist/resources/guides/expressions.md +2 -2
- package/dist/resources/guides/merge.md +98 -18
- package/dist/resources/guides/microservice.md +2 -2
- 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 +27 -55
- package/dist/resources/guides/page.md +182 -121
- package/dist/resources/guides/translation.md +26 -0
- 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/layouts.js +7 -2
- package/dist/tools/merges.js +29 -9
- package/dist/tools/pages.js +129 -127
- package/dist/tools/platformInfo.js +3 -2
- package/dist/tools/profileWrite.js +2 -2
- package/dist/tools/schemaOps.js +132 -34
- package/dist/tools/screenWrite.js +1 -1
- package/dist/tools/screens.js +3 -3
- 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.",
|
|
@@ -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.",
|
|
@@ -2865,24 +2811,6 @@ export const componentKnowledge = {
|
|
|
2865
2811
|
* `ComponentHeightType` · `ComponentAlignType`) — platformun kabul ettiği kümenin tek tanımı
|
|
2866
2812
|
* orasıdır ve backend artık tanımadığı jetonu 400 ile reddeder.
|
|
2867
2813
|
*/
|
|
2868
|
-
/**
|
|
2869
|
-
* SATIR İÇİ stil alanları — `style` prop'unun KEBAB-CASE isteyen dalları (TB-129 · S2-39).
|
|
2870
|
-
*
|
|
2871
|
-
* Kural tek komponente özgü değil bir YAZIM SÖZLEŞMESİDİR: `style.root` emotion `css()` bloğudur ve
|
|
2872
|
-
* camelCase okur, `style.thead|th|tr|td` ise satır içi `style` attribute'una basılır
|
|
2873
|
-
* (`column-view.ts` `toStyleString` anahtarı OLDUĞU GİBİ yazar) — orada `fontSize` sessizce düşer,
|
|
2874
|
-
* `font-size` çalışır. Gateway'in F-06 çevirisi bu dalları da camelCase yapıp stili öldürüyordu
|
|
2875
|
-
* (ölçüm: otomotiv liste tablosu, 2026-09-20); artık bu sözlükteki alanların ALTINA hiç dokunulmaz.
|
|
2876
|
-
*
|
|
2877
|
-
* Sözlüğe yeni satır eklerken ölçüt: alanın değeri DOM'un `style` attribute'una string olarak mı
|
|
2878
|
-
* yazılıyor? Öyleyse buraya girer; emotion bloğuysa girmez.
|
|
2879
|
-
*/
|
|
2880
|
-
export const INLINE_STYLE_FIELDS_BY_TYPE = {
|
|
2881
|
-
table: ['thead', 'th', 'tr', 'td']
|
|
2882
|
-
};
|
|
2883
|
-
export function inlineStyleFields(componentType) {
|
|
2884
|
-
return componentType === undefined ? undefined : INLINE_STYLE_FIELDS_BY_TYPE[componentType];
|
|
2885
|
-
}
|
|
2886
2814
|
export const APPEARANCE_TOKEN_SETS = {
|
|
2887
2815
|
paddingType: {
|
|
2888
2816
|
values: ['none', 'normal', 'custom'],
|
|
@@ -2938,17 +2866,6 @@ export const STATE_FLAG_NOTES = {
|
|
|
2938
2866
|
* başlık çeviriye bağlıdır.
|
|
2939
2867
|
*/
|
|
2940
2868
|
export const INTERNAL_ROLES_BY_TYPE = {
|
|
2941
|
-
table: [
|
|
2942
|
-
'pager-prev',
|
|
2943
|
-
'pager-next',
|
|
2944
|
-
'pager-page (sayfa numarası kutusu)',
|
|
2945
|
-
'pager-limit (sayfa boyu seçimi)',
|
|
2946
|
-
'pager-refresh',
|
|
2947
|
-
"sort-<kolon slug'ı>",
|
|
2948
|
-
'colmenu',
|
|
2949
|
-
'search (arama kutusu, isSearchable)',
|
|
2950
|
-
'row-<0 tabanlı sıra; sayfa değişince yeniden numaralanır>'
|
|
2951
|
-
],
|
|
2952
2869
|
kanban: [
|
|
2953
2870
|
"card-<kart id'si (idField değeri; yoksa 'card-<sıra>' yani '__card-card-<sıra>')>",
|
|
2954
2871
|
"col-<kolon value'su> (bırakma hedefi)"
|
|
@@ -2982,6 +2899,19 @@ export const knowledgeNote = 'knowledge alanı elle doğrulanmış davranış bi
|
|
|
2982
2899
|
export function knowledgeFor(slug) {
|
|
2983
2900
|
return slug ? componentKnowledge[slug] : undefined;
|
|
2984
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
|
+
}
|
|
2985
2915
|
/* ─────────────────────────── TB-123 · katalog doğrulaması ─────────────────────────── */
|
|
2986
2916
|
/**
|
|
2987
2917
|
* ENUM TİPLERİ — seçenek listesi gerçekten bir DEĞER KÜMESİ olan prop tipleri.
|
|
@@ -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)'
|