@appaflytech/zeyrek-ai-mcp 0.0.43 → 0.0.46
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/knowledge/backendConstraints.js +86 -2
- package/dist/knowledge/componentCatalog.js +63 -26
- package/dist/knowledge/componentEvents.js +6 -0
- package/dist/knowledge/connectDataBind.js +43 -6
- package/dist/knowledge/connectDataDefinition.js +74 -3
- package/dist/knowledge/connectDataRules.js +14 -0
- package/dist/knowledge/mobileComponentCatalog.js +67 -8
- package/dist/knowledge/mobileStore.js +61 -2
- package/dist/knowledge/platform/lint.js +23 -0
- package/dist/knowledge/platform/mobile.js +1 -1
- package/dist/knowledge/platform/mobileOffline.js +45 -0
- package/dist/knowledge/platform/mobileRules.js +8 -1
- package/dist/knowledge/platform/mobileTabs.js +31 -2
- package/dist/knowledge/platform/web.js +1 -1
- package/dist/knowledge/rules.js +220 -7
- package/dist/knowledge/textHooks.js +434 -0
- package/dist/platform/capture/capture.js +1 -1
- package/dist/platform/capture/readiness.js +4 -0
- package/dist/platform/errors.js +22 -2
- package/dist/prompts/mobilePublish.js +21 -0
- package/dist/resources/examples/flow-biometric-confirm.json +199 -0
- package/dist/resources/examples/microfunction-node-dependencies.json +19 -0
- package/dist/resources/examples/mobile-offline-list.json +357 -0
- package/dist/resources/examples/mobile-offline-queue.json +82 -0
- package/dist/resources/examples/mobile-offline-seamless.json +1520 -0
- package/dist/resources/guides/access.md +4 -4
- package/dist/resources/guides/component.md +20 -4
- package/dist/resources/guides/deployment.md +98 -0
- package/dist/resources/guides/entity.md +1 -1
- package/dist/resources/guides/expressions.md +5 -1
- package/dist/resources/guides/external-component.md +6 -4
- package/dist/resources/guides/merge.md +81 -4
- package/dist/resources/guides/microfunction.md +104 -9
- package/dist/resources/guides/microservice.md +34 -5
- package/dist/resources/guides/mobile-connect-data.md +70 -0
- package/dist/resources/guides/mobile-flow.md +64 -0
- package/dist/resources/guides/mobile-publish.md +161 -16
- package/dist/resources/guides/mobile-steps.md +21 -1
- package/dist/resources/guides/mobile.md +45 -23
- package/dist/resources/guides/page.md +122 -5
- package/dist/resources/guides/translation.md +97 -2
- package/dist/resources/knowledge.js +3 -1
- package/dist/resources/prompts/mobile-publish-prepare.md +89 -0
- package/dist/resources/schema-fingerprint.json +4 -4
- package/dist/resources/schemas/ApplyMicrofunctionArchiveChangesCommand.json +76 -0
- package/dist/resources/schemas/ConnectDataDescribeDto.json +44 -0
- package/dist/resources/schemas/ConnectDataResultDto.json +10 -0
- package/dist/resources/schemas/CreateMicrofunctionCommand.json +8 -0
- package/dist/resources/schemas/CreateMicroserviceCommand.json +3 -0
- package/dist/resources/schemas/InvokeMicrofunctionCommand.json +0 -4
- package/dist/resources/schemas/MicroserviceDto.json +3 -0
- package/dist/resources/schemas/MobileStorePreflightScope.json +13 -0
- package/dist/resources/schemas/StartMobileBuildCommand.json +35 -1
- package/dist/resources/schemas/UpdateMicrofunctionCommand.json +8 -0
- package/dist/resources/schemas/UpdateMicroserviceCommand.json +3 -0
- package/dist/resources/schemas/UpsertMobileStoreSettingsCommand.json +75 -0
- package/dist/server.js +2 -0
- package/dist/tools/accessRuntime.js +1 -1
- package/dist/tools/applications.js +16 -2
- package/dist/tools/common.js +6 -0
- package/dist/tools/components.js +19 -6
- package/dist/tools/connectData.js +9 -4
- package/dist/tools/deployments.js +1 -1
- package/dist/tools/designSchemaPatch.js +16 -4
- package/dist/tools/environments.js +3 -3
- package/dist/tools/files.js +1 -1
- package/dist/tools/flows.js +118 -7
- package/dist/tools/layouts.js +32 -12
- package/dist/tools/merges.js +8 -8
- package/dist/tools/microfunctions.js +53 -3
- package/dist/tools/mobileStore.js +83 -21
- package/dist/tools/pages.js +59 -24
- package/dist/tools/platformInfo.js +4 -2
- package/dist/tools/textHookGuard.js +116 -0
- package/package.json +2 -2
|
@@ -571,6 +571,24 @@ function datasourceFindings(body) {
|
|
|
571
571
|
const MICROFUNCTION_ENTRYPOINT_PATTERN = /^[A-Za-z_][\w./-]*\.[A-Za-z_]\w*$/;
|
|
572
572
|
const MICROFUNCTION_ENVIRONMENT_KEY_PATTERN = /^[A-Z_][A-Z0-9_]*$/;
|
|
573
573
|
const MICROFUNCTION_ROLE_ARN_PATTERN = /^arn:aws:iam::\d{12}:role\/.+$/;
|
|
574
|
+
/**
|
|
575
|
+
* `IMicrofunctionDependencyStrategy.IsValid`'in aynası, dil başına tek satır kuralı: Python satırı
|
|
576
|
+
* requirements.txt'e olduğu gibi girer ama `-` ile başlayamaz (pip seçeneği yok), Node satırı
|
|
577
|
+
* `ad@aralık` (`MicrofunctionConstants.NodeDependencyLinePattern`). Boş ve `#` satırları yorumdur.
|
|
578
|
+
* Dil adı burada taşınır; kural gövdesinde dil dalı yok (40-kod-standardi §6).
|
|
579
|
+
*/
|
|
580
|
+
const MICROFUNCTION_DEPENDENCY_LINE_RULES = {
|
|
581
|
+
python: { accepts: line => !line.startsWith('-'), hint: "requirements.txt satırı, pip seçeneği ('-r', '--index-url', '-e') olmadan: 'pillow==11.1.0'" },
|
|
582
|
+
node: { accepts: line => /^(@[a-z0-9-~][a-z0-9-._~]*\/)?[a-z0-9-~][a-z0-9-._~]*(@\S+)?$/.test(line), hint: "'ad@aralık', küçük harf: 'sharp@^0.33.0', '@scope/ad@1.2'; aralıksız satır 'latest' olur" }
|
|
583
|
+
};
|
|
584
|
+
/** `MicrofunctionConstants.MaxDependenciesBytes`. */
|
|
585
|
+
const MICROFUNCTION_MAX_DEPENDENCIES_BYTES = 16384;
|
|
586
|
+
/** Boş ve `#` ile başlayan satırlar yorumdur (iki dil için aynı). */
|
|
587
|
+
export function effectiveDependencyLines(dependencies) {
|
|
588
|
+
return typeof dependencies === 'string'
|
|
589
|
+
? dependencies.split('\n').map(line => line.trim()).filter(line => line.length > 0 && !line.startsWith('#'))
|
|
590
|
+
: [];
|
|
591
|
+
}
|
|
574
592
|
/**
|
|
575
593
|
* `MicrofunctionOptions.Limits` ile de sınırlanır (kök `.env`); buradaki değerler
|
|
576
594
|
* `MicrofunctionConstants`'ın sabit tavanıdır — ayar daha dar bir tavan koyduysa platform onu
|
|
@@ -609,6 +627,16 @@ function microfunctionFindings(body) {
|
|
|
609
627
|
if (!isPresent(body.memoryMb)) {
|
|
610
628
|
findings.push('memoryMb: alan non-nullable int — gönderilmezse 0 gider ve platform 422 döner (MicrofunctionMemoryOutOfRange). 128–3008 arası bir değer verin (ürün varsayılanı 256).');
|
|
611
629
|
}
|
|
630
|
+
if (typeof body.dependencies === 'string' && Buffer.byteLength(body.dependencies, 'utf8') > MICROFUNCTION_MAX_DEPENDENCIES_BYTES) {
|
|
631
|
+
findings.push(`dependencies: ${Buffer.byteLength(body.dependencies, 'utf8')} bayt, üst sınır ${MICROFUNCTION_MAX_DEPENDENCIES_BYTES} (MicrofunctionDependenciesTooLarge).`);
|
|
632
|
+
}
|
|
633
|
+
const dependencyLineRule = MICROFUNCTION_DEPENDENCY_LINE_RULES[String(body.language ?? '')];
|
|
634
|
+
if (sourceKind === 'inline' && dependencyLineRule !== undefined) {
|
|
635
|
+
const rejected = effectiveDependencyLines(body.dependencies).filter(line => !dependencyLineRule.accepts(line));
|
|
636
|
+
if (rejected.length > 0) {
|
|
637
|
+
findings.push(`dependencies: satır başına bir paket — ${dependencyLineRule.hint} (MicrofunctionDependenciesInvalid). Uymayan satırlar: ${rejected.map(line => `'${line}'`).join(', ')}.`);
|
|
638
|
+
}
|
|
639
|
+
}
|
|
612
640
|
const environmentVariables = asObject(body.environmentVariables);
|
|
613
641
|
if (environmentVariables !== undefined) {
|
|
614
642
|
const invalidKeys = Object.keys(environmentVariables).filter(key => !MICROFUNCTION_ENVIRONMENT_KEY_PATTERN.test(key));
|
|
@@ -623,6 +651,52 @@ function microfunctionFindings(body) {
|
|
|
623
651
|
}
|
|
624
652
|
return findings;
|
|
625
653
|
}
|
|
654
|
+
/**
|
|
655
|
+
* `MicrofunctionConstants.ArchiveEntryPathPattern`'ın aynası. `operations[].path` için desen
|
|
656
|
+
* paketlenmiş şemadan da gelir (limitFindings); `newPath` yalnız rename'de zorunlu olduğundan
|
|
657
|
+
* (`When(Type == Rename)`) şemaya desen olarak yazılmaz ve burada denetlenir.
|
|
658
|
+
*/
|
|
659
|
+
const MICROFUNCTION_ARCHIVE_PATH_PATTERN = /^(?!.*(?:^|\/)\.{1,2}(?:\/|$))[^/\\\x00]+(?:\/[^/\\\x00]+)*$/;
|
|
660
|
+
const MICROFUNCTION_BASE64_PATTERN = /^[A-Za-z0-9+/]*={0,2}$/;
|
|
661
|
+
/**
|
|
662
|
+
* `file_upload` ile aynı tavan (`tools/files.ts` maxInlineBytes): base64 içerik MCP mesajının
|
|
663
|
+
* içinde taşınır ve büyük yük kanalı tıkar. Backend isteği 50 MB'a kadar kabul eder; büyük ikili
|
|
664
|
+
* dosya Studio'nun gezgininden yüklenir.
|
|
665
|
+
*/
|
|
666
|
+
const MICROFUNCTION_ARCHIVE_MAX_INLINE_BYTES = 8 * 1024 * 1024;
|
|
667
|
+
function microfunctionArchiveFindings(body) {
|
|
668
|
+
const findings = [];
|
|
669
|
+
asObjects(body.operations).forEach((operation, index) => {
|
|
670
|
+
const type = String(operation.type ?? '');
|
|
671
|
+
if (type === 'rename') {
|
|
672
|
+
if (!hasText(operation.newPath)) {
|
|
673
|
+
findings.push(`operations[${index}].newPath: rename için zorunlu — hedef yol (klasörse altındaki her girdi taşınır).`);
|
|
674
|
+
}
|
|
675
|
+
else if (!MICROFUNCTION_ARCHIVE_PATH_PATTERN.test(operation.newPath)) {
|
|
676
|
+
findings.push(`operations[${index}].newPath: '${operation.newPath}' yol kuralına uymuyor — kökle (/) başlamaz, / ile bitmez, boş segment, '.'/'..' segmenti ve ters bölü içermez (MicrofunctionConstants.ArchiveEntryPathPattern).`);
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
if (type !== 'write-file')
|
|
680
|
+
return;
|
|
681
|
+
if (operation.content === undefined || operation.content === null) {
|
|
682
|
+
findings.push(`operations[${index}].content: write-file için zorunlu (boş dosya için '' gönderin).`);
|
|
683
|
+
return;
|
|
684
|
+
}
|
|
685
|
+
if (String(operation.encoding ?? 'utf8') !== 'base64')
|
|
686
|
+
return;
|
|
687
|
+
// Convert.FromBase64String boşluk, sekme ve satır sonunu yok sayar; satırlara bölünmüş base64 geçerlidir.
|
|
688
|
+
const content = String(operation.content).replace(/[ \t\r\n]/g, '');
|
|
689
|
+
if (content.length % 4 !== 0 || !MICROFUNCTION_BASE64_PATTERN.test(content)) {
|
|
690
|
+
findings.push(`operations[${index}].content: encoding 'base64' ama içerik çözülemiyor (platform MicrofunctionArchiveInvalidException ile 400 dönerdi). Metin dosyası için encoding'i vermeyin (utf8).`);
|
|
691
|
+
return;
|
|
692
|
+
}
|
|
693
|
+
const bytes = (content.length / 4) * 3 - (content.endsWith('==') ? 2 : content.endsWith('=') ? 1 : 0);
|
|
694
|
+
if (bytes > MICROFUNCTION_ARCHIVE_MAX_INLINE_BYTES) {
|
|
695
|
+
findings.push(`operations[${index}].content: ${bytes} bayt — MCP üzerinden tek dosya en çok 8 MB taşınır. Büyük ikili dosyayı Studio'daki arşiv gezgininden yükleyin.`);
|
|
696
|
+
}
|
|
697
|
+
});
|
|
698
|
+
return findings;
|
|
699
|
+
}
|
|
626
700
|
function microfunctionRuntimeFindings(body) {
|
|
627
701
|
const findings = [];
|
|
628
702
|
if (isPresent(body.provider) && String(body.provider) !== 'aws-lambda') {
|
|
@@ -880,11 +954,21 @@ export const backendRules = [
|
|
|
880
954
|
module: 'microfunction',
|
|
881
955
|
commands: { create: 'CreateMicrofunctionCommand', update: 'UpdateMicrofunctionCommand' },
|
|
882
956
|
status: 422,
|
|
883
|
-
summary: "provider 'built-in' ⇒ runtimeId boş, 'aws-lambda' ⇒ runtimeId zorunlu, 'azure-functions' reddedilir · sourceKind 'inline' ⇒ code, 'archive' ⇒ 'modül.fonksiyon' biçiminde entrypoint · timeoutSeconds ve memoryMb GÖNDERİLMEK ZORUNDA (non-nullable int, eksikse 0 gider) · env anahtarları ^[A-Z_][A-Z0-9_]*$ ve toplam ≤ 4 KB",
|
|
884
|
-
sourceRef: 'CreateMicrofunctionCommandValidator / UpdateMicrofunctionCommandValidator (ikisi birebir aynı kural kümesi) + MicrofunctionConstants (EntrypointPattern, EnvironmentVariableKeyPattern, BuiltInMaxTimeoutSeconds 300, CloudMaxTimeoutSeconds 900, MinMemoryMb 128, MaxMemoryMb 3008, MaxEnvironmentVariablesBytes 4096)',
|
|
957
|
+
summary: "provider 'built-in' ⇒ runtimeId boş, 'aws-lambda' ⇒ runtimeId zorunlu, 'azure-functions' reddedilir · sourceKind 'inline' ⇒ code, 'archive' ⇒ 'modül.fonksiyon' biçiminde entrypoint · timeoutSeconds ve memoryMb GÖNDERİLMEK ZORUNDA (non-nullable int, eksikse 0 gider) · env anahtarları ^[A-Z_][A-Z0-9_]*$ ve toplam ≤ 4 KB · dependencies ≤ 16 KB, inline kaynakta satır başına bir paket (python: pip seçeneği yok, node: ad@aralık)",
|
|
958
|
+
sourceRef: 'CreateMicrofunctionCommandValidator / UpdateMicrofunctionCommandValidator (ikisi birebir aynı kural kümesi) + MicrofunctionConstants (EntrypointPattern, EnvironmentVariableKeyPattern, BuiltInMaxTimeoutSeconds 300, CloudMaxTimeoutSeconds 900, MinMemoryMb 128, MaxMemoryMb 3008, MaxEnvironmentVariablesBytes 4096, MaxDependenciesBytes 16384, NodeDependencyLinePattern) + IMicrofunctionDependencyStrategy.IsValid (yalnız inline)',
|
|
885
959
|
guide: 'ngapps://guides/microfunction',
|
|
886
960
|
check: body => microfunctionFindings(body)
|
|
887
961
|
},
|
|
962
|
+
{
|
|
963
|
+
id: 'MF-006',
|
|
964
|
+
module: 'microfunctionArchive',
|
|
965
|
+
commands: { update: 'ApplyMicrofunctionArchiveChangesCommand' },
|
|
966
|
+
status: 422,
|
|
967
|
+
summary: "operations en az 1 · path/newPath kökle başlamaz, / ile bitmez, boş/./.. segmenti ve ters bölü içermez · rename ⇒ newPath · write-file ⇒ content (encoding 'base64' ise çözülebilir, ≤ 8 MB)",
|
|
968
|
+
sourceRef: 'ApplyMicrofunctionArchiveChangesCommandValidator + MicrofunctionConstants.ArchiveEntryPathPattern + MicrofunctionArchive.Apply (base64 çözümü)',
|
|
969
|
+
guide: 'ngapps://guides/microfunction',
|
|
970
|
+
check: body => microfunctionArchiveFindings(body)
|
|
971
|
+
},
|
|
888
972
|
{
|
|
889
973
|
id: 'MFR-001',
|
|
890
974
|
module: 'microfunctionRuntime',
|
|
@@ -97,6 +97,7 @@ export const componentKnowledge = {
|
|
|
97
97
|
],
|
|
98
98
|
propNotes: {
|
|
99
99
|
searchText: "Gizli, AKIŞIN yazdığı arama metni (2026-10-02, web ve mobil). Tablonun kendi arama kutusu yoktur; ayrı bir textinput'un değeri setter ile <tablo>.searchText'e yazılır. Bağlı tabloda setter bu yazımdan sonra listeyi YENİDEN OKUR (sayfa başa döner) ve istek search taşır: sunucu tanımın behavior.searchable alanlarında içerir (icontains) koşuluyla arar — entity kaynağında ve dinamik filtreli Table kaynaklı microservice'te. Searchable boşsa istek 422 ConnectDataFilterNotAllowed. Aynı yol filters / sortField / sortType / offset / limit için de geçerlidir: setter bunlardan birini yazınca bağlı liste yeniden okunur.",
|
|
100
|
+
texts: "Gizli (2026-10-15, ADR 0023): tablonun KENDİ kelimelerinden (araç çubuğu, sayfalama, boş durum, filtre kurucu, işleç yazıları — 'Rows per page', 'No records yet', 'Equals' …) yalnız BU düğümde değiştirilenler; kelime → düz metin ya da çeviri sarmalı ({ rowsPerPage: { type:'translation', ref:'page.x.satir' } }). Yazılmayan kelime uygulama sözlüğündeki compProp.datatable.<kelime> satırından, o da yoksa bileşenin tohum metninden gelir. Bütün tabloların kelimesini değiştirmek için sayfaya DEĞİL sözlüğe yazılır (translation_update compProp.datatable.<kelime>); Kelimeler (124): filters, refresh, exportPage, columns, previous, next, first, last, goToPage, rowsPerPage, clear, addRule, addGroup, group, removeGroup, remove, valuePlaceholder, selectColumn, and, or, actions, clearFilters, yes, no, filterOperator, filterTextPlaceholder, filterDatePlaceholder, save, discard, changes, newCount, deleteCount, errorCount, revertAll, saveChanges, newBadge, deleteBadge, undoDelete, deleteRow, confirmDelete, saveRow, discardRow, saveCell, discardCell, rowNotSaved, bulkEdit, bulkLimit, confirmBulkDelete, selectRow, selectAllRows, reorderRow, searchPlaceholder, noResults, loadMore, clearSelection, selectedCount, apply, pickValue, openLookup, lookupTitle, lookupHintSingle, lookupHintMultiple, lookupHintBrowse, cleared, pageRange, editRow, doneEditing, bulkEditHint, recordOfTotal, recordCount, loadingMore, pageSize, addNewRow, addRowShortcut, emptyTitle, emptyText, noMatchTitle, noMatchText, errorTitle, retry, advancedFilter, filterPanelTitle, matchPrefix, matchAll, matchAny, matchSuffix, where, reset, all, min, max, from, to, searchValues, columnSettings, resizeColumn, moveColumn, clearColumnFilter, removeFilter, filterColumn, dragRule, dropHere, saveFilter, savedFilters, filterName, filterNamePlaceholder, sameNameOverwrites, cancel, deleteSavedFilter; işleç menüsü yazıları op<İşleç>: opSameday, opEq, opNeq, opLt, opLte, opGt, opGte, opContains, opIcontains, opIn, opNotin; filtre çipindeki kısa yazılar: opShortContains, opShortIcontains, opShortIn, opShortNotin. Studio'da aynı liste tablonun Translations sekmesinde.",
|
|
100
101
|
canReorderRows: 'boolean (varsayılan false) — satırları tutamaçtan sürükleyerek sıralama; orderField olmadan ya da editMode none iken etkisiz.',
|
|
101
102
|
orderField: "Sırayı tutan sayı alanının adı (ör. 'sira'); canReorderRows açıkken satırlar buna göre çizilir ve sürükleme buraya yazar.",
|
|
102
103
|
surfaceStyle: NODE_SURFACE_NOTE + " Datatable'ın kabı VARSAYILAN olarak kendi 1px çerçevesini, 6px köşesini ve yüzey zeminini çizer (filtre çubuğu + ızgara + footer'ı saran çerçeve). Grupta bir kenarlık yazılınca (borderTop/Right/Bottom/Left — 'none' dahil) kap KENDİ çerçevesini bırakır: çerçeveyi kaldırmak için dört yöne 'none' yaz; düz çizgi yazmak ikinci çerçeve eklemez. radius yazılınca kap köşeyi düğüm kutusundan alır, background yazılınca kabın zemini saydamlaşır (2026-09-18).",
|
|
@@ -471,6 +472,7 @@ export const componentKnowledge = {
|
|
|
471
472
|
dropdown: {
|
|
472
473
|
summary: 'Tek seçim listesi; options statik verilebilir ya da mount/search akışıyla uzaktan doldurulur.',
|
|
473
474
|
behavior: [
|
|
475
|
+
"Bakma penceresi (lookupMode modal | drawer) tablo kelimelerini (Uygula, Seçimi temizle, ipucu satırı, filtre çubuğu, işleç adları) tablonun satırlarından okur: compProp.datatable.<kelime> (2026-10-15, frontend ADR 0024); bu satırlar bileşenin Translations sekmesinde tablonun anahtarlarıyla listelenir ve bileşen kullanılınca tohumlanır. Düğümün texts'i önce gelir.",
|
|
474
476
|
"Alan SEÇİLİ METNİ options'tan çözer: value dolu ama o value'lu bir option listede YOKSA kutu BOŞ görünür (hata vermez). Uzaktan dolan listede sırayı koru — önce options'ı yaz, sonra value'yu; ikisi ayrı akışlarda yazılıyorsa alan bir an boş kalır.",
|
|
475
477
|
"Eşleşme TİPE DUYARLIDIR (katı ===): options'tan gelen { id: 34 } sayı kalır, alanın value'su ise metindir ('34'), yani bu ikisi EŞLEŞMEZ ve kutu boş görünür. Bu, 'value var ama görünmüyor' vakalarının en sık sebebidir — eşlemeyi akış katmanında aynı tipe getir.",
|
|
476
478
|
"change yükü { value, selectedLabel } taşır ve ikisi de düğümün prop'una yazılır: akışta self.value ve self.selectedLabel ile okunur. selectedLabel 2026-09-11'de eklendi — etiketi göstermek için options'ta arama yapmaya gerek yok. Temizleme (panelin 'Seçimi temizle' düğmesi) de change yayar, ikisi de boş metin olur.",
|
|
@@ -488,7 +490,7 @@ export const componentKnowledge = {
|
|
|
488
490
|
optionType: "'single' düz liste, 'grouped' children ile ağaç. single'da children ve yanındaki iki bayrak hiç okunmaz.",
|
|
489
491
|
clearable: "Panelin altındaki 'Seçimi temizle' düğmesi (varsayılan açık, yalnız değer varken çizilir). Temizleme change yayar, ayrı bir olay yoktur.",
|
|
490
492
|
emptyText: 'Liste boşken gösterilen metin; boş bırakılırsa arayüz dilinden gelen "sonuç yok" metni kullanılır.',
|
|
491
|
-
placeholder:
|
|
493
|
+
placeholder: "Seçim yokken kutuda duran metin; aynı zamanda yükleniyor satırının metnidir. Yazılmazsa uygulama dilinde ortak kelime (compProp.common.selectAnOption: 'Bir seçenek seçin' / 'Select an option'); bilerek '' yazmak yer tutucuyu kaldırır.",
|
|
492
494
|
searchText: "Gizli durum prop'u: bileşen OKUMAZ, `search` olayıyla yazar. Uzak aramada sorguyu akışta self.searchText ile oku.",
|
|
493
495
|
selectedLabel: "Gizli durum prop'u: `change` seçilen option'ın label metnini buraya yazar (temizlemede boş metin). Yalnız kullanıcı seçimiyle dolar — value'yu akıştan yazmak burayı GÜNCELLEMEZ.",
|
|
494
496
|
lookupMode: "Gizli durum prop'u: Connect Data bağlaması her okumada yazar — tanımın kök `lookup`'ı açıksa 'modal' ya da 'drawer', kapalıysa 'none'. Bileşen alanın sağındaki ↗ lookup düğmesini yalnız bu 'none' değilken çizer; elle yazılmaz, lookup'ı tanımdaki kök `lookup` açar/kapatır.",
|
|
@@ -499,6 +501,7 @@ export const componentKnowledge = {
|
|
|
499
501
|
'multi-select': {
|
|
500
502
|
summary: 'Aranabilir çoklu seçim; value bir değer dizisidir, seçilenler etiket (chip) olarak görünür, search olayı sunucu taraflı arama kurmaya yarar.',
|
|
501
503
|
behavior: [
|
|
504
|
+
"Bakma penceresi (lookupMode modal | drawer) tablo kelimelerini (Uygula, Seçimi temizle, ipucu satırı, filtre çubuğu, işleç adları) tablonun satırlarından okur: compProp.datatable.<kelime> (2026-10-15, frontend ADR 0024); bu satırlar bileşenin Translations sekmesinde tablonun anahtarlarıyla listelenir ve bileşen kullanılınca tohumlanır. Düğümün texts'i önce gelir.",
|
|
502
505
|
"value bir DİZİDİR ve üç biçimi de okunur: düz değer (['policies', 7]), şemanın biçimi ([{ value, label }]) ve eski ikizler ([{ id, text }]). Düz değer yazmak 2026-09-11'e kadar etiketi 'undefined' gösteriyordu; artık değer etiketin kendisi olur ve doğru metin options yüklenince gelir (2026-10-01'e kadar gelmiyordu: akışın yazdığı id dizisi seçenekler yüklense de çipte id olarak kalıyordu).",
|
|
503
506
|
"Etiketin metni options'tan tazelenir: aynı value'lu option listede varsa onun label'ı yazılır. Bu arama METİNLEŞTİREREK karşılaştırır (String(a) === String(b)), AMA yalnız etiket metni için: satırın işaretli görünmesi ve seçimin kaldırılması KATI karşılaştırma kullanır. Yani value'da metin '34', options'ta sayı 34 varsa çip doğru etiketle çizilir ama liste satırı işaretsiz kalır ve tıklamak hiçbir şey yapmaz — eşlemeyi akış katmanında aynı tipe getir (CQ-208).",
|
|
504
507
|
"change yükü { value: [{ value, label, id, text }] } taşır ve düğümün value prop'una yazılır: akışta self.value ile okunur. id/text, value/label'ın eski adlı ikizleridir — kayıtlı sayfalar onlarla okuduğu için bilerek korunuyor.",
|
|
@@ -518,7 +521,7 @@ export const componentKnowledge = {
|
|
|
518
521
|
optionType: "'single' düz liste, 'grouped' children ile ağaç. single'da children ve yanındaki iki bayrak hiç okunmaz.",
|
|
519
522
|
clearable: "Tüm seçimi temizleyen, panelin altındaki 'Seçimi temizle' düğmesi (varsayılan açık, yalnız seçim varken çizilir). Temizleme change yayar, ayrı bir olay yoktur.",
|
|
520
523
|
emptyText: 'Liste boşken gösterilen metin; boş bırakılırsa arayüz dilinden gelen "sonuç yok" metni kullanılır.',
|
|
521
|
-
placeholder:
|
|
524
|
+
placeholder: "Hiç seçim yokken kutuda duran metin; aynı zamanda yükleniyor satırının metnidir. Yazılmazsa uygulama dilinde ortak kelime (compProp.common.selectAnOption: 'Bir seçenek seçin' / 'Select an option'); bilerek '' yazmak yer tutucuyu kaldırır.",
|
|
522
525
|
searchText: "Gizli durum prop'u: bileşen OKUMAZ, `search` olayıyla yazar. Uzak aramada sorguyu akışta self.searchText ile oku.",
|
|
523
526
|
isLoading: 'Uzak arama/doldurma sürerken akıştan açılır; alan kilitlenmez, yalnız spinner ve yükleniyor satırı çizilir.',
|
|
524
527
|
lookupMode: "Gizli durum prop'u: Connect Data bağlaması her okumada yazar — tanımın kök `lookup`'ı açıksa 'modal' ya da 'drawer', kapalıysa 'none'. Bileşen alanın sağındaki ↗ lookup düğmesini yalnız bu 'none' değilken çizer; elle yazılmaz, lookup'ı tanımdaki kök `lookup` açar/kapatır."
|
|
@@ -540,7 +543,7 @@ export const componentKnowledge = {
|
|
|
540
543
|
colors: "Yeni etikete verilebilecek hazır renk paleti ([{ color }]). Palet ayrıca options ve value üstündeki renklerle zenginleşir; kullanıcı HSV seçiciyle palet dışı renk de verebilir.",
|
|
541
544
|
strict: 'Serbest metni kapatır: yalnız options içindeki etiketler eklenebilir (yazarak da yapıştırarak da), "oluştur" satırı çizilmez.',
|
|
542
545
|
clearable: 'Alanın sağındaki × düğmesi (hepsini siler). Varsayılan AÇIK.',
|
|
543
|
-
createNewLabel: 'Listede olmayan metin yazılınca çıkan "oluştur" satırının başındaki metin; satır bu metni ve tırnak içinde yazılanı gösterir.',
|
|
546
|
+
createNewLabel: 'Listede olmayan metin yazılınca çıkan "oluştur" satırının başındaki metin; satır bu metni ve tırnak içinde yazılanı gösterir. Yazılmazsa ortak kelime (compProp.common.tagInputCreate: "Oluştur" / "Create"); bilerek boş metin önek koymaz.',
|
|
544
547
|
debounce: "Yalnız akış tabanlı search'i geciktirir (ms); yerel süzme senkrondur ve debounce'u yok sayar. Etiket seçilince bekleyen arama iptal edilir.",
|
|
545
548
|
searchText: "Gizli durum prop'u: bileşen OKUMAZ, `search` olayıyla YAZAR. Uzak aramada sorguyu akışta self.searchText ile oku.",
|
|
546
549
|
autofocus: 'Sayfa açılınca odak metin kutusuna gelir (kilitli/yükleniyor alanda ve tasarım kanvasında çalışmaz). Sayfada tek alana ver.'
|
|
@@ -719,11 +722,11 @@ export const componentKnowledge = {
|
|
|
719
722
|
"Değer YEREL duvar saati 'yyyy-MM-ddTHH:mm:ss' metnidir (dilim eki yok, saat kısmı seçimde 00:00) ya da null. change düğümün prop'una yazar: akış değeri self.value ile okur, event.data BOŞTUR (CQ-149). 2026-09-15 öncesinde bu kayıt yükte HH ve mm anahtarları da olduğunu söylüyordu — runtime hiç göndermiyordu, self.HH okuyan ifade boş dönerdi.",
|
|
720
723
|
"minDate/maxDate GÜN sınırıdır ('yyyy-MM-dd'): ikisi de KENDİ günü dahil seçilebilir kalır. 2026-09-15'te düzeltildi — çıplak gün metni UTC gece yarısı olarak okunuyordu, Greenwich'in doğusunda (TR: +03) minDate'in kendi günü takvimde PASİF görünüyordu, yazarak seçilirse değer 03:00'a kaydırılıyordu; batısında (örn. New York −04) aynı kusur maxDate'te çıkıyordu — maxDate'in KENDİ günü pasifti. Sınır dışı günler takvimde pasiftir; kutuya YAZILAN sınır dışı bir tarih hata vermez, o sınır gününün gece yarısına çekilir. Akıştan yazılan değer bu kapıdan GEÇMEZ, olduğu gibi gösterilir.",
|
|
721
724
|
'Takvim tek gün seçtirir; komşu ayların günleri de seçilebilir, yıl açılır listesi 1900-2100 arasında gezer, popup her ay altı hafta çizer. Seçim anında popup kapanır ve change yayılır — onay adımı yoktur.',
|
|
722
|
-
"Kutuya elle yazmak için çift tıklanır (tek tık takvimi açar). Okunan desenler tr'de 'd MMM yyyy' · 'd MMMM yyyy' · 'd.MM.yyyy' · 'dd.MM.yyyy' · 'dd.MM.yy',
|
|
725
|
+
"Kutuya elle yazmak için çift tıklanır (tek tık takvimi açar). Okunan desenler tr'de 'd MMM yyyy' · 'd MMMM yyyy' · 'd.MM.yyyy' · 'dd.MM.yyyy' · 'dd.MM.yy', en'de 'MMM d, yyyy' · 'MMMM d, yyyy' · 'MM/dd/yyyy' · 'M/d/yyyy' · 'MM/dd/yy', başka her dilde o dilin Intl'den kurulan desenleri (ru '17 авг. 2026 г.', '17 авг. 2026', '17.08.2026'); 1900 öncesi ve 2100 sonrası yıl reddedilir. Okunamayan yazı tutulan değere döner, değer yoksa kutu BOŞALIR (2026-09-15; öncesinde reddedilen metin değermiş gibi ekranda kalıyordu). Kutu salt okunur olsa da programdan gelen change'i DİNLER: page_screenshot 'set' ile ISO tarih ('2026-08-01', '2026-08-01T09:30') ya da gösterim biçimi yazılabilir ve değer takvimden seçilmiş gibi yayılır; okunamayan metinde actionsReport propWritten:false döner. 2026-09-15 öncesi olay dinlenmiyordu: kutu dolu görünüyor, prop boş kalıyordu (G-14).",
|
|
723
726
|
'Doğrulama kuralları: required · min · max (2026-09-15; pattern bildirimi kaldırıldı — panel tarih alanına regex kuralı hiç çizmiyordu, yazılan satırı düğüm seçilince siliyordu, CQ-226). min/max değeri gün metnidir ve alanın minDate/maxDate prop\'larından AYRIDIR: minDate/maxDate takvimi kısar, min/max gönderimde hata gösterir. DİKKAT (CQ-252): Form kuralın gün metnini UTC, alanın değerini YEREL okuyor (form/helper.ts dateMs), yani UTC olmayan her dilimde SINIR GÜNÜNÜN KENDİSİ yanlış tarafta kalıyor — Türkiye saatinde tam min gününe eşit bir değer yine de en-az hatası veriyor. Bugünkü güvenli yol: sınırı bir gün geniş tutmak ya da kural yerine minDate/maxDate kullanmak.',
|
|
724
727
|
'focus/blur ALAN düzeyindedir (2026-09-15): girdi ile takvim arasında dolaşmak olay yaymaz; yalnız alana girmek ve alandan çıkmak yayar. Kilitli alan (isDisabled/isReadonly/isViewmode) hiçbir olay yaymaz.',
|
|
725
728
|
'isLoading KİLİT DEĞİLDİR (2026-09-15): alan kullanılabilir kalır, sağ uçta dönen spinner çizilir (o sırada X gizlenir) ve kök aria-busy taşır. Kilit için isDisabled kullan.',
|
|
726
|
-
"Değer doluyken sağ uçta X çıkar ve change'i null ile yayar; kilitli kipte X yoktur. Gösterim dili locale'den (boşsa uygulama dili): tr'de 'd MMM yyyy',
|
|
729
|
+
"Değer doluyken sağ uçta X çıkar ve change'i null ile yayar; kilitli kipte X yoktur. Gösterim dili locale'den (boşsa uygulama dili): tr'de 'd MMM yyyy', en'de 'MMM d, yyyy', başka her dilde dilin kendi sırası ve adları (ru '17 авг. 2026 г.'). Biçim ve haftanın ilk günü prop'u YOK (ARC-071).",
|
|
727
730
|
'Saat gerekiyorsa datetimepicker, aralık gerekiyorsa daterangepicker kullanılır; bu bileşen saat taşımaz.'
|
|
728
731
|
],
|
|
729
732
|
propNotes: {
|
|
@@ -744,20 +747,20 @@ export const componentKnowledge = {
|
|
|
744
747
|
"Değer ancak TARİH + SAAT ikisi de seçilince yazılır: boş alanda takvimden yalnız gün seçmek change YAYMAZ — gün ekranda taslak kalır (kutu günü ve 00:00'ı gösterir ama self.value null'dır, required düşer — CQ-237), saat listesi kendiliğinden açılır ve saat seçilince yayılır. Günü yeniden seçmek de taslağı YAZMAZ (2026-09-16'da düzeltildi: ikinci gün seçimi …T00:00:00 yayıyordu). Alan zaten bir değer tutuyorsa (kullanıcı seçmiş ya da akış yazmış) tarihi değiştirmek TUTULAN saati koruyup hemen yayar. Gün seçmeden saat seçmek bugünün gününü kullanır ve hemen yayar. Akıştan gelen değer taslağı düşürür.",
|
|
745
748
|
"Saat listesi minutesStep adımıyla gösterilen günün (yoksa bugünün) üstünde üretilir; minDate öncesi ve maxDate sonrası saatler listede KALIR ama pasiftir. Liste minutesStep ve dil değişince yeniden üretilir (2026-09-16 öncesinde yalnız değer ya da sınır değişince yenileniyordu).",
|
|
746
749
|
"minDate/maxDate tarih-saat ANIDIR ('yyyy-MM-ddTHH:mm'): takvimde sınırın KENDİ günü seçilebilir kalır, o günün sınır dışı saatleri listede pasiftir. 2026-09-16'da düzeltildi — takvim sınırı an olarak karşılaştırıyordu, saati olan bir minDate (örn. …T14:00) kendi gününü takvimde PASİF gösteriyordu, o gün hiç seçilemiyordu. Yayma öncesi sarmalayıcı seçimi [minDate, maxDate] içine çeker (sınır dışı seçim hata VERMEZ, sınıra yapışır); akıştan yazılan değer bu kapıdan GEÇMEZ, olduğu gibi gösterilir.",
|
|
747
|
-
"Kutulara elle yazmak için çift tıklanır (tek tık takvimi / saat listesini açar). Tarih kutusu datepicker desenlerini okur (tr 'd MMM yyyy' · 'd.MM.yyyy' …,
|
|
750
|
+
"Kutulara elle yazmak için çift tıklanır (tek tık takvimi / saat listesini açar). Tarih kutusu datepicker desenlerini okur (tr 'd MMM yyyy' · 'd.MM.yyyy' …, en'de 'MMM d, yyyy' · 'MM/dd/yyyy' …, başka dilde o dilin Intl desenleri, her dilde ISO 'yyyy-MM-dd') ve takvimden gün seçmekle AYNI kurala girer. Saat kutusu '14:30', '14', 12 saatlik dilde o dilin öğleden önce/sonra adıyla yazılanı okur (en '02:30 PM', ar '02:30 م'); okunamayan saat kutuyu tutulan saate geri çevirir, değeri bozmaz. 2026-09-16 öncesinde saat kutusu çift tıklamadan da yazılabiliyordu ve yazılan metin yok sayılıp ekranda kalıyordu.",
|
|
748
751
|
"page_screenshot 'set' kökte TARİH kutusuna yazar ve takvimden gün seçmekle aynı kuraldır: alan değer tutuyorsa tutulan saat korunup yazılır; boşsa yalnız taslak olur ve actionsReport propWritten:false döner. ISO metnindeki saat kısmı ('2026-08-01T09:30') KULLANILMAZ ve saat kutusunun iç kimliği yoktur, 'set' ile hedeflenemez (TOOL-020). Tam değeri doğrulamak için önce akıştan self.value yazın.",
|
|
749
752
|
"Doğrulama kuralları: required · min · max (2026-09-16; pattern bildirimi kaldırıldı — panel tarih-saat alanına regex kuralı hiç çizmiyordu, yazılan satırı düğüm seçilince siliyordu, CQ-226). min/max değeri 'yyyy-MM-ddTHH:mm' metnidir ve alanın minDate/maxDate prop'larından AYRIDIR: minDate/maxDate takvimi ve listeyi kısar, min/max gönderimde hata gösterir. Kurala çıplak gün ('2026-09-10') yazma — Form onu UTC okur ve UTC olmayan dilimde sınır birkaç saat kayar (CQ-252); saatiyle yaz.",
|
|
750
753
|
'focus/blur ALAN düzeyindedir (2026-09-16): tarih kutusu, saat kutusu, takvim ve saat listesi arasında dolaşmak olay yaymaz; yalnız alana girmek ve alandan çıkmak yayar. Kilitli alan (isDisabled/isReadonly/isViewmode) hiçbir olay yaymaz.',
|
|
751
754
|
'isLoading KİLİT DEĞİLDİR (2026-09-16): alan kullanılabilir kalır, sağ uçta dönen spinner çizilir (o sırada X gizlenir) ve kök aria-busy taşır. Kilit için isDisabled kullan.',
|
|
752
|
-
"Değer (ya da taslak gün) doluyken sağ uçta X çıkar; değeri boşaltıp change'i null ile yayar, yalnız taslak gün varsa taslağı düşürür ve change YAYMAZ (değer zaten boştu); kilitli kipte X yoktur. Gösterim dili locale'den (boşsa uygulama dili): tarih tr'de 'd MMM yyyy',
|
|
755
|
+
"Değer (ya da taslak gün) doluyken sağ uçta X çıkar; değeri boşaltıp change'i null ile yayar, yalnız taslak gün varsa taslağı düşürür ve change YAYMAZ (değer zaten boştu); kilitli kipte X yoktur. Gösterim dili locale'den (boşsa uygulama dili): tarih tr'de 'd MMM yyyy', en'de 'MMM d, yyyy', başka her dilde dilin kendi sırası ve adları (ru '17 авг. 2026 г.'); saat dilin kendi saat düzeni (en ve ar 12 saat — 01:00 PM, tr ve ru 24 saat). Değer her dilde aynı 24 saatlik metindir. Biçim ve haftanın ilk günü prop'u YOK (ARC-071, CQ-098). Yalnız gün için datepicker, aralık için datetimerangepicker kullanılır."
|
|
753
756
|
],
|
|
754
757
|
propNotes: {
|
|
755
758
|
value: "Seçili an: 'yyyy-MM-ddTHH:mm:ss' ya da null. Çıplak 'yyyy-MM-dd' YEREL gece yarısı okunur (UTC kaydırması yok). Okunamayan metin alanı BOŞ gösterir, hata vermez. " + DATE_VALUE_FORMAT_NOTE,
|
|
756
759
|
minutesStep: "Saat listesinin adımı, METİN enum: '1' | '2' | '3' | '4' | '5' | '6' | '10' | '12' | '15' | '30' | '60' (varsayılan '15'). 0, negatif ya da okunamayan değer 15'e düşer; 1 dakika 1440 satır demektir.",
|
|
757
760
|
minDate: "En erken an ('yyyy-MM-ddTHH:mm'); o günün kendisi takvimde seçilebilir, günün sınırdan önceki saatleri listede pasif kalır. Sınır dışına düşen seçim sınıra çekilir.",
|
|
758
761
|
maxDate: "En geç an; o gün seçilebilir, sınırdan sonraki saatler pasif, sınır dışı seçim sınıra çekilir. Saatiyle yaz ('…T23:59'): çıplak gün ('2026-09-20') o günün 00:00'ıdır, günün geri kalanı pasif kalır.",
|
|
759
|
-
placeholder: "Boş tarih kutusunda görünen metin (
|
|
760
|
-
timePlaceholder: "Boş saat kutusunda görünen metin (
|
|
762
|
+
placeholder: "Boş tarih kutusunda görünen metin; yazılmazsa uygulama dilinde ortak kelime (compProp.common.selectDate: 'Tarih seçin' / 'Select date'), bilerek '' yer tutucuyu kaldırır. Kutu değeri her zaman dilin desenine göre yazar — yer tutucu bir biçim SÖZÜ DEĞİLDİR.",
|
|
763
|
+
timePlaceholder: "Boş saat kutusunda görünen metin; yazılmazsa ortak kelime (compProp.common.selectTime: 'Saat seçin' / 'Select time'). Taslak gün seçilince kutu 00:00 gösterir, yer tutucu görünmez (CQ-237).",
|
|
761
764
|
displayOffset: 'GÖSTERİMİ kaydıran saat sayısı (+3: saklanan değeri üç saat ileri göster); saklanan değer değişmez.',
|
|
762
765
|
valueOffset: 'YAZILAN değeri kaydıran saat sayısı; gösterim değişmez. displayOffset ile HER ZAMAN ters işaretli ver (+3 / -3): kullanıcı gösterilen saati seçer ve korur, yalnız biri verilirse her tarih değişikliğinde tutulan saat o kadar kayar.',
|
|
763
766
|
locale: LOCALE_FOLLOWS_APP_NOTE,
|
|
@@ -771,11 +774,11 @@ export const componentKnowledge = {
|
|
|
771
774
|
"minDate/maxDate GÜN sınırıdır ('yyyy-MM-dd'): ikisi de KENDİ günü dahil seçilebilir kalır. Takvimler de gün olarak karşılıklı sınırlanır: bitiş takvimi başlangıç GÜNÜNDEN, başlangıç takvimi bitiş GÜNÜNE kadar açıktır — aynı gün başlayıp biten tek günlük aralık seçilebilir. 2026-09-16'da düzeltildi: çıplak gün metni UTC gece yarısı okunuyordu, Greenwich'in doğusunda (TR: +03) minDate'in kendi günü takvimde PASİF görünüyor ve sınıra çekilen değer 03:00 yazılıyordu, batısında maxDate'in kendi günü pasifti; saatli bir başlangıç (displayOffset, akıştan saatli değer) bitiş takviminde kendi gününü kapatıyordu.",
|
|
772
775
|
"Yayma öncesi sarmalayıcı çifti üç adımda kurar: (1) her uç [minDate, maxDate] günlerinin içine çekilir (sınır dışı yazılan tarih o sınır gününün gece yarısına yapışır, hata VERMEZ); (2) DEĞİŞEN uç seçilen günden valueOffset kaydırılarak yazılır, DOKUNULMAYAN uç tuttuğu değerle yazılır (kırpma onu taşımadıysa) — aynı günü yeniden seçmek de değişikliktir; (3) sıra YAZILAN değerler üzerinde uygulanır: bitiş başlangıçtan önceyse başlangıca eşitlenir, yani kullanıcı değişikliğinden sonra valueFrom <= valueTo her zaman tutar. Bu yüzden başlangıç saat taşıyorsa (akış '…T10:00:00' yazmışsa) aynı günde biten aralığın bitişi de o saati alır. 2026-09-16 öncesinde iki uç da GÖSTERİLEN hâlinden yeniden türetiliyordu: yalnız displayOffset ya da yalnız valueOffset verilmiş alanda dokunulmayan uç her seçimde o kadar saat kayıyordu. Akıştan yazılan değerler bu kapıdan GEÇMEZ, olduğu gibi gösterilir (ta ki kullanıcı bir yarıyı değiştirene dek); çıplak 'yyyy-MM-dd' YEREL gece yarısı okunur, okunamayan metin yarıyı BOŞ gösterir.",
|
|
773
776
|
"Başlangıç seçilince ve bitiş boşsa bitiş takvimi kendiliğinden açılır. Her seçim popup'ı kapatır ve change'i hemen yayar — onay adımı yoktur. Her yarının kendi X'i vardır ve yalnız o yarıyı boşaltır (change o yarı null, diğeri olduğu gibi); kilitli kipte X yoktur.",
|
|
774
|
-
"Kutuya elle yazmak için çift tıklanır (tek tık takvimi açar); okunan desenler datepicker ile aynıdır (tr 'd MMM yyyy' · 'd.MM.yyyy' · 'dd.MM.yyyy' …,
|
|
777
|
+
"Kutuya elle yazmak için çift tıklanır (tek tık takvimi açar); okunan desenler datepicker ile aynıdır (tr 'd MMM yyyy' · 'd.MM.yyyy' · 'dd.MM.yyyy' …, en'de 'MMM d, yyyy' · 'MM/dd/yyyy' …, başka dilde o dilin Intl desenleri, her dilde ISO 'yyyy-MM-dd'). İki kutu ayrı adreslenir: '<elementId>__start' (valueFrom) ve '<elementId>__end' (valueTo). page_screenshot 'set' kökü REDDEDER (tek değer yok); kutuya ISO tarih ('2026-08-01') ya da gösterim biçimi ('1 Ağu 2026') yazılır, kutu değeri kendi change yoluna sokar ve prop'a yazar. Okunamayan metin kutuyu tutulan değere geri çevirir; actionsReport propWritten:false döner (G-14, 2026-09-15).",
|
|
775
778
|
"Doğrulama kuralları: required · min · max (2026-09-16; pattern bildirimi kaldırıldı — panel tarih alanına regex kuralı hiç çizmiyordu, yazılan satırı düğüm seçilince siliyordu, CQ-226). min/max değeri gün metnidir, Form aralığın İKİ ucunu da sınırla karşılaştırır ve alanın minDate/maxDate prop'larından AYRIDIR: minDate/maxDate takvimi kısar, min/max gönderimde hata gösterir. DİKKAT (CQ-252): Form kuralın gün metnini UTC, alanın değerini YEREL okuyor, yani UTC olmayan her dilimde SINIR GÜNÜNÜN KENDİSİ yanlış tarafta kalıyor. Bugünkü güvenli yol: kural yerine minDate/maxDate kullanmak ya da sınırı bir gün geniş tutmak.",
|
|
776
779
|
"focus/blur ALAN düzeyindedir (2026-09-16): iki kutu ve iki takvim arasında dolaşmak olay yaymaz; yalnız alana girmek ve alandan çıkmak yayar. Kilitli alan (isDisabled/isReadonly/isViewmode) hiçbir olay yaymaz.",
|
|
777
780
|
"isLoading KİLİT DEĞİLDİR (2026-09-16): alan kullanılabilir kalır, iki yarının X'i yerinde durur, satırın sağ ucunda dönen spinner çizilir ve kutu aria-busy taşır (450px altındaki dikey yığılmada spinner çizilmez, aria-busy kalır). Kilit için isDisabled kullan.",
|
|
778
|
-
"Gösterim dili locale'den (boşsa uygulama dili): tr'de 'd MMM yyyy',
|
|
781
|
+
"Gösterim dili locale'den (boşsa uygulama dili): tr'de 'd MMM yyyy', en'de 'MMM d, yyyy', başka her dilde dilin kendi sırası ve adları (ru '17 авг. 2026 г.'). Değer her dilde aynı metindir. Biçim ve haftanın ilk günü prop'u YOK (ARC-071). Saat gerekiyorsa datetimerangepicker, tek gün gerekiyorsa datepicker kullanılır."
|
|
779
782
|
],
|
|
780
783
|
propNotes: {
|
|
781
784
|
valueFrom: "Başlangıç günü: 'yyyy-MM-ddTHH:mm:ss' ya da 'yyyy-MM-dd' metni, ya da null. Çıplak gün YEREL okunur (UTC kaydırması yok). " + DATE_VALUE_FORMAT_NOTE,
|
|
@@ -801,7 +804,7 @@ export const componentKnowledge = {
|
|
|
801
804
|
"focus/blur ALAN düzeyindedir (2026-09-12): iki tarih girdisi, iki saat girdisi, takvim ve saat listesi arasında dolaşmak olay yaymaz; yalnız alana girmek ve alandan çıkmak yayar. Kilitli alan (isDisabled/isReadonly/isViewmode) hiçbir olay yaymaz.",
|
|
802
805
|
"isLoading KİLİT DEĞİLDİR (2026-09-12): alan odaklanabilir kalır, sağ uçta dönen spinner çizilir, kök aria-busy taşır (478px altındaki dikey yığılmada spinner çizilmez, aria-busy kalır). Kilit için isDisabled kullan.",
|
|
803
806
|
"Her yarının kendi X'i vardır ve yalnız o yarıyı boşaltır (change o yarı null, diğeri tuttuğu değerle yazılır). Yalnız taslak gün tutan yarının X'i taslağı siler ama change YAYMAZ — değer zaten boştu (2026-09-16; öncesinde değişmeyen değerle change yayıyordu). İkisini birden boşaltmanın yolu iki X ya da akıştan iki prop'u null yazmaktır.",
|
|
804
|
-
"Gösterim dili locale'den (boşsa uygulama dili): tarih tr'de 'd MMM yyyy',
|
|
807
|
+
"Gösterim dili locale'den (boşsa uygulama dili): tarih tr'de 'd MMM yyyy', en'de 'MMM d, yyyy', başka her dilde dilin kendi sırası ve adları (ru '17 авг. 2026 г.'); saat dilin kendi saat düzeni (en ve ar 12 saat — 01:00 PM, tr ve ru 24 saat). Değer her dilde aynı 24 saatlik metindir. Biçim prop'u YOK (ARC-071).",
|
|
805
808
|
"Tarih kutuları '<elementId>__start' / '<elementId>__end' ile adreslenir (G-14, 2026-09-15). page_screenshot 'set' kökü reddeder; kutuya ISO tarih yazmak takvimden gün seçmekle AYNI kuraldır: yarı değer tutmuyorsa yalnız taslak olur ve propWritten:false döner — saat kutusu ayrıca hedeflenemez, önce akıştan değer yazın ya da saati tıklamayla seçin."
|
|
806
809
|
],
|
|
807
810
|
propNotes: {
|
|
@@ -835,6 +838,38 @@ export const componentKnowledge = {
|
|
|
835
838
|
cropAspectRatio: "'1:1' | '4:3' | '3:4' | '16:9'; yalnız enableCrop açıkken okunur."
|
|
836
839
|
}
|
|
837
840
|
},
|
|
841
|
+
attachments: {
|
|
842
|
+
summary: "Ek dosya ALANI: ekleme yüzeyi (variant: 'dropzone' sürükle-bırak alanı ya da 'button' \"Dosya seç\" düğmesi) + eklenen dosyaların ÖNİZLEMELİ KART ızgarası. Kartta sil (×) ve indir; görsel, video ve PDF karta tıklanınca popupta açılır, öbür türler (Word, Excel, PowerPoint, arşiv…) tür ikonuyla görünür ve tıklamanın aksiyonu yoktur. Seçim self.value'dan okunur. Çipli düz bırakma alanı için fileUpload.",
|
|
843
|
+
behavior: [
|
|
844
|
+
"value sözleşmesi fileUpload ile AYNIDIR (aynı dropzone-logic): change ile yayılan value her zaman DİZİDİR — isMultiple:false iken tek elemanlı dizi, son kart silinince []. Yeni dosya { type:'file', ref:'', fileName, value:<base64 data URL> }; akışın yazdığı kayıtlı dosyalar ({ type:'ref', value:<fileId>, fileName, absolute_path, size? }) listede OLDUĞU GİBİ kalır. Kayıtlı ekleri göstermek için ucun / workflow get adımının FILE değerini olduğu gibi yaz; düz URL yazma (fileUpload propNotes.value'daki ölçümler burada da geçerlidir).",
|
|
845
|
+
"isMultiple varsayılanı AÇIKTIR (ek listesi). Yeni seçim mevcut listenin SONUNA eklenir; kapalıyken yeni dosya eskisinin yerine geçer. Kartın × düğmesi o dosyayı siler ve change'i KALAN listeyle yayar; ayrı silme olayı yoktur.",
|
|
846
|
+
"Önizleme: yalnız görsel (png, jpg, gif, webp, svg, bmp, avif), oynatılabilir video (mp4, webm, mov, m4v, ogv ya da video/* MIME; yeni seçilen videonun data URL'i de önizlenir) ve PDF popupta açılır; tür önce dosya adının uzantısından, yoksa adresten, yoksa data URL'in MIME tipinden okunur. PDF popupta file-viewer ile çizilir (data URL blob adresine çevrilir). Word/Excel/PowerPoint/metin/arşiv/ses ve tanınmayan türlerde kart tıklanamaz; aileye göre renkli tür ikonu (DOCX, XLSX, PDF…) çizilir. Adresi olmayan ya da güvenli olmayan adresli (javascript: vb.) dosya ne önizlenir ne indirilir. Kanvasta (tasarımcı) önizleme açılmaz. Popup tek dosyayı gösterir (dosyalar arası gezinme yok); Esc ve dışarı tıklama kapatır.",
|
|
847
|
+
"variant 'dropzone'da kartlar kesik çizgili alanın İÇİNDE dizilir (alan dolunca başlık tek satıra iner: sayaç + 'Dosya ekle'); sürüklerken alanın tamamı 'Dosyaları bırakın' örtüsüyle kaplanır.",
|
|
848
|
+
"Görünüm bileşenin KENDİ genişliğine göre değişir (container query): 520 px ve üstünde 4:3 önizlemeli kart ızgarası, altında (400 px'lik çekmece, yan panel) her dosya 58 px'lik tek satır (küçük resim/tür ikonu · ad · 'PDF · 277 KB' · indir · sil). Çekmece formunda kullanmak için ayrı bir ayar GEREKMEZ.",
|
|
849
|
+
"Boyut kartta yazılır: kayıtlı dosyanın size alanı (bayt) varsa o, yoksa yeni dosyanın base64 gövdesinden hesaplanır; ikisi de yoksa hiç yazılmaz. İndirme her türde çalışır: yeni seçilen Word/Excel/PowerPoint/arşiv dosyası (data URL) da indirilir; yalnız sayfa gibi açılabilecek gömülü türler (text/html, svg, xml) indirilmez. fileName taşımayan drive kaydı adresin son parçasıyla adlandırılır.",
|
|
850
|
+
"Kilit = isDisabled || isReadonly || isViewmode: ekleme ve silme kapanır, change yayılmaz. isReadonly ve isViewmode ekleme yüzeyini HİÇ çizmez (yalnız kartlar; dosya yoksa 'Ek dosya yok'); isDisabled yüzeyi soluk ve tıklanamaz çizer. Üç kipte de önizleme ve (isDownloadable açıksa) indirme ÇALIŞIR.",
|
|
851
|
+
"allowedFiletypes / customFiletypes / maxFileSizeMb / maxFileCount fileUpload ile aynı kapalı liste ve yerel sınır kuralıdır: reddedilen dosya listeye girmez, uyarı komponentin içinde çizilir, kabul kısmidir. Kırpma (enableCrop) YOKTUR.",
|
|
852
|
+
"Doğrulama: required — prop DEĞİL, düğümün validations listesidir (set_validations { type: 'required', isActive: true, message }); varsayılan KAPALI. Kural boş diziyi ([]) boş sayar: son dosya silinince de tutar (ölçüldü). Kural varken platform isRequired geçirir ve etikette kırmızı * çizilir (ortak Label). Kural yalnız form GÖNDERİLİRKEN koşar (submit düğmesi / formId). isInvalid/invalidText Form'un merkezi hatasıdır; yerel tür ve sınır uyarıları ondan ayrı çizilir.",
|
|
853
|
+
"Bileşenin kendi yazıları (sayaç '{count} dosya', 'Dosya ekle', 'Ek dosya yok', 'Dosyaları bırakın', önizle / indir / kaldır ipuçları, ekran okuyucu duyurusu, tür ve sınır uyarıları, popup başlığı ve Kapat, popupta gömülü file-viewer'ın kelimeleri) ORTAK KELİMEdir: uygulama sözlüğünde compProp.common.<kelime> satırı (attachmentsCount, attachmentsAdd, attachmentsEmpty, …, close, fileLimitSize, fileViewerLoading …; 2026-10-21). Sayfaya yazılmaz; eksik satırları Studio › Çeviriler › 'Eksik bileşen kelimelerini ekle' yazar, düğümün texts'i tek düğümde ezer. label / description / invalidText sayfa metnidir."
|
|
854
|
+
],
|
|
855
|
+
propNotes: {
|
|
856
|
+
value: "Panelde GİZLİ (.hide()): akıştan bağla, change'den sonra self.value ile oku. Şekil ve kayıt tuzakları fileUpload.propNotes.value ile birebir aynıdır (tekil FILE alanına gönderirken diziyi aç, düz URL yazma, tasarımda drive dosyası bağlama).",
|
|
857
|
+
variant: "'dropzone' (varsayılan): kesik çizgili bırakma alanı, tıklayınca da dosya penceresi açar. 'button': \"Dosya seç\" düğmesi, sürükle-bırak yok. Kart ızgarası iki varyasyonda aynıdır.",
|
|
858
|
+
title: "Bırakma alanının metni, HTML kabul eder (<strong> vurgusu). Boşsa uygulama dilinde ortak kelime (compProp.common.attachmentsDropTitle: '<strong>Dosya seçin</strong> ya da buraya sürükleyin' / '<strong>Choose files</strong> or drag them here'). Yalnız variant 'dropzone' iken panelde görünür.",
|
|
859
|
+
buttonText: "Düğmenin metni; boşsa uygulama dilinde ortak kelime (compProp.common.attachmentsChoose: 'Dosya seç' / 'Choose file'). Yalnız variant 'button' iken panelde görünür.",
|
|
860
|
+
isDownloadable: 'Varsayılan açık. Kapalıyken kartta ve popupta indirme düğmesi çizilmez; önizleme yine açılır.',
|
|
861
|
+
isMultiple: 'Varsayılan AÇIK. Kapalıyken yeni dosya eskisinin YERİNE geçer.',
|
|
862
|
+
customFiletypes: "allowedFiletypes listesinde HİÇ olmayan uzantılar için serbest metin: 'heic, p7m' (fileUpload ile aynı sözleşme).",
|
|
863
|
+
description: "Bırakma alanının başlığının altında (dropzone) ya da düğmenin yanında (button) küçük yardım satırı: izin verilen türler, boyut sınırı. Düz metin; sınırı UYGULAMAZ — sınır maxFileSizeMb / allowedFiletypes'tadır.",
|
|
864
|
+
maxFileSizeMb: 'Dosya BAŞINA en büyük boyut (MB); boş/0/negatif sınırsız. Aşan dosya listeye girmez, uyarı komponentin içinde çizilir. Sunucuyu bağlamaz.',
|
|
865
|
+
maxFileCount: 'Toplam dosya sınırı — zaten ekli olanlar da sayılır; boş/0/negatif sınırsız. isMultiple kapalıyken fazladan seçilenler kesilir ve adet uyarısı çizilir.',
|
|
866
|
+
size: "sm | md | lg — metin, ikon ve düğme ölçeği; boşsa uygulamanın form boyutu. Kart ızgarası (156 px'lik sütunlar) boyutla değişmez.",
|
|
867
|
+
cardSize: "'sm' | 'md' | 'lg' (varsayılan) — dosya kartlarının boyu: ızgara sütununun en küçük genişliği 108 / 132 / 156 px (kartlar satırı doldurmak için bundan GENİŞ olabilir). size'dan bağımsızdır (size metin/düğme ölçeği). 520 px altı kapta kart değil satır çizildiği için orada etkisizdir.",
|
|
868
|
+
emptyAlign: "'left' | 'center' (varsayılan) | 'right' — dosya yokken görüntüleme / salt okunur kipte çizilen 'Ek dosya yok' kutusunun metin hizası; emptystate.align ile aynı değerler. Panelde yalnız isViewmode ya da isReadonly açıkken görünür; ekleme yüzeyini ETKİLEMEZ.",
|
|
869
|
+
isCompact: "Yalnız variant 'dropzone'da (button'da panelde gizli). Açıkken dosya seçilmemiş bırakma alanı form girdisi yüksekliğinde TEK SATIR olur (solda küçük ikon, yanında başlık ve küçük açıklama, ~54 px; kapalıyken ~130 px). Çekmece / yan panel formları için. Dosya listesinin kart mı satır mı olduğunu bu anahtar DEĞİL bileşenin genişliği belirler (520 px altı satır).",
|
|
870
|
+
style: "Kök + parçalar: '&__label' (etiket), '&__body' (bırakma alanı / gövde), '&__head' (alanın başlık satırı), '&__button' (button varyasyonundaki 'Dosya seç'), '&__card' (dosya kartı ya da satırı), '&__thumb' (küçük resim), '&__name' (dosya adı), '&__meta' ('PDF · 277 KB' satırı). Örnek: { '&__body': { borderStyle: 'solid' }, '&__card': { borderRadius: '12px' } }. Popup portal ile çizildiği için parça DEĞİLDİR."
|
|
871
|
+
}
|
|
872
|
+
},
|
|
838
873
|
fileInput: {
|
|
839
874
|
summary: 'Klasik dosya SEÇME alanı: etiket + seçilen dosyanın çipi + Gözat butonu. Seçim change ile düğümün kendi prop’una yazılır, akış self.value ile okur.',
|
|
840
875
|
behavior: [
|
|
@@ -911,7 +946,7 @@ export const componentKnowledge = {
|
|
|
911
946
|
"YATAY DOLGU ikon + metinde MÜREKKEBE göre dengelenir (2026-09-29): Material glifinin ~0.2em yan boşluğu yüzünden eşit kutu dolgusunda ikon tarafı 3px geniş görünüyordu ('Save Order': glif 16px, metin 13px). Bileşen ikon tarafını o kadar daraltır (ikon sağdaysa sağı). Dolguyu büyütmek/küçültmek için style.padding YAZMA — !important ile dengeyi ezer; style: { '--ng-btn-pad-x': '18px' } yaz, iki taraf ondan türetilir. Pill (radius-pill) düğmede 16-18px, lg'nin 12px tabanı dar görünür.",
|
|
912
947
|
"METİN RENGİ zeminin ölçülen parlaklığından seçilir (2026-09-29, shared/utils getContrastTextColor): açık zemine koyu, koyu zemine açık metin; temanın onPrimary'si (--ng-text-on-accent) o polaritedeyse o kullanılır, değilse #000000/#ffffff. Tema metin token'ı (--ng-text-primary) YEDEK DEĞİLDİR: koyu modda açığa döner ve açık accent'li butonda (Rexora #B8F06C) metni okunmaz yapıyordu. Tema modu değişince (theme-toggle) renk yeniden hesaplanır; aynı kural icon çipinde ve tablo etiketlerinde de geçerlidir.",
|
|
913
948
|
"Kayıtlı sayfalardaki eski kind:'custom' + customColor ikilisi VERİ GÖÇÜ OLMADAN aynen çizilir (render-anı takma adı, text emsali): surfaceStyle.background boşsa eski renk `--ng-btn-custom-color` değişkeniyle solid/outline/text varyantına eskisi gibi iner; Background doldurulunca takma ad susar. page_runtime_get(resolveStyles:true) bu değişkeni resolvedStyle'da gösterir. DİKKAT: platformun doğrulama duvarı sayfanın TAMAMINI okur — böyle bir düğüm taşıyan sayfaya yapılan her page_schema_patch, dokunulmayan düğüm yüzünden invalid-enum-value/unknown-prop ile reddedilir (ARC-252). Sayfayı yeniden yazmadan önce o butonu kind: semantik değer + surfaceStyle.background'a çevir (aynı çağrıda replace_prop ile).",
|
|
914
|
-
"İpucu (tooltip) prop'u YOKTUR: düğümün ortak appearance.tooltip alanı (+ tooltipPosition: top · bottom · left · right) her komponentte ipucu çizer. Tıklamadan önce onay istemek de butonun değil akışın işidir: click akışının başına confirm adımı koy (yalnız web — mobil barındırıcıda confirm adımı yok)."
|
|
949
|
+
"İpucu (tooltip) prop'u YOKTUR: düğümün ortak appearance.tooltip alanı (+ tooltipPosition: top · bottom · left · right) her komponentte ipucu çizer (metin 't:<anahtar>' ile çeviriye bağlanır — platform_guide('translation') §Bileşen ipucu). Tıklamadan önce onay istemek de butonun değil akışın işidir: click akışının başına confirm adımı koy (yalnız web — mobil barındırıcıda confirm adımı yok)."
|
|
915
950
|
],
|
|
916
951
|
propNotes: {
|
|
917
952
|
kind: "primary | info | success | warning | error — beş semantik renk, temayı izler; temizlenirse (null) primary çizilir. ÖZEL ZEMİN için kind değil surfaceStyle.background yazılır (Dalga 4, 2026-09-14): eski custom seçeneği ve customColor şemadan kalktı, yazılırsa invalid-enum-value / unknown-prop. `datatable.actions[].kind` FARKLI bir sözlük kullanır (error · information · solid · transparent · dark · danger · warning) — buradan bir değer (örn. 'transparent') butona yazılırsa invalid-enum-value verir.",
|
|
@@ -932,7 +967,7 @@ export const componentKnowledge = {
|
|
|
932
967
|
"Menü, buton kilitlenince (isLoading/isDisabled) ya da görünür satır kalmayınca (options boşalınca) AÇIKSA KENDİLİĞİNDEN KAPANIR. Boş/gizli seçenekli ve yükleniyor düğme native disabled DEĞİLDİR (click yine yayılır, Tab odaklanır) ama aria-disabled=true taşır; isLoading ayrıca aria-busy=true yazar. Düğme aria-expanded taşır (aria-haspopup YAZILMAZ: menü rolü ve ok tuşu gezintisi yok, ARC-156), ikon glifi ekran okuyucudan gizlidir.",
|
|
933
968
|
"ERİŞİLEBİLİR AD: metin doluysa metnin kendisi (ariaLabel varsa metnin SONUNA eklenir: text 'Aç' + ariaLabel 'Sipariş 12' → 'Aç Sipariş 12'; etiket metni zaten içeriyorsa tek başına); metin BOŞSA (kebab) sırasıyla ariaLabel → optionsTitle → dilin 'Daha fazla'sı. Satırı tarif eden ad için ('Sipariş 12 işlemleri') kebab'da ariaLabel yaz. Spinner prefers-reduced-motion altında durur.",
|
|
934
969
|
"STİL PARÇALARI: style'a &__button · &__icon · &__text · &__chevron · &__menu · &__title · &__item yazılır (eskiden hiçbiri tutmuyordu, `& .dropdown-menu__button` gibi torun seçicilerle çalışılırdı — onlar HÂLÂ çalışır). &__menu açılan menü kutusu, &__title menü başlığı, &__item her menü satırı. Kökün fontSize/color/fontFamily'si düğmeye, ikonlara, başlığa ve satırlara İNER (size 'sm' düğmenin kendi küçük puntosunu korur: onu &__button { fontSize } ile ez). Açık durum için `&.dropdown-menu--open &__button`, odak için `&__button:focus-visible`.",
|
|
935
|
-
"İpucu (tooltip) prop'u YOKTUR: düğümün ortak appearance.tooltip alanı (+ tooltipPosition) her komponentte ipucu çizer. Aynı bileşen drawer'ın alt şeridinde de kullanılır (actions[].options dolu olan aksiyon); orada prop'ları aksiyon tanımından gelir, sayfa şemasından değil."
|
|
970
|
+
"İpucu (tooltip) prop'u YOKTUR: düğümün ortak appearance.tooltip alanı (+ tooltipPosition) her komponentte ipucu çizer (metin 't:<anahtar>' ile çeviriye bağlanır — platform_guide('translation') §Bileşen ipucu). Aynı bileşen drawer'ın alt şeridinde de kullanılır (actions[].options dolu olan aksiyon); orada prop'ları aksiyon tanımından gelir, sayfa şemasından değil."
|
|
936
971
|
],
|
|
937
972
|
propNotes: {
|
|
938
973
|
kind: "ghost | secondary | outline (varsayılan 'outline') — burada kind RENK DEĞİL, butonun yüzey varyantıdır; buton bileşeninin semantik kind sözlüğünden (primary|info|success|warning|error) bir değer yazılırsa invalid-enum-value verir. Temizlenirse (null) 'outline' çizilir.",
|
|
@@ -1091,7 +1126,7 @@ export const componentKnowledge = {
|
|
|
1091
1126
|
"Arama I/İ/ı/i'yi aynı harf sayar (ISPARTA = ısparta = İsparta) ve tarayıcı diline bağlı değildir; ç, ş, ü gibi diğer aksanlı harfler ayrı harftir.",
|
|
1092
1127
|
"Sağdan sola (dir rtl / ar): girinti sağ kenardan başlar, açma oku aynalanır, klavyede ← dalı açar ve → kapatır (soldan sağa tersi). Ağaç kök öğesi role=tree, dallar aria-expanded taşır; arama kutusunun adı searchPlaceholder, chevron adı \"Aç/kapat: <satır>\".",
|
|
1093
1128
|
"YÜKSEKLİK: ağaç satır sayısı kadar uzar ve kendi içinde KAYDIRMAZ. Düğümde sabit yükseklik (heightType fixed / heightString) verirsen ağaç kutudan taşar ve alttaki komşuları örter: düğümde states.isScrollable:true aç (ya da style { maxHeight, overflowY: 'auto' }). 375px'te mobil kural düğüm yüksekliğini ezer; orada style'daki maxHeight + overflowY yazılır.",
|
|
1094
|
-
"add_component'e props vermezsen katalog varsayılan verisi (Paper/Card/List) GELMEZ: ağaç 'No items' basar — data'yı kendin yaz. icon bir NESNEdir ({ name: 'folder' }); düz metin ('folder') beklenen simgeyi vermez.",
|
|
1129
|
+
"add_component'e props vermezsen katalog varsayılan verisi (Paper/Card/List) GELMEZ: ağaç boş liste kelimesini ('Öğe yok' / 'No items') basar — data'yı kendin yaz. icon bir NESNEdir ({ name: 'folder' }); düz metin ('folder') beklenen simgeyi vermez.",
|
|
1095
1130
|
"currentItem son tıklanan / kutusu değişen / aksiyon alınan satırdır: kutuya tıklamak da onu yazar. Seçili satırı akışta selected'tan oku; akışın yazdığı selected currentItem'ı doldurmaz."
|
|
1096
1131
|
],
|
|
1097
1132
|
propNotes: {
|
|
@@ -1101,9 +1136,9 @@ export const componentKnowledge = {
|
|
|
1101
1136
|
isCheckable: 'Satırlara onay kutusu koyar (çoklu seçim, dal zinciri, yarım durum); change olayını açar.',
|
|
1102
1137
|
currentItem: 'Gizli prop: son tıklanan / kutusu değişen / aksiyon alınan satırın tamamı (arama sürerken children süzülmüş hâliyle).',
|
|
1103
1138
|
isSearchable: 'İstemci tarafı arama kutusu + tümünü aç/kapat araçları.',
|
|
1104
|
-
searchPlaceholder:
|
|
1105
|
-
emptyText:
|
|
1106
|
-
actionsTitle:
|
|
1139
|
+
searchPlaceholder: "Arama kutusunun ipucu metni (yalnız isSearchable:true iken); yazılmazsa ortak kelime (compProp.common.search: 'Ara' / 'Search').",
|
|
1140
|
+
emptyText: "Veri ya da arama sonucu boşken basılan metin; yazılmazsa ortak kelime (compProp.common.treeViewEmpty: 'Öğe yok' / 'No items'), bilerek '' boş satır bırakır.",
|
|
1141
|
+
actionsTitle: "Aksiyon düğmesinin ipucu (üstüne gelince görünen metin) ve ekran okuyucu adı; menü başlık çizmez. Yazılmazsa ortak kelime (compProp.common.treeViewActions: 'İşlem seçin' / 'Choose action'); bilerek '' ipucunu kaldırır, ekran okuyucu adı yine kelimedir.",
|
|
1107
1142
|
isActionsShowAlways: 'Aksiyon düğmesi sürekli görünür (varsayılan: satırın üstüne gelince).',
|
|
1108
1143
|
style: "Kökteki fontFamily, fontSize ve color satır yazısına iner (seçili satırın yazı rengi ve alt metin kendi parçasından — &__text, &__subtle — yazılır; simge ve alt metin boyutu tema jetonundan hesaplanır). Parçalar (&__parça): &__search · &__search-input · &__search-tool · &__list · &__item (satır + alt dalı) · &__row · &__checkbox · &__icon · &__text · &__subtle · &__chevron · &__actions · &__actions-button · &__sublist · &__empty · &__loading. Seçili satır: `&__item[aria-selected=\"true\"] > &__row` (`>` şart: alt dal item'ın içindedir, yoksa seçili olmayan iç satırlar da boyanır) ve yazısı için `... > &__row &__text`. :hover ve :focus-visible parçalara yazılır. surfaceStyle ortak katmandır."
|
|
1109
1144
|
}
|
|
@@ -1978,7 +2013,7 @@ export const componentKnowledge = {
|
|
|
1978
2013
|
"ETKİLEŞİM: href doluysa kök gerçek <a> olur (isNewTabLink yeni sekmede açar) ve click olayı (kilitli değilken) YİNE yayılır; href boş ama click olayı bağlıysa kök <button>tur; ikisi de yoksa salt görsel <div> kalır.",
|
|
1979
2014
|
"KİLİT: isDisabled ikonu soldurur ve etkileşimi keser — bağlantının adresi yazılmaz, düğme disabled olur, click olayı YAYILMAZ. Kökün etiketi kilitlenince DEĞİŞMEZ. Salt görsel ikonda da soldurur (panelde ölü kontrol bırakmamak için).",
|
|
1980
2015
|
'OLAYLAR: mount düğüm ilk çizildiğinde bir kez yayılır (salt görsel ikonda da; isHidden açıkken yayılmaz), click yalnız etkileşimli kökten (href ya da bağlı click) çıkar. İkisi de veri taşımaz.',
|
|
1981
|
-
"İPUCU (tooltip) prop'u YOKTUR: düğümün ortak appearance.tooltip alanı (+ tooltipPosition: top · bottom · left · right) her komponentte ipucu çizer — ikon düğmesinin adını orada yaz.",
|
|
2016
|
+
"İPUCU (tooltip) prop'u YOKTUR: düğümün ortak appearance.tooltip alanı (+ tooltipPosition: top · bottom · left · right) her komponentte ipucu çizer (metin 't:<anahtar>' ile çeviriye bağlanır — platform_guide('translation') §Bileşen ipucu) — ikon düğmesinin adını orada yaz.",
|
|
1982
2017
|
"ERİŞİLEBİLİRLİK: ariaLabel doluysa okuyucular onu okur (salt görselde role=img). Boşsa salt görsel ikon okuyuculardan GİZLENİR; tıklanabilir/bağlantılı ikon ise adsız kalmasın diye ikon adından türetilen etiketi okur. Anlam taşıyan her ikona ariaLabel yaz.",
|
|
1983
2018
|
'BOYUT tema puntosunun katıdır: sm|md|lg|xl kademeleri --ng-font-size ile ölçeklenir (md varsayılan temada ~24px) ya da elle CSS değeri yazılır — çıplak sayı px sayılır; px/em/rem/%/vh…, calc()/var()/clamp() olduğu gibi geçer. Elle değer tema yazı ölçeğini izlemez. Geçersiz uzunluk ("abc"), sıfır ya da negatif değer md\'ye düşer (ikon kaybolmaz, miras boyuta kalmaz); calc()/var() İÇİNDEKİ ifade denetlenmez.',
|
|
1984
2019
|
"ROZET köşesi çipin BAŞLANGIÇ kenarına bağlıdır: tek haneli rozet köşede durur, geniş sayı ('99+', '12500') glife değil DIŞARI büyür; RTL\'de köşe aynalanır (sağdan sola düzende sol üst). warning/info rozetinde yazı rengi zemin parlaklığından seçilir (her iki temada), öteki renklerde tema token\'ı kullanılır. Rozeti kaydırmak için &__badge içine inset-inline-start (RTL\'de kendiliğinden aynalanır) yaz; fiziksel right/left yazarsan başlangıç kenarı da dolu kaldığı için rozet gerilir — onlarla birlikte inset-inline-start: auto yaz.",
|
|
@@ -2092,14 +2127,15 @@ export const componentKnowledge = {
|
|
|
2092
2127
|
siblingCount: 'numbers ve dots’ta mevcut sayfanın iki yanındaki komşu sayısı; ilk ve son sayfa hep görünür, atlananlar "…".',
|
|
2093
2128
|
align: 'left (varsayılan) | center | right barı doğal genişliğinde konumlar; none hücreyi doldurur.',
|
|
2094
2129
|
limitOptions: 'Sayfa boyu seçenekleri; geçersizler elenir, hiçbiri kalmazsa [10,20,30,40,50] kullanılır. Listede olmayan limit seçiciye kendiliğinden eklenir.',
|
|
2095
|
-
infoTemplate: '{from} {to} {total} {page} {pages} yer tutucuları; {fromText} {toText} {totalText} aynı sayılar ama dile göre binlik ayraçlı ("1,000" / "1.000"), {total} ham kalır. Boşsa
|
|
2130
|
+
infoTemplate: '{from} {to} {total} {page} {pages} yer tutucuları; {fromText} {toText} {totalText} aynı sayılar ama dile göre binlik ayraçlı ("1,000" / "1.000"), {total} ham kalır. Boşsa bileşenin pageInfo kelimesi: uygulama sözlüğündeki compProp.pagination.pageInfo satırı, o yoksa tohum ("30 / 57", en: "30 of 57", ar: "30 / 57"; tohumu olmayan dil İngilizceye düşer).',
|
|
2096
2131
|
previousLabel: 'Önceki düğmesinin simgesinin yanına yazılan metin ("Previous", "Geri"); boşsa yalnız simge. Doluysa düğmenin erişilebilir adı da bu metin olur. Metin sabittir (locale ile değişmez): çok dilli istiyorsan translation değeri ver. CSS content: ile ok metni yazma — dile bağlı olmaz.',
|
|
2097
2132
|
nextLabel: 'Sonraki düğmesinin simgesinin soluna yazılan metin ("Next"); boşsa yalnız simge. previousLabel ile aynı kurallar.',
|
|
2098
|
-
limitOptionTemplate: 'Satır seçicisindeki her seçeneğin etiketi; {count} sayıyla dolar ("{count} / page" → "10 / page"). Boşsa
|
|
2133
|
+
limitOptionTemplate: 'Satır seçicisindeki her seçeneğin etiketi; {count} sayıyla dolar ("{count} / page" → "10 / page"). Boşsa bileşenin rowsOption kelimesi: compProp.pagination.rowsOption satırı, o yoksa tohum ("10 satır", en: "10 rows"). Tanınmayan yer tutucu olduğu gibi kalır; {count} içermeyen şablon her seçeneğe aynı etiketi basar. Yalnız showLimitSelector açıkken görünür.',
|
|
2099
2134
|
jumperPrefixLabel: 'Sayfa numarası kutusunun soluna yazılan metin ("Go to"); yalnız showJumper açıkken ve compact dışında çizilir. Sabit metindir; CSS content: ile yazma. Stil için style `&__label`.',
|
|
2100
2135
|
jumperSuffixLabel: 'Sayfa numarası kutusunun sağına yazılan metin ("Page"); jumperPrefixLabel ile aynı kurallar. Kutunun yanına yerleşimi `order` ile ayarlanır (örn. &__limit {order:1}, &__label ve &__page {order:2}).',
|
|
2101
2136
|
showLastPage: 'Yalnız variant numbers ve dots: sağ "…" sonrası son sayfa (numara ya da nokta). false → "…" kalır, son sayfa basılmaz; CSS ile son numarayı gizleme. isTotalUnknown açıkken etkisizdir (panelde gizli).',
|
|
2102
2137
|
isTotalUnknown: 'Toplam kayıt sayısı dönmeyen (cursor/"daha fazla var mı" tarzı) veri için; açıkken ileri gitmeyi hasNextPage belirler.',
|
|
2138
|
+
texts: "Gizli (2026-10-15, ADR 0023, qm çoklu dil dilim 6): sayfalamanın KENDİ kelimelerinden yalnız BU düğümde değiştirilenler; kelime → düz metin ya da çeviri sarmalı. Yazılmayan kelime uygulama sözlüğündeki compProp.pagination.<kelime> satırından, o da yoksa tohumdan (tr/en/ar) gelir; bütün sayfalayıcılar için sözlüğe yazılır (translation_update). Kelimeler (9): first, previous, next, last, goToPage, pageNumber, rowsPerPage, rowsOption, pageInfo — tablonun aynı adlı kelimelerinden (compProp.datatable.*) ayrı satırlardır. previousLabel/nextLabel/infoTemplate/limitOptionTemplate dolu ise kelimenin önüne geçer. Studio'da aynı liste Translations sekmesinde.",
|
|
2103
2139
|
hasNextPage: 'Metin gelirse yalnız true/"true" açık sayılır. Yalnız isTotalUnknown açıkken okunur (panelde yalnız o zaman görünür); false → ileri düğmesi kapalı. Varsayılan true.',
|
|
2104
2140
|
style: "Görünümü (yuvarlak aktif sayfa, hap kap, düz kutulu, chip'li…) style ile kurarsın; variant/size görünümü değil yalnız yapıyı seçer. style KÖK CSS özelliklerini çubuğa yazar (background, borderRadius, boxShadow, padding, width…) ve parça anahtarları alır: &__nav (ok SARMALAYICI div'i — düğmenin kendisi değil: ok düğmesinin ölçüsü/rengi için '&__nav button' yaz), &__number (sayı düğmeleri), &__page (sayfa kutusu — input, ::before/::after almaz), &__label (jumperPrefixLabel/SuffixLabel metinleri), &__info, &__limit (seçici sarmalayıcısı). AKTİF SAYFA ayrı parça DEĞİLDİR: &__number[aria-current='page'] ile hedeflenir (--active/--current gibi sınıf adları tutmaz). Bileşenin kendi kuralları daha özgül: platform her değere !important ekler, o yüzden border/background/borderRadius yazılınca ezer. Çubuğun yüksekliği sabittir (size'a göre 26–36px, varsayılan yazı boyutunda; dikey taşan içerik kırpılır, yatay taşan çubuğun içinde kayar): düğmeleri büyütecek ya da gölge/dikey yerleşim isteyen tasarımda köke height:'auto' ver. İç içe seçici (&__nav:first-child, &__number:not(:last-child), sıradaki-kardeş ~), kökte &::before/&::after + order ve @media çalışır. SINIR: ok simgesinin kendisi prop ile değişmez. Ok yanındaki metin için previousLabel/nextLabel, seçici etiketi için limitOptionTemplate kullan — &__nav::after { content: 'Next' } gibi CSS metni SABİTTİR (locale ve değerle değişmez, çevrilmez). Dinamik bilgi metni yalnız infoTemplate'ten gelir (binlik ayraç için {totalText}); 'Go to … Page' için jumperPrefixLabel/jumperSuffixLabel, son numarayı gizlemek için showLastPage:false kullan."
|
|
2105
2141
|
}
|
|
@@ -2228,8 +2264,8 @@ export const componentKnowledge = {
|
|
|
2228
2264
|
label: 'Alanın adı, track’in üstünde. Boş bırakılırsa hiç çizilmez ve kontrolün ekran okuyucudaki adı iki segmentin metninden okunur — form içindeki switcher’a etiket yaz.',
|
|
2229
2265
|
description: 'Track’in altındaki yardım metni; isInvalid açıkken yerini invalidText alır (ikisi aynı anda çizilmez).',
|
|
2230
2266
|
value: 'Hangi segmentin seçili olduğu (boolean; true = sağdaki/trueLabel segmenti). Akıştan yazılınca kontrol yansıtır, kullanıcı değiştirince change setter’ı geri yazar.',
|
|
2231
|
-
trueLabel: 'Sağdaki (true) segmentin metni;
|
|
2232
|
-
falseLabel: 'Soldaki (false) segmentin metni;
|
|
2267
|
+
trueLabel: 'Sağdaki (true) segmentin metni; yazılmazsa uygulama dilinde ortak kelime (compProp.common.switcherOn: "Açık" / "On"), bilerek boş metin segmenti metinsiz bırakır. trueIcon ile birlikte ya da tek başına kullanılır — ikisi de boşsa segment boş bir kutu olarak çizilir.',
|
|
2268
|
+
falseLabel: 'Soldaki (false) segmentin metni; yazılmazsa ortak kelime (compProp.common.switcherOff: "Kapalı" / "Off"). falseIcon ile birlikte ya da tek başına kullanılır.',
|
|
2233
2269
|
autofocus: 'Sayfa açılınca odak bu kontrole gelir (kilitli/yükleniyor kontrolde ve tasarım kanvasında çalışmaz). Sayfada tek alana ver.',
|
|
2234
2270
|
isViewmode: 'Salt okunur görünüm: vurgu sönük renge düşer, seçili segment seçili görünür, tıklanamaz.',
|
|
2235
2271
|
isLoading: 'Kontrolü dondurur (tık iptal edilir, olay yayılmaz) ama GRİLEŞTİRMEZ ve `disabled` YAPMAZ — kilit kipi değildir: odak ve tab sırası korunur, alan `aria-busy` taşır. Track’in sağında dönen spinner çizilir.'
|
|
@@ -2391,10 +2427,10 @@ export const componentKnowledge = {
|
|
|
2391
2427
|
"eventMove ve eventCreate tarihleri iki biçimdedir: tüm-gün aralık yerel 'yyyy-MM-dd', saatli aralık ISO-Z (toISOString) — uca yazarken ikisini de karşıla.",
|
|
2392
2428
|
"defaultDate ve defaultView DEĞİŞTİKÇE uygulanır (panelde ya da akıştan yazınca takvim o tarihe/görünüme gider, olay yaymaz); aynı değerle tekrar gelen render kullanıcının gezindiği yeri sıfırlamaz — aynı tarihe tekrar gitmek için değerin değişmesi gerekir.",
|
|
2393
2429
|
"isLoading: takvim soluklaşır, üstte yükleyici; etkinlik tıklaması (Enter dahil), gün/slot tıklaması, aralık seçimi, taşıma ve boyutlandırma OLAY YAYMAZ. Gezinme okları ve görünüm düğmeleri açık kalır (monthChange/viewChange yayılır) — ay değiştirirken yeniden çekme sürebilir. Kök aria-busy=true taşır.",
|
|
2394
|
-
"Hafta başlangıcı
|
|
2430
|
+
"Hafta başlangıcı dilin kendi günüdür (tarayıcının Intl hafta bilgisi, 2026-10-15): tr ve ru Pazartesi, en Pazar, ar Cumartesi — ay ızgarası, gün başlıkları ve hafta görünümü aynı kuralı izler; locale boşsa uygulama dili. Ay başlığı tek başına ay adıdır (ru 'август 2026'). startHour/endHour saat penceresini belirler (0–23 / 1–24, endHour en az startHour+1'e kırpılır); pencereye kısmen taşan blok en az 15 dakikalık yükseklikle çizilir.",
|
|
2395
2431
|
"Etkinlik her görünümde <elementId>__event-<id> data-element-id'si taşır; bırakma hedefleri ay hücresi ve hafta/gün kolonu <elementId>__day-<yyyy-MM-dd>, tüm gün hücresi __allday-<yyyy-MM-dd>, saat dilimi __slot-<yyyy-MM-dd>T<HH> (YEREL tarih). eventClick 'click' ile, eventMove page_screenshot actions 'drag' (target etkinlik, to gün/slot) ile doğrulanır; slota bırakma o saatin ortasına düşer ve 30 dakikaya yuvarlanır. Çok günlü etkinlik aynı kimliği her gününde taşır, hedef ilk eşleşmedir.",
|
|
2396
2432
|
"Klavye ve ekran okuyucu: ay hücresi odaklanmaz — içindeki gün numarası düğmesi odaklanır (adı 'tarih, n etkinlik'; Enter/Space isCreatable açıkken eventCreate, kapalıyken dateClick). Etkinlik (çip, blok, ajanda satırı) role=button'dır; Enter VE Space eventClick yayar, olay hücreye sızmaz (hücrenin dateClick/eventCreate'i ayrıca tetiklenmez). Saat dilimi düğmeleri yalnız isCreatable açıkken odaklanır ve tarih+saat adı taşır; bugünün hücresi aria-current=date, görünüm düğmeleri 'Takvim görünümü' adlı tablist içinde, odak halkası 2px. Klavyeyle taşıma/boyutlandırma ve aralık seçimi YOKTUR — onlar yalnız fare/kalem.",
|
|
2397
|
-
"Dil: Bugün, görünüm adları, 'Etkinlik yok', 'Tüm gün' ve ok adları tr/en/ar sözlüğünden gelir; ay/gün adları
|
|
2433
|
+
"Dil: Bugün, görünüm adları, 'Etkinlik yok', 'Tüm gün' ve ok adları tr/en/ar sözlüğünden gelir (başka dil İngilizceye düşer); ay/gün adları HER dilde o dilin kendisidir (Intl; ru, de… kod gerektirmez). RTL'de çip şeridi ve ok yönü mantıksaldır (şerit sağda, önceki oku sağa bakar), çakışan bloklar sağdan dizilir.",
|
|
2398
2434
|
"Etkinlik rengi her zeminde okunur: yazı rengi etkinlik renginin ~%35'i + tema yazı renginin karışımıdır (açık sarı, beyaz, 'info' dahil kontrast ≥ 4.5, açık ve koyu tema); kenar şeridi ve zemin tonu ham renktir. Yani ham rengi yazıda aynen bekleme — renk kimliğini şerit ve zemin taşır.",
|
|
2399
2435
|
"Aynı kimlikli iki satır ÇÖKERTMEZ: ikisi de çizilir, yükte id aynen gider; iyimser taşıma kopyaları ayrı tutar (sürüklenen kopya kendi anahtarıyla kayar), ama data-element-id'leri aynıdır ve page_screenshot eylemi ilk eşleşmeye gider — id'leri benzersiz tut. Takvimde olmayan tarih ('2026-02-30', saatli '2026-02-30T10:00' dahil) satırı düşürür, defaultDate'te bugüne düşer (sessizce ertesi aya kaymaz); sayıya çevrilemeyen, boş ya da null startHour/endHour 8–18'e, maxVisibleEvents 3'e döner.",
|
|
2400
2436
|
"Dar ekranda başlık ve düğme grubu iki satıra bölünür (başlık kırpılmaz); tüm-gün şeridi ~8em'de kayar, çok sayıda tüm-gün etkinlik saat ızgarasını ezmez; 8+ çakışan blok dar sütunda yalnız renkli şerit gösterir — gün görünümüne geç.",
|
|
@@ -2412,7 +2448,7 @@ export const componentKnowledge = {
|
|
|
2412
2448
|
isEditable: 'Sürükleyerek taşıma + hafta/gün kenarından boyutlandırma; ikisi de eventMove.',
|
|
2413
2449
|
isCreatable: 'Tıklama ve sürükleyerek aralık seçimiyle eventCreate; açıkken ay görünümünde dateClick YAYILMAZ.',
|
|
2414
2450
|
startHour: 'Hafta/gün görünümünün ilk saati (0–23, varsayılan 8); endHour (1–24, varsayılan 18) en az startHour+1 olacak biçimde kırpılır.',
|
|
2415
|
-
locale: "tr | en | boş (uygulama dili).
|
|
2451
|
+
locale: "tr | en | boş (uygulama dili). Ay/gün adları ve hafta başı her dilde o dilin kendisi (Intl); etiketler (Bugün, görünüm adları) tr/en/ar sözlüğünden, başka dilde İngilizce.",
|
|
2416
2452
|
style: "Kök (CSS özellikleri doğrudan style'da) takvim kabıdır: backgroundColor · padding · border · borderRadius · color · fontFamily · fontSize içeri MİRAS iner (parçaların boyutu köke göre orantılıdır: kök 20px ise çip ≈ 15.8px; tek parçayı değiştirmek için ilgili parçaya yaz); maxHeight kökü kırpar ve ızgara İÇİNDE kayar. Parçalar: &__header · &__title · &__nav · &__views · &__view-button · &__nav-button · &__weekdays · &__weekday · &__grid · &__day · &__day-number · &__chips · &__chip · &__more · &__timegrid · &__timegrid-header · &__timegrid-day · &__allday · &__allday-cell · &__gutter · &__timegrid-body · &__hours · &__hour-label · &__day-column · &__slot · &__block · &__resize · &__agenda · &__agenda-group · &__agenda-day · &__agenda-row · &__agenda-time · &__agenda-title · &__agenda-empty · &__loader. Durumlar iç içe yazılır: '&__chip': { '&:hover': {…}, '&:focus-visible': {…} }, aktif görünüm düğmesi '&__view-button[aria-selected=\"true\"]', bugünün hücresi '&__day--today' ya da gün numarası '&__day-number[aria-current=\"date\"]'. Etkinlik rengi --chip-color değişkenidir: color-mix(in srgb, var(--chip-color) 20%, #fff) yazılabilir. @media kuralı iç parçaya tek '&' ile bağlanmaz — '@media (max-width: 500px)': { '&&': { '& &__title': {…} } } biçiminde yaz. Parça seçicileri 2026-10-01'e kadar yalnız &__header için çalışıyordu; eski notlar '& .ng-eventcalendar__chip' yazıyorsa o biçim de çalışır ama gereksizdir."
|
|
2417
2453
|
}
|
|
2418
2454
|
},
|
|
@@ -2620,6 +2656,7 @@ export const componentKnowledge = {
|
|
|
2620
2656
|
"Esc önce açık sürüm seçicisini, sonra açık bölüm menüsünü / liste panelini, sonra çekmeceyi kapatır (close yayar; Vazgeç de close; inline'da kapatmaz). Bileşenin kendi denetimi tıklanınca kalkarsa odak bileşende kalır (seçiciden seçince seçici düğmesi, bölüm menüsünden seçince menü düğmesi, liste panelinden seçince 'Değişiklikler' düğmesi, karttan Alanlar'a geçince Alanlar sekmesi, 'Dosyaları yan yana aç'ta görüntüleyici; öbür kartlarda çekmecenin kökü, inline'da görünüm anahtarı) — Alt+↓/↑ ve Esc çalışmaya devam eder. Açılışta odak başlığa gider, komponent kaldırılınca açan öğeye döner (inline'da ikisi de yok). 'Bu versiyonu aç' yalnız Eski kartta ve canOpen:true sürümde görünür → openVersion { id }.",
|
|
2621
2657
|
"mode: drawer (tam görünüm) | inline (okuma modu kâğıdı); inlineView (marked | standard) yalnız inline'da, durumu uygulama tutar (inlineViewChange). view (side | unified) başlangıç değeridir, kullanıcı çekmecede değiştirir (olay yayılmaz); dar ekranda başlangıç birleşiktir.",
|
|
2622
2658
|
"xlsx ↔ csv: csv tek sayfasıyla, karşı taraf çok sayfalıysa en benzer sayfayla eşlenir; öbür sayfalar sayfa sekmelerinde 'Karşılaştırılmadı' durumuyla görünür (değişiklik sayısına girmez, satırları işaretsiz), bant 'n sayfa karşılaştırılmadı.' der; csv tarafında adsız eşlenen sayfanın sekmesi listedeki grubun adıyla ('Liste'). Karşılaştırılmayan sayfa yoksa csv'de sekme yok.",
|
|
2659
|
+
"docx'teki gömülü resimler (f-11) kâğıtta Word'deki yerinde ve boyutunda çizilir, kâğıttan genişse sığdırılır: yalnız resim olan paragraf sonraki bloğun önünde (belgenin sonundaysa son bloğun ardında), metinli paragrafın resmi metninin ardında, tablo hücresindeki hücre metninin ardında. Çizilemeyen biçim (emf, wmf, tif) ya da dosyada olmayan resim yerine resmin boyutunda 'Görsel önizlenemiyor' kutusu. Resim farkı İŞARETLENMEZ ve SAYILMAZ: yan yanada her kâğıt kendi versiyonunun resmini çizer (birleşikte gösterilen tarafınkini), değişiklik sayısı ve listesi yalnız metin ve biçim farkından gelir. Üst / alt bilgi, grafik ve şekil çizilmez; metni olmayan belgede resim çizilmez.",
|
|
2623
2660
|
"docx ↔ docx'te biçim farkı da 'Değişti' sayılır (f-10): metni aynı, kalınlığı / italiği / altı ya da üstü çizgisi / yazı rengi / vurgu rengi farklı paragraf, başlık, madde ya da tablo satırı mor çizgi + 'Değişti' alır, sözcük işareti yok, neyin değiştiği yazılmaz. Yazı tipi, punto ve stil tanımından gelen biçim sayılmaz; tür değişmişte, pdf ve pptx'te biçim karşılaştırılmaz.",
|
|
2624
2661
|
"Dosya türü değişmişse (ör. docx → pdf, xlsx → csv; iki taraftan da metin çıkıyorsa) yalnız birleşik görünüm ve bilgi bandı: 'Dosya türü değişti: <eski etiket> <tür> → <yeni etiket> <tür>.' + 'İki dosyanın da metni çıkarıldı ve metin karşılaştırıldı.' (bir taraf pdf ise 'Bölüm başlıkları pdf'te sayfa içinden okunur; gezinme sayfa ve bölüm bazlıdır.') + 'Biçim ve sayfa düzeni farkı işaretlenmez.' + 'Belge formatı değiştiği için tam karşılaştırma yapılamıyor.'; çok sayfalı xlsx ↔ csv'de ardından 'n sayfa karşılaştırılmadı.'. Excel başka türe dönünce sayfa adı başlık sayılmaz (format kaynaklı).",
|
|
2625
2662
|
"Metinler: arayüz metinleri uygulama dilinde (tr, en; diğer diller İngilizce) gelir; texts aynı anahtarlarla bunları ezer (ör. noFileText, lockedReason) ve uygulamaya özgü metinleri taşır: footer (alt bilgi sınır metni — verilirse her türde türün kendi metninin yerine geçer), pickerNote (seçicinin alt notu), fieldsNote (alanlar notu), permissionNote (hak yok kartının açıklaması), groups (seçici grup anahtarı → başlık, ör. { archive: 'Arşiv' })."
|
|
@@ -245,6 +245,12 @@ export const componentEventContracts = {
|
|
|
245
245
|
reads: "self.value — dosya EKLENİNCE de SİLİNİNCE de (çipe tıklama) aynı olay yayılır ve yük her seferinde KALAN TÜM listedir, yalnız yeni dosyalar değil. isMultiple:false iken dizi tek elemanlıdır. Kilitliyken (isDisabled/isReadonly/isViewmode) hiç yayılmaz; tür/boyut/adet sınırına takılan dosya listeye girmez ve uyarı komponentin içinde çizilir, ama kabul KISMİDİR: geçen dosya varsa olay GEÇENLERLE yayılır, yalnız hepsi reddedilirse hiç yayılmaz. enableCrop açıkken görsel dosyalar kırpma katmanından geçtikten SONRA yayılır (İptal dosyayı düşürür; hepsi düşerse olay çalışmaz). Akışın yazdığı type:'ref' kayıtları yükte aynen kalır. isMultiple:false iken de dizidir (silmede []); tekil FILE alanına göndermeden önce ilk elemanı al (componentCatalog fileUpload.propNotes.value)."
|
|
246
246
|
}
|
|
247
247
|
},
|
|
248
|
+
attachments: {
|
|
249
|
+
change: {
|
|
250
|
+
payload: { value: "Array — fileUpload ile aynı: yeni seçimde { type:'file', ref:'', fileName, value:<base64 data URL> }; akışın yazdığı kayıtlı dosya AYNEN ({ type:'ref', value:<fileId>, fileName, absolute_path, … })" },
|
|
251
|
+
reads: "self.value — dosya EKLENİNCE de kartın × düğmesiyle SİLİNİNCE de aynı olay yayılır ve yük her seferinde KALAN TÜM listedir. Kilitliyken (isDisabled/isReadonly/isViewmode) hiç yayılmaz. Önizleme ve indirme olay YAYMAZ. Tür/boyut/adet sınırına takılan dosya listeye girmez, kabul kısmidir: geçen dosya varsa olay GEÇENLERLE yayılır, hepsi reddedilirse hiç yayılmaz. isMultiple:false iken de dizidir; tekil FILE alanına göndermeden önce ilk elemanı al."
|
|
252
|
+
}
|
|
253
|
+
},
|
|
248
254
|
fileInput: {
|
|
249
255
|
mount: NO_DATA,
|
|
250
256
|
change: {
|