@appaflytech/zeyrek-ai-mcp 0.0.33 → 0.0.35
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/.env.example +0 -15
- package/dist/config.js +0 -11
- package/dist/index.js +0 -2
- package/dist/knowledge/boxSections.js +184 -0
- package/dist/knowledge/componentCatalog.js +634 -255
- package/dist/knowledge/componentEvents.js +38 -32
- package/dist/knowledge/layoutSummary.js +2 -140
- package/dist/knowledge/normalize.js +144 -117
- package/dist/knowledge/rules.js +42 -291
- package/dist/knowledge/styleResolve.js +53 -58
- package/dist/knowledge/themeResolve.js +4 -4
- package/dist/knowledge/themeSchema.js +2 -1
- package/dist/observability/trace.js +1 -1
- package/dist/platform/diagnostics.js +4 -10
- package/dist/platform/domSummary.js +1 -1
- package/dist/platform/http.js +7 -23
- package/dist/platform/responses.js +2 -6
- package/dist/platform/screenshot.js +1162 -0
- package/dist/platform/secrets.js +0 -9
- package/dist/platform/strictArguments.js +12 -68
- package/dist/platform/tokenVault.js +4 -187
- package/dist/resources/examples/layout-app-shell.json +707 -229
- package/dist/resources/examples/page-flex-sections.json +1 -1
- package/dist/resources/guides/component.md +6 -14
- package/dist/resources/guides/entity.md +5 -3
- package/dist/resources/guides/expressions.md +5 -14
- package/dist/resources/guides/functions.md +1 -1
- package/dist/resources/guides/layout.md +58 -55
- package/dist/resources/guides/microservice.md +2 -9
- package/dist/resources/guides/middleware.md +2 -34
- package/dist/resources/guides/page.md +179 -256
- package/dist/resources/guides/theme.md +3 -8
- package/dist/resources/guides/translation.md +1 -1
- package/dist/resources/guides/workflow.md +1 -7
- package/dist/resources/schema-fingerprint.json +4 -4
- package/dist/resources/schemas/GlobalFunctionUpdateResultDto.json +1 -3
- package/dist/resources/schemas/MicroserviceDto.json +2 -2
- package/dist/server.js +1 -7
- package/dist/tools/applications.js +3 -60
- package/dist/tools/components.js +16 -103
- package/dist/tools/datasources.js +1 -1
- package/dist/tools/designSchemaPatch.js +19 -23
- package/dist/tools/externalComponents.js +4 -25
- package/dist/tools/flows.js +13 -80
- package/dist/tools/layouts.js +20 -48
- package/dist/tools/microservices.js +10 -32
- package/dist/tools/pages.js +115 -396
- package/dist/tools/platformInfo.js +2 -7
- package/dist/tools/rows.js +1 -7
- package/dist/tools/schemaOps.js +4 -35
- package/dist/tools/screenWrite.js +37 -25
- package/dist/tools/screens.js +4 -91
- package/dist/tools/variables.js +5 -11
- package/package.json +2 -2
- package/dist/knowledge/access.js +0 -802
- package/dist/knowledge/case.js +0 -41
- package/dist/knowledge/connectDataBind.js +0 -819
- package/dist/knowledge/connectDataDefinition.js +0 -341
- package/dist/knowledge/connectDataExecute.js +0 -93
- package/dist/knowledge/connectDataRules.js +0 -128
- package/dist/knowledge/decision.js +0 -121
- package/dist/knowledge/expressionPrelude.js +0 -59
- package/dist/knowledge/microserviceParameters.js +0 -58
- package/dist/knowledge/mining.js +0 -94
- package/dist/knowledge/mobileComponentCatalog.js +0 -864
- package/dist/knowledge/mobileComponentEvents.js +0 -239
- package/dist/knowledge/mobileStore.js +0 -227
- package/dist/knowledge/platform/lint.js +0 -385
- package/dist/knowledge/platform/mobile.js +0 -142
- package/dist/knowledge/platform/mobileLayoutLint.js +0 -324
- package/dist/knowledge/platform/mobileRules.js +0 -231
- package/dist/knowledge/platform/mobileSpacing.js +0 -82
- package/dist/knowledge/platform/mobileTabs.js +0 -108
- package/dist/knowledge/platform/nativeBoxModel.js +0 -44
- package/dist/knowledge/platform/profile.js +0 -25
- package/dist/knowledge/platform/resolve.js +0 -122
- package/dist/knowledge/platform/web.js +0 -39
- package/dist/knowledge/process.js +0 -510
- package/dist/knowledge/rowFilter.js +0 -43
- package/dist/knowledge/styleResolveNative.js +0 -527
- package/dist/platform/argumentAliases.js +0 -128
- package/dist/platform/bodyFile.js +0 -103
- package/dist/platform/capture/actions.js +0 -333
- package/dist/platform/capture/browser.js +0 -1
- package/dist/platform/capture/capture.js +0 -659
- package/dist/platform/capture/console-log.js +0 -122
- package/dist/platform/capture/index.js +0 -11
- package/dist/platform/capture/readiness.js +0 -103
- package/dist/platform/capture/summary.js +0 -77
- package/dist/platform/capture/target.js +0 -5
- package/dist/platform/capture/targets/studio-mobile.js +0 -15
- package/dist/platform/capture/targets/studio-web.js +0 -5
- package/dist/platform/impersonation.js +0 -45
- package/dist/platform/jsonArray.js +0 -24
- package/dist/platform/schemaReadMemory.js +0 -60
- package/dist/resources/examples/bpm-gorev-kontrol.json +0 -294
- package/dist/resources/examples/bpm-iso-dokuman.json +0 -228
- package/dist/resources/examples/bpm-satinalma.json +0 -376
- package/dist/resources/examples/connect-data-convert-verify.json +0 -107
- package/dist/resources/examples/connect-data-dropdown-roles.json +0 -66
- package/dist/resources/examples/connect-data-edit-m2m.json +0 -73
- package/dist/resources/examples/connect-data-query-params.json +0 -50
- package/dist/resources/examples/connect-data-table-entity.json +0 -147
- package/dist/resources/examples/connect-data-workflow-microservice.json +0 -65
- package/dist/resources/examples/mobile-app-shell-drawer.json +0 -244
- package/dist/resources/examples/mobile-app-shell-stack.json +0 -157
- package/dist/resources/examples/mobile-app-shell-tab.json +0 -208
- package/dist/resources/examples/mobile-form-screen.json +0 -365
- package/dist/resources/examples/mobile-list-detail-form.json +0 -703
- package/dist/resources/guides/access.md +0 -796
- package/dist/resources/guides/bpm.md +0 -686
- package/dist/resources/guides/case.md +0 -153
- package/dist/resources/guides/decision.md +0 -185
- package/dist/resources/guides/mobile-layout.md +0 -193
- package/dist/resources/guides/mobile.md +0 -578
- package/dist/resources/read.js +0 -41
- package/dist/resources/schemas/AccessExplanationDto.json +0 -144
- package/dist/resources/schemas/AccessMatrixDto.json +0 -170
- package/dist/resources/schemas/AccessPermissionDto.json +0 -57
- package/dist/resources/schemas/AccessPolicyDto.json +0 -223
- package/dist/resources/schemas/AccessResourceDto.json +0 -86
- package/dist/resources/schemas/AppSessionDto.json +0 -53
- package/dist/resources/schemas/ConnectDataDescribeDto.json +0 -344
- package/dist/resources/schemas/ConnectDataRequestModel.json +0 -202
- package/dist/resources/schemas/ConnectDataResultDto.json +0 -421
- package/dist/resources/schemas/ConnectorCredentialDto.json +0 -70
- package/dist/resources/schemas/ConvertConnectDataToMicroserviceCommand.json +0 -37
- package/dist/resources/schemas/CreateAccessPolicyCommand.json +0 -209
- package/dist/resources/schemas/CreateDecisionCommand.json +0 -221
- package/dist/resources/schemas/CreateProcessDefinitionCommand.json +0 -1337
- package/dist/resources/schemas/DecisionDto.json +0 -302
- package/dist/resources/schemas/DetachConnectDataMicroserviceCommand.json +0 -28
- package/dist/resources/schemas/ExplainAccessQuery.json +0 -33
- package/dist/resources/schemas/GenerateProcessDocumentCommand.json +0 -116
- package/dist/resources/schemas/OrganizationProjectDto.json +0 -335
- package/dist/resources/schemas/OrganizationSchemaDto.json +0 -196
- package/dist/resources/schemas/OrganizationSchemaVersionDto.json +0 -207
- package/dist/resources/schemas/PatchProcessDefinitionCommand.json +0 -76
- package/dist/resources/schemas/ProcessDefinitionDto.json +0 -1480
- package/dist/resources/schemas/ProcessSimulationDto.json +0 -96
- package/dist/resources/schemas/SaveConnectorCredentialCommand.json +0 -90
- package/dist/resources/schemas/SaveProcessEventSourceCommand.json +0 -61
- package/dist/resources/schemas/SaveProcessMailSourceCommand.json +0 -89
- package/dist/resources/schemas/SignProcessTaskCommand.json +0 -73
- package/dist/resources/schemas/SimulateProcessDefinitionQuery.json +0 -92
- package/dist/resources/schemas/StartMobileBuildCommand.json +0 -54
- package/dist/resources/schemas/UpdateAccessPolicyCommand.json +0 -209
- package/dist/resources/schemas/UpdateDecisionCommand.json +0 -216
- package/dist/resources/schemas/UpdateProcessDefinitionCommand.json +0 -1357
- package/dist/resources/schemas/UpsertMobileStoreSettingsCommand.json +0 -259
- package/dist/resources/schemas/ValidateProcessDefinitionQuery.json +0 -1339
- package/dist/tools/accessOperations.js +0 -135
- package/dist/tools/accessPolicies.js +0 -170
- package/dist/tools/accessRuntime.js +0 -203
- package/dist/tools/bpm.js +0 -343
- package/dist/tools/bpmGovernance.js +0 -266
- package/dist/tools/bpmOperations.js +0 -230
- package/dist/tools/bpmReporting.js +0 -154
- package/dist/tools/bpmRouting.js +0 -150
- package/dist/tools/bpmRuntime.js +0 -396
- package/dist/tools/case.js +0 -178
- package/dist/tools/caseRuntime.js +0 -89
- package/dist/tools/connectData.js +0 -449
- package/dist/tools/connectors.js +0 -193
- package/dist/tools/decisions.js +0 -206
- package/dist/tools/mobile.js +0 -221
- package/dist/tools/mobileStore.js +0 -268
- package/dist/tools/modules.js +0 -48
- package/dist/tools/organizationStructure.js +0 -137
- package/dist/tools/profileWrite.js +0 -92
|
@@ -99,25 +99,26 @@ export const componentEventContracts = {
|
|
|
99
99
|
mount: NO_DATA,
|
|
100
100
|
change: {
|
|
101
101
|
payload: { value: 'FilterGroup (iç içe and/or kural ağacı)', jexl: 'string (aynı ağacın hazır jexl ifadesi)' },
|
|
102
|
-
reads: "setter yalnız `value`yi self’e yazar; `jexl` YALNIZ event.data’dadır (params) — sorguya bağlayacağın alan odur"
|
|
102
|
+
reads: "setter yalnız `value`yi self’e yazar; `jexl` YALNIZ event.data’dadır (params) — sorguya bağlayacağın alan odur. `value` (ağaç) de event.data’da gelir — State’e geri yazmak için event.data.value’yu kullan. Ağaç değişmediyse (etkin birleştiriciye yeniden basmak) olay yayılmaz"
|
|
103
103
|
}
|
|
104
104
|
},
|
|
105
105
|
comments: {
|
|
106
106
|
mount: NO_DATA,
|
|
107
107
|
submit: {
|
|
108
108
|
payload: { text: 'string', parentId: "string (yanıtsa üst yorumun id’si, kök yorumda '')", mentions: 'string[] (metinden çözülmüş @kişi listesi)', author: 'string (currentUser)' },
|
|
109
|
-
reads: 'Komponent yorumu ANINDA iyimser olarak listeye ekler (bekleyen katman); kalıcılık akışın işidir — rows
|
|
109
|
+
reads: 'Yük YALNIZ event.data’dadır (self.text/self.mentions boş gelir): {{ event.data.text }}. Komponent yorumu ANINDA iyimser olarak listeye ekler (bekleyen katman); kalıcılık akışın işidir — bekleyen satır, rows’a aynı üst yorum + metin (+ yazar) ile YENİ bir satır gelince yerini ona bırakır; akış kaydetmezse ya da metni değiştirirse "gönderiliyor…" kalır'
|
|
110
110
|
},
|
|
111
|
-
like: { payload: { id: 'string', liked: 'boolean (yeni durum)', author: 'string (currentUser — işlemi yapan)' }, reads: '
|
|
112
|
-
edit: { payload: { id: 'string', text: 'string (yeni metin)', author: 'string (currentUser — işlemi yapan)' }, reads: '
|
|
113
|
-
delete: { payload: { id: 'string', author: 'string (currentUser — işlemi yapan)' }, reads: '
|
|
111
|
+
like: { payload: { id: 'string', liked: 'boolean (yeni durum)', author: 'string (currentUser — işlemi yapan)' }, reads: 'Yük yalnız event.data’dadır. Beğeni de iyimserdir; sayaç rows tazelenene kadar yerel. isDisabled/isReadonly/isViewmode açıkken yayılmaz' },
|
|
112
|
+
edit: { payload: { id: 'string', text: 'string (yeni metin)', author: 'string (currentUser — işlemi yapan)' }, reads: 'Yük yalnız event.data’dadır. Düzenleme de iyimserdir; yeni metin "düzenlendi" işaretiyle rows tazelenene kadar yerel. Metin değişmediyse yayılmaz' },
|
|
113
|
+
delete: { payload: { id: 'string', author: 'string (currentUser — işlemi yapan)' }, reads: 'Yük yalnız event.data’dadır. Satır (kök yorumsa yanıtlarıyla birlikte) listeden hemen gizlenir; uca yazmak akışın işidir' }
|
|
114
114
|
},
|
|
115
115
|
'auth-layout': { mount: NO_DATA, primaryClick: NO_DATA, secondaryClick: NO_DATA },
|
|
116
116
|
layout: { mount: NO_DATA, logout: NO_DATA },
|
|
117
117
|
'layout-shell': {
|
|
118
118
|
mount: NO_DATA,
|
|
119
|
-
// LayoutShell.svelte
|
|
120
|
-
//
|
|
119
|
+
// LayoutShell.svelte announce(): sidebarOpen her değiştiğinde (overlay, Escape, akış, Durum
|
|
120
|
+
// bağlaması — SHELL-009) dispatch('emit', { name, data, params }). `params` VERİLDİĞİ için bu olay
|
|
121
|
+
// istisnadır: sidebarOpen hem self.sidebarOpen'dan hem event.data'dan okunur.
|
|
121
122
|
toggle: { payload: { sidebarOpen: 'boolean (panelin YENİ durumu)' }, reads: 'self.sidebarOpen; params verildiği için event.data.sidebarOpen de dolar' }
|
|
122
123
|
},
|
|
123
124
|
'layout-region': { mount: NO_DATA },
|
|
@@ -157,7 +158,7 @@ export const componentEventContracts = {
|
|
|
157
158
|
payload: {
|
|
158
159
|
value: "string (elle yazılan metin) YA DA { Prefix, Separator, Counter, DigitCount, FieldId } (sunucudan kod gelince: kodun METNİ DEĞİL, kodu üreten şekil)"
|
|
159
160
|
},
|
|
160
|
-
reads: 'setter: self.value da yazılır. Elle yazarken HER TUŞTA, otomatik kod gelince bir kez yayılır — pahalı akışı changed’e bağla'
|
|
161
|
+
reads: 'setter: self.value da yazılır. Elle yazarken HER TUŞTA, otomatik kod gelince bir kez yayılır — pahalı akışı changed’e bağla. Yükte kodun METNİ yoktur; Counter başlangıç değeridir, kaydedilen numara değil — numarayı kayıttan dönen satırdan oku.'
|
|
161
162
|
},
|
|
162
163
|
changed: valueChange('string (alan bırakılınca kesinleşen metin; yalnız ELLE düzenlemede yayılır)'),
|
|
163
164
|
focus: NO_DATA,
|
|
@@ -248,8 +249,8 @@ export const componentEventContracts = {
|
|
|
248
249
|
},
|
|
249
250
|
fileUpload: {
|
|
250
251
|
change: {
|
|
251
|
-
payload: { value: "Array
|
|
252
|
-
reads:
|
|
252
|
+
payload: { value: "Array — her eleman: yeni seçimde { type:'file', ref:'', fileName, value:<base64 data URL> }; akışın yazdığı kayıtlı dosya AYNEN ({ type:'ref', value:<fileId>, fileName, absolute_path, … }); akış düz URL yazdıysa { type:'file', ref:'', fileName, value:<URL> } (kayıtta 500 FormatException)" },
|
|
253
|
+
reads: "self.value — dosya EKLENİNCE de SİLİNİNCE de (çipe tıklama) aynı olay yayılır ve yük her seferinde KALAN TÜM listedir, yalnız yeni dosyalar değil. isMultiple:false iken dizi tek elemanlıdır. Kilitliyken (isDisabled/isReadonly/isViewmode) hiç yayılmaz; tür/boyut/adet sınırına takılan dosya listeye girmez ve uyarı komponentin içinde çizilir, ama kabul KISMİDİR: geçen dosya varsa olay GEÇENLERLE yayılır, yalnız hepsi reddedilirse hiç yayılmaz. enableCrop açıkken görsel dosyalar kırpma katmanından geçtikten SONRA yayılır (İptal dosyayı düşürür; hepsi düşerse olay çalışmaz). Akışın yazdığı type:'ref' kayıtları yükte aynen kalır. isMultiple:false iken de dizidir (silmede []); tekil FILE alanına göndermeden önce ilk elemanı al (componentCatalog fileUpload.propNotes.value)."
|
|
253
254
|
}
|
|
254
255
|
},
|
|
255
256
|
fileInput: {
|
|
@@ -344,7 +345,7 @@ export const componentEventContracts = {
|
|
|
344
345
|
'audit-basic': { mount: NO_DATA },
|
|
345
346
|
'audit-history': {
|
|
346
347
|
mount: NO_DATA,
|
|
347
|
-
showMore: { payload: {}, reads: 'yalnız histories visibleLogCount’u aşınca çıkan "Daha fazla göster" düğmesine basılınca; görünür sınır visibleLogCount kadar büyür, kalan kalmayınca düğme kaybolur. Bileşen veri çekmez; backend kayıt başına en fazla 5 işlem verdiği için meta.history bağlıyken düğme ancak visibleLogCount < 5 iken çıkar' }
|
|
348
|
+
showMore: { payload: {}, reads: 'yalnız histories visibleLogCount’u aşınca çıkan "Daha fazla göster" düğmesine basılınca; görünür sınır visibleLogCount kadar büyür, kalan kalmayınca düğme kaybolur; en yeni (ilk) girdi değişince sınır başa döner. Bileşen veri çekmez; backend kayıt başına en fazla 5 işlem verdiği için meta.history bağlıyken düğme ancak visibleLogCount < 5 iken çıkar' }
|
|
348
349
|
},
|
|
349
350
|
'form-validation-errors': { mount: NO_DATA },
|
|
350
351
|
'page-header': {
|
|
@@ -370,7 +371,7 @@ export const componentEventContracts = {
|
|
|
370
371
|
},
|
|
371
372
|
click: {
|
|
372
373
|
payload: {},
|
|
373
|
-
reads:
|
|
374
|
+
reads: "Yalnız akışa bağlıysa çalışır (sarmalayıcı <div>; controls:false iken role=button + Enter/Boşluk da tetikler); controls açıkken videonun YÜZEYİNE tıklamak hem oynatır hem bu olayı tetikler, kontrol çubuğundaki yerel oynat/duraklat düğmesi ise videoyu oynatır AMA bu olayı TETİKLEMEZ (ölçüldü 2026-10-05). isLoading:true iken HİÇ çalışmaz — o dalda oynatıcı yerine iskelet çizilir ve sarmalayıcı tıklanabilir değildir"
|
|
374
375
|
},
|
|
375
376
|
play: {
|
|
376
377
|
payload: { isPlaying: 'boolean (true)' },
|
|
@@ -383,6 +384,14 @@ export const componentEventContracts = {
|
|
|
383
384
|
ended: {
|
|
384
385
|
payload: { isPlaying: 'boolean (false)' },
|
|
385
386
|
reads: 'loop açıkken HİÇ yayılmaz (döngü videosu bitmez). event.data: { currentTime, duration } — bitişte currentTime pratikte duration’a eşittir. Bitişte pause’dan SONRA gelir (spesifikasyon sırası), yani ended akışı pause akışının ardından koşar'
|
|
387
|
+
},
|
|
388
|
+
load: {
|
|
389
|
+
payload: {},
|
|
390
|
+
reads: "Kaynağın İLK KARESİ hazır olunca (loadeddata) yayılır; kaynak her değiştiğinde yeniden. Değer yazmaz (setter yok). event.data: { duration: number (saniye; sonsuz ya da bilinmiyorsa 0), width: number, height: number (kaynağın kendi piksel boyu) }. Yalnız oynatıcı çizilirken yayılır: isLoading:true iken <video> yoktur, load gelmez (iskeleti kaynağı çözen sorgudan kapat). Boş src'de ya da error'da yayılmaz"
|
|
391
|
+
},
|
|
392
|
+
error: {
|
|
393
|
+
payload: {},
|
|
394
|
+
reads: "Kaynak yüklenemediğinde yayılır (404, video olmayan dosya, desteklenmeyen biçim, ağ kopması). Değer yazmaz, ama isPlaying true ise false'a düşer. event.data: { code: number (MediaError.code: 1 iptal · 2 ağ · 3 çözümleme · 4 kaynak yok/desteklenmiyor), message: string (tarayıcıya bağlı, çoğu kez boş) }. Bileşen kendi hata görünümü çizmez: siyah kutu kalır, kullanıcıya bildirmek akışın işidir. Boş src'de yayılmaz"
|
|
386
395
|
}
|
|
387
396
|
},
|
|
388
397
|
// — 2026-08-25 eşleme turu: ng-apps-ui'da olay YAYAN ama burada kaydı olmayan komponentler.
|
|
@@ -433,8 +442,11 @@ export const componentEventContracts = {
|
|
|
433
442
|
'breadcrumb-title': {
|
|
434
443
|
mount: NO_DATA,
|
|
435
444
|
clickItem: {
|
|
436
|
-
payload: {
|
|
437
|
-
|
|
445
|
+
payload: {
|
|
446
|
+
currentItem: '{ key, text, flow, isHidden } — tıklanan iz öğesi (satır içi ya da … menüsünden, ikisi de aynı yükü yayar)',
|
|
447
|
+
index: 'number (items dizisindeki GERÇEK yer; gizli öğeler kaydırmaz)'
|
|
448
|
+
},
|
|
449
|
+
reads: "event.data.currentItem.key ve event.data.index ile oku (2026-09-30'dan önce event.data BOŞ geliyordu — QA BT-002). Öğenin kendi flow'u varsa ÖNCE o çalışır ve AYNI yükü event.data'dan alır, sonra clickItem yayılır. currentItem düğüme de yazılır ama self.currentItem ifade yüzeyine yalnız kayıtlı düğüm o anahtarı taşıyorsa çıkar (ARC-096) — güvenilir yol event.data'dır; index self'e YAZILMAZ. breadcrumb'ın aksine olay bağlı akış olmasa da yayılır (tıklama düğüme currentItem yazar)."
|
|
438
450
|
},
|
|
439
451
|
clickRoot: {
|
|
440
452
|
payload: {},
|
|
@@ -454,11 +466,11 @@ export const componentEventContracts = {
|
|
|
454
466
|
},
|
|
455
467
|
chart: {
|
|
456
468
|
mount: NO_DATA,
|
|
457
|
-
dataPointClick: { payload: { name: 'string (kategori); scatter grafiğinde x değeri', seriesName: 'string', value: 'number | null; scatter grafiğinde y', dataIndex: 'number
|
|
469
|
+
dataPointClick: { payload: { name: 'string (kategori); scatter grafiğinde x değeri', seriesName: 'string', value: 'number | null; scatter grafiğinde y', dataIndex: 'number', row: 'kaynak satırın TAMAMI | null' }, reads: 'YALNIZ seri noktasında yayılır; eksen etiketi tıklaması axisLabelClick’tir (2026-09-16 öncesinde o da boş bir dataPointClick üretiyordu). scatter noktası ECharts tarafında [x, y, size] dizisidir, yük tek değere indirgenir: name = x, value = y' },
|
|
458
470
|
breadcrumbClick: { payload: { filterValue: 'hedef seviyenin filtre değeri (kök seviyede undefined)' } },
|
|
459
|
-
selectionChange: { payload: { selected: 'seçili veri noktaları' }
|
|
471
|
+
selectionChange: { payload: { selected: 'seçili veri noktaları' } },
|
|
460
472
|
legendClick: { payload: { name: 'string (seri adı)', selected: 'seri → görünürlük haritası' } },
|
|
461
|
-
axisLabelClick: { payload: { value: 'string (tıklanan eksen etiketi)' }, reads: '
|
|
473
|
+
axisLabelClick: { payload: { value: 'string (tıklanan eksen etiketi)' }, reads: 'Kategori ekseni hangi eksene düşerse oradan gelir — yatay yönelimde yAxis (2026-09-16 öncesinde yatayda hiç yayılmıyordu)' },
|
|
462
474
|
zoom: { payload: { start: 'number | null (görünen aralığın başlangıç yüzdesi)', end: 'number | null (bitiş yüzdesi)', startValue: 'number | null (eksenin kendi birimindeki mutlak alt sınır)', endValue: 'number | null (mutlak üst sınır)' }, reads: 'Yük normalize edilir: ECharts iki dataZoom bileşeniyle alanları batch içine koysa da akış her zaman bu dört alanı görür. Aralığı sorguya çevirecekseniz yüzdeleri değil startValue/endValue kullanın (2026-09-16)' },
|
|
463
475
|
refresh: NO_DATA,
|
|
464
476
|
retry: NO_DATA
|
|
@@ -466,7 +478,7 @@ export const componentEventContracts = {
|
|
|
466
478
|
checkboxgroup: { mount: NO_DATA, change: valueChange('string[] (seçili değerler)'), focus: NO_DATA, blur: NO_DATA },
|
|
467
479
|
emptystate: {
|
|
468
480
|
mount: NO_DATA,
|
|
469
|
-
actionClick: { payload: { text: 'string (aksiyonun metni)', index: 'number' }, reads: "
|
|
481
|
+
actionClick: { payload: { text: 'string (aksiyonun metni)', index: 'number' }, reads: "event.data.text / event.data.index (2026-10-01, QA ES-005; self.text / self.index de yazılır). Aksiyonun kendi flow'u varsa tıklamada YALNIZ o akış koşar, bu olaya bağlı akış kendi flow'u olmayan aksiyonlarda koşar; index GÖRÜNEN aksiyonların sırasıdır (isHidden olanlar elenmiş). href dolu satırda olay YİNE yayılır ama aynı sekmede gezinme sayfayı değiştirir ve olayın sayfa-içi sonucu görünmeden kaybolur — ikisini birlikte görmek için satırda isNewTabLink aç" }
|
|
470
482
|
},
|
|
471
483
|
iframe: {
|
|
472
484
|
mount: NO_DATA,
|
|
@@ -538,7 +550,7 @@ export const componentEventContracts = {
|
|
|
538
550
|
mount: NO_DATA,
|
|
539
551
|
actionClick: {
|
|
540
552
|
payload: { text: 'string (aksiyonun metni)', index: 'number' },
|
|
541
|
-
reads: "
|
|
553
|
+
reads: "event.data.text / event.data.index (2026-10-01, QA RS-004; self.text / self.index de yazılır). Aksiyonun kendi flow'u varsa tıklamada YALNIZ o akış koşar, bu olaya bağlı akış kendi flow'u olmayan aksiyonlarda koşar. index GÖRÜNEN sıradır: isHidden satırlar çizilmeden ELENİR, yani gizli satırı olan bir listede index actions dizisindeki sıra DEĞİLDİR — akışı sıraya değil text'e ya da aksiyonun kendi flow'una bağla. isLoading açıkken HİÇ yayılmaz (iskelet çizilirken düğme de yoktur); isDisabled satır da yaymaz"
|
|
542
554
|
}
|
|
543
555
|
},
|
|
544
556
|
slider: {
|
|
@@ -580,10 +592,10 @@ export const componentEventContracts = {
|
|
|
580
592
|
},
|
|
581
593
|
close: {
|
|
582
594
|
payload: { reason: "'timeout' | 'user' | 'programmatic'" },
|
|
583
|
-
reads: 'Toast kapanınca yayılır; akışta
|
|
595
|
+
reads: 'Toast kapanınca yayılır; neden akışta event.data.reason ile okunur (2026-10-01, QA TS-006; self.reason da yazılmaya devam eder). timeout = süre doldu; user = kullanıcı kapattı (× düğmesi, closeOnClick tıklaması, kaydırma, Escape, aksiyon düğmesi, Clear all); programmatic = koddan dismiss/dismissAll. duplicates ile atılan tetikleme ve delay beklerken iptal edilen toast close YAYMAZ'
|
|
584
596
|
},
|
|
585
597
|
click: NO_DATA,
|
|
586
|
-
actionClick: { payload: { text: 'string (aksiyonun metni)', index: 'number' }, reads: "
|
|
598
|
+
actionClick: { payload: { text: 'string (aksiyonun metni)', index: 'number' }, reads: "event.data.text / event.data.index (2026-10-01, QA TS-006). Yalnız kendi flow'u OLMAYAN aksiyonda koşar: aksiyonun flow'u varsa tıklamada o akış çalışır, bu olaya bağlı akış çalışmaz" }
|
|
587
599
|
},
|
|
588
600
|
'qm-header': {
|
|
589
601
|
mount: NO_DATA,
|
|
@@ -658,7 +670,7 @@ export const componentEventContracts = {
|
|
|
658
670
|
fileName: 'string (okunan dosyanın adı; henüz dosya yoksa "")',
|
|
659
671
|
rowCount: 'number (dosyadaki HAM veri satırı sayısı — doğrulamadan önce)'
|
|
660
672
|
},
|
|
661
|
-
reads: "adım her değiştiğinde yayılır; currentStep ve fileName düğüme de yazılır (self.currentStep), rowCount yalnız event.data'dadır"
|
|
673
|
+
reads: "adım her değiştiğinde yayılır; currentStep ve fileName düğüme de yazılır (self.currentStep), rowCount yalnız event.data'dadır. resetAfterComplete açıkken complete'ten hemen sonra { currentStep: 0, fileName: tamamlanan dosya, rowCount: 0 } ile bir kez daha yayılır"
|
|
662
674
|
},
|
|
663
675
|
complete: {
|
|
664
676
|
payload: {
|
|
@@ -721,19 +733,13 @@ export const eventPayloadNote = "Olay yükü motorda komponentin KENDİ prop'una
|
|
|
721
733
|
"self.<anahtar> ile okunur — payload anahtarları aynı zamanda o prop'ların adıdır. " +
|
|
722
734
|
"event.data ESKİ kuşak komponent olaylarında BOŞ gelir: motor akışı emit'in params'ıyla başlatır ve " +
|
|
723
735
|
"event.data = params.data'dır (html actions/fireEvent ile 2026-08-27 kuşağı — eventcalendar · " +
|
|
724
|
-
"importwizard · kanban · signature · stepper —
|
|
736
|
+
"importwizard · kanban · signature · stepper — ve QA turlarında params eklenen tabs · breadcrumb-title · " +
|
|
737
|
+
"toast · result · emptystate bu yoldan doldurur; ayrım tekil sözleşme notlarında). " +
|
|
725
738
|
"payload boşsa olay veri taşımaz; 'reads' verilmişse değer yükte değil komponentin başka bir prop'undadır. " +
|
|
726
739
|
"self yerine value { type:'property', ref:{ source:'component', element:'<elementId>', property:'<prop>' } } de kullanılabilir. " +
|
|
727
740
|
"payload alanı yoksa yük sözlüğe henüz işlenmemiştir; tahmin etmeyin.";
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
* web sözleşmesinin ÖNÜNE geçer, web'de karşılığı olmayan bileşenin tek kaynağıdır.
|
|
731
|
-
*/
|
|
732
|
-
export function eventContractsFor(slug, names, platformContracts) {
|
|
733
|
-
const own = (source) => slug !== undefined && source !== undefined && Object.hasOwn(source, slug) ? source[slug] : undefined;
|
|
734
|
-
const web = own(componentEventContracts);
|
|
735
|
-
const platform = own(platformContracts);
|
|
736
|
-
const contracts = web || platform ? { ...web, ...platform } : undefined;
|
|
741
|
+
export function eventContractsFor(slug, names) {
|
|
742
|
+
const contracts = slug ? componentEventContracts[slug] : undefined;
|
|
737
743
|
return names.map(name => {
|
|
738
744
|
const contract = contracts?.[name];
|
|
739
745
|
if (!contract)
|
|
@@ -1,148 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
const SPACING_SCALE = [0, 4, 8, 16, 24, 32];
|
|
3
|
-
const EDGE_TOLERANCE = 1;
|
|
4
|
-
const WIDTH_TOLERANCE = 2;
|
|
5
|
-
export function summarizeLayout(boxes, viewport, options = {}) {
|
|
1
|
+
export function summarizeLayout(boxes, viewport) {
|
|
6
2
|
const outside = (box) => box.x + box.width <= 0 || box.y + box.height <= 0 || box.x >= viewport.width || box.y >= viewport.height;
|
|
7
|
-
const alignment = options.alignment === true ? summarizeAlignment(boxes, viewport) : undefined;
|
|
8
3
|
return {
|
|
9
4
|
nodeCount: boxes.length,
|
|
10
5
|
overflowing: boxes.filter(box => box.overflowX || box.overflowY).map(box => box.elementId),
|
|
11
6
|
outsideViewport: boxes.filter(box => box.width > 0 && box.height > 0 && outside(box)).map(box => box.elementId),
|
|
12
7
|
zeroSized: boxes.filter(box => box.width === 0 || box.height === 0).map(box => box.elementId),
|
|
13
|
-
truncated: boxes.length >= 500
|
|
14
|
-
...(alignment ? { alignment } : {})
|
|
8
|
+
truncated: boxes.length >= 500
|
|
15
9
|
};
|
|
16
10
|
}
|
|
17
|
-
function summarizeAlignment(boxes, viewport) {
|
|
18
|
-
// Tip ve ata sırası olmayan kutular (eski runtime/betik) ağaç kurmaz; hiza uydurulmaz.
|
|
19
|
-
if (!boxes.some(box => typeof box.type === 'string' && box.parentIndex !== undefined))
|
|
20
|
-
return undefined;
|
|
21
|
-
// Ağaç sırayla kurulur, kimlikle değil: `repeater` aynı elementId'yi her satırda yeniden çizer.
|
|
22
|
-
const parentOf = (box) => typeof box.parentIndex === 'number' ? boxes[box.parentIndex] : undefined;
|
|
23
|
-
// İç roller (`__trigger`, `__press`) tip taşımaz: bileşenin parçasıdır, düğüm değildir.
|
|
24
|
-
const typedParent = (box) => {
|
|
25
|
-
for (let current = parentOf(box); current; current = parentOf(current))
|
|
26
|
-
if (current.type)
|
|
27
|
-
return current;
|
|
28
|
-
return undefined;
|
|
29
|
-
};
|
|
30
|
-
const ancestors = (box) => {
|
|
31
|
-
const chain = [];
|
|
32
|
-
for (let current = typedParent(box); current; current = typedParent(current))
|
|
33
|
-
chain.push(current);
|
|
34
|
-
return chain;
|
|
35
|
-
};
|
|
36
|
-
// Ana ağacın kökü en büyük atasız kutudur. Öteki atasız kutular portala çizilir (floating-container,
|
|
37
|
-
// toast, modal içeriği) ve akışta değildir; sayılsalar ana kökü "yan yana kardeş" yapar, ekran satır sayılırdı.
|
|
38
|
-
// Sayfanın ağacını taşıyan kök seçilir (kabuklu sayfada shell_root, kabuksuzda page_container); bulunamazsa
|
|
39
|
-
// en büyük kök, eşitlikte sonraki — portal içeriği DOM'da uygulamadan önce durur.
|
|
40
|
-
const roots = boxes.filter(box => box.type && !typedParent(box));
|
|
41
|
-
const pageContainer = boxes.find(box => box.elementId === 'page_container');
|
|
42
|
-
const mainRoot = (pageContainer ? [pageContainer, ...ancestors(pageContainer)].at(-1) : undefined)
|
|
43
|
-
?? [...roots].reverse().sort((a, b) => b.width * b.height - a.width * a.height)[0];
|
|
44
|
-
// Saydam sarmalayıcının (tooltip) kutusu görünmez; dikey aralık onun görünen içeriğinden ölçülür.
|
|
45
|
-
const visibleExtent = (box) => {
|
|
46
|
-
const children = MOBILE_TRANSPARENT_WRAPPER_TYPES.includes(box.type ?? '') ? boxes.filter(child => child.type && typedParent(child) === box && child.height > 0) : [];
|
|
47
|
-
return children.length === 0
|
|
48
|
-
? { top: box.y, bottom: box.y + box.height }
|
|
49
|
-
: { top: Math.min(...children.map(child => child.y)), bottom: Math.max(...children.map(child => child.y + child.height)) };
|
|
50
|
-
};
|
|
51
|
-
const outOfFlow = (box) => {
|
|
52
|
-
const chain = [box, ...ancestors(box)];
|
|
53
|
-
return chain.some(item => MOBILE_OUT_OF_FLOW_TYPES.includes(item.type ?? '')) || chain[chain.length - 1] !== mainRoot;
|
|
54
|
-
};
|
|
55
|
-
// Yatayda ekrana sığmayan kutu (carousel ya da yatay kaydırmanın öteki sayfaları) sütun akışında değildir.
|
|
56
|
-
const onScreen = (box) => box.x >= -EDGE_TOLERANCE && box.x + box.width <= viewport.width + EDGE_TOLERANCE;
|
|
57
|
-
const flow = boxes.filter(box => box.type && box.width > 0 && box.height > 0 && onScreen(box) && !outOfFlow(box));
|
|
58
|
-
const inFlow = new Set(flow);
|
|
59
|
-
const parents = new Set(flow.map(typedParent).filter(Boolean));
|
|
60
|
-
const siblings = (box) => flow.filter(other => other !== box && typedParent(other) === typedParent(box));
|
|
61
|
-
const besideSibling = (box) => siblings(box).some(other => other.y < box.y + box.height - EDGE_TOLERANCE && box.y < other.y + other.height - EDGE_TOLERANCE);
|
|
62
|
-
// Kapsam, kendi kapsamından dar bir yüzeydir. Kapsamı boydan boya kaplayan zemin (boyanmış sayfa kökü,
|
|
63
|
-
// tam genişlik bant) yeni kapsam açmaz; içeriği ekranın kenar ölçüsüne girer.
|
|
64
|
-
const scopeCache = new Map();
|
|
65
|
-
const scopeOf = (box) => {
|
|
66
|
-
if (scopeCache.has(box))
|
|
67
|
-
return scopeCache.get(box);
|
|
68
|
-
const scope = ancestors(box).find(item => inFlow.has(item) && opensScope(item));
|
|
69
|
-
scopeCache.set(box, scope);
|
|
70
|
-
return scope;
|
|
71
|
-
};
|
|
72
|
-
const opensScope = (box) => box.surface === true && box.width < (scopeOf(box)?.width ?? viewport.width) - WIDTH_TOLERANCE;
|
|
73
|
-
// Yan yana dizilen öğe (satır kabının çocuğu ya da onun içindeki sütun) sütun hizasına girmez.
|
|
74
|
-
const inRow = (box) => {
|
|
75
|
-
const scope = scopeOf(box);
|
|
76
|
-
const chain = [box, ...ancestors(box)];
|
|
77
|
-
return chain.slice(0, scope ? chain.indexOf(scope) : chain.length).some(besideSibling);
|
|
78
|
-
};
|
|
79
|
-
const isContent = (box) => parents.has(box)
|
|
80
|
-
? opensScope(box)
|
|
81
|
-
: box.surface === true || !MOBILE_DROPPABLE_TYPES.includes(box.type ?? '');
|
|
82
|
-
const scopes = new Map([[undefined, []]]);
|
|
83
|
-
for (const box of flow.filter(isContent)) {
|
|
84
|
-
const scope = scopeOf(box);
|
|
85
|
-
if (box.width >= (scope?.width ?? viewport.width) / 2 && !inRow(box))
|
|
86
|
-
scopes.set(scope, [...(scopes.get(scope) ?? []), box]);
|
|
87
|
-
}
|
|
88
|
-
const reports = [...scopes].map(([scope, members]) => ({ scope, ...scopeAlignment(members) }));
|
|
89
|
-
const screen = reports.find(report => report.scope === undefined);
|
|
90
|
-
return {
|
|
91
|
-
gutter: screenGutter(screen?.dominantLeft, screen?.dominantRight, viewport.width),
|
|
92
|
-
leftEdges: screen?.leftEdges ?? [],
|
|
93
|
-
surfaces: reports.filter(report => report.scope !== undefined && report.leftEdges.length > 1).map(report => ({ elementId: report.scope?.elementId ?? '', leftEdges: report.leftEdges })),
|
|
94
|
-
widthOutliers: reports.flatMap(report => report.widthOutliers),
|
|
95
|
-
offScaleGaps: offScaleGaps(flow, typedParent, visibleExtent)
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
function scopeAlignment(members) {
|
|
99
|
-
const leftEdges = clusters(members, box => box.x);
|
|
100
|
-
const sized = members.filter(box => !MOBILE_INTRINSIC_WIDTH_TYPES.includes(box.type ?? ''));
|
|
101
|
-
// Yalnız içerik genişlikli öğe varsa (metin listesi) sağ kenar onlardan okunur; sapma yine sayılmaz.
|
|
102
|
-
const rightEdges = clusters(sized.length > 0 ? sized : members, box => box.x + box.width);
|
|
103
|
-
// Eşitlikte en soldaki sol kenar ve en sağdaki sağ kenar kazanır: sözleşmenin normu `fill`dir.
|
|
104
|
-
const dominantLeft = [...leftEdges].sort((a, b) => b.elementIds.length - a.elementIds.length || a.x - b.x)[0]?.x;
|
|
105
|
-
const dominantRight = [...rightEdges].sort((a, b) => b.elementIds.length - a.elementIds.length || b.x - a.x)[0]?.x;
|
|
106
|
-
const widthOutliers = dominantLeft === undefined || dominantRight === undefined
|
|
107
|
-
? []
|
|
108
|
-
: unique(sized.filter(box => Math.abs(box.x + box.width - dominantRight) > WIDTH_TOLERANCE), box => box.elementId)
|
|
109
|
-
.map(box => ({ elementId: box.elementId, insetLeft: box.x - dominantLeft, insetRight: dominantRight - (box.x + box.width) }));
|
|
110
|
-
return { leftEdges, dominantLeft, dominantRight, widthOutliers };
|
|
111
|
-
}
|
|
112
|
-
const unique = (items, key) => items.filter((item, index) => items.findIndex(other => key(other) === key(item)) === index);
|
|
113
|
-
function clusters(members, edge) {
|
|
114
|
-
const result = [];
|
|
115
|
-
for (const box of members) {
|
|
116
|
-
const match = result.find(cluster => Math.abs(cluster.x - edge(box)) <= EDGE_TOLERANCE);
|
|
117
|
-
if (match && !match.elementIds.includes(box.elementId))
|
|
118
|
-
match.elementIds.push(box.elementId);
|
|
119
|
-
else if (!match)
|
|
120
|
-
result.push({ x: edge(box), elementIds: [box.elementId] });
|
|
121
|
-
}
|
|
122
|
-
return result.sort((a, b) => a.x - b.x);
|
|
123
|
-
}
|
|
124
|
-
function screenGutter(left, right, width) {
|
|
125
|
-
if (left === undefined || right === undefined)
|
|
126
|
-
return null;
|
|
127
|
-
const rightGutter = width - right;
|
|
128
|
-
return Math.abs(left - rightGutter) <= EDGE_TOLERANCE ? left : { left, right: rightGutter };
|
|
129
|
-
}
|
|
130
|
-
/** Aynı atanın alt alta duran ardışık çocukları arasındaki boşluk ölçekte mi (yan yana olanlar sayılmaz). */
|
|
131
|
-
function offScaleGaps(flow, typedParent, extent) {
|
|
132
|
-
const groups = new Map();
|
|
133
|
-
for (const box of flow) {
|
|
134
|
-
const key = typedParent(box);
|
|
135
|
-
groups.set(key, [...(groups.get(key) ?? []), box]);
|
|
136
|
-
}
|
|
137
|
-
return [...groups.values()].flatMap(group => {
|
|
138
|
-
const sorted = [...group].sort((a, b) => a.y - b.y);
|
|
139
|
-
return sorted.slice(1).flatMap((next, index) => {
|
|
140
|
-
const previous = sorted[index];
|
|
141
|
-
const gap = extent(next).top - extent(previous).bottom;
|
|
142
|
-
const stacked = gap >= -EDGE_TOLERANCE && previous.x < next.x + next.width && next.x < previous.x + previous.width;
|
|
143
|
-
return stacked && !SPACING_SCALE.some(step => Math.abs(step - gap) <= EDGE_TOLERANCE)
|
|
144
|
-
? [{ between: [previous.elementId, next.elementId], gap }]
|
|
145
|
-
: [];
|
|
146
|
-
});
|
|
147
|
-
});
|
|
148
|
-
}
|