@appaflytech/zeyrek-ai-mcp 0.0.1
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 +46 -0
- package/README.md +260 -0
- package/dist/config.js +128 -0
- package/dist/index.js +88 -0
- package/dist/knowledge/componentCatalog.js +438 -0
- package/dist/knowledge/componentEvents.js +164 -0
- package/dist/knowledge/coverage.js +60 -0
- package/dist/knowledge/normalize.js +1309 -0
- package/dist/knowledge/outlines.js +167 -0
- package/dist/knowledge/policy.js +44 -0
- package/dist/knowledge/reservedTables.js +75 -0
- package/dist/knowledge/rules.js +1725 -0
- package/dist/observability/trace.js +337 -0
- package/dist/platform/errors.js +132 -0
- package/dist/platform/http.js +169 -0
- package/dist/platform/responses.js +94 -0
- package/dist/platform/token.js +79 -0
- package/dist/resources/examples/entity-pair-m2m.json +105 -0
- package/dist/resources/examples/flow-list-to-form.json +65 -0
- package/dist/resources/examples/flow-load-table.json +178 -0
- package/dist/resources/examples/microservice-table-list.json +49 -0
- package/dist/resources/examples/middleware-authenticate.json +194 -0
- package/dist/resources/examples/page-detail-profile.json +95 -0
- package/dist/resources/examples/page-dynamic-form.json +221 -0
- package/dist/resources/examples/page-form-upsert.json +279 -0
- package/dist/resources/examples/page-html-embed.json +106 -0
- package/dist/resources/examples/page-sign-in.json +194 -0
- package/dist/resources/examples/workflow-basic.json +94 -0
- package/dist/resources/guides/component.md +108 -0
- package/dist/resources/guides/entity.md +348 -0
- package/dist/resources/guides/expressions.md +139 -0
- package/dist/resources/guides/getting-started.md +109 -0
- package/dist/resources/guides/html.md +106 -0
- package/dist/resources/guides/microservice.md +313 -0
- package/dist/resources/guides/middleware.md +271 -0
- package/dist/resources/guides/modify-existing.md +35 -0
- package/dist/resources/guides/page.md +1574 -0
- package/dist/resources/guides/view.md +89 -0
- package/dist/resources/guides/workflow.md +359 -0
- package/dist/resources/knowledge.js +44 -0
- package/dist/resources/schemas/CreateDatasourceCommand.json +54 -0
- package/dist/resources/schemas/CreateDiscoveredEntitiesCommand.json +133 -0
- package/dist/resources/schemas/CreateEntityCommand.json +387 -0
- package/dist/resources/schemas/CreateMicroserviceCommand.json +528 -0
- package/dist/resources/schemas/CreateQueryCommand.json +43 -0
- package/dist/resources/schemas/CreateViewCommand.json +158 -0
- package/dist/resources/schemas/CreateWorkflowCommand.json +1719 -0
- package/dist/resources/schemas/Filter.json +124 -0
- package/dist/resources/schemas/GetRowsQuery.json +122 -0
- package/dist/resources/schemas/PreviewMicroserviceCommand.json +565 -0
- package/dist/resources/schemas/PreviewQueryCommand.json +74 -0
- package/dist/resources/schemas/PreviewWorkflowCommand.json +981 -0
- package/dist/resources/schemas/StepDto.json +900 -0
- package/dist/resources/schemas/UpdateDatasourceCommand.json +58 -0
- package/dist/resources/schemas/UpdateEntityCommand.json +679 -0
- package/dist/resources/schemas/UpdateMicroserviceCommand.json +512 -0
- package/dist/resources/schemas/UpdateQueryCommand.json +86 -0
- package/dist/resources/schemas/UpdateViewCommand.json +153 -0
- package/dist/resources/schemas/UpdateWorkflowCommand.json +1719 -0
- package/dist/resources/schemas.js +40 -0
- package/dist/server.js +63 -0
- package/dist/tools/access.js +27 -0
- package/dist/tools/applications.js +59 -0
- package/dist/tools/automations.js +103 -0
- package/dist/tools/common.js +18 -0
- package/dist/tools/components.js +280 -0
- package/dist/tools/datasources.js +82 -0
- package/dist/tools/dependencies.js +17 -0
- package/dist/tools/deployments.js +17 -0
- package/dist/tools/dtos.js +54 -0
- package/dist/tools/entities.js +166 -0
- package/dist/tools/files.js +138 -0
- package/dist/tools/flows.js +226 -0
- package/dist/tools/folders.js +51 -0
- package/dist/tools/layouts.js +105 -0
- package/dist/tools/microservices.js +198 -0
- package/dist/tools/organizations.js +65 -0
- package/dist/tools/pages.js +597 -0
- package/dist/tools/platformInfo.js +44 -0
- package/dist/tools/projects.js +152 -0
- package/dist/tools/queries.js +48 -0
- package/dist/tools/rows.js +115 -0
- package/dist/tools/screens.js +97 -0
- package/dist/tools/templates.js +65 -0
- package/dist/tools/variables.js +94 -0
- package/dist/tools/views.js +58 -0
- package/dist/tools/workflows.js +196 -0
- package/package.json +49 -0
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_meta": {
|
|
3
|
+
"synthetic": false,
|
|
4
|
+
"note": "Kayıt yönetim sayfası: AYNI sayfa hem create hem edit yapar, ayrım ?id= query parametresidir. İki akış taşır — form/mount (kipi kur, edit ise kaydı yükle) ve form/submit (upsert + geri bildirim + yönlendirme). Adlar jenerikleştirildi.",
|
|
5
|
+
"harvestedFrom": "qm projesi '[SY] Departman' sayfası (form7f9a-mount + form-submit akışları), 2026-08-17; ayrıntı: zeyrek-mcp/docs/18-sayfa-arketipleri.md §1",
|
|
6
|
+
"pairsWith": "flow-list-to-form (liste sayfasından buraya geçiş)"
|
|
7
|
+
},
|
|
8
|
+
"_rules": {
|
|
9
|
+
"modeSwitch": "Create ve edit AYRI sayfa değildir. Kip `Page.queryParams.id` ile ayrılır: liste sayfası kaydı '?id=<kayıt>' ile açar, 'Yeni' butonu parametresiz açar. mount akışı buna göre buton metnini, breadcrumb başlığını ve audit kutusunun görünürlüğünü kurar.",
|
|
10
|
+
"conditionAlways": "Condition adımı `always` dalını kural dallarıyla BİRLİKTE taşır: always her koşumda çalışır (yükleniyor bayrağını kapatmanın yolu budur), kural dalları (branch.name = rule id) eşleşmeye göre. rules: [{id, expression, type:'if'}, {id, expression:'', type:'else'}].",
|
|
11
|
+
"fillFromStorage": "Alanları doldururken value {type:'storage', ref:'<adım ADI>.data.<alan>'} — stepId değil adım ADI. İlişki alanında dropdown'a etiket değil `.id` yazılır (…data.manager.id). audit-basic tek prop'ta beslenir: …data.meta (uç meta.createdAt/createdUserFullName/… döndürür).",
|
|
12
|
+
"propertyToBody": "Form alanlarını uca geçirme: parameters[] içinde {name, type, source:'body', value:{type:'property', ref:{source:'component', element:'<elementId>', property:'value'}}}. Kayıt anahtarı ise source:'query-string' + {type:'code', ref:'Page.queryParams.id'}.",
|
|
13
|
+
"upsert": "Tek POST ucu hem create hem update yapar (id geldiyse günceller). Entity başına iki uç yazmaya gerek yoktur; uç tarafı için platform_guide('microservice').",
|
|
14
|
+
"errorBranch": "Hata yolunu errorSteps ile kurma: errorSteps doluysa ANA akışın kalan adımları hiç çalışmaz ve yükleniyor bayrağı açık kalır. Doğrusu `condition Steps.<adımAdı>.error`.",
|
|
15
|
+
"feedback": "Geri bildirim `notification` komponentiyle verilir (kind: 'success' | 'error', header, content, isHidden:false, timeout), `alert` adımıyla değil — kullanıcı sayfada kalır ve kaydı görür.",
|
|
16
|
+
"validation": "Input'ların `validations` sözlüğü component_get'ten okunur (required/minLength/maxLength/pattern). form.errorElementId sayfadaki 'form-validation-errors' komponentinin elementId'sine bağlanır; hatalar orada listelenir.",
|
|
17
|
+
"sizes": "blocks[].size katalogdaki maxSize'ı aşamaz (textinput default h:8 iken maxSize.h:5). Gateway aşan değeri kırpar ve gatewayNormalized ile bildirir."
|
|
18
|
+
},
|
|
19
|
+
"pageCreateArgs": {
|
|
20
|
+
"name": "Departman",
|
|
21
|
+
"slug": "departman",
|
|
22
|
+
"browserTitle": "Departman",
|
|
23
|
+
"layoutId": "<layout id>",
|
|
24
|
+
"middlewareIds": ["<auth middleware id — korumalı kayıtta>"]
|
|
25
|
+
},
|
|
26
|
+
"schemaPatchOps": [
|
|
27
|
+
{
|
|
28
|
+
"op": "add_component",
|
|
29
|
+
"parent": "page_container",
|
|
30
|
+
"component": {
|
|
31
|
+
"elementId": "record_notification", "kind": "component", "type": "notification", "name": "record_notification",
|
|
32
|
+
"props": { "isHidden": { "type": "static", "data": true } },
|
|
33
|
+
"states": { "isSticky": false, "isDroppable": false, "isScrollable": false, "isWrapper": false },
|
|
34
|
+
"blocks": [{ "breakpoint": 1024, "size": { "h": 4, "w": 12 }, "position": { "x": 0, "y": 0 } }],
|
|
35
|
+
"children": [], "events": [], "validations": [], "stateBindings": []
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"op": "add_component",
|
|
40
|
+
"parent": "page_container",
|
|
41
|
+
"component": {
|
|
42
|
+
"elementId": "record_form", "kind": "component", "type": "form", "name": "record_form",
|
|
43
|
+
"props": {
|
|
44
|
+
"title": { "type": "static", "data": "Departman bilgileri" },
|
|
45
|
+
"errorElementId": { "type": "static", "data": "record_errors" }
|
|
46
|
+
},
|
|
47
|
+
"states": { "isSticky": false, "isDroppable": true, "isScrollable": false, "isWrapper": true },
|
|
48
|
+
"blocks": [{ "breakpoint": 1024, "size": { "h": 24, "w": 12 }, "position": { "x": 0, "y": 4 } }],
|
|
49
|
+
"children": [], "events": [], "validations": [], "stateBindings": []
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"op": "add_component",
|
|
54
|
+
"parent": "record_form",
|
|
55
|
+
"component": {
|
|
56
|
+
"elementId": "record_errors", "kind": "component", "type": "form-validation-errors", "name": "record_errors",
|
|
57
|
+
"props": {},
|
|
58
|
+
"states": { "isSticky": false, "isDroppable": false, "isScrollable": false, "isWrapper": false },
|
|
59
|
+
"blocks": [{ "breakpoint": 1024, "size": { "h": 4, "w": 12 }, "position": { "x": 0, "y": 0 } }],
|
|
60
|
+
"children": [], "events": [], "validations": [], "stateBindings": []
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"op": "add_component",
|
|
65
|
+
"parent": "record_form",
|
|
66
|
+
"component": {
|
|
67
|
+
"elementId": "in_name", "kind": "component", "type": "textinput", "name": "in_name",
|
|
68
|
+
"props": { "label": { "type": "static", "data": "Ad" }, "placeholder": { "type": "static", "data": "Departman adı" } },
|
|
69
|
+
"states": { "isSticky": false, "isDroppable": false, "isScrollable": false, "isWrapper": false },
|
|
70
|
+
"blocks": [{ "breakpoint": 1024, "size": { "h": 5, "w": 6 }, "position": { "x": 0, "y": 4 } }],
|
|
71
|
+
"children": [], "events": [],
|
|
72
|
+
"validations": [{ "name": "required", "value": true, "message": "Ad zorunludur." }],
|
|
73
|
+
"stateBindings": []
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"op": "add_component",
|
|
78
|
+
"parent": "record_form",
|
|
79
|
+
"component": {
|
|
80
|
+
"elementId": "in_manager", "kind": "component", "type": "dropdown", "name": "in_manager",
|
|
81
|
+
"props": { "label": { "type": "static", "data": "Yönetici" } },
|
|
82
|
+
"states": { "isSticky": false, "isDroppable": false, "isScrollable": false, "isWrapper": false },
|
|
83
|
+
"blocks": [{ "breakpoint": 1024, "size": { "h": 5, "w": 6 }, "position": { "x": 6, "y": 4 } }],
|
|
84
|
+
"children": [], "events": [], "validations": [], "stateBindings": []
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"op": "add_component",
|
|
89
|
+
"parent": "page_container",
|
|
90
|
+
"component": {
|
|
91
|
+
"elementId": "btn_save", "kind": "component", "type": "button", "name": "btn_save",
|
|
92
|
+
"props": { "text": { "type": "static", "data": "Kaydet" } },
|
|
93
|
+
"states": { "isSticky": false, "isDroppable": false, "isScrollable": false, "isWrapper": false },
|
|
94
|
+
"blocks": [{ "breakpoint": 1024, "size": { "h": 4, "w": 3 }, "position": { "x": 0, "y": 28 } }],
|
|
95
|
+
"children": [], "events": [], "validations": [], "stateBindings": []
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
{ "op": "set_event", "target": "record_form", "event": "mount", "eventValue": "<mount flow id>" },
|
|
99
|
+
{ "op": "set_event", "target": "record_form", "event": "submit", "eventValue": "<submit flow id>" }
|
|
100
|
+
],
|
|
101
|
+
"mountFlowCreateArgs": {
|
|
102
|
+
"host": "page",
|
|
103
|
+
"hostId": "<page id>",
|
|
104
|
+
"name": "record_form - mount",
|
|
105
|
+
"slug": "record-form-mount",
|
|
106
|
+
"steps": [
|
|
107
|
+
{
|
|
108
|
+
"stepId": "start", "name": "start", "type": "start", "kind": "normal", "args": {},
|
|
109
|
+
"branches": [{ "id": "<GUID>", "name": "always", "nextStepId": "begin_loading" }]
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"stepId": "begin_loading", "name": "begin_loading", "type": "setter", "kind": "normal",
|
|
113
|
+
"args": { "iteratees": [{
|
|
114
|
+
"id": "<GUID>", "type": "change", "source": "component",
|
|
115
|
+
"element": "page_container", "property": "isLoading",
|
|
116
|
+
"mapping": { "source": "", "mappings": {} },
|
|
117
|
+
"value": { "type": "static", "ref": true } }] },
|
|
118
|
+
"branches": [{ "id": "<GUID>", "name": "always", "nextStepId": "is_edit" }]
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
"stepId": "is_edit", "name": "is_edit", "type": "condition", "kind": "normal",
|
|
122
|
+
"args": { "iteratees": [], "parameters": [], "rules": [
|
|
123
|
+
{ "id": "<RULE-EDIT>", "expression": "Page.queryParams.id !== undefined", "type": "if" },
|
|
124
|
+
{ "id": "<RULE-CREATE>", "expression": "", "type": "else" }
|
|
125
|
+
] },
|
|
126
|
+
"branches": [
|
|
127
|
+
{ "id": "<GUID>", "name": "always", "nextStepId": "end_loading" },
|
|
128
|
+
{ "id": "<GUID>", "name": "<RULE-EDIT>", "nextStepId": "edit_labels" },
|
|
129
|
+
{ "id": "<GUID>", "name": "<RULE-CREATE>", "nextStepId": "create_labels" }
|
|
130
|
+
]
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"stepId": "edit_labels", "name": "edit_labels", "type": "setter", "kind": "normal",
|
|
134
|
+
"args": { "iteratees": [
|
|
135
|
+
{ "id": "<GUID>", "type": "change", "source": "component", "element": "btn_save", "property": "text",
|
|
136
|
+
"mapping": { "source": "", "mappings": {} }, "value": { "type": "static", "ref": "Değişiklikleri kaydet" } },
|
|
137
|
+
{ "id": "<GUID>", "type": "change", "source": "component", "element": "audit_box", "property": "isHidden",
|
|
138
|
+
"mapping": { "source": "", "mappings": {} }, "value": { "type": "static", "ref": false } }
|
|
139
|
+
] },
|
|
140
|
+
"branches": [{ "id": "<GUID>", "name": "always", "nextStepId": "get_record" }]
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
"stepId": "get_record", "name": "get_record", "type": "microservice", "kind": "normal",
|
|
144
|
+
"args": {
|
|
145
|
+
"microserviceId": "<tekil kayıt ucu id>", "isRaw": false,
|
|
146
|
+
"parameters": [{ "id": "<GUID>", "name": "id", "type": "number", "source": "query-string",
|
|
147
|
+
"value": { "type": "code", "ref": "Page.queryParams.id" } }]
|
|
148
|
+
},
|
|
149
|
+
"branches": [{ "id": "<GUID>", "name": "always", "nextStepId": "fill_form" }]
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
"stepId": "fill_form", "name": "fill_form", "type": "setter", "kind": "normal",
|
|
153
|
+
"args": { "iteratees": [
|
|
154
|
+
{ "id": "<GUID>", "type": "change", "source": "component", "element": "in_name", "property": "value",
|
|
155
|
+
"mapping": { "source": "", "mappings": {} }, "value": { "type": "storage", "ref": "get_record.data.name" } },
|
|
156
|
+
{ "id": "<GUID>", "type": "change", "source": "component", "element": "in_manager", "property": "value",
|
|
157
|
+
"mapping": { "source": "", "mappings": {} }, "value": { "type": "storage", "ref": "get_record.data.manager.id" } },
|
|
158
|
+
{ "id": "<GUID>", "type": "change", "source": "component", "element": "audit_box", "property": "meta",
|
|
159
|
+
"mapping": { "source": "", "mappings": {} }, "value": { "type": "storage", "ref": "get_record.data.meta" } }
|
|
160
|
+
] },
|
|
161
|
+
"branches": [{ "id": "<GUID>", "name": "always", "nextStepId": null }]
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
"stepId": "create_labels", "name": "create_labels", "type": "setter", "kind": "normal",
|
|
165
|
+
"args": { "iteratees": [
|
|
166
|
+
{ "id": "<GUID>", "type": "change", "source": "component", "element": "btn_save", "property": "text",
|
|
167
|
+
"mapping": { "source": "", "mappings": {} }, "value": { "type": "static", "ref": "Oluştur" } },
|
|
168
|
+
{ "id": "<GUID>", "type": "change", "source": "component", "element": "audit_box", "property": "isHidden",
|
|
169
|
+
"mapping": { "source": "", "mappings": {} }, "value": { "type": "static", "ref": true } }
|
|
170
|
+
] },
|
|
171
|
+
"branches": [{ "id": "<GUID>", "name": "always", "nextStepId": null }]
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
"stepId": "end_loading", "name": "end_loading", "type": "setter", "kind": "normal",
|
|
175
|
+
"args": { "iteratees": [{
|
|
176
|
+
"id": "<GUID>", "type": "change", "source": "component",
|
|
177
|
+
"element": "page_container", "property": "isLoading",
|
|
178
|
+
"mapping": { "source": "", "mappings": {} },
|
|
179
|
+
"value": { "type": "static", "ref": false } }] },
|
|
180
|
+
"branches": [{ "id": "<GUID>", "name": "always", "nextStepId": null }]
|
|
181
|
+
}
|
|
182
|
+
]
|
|
183
|
+
},
|
|
184
|
+
"submitFlowCreateArgs": {
|
|
185
|
+
"host": "page",
|
|
186
|
+
"hostId": "<page id>",
|
|
187
|
+
"name": "record_form - submit",
|
|
188
|
+
"slug": "record-form-submit",
|
|
189
|
+
"steps": [
|
|
190
|
+
{
|
|
191
|
+
"stepId": "start", "name": "start", "type": "start", "kind": "normal", "args": {},
|
|
192
|
+
"branches": [{ "id": "<GUID>", "name": "always", "nextStepId": "begin_saving" }]
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
"stepId": "begin_saving", "name": "begin_saving", "type": "setter", "kind": "normal",
|
|
196
|
+
"args": { "iteratees": [{
|
|
197
|
+
"id": "<GUID>", "type": "change", "source": "component", "element": "btn_save", "property": "isLoading",
|
|
198
|
+
"mapping": { "source": "", "mappings": {} }, "value": { "type": "static", "ref": true } }] },
|
|
199
|
+
"branches": [{ "id": "<GUID>", "name": "always", "nextStepId": "upsert_record" }]
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
"stepId": "upsert_record", "name": "upsert_record", "type": "microservice", "kind": "normal",
|
|
203
|
+
"args": {
|
|
204
|
+
"microserviceId": "<upsert ucu id>", "isRaw": false,
|
|
205
|
+
"parameters": [
|
|
206
|
+
{ "id": "<GUID>", "name": "id", "type": "number", "source": "query-string",
|
|
207
|
+
"value": { "type": "code", "ref": "Page.queryParams.id" } },
|
|
208
|
+
{ "id": "<GUID>", "name": "name", "type": "string", "source": "body",
|
|
209
|
+
"value": { "type": "property", "ref": { "source": "component", "element": "in_name", "property": "value" } } },
|
|
210
|
+
{ "id": "<GUID>", "name": "manager", "type": "guid", "source": "body",
|
|
211
|
+
"value": { "type": "property", "ref": { "source": "component", "element": "in_manager", "property": "value" } } }
|
|
212
|
+
]
|
|
213
|
+
},
|
|
214
|
+
"branches": [{ "id": "<GUID>", "name": "always", "nextStepId": "has_error" }]
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
"stepId": "has_error", "name": "has_error", "type": "condition", "kind": "normal",
|
|
218
|
+
"args": { "iteratees": [], "parameters": [], "rules": [
|
|
219
|
+
{ "id": "<RULE-ERROR>", "expression": "Steps.upsert_record.error", "type": "if" },
|
|
220
|
+
{ "id": "<RULE-OK>", "expression": "", "type": "else" }
|
|
221
|
+
] },
|
|
222
|
+
"branches": [
|
|
223
|
+
{ "id": "<GUID>", "name": "always", "nextStepId": "end_saving" },
|
|
224
|
+
{ "id": "<GUID>", "name": "<RULE-ERROR>", "nextStepId": "show_error" },
|
|
225
|
+
{ "id": "<GUID>", "name": "<RULE-OK>", "nextStepId": "was_edit" }
|
|
226
|
+
]
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
"stepId": "show_error", "name": "show_error", "type": "setter", "kind": "normal",
|
|
230
|
+
"args": { "iteratees": [
|
|
231
|
+
{ "id": "<GUID>", "type": "change", "source": "component", "element": "record_notification", "property": "kind",
|
|
232
|
+
"mapping": { "source": "", "mappings": {} }, "value": { "type": "static", "ref": "error" } },
|
|
233
|
+
{ "id": "<GUID>", "type": "change", "source": "component", "element": "record_notification", "property": "content",
|
|
234
|
+
"mapping": { "source": "", "mappings": {} }, "value": { "type": "static", "ref": "Kayıt sırasında bir hata oluştu. Bilgileri kontrol edip yeniden deneyin." } },
|
|
235
|
+
{ "id": "<GUID>", "type": "change", "source": "component", "element": "record_notification", "property": "isHidden",
|
|
236
|
+
"mapping": { "source": "", "mappings": {} }, "value": { "type": "static", "ref": false } }
|
|
237
|
+
] },
|
|
238
|
+
"branches": [{ "id": "<GUID>", "name": "always", "nextStepId": null }]
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
"stepId": "was_edit", "name": "was_edit", "type": "condition", "kind": "normal",
|
|
242
|
+
"args": { "iteratees": [], "parameters": [], "rules": [
|
|
243
|
+
{ "id": "<RULE-EDIT>", "expression": "Page.queryParams.id", "type": "if" },
|
|
244
|
+
{ "id": "<RULE-CREATE>", "expression": "", "type": "else" }
|
|
245
|
+
] },
|
|
246
|
+
"branches": [
|
|
247
|
+
{ "id": "<GUID>", "name": "<RULE-EDIT>", "nextStepId": "show_success" },
|
|
248
|
+
{ "id": "<GUID>", "name": "<RULE-CREATE>", "nextStepId": "go_list" }
|
|
249
|
+
]
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
"stepId": "show_success", "name": "show_success", "type": "setter", "kind": "normal",
|
|
253
|
+
"args": { "iteratees": [
|
|
254
|
+
{ "id": "<GUID>", "type": "change", "source": "component", "element": "record_notification", "property": "kind",
|
|
255
|
+
"mapping": { "source": "", "mappings": {} }, "value": { "type": "static", "ref": "success" } },
|
|
256
|
+
{ "id": "<GUID>", "type": "change", "source": "component", "element": "record_notification", "property": "content",
|
|
257
|
+
"mapping": { "source": "", "mappings": {} }, "value": { "type": "static", "ref": "Kayıt güncellendi." } },
|
|
258
|
+
{ "id": "<GUID>", "type": "change", "source": "component", "element": "record_notification", "property": "isHidden",
|
|
259
|
+
"mapping": { "source": "", "mappings": {} }, "value": { "type": "static", "ref": false } },
|
|
260
|
+
{ "id": "<GUID>", "type": "change", "source": "component", "element": "record_notification", "property": "timeout",
|
|
261
|
+
"mapping": { "source": "", "mappings": {} }, "value": { "type": "static", "ref": 7000 } }
|
|
262
|
+
] },
|
|
263
|
+
"branches": [{ "id": "<GUID>", "name": "always", "nextStepId": null }]
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
"stepId": "go_list", "name": "go_list", "type": "redirect", "kind": "normal",
|
|
267
|
+
"args": { "pageId": "<liste sayfası id>", "path": "departmanlar", "query": "" },
|
|
268
|
+
"branches": [{ "id": "<GUID>", "name": "always", "nextStepId": null }]
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
"stepId": "end_saving", "name": "end_saving", "type": "setter", "kind": "normal",
|
|
272
|
+
"args": { "iteratees": [{
|
|
273
|
+
"id": "<GUID>", "type": "change", "source": "component", "element": "btn_save", "property": "isLoading",
|
|
274
|
+
"mapping": { "source": "", "mappings": {} }, "value": { "type": "static", "ref": false } }] },
|
|
275
|
+
"branches": [{ "id": "<GUID>", "name": "always", "nextStepId": null }]
|
|
276
|
+
}
|
|
277
|
+
]
|
|
278
|
+
}
|
|
279
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_meta": {
|
|
3
|
+
"synthetic": true,
|
|
4
|
+
"note": "HTML kaçış kapısı örneği: hazır komponentlerin karşılamadığı özel bir gösterim (durum panosu) html komponentiyle kurulur. Üç köprü birden görünür: Mustache + context ile veri basma (flow'dan HTML'e), actions + fireEvent ile flow tetikleme (HTML'den flow'a), loadScript/onCleanup ile harici kütüphane ve temizlik.",
|
|
5
|
+
"pairsWith": "flow-load-table (veri çekme deseni), page-detail-profile (sayfa iskeleti)",
|
|
6
|
+
"sourceRef": "NgApps.UI/packages/ng-apps-ui/src/components/html/* ; rehber: platform_guide('html')"
|
|
7
|
+
},
|
|
8
|
+
"_rules": {
|
|
9
|
+
"mustacheContext": "content '{{' içeriyorsa context prop'uyla Mustache olarak render edilir; setter adımı context'e yazınca içerik otomatik yeniden render olur. Veriyi script'te fetch'leme — akışta topla, context'e yaz.",
|
|
10
|
+
"actionsNotSetEvent": "Aksiyonlar set_event ile BAĞLANMAZ: her actions satırı akışını kendi flow prop'unda taşır (type:'flow', ref:<flowId>). Şema olayı yalnız mount'tur.",
|
|
11
|
+
"fireEventContract": "HTML içinden fireEvent('<key>', data) çağrısı key'i eşleşen aksiyonun akışını çalıştırır; akışta event.name = key, event.data = data.",
|
|
12
|
+
"scriptRules": "Satır içi script çalışır ve içerik değiştikçe yeniden çalışır; <script src> yüklenmez — harici kütüphane loadScript(url) ile, temizlik onCleanup(fn) ile. Script'ler Page/Steps bağlamına erişemez.",
|
|
13
|
+
"styleScope": "style prop'u emotion css() bloğudur: iç seçiciler çalışır, sınıf komponente scope'ludur."
|
|
14
|
+
},
|
|
15
|
+
"schemaPatchOps": [
|
|
16
|
+
{
|
|
17
|
+
"op": "add_component",
|
|
18
|
+
"parent": "page_container",
|
|
19
|
+
"component": {
|
|
20
|
+
"elementId": "durum_panosu",
|
|
21
|
+
"kind": "component",
|
|
22
|
+
"type": "html",
|
|
23
|
+
"name": "durum_panosu",
|
|
24
|
+
"props": {
|
|
25
|
+
"content": {
|
|
26
|
+
"type": "static",
|
|
27
|
+
"data": "<div class=\"pano\">{{#kuyruklar}}<div class=\"pano__kart\" onclick=\"fireEvent('kuyruk_ac', { slug: '{{slug}}' })\"><b>{{ad}}</b><span>{{bekleyen}} bekleyen</span></div>{{/kuyruklar}}<button onclick=\"fireEvent('yenile')\">Yenile</button></div><script>const zamanlayici = setInterval(() => fireEvent('yenile'), 60000); onCleanup(() => clearInterval(zamanlayici));</script>"
|
|
28
|
+
},
|
|
29
|
+
"context": { "type": "static", "data": { "kuyruklar": { "type": "static", "data": [] } } },
|
|
30
|
+
"style": {
|
|
31
|
+
"type": "static",
|
|
32
|
+
"data": ".pano { display: flex; gap: 12px; } .pano__kart { cursor: pointer; padding: 12px; border-radius: 8px; background: #f4f4f4; } .pano__kart:hover { background: #e8e8e8; }"
|
|
33
|
+
},
|
|
34
|
+
"actions": {
|
|
35
|
+
"type": "static",
|
|
36
|
+
"data": [
|
|
37
|
+
{
|
|
38
|
+
"key": { "type": "static", "data": "yenile" },
|
|
39
|
+
"text": { "type": "static", "data": "Yenile" },
|
|
40
|
+
"flow": { "type": "flow", "ref": "<panoyu dolduran flow id>" }
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"key": { "type": "static", "data": "kuyruk_ac" },
|
|
44
|
+
"text": { "type": "static", "data": "Kuyruk aç" },
|
|
45
|
+
"flow": { "type": "flow", "ref": "<detaya giden flow id>" }
|
|
46
|
+
}
|
|
47
|
+
]
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
"states": { "isSticky": false, "isDroppable": false, "isScrollable": false, "isWrapper": false },
|
|
51
|
+
"blocks": [{ "breakpoint": 1024, "size": { "h": 12, "w": 12 }, "position": { "x": 0, "y": 0 } }],
|
|
52
|
+
"children": [],
|
|
53
|
+
"events": [],
|
|
54
|
+
"validations": [],
|
|
55
|
+
"stateBindings": []
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
],
|
|
59
|
+
"flows": [
|
|
60
|
+
{
|
|
61
|
+
"name": "Panoyu doldur",
|
|
62
|
+
"slug": "panoyu-doldur",
|
|
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
|
+
"steps": [
|
|
65
|
+
{
|
|
66
|
+
"stepId": "start", "name": "Start", "type": "start", "kind": "normal", "args": {},
|
|
67
|
+
"branches": [{ "id": "<GUID>", "name": "always", "nextStepId": "kuyruklari_getir" }]
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"stepId": "kuyruklari_getir", "name": "kuyruklari_getir", "type": "microservice", "kind": "normal",
|
|
71
|
+
"args": { "microserviceId": "<kuyruk özet ucu>", "isRaw": false, "parameters": [] },
|
|
72
|
+
"branches": [{ "id": "<GUID>", "name": "always", "nextStepId": "panoya_yaz" }]
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"stepId": "panoya_yaz", "name": "panoya_yaz", "type": "setter", "kind": "normal",
|
|
76
|
+
"args": { "iteratees": [{
|
|
77
|
+
"id": "<GUID>",
|
|
78
|
+
"type": "change",
|
|
79
|
+
"element": "durum_panosu",
|
|
80
|
+
"property": "context",
|
|
81
|
+
"source": "component",
|
|
82
|
+
"mapping": { "source": "", "mappings": {} },
|
|
83
|
+
"value": { "type": "code", "ref": "({ kuyruklar: Array.isArray(Steps.kuyruklari_getir?.data) ? Steps.kuyruklari_getir.data : [] })" }
|
|
84
|
+
}] },
|
|
85
|
+
"branches": [{ "id": "<GUID>", "name": "always", "nextStepId": null }]
|
|
86
|
+
}
|
|
87
|
+
]
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"name": "Kuyruk detayına git",
|
|
91
|
+
"slug": "kuyruk-detayina-git",
|
|
92
|
+
"note": "actions[1].flow buna işaret eder; fireEvent yükü event.data'dan okunur.",
|
|
93
|
+
"steps": [
|
|
94
|
+
{
|
|
95
|
+
"stepId": "start", "name": "Start", "type": "start", "kind": "normal", "args": {},
|
|
96
|
+
"branches": [{ "id": "<GUID>", "name": "always", "nextStepId": "detaya_git" }]
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"stepId": "detaya_git", "name": "detaya_git", "type": "redirect", "kind": "normal",
|
|
100
|
+
"args": { "pageId": "<kuyruk detay sayfası id>", "path": "kuyruk", "query": "`slug=${event.data.slug}`" },
|
|
101
|
+
"branches": [{ "id": "<GUID>", "name": "always", "nextStepId": null }]
|
|
102
|
+
}
|
|
103
|
+
]
|
|
104
|
+
}
|
|
105
|
+
]
|
|
106
|
+
}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_meta": {
|
|
3
|
+
"synthetic": false,
|
|
4
|
+
"note": "Giriş sayfası: auth-layout + form(email/password/beni hatırla) → sign-in ucu → token cookie → yönlendirme. Kimlik middleware'i kuran her projede bu sayfa ZORUNLUDUR; yoksa sistem kullanılamaz (uçlar 401 döner, kullanıcı token üretemez).",
|
|
5
|
+
"harvestedFrom": "qm projesi 'Giriş Yap' sayfası (form-submit akışı), 2026-08-17; ayrıntı: zeyrek-mcp/docs/18-sayfa-arketipleri.md §3",
|
|
6
|
+
"pairsWith": "middleware-authenticate (token'ı okuyan guard)"
|
|
7
|
+
},
|
|
8
|
+
"_rules": {
|
|
9
|
+
"cookieNameContract": "setcookie'deki ad ile auth middleware'inin okuduğu ad BİREBİR aynı olmalı (burada APP_Token → middleware'de cookie.APP_Token). Uyuşmazlık 'her istek 401' olarak görünür ve teşhisi zordur.",
|
|
10
|
+
"signInEndpoint": "Sign-in ucu bir workflow'dur: kullanıcıyı e-postayla bulur, şifreyi karşılaştırır, system.generateToken({...claims}) ile token üretir. Claim anahtarları neyse middleware onları okur (claims.userId gibi) — token.data.id diye evrensel bir alan YOKTUR. Bkz. platform_guide('expressions') ve platform_guide('middleware') Tarif 1.",
|
|
11
|
+
"conditionAlways": "Token kontrolü condition ile yapılır; `always` dalı buton durumunu her koşumda sıfırlar, kural dalları başarı/hata yolunu ayırır.",
|
|
12
|
+
"rawRedirect": "redirect isRaw:true iken path ÇOK SATIRLI JS bloğudur ve son ifadenin değeri hedef adrestir. 'Korunan sayfaya gitmek isterken login'e düşen kullanıcıyı geri gönderme' deseni budur; yoksa sabit bir sayfaya gidilir (pageId + path).",
|
|
13
|
+
"objectProp": "Prop değeri nesne olabilir: icon → { type:'static', ref:{ name:'progress_activity' } }.",
|
|
14
|
+
"pageIsPublic": "Giriş sayfasına middlewareIds BAĞLANMAZ (guard'lı olsaydı kullanıcı giriş yapamazdı). Buna karşılık diğer sayfalar ve korunan uçlar middlewareIds ile bağlanır.",
|
|
15
|
+
"notificationIsHidden": "notification KATALOĞUNDA isHidden YOKTUR: şemaya props.isHidden yazmak 'unknown-prop' ile reddedilir (bu örneğin eski hâli öyleydi — crm koşumu B-10). Runtime'da gizleme her komponentte çalışır ama prop'u SETTER yazar. Başlangıçta gizli göstermek için komponenti isHidden'ı OLAN bir container'a (box_message) sar ve koşulu sarmalayıcıya bağla; appearance.isHidden bir çözüm DEĞİLDİR — runtime onu hiç okumaz.",
|
|
16
|
+
"validationShape": "Validation gövdesi DÖRT alan taşır: { type, message, value, isActive }. 'name' anahtarı JsonIgnore'dur — {name, value, message} yazarsan tip enum varsayılanına düşer ve alan sessizce REGEX doğrulamasına döner. Tip adları TİRELİDİR (max-length / min-length / max-value / min-value); 'maxLength' backend'e yazılır ama runtime doğrulayıcı onu tanımaz ve doğrulama hiç koşmaz. Gateway düzeltebildiğini düzeltir, kalanını PAGE-016 ile reddeder."
|
|
17
|
+
},
|
|
18
|
+
"pageCreateArgs": {
|
|
19
|
+
"name": "Giriş Yap",
|
|
20
|
+
"slug": "giris-yap",
|
|
21
|
+
"browserTitle": "Giriş Yap",
|
|
22
|
+
"middlewareIds": []
|
|
23
|
+
},
|
|
24
|
+
"schemaPatchOps": [
|
|
25
|
+
{
|
|
26
|
+
"op": "add_component",
|
|
27
|
+
"parent": "page_container",
|
|
28
|
+
"component": {
|
|
29
|
+
"elementId": "auth_layout", "kind": "component", "type": "auth-layout", "name": "auth_layout",
|
|
30
|
+
"props": {},
|
|
31
|
+
"states": { "isSticky": false, "isDroppable": true, "isScrollable": false, "isWrapper": true },
|
|
32
|
+
"blocks": [{ "breakpoint": 1024, "size": { "h": 80, "w": 12 }, "position": { "x": 0, "y": 0 } }],
|
|
33
|
+
"children": [], "events": [], "validations": [], "stateBindings": []
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"op": "add_component",
|
|
38
|
+
"parent": "auth_layout",
|
|
39
|
+
"component": {
|
|
40
|
+
"elementId": "box_message", "kind": "component", "type": "container", "name": "box_message",
|
|
41
|
+
"props": { "isHidden": { "type": "static", "data": true }, "layout": { "type": "static", "data": "flex" },
|
|
42
|
+
"direction": { "type": "static", "data": "column" }, "size": { "type": "static", "data": "shrink" },
|
|
43
|
+
"style": { "type": "static", "data": { "background": { "type": "static", "data": "transparent" },
|
|
44
|
+
"border": { "type": "static", "data": "none" } } } },
|
|
45
|
+
"states": { "isSticky": false, "isDroppable": true, "isScrollable": false, "isWrapper": false },
|
|
46
|
+
"blocks": [{ "breakpoint": 1024, "size": { "h": 4, "w": 12 }, "position": { "x": 0, "y": 0 } }],
|
|
47
|
+
"children": [], "events": [], "validations": [], "stateBindings": []
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"op": "add_component",
|
|
52
|
+
"parent": "box_message",
|
|
53
|
+
"component": {
|
|
54
|
+
"elementId": "sign_in_message", "kind": "component", "type": "notification", "name": "sign_in_message",
|
|
55
|
+
"props": { "kind": { "type": "static", "data": "error" } },
|
|
56
|
+
"states": { "isSticky": false, "isDroppable": false, "isScrollable": false, "isWrapper": false },
|
|
57
|
+
"blocks": [{ "breakpoint": 1024, "size": { "h": 4, "w": 12 }, "position": { "x": 0, "y": 0 } }],
|
|
58
|
+
"children": [], "events": [], "validations": [], "stateBindings": []
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"op": "add_component",
|
|
63
|
+
"parent": "auth_layout",
|
|
64
|
+
"component": {
|
|
65
|
+
"elementId": "sign_in_form", "kind": "component", "type": "form", "name": "sign_in_form",
|
|
66
|
+
"props": { "title": { "type": "static", "data": "Giriş" }, "hideBorders": { "type": "static", "data": true } },
|
|
67
|
+
"states": { "isSticky": false, "isDroppable": true, "isScrollable": false, "isWrapper": true },
|
|
68
|
+
"blocks": [{ "breakpoint": 1024, "size": { "h": 24, "w": 12 }, "position": { "x": 0, "y": 4 } }],
|
|
69
|
+
"children": [], "events": [], "validations": [], "stateBindings": []
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"op": "add_component",
|
|
74
|
+
"parent": "sign_in_form",
|
|
75
|
+
"component": {
|
|
76
|
+
"elementId": "in_email", "kind": "component", "type": "textinput", "name": "in_email",
|
|
77
|
+
"props": { "label": { "type": "static", "data": "E-posta" } },
|
|
78
|
+
"states": { "isSticky": false, "isDroppable": false, "isScrollable": false, "isWrapper": false },
|
|
79
|
+
"blocks": [{ "breakpoint": 1024, "size": { "h": 5, "w": 12 }, "position": { "x": 0, "y": 0 } }],
|
|
80
|
+
"children": [], "events": [],
|
|
81
|
+
"validations": [{ "type": "required", "message": "E-posta zorunludur.", "value": true, "isActive": true },
|
|
82
|
+
{ "type": "email", "message": "Geçerli bir e-posta girin.", "value": true, "isActive": true },
|
|
83
|
+
{ "type": "max-length", "message": "En fazla 120 karakter.", "value": 120, "isActive": true }],
|
|
84
|
+
"stateBindings": []
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"op": "add_component",
|
|
89
|
+
"parent": "sign_in_form",
|
|
90
|
+
"component": {
|
|
91
|
+
"elementId": "in_password", "kind": "component", "type": "password", "name": "in_password",
|
|
92
|
+
"props": { "label": { "type": "static", "data": "Şifre" } },
|
|
93
|
+
"states": { "isSticky": false, "isDroppable": false, "isScrollable": false, "isWrapper": false },
|
|
94
|
+
"blocks": [{ "breakpoint": 1024, "size": { "h": 5, "w": 12 }, "position": { "x": 0, "y": 5 } }],
|
|
95
|
+
"children": [], "events": [],
|
|
96
|
+
"validations": [{ "type": "required", "message": "Şifre zorunludur.", "value": true, "isActive": true },
|
|
97
|
+
{ "type": "min-length", "message": "En az 6 karakter.", "value": 6, "isActive": true }],
|
|
98
|
+
"stateBindings": []
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"op": "add_component",
|
|
103
|
+
"parent": "sign_in_form",
|
|
104
|
+
"component": {
|
|
105
|
+
"elementId": "btn_sign_in", "kind": "component", "type": "button", "name": "btn_sign_in",
|
|
106
|
+
"props": { "text": { "type": "static", "data": "Giriş yap" } },
|
|
107
|
+
"states": { "isSticky": false, "isDroppable": false, "isScrollable": false, "isWrapper": false },
|
|
108
|
+
"blocks": [{ "breakpoint": 1024, "size": { "h": 4, "w": 12 }, "position": { "x": 0, "y": 10 } }],
|
|
109
|
+
"children": [], "events": [], "validations": [], "stateBindings": []
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
{ "op": "set_event", "target": "sign_in_form", "event": "submit", "eventValue": "<sign-in flow id>" }
|
|
113
|
+
],
|
|
114
|
+
"submitFlowCreateArgs": {
|
|
115
|
+
"host": "page",
|
|
116
|
+
"hostId": "<giriş sayfası id>",
|
|
117
|
+
"name": "sign_in_form - submit",
|
|
118
|
+
"slug": "sign-in-form-submit",
|
|
119
|
+
"steps": [
|
|
120
|
+
{
|
|
121
|
+
"stepId": "start", "name": "start", "type": "start", "kind": "normal", "args": {},
|
|
122
|
+
"branches": [{ "id": "<GUID>", "name": "always", "nextStepId": "begin" }]
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
"stepId": "begin", "name": "begin", "type": "setter", "kind": "normal",
|
|
126
|
+
"args": { "iteratees": [
|
|
127
|
+
{ "id": "<GUID>", "type": "change", "source": "component", "element": "btn_sign_in", "property": "isLoading",
|
|
128
|
+
"mapping": { "source": "", "mappings": {} }, "value": { "type": "static", "ref": true } },
|
|
129
|
+
{ "id": "<GUID>", "type": "change", "source": "component", "element": "btn_sign_in", "property": "isDisabled",
|
|
130
|
+
"mapping": { "source": "", "mappings": {} }, "value": { "type": "static", "ref": true } },
|
|
131
|
+
{ "id": "<GUID>", "type": "change", "source": "component", "element": "box_message", "property": "isHidden",
|
|
132
|
+
"mapping": { "source": "", "mappings": {} }, "value": { "type": "static", "ref": true } }
|
|
133
|
+
] },
|
|
134
|
+
"branches": [{ "id": "<GUID>", "name": "always", "nextStepId": "sign_in" }]
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"stepId": "sign_in", "name": "sign_in", "type": "microservice", "kind": "normal",
|
|
138
|
+
"args": {
|
|
139
|
+
"microserviceId": "<sign-in ucu id>", "isRaw": false,
|
|
140
|
+
"parameters": [
|
|
141
|
+
{ "id": "<GUID>", "name": "email", "type": "string", "source": "body",
|
|
142
|
+
"value": { "type": "property", "ref": { "source": "component", "element": "in_email", "property": "value" } } },
|
|
143
|
+
{ "id": "<GUID>", "name": "password", "type": "string", "source": "body",
|
|
144
|
+
"value": { "type": "property", "ref": { "source": "component", "element": "in_password", "property": "value" } } }
|
|
145
|
+
]
|
|
146
|
+
},
|
|
147
|
+
"branches": [{ "id": "<GUID>", "name": "always", "nextStepId": "has_token" }]
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
"stepId": "has_token", "name": "has_token", "type": "condition", "kind": "normal",
|
|
151
|
+
"args": { "iteratees": [], "parameters": [], "rules": [
|
|
152
|
+
{ "id": "<RULE-OK>", "expression": "!!Steps.sign_in.data.token", "type": "if" },
|
|
153
|
+
{ "id": "<RULE-FAIL>", "expression": "", "type": "else" }
|
|
154
|
+
] },
|
|
155
|
+
"branches": [
|
|
156
|
+
{ "id": "<GUID>", "name": "always", "nextStepId": "reset_button" },
|
|
157
|
+
{ "id": "<GUID>", "name": "<RULE-OK>", "nextStepId": "store_token" },
|
|
158
|
+
{ "id": "<GUID>", "name": "<RULE-FAIL>", "nextStepId": "show_error" }
|
|
159
|
+
]
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
"stepId": "store_token", "name": "store_token", "type": "setcookie", "kind": "normal",
|
|
163
|
+
"args": { "name": "APP_Token", "value": "Steps.sign_in.data.token", "expiresInHours": 240 },
|
|
164
|
+
"branches": [{ "id": "<GUID>", "name": "always", "nextStepId": "go_home" }]
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
"stepId": "go_home", "name": "go_home", "type": "redirect", "kind": "normal",
|
|
168
|
+
"args": { "pageId": "<ana sayfa id>", "path": "anasayfa", "query": "" },
|
|
169
|
+
"branches": [{ "id": "<GUID>", "name": "always", "nextStepId": null }]
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"stepId": "show_error", "name": "show_error", "type": "setter", "kind": "normal",
|
|
173
|
+
"args": { "iteratees": [
|
|
174
|
+
{ "id": "<GUID>", "type": "change", "source": "component", "element": "sign_in_message", "property": "content",
|
|
175
|
+
"mapping": { "source": "", "mappings": {} },
|
|
176
|
+
"value": { "type": "code", "ref": "Steps.sign_in.data.message || 'E-posta veya şifre hatalı.'" } },
|
|
177
|
+
{ "id": "<GUID>", "type": "change", "source": "component", "element": "box_message", "property": "isHidden",
|
|
178
|
+
"mapping": { "source": "", "mappings": {} }, "value": { "type": "static", "ref": false } }
|
|
179
|
+
] },
|
|
180
|
+
"branches": [{ "id": "<GUID>", "name": "always", "nextStepId": null }]
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
"stepId": "reset_button", "name": "reset_button", "type": "setter", "kind": "normal",
|
|
184
|
+
"args": { "iteratees": [
|
|
185
|
+
{ "id": "<GUID>", "type": "change", "source": "component", "element": "btn_sign_in", "property": "isLoading",
|
|
186
|
+
"mapping": { "source": "", "mappings": {} }, "value": { "type": "static", "ref": false } },
|
|
187
|
+
{ "id": "<GUID>", "type": "change", "source": "component", "element": "btn_sign_in", "property": "isDisabled",
|
|
188
|
+
"mapping": { "source": "", "mappings": {} }, "value": { "type": "static", "ref": false } }
|
|
189
|
+
] },
|
|
190
|
+
"branches": [{ "id": "<GUID>", "name": "always", "nextStepId": null }]
|
|
191
|
+
}
|
|
192
|
+
]
|
|
193
|
+
}
|
|
194
|
+
}
|