@appaflytech/zeyrek-ai-mcp 0.0.30 → 0.0.32
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/README.md +5 -5
- package/dist/config.js +0 -37
- package/dist/index.js +0 -2
- package/dist/knowledge/backendConstraints.js +1 -18
- package/dist/knowledge/boxSections.js +184 -0
- package/dist/knowledge/componentCatalog.js +232 -562
- package/dist/knowledge/componentEvents.js +21 -141
- package/dist/knowledge/layoutSummary.js +2 -140
- package/dist/knowledge/normalize.js +67 -236
- package/dist/knowledge/outlines.js +0 -36
- package/dist/knowledge/policy.js +4 -18
- package/dist/knowledge/reservedTables.js +0 -79
- package/dist/knowledge/rules.js +21 -319
- package/dist/knowledge/schemaGuard.js +0 -11
- package/dist/knowledge/styleResolve.js +38 -55
- package/dist/knowledge/themeResolve.js +3 -3
- package/dist/observability/trace.js +3 -6
- package/dist/platform/diagnostics.js +4 -10
- package/dist/platform/domSummary.js +1 -1
- package/dist/platform/errors.js +10 -162
- package/dist/platform/http.js +8 -29
- package/dist/platform/responses.js +5 -39
- package/dist/platform/{capture/capture.js → screenshot.js} +519 -105
- package/dist/platform/secrets.js +1 -17
- 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-detail-profile.json +1 -2
- package/dist/resources/examples/page-dynamic-form.json +2 -3
- package/dist/resources/examples/page-flex-sections.json +1 -1
- package/dist/resources/examples/page-html-embed.json +1 -1
- package/dist/resources/examples/workflow-basic.json +2 -8
- package/dist/resources/guides/component.md +4 -91
- package/dist/resources/guides/entity.md +8 -50
- package/dist/resources/guides/expressions.md +5 -14
- package/dist/resources/guides/functions.md +1 -1
- package/dist/resources/guides/getting-started.md +1 -38
- package/dist/resources/guides/layout.md +58 -55
- package/dist/resources/guides/microservice.md +2 -81
- package/dist/resources/guides/middleware.md +2 -44
- package/dist/resources/guides/page.md +75 -454
- package/dist/resources/guides/theme.md +2 -8
- package/dist/resources/guides/translation.md +1 -1
- package/dist/resources/guides/workflow.md +1 -58
- package/dist/resources/rules.js +5 -11
- package/dist/resources/schema-fingerprint.json +5 -7
- package/dist/resources/schemas/CreateEntityCommand.json +0 -118
- package/dist/resources/schemas/CreateMicroserviceCommand.json +1 -13
- package/dist/resources/schemas/CreateQueryCommand.json +0 -4
- package/dist/resources/schemas/CreateWorkflowCommand.json +1 -143
- package/dist/resources/schemas/DataJobDto.json +1 -6
- package/dist/resources/schemas/GlobalFunctionUpdateResultDto.json +1 -21
- package/dist/resources/schemas/MicroserviceDto.json +3 -15
- package/dist/resources/schemas/PreviewMicroserviceCommand.json +1 -10
- package/dist/resources/schemas/PreviewWorkflowCommand.json +1 -22
- package/dist/resources/schemas/StepDto.json +1 -22
- package/dist/resources/schemas/UpdateEntityCommand.json +0 -118
- package/dist/resources/schemas/UpdateMicroserviceCommand.json +1 -13
- package/dist/resources/schemas/UpdateQueryCommand.json +0 -4
- package/dist/resources/schemas/UpdateViewCommand.json +2 -0
- package/dist/resources/schemas/UpdateWorkflowCommand.json +1 -143
- package/dist/server.js +1 -27
- package/dist/tools/access.js +2 -369
- package/dist/tools/applications.js +3 -60
- package/dist/tools/common.js +0 -7
- package/dist/tools/components.js +14 -118
- package/dist/tools/datasources.js +3 -3
- package/dist/tools/dependencies.js +1 -1
- package/dist/tools/deployments.js +2 -2
- package/dist/tools/designSchemaPatch.js +18 -34
- package/dist/tools/dtos.js +5 -36
- package/dist/tools/entities.js +12 -79
- package/dist/tools/externalComponents.js +5 -26
- package/dist/tools/flows.js +14 -122
- package/dist/tools/folders.js +1 -1
- package/dist/tools/imports.js +2 -5
- package/dist/tools/layouts.js +17 -50
- package/dist/tools/merges.js +1 -1
- package/dist/tools/microservices.js +25 -77
- package/dist/tools/pages.js +112 -465
- package/dist/tools/platformInfo.js +8 -27
- package/dist/tools/projects.js +9 -71
- package/dist/tools/rows.js +13 -69
- package/dist/tools/schemaOps.js +1 -61
- package/dist/tools/screenWrite.js +8 -37
- package/dist/tools/screens.js +5 -95
- package/dist/tools/templates.js +1 -26
- package/dist/tools/translations.js +1 -1
- package/dist/tools/variables.js +5 -11
- package/dist/tools/workflows.js +5 -10
- 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 -859
- package/dist/knowledge/mobileComponentEvents.js +0 -239
- 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/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 -243
- 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 -672
- 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 -495
- 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/UpdateAccessPolicyCommand.json +0 -209
- package/dist/resources/schemas/UpdateDecisionCommand.json +0 -216
- package/dist/resources/schemas/UpdateProcessDefinitionCommand.json +0 -1357
- 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/modules.js +0 -48
- package/dist/tools/organizationStructure.js +0 -137
- package/dist/tools/profileWrite.js +0 -92
|
@@ -64,10 +64,9 @@
|
|
|
64
64
|
"children": [], "events": [], "validations": [], "stateBindings": []
|
|
65
65
|
}
|
|
66
66
|
},
|
|
67
|
+
{ "op": "set_event", "target": "page_container", "event": "mount", "eventValue": "<profil yükleme flow id>" },
|
|
67
68
|
{ "op": "set_event", "target": "password_form", "event": "submit", "eventValue": "<şifre güncelleme flow id>" }
|
|
68
69
|
],
|
|
69
|
-
"pageEvents": [{ "name": "mount", "value": "<profil yükleme flow id>" }],
|
|
70
|
-
"_pageEventsNote": "pageEvents page_update { events } ile yazılır; set_event ile page_container'a bağlanmaz — page_container Studio'nun Layers ağacında görünmez.",
|
|
71
70
|
"mountFlowCreateArgs": {
|
|
72
71
|
"host": "page",
|
|
73
72
|
"hostId": "<sayfa id>",
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
"hostId": "<page id>",
|
|
71
71
|
"name": "Formu yukle",
|
|
72
72
|
"slug": "formu-yukle",
|
|
73
|
-
"_note": "
|
|
73
|
+
"_note": "page_container.mount'a bağlanır. condition adımı `always` dalını kural dallarıyla BİRLİKTE taşır: always yükleniyor bayrağını her koşumda kapatır, kural dalları içeriği kurar.",
|
|
74
74
|
"steps": [
|
|
75
75
|
{
|
|
76
76
|
"stepId": "start", "name": "start", "type": "start", "kind": "normal",
|
|
@@ -208,9 +208,8 @@
|
|
|
208
208
|
}
|
|
209
209
|
]
|
|
210
210
|
},
|
|
211
|
-
"pageEvents": [{ "name": "mount", "value": "<load flow id>" }],
|
|
212
|
-
"_pageEventsNote": "pageEvents page_update { events } ile yazılır; set_event ile page_container'a bağlanmaz — page_container Studio'nun Layers ağacında görünmez.",
|
|
213
211
|
"eventPatchOps": [
|
|
212
|
+
{ "op": "set_event", "target": "page_container", "event": "mount", "eventValue": "<load flow id>" },
|
|
214
213
|
{ "op": "set_event", "target": "btn_submit", "event": "click", "eventValue": "<submit flow id>" }
|
|
215
214
|
],
|
|
216
215
|
"verification": {
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"stringNeedsFixedMode": "widthString/heightString YALNIZ ilgili *Type:'fixed' iken okunur. 'fill'/'auto' moda string yazmak ölüdür — gateway PAGE-017 uyarısı verir, Studio paneli mod değişiminde string'i siler.",
|
|
11
11
|
"cssSizeAcceptance": "Boyut string'i kabul kuralı (normalizeCssSize): çıplak sayı px sayılır, birimler px/%/vw/vh/vmin/vmax/rem/em/ch, calc(...) geçer. Negatif, pt, fr, 'auto' GEÇMEZ — platform 200 döner ama panel ve runtime değeri sessizce düşürür (PAGE-018).",
|
|
12
12
|
"wrapDefaultTrue": "wrap varsayılanı 2026-09-01'den beri AÇIK: w:12 çocuklar alt satıra sararak dikey akar. Bu örnekte de açık bırakıldı; kapatırsan üç hücre tek satıra sıkışır.",
|
|
13
|
-
"gapThemeVars": "gap preset'leri tema değişkenidir (small/medium/large → var(--ng-spacing-sm/md/lg));
|
|
13
|
+
"gapThemeVars": "gap preset'leri tema değişkenidir (small/medium/large → var(--ng-spacing-sm/md/lg)); alan allowCustom'dır, '18px' gibi ham CSS de geçer.",
|
|
14
14
|
"quickStackSkeleton": "Studio'nun Quick Stack üreteci hücre olarak DAİMA box kurar, ebeveyne layout:'flex' + direction:'row' + wrap:true yazar ve satır span'ları 12'ye tamamlanır. states.isQuickStack yalnız editör süsüdür (kesikli çerçeve) — runtime'da hiçbir etkisi yoktur.",
|
|
15
15
|
"orderFromBlocks": "Flex'te sıra blocks[].position'dan gelir (önce y, sonra x) ve y yalnız SIRADIR; boşluk çizilmez. Yine de bitişik ver ki grid'e dönüşte şema geçerli kalsın.",
|
|
16
16
|
"heightStringOnlyFixed": "heightType:'fixed' ölçüyü heightString'den alır ('30vh' gibi), o yoksa size.h×10px'ten. heightType:'auto' içerik kadar, 'fill' ebeveynin bıraktığı yer."
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
{
|
|
61
61
|
"name": "Panoyu doldur",
|
|
62
62
|
"slug": "panoyu-doldur",
|
|
63
|
-
"note": "actions[0].flow buna işaret eder; ayrıca
|
|
63
|
+
"note": "actions[0].flow buna işaret eder; ayrıca page_container.mount'a set_event ile bağlanır (ilk yükleme).",
|
|
64
64
|
"steps": [
|
|
65
65
|
{
|
|
66
66
|
"stepId": "start", "name": "Start", "type": "start", "kind": "normal", "args": {},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"_meta": {
|
|
3
3
|
"synthetic": true,
|
|
4
|
-
"note": "hr projesinde doğrulanmış şekil. Kurallar: step/branch id'leri GERÇEK GUID ve global benzersiz (RowAlreadyExists); DtoId verilen yerde Behavior zorunlu; table rule'da datasourceId + fieldId zorunlu; filtre value JavaScript ifadesi
|
|
4
|
+
"note": "hr projesinde doğrulanmış şekil. Kurallar: step/branch id'leri GERÇEK GUID ve global benzersiz (RowAlreadyExists); DtoId verilen yerde Behavior zorunlu; table rule'da datasourceId + fieldId zorunlu; filtre value JavaScript ifadesi; preview girdisi previewPayload anahtarıyla. bağlanmamış fail dalı hataya düşerse start'taki global-error dalına gider (IStep.cs:74-86)."
|
|
5
5
|
},
|
|
6
6
|
"definition": {
|
|
7
7
|
"name": "Product Lookup",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
},
|
|
35
35
|
{
|
|
36
36
|
"id": "<GUID-3>",
|
|
37
|
-
"name": "
|
|
37
|
+
"name": "Load Product",
|
|
38
38
|
"description": "input.productName ile ürünü okur; tek kayıt bekler.",
|
|
39
39
|
"caution": "Ad benzersiz değil: aynı adda birden çok ürün varsa ilkini alır, hiç yoksa sessizce boş döner.",
|
|
40
40
|
"type": "table",
|
|
@@ -59,15 +59,9 @@
|
|
|
59
59
|
],
|
|
60
60
|
"filters": [
|
|
61
61
|
{
|
|
62
|
-
"alias": "<entity slug>",
|
|
63
62
|
"fieldSlug": "name",
|
|
64
63
|
"operator": "eq",
|
|
65
|
-
"source": "expression",
|
|
66
64
|
"value": "input.productName",
|
|
67
|
-
"filterType": "single",
|
|
68
|
-
"conditionType": "and",
|
|
69
|
-
"children": [],
|
|
70
|
-
"order": 0,
|
|
71
65
|
"fieldId": "<name alanı id>"
|
|
72
66
|
}
|
|
73
67
|
],
|
|
@@ -3,11 +3,6 @@
|
|
|
3
3
|
Sayfaya konan her şeyin ortak kuralları. Kuruluş sırası ve şema gövdesi için
|
|
4
4
|
`platform_guide('page')`; HTML kaçış kapısının derin sözleşmesi için `platform_guide('html')`.
|
|
5
5
|
|
|
6
|
-
> **Mobil uygulamada** katalog ayrıdır: `component_list`/`component_get` mobil satırları okur,
|
|
7
|
-
> `component_get` `mobileKnowledge` (bileşenin mobil farkları) ve `mobileNotes` ekler; katalogda
|
|
8
|
-
> olmayan tip `MOB-003` alır. Stil CSS değil React Native'dir — `page_runtime_get(resolveStyles)`
|
|
9
|
-
> `nativeStyle` döner (`platform_guide('mobile')`).
|
|
10
|
-
|
|
11
6
|
## Keşif: iki tool, üç bilgi katmanı
|
|
12
7
|
|
|
13
8
|
```
|
|
@@ -28,9 +23,7 @@ component_get → tek tipin TAM sözleşmesi, üç katman birleşik:
|
|
|
28
23
|
- **`isHidden`** her komponenti gizler; setter ile yazmak katalogda listelenmeyen tiplerde de
|
|
29
24
|
çalışır. Gizli komponent `mount` olayını görünür olana dek TETİKLEMEZ.
|
|
30
25
|
- **`mount`** olayını komponentin kendisi değil ortak katman yayar: komponent ilk kez
|
|
31
|
-
görünür olduğunda bir kez. Sayfa açılış akışı `page_container.mount`'a
|
|
32
|
-
`mount` olayına bağlanır (`page_update { events }`, `platform_guide('page')` Kural 1d-2) —
|
|
33
|
-
`page_container` Studio'nun Layers ağacında görünmez.
|
|
26
|
+
görünür olduğunda bir kez. Sayfa açılış akışı `page_container.mount`'a bağlanır.
|
|
34
27
|
- **`name` = `elementId`** kuralı: runtime her komponent için `const <name> = Components[...]`
|
|
35
28
|
üretir; bozuk ad sayfadaki BÜTÜN ifadeleri öldürür (`platform_guide('page')` Kural 1c-2).
|
|
36
29
|
- **Boyut:** `blocks[].size` katalogdaki `maxSize`'ı aşamaz; yükseklikte
|
|
@@ -81,51 +74,6 @@ Doğrulama mesajını çeviriye bağlamak ayrı bir sözleşmedir (`t:` öneki,
|
|
|
81
74
|
İstisna: `html` komponentinin
|
|
82
75
|
aksiyonları kendi `flow` prop'uyla bağlanır (`platform_guide('html')`).
|
|
83
76
|
|
|
84
|
-
## Korumalı değer ve arayüz yetkisi (kompleks proje)
|
|
85
|
-
|
|
86
|
-
Kompleks projede ortamın zorlama modu `enforce` iken runtime iki şey taşır; ikisi de **yalnız
|
|
87
|
-
arayüzdür**, yetkiyi backend her istekte yeniden denetler.
|
|
88
|
-
|
|
89
|
-
- **Satır metası.** Table-source uçtan dönen satırda korumalı alan varsa
|
|
90
|
-
`__protected: { <alanSlug>: 'masked' | 'plain' }` bulunur; `hidden` alan satırda hiç yoktur.
|
|
91
|
-
`table` · `datatable` · `detailview` · `text` (`record` + `recordField` ile) `masked` alanı
|
|
92
|
-
kilitli maske olarak çizer; "Göster" → gerekçe → değer 30 sn görünür, sonra yeniden maskelenir.
|
|
93
|
-
"Göster" yalnız erişim özeti yüklüyken çıkar: `off`'ta (basit proje hep `off`) hiç çıkmaz —
|
|
94
|
-
backend her reveal'i reddeder; `shadow`'da çıkar — backend reveal'i yine denetler, yetkisiz
|
|
95
|
-
kullanıcı ret mesajını görür; `enforce`'ta yalnız entity'nin `actions`'ında `reveal` varsa.
|
|
96
|
-
Değeri boş maskeli hücrede "Göster" çıkmaz. Tasarımcı kanvasında (**View as user**) düğme seçilen
|
|
97
|
-
kullanıcıya sunulacağı yerde etkisiz çizilir (kullanıcı seçili değilken tasarımcının
|
|
98
|
-
`project.data.reveal` izni karar verir); gerçek açma önizlemededir.
|
|
99
|
-
Açılan değer prop'a, akışa, olaya yazılmaz. Entity `revealEntity` prop'undan (slug ya da id) ya
|
|
100
|
-
da boşsa erişim özetinden çözülür (`component_get` → `knowledge.propNotes.revealEntity`).
|
|
101
|
-
- **Maske forma bağlanmaz.** Güncelleme formunda korumalı alanın `textinput`'u her zamanki gibi
|
|
102
|
-
`value` ile kaydın alanına bağlanır, yanına `isMasked` eklenir:
|
|
103
|
-
`{{ Steps.<adım>.data.__protected?.tckn === 'masked' }}`. `isMasked` açıkken bağlı değer maske
|
|
104
|
-
metni sayılır ve gösterilmez: alan boş başlar, "Değiştirmek için yeni değer girin" yer tutucusunu
|
|
105
|
-
gösterir, mount sonrası düğüm değerini `null`'a çeker ve `required`'a takılmaz. Kullanıcı yazınca
|
|
106
|
-
sıradan girdidir; değer girdinin yazmadığı bir değere dönerse (forma başka satır seçildi, akış
|
|
107
|
-
alanı sıfırladı) yeni kaydın maskesi yine gizlenir ve temizlenir.
|
|
108
|
-
- **Izgarada kör üzerine yazma (ADR 0007).** Bağlı `datatable`'da `capability.canWrite` politikadan gelir;
|
|
109
|
-
maskeli okumak yazmayı kapatmaz. Maskeli hücre düzenlemeye **boş** açılır, yazılan değer gider, boş bırakılan
|
|
110
|
-
maske gitmez; hücre seçimine girmez, toplu düzenleme maskeli kolonu sunmaz. Korumalı alanı güncellemek için
|
|
111
|
-
form kurmak zorunlu değildir. Eski değeri görerek düzeltmek gerekiyorsa önce "Göster" (30 sn, editöre ön
|
|
112
|
-
doldurulmaz). Bağlı olmayan tabloda ve `table` bileşeninde maskeli hücre düzenlenmez.
|
|
113
|
-
- **Boş değerin gönderilmemesi isteğin kuruluşuna bağlıdır.** Microservice çağrısının parametre
|
|
114
|
-
bağı boş (`null`/`''`) değeri gövdeye koymaz → saklı değer korunur. Gövdeyi akış kodunda ya da
|
|
115
|
-
setter göreviyle elle kuruyorsan (`{ tckn: TextInput1.value }`) `null` gider: `canWrite` yoksa
|
|
116
|
-
403 `AccessFieldWriteDeniedException`, varsa saklı değer **silinir**. Boş maskeli alanı böyle bir
|
|
117
|
-
gövdeye koyma.
|
|
118
|
-
- **`Page.can(permission, resourceKey)`** her ifadede (görünürlük bağı, akış kodu) kullanılır:
|
|
119
|
-
`Page.can('reveal', 'entity:musteriler')` · `Page.can('entity.update', 'entity:<id>')` ·
|
|
120
|
-
`Page.can('view', 'page:musteri/detay')` · `Page.can('execute', 'microservice:musteri-listesi')`.
|
|
121
|
-
İzin kısa eylem adı ya da katalog slug'ıdır; anahtar `entity:<slug|id>` · `page:<slug>` ·
|
|
122
|
-
`microservice:<slug>`. `enforce` dışında (ya da özet yüklenmemişken) HER ZAMAN `true`; okunamayan
|
|
123
|
-
anahtar ya da başka kaynak tipinin izni `enforce`'ta `false`.
|
|
124
|
-
- **Oturum.** `/view` runtime isteklerinde oturum çerezi gider, durum değiştiren isteğe `X-ZY-CSRF`
|
|
125
|
-
eklenir; oturum 401'i bir kez yenilenir (`auth/refresh`) ve istek tekrarlanır. Yenilenemezse
|
|
126
|
-
uygulamanın giriş sayfasına gidilir — sayfa yükü bugün giriş sayfasını taşımadığı için yönlendirme
|
|
127
|
-
backend bunu gönderene dek olmaz (teknik borç). Özetin listelemediği sayfa ana sayfaya döner.
|
|
128
|
-
|
|
129
77
|
## Stil
|
|
130
78
|
|
|
131
79
|
Her komponentin `style` prop'u vardır ve iç parçalara iner (`textinput.style`: `&__label` ·
|
|
@@ -140,10 +88,7 @@ Widget, kendi komponent ağacını taşıyan yeniden kullanılabilir pakettir (`
|
|
|
140
88
|
|
|
141
89
|
1. **Kayıt:** `component_create` — `kind:'widget'`, `widgetType`, `schema` (widget'ın kendi
|
|
142
90
|
ağacı; `name = elementId` kuralı burada da geçerli — layout gibi widget adları da kullanan
|
|
143
|
-
sayfaya sızar).
|
|
144
|
-
tipi (+ düğümde `widgetType`). Runtime widget'ı yalnız bu kökten çizer; düz `container` kökle
|
|
145
|
-
kayıt 200 döner ama boş çizilir. Kök vermezsen gateway düğümlerini Studio'nun kurduğu köke
|
|
146
|
-
sarar ve `gatewayNormalized`'da CMP-002 ile bildirir (`component_update` şemada da aynı).
|
|
91
|
+
sayfaya sızar).
|
|
147
92
|
2. **Sayfaya koyma:** `add_component` düğümünde `kind:'widget'` ve **`type` = widget KAYDININ
|
|
148
93
|
ID'si** — slug DEĞİL (runtime widget'ı `widget.id === node.type` ile çözer; slug yazarsan
|
|
149
94
|
kayıt 200 döner, render sessizce boş kalır — gateway **PAGE-012/LAY-005** ile reddeder).
|
|
@@ -157,30 +102,15 @@ Widget, kendi komponent ağacını taşıyan yeniden kullanılabilir pakettir (`
|
|
|
157
102
|
micro-op'ları `PATCH /components/{app}/{id}/schema`'ya yazar; `component_update` ise slug alan
|
|
158
103
|
tam gövde PUT'tur. Widget'ın düzey olayı yoktur, `remove_event` yalnız komponent hedefler.
|
|
159
104
|
|
|
160
|
-
## Satır başına çizilen çocuklar ve `item`
|
|
161
|
-
|
|
162
|
-
İki komponent çocuklarını VERİ SATIRI başına çizer; çocukların kod bağlamalarında o satır `item`'dır
|
|
163
|
-
(`{{ item.title }}`):
|
|
164
|
-
|
|
165
|
-
| Host | Hangi çocuklar | `item` |
|
|
166
|
-
|---|---|---|
|
|
167
|
-
| `repeater` | Bütün çocukları, `rows`'un her satırında | Satır; `item.x = …` satıra geri YAZAR |
|
|
168
|
-
| `datatable` | Yalnız `datatable-cell` çocukları: her biri `column` prop'undaki kolonun hücresine, her satırda | Satır; SALT OKUNUR |
|
|
169
|
-
|
|
170
|
-
`datatable`'ın kendisi `isDroppable` DEĞİLDİR: çocuğu yalnız `datatable-cell` olabilir
|
|
171
|
-
(`props.column = <columns[].name>`), asıl içerik onun içine konur. Şablonu olan kolonda kolonun
|
|
172
|
-
`type`/format ayarı çizilmez; sıralama, filtre ve dışa aktarma ham değerle çalışır. Hangi türün host
|
|
173
|
-
olduğu tek kayıttadır: `zeyrek-frontend/packages/ng-apps-ui/src/shared/render/row-scope.ts`.
|
|
174
|
-
|
|
175
105
|
## `states` ve `appearance` sözlükleri
|
|
176
106
|
|
|
177
107
|
Her şema düğümünde iki sözlük vardır; ikisi de ortak render katmanında çözülür:
|
|
178
108
|
|
|
179
109
|
| `states` | Anlamı |
|
|
180
110
|
|---|---|
|
|
181
|
-
| `isDroppable` | İçine komponent alır (container/form/repeater true)
|
|
111
|
+
| `isDroppable` | İçine komponent alır (container/form/repeater true) |
|
|
182
112
|
| `isScrollable` | İçeriği kendi alanında kaydırır (sabit yükseklikte `overflow-y: auto`) |
|
|
183
|
-
| `isWrapper` | Sayfanın/layout'un/widget'ın ANA kabı — salt düzen elemanı: `height:100%` + **`min-height:80vh`**, kap başlığı ÇİZİLMEZ. **Yalnız sayfa boyu kaplaması gereken tek kap için kullan:** iç içe kutuya verirsen 720px'lik pencerede o kutu 36px içerikle bile 576px çizilir (ölçüldü, `platform_guide('page')` Kural 1f). Çerçeve/başlık gizlemek için wrapper
|
|
113
|
+
| `isWrapper` | Sayfanın/layout'un/widget'ın ANA kabı — salt düzen elemanı: `height:100%` + **`min-height:80vh`**, kap başlığı ÇİZİLMEZ. **Yalnız sayfa boyu kaplaması gereken tek kap için kullan:** iç içe kutuya verirsen 720px'lik pencerede o kutu 36px içerikle bile 576px çizilir (ölçüldü, `platform_guide('page')` Kural 1f). Çerçeve/başlık gizlemek için wrapper değil `style` (`border:'none'`) kullan. Kurulmuş bir düğümün bayrağını `resize_component` micro-op'unun `states` alanı değiştirir — düğümü yeniden kurmak gerekmez |
|
|
184
114
|
| `isSticky` | Kaydırmada yerinde kalır (header/sidebar; z-index'i otomatik) |
|
|
185
115
|
| `isFloating` | Düğümü akıştan çıkarıp yüzdürür (katman davranışı; nadir) |
|
|
186
116
|
| `isQuickStack` | Studio'nun Quick Stack iskelet hücresi işareti — editörde kesikli çerçeve çizer, **runtime'da hiçbir etkisi yoktur**. MCP'den iskelet kurarken yazmak serbesttir ama gerekmez |
|
|
@@ -259,23 +189,6 @@ ve `layout` grubundaki adlar giremez. **MCP tarafında karşılığı yoktur:**
|
|
|
259
189
|
bir prop'tur, `set_prop` ile aynı şekilde yazılır. Bu bilgi yalnız "studio'da neden o
|
|
260
190
|
düğmeler var" sorusuna cevaptır.
|
|
261
191
|
|
|
262
|
-
## Bağlanabilir prop'lar (`connectData`)
|
|
263
|
-
|
|
264
|
-
`component_get` yanıtındaki `connectData` bileşenin hangi prop'unun veri kaynağına bağlanabileceğini
|
|
265
|
-
söyler; alan yoksa bileşen bağlanamaz (`connectDataNote`). Kaynak platform kataloğudur.
|
|
266
|
-
|
|
267
|
-
| Alan | Anlamı |
|
|
268
|
-
|---|---|
|
|
269
|
-
| `primary` | Birincil bağlanabilir prop (`rows`, `options`); Studio "Veriye bağla" düğmesi bunu açar |
|
|
270
|
-
| `trigger` | "Veriye bağla" düğmesinin yeri: `toolbar` (bileşen araç çubuğu) · `canvas` (kanvastaki bileşenin üstü) |
|
|
271
|
-
| `props.<yol>.roles` | Rol → tür (`any` · `string` · `number` · `boolean` · `date` · `parent`); dropdown `{ label, value }`, grafik `{ category, value }` |
|
|
272
|
-
| `props.<yol>.required` | Doldurulmadan bağlanamayan roller |
|
|
273
|
-
| `props.<yol>.fields` | Rol → bileşenin alan ADI prop'u (grafik `category → categoryField`, kanban `title → titleField`); bağlama o prop'lara seçilen alanın slug'ını yazar. Kaydında `fields` olmayan bileşen (dropdown) satırı rol adlarıyla okur |
|
|
274
|
-
| `props.<yol>.fieldsFrom` | Satırların alanlarını tanımlayan liste prop'u (`datatable.rows → columns`); rol yerine kolon listesi üretilir |
|
|
275
|
-
|
|
276
|
-
Yol joker olabilir: `series[].data` kaydı `series.1.data` prop'unu kapsar. Bağlamanın kendisi, tanım
|
|
277
|
-
şekli ve kurallar: `platform_guide('page')` §Kural 1c-3.
|
|
278
|
-
|
|
279
192
|
## Komponent seçimi
|
|
280
193
|
|
|
281
194
|
"Hangi işe hangi komponent" tablosu ve `table` / `datatable` karşılaştırması:
|
|
@@ -15,9 +15,7 @@ uzayındadır. Çakışan slug `Migration failed … relation "X" already exists
|
|
|
15
15
|
kaydı hiç oluşmaz**. Rezerve adlardan bilinenler: `branches`, `applications`, `caches`,
|
|
16
16
|
`components`, `datasources`, `entities`, `fields`, `files`, `flows`, `folders`, `layouts`,
|
|
17
17
|
`microservices`, `pages`, `permissions`, `projects`, `queries`, `queued_events`, `roles`,
|
|
18
|
-
`steps`, `users`, `variables`, `views`, `workflows
|
|
19
|
-
`organization_units`, `organization_positions`, `user_positions`, `access_policies`, `access_grants`
|
|
20
|
-
(tam liste gateway'in rezerve ad kontrolündedir). Alan adı bunlardan biriyse eş anlamlısını
|
|
18
|
+
`steps`, `users`, `variables`, `views`, `workflows`. Alan adı bunlardan biriyse eş anlamlısını
|
|
21
19
|
seç (ör. şube/branş için `branches` değil `specialties`).
|
|
22
20
|
|
|
23
21
|
> **Ama `users`/`roles`/`files`/`folders` bir istisna:** bunlar "dolu olduğu için kaçınılacak"
|
|
@@ -26,7 +24,7 @@ seç (ör. şube/branş için `branches` değil `specialties`).
|
|
|
26
24
|
|
|
27
25
|
## Hazır entity'ler — kimlik tablosu ZATEN VAR
|
|
28
26
|
|
|
29
|
-
Her projeye seed sırasında
|
|
27
|
+
Her projeye seed sırasında 9 entity açılır ve **id'leri her kurulumda aynı sabitlerdir**
|
|
30
28
|
(`Defaults` sınıfı) — aramana gerek yok, doğrudan `entity_get` ile çekebilirsin:
|
|
31
29
|
|
|
32
30
|
| slug | id | Ne için |
|
|
@@ -37,33 +35,12 @@ Her projeye seed sırasında hazır entity'ler açılır ve **id'leri her kurulu
|
|
|
37
35
|
| `permissions` · `role_permissions` | `01917ede-a457-…` · `01917ede-d450-…` | yetki matrisi |
|
|
38
36
|
| `files` · `folders` | `0191dbf2-39c4-…` · `0191df94-f635-…` | Drive; `FILE` alanları buraya bağlanır (`entity_list`'te GİZLİ) |
|
|
39
37
|
| `audit_trails` · `audit_trail_values` | `01961f53-25c3-…` · `01961f53-3552-…` | denetim izi |
|
|
40
|
-
| `organization_units` · `organization_unit_closure` | `01a0a05e-1c9a-7022-a0c7-6b8320756a4c` · `01a0a05e-1ca3-7b6a-9f1b-7f1633f7f05a` | **Organizasyon ağacı** (yalnız okunur, aşağıda): birimler — `parent_id` · `unit_type` (holding/company/branch/region/department/team/other) · `function_code` · `name` · `code` · `manager_position_id` · `origin` · `is_active` — ve ata/torun kapanışı |
|
|
41
|
-
| `organization_positions` · `organization_position_closure` | `01a0a05e-1ca3-700f-95c6-18fe1e30079c` · `01a0a05e-1ca4-7b73-b90e-4aa7d8eeeeef` | birimdeki koltuklar — `unit_id` · `parent_position_id` (idari hat) · `functional_parent_position_id` (işlevsel hat) · `role_id` · `name` · `code`; kapanışta `line_type` |
|
|
42
|
-
| `user_positions` | `01a0a05e-1ca4-7841-b6b3-45c5892d5501` | kullanıcı ↔ pozisyon — `user_id` · `position_id` · `is_primary` · `assignment_type` · `starts_at` · `ends_at` |
|
|
43
38
|
|
|
44
39
|
**`users` gerçek bir entity'dir**, sahte bir sistem tablosu değil: `entity_get` alanlarını verir,
|
|
45
40
|
`RELATION` alanı hedef alabilir, table step / microservice okur, `row_create` yazar, kendi default
|
|
46
41
|
DTO'su vardır. Auth middleware tarifi zaten bunu okur — `ngapps://examples/middleware-authenticate`
|
|
47
42
|
`entityId` olarak `users`'ı kullanır.
|
|
48
43
|
|
|
49
|
-
### Organizasyon ağacı tabloları — okunur, genel yolla YAZILMAZ (ORG-001 · ORG-002)
|
|
50
|
-
|
|
51
|
-
Beş organizasyon tablosu **her projede vardır**; basit projede boştur, kompleks projede
|
|
52
|
-
(`project_create` `accessModel: 'complex'`) organizasyonun rol yönetim şemasının kopyasını taşır.
|
|
53
|
-
|
|
54
|
-
- **Yazma kapalı (ORG-001, block).** `row_create` / `row_update` / `row_delete`, table kaynaklı uç
|
|
55
|
-
ve table step bu tablolara platformda `400 SystemEntityWriteNotAllowed` alır; gateway isteği hiç
|
|
56
|
-
göndermez. Ağaç organizasyon şemasından **senkronla** gelir (yönetim konsolunda yayın → abone
|
|
57
|
-
projenin her ortamı); projeye özel birim/pozisyon ve kullanıcı ataması Studio › Organizasyon
|
|
58
|
-
ekranındadır — MCP'de bu yazma yolu bilinçli olarak yoktur: projede yapı değişikliği aboneliği
|
|
59
|
-
kapatır (`receiveUpdates = false`) ve dal ortamında 409 döner.
|
|
60
|
-
- **Kompleks proje yayınlı son şemayla doğar (ORG-002).** Organizasyonda yayın yoksa tablolar boş
|
|
61
|
-
kalır; önce `organization_schema_get` ile `publishedVersion`'a bak. Abonelik ve özelleştirme
|
|
62
|
-
durumu `project_get` → `organizationSchema`.
|
|
63
|
-
- **Okuma serbest:** `row_list('organization_units')`, pozisyonlar için `row_list('organization_positions')`.
|
|
64
|
-
Alt ağaç sorusu (bir birimin bütün torunları) kapanış tablosundan `ancestor_id` filtresiyle
|
|
65
|
-
okunur; `depth` 0 düğümün kendisidir.
|
|
66
|
-
|
|
67
44
|
### Neden gözden kaçıyor
|
|
68
45
|
|
|
69
46
|
`entity_list`'i **`applicationId` ile** çağırdığında hazır entity'ler listede **görünmez**: seed
|
|
@@ -117,12 +94,6 @@ yapıyorsan devam et).
|
|
|
117
94
|
uygulamanın rol açması/düzenlemesi gerekiyorsa yol her domain tablosuyla aynıdır: entity + kendi
|
|
118
95
|
microservice ucun + sayfa. `role_list` yalnız okur.
|
|
119
96
|
|
|
120
|
-
> **Kompleks projede roller organizasyon şemasından gelir** (`roles.origin = 'organization'`;
|
|
121
|
-
> `role_list` bu alanı döndürmez, `row_list('roles')` okur). Şemadan gelen rol MCP'den yazılmaz,
|
|
122
|
-
> yönetim konsolunda düzenlenir; yetki `page.roleIds` ile değil erişim politikasıyla verilir.
|
|
123
|
-
> Aşağıdaki reçete basit proje içindir — kompleks projede kendi rolünü açan uç yine uyarı alır
|
|
124
|
-
> (ROL-002 warn), dikey çözümün açtığı rol projeye özgü kalır.
|
|
125
|
-
|
|
126
97
|
`roles` entity'sinin açtığı alanlar — fiziksel tabloda ayrıca `template_*` kolonları var, hepsi
|
|
127
98
|
nullable, gateway'den görünmez:
|
|
128
99
|
|
|
@@ -163,15 +134,6 @@ Rol açma reçetesi:
|
|
|
163
134
|
`permissions` / `role_permissions` **Studio'nun yetki matrisidir**, uygulama sayfasının yetkisi
|
|
164
135
|
değil; uygulama tarafında yetkiyi `page.roleIds` ve middleware ifadesi kurar.
|
|
165
136
|
|
|
166
|
-
## Veri koruma — maskeli, şifreli ve türetilmiş alan
|
|
167
|
-
|
|
168
|
-
TCKN, telefon gibi alanlar `fields[].protection` ile maskeli ve/veya şifreli saklanır; telefonun
|
|
169
|
-
operatör kodu gibi sorgulanabilir parça `derivedFromFieldId` + `derivationRule` ile türetilmiş alan
|
|
170
|
-
olur. Koruma yalnız düz metin alana konur (display, birincil anahtar, ilişki, çok dilli değil —
|
|
171
|
-
PROT-003), korumalı alanda metin araması ve sıralama yoktur (PROT-001, PROT-002). Modlar, maske
|
|
172
|
-
türleri, dolu kolonda geçiş ve hatalar: `platform_guide('access')` §'Alan koruması'. Satırları bir
|
|
173
|
-
bileşene bağlamak (liste, dropdown, grafik) akış değil `connect_data_bind`: `platform_guide('page')` §Kural 1c-3.
|
|
174
|
-
|
|
175
137
|
## Alan tipleri (dbType + commonType İKİSİ birden verilir)
|
|
176
138
|
|
|
177
139
|
| dbType (BÜYÜK HARF zorunlu) | commonType |
|
|
@@ -197,9 +159,6 @@ bileşene bağlamak (liste, dropdown, grafik) akış değil `connect_data_bind`:
|
|
|
197
159
|
`description`'a yaz: para → `INT8` kuruş (`*_minor`), süre → `INT4` dakika, yüzde →
|
|
198
160
|
`INT4` ×100, puan → `INT4` ×10.
|
|
199
161
|
- `commonType`'sız `UUID`/`BOOL` "isn't a supported database type" hatasıyla reddedilir.
|
|
200
|
-
- Birincil anahtar `properties.generationType` taşımak ZORUNDADIR: `properties` hiç verilmezse create
|
|
201
|
-
`Please select a valid generation type for 'id'` ile düşer (38/U-14). `0` (Always) ve `1` (ByDefault) ikisi de
|
|
202
|
-
geçerlidir — `UUID` anahtarda ikisiyle de satır id'si üretildi (ölçüldü 2026-09-21, 39/05 D-15).
|
|
203
162
|
- **Katalogu okumak gerekiyorsa** (bu datasource'ta hangi `dbType` var, hangisi varsayılan, tip
|
|
204
163
|
hangi seçenekleri kabul ediyor, hangi tipe dönüştürülebilir) `datasource_configuration_options`
|
|
205
164
|
çağır: varsayılan yanıt ~5 KB'lık **özettir**; 816 kayıtlık collation DEĞER listesi yalnız
|
|
@@ -721,13 +680,12 @@ orada `undefined` alır.
|
|
|
721
680
|
> `Sequence contains no **elements**` (satır yok — genelde preview rollback'i) **farklı**
|
|
722
681
|
> sorunlardır; karıştırmak teşhisi saptırır.
|
|
723
682
|
|
|
724
|
-
- **Audit izi ne zaman gerçekten yazılır?**
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
(`AuditTrailType.cs`); `advanced` diye bir değer **yoktur**, gönderirsen bağlama hatası alırsın.
|
|
683
|
+
- **Audit izi ne zaman gerçekten yazılır?** `CreateAuditTrailCommandHandler` şu üç durumda
|
|
684
|
+
**hiç kayıt açmaz**: `IsAuditTrailActive == false`, `AuditTrailType == null`, ya da
|
|
685
|
+
`AuditTrailType == simple`. Yani iz tutulması için `isAuditTrailActive: true` **ve**
|
|
686
|
+
`auditTrailType: "basic" | "detailed"` birlikte gerekir. Enum yalnız üç değer tanır —
|
|
687
|
+
`simple` · `basic` · `detailed` (`AuditTrailType.cs`); `advanced` diye bir değer **yoktur**,
|
|
688
|
+
gönderirsen bağlama hatası alırsın.
|
|
731
689
|
- **Audit izi IP adresi tutar.** `audit_trails.IpAddress`, isteğin
|
|
732
690
|
`HttpContext.Connection.RemoteIpAddress` değerinden doldurulur (`UserContext.cs`) ve satır
|
|
733
691
|
olaylarıyla (`Row.Created/Updated/Deleted` → `UserIpAddress`) audit consumer'a taşınır; kullanıcı
|
|
@@ -14,10 +14,8 @@ Uydurma fonksiyon adı runtime'da `X is not defined` 500'üdür — yalnız bura
|
|
|
14
14
|
|
|
15
15
|
**Değişkenler:** step çıktıları (`<stepAdı>.data`), middleware değişkenleri (`user`,
|
|
16
16
|
`settings`, `permissions`… — `workflow_middleware_variables` ile keşfet), HTTP bağlamı:
|
|
17
|
-
`cookie`, `header`, `queryString`, `body`, `triggerSource` (tetikleyen ucun
|
|
18
|
-
type/
|
|
19
|
-
(type/name/roles/path/impersonatedUserId/language). **Kimlik devri yalnız `context.impersonatedUserId`**'dedir;
|
|
20
|
-
`triggerSource`'ta bu alan yoktur (MW-006). Gövde bir JSON **nesnesi** ise `body.alan` diye okunur,
|
|
17
|
+
`cookie`, `header`, `queryString`, `body`, `triggerSource`/`context` (tetikleyen ucun
|
|
18
|
+
type/name/roles/impersonatedUserId'ı). Gövde bir JSON **nesnesi** ise `body.alan` diye okunur,
|
|
21
19
|
gövde bir JSON **dizisi** ise `body[0].alan` diye — 2026-09-04 öncesinde nesne gövde de diziye
|
|
22
20
|
sarılıyordu ve `body.alan` sessizce `undefined` dönüyordu, bu yüzden gövdeye bakan yetki kapıları
|
|
23
21
|
açık kalıyordu. Workflow'da istek girdisi `input.`, automation'da
|
|
@@ -99,16 +97,14 @@ dalından devam eder.
|
|
|
99
97
|
|---|---|
|
|
100
98
|
| `Page` | `Page.user`, `Page.variables`, `Page.components`, `Page.properties`, `Page.queryParams`, `Page.authorized(roles)` |
|
|
101
99
|
| **Komponent adları** | Her komponent adıyla doğrudan değişkendir: `specialties_table.rows = data` hem prop'u yazar hem UI'ı günceller (change event). Addaki `-` silinir: `tickets-table` → `ticketstable` |
|
|
102
|
-
| `state.page` / `state.app` |
|
|
100
|
+
| `state.page` / `state.app` | Kalıcı state (oku/yaz): `state.page.selectedId = row.id`. **Tanımlı değişkenler de buradadır:** `variable_create` ile yazılan her `key` sayfa düzeyinde `state.page.<key>`, uygulama düzeyinde `state.app.<key>` olur; `value` nesneyse alanlarına inilir (`state.page.MyTest.isActive`) |
|
|
103
101
|
| `Steps` | Adım çıktıları: `Steps.load_specialties` — anahtar adımın **ADIdır**, `stepId` değil (`setStorage(task.name, …)`); `Steps.<adım>.error` o adımın hatası — ama YALNIZ HTTP durum metnidir (401 için `'Unauthorized'`), ucun mesajı değil. `Steps.error` ise hata akışı için doldurulur (`onError` koşmadan önce `setStorage('error', …)` yapar) ve **yalnız orada okunur**: storage sayfa başına tek `FlowMachine`'de yaşar, ama dışarıdan başlayan her akış başlarken `'error'`'u ve kendi adımlarının önceki değerlerini temizler (`flow-engine.ts` `run`, 2026-09-25) — normal akışta `Steps.error` boştur; hata akışı ve onun tetiklediği akış (`nested`) onu görür ve şekli `{ message, code, step: { id, name, type, data } }`'dir: kullanıcıya gösterilecek metin `Steps.error.message`'tır (`err.response.data.message`, boşsa durum metni). **Başarılı bir adımda `Steps.<adım>.data` gerçek bir `Array`'dir** — `.map` · `.filter` · `.concat` · `.length` çalışır. Adım HATA dönerse aynı alan ucun hata gövdesini taşır; aşağıdaki kutuya bakın |
|
|
104
|
-
| `self` · `item` · `Row` / `RowIndex` | Tetikleyen komponent (yazılabilir) · repeater/tablo satırı (yazmak
|
|
102
|
+
| `self` · `item` · `Row` / `RowIndex` | Tetikleyen komponent (yazılabilir) · repeater/tablo satırı (yazmak satırı günceller) |
|
|
105
103
|
| `event` | `{name, data, source: {id, props}}` |
|
|
106
104
|
| `cookie` | `cookie.get(name)` / `cookie.set(name, value, {expiresInHours, path})` / `cookie.remove(name)` — tarayıcı cookie'si |
|
|
107
105
|
| `setComponentProperty(name, key, value)` / `getComponentProperty(name, key)` | fonksiyon alternatifi |
|
|
108
106
|
| `resetForm(name)` | Formu sıfırlar: alanlar başlangıç değerine döner, form "gönderilmemiş" olur, doğrulama mesajları silinir. Kayıt sonrası "yeni kayıt" için alanları tek tek `null`'a çekme — gönderilmiş formda her biri "zorunlu alan" mesajı çıkarır. Ad ya da komponent değişkeni alır: `resetForm('risk_form')` / `resetForm(risk_form)`. **Yalnız UI flow kodunda** |
|
|
109
|
-
| `LocalStorage` · `Widget` · `params` | yerel veri · widget bağlamı · olay parametreleri
|
|
110
|
-
| `Device` | Salt okunur cihaz durumu, barındırıcı günceller: `Device.isOnline` — ağ bağlantısı var mı (bilinmiyorsa `true`). Değişince sayfanın bütün bağları yeniden değerlendirilir; çevrimdışı bandı: `isHidden: {{ Device.isOnline }}`. Cihazda `expo-network`, web'de tarayıcının `online`/`offline` olayları. `Device` adında komponent ifade bağlamından süzülür (ayrılmış ad) |
|
|
111
|
-
| **Ayrılmış adlar** | Bu tablodaki globallerle (ve önsözün iç adlarıyla: `payload`, `error`, `repeaterId`, `_` ile başlayanlar…) aynı `name`'i taşıyan komponent (runtime yalnız İLK `-`'yi siler: `ite-m` da `item` sayılır) ifadede kendi adıyla GÖRÜNMEZ — süzülür, uyarı loglanır (liste: `@ng-apps/flow` `EXPRESSION_PRELUDE_NAMES`). Eskiden aynı ad sayfanın BÜTÜN ifadelerini `SyntaxError`'la düşürürdü (ARC-143). Gateway artık bu adların HEPSİNİ **PAGE-009** ile sayfa/layout yazma yollarında ve `page_schema_validate`'te istek gitmeden reddeder — komponente `t`, `state`, `event`, `item`, `self`, `Page`, `Row` gibi ad verme |
|
|
107
|
+
| `LocalStorage` · `Widget` · `params` | yerel veri · widget bağlamı · olay parametreleri |
|
|
112
108
|
| `t(key)` | Çeviri anahtarını çözer: aktif dil → projenin varsayılan dili → anahtarın kendisi. Boş string de "eksik" sayılır. Sözlük `machine.context.state.translations`'tan gelir; dil `language-selector` ile değişince bir sonraki çağrı yeni dili görür. **Yalnız UI flow kodunda vardır** — backend ifadelerinde karşılığı `Loc()`'tur (`platform_guide('workflow')`) | `t('home.welcome')` |
|
|
113
109
|
| `log(...)` | console (proxy'leri temizler) |
|
|
114
110
|
| `Functions` | **Kullanıcı fonksiyonları** (`function_create`): `Functions.toplamHesapla(fiyat, adet)` — uygulama kapsamlılar her sayfada, sayfa kapsamlılar yalnız kendi sayfasında. **Yalnız tarayıcı**; sunucuda bu ad alanı yoktur (2026-09-10, `WF-030`) |
|
|
@@ -129,11 +125,6 @@ dalından devam eder.
|
|
|
129
125
|
> `runtimeErrors` taşır ve hangi komponentin hangi prop'unun yazılamadığını (`element` ·
|
|
130
126
|
> `property`) söyler. Aynı defter hata dönen microservice adımlarını da kaydeder. **Kare
|
|
131
127
|
> "çalışıyor" görünse bile `runtimeErrors` doluysa o adımlar işini YAPMAMIŞTIR.**
|
|
132
|
-
>
|
|
133
|
-
> **Prop'a bağlı ifade patlarsa** (Studio'da "Expression error" toast'ı) `page_screenshot` yanıtı
|
|
134
|
-
> `expressionErrors` taşır: `{ elementId, prop, expression, message, count }`, öğe başına en çok iki.
|
|
135
|
-
> Toast da öğeyi adlandırır (`Expression error · tx_baslik.content`); cihazda geliştirme paketi aynı
|
|
136
|
-
> satırı Metro günlüğüne basar (ZM-05).
|
|
137
128
|
|
|
138
129
|
**Prop'a doğrudan ifade bağlama (`{{ }}`):** akış kurmadan bir prop'u ifadeye bağlamak için
|
|
139
130
|
prop `type: 'code'` olur, **ifade `ref` alanına `{{ }}` içinde** yazılır, `data` tasarım zamanı
|
|
@@ -273,7 +273,7 @@ toplamHesapla(row.fiyat, row.adet) > 1000
|
|
|
273
273
|
serbesttir — sunucuda o ad alanı yok.
|
|
274
274
|
- **Önekli hata:** gövde hatası `Functions.<ad>: <mesaj>` (studio) ya da `<ad>: <mesaj>` (workflow)
|
|
275
275
|
olarak gelir; `Steps.<adım>.error.message` ya da `runtimeErrors`'ta bu öneki ara.
|
|
276
|
-
- **Mobil
|
|
276
|
+
- **Mobil yok** (K11): `apps/mobile` runtime'ı `Functions`'ı boş nesne kurar.
|
|
277
277
|
- **Önbellek:** `/view` yolu eski gövdeyi birkaç saniye gösterebilir; `/dev` yolu anlıktır.
|
|
278
278
|
- **Parametre konumsal:** `parameters` sırasını değiştirmek mevcut çağrıların anlamını değiştirir;
|
|
279
279
|
`function` adımları ada göre eşlendiği için etkilenmez.
|
|
@@ -5,10 +5,7 @@
|
|
|
5
5
|
Bağımlılıklar bu sırayı zorunlu kılar; atlama:
|
|
6
6
|
|
|
7
7
|
```
|
|
8
|
-
1. project_create (
|
|
9
|
-
'Basit mi kompleks mi?' tablosu; sonradan değiştirmek ayrı bir dönüşüm
|
|
10
|
-
işidir.
|
|
11
|
-
application zorunlu: ilk application projeyle birlikte açılır;
|
|
8
|
+
1. project_create (application zorunlu: ilk application projeyle birlikte açılır;
|
|
12
9
|
application slug'ı ORG GENELİNDE tekildir — 'web' büyük olasılıkla
|
|
13
10
|
doludur, 409'da project_list ile mevcut slug'ları tara.
|
|
14
11
|
DİL: gateway create'ten sonra projenin dillerini kurar — verirsen
|
|
@@ -71,8 +68,6 @@ Bağımlılıklar bu sırayı zorunlu kılar; atlama:
|
|
|
71
68
|
13. application_update (homepageId — ana sayfa sayfadan değil application'dan seçilir)
|
|
72
69
|
```
|
|
73
70
|
|
|
74
|
-
Onay zinciri, görev kutusu, SLA gibi insanı bekleyen işler workflow'a sıkıştırılmaz: entity ve (gerekiyorsa) servis workflow'ları hazır olduktan sonra süreç tanımı yazılır — `platform_guide('bpm')`.
|
|
75
|
-
|
|
76
71
|
## İlk kullanıcıyı kim açar? (tavuk-yumurta kilidi)
|
|
77
72
|
|
|
78
73
|
Kimlik kurulmuş yeni bir projede **giriş yapabilecek hiç kimse yoktur** ve zincir kendi kendini
|
|
@@ -124,38 +119,6 @@ Middleware bir kontrol listesi maddesi değil; **ihtiyaca** kurulur:
|
|
|
124
119
|
`middlewareIds` ile bağlı olmalı. Bir-iki uca bağlayıp gerisini açık bırakmak, hiç kurmamaktan
|
|
125
120
|
kötüdür — sistem güvenli görünür, değildir.
|
|
126
121
|
|
|
127
|
-
## Basit mi kompleks mi? (proje türü)
|
|
128
|
-
|
|
129
|
-
Tür `project_create` `accessModel` ile proje açılırken seçilir; varsayılan `simple`'dır.
|
|
130
|
-
|
|
131
|
-
| Durum | Tür |
|
|
132
|
-
|---|---|
|
|
133
|
-
| Kimlik ve yetki uygulamanın kendi işi; birkaç rol yeter, satır kapsamı elle yazılan `user.id` filtresi | **simple** — bugünkü davranış, aşağıdaki middleware tablosu geçerli |
|
|
134
|
-
| Kurumun birim/pozisyon ağacı var (holding → şirket → bölge → departman), "müdür ekibinin kayıtlarını görür", maskeli/şifreli alan (TCKN) | **complex** |
|
|
135
|
-
|
|
136
|
-
Kompleks projede fark edilmesi gerekenler:
|
|
137
|
-
|
|
138
|
-
- Proje organizasyonun **yayınlı son** rol şemasının kopyasıyla doğar; yayın yoksa organizasyon
|
|
139
|
-
tabloları boştur (ORG-002). Açmadan önce `organization_schema_get` → `publishedVersion`.
|
|
140
|
-
- Ağaç tabloları (`organization_units`, `organization_positions`, `user_positions`) yalnız
|
|
141
|
-
okunur; `row_*` ile yazılmaz (ORG-001).
|
|
142
|
-
- Abonelik `project_get` → `organizationSchema`: `customizedAt` görünüyorsa proje ayrışmıştır ve
|
|
143
|
-
yeni sürümler artık gelmez.
|
|
144
|
-
|
|
145
|
-
### Kompleks projede ilk kullanıcı
|
|
146
|
-
|
|
147
|
-
`users` kompleks projede de boş doğar ve yukarıdaki bootstrap deseni **`enforce` ortamda çalışmaz**:
|
|
148
|
-
anonim uç işareti olmadığı için oturumsuz her microservice isteği — bootstrap ucu da — `401` döner.
|
|
149
|
-
Yeni kompleks proje `enforce` başlar. Sıra:
|
|
150
|
-
|
|
151
|
-
1. Kullanıcıya söyle: development ortamının zorlama modu Studio › Ayarlar › Ortamlar'dan geçici olarak
|
|
152
|
-
`shadow` yapılsın (insan işi, ACC-007; production'a dokunulmaz). `shadow` engellemez.
|
|
153
|
-
2. Bootstrap desenini uygula (geçici uç → kullanıcı → ucu hemen sil).
|
|
154
|
-
3. Kullanıcının koltuğu Studio › Organizasyon ekranında atanır (`user_positions`); politika pozisyona ya da
|
|
155
|
-
role atanmışsa yetki buradan gelir.
|
|
156
|
-
4. Mod `enforce`'a döner; `access_session_create` ile giriş yap, `asUser` ile uçları sına, reddi
|
|
157
|
-
`access_preview` ile açıkla (`platform_guide('access')`).
|
|
158
|
-
|
|
159
122
|
## Örnek arama davranışı
|
|
160
123
|
|
|
161
124
|
Örnek gövde için **mevcut projeleri taramak yerine** önce şunlara bak:
|