sheetgl 0.0.0-stage → 2.0.2
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/LICENSE +21 -0
- package/README.md +167 -2
- package/bin/cli.mjs +370 -0
- package/dist/lib/sheetgl.cjs +5 -0
- package/dist/lib/sheetgl.cjs.map +1 -0
- package/dist/lib/sheetgl.js +14972 -0
- package/dist/lib/sheetgl.js.map +1 -0
- package/dist/lib/types/columns/ColumnTypeRegistry.d.ts +9 -0
- package/dist/lib/types/columns/ColumnTypeRegistry.d.ts.map +1 -0
- package/dist/lib/types/columns/IColumnTypePlugin.d.ts +68 -0
- package/dist/lib/types/columns/IColumnTypePlugin.d.ts.map +1 -0
- package/dist/lib/types/columns/initPlugins.d.ts +2 -0
- package/dist/lib/types/columns/initPlugins.d.ts.map +1 -0
- package/dist/lib/types/columns/types/ActionColumn/ActionPainter.d.ts +3 -0
- package/dist/lib/types/columns/types/ActionColumn/ActionPainter.d.ts.map +1 -0
- package/dist/lib/types/columns/types/ActionColumn/index.d.ts +3 -0
- package/dist/lib/types/columns/types/ActionColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/BooleanColumn/BooleanPainter.d.ts +3 -0
- package/dist/lib/types/columns/types/BooleanColumn/BooleanPainter.d.ts.map +1 -0
- package/dist/lib/types/columns/types/BooleanColumn/index.d.ts +3 -0
- package/dist/lib/types/columns/types/BooleanColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/ColorColumn/ColorEditor.d.ts +4 -0
- package/dist/lib/types/columns/types/ColorColumn/ColorEditor.d.ts.map +1 -0
- package/dist/lib/types/columns/types/ColorColumn/index.d.ts +4 -0
- package/dist/lib/types/columns/types/ColorColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/CurrencyColumn/CurrencyPainter.d.ts +3 -0
- package/dist/lib/types/columns/types/CurrencyColumn/CurrencyPainter.d.ts.map +1 -0
- package/dist/lib/types/columns/types/CurrencyColumn/index.d.ts +3 -0
- package/dist/lib/types/columns/types/CurrencyColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/DateColumn/DateEditor.d.ts +4 -0
- package/dist/lib/types/columns/types/DateColumn/DateEditor.d.ts.map +1 -0
- package/dist/lib/types/columns/types/DateColumn/DatePainter.d.ts +3 -0
- package/dist/lib/types/columns/types/DateColumn/DatePainter.d.ts.map +1 -0
- package/dist/lib/types/columns/types/DateColumn/index.d.ts +3 -0
- package/dist/lib/types/columns/types/DateColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/DateTimeColumn/DateTimeEditor.d.ts +4 -0
- package/dist/lib/types/columns/types/DateTimeColumn/DateTimeEditor.d.ts.map +1 -0
- package/dist/lib/types/columns/types/DateTimeColumn/DateTimePainter.d.ts +7 -0
- package/dist/lib/types/columns/types/DateTimeColumn/DateTimePainter.d.ts.map +1 -0
- package/dist/lib/types/columns/types/DateTimeColumn/index.d.ts +3 -0
- package/dist/lib/types/columns/types/DateTimeColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/DropdownColumn/DropdownPainter.d.ts +3 -0
- package/dist/lib/types/columns/types/DropdownColumn/DropdownPainter.d.ts.map +1 -0
- package/dist/lib/types/columns/types/DropdownColumn/index.d.ts +3 -0
- package/dist/lib/types/columns/types/DropdownColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/EmailColumn/index.d.ts +4 -0
- package/dist/lib/types/columns/types/EmailColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/LookupColumn/LookupEditor.d.ts +4 -0
- package/dist/lib/types/columns/types/LookupColumn/LookupEditor.d.ts.map +1 -0
- package/dist/lib/types/columns/types/LookupColumn/LookupPainter.d.ts +3 -0
- package/dist/lib/types/columns/types/LookupColumn/LookupPainter.d.ts.map +1 -0
- package/dist/lib/types/columns/types/LookupColumn/index.d.ts +3 -0
- package/dist/lib/types/columns/types/LookupColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/MultiSelectColumn/MultiSelectEditor.d.ts +4 -0
- package/dist/lib/types/columns/types/MultiSelectColumn/MultiSelectEditor.d.ts.map +1 -0
- package/dist/lib/types/columns/types/MultiSelectColumn/MultiSelectPainter.d.ts +4 -0
- package/dist/lib/types/columns/types/MultiSelectColumn/MultiSelectPainter.d.ts.map +1 -0
- package/dist/lib/types/columns/types/MultiSelectColumn/index.d.ts +3 -0
- package/dist/lib/types/columns/types/MultiSelectColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/NumberColumn/NumberEditor.d.ts +4 -0
- package/dist/lib/types/columns/types/NumberColumn/NumberEditor.d.ts.map +1 -0
- package/dist/lib/types/columns/types/NumberColumn/NumberPainter.d.ts +3 -0
- package/dist/lib/types/columns/types/NumberColumn/NumberPainter.d.ts.map +1 -0
- package/dist/lib/types/columns/types/NumberColumn/index.d.ts +3 -0
- package/dist/lib/types/columns/types/NumberColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/ObjectColumn/ObjectEditor.d.ts +4 -0
- package/dist/lib/types/columns/types/ObjectColumn/ObjectEditor.d.ts.map +1 -0
- package/dist/lib/types/columns/types/ObjectColumn/ObjectPainter.d.ts +5 -0
- package/dist/lib/types/columns/types/ObjectColumn/ObjectPainter.d.ts.map +1 -0
- package/dist/lib/types/columns/types/ObjectColumn/index.d.ts +3 -0
- package/dist/lib/types/columns/types/ObjectColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/PdfColumn/PdfPainter.d.ts +3 -0
- package/dist/lib/types/columns/types/PdfColumn/PdfPainter.d.ts.map +1 -0
- package/dist/lib/types/columns/types/PdfColumn/index.d.ts +3 -0
- package/dist/lib/types/columns/types/PdfColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/PercentColumn/index.d.ts +5 -0
- package/dist/lib/types/columns/types/PercentColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/PhoneColumn/index.d.ts +4 -0
- package/dist/lib/types/columns/types/PhoneColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/ProgressColumn/ProgressPainter.d.ts +3 -0
- package/dist/lib/types/columns/types/ProgressColumn/ProgressPainter.d.ts.map +1 -0
- package/dist/lib/types/columns/types/ProgressColumn/index.d.ts +3 -0
- package/dist/lib/types/columns/types/ProgressColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/RatingColumn/RatingPainter.d.ts +3 -0
- package/dist/lib/types/columns/types/RatingColumn/RatingPainter.d.ts.map +1 -0
- package/dist/lib/types/columns/types/RatingColumn/index.d.ts +3 -0
- package/dist/lib/types/columns/types/RatingColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/SelectColumn/SelectEditor.d.ts +4 -0
- package/dist/lib/types/columns/types/SelectColumn/SelectEditor.d.ts.map +1 -0
- package/dist/lib/types/columns/types/SelectColumn/SelectPainter.d.ts +3 -0
- package/dist/lib/types/columns/types/SelectColumn/SelectPainter.d.ts.map +1 -0
- package/dist/lib/types/columns/types/SelectColumn/index.d.ts +3 -0
- package/dist/lib/types/columns/types/SelectColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/SparklineColumn/SparklinePainter.d.ts +3 -0
- package/dist/lib/types/columns/types/SparklineColumn/SparklinePainter.d.ts.map +1 -0
- package/dist/lib/types/columns/types/SparklineColumn/index.d.ts +3 -0
- package/dist/lib/types/columns/types/SparklineColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/TextColumn/TextEditor.d.ts +4 -0
- package/dist/lib/types/columns/types/TextColumn/TextEditor.d.ts.map +1 -0
- package/dist/lib/types/columns/types/TextColumn/TextPainter.d.ts +3 -0
- package/dist/lib/types/columns/types/TextColumn/TextPainter.d.ts.map +1 -0
- package/dist/lib/types/columns/types/TextColumn/index.d.ts +3 -0
- package/dist/lib/types/columns/types/TextColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/TimeColumn/TimeEditor.d.ts +4 -0
- package/dist/lib/types/columns/types/TimeColumn/TimeEditor.d.ts.map +1 -0
- package/dist/lib/types/columns/types/TimeColumn/TimePainter.d.ts +3 -0
- package/dist/lib/types/columns/types/TimeColumn/TimePainter.d.ts.map +1 -0
- package/dist/lib/types/columns/types/TimeColumn/index.d.ts +3 -0
- package/dist/lib/types/columns/types/TimeColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/UrlColumn/index.d.ts +4 -0
- package/dist/lib/types/columns/types/UrlColumn/index.d.ts.map +1 -0
- package/dist/lib/types/core/FilterEngine.d.ts +33 -0
- package/dist/lib/types/core/FilterEngine.d.ts.map +1 -0
- package/dist/lib/types/core/GeometryEngine.d.ts +65 -0
- package/dist/lib/types/core/GeometryEngine.d.ts.map +1 -0
- package/dist/lib/types/core/GridApi.d.ts +66 -0
- package/dist/lib/types/core/GridApi.d.ts.map +1 -0
- package/dist/lib/types/core/GroupingEngine.d.ts +8 -0
- package/dist/lib/types/core/GroupingEngine.d.ts.map +1 -0
- package/dist/lib/types/core/HistoryManager.d.ts +18 -0
- package/dist/lib/types/core/HistoryManager.d.ts.map +1 -0
- package/dist/lib/types/core/SelectionModel.d.ts +17 -0
- package/dist/lib/types/core/SelectionModel.d.ts.map +1 -0
- package/dist/lib/types/core/SortEngine.d.ts +7 -0
- package/dist/lib/types/core/SortEngine.d.ts.map +1 -0
- package/dist/lib/types/core/ValidationEngine.d.ts +33 -0
- package/dist/lib/types/core/ValidationEngine.d.ts.map +1 -0
- package/dist/lib/types/data/BlockCache.d.ts +12 -0
- package/dist/lib/types/data/BlockCache.d.ts.map +1 -0
- package/dist/lib/types/data/LocalDataStore.d.ts +85 -0
- package/dist/lib/types/data/LocalDataStore.d.ts.map +1 -0
- package/dist/lib/types/data/RemoteDataStore.d.ts +94 -0
- package/dist/lib/types/data/RemoteDataStore.d.ts.map +1 -0
- package/dist/lib/types/hooks/useGridGeometry.d.ts +65 -0
- package/dist/lib/types/hooks/useGridGeometry.d.ts.map +1 -0
- package/dist/lib/types/hooks/useGridSelection.d.ts +43 -0
- package/dist/lib/types/hooks/useGridSelection.d.ts.map +1 -0
- package/dist/lib/types/i18n/IGridLocale.d.ts +25 -0
- package/dist/lib/types/i18n/IGridLocale.d.ts.map +1 -0
- package/dist/lib/types/i18n/LocaleEngine.d.ts +10 -0
- package/dist/lib/types/i18n/LocaleEngine.d.ts.map +1 -0
- package/dist/lib/types/i18n/locales/enUS.d.ts +3 -0
- package/dist/lib/types/i18n/locales/enUS.d.ts.map +1 -0
- package/dist/lib/types/i18n/locales/trTR.d.ts +3 -0
- package/dist/lib/types/i18n/locales/trTR.d.ts.map +1 -0
- package/dist/lib/types/index.d.ts +44 -0
- package/dist/lib/types/index.d.ts.map +1 -0
- package/dist/lib/types/overlays/BatchChangesModal.d.ts +19 -0
- package/dist/lib/types/overlays/BatchChangesModal.d.ts.map +1 -0
- package/dist/lib/types/overlays/ContextMenuOverlay.d.ts +44 -0
- package/dist/lib/types/overlays/ContextMenuOverlay.d.ts.map +1 -0
- package/dist/lib/types/overlays/DeleteConfirmProgressModal.d.ts +14 -0
- package/dist/lib/types/overlays/DeleteConfirmProgressModal.d.ts.map +1 -0
- package/dist/lib/types/overlays/DynamicCellEditor.d.ts +15 -0
- package/dist/lib/types/overlays/DynamicCellEditor.d.ts.map +1 -0
- package/dist/lib/types/overlays/HeaderFilterPopover.d.ts +33 -0
- package/dist/lib/types/overlays/HeaderFilterPopover.d.ts.map +1 -0
- package/dist/lib/types/overlays/PdfPreviewModalOverlay.d.ts +18 -0
- package/dist/lib/types/overlays/PdfPreviewModalOverlay.d.ts.map +1 -0
- package/dist/lib/types/overlays/SparklineModalOverlay.d.ts +18 -0
- package/dist/lib/types/overlays/SparklineModalOverlay.d.ts.map +1 -0
- package/dist/lib/types/renderer/CanvasRenderer.d.ts +45 -0
- package/dist/lib/types/renderer/CanvasRenderer.d.ts.map +1 -0
- package/dist/lib/types/renderer/GroupRowPainter.d.ts +10 -0
- package/dist/lib/types/renderer/GroupRowPainter.d.ts.map +1 -0
- package/dist/lib/types/renderer/SkeletonPainter.d.ts +5 -0
- package/dist/lib/types/renderer/SkeletonPainter.d.ts.map +1 -0
- package/dist/lib/types/theme/ColumnColorEngine.d.ts +52 -0
- package/dist/lib/types/theme/ColumnColorEngine.d.ts.map +1 -0
- package/dist/lib/types/theme/IGridTheme.d.ts +47 -0
- package/dist/lib/types/theme/IGridTheme.d.ts.map +1 -0
- package/dist/lib/types/theme/ThemeEngine.d.ts +10 -0
- package/dist/lib/types/theme/ThemeEngine.d.ts.map +1 -0
- package/dist/lib/types/theme/presets/appleDark.d.ts +3 -0
- package/dist/lib/types/theme/presets/appleDark.d.ts.map +1 -0
- package/dist/lib/types/theme/presets/appleLight.d.ts +3 -0
- package/dist/lib/types/theme/presets/appleLight.d.ts.map +1 -0
- package/dist/lib/types/theme/presets/googleDark.d.ts +3 -0
- package/dist/lib/types/theme/presets/googleDark.d.ts.map +1 -0
- package/dist/lib/types/theme/presets/googleLight.d.ts +3 -0
- package/dist/lib/types/theme/presets/googleLight.d.ts.map +1 -0
- package/dist/lib/types/types/filter.d.ts +28 -0
- package/dist/lib/types/types/filter.d.ts.map +1 -0
- package/dist/lib/types/types/grid.d.ts +464 -0
- package/dist/lib/types/types/grid.d.ts.map +1 -0
- package/dist/lib/types/types/group.d.ts +31 -0
- package/dist/lib/types/types/group.d.ts.map +1 -0
- package/dist/lib/types/types/store.d.ts +102 -0
- package/dist/lib/types/types/store.d.ts.map +1 -0
- package/dist/lib/types/ui/FormulaBar.d.ts +28 -0
- package/dist/lib/types/ui/FormulaBar.d.ts.map +1 -0
- package/dist/lib/types/ui/MaterialIcon.d.ts +28 -0
- package/dist/lib/types/ui/MaterialIcon.d.ts.map +1 -0
- package/dist/lib/types/ui/SheetGL.d.ts +73 -0
- package/dist/lib/types/ui/SheetGL.d.ts.map +1 -0
- package/dist/lib/types/ui/SheetGLLogo.d.ts +10 -0
- package/dist/lib/types/ui/SheetGLLogo.d.ts.map +1 -0
- package/dist/lib/types/ui/SummaryFooter.d.ts +31 -0
- package/dist/lib/types/ui/SummaryFooter.d.ts.map +1 -0
- package/dist/lib/types/ui/ToolBar.d.ts +48 -0
- package/dist/lib/types/ui/ToolBar.d.ts.map +1 -0
- package/dist/lib/types/version.d.ts +2 -0
- package/dist/lib/types/version.d.ts.map +1 -0
- package/package.json +77 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sheetgl.js","names":["_Fragment","_Fragment","_Fragment","_Fragment","_Fragment","_Fragment","_Fragment","_Fragment","formatters","getFormatter","React","SelectionModel","row","col","minRow","maxRow","minCol","maxCol","useGridSelection","selectionRef","useRef","selectionVersion","setSelectionVersion","useState","selectedCellUI","setSelectedCellUI","isDraggingSelection","setIsDraggingSelection","isDraggingRowNumbers","setIsDraggingRowNumbers","notifyChange","useCallback","v","onRequestRender","onSelectionChanged","model","selectCell","startRow","startCol","endRow","endCol","rowCount","colCount","isRangeSelect","rowIndex","cur","nextRow","dRow","nextCol","dCol","onEnsureCellVisible","GeometryEngine","rowHeight","headerHeight","groupHeaderHeight","columnGroups","columns","height","groupsById","groupsByTitle","g","colId","existing","inlineGroup","width","visibleCols","c","isMobileViewport","maxFrozenBudget","nextFrozen","nextScrollable","currentFrozenW","sum","acc","i","low","high","mid","start","end","scrollX","frozenCount","colIndex","x","scrollIdx","scrollLeft","canvasY","canvasX","clickedCol","headerX","headerW","curX","w","sx","sIdx","colDef","groupDef","isGroupHeaderHit","groupColIndices","isFrozenPartition","minBound","maxBound","startIdx","endIdx","idx","isFilterIconHit","virtualY","scrollTop","norm","selection","rTopY","rHeight","leftColRect","rightColRect","rLeftX","rWidth","fhX","fhY","dupX","dupY","cellScreenY","localY","cellScreenX","inGroupBand","curGroup","nextGroup","borderX","useGridGeometry","setColumns","userColumns","prevUserColumns","setPrevUserColumns","effectiveColumns","useMemo","activeCols","rowSelectionMode","geometryRef","useEffect","containerRef","gridSurfaceRef","scrollContainerRef","scrollPosRef","scrollIndicator","setScrollIndicator","scrollHideTimerRef","resizingCol","setResizingCol","latestResizedWidthRef","handleMouseMove","deltaX","newWidth","prev","handleMouseUp","onColumnResize","handleResize","observer","updateColumnDef","patch","setColumnWidth","getColumnWidth","handleScroll","target","topRow","onActiveOverlayClear","ensureCellVisible","geom","sc","cellTop","cellBottom","colRect","scrollTo","options","surface","rect","y","count","appleLight","appleDark","googleLight","googleDark","ThemeEngine","name","tokens","themeInput","s","el","theme","media","listener","onChange","e","HistoryManager","maxHistory","command","cmd","BLANK_FILTER_TOKEN","FilterEngine","val","parsed","code","localeCode","fmt","dateStr","includeTime","cached","targetVal","rawSet","lowerSet","isoDateSet","isoMonthSet","isoYearSet","hasBlank","t","yr","yStr","mStr","mo","pd","compiled","rd","rawVal","filter","logicalOp","currentResult","item","lower","itemResult","field","op","year","month","day","hour","minute","second","hasTime","isoDate","startOfDayMs","str","ymdMatch","dmyMatch","p1","p2","isMdy","withoutCurrencyCode","isPercentStr","raw","hasDot","hasComma","k","tr2","numVal","tr0","en2","cleanTarget","targetStr","mode","isRawBlank","elem","valStr","rawDate","targetDate","numRaw","numTarget","bothNumeric","bothDate","dmy","minRaw","maxRaw","minDate","maxDate","loD","hiD","loMs","hiMs","minNum","maxNum","minS","maxS","loS","hiS","parts","dStr","cleanKeyword","Deferred","res","result","errorMessage","createDeferred","EMAIL_REGEX","URL_REGEX","ValidationEngine","fallbackMsg","colTitle","column","rule","outcome","value","isTR","maybePromise","isAsync","resolved","num","len","a","b","useNum","left","right","ok","fallback","deferred","rawReturn","err","ColumnTypeRegistry","key","plugin","type","GroupRowPainter","ctx","isHovered","groupRow","indent","midY","displayVal","locale","opt","o","title","titleW","countText","countW","badgeX","summaryText","sCol","sTitle","sType","numStr","SkeletonPainter","barY","barW","COLUMN_COLOR_PRESET_LIST","COLUMN_COLOR_PALETTES","parseHexRgb","clean","hex","ColumnColorEngine","entry","preset","isDark","input","picked","role","rgb","group","baseColor","style","groupHeaderBg","groupHeaderText","groupHeaderBorder","accentColor","inheritGroup","groupBaseColor","colBaseColor","effectiveBase","CanvasRenderer","permissions","params","canvas","dpr","targetPixelWidth","targetPixelHeight","store","rowH","geometry","headerH","rowNumW","startScrollColIdx","endScrollColIdx","normSel","r","rowY","vRow","hoveredCell","rowData","rowKey","isRowInserted","isRowLoading","loadingRowKeys","isRowInActiveSel","colIdx","cellX","colStyle","searchKeyword","selectionMode","selectedRowKeys","curFrozenX","fc","fillDragRange","fTopY","fHeight","fLeftRect","fRightRect","fLeftX","fWidth","activeViewRowForSel","activeColDef","activeColType","cx","cy","maxEmptyRows","er","ey","cardW","cardX","cardY","sortRules","hoveredFilterColIndex","activeFilterColumnIds","cellVal","isRowSelectedByCheck","isReadonly","isDirty","isColDirty","colW","bx","by","effectiveTheme","dirtyStroke","hasGroups","groupH","colHeaderH","colY","colH","frozenXOffsets","accFrozenX","j","spanWidth","spanX","getColX","startGlobalCol","colOffsetStartIdx","endGlobalCol","isGroupActive","groupStyle","minVisibleX","maxVisibleX","h","visStart","visEnd","visW","textColor","align","textX","totalTitleW","centerX","dotX","isColumnDirty","isColSelected","hasParentGroup","isAllSelected","totalRowCount","selectedCount","isSomeSelected","isFilterable","sortIndex","rightReserved","prefix","safeTitle","sort","arrow","badge","btnX","btnY","isFilterActive","isFilterHovered","fx","fy","DynamicCellEditor","EditorComponent","overlay","Fragment","validationError","isValidating","SortEngine","valA","valB","diff","dateA","dateB","strA","strB","MATERIAL_SYMBOLS_HREF","injected","ensureMaterialSymbolsLoaded","link","MaterialIcon","variant","size","weight","NUMERIC_COLUMN_TYPES","TR_MONTH_NAMES","EN_MONTH_NAMES","compileSemanticDateTreeFilter","orClauses","checkedIsoDays","explicitRawValues","hierarchy","selectedSet","oItem","yNode","columnId","mNode","mm","lastDay","dd","dNode","rv","composite","clause","formatCellStructureValue","colType","digits","sym","sanitizeNumericTyping","stripped","rawInput","isNeg","unsigned","formatNumericDisplay","initialConditionInputDisplay","toIsoDateString","d","HeaderFilterPopover","isNumericCol","isDateCol","monthNames","tab","setTab","activeFilter","allItems","setAllItems","loading","setLoading","search","setSearch","setSelectedSet","listScrollTop","setListScrollTop","expandedYears","setExpandedYears","expandedMonths","setExpandedMonths","isRangeDriven","setIsRangeDriven","defaultOp","operator","setOperator","condVal1","setCondVal1","condVal2","setCondVal2","popoverRef","searchInputRef","condInputRef","baseFilterKey","baseFilter","mounted","processedRes","tokenMap","blankCnt","it","p","unpackedItems","tVal","tCount","yearsSet","monthsSet","dayTotal","directSet","matchedValues","handleOutside","onClose","formatItemLabel","syncConditionToSelection","nextV1","nextV2","nextOp","applyDateRangeToTree","nextStart","nextEnd","hasStart","hasEnd","nextSel","matchYears","matchMonths","dateHierarchy","blankItem","otherItems","yearMap","minIsoDate","maxIsoDate","q","lbl","mName","mNumPad","dNumPad","dmyStr","itemCount","yEntry","mEntry","dEntry","years","yData","months","mData","days","dData","flatDateTreeRows","rows","forceExpand","yExpanded","mExpanded","visibleItems","matchedRawSet","numericColumnStats","min","max","totalCount","hasNegative","avg","conditionMatchCount","v1","v2","matched","total","applyPreviewRowCount","hasBetweenInput","areAllVisibleChecked","isIndeterminate","toggleAllVisible","next","toggleSingleItem","toggleGroupValues","rawValues","toggleExpandYear","toggleExpandMonth","monthKey","areAllDateNodesExpanded","m","toggleExpandCollapseAllDates","ySet","mSet","applyQuickDatePreset","now","first","last","ly","handleApply","semanticFilter","normalizedV1","n","normalizedV2","handleClear","onApply","renderStructuredConditionInput","setVal","autoFocusRef","prefixSym","suffixSym","parsedNum","cellPreview","placeholder","popoverWidth","viewportWidth","rawLeft","anchorRect","safeLeft","onSort","onToggleGroup","isGrouped","nextQuery","totalH","slice","topPos","isChecked","isIndet","mNumStr","dayStr","mNameShort","realIdx","optMatch","ContextMenuOverlay","menuRef","isWriteMode","canAdd","canDelete","canDuplicate","canPaste","isCellEditable","handleKey","estimatedHeight","menu","safeTop","viewportHeight","renderItem","disabled","onClick","danger","iconName","label","shortcut","divider","onTogglePinColumn","onSortColumn","isGroupedByCol","onToggleGroupColumn","onToggleColumnReadonly","isActive","currentSummaryType","onChangeSummaryType","onOpenSparklineModal","onCopy","onPaste","onDuplicateCellDown","onDuplicateCellRight","onDuplicateRow","onInsertRowAbove","onInsertRowBelow","onFilterByCellValue","onClearCells","onDeleteRow","SparklineModalOverlay","chartType","setChartType","hoveredIdx","setHoveredIdx","points","modal","firstVal","lastVal","pctChange","minVal","maxVal","maxIdx","avgVal","variance","stdDev","isPositive","yMin","yRange","getX","getY","linePath","areaPath","avgY","rowTitle","rowSubtitle","bw","bh","isHov","delta","PdfPreviewModalOverlay","fileName","handleKeyDown","formatVal","getRowSummaryLabel","labelParts","BatchChangesModal","inserted","changes","updated","deletedKeys","deletedRowsData","defaultTab","activeTab","setActiveTab","copiedPayload","setCopiedPayload","visibleLimit","setVisibleLimit","colTitleMap","totalOps","formattedJsonPayload","u","active","data","onRevertDelete","onRevertUpdate","newVal","oldVal","onRevertInsert","onDiscardAll","onConfirmSave","DeleteConfirmProgressModal","rowKeys","isDeleting","setIsDeleting","processedCount","setProcessedCount","percent","onCancel","sampleRows","batchMode","onConfirm","processed","SheetGLLogo","useId","glow","SHEETGL_VERSION","ToolBar","showColSettings","setShowColSettings","settingsTab","setSettingsTab","isMobile","setIsMobile","showMobileMore","setShowMobileMore","onResize","toolbarConfig","rawDisplayMode","displayMode","allowDisplayModeSwitch","showBrand","showAddRow","showDuplicateRow","showDeleteRow","showUndoRedo","showSearch","showGroupBy","showClearFilters","showBatchActions","showPermissionsSwitch","showColumnSettings","showLocaleSwitch","showThemeSwitch","showExportCsv","isReadonlyMode","canDup","canDel","canEdit","btnStyle","modeOverride","highlight","renderBtnContent","iconSize","iconColor","renderCustomItem","itemMode","isPrimary","isDanger","isSuccess","baseStyle","leftCustomItems","rightCustomItems","onAddRow","selectedRowCount","onSelectionModeChange","onUndo","onRedo","canUndo","canRedo","onSearchChange","availableColumns","groups","activeFilterCount","onClearAllFilters","pendingChangesCount","onInspectBatchChanges","onSaveBatch","onDiscardBatch","onUpdateToolbarConfig","onPermissionsChange","isRO","isPinned","sumType","summaryTypes","onUpdateColumn","onUpdateSummaryConfig","summaryConfig","onLocaleChange","currentThemeName","onThemeChange","onExportCsv","onExpandAllGroups","onCollapseAllGroups","resolveTagColors","normalizeMultiValue","paintMultiSelect","items","pillY","maxRight","colors","textW","pillW","remainingCount","reserveForMore","moreText","moreW","drawW","isSelected","arrowX","arrowY","getExcelColName","FormulaBarSelect","isOpen","setIsOpen","selectedOpt","currentValue","displayLabel","filteredOptions","isEditable","onCommitValue","FormulaBarMultiSelect","separator","selectedList","handleToggleOption","handleRemoveTag","FormulaBarDate","isDateTime","isoVal","mon","dateDraft","setDateDraft","handleDateChange","today","finalVal","FormulaBarBoolean","FormulaBar","isSparkline","isMultiSelectCol","isSelectCol","isBoolCol","draft","setDraft","isFocused","setIsFocused","activeCoords","excelRef","hasMultiSpan","selectionSpan","commitDraft","obj","out","pair","effectiveBtnMode","buttonDisplayMode","onDuplicateDown","onDuplicateRight","SUMMARY_TYPE_ICONS","SummaryCell","setIsHovered","cellRef","popoverPos","setPopoverPos","effectiveSummaryType","summaryType","candidate","summaryTypeStr","hasSummary","isNumeric","isSpecialCol","handleToggleDropdown","allowConfiguration","top","handleOutsideClick","formattedVal","formatSummaryVal","SummaryFooter","showAddSummary","setShowAddSummary","summaryScrollRef","showSelectionStats","showColumnSummaries","activeMetrics","hasMetric","itemOverride","base","formattedNum","rowNumberWidth","frozenColumns","scrollableColumns","rightPinnedColumns","totalScrollableWidth","summary","isSyncing","onGridScroll","onSummaryWheel","hasSelectionStats","selectionStats","summaries","rawCur","GroupingEngine","entries","keys","visit","level","maxAutoExpandLevel","buckets","bucketItems","groupKey","parentKey","expandedKeys","bucket","isExpanded","sf","bi","LocalDataStore","sample","keyword","groupDescriptors","allKeys","snap","orig","set","newValue","updates","rowMap","changed","maxId","newKey","newRow","insertIdx","targetViewRowIndex","rawIdx","sourceIdx","source","cloned","removed","origData","keySet","totalToProcess","totalRaw","keptRows","removedCount","chunkSize","rk","onProgress","targetIdx","rawIndex","enabled","cols","values","oldValues","cleanRow","ins","delKeys","hasBaseFilter","filterKey","cleanGlobalSearch","cacheKey","baseItems","sourceRows","counts","blankCount","formatted","nonNullCount","event","callback","args","cb","filtered","cmp","paintText","maxW","TextEditor","text","setText","initialChar","inputRef","committedRef","safeCommit","onCommit","dir","TextColumnPlugin","openEditor","formatters$1","getFormatter$1","minDigits","maxDigits","useGrouping","paintNumber","NumberEditor","commitParsed","moveDir","NumberColumnPlugin","formatters","getFormatter","paintCurrency","symbol","CurrencyColumnPlugin","paintPercent","showSign","PercentColumnPlugin","paintBoolean","boxX","boxY","BooleanColumnPlugin","setValue","resolveBadgeColors","bg","fg","paintSelect","badgeInfo","textStartX","maxTextW","SelectEditor","highlightedIndex","setHighlightedIndex","SelectColumnPlugin","localX","match","paintDropdown","DropdownColumnPlugin","MultiSelectColumnPlugin","selected","setSelected","latestSelectedRef","commitValue","sep","cleanItems","toggleValue","getInitials","paintLookup","centerY","avatarCX","avatarBg","avatarFg","labelW","LookupColumnPlugin","normalizeObjectValue","trimmed","pairs","rawV","formatObjectSummary","displayKey","primary","rest","paintObject","badgeText","badgeW","badgeY","parseScalarValue","ObjectColumnPlugin","initialObj","setMode","setPairs","jsonText","setJsonText","jsonError","setJsonError","buildObjectFromPairs","list","handleSave","switchMode","nextMode","paintDate","iconX","iconY","parseIsoParts","isoMatch","DateColumnPlugin","initial","dateVal","setDateVal","viewYear","setViewYear","viewMonth","setViewMonth","latestValRef","normalizeCommitValue","rawStr","handleOutsideMouseDown","handlePrevMonth","handleNextMonth","selectDay","nextIso","selectToday","daysInMonth","firstDayOfWeek","cells","weekDays","selectedParts","wd","isSelectedDay","formatDateTimeDisplay","hh","paintDateTime","datePart","timePart","dateW","pillX","timeW","parseDateTimeParts","DateTimeColumnPlugin","textVal","setTextVal","selDay","setSelDay","selHour","setSelHour","selMinute","setSelMinute","buildFormatted","normalizeDateTimeCommit","updateParts","isoDt","handleSelectNow","hours","paintTime","parseTimeParts","TimeColumnPlugin","timeVal","setTimeVal","updateTime","nextStr","commitImmediate","paintEmail","email","EmailColumnPlugin","paintUrl","display","UrlColumnPlugin","href","paintPhone","phone","PhoneColumnPlugin","PRESET_COLORS","ColorEditor","setHex","paintColor","color","swatchX","swatchY","ColorColumnPlugin","paintRating","rating","startX","drawStar","rot","step","spikes","outerRadius","innerRadius","RatingColumnPlugin","starIndex","paintProgress","pct","barTotalW","fillW","ProgressColumnPlugin","paintSparkline","rightReserve","range","strokeColor","px","py","lastX","lastY","SparklineColumnPlugin","paintAction","btnW","ActionColumnPlugin","paintPdf","btn1X","btn2X","bg1","border1","bg2","border2","resolvePdfUrl","PdfColumnPlugin","resolvedUrl","initialized","initDefaultColumnPlugins","enUS","trTR","LocaleEngine","compileColumnFilters","states","map","singleFilters","st","excludeColumnId","f","SheetGL","forwardRef","userTheme","userLocale","userPermissions","userToolbar","userSummaryRow","userSelectionMode","userSelectedRowKeys","dataSource","initialSummaries","batchEditMode","setCurrentThemeName","resolvedTheme","setResolvedTheme","currentLocale","setCurrentLocale","setPermissions","handleUpdatePermissions","setToolbarConfig","handleUpdateToolbarConfig","onToolbarConfigChange","setSummaryConfig","handleUpdateSummaryConfig","onSummaryConfigChange","setRowSelectionMode","selectedRowKeysSet","setSelectedRowKeysSet","handleUpdateColumnDef","handleSetColumnWidth","handleGetColumnWidth","requestRenderRef","setActiveOverlay","historyRef","setSortRules","initialSort","setGroups","initialGroups","columnFilters","setColumnFilters","setSearchKeyword","activeOverlay","editorValidationError","setEditorValidationError","isEditorValidating","setIsEditorValidating","headerFilterState","setHeaderFilterState","activeBaseFilter","contextMenu","setContextMenu","sparklineModal","setSparklineModal","pdfModal","setPdfModal","showBatchModal","setShowBatchModal","deleteConfirmModal","setDeleteConfirmModal","toastMessage","setToastMessage","hoveredCellRef","hoveredFilterColRef","cursorStyle","setCursorStyle","fillDragState","setFillDragState","loadingRowKeysRef","internalClipboardRef","canvasRef","showToast","storeVersion","setStoreVersion","handleLoaded","hookMoveSelection","requestRender","surfaceW","useImperativeHandle","ref","selectAll","getTotalHeight","selectRange","clearSelection","getActiveCell","getSelectedRange","getTotalWidth","handleOpenPdfEvent","custom","onPdfPreviewClick","canEditCell","cType","silent","onEditingStart","evt","commitSingleCellEdit","oldValue","hasAsyncRule","valRes","msg","finalValue","onCellValueChanging","changingEvt","onRowUpdating","rowUpdEvt","prevRowSnapshot","onCellChange","cascadingPatch","draftNewData","resolvedPatch","onCellValueChanged","asyncPatch","recordHistory","fullNewPatch","fullOldPatch","onRowUpdated","applyBatchCellUpdates","allowedUpdates","single","validatedUpdates","firstErrorMsg","rejectedCount","forwardBatch","backwardBatch","combined","handleInsertRow","defaultRow","onRowInserting","created","targetRowIndex","onRowInserted","handleDuplicateRow","sourceKey","duplicated","handleDeleteRow","keysToDelete","totalView","vr","snapshot","executeConfirmedDelete","singleRowIndex","onRowRemoving","onRowRemoved","commitBatchSave","onSaving","committed","onSaved","handleSaveBatch","fastCount","handleDiscardBatch","handleDuplicateCellDown","targetRow","nextR","srcRow","dstRow","handleDuplicateCellRight","srcColDef","srcVal","dstColDef","coercedVal","nextC","handleHeaderSort","nextRules","existingIndex","explicitDesc","isShift","handleToggleGroupColumn","targetCol","exists","prevGroups","nextGroups","handleApplyColumnFilter","filterState","maxR","activeCol","matchedCount","onFilterChange","handleClearAllFilters","handleChangeSummaryType","handleWindowMouseMove","clampedY","hit","selRange","startColType","srcColType","src","handleWindowMouseUp","isSameRange","sourceRange","targetRange","srcHeight","srcWidth","srcR","srcC","srcViewRow","offset","moveSelection","openEditorForCell","screenRect","handleSurfaceMouseMove","getViewportCoords","onScrollbar","sl","headerHit","nextFilterCol","hoveredRowIdx","hVRow","normForHover","activeColForHover","hoverColType","fhHit","handleSurfaceMouseDown","resizeHit","nextKeys","nextData","clickedRowIdx","clickedVRow","normForDup","activeColForDup","dupColType","rowNumHit","isInteractiveCol","rKey","rowsData","shouldFocusContainer","handleSurfaceDoubleClick","handleSurfaceContextMenu","gRow","groupCol","touchStateRef","handleSurfaceTouchStart","touch","handleSurfaceTouchMove","dx","dy","handleSurfaceTouchEnd","handleClearSelectedCells","emptyVal","buildSelectedTsv","rowsText","cellsText","applyPastedTsv","lines","isSingleClipboardValue","hasMultiSelection","rawCellText","parsedVal","rOffset","line","cOffset","cellText","handleCopy","tsv","handlePaste","onAddNewRow","char","exportCsv","cellVals","blob","url","rowSpan","colSpan","numericCount","currentColumn","activeViewRow","currentCellValue","isActiveCellEditable","pendingChanges","normRange","className","nextTheme","showFormulaBar","scrollToTop","scrollToBottom","hasAsync","isInserted","effectiveDir","enterNavigation","prevCol","desc","txt","nextRO","BlockCache","blockSize","maxBlocks","blockIndex","block","oldestKey","RemoteDataStore","resolvedBlockSize","startBlock","endBlock","missingBlocks","baseUrl","query","payload","skip","take","signal","json","reqUrl","totalBlocks","qs","yearsPayload","mPad","dPad","iso","effectiveFilter","cleanSearch","globalSearchKey","distinctUrl","normalizedItems"],"sources":["../../src/datagrid/core/SelectionModel.ts","../../src/datagrid/hooks/useGridSelection.ts","../../src/datagrid/core/GeometryEngine.ts","../../src/datagrid/hooks/useGridGeometry.ts","../../src/datagrid/theme/presets/appleLight.ts","../../src/datagrid/theme/presets/appleDark.ts","../../src/datagrid/theme/presets/googleLight.ts","../../src/datagrid/theme/presets/googleDark.ts","../../src/datagrid/theme/ThemeEngine.ts","../../src/datagrid/core/HistoryManager.ts","../../src/datagrid/core/FilterEngine.ts","../../src/datagrid/core/ValidationEngine.ts","../../src/datagrid/columns/ColumnTypeRegistry.ts","../../src/datagrid/renderer/GroupRowPainter.ts","../../src/datagrid/renderer/SkeletonPainter.ts","../../src/datagrid/theme/ColumnColorEngine.ts","../../src/datagrid/renderer/CanvasRenderer.ts","../../src/datagrid/overlays/DynamicCellEditor.tsx","../../src/datagrid/core/SortEngine.ts","../../src/datagrid/ui/MaterialIcon.tsx","../../src/datagrid/overlays/HeaderFilterPopover.tsx","../../src/datagrid/overlays/ContextMenuOverlay.tsx","../../src/datagrid/overlays/SparklineModalOverlay.tsx","../../src/datagrid/overlays/PdfPreviewModalOverlay.tsx","../../src/datagrid/overlays/BatchChangesModal.tsx","../../src/datagrid/overlays/DeleteConfirmProgressModal.tsx","../../src/datagrid/ui/SheetGLLogo.tsx","../../src/datagrid/version.ts","../../src/datagrid/ui/ToolBar.tsx","../../src/datagrid/columns/types/MultiSelectColumn/MultiSelectPainter.ts","../../src/datagrid/ui/FormulaBar.tsx","../../src/datagrid/ui/SummaryFooter.tsx","../../src/datagrid/core/GroupingEngine.ts","../../src/datagrid/data/LocalDataStore.ts","../../src/datagrid/columns/types/TextColumn/TextPainter.ts","../../src/datagrid/columns/types/TextColumn/TextEditor.tsx","../../src/datagrid/columns/types/TextColumn/index.ts","../../src/datagrid/columns/types/NumberColumn/NumberPainter.ts","../../src/datagrid/columns/types/NumberColumn/NumberEditor.tsx","../../src/datagrid/columns/types/NumberColumn/index.ts","../../src/datagrid/columns/types/CurrencyColumn/CurrencyPainter.ts","../../src/datagrid/columns/types/CurrencyColumn/index.ts","../../src/datagrid/columns/types/PercentColumn/index.ts","../../src/datagrid/columns/types/BooleanColumn/BooleanPainter.ts","../../src/datagrid/columns/types/BooleanColumn/index.ts","../../src/datagrid/columns/types/SelectColumn/SelectPainter.ts","../../src/datagrid/columns/types/SelectColumn/SelectEditor.tsx","../../src/datagrid/columns/types/SelectColumn/index.ts","../../src/datagrid/columns/types/DropdownColumn/DropdownPainter.ts","../../src/datagrid/columns/types/DropdownColumn/index.ts","../../src/datagrid/columns/types/MultiSelectColumn/MultiSelectEditor.tsx","../../src/datagrid/columns/types/MultiSelectColumn/index.ts","../../src/datagrid/columns/types/LookupColumn/LookupPainter.ts","../../src/datagrid/columns/types/LookupColumn/LookupEditor.tsx","../../src/datagrid/columns/types/LookupColumn/index.ts","../../src/datagrid/columns/types/ObjectColumn/ObjectPainter.ts","../../src/datagrid/columns/types/ObjectColumn/ObjectEditor.tsx","../../src/datagrid/columns/types/ObjectColumn/index.ts","../../src/datagrid/columns/types/DateColumn/DatePainter.ts","../../src/datagrid/columns/types/DateColumn/DateEditor.tsx","../../src/datagrid/columns/types/DateColumn/index.ts","../../src/datagrid/columns/types/DateTimeColumn/DateTimePainter.ts","../../src/datagrid/columns/types/DateTimeColumn/DateTimeEditor.tsx","../../src/datagrid/columns/types/DateTimeColumn/index.ts","../../src/datagrid/columns/types/TimeColumn/TimePainter.ts","../../src/datagrid/columns/types/TimeColumn/TimeEditor.tsx","../../src/datagrid/columns/types/TimeColumn/index.ts","../../src/datagrid/columns/types/EmailColumn/index.ts","../../src/datagrid/columns/types/UrlColumn/index.ts","../../src/datagrid/columns/types/PhoneColumn/index.ts","../../src/datagrid/columns/types/ColorColumn/ColorEditor.tsx","../../src/datagrid/columns/types/ColorColumn/index.ts","../../src/datagrid/columns/types/RatingColumn/RatingPainter.ts","../../src/datagrid/columns/types/RatingColumn/index.ts","../../src/datagrid/columns/types/ProgressColumn/ProgressPainter.ts","../../src/datagrid/columns/types/ProgressColumn/index.ts","../../src/datagrid/columns/types/SparklineColumn/SparklinePainter.ts","../../src/datagrid/columns/types/SparklineColumn/index.ts","../../src/datagrid/columns/types/ActionColumn/ActionPainter.ts","../../src/datagrid/columns/types/ActionColumn/index.ts","../../src/datagrid/columns/types/PdfColumn/PdfPainter.ts","../../src/datagrid/columns/types/PdfColumn/index.ts","../../src/datagrid/columns/initPlugins.ts","../../src/datagrid/i18n/locales/enUS.ts","../../src/datagrid/i18n/locales/trTR.ts","../../src/datagrid/i18n/LocaleEngine.ts","../../src/datagrid/ui/SheetGL.tsx","../../src/datagrid/data/BlockCache.ts","../../src/datagrid/data/RemoteDataStore.ts"],"sourcesContent":["import { CellCoords, CellRange } from '../types/grid';\n\nexport class SelectionModel {\n public activeCell: CellCoords = { row: 0, col: 0 };\n public selectionRange: CellRange | null = null;\n public isSelecting: boolean = false;\n\n public setActiveCell(row: number, col: number): void {\n this.activeCell = { row, col };\n this.selectionRange = { startRow: row, startCol: col, endRow: row, endCol: col };\n }\n\n public setRangeEnd(row: number, col: number): void {\n if (!this.selectionRange) {\n this.selectionRange = { startRow: this.activeCell.row, startCol: this.activeCell.col, endRow: row, endCol: col };\n } else {\n this.selectionRange = {\n ...this.selectionRange,\n endRow: row,\n endCol: col,\n };\n }\n }\n\n public getNormalizedRange(): { minRow: number; maxRow: number; minCol: number; maxCol: number } {\n if (!this.selectionRange) {\n return {\n minRow: this.activeCell.row,\n maxRow: this.activeCell.row,\n minCol: this.activeCell.col,\n maxCol: this.activeCell.col,\n };\n }\n\n return {\n minRow: Math.min(this.selectionRange.startRow, this.selectionRange.endRow),\n maxRow: Math.max(this.selectionRange.startRow, this.selectionRange.endRow),\n minCol: Math.min(this.selectionRange.startCol, this.selectionRange.endCol),\n maxCol: Math.max(this.selectionRange.startCol, this.selectionRange.endCol),\n };\n }\n\n public isCellSelected(row: number, col: number): boolean {\n const { minRow, maxRow, minCol, maxCol } = this.getNormalizedRange();\n return row >= minRow && row <= maxRow && col >= minCol && col <= maxCol;\n }\n\n public hasMultiCellSelection(): boolean {\n const { minRow, maxRow, minCol, maxCol } = this.getNormalizedRange();\n return minRow !== maxRow || minCol !== maxCol;\n }\n}\n","import { useRef, useState, useCallback } from 'react';\r\nimport { SelectionModel } from '../core/SelectionModel';\r\nimport { CellCoords, CellRange } from '../types/grid';\r\nimport { NormalizedCellRange } from '../core/GridApi';\r\n\r\nexport interface UseGridSelectionOptions {\r\n onRequestRender?: () => void;\r\n onEnsureCellVisible?: (row: number, col: number) => void;\r\n onSelectionChanged?: (range: NormalizedCellRange, activeCell: CellCoords) => void;\r\n}\r\n\r\nexport interface UseGridSelectionReturn {\r\n /**\r\n * Mutable reference to the underlying SelectionModel for direct canvas pass-through.\r\n */\r\n selectionRef: React.MutableRefObject<SelectionModel>;\r\n /**\r\n * Version counter incremented on every selection change to trigger React re-renders.\r\n */\r\n selectionVersion: number;\r\n setSelectionVersion: React.Dispatch<React.SetStateAction<number>>;\r\n selectedCellUI: CellCoords;\r\n setSelectedCellUI: React.Dispatch<React.SetStateAction<CellCoords>>;\r\n /**\r\n * Whether the user is actively dragging across data cells.\r\n */\r\n isDraggingSelection: boolean;\r\n setIsDraggingSelection: React.Dispatch<React.SetStateAction<boolean>>;\r\n /**\r\n * Whether the user is actively dragging down the row number gutter.\r\n */\r\n isDraggingRowNumbers: boolean;\r\n setIsDraggingRowNumbers: React.Dispatch<React.SetStateAction<boolean>>;\r\n\r\n // Selection actions\r\n selectCell: (row: number, col: number) => void;\r\n selectRange: (startRow: number, startCol: number, endRow: number, endCol: number) => void;\r\n setRangeEnd: (row: number, col: number) => void;\r\n selectAll: (rowCount: number, colCount: number) => void;\r\n selectFullRow: (rowIndex: number, colCount: number, isRangeSelect?: boolean) => void;\r\n moveSelection: (\r\n dRow: number,\r\n dCol: number,\r\n isRangeSelect?: boolean,\r\n rowCount?: number,\r\n colCount?: number\r\n ) => void;\r\n clearSelection: () => void;\r\n stopDragging: () => void;\r\n\r\n // Query getters\r\n getActiveCell: () => CellCoords;\r\n getSelectedRange: () => NormalizedCellRange;\r\n}\r\n\r\nexport function useGridSelection({\r\n onRequestRender,\r\n onEnsureCellVisible,\r\n onSelectionChanged,\r\n}: UseGridSelectionOptions = {}): UseGridSelectionReturn {\r\n const selectionRef = useRef<SelectionModel>(new SelectionModel());\r\n const [selectionVersion, setSelectionVersion] = useState<number>(0);\r\n const [selectedCellUI, setSelectedCellUI] = useState<CellCoords>({ row: 0, col: 0 });\r\n const [isDraggingSelection, setIsDraggingSelection] = useState<boolean>(false);\r\n const [isDraggingRowNumbers, setIsDraggingRowNumbers] = useState<boolean>(false);\r\n\r\n const notifyChange = useCallback(() => {\r\n setSelectionVersion((v) => v + 1);\r\n onRequestRender?.();\r\n\r\n if (onSelectionChanged) {\r\n const model = selectionRef.current;\r\n onSelectionChanged(model.getNormalizedRange(), model.activeCell);\r\n }\r\n }, [onRequestRender, onSelectionChanged]);\r\n\r\n const selectCell = useCallback(\r\n (row: number, col: number) => {\r\n selectionRef.current.setActiveCell(row, col);\r\n setSelectedCellUI({ row, col });\r\n notifyChange();\r\n },\r\n [notifyChange]\r\n );\r\n\r\n const selectRange = useCallback(\r\n (startRow: number, startCol: number, endRow: number, endCol: number) => {\r\n const model = selectionRef.current;\r\n model.setActiveCell(startRow, startCol);\r\n model.setRangeEnd(endRow, endCol);\r\n setSelectedCellUI({ row: startRow, col: startCol });\r\n notifyChange();\r\n },\r\n [notifyChange]\r\n );\r\n\r\n const setRangeEnd = useCallback(\r\n (row: number, col: number) => {\r\n selectionRef.current.setRangeEnd(row, col);\r\n notifyChange();\r\n },\r\n [notifyChange]\r\n );\r\n\r\n const selectAll = useCallback(\r\n (rowCount: number, colCount: number) => {\r\n if (rowCount <= 0 || colCount <= 0) return;\r\n selectionRef.current.setActiveCell(0, 0);\r\n selectionRef.current.setRangeEnd(rowCount - 1, colCount - 1);\r\n setSelectedCellUI({ row: 0, col: 0 });\r\n notifyChange();\r\n },\r\n [notifyChange]\r\n );\r\n\r\n const selectFullRow = useCallback(\r\n (rowIndex: number, colCount: number, isRangeSelect: boolean = false) => {\r\n if (colCount <= 0) return;\r\n if (isRangeSelect) {\r\n selectionRef.current.setRangeEnd(rowIndex, colCount - 1);\r\n } else {\r\n selectionRef.current.setActiveCell(rowIndex, 0);\r\n selectionRef.current.setRangeEnd(rowIndex, colCount - 1);\r\n setSelectedCellUI({ row: rowIndex, col: 0 });\r\n }\r\n setIsDraggingRowNumbers(true);\r\n notifyChange();\r\n },\r\n [notifyChange]\r\n );\r\n\r\n const moveSelection = useCallback(\r\n (\r\n dRow: number,\r\n dCol: number,\r\n isRangeSelect: boolean = false,\r\n rowCount: number = 0,\r\n colCount: number = 0\r\n ) => {\r\n if (rowCount === 0 || colCount === 0) return;\r\n\r\n const model = selectionRef.current;\r\n const cur = isRangeSelect && model.selectionRange\r\n ? {\r\n row: model.selectionRange.endRow,\r\n col: model.selectionRange.endCol,\r\n }\r\n : model.activeCell;\r\n\r\n const nextRow = Math.max(0, Math.min(rowCount - 1, cur.row + dRow));\r\n const nextCol = Math.max(0, Math.min(colCount - 1, cur.col + dCol));\r\n\r\n if (isRangeSelect) {\r\n model.setRangeEnd(nextRow, nextCol);\r\n } else {\r\n model.setActiveCell(nextRow, nextCol);\r\n setSelectedCellUI({ row: nextRow, col: nextCol });\r\n }\r\n\r\n setSelectionVersion((v) => v + 1);\r\n onEnsureCellVisible?.(nextRow, nextCol);\r\n onRequestRender?.();\r\n },\r\n [onEnsureCellVisible, onRequestRender]\r\n );\r\n\r\n const clearSelection = useCallback(() => {\r\n selectCell(0, 0);\r\n }, [selectCell]);\r\n\r\n const stopDragging = useCallback(() => {\r\n setIsDraggingSelection(false);\r\n setIsDraggingRowNumbers(false);\r\n }, []);\r\n\r\n const getActiveCell = useCallback((): CellCoords => {\r\n return selectionRef.current.activeCell;\r\n }, []);\r\n\r\n const getSelectedRange = useCallback((): NormalizedCellRange => {\r\n return selectionRef.current.getNormalizedRange();\r\n }, []);\r\n\r\n return {\r\n selectionRef,\r\n selectionVersion,\r\n setSelectionVersion,\r\n selectedCellUI,\r\n setSelectedCellUI,\r\n isDraggingSelection,\r\n setIsDraggingSelection,\r\n isDraggingRowNumbers,\r\n setIsDraggingRowNumbers,\r\n selectCell,\r\n selectRange,\r\n setRangeEnd,\r\n selectAll,\r\n selectFullRow,\r\n moveSelection,\r\n clearSelection,\r\n stopDragging,\r\n getActiveCell,\r\n getSelectedRange,\r\n };\r\n}\r\n","import { ColumnDef, ColumnGroupDef } from '../types/grid';\nimport { SelectionModel } from './SelectionModel';\n\nexport interface HitTestResult {\n row: number;\n col: number;\n localX: number;\n localY: number;\n isFrozen: boolean;\n cellRect: { x: number; y: number; width: number; height: number };\n}\n\nexport interface HeaderHitTestResult {\n colIndex: number;\n column: ColumnDef;\n headerX: number;\n headerWidth: number;\n isFilterIconHit: boolean;\n isGroupHeaderHit?: boolean;\n groupDef?: ColumnGroupDef;\n groupColIndices?: number[];\n}\n\nexport class GeometryEngine {\n public rowHeight: number = 34;\n public baseHeaderHeight: number = 38;\n public groupHeaderHeight: number = 30;\n public headerHeight: number = 38;\n public hasColumnGroups: boolean = false;\n public columnGroups: ColumnGroupDef[] = [];\n private colToGroupMap: Map<string, ColumnGroupDef> = new Map();\n public rowNumberWidth: number = 54;\n public viewportWidth: number = typeof window !== 'undefined' ? window.innerWidth : 1200;\n\n public columns: ColumnDef[] = [];\n public frozenColumns: ColumnDef[] = [];\n public scrollableColumns: ColumnDef[] = [];\n public totalFrozenWidth: number = 0;\n public totalScrollableWidth: number = 0;\n public scrollableColOffsets: Float32Array = new Float32Array(0);\n\n constructor(\n columns: ColumnDef[] = [],\n rowHeight: number = 34,\n headerHeight: number = 38,\n columnGroups: ColumnGroupDef[] = [],\n groupHeaderHeight: number = 30\n ) {\n this.rowHeight = rowHeight;\n this.baseHeaderHeight = headerHeight;\n this.groupHeaderHeight = groupHeaderHeight;\n this.headerHeight = headerHeight;\n this.columnGroups = columnGroups;\n this.setColumns(columns);\n }\n\n public setColumnGroups(columnGroups: ColumnGroupDef[] = [], groupHeaderHeight?: number): void {\n this.columnGroups = columnGroups;\n if (groupHeaderHeight !== undefined && groupHeaderHeight > 0) {\n this.groupHeaderHeight = groupHeaderHeight;\n }\n this.recalculateGeometry();\n }\n\n public setBaseHeaderHeight(height: number): void {\n if (height > 0 && this.baseHeaderHeight !== height) {\n this.baseHeaderHeight = height;\n this.recalculateGeometry();\n }\n }\n\n public getColumnGroup(col: ColumnDef): ColumnGroupDef | undefined {\n return this.colToGroupMap.get(col.id);\n }\n\n private rebuildColumnGroupMap(): void {\n this.colToGroupMap.clear();\n const groupsById = new Map<string, ColumnGroupDef>();\n const groupsByTitle = new Map<string, ColumnGroupDef>();\n\n for (const g of this.columnGroups) {\n if (!g) continue;\n groupsById.set(g.id, g);\n groupsByTitle.set(g.title, g);\n if (Array.isArray(g.columnIds)) {\n for (const colId of g.columnIds) {\n this.colToGroupMap.set(colId, g);\n }\n }\n }\n\n for (const col of this.columns) {\n if (col.id === '__selection__') continue;\n if (col.headerGroup) {\n if (typeof col.headerGroup === 'string') {\n const existing =\n groupsById.get(col.headerGroup) || groupsByTitle.get(col.headerGroup);\n if (existing) {\n this.colToGroupMap.set(col.id, existing);\n } else {\n const inlineGroup: ColumnGroupDef = {\n id: col.headerGroup,\n title: col.headerGroup,\n };\n groupsById.set(inlineGroup.id, inlineGroup);\n groupsByTitle.set(inlineGroup.title, inlineGroup);\n this.colToGroupMap.set(col.id, inlineGroup);\n }\n } else if (typeof col.headerGroup === 'object') {\n groupsById.set(col.headerGroup.id, col.headerGroup);\n this.colToGroupMap.set(col.id, col.headerGroup);\n }\n } else if (col.groupId) {\n const existing = groupsById.get(col.groupId) || groupsByTitle.get(col.groupId);\n if (existing) {\n this.colToGroupMap.set(col.id, existing);\n } else {\n const inlineGroup: ColumnGroupDef = {\n id: col.groupId,\n title: col.groupId,\n };\n groupsById.set(inlineGroup.id, inlineGroup);\n this.colToGroupMap.set(col.id, inlineGroup);\n }\n }\n }\n\n this.hasColumnGroups = this.colToGroupMap.size > 0;\n this.headerHeight = this.hasColumnGroups\n ? this.baseHeaderHeight + this.groupHeaderHeight\n : this.baseHeaderHeight;\n }\n\n public setViewportWidth(width: number): boolean {\n if (width > 0 && Math.abs(this.viewportWidth - width) >= 2) {\n this.viewportWidth = width;\n this.recalculateGeometry();\n return true;\n }\n return false;\n }\n\n public setColumns(columns: ColumnDef[]): void {\n const visibleCols = columns.filter((c) => c.visible !== false);\n this.columns = [\n ...visibleCols.filter((c) => Boolean(c.pinned)),\n ...visibleCols.filter((c) => !c.pinned),\n ];\n this.recalculateGeometry();\n }\n\n public recalculateGeometry(): void {\n const isMobileViewport = this.viewportWidth > 0 && this.viewportWidth < 680;\n this.rowNumberWidth = isMobileViewport ? 38 : 54;\n\n if (isMobileViewport) {\n // On narrow mobile screens, prevent pinned columns from consuming the entire viewport width\n const maxFrozenBudget = Math.max(88, Math.floor(this.viewportWidth * 0.34));\n const nextFrozen: ColumnDef[] = [];\n const nextScrollable: ColumnDef[] = [];\n let currentFrozenW = this.rowNumberWidth;\n\n for (const col of this.columns) {\n if (\n col.pinned &&\n (col.id === '__selection__' || currentFrozenW + col.width <= maxFrozenBudget)\n ) {\n nextFrozen.push(col);\n currentFrozenW += col.width;\n } else {\n nextScrollable.push(col);\n }\n }\n this.frozenColumns = nextFrozen;\n this.scrollableColumns = nextScrollable;\n this.columns = [...nextFrozen, ...nextScrollable];\n } else {\n this.frozenColumns = this.columns.filter((c) => Boolean(c.pinned));\n this.scrollableColumns = this.columns.filter((c) => !c.pinned);\n }\n\n this.totalFrozenWidth =\n this.rowNumberWidth + this.frozenColumns.reduce((sum, c) => sum + c.width, 0);\n\n this.scrollableColOffsets = new Float32Array(this.scrollableColumns.length + 1);\n let acc = 0;\n for (let i = 0; i < this.scrollableColumns.length; i++) {\n this.scrollableColOffsets[i] = acc;\n acc += this.scrollableColumns[i].width;\n }\n this.scrollableColOffsets[this.scrollableColumns.length] = acc;\n this.totalScrollableWidth = acc;\n this.rebuildColumnGroupMap();\n }\n\n public findScrollableColIndexAtX(scrollX: number): number {\n let low = 0;\n let high = this.scrollableColumns.length - 1;\n while (low <= high) {\n const mid = (low + high) >>> 1;\n const start = this.scrollableColOffsets[mid];\n const end = this.scrollableColOffsets[mid + 1];\n if (scrollX >= start && scrollX < end) {\n return mid;\n } else if (scrollX < start) {\n high = mid - 1;\n } else {\n low = mid + 1;\n }\n }\n return Math.min(Math.max(0, low), Math.max(0, this.scrollableColumns.length - 1));\n }\n\n public getColumnScreenRect(\n colIndex: number,\n scrollLeft: number\n ): { x: number; width: number; isFrozen: boolean } {\n const frozenCount = this.frozenColumns.length;\n if (colIndex < frozenCount) {\n let x = this.rowNumberWidth;\n for (let i = 0; i < colIndex; i++) {\n x += this.frozenColumns[i].width;\n }\n return {\n x,\n width: this.frozenColumns[colIndex]?.width || 0,\n isFrozen: true,\n };\n } else {\n const scrollIdx = colIndex - frozenCount;\n if (scrollIdx < 0 || scrollIdx >= this.scrollableColumns.length) {\n return { x: 0, width: 0, isFrozen: false };\n }\n const x = this.totalFrozenWidth + this.scrollableColOffsets[scrollIdx] - scrollLeft;\n return {\n x,\n width: this.scrollableColumns[scrollIdx].width,\n isFrozen: false,\n };\n }\n }\n\n public hitTestHeader(canvasX: number, canvasY: number, scrollLeft: number): HeaderHitTestResult | null {\n if (canvasY < 0 || canvasY > this.headerHeight || canvasX <= this.rowNumberWidth) {\n return null;\n }\n\n let clickedCol = -1;\n let headerX = 0;\n let headerW = 0;\n\n // 1. Frozen Columns\n let curX = this.rowNumberWidth;\n for (let i = 0; i < this.frozenColumns.length; i++) {\n const w = this.frozenColumns[i].width;\n if (canvasX >= curX && canvasX < curX + w) {\n clickedCol = i;\n headerX = curX;\n headerW = w;\n break;\n }\n curX += w;\n }\n\n // 2. Scrollable Columns\n if (clickedCol === -1 && canvasX >= this.totalFrozenWidth) {\n const sx = canvasX - this.totalFrozenWidth + scrollLeft;\n if (sx >= 0 && sx < this.totalScrollableWidth && this.scrollableColumns.length > 0) {\n const sIdx = this.findScrollableColIndexAtX(sx);\n clickedCol = this.frozenColumns.length + sIdx;\n headerX = this.totalFrozenWidth + this.scrollableColOffsets[sIdx] - scrollLeft;\n headerW = this.scrollableColumns[sIdx]?.width || 100;\n }\n }\n\n if (clickedCol === -1 || !this.columns[clickedCol]) {\n return null;\n }\n\n const colDef = this.columns[clickedCol];\n const groupDef = this.getColumnGroup(colDef);\n const isGroupHeaderHit = Boolean(this.hasColumnGroups && groupDef && canvasY < this.groupHeaderHeight);\n\n let groupColIndices: number[] | undefined;\n if (groupDef) {\n const isFrozenPartition = clickedCol < this.frozenColumns.length;\n const minBound = isFrozenPartition ? 0 : this.frozenColumns.length;\n const maxBound = isFrozenPartition ? this.frozenColumns.length - 1 : this.columns.length - 1;\n let startIdx = clickedCol;\n let endIdx = clickedCol;\n while (\n startIdx > minBound &&\n this.getColumnGroup(this.columns[startIdx - 1])?.id === groupDef.id\n ) {\n startIdx--;\n }\n while (\n endIdx < maxBound &&\n this.getColumnGroup(this.columns[endIdx + 1])?.id === groupDef.id\n ) {\n endIdx++;\n }\n groupColIndices = [];\n for (let idx = startIdx; idx <= endIdx; idx++) {\n groupColIndices.push(idx);\n }\n }\n\n const isFilterable =\n !isGroupHeaderHit &&\n colDef.filterable !== false &&\n colDef.type !== 'sparkline' &&\n colDef.type !== 'action';\n const isFilterIconHit =\n isFilterable && canvasX >= headerX + headerW - 28 && canvasX <= headerX + headerW - 2;\n\n return {\n colIndex: clickedCol,\n column: colDef,\n headerX,\n headerWidth: headerW,\n isFilterIconHit,\n isGroupHeaderHit,\n groupDef,\n groupColIndices,\n };\n }\n\n public hitTestRowNumber(\n canvasX: number,\n canvasY: number,\n scrollTop: number,\n rowCount: number\n ): number | null {\n if (canvasX < 0 || canvasX > this.rowNumberWidth || canvasY <= this.headerHeight) {\n return null;\n }\n const virtualY = canvasY - this.headerHeight + scrollTop;\n const row = Math.floor(virtualY / this.rowHeight);\n if (row < 0 || row >= rowCount) return null;\n return row;\n }\n\n public hitTestFillHandle(\n canvasX: number,\n canvasY: number,\n scrollLeft: number,\n scrollTop: number,\n selection: SelectionModel\n ): 'corner' | 'right-duplicate' | null {\n if (canvasY <= this.headerHeight || canvasX <= this.rowNumberWidth) return null;\n\n const norm = selection.getNormalizedRange();\n const rTopY = this.headerHeight + norm.minRow * this.rowHeight - scrollTop;\n const rHeight = (norm.maxRow - norm.minRow + 1) * this.rowHeight;\n const leftColRect = this.getColumnScreenRect(norm.minCol, scrollLeft);\n const rightColRect = this.getColumnScreenRect(norm.maxCol, scrollLeft);\n\n if (!leftColRect || !rightColRect) return null;\n\n const rLeftX = leftColRect.x;\n const rWidth = rightColRect.x + rightColRect.width - leftColRect.x;\n\n // 1. Bottom-right corner fill handle (12x12 hit box)\n const fhX = rLeftX + rWidth;\n const fhY = rTopY + rHeight;\n if (Math.abs(canvasX - fhX) <= 7 && Math.abs(canvasY - fhY) <= 7) {\n return 'corner';\n }\n\n // 2. Right-side quick duplicate button handle (centered vertically on right edge of selection)\n const dupX = rLeftX + rWidth;\n const dupY = rTopY + rHeight / 2;\n if (Math.abs(canvasX - dupX) <= 9 && Math.abs(canvasY - dupY) <= 9) {\n return 'right-duplicate';\n }\n\n return null;\n }\n\n public hitTest(\n canvasX: number,\n canvasY: number,\n scrollLeft: number,\n scrollTop: number,\n rowCount: number\n ): HitTestResult | null {\n if (canvasY <= this.headerHeight || canvasX <= this.rowNumberWidth) {\n return null;\n }\n\n const virtualY = canvasY - this.headerHeight + scrollTop;\n const row = Math.floor(virtualY / this.rowHeight);\n if (row < 0 || row >= rowCount) return null;\n\n const cellScreenY = this.headerHeight + row * this.rowHeight - scrollTop;\n const localY = canvasY - cellScreenY;\n\n // 1. Frozen Columns\n if (canvasX < this.totalFrozenWidth) {\n let curX = this.rowNumberWidth;\n for (let i = 0; i < this.frozenColumns.length; i++) {\n const w = this.frozenColumns[i].width;\n if (canvasX >= curX && canvasX < curX + w) {\n return {\n row,\n col: i,\n localX: canvasX - curX,\n localY,\n isFrozen: true,\n cellRect: { x: curX, y: cellScreenY, width: w, height: this.rowHeight },\n };\n }\n curX += w;\n }\n return null;\n }\n\n // 2. Scrollable Columns\n const scrollX = canvasX - this.totalFrozenWidth + scrollLeft;\n if (scrollX < 0 || scrollX >= this.totalScrollableWidth || this.scrollableColumns.length === 0) {\n return null;\n }\n\n const scrollIdx = this.findScrollableColIndexAtX(scrollX);\n const colIndex = this.frozenColumns.length + scrollIdx;\n const cellScreenX = this.totalFrozenWidth + this.scrollableColOffsets[scrollIdx] - scrollLeft;\n const width = this.scrollableColumns[scrollIdx].width;\n\n return {\n row,\n col: colIndex,\n localX: canvasX - cellScreenX,\n localY,\n isFrozen: false,\n cellRect: { x: cellScreenX, y: cellScreenY, width, height: this.rowHeight },\n };\n }\n\n public hitTestColumnResize(\n canvasX: number,\n canvasY: number,\n scrollLeft: number\n ): { colIndex: number; isFrozen: boolean } | null {\n if (canvasY > this.headerHeight || canvasY < 0) return null;\n const inGroupBand = this.hasColumnGroups && canvasY < this.groupHeaderHeight;\n\n let curX = this.rowNumberWidth;\n for (let i = 0; i < this.frozenColumns.length; i++) {\n curX += this.frozenColumns[i].width;\n if (Math.abs(canvasX - curX) <= 4) {\n if (inGroupBand) {\n const curGroup = this.getColumnGroup(this.frozenColumns[i]);\n const nextGroup =\n i + 1 < this.frozenColumns.length\n ? this.getColumnGroup(this.frozenColumns[i + 1])\n : undefined;\n if (curGroup && nextGroup && curGroup.id === nextGroup.id) {\n continue;\n }\n }\n return { colIndex: i, isFrozen: true };\n }\n }\n\n if (canvasX >= this.totalFrozenWidth) {\n for (let i = 0; i < this.scrollableColumns.length; i++) {\n const borderX =\n this.totalFrozenWidth + this.scrollableColOffsets[i + 1] - scrollLeft;\n if (Math.abs(canvasX - borderX) <= 4) {\n if (inGroupBand) {\n const curGroup = this.getColumnGroup(this.scrollableColumns[i]);\n const nextGroup =\n i + 1 < this.scrollableColumns.length\n ? this.getColumnGroup(this.scrollableColumns[i + 1])\n : undefined;\n if (curGroup && nextGroup && curGroup.id === nextGroup.id) {\n continue;\n }\n }\n return { colIndex: this.frozenColumns.length + i, isFrozen: false };\n }\n }\n }\n\n return null;\n }\n}\n","import { useRef, useState, useEffect, useCallback, useMemo } from 'react';\r\nimport { ColumnDef, ColumnGroupDef, RowSelectionMode } from '../types/grid';\r\nimport { GeometryEngine } from '../core/GeometryEngine';\r\n\r\nexport interface UseGridGeometryOptions {\r\n userColumns: ColumnDef[];\r\n rowHeight?: number;\r\n headerHeight?: number;\r\n columnGroups?: ColumnGroupDef[];\r\n groupHeaderHeight?: number;\r\n rowSelectionMode?: RowSelectionMode;\r\n rowCount?: number;\r\n onRequestRender?: () => void;\r\n onActiveOverlayClear?: () => void;\r\n onColumnResize?: (colId: string, newWidth: number) => void;\r\n}\r\n\r\nexport interface ColumnResizeState {\r\n colIndex: number;\r\n colId: string;\r\n startX: number;\r\n initialWidth: number;\r\n}\r\n\r\nexport interface UseGridGeometryReturn {\r\n // DOM element refs\r\n containerRef: React.RefObject<HTMLDivElement | null>;\r\n gridSurfaceRef: React.RefObject<HTMLDivElement | null>;\r\n scrollContainerRef: React.RefObject<HTMLDivElement | null>;\r\n\r\n // Core Geometry Engine & Columns\r\n geometryRef: React.MutableRefObject<GeometryEngine>;\r\n columns: ColumnDef[];\r\n effectiveColumns: ColumnDef[];\r\n setColumns: React.Dispatch<React.SetStateAction<ColumnDef[]>>;\r\n updateColumnDef: (colId: string, patch: Partial<ColumnDef>) => void;\r\n setColumnWidth: (colId: string, width: number) => void;\r\n getColumnWidth: (colId: string) => number | undefined;\r\n\r\n // Resizing state\r\n resizingCol: ColumnResizeState | null;\r\n setResizingCol: React.Dispatch<React.SetStateAction<ColumnResizeState | null>>;\r\n\r\n // Scroll Position & Indicators\r\n scrollPosRef: React.MutableRefObject<{ left: number; top: number }>;\r\n scrollIndicator: { visible: boolean; row: number };\r\n setScrollIndicator: React.Dispatch<React.SetStateAction<{ visible: boolean; row: number }>>;\r\n\r\n // Handlers & Helpers\r\n handleScroll: (e: React.UIEvent<HTMLDivElement>) => void;\r\n ensureCellVisible: (row: number, col: number) => void;\r\n scrollTo: (options: { top?: number; left?: number; behavior?: ScrollBehavior }) => void;\r\n scrollToTop: () => void;\r\n scrollToBottom: () => void;\r\n getViewportCoords: (e: React.MouseEvent) => { x: number; y: number; onScrollbar: boolean };\r\n checkEdgeAutoScroll: (x: number, y: number, rect: DOMRect) => void;\r\n\r\n // Total Virtual Dimensions\r\n getTotalWidth: () => number;\r\n getTotalHeight: (rowCount: number) => number;\r\n}\r\n\r\nexport function useGridGeometry({\r\n userColumns,\r\n rowHeight = 34,\r\n headerHeight = 38,\r\n columnGroups = [],\r\n groupHeaderHeight = 30,\r\n rowSelectionMode = 'none',\r\n rowCount = 0,\r\n onRequestRender,\r\n onActiveOverlayClear,\r\n onColumnResize,\r\n}: UseGridGeometryOptions): UseGridGeometryReturn {\r\n\r\n // 1. Column state synced with props synchronously during render\r\n const [columns, setColumns] = useState<ColumnDef[]>(userColumns);\r\n const [prevUserColumns, setPrevUserColumns] = useState<ColumnDef[]>(userColumns);\r\n\r\n if (prevUserColumns !== userColumns) {\r\n setPrevUserColumns(userColumns);\r\n setColumns(userColumns);\r\n }\r\n\r\n // Derived effective columns with checkbox selection column when selectionMode is active\r\n const effectiveColumns = useMemo<ColumnDef[]>(() => {\r\n const activeCols = prevUserColumns !== userColumns ? userColumns : columns;\r\n if (rowSelectionMode === 'single' || rowSelectionMode === 'multiple') {\r\n const selCol: ColumnDef = {\r\n id: '__selection__',\r\n title: '',\r\n type: 'boolean',\r\n width: 42,\r\n pinned: 'left',\r\n sortable: false,\r\n filterable: false,\r\n groupable: false,\r\n readonly: true,\r\n };\r\n return [selCol, ...activeCols.filter((c) => c.id !== '__selection__')];\r\n }\r\n return activeCols;\r\n }, [columns, userColumns, prevUserColumns, rowSelectionMode]);\r\n\r\n // 2. Geometry Engine reference\r\n const geometryRef = useRef<GeometryEngine>(\r\n new GeometryEngine(effectiveColumns, rowHeight, headerHeight, columnGroups, groupHeaderHeight)\r\n );\r\n\r\n // Synchronously update geometry during render so canvas and summary row always have up-to-date column bounds\r\n geometryRef.current.rowHeight = rowHeight;\r\n geometryRef.current.setBaseHeaderHeight(headerHeight);\r\n geometryRef.current.setColumnGroups(columnGroups, groupHeaderHeight);\r\n geometryRef.current.setColumns(effectiveColumns);\r\n\r\n useEffect(() => {\r\n onRequestRender?.();\r\n }, [effectiveColumns, rowHeight, headerHeight, columnGroups, groupHeaderHeight, onRequestRender]);\r\n\r\n // 3. DOM Element Refs\r\n const containerRef = useRef<HTMLDivElement | null>(null);\r\n const gridSurfaceRef = useRef<HTMLDivElement | null>(null);\r\n const scrollContainerRef = useRef<HTMLDivElement | null>(null);\r\n\r\n // 4. Scroll Tracking & Indicators\r\n const scrollPosRef = useRef<{ left: number; top: number }>({ left: 0, top: 0 });\r\n const [scrollIndicator, setScrollIndicator] = useState<{ visible: boolean; row: number }>({\r\n visible: false,\r\n row: 1,\r\n });\r\n const scrollHideTimerRef = useRef<number | null>(null);\r\n\r\n // 5. Column Resizing State\r\n const [resizingCol, setResizingCol] = useState<ColumnResizeState | null>(null);\r\n const latestResizedWidthRef = useRef<{ colId: string; width: number } | null>(null);\r\n\r\n // Column Resizing mouse drag effect\r\n useEffect(() => {\r\n if (!resizingCol) return;\r\n\r\n latestResizedWidthRef.current = { colId: resizingCol.colId, width: resizingCol.initialWidth };\r\n const handleMouseMove = (e: MouseEvent) => {\r\n const deltaX = e.clientX - resizingCol.startX;\r\n const newWidth = Math.max(48, resizingCol.initialWidth + deltaX);\r\n latestResizedWidthRef.current = { colId: resizingCol.colId, width: newWidth };\r\n setColumns((prev) =>\r\n prev.map((c) => (c.id === resizingCol.colId ? { ...c, width: newWidth } : c))\r\n );\r\n };\r\n\r\n const handleMouseUp = () => {\r\n if (latestResizedWidthRef.current) {\r\n onColumnResize?.(latestResizedWidthRef.current.colId, latestResizedWidthRef.current.width);\r\n }\r\n setResizingCol(null);\r\n };\r\n\r\n window.addEventListener('mousemove', handleMouseMove);\r\n window.addEventListener('mouseup', handleMouseUp);\r\n return () => {\r\n window.removeEventListener('mousemove', handleMouseMove);\r\n window.removeEventListener('mouseup', handleMouseUp);\r\n };\r\n }, [resizingCol, onColumnResize]);\r\n\r\n\r\n // ResizeObserver on containers\r\n useEffect(() => {\r\n const handleResize = () => onRequestRender?.();\r\n window.addEventListener('resize', handleResize);\r\n\r\n let observer: ResizeObserver | null = null;\r\n if (typeof ResizeObserver !== 'undefined') {\r\n observer = new ResizeObserver(() => onRequestRender?.());\r\n if (gridSurfaceRef.current) observer.observe(gridSurfaceRef.current);\r\n if (containerRef.current) observer.observe(containerRef.current);\r\n }\r\n\r\n return () => {\r\n window.removeEventListener('resize', handleResize);\r\n observer?.disconnect();\r\n };\r\n }, [onRequestRender]);\r\n\r\n // 6. Column Mutation Helpers\r\n const updateColumnDef = useCallback((colId: string, patch: Partial<ColumnDef>) => {\r\n setColumns((prev) =>\r\n prev.map((c) => (c.id === colId ? { ...c, ...patch } : c))\r\n );\r\n }, []);\r\n\r\n const setColumnWidth = useCallback((colId: string, width: number) => {\r\n updateColumnDef(colId, { width: Math.max(48, width) });\r\n }, [updateColumnDef]);\r\n\r\n const getColumnWidth = useCallback((colId: string): number | undefined => {\r\n return geometryRef.current.columns.find((c) => c.id === colId)?.width;\r\n }, []);\r\n\r\n // 7. Scroll Handlers\r\n const handleScroll = useCallback((e: React.UIEvent<HTMLDivElement>) => {\r\n const target = e.currentTarget;\r\n scrollPosRef.current = {\r\n left: target.scrollLeft,\r\n top: target.scrollTop,\r\n };\r\n const topRow = Math.max(\r\n 1,\r\n Math.floor(target.scrollTop / geometryRef.current.rowHeight) + 1\r\n );\r\n setScrollIndicator({ visible: true, row: topRow });\r\n if (scrollHideTimerRef.current) {\r\n window.clearTimeout(scrollHideTimerRef.current);\r\n }\r\n scrollHideTimerRef.current = window.setTimeout(() => {\r\n setScrollIndicator((prev) => ({ ...prev, visible: false }));\r\n }, 900);\r\n\r\n onActiveOverlayClear?.();\r\n onRequestRender?.();\r\n }, [onActiveOverlayClear, onRequestRender]);\r\n\r\n const ensureCellVisible = useCallback((row: number, col: number) => {\r\n const geom = geometryRef.current;\r\n const sc = scrollContainerRef.current;\r\n if (!sc) return;\r\n\r\n const cellTop = geom.headerHeight + row * geom.rowHeight;\r\n const cellBottom = cellTop + geom.rowHeight;\r\n\r\n if (cellTop < sc.scrollTop + geom.headerHeight) {\r\n sc.scrollTop = cellTop - geom.headerHeight;\r\n } else if (cellBottom > sc.scrollTop + sc.clientHeight) {\r\n sc.scrollTop = cellBottom - sc.clientHeight;\r\n }\r\n\r\n const colRect = geom.getColumnScreenRect(col, sc.scrollLeft);\r\n if (!colRect.isFrozen) {\r\n if (colRect.x < geom.totalFrozenWidth) {\r\n sc.scrollLeft -= geom.totalFrozenWidth - colRect.x;\r\n } else if (colRect.x + colRect.width > sc.clientWidth) {\r\n sc.scrollLeft += colRect.x + colRect.width - sc.clientWidth;\r\n }\r\n }\r\n }, []);\r\n\r\n const scrollTo = useCallback((options: { top?: number; left?: number; behavior?: ScrollBehavior }) => {\r\n const sc = scrollContainerRef.current;\r\n if (!sc) return;\r\n sc.scrollTo({\r\n top: options.top ?? sc.scrollTop,\r\n left: options.left ?? sc.scrollLeft,\r\n behavior: options.behavior,\r\n });\r\n }, []);\r\n\r\n const scrollToTop = useCallback(() => {\r\n scrollTo({ top: 0, behavior: 'smooth' });\r\n }, [scrollTo]);\r\n\r\n const scrollToBottom = useCallback(() => {\r\n const sc = scrollContainerRef.current;\r\n if (sc) {\r\n scrollTo({ top: sc.scrollHeight, behavior: 'smooth' });\r\n }\r\n }, [scrollTo]);\r\n\r\n // 8. Viewport & Drag Edge Scrolling\r\n const getViewportCoords = useCallback((e: React.MouseEvent): { x: number; y: number; onScrollbar: boolean } => {\r\n const surface = gridSurfaceRef.current;\r\n const sc = scrollContainerRef.current;\r\n if (!surface) return { x: 0, y: 0, onScrollbar: false };\r\n\r\n const rect = surface.getBoundingClientRect();\r\n const x = e.clientX - rect.left;\r\n const y = e.clientY - rect.top;\r\n\r\n const onScrollbar = Boolean(\r\n sc && (x >= sc.clientWidth || y >= sc.clientHeight)\r\n );\r\n return { x, y, onScrollbar };\r\n }, []);\r\n\r\n const checkEdgeAutoScroll = useCallback((x: number, y: number, rect: DOMRect) => {\r\n const sc = scrollContainerRef.current;\r\n if (!sc) return;\r\n\r\n const edgeThreshold = 36;\r\n if (y > rect.height - edgeThreshold) {\r\n sc.scrollTop += 18;\r\n } else if (\r\n y < geometryRef.current.headerHeight + edgeThreshold &&\r\n y > geometryRef.current.headerHeight\r\n ) {\r\n sc.scrollTop = Math.max(0, sc.scrollTop - 18);\r\n }\r\n\r\n if (x > rect.width - edgeThreshold) {\r\n sc.scrollLeft += 24;\r\n } else if (\r\n x < geometryRef.current.totalFrozenWidth + edgeThreshold &&\r\n x > geometryRef.current.totalFrozenWidth\r\n ) {\r\n sc.scrollLeft = Math.max(0, sc.scrollLeft - 24);\r\n }\r\n }, []);\r\n\r\n // 9. Dimension Queries\r\n const getTotalWidth = useCallback((): number => {\r\n return geometryRef.current.totalFrozenWidth + geometryRef.current.totalScrollableWidth + 18;\r\n }, []);\r\n\r\n const getTotalHeight = useCallback((count: number): number => {\r\n return geometryRef.current.headerHeight + count * geometryRef.current.rowHeight;\r\n }, []);\r\n\r\n return {\r\n containerRef,\r\n gridSurfaceRef,\r\n scrollContainerRef,\r\n geometryRef,\r\n columns,\r\n effectiveColumns,\r\n setColumns,\r\n updateColumnDef,\r\n setColumnWidth,\r\n getColumnWidth,\r\n resizingCol,\r\n setResizingCol,\r\n scrollPosRef,\r\n scrollIndicator,\r\n setScrollIndicator,\r\n handleScroll,\r\n ensureCellVisible,\r\n scrollTo,\r\n scrollToTop,\r\n scrollToBottom,\r\n getViewportCoords,\r\n checkEdgeAutoScroll,\r\n getTotalWidth,\r\n getTotalHeight,\r\n };\r\n}\r\n","import { IGridThemeTokens } from '../IGridTheme';\n\nexport const appleLight: IGridThemeTokens = {\n name: 'apple-light',\n isDark: false,\n fontFamily: 'Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n fontSize: 13,\n headerFontSize: 12,\n fontFeatureSettings: '\"tnum\"',\n\n canvas: {\n bg: '#FFFFFF',\n gridLine: '#E5E5EA',\n headerBg: '#F5F5F7',\n headerText: '#1D1D1F',\n headerBorder: '#D1D1D6',\n cellText: '#1D1D1F',\n rowNumberBg: '#FAFAFC',\n rowNumberText: '#8E8E93',\n rowNumberBorder: '#E5E5EA',\n frozenDividerShadow: 'rgba(0, 0, 0, 0.08)',\n groupRowBg: '#F2F2F7',\n groupRowText: '#1D1D1F',\n groupRowBorder: '#D1D1D6',\n selectionBorder: '#007AFF',\n selectionFill: 'rgba(0, 122, 255, 0.08)',\n fillHandleColor: '#007AFF',\n searchHighlight: 'rgba(255, 214, 10, 0.55)',\n skeletonBar: '#E5E5EA',\n },\n\n dom: {\n toolbarBg: 'rgba(255, 255, 255, 0.85)',\n toolbarBorder: 'rgba(0, 0, 0, 0.08)',\n toolbarText: '#1D1D1F',\n glassBackdrop: 'blur(20px) saturate(180%)',\n popoverBg: 'rgba(255, 255, 255, 0.95)',\n popoverBorder: 'rgba(0, 0, 0, 0.12)',\n popoverShadow: '0 12px 32px rgba(0, 0, 0, 0.12), 0 2px 6px rgba(0, 0, 0, 0.04)',\n popoverText: '#1D1D1F',\n inputBg: '#FFFFFF',\n inputText: '#1D1D1F',\n inputBorder: '#D1D1D6',\n inputFocusBorder: '#007AFF',\n accentColor: '#007AFF',\n buttonHoverBg: 'rgba(0, 0, 0, 0.05)',\n badgeBg: '#E5E5EA',\n badgeText: '#1D1D1F',\n },\n};\n","import { IGridThemeTokens } from '../IGridTheme';\n\nexport const appleDark: IGridThemeTokens = {\n name: 'apple-dark',\n isDark: true,\n fontFamily: 'Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n fontSize: 13,\n headerFontSize: 12,\n fontFeatureSettings: '\"tnum\"',\n\n canvas: {\n bg: '#1C1C1E',\n gridLine: '#2C2C2E',\n headerBg: '#2C2C2E',\n headerText: '#F5F5F7',\n headerBorder: '#3A3A3C',\n cellText: '#F5F5F7',\n rowNumberBg: '#242426',\n rowNumberText: '#8E8E93',\n rowNumberBorder: '#2C2C2E',\n frozenDividerShadow: 'rgba(0, 0, 0, 0.45)',\n groupRowBg: '#252528',\n groupRowText: '#F5F5F7',\n groupRowBorder: '#3A3A3C',\n selectionBorder: '#0A84FF',\n selectionFill: 'rgba(10, 132, 255, 0.18)',\n fillHandleColor: '#0A84FF',\n searchHighlight: 'rgba(255, 214, 10, 0.35)',\n skeletonBar: '#2C2C2E',\n },\n\n dom: {\n toolbarBg: 'rgba(28, 28, 30, 0.88)',\n toolbarBorder: 'rgba(255, 255, 255, 0.08)',\n toolbarText: '#F5F5F7',\n glassBackdrop: 'blur(24px) saturate(180%)',\n popoverBg: 'rgba(38, 38, 42, 0.95)',\n popoverBorder: 'rgba(255, 255, 255, 0.12)',\n popoverShadow: '0 16px 40px rgba(0, 0, 0, 0.5), 0 2px 8px rgba(0, 0, 0, 0.3)',\n popoverText: '#F5F5F7',\n inputBg: '#2C2C2E',\n inputText: '#F5F5F7',\n inputBorder: '#3A3A3C',\n inputFocusBorder: '#0A84FF',\n accentColor: '#0A84FF',\n buttonHoverBg: 'rgba(255, 255, 255, 0.08)',\n badgeBg: '#3A3A3C',\n badgeText: '#F5F5F7',\n },\n};\n","import { IGridThemeTokens } from '../IGridTheme';\n\nexport const googleLight: IGridThemeTokens = {\n name: 'google-light',\n isDark: false,\n fontFamily: 'Roboto, \"Google Sans\", -apple-system, BlinkMacSystemFont, sans-serif',\n fontSize: 13,\n headerFontSize: 12,\n fontFeatureSettings: '\"tnum\"',\n\n canvas: {\n bg: '#FFFFFF',\n gridLine: '#E0E0E0',\n headerBg: '#F8F9FA',\n headerText: '#3C4043',\n headerBorder: '#D2D3D6',\n cellText: '#202124',\n rowNumberBg: '#F8F9FA',\n rowNumberText: '#5F6368',\n rowNumberBorder: '#D2D3D6',\n frozenDividerShadow: 'rgba(60, 64, 67, 0.15)',\n groupRowBg: '#F1F3F4',\n groupRowText: '#202124',\n groupRowBorder: '#D2D3D6',\n selectionBorder: '#1A73E8',\n selectionFill: 'rgba(26, 115, 232, 0.08)',\n fillHandleColor: '#1A73E8',\n searchHighlight: 'rgba(253, 214, 51, 0.6)',\n skeletonBar: '#F1F3F4',\n },\n\n dom: {\n toolbarBg: '#FFFFFF',\n toolbarBorder: '#E0E0E0',\n toolbarText: '#3C4043',\n glassBackdrop: 'none',\n popoverBg: '#FFFFFF',\n popoverBorder: '#DADCE0',\n popoverShadow: '0 8px 24px rgba(60, 64, 67, 0.15)',\n popoverText: '#202124',\n inputBg: '#FFFFFF',\n inputText: '#202124',\n inputBorder: '#DADCE0',\n inputFocusBorder: '#1A73E8',\n accentColor: '#1A73E8',\n buttonHoverBg: '#F1F3F4',\n badgeBg: '#E8F0FE',\n badgeText: '#1967D2',\n },\n};\n","import { IGridThemeTokens } from '../IGridTheme';\n\nexport const googleDark: IGridThemeTokens = {\n name: 'google-dark',\n isDark: true,\n fontFamily: 'Roboto, \"Google Sans\", -apple-system, BlinkMacSystemFont, sans-serif',\n fontSize: 13,\n headerFontSize: 12,\n fontFeatureSettings: '\"tnum\"',\n\n canvas: {\n bg: '#202124',\n gridLine: '#3C4043',\n headerBg: '#2D2E30',\n headerText: '#E8EAED',\n headerBorder: '#5F6368',\n cellText: '#E8EAED',\n rowNumberBg: '#2D2E30',\n rowNumberText: '#9AA0A6',\n rowNumberBorder: '#5F6368',\n frozenDividerShadow: 'rgba(0, 0, 0, 0.5)',\n groupRowBg: '#282A2D',\n groupRowText: '#E8EAED',\n groupRowBorder: '#5F6368',\n selectionBorder: '#8AB4F8',\n selectionFill: 'rgba(138, 180, 248, 0.16)',\n fillHandleColor: '#8AB4F8',\n searchHighlight: 'rgba(253, 214, 51, 0.35)',\n skeletonBar: '#3C4043',\n },\n\n dom: {\n toolbarBg: '#202124',\n toolbarBorder: '#3C4043',\n toolbarText: '#E8EAED',\n glassBackdrop: 'none',\n popoverBg: '#2D2E30',\n popoverBorder: '#5F6368',\n popoverShadow: '0 12px 32px rgba(0, 0, 0, 0.4)',\n popoverText: '#E8EAED',\n inputBg: '#202124',\n inputText: '#E8EAED',\n inputBorder: '#5F6368',\n inputFocusBorder: '#8AB4F8',\n accentColor: '#8AB4F8',\n buttonHoverBg: '#3C4043',\n badgeBg: '#394457',\n badgeText: '#8AB4F8',\n },\n};\n","import { IGridThemeTokens } from './IGridTheme';\nimport { appleLight } from './presets/appleLight';\nimport { appleDark } from './presets/appleDark';\nimport { googleLight } from './presets/googleLight';\nimport { googleDark } from './presets/googleDark';\n\nexport type ThemeInput = 'system' | 'apple-light' | 'apple-dark' | 'google-light' | 'google-dark' | IGridThemeTokens;\n\nexport class ThemeEngine {\n private static presets: Map<string, IGridThemeTokens> = new Map([\n ['apple-light', appleLight],\n ['apple-dark', appleDark],\n ['google-light', googleLight],\n ['google-dark', googleDark],\n ]);\n\n public static registerPreset(name: string, tokens: IGridThemeTokens): void {\n this.presets.set(name, tokens);\n }\n\n public static resolve(themeInput?: ThemeInput): IGridThemeTokens {\n if (!themeInput || themeInput === 'system') {\n const prefersDark =\n typeof window !== 'undefined' &&\n window.matchMedia &&\n window.matchMedia('(prefers-color-scheme: dark)').matches;\n return prefersDark ? appleDark : appleLight;\n }\n\n if (typeof themeInput === 'string') {\n const found = this.presets.get(themeInput);\n if (found) return found;\n return appleLight;\n }\n\n return themeInput;\n }\n\n public static applyToElement(el: HTMLElement, theme: IGridThemeTokens): void {\n const s = el.style;\n s.setProperty('--grid-font-family', theme.fontFamily);\n s.setProperty('--grid-font-size', `${theme.fontSize}px`);\n s.setProperty('--grid-header-font-size', `${theme.headerFontSize}px`);\n\n // DOM renkleri\n s.setProperty('--grid-toolbar-bg', theme.dom.toolbarBg);\n s.setProperty('--grid-toolbar-border', theme.dom.toolbarBorder);\n s.setProperty('--grid-toolbar-text', theme.dom.toolbarText);\n s.setProperty('--grid-glass-backdrop', theme.dom.glassBackdrop);\n s.setProperty('--grid-popover-bg', theme.dom.popoverBg);\n s.setProperty('--grid-popover-border', theme.dom.popoverBorder);\n s.setProperty('--grid-popover-shadow', theme.dom.popoverShadow);\n s.setProperty('--grid-popover-text', theme.dom.popoverText);\n s.setProperty('--grid-input-bg', theme.dom.inputBg);\n s.setProperty('--grid-input-text', theme.dom.inputText);\n s.setProperty('--grid-input-border', theme.dom.inputBorder);\n s.setProperty('--grid-input-focus-border', theme.dom.inputFocusBorder);\n s.setProperty('--grid-accent-color', theme.dom.accentColor);\n s.setProperty('--grid-button-hover-bg', theme.dom.buttonHoverBg);\n s.setProperty('--grid-badge-bg', theme.dom.badgeBg);\n s.setProperty('--grid-badge-text', theme.dom.badgeText);\n }\n\n public static watchSystem(onChange: (isDark: boolean) => void): () => void {\n if (typeof window === 'undefined' || !window.matchMedia) return () => {};\n const media = window.matchMedia('(prefers-color-scheme: dark)');\n const listener = (e: MediaQueryListEvent) => onChange(e.matches);\n media.addEventListener('change', listener);\n return () => media.removeEventListener('change', listener);\n }\n}\n","export interface GridCommand {\n description?: string;\n undo: () => void;\n redo: () => void;\n}\n\nexport class HistoryManager {\n private undoStack: GridCommand[] = [];\n private redoStack: GridCommand[] = [];\n private maxHistory: number = 50;\n\n constructor(maxHistory: number = 50) {\n this.maxHistory = maxHistory;\n }\n\n public push(command: GridCommand): void {\n this.undoStack.push(command);\n if (this.undoStack.length > this.maxHistory) {\n this.undoStack.shift();\n }\n // Yeni bir işlem yapıldığında redo stack temizlenir\n this.redoStack = [];\n }\n\n public undo(): boolean {\n const cmd = this.undoStack.pop();\n if (!cmd) return false;\n cmd.undo();\n this.redoStack.push(cmd);\n return true;\n }\n\n public redo(): boolean {\n const cmd = this.redoStack.pop();\n if (!cmd) return false;\n cmd.redo();\n this.undoStack.push(cmd);\n return true;\n }\n\n public canUndo(): boolean {\n return this.undoStack.length > 0;\n }\n\n public canRedo(): boolean {\n return this.redoStack.length > 0;\n }\n\n public clear(): void {\n this.undoStack = [];\n this.redoStack = [];\n }\n}\n","import { FilterDescriptor, FilterOperation, SingleFilter } from '../types/filter';\r\n\r\nexport const BLANK_FILTER_TOKEN = '__SHEETGL_BLANK__';\r\n\r\nexport interface ParsedDateInfo {\r\n year: number;\r\n month: number; // 1..12\r\n day: number; // 1..31\r\n hour: number;\r\n minute: number;\r\n second: number;\r\n hasTime: boolean;\r\n isoDate: string; // YYYY-MM-DD\r\n startOfDayMs: number;\r\n endOfDayMs: number;\r\n exactMs: number;\r\n}\r\n\r\ninterface CompiledSetCache {\r\n rawSet: Set<any>;\r\n lowerSet: Set<string>;\r\n isoDateSet: Set<string>;\r\n isoMonthSet: Set<string>;\r\n isoYearSet: Set<number>;\r\n hasBlank: boolean;\r\n}\r\n\r\nexport class FilterEngine {\r\n private static inSetCache = new WeakMap<any[], CompiledSetCache>();\r\n private static dateFormatterCache = new Map<string, Intl.DateTimeFormat>();\r\n\r\n public static formatLocalizedDate(\r\n val: any,\r\n localeCode: string = 'tr-TR',\r\n includeTime: boolean = false\r\n ): string {\r\n if (val === null || val === undefined || val === '' || val === BLANK_FILTER_TOKEN) {\r\n return '';\r\n }\r\n const parsed = this.parseDateParts(val);\r\n if (!parsed) return String(val);\r\n\r\n const code = localeCode || 'tr-TR';\r\n let fmt = this.dateFormatterCache.get(code);\r\n if (!fmt) {\r\n try {\r\n fmt = new Intl.DateTimeFormat(code, {\r\n year: 'numeric',\r\n month: '2-digit',\r\n day: '2-digit',\r\n timeZone: 'UTC',\r\n });\r\n } catch {\r\n fmt = new Intl.DateTimeFormat('tr-TR', {\r\n year: 'numeric',\r\n month: '2-digit',\r\n day: '2-digit',\r\n timeZone: 'UTC',\r\n });\r\n }\r\n this.dateFormatterCache.set(code, fmt);\r\n }\r\n\r\n const dateStr = fmt.format(new Date(parsed.startOfDayMs));\r\n if (includeTime) {\r\n const hh = String(parsed.hasTime ? parsed.hour : 9).padStart(2, '0');\r\n const mm = String(parsed.hasTime ? parsed.minute : 0).padStart(2, '0');\r\n return `${dateStr} ${hh}:${mm}`;\r\n }\r\n return dateStr;\r\n }\r\n\r\n private static getCompiledSet(targetVal: any[]): CompiledSetCache {\r\n let cached = this.inSetCache.get(targetVal);\r\n if (!cached) {\r\n const rawSet = new Set<any>();\r\n const lowerSet = new Set<string>();\r\n const isoDateSet = new Set<string>();\r\n const isoMonthSet = new Set<string>();\r\n const isoYearSet = new Set<number>();\r\n let hasBlank = false;\r\n for (let i = 0; i < targetVal.length; i++) {\r\n const t = targetVal[i];\r\n if (t === BLANK_FILTER_TOKEN || t === '' || t === null || t === undefined) {\r\n hasBlank = true;\r\n } else {\r\n rawSet.add(t);\r\n const s = typeof t === 'string' ? t.trim() : String(t).trim();\r\n lowerSet.add(s.toLowerCase());\r\n\r\n if (/^\\d{4}$/.test(s)) {\r\n const yr = parseInt(s, 10);\r\n if (yr >= 1000 && yr <= 9999) {\r\n isoYearSet.add(yr);\r\n }\r\n } else if (/^\\d{4}-\\d{1,2}$/.test(s)) {\r\n const [yStr, mStr] = s.split('-');\r\n const yr = parseInt(yStr, 10);\r\n const mo = parseInt(mStr, 10);\r\n if (yr >= 1000 && yr <= 9999 && mo >= 1 && mo <= 12) {\r\n isoMonthSet.add(`${yr}-${String(mo).padStart(2, '0')}`);\r\n }\r\n } else {\r\n const pd = this.parseDateParts(t);\r\n if (pd && !pd.hasTime) {\r\n isoDateSet.add(pd.isoDate);\r\n }\r\n }\r\n }\r\n }\r\n cached = { rawSet, lowerSet, isoDateSet, isoMonthSet, isoYearSet, hasBlank };\r\n this.inSetCache.set(targetVal, cached);\r\n }\r\n return cached;\r\n }\r\n\r\n private static matchesCompiledDateSet(rawVal: any, compiled: CompiledSetCache): boolean {\r\n if (\r\n compiled.isoDateSet.size === 0 &&\r\n compiled.isoMonthSet.size === 0 &&\r\n compiled.isoYearSet.size === 0\r\n ) {\r\n return false;\r\n }\r\n const rd = this.parseDateParts(rawVal);\r\n if (!rd) return false;\r\n if (compiled.isoDateSet.has(rd.isoDate)) return true;\r\n if (\r\n compiled.isoMonthSet.size > 0 &&\r\n compiled.isoMonthSet.has(`${rd.year}-${String(rd.month).padStart(2, '0')}`)\r\n ) {\r\n return true;\r\n }\r\n if (compiled.isoYearSet.size > 0 && compiled.isoYearSet.has(rd.year)) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n public static evaluateRow(row: Record<string, any>, filter: FilterDescriptor | null): boolean {\r\n if (!filter || !Array.isArray(filter) || filter.length === 0) {\r\n return true;\r\n }\r\n\r\n if (this.isSingleFilter(filter)) {\r\n return this.evaluateSingleFilter(row, filter as SingleFilter);\r\n }\r\n\r\n let logicalOp: 'and' | 'or' = 'and';\r\n let currentResult = true;\r\n\r\n for (let i = 0; i < filter.length; i++) {\r\n const item = filter[i];\r\n\r\n if (typeof item === 'string') {\r\n const lower = item.toLowerCase();\r\n if (lower === 'and' || lower === 'or') {\r\n logicalOp = lower;\r\n }\r\n continue;\r\n }\r\n\r\n const itemResult = this.evaluateRow(row, item as FilterDescriptor);\r\n\r\n if (i === 0) {\r\n currentResult = itemResult;\r\n } else {\r\n if (logicalOp === 'and') {\r\n currentResult = currentResult && itemResult;\r\n if (!currentResult) return false;\r\n } else {\r\n currentResult = currentResult || itemResult;\r\n if (currentResult) return true;\r\n }\r\n }\r\n }\r\n\r\n return currentResult;\r\n }\r\n\r\n private static isSingleFilter(filter: any[]): boolean {\r\n return (\r\n filter.length === 3 &&\r\n typeof filter[0] === 'string' &&\r\n typeof filter[1] === 'string' &&\r\n !['and', 'or'].includes(filter[1].toLowerCase())\r\n );\r\n }\r\n\r\n private static evaluateSingleFilter(row: Record<string, any>, [field, op, targetVal]: SingleFilter): boolean {\r\n const rawVal = row[field];\r\n return this.match(rawVal, op, targetVal);\r\n }\r\n\r\n public static parseDateParts(val: any): ParsedDateInfo | null {\r\n if (\r\n val === null ||\r\n val === undefined ||\r\n val === '' ||\r\n val === BLANK_FILTER_TOKEN ||\r\n typeof val === 'number' ||\r\n typeof val === 'boolean'\r\n ) {\r\n return null;\r\n }\r\n\r\n if (val instanceof Date) {\r\n if (isNaN(val.getTime())) return null;\r\n const year = val.getFullYear();\r\n const month = val.getMonth() + 1;\r\n const day = val.getDate();\r\n const hour = val.getHours();\r\n const minute = val.getMinutes();\r\n const second = val.getSeconds();\r\n const hasTime = hour !== 0 || minute !== 0 || second !== 0;\r\n const isoDate = `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}`;\r\n const startOfDayMs = Date.UTC(year, month - 1, day, 0, 0, 0, 0);\r\n const endOfDayMs = Date.UTC(year, month - 1, day, 23, 59, 59, 999);\r\n const exactMs = hasTime ? Date.UTC(year, month - 1, day, hour, minute, second, 0) : startOfDayMs;\r\n return { year, month, day, hour, minute, second, hasTime, isoDate, startOfDayMs, endOfDayMs, exactMs };\r\n }\r\n\r\n if (typeof val !== 'string') return null;\r\n const str = val.trim();\r\n if (str.length < 8 || str.length > 35) return null;\r\n\r\n // 1. ISO / Year-first: YYYY-MM-DD or YYYY/MM/DD or YYYY.MM.DD with optional time\r\n const ymdMatch = str.match(\r\n /^(\\d{4})[-/.](\\d{1,2})[-/.](\\d{1,2})(?:[T\\s]+(\\d{1,2}):(\\d{1,2})(?::(\\d{1,2}))?(?:\\.\\d+)?Z?)?$/\r\n );\r\n if (ymdMatch) {\r\n const year = parseInt(ymdMatch[1], 10);\r\n const month = parseInt(ymdMatch[2], 10);\r\n const day = parseInt(ymdMatch[3], 10);\r\n if (year >= 1000 && year <= 9999 && month >= 1 && month <= 12 && day >= 1 && day <= 31) {\r\n const hasTime = ymdMatch[4] !== undefined;\r\n const hour = hasTime ? parseInt(ymdMatch[4], 10) : 0;\r\n const minute = ymdMatch[5] !== undefined ? parseInt(ymdMatch[5], 10) : 0;\r\n const second = ymdMatch[6] !== undefined ? parseInt(ymdMatch[6], 10) : 0;\r\n const isoDate = `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}`;\r\n const startOfDayMs = Date.UTC(year, month - 1, day, 0, 0, 0, 0);\r\n const endOfDayMs = Date.UTC(year, month - 1, day, 23, 59, 59, 999);\r\n const exactMs = hasTime ? Date.UTC(year, month - 1, day, hour, minute, second, 0) : startOfDayMs;\r\n return { year, month, day, hour, minute, second, hasTime, isoDate, startOfDayMs, endOfDayMs, exactMs };\r\n }\r\n }\r\n\r\n // 2. Day-first (DD.MM.YYYY / DD/MM/YYYY) or US Month-first (MM/DD/YYYY when p2 > 12)\r\n const dmyMatch = str.match(\r\n /^(\\d{1,2})[./-](\\d{1,2})[./-](\\d{4})(?:[T\\s]+(\\d{1,2}):(\\d{1,2})(?::(\\d{1,2}))?)?$/\r\n );\r\n if (dmyMatch) {\r\n const p1 = parseInt(dmyMatch[1], 10);\r\n const p2 = parseInt(dmyMatch[2], 10);\r\n const year = parseInt(dmyMatch[3], 10);\r\n const isMdy = p2 > 12 && p1 >= 1 && p1 <= 12;\r\n const day = isMdy ? p2 : p1;\r\n const month = isMdy ? p1 : p2;\r\n if (year >= 1000 && year <= 9999 && month >= 1 && month <= 12 && day >= 1 && day <= 31) {\r\n const hasTime = dmyMatch[4] !== undefined;\r\n const hour = hasTime ? parseInt(dmyMatch[4], 10) : 0;\r\n const minute = dmyMatch[5] !== undefined ? parseInt(dmyMatch[5], 10) : 0;\r\n const second = dmyMatch[6] !== undefined ? parseInt(dmyMatch[6], 10) : 0;\r\n const isoDate = `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}`;\r\n const startOfDayMs = Date.UTC(year, month - 1, day, 0, 0, 0, 0);\r\n const endOfDayMs = Date.UTC(year, month - 1, day, 23, 59, 59, 999);\r\n const exactMs = hasTime ? Date.UTC(year, month - 1, day, hour, minute, second, 0) : startOfDayMs;\r\n return { year, month, day, hour, minute, second, hasTime, isoDate, startOfDayMs, endOfDayMs, exactMs };\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n public static parseNumeric(val: any): number {\r\n if (typeof val === 'number') return val;\r\n if (val === null || val === undefined || val === '' || typeof val === 'boolean') return NaN;\r\n const str = String(val).trim();\r\n if (!str) return NaN;\r\n\r\n // Strip standalone ISO currency codes (TL, TRY, USD, EUR, GBP, JPY, CHF, CAD, AUD) while preserving identifier checks like \"ACC-100001\"\r\n const withoutCurrencyCode = str\r\n .replace(/(?:^|\\s)(TL|TRY|USD|EUR|GBP|JPY|CHF|CAD|AUD)(?=$|\\s)/gi, '')\r\n .trim();\r\n\r\n // Reject strings containing remaining alphabetic characters (e.g. \"ACC-100001\", \"ISO-27001\")\r\n if (/[a-zA-ZğüşöçıİĞÜŞÖÇ]/.test(withoutCurrencyCode)) return NaN;\r\n\r\n const isPercentStr = str.includes('%');\r\n const raw = withoutCurrencyCode.replace(/[^0-9.,+-]/g, '').trim();\r\n if (!raw || !/\\d/.test(raw)) return NaN;\r\n\r\n const hasDot = raw.includes('.');\r\n const hasComma = raw.includes(',');\r\n\r\n if (hasDot && hasComma) {\r\n if (raw.lastIndexOf(',') > raw.lastIndexOf('.')) {\r\n // TR/EU format: 15.000,47 -> 15000.47\r\n return parseFloat(raw.replace(/\\./g, '').replace(',', '.'));\r\n } else {\r\n // US/UK format: 15,000.47 -> 15000.47\r\n return parseFloat(raw.replace(/,/g, ''));\r\n }\r\n }\r\n\r\n if (hasComma) {\r\n // Multiple commas or US thousands grouping without decimals (when not a percent string)\r\n if (!isPercentStr && /^[+-]?[1-9]\\d{0,2}(,\\d{3})+$/.test(raw) && (raw.indexOf(',') !== raw.lastIndexOf(',') || raw.endsWith(',000'))) {\r\n return parseFloat(raw.replace(/,/g, ''));\r\n }\r\n if (raw.indexOf(',') !== raw.lastIndexOf(',')) {\r\n return parseFloat(raw.replace(/,/g, ''));\r\n }\r\n // Decimal comma: 15000,47 or +%14,2 or 0,500 -> 15000.47 / 14.2 / 0.5\r\n return parseFloat(raw.replace(',', '.'));\r\n }\r\n\r\n if (hasDot) {\r\n // Multiple dots are always thousands separators: 1.250.000 -> 1250000\r\n if (raw.indexOf('.') !== raw.lastIndexOf('.')) {\r\n return parseFloat(raw.replace(/\\./g, ''));\r\n }\r\n // Single dot with exact .000 suffix (and not a percentage string like \"+%14.250\") -> TR integer thousands separator (e.g. \"15.000\")\r\n if (!isPercentStr && /^[+-]?[1-9]\\d{0,2}\\.000$/.test(raw)) {\r\n return parseFloat(raw.replace(/\\./g, ''));\r\n }\r\n return parseFloat(raw);\r\n }\r\n\r\n return parseFloat(raw);\r\n }\r\n\r\n private static stringifyValue(rawVal: any): string {\r\n if (rawVal === null || rawVal === undefined) return '';\r\n if (Array.isArray(rawVal)) return rawVal.join(', ');\r\n if (typeof rawVal === 'object') {\r\n return Object.entries(rawVal)\r\n .map(([k, v]) => `${k}: ${String(v)}`)\r\n .join(' • ');\r\n }\r\n return String(rawVal);\r\n }\r\n\r\n private static matchesFormattedNumber(numVal: number, targetStr: string, mode: 'contains' | 'startswith' | 'endswith'): boolean {\r\n const tr2 = numVal.toLocaleString('tr-TR', { minimumFractionDigits: 2, maximumFractionDigits: 2 }).toLowerCase();\r\n const tr0 = numVal.toLocaleString('tr-TR').toLowerCase();\r\n const en2 = numVal.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 }).toLowerCase();\r\n const cleanTarget = targetStr.replace(/[$€₺£%\\s]/g, '').trim();\r\n if (!cleanTarget) return false;\r\n\r\n if (mode === 'contains') {\r\n return tr2.includes(cleanTarget) || tr0.includes(cleanTarget) || en2.includes(cleanTarget);\r\n }\r\n if (mode === 'startswith') {\r\n return tr2.startsWith(cleanTarget) || tr0.startsWith(cleanTarget) || en2.startsWith(cleanTarget);\r\n }\r\n return tr2.endsWith(cleanTarget) || tr0.endsWith(cleanTarget) || en2.endsWith(cleanTarget);\r\n }\r\n\r\n public static match(rawVal: any, op: FilterOperation, targetVal: any): boolean {\r\n const isRawBlank =\r\n rawVal === null ||\r\n rawVal === undefined ||\r\n rawVal === '' ||\r\n (Array.isArray(rawVal) && rawVal.length === 0) ||\r\n (typeof rawVal === 'object' && !Array.isArray(rawVal) && Object.keys(rawVal).length === 0);\r\n\r\n if (op === 'in') {\r\n if (!Array.isArray(targetVal) || targetVal.length === 0) return false;\r\n const compiled = this.getCompiledSet(targetVal);\r\n if (isRawBlank) return compiled.hasBlank;\r\n if (Array.isArray(rawVal)) {\r\n for (let i = 0; i < rawVal.length; i++) {\r\n const elem = rawVal[i];\r\n if (compiled.rawSet.has(elem) || compiled.lowerSet.has(String(elem).toLowerCase())) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n if (typeof rawVal === 'string' && (rawVal.includes(',') || rawVal.includes(';') || rawVal.includes('|') || rawVal.includes(' + '))) {\r\n const tokens = rawVal.split(/[,;|]|\\s\\+\\s/).map((s) => s.trim()).filter(Boolean);\r\n for (let i = 0; i < tokens.length; i++) {\r\n const elem = tokens[i];\r\n if (compiled.rawSet.has(elem) || compiled.lowerSet.has(elem.toLowerCase())) {\r\n return true;\r\n }\r\n }\r\n }\r\n if (compiled.rawSet.has(rawVal)) return true;\r\n if (compiled.lowerSet.has(this.stringifyValue(rawVal).toLowerCase())) return true;\r\n return this.matchesCompiledDateSet(rawVal, compiled);\r\n }\r\n\r\n if (op === 'notin') {\r\n if (!Array.isArray(targetVal) || targetVal.length === 0) return true;\r\n const compiled = this.getCompiledSet(targetVal);\r\n if (isRawBlank) return !compiled.hasBlank;\r\n if (Array.isArray(rawVal)) {\r\n for (let i = 0; i < rawVal.length; i++) {\r\n const elem = rawVal[i];\r\n if (compiled.rawSet.has(elem) || compiled.lowerSet.has(String(elem).toLowerCase())) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n if (typeof rawVal === 'string' && (rawVal.includes(',') || rawVal.includes(';') || rawVal.includes('|') || rawVal.includes(' + '))) {\r\n const tokens = rawVal.split(/[,;|]|\\s\\+\\s/).map((s) => s.trim()).filter(Boolean);\r\n for (let i = 0; i < tokens.length; i++) {\r\n const elem = tokens[i];\r\n if (compiled.rawSet.has(elem) || compiled.lowerSet.has(elem.toLowerCase())) {\r\n return false;\r\n }\r\n }\r\n }\r\n if (compiled.rawSet.has(rawVal)) return false;\r\n if (compiled.lowerSet.has(this.stringifyValue(rawVal).toLowerCase())) return false;\r\n return !this.matchesCompiledDateSet(rawVal, compiled);\r\n }\r\n\r\n if (op === '=' && (targetVal === null || targetVal === undefined || targetVal === '' || targetVal === BLANK_FILTER_TOKEN)) {\r\n return isRawBlank;\r\n }\r\n\r\n if (isRawBlank) {\r\n return op === '<>' || op === 'notcontains';\r\n }\r\n\r\n const valStr = this.stringifyValue(rawVal).toLowerCase();\r\n const targetStr = String(targetVal ?? '').toLowerCase().trim();\r\n const rawDate = this.parseDateParts(rawVal);\r\n const targetDate = Array.isArray(targetVal) ? null : this.parseDateParts(targetVal);\r\n const numRaw = typeof rawVal === 'number' ? rawVal : rawDate ? NaN : this.parseNumeric(rawVal);\r\n const numTarget = targetDate ? NaN : this.parseNumeric(targetVal);\r\n const bothNumeric = !isNaN(numRaw) && !isNaN(numTarget);\r\n const bothDate = rawDate !== null && targetDate !== null;\r\n\r\n switch (op) {\r\n case 'contains':\r\n if (valStr.includes(targetStr)) return true;\r\n if (rawDate) {\r\n const dmy = `${String(rawDate.day).padStart(2, '0')}.${String(rawDate.month).padStart(2, '0')}.${rawDate.year}`;\r\n if (rawDate.isoDate.includes(targetStr) || dmy.includes(targetStr)) return true;\r\n }\r\n if (!isNaN(numRaw)) {\r\n return this.matchesFormattedNumber(numRaw, targetStr, 'contains');\r\n }\r\n return false;\r\n case 'notcontains':\r\n if (valStr.includes(targetStr)) return false;\r\n if (rawDate) {\r\n const dmy = `${String(rawDate.day).padStart(2, '0')}.${String(rawDate.month).padStart(2, '0')}.${rawDate.year}`;\r\n if (rawDate.isoDate.includes(targetStr) || dmy.includes(targetStr)) return false;\r\n }\r\n if (!isNaN(numRaw) && this.matchesFormattedNumber(numRaw, targetStr, 'contains')) {\r\n return false;\r\n }\r\n return true;\r\n case 'startswith':\r\n if (valStr.startsWith(targetStr)) return true;\r\n if (!isNaN(numRaw)) {\r\n return this.matchesFormattedNumber(numRaw, targetStr, 'startswith');\r\n }\r\n return false;\r\n case 'endswith':\r\n if (valStr.endsWith(targetStr)) return true;\r\n if (!isNaN(numRaw)) {\r\n return this.matchesFormattedNumber(numRaw, targetStr, 'endswith');\r\n }\r\n return false;\r\n case '=':\r\n if (bothDate) {\r\n if (!targetDate.hasTime) return rawDate.isoDate === targetDate.isoDate;\r\n return rawDate.exactMs === targetDate.exactMs;\r\n }\r\n if (bothNumeric) {\r\n return Math.abs(numRaw - numTarget) < 0.0001;\r\n }\r\n if (typeof rawVal === 'boolean') {\r\n if (typeof targetVal === 'boolean') return rawVal === targetVal;\r\n const bTarget = ['true', '1', 'evet', 'doğru', 'yes'].includes(targetStr);\r\n return rawVal === bTarget;\r\n }\r\n return valStr === targetStr;\r\n case '<>':\r\n if (bothDate) {\r\n if (!targetDate.hasTime) return rawDate.isoDate !== targetDate.isoDate;\r\n return rawDate.exactMs !== targetDate.exactMs;\r\n }\r\n if (bothNumeric) {\r\n return Math.abs(numRaw - numTarget) >= 0.0001;\r\n }\r\n return valStr !== targetStr;\r\n case '<':\r\n if (bothDate) {\r\n return rawDate.exactMs < (targetDate.hasTime ? targetDate.exactMs : targetDate.startOfDayMs);\r\n }\r\n if (bothNumeric) return numRaw < numTarget;\r\n return valStr < targetStr;\r\n case '<=':\r\n if (bothDate) {\r\n return rawDate.exactMs <= (targetDate.hasTime ? targetDate.exactMs : targetDate.endOfDayMs);\r\n }\r\n if (bothNumeric) return numRaw <= numTarget;\r\n return valStr <= targetStr;\r\n case '>':\r\n if (bothDate) {\r\n return rawDate.exactMs > (targetDate.hasTime ? targetDate.exactMs : targetDate.endOfDayMs);\r\n }\r\n if (bothNumeric) return numRaw > numTarget;\r\n return valStr > targetStr;\r\n case '>=':\r\n if (bothDate) {\r\n return rawDate.exactMs >= (targetDate.hasTime ? targetDate.exactMs : targetDate.startOfDayMs);\r\n }\r\n if (bothNumeric) return numRaw >= numTarget;\r\n return valStr >= targetStr;\r\n case 'between': {\r\n const [minRaw, maxRaw] = Array.isArray(targetVal) ? targetVal : [targetVal, ''];\r\n const minDate = this.parseDateParts(minRaw);\r\n const maxDate = this.parseDateParts(maxRaw);\r\n if (rawDate && (minDate || maxDate)) {\r\n if (minDate && maxDate) {\r\n const [loD, hiD] =\r\n minDate.startOfDayMs <= maxDate.startOfDayMs ? [minDate, maxDate] : [maxDate, minDate];\r\n const loMs = loD.hasTime ? loD.exactMs : loD.startOfDayMs;\r\n const hiMs = hiD.hasTime ? hiD.exactMs : hiD.endOfDayMs;\r\n return rawDate.exactMs >= loMs && rawDate.exactMs <= hiMs;\r\n }\r\n if (minDate) {\r\n const loMs = minDate.hasTime ? minDate.exactMs : minDate.startOfDayMs;\r\n return rawDate.exactMs >= loMs;\r\n }\r\n if (maxDate) {\r\n const hiMs = maxDate.hasTime ? maxDate.exactMs : maxDate.endOfDayMs;\r\n return rawDate.exactMs <= hiMs;\r\n }\r\n }\r\n const minNum = this.parseNumeric(minRaw);\r\n const maxNum = this.parseNumeric(maxRaw);\r\n if (!isNaN(numRaw) && (!isNaN(minNum) || !isNaN(maxNum))) {\r\n if (!isNaN(minNum) && !isNaN(maxNum)) {\r\n const lo = Math.min(minNum, maxNum);\r\n const hi = Math.max(minNum, maxNum);\r\n return numRaw >= lo && numRaw <= hi;\r\n }\r\n if (!isNaN(minNum)) return numRaw >= minNum;\r\n if (!isNaN(maxNum)) return numRaw <= maxNum;\r\n }\r\n const minS = String(minRaw ?? '').toLowerCase().trim();\r\n const maxS = String(maxRaw ?? '').toLowerCase().trim();\r\n if (minS && maxS) {\r\n const [loS, hiS] = minS <= maxS ? [minS, maxS] : [maxS, minS];\r\n return valStr >= loS && valStr <= hiS;\r\n }\r\n if (minS) return valStr >= minS;\r\n if (maxS) return valStr <= maxS;\r\n return true;\r\n }\r\n default:\r\n return true;\r\n }\r\n }\r\n\r\n public static buildRowSearchIndex(row: Record<string, any>): string {\r\n const parts: string[] = [];\r\n for (const k in row) {\r\n if (k.startsWith('__') || k === 'sparkline') continue;\r\n const v = row[k];\r\n if (v !== null && v !== undefined && v !== '') {\r\n parts.push(this.stringifyValue(v));\r\n if (typeof v === 'string' && v.length >= 8 && v.length <= 25) {\r\n const pd = this.parseDateParts(v);\r\n if (pd) {\r\n const dStr = String(pd.day).padStart(2, '0');\r\n const mStr = String(pd.month).padStart(2, '0');\r\n parts.push(`${dStr}.${mStr}.${pd.year}`);\r\n parts.push(`${mStr}/${dStr}/${pd.year}`);\r\n }\r\n }\r\n }\r\n }\r\n const idx = parts.join('\\x1f').toLowerCase();\r\n row.__searchIndex = idx;\r\n return idx;\r\n }\r\n\r\n public static matchSearch(row: Record<string, any>, cleanKeyword: string): boolean {\r\n if (!cleanKeyword) return true;\r\n const indexStr: string = row.__searchIndex ?? this.buildRowSearchIndex(row);\r\n return indexStr.includes(cleanKeyword);\r\n }\r\n}\r\n","import { ColumnDef, IDeferred, ValidationRule, ValidationRuleResult } from '../types/grid';\nimport { FilterEngine } from './FilterEngine';\n\nexport interface ValidationOutcome {\n valid: boolean;\n message?: string;\n isAsync?: boolean;\n}\n\n/**\n * DevExtreme-compatible Deferred class for asynchronous backend validation.\n * Supports:\n * - `d.resolve(true)` or `d.resolve()` -> Valid\n * - `d.resolve(false)` -> Invalid (displays rule.message)\n * - `d.reject(\"Custom backend error message\")` -> Invalid (displays custom message)\n * - `return d.promise()` or `return d`\n */\nexport class Deferred<T = ValidationRuleResult> implements IDeferred<T> {\n private _promise: Promise<ValidationRuleResult>;\n private _resolve!: (val: ValidationRuleResult) => void;\n\n constructor() {\n this._promise = new Promise<ValidationRuleResult>((res) => {\n this._resolve = res;\n });\n }\n\n public resolve = (result?: T): void => {\n if (result === undefined) {\n this._resolve(true);\n } else {\n this._resolve(result as unknown as ValidationRuleResult);\n }\n };\n\n public reject = (errorMessage?: string | { valid?: boolean; message?: string }): void => {\n if (typeof errorMessage === 'string' && errorMessage.trim()) {\n this._resolve({ valid: false, message: errorMessage });\n } else if (errorMessage && typeof errorMessage === 'object') {\n this._resolve({ valid: false, message: errorMessage.message });\n } else {\n this._resolve(false);\n }\n };\n\n public promise = (): Promise<ValidationRuleResult> => {\n return this._promise;\n };\n}\n\nexport function createDeferred<T = ValidationRuleResult>(): Deferred<T> {\n return new Deferred<T>();\n}\n\nconst EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\nconst URL_REGEX = /^(https?:\\/\\/)?([\\w-]+\\.)+[\\w-]{2,}(\\/\\S*)?$/i;\n\nexport class ValidationEngine {\n private static normalizeResult(\n res: ValidationRuleResult,\n fallbackMsg: string\n ): { valid: boolean; message?: string } {\n if (typeof res === 'boolean') {\n return res ? { valid: true } : { valid: false, message: fallbackMsg };\n }\n if (typeof res === 'string') {\n return res.trim() === '' ? { valid: true } : { valid: false, message: res };\n }\n if (res && typeof res === 'object') {\n return {\n valid: Boolean(res.valid),\n message: res.valid ? undefined : res.message || fallbackMsg,\n };\n }\n return { valid: true };\n }\n\n private static isEmpty(val: any): boolean {\n if (val === null || val === undefined) return true;\n if (typeof val === 'string' && val.trim() === '') return true;\n if (Array.isArray(val) && val.length === 0) return true;\n if (typeof val === 'object' && !Array.isArray(val) && Object.keys(val).length === 0) {\n return true;\n }\n return false;\n }\n\n public static async validateCell(\n value: any,\n row: Record<string, any>,\n column: ColumnDef,\n isTR: boolean = false\n ): Promise<ValidationOutcome> {\n const colTitle = column.title.replace(' ⚡', '');\n\n // 1. Evaluate declarative validationRules (static & async)\n if (column.validationRules && column.validationRules.length > 0) {\n for (const rule of column.validationRules) {\n const outcome = await this.evaluateSingleRule(rule, value, row, column, colTitle, isTR);\n if (!outcome.valid) {\n return outcome;\n }\n }\n }\n\n // 2. Evaluate column.validator callback (supports sync or async Promise)\n if (column.validator) {\n const fallbackMsg = isTR\n ? `${colTitle}: Geçersiz değer!`\n : `${colTitle}: Invalid cell value!`;\n const maybePromise = column.validator(value, row, column);\n const isAsync = maybePromise instanceof Promise;\n const resolved = isAsync ? await maybePromise : maybePromise;\n const norm = this.normalizeResult(resolved, fallbackMsg);\n if (!norm.valid) {\n return { ...norm, isAsync };\n }\n }\n\n return { valid: true };\n }\n\n private static async evaluateSingleRule(\n rule: ValidationRule,\n value: any,\n row: Record<string, any>,\n column: ColumnDef,\n colTitle: string,\n isTR: boolean\n ): Promise<ValidationOutcome> {\n switch (rule.type) {\n case 'required': {\n if (this.isEmpty(value)) {\n return {\n valid: false,\n message:\n rule.message ||\n (isTR ? `${colTitle} alanı boş bırakılamaz!` : `${colTitle} is required!`),\n };\n }\n return { valid: true };\n }\n\n case 'range': {\n if (this.isEmpty(value)) return { valid: true };\n const num = FilterEngine.parseNumeric(value);\n if (isNaN(num)) {\n return {\n valid: false,\n message:\n rule.message ||\n (isTR ? `${colTitle} geçerli bir sayı olmalıdır!` : `${colTitle} must be a number!`),\n };\n }\n if (rule.min !== undefined && num < rule.min) {\n return {\n valid: false,\n message:\n rule.message ||\n (isTR\n ? `${colTitle} en az ${rule.min.toLocaleString('tr-TR')} olmalıdır!`\n : `${colTitle} must be at least ${rule.min.toLocaleString('en-US')}!`),\n };\n }\n if (rule.max !== undefined && num > rule.max) {\n return {\n valid: false,\n message:\n rule.message ||\n (isTR\n ? `${colTitle} en fazla ${rule.max.toLocaleString('tr-TR')} olabilir!`\n : `${colTitle} cannot exceed ${rule.max.toLocaleString('en-US')}!`),\n };\n }\n return { valid: true };\n }\n\n case 'stringLength': {\n if (this.isEmpty(value)) return { valid: true };\n const len = String(value).trim().length;\n if (rule.min !== undefined && len < rule.min) {\n return {\n valid: false,\n message:\n rule.message ||\n (isTR\n ? `${colTitle} en az ${rule.min} karakter olmalıdır!`\n : `${colTitle} must be at least ${rule.min} characters!`),\n };\n }\n if (rule.max !== undefined && len > rule.max) {\n return {\n valid: false,\n message:\n rule.message ||\n (isTR\n ? `${colTitle} en fazla ${rule.max} karakter olabilir!`\n : `${colTitle} must be at most ${rule.max} characters!`),\n };\n }\n return { valid: true };\n }\n\n case 'pattern': {\n if (this.isEmpty(value)) return { valid: true };\n const regex =\n typeof rule.pattern === 'string' ? new RegExp(rule.pattern) : rule.pattern;\n if (!regex.test(String(value).trim())) {\n return {\n valid: false,\n message:\n rule.message ||\n (isTR\n ? `${colTitle} beklenen formata uymuyor!`\n : `${colTitle} does not match the required pattern!`),\n };\n }\n return { valid: true };\n }\n\n case 'email': {\n if (this.isEmpty(value)) return { valid: true };\n if (!EMAIL_REGEX.test(String(value).trim())) {\n return {\n valid: false,\n message:\n rule.message ||\n (isTR\n ? `${colTitle}: Geçerli bir e-posta adresi girin!`\n : `${colTitle}: Enter a valid email address!`),\n };\n }\n return { valid: true };\n }\n\n case 'url': {\n if (this.isEmpty(value)) return { valid: true };\n if (!URL_REGEX.test(String(value).trim())) {\n return {\n valid: false,\n message:\n rule.message ||\n (isTR\n ? `${colTitle}: Geçerli bir URL girin!`\n : `${colTitle}: Enter a valid URL!`),\n };\n }\n return { valid: true };\n }\n\n case 'compare': {\n const target = rule.comparisonTarget(row);\n const op = rule.comparisonType || '==';\n const a = FilterEngine.parseNumeric(value);\n const b = FilterEngine.parseNumeric(target);\n const useNum = !isNaN(a) && !isNaN(b);\n const left = useNum ? a : value;\n const right = useNum ? b : target;\n\n let ok = true;\n if (op === '==') ok = left === right;\n else if (op === '!=') ok = left !== right;\n else if (op === '<') ok = left < right;\n else if (op === '<=') ok = left <= right;\n else if (op === '>') ok = left > right;\n else if (op === '>=') ok = left >= right;\n\n if (!ok) {\n return {\n valid: false,\n message:\n rule.message ||\n (isTR\n ? `${colTitle} karşılaştırma kuralını sağlamıyor!`\n : `${colTitle} failed comparison validation!`),\n };\n }\n return { valid: true };\n }\n\n case 'custom': {\n const fallback =\n rule.message ||\n (isTR ? `${colTitle}: Doğrulama başarısız!` : `${colTitle}: Validation failed!`);\n const deferred = new Deferred<ValidationRuleResult>();\n const res = rule.validationCallback({ value, data: row, column, rule, deferred });\n return this.normalizeResult(res, fallback);\n }\n\n case 'async': {\n const fallback =\n rule.message ||\n (isTR\n ? `${colTitle}: Asenkron doğrulama başarısız!`\n : `${colTitle}: Async validation failed!`);\n const deferred = new Deferred<ValidationRuleResult>();\n try {\n const rawReturn = rule.validationCallback({ value, data: row, column, rule, deferred });\n let resolved: ValidationRuleResult;\n if (rawReturn && typeof (rawReturn as IDeferred).promise === 'function') {\n resolved = await (rawReturn as IDeferred).promise();\n } else if (rawReturn instanceof Promise) {\n resolved = await rawReturn;\n } else if (rawReturn === undefined) {\n // Developer used params.deferred.resolve(...) without returning\n resolved = await deferred.promise();\n } else {\n resolved = rawReturn as ValidationRuleResult;\n }\n return {\n ...this.normalizeResult(resolved, fallback),\n isAsync: true,\n };\n } catch (err: any) {\n const errMsg =\n typeof err === 'string' && err.trim()\n ? err\n : err && typeof err.message === 'string' && err.message.trim()\n ? err.message\n : fallback;\n return {\n valid: false,\n message: errMsg,\n isAsync: true,\n };\n }\n }\n\n default:\n return { valid: true };\n }\n }\n}\n","import { IColumnTypePlugin } from './IColumnTypePlugin';\n\nexport class ColumnTypeRegistry {\n private static plugins: Map<string, IColumnTypePlugin> = new Map();\n\n public static register(plugin: IColumnTypePlugin): void {\n const key = (plugin.type || '').toLowerCase();\n this.plugins.set(key, plugin);\n if (plugin.type && plugin.type !== key) {\n this.plugins.set(plugin.type, plugin);\n }\n }\n\n public static get(type: string): IColumnTypePlugin {\n const key = (type || '').toLowerCase();\n const plugin = this.plugins.get(key) || this.plugins.get(type);\n if (!plugin) {\n // Bulunamadıysa text eklentisine geri dön\n return this.plugins.get('text')!;\n }\n return plugin;\n }\n\n public static has(type: string): boolean {\n const key = (type || '').toLowerCase();\n return this.plugins.has(key) || this.plugins.has(type);\n }\n\n public static getAll(): IColumnTypePlugin[] {\n return Array.from(new Set(this.plugins.values()));\n }\n}\n","import { VirtualRow } from '../types/group';\nimport { IGridThemeTokens } from '../theme/IGridTheme';\nimport { IGridLocale } from '../i18n/IGridLocale';\nimport { ColumnDef } from '../types/grid';\nimport { FilterEngine } from '../core/FilterEngine';\n\nexport class GroupRowPainter {\n public static paintGroupRow(\n ctx: CanvasRenderingContext2D,\n groupRow: Extract<VirtualRow, { type: 'group' }>,\n y: number,\n width: number,\n height: number,\n theme: IGridThemeTokens,\n locale: IGridLocale,\n columns?: ColumnDef[],\n isHovered?: boolean\n ): void {\n ctx.save();\n\n // 1. Background\n ctx.fillStyle = isHovered\n ? theme.isDark\n ? 'rgba(56, 189, 248, 0.14)'\n : 'rgba(2, 132, 199, 0.09)'\n : theme.canvas.groupRowBg;\n ctx.fillRect(0, y, width, height);\n\n // 2. Bottom Border\n ctx.strokeStyle = theme.canvas.groupRowBorder;\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(0, y + height - 0.5);\n ctx.lineTo(width, y + height - 0.5);\n ctx.stroke();\n\n // 3. Left Accent Bar by Level\n ctx.fillStyle = theme.dom.accentColor;\n ctx.fillRect(groupRow.level * 6, y, 4, height);\n\n // 4. Interactive Expand/Collapse Button Box + Chevron (▶ / ▼)\n const indent = 16 + groupRow.level * 22;\n const midY = y + height / 2;\n const boxSize = 18;\n\n ctx.fillStyle = groupRow.isExpanded\n ? theme.dom.accentColor\n : theme.isDark\n ? 'rgba(255,255,255,0.1)'\n : 'rgba(0,0,0,0.07)';\n ctx.beginPath();\n ctx.roundRect(indent - boxSize / 2, midY - boxSize / 2, boxSize, boxSize, 4);\n ctx.fill();\n\n ctx.fillStyle = groupRow.isExpanded ? '#FFFFFF' : theme.canvas.groupRowText;\n ctx.beginPath();\n if (groupRow.isExpanded) {\n ctx.moveTo(indent - 4, midY - 2);\n ctx.lineTo(indent + 4, midY - 2);\n ctx.lineTo(indent, midY + 3);\n } else {\n ctx.moveTo(indent - 2, midY - 4);\n ctx.lineTo(indent - 2, midY + 4);\n ctx.lineTo(indent + 3, midY);\n }\n ctx.closePath();\n ctx.fill();\n\n // 5. Resolve human-readable Column Title & Value Label\n const colDef = columns?.find((c) => c.id === groupRow.field);\n const colTitle = colDef ? colDef.title.replace(' ⚡', '') : groupRow.field.toUpperCase();\n\n let displayVal = String(groupRow.value ?? locale.emptyText);\n if ((colDef?.type === 'select' || colDef?.type === 'dropdown') && colDef.options) {\n const opt = colDef.options.find((o) => o.value === groupRow.value);\n if (opt) displayVal = opt.label;\n } else if (colDef?.type === 'multiselect' && colDef.options) {\n displayVal = String(groupRow.value ?? '')\n .split(',')\n .map((s) => s.trim())\n .map((v) => colDef.options?.find((o) => o.value === v)?.label || v)\n .join(', ');\n } else if (colDef?.type === 'boolean') {\n displayVal = groupRow.value ? locale.trueText : locale.falseText;\n } else if (\n (colDef?.type === 'date' || colDef?.type === 'datetime') &&\n groupRow.value &&\n groupRow.value !== '(Blank)'\n ) {\n displayVal = FilterEngine.formatLocalizedDate(\n groupRow.value,\n locale.code,\n colDef.type === 'datetime'\n );\n }\n\n // 6. Group Header Title + Count Badge\n ctx.fillStyle = theme.canvas.groupRowText;\n ctx.font = `700 ${theme.fontSize}px ${theme.fontFamily}`;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n const title = `${colTitle}: ${displayVal}`;\n ctx.fillText(title, indent + 16, midY);\n\n const titleW = ctx.measureText(title).width;\n const countText = `${locale.groupRecordCount(groupRow.rowCount)}`;\n ctx.font = `600 ${theme.fontSize - 2}px ${theme.fontFamily}`;\n const countW = ctx.measureText(countText).width + 12;\n const badgeX = indent + 24 + titleW;\n\n ctx.fillStyle = theme.dom.badgeBg;\n ctx.beginPath();\n ctx.roundRect(badgeX, midY - 9, countW, 18, 9);\n ctx.fill();\n\n ctx.fillStyle = theme.dom.badgeText;\n ctx.textAlign = 'center';\n ctx.fillText(countText, badgeX + countW / 2, midY);\n\n // 7. Group Summaries on the right\n if (groupRow.summaries && Object.keys(groupRow.summaries).length > 0) {\n const summaryText = Object.entries(groupRow.summaries)\n .slice(0, 4)\n .map(([k, v]) => {\n const sCol = columns?.find((c) => c.id === k);\n const sTitle = sCol ? sCol.title.replace(' ⚡', '') : k;\n const sType = groupRow.summaryTypes?.[k] || 'sum';\n const numStr = Number(v).toLocaleString(locale.code, {\n maximumFractionDigits: 2,\n });\n return `${sTitle} (${sType.toUpperCase()}): ${sCol?.currencySymbol || ''}${numStr}`;\n })\n .join(' • ');\n\n ctx.fillStyle = theme.isDark ? '#98989D' : '#6E6E73';\n ctx.font = `600 ${theme.fontSize - 1}px ${theme.fontFamily}`;\n ctx.textAlign = 'right';\n ctx.fillText(summaryText, width - 24, midY);\n }\n\n ctx.restore();\n }\n}\n","import { IGridThemeTokens } from '../theme/IGridTheme';\n\nexport class SkeletonPainter {\n public static paintSkeletonCell(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n width: number,\n height: number,\n theme: IGridThemeTokens\n ): void {\n const padX = 10;\n const barH = 12;\n const barY = y + (height - barH) / 2;\n const barW = Math.max(30, width - padX * 2);\n\n ctx.save();\n ctx.fillStyle = theme.canvas.skeletonBar;\n ctx.beginPath();\n ctx.roundRect(x + padX, barY, barW, barH, 4);\n ctx.fill();\n ctx.restore();\n }\n}\n","import {\n ColumnColorConfig,\n ColumnColorPreset,\n ColumnDef,\n ColumnGroupDef,\n ThemeAwareColor,\n} from '../types/grid';\n\nexport interface ResolvedPaletteTokens {\n groupHeaderBg: string;\n groupHeaderText: string;\n groupHeaderBorder: string;\n headerBg: string;\n headerText: string;\n headerAccent: string;\n columnBg: string;\n columnText?: string;\n}\n\nexport interface DualThemePalette {\n light: ResolvedPaletteTokens;\n dark: ResolvedPaletteTokens;\n}\n\nexport interface ResolvedGroupHeaderStyle {\n headerBg?: string;\n headerText?: string;\n headerAccent?: string;\n borderColor?: string;\n groupHeaderBg?: string;\n groupHeaderText?: string;\n groupHeaderBorder?: string;\n accentColor?: string;\n}\n\nexport type ResolvedColumnGroupStyle = ResolvedGroupHeaderStyle;\n\nexport interface ResolvedColumnStyle {\n headerBg?: string;\n headerText?: string;\n headerAccent?: string;\n columnBg?: string;\n columnText?: string;\n borderColor?: string;\n}\n\nexport const COLUMN_COLOR_PRESET_LIST: Array<{\n id: ColumnColorPreset;\n labelTR: string;\n labelEN: string;\n swatch: string;\n}> = [\n { id: 'blue', labelTR: 'Mavi (Blue)', labelEN: 'Blue', swatch: '#3B82F6' },\n { id: 'indigo', labelTR: 'Çivit (Indigo)', labelEN: 'Indigo', swatch: '#6366F1' },\n { id: 'violet', labelTR: 'Menekşe (Violet)', labelEN: 'Violet', swatch: '#8B5CF6' },\n { id: 'purple', labelTR: 'Mor (Purple)', labelEN: 'Purple', swatch: '#A855F7' },\n { id: 'emerald', labelTR: 'Zümrüt (Emerald)', labelEN: 'Emerald', swatch: '#10B981' },\n { id: 'green', labelTR: 'Yeşil (Green)', labelEN: 'Green', swatch: '#22C55E' },\n { id: 'teal', labelTR: 'Turkuaz (Teal)', labelEN: 'Teal', swatch: '#14B8A6' },\n { id: 'cyan', labelTR: 'Camgöbeği (Cyan)', labelEN: 'Cyan', swatch: '#06B6D4' },\n { id: 'amber', labelTR: 'Kehribar (Amber)', labelEN: 'Amber', swatch: '#F59E0B' },\n { id: 'orange', labelTR: 'Turuncu (Orange)', labelEN: 'Orange', swatch: '#F97316' },\n { id: 'rose', labelTR: 'Gül (Rose)', labelEN: 'Rose', swatch: '#F43F5E' },\n { id: 'red', labelTR: 'Kırmızı (Red)', labelEN: 'Red', swatch: '#EF4444' },\n { id: 'slate', labelTR: 'Arduvaz (Slate)', labelEN: 'Slate', swatch: '#64748B' },\n];\n\nexport const COLUMN_COLOR_PALETTES: Record<ColumnColorPreset, DualThemePalette> = {\n blue: {\n light: {\n groupHeaderBg: '#DBEAFE',\n groupHeaderText: '#1E40AF',\n groupHeaderBorder: '#93C5FD',\n headerBg: '#EFF6FF',\n headerText: '#1D4ED8',\n headerAccent: '#2563EB',\n columnBg: 'rgba(37, 99, 235, 0.045)',\n },\n dark: {\n groupHeaderBg: 'rgba(30, 64, 175, 0.42)',\n groupHeaderText: '#93C5FD',\n groupHeaderBorder: 'rgba(59, 130, 246, 0.45)',\n headerBg: 'rgba(30, 58, 138, 0.28)',\n headerText: '#BFDBFE',\n headerAccent: '#3B82F6',\n columnBg: 'rgba(59, 130, 246, 0.065)',\n },\n },\n indigo: {\n light: {\n groupHeaderBg: '#E0E7FF',\n groupHeaderText: '#3730A3',\n groupHeaderBorder: '#A5B4FC',\n headerBg: '#EEF2FF',\n headerText: '#4338CA',\n headerAccent: '#4F46E5',\n columnBg: 'rgba(79, 70, 229, 0.045)',\n },\n dark: {\n groupHeaderBg: 'rgba(55, 48, 163, 0.42)',\n groupHeaderText: '#A5B4FC',\n groupHeaderBorder: 'rgba(99, 102, 241, 0.45)',\n headerBg: 'rgba(49, 46, 129, 0.28)',\n headerText: '#C7D2FE',\n headerAccent: '#6366F1',\n columnBg: 'rgba(99, 102, 241, 0.065)',\n },\n },\n violet: {\n light: {\n groupHeaderBg: '#EDE9FE',\n groupHeaderText: '#5B21B6',\n groupHeaderBorder: '#C4B5FD',\n headerBg: '#F5F3FF',\n headerText: '#6D28D9',\n headerAccent: '#7C3AED',\n columnBg: 'rgba(124, 58, 237, 0.045)',\n },\n dark: {\n groupHeaderBg: 'rgba(91, 33, 182, 0.42)',\n groupHeaderText: '#C4B5FD',\n groupHeaderBorder: 'rgba(139, 92, 246, 0.45)',\n headerBg: 'rgba(76, 29, 149, 0.28)',\n headerText: '#DDD6FE',\n headerAccent: '#8B5CF6',\n columnBg: 'rgba(139, 92, 246, 0.065)',\n },\n },\n purple: {\n light: {\n groupHeaderBg: '#F3E8FF',\n groupHeaderText: '#6B21A8',\n groupHeaderBorder: '#D8B4FE',\n headerBg: '#FAF5FF',\n headerText: '#7E22CE',\n headerAccent: '#9333EA',\n columnBg: 'rgba(147, 51, 234, 0.045)',\n },\n dark: {\n groupHeaderBg: 'rgba(107, 33, 168, 0.42)',\n groupHeaderText: '#D8B4FE',\n groupHeaderBorder: 'rgba(168, 85, 247, 0.45)',\n headerBg: 'rgba(88, 28, 135, 0.28)',\n headerText: '#E9D5FF',\n headerAccent: '#A855F7',\n columnBg: 'rgba(168, 85, 247, 0.065)',\n },\n },\n emerald: {\n light: {\n groupHeaderBg: '#D1FAE5',\n groupHeaderText: '#065F46',\n groupHeaderBorder: '#6EE7B7',\n headerBg: '#ECFDF5',\n headerText: '#047857',\n headerAccent: '#10B981',\n columnBg: 'rgba(16, 185, 129, 0.05)',\n },\n dark: {\n groupHeaderBg: 'rgba(6, 95, 70, 0.45)',\n groupHeaderText: '#6EE7B7',\n groupHeaderBorder: 'rgba(16, 185, 129, 0.45)',\n headerBg: 'rgba(6, 78, 59, 0.30)',\n headerText: '#A7F3D0',\n headerAccent: '#10B981',\n columnBg: 'rgba(16, 185, 129, 0.065)',\n },\n },\n green: {\n light: {\n groupHeaderBg: '#DCFCE7',\n groupHeaderText: '#166534',\n groupHeaderBorder: '#86EFAC',\n headerBg: '#F0FDF4',\n headerText: '#15803D',\n headerAccent: '#22C55E',\n columnBg: 'rgba(34, 197, 94, 0.05)',\n },\n dark: {\n groupHeaderBg: 'rgba(22, 101, 52, 0.45)',\n groupHeaderText: '#86EFAC',\n groupHeaderBorder: 'rgba(34, 197, 94, 0.45)',\n headerBg: 'rgba(20, 83, 45, 0.30)',\n headerText: '#BBF7D0',\n headerAccent: '#22C55E',\n columnBg: 'rgba(34, 197, 94, 0.065)',\n },\n },\n teal: {\n light: {\n groupHeaderBg: '#CCFBF1',\n groupHeaderText: '#115E59',\n groupHeaderBorder: '#5EEAD4',\n headerBg: '#F0FDFA',\n headerText: '#0F766E',\n headerAccent: '#14B8A6',\n columnBg: 'rgba(20, 184, 166, 0.05)',\n },\n dark: {\n groupHeaderBg: 'rgba(17, 94, 89, 0.45)',\n groupHeaderText: '#5EEAD4',\n groupHeaderBorder: 'rgba(20, 184, 166, 0.45)',\n headerBg: 'rgba(19, 78, 74, 0.30)',\n headerText: '#99F6E4',\n headerAccent: '#14B8A6',\n columnBg: 'rgba(20, 184, 166, 0.065)',\n },\n },\n cyan: {\n light: {\n groupHeaderBg: '#CFFAFE',\n groupHeaderText: '#155E75',\n groupHeaderBorder: '#67E8F9',\n headerBg: '#ECFEFF',\n headerText: '#0E7490',\n headerAccent: '#06B6D4',\n columnBg: 'rgba(6, 182, 212, 0.05)',\n },\n dark: {\n groupHeaderBg: 'rgba(21, 94, 117, 0.45)',\n groupHeaderText: '#67E8F9',\n groupHeaderBorder: 'rgba(6, 182, 212, 0.45)',\n headerBg: 'rgba(22, 78, 99, 0.30)',\n headerText: '#A5F3FC',\n headerAccent: '#06B6D4',\n columnBg: 'rgba(6, 182, 212, 0.065)',\n },\n },\n amber: {\n light: {\n groupHeaderBg: '#FEF3C7',\n groupHeaderText: '#92400E',\n groupHeaderBorder: '#FCD34D',\n headerBg: '#FFFBEB',\n headerText: '#B45309',\n headerAccent: '#F59E0B',\n columnBg: 'rgba(245, 158, 11, 0.055)',\n },\n dark: {\n groupHeaderBg: 'rgba(146, 64, 14, 0.42)',\n groupHeaderText: '#FCD34D',\n groupHeaderBorder: 'rgba(245, 158, 11, 0.45)',\n headerBg: 'rgba(120, 53, 15, 0.28)',\n headerText: '#FDE68A',\n headerAccent: '#F59E0B',\n columnBg: 'rgba(245, 158, 11, 0.065)',\n },\n },\n orange: {\n light: {\n groupHeaderBg: '#FFEDD5',\n groupHeaderText: '#9A3412',\n groupHeaderBorder: '#FDBA74',\n headerBg: '#FFF7ED',\n headerText: '#C2410C',\n headerAccent: '#F97316',\n columnBg: 'rgba(249, 115, 22, 0.05)',\n },\n dark: {\n groupHeaderBg: 'rgba(154, 52, 18, 0.42)',\n groupHeaderText: '#FDBA74',\n groupHeaderBorder: 'rgba(249, 115, 22, 0.45)',\n headerBg: 'rgba(124, 45, 18, 0.28)',\n headerText: '#FED7AA',\n headerAccent: '#F97316',\n columnBg: 'rgba(249, 115, 22, 0.065)',\n },\n },\n rose: {\n light: {\n groupHeaderBg: '#FFE4E6',\n groupHeaderText: '#9F1239',\n groupHeaderBorder: '#FDA4AF',\n headerBg: '#FFF1F2',\n headerText: '#BE123C',\n headerAccent: '#F43F5E',\n columnBg: 'rgba(244, 63, 94, 0.045)',\n },\n dark: {\n groupHeaderBg: 'rgba(159, 18, 57, 0.42)',\n groupHeaderText: '#FDA4AF',\n groupHeaderBorder: 'rgba(244, 63, 94, 0.45)',\n headerBg: 'rgba(136, 19, 55, 0.28)',\n headerText: '#FECDD3',\n headerAccent: '#F43F5E',\n columnBg: 'rgba(244, 63, 94, 0.065)',\n },\n },\n red: {\n light: {\n groupHeaderBg: '#FEE2E2',\n groupHeaderText: '#991B1B',\n groupHeaderBorder: '#FCA5A5',\n headerBg: '#FEF2F2',\n headerText: '#B91C1C',\n headerAccent: '#EF4444',\n columnBg: 'rgba(239, 68, 68, 0.045)',\n },\n dark: {\n groupHeaderBg: 'rgba(153, 27, 27, 0.42)',\n groupHeaderText: '#FCA5A5',\n groupHeaderBorder: 'rgba(239, 68, 68, 0.45)',\n headerBg: 'rgba(127, 29, 29, 0.28)',\n headerText: '#FECACA',\n headerAccent: '#EF4444',\n columnBg: 'rgba(239, 68, 68, 0.065)',\n },\n },\n slate: {\n light: {\n groupHeaderBg: '#E2E8F0',\n groupHeaderText: '#1E293B',\n groupHeaderBorder: '#94A3B8',\n headerBg: '#F1F5F9',\n headerText: '#334155',\n headerAccent: '#64748B',\n columnBg: 'rgba(100, 116, 139, 0.045)',\n },\n dark: {\n groupHeaderBg: 'rgba(51, 65, 85, 0.55)',\n groupHeaderText: '#CBD5E1',\n groupHeaderBorder: 'rgba(148, 163, 184, 0.35)',\n headerBg: 'rgba(30, 41, 59, 0.42)',\n headerText: '#E2E8F0',\n headerAccent: '#94A3B8',\n columnBg: 'rgba(148, 163, 184, 0.05)',\n },\n },\n};\n\nfunction parseHexRgb(hex: string): { r: number; g: number; b: number } | null {\n const clean = hex.trim().replace(/^#/, '');\n if (/^[0-9a-fA-F]{3}$/.test(clean)) {\n const r = parseInt(clean[0] + clean[0], 16);\n const g = parseInt(clean[1] + clean[1], 16);\n const b = parseInt(clean[2] + clean[2], 16);\n return { r, g, b };\n }\n if (/^[0-9a-fA-F]{6}$/.test(clean)) {\n const r = parseInt(clean.slice(0, 2), 16);\n const g = parseInt(clean.slice(2, 4), 16);\n const b = parseInt(clean.slice(4, 6), 16);\n return { r, g, b };\n }\n return null;\n}\n\nexport class ColumnColorEngine {\n public static isPreset(val: any): val is ColumnColorPreset {\n return typeof val === 'string' && val in COLUMN_COLOR_PALETTES;\n }\n\n public static getPresetTokens(preset: ColumnColorPreset, isDark: boolean): ResolvedPaletteTokens {\n const entry = COLUMN_COLOR_PALETTES[preset] || COLUMN_COLOR_PALETTES.blue;\n return isDark ? entry.dark : entry.light;\n }\n\n /**\n * Resolves a ThemeAwareColor for a specific role ('groupHeaderBg' | 'groupHeaderText' | 'headerBg' | 'headerText' | 'headerAccent' | 'columnBg' | 'columnText' | 'raw')\n */\n public static resolveColorValue(\n input: ThemeAwareColor | undefined,\n isDark: boolean,\n role:\n | 'groupHeaderBg'\n | 'groupHeaderText'\n | 'groupHeaderBorder'\n | 'headerBg'\n | 'headerText'\n | 'headerAccent'\n | 'columnBg'\n | 'columnText'\n | 'raw' = 'raw'\n ): string | undefined {\n if (!input) return undefined;\n\n // 1. Explicit { light, dark } pair\n if (typeof input === 'object' && ('light' in input || 'dark' in input)) {\n const picked = isDark ? input.dark || input.light : input.light || input.dark;\n if (!picked) return undefined;\n if (this.isPreset(picked)) {\n const tokens = this.getPresetTokens(picked, isDark);\n return role === 'raw' ? tokens.headerAccent : tokens[role] || tokens.headerAccent;\n }\n return picked;\n }\n\n if (typeof input !== 'string') return undefined;\n const str = input.trim();\n if (!str) return undefined;\n\n // 2. Named semantic preset ('emerald', 'blue', 'amber', etc.)\n if (this.isPreset(str)) {\n const tokens = this.getPresetTokens(str, isDark);\n return role === 'raw' ? tokens.headerAccent : tokens[role] || tokens.headerAccent;\n }\n\n // 3. Single hex color string -> auto-adapt for Dark / Light surface roles if used as background shorthand\n const rgb = parseHexRgb(str);\n if (rgb) {\n if (role === 'groupHeaderBg') {\n return isDark\n ? `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 0.34)`\n : `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 0.22)`;\n }\n if (role === 'headerBg') {\n return isDark\n ? `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 0.24)`\n : `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 0.14)`;\n }\n if (role === 'columnBg') {\n return isDark\n ? `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 0.08)`\n : `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 0.06)`;\n }\n if (role === 'groupHeaderBorder') {\n return isDark\n ? `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 0.48)`\n : `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 0.38)`;\n }\n }\n\n return str;\n }\n\n public static resolveGroupStyle(\n group: ColumnGroupDef | undefined,\n isDark: boolean\n ): ResolvedGroupHeaderStyle {\n if (!group) return {};\n const baseColor = group.style?.preset || group.color;\n const style: ColumnColorConfig | undefined = group.style;\n\n const groupHeaderBg =\n this.resolveColorValue(style?.groupHeaderBg, isDark, 'groupHeaderBg') ||\n this.resolveColorValue(style?.headerBg, isDark, 'groupHeaderBg') ||\n this.resolveColorValue(group.headerColor, isDark, 'groupHeaderBg') ||\n this.resolveColorValue(baseColor, isDark, 'groupHeaderBg');\n\n const groupHeaderText =\n this.resolveColorValue(style?.groupHeaderText, isDark, 'groupHeaderText') ||\n this.resolveColorValue(style?.headerText, isDark, 'groupHeaderText') ||\n this.resolveColorValue(group.headerTextColor, isDark, 'groupHeaderText') ||\n (baseColor && this.isPreset(baseColor)\n ? this.getPresetTokens(baseColor, isDark).groupHeaderText\n : undefined);\n\n const groupHeaderBorder =\n this.resolveColorValue(style?.borderColor, isDark, 'groupHeaderBorder') ||\n this.resolveColorValue(baseColor, isDark, 'groupHeaderBorder');\n\n const accentColor =\n this.resolveColorValue(style?.headerAccent, isDark, 'headerAccent') ||\n this.resolveColorValue(baseColor, isDark, 'headerAccent') ||\n this.resolveColorValue(group.headerColor, isDark, 'headerAccent');\n\n return {\n headerBg: groupHeaderBg,\n headerText: groupHeaderText,\n headerAccent: accentColor,\n borderColor: groupHeaderBorder,\n groupHeaderBg,\n groupHeaderText,\n groupHeaderBorder,\n accentColor,\n };\n }\n\n public static resolveColumnStyle(\n col: ColumnDef,\n group: ColumnGroupDef | undefined,\n isDark: boolean\n ): ResolvedColumnStyle {\n const inheritGroup = group && group.inheritColumnColors !== false;\n const groupBaseColor = inheritGroup ? group.style?.preset || group.color : undefined;\n const colBaseColor = col.style?.preset || col.color;\n const effectiveBase = colBaseColor || groupBaseColor;\n\n // 1. Header Background\n const headerBg =\n this.resolveColorValue(col.style?.headerBg, isDark, 'headerBg') ||\n this.resolveColorValue(col.headerColor, isDark, 'headerBg') ||\n this.resolveColorValue(colBaseColor, isDark, 'headerBg') ||\n (inheritGroup\n ? this.resolveColorValue(group.style?.headerBg, isDark, 'headerBg') ||\n this.resolveColorValue(group.headerColor, isDark, 'headerBg') ||\n this.resolveColorValue(groupBaseColor, isDark, 'headerBg')\n : undefined);\n\n // 2. Header Text\n const headerText =\n this.resolveColorValue(col.style?.headerText, isDark, 'headerText') ||\n this.resolveColorValue(col.headerTextColor, isDark, 'headerText') ||\n (colBaseColor && this.isPreset(colBaseColor)\n ? this.getPresetTokens(colBaseColor, isDark).headerText\n : undefined) ||\n (inheritGroup\n ? this.resolveColorValue(group.style?.headerText, isDark, 'headerText') ||\n (groupBaseColor && this.isPreset(groupBaseColor)\n ? this.getPresetTokens(groupBaseColor, isDark).headerText\n : undefined)\n : undefined);\n\n // 3. Header Accent Line\n const headerAccent =\n this.resolveColorValue(col.style?.headerAccent, isDark, 'headerAccent') ||\n this.resolveColorValue(colBaseColor, isDark, 'headerAccent') ||\n this.resolveColorValue(col.headerColor, isDark, 'headerAccent') ||\n (inheritGroup\n ? this.resolveColorValue(group.style?.headerAccent, isDark, 'headerAccent') ||\n this.resolveColorValue(groupBaseColor, isDark, 'headerAccent')\n : undefined);\n\n // 4. Column Cell Background Tint\n const columnBg =\n this.resolveColorValue(col.style?.columnBg, isDark, 'columnBg') ||\n this.resolveColorValue(col.columnColor, isDark, 'columnBg') ||\n this.resolveColorValue(colBaseColor, isDark, 'columnBg') ||\n (inheritGroup\n ? this.resolveColorValue(group.style?.columnBg, isDark, 'columnBg') ||\n this.resolveColorValue(group.columnColor, isDark, 'columnBg') ||\n this.resolveColorValue(groupBaseColor, isDark, 'columnBg')\n : undefined);\n\n // 5. Column Cell Text Color\n const columnText =\n this.resolveColorValue(col.style?.columnText, isDark, 'columnText') ||\n this.resolveColorValue(col.columnTextColor, isDark, 'columnText') ||\n (inheritGroup\n ? this.resolveColorValue(group.style?.columnText, isDark, 'columnText')\n : undefined) ||\n (effectiveBase && this.isPreset(effectiveBase)\n ? this.getPresetTokens(effectiveBase, isDark).columnText\n : undefined);\n\n // 6. Optional Column Header Border Color\n const borderColor =\n this.resolveColorValue(col.style?.borderColor, isDark, 'groupHeaderBorder') ||\n (inheritGroup\n ? this.resolveColorValue(group.style?.borderColor, isDark, 'groupHeaderBorder')\n : undefined);\n\n return {\n headerBg,\n headerText,\n headerAccent,\n columnBg,\n columnText,\n borderColor,\n };\n }\n}\n","import { GeometryEngine } from '../core/GeometryEngine';\r\nimport { SelectionModel } from '../core/SelectionModel';\r\nimport { IDataStore } from '../types/store';\r\nimport { IGridThemeTokens } from '../theme/IGridTheme';\r\nimport { ColumnTypeRegistry } from '../columns/ColumnTypeRegistry';\r\nimport { GroupRowPainter } from './GroupRowPainter';\r\nimport { SkeletonPainter } from './SkeletonPainter';\r\nimport { SortDescriptor } from '../types/filter';\r\nimport { IGridLocale } from '../i18n/IGridLocale';\r\nimport { ColumnDef, ColumnGroupDef, GridPermissions, RowSelectionMode } from '../types/grid';\r\nimport {\r\n ColumnColorEngine,\r\n ResolvedColumnStyle,\r\n ResolvedGroupHeaderStyle,\r\n} from '../theme/ColumnColorEngine';\r\n\r\nexport interface RenderParams {\r\n canvas: HTMLCanvasElement;\r\n geometry: GeometryEngine;\r\n store: IDataStore;\r\n selection: SelectionModel;\r\n theme: IGridThemeTokens;\r\n locale: IGridLocale;\r\n scrollLeft: number;\r\n scrollTop: number;\r\n sortRules: SortDescriptor[];\r\n searchKeyword?: string;\r\n hoveredCell?: { row: number; col: number } | null;\r\n hoveredFilterColIndex?: number | null;\r\n activeFilterColumnIds?: Set<string>;\r\n fillDragRange?: { minRow: number; maxRow: number; minCol: number; maxCol: number } | null;\r\n loadingRowKeys?: Set<any>;\r\n permissions?: GridPermissions;\r\n selectionMode?: RowSelectionMode;\r\n selectedRowKeys?: Set<any>;\r\n}\r\n\r\nexport class CanvasRenderer {\r\n public static isColumnReadonly(col: ColumnDef, permissions?: GridPermissions): boolean {\r\n if (permissions?.mode === 'read' || permissions?.mode === 'readonly') return true;\r\n if (permissions?.allowUpdating === false) return true;\r\n if (col.readonly || col.permission === 'readonly' || col.permission === 'read') return true;\r\n return false;\r\n }\r\n\r\n public static render(params: RenderParams): void {\r\n const {\r\n canvas,\r\n geometry,\r\n store,\r\n selection,\r\n theme,\r\n locale,\r\n scrollLeft,\r\n scrollTop,\r\n sortRules,\r\n searchKeyword,\r\n hoveredCell,\r\n hoveredFilterColIndex,\r\n activeFilterColumnIds,\r\n fillDragRange,\r\n loadingRowKeys,\r\n permissions,\r\n selectionMode = 'none',\r\n selectedRowKeys,\r\n } = params;\r\n\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) return;\r\n\r\n const dpr = typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 1;\r\n const rect = canvas.getBoundingClientRect();\r\n const width = Math.round(rect.width) || canvas.clientWidth || 0;\r\n const height = Math.round(rect.height) || canvas.clientHeight || 0;\r\n\r\n if (width <= 0 || height <= 0) return;\r\n\r\n const targetPixelWidth = Math.round(width * dpr);\r\n const targetPixelHeight = Math.round(height * dpr);\r\n\r\n if (canvas.width !== targetPixelWidth || canvas.height !== targetPixelHeight) {\r\n canvas.width = targetPixelWidth;\r\n canvas.height = targetPixelHeight;\r\n }\r\n\r\n ctx.setTransform(1, 0, 0, 1, 0, 0);\r\n ctx.save();\r\n ctx.scale(dpr, dpr);\r\n\r\n try {\r\n // 1. Background Fill\r\n ctx.fillStyle = theme.canvas.bg;\r\n ctx.fillRect(0, 0, width, height);\r\n\r\n const rowCount = store.getRowCount();\r\n const rowH = geometry.rowHeight;\r\n const headerH = geometry.headerHeight;\r\n const rowNumW = geometry.rowNumberWidth;\r\n\r\n // 2. Viewport Row Bounds\r\n const startRow = Math.max(0, Math.floor(scrollTop / rowH));\r\n const endRow = Math.min(rowCount - 1, Math.ceil((scrollTop + height - headerH) / rowH));\r\n\r\n if (rowCount > 0 && endRow >= startRow) {\r\n store.ensureRange(startRow, endRow);\r\n } else if (rowCount === 0 && store.isRemote()) {\r\n store.ensureRange(0, Math.max(0, Math.ceil((height - headerH) / rowH)));\r\n }\r\n\r\n // 3. Viewport Scrollable Column Bounds\r\n let startScrollColIdx = 0;\r\n let endScrollColIdx = geometry.scrollableColumns.length - 1;\r\n\r\n if (geometry.scrollableColumns.length > 0) {\r\n startScrollColIdx = geometry.findScrollableColIndexAtX(scrollLeft);\r\n endScrollColIdx = geometry.findScrollableColIndexAtX(\r\n scrollLeft + Math.max(0, width - geometry.totalFrozenWidth)\r\n );\r\n }\r\n\r\n const normSel = selection.getNormalizedRange();\r\n\r\n // ========================================================================\r\n // DATA ROWS & CELLS\r\n // ========================================================================\r\n for (let r = startRow; r <= endRow; r++) {\r\n const rowY = headerH + r * rowH - scrollTop;\r\n const vRow = store.getViewRow(r);\r\n\r\n if (!vRow) {\r\n SkeletonPainter.paintSkeletonCell(ctx, rowNumW, rowY, width - rowNumW, rowH, theme);\r\n continue;\r\n }\r\n\r\n if (vRow.type === 'group') {\r\n GroupRowPainter.paintGroupRow(\r\n ctx,\r\n vRow,\r\n rowY,\r\n width,\r\n rowH,\r\n theme,\r\n locale,\r\n geometry.columns,\r\n hoveredCell?.row === r\r\n );\r\n continue;\r\n }\r\n\r\n const rowData = vRow.data;\r\n const rowKey = rowData.id ?? r;\r\n const isRowInserted = store.isRowInserted?.(rowKey) ?? false;\r\n const isRowLoading = loadingRowKeys?.has(rowKey) ?? false;\r\n const isRowInActiveSel = r >= normSel.minRow && r <= normSel.maxRow;\r\n\r\n // 1. SCROLLABLE COLUMNS\r\n ctx.save();\r\n ctx.beginPath();\r\n ctx.rect(\r\n geometry.totalFrozenWidth,\r\n headerH,\r\n Math.max(0, width - geometry.totalFrozenWidth),\r\n Math.max(0, height - headerH)\r\n );\r\n ctx.clip();\r\n\r\n for (let sc = startScrollColIdx; sc <= endScrollColIdx; sc++) {\r\n const colIdx = geometry.frozenColumns.length + sc;\r\n const col = geometry.columns[colIdx];\r\n if (!col) continue;\r\n\r\n const cellX = geometry.totalFrozenWidth + geometry.scrollableColOffsets[sc] - scrollLeft;\r\n const colStyle = ColumnColorEngine.resolveColumnStyle(\r\n col,\r\n geometry.getColumnGroup(col),\r\n theme.isDark\r\n );\r\n this.renderCell(\r\n ctx,\r\n rowData,\r\n rowKey,\r\n r,\r\n col,\r\n colIdx,\r\n cellX,\r\n rowY,\r\n col.width,\r\n rowH,\r\n theme,\r\n locale,\r\n selection,\r\n store,\r\n hoveredCell,\r\n searchKeyword,\r\n isRowInserted,\r\n isRowLoading,\r\n permissions,\r\n selectionMode,\r\n selectedRowKeys,\r\n colStyle\r\n );\r\n }\r\n ctx.restore();\r\n\r\n // 2. FROZEN COLUMNS\r\n let curFrozenX = rowNumW;\r\n for (let fc = 0; fc < geometry.frozenColumns.length; fc++) {\r\n const col = geometry.frozenColumns[fc];\r\n ctx.fillStyle = theme.canvas.bg;\r\n ctx.fillRect(curFrozenX, rowY, col.width, rowH);\r\n\r\n const colStyle = ColumnColorEngine.resolveColumnStyle(\r\n col,\r\n geometry.getColumnGroup(col),\r\n theme.isDark\r\n );\r\n this.renderCell(\r\n ctx,\r\n rowData,\r\n rowKey,\r\n r,\r\n col,\r\n fc,\r\n curFrozenX,\r\n rowY,\r\n col.width,\r\n rowH,\r\n theme,\r\n locale,\r\n selection,\r\n store,\r\n hoveredCell,\r\n searchKeyword,\r\n isRowInserted,\r\n isRowLoading,\r\n permissions,\r\n selectionMode,\r\n selectedRowKeys,\r\n colStyle\r\n );\r\n\r\n curFrozenX += col.width;\r\n }\r\n\r\n // 3. ROW NUMBER GUTTER (Leftmost)\r\n ctx.fillStyle = isRowInActiveSel\r\n ? theme.isDark\r\n ? 'rgba(10, 132, 255, 0.22)'\r\n : 'rgba(0, 122, 255, 0.12)'\r\n : theme.canvas.rowNumberBg;\r\n ctx.fillRect(0, rowY, rowNumW, rowH);\r\n\r\n // Inserted row left indicator bar\r\n if (isRowInserted) {\r\n ctx.fillStyle = '#30D158';\r\n ctx.fillRect(0, rowY, 4, rowH);\r\n } else if (isRowLoading) {\r\n ctx.fillStyle = '#FF9F0A';\r\n ctx.fillRect(0, rowY, 4, rowH);\r\n }\r\n\r\n ctx.fillStyle = isRowInActiveSel ? theme.dom.accentColor : theme.canvas.rowNumberText;\r\n ctx.font = `${isRowInActiveSel ? '700' : '500'} ${theme.fontSize - 1}px ${theme.fontFamily}`;\r\n ctx.textAlign = 'center';\r\n ctx.textBaseline = 'middle';\r\n ctx.fillText(isRowLoading ? '⟳' : String(r + 1), rowNumW / 2, rowY + rowH / 2);\r\n\r\n // Row number border\r\n ctx.strokeStyle = theme.canvas.rowNumberBorder;\r\n ctx.beginPath();\r\n ctx.moveTo(rowNumW - 0.5, rowY);\r\n ctx.lineTo(rowNumW - 0.5, rowY + rowH);\r\n ctx.moveTo(0, rowY + rowH - 0.5);\r\n ctx.lineTo(rowNumW, rowY + rowH - 0.5);\r\n ctx.stroke();\r\n }\r\n\r\n // Frozen column divider shadow\r\n if (geometry.frozenColumns.length > 0) {\r\n ctx.save();\r\n ctx.fillStyle = theme.canvas.frozenDividerShadow;\r\n ctx.fillRect(geometry.totalFrozenWidth, headerH, 3, height - headerH);\r\n ctx.restore();\r\n }\r\n\r\n // ========================================================================\r\n // FILL HANDLE DRAG PREVIEW RECTANGLE (Excel AutoFill Dashed Box)\r\n // ========================================================================\r\n if (fillDragRange && rowCount > 0) {\r\n const fTopY = headerH + fillDragRange.minRow * rowH - scrollTop;\r\n const fHeight = (fillDragRange.maxRow - fillDragRange.minRow + 1) * rowH;\r\n const fLeftRect = geometry.getColumnScreenRect(fillDragRange.minCol, scrollLeft);\r\n const fRightRect = geometry.getColumnScreenRect(fillDragRange.maxCol, scrollLeft);\r\n\r\n if (fLeftRect && fRightRect) {\r\n const fLeftX = fLeftRect.x;\r\n const fWidth = fRightRect.x + fRightRect.width - fLeftRect.x;\r\n\r\n ctx.save();\r\n ctx.beginPath();\r\n ctx.rect(rowNumW, headerH, width - rowNumW, height - headerH);\r\n ctx.clip();\r\n\r\n ctx.fillStyle = theme.isDark ? 'rgba(48, 209, 88, 0.14)' : 'rgba(52, 199, 89, 0.12)';\r\n ctx.fillRect(fLeftX, fTopY, fWidth, fHeight);\r\n\r\n ctx.strokeStyle = theme.isDark ? '#30D158' : '#28CD41';\r\n ctx.lineWidth = 2;\r\n ctx.setLineDash([5, 3]);\r\n ctx.strokeRect(fLeftX, fTopY, fWidth, fHeight);\r\n ctx.restore();\r\n }\r\n }\r\n\r\n // ========================================================================\r\n // SELECTION HIGHLIGHT, CORNER FILL HANDLE & RIGHT DUPLICATE HANDLE\r\n // ========================================================================\r\n const activeViewRowForSel = store.getViewRow(normSel.minRow);\r\n const isSingleGroupRowSelected =\r\n normSel.minRow === normSel.maxRow && activeViewRowForSel?.type === 'group';\r\n\r\n if (\r\n !isSingleGroupRowSelected &&\r\n rowCount > 0 &&\r\n normSel.minRow <= endRow &&\r\n normSel.maxRow >= startRow\r\n ) {\r\n const rTopY = headerH + normSel.minRow * rowH - scrollTop;\r\n const rHeight = (normSel.maxRow - normSel.minRow + 1) * rowH;\r\n\r\n const leftColRect = geometry.getColumnScreenRect(normSel.minCol, scrollLeft);\r\n const rightColRect = geometry.getColumnScreenRect(normSel.maxCol, scrollLeft);\r\n\r\n if (leftColRect && rightColRect) {\r\n const rLeftX = leftColRect.x;\r\n const rWidth = rightColRect.x + rightColRect.width - leftColRect.x;\r\n\r\n ctx.save();\r\n ctx.beginPath();\r\n ctx.rect(rowNumW, headerH, width - rowNumW, height - headerH);\r\n ctx.clip();\r\n\r\n // Selection translucent fill\r\n ctx.fillStyle = theme.canvas.selectionFill;\r\n ctx.fillRect(rLeftX, rTopY, rWidth, rHeight);\r\n\r\n // Selection border\r\n ctx.strokeStyle = theme.canvas.selectionBorder;\r\n ctx.lineWidth = 2;\r\n ctx.strokeRect(rLeftX, rTopY, rWidth, rHeight);\r\n\r\n const activeColDef = geometry.columns[normSel.maxCol];\r\n const activeColType = (activeColDef?.type || '').toLowerCase();\r\n const isSpecialNonDuplicatable =\r\n !activeColDef ||\r\n activeColType === 'sparkline' ||\r\n activeColType === 'action' ||\r\n activeColType === 'pdf' ||\r\n this.isColumnReadonly(activeColDef, permissions);\r\n\r\n const canDuplicate =\r\n !isSpecialNonDuplicatable &&\r\n permissions?.mode !== 'read' &&\r\n permissions?.mode !== 'readonly' &&\r\n permissions?.allowUpdating !== false &&\r\n permissions?.allowDuplicating !== false;\r\n\r\n if (canDuplicate) {\r\n // 1. Bottom-Right Corner Fill Handle (Excel Square)\r\n const fhSize = 8;\r\n const fhX = rLeftX + rWidth - fhSize / 2;\r\n const fhY = rTopY + rHeight - fhSize / 2;\r\n ctx.fillStyle = theme.canvas.fillHandleColor;\r\n ctx.fillRect(fhX, fhY, fhSize, fhSize);\r\n ctx.strokeStyle = theme.canvas.bg;\r\n ctx.lineWidth = 1.5;\r\n ctx.strokeRect(fhX, fhY, fhSize, fhSize);\r\n\r\n // 2. Right-Side Quick Cell Duplicate Handle (\"+\" pill on right edge)\r\n const dupSize = 14;\r\n const dupX = rLeftX + rWidth - dupSize / 2;\r\n const dupY = rTopY + rHeight / 2 - dupSize / 2;\r\n\r\n ctx.fillStyle = theme.dom.accentColor;\r\n ctx.beginPath();\r\n ctx.roundRect(dupX, dupY, dupSize, dupSize, 4);\r\n ctx.fill();\r\n\r\n ctx.strokeStyle = theme.canvas.bg;\r\n ctx.lineWidth = 1.2;\r\n ctx.stroke();\r\n\r\n // Draw tiny '+' inside the right duplicate handle\r\n const cx = dupX + dupSize / 2;\r\n const cy = dupY + dupSize / 2;\r\n ctx.strokeStyle = '#FFFFFF';\r\n ctx.lineWidth = 1.5;\r\n ctx.beginPath();\r\n ctx.moveTo(cx - 3, cy);\r\n ctx.lineTo(cx + 3, cy);\r\n ctx.moveTo(cx, cy - 3);\r\n ctx.lineTo(cx, cy + 3);\r\n ctx.stroke();\r\n }\r\n\r\n ctx.restore();\r\n }\r\n }\r\n\r\n // ========================================================================\r\n // EMPTY STATE (WHEN ROW COUNT === 0)\r\n // ========================================================================\r\n if (rowCount === 0) {\r\n const isTR = locale.code.startsWith('tr');\r\n // Draw subtle faint grid lines in background\r\n ctx.strokeStyle = theme.canvas.gridLine;\r\n ctx.lineWidth = 1;\r\n const maxEmptyRows = Math.floor((height - headerH) / rowH);\r\n for (let er = 1; er <= maxEmptyRows; er++) {\r\n const ey = headerH + er * rowH - 0.5;\r\n ctx.beginPath();\r\n ctx.moveTo(0, ey);\r\n ctx.lineTo(width, ey);\r\n ctx.stroke();\r\n }\r\n\r\n // Draw Empty State Card in center of viewport\r\n const cardW = Math.min(440, width - 40);\r\n const cardH = 110;\r\n const cardX = Math.max(20, (width - cardW) / 2);\r\n const cardY = Math.max(headerH + 20, headerH + (height - headerH - cardH) / 2);\r\n\r\n ctx.save();\r\n ctx.fillStyle = theme.isDark ? 'rgba(17, 24, 39, 0.92)' : 'rgba(255, 255, 255, 0.95)';\r\n ctx.strokeStyle = theme.canvas.headerBorder;\r\n ctx.lineWidth = 1;\r\n ctx.beginPath();\r\n ctx.roundRect(cardX, cardY, cardW, cardH, 12);\r\n ctx.fill();\r\n ctx.stroke();\r\n\r\n ctx.fillStyle = theme.dom.accentColor;\r\n ctx.font = `700 14px ${theme.fontFamily}`;\r\n ctx.textAlign = 'center';\r\n ctx.textBaseline = 'middle';\r\n ctx.fillText(\r\n isTR ? 'Tabloda Görüntülenecek Veri Bulunmuyor (0 Satır)' : 'No Records to Display (0 Rows)',\r\n cardX + cardW / 2,\r\n cardY + 38\r\n );\r\n\r\n ctx.fillStyle = theme.canvas.rowNumberText;\r\n ctx.font = `500 12px ${theme.fontFamily}`;\r\n ctx.fillText(\r\n isTR\r\n ? \"Yeni kayıt oluşturmak için üstteki '+ Satır Ekle' butonunu veya Sihirbazı kullanın.\"\r\n : \"Click '+ Add Row' in the toolbar or use the Studio Wizard to populate records.\",\r\n cardX + cardW / 2,\r\n cardY + 68\r\n );\r\n ctx.restore();\r\n }\r\n\r\n // ========================================================================\r\n // COLUMN HEADERS (FIXED AT TOP)\r\n // ========================================================================\r\n this.renderHeaders(\r\n ctx,\r\n geometry,\r\n store,\r\n theme,\r\n scrollLeft,\r\n width,\r\n headerH,\r\n rowNumW,\r\n sortRules,\r\n normSel,\r\n hoveredFilterColIndex,\r\n activeFilterColumnIds,\r\n permissions,\r\n selectionMode,\r\n selectedRowKeys\r\n );\r\n } finally {\r\n ctx.restore();\r\n }\r\n }\r\n\r\n private static renderCell(\r\n ctx: CanvasRenderingContext2D,\r\n rowData: Record<string, any>,\r\n rowKey: any,\r\n rowIndex: number,\r\n col: ColumnDef,\r\n colIdx: number,\r\n cellX: number,\r\n rowY: number,\r\n colW: number,\r\n rowH: number,\r\n theme: IGridThemeTokens,\r\n locale: IGridLocale,\r\n selection: SelectionModel,\r\n store: IDataStore,\r\n hoveredCell?: { row: number; col: number } | null,\r\n searchKeyword?: string,\r\n isRowInserted?: boolean,\r\n isRowLoading?: boolean,\r\n permissions?: GridPermissions,\r\n selectionMode: RowSelectionMode = 'none',\r\n selectedRowKeys?: Set<any>,\r\n colStyle?: ResolvedColumnStyle\r\n ): void {\r\n const cellVal = typeof rowData[col.id] === 'function' ? undefined : rowData[col.id];\r\n const isHovered = hoveredCell?.row === rowIndex && hoveredCell?.col === colIdx;\r\n const isRowSelectedByCheck = selectedRowKeys?.has(rowKey) ?? false;\r\n const isReadonly =\r\n this.isColumnReadonly(col, permissions) ||\r\n (col.canEdit ? !col.canEdit(rowData, col) : false);\r\n const isDirty = store.isCellDirty?.(rowKey, col.id) ?? false;\r\n const isColDirty = store.isColumnDirty?.(col.id) ?? false;\r\n\r\n // Theme-aware column cell background (from column or parent group)\r\n if (col.id !== '__selection__' && colStyle?.columnBg) {\r\n ctx.fillStyle = colStyle.columnBg;\r\n ctx.fillRect(cellX, rowY, colW, rowH);\r\n }\r\n\r\n // Row selection tint when selected via Single / Multiple Choice\r\n if (isRowSelectedByCheck) {\r\n ctx.fillStyle = theme.isDark ? 'rgba(56, 189, 248, 0.14)' : 'rgba(2, 132, 199, 0.10)';\r\n ctx.fillRect(cellX, rowY, colW, rowH);\r\n }\r\n\r\n // Synthetic Row Selection Column ('__selection__')\r\n if (col.id === '__selection__') {\r\n const cx = cellX + colW / 2;\r\n const cy = rowY + rowH / 2;\r\n ctx.save();\r\n if (selectionMode === 'single') {\r\n const radius = 7.5;\r\n ctx.beginPath();\r\n ctx.arc(cx, cy, radius, 0, Math.PI * 2);\r\n ctx.fillStyle = isRowSelectedByCheck\r\n ? theme.isDark\r\n ? 'rgba(56, 189, 248, 0.2)'\r\n : 'rgba(2, 132, 199, 0.15)'\r\n : theme.dom.inputBg;\r\n ctx.fill();\r\n ctx.lineWidth = 1.6;\r\n ctx.strokeStyle = isRowSelectedByCheck ? theme.dom.accentColor : theme.canvas.headerBorder;\r\n ctx.stroke();\r\n\r\n if (isRowSelectedByCheck) {\r\n ctx.beginPath();\r\n ctx.arc(cx, cy, 4, 0, Math.PI * 2);\r\n ctx.fillStyle = theme.dom.accentColor;\r\n ctx.fill();\r\n }\r\n } else {\r\n const boxSize = 15;\r\n const bx = cx - boxSize / 2;\r\n const by = cy - boxSize / 2;\r\n ctx.beginPath();\r\n ctx.roundRect(bx, by, boxSize, boxSize, 4);\r\n if (isRowSelectedByCheck) {\r\n ctx.fillStyle = theme.dom.accentColor;\r\n ctx.fill();\r\n ctx.strokeStyle = '#FFFFFF';\r\n ctx.lineWidth = 2;\r\n ctx.beginPath();\r\n ctx.moveTo(bx + 3.5, cy);\r\n ctx.lineTo(bx + 6.5, cy + 3);\r\n ctx.lineTo(bx + 11.5, cy - 3);\r\n ctx.stroke();\r\n } else {\r\n ctx.fillStyle = theme.dom.inputBg;\r\n ctx.fill();\r\n ctx.strokeStyle = isHovered ? theme.dom.accentColor : theme.canvas.headerBorder;\r\n ctx.lineWidth = 1.4;\r\n ctx.stroke();\r\n }\r\n }\r\n ctx.restore();\r\n\r\n // Cell Grid Lines\r\n ctx.strokeStyle = theme.canvas.gridLine;\r\n ctx.lineWidth = 1;\r\n ctx.beginPath();\r\n ctx.moveTo(cellX + colW - 0.5, rowY);\r\n ctx.lineTo(cellX + colW - 0.5, rowY + rowH);\r\n ctx.moveTo(cellX, rowY + rowH - 0.5);\r\n ctx.lineTo(cellX + colW, rowY + rowH - 0.5);\r\n ctx.stroke();\r\n return;\r\n }\r\n\r\n // DevExtreme-style background for dirty cells (dx-cell-modified), dirty columns, inserted rows, loading, or readonly\r\n if (isRowLoading) {\r\n ctx.fillStyle = theme.isDark ? 'rgba(255, 159, 10, 0.14)' : 'rgba(255, 149, 0, 0.10)';\r\n ctx.fillRect(cellX, rowY, colW, rowH);\r\n } else if (isDirty) {\r\n // DevExtreme dx-cell-modified distinct green highlight\r\n ctx.fillStyle = theme.isDark ? 'rgba(34, 197, 94, 0.22)' : 'rgba(22, 163, 74, 0.15)';\r\n ctx.fillRect(cellX, rowY, colW, rowH);\r\n } else if (isRowInserted) {\r\n // DevExtreme dx-row-inserted highlight\r\n ctx.fillStyle = theme.isDark ? 'rgba(48, 209, 88, 0.10)' : 'rgba(52, 199, 89, 0.08)';\r\n ctx.fillRect(cellX, rowY, colW, rowH);\r\n } else if (isColDirty) {\r\n // Subtle column-wide tint when this column has uncommitted modifications\r\n ctx.fillStyle = theme.isDark ? 'rgba(34, 197, 94, 0.05)' : 'rgba(22, 163, 74, 0.04)';\r\n ctx.fillRect(cellX, rowY, colW, rowH);\r\n } else if (isReadonly && col.type !== 'action' && col.type !== 'sparkline') {\r\n ctx.fillStyle = theme.isDark ? 'rgba(255, 255, 255, 0.018)' : 'rgba(0, 0, 0, 0.018)';\r\n ctx.fillRect(cellX, rowY, colW, rowH);\r\n }\r\n\r\n // Search keyword highlight\r\n if (\r\n searchKeyword &&\r\n cellVal != null &&\r\n String(cellVal).toLowerCase().includes(searchKeyword.toLowerCase())\r\n ) {\r\n ctx.fillStyle = theme.canvas.searchHighlight;\r\n ctx.fillRect(cellX, rowY, colW, rowH);\r\n }\r\n\r\n // Column type plugin paint (with optional theme-aware columnText override)\r\n const effectiveTheme = colStyle?.columnText\r\n ? {\r\n ...theme,\r\n canvas: {\r\n ...theme.canvas,\r\n cellText: colStyle.columnText,\r\n },\r\n }\r\n : theme;\r\n const plugin = ColumnTypeRegistry.get(col.type);\r\n plugin.paint({\r\n ctx,\r\n value: cellVal,\r\n row: rowData,\r\n rowIndex,\r\n column: col,\r\n theme: effectiveTheme,\r\n locale,\r\n x: cellX,\r\n y: rowY,\r\n width: colW,\r\n height: rowH,\r\n isSelected: selection.isCellSelected(rowIndex, colIdx),\r\n isHovered,\r\n isReadonly,\r\n isDirty,\r\n });\r\n\r\n // DevExtreme dx-cell-modified Crisp Green Cell Border + Top-Right Triangle Indicator\r\n if (isDirty) {\r\n ctx.save();\r\n const dirtyStroke = theme.isDark ? '#22C55E' : '#16A34A';\r\n ctx.strokeStyle = dirtyStroke;\r\n ctx.lineWidth = 1.5;\r\n ctx.strokeRect(cellX + 0.75, rowY + 0.75, colW - 1.5, rowH - 1.5);\r\n\r\n ctx.fillStyle = dirtyStroke;\r\n ctx.beginPath();\r\n ctx.moveTo(cellX + colW - 8, rowY);\r\n ctx.lineTo(cellX + colW, rowY);\r\n ctx.lineTo(cellX + colW, rowY + 8);\r\n ctx.closePath();\r\n ctx.fill();\r\n ctx.restore();\r\n }\r\n\r\n // Cell Grid Lines\r\n ctx.strokeStyle = theme.canvas.gridLine;\r\n ctx.lineWidth = 1;\r\n ctx.beginPath();\r\n ctx.moveTo(cellX + colW - 0.5, rowY);\r\n ctx.lineTo(cellX + colW - 0.5, rowY + rowH);\r\n ctx.moveTo(cellX, rowY + rowH - 0.5);\r\n ctx.lineTo(cellX + colW, rowY + rowH - 0.5);\r\n ctx.stroke();\r\n }\r\n\r\n private static renderHeaders(\r\n ctx: CanvasRenderingContext2D,\r\n geometry: GeometryEngine,\r\n store: IDataStore,\r\n theme: IGridThemeTokens,\r\n scrollLeft: number,\r\n width: number,\r\n headerH: number,\r\n rowNumW: number,\r\n sortRules: SortDescriptor[],\r\n normSel: { minRow: number; maxRow: number; minCol: number; maxCol: number },\r\n hoveredFilterColIndex?: number | null,\r\n activeFilterColumnIds?: Set<string>,\r\n permissions?: GridPermissions,\r\n selectionMode: RowSelectionMode = 'none',\r\n selectedRowKeys?: Set<any>\r\n ): void {\r\n const rowCount = store.getRowCount();\r\n const hasGroups = geometry.hasColumnGroups;\r\n const groupH = hasGroups ? geometry.groupHeaderHeight : 0;\r\n const colHeaderH = hasGroups ? geometry.baseHeaderHeight : headerH;\r\n\r\n // 1. SCROLLABLE HEADERS\r\n ctx.save();\r\n ctx.beginPath();\r\n ctx.rect(geometry.totalFrozenWidth, 0, Math.max(0, width - geometry.totalFrozenWidth), headerH);\r\n ctx.clip();\r\n\r\n ctx.fillStyle = theme.canvas.headerBg;\r\n ctx.fillRect(geometry.totalFrozenWidth, 0, Math.max(0, width - geometry.totalFrozenWidth), headerH);\r\n\r\n // 1a. Scrollable Column Group Bands (Top Band)\r\n if (hasGroups) {\r\n this.renderColumnGroupBands(\r\n ctx,\r\n geometry.scrollableColumns,\r\n geometry.frozenColumns.length,\r\n (idx) => geometry.totalFrozenWidth + geometry.scrollableColOffsets[idx] - scrollLeft,\r\n groupH,\r\n theme,\r\n normSel,\r\n geometry,\r\n geometry.totalFrozenWidth,\r\n width\r\n );\r\n }\r\n\r\n // 1b. Scrollable Individual Column Headers\r\n for (let i = 0; i < geometry.scrollableColumns.length; i++) {\r\n const col = geometry.scrollableColumns[i];\r\n const colIdx = geometry.frozenColumns.length + i;\r\n const x = geometry.totalFrozenWidth + geometry.scrollableColOffsets[i] - scrollLeft;\r\n const groupDef = hasGroups ? geometry.getColumnGroup(col) : undefined;\r\n const colStyle = ColumnColorEngine.resolveColumnStyle(col, groupDef, theme.isDark);\r\n const colY = groupDef ? groupH : 0;\r\n const colH = groupDef ? colHeaderH : headerH;\r\n\r\n this.renderSingleHeader(\r\n ctx,\r\n col,\r\n colIdx,\r\n x,\r\n colY,\r\n col.width,\r\n colH,\r\n theme,\r\n sortRules,\r\n colIdx >= normSel.minCol && colIdx <= normSel.maxCol,\r\n hoveredFilterColIndex === colIdx,\r\n activeFilterColumnIds?.has(col.id) ?? false,\r\n store.isColumnDirty?.(col.id) ?? false,\r\n permissions,\r\n selectionMode,\r\n selectedRowKeys?.size || 0,\r\n rowCount,\r\n colStyle,\r\n Boolean(groupDef)\r\n );\r\n }\r\n ctx.restore();\r\n\r\n // 2. FROZEN HEADERS\r\n const frozenXOffsets: number[] = [];\r\n let accFrozenX = rowNumW;\r\n for (let i = 0; i < geometry.frozenColumns.length; i++) {\r\n frozenXOffsets.push(accFrozenX);\r\n accFrozenX += geometry.frozenColumns[i].width;\r\n }\r\n\r\n let curX = rowNumW;\r\n for (let i = 0; i < geometry.frozenColumns.length; i++) {\r\n const col = geometry.frozenColumns[i];\r\n ctx.fillStyle = theme.canvas.headerBg;\r\n ctx.fillRect(curX, 0, col.width, headerH);\r\n curX += col.width;\r\n }\r\n\r\n // 2a. Frozen Column Group Bands (Top Band)\r\n if (hasGroups && geometry.frozenColumns.length > 0) {\r\n this.renderColumnGroupBands(\r\n ctx,\r\n geometry.frozenColumns,\r\n 0,\r\n (idx) => frozenXOffsets[idx],\r\n groupH,\r\n theme,\r\n normSel,\r\n geometry,\r\n rowNumW,\r\n geometry.totalFrozenWidth\r\n );\r\n }\r\n\r\n // 2b. Frozen Individual Column Headers\r\n curX = rowNumW;\r\n for (let i = 0; i < geometry.frozenColumns.length; i++) {\r\n const col = geometry.frozenColumns[i];\r\n const groupDef = hasGroups ? geometry.getColumnGroup(col) : undefined;\r\n const colStyle = ColumnColorEngine.resolveColumnStyle(col, groupDef, theme.isDark);\r\n const colY = groupDef ? groupH : 0;\r\n const colH = groupDef ? colHeaderH : headerH;\r\n\r\n this.renderSingleHeader(\r\n ctx,\r\n col,\r\n i,\r\n curX,\r\n colY,\r\n col.width,\r\n colH,\r\n theme,\r\n sortRules,\r\n i >= normSel.minCol && i <= normSel.maxCol,\r\n hoveredFilterColIndex === i,\r\n activeFilterColumnIds?.has(col.id) ?? false,\r\n store.isColumnDirty?.(col.id) ?? false,\r\n permissions,\r\n selectionMode,\r\n selectedRowKeys?.size || 0,\r\n rowCount,\r\n colStyle,\r\n Boolean(groupDef)\r\n );\r\n curX += col.width;\r\n }\r\n\r\n // 3. TOP-LEFT CORNER BOX (Select All)\r\n ctx.fillStyle = theme.canvas.rowNumberBg;\r\n ctx.fillRect(0, 0, rowNumW, headerH);\r\n ctx.strokeStyle = theme.canvas.headerBorder;\r\n ctx.strokeRect(0, 0, rowNumW, headerH);\r\n\r\n // Draw subtle corner triangle in top-left select-all box\r\n ctx.fillStyle = theme.isDark ? 'rgba(255,255,255,0.25)' : 'rgba(0,0,0,0.22)';\r\n ctx.beginPath();\r\n ctx.moveTo(rowNumW - 8, headerH - 16);\r\n ctx.lineTo(rowNumW - 8, headerH - 6);\r\n ctx.lineTo(rowNumW - 18, headerH - 6);\r\n ctx.closePath();\r\n ctx.fill();\r\n\r\n // Frozen header divider shadow\r\n if (geometry.frozenColumns.length > 0) {\r\n ctx.save();\r\n ctx.fillStyle = theme.canvas.frozenDividerShadow;\r\n ctx.fillRect(geometry.totalFrozenWidth, 0, 3, headerH);\r\n ctx.restore();\r\n }\r\n }\r\n\r\n private static renderColumnGroupBands(\r\n ctx: CanvasRenderingContext2D,\r\n columns: ColumnDef[],\r\n colOffsetStartIdx: number,\r\n getColX: (localIdx: number) => number,\r\n groupH: number,\r\n theme: IGridThemeTokens,\r\n normSel: { minRow: number; maxRow: number; minCol: number; maxCol: number },\r\n geometry: GeometryEngine,\r\n minVisibleX: number = 0,\r\n maxVisibleX: number = 99999\r\n ): void {\r\n let i = 0;\r\n while (i < columns.length) {\r\n const col = columns[i];\r\n const groupDef = geometry.getColumnGroup(col);\r\n if (!groupDef) {\r\n i++;\r\n continue;\r\n }\r\n\r\n let j = i;\r\n let spanWidth = col.width;\r\n while (j + 1 < columns.length) {\r\n const nextGroup = geometry.getColumnGroup(columns[j + 1]);\r\n if (nextGroup && nextGroup.id === groupDef.id) {\r\n j++;\r\n spanWidth += columns[j].width;\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n const spanX = getColX(i);\r\n const startGlobalCol = colOffsetStartIdx + i;\r\n const endGlobalCol = colOffsetStartIdx + j;\r\n const isGroupActive =\r\n normSel.maxCol >= startGlobalCol && normSel.minCol <= endGlobalCol;\r\n\r\n const groupStyle = ColumnColorEngine.resolveGroupStyle(groupDef, theme.isDark);\r\n this.renderSingleGroupHeaderBand(\r\n ctx,\r\n groupDef,\r\n groupStyle,\r\n spanX,\r\n 0,\r\n spanWidth,\r\n groupH,\r\n theme,\r\n isGroupActive,\r\n minVisibleX,\r\n maxVisibleX\r\n );\r\n\r\n i = j + 1;\r\n }\r\n }\r\n\r\n private static renderSingleGroupHeaderBand(\r\n ctx: CanvasRenderingContext2D,\r\n groupDef: ColumnGroupDef,\r\n groupStyle: ResolvedGroupHeaderStyle,\r\n x: number,\r\n y: number,\r\n w: number,\r\n h: number,\r\n theme: IGridThemeTokens,\r\n isGroupActive: boolean,\r\n minVisibleX: number = 0,\r\n maxVisibleX: number = 99999\r\n ): void {\r\n ctx.save();\r\n\r\n // 1. Group Band Background\r\n ctx.fillStyle =\r\n groupStyle.headerBg ||\r\n (theme.isDark ? 'rgba(255, 255, 255, 0.045)' : 'rgba(15, 23, 42, 0.04)');\r\n ctx.fillRect(x, y, w, h);\r\n\r\n if (isGroupActive && !groupStyle.headerBg) {\r\n ctx.fillStyle = theme.isDark ? 'rgba(10, 132, 255, 0.12)' : 'rgba(0, 122, 255, 0.07)';\r\n ctx.fillRect(x, y, w, h);\r\n }\r\n\r\n // 2. Top Accent Border (1px crisp hairline)\r\n const accentColor = groupStyle.headerAccent || (isGroupActive ? theme.dom.accentColor : undefined);\r\n if (accentColor) {\r\n ctx.save();\r\n ctx.globalAlpha = 0.65;\r\n ctx.fillStyle = accentColor;\r\n ctx.fillRect(x, y, w, 1);\r\n ctx.restore();\r\n }\r\n\r\n // 3. Borders (Right & Bottom Divider)\r\n ctx.strokeStyle = groupStyle.borderColor || theme.canvas.headerBorder;\r\n ctx.lineWidth = 1;\r\n ctx.beginPath();\r\n ctx.moveTo(x + w - 0.5, y);\r\n ctx.lineTo(x + w - 0.5, y + h);\r\n ctx.moveTo(x, y + h - 0.5);\r\n ctx.lineTo(x + w, y + h - 0.5);\r\n ctx.stroke();\r\n\r\n // 4. Sticky Viewport-Clamped Group Title & Color Dot\r\n const visStart = Math.max(x, minVisibleX);\r\n const visEnd = Math.min(x + w, maxVisibleX);\r\n const visW = Math.max(0, visEnd - visStart);\r\n\r\n if (visW >= 24) {\r\n ctx.save();\r\n ctx.beginPath();\r\n ctx.rect(visStart + 6, y, Math.max(0, visW - 12), h);\r\n ctx.clip();\r\n\r\n const textColor = groupStyle.headerText || theme.canvas.headerText;\r\n ctx.fillStyle = textColor;\r\n ctx.font = `700 ${Math.max(10, theme.headerFontSize - 1)}px ${theme.fontFamily}`;\r\n ctx.textBaseline = 'middle';\r\n\r\n const align = groupDef.align || 'center';\r\n const cy = y + h / 2 + 0.5;\r\n\r\n if (align === 'left') {\r\n let textX = visStart + 10;\r\n if (accentColor && visW >= 90) {\r\n ctx.beginPath();\r\n ctx.arc(textX + 3, cy, 3.2, 0, Math.PI * 2);\r\n ctx.fillStyle = accentColor;\r\n ctx.fill();\r\n textX += 11;\r\n }\r\n ctx.fillStyle = textColor;\r\n ctx.textAlign = 'left';\r\n ctx.fillText(groupDef.title, textX, cy);\r\n } else if (align === 'right') {\r\n ctx.textAlign = 'right';\r\n ctx.fillText(groupDef.title, visEnd - 10, cy);\r\n } else {\r\n ctx.textAlign = 'center';\r\n const titleMetrics = ctx.measureText(groupDef.title);\r\n const totalTitleW = titleMetrics.width;\r\n const centerX = visStart + visW / 2;\r\n if (accentColor && visW >= totalTitleW + 30) {\r\n const dotX = centerX - totalTitleW / 2 - 7;\r\n ctx.beginPath();\r\n ctx.arc(dotX, cy, 3.2, 0, Math.PI * 2);\r\n ctx.fillStyle = accentColor;\r\n ctx.fill();\r\n ctx.fillStyle = textColor;\r\n ctx.fillText(groupDef.title, centerX + 4, cy);\r\n } else if (visW < totalTitleW + 16) {\r\n ctx.textAlign = 'left';\r\n ctx.fillText(groupDef.title, visStart + 8, cy);\r\n } else {\r\n ctx.fillText(groupDef.title, centerX, cy);\r\n }\r\n }\r\n\r\n ctx.restore();\r\n }\r\n\r\n ctx.restore();\r\n }\r\n\r\n private static renderSingleHeader(\r\n ctx: CanvasRenderingContext2D,\r\n col: ColumnDef,\r\n colIdx: number,\r\n x: number,\r\n y: number,\r\n w: number,\r\n h: number,\r\n theme: IGridThemeTokens,\r\n sortRules: SortDescriptor[],\r\n isColSelected: boolean,\r\n isFilterHovered: boolean,\r\n isFilterActive: boolean,\r\n isColumnDirty: boolean,\r\n permissions?: GridPermissions,\r\n selectionMode: RowSelectionMode = 'none',\r\n selectedCount: number = 0,\r\n totalRowCount: number = 0,\r\n colStyle?: ResolvedColumnStyle,\r\n hasParentGroup: boolean = false\r\n ): void {\r\n ctx.save();\r\n\r\n // Custom theme-aware column header background\r\n if (col.id !== '__selection__' && colStyle?.headerBg) {\r\n ctx.fillStyle = colStyle.headerBg;\r\n ctx.fillRect(x, y, w, h);\r\n }\r\n\r\n if (isColumnDirty) {\r\n ctx.fillStyle = theme.isDark ? 'rgba(34, 197, 94, 0.16)' : 'rgba(22, 163, 74, 0.12)';\r\n ctx.fillRect(x, y, w, h);\r\n ctx.fillStyle = theme.isDark ? '#22C55E' : '#16A34A';\r\n ctx.fillRect(x, y, w, 1.5);\r\n } else if (isColSelected) {\r\n ctx.fillStyle = theme.isDark ? 'rgba(10, 132, 255, 0.12)' : 'rgba(0, 122, 255, 0.07)';\r\n ctx.fillRect(x, y, w, h);\r\n }\r\n\r\n // Top accent border on ungrouped colored column headers (1px crisp hairline)\r\n if (!isColumnDirty && !hasParentGroup && colStyle?.headerAccent && col.id !== '__selection__') {\r\n ctx.save();\r\n ctx.globalAlpha = 0.65;\r\n ctx.fillStyle = colStyle.headerAccent;\r\n ctx.fillRect(x, y, w, 1);\r\n ctx.restore();\r\n }\r\n\r\n // Borders\r\n ctx.strokeStyle = colStyle?.borderColor || theme.canvas.headerBorder;\r\n ctx.lineWidth = 1;\r\n ctx.beginPath();\r\n ctx.moveTo(x + w - 0.5, y);\r\n ctx.lineTo(x + w - 0.5, y + h);\r\n ctx.moveTo(x, y + h - 0.5);\r\n ctx.lineTo(x + w, y + h - 0.5);\r\n ctx.stroke();\r\n\r\n // Synthetic Row Selection Header ('__selection__')\r\n if (col.id === '__selection__') {\r\n const cx = x + w / 2;\r\n const cy = y + h / 2;\r\n if (selectionMode === 'single') {\r\n ctx.beginPath();\r\n ctx.arc(cx, cy, 7, 0, Math.PI * 2);\r\n ctx.strokeStyle = theme.canvas.headerText;\r\n ctx.lineWidth = 1.5;\r\n ctx.stroke();\r\n ctx.beginPath();\r\n ctx.arc(cx, cy, 2.5, 0, Math.PI * 2);\r\n ctx.fillStyle = theme.canvas.headerText;\r\n ctx.fill();\r\n } else {\r\n const boxSize = 15;\r\n const bx = cx - boxSize / 2;\r\n const by = cy - boxSize / 2;\r\n const isAllSelected = totalRowCount > 0 && selectedCount >= totalRowCount;\r\n const isSomeSelected = selectedCount > 0 && selectedCount < totalRowCount;\r\n ctx.beginPath();\r\n ctx.roundRect(bx, by, boxSize, boxSize, 4);\r\n if (isAllSelected || isSomeSelected) {\r\n ctx.fillStyle = theme.dom.accentColor;\r\n ctx.fill();\r\n ctx.strokeStyle = '#FFFFFF';\r\n ctx.lineWidth = 2;\r\n ctx.beginPath();\r\n if (isAllSelected) {\r\n ctx.moveTo(bx + 3.5, cy);\r\n ctx.lineTo(bx + 6.5, cy + 3);\r\n ctx.lineTo(bx + 11.5, cy - 3);\r\n } else {\r\n ctx.moveTo(bx + 3.5, cy);\r\n ctx.lineTo(bx + 11.5, cy);\r\n }\r\n ctx.stroke();\r\n } else {\r\n ctx.fillStyle = theme.dom.inputBg;\r\n ctx.fill();\r\n ctx.strokeStyle = theme.canvas.headerBorder;\r\n ctx.lineWidth = 1.4;\r\n ctx.stroke();\r\n }\r\n }\r\n ctx.restore();\r\n return;\r\n }\r\n\r\n // Active column bottom highlight bar\r\n if (isColSelected) {\r\n ctx.fillStyle = colStyle?.headerAccent || theme.dom.accentColor;\r\n ctx.fillRect(x, y + h - 2, w, 2);\r\n }\r\n\r\n const isReadonly = this.isColumnReadonly(col, permissions);\r\n const isFilterable =\r\n col.filterable !== false && col.type !== 'sparkline' && col.type !== 'action';\r\n const sortIndex = sortRules.findIndex((s) => s.selector === col.id);\r\n\r\n const rightReserved = (isFilterable ? 28 : 8) + (sortIndex !== -1 ? 18 : 0);\r\n\r\n // Header Title + Optional Readonly Lock Icon\r\n ctx.save();\r\n ctx.beginPath();\r\n ctx.rect(x + 8, y, Math.max(0, w - rightReserved - 8), h);\r\n ctx.clip();\r\n\r\n ctx.fillStyle = colStyle?.headerText || theme.canvas.headerText;\r\n ctx.font = `600 ${theme.headerFontSize}px ${theme.fontFamily}`;\r\n ctx.textAlign = 'left';\r\n ctx.textBaseline = 'middle';\r\n\r\n const prefix = isReadonly && col.type !== 'action' && col.type !== 'sparkline' ? '🔒 ' : '';\r\n const safeTitle = typeof col.title === 'string' && col.title.trim() !== '' ? col.title : (col.id === 'constructor' ? 'Constructor' : String(col.id || ''));\r\n ctx.fillText(`${prefix}${safeTitle}`, x + 8, y + h / 2);\r\n ctx.restore();\r\n\r\n // Sort Arrow\r\n if (sortIndex !== -1) {\r\n const sort = sortRules[sortIndex];\r\n ctx.save();\r\n ctx.fillStyle = colStyle?.headerAccent || theme.dom.accentColor;\r\n ctx.font = `700 10px ${theme.fontFamily}`;\r\n ctx.textAlign = 'right';\r\n ctx.textBaseline = 'middle';\r\n const arrow = sort.desc ? '▼' : '▲';\r\n const badge = sortRules.length > 1 ? `${arrow}${sortIndex + 1}` : arrow;\r\n ctx.fillText(badge, x + w - (isFilterable ? 28 : 8), y + h / 2);\r\n ctx.restore();\r\n }\r\n\r\n // Filter Funnel Button (Easy-to-click 22x22 button box)\r\n if (isFilterable && w >= 48) {\r\n const btnSize = 20;\r\n const btnX = x + w - btnSize - 5;\r\n const btnY = y + (h - btnSize) / 2;\r\n\r\n ctx.save();\r\n if (isFilterActive) {\r\n ctx.fillStyle = colStyle?.headerAccent || theme.dom.accentColor;\r\n ctx.beginPath();\r\n ctx.roundRect(btnX, btnY, btnSize, btnSize, 5);\r\n ctx.fill();\r\n } else if (isFilterHovered) {\r\n ctx.fillStyle = theme.isDark ? 'rgba(255,255,255,0.14)' : 'rgba(0,0,0,0.08)';\r\n ctx.beginPath();\r\n ctx.roundRect(btnX, btnY, btnSize, btnSize, 5);\r\n ctx.fill();\r\n }\r\n\r\n const fx = btnX + btnSize / 2;\r\n const fy = btnY + btnSize / 2;\r\n ctx.fillStyle = isFilterActive\r\n ? '#FFFFFF'\r\n : isFilterHovered\r\n ? colStyle?.headerText || theme.canvas.headerText\r\n : colStyle?.headerText\r\n ? colStyle.headerText\r\n : theme.isDark\r\n ? '#98989D'\r\n : '#8E8E93';\r\n if (!isFilterActive && !isFilterHovered && colStyle?.headerText) {\r\n ctx.globalAlpha = 0.72;\r\n }\r\n\r\n ctx.beginPath();\r\n ctx.moveTo(fx - 5, fy - 4);\r\n ctx.lineTo(fx + 5, fy - 4);\r\n ctx.lineTo(fx + 1.5, fy + 0.5);\r\n ctx.lineTo(fx + 1.5, fy + 4.5);\r\n ctx.lineTo(fx - 1.5, fy + 3.5);\r\n ctx.lineTo(fx - 1.5, fy + 0.5);\r\n ctx.closePath();\r\n ctx.fill();\r\n ctx.restore();\r\n }\r\n\r\n ctx.restore();\r\n }\r\n}\r\n","import React from 'react';\r\nimport { ColumnTypeRegistry } from '../columns/ColumnTypeRegistry';\r\nimport { ActiveOverlayState } from '../types/grid';\r\nimport { IGridThemeTokens } from '../theme/IGridTheme';\r\nimport { IGridLocale } from '../i18n/IGridLocale';\r\n\r\nexport interface DynamicCellEditorProps {\r\n overlay: ActiveOverlayState;\r\n theme: IGridThemeTokens;\r\n locale: IGridLocale;\r\n validationError?: string | null;\r\n isValidating?: boolean;\r\n onCommit: (newValue: any, moveDir?: 'down' | 'right' | 'left' | 'none') => void;\r\n onCancel: () => void;\r\n}\r\n\r\nexport const DynamicCellEditor: React.FC<DynamicCellEditorProps> = ({\r\n overlay,\r\n theme,\r\n locale,\r\n validationError,\r\n isValidating,\r\n onCommit,\r\n onCancel,\r\n}) => {\r\n const plugin = ColumnTypeRegistry.get(overlay.column.type);\r\n const EditorComponent = plugin.editorComponent;\r\n const isTR = locale.code.startsWith('tr');\r\n\r\n if (!EditorComponent) {\r\n return null;\r\n }\r\n\r\n return (\r\n <>\r\n <EditorComponent\r\n value={overlay.initialValue}\r\n column={overlay.column}\r\n theme={theme}\r\n rect={{\r\n x: overlay.x,\r\n y: overlay.y,\r\n width: overlay.width,\r\n height: overlay.height,\r\n }}\r\n locale={locale}\r\n initialChar={overlay.initialChar}\r\n onCommit={onCommit}\r\n onCancel={onCancel}\r\n />\r\n {(validationError || isValidating) && (\r\n <div\r\n style={{\r\n position: 'absolute',\r\n left: Math.max(4, overlay.x),\r\n top: overlay.y + overlay.height + 3,\r\n zIndex: 210,\r\n maxWidth: 320,\r\n padding: '5px 10px',\r\n borderRadius: 6,\r\n backgroundColor: isValidating ? '#0284C7' : '#DC2626',\r\n color: '#FFFFFF',\r\n fontSize: 11.5,\r\n fontWeight: 700,\r\n fontFamily: theme.fontFamily,\r\n boxShadow: '0 8px 20px rgba(0, 0, 0, 0.45)',\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 6,\r\n pointerEvents: 'none',\r\n }}\r\n >\r\n <span>{isValidating ? '⏳' : '⛔'}</span>\r\n <span>\r\n {isValidating\r\n ? isTR\r\n ? 'Kural doğrulanıyor (Async)...'\r\n : 'Validating rule (Async)...'\r\n : validationError}\r\n </span>\r\n </div>\r\n )}\r\n </>\r\n );\r\n};\r\n","import { SortDescriptor } from '../types/filter';\nimport { FilterEngine } from './FilterEngine';\n\nexport class SortEngine {\n private static collator = new Intl.Collator('tr-TR', {\n numeric: true,\n sensitivity: 'base',\n });\n\n public static createComparator(sortRules: SortDescriptor[]): (a: any, b: any) => number {\n if (!sortRules || sortRules.length === 0) {\n return () => 0;\n }\n\n return (a: any, b: any) => {\n for (const rule of sortRules) {\n const valA = a?.[rule.selector];\n const valB = b?.[rule.selector];\n\n const diff = this.compareValues(valA, valB);\n if (diff !== 0) {\n return rule.desc ? -diff : diff;\n }\n }\n return 0;\n };\n }\n\n public static compareValues(a: any, b: any): number {\n if (a === b) return 0;\n if (a === null || a === undefined || a === '') return 1;\n if (b === null || b === undefined || b === '') return -1;\n\n // Sayısal karşılaştırma\n if (typeof a === 'number' && typeof b === 'number') {\n return a - b;\n }\n\n // Tarih karşılaştırması (Date veya semantik tarih string)\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() - b.getTime();\n }\n const dateA = FilterEngine.parseDateParts(a);\n const dateB = FilterEngine.parseDateParts(b);\n if (dateA && dateB) {\n return dateA.exactMs - dateB.exactMs;\n }\n\n // Boolean karşılaştırması\n if (typeof a === 'boolean' && typeof b === 'boolean') {\n return a === b ? 0 : a ? 1 : -1;\n }\n\n const strA =\n typeof a === 'object' && a !== null\n ? Array.isArray(a)\n ? a.join(', ')\n : JSON.stringify(a)\n : String(a);\n const strB =\n typeof b === 'object' && b !== null\n ? Array.isArray(b)\n ? b.join(', ')\n : JSON.stringify(b)\n : String(b);\n\n // Metin karşılaştırması (Türkçe ve doğal sayı duyarlı)\n return this.collator.compare(strA, strB);\n }\n}\n","import React, { useEffect } from 'react';\n\nconst MATERIAL_SYMBOLS_HREF =\n 'https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&family=Material+Symbols+Rounded:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap';\n\nlet injected = false;\n\n/**\n * Ensures the Google Material Symbols font stylesheet (https://fonts.google.com/icons)\n * is present in the document head when SheetGL is used as an npm package.\n */\nexport function ensureMaterialSymbolsLoaded(): void {\n if (injected || typeof document === 'undefined') return;\n injected = true;\n\n const existing = document.querySelector(\n 'link[href*=\"Material+Symbols+Outlined\"], link[href*=\"Material+Symbols+Rounded\"]'\n );\n if (existing) return;\n\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = MATERIAL_SYMBOLS_HREF;\n document.head.appendChild(link);\n}\n\nexport interface MaterialIconProps {\n /** Google Material Symbols icon ligature name (from https://fonts.google.com/icons), e.g. 'add', 'delete', 'tune' */\n name: string;\n /** Icon size in pixels (default: 16) */\n size?: number;\n /** Whether to render the filled variant (FILL 1 vs 0) */\n filled?: boolean;\n /** Font weight (100 - 700, default: 500) */\n weight?: number;\n /** Icon style family ('outlined' | 'rounded', default: 'outlined') */\n variant?: 'outlined' | 'rounded';\n /** Optional CSS color override */\n color?: string;\n /** Optional inline styles */\n style?: React.CSSProperties;\n /** Optional CSS class name */\n className?: string;\n /** Optional tooltip */\n title?: string;\n}\n\nexport const MaterialIcon: React.FC<MaterialIconProps> = ({\n name,\n size = 16,\n filled = false,\n weight = 500,\n variant = 'outlined',\n color,\n style,\n className,\n title,\n}) => {\n useEffect(() => {\n ensureMaterialSymbolsLoaded();\n }, []);\n\n const fontFamily =\n variant === 'rounded' ? '\"Material Symbols Rounded\"' : '\"Material Symbols Outlined\"';\n\n return (\n <span\n className={className}\n title={title}\n aria-hidden={title ? undefined : 'true'}\n style={{\n fontFamily,\n fontWeight: 'normal',\n fontStyle: 'normal',\n fontSize: size,\n lineHeight: 1,\n letterSpacing: 'normal',\n textTransform: 'none',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n whiteSpace: 'nowrap',\n wordWrap: 'normal',\n direction: 'ltr',\n WebkitFontSmoothing: 'antialiased',\n MozOsxFontSmoothing: 'grayscale',\n fontFeatureSettings: '\"liga\"',\n fontVariationSettings: `'FILL' ${filled ? 1 : 0}, 'wght' ${weight}, 'GRAD' 0, 'opsz' ${Math.max(20, Math.min(48, size))}`,\n width: size,\n height: size,\n flexShrink: 0,\n userSelect: 'none',\n color,\n ...style,\n }}\n >\n {name}\n </span>\n );\n};\n","import React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { ColumnDef } from '../types/grid';\r\nimport { IGridThemeTokens } from '../theme/IGridTheme';\r\nimport { IGridLocale } from '../i18n/IGridLocale';\r\nimport { IDataStore } from '../types/store';\r\nimport {\r\n ColumnFilterState,\r\n DistinctItem,\r\n FilterDescriptor,\r\n FilterOperation,\r\n} from '../types/filter';\r\nimport { BLANK_FILTER_TOKEN, FilterEngine } from '../core/FilterEngine';\r\nimport { SortEngine } from '../core/SortEngine';\r\nimport { MaterialIcon } from '../ui/MaterialIcon';\r\n\r\nexport interface HeaderFilterPopoverProps {\r\n column: ColumnDef;\r\n anchorRect: { x: number; y: number; width: number; height: number };\r\n viewportWidth?: number;\r\n theme: IGridThemeTokens;\r\n locale: IGridLocale;\r\n store: IDataStore;\r\n activeFilter?: ColumnFilterState;\r\n /** Composite filter of all OTHER active columns (excluding this column) for context-aware counts */\r\n baseFilter?: FilterDescriptor | null;\r\n onApply: (filterState: ColumnFilterState | null) => void;\r\n onSort?: (desc: boolean) => void;\r\n onToggleGroup?: () => void;\r\n isGrouped?: boolean;\r\n onClose: () => void;\r\n}\r\n\r\nconst NUMERIC_COLUMN_TYPES = new Set([\r\n 'number',\r\n 'currency',\r\n 'percent',\r\n 'progress',\r\n 'rating',\r\n]);\r\n\r\nconst TR_MONTH_NAMES = [\r\n 'Ocak',\r\n 'Şubat',\r\n 'Mart',\r\n 'Nisan',\r\n 'Mayıs',\r\n 'Haziran',\r\n 'Temmuz',\r\n 'Ağustos',\r\n 'Eylül',\r\n 'Ekim',\r\n 'Kasım',\r\n 'Aralık',\r\n];\r\n\r\nconst EN_MONTH_NAMES = [\r\n 'January',\r\n 'February',\r\n 'March',\r\n 'April',\r\n 'May',\r\n 'June',\r\n 'July',\r\n 'August',\r\n 'September',\r\n 'October',\r\n 'November',\r\n 'December',\r\n];\r\n\r\ninterface DateDayNode {\r\n year: number;\r\n month: number;\r\n day: number;\r\n isoDate: string;\r\n rawValues: any[];\r\n count: number;\r\n}\r\n\r\ninterface DateMonthNode {\r\n year: number;\r\n month: number;\r\n monthKey: string;\r\n rawValues: any[];\r\n count: number;\r\n days: DateDayNode[];\r\n}\r\n\r\ninterface DateYearNode {\r\n year: number;\r\n rawValues: any[];\r\n count: number;\r\n months: DateMonthNode[];\r\n}\r\n\r\ntype FlatDateTreeRow =\r\n | {\r\n kind: 'blank';\r\n key: string;\r\n item: DistinctItem;\r\n }\r\n | {\r\n kind: 'year';\r\n key: string;\r\n year: number;\r\n rawValues: any[];\r\n count: number;\r\n monthCount: number;\r\n expanded: boolean;\r\n }\r\n | {\r\n kind: 'month';\r\n key: string;\r\n monthKey: string;\r\n year: number;\r\n month: number;\r\n rawValues: any[];\r\n count: number;\r\n dayCount: number;\r\n expanded: boolean;\r\n }\r\n | {\r\n kind: 'day';\r\n key: string;\r\n year: number;\r\n month: number;\r\n day: number;\r\n isoDate: string;\r\n rawValues: any[];\r\n count: number;\r\n }\r\n | {\r\n kind: 'other';\r\n key: string;\r\n item: DistinctItem;\r\n };\r\n\r\n/**\r\n * Compiles selected Year > Month > Day hierarchy nodes into a compact, server-friendly\r\n * AST FilterDescriptor (`between` for full years/months, `in`/`=` with ISO dates for specific days).\r\n */\r\nfunction compileSemanticDateTreeFilter(\r\n columnId: string,\r\n hierarchy: {\r\n blankItem: DistinctItem | null;\r\n years: DateYearNode[];\r\n otherItems: DistinctItem[];\r\n },\r\n selectedSet: Set<any>\r\n): FilterDescriptor | undefined {\r\n const orClauses: FilterDescriptor[] = [];\r\n const checkedIsoDays: string[] = [];\r\n const explicitRawValues: any[] = [];\r\n\r\n if (hierarchy.blankItem && selectedSet.has(hierarchy.blankItem.value)) {\r\n explicitRawValues.push(BLANK_FILTER_TOKEN);\r\n }\r\n\r\n for (const oItem of hierarchy.otherItems) {\r\n if (selectedSet.has(oItem.value)) {\r\n explicitRawValues.push(oItem.value);\r\n }\r\n }\r\n\r\n for (const yNode of hierarchy.years) {\r\n const allYearChecked =\r\n yNode.rawValues.length > 0 && yNode.rawValues.every((v) => selectedSet.has(v));\r\n if (allYearChecked) {\r\n orClauses.push([\r\n columnId,\r\n 'between',\r\n [`${yNode.year}-01-01`, `${yNode.year}-12-31`],\r\n ]);\r\n continue;\r\n }\r\n\r\n const someYearChecked = yNode.rawValues.some((v) => selectedSet.has(v));\r\n if (!someYearChecked) continue;\r\n\r\n for (const mNode of yNode.months) {\r\n const allMonthChecked =\r\n mNode.rawValues.length > 0 && mNode.rawValues.every((v) => selectedSet.has(v));\r\n if (allMonthChecked) {\r\n const mm = String(mNode.month).padStart(2, '0');\r\n const lastDay = new Date(mNode.year, mNode.month, 0).getDate();\r\n const dd = String(lastDay).padStart(2, '0');\r\n orClauses.push([\r\n columnId,\r\n 'between',\r\n [`${mNode.year}-${mm}-01`, `${mNode.year}-${mm}-${dd}`],\r\n ]);\r\n continue;\r\n }\r\n\r\n const someMonthChecked = mNode.rawValues.some((v) => selectedSet.has(v));\r\n if (!someMonthChecked) continue;\r\n\r\n for (const dNode of mNode.days) {\r\n const allDayChecked =\r\n dNode.rawValues.length > 0 && dNode.rawValues.every((v) => selectedSet.has(v));\r\n if (allDayChecked) {\r\n checkedIsoDays.push(dNode.isoDate);\r\n } else {\r\n for (const rv of dNode.rawValues) {\r\n if (selectedSet.has(rv)) {\r\n explicitRawValues.push(rv);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (checkedIsoDays.length === 1) {\r\n orClauses.push([columnId, '=', checkedIsoDays[0]]);\r\n } else if (checkedIsoDays.length > 1) {\r\n orClauses.push([columnId, 'in', checkedIsoDays]);\r\n }\r\n\r\n if (explicitRawValues.length > 0) {\r\n orClauses.push([columnId, 'in', explicitRawValues]);\r\n }\r\n\r\n if (orClauses.length === 0) {\r\n return [columnId, 'in', []];\r\n }\r\n if (orClauses.length === 1) {\r\n return orClauses[0];\r\n }\r\n\r\n const composite: any[] = [];\r\n orClauses.forEach((clause, idx) => {\r\n if (idx > 0) composite.push('or');\r\n composite.push(clause);\r\n });\r\n return composite;\r\n}\r\n\r\n/**\r\n * Formats a raw cell value identically to how the cell painter renders it on Canvas.\r\n */\r\nexport function formatCellStructureValue(\r\n rawVal: any,\r\n column: ColumnDef,\r\n locale: IGridLocale\r\n): string {\r\n if (rawVal === BLANK_FILTER_TOKEN || rawVal === null || rawVal === undefined || rawVal === '') {\r\n return locale.emptyText;\r\n }\r\n\r\n const isTR = locale.code.startsWith('tr');\r\n\r\n const colType = (column.type || '').toLowerCase();\r\n if (colType === 'date' || colType === 'datetime') {\r\n return FilterEngine.formatLocalizedDate(\r\n rawVal,\r\n locale.code,\r\n colType === 'datetime'\r\n );\r\n }\r\n\r\n // Fallback: If value matches ISO date string pattern, format semantically\r\n if (typeof rawVal === 'string' && /^\\d{4}-\\d{2}-\\d{2}/.test(rawVal.trim())) {\r\n const parsed = FilterEngine.parseDateParts(rawVal);\r\n if (parsed) {\r\n return FilterEngine.formatLocalizedDate(rawVal, locale.code, false);\r\n }\r\n }\r\n\r\n if (column.type === 'currency') {\r\n const num = FilterEngine.parseNumeric(rawVal);\r\n if (isNaN(num)) return String(rawVal);\r\n const digits = column.decimalDigits ?? 2;\r\n const sym = column.currencySymbol || '$';\r\n const numStr = num.toLocaleString(locale.code, {\r\n minimumFractionDigits: digits,\r\n maximumFractionDigits: digits,\r\n });\r\n return isTR ? `${numStr} ${sym}` : `${sym}${numStr}`;\r\n }\r\n\r\n if (column.type === 'number') {\r\n const num = FilterEngine.parseNumeric(rawVal);\r\n if (isNaN(num)) return String(rawVal);\r\n const isInt = column.decimalDigits === 0 || (column.decimalDigits === undefined && Number.isInteger(num));\r\n const digits = isInt ? 0 : column.decimalDigits ?? 2;\r\n return num.toLocaleString(locale.code, {\r\n minimumFractionDigits: digits,\r\n maximumFractionDigits: digits,\r\n });\r\n }\r\n\r\n if (column.type === 'percent') {\r\n const num = FilterEngine.parseNumeric(rawVal);\r\n if (isNaN(num)) return String(rawVal);\r\n const digits = column.decimalDigits ?? 1;\r\n const numStr = num.toLocaleString(locale.code, {\r\n minimumFractionDigits: digits,\r\n maximumFractionDigits: digits,\r\n });\r\n const sign = (column.showVarianceSign ?? true) && num > 0 ? '+' : '';\r\n return `${sign}${numStr}%`;\r\n }\r\n\r\n if (column.type === 'progress') {\r\n const num = FilterEngine.parseNumeric(rawVal);\r\n if (isNaN(num)) return String(rawVal);\r\n return isTR ? `%${Math.round(num)}` : `${Math.round(num)}%`;\r\n }\r\n\r\n if (column.type === 'rating') {\r\n const num = Math.max(0, Math.min(5, Math.round(FilterEngine.parseNumeric(rawVal) || 0)));\r\n return `${'★'.repeat(num)}${'☆'.repeat(5 - num)} (${num})`;\r\n }\r\n\r\n if (column.type === 'boolean') {\r\n const b =\r\n typeof rawVal === 'boolean'\r\n ? rawVal\r\n : ['true', '1', 'evet', 'doğru', 'yes'].includes(String(rawVal).toLowerCase());\r\n return b ? locale.trueText : locale.falseText;\r\n }\r\n\r\n if (\r\n (column.type === 'select' ||\r\n column.type === 'dropdown' ||\r\n column.type === 'lookup' ||\r\n column.type === 'multiselect') &&\r\n column.options\r\n ) {\r\n const opt = column.options.find((o) => String(o.value) === String(rawVal));\r\n if (opt) return opt.subtitle ? `${opt.label} (${opt.subtitle})` : opt.label;\r\n }\r\n\r\n if (column.type === 'object' && typeof rawVal === 'object' && !Array.isArray(rawVal)) {\r\n return Object.entries(rawVal)\r\n .map(([k, v]) => `${k}: ${String(v)}`)\r\n .join(' • ');\r\n }\r\n\r\n return String(rawVal);\r\n}\r\n\r\n/**\r\n * Sanitizes numeric input while typing without mutating thousands separators or jumping the cursor.\r\n * Accepts digits, leading minus, and both '.' and ',' separators across TR/EN keyboards.\r\n */\r\nfunction sanitizeNumericTyping(rawInput: string): string {\r\n const stripped = rawInput.replace(/[^0-9.,+-]/g, '');\r\n if (!stripped) return '';\r\n const isNeg = stripped.startsWith('-');\r\n const unsigned = stripped.replace(/[+-]/g, '');\r\n return `${isNeg ? '-' : ''}${unsigned}`;\r\n}\r\n\r\nfunction formatNumericDisplay(num: number, isTR: boolean): string {\r\n if (isNaN(num)) return '';\r\n return num.toLocaleString(isTR ? 'tr-TR' : 'en-US', {\r\n maximumFractionDigits: 4,\r\n });\r\n}\r\n\r\nfunction initialConditionInputDisplay(rawVal: any, column: ColumnDef, isTR: boolean): string {\r\n if (rawVal === undefined || rawVal === null || rawVal === '') return '';\r\n if (column.type === 'date' || column.type === 'datetime') {\r\n const parsed = FilterEngine.parseDateParts(rawVal);\r\n if (parsed) return parsed.isoDate;\r\n }\r\n if (NUMERIC_COLUMN_TYPES.has(column.type)) {\r\n const num = FilterEngine.parseNumeric(rawVal);\r\n if (!isNaN(num)) {\r\n return formatNumericDisplay(num, isTR);\r\n }\r\n }\r\n return String(rawVal);\r\n}\r\n\r\nfunction toIsoDateString(d: Date): string {\r\n const y = d.getFullYear();\r\n const m = String(d.getMonth() + 1).padStart(2, '0');\r\n const day = String(d.getDate()).padStart(2, '0');\r\n return `${y}-${m}-${day}`;\r\n}\r\n\r\nexport const HeaderFilterPopover: React.FC<HeaderFilterPopoverProps> = ({\r\n column,\r\n anchorRect,\r\n viewportWidth = 1000,\r\n theme,\r\n locale,\r\n store,\r\n activeFilter,\r\n baseFilter,\r\n onApply,\r\n onSort,\r\n onToggleGroup,\r\n isGrouped,\r\n onClose,\r\n}) => {\r\n const isTR = locale.code.startsWith('tr');\r\n const colType = (column.type || '').toLowerCase();\r\n const isNumericCol = NUMERIC_COLUMN_TYPES.has(colType) || NUMERIC_COLUMN_TYPES.has(column.type);\r\n const isDateCol = colType === 'date' || colType === 'datetime';\r\n const monthNames = isTR ? TR_MONTH_NAMES : EN_MONTH_NAMES;\r\n\r\n const [tab, setTab] = useState<'values' | 'condition'>(activeFilter?.mode || 'values');\r\n const [allItems, setAllItems] = useState<DistinctItem[]>([]);\r\n const [loading, setLoading] = useState<boolean>(true);\r\n const [search, setSearch] = useState<string>('');\r\n const [selectedSet, setSelectedSet] = useState<Set<any>>(\r\n () => new Set(activeFilter?.selectedValues || [])\r\n );\r\n const [listScrollTop, setListScrollTop] = useState<number>(0);\r\n\r\n // Hierarchical Year > Month > Day expansion state for date/datetime columns\r\n const [expandedYears, setExpandedYears] = useState<Set<number>>(() => new Set());\r\n const [expandedMonths, setExpandedMonths] = useState<Set<string>>(() => new Set());\r\n const [isRangeDriven, setIsRangeDriven] = useState<boolean>(\r\n Boolean(isDateCol && activeFilter?.mode === 'condition' && activeFilter?.operator === 'between')\r\n );\r\n\r\n // Condition filter states\r\n const defaultOp: FilterOperation = isDateCol\r\n ? 'between'\r\n : isNumericCol\r\n ? '<'\r\n : column.type === 'time' || column.type === 'boolean'\r\n ? '='\r\n : 'contains';\r\n\r\n const [operator, setOperator] = useState<FilterOperation>(activeFilter?.operator || defaultOp);\r\n const [condVal1, setCondVal1] = useState<string>(() =>\r\n initialConditionInputDisplay(activeFilter?.value1, column, isTR)\r\n );\r\n const [condVal2, setCondVal2] = useState<string>(() =>\r\n initialConditionInputDisplay(activeFilter?.value2, column, isTR)\r\n );\r\n\r\n const popoverRef = useRef<HTMLDivElement | null>(null);\r\n const searchInputRef = useRef<HTMLInputElement | null>(null);\r\n const condInputRef = useRef<HTMLInputElement | null>(null);\r\n\r\n // Stable stringified representation of baseFilter to prevent infinite loading loops on every frame\r\n const baseFilterKey = useMemo(() => (baseFilter ? JSON.stringify(baseFilter) : ''), [baseFilter]);\r\n\r\n // Fetch context-aware distinct values (respecting other columns' active filters via baseFilter)\r\n useEffect(() => {\r\n let mounted = true;\r\n setLoading(true);\r\n store\r\n .getDistinctValues(column.id, undefined, baseFilter)\r\n .then((res) => {\r\n if (!mounted) return;\r\n\r\n // Unpack composite delimited strings for multiselect columns so each item (e.g. H1(PA), H2(PB)) has its own checkbox\r\n let processedRes = res;\r\n if (colType === 'multiselect') {\r\n const tokenMap = new Map<string, number>();\r\n let blankCnt = 0;\r\n for (const it of res) {\r\n if (it.value === BLANK_FILTER_TOKEN || it.value === '' || it.value === null || it.value === undefined) {\r\n blankCnt += it.count || 1;\r\n continue;\r\n }\r\n const raw = String(it.value);\r\n const parts = raw.split(/[,;|]|\\s\\+\\s/).map((s) => s.trim()).filter(Boolean);\r\n if (parts.length === 0) {\r\n blankCnt += it.count || 1;\r\n } else {\r\n for (const p of parts) {\r\n tokenMap.set(p, (tokenMap.get(p) || 0) + (it.count || 1));\r\n }\r\n }\r\n }\r\n\r\n // Ensure predefined options from column.options are available even if count is 0\r\n if (column.options && column.options.length > 0) {\r\n for (const opt of column.options) {\r\n if (!tokenMap.has(opt.value)) {\r\n tokenMap.set(opt.value, 0);\r\n }\r\n }\r\n }\r\n\r\n const unpackedItems: DistinctItem[] = [];\r\n if (blankCnt > 0) {\r\n unpackedItems.push({\r\n value: BLANK_FILTER_TOKEN,\r\n label: locale.code.startsWith('tr') ? '(Boş / Blank)' : '(Blank)',\r\n count: blankCnt,\r\n });\r\n }\r\n for (const [tVal, tCount] of tokenMap.entries()) {\r\n unpackedItems.push({\r\n value: tVal,\r\n label: tVal,\r\n count: tCount,\r\n });\r\n }\r\n unpackedItems.sort((a, b) => {\r\n if (a.value === BLANK_FILTER_TOKEN) return -1;\r\n if (b.value === BLANK_FILTER_TOKEN) return 1;\r\n return SortEngine.compareValues(a.value, b.value);\r\n });\r\n processedRes = unpackedItems;\r\n }\r\n\r\n setAllItems(processedRes);\r\n\r\n // Initialize Year > Month > Day tree expansion for date columns\r\n if (isDateCol) {\r\n const yearsSet = new Set<number>();\r\n const monthsSet = new Set<string>();\r\n let dayTotal = 0;\r\n for (const r of processedRes) {\r\n const p = FilterEngine.parseDateParts(r.value);\r\n if (p) {\r\n yearsSet.add(p.year);\r\n monthsSet.add(`${p.year}-${p.month}`);\r\n dayTotal++;\r\n }\r\n }\r\n setExpandedYears(yearsSet);\r\n if (dayTotal <= 120) {\r\n setExpandedMonths(monthsSet);\r\n } else {\r\n setExpandedMonths(new Set());\r\n }\r\n }\r\n\r\n if (activeFilter && activeFilter.mode === 'values') {\r\n if (isDateCol && activeFilter.semanticFilter) {\r\n const directSet = new Set(activeFilter.selectedValues || []);\r\n const matchedValues: any[] = [];\r\n for (const r of processedRes) {\r\n const rawVal = r.value === BLANK_FILTER_TOKEN ? '' : r.value;\r\n if (\r\n directSet.has(r.value) ||\r\n FilterEngine.evaluateRow({ [column.id]: rawVal }, activeFilter.semanticFilter)\r\n ) {\r\n matchedValues.push(r.value);\r\n }\r\n }\r\n setSelectedSet(new Set(matchedValues));\r\n } else if (activeFilter.selectedValues) {\r\n setSelectedSet(new Set(activeFilter.selectedValues));\r\n } else {\r\n setSelectedSet(new Set(processedRes.map((r) => r.value)));\r\n }\r\n } else if (\r\n isDateCol &&\r\n activeFilter &&\r\n activeFilter.mode === 'condition' &&\r\n activeFilter.operator\r\n ) {\r\n const op = activeFilter.operator;\r\n const target =\r\n op === 'between'\r\n ? [activeFilter.value1, activeFilter.value2]\r\n : activeFilter.value1;\r\n const matchedValues: any[] = [];\r\n for (const r of processedRes) {\r\n const rawVal = r.value === BLANK_FILTER_TOKEN ? '' : r.value;\r\n if (FilterEngine.match(rawVal, op, target)) {\r\n matchedValues.push(r.value);\r\n }\r\n }\r\n setSelectedSet(new Set(matchedValues));\r\n } else {\r\n // Keep Value List checkboxes intact (all selected) when no value-list filter is active\r\n setSelectedSet(new Set(processedRes.map((r) => r.value)));\r\n }\r\n setLoading(false);\r\n })\r\n .catch(() => {\r\n if (mounted) setLoading(false);\r\n });\r\n return () => {\r\n mounted = false;\r\n };\r\n }, [column.id, store, baseFilterKey, isDateCol]);\r\n\r\n useEffect(() => {\r\n if (tab === 'values') {\r\n searchInputRef.current?.focus();\r\n } else {\r\n condInputRef.current?.focus();\r\n }\r\n }, [tab]);\r\n\r\n // Outside click listener\r\n useEffect(() => {\r\n const handleOutside = (e: MouseEvent) => {\r\n if (popoverRef.current && !popoverRef.current.contains(e.target as Node)) {\r\n onClose();\r\n }\r\n };\r\n document.addEventListener('mousedown', handleOutside, true);\r\n return () => document.removeEventListener('mousedown', handleOutside, true);\r\n }, [onClose]);\r\n\r\n const formatItemLabel = (it: DistinctItem): string => {\r\n if (isDateCol || (typeof it.value === 'string' && /^\\d{4}-\\d{2}-\\d{2}/.test(it.value.trim()))) {\r\n return FilterEngine.formatLocalizedDate(it.value, locale.code, colType === 'datetime');\r\n }\r\n return formatCellStructureValue(it.value, column, locale);\r\n };\r\n\r\n // Updates non-date condition inputs without mutating or corrupting Value List (selectedSet)\r\n const syncConditionToSelection = (\r\n nextV1: string,\r\n nextV2: string,\r\n nextOp: FilterOperation\r\n ) => {\r\n setCondVal1(nextV1);\r\n setCondVal2(nextV2);\r\n setOperator(nextOp);\r\n };\r\n\r\n // Helper to sync Between date range inputs with the Year > Month > Day tree selection\r\n const applyDateRangeToTree = (nextStart: string, nextEnd: string, nextOp: FilterOperation = 'between') => {\r\n setCondVal1(nextStart);\r\n setCondVal2(nextEnd);\r\n setOperator(nextOp);\r\n setListScrollTop(0);\r\n\r\n const hasStart = nextStart.trim() !== '';\r\n const hasEnd = nextEnd.trim() !== '';\r\n if (!hasStart && !hasEnd) {\r\n setIsRangeDriven(false);\r\n setSelectedSet(new Set(allItems.map((r) => r.value)));\r\n return;\r\n }\r\n\r\n setIsRangeDriven(true);\r\n const target = nextOp === 'between' ? [nextStart, nextEnd] : nextStart || nextEnd;\r\n const nextSel = new Set<any>();\r\n const matchYears = new Set<number>();\r\n const matchMonths = new Set<string>();\r\n\r\n for (const it of allItems) {\r\n if (it.value === BLANK_FILTER_TOKEN) continue;\r\n if (FilterEngine.match(it.value, nextOp, target)) {\r\n nextSel.add(it.value);\r\n const p = FilterEngine.parseDateParts(it.value);\r\n if (p) {\r\n matchYears.add(p.year);\r\n matchMonths.add(`${p.year}-${p.month}`);\r\n }\r\n }\r\n }\r\n\r\n setSelectedSet(nextSel);\r\n if (matchYears.size > 0) {\r\n setExpandedYears((prev) => new Set([...prev, ...matchYears]));\r\n if (matchMonths.size <= 36) {\r\n setExpandedMonths((prev) => new Set([...prev, ...matchMonths]));\r\n }\r\n }\r\n };\r\n\r\n // Build semantic Year > Month > Day hierarchy for date/datetime columns\r\n const dateHierarchy = useMemo(() => {\r\n if (!isDateCol) {\r\n return {\r\n blankItem: null as DistinctItem | null,\r\n years: [] as DateYearNode[],\r\n otherItems: [] as DistinctItem[],\r\n minIsoDate: '',\r\n maxIsoDate: '',\r\n };\r\n }\r\n\r\n let blankItem: DistinctItem | null = null;\r\n const otherItems: DistinctItem[] = [];\r\n const yearMap = new Map<\r\n number,\r\n {\r\n rawValues: any[];\r\n count: number;\r\n monthMap: Map<\r\n number,\r\n {\r\n rawValues: any[];\r\n count: number;\r\n dayMap: Map<number, { isoDate: string; rawValues: any[]; count: number }>;\r\n }\r\n >;\r\n }\r\n >();\r\n\r\n let minIsoDate = '';\r\n let maxIsoDate = '';\r\n const q = search.toLowerCase().trim();\r\n\r\n for (const it of allItems) {\r\n if (\r\n it.value === BLANK_FILTER_TOKEN ||\r\n it.value === null ||\r\n it.value === undefined ||\r\n it.value === ''\r\n ) {\r\n if (!q || locale.emptyText.toLowerCase().includes(q)) {\r\n blankItem = it;\r\n }\r\n continue;\r\n }\r\n\r\n const parsed = FilterEngine.parseDateParts(it.value);\r\n if (!parsed) {\r\n const lbl = formatItemLabel(it).toLowerCase();\r\n if (!q || lbl.includes(q)) {\r\n otherItems.push(it);\r\n }\r\n continue;\r\n }\r\n\r\n if (!minIsoDate || parsed.isoDate < minIsoDate) minIsoDate = parsed.isoDate;\r\n if (!maxIsoDate || parsed.isoDate > maxIsoDate) maxIsoDate = parsed.isoDate;\r\n\r\n const mName = monthNames[parsed.month - 1].toLowerCase();\r\n const mNumPad = String(parsed.month).padStart(2, '0');\r\n const dNumPad = String(parsed.day).padStart(2, '0');\r\n const dmyStr = `${dNumPad}.${mNumPad}.${parsed.year}`;\r\n\r\n if (q) {\r\n const matchesQuery =\r\n String(parsed.year).includes(q) ||\r\n mName.includes(q) ||\r\n mNumPad.includes(q) ||\r\n dNumPad.includes(q) ||\r\n parsed.isoDate.includes(q) ||\r\n dmyStr.includes(q);\r\n if (!matchesQuery) continue;\r\n }\r\n\r\n const itemCount = it.count ?? 1;\r\n\r\n let yEntry = yearMap.get(parsed.year);\r\n if (!yEntry) {\r\n yEntry = { rawValues: [], count: 0, monthMap: new Map() };\r\n yearMap.set(parsed.year, yEntry);\r\n }\r\n yEntry.rawValues.push(it.value);\r\n yEntry.count += itemCount;\r\n\r\n let mEntry = yEntry.monthMap.get(parsed.month);\r\n if (!mEntry) {\r\n mEntry = { rawValues: [], count: 0, dayMap: new Map() };\r\n yEntry.monthMap.set(parsed.month, mEntry);\r\n }\r\n mEntry.rawValues.push(it.value);\r\n mEntry.count += itemCount;\r\n\r\n let dEntry = mEntry.dayMap.get(parsed.day);\r\n if (!dEntry) {\r\n dEntry = { isoDate: parsed.isoDate, rawValues: [], count: 0 };\r\n mEntry.dayMap.set(parsed.day, dEntry);\r\n }\r\n dEntry.rawValues.push(it.value);\r\n dEntry.count += itemCount;\r\n }\r\n\r\n const years: DateYearNode[] = Array.from(yearMap.entries())\r\n .sort((a, b) => a[0] - b[0])\r\n .map(([year, yData]) => {\r\n const months: DateMonthNode[] = Array.from(yData.monthMap.entries())\r\n .sort((a, b) => a[0] - b[0])\r\n .map(([month, mData]) => {\r\n const days: DateDayNode[] = Array.from(mData.dayMap.entries())\r\n .sort((a, b) => a[0] - b[0])\r\n .map(([day, dData]) => ({\r\n year,\r\n month,\r\n day,\r\n isoDate: dData.isoDate,\r\n rawValues: dData.rawValues,\r\n count: dData.count,\r\n }));\r\n return {\r\n year,\r\n month,\r\n monthKey: `${year}-${month}`,\r\n rawValues: mData.rawValues,\r\n count: mData.count,\r\n days,\r\n };\r\n });\r\n return {\r\n year,\r\n rawValues: yData.rawValues,\r\n count: yData.count,\r\n months,\r\n };\r\n });\r\n\r\n return { blankItem, years, otherItems, minIsoDate, maxIsoDate };\r\n }, [isDateCol, allItems, search, locale, monthNames]);\r\n\r\n // Flatten visible Year > Month > Day tree rows for virtualized rendering\r\n const flatDateTreeRows = useMemo<FlatDateTreeRow[]>(() => {\r\n if (!isDateCol) return [];\r\n const rows: FlatDateTreeRow[] = [];\r\n const forceExpand = search.trim().length > 0;\r\n\r\n if (dateHierarchy.blankItem) {\r\n rows.push({\r\n kind: 'blank',\r\n key: '__blank__',\r\n item: dateHierarchy.blankItem,\r\n });\r\n }\r\n\r\n for (const yNode of dateHierarchy.years) {\r\n const yExpanded = forceExpand || expandedYears.has(yNode.year);\r\n rows.push({\r\n kind: 'year',\r\n key: `y_${yNode.year}`,\r\n year: yNode.year,\r\n rawValues: yNode.rawValues,\r\n count: yNode.count,\r\n monthCount: yNode.months.length,\r\n expanded: yExpanded,\r\n });\r\n\r\n if (yExpanded) {\r\n for (const mNode of yNode.months) {\r\n const mExpanded = forceExpand || expandedMonths.has(mNode.monthKey);\r\n rows.push({\r\n kind: 'month',\r\n key: `m_${mNode.monthKey}`,\r\n monthKey: mNode.monthKey,\r\n year: mNode.year,\r\n month: mNode.month,\r\n rawValues: mNode.rawValues,\r\n count: mNode.count,\r\n dayCount: mNode.days.length,\r\n expanded: mExpanded,\r\n });\r\n\r\n if (mExpanded) {\r\n for (const dNode of mNode.days) {\r\n rows.push({\r\n kind: 'day',\r\n key: `d_${dNode.isoDate}`,\r\n year: dNode.year,\r\n month: dNode.month,\r\n day: dNode.day,\r\n isoDate: dNode.isoDate,\r\n rawValues: dNode.rawValues,\r\n count: dNode.count,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n for (const oItem of dateHierarchy.otherItems) {\r\n rows.push({\r\n kind: 'other',\r\n key: `o_${String(oItem.value)}`,\r\n item: oItem,\r\n });\r\n }\r\n\r\n return rows;\r\n }, [isDateCol, dateHierarchy, expandedYears, expandedMonths, search]);\r\n\r\n const visibleItems = useMemo(() => {\r\n if (!search.trim()) return allItems;\r\n const q = search.toLowerCase().trim();\r\n if (isDateCol) {\r\n const matchedRawSet = new Set<any>();\r\n if (dateHierarchy.blankItem) matchedRawSet.add(dateHierarchy.blankItem.value);\r\n for (const y of dateHierarchy.years) {\r\n for (const rv of y.rawValues) matchedRawSet.add(rv);\r\n }\r\n for (const o of dateHierarchy.otherItems) matchedRawSet.add(o.value);\r\n return allItems.filter((it) => matchedRawSet.has(it.value));\r\n }\r\n return allItems.filter((it) => {\r\n const display = formatItemLabel(it).toLowerCase();\r\n return display.includes(q) || String(it.value).toLowerCase().includes(q);\r\n });\r\n }, [allItems, search, column, locale, isDateCol, dateHierarchy]);\r\n\r\n // Numeric column min/max/average statistics for quick condition presets\r\n const numericColumnStats = useMemo(() => {\r\n if (!isNumericCol || allItems.length === 0) return null;\r\n let min = Infinity;\r\n let max = -Infinity;\r\n let sum = 0;\r\n let totalCount = 0;\r\n let hasNegative = false;\r\n\r\n for (let i = 0; i < allItems.length; i++) {\r\n const it = allItems[i];\r\n if (it.value === BLANK_FILTER_TOKEN) continue;\r\n const num = FilterEngine.parseNumeric(it.value);\r\n if (!isNaN(num)) {\r\n const c = it.count ?? 1;\r\n if (num < min) min = num;\r\n if (num > max) max = num;\r\n if (num < 0) hasNegative = true;\r\n sum += num * c;\r\n totalCount += c;\r\n }\r\n }\r\n\r\n if (totalCount === 0 || !isFinite(min) || !isFinite(max)) return null;\r\n const avg = Math.round((sum / totalCount) * 100) / 100;\r\n return { min, max, avg, hasNegative };\r\n }, [isNumericCol, allItems]);\r\n\r\n // Live count of rows matching the current Condition Rule (scoped to context-aware allItems)\r\n const conditionMatchCount = useMemo(() => {\r\n const hasCondInput = condVal1.trim() !== '' || (operator === 'between' && condVal2.trim() !== '');\r\n if (!hasCondInput && operator !== '=') return null;\r\n const v1 = isNumericCol ? FilterEngine.parseNumeric(condVal1) : condVal1;\r\n const v2 = isNumericCol ? FilterEngine.parseNumeric(condVal2) : condVal2;\r\n const target = operator === 'between' ? [v1, v2] : v1;\r\n\r\n let matched = 0;\r\n let total = 0;\r\n for (let i = 0; i < allItems.length; i++) {\r\n const item = allItems[i];\r\n const itemCount = item.count ?? 1;\r\n total += itemCount;\r\n const rawVal = item.value === BLANK_FILTER_TOKEN ? '' : item.value;\r\n if (FilterEngine.match(rawVal, operator, target)) {\r\n matched += itemCount;\r\n }\r\n }\r\n return { matched, total };\r\n }, [condVal1, condVal2, operator, allItems, isNumericCol]);\r\n\r\n // Exact preview count of rows that will be displayed when the user clicks Apply\r\n const applyPreviewRowCount = useMemo(() => {\r\n const hasBetweenInput =\r\n isDateCol &&\r\n operator === 'between' &&\r\n (condVal1.trim() !== '' || condVal2.trim() !== '');\r\n\r\n if (tab === 'condition' || (isRangeDriven && hasBetweenInput)) {\r\n if (conditionMatchCount) {\r\n return conditionMatchCount.matched;\r\n }\r\n return allItems.reduce((acc, it) => acc + (it.count ?? 1), 0);\r\n }\r\n\r\n let sum = 0;\r\n for (let i = 0; i < allItems.length; i++) {\r\n const it = allItems[i];\r\n if (selectedSet.has(it.value)) {\r\n sum += it.count ?? 1;\r\n }\r\n }\r\n return sum;\r\n }, [\r\n tab,\r\n isDateCol,\r\n operator,\r\n condVal1,\r\n condVal2,\r\n isRangeDriven,\r\n conditionMatchCount,\r\n allItems,\r\n selectedSet,\r\n ]);\r\n\r\n const areAllVisibleChecked =\r\n visibleItems.length > 0 && visibleItems.every((it) => selectedSet.has(it.value));\r\n\r\n const isIndeterminate =\r\n visibleItems.some((it) => selectedSet.has(it.value)) && !areAllVisibleChecked;\r\n\r\n const toggleAllVisible = () => {\r\n setIsRangeDriven(false);\r\n const next = new Set(selectedSet);\r\n if (areAllVisibleChecked) {\r\n for (const it of visibleItems) {\r\n next.delete(it.value);\r\n }\r\n } else {\r\n for (const it of visibleItems) {\r\n next.add(it.value);\r\n }\r\n }\r\n setSelectedSet(next);\r\n };\r\n\r\n const toggleSingleItem = (val: any) => {\r\n setIsRangeDriven(false);\r\n const next = new Set(selectedSet);\r\n if (next.has(val)) {\r\n next.delete(val);\r\n } else {\r\n next.add(val);\r\n }\r\n setSelectedSet(next);\r\n };\r\n\r\n const toggleGroupValues = (rawValues: any[]) => {\r\n setIsRangeDriven(false);\r\n const next = new Set(selectedSet);\r\n const allChecked = rawValues.length > 0 && rawValues.every((v) => next.has(v));\r\n if (allChecked) {\r\n for (const v of rawValues) next.delete(v);\r\n } else {\r\n for (const v of rawValues) next.add(v);\r\n }\r\n setSelectedSet(next);\r\n };\r\n\r\n const toggleExpandYear = (year: number) => {\r\n setExpandedYears((prev) => {\r\n const next = new Set(prev);\r\n if (next.has(year)) next.delete(year);\r\n else next.add(year);\r\n return next;\r\n });\r\n };\r\n\r\n const toggleExpandMonth = (monthKey: string) => {\r\n setExpandedMonths((prev) => {\r\n const next = new Set(prev);\r\n if (next.has(monthKey)) next.delete(monthKey);\r\n else next.add(monthKey);\r\n return next;\r\n });\r\n };\r\n\r\n const areAllDateNodesExpanded = useMemo(() => {\r\n if (!isDateCol || dateHierarchy.years.length === 0) return false;\r\n return dateHierarchy.years.every(\r\n (y) =>\r\n expandedYears.has(y.year) &&\r\n y.months.every((m) => expandedMonths.has(m.monthKey))\r\n );\r\n }, [isDateCol, dateHierarchy.years, expandedYears, expandedMonths]);\r\n\r\n const toggleExpandCollapseAllDates = (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n if (areAllDateNodesExpanded) {\r\n setExpandedYears(new Set());\r\n setExpandedMonths(new Set());\r\n } else {\r\n const ySet = new Set<number>();\r\n const mSet = new Set<string>();\r\n for (const y of dateHierarchy.years) {\r\n ySet.add(y.year);\r\n for (const m of y.months) {\r\n mSet.add(m.monthKey);\r\n }\r\n }\r\n setExpandedYears(ySet);\r\n setExpandedMonths(mSet);\r\n }\r\n };\r\n\r\n const applyQuickDatePreset = (preset: 'today' | 'last7' | 'last30' | 'thisMonth' | 'thisYear' | 'lastYear' | 'fullRange') => {\r\n const now = new Date();\r\n let start = '';\r\n let end = '';\r\n\r\n if (preset === 'today') {\r\n start = toIsoDateString(now);\r\n end = start;\r\n } else if (preset === 'last7') {\r\n const d = new Date(now);\r\n d.setDate(d.getDate() - 7);\r\n start = toIsoDateString(d);\r\n end = toIsoDateString(now);\r\n } else if (preset === 'last30') {\r\n const d = new Date(now);\r\n d.setDate(d.getDate() - 30);\r\n start = toIsoDateString(d);\r\n end = toIsoDateString(now);\r\n } else if (preset === 'thisMonth') {\r\n const first = new Date(now.getFullYear(), now.getMonth(), 1);\r\n const last = new Date(now.getFullYear(), now.getMonth() + 1, 0);\r\n start = toIsoDateString(first);\r\n end = toIsoDateString(last);\r\n } else if (preset === 'thisYear') {\r\n start = `${now.getFullYear()}-01-01`;\r\n end = `${now.getFullYear()}-12-31`;\r\n } else if (preset === 'lastYear') {\r\n const ly = now.getFullYear() - 1;\r\n start = `${ly}-01-01`;\r\n end = `${ly}-12-31`;\r\n } else if (preset === 'fullRange') {\r\n start = dateHierarchy.minIsoDate;\r\n end = dateHierarchy.maxIsoDate;\r\n }\r\n\r\n applyDateRangeToTree(start, end, 'between');\r\n };\r\n\r\n const handleApply = () => {\r\n const hasBetweenInput =\r\n isDateCol &&\r\n operator === 'between' &&\r\n (condVal1.trim() !== '' || condVal2.trim() !== '');\r\n\r\n if (tab === 'values' && !(isRangeDriven && hasBetweenInput)) {\r\n if (allItems.length > 0 && selectedSet.size === allItems.length && !search.trim()) {\r\n onApply(null);\r\n } else {\r\n const semanticFilter = isDateCol\r\n ? compileSemanticDateTreeFilter(column.id, dateHierarchy, selectedSet)\r\n : undefined;\r\n onApply({\r\n columnId: column.id,\r\n mode: 'values',\r\n selectedValues: Array.from(selectedSet),\r\n ...(semanticFilter ? { semanticFilter } : {}),\r\n });\r\n }\r\n } else {\r\n const hasAnyVal =\r\n condVal1.trim() !== '' || (operator === 'between' && condVal2.trim() !== '');\r\n if (!hasAnyVal && operator !== '=') {\r\n onApply(null);\r\n } else {\r\n const normalizedV1 = isNumericCol\r\n ? (() => {\r\n const n = FilterEngine.parseNumeric(condVal1);\r\n return isNaN(n) ? condVal1 : n;\r\n })()\r\n : condVal1;\r\n const normalizedV2 = isNumericCol\r\n ? (() => {\r\n const n = FilterEngine.parseNumeric(condVal2);\r\n return isNaN(n) ? condVal2 : n;\r\n })()\r\n : condVal2;\r\n\r\n onApply({\r\n columnId: column.id,\r\n mode: 'condition',\r\n operator,\r\n value1: normalizedV1,\r\n value2: normalizedV2,\r\n });\r\n }\r\n }\r\n onClose();\r\n };\r\n\r\n const handleClear = () => {\r\n setSearch('');\r\n setCondVal1('');\r\n setCondVal2('');\r\n setIsRangeDriven(false);\r\n setSelectedSet(new Set(allItems.map((r) => r.value)));\r\n onApply(null);\r\n onClose();\r\n };\r\n\r\n const renderStructuredConditionInput = (\r\n val: string,\r\n setVal: (v: string) => void,\r\n placeholder: string,\r\n autoFocusRef?: React.RefObject<HTMLInputElement | null>\r\n ) => {\r\n // 1. Boolean Column -> True / False Select\r\n if (column.type === 'boolean') {\r\n return (\r\n <select\r\n value={val || 'true'}\r\n onChange={(e) => setVal(e.target.value)}\r\n style={{\r\n width: '100%',\r\n padding: '7px 8px',\r\n backgroundColor: theme.dom.inputBg,\r\n color: theme.dom.inputText,\r\n border: `1px solid ${theme.dom.inputBorder}`,\r\n borderRadius: 6,\r\n outline: 'none',\r\n fontSize: 12,\r\n }}\r\n >\r\n <option value=\"\">{isTR ? 'Seçiniz...' : 'Select...'}</option>\r\n <option value=\"true\">✓ {locale.trueText}</option>\r\n <option value=\"false\">✕ {locale.falseText}</option>\r\n </select>\r\n );\r\n }\r\n\r\n // 2. Select / Dropdown / Lookup / MultiSelect with Options\r\n if (\r\n (column.type === 'select' ||\r\n column.type === 'dropdown' ||\r\n column.type === 'lookup' ||\r\n column.type === 'multiselect') &&\r\n column.options &&\r\n column.options.length > 0 &&\r\n (operator === '=' || operator === '<>' || operator === 'contains')\r\n ) {\r\n return (\r\n <select\r\n value={val}\r\n onChange={(e) => setVal(e.target.value)}\r\n style={{\r\n width: '100%',\r\n padding: '7px 8px',\r\n backgroundColor: theme.dom.inputBg,\r\n color: theme.dom.inputText,\r\n border: `1px solid ${theme.dom.inputBorder}`,\r\n borderRadius: 6,\r\n outline: 'none',\r\n fontSize: 12,\r\n }}\r\n >\r\n <option value=\"\">{isTR ? 'Seçenek seçin...' : 'Choose option...'}</option>\r\n {column.options.map((opt) => (\r\n <option key={opt.value} value={opt.value}>\r\n {opt.label} {opt.subtitle ? `(${opt.subtitle})` : ''}\r\n </option>\r\n ))}\r\n </select>\r\n );\r\n }\r\n\r\n // 3. Date / DateTime Column -> Native Date Picker\r\n if (isDateCol) {\r\n return (\r\n <input\r\n ref={autoFocusRef}\r\n type=\"date\"\r\n value={val}\r\n onChange={(e) => setVal(e.target.value)}\r\n style={{\r\n width: '100%',\r\n padding: '6px 8px',\r\n backgroundColor: theme.dom.inputBg,\r\n color: theme.dom.inputText,\r\n border: `1px solid ${theme.dom.inputBorder}`,\r\n borderRadius: 6,\r\n outline: 'none',\r\n fontSize: 12,\r\n fontFamily: 'monospace',\r\n boxSizing: 'border-box',\r\n }}\r\n />\r\n );\r\n }\r\n\r\n // 4. Time Column -> Native Time Picker\r\n if (column.type === 'time') {\r\n return (\r\n <input\r\n ref={autoFocusRef}\r\n type=\"time\"\r\n value={val}\r\n onChange={(e) => setVal(e.target.value)}\r\n style={{\r\n width: '100%',\r\n padding: '6px 8px',\r\n backgroundColor: theme.dom.inputBg,\r\n color: theme.dom.inputText,\r\n border: `1px solid ${theme.dom.inputBorder}`,\r\n borderRadius: 6,\r\n outline: 'none',\r\n fontSize: 12,\r\n fontFamily: 'monospace',\r\n boxSizing: 'border-box',\r\n }}\r\n />\r\n );\r\n }\r\n\r\n // 5. Currency / Number / Percent / Progress / Rating -> Live Formatted Cell-Structured Input\r\n if (isNumericCol) {\r\n const sym =\r\n column.type === 'currency'\r\n ? column.currencySymbol || '$'\r\n : column.type === 'percent' || column.type === 'progress'\r\n ? '%'\r\n : column.type === 'rating'\r\n ? '★'\r\n : '';\r\n const prefixSym =\r\n (column.type === 'currency' && !isTR) || (column.type === 'progress' && isTR) ? sym : '';\r\n const suffixSym =\r\n (column.type === 'currency' && isTR) ||\r\n (column.type === 'progress' && !isTR) ||\r\n column.type === 'percent' ||\r\n column.type === 'rating'\r\n ? sym\r\n : '';\r\n\r\n const parsedNum = FilterEngine.parseNumeric(val);\r\n const cellPreview =\r\n val.trim() !== '' && !isNaN(parsedNum)\r\n ? formatCellStructureValue(parsedNum, column, locale)\r\n : null;\r\n\r\n return (\r\n <div>\r\n <div\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n backgroundColor: theme.dom.inputBg,\r\n border: `1px solid ${theme.dom.inputBorder}`,\r\n borderRadius: 6,\r\n padding: '0 8px',\r\n }}\r\n >\r\n {prefixSym && (\r\n <span\r\n style={{\r\n color: theme.dom.accentColor,\r\n fontWeight: 700,\r\n fontSize: 12,\r\n marginRight: 6,\r\n fontFamily: 'monospace',\r\n }}\r\n >\r\n {prefixSym}\r\n </span>\r\n )}\r\n <input\r\n ref={autoFocusRef}\r\n type=\"text\"\r\n inputMode=\"decimal\"\r\n value={val}\r\n onChange={(e) => {\r\n setVal(sanitizeNumericTyping(e.target.value));\r\n }}\r\n onBlur={() => {\r\n if (val.trim() !== '') {\r\n const num = FilterEngine.parseNumeric(val);\r\n if (!isNaN(num)) {\r\n setVal(formatNumericDisplay(num, isTR));\r\n }\r\n }\r\n }}\r\n placeholder={\r\n column.type === 'currency'\r\n ? isTR\r\n ? '15.000,47'\r\n : '15,000.47'\r\n : column.type === 'progress' || column.type === 'percent'\r\n ? '20'\r\n : placeholder\r\n }\r\n style={{\r\n flex: 1,\r\n padding: '6px 0',\r\n backgroundColor: 'transparent',\r\n color: theme.dom.inputText,\r\n border: 'none',\r\n outline: 'none',\r\n fontSize: 12.5,\r\n fontWeight: 600,\r\n fontFamily: theme.fontFamily,\r\n textAlign:\r\n column.type === 'currency' || column.type === 'number' || column.type === 'percent'\r\n ? 'right'\r\n : 'left',\r\n }}\r\n />\r\n {suffixSym && (\r\n <span\r\n style={{\r\n color: theme.dom.accentColor,\r\n fontWeight: 700,\r\n fontSize: 12,\r\n marginLeft: 6,\r\n fontFamily: 'monospace',\r\n }}\r\n >\r\n {suffixSym}\r\n </span>\r\n )}\r\n </div>\r\n {cellPreview && (\r\n <div\r\n style={{\r\n marginTop: 4,\r\n fontSize: 11,\r\n color: theme.dom.accentColor,\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n fontWeight: 600,\r\n }}\r\n >\r\n <span>{isTR ? 'Hücre biçimi:' : 'Cell format:'}</span>\r\n <span style={{ fontFamily: 'monospace' }}>{cellPreview}</span>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n // 6. Default Text / Email / URL / Phone / Object Input\r\n return (\r\n <input\r\n ref={autoFocusRef}\r\n type=\"text\"\r\n value={val}\r\n onChange={(e) => setVal(e.target.value)}\r\n placeholder={placeholder}\r\n style={{\r\n width: '100%',\r\n padding: '6px 8px',\r\n backgroundColor: theme.dom.inputBg,\r\n color: theme.dom.inputText,\r\n border: `1px solid ${theme.dom.inputBorder}`,\r\n borderRadius: 6,\r\n outline: 'none',\r\n fontSize: 12,\r\n boxSizing: 'border-box',\r\n }}\r\n />\r\n );\r\n };\r\n\r\n // Compute safe horizontal position inside viewport\r\n const popoverWidth = isDateCol ? Math.min(336, Math.max(295, viewportWidth - 20)) : 295;\r\n const rawLeft = anchorRect.x + anchorRect.width - popoverWidth;\r\n const safeLeft = Math.max(8, Math.min(rawLeft, viewportWidth - popoverWidth - 16));\r\n\r\n return (\r\n <div\r\n ref={popoverRef}\r\n onMouseDown={(e) => e.stopPropagation()}\r\n onClick={(e) => e.stopPropagation()}\r\n onDoubleClick={(e) => e.stopPropagation()}\r\n onKeyDown={(e) => {\r\n e.stopPropagation();\r\n if (e.key === 'Escape') onClose();\r\n if (e.key === 'Enter') handleApply();\r\n }}\r\n style={{\r\n position: 'absolute',\r\n left: safeLeft,\r\n top: anchorRect.y + anchorRect.height + 4,\r\n width: popoverWidth,\r\n zIndex: 150,\r\n backgroundColor: theme.dom.popoverBg,\r\n color: theme.dom.popoverText,\r\n border: `1px solid ${theme.dom.popoverBorder}`,\r\n borderRadius: 10,\r\n boxShadow: theme.dom.popoverShadow,\r\n backdropFilter: theme.dom.glassBackdrop,\r\n fontFamily: theme.fontFamily,\r\n fontSize: 12,\r\n overflow: 'hidden',\r\n userSelect: 'none',\r\n }}\r\n >\r\n {/* Header Title & Quick Sort/Group Actions */}\r\n <div\r\n style={{\r\n padding: '8px 12px',\r\n borderBottom: `1px solid ${theme.dom.popoverBorder}`,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 6,\r\n }}\r\n >\r\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\r\n <span style={{ fontWeight: 700, fontSize: 12 }}>{column.title}</span>\r\n <span\r\n style={{\r\n fontSize: 10,\r\n padding: '1px 6px',\r\n borderRadius: 4,\r\n backgroundColor: theme.dom.badgeBg,\r\n color: theme.dom.badgeText,\r\n textTransform: 'uppercase',\r\n fontFamily: 'monospace',\r\n }}\r\n >\r\n {column.type}\r\n </span>\r\n </div>\r\n\r\n <div style={{ display: 'flex', gap: 6 }}>\r\n {column.sortable !== false && onSort && (\r\n <>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n onSort(false);\r\n onClose();\r\n }}\r\n style={{\r\n flex: 1,\r\n padding: '4px 6px',\r\n fontSize: 11,\r\n borderRadius: 5,\r\n border: `1px solid ${theme.dom.popoverBorder}`,\r\n backgroundColor: 'transparent',\r\n color: theme.dom.popoverText,\r\n cursor: 'pointer',\r\n fontWeight: 500,\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: 4,\r\n }}\r\n >\r\n <MaterialIcon name=\"arrow_upward\" size={13} color={theme.dom.accentColor} />\r\n <span>{isTR ? 'Artan Sırala' : 'Sort A → Z'}</span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n onSort(true);\r\n onClose();\r\n }}\r\n style={{\r\n flex: 1,\r\n padding: '4px 6px',\r\n fontSize: 11,\r\n borderRadius: 5,\r\n border: `1px solid ${theme.dom.popoverBorder}`,\r\n backgroundColor: 'transparent',\r\n color: theme.dom.popoverText,\r\n cursor: 'pointer',\r\n fontWeight: 500,\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: 4,\r\n }}\r\n >\r\n <MaterialIcon name=\"arrow_downward\" size={13} color={theme.dom.accentColor} />\r\n <span>{isTR ? 'Azalan Sırala' : 'Sort Z → A'}</span>\r\n </button>\r\n </>\r\n )}\r\n {column.groupable !== false &&\r\n column.type !== 'sparkline' &&\r\n column.type !== 'action' &&\r\n onToggleGroup && (\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n onToggleGroup();\r\n onClose();\r\n }}\r\n style={{\r\n padding: '4px 8px',\r\n fontSize: 11,\r\n borderRadius: 5,\r\n border: `1px solid ${theme.dom.popoverBorder}`,\r\n backgroundColor: isGrouped ? theme.dom.accentColor : 'transparent',\r\n color: isGrouped ? '#FFFFFF' : theme.dom.popoverText,\r\n cursor: 'pointer',\r\n fontWeight: 500,\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: 4,\r\n }}\r\n >\r\n <MaterialIcon\r\n name=\"workspaces\"\r\n size={13}\r\n color={isGrouped ? '#FFFFFF' : theme.dom.accentColor}\r\n />\r\n <span>\r\n {isGrouped ? (isTR ? 'Grubu Kaldır' : 'Ungroup') : isTR ? 'Grupla' : 'Group'}\r\n </span>\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Mode Tabs: Values (Yıl > Ay > Gün for Dates) vs Condition (Tarih Aralığı / Between for Dates) */}\r\n <div\r\n style={{\r\n display: 'flex',\r\n borderBottom: `1px solid ${theme.dom.popoverBorder}`,\r\n backgroundColor: theme.isDark ? 'rgba(255,255,255,0.03)' : 'rgba(0,0,0,0.02)',\r\n }}\r\n >\r\n <button\r\n type=\"button\"\r\n onClick={() => setTab('values')}\r\n style={{\r\n flex: 1,\r\n padding: '7px 4px',\r\n fontSize: 11,\r\n fontWeight: tab === 'values' ? 700 : 500,\r\n border: 'none',\r\n borderBottom:\r\n tab === 'values' ? `2px solid ${theme.dom.accentColor}` : '2px solid transparent',\r\n backgroundColor: 'transparent',\r\n color: tab === 'values' ? theme.dom.accentColor : theme.dom.popoverText,\r\n cursor: 'pointer',\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: 4,\r\n }}\r\n >\r\n <MaterialIcon\r\n name={isDateCol ? 'account_tree' : 'checklist'}\r\n size={14}\r\n color={tab === 'values' ? theme.dom.accentColor : '#8E8E93'}\r\n />\r\n <span>\r\n {isDateCol\r\n ? isTR\r\n ? `Yıl > Ay > Gün (${selectedSet.size}/${allItems.length})`\r\n : `Year > Month > Day (${selectedSet.size}/${allItems.length})`\r\n : isTR\r\n ? `Değer Listesi (${selectedSet.size}/${allItems.length})`\r\n : `Value List (${selectedSet.size}/${allItems.length})`}\r\n </span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n setTab('condition');\r\n if (isDateCol && !activeFilter?.operator) {\r\n setOperator('between');\r\n }\r\n }}\r\n style={{\r\n flex: 1,\r\n padding: '7px 4px',\r\n fontSize: 11,\r\n fontWeight: tab === 'condition' ? 700 : 500,\r\n border: 'none',\r\n borderBottom:\r\n tab === 'condition' ? `2px solid ${theme.dom.accentColor}` : '2px solid transparent',\r\n backgroundColor: 'transparent',\r\n color: tab === 'condition' ? theme.dom.accentColor : theme.dom.popoverText,\r\n cursor: 'pointer',\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: 4,\r\n }}\r\n >\r\n <MaterialIcon\r\n name={isDateCol ? 'date_range' : 'filter_alt'}\r\n size={14}\r\n color={tab === 'condition' ? theme.dom.accentColor : '#8E8E93'}\r\n />\r\n <span>\r\n {isDateCol\r\n ? isTR\r\n ? 'Tarih Aralığı (Between)'\r\n : 'Date Range (Between)'\r\n : isTR\r\n ? 'Koşul Filtresi'\r\n : 'Condition Rule'}\r\n </span>\r\n </button>\r\n </div>\r\n\r\n {tab === 'values' ? (\r\n <>\r\n {/* Inline Between Date Range Selector for Date / DateTime Columns */}\r\n {isDateCol && (\r\n <div\r\n style={{\r\n padding: '8px 12px',\r\n borderBottom: `1px solid ${theme.dom.popoverBorder}`,\r\n backgroundColor: theme.isDark\r\n ? 'rgba(10, 132, 255, 0.06)'\r\n : 'rgba(0, 122, 255, 0.035)',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 6,\r\n }}\r\n >\r\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\r\n <span\r\n style={{\r\n fontSize: 10.5,\r\n fontWeight: 700,\r\n color: theme.dom.accentColor,\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 4,\r\n }}\r\n >\r\n <MaterialIcon name=\"date_range\" size={14} color={theme.dom.accentColor} />\r\n <span>{isTR ? 'Tarih Aralığı (Between)' : 'Date Range (Between)'}</span>\r\n </span>\r\n {(condVal1 || condVal2) && (\r\n <button\r\n type=\"button\"\r\n onClick={() => applyDateRangeToTree('', '', 'between')}\r\n style={{\r\n border: 'none',\r\n background: 'transparent',\r\n color: '#EF4444',\r\n fontSize: 10.5,\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n padding: 0,\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 2,\r\n }}\r\n >\r\n <MaterialIcon name=\"close\" size={13} color=\"#EF4444\" />\r\n <span>{isTR ? 'Aralığı Sıfırla' : 'Reset Range'}</span>\r\n </button>\r\n )}\r\n </div>\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>\r\n <input\r\n type=\"date\"\r\n value={condVal1}\r\n onChange={(e) => applyDateRangeToTree(e.target.value, condVal2, 'between')}\r\n title={isTR ? 'Başlangıç Tarihi' : 'Start Date'}\r\n style={{\r\n flex: 1,\r\n minWidth: 0,\r\n padding: '4px 6px',\r\n backgroundColor: theme.dom.inputBg,\r\n color: theme.dom.inputText,\r\n border: `1px solid ${\r\n condVal1 ? theme.dom.accentColor : theme.dom.inputBorder\r\n }`,\r\n borderRadius: 5,\r\n outline: 'none',\r\n fontSize: 11,\r\n fontFamily: 'monospace',\r\n boxSizing: 'border-box',\r\n }}\r\n />\r\n <MaterialIcon name=\"arrow_forward\" size={14} color=\"#8E8E93\" />\r\n <input\r\n type=\"date\"\r\n value={condVal2}\r\n onChange={(e) => applyDateRangeToTree(condVal1, e.target.value, 'between')}\r\n title={isTR ? 'Bitiş Tarihi' : 'End Date'}\r\n style={{\r\n flex: 1,\r\n minWidth: 0,\r\n padding: '4px 6px',\r\n backgroundColor: theme.dom.inputBg,\r\n color: theme.dom.inputText,\r\n border: `1px solid ${\r\n condVal2 ? theme.dom.accentColor : theme.dom.inputBorder\r\n }`,\r\n borderRadius: 5,\r\n outline: 'none',\r\n fontSize: 11,\r\n fontFamily: 'monospace',\r\n boxSizing: 'border-box',\r\n }}\r\n />\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Search Input */}\r\n <div style={{ padding: '8px 12px', borderBottom: `1px solid ${theme.dom.popoverBorder}` }}>\r\n <input\r\n ref={searchInputRef}\r\n type=\"text\"\r\n value={search}\r\n onChange={(e) => {\r\n const nextQuery = e.target.value;\r\n setSearch(nextQuery);\r\n setListScrollTop(0);\r\n const q = nextQuery.toLowerCase().trim();\r\n if (q) {\r\n if (isDateCol) {\r\n const matched: any[] = [];\r\n for (const it of allItems) {\r\n if (\r\n it.value === BLANK_FILTER_TOKEN ||\r\n it.value === null ||\r\n it.value === undefined ||\r\n it.value === ''\r\n ) {\r\n if (locale.emptyText.toLowerCase().includes(q)) matched.push(it.value);\r\n continue;\r\n }\r\n const p = FilterEngine.parseDateParts(it.value);\r\n if (p) {\r\n const mName = monthNames[p.month - 1].toLowerCase();\r\n const mNumPad = String(p.month).padStart(2, '0');\r\n const dNumPad = String(p.day).padStart(2, '0');\r\n const dmyStr = `${dNumPad}.${mNumPad}.${p.year}`;\r\n if (\r\n String(p.year).includes(q) ||\r\n mName.includes(q) ||\r\n mNumPad.includes(q) ||\r\n dNumPad.includes(q) ||\r\n p.isoDate.includes(q) ||\r\n dmyStr.includes(q)\r\n ) {\r\n matched.push(it.value);\r\n }\r\n } else if (String(it.value).toLowerCase().includes(q)) {\r\n matched.push(it.value);\r\n }\r\n }\r\n setSelectedSet(new Set(matched));\r\n } else {\r\n const matched = allItems.filter((it) => {\r\n const display = formatItemLabel(it).toLowerCase();\r\n return display.includes(q) || String(it.value).toLowerCase().includes(q);\r\n });\r\n setSelectedSet(new Set(matched.map((m) => m.value)));\r\n }\r\n } else if (\r\n activeFilter &&\r\n activeFilter.mode === 'values' &&\r\n activeFilter.selectedValues\r\n ) {\r\n setSelectedSet(new Set(activeFilter.selectedValues));\r\n } else {\r\n setSelectedSet(new Set(allItems.map((r) => r.value)));\r\n }\r\n }}\r\n placeholder={\r\n isDateCol\r\n ? isTR\r\n ? 'Yıl, ay veya gün ara (ör. 2026, Haziran)...'\r\n : 'Search year, month or day (e.g. 2026, June)...'\r\n : locale.searchValuesPlaceholder\r\n }\r\n style={{\r\n width: '100%',\r\n padding: '6px 8px',\r\n backgroundColor: theme.dom.inputBg,\r\n color: theme.dom.inputText,\r\n border: `1px solid ${theme.dom.inputBorder}`,\r\n borderRadius: 5,\r\n outline: 'none',\r\n fontSize: 12,\r\n boxSizing: 'border-box',\r\n }}\r\n />\r\n </div>\r\n\r\n {/* Select All Bar + Expand/Collapse All for Date Tree */}\r\n <div\r\n onClick={toggleAllVisible}\r\n style={{\r\n padding: '7px 12px',\r\n borderBottom: `1px solid ${theme.dom.popoverBorder}`,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n cursor: 'pointer',\r\n fontWeight: 600,\r\n backgroundColor: theme.isDark ? 'rgba(255,255,255,0.02)' : 'rgba(0,0,0,0.015)',\r\n }}\r\n >\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\r\n <input\r\n type=\"checkbox\"\r\n checked={areAllVisibleChecked}\r\n ref={(el) => {\r\n if (el) el.indeterminate = isIndeterminate;\r\n }}\r\n onChange={() => {}}\r\n style={{\r\n cursor: 'pointer',\r\n accentColor: theme.dom.accentColor,\r\n width: 14,\r\n height: 14,\r\n }}\r\n />\r\n <span>\r\n {search.trim()\r\n ? isTR\r\n ? '(Arama Sonuçlarını Seç)'\r\n : '(Select Search Results)'\r\n : locale.selectAll}\r\n </span>\r\n </div>\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\r\n {isDateCol && dateHierarchy.years.length > 0 && (\r\n <button\r\n type=\"button\"\r\n onClick={toggleExpandCollapseAllDates}\r\n style={{\r\n padding: '2px 6px',\r\n fontSize: 10,\r\n fontWeight: 600,\r\n borderRadius: 4,\r\n border: `1px solid ${theme.dom.popoverBorder}`,\r\n backgroundColor: 'transparent',\r\n color: theme.dom.accentColor,\r\n cursor: 'pointer',\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 3,\r\n }}\r\n >\r\n <MaterialIcon\r\n name={areAllDateNodesExpanded ? 'unfold_less' : 'unfold_more'}\r\n size={13}\r\n color={theme.dom.accentColor}\r\n />\r\n <span>\r\n {areAllDateNodesExpanded\r\n ? isTR\r\n ? 'Daralt'\r\n : 'Collapse'\r\n : isTR\r\n ? 'Tümünü Aç'\r\n : 'Expand All'}\r\n </span>\r\n </button>\r\n )}\r\n <span style={{ fontSize: 10, color: '#8E8E93' }}>\r\n {selectedSet.size} / {allItems.length}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {/* Virtualized Distinct Values or Semantic Year > Month > Day Tree */}\r\n <div\r\n onScroll={(e) => setListScrollTop(e.currentTarget.scrollTop)}\r\n style={{ height: 210, overflowY: 'auto', padding: '4px 6px', position: 'relative' }}\r\n >\r\n {loading && allItems.length === 0 ? (\r\n <div style={{ padding: '12px 8px', color: '#8E8E93' }}>{locale.loading}</div>\r\n ) : isDateCol ? (\r\n flatDateTreeRows.length === 0 ? (\r\n <div style={{ padding: '12px 8px', color: '#8E8E93' }}>{locale.noMatches}</div>\r\n ) : (\r\n (() => {\r\n const ITEM_H = 28;\r\n const totalH = flatDateTreeRows.length * ITEM_H;\r\n const startIdx = Math.max(0, Math.floor(listScrollTop / ITEM_H) - 3);\r\n const endIdx = Math.min(\r\n flatDateTreeRows.length - 1,\r\n Math.ceil((listScrollTop + 210) / ITEM_H) + 3\r\n );\r\n const slice = flatDateTreeRows.slice(startIdx, endIdx + 1);\r\n\r\n return (\r\n <div style={{ height: totalH, position: 'relative' }}>\r\n {slice.map((row, idx) => {\r\n const realIdx = startIdx + idx;\r\n const topPos = realIdx * ITEM_H;\r\n\r\n if (row.kind === 'blank' || row.kind === 'other') {\r\n const it = row.item;\r\n const isChecked = selectedSet.has(it.value);\r\n return (\r\n <div\r\n key={row.key}\r\n onClick={() => toggleSingleItem(it.value)}\r\n style={{\r\n position: 'absolute',\r\n top: topPos,\r\n left: 0,\r\n right: 0,\r\n height: ITEM_H - 2,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n padding: '0 8px',\r\n borderRadius: 5,\r\n cursor: 'pointer',\r\n backgroundColor: isChecked\r\n ? theme.isDark\r\n ? 'rgba(10, 132, 255, 0.12)'\r\n : 'rgba(0, 122, 255, 0.06)'\r\n : 'transparent',\r\n boxSizing: 'border-box',\r\n }}\r\n >\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\r\n <input\r\n type=\"checkbox\"\r\n checked={isChecked}\r\n onChange={() => {}}\r\n style={{\r\n cursor: 'pointer',\r\n accentColor: theme.dom.accentColor,\r\n width: 14,\r\n height: 14,\r\n }}\r\n />\r\n <span style={{ fontWeight: isChecked ? 600 : 400 }}>\r\n {formatItemLabel(it)}\r\n </span>\r\n </div>\r\n {it.count !== undefined && (\r\n <span style={{ color: '#8E8E93', fontSize: 11 }}>{it.count}</span>\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n if (row.kind === 'year') {\r\n const isChecked =\r\n row.rawValues.length > 0 &&\r\n row.rawValues.every((v) => selectedSet.has(v));\r\n const isIndet =\r\n !isChecked && row.rawValues.some((v) => selectedSet.has(v));\r\n\r\n return (\r\n <div\r\n key={row.key}\r\n onClick={() => toggleExpandYear(row.year)}\r\n style={{\r\n position: 'absolute',\r\n top: topPos,\r\n left: 0,\r\n right: 0,\r\n height: ITEM_H - 2,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n padding: '0 8px 0 6px',\r\n borderRadius: 6,\r\n cursor: 'pointer',\r\n backgroundColor: isChecked\r\n ? theme.isDark\r\n ? 'rgba(10, 132, 255, 0.14)'\r\n : 'rgba(0, 122, 255, 0.08)'\r\n : 'transparent',\r\n boxSizing: 'border-box',\r\n }}\r\n >\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>\r\n <span\r\n style={{\r\n width: 18,\r\n height: 18,\r\n borderRadius: 4,\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n backgroundColor: row.expanded\r\n ? theme.isDark\r\n ? 'rgba(10, 132, 255, 0.22)'\r\n : 'rgba(0, 122, 255, 0.14)'\r\n : theme.isDark\r\n ? 'rgba(255, 255, 255, 0.07)'\r\n : 'rgba(0, 0, 0, 0.05)',\r\n flexShrink: 0,\r\n }}\r\n >\r\n <MaterialIcon\r\n name={row.expanded ? 'expand_more' : 'chevron_right'}\r\n size={16}\r\n color={theme.dom.accentColor}\r\n />\r\n </span>\r\n <input\r\n type=\"checkbox\"\r\n checked={isChecked}\r\n ref={(el) => {\r\n if (el) el.indeterminate = isIndet;\r\n }}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n toggleGroupValues(row.rawValues);\r\n }}\r\n onChange={() => {}}\r\n style={{\r\n cursor: 'pointer',\r\n accentColor: theme.dom.accentColor,\r\n width: 14,\r\n height: 14,\r\n }}\r\n />\r\n <MaterialIcon\r\n name=\"calendar_today\"\r\n size={13}\r\n color={theme.dom.accentColor}\r\n />\r\n <span style={{ fontWeight: 700, fontSize: 12.5 }}>{row.year}</span>\r\n <span\r\n style={{\r\n fontSize: 9.5,\r\n padding: '1px 5px',\r\n borderRadius: 4,\r\n backgroundColor: theme.dom.badgeBg,\r\n color: theme.dom.badgeText,\r\n fontWeight: 600,\r\n }}\r\n >\r\n {isTR ? 'YIL' : 'YEAR'}\r\n </span>\r\n </div>\r\n <span style={{ color: '#8E8E93', fontSize: 11, fontWeight: 600 }}>\r\n {row.count}\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n if (row.kind === 'month') {\r\n const isChecked =\r\n row.rawValues.length > 0 &&\r\n row.rawValues.every((v) => selectedSet.has(v));\r\n const isIndet =\r\n !isChecked && row.rawValues.some((v) => selectedSet.has(v));\r\n const mName = monthNames[row.month - 1];\r\n const mNumStr = String(row.month).padStart(2, '0');\r\n\r\n return (\r\n <div\r\n key={row.key}\r\n onClick={() => toggleExpandMonth(row.monthKey)}\r\n style={{\r\n position: 'absolute',\r\n top: topPos,\r\n left: 0,\r\n right: 0,\r\n height: ITEM_H - 2,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n padding: '0 8px 0 22px',\r\n borderRadius: 6,\r\n cursor: 'pointer',\r\n backgroundColor: isChecked\r\n ? theme.isDark\r\n ? 'rgba(10, 132, 255, 0.1)'\r\n : 'rgba(0, 122, 255, 0.05)'\r\n : 'transparent',\r\n boxSizing: 'border-box',\r\n }}\r\n >\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>\r\n <span\r\n style={{\r\n width: 18,\r\n height: 18,\r\n borderRadius: 4,\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n backgroundColor: row.expanded\r\n ? theme.isDark\r\n ? 'rgba(10, 132, 255, 0.18)'\r\n : 'rgba(0, 122, 255, 0.12)'\r\n : theme.isDark\r\n ? 'rgba(255, 255, 255, 0.06)'\r\n : 'rgba(0, 0, 0, 0.04)',\r\n flexShrink: 0,\r\n }}\r\n >\r\n <MaterialIcon\r\n name={row.expanded ? 'expand_more' : 'chevron_right'}\r\n size={15}\r\n color={row.expanded ? theme.dom.accentColor : '#8E8E93'}\r\n />\r\n </span>\r\n <input\r\n type=\"checkbox\"\r\n checked={isChecked}\r\n ref={(el) => {\r\n if (el) el.indeterminate = isIndet;\r\n }}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n toggleGroupValues(row.rawValues);\r\n }}\r\n onChange={() => {}}\r\n style={{\r\n cursor: 'pointer',\r\n accentColor: theme.dom.accentColor,\r\n width: 14,\r\n height: 14,\r\n }}\r\n />\r\n <MaterialIcon\r\n name=\"date_range\"\r\n size={13}\r\n color={isChecked ? theme.dom.accentColor : '#8E8E93'}\r\n />\r\n <span style={{ fontWeight: 600, fontSize: 12 }}>\r\n {mNumStr} - {mName}\r\n </span>\r\n </div>\r\n <span style={{ color: '#8E8E93', fontSize: 11 }}>{row.count}</span>\r\n </div>\r\n );\r\n }\r\n\r\n // row.kind === 'day'\r\n const isChecked =\r\n row.rawValues.length > 0 &&\r\n row.rawValues.every((v) => selectedSet.has(v));\r\n const dayStr = String(row.day).padStart(2, '0');\r\n const mNameShort = monthNames[row.month - 1];\r\n\r\n return (\r\n <div\r\n key={row.key}\r\n onClick={() => toggleGroupValues(row.rawValues)}\r\n style={{\r\n position: 'absolute',\r\n top: topPos,\r\n left: 0,\r\n right: 0,\r\n height: ITEM_H - 2,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n padding: '0 8px 0 46px',\r\n borderRadius: 6,\r\n cursor: 'pointer',\r\n backgroundColor: isChecked\r\n ? theme.isDark\r\n ? 'rgba(10, 132, 255, 0.12)'\r\n : 'rgba(0, 122, 255, 0.06)'\r\n : 'transparent',\r\n boxSizing: 'border-box',\r\n }}\r\n >\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>\r\n <input\r\n type=\"checkbox\"\r\n checked={isChecked}\r\n onChange={() => {}}\r\n style={{\r\n cursor: 'pointer',\r\n accentColor: theme.dom.accentColor,\r\n width: 14,\r\n height: 14,\r\n }}\r\n />\r\n <MaterialIcon\r\n name=\"event\"\r\n size={13}\r\n color={isChecked ? theme.dom.accentColor : '#8E8E93'}\r\n />\r\n <span style={{ fontWeight: isChecked ? 700 : 500, fontSize: 12 }}>\r\n {dayStr} {mNameShort}\r\n </span>\r\n <span\r\n style={{\r\n fontSize: 10.5,\r\n color: '#8E8E93',\r\n fontFamily: 'monospace',\r\n }}\r\n >\r\n ({FilterEngine.formatLocalizedDate(row.isoDate, locale.code)})\r\n </span>\r\n </div>\r\n <span style={{ color: '#8E8E93', fontSize: 11 }}>{row.count}</span>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n })()\r\n )\r\n ) : visibleItems.length === 0 ? (\r\n <div style={{ padding: '12px 8px', color: '#8E8E93' }}>{locale.noMatches}</div>\r\n ) : (\r\n (() => {\r\n const ITEM_H = 28;\r\n const totalH = visibleItems.length * ITEM_H;\r\n const startIdx = Math.max(0, Math.floor(listScrollTop / ITEM_H) - 3);\r\n const endIdx = Math.min(\r\n visibleItems.length - 1,\r\n Math.ceil((listScrollTop + 210) / ITEM_H) + 3\r\n );\r\n const slice = visibleItems.slice(startIdx, endIdx + 1);\r\n\r\n return (\r\n <div style={{ height: totalH, position: 'relative' }}>\r\n {slice.map((it, idx) => {\r\n const realIdx = startIdx + idx;\r\n const isChecked = selectedSet.has(it.value);\r\n const optMatch =\r\n column.type === 'select' ||\r\n column.type === 'dropdown' ||\r\n column.type === 'lookup' ||\r\n column.type === 'multiselect'\r\n ? column.options?.find((o) => o.value === it.value)\r\n : undefined;\r\n return (\r\n <div\r\n key={String(it.value)}\r\n onClick={() => toggleSingleItem(it.value)}\r\n style={{\r\n position: 'absolute',\r\n top: realIdx * ITEM_H,\r\n left: 0,\r\n right: 0,\r\n height: ITEM_H - 2,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n padding: '0 8px',\r\n borderRadius: 5,\r\n cursor: 'pointer',\r\n backgroundColor: isChecked\r\n ? theme.isDark\r\n ? 'rgba(10, 132, 255, 0.12)'\r\n : 'rgba(0, 122, 255, 0.06)'\r\n : 'transparent',\r\n boxSizing: 'border-box',\r\n }}\r\n >\r\n <div\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 8,\r\n overflow: 'hidden',\r\n }}\r\n >\r\n <input\r\n type=\"checkbox\"\r\n checked={isChecked}\r\n onChange={() => {}}\r\n style={{\r\n cursor: 'pointer',\r\n accentColor: theme.dom.accentColor,\r\n width: 14,\r\n height: 14,\r\n flexShrink: 0,\r\n }}\r\n />\r\n {optMatch && (\r\n <span\r\n style={{\r\n width: 8,\r\n height: 8,\r\n borderRadius: '50%',\r\n backgroundColor: theme.isDark\r\n ? optMatch.darkFg || '#60A5FA'\r\n : optMatch.fg || '#2563EB',\r\n flexShrink: 0,\r\n }}\r\n />\r\n )}\r\n {column.type === 'color' && typeof it.value === 'string' && (\r\n <span\r\n style={{\r\n width: 10,\r\n height: 10,\r\n borderRadius: 3,\r\n backgroundColor: it.value,\r\n border: '1px solid rgba(255,255,255,0.25)',\r\n flexShrink: 0,\r\n }}\r\n />\r\n )}\r\n <span\r\n style={{\r\n textOverflow: 'ellipsis',\r\n overflow: 'hidden',\r\n whiteSpace: 'nowrap',\r\n fontWeight: isChecked ? 600 : 400,\r\n }}\r\n >\r\n {formatItemLabel(it)}\r\n </span>\r\n </div>\r\n {it.count !== undefined && (\r\n <span\r\n style={{\r\n color: '#8E8E93',\r\n fontSize: 11,\r\n marginLeft: 6,\r\n flexShrink: 0,\r\n }}\r\n >\r\n {it.count}\r\n </span>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n })()\r\n )}\r\n </div>\r\n </>\r\n ) : (\r\n /* Condition / Date Range (Between) Filter Tab */\r\n <div style={{ padding: '12px', display: 'flex', flexDirection: 'column', gap: 10 }}>\r\n <div>\r\n <label style={{ display: 'block', fontSize: 11, color: '#8E8E93', marginBottom: 4 }}>\r\n {isDateCol\r\n ? isTR\r\n ? 'Tarih Filtre Modu'\r\n : 'Date Filter Mode'\r\n : isTR\r\n ? 'Operatör'\r\n : 'Operator'}\r\n </label>\r\n <select\r\n value={operator}\r\n onChange={(e) => {\r\n const nextOp = e.target.value as FilterOperation;\r\n if (isDateCol) {\r\n applyDateRangeToTree(condVal1, condVal2, nextOp);\r\n } else {\r\n syncConditionToSelection(condVal1, condVal2, nextOp);\r\n }\r\n }}\r\n style={{\r\n width: '100%',\r\n padding: '6px 8px',\r\n backgroundColor: theme.dom.inputBg,\r\n color: theme.dom.inputText,\r\n border: `1px solid ${theme.dom.inputBorder}`,\r\n borderRadius: 6,\r\n outline: 'none',\r\n fontSize: 12,\r\n }}\r\n >\r\n {isDateCol ? (\r\n <>\r\n <option value=\"between\">\r\n {isTR ? 'Tarih Aralığı (Between)' : 'Date Range (Between)'}\r\n </option>\r\n <option value=\">=\">\r\n {isTR ? 'Başlangıç Tarihi ve Sonrası (≥)' : 'On or After (≥)'}\r\n </option>\r\n <option value=\"<=\">\r\n {isTR ? 'Bitiş Tarihi ve Öncesi (≤)' : 'On or Before (≤)'}\r\n </option>\r\n <option value=\"=\">{isTR ? 'Tam Tarih Eşittir (=)' : 'Exact Date (=)'}</option>\r\n <option value=\"<>\">\r\n {isTR ? 'Bu Tarih Hariç (≠)' : 'Does Not Equal (≠)'}\r\n </option>\r\n <option value=\">\">{isTR ? 'Bu Tarihten Sonra (>)' : 'After (>)'}</option>\r\n <option value=\"<\">{isTR ? 'Bu Tarihten Önce (<)' : 'Before (<)'}</option>\r\n </>\r\n ) : isNumericCol ? (\r\n <>\r\n <option value=\"<\">{isTR ? 'Küçüktür (<)' : 'Less than (<)'}</option>\r\n <option value=\"<=\">{isTR ? 'Küçük veya Eşit (≤)' : 'Less or equal (≤)'}</option>\r\n <option value=\">\">{isTR ? 'Büyüktür (>)' : 'Greater than (>)'}</option>\r\n <option value=\">=\">{isTR ? 'Büyük veya Eşit (≥)' : 'Greater or equal (≥)'}</option>\r\n <option value=\"=\">{isTR ? 'Eşittir (=)' : 'Equals (=)'}</option>\r\n <option value=\"<>\">{isTR ? 'Eşit Değildir (≠)' : 'Does not equal (≠)'}</option>\r\n <option value=\"between\">{isTR ? 'Arasında (Between)' : 'Between'}</option>\r\n <option value=\"contains\">{isTR ? 'İçerir (Contains)' : 'Contains'}</option>\r\n </>\r\n ) : (\r\n <>\r\n <option value=\"contains\">{isTR ? 'İçerir (Contains)' : 'Contains'}</option>\r\n <option value=\"notcontains\">\r\n {isTR ? 'İçermez (Does not contain)' : 'Does not contain'}\r\n </option>\r\n <option value=\"=\">{isTR ? 'Eşittir (=)' : 'Equals (=)'}</option>\r\n <option value=\"<>\">{isTR ? 'Eşit Değildir (≠)' : 'Does not equal (≠)'}</option>\r\n <option value=\"startswith\">{isTR ? 'İle Başlar (Starts with)' : 'Starts with'}</option>\r\n <option value=\"endswith\">{isTR ? 'İle Biter (Ends with)' : 'Ends with'}</option>\r\n <option value=\">\">{isTR ? 'Büyüktür (>)' : 'Greater than (>)'}</option>\r\n <option value=\">=\">{isTR ? 'Büyük veya Eşit (≥)' : 'Greater or equal (≥)'}</option>\r\n <option value=\"<\">{isTR ? 'Küçüktür (<)' : 'Less than (<)'}</option>\r\n <option value=\"<=\">{isTR ? 'Küçük veya Eşit (≤)' : 'Less or equal (≤)'}</option>\r\n <option value=\"between\">{isTR ? 'Arasında (Between)' : 'Between'}</option>\r\n </>\r\n )}\r\n </select>\r\n </div>\r\n\r\n <div>\r\n <label style={{ display: 'block', fontSize: 11, color: '#8E8E93', marginBottom: 4 }}>\r\n {operator === 'between'\r\n ? isDateCol\r\n ? isTR\r\n ? 'Başlangıç Tarihi (Yıl - Ay - Gün)'\r\n : 'Start Date (YYYY-MM-DD)'\r\n : isTR\r\n ? 'Başlangıç Değeri'\r\n : 'Minimum Value'\r\n : isDateCol\r\n ? isTR\r\n ? 'Tarih (Yıl - Ay - Gün)'\r\n : 'Date (YYYY-MM-DD)'\r\n : isTR\r\n ? 'Değer'\r\n : 'Value'}\r\n </label>\r\n {renderStructuredConditionInput(\r\n condVal1,\r\n (v) => {\r\n if (isDateCol) applyDateRangeToTree(v, condVal2, operator);\r\n else syncConditionToSelection(v, condVal2, operator);\r\n },\r\n isTR ? 'Değer girin...' : 'Enter value...',\r\n condInputRef\r\n )}\r\n </div>\r\n\r\n {operator === 'between' && (\r\n <div>\r\n <label style={{ display: 'block', fontSize: 11, color: '#8E8E93', marginBottom: 4 }}>\r\n {isDateCol\r\n ? isTR\r\n ? 'Bitiş Tarihi (Yıl - Ay - Gün)'\r\n : 'End Date (YYYY-MM-DD)'\r\n : isTR\r\n ? 'Bitiş Değeri'\r\n : 'Maximum Value'}\r\n </label>\r\n {renderStructuredConditionInput(\r\n condVal2,\r\n (v) => {\r\n if (isDateCol) applyDateRangeToTree(condVal1, v, operator);\r\n else syncConditionToSelection(condVal1, v, operator);\r\n },\r\n isTR ? 'Maksimum değer...' : 'Enter max value...'\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Quick Numeric Threshold Presets */}\r\n {isNumericCol && numericColumnStats && (\r\n <div>\r\n <label style={{ display: 'block', fontSize: 10.5, color: '#8E8E93', marginBottom: 5 }}>\r\n {isTR ? 'Hızlı Eşik Seçimi' : 'Quick Threshold Presets'}\r\n </label>\r\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 5 }}>\r\n {[\r\n ...(numericColumnStats.hasNegative\r\n ? [\r\n {\r\n id: 'pos',\r\n label: isTR ? 'Pozitif (> 0)' : 'Positive (> 0)',\r\n op: '>' as FilterOperation,\r\n v1: '0',\r\n v2: '',\r\n },\r\n {\r\n id: 'neg',\r\n label: isTR ? 'Negatif (< 0)' : 'Negative (< 0)',\r\n op: '<' as FilterOperation,\r\n v1: '0',\r\n v2: '',\r\n },\r\n ]\r\n : []),\r\n {\r\n id: 'leAvg',\r\n label: isTR\r\n ? `≤ Ort. (${formatCellStructureValue(numericColumnStats.avg, column, locale)})`\r\n : `≤ Avg (${formatCellStructureValue(numericColumnStats.avg, column, locale)})`,\r\n op: '<=' as FilterOperation,\r\n v1: formatNumericDisplay(numericColumnStats.avg, isTR),\r\n v2: '',\r\n },\r\n {\r\n id: 'geAvg',\r\n label: isTR\r\n ? `≥ Ort. (${formatCellStructureValue(numericColumnStats.avg, column, locale)})`\r\n : `≥ Avg (${formatCellStructureValue(numericColumnStats.avg, column, locale)})`,\r\n op: '>=' as FilterOperation,\r\n v1: formatNumericDisplay(numericColumnStats.avg, isTR),\r\n v2: '',\r\n },\r\n {\r\n id: 'minMax',\r\n label: isTR\r\n ? `Min → Maks (${formatNumericDisplay(numericColumnStats.min, isTR)} – ${formatNumericDisplay(numericColumnStats.max, isTR)})`\r\n : `Min → Max (${formatNumericDisplay(numericColumnStats.min, isTR)} – ${formatNumericDisplay(numericColumnStats.max, isTR)})`,\r\n op: 'between' as FilterOperation,\r\n v1: formatNumericDisplay(numericColumnStats.min, isTR),\r\n v2: formatNumericDisplay(numericColumnStats.max, isTR),\r\n },\r\n ].map((preset) => (\r\n <button\r\n key={preset.id}\r\n type=\"button\"\r\n onClick={() => syncConditionToSelection(preset.v1, preset.v2, preset.op)}\r\n style={{\r\n padding: '4px 8px',\r\n fontSize: 10.5,\r\n fontWeight: 600,\r\n borderRadius: 5,\r\n border: `1px solid ${theme.dom.popoverBorder}`,\r\n backgroundColor: theme.isDark\r\n ? 'rgba(255,255,255,0.04)'\r\n : 'rgba(0,0,0,0.03)',\r\n color: theme.dom.popoverText,\r\n cursor: 'pointer',\r\n }}\r\n >\r\n {preset.label}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Quick Semantic Date Range Presets */}\r\n {isDateCol && (\r\n <div>\r\n <label style={{ display: 'block', fontSize: 10.5, color: '#8E8E93', marginBottom: 5 }}>\r\n {isTR ? 'Hızlı Tarih Aralığı Seçimi' : 'Quick Date Range Presets'}\r\n </label>\r\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 5 }}>\r\n {[\r\n { id: 'today' as const, label: isTR ? 'Bugün' : 'Today' },\r\n { id: 'last7' as const, label: isTR ? 'Son 7 Gün' : 'Last 7 Days' },\r\n { id: 'last30' as const, label: isTR ? 'Son 30 Gün' : 'Last 30 Days' },\r\n { id: 'thisMonth' as const, label: isTR ? 'Bu Ay' : 'This Month' },\r\n { id: 'thisYear' as const, label: isTR ? 'Bu Yıl' : 'This Year' },\r\n { id: 'lastYear' as const, label: isTR ? 'Geçen Yıl' : 'Last Year' },\r\n ...(dateHierarchy.minIsoDate && dateHierarchy.maxIsoDate\r\n ? [\r\n {\r\n id: 'fullRange' as const,\r\n label: isTR\r\n ? `Tüm Veri (${FilterEngine.formatLocalizedDate(dateHierarchy.minIsoDate, locale.code)} → ${FilterEngine.formatLocalizedDate(dateHierarchy.maxIsoDate, locale.code)})`\r\n : `Full Data (${FilterEngine.formatLocalizedDate(dateHierarchy.minIsoDate, locale.code)} → ${FilterEngine.formatLocalizedDate(dateHierarchy.maxIsoDate, locale.code)})`,\r\n },\r\n ]\r\n : []),\r\n ].map((p) => (\r\n <button\r\n key={p.id}\r\n type=\"button\"\r\n onClick={() => applyQuickDatePreset(p.id)}\r\n style={{\r\n padding: '4px 8px',\r\n fontSize: 10.5,\r\n fontWeight: 600,\r\n borderRadius: 5,\r\n border: `1px solid ${theme.dom.popoverBorder}`,\r\n backgroundColor: theme.isDark\r\n ? 'rgba(255,255,255,0.04)'\r\n : 'rgba(0,0,0,0.03)',\r\n color: theme.dom.popoverText,\r\n cursor: 'pointer',\r\n }}\r\n >\r\n {p.label}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Live Matching Rows Feedback */}\r\n {conditionMatchCount && (\r\n <div\r\n style={{\r\n padding: '6px 10px',\r\n borderRadius: 6,\r\n backgroundColor:\r\n conditionMatchCount.matched > 0\r\n ? 'rgba(16, 185, 129, 0.12)'\r\n : 'rgba(245, 158, 11, 0.14)',\r\n color: conditionMatchCount.matched > 0 ? '#10B981' : '#F59E0B',\r\n fontSize: 11.5,\r\n fontWeight: 600,\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n }}\r\n >\r\n <span>{isTR ? 'Eşleşen Kayıt:' : 'Matching Rows:'}</span>\r\n <span>\r\n {conditionMatchCount.matched.toLocaleString(locale.code)} /{' '}\r\n {conditionMatchCount.total.toLocaleString(locale.code)}\r\n </span>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Footer Buttons */}\r\n <div\r\n style={{\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n padding: '8px 12px',\r\n borderTop: `1px solid ${theme.dom.popoverBorder}`,\r\n backgroundColor: theme.isDark ? 'rgba(255,255,255,0.02)' : 'rgba(0,0,0,0.02)',\r\n }}\r\n >\r\n <button\r\n type=\"button\"\r\n onClick={handleClear}\r\n style={{\r\n padding: '5px 10px',\r\n backgroundColor: 'transparent',\r\n color: theme.dom.popoverText,\r\n border: `1px solid ${theme.dom.popoverBorder}`,\r\n borderRadius: 5,\r\n cursor: 'pointer',\r\n fontSize: 11,\r\n fontWeight: 600,\r\n }}\r\n >\r\n {locale.clear}\r\n </button>\r\n <div style={{ display: 'flex', gap: 6 }}>\r\n <button\r\n type=\"button\"\r\n onClick={onClose}\r\n style={{\r\n padding: '5px 10px',\r\n backgroundColor: 'transparent',\r\n color: '#8E8E93',\r\n border: 'none',\r\n borderRadius: 5,\r\n cursor: 'pointer',\r\n fontSize: 11,\r\n }}\r\n >\r\n {isTR ? 'İptal' : 'Cancel'}\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={handleApply}\r\n style={{\r\n padding: '5px 14px',\r\n backgroundColor: theme.dom.accentColor,\r\n color: '#FFFFFF',\r\n border: 'none',\r\n borderRadius: 5,\r\n cursor: 'pointer',\r\n fontWeight: 600,\r\n fontSize: 11,\r\n }}\r\n >\r\n {loading\r\n ? locale.apply\r\n : `${locale.apply} (${applyPreviewRowCount.toLocaleString(locale.code)})`}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import React, { useEffect, useRef } from 'react';\r\nimport { ColumnDef, GridPermissions } from '../types/grid';\r\nimport { SummaryType } from '../types/group';\r\nimport { IGridThemeTokens } from '../theme/IGridTheme';\r\nimport { IGridLocale } from '../i18n/IGridLocale';\r\nimport { MaterialIcon } from '../ui/MaterialIcon';\r\n\r\nexport interface ContextMenuState {\r\n targetType: 'cell' | 'header' | 'rownumber';\r\n x: number;\r\n y: number;\r\n row: number;\r\n col: number;\r\n column?: ColumnDef;\r\n rowData?: Record<string, any>;\r\n}\r\n\r\nexport interface ContextMenuOverlayProps {\r\n menu: ContextMenuState;\r\n viewportWidth: number;\r\n viewportHeight: number;\r\n theme: IGridThemeTokens;\r\n locale: IGridLocale;\r\n permissions?: GridPermissions;\r\n isCellEditable: boolean;\r\n isGroupedByCol: boolean;\r\n currentSummaryType?: SummaryType;\r\n onCopy: () => void;\r\n onPaste: () => void;\r\n onDuplicateCellDown: () => void;\r\n onDuplicateCellRight: () => void;\r\n onDuplicateRow: () => void;\r\n onInsertRowAbove: () => void;\r\n onInsertRowBelow: () => void;\r\n onClearCells: () => void;\r\n onDeleteRow: () => void;\r\n onFilterByCellValue: () => void;\r\n onToggleGroupColumn: () => void;\r\n onSortColumn: (desc: boolean | null) => void;\r\n onTogglePinColumn: () => void;\r\n onToggleColumnReadonly: () => void;\r\n onChangeSummaryType: (summaryType: SummaryType) => void;\r\n onOpenSparklineModal?: () => void;\r\n onClose: () => void;\r\n}\r\n\r\nexport const ContextMenuOverlay: React.FC<ContextMenuOverlayProps> = ({\r\n menu,\r\n viewportWidth,\r\n viewportHeight,\r\n theme,\r\n locale,\r\n permissions,\r\n isCellEditable,\r\n isGroupedByCol,\r\n currentSummaryType = 'none',\r\n onCopy,\r\n onPaste,\r\n onDuplicateCellDown,\r\n onDuplicateCellRight,\r\n onDuplicateRow,\r\n onInsertRowAbove,\r\n onInsertRowBelow,\r\n onClearCells,\r\n onDeleteRow,\r\n onFilterByCellValue,\r\n onToggleGroupColumn,\r\n onSortColumn,\r\n onTogglePinColumn,\r\n onToggleColumnReadonly,\r\n onChangeSummaryType,\r\n onOpenSparklineModal,\r\n onClose,\r\n}) => {\r\n const menuRef = useRef<HTMLDivElement | null>(null);\r\n const isTR = locale.code.startsWith('tr');\r\n\r\n const isWriteMode = permissions?.mode !== 'read' && permissions?.mode !== 'readonly';\r\n const canAdd = isWriteMode && permissions?.allowAdding !== false;\r\n const canDelete = isWriteMode && permissions?.allowDeleting !== false;\r\n const canDuplicate = isWriteMode && permissions?.allowDuplicating !== false;\r\n const canPaste = isWriteMode && permissions?.allowClipboardPaste !== false && isCellEditable;\r\n\r\n useEffect(() => {\r\n const handleOutside = (e: MouseEvent) => {\r\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\r\n onClose();\r\n }\r\n };\r\n const handleKey = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') onClose();\r\n };\r\n document.addEventListener('mousedown', handleOutside, true);\r\n document.addEventListener('keydown', handleKey, true);\r\n return () => {\r\n document.removeEventListener('mousedown', handleOutside, true);\r\n document.removeEventListener('keydown', handleKey, true);\r\n };\r\n }, [onClose]);\r\n\r\n const menuWidth = 256;\r\n const estimatedHeight = menu.targetType === 'header' ? 320 : 350;\r\n const safeLeft = Math.max(8, Math.min(menu.x, viewportWidth - menuWidth - 12));\r\n const safeTop = Math.max(8, Math.min(menu.y, viewportHeight - estimatedHeight - 12));\r\n\r\n const renderItem = (\r\n iconName: string,\r\n label: string,\r\n shortcut: string | undefined,\r\n onClick: () => void,\r\n disabled: boolean = false,\r\n danger: boolean = false,\r\n badge?: string\r\n ) => (\r\n <button\r\n type=\"button\"\r\n disabled={disabled}\r\n onClick={() => {\r\n if (disabled) return;\r\n onClick();\r\n onClose();\r\n }}\r\n style={{\r\n width: '100%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n padding: '6px 10px',\r\n border: 'none',\r\n borderRadius: 5,\r\n backgroundColor: 'transparent',\r\n color: disabled ? '#8E8E93' : danger ? '#FF453A' : theme.dom.popoverText,\r\n opacity: disabled ? 0.45 : 1,\r\n cursor: disabled ? 'not-allowed' : 'pointer',\r\n fontSize: 12,\r\n fontFamily: theme.fontFamily,\r\n textAlign: 'left',\r\n }}\r\n onMouseEnter={(e) => {\r\n if (!disabled) {\r\n e.currentTarget.style.backgroundColor = theme.isDark\r\n ? 'rgba(255,255,255,0.08)'\r\n : 'rgba(0,0,0,0.05)';\r\n }\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = 'transparent';\r\n }}\r\n >\r\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 7, fontWeight: 500 }}>\r\n <MaterialIcon\r\n name={iconName}\r\n size={15}\r\n color={disabled ? '#8E8E93' : danger ? '#FF453A' : theme.dom.accentColor}\r\n />\r\n <span>{label}</span>\r\n </span>\r\n {badge ? (\r\n <span\r\n style={{\r\n fontSize: 10,\r\n padding: '1px 6px',\r\n borderRadius: 4,\r\n backgroundColor: theme.dom.badgeBg,\r\n color: theme.dom.badgeText,\r\n fontWeight: 600,\r\n }}\r\n >\r\n {badge}\r\n </span>\r\n ) : shortcut ? (\r\n <span style={{ fontSize: 10, color: '#8E8E93', fontFamily: 'monospace' }}>{shortcut}</span>\r\n ) : null}\r\n </button>\r\n );\r\n\r\n const divider = (\r\n <div\r\n style={{\r\n height: 1,\r\n backgroundColor: theme.dom.popoverBorder,\r\n margin: '4px 0',\r\n }}\r\n />\r\n );\r\n\r\n return (\r\n <div\r\n ref={menuRef}\r\n onMouseDown={(e) => e.stopPropagation()}\r\n onClick={(e) => e.stopPropagation()}\r\n onContextMenu={(e) => e.preventDefault()}\r\n style={{\r\n position: 'absolute',\r\n left: safeLeft,\r\n top: safeTop,\r\n width: menuWidth,\r\n zIndex: 180,\r\n backgroundColor: theme.dom.popoverBg,\r\n color: theme.dom.popoverText,\r\n border: `1px solid ${theme.dom.popoverBorder}`,\r\n borderRadius: 10,\r\n boxShadow: theme.dom.popoverShadow,\r\n backdropFilter: theme.dom.glassBackdrop,\r\n padding: 5,\r\n userSelect: 'none',\r\n fontFamily: theme.fontFamily,\r\n }}\r\n >\r\n {menu.targetType === 'header' && menu.column ? (\r\n menu.column.type === 'sparkline' || menu.column.type === 'action' ? (\r\n <>\r\n <div\r\n style={{\r\n padding: '5px 10px',\r\n fontSize: 11,\r\n fontWeight: 700,\r\n color: theme.dom.accentColor,\r\n borderBottom: `1px solid ${theme.dom.popoverBorder}`,\r\n marginBottom: 4,\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n }}\r\n >\r\n <span>{menu.column.title}</span>\r\n <span>{menu.column.type.toUpperCase()}</span>\r\n </div>\r\n {renderItem(\r\n 'push_pin',\r\n menu.column.pinned\r\n ? isTR\r\n ? 'Sabitlemeyi Kaldır (Unpin)'\r\n : 'Unpin Column'\r\n : isTR\r\n ? 'Sola Sabitle (Pin Left)'\r\n : 'Pin Column Left',\r\n undefined,\r\n onTogglePinColumn\r\n )}\r\n </>\r\n ) : (\r\n <>\r\n <div\r\n style={{\r\n padding: '5px 10px',\r\n fontSize: 11,\r\n fontWeight: 700,\r\n color: theme.dom.accentColor,\r\n borderBottom: `1px solid ${theme.dom.popoverBorder}`,\r\n marginBottom: 4,\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n }}\r\n >\r\n <span>{menu.column.title}</span>\r\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 3 }}>\r\n <MaterialIcon name={menu.column.readonly ? 'lock' : 'edit'} size={12} />\r\n {menu.column.readonly ? 'ReadOnly' : 'Write'}\r\n </span>\r\n </div>\r\n\r\n {renderItem(\r\n 'north',\r\n isTR ? 'Artan Sırala (A → Z)' : 'Sort Ascending (A → Z)',\r\n undefined,\r\n () => onSortColumn(false),\r\n menu.column.sortable === false\r\n )}\r\n {renderItem(\r\n 'south',\r\n isTR ? 'Azalan Sırala (Z → A)' : 'Sort Descending (Z → A)',\r\n undefined,\r\n () => onSortColumn(true),\r\n menu.column.sortable === false\r\n )}\r\n {renderItem(\r\n 'sort',\r\n isTR ? 'Sıralamayı Temizle' : 'Clear Sort',\r\n undefined,\r\n () => onSortColumn(null),\r\n menu.column.sortable === false\r\n )}\r\n\r\n {divider}\r\n\r\n {renderItem(\r\n 'push_pin',\r\n menu.column.pinned\r\n ? isTR\r\n ? 'Sabitlemeyi Kaldır (Unpin)'\r\n : 'Unpin Column'\r\n : isTR\r\n ? 'Sola Sabitle (Pin Left)'\r\n : 'Pin Column Left',\r\n undefined,\r\n onTogglePinColumn\r\n )}\r\n {renderItem(\r\n isGroupedByCol ? 'folder_open' : 'workspaces',\r\n isGroupedByCol\r\n ? isTR\r\n ? 'Grubu Kaldır'\r\n : 'Ungroup Column'\r\n : isTR\r\n ? 'Bu Sütuna Göre Grupla'\r\n : 'Group by This Column',\r\n undefined,\r\n onToggleGroupColumn\r\n )}\r\n {renderItem(\r\n menu.column.readonly ? 'lock_open' : 'lock',\r\n menu.column.readonly\r\n ? isTR\r\n ? 'Yazma İznini Aç (Write Mode)'\r\n : 'Set Column Editable (Write)'\r\n : isTR\r\n ? 'Salt Okunur Yap (Read-Only)'\r\n : 'Set Column Read-Only',\r\n undefined,\r\n onToggleColumnReadonly\r\n )}\r\n\r\n {divider}\r\n\r\n <div\r\n style={{\r\n padding: '4px 10px 2px',\r\n fontSize: 10,\r\n fontWeight: 700,\r\n color: '#8E8E93',\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 4,\r\n }}\r\n >\r\n <MaterialIcon name=\"functions\" size={12} color=\"#8E8E93\" />\r\n {isTR ? 'ALT ÖZET HESAPLAMASI (SUMMARY)' : 'SUMMARY AGGREGATION'}\r\n </div>\r\n <div\r\n style={{\r\n display: 'grid',\r\n gridTemplateColumns: 'repeat(3, 1fr)',\r\n gap: 4,\r\n padding: '4px 6px',\r\n }}\r\n >\r\n {(['sum', 'avg', 'min', 'max', 'count', 'none'] as SummaryType[]).map((sType) => {\r\n const isActive = currentSummaryType === sType;\r\n return (\r\n <button\r\n key={sType}\r\n type=\"button\"\r\n onClick={() => {\r\n onChangeSummaryType(sType);\r\n onClose();\r\n }}\r\n style={{\r\n padding: '4px 0',\r\n fontSize: 10,\r\n fontWeight: isActive ? 700 : 500,\r\n textTransform: 'uppercase',\r\n borderRadius: 4,\r\n border: `1px solid ${\r\n isActive ? theme.dom.accentColor : theme.dom.popoverBorder\r\n }`,\r\n backgroundColor: isActive ? theme.dom.accentColor : 'transparent',\r\n color: isActive ? '#FFFFFF' : theme.dom.popoverText,\r\n cursor: 'pointer',\r\n }}\r\n >\r\n {sType}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </>\r\n )\r\n ) : menu.column?.type === 'sparkline' ? (\r\n <>\r\n <div\r\n style={{\r\n padding: '5px 10px',\r\n fontSize: 11,\r\n fontWeight: 700,\r\n color: theme.dom.accentColor,\r\n borderBottom: `1px solid ${theme.dom.popoverBorder}`,\r\n marginBottom: 4,\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n }}\r\n >\r\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 4 }}>\r\n <MaterialIcon name=\"show_chart\" size={14} color={theme.dom.accentColor} />\r\n {menu.column.title}\r\n </span>\r\n <span>CHART</span>\r\n </div>\r\n {onOpenSparklineModal &&\r\n renderItem(\r\n 'monitoring',\r\n isTR ? 'Detaylı Trend Grafiğini Görüntüle' : 'View Detailed Trend Chart',\r\n 'Enter',\r\n onOpenSparklineModal\r\n )}\r\n </>\r\n ) : (\r\n <>\r\n <div\r\n style={{\r\n padding: '5px 10px',\r\n fontSize: 11,\r\n fontWeight: 700,\r\n color: theme.dom.accentColor,\r\n borderBottom: `1px solid ${theme.dom.popoverBorder}`,\r\n marginBottom: 4,\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n }}\r\n >\r\n <span>\r\n R{menu.row + 1} : C{menu.col + 1} {menu.column ? `(${menu.column.title})` : ''}\r\n </span>\r\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 3 }}>\r\n <MaterialIcon name={isCellEditable ? 'edit' : 'lock'} size={12} />\r\n {isCellEditable ? 'WRITE' : 'READONLY'}\r\n </span>\r\n </div>\r\n\r\n {renderItem(\r\n 'content_copy',\r\n isTR ? 'Kopyala (Excel TSV)' : 'Copy (Excel TSV)',\r\n 'Ctrl+C',\r\n onCopy\r\n )}\r\n {renderItem(\r\n 'content_paste',\r\n isTR ? 'Yapıştır (Excel TSV)' : 'Paste (Excel TSV)',\r\n 'Ctrl+V',\r\n onPaste,\r\n !canPaste\r\n )}\r\n\r\n {divider}\r\n\r\n {renderItem(\r\n 'south',\r\n isTR ? 'Hücreyi Aşağı Çoğalt' : 'Duplicate Cell Down',\r\n 'Ctrl+D',\r\n onDuplicateCellDown,\r\n !canDuplicate || !isCellEditable\r\n )}\r\n {renderItem(\r\n 'east',\r\n isTR ? 'Hücreyi Sağa Çoğalt' : 'Duplicate Cell Right',\r\n 'Ctrl+R',\r\n onDuplicateCellRight,\r\n !canDuplicate\r\n )}\r\n {renderItem(\r\n 'library_add',\r\n isTR ? 'Satırı Çoğalt (Duplicate Row)' : 'Duplicate Entire Row',\r\n 'Shift+D',\r\n onDuplicateRow,\r\n !canDuplicate || !canAdd\r\n )}\r\n\r\n {divider}\r\n\r\n {renderItem(\r\n 'add_row_above',\r\n isTR ? 'Üste Yeni Satır Ekle' : 'Insert Row Above',\r\n undefined,\r\n onInsertRowAbove,\r\n !canAdd\r\n )}\r\n {renderItem(\r\n 'add_row_below',\r\n isTR ? 'Alta Yeni Satır Ekle' : 'Insert Row Below',\r\n undefined,\r\n onInsertRowBelow,\r\n !canAdd\r\n )}\r\n\r\n {divider}\r\n\r\n {renderItem(\r\n 'filter_alt',\r\n isTR ? 'Bu Hücre Değerine Göre Filtrele' : 'Filter by Cell Value',\r\n undefined,\r\n onFilterByCellValue,\r\n !menu.column || menu.column.filterable === false\r\n )}\r\n {renderItem(\r\n isGroupedByCol ? 'folder_open' : 'workspaces',\r\n isGroupedByCol\r\n ? isTR\r\n ? 'Sütun Grubunu Kaldır'\r\n : 'Ungroup Column'\r\n : isTR\r\n ? 'Bu Sütuna Göre Grupla'\r\n : 'Group by This Column',\r\n undefined,\r\n onToggleGroupColumn,\r\n !menu.column\r\n )}\r\n\r\n {divider}\r\n\r\n {renderItem(\r\n 'backspace',\r\n isTR ? 'Hücre Değerini Temizle' : 'Clear Cell Value(s)',\r\n 'Del',\r\n onClearCells,\r\n !isCellEditable\r\n )}\r\n {renderItem(\r\n 'delete',\r\n isTR ? 'Satırı Sil (Delete Row)' : 'Delete Row',\r\n undefined,\r\n onDeleteRow,\r\n !canDelete,\r\n true\r\n )}\r\n </>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import React, { useEffect, useState } from 'react';\r\nimport { ColumnDef } from '../types/grid';\r\nimport { IGridThemeTokens } from '../theme/IGridTheme';\r\nimport { IGridLocale } from '../i18n/IGridLocale';\r\n\r\nexport interface SparklineModalState {\r\n rowIndex: number;\r\n rowData: Record<string, any>;\r\n column: ColumnDef;\r\n points: number[];\r\n}\r\n\r\nexport interface SparklineModalOverlayProps {\r\n modal: SparklineModalState;\r\n theme: IGridThemeTokens;\r\n locale: IGridLocale;\r\n onClose: () => void;\r\n}\r\n\r\nexport const SparklineModalOverlay: React.FC<SparklineModalOverlayProps> = ({\r\n modal,\r\n theme,\r\n locale,\r\n onClose,\r\n}) => {\r\n const isTR = locale.code.startsWith('tr');\r\n const [chartType, setChartType] = useState<'area' | 'bar'>('area');\r\n const [hoveredIdx, setHoveredIdx] = useState<number | null>(null);\r\n\r\n const points = Array.isArray(modal.points) && modal.points.length > 0 ? modal.points : [0, 0];\r\n const n = points.length;\r\n\r\n const firstVal = points[0] ?? 0;\r\n const lastVal = points[n - 1] ?? 0;\r\n const diff = lastVal - firstVal;\r\n const pctChange = firstVal !== 0 ? (diff / Math.abs(firstVal)) * 100 : 0;\r\n\r\n const minVal = Math.min(...points);\r\n const maxVal = Math.max(...points);\r\n const minIdx = points.indexOf(minVal);\r\n const maxIdx = points.indexOf(maxVal);\r\n const sumVal = points.reduce((a, b) => a + b, 0);\r\n const avgVal = sumVal / n;\r\n const variance = points.reduce((acc, v) => acc + Math.pow(v - avgVal, 2), 0) / n;\r\n const stdDev = Math.sqrt(variance);\r\n\r\n const accentColor = modal.column.sparklineColor || '#38BDF8';\r\n const isPositive = diff >= 0;\r\n\r\n useEffect(() => {\r\n const handleKey = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') onClose();\r\n };\r\n document.addEventListener('keydown', handleKey, true);\r\n return () => document.removeEventListener('keydown', handleKey, true);\r\n }, [onClose]);\r\n\r\n // SVG Chart dimensions\r\n const svgW = 580;\r\n const svgH = 220;\r\n const padL = 44;\r\n const padR = 24;\r\n const padT = 24;\r\n const padB = 34;\r\n const plotW = svgW - padL - padR;\r\n const plotH = svgH - padT - padB;\r\n\r\n const yMin = Math.max(0, Math.floor(minVal * 0.85));\r\n const yMax = Math.ceil(maxVal * 1.12) || 100;\r\n const yRange = yMax - yMin || 1;\r\n\r\n const getX = (i: number) => padL + (n > 1 ? (i / (n - 1)) * plotW : plotW / 2);\r\n const getY = (val: number) => padT + plotH - ((val - yMin) / yRange) * plotH;\r\n\r\n const linePath = points\r\n .map((v, i) => `${i === 0 ? 'M' : 'L'} ${getX(i).toFixed(1)} ${getY(v).toFixed(1)}`)\r\n .join(' ');\r\n const areaPath = `${linePath} L ${getX(n - 1).toFixed(1)} ${(padT + plotH).toFixed(1)} L ${getX(0).toFixed(1)} ${(padT + plotH).toFixed(1)} Z`;\r\n\r\n const avgY = getY(avgVal);\r\n\r\n const rowTitle =\r\n modal.rowData.company ||\r\n modal.rowData.code ||\r\n `Row #${modal.rowData.id ?? modal.rowIndex + 1}`;\r\n const rowSubtitle = [\r\n modal.rowData.code,\r\n modal.rowData.city,\r\n modal.rowData.category,\r\n ]\r\n .filter(Boolean)\r\n .join(' • ');\r\n\r\n return (\r\n <div\r\n onMouseDown={onClose}\r\n style={{\r\n position: 'fixed',\r\n inset: 0,\r\n zIndex: 500,\r\n backgroundColor: 'rgba(0, 0, 0, 0.6)',\r\n backdropFilter: 'blur(6px)',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n fontFamily: theme.fontFamily,\r\n userSelect: 'none',\r\n }}\r\n >\r\n <div\r\n onMouseDown={(e) => e.stopPropagation()}\r\n onClick={(e) => e.stopPropagation()}\r\n style={{\r\n width: 650,\r\n maxWidth: '94vw',\r\n maxHeight: '90vh',\r\n overflowY: 'auto',\r\n backgroundColor: theme.isDark ? '#0F172A' : '#FFFFFF',\r\n color: theme.isDark ? '#F8FAFC' : '#0F172A',\r\n border: `1px solid ${theme.isDark ? '#1E293B' : '#E2E8F0'}`,\r\n borderRadius: 16,\r\n boxShadow: '0 25px 70px rgba(0, 0, 0, 0.55)',\r\n padding: 22,\r\n }}\r\n >\r\n {/* Modal Header */}\r\n <div\r\n style={{\r\n display: 'flex',\r\n alignItems: 'flex-start',\r\n justifyContent: 'space-between',\r\n paddingBottom: 14,\r\n borderBottom: `1px solid ${theme.isDark ? '#1E293B' : '#E2E8F0'}`,\r\n marginBottom: 16,\r\n }}\r\n >\r\n <div>\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\r\n <span\r\n style={{\r\n padding: '3px 8px',\r\n borderRadius: 6,\r\n backgroundColor: 'rgba(56, 189, 248, 0.16)',\r\n color: '#38BDF8',\r\n fontSize: 11,\r\n fontWeight: 800,\r\n }}\r\n >\r\n 📈 {modal.column.title}\r\n </span>\r\n <span style={{ fontSize: 16, fontWeight: 800 }}>{rowTitle}</span>\r\n </div>\r\n {rowSubtitle && (\r\n <div style={{ fontSize: 12, color: '#94A3B8', marginTop: 4 }}>{rowSubtitle}</div>\r\n )}\r\n </div>\r\n\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\r\n {/* Chart Mode Switcher */}\r\n <div\r\n style={{\r\n display: 'flex',\r\n padding: 2,\r\n borderRadius: 8,\r\n backgroundColor: theme.isDark ? '#1E293B' : '#F1F5F9',\r\n }}\r\n >\r\n <button\r\n type=\"button\"\r\n onClick={() => setChartType('area')}\r\n style={{\r\n padding: '4px 10px',\r\n fontSize: 11,\r\n fontWeight: 700,\r\n borderRadius: 6,\r\n border: 'none',\r\n backgroundColor:\r\n chartType === 'area'\r\n ? theme.isDark\r\n ? '#0284C7'\r\n : '#FFFFFF'\r\n : 'transparent',\r\n color:\r\n chartType === 'area'\r\n ? theme.isDark\r\n ? '#FFFFFF'\r\n : '#0284C7'\r\n : '#94A3B8',\r\n cursor: 'pointer',\r\n }}\r\n >\r\n {isTR ? '📈 Çizgi / Alan' : '📈 Area Line'}\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => setChartType('bar')}\r\n style={{\r\n padding: '4px 10px',\r\n fontSize: 11,\r\n fontWeight: 700,\r\n borderRadius: 6,\r\n border: 'none',\r\n backgroundColor:\r\n chartType === 'bar'\r\n ? theme.isDark\r\n ? '#0284C7'\r\n : '#FFFFFF'\r\n : 'transparent',\r\n color:\r\n chartType === 'bar'\r\n ? theme.isDark\r\n ? '#FFFFFF'\r\n : '#0284C7'\r\n : '#94A3B8',\r\n cursor: 'pointer',\r\n }}\r\n >\r\n {isTR ? '📊 Sütun' : '📊 Bar Chart'}\r\n </button>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n onClick={onClose}\r\n style={{\r\n width: 30,\r\n height: 30,\r\n borderRadius: 8,\r\n border: `1px solid ${theme.isDark ? '#334155' : '#CBD5E1'}`,\r\n backgroundColor: 'transparent',\r\n color: '#94A3B8',\r\n fontSize: 15,\r\n cursor: 'pointer',\r\n }}\r\n >\r\n ✕\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* KPI Summary Cards */}\r\n <div\r\n style={{\r\n display: 'grid',\r\n gridTemplateColumns: 'repeat(5, 1fr)',\r\n gap: 10,\r\n marginBottom: 16,\r\n }}\r\n >\r\n <div\r\n style={{\r\n padding: '10px 12px',\r\n borderRadius: 10,\r\n backgroundColor: theme.isDark ? '#1E293B' : '#F8FAFC',\r\n border: `1px solid ${theme.isDark ? '#334155' : '#E2E8F0'}`,\r\n }}\r\n >\r\n <div style={{ fontSize: 10, color: '#94A3B8', fontWeight: 700 }}>\r\n {isTR ? 'SON DEĞER' : 'CURRENT'}\r\n </div>\r\n <div style={{ fontSize: 18, fontWeight: 800, marginTop: 2 }}>{lastVal}</div>\r\n </div>\r\n\r\n <div\r\n style={{\r\n padding: '10px 12px',\r\n borderRadius: 10,\r\n backgroundColor: theme.isDark ? '#1E293B' : '#F8FAFC',\r\n border: `1px solid ${theme.isDark ? '#334155' : '#E2E8F0'}`,\r\n }}\r\n >\r\n <div style={{ fontSize: 10, color: '#94A3B8', fontWeight: 700 }}>\r\n {isTR ? '7G DEĞİŞİM' : '7D CHANGE'}\r\n </div>\r\n <div\r\n style={{\r\n fontSize: 16,\r\n fontWeight: 800,\r\n marginTop: 2,\r\n color: isPositive ? '#10B981' : '#EF4444',\r\n }}\r\n >\r\n {isPositive ? '+' : ''}\r\n {pctChange.toFixed(1)}% ({isPositive ? `+${diff}` : diff})\r\n </div>\r\n </div>\r\n\r\n <div\r\n style={{\r\n padding: '10px 12px',\r\n borderRadius: 10,\r\n backgroundColor: theme.isDark ? '#1E293B' : '#F8FAFC',\r\n border: `1px solid ${theme.isDark ? '#334155' : '#E2E8F0'}`,\r\n }}\r\n >\r\n <div style={{ fontSize: 10, color: '#94A3B8', fontWeight: 700 }}>\r\n {isTR ? 'ORTALAMA' : 'AVERAGE'}\r\n </div>\r\n <div style={{ fontSize: 18, fontWeight: 800, marginTop: 2, color: '#38BDF8' }}>\r\n {avgVal.toFixed(1)}\r\n </div>\r\n </div>\r\n\r\n <div\r\n style={{\r\n padding: '10px 12px',\r\n borderRadius: 10,\r\n backgroundColor: theme.isDark ? '#1E293B' : '#F8FAFC',\r\n border: `1px solid ${theme.isDark ? '#334155' : '#E2E8F0'}`,\r\n }}\r\n >\r\n <div style={{ fontSize: 10, color: '#94A3B8', fontWeight: 700 }}>\r\n {isTR ? `ZİRVE (GÜN ${maxIdx + 1})` : `PEAK (D${maxIdx + 1})`}\r\n </div>\r\n <div style={{ fontSize: 18, fontWeight: 800, marginTop: 2, color: '#10B981' }}>\r\n {maxVal}\r\n </div>\r\n </div>\r\n\r\n <div\r\n style={{\r\n padding: '10px 12px',\r\n borderRadius: 10,\r\n backgroundColor: theme.isDark ? '#1E293B' : '#F8FAFC',\r\n border: `1px solid ${theme.isDark ? '#334155' : '#E2E8F0'}`,\r\n }}\r\n >\r\n <div style={{ fontSize: 10, color: '#94A3B8', fontWeight: 700 }}>\r\n {isTR ? `DİP / SAPMA` : `LOW / STD`}\r\n </div>\r\n <div style={{ fontSize: 15, fontWeight: 800, marginTop: 2 }}>\r\n {minVal} <span style={{ fontSize: 11, color: '#94A3B8' }}>(±{stdDev.toFixed(1)})</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Interactive SVG Chart */}\r\n <div\r\n style={{\r\n padding: '14px 12px 8px',\r\n borderRadius: 12,\r\n backgroundColor: theme.isDark ? '#0B1120' : '#F8FAFC',\r\n border: `1px solid ${theme.isDark ? '#1E293B' : '#E2E8F0'}`,\r\n marginBottom: 16,\r\n position: 'relative',\r\n }}\r\n >\r\n <svg\r\n viewBox={`0 0 ${svgW} ${svgH}`}\r\n style={{ width: '100%', height: 220, overflow: 'visible', display: 'block' }}\r\n >\r\n <defs>\r\n <linearGradient id=\"sparkModalGrad\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\r\n <stop offset=\"0%\" stopColor={accentColor} stopOpacity=\"0.38\" />\r\n <stop offset=\"100%\" stopColor={accentColor} stopOpacity=\"0.0\" />\r\n </linearGradient>\r\n </defs>\r\n\r\n {/* Horizontal Grid Lines & Y-Axis Labels */}\r\n {[0, 0.25, 0.5, 0.75, 1].map((t, idx) => {\r\n const val = Math.round(yMin + t * yRange);\r\n const y = getY(val);\r\n return (\r\n <g key={idx}>\r\n <line\r\n x1={padL}\r\n y1={y}\r\n x2={svgW - padR}\r\n y2={y}\r\n stroke={theme.isDark ? 'rgba(255,255,255,0.07)' : 'rgba(15,23,42,0.07)'}\r\n strokeWidth=\"1\"\r\n />\r\n <text\r\n x={padL - 8}\r\n y={y + 4}\r\n textAnchor=\"end\"\r\n fill=\"#94A3B8\"\r\n fontSize=\"10\"\r\n fontFamily=\"monospace\"\r\n >\r\n {val}\r\n </text>\r\n </g>\r\n );\r\n })}\r\n\r\n {/* Average Reference Dashed Line */}\r\n <line\r\n x1={padL}\r\n y1={avgY}\r\n x2={svgW - padR}\r\n y2={avgY}\r\n stroke=\"#F59E0B\"\r\n strokeWidth=\"1.3\"\r\n strokeDasharray=\"5 4\"\r\n />\r\n <text\r\n x={svgW - padR - 4}\r\n y={avgY - 5}\r\n textAnchor=\"end\"\r\n fill=\"#F59E0B\"\r\n fontSize=\"10\"\r\n fontWeight=\"700\"\r\n >\r\n AVG: {avgVal.toFixed(1)}\r\n </text>\r\n\r\n {chartType === 'area' ? (\r\n <>\r\n <path d={areaPath} fill=\"url(#sparkModalGrad)\" />\r\n <path\r\n d={linePath}\r\n fill=\"none\"\r\n stroke={accentColor}\r\n strokeWidth=\"3\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </>\r\n ) : (\r\n points.map((v, i) => {\r\n const bw = Math.min(38, plotW / (n * 1.6));\r\n const bx = getX(i) - bw / 2;\r\n const by = getY(v);\r\n const bh = Math.max(2, padT + plotH - by);\r\n const isHov = hoveredIdx === i;\r\n return (\r\n <rect\r\n key={i}\r\n x={bx}\r\n y={by}\r\n width={bw}\r\n height={bh}\r\n rx={5}\r\n fill={isHov ? '#38BDF8' : accentColor}\r\n opacity={isHov ? 1 : 0.82}\r\n style={{ cursor: 'pointer' }}\r\n onMouseEnter={() => setHoveredIdx(i)}\r\n onMouseLeave={() => setHoveredIdx(null)}\r\n />\r\n );\r\n })\r\n )}\r\n\r\n {/* Data Points & X-Axis Labels */}\r\n {points.map((v, i) => {\r\n const cx = getX(i);\r\n const cy = getY(v);\r\n const isHov = hoveredIdx === i;\r\n return (\r\n <g\r\n key={i}\r\n style={{ cursor: 'pointer' }}\r\n onMouseEnter={() => setHoveredIdx(i)}\r\n onMouseLeave={() => setHoveredIdx(null)}\r\n >\r\n {/* Hover vertical guide */}\r\n {isHov && (\r\n <line\r\n x1={cx}\r\n y1={padT}\r\n x2={cx}\r\n y2={padT + plotH}\r\n stroke={accentColor}\r\n strokeWidth=\"1\"\r\n strokeDasharray=\"3 3\"\r\n />\r\n )}\r\n\r\n <circle\r\n cx={cx}\r\n cy={cy}\r\n r={isHov ? 6.5 : 4.5}\r\n fill={isHov ? '#FFFFFF' : accentColor}\r\n stroke={accentColor}\r\n strokeWidth={isHov ? 3 : 2}\r\n />\r\n\r\n {/* Value label above node */}\r\n <text\r\n x={cx}\r\n y={cy - 10}\r\n textAnchor=\"middle\"\r\n fill={isHov ? '#38BDF8' : theme.isDark ? '#E2E8F0' : '#334155'}\r\n fontSize={isHov ? '12' : '10'}\r\n fontWeight=\"700\"\r\n >\r\n {v}\r\n </text>\r\n\r\n {/* X-Axis Day Label */}\r\n <text\r\n x={cx}\r\n y={svgH - 10}\r\n textAnchor=\"middle\"\r\n fill={isHov ? '#38BDF8' : '#94A3B8'}\r\n fontSize=\"11\"\r\n fontWeight={isHov ? '700' : '600'}\r\n >\r\n {isTR ? `Gün ${i + 1}` : `Day ${i + 1}`}\r\n </text>\r\n </g>\r\n );\r\n })}\r\n </svg>\r\n </div>\r\n\r\n {/* Day-by-Day Breakdown Table */}\r\n <div>\r\n <div\r\n style={{\r\n fontSize: 11,\r\n fontWeight: 700,\r\n color: '#94A3B8',\r\n marginBottom: 8,\r\n textTransform: 'uppercase',\r\n }}\r\n >\r\n {isTR ? 'GÜNLÜK DETAYLI KIRILIM TABLOSU' : 'DAILY TREND BREAKDOWN'}\r\n </div>\r\n <div\r\n style={{\r\n display: 'grid',\r\n gridTemplateColumns: 'repeat(7, 1fr)',\r\n gap: 6,\r\n }}\r\n >\r\n {points.map((v, i) => {\r\n const prev = i > 0 ? points[i - 1] : v;\r\n const delta = v - prev;\r\n const isHov = hoveredIdx === i;\r\n return (\r\n <div\r\n key={i}\r\n onMouseEnter={() => setHoveredIdx(i)}\r\n onMouseLeave={() => setHoveredIdx(null)}\r\n style={{\r\n padding: '8px 6px',\r\n borderRadius: 8,\r\n textAlign: 'center',\r\n backgroundColor: isHov\r\n ? 'rgba(56, 189, 248, 0.15)'\r\n : theme.isDark\r\n ? '#1E293B'\r\n : '#F1F5F9',\r\n border: `1px solid ${\r\n isHov ? '#38BDF8' : theme.isDark ? '#334155' : '#E2E8F0'\r\n }`,\r\n cursor: 'pointer',\r\n }}\r\n >\r\n <div style={{ fontSize: 10, color: '#94A3B8', fontWeight: 600 }}>\r\n {isTR ? `Gün ${i + 1}` : `Day ${i + 1}`}\r\n </div>\r\n <div style={{ fontSize: 14, fontWeight: 800, margin: '3px 0' }}>{v}</div>\r\n <div\r\n style={{\r\n fontSize: 10,\r\n fontWeight: 700,\r\n color:\r\n i === 0\r\n ? '#94A3B8'\r\n : delta > 0\r\n ? '#10B981'\r\n : delta < 0\r\n ? '#EF4444'\r\n : '#94A3B8',\r\n }}\r\n >\r\n {i === 0 ? '—' : delta > 0 ? `▲ +${delta}` : delta < 0 ? `▼ ${delta}` : '0'}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import React, { useEffect } from 'react';\r\nimport { ColumnDef } from '../types/grid';\r\nimport { IGridThemeTokens } from '../theme/IGridTheme';\r\nimport { IGridLocale } from '../i18n/IGridLocale';\r\n\r\nexport interface PdfPreviewModalState {\r\n url: string;\r\n title: string;\r\n column?: ColumnDef;\r\n row?: Record<string, any>;\r\n}\r\n\r\nexport interface PdfPreviewModalOverlayProps {\r\n modal: PdfPreviewModalState;\r\n theme: IGridThemeTokens;\r\n locale: IGridLocale;\r\n onClose: () => void;\r\n}\r\n\r\nexport const PdfPreviewModalOverlay: React.FC<PdfPreviewModalOverlayProps> = ({\r\n modal,\r\n theme,\r\n locale,\r\n onClose,\r\n}) => {\r\n const isTR = locale.code.startsWith('tr');\r\n const fileName = modal.url.split('/').pop() || modal.title || 'document.pdf';\r\n\r\n useEffect(() => {\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') {\r\n onClose();\r\n }\r\n };\r\n window.addEventListener('keydown', handleKeyDown);\r\n return () => window.removeEventListener('keydown', handleKeyDown);\r\n }, [onClose]);\r\n\r\n return (\r\n <div\r\n style={{\r\n position: 'fixed',\r\n inset: 0,\r\n backgroundColor: 'rgba(0, 0, 0, 0.75)',\r\n backdropFilter: 'blur(5px)',\r\n zIndex: 99999,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n padding: 20,\r\n boxSizing: 'border-box',\r\n }}\r\n onClick={(e) => {\r\n if (e.target === e.currentTarget) onClose();\r\n }}\r\n >\r\n <div\r\n style={{\r\n width: '100%',\r\n maxWidth: 1180,\r\n height: '90vh',\r\n backgroundColor: theme.isDark ? '#0F172A' : '#FFFFFF',\r\n borderRadius: 14,\r\n border: `1px solid ${theme.isDark ? '#334155' : '#E2E8F0'}`,\r\n boxShadow: '0 25px 50px -12px rgba(0, 0, 0, 0.5)',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n overflow: 'hidden',\r\n }}\r\n >\r\n {/* Header */}\r\n <div\r\n style={{\r\n padding: '12px 18px',\r\n borderBottom: `1px solid ${theme.isDark ? '#1E293B' : '#E2E8F0'}`,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n backgroundColor: theme.isDark ? '#090D16' : '#F8FAFC',\r\n }}\r\n >\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 10, minWidth: 0 }}>\r\n <span\r\n style={{\r\n backgroundColor: 'rgba(239, 68, 68, 0.2)',\r\n color: '#EF4444',\r\n padding: '4px 8px',\r\n borderRadius: 6,\r\n fontWeight: 800,\r\n fontSize: 11,\r\n border: '1px solid rgba(239, 68, 68, 0.4)',\r\n }}\r\n >\r\n PDF VIEW\r\n </span>\r\n <div style={{ minWidth: 0 }}>\r\n <div\r\n style={{\r\n fontWeight: 700,\r\n fontSize: 14,\r\n color: theme.isDark ? '#F1F5F9' : '#0F172A',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n }}\r\n >\r\n {modal.title || fileName}\r\n </div>\r\n <div\r\n style={{\r\n fontSize: 11,\r\n fontFamily: 'monospace',\r\n color: theme.isDark ? '#94A3B8' : '#64748B',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n }}\r\n >\r\n {modal.url}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Action buttons */}\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\r\n <a\r\n href={modal.url}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n style={{\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 5,\r\n padding: '6px 12px',\r\n borderRadius: 6,\r\n backgroundColor: theme.isDark ? 'rgba(56, 189, 248, 0.15)' : 'rgba(2, 132, 199, 0.1)',\r\n color: theme.isDark ? '#38BDF8' : '#0284C7',\r\n fontSize: 12,\r\n fontWeight: 600,\r\n textDecoration: 'none',\r\n border: `1px solid ${theme.isDark ? 'rgba(56, 189, 248, 0.3)' : 'rgba(2, 132, 199, 0.2)'}`,\r\n }}\r\n >\r\n <span>{isTR ? 'Yeni Sekmede Aç' : 'Open in New Tab'}</span>\r\n <span>↗</span>\r\n </a>\r\n\r\n <a\r\n href={modal.url}\r\n download={fileName}\r\n style={{\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 5,\r\n padding: '6px 12px',\r\n borderRadius: 6,\r\n backgroundColor: theme.isDark ? '#1E293B' : '#E2E8F0',\r\n color: theme.isDark ? '#F1F5F9' : '#1E293B',\r\n fontSize: 12,\r\n fontWeight: 600,\r\n textDecoration: 'none',\r\n }}\r\n >\r\n <span>{isTR ? 'İndir' : 'Download'}</span>\r\n <span>↓</span>\r\n </a>\r\n\r\n <button\r\n type=\"button\"\r\n onClick={onClose}\r\n style={{\r\n width: 30,\r\n height: 30,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n borderRadius: 6,\r\n backgroundColor: 'transparent',\r\n border: 'none',\r\n color: theme.isDark ? '#94A3B8' : '#64748B',\r\n cursor: 'pointer',\r\n fontSize: 16,\r\n fontWeight: 700,\r\n }}\r\n title={isTR ? 'Kapat (Esc)' : 'Close (Esc)'}\r\n >\r\n ✕\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* PDF Viewer Body */}\r\n <div style={{ flex: 1, backgroundColor: '#525659', position: 'relative' }}>\r\n <iframe\r\n src={`${modal.url}#toolbar=1&navpanes=0`}\r\n title={modal.title || fileName}\r\n style={{\r\n width: '100%',\r\n height: '100%',\r\n border: 'none',\r\n display: 'block',\r\n }}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import React, { useState } from 'react';\r\nimport { BatchChanges } from '../types/store';\r\nimport { ColumnDef } from '../types/grid';\r\nimport { IGridThemeTokens } from '../theme/IGridTheme';\r\nimport { IGridLocale } from '../i18n/IGridLocale';\r\nimport { MaterialIcon } from '../ui/MaterialIcon';\r\n\r\nexport interface BatchChangesModalProps {\r\n changes: BatchChanges;\r\n columns: ColumnDef[];\r\n theme: IGridThemeTokens;\r\n locale: IGridLocale;\r\n onConfirmSave: () => void;\r\n onDiscardAll: () => void;\r\n onRevertDelete?: (rowKey: any) => void;\r\n onRevertUpdate?: (rowKey: any, columnId?: string) => void;\r\n onRevertInsert?: (rowKey: any) => void;\r\n onClose: () => void;\r\n}\r\n\r\ntype ModalTab = 'all' | 'deleted' | 'updated' | 'inserted' | 'payload';\r\n\r\nfunction formatVal(val: any): string {\r\n if (val === null || val === undefined || val === '') return '— (Boş)';\r\n if (typeof val === 'boolean') return val ? 'True (✓)' : 'False (✕)';\r\n if (Array.isArray(val)) return val.join(', ');\r\n if (typeof val === 'object') return JSON.stringify(val);\r\n return String(val);\r\n}\r\n\r\nfunction getRowSummaryLabel(row: Record<string, any> | undefined, key: any): string {\r\n if (!row) return `#${key}`;\r\n const labelParts: string[] = [];\r\n if (row.code) labelParts.push(String(row.code));\r\n if (row.company) labelParts.push(String(row.company));\r\n else if (row.name) labelParts.push(String(row.name));\r\n else if (row.title) labelParts.push(String(row.title));\r\n if (row.city) labelParts.push(`(${row.city})`);\r\n return labelParts.length > 0 ? `#${key} • ${labelParts.join(' — ')}` : `Satır #${key}`;\r\n}\r\n\r\nexport const BatchChangesModal: React.FC<BatchChangesModalProps> = ({\r\n changes,\r\n columns,\r\n theme,\r\n locale,\r\n onConfirmSave,\r\n onDiscardAll,\r\n onRevertDelete,\r\n onRevertUpdate,\r\n onRevertInsert,\r\n onClose,\r\n}) => {\r\n const isTR = locale.code.startsWith('tr');\r\n const inserted = changes.inserted || [];\r\n const updated = changes.updated || [];\r\n const deletedKeys = changes.deleted || [];\r\n const deletedRowsData =\r\n changes.deletedRowsData || deletedKeys.map((k) => ({ key: k, data: { id: k } }));\r\n\r\n const defaultTab: ModalTab =\r\n deletedRowsData.length > 0 && updated.length === 0 && inserted.length === 0\r\n ? 'deleted'\r\n : 'all';\r\n const [activeTab, setActiveTab] = useState<ModalTab>(defaultTab);\r\n const [copiedPayload, setCopiedPayload] = useState<boolean>(false);\r\n const [visibleLimit, setVisibleLimit] = useState<number>(80);\r\n\r\n const colTitleMap = new Map<string, string>();\r\n for (const c of columns) {\r\n colTitleMap.set(c.id, c.title || c.id);\r\n }\r\n\r\n const totalOps = inserted.length + updated.length + deletedRowsData.length;\r\n\r\n const formattedJsonPayload =\r\n activeTab === 'payload'\r\n ? JSON.stringify(\r\n {\r\n endpoint: 'POST /api/v1/sheetgl/batch-commit',\r\n timestamp: new Date().toISOString(),\r\n summary: {\r\n totalOperations: totalOps,\r\n insertedCount: inserted.length,\r\n updatedCount: updated.length,\r\n deletedCount: deletedKeys.length,\r\n },\r\n payload: {\r\n inserted: inserted.slice(0, 200),\r\n updated: updated.slice(0, 200).map((u) => ({\r\n key: u.key,\r\n values: u.values,\r\n oldValues: u.oldValues,\r\n })),\r\n deleted: deletedKeys.slice(0, 500),\r\n deletedRowsSnapshot: deletedRowsData.slice(0, 100),\r\n ...(totalOps > 200\r\n ? {\r\n _previewNote: isTR\r\n ? `Performans için önizlemede ilk kayıtlar gösteriliyor (Toplam: ${totalOps.toLocaleString('tr-TR')} işlem)`\r\n : `Showing first records in preview for performance (Total: ${totalOps.toLocaleString('en-US')} operations)`,\r\n }\r\n : {}),\r\n },\r\n },\r\n null,\r\n 2\r\n )\r\n : '';\r\n\r\n return (\r\n <div\r\n onMouseDown={(e) => e.stopPropagation()}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n if (e.target === e.currentTarget) onClose();\r\n }}\r\n style={{\r\n position: 'fixed',\r\n inset: 0,\r\n zIndex: 9999,\r\n backgroundColor: 'rgba(6, 10, 18, 0.72)',\r\n backdropFilter: 'blur(8px)',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n padding: 20,\r\n fontFamily: theme.fontFamily,\r\n }}\r\n >\r\n <div\r\n style={{\r\n width: '100%',\r\n maxWidth: 780,\r\n maxHeight: '84vh',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n borderRadius: 16,\r\n backgroundColor: theme.dom.popoverBg,\r\n color: theme.dom.popoverText,\r\n border: `1px solid ${theme.dom.popoverBorder}`,\r\n boxShadow: '0 28px 70px rgba(0, 0, 0, 0.65)',\r\n overflow: 'hidden',\r\n }}\r\n >\r\n {/* Header */}\r\n <div\r\n style={{\r\n padding: '16px 22px',\r\n borderBottom: `1px solid ${theme.dom.popoverBorder}`,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n backgroundColor: theme.isDark ? 'rgba(255,255,255,0.03)' : 'rgba(0,0,0,0.02)',\r\n }}\r\n >\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 10 }}>\r\n <div\r\n style={{\r\n width: 36,\r\n height: 36,\r\n borderRadius: 10,\r\n backgroundColor: 'rgba(34, 197, 94, 0.16)',\r\n color: '#22C55E',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n }}\r\n >\r\n <MaterialIcon name=\"fact_check\" size={20} color=\"#22C55E\" />\r\n </div>\r\n <div>\r\n <div style={{ fontSize: 16, fontWeight: 800 }}>\r\n {isTR\r\n ? `Bekleyen Toplu Değişiklik Özeti (${totalOps} İşlem)`\r\n : `Pending Batch Changes Summary (${totalOps} Operations)`}\r\n </div>\r\n <div style={{ fontSize: 12, opacity: 0.7, marginTop: 2 }}>\r\n {isTR\r\n ? 'Kaydetmeden önce silinecek satırları, güncellenen hücreleri ve yeni kayıtları inceleyin veya tekil olarak geri alın.'\r\n : 'Review rows to be deleted, modified cells, and newly inserted records before committing.'}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n onClick={onClose}\r\n style={{\r\n width: 32,\r\n height: 32,\r\n borderRadius: 8,\r\n border: `1px solid ${theme.dom.popoverBorder}`,\r\n backgroundColor: 'transparent',\r\n color: theme.dom.popoverText,\r\n cursor: 'pointer',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n }}\r\n >\r\n <MaterialIcon name=\"close\" size={18} />\r\n </button>\r\n </div>\r\n\r\n {/* Summary Filter Tabs */}\r\n <div\r\n style={{\r\n padding: '12px 22px',\r\n borderBottom: `1px solid ${theme.dom.popoverBorder}`,\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n gap: 8,\r\n }}\r\n >\r\n {[\r\n { id: 'all' as const, label: isTR ? `Tümü (${totalOps})` : `All (${totalOps})`, color: '#38BDF8', icon: 'list_alt' },\r\n { id: 'deleted' as const, label: isTR ? `Silinecek Satırlar (${deletedRowsData.length})` : `Rows to Delete (${deletedRowsData.length})`, color: '#EF4444', icon: 'delete_sweep' },\r\n { id: 'updated' as const, label: isTR ? `Güncellenen Satırlar (${updated.length})` : `Modified Rows (${updated.length})`, color: '#3B82F6', icon: 'edit_note' },\r\n { id: 'inserted' as const, label: isTR ? `Yeni Eklenenler (${inserted.length})` : `Inserted Rows (${inserted.length})`, color: '#22C55E', icon: 'playlist_add' },\r\n { id: 'payload' as const, label: isTR ? `{ } JSON Payload` : `{ } JSON Payload`, color: '#A855F7', icon: 'data_object' },\r\n ].map((t) => {\r\n const active = activeTab === t.id;\r\n return (\r\n <button\r\n key={t.id}\r\n type=\"button\"\r\n onClick={() => setActiveTab(t.id)}\r\n style={{\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 6,\r\n padding: '6px 12px',\r\n borderRadius: 8,\r\n border: `1px solid ${active ? t.color : theme.dom.popoverBorder}`,\r\n backgroundColor: active ? `${t.color}22` : 'transparent',\r\n color: active ? t.color : theme.dom.popoverText,\r\n fontSize: 12.5,\r\n fontWeight: active ? 700 : 600,\r\n cursor: 'pointer',\r\n }}\r\n >\r\n <MaterialIcon name={t.icon} size={15} color={active ? t.color : undefined} />\r\n <span>{t.label}</span>\r\n </button>\r\n );\r\n })}\r\n </div>\r\n\r\n {/* Body List */}\r\n <div style={{ flex: 1, overflowY: 'auto', padding: '16px 22px', display: 'flex', flexDirection: 'column', gap: 16 }}>\r\n {totalOps === 0 && (\r\n <div style={{ textAlign: 'center', padding: '32px 0', opacity: 0.7, fontSize: 14 }}>\r\n {isTR ? 'Bekleyen herhangi bir değişiklik kalmadı.' : 'No pending changes remaining.'}\r\n </div>\r\n )}\r\n\r\n {/* 1. DELETED ROWS SECTION */}\r\n {(activeTab === 'all' || activeTab === 'deleted') && deletedRowsData.length > 0 && (\r\n <div>\r\n <div style={{ fontSize: 12.5, fontWeight: 800, color: '#EF4444', marginBottom: 8, display: 'flex', alignItems: 'center', gap: 6 }}>\r\n <MaterialIcon name=\"delete_forever\" size={16} color=\"#EF4444\" />\r\n <span>\r\n {isTR\r\n ? `SİLİNECEK SATIRLAR (${deletedRowsData.length} Kayıt)`\r\n : `ROWS MARKED FOR DELETION (${deletedRowsData.length} Records)`}\r\n </span>\r\n </div>\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\r\n {deletedRowsData.slice(0, visibleLimit).map(({ key, data }) => (\r\n <div\r\n key={String(key)}\r\n style={{\r\n padding: '10px 14px',\r\n borderRadius: 10,\r\n border: '1px solid rgba(239, 68, 68, 0.35)',\r\n backgroundColor: 'rgba(239, 68, 68, 0.08)',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n gap: 12,\r\n }}\r\n >\r\n <div>\r\n <div style={{ fontWeight: 700, fontSize: 13.5, color: '#F87171' }}>\r\n {getRowSummaryLabel(data, key)}\r\n </div>\r\n <div style={{ fontSize: 11.5, opacity: 0.8, marginTop: 3, display: 'flex', flexWrap: 'wrap', gap: 10 }}>\r\n {Object.entries(data)\r\n .filter(([k]) => !k.startsWith('__') && k !== 'sparkline')\r\n .slice(0, 5)\r\n .map(([k, v]) => (\r\n <span key={k}>\r\n <strong>{colTitleMap.get(k) || k}:</strong> {formatVal(v)}\r\n </span>\r\n ))}\r\n </div>\r\n </div>\r\n {onRevertDelete && (\r\n <button\r\n type=\"button\"\r\n onClick={() => onRevertDelete(key)}\r\n style={{\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 4,\r\n padding: '5px 10px',\r\n borderRadius: 6,\r\n border: '1px solid rgba(239, 68, 68, 0.45)',\r\n backgroundColor: theme.dom.popoverBg,\r\n color: '#F87171',\r\n fontSize: 11.5,\r\n fontWeight: 700,\r\n cursor: 'pointer',\r\n flexShrink: 0,\r\n }}\r\n >\r\n <MaterialIcon name=\"undo\" size={14} color=\"#F87171\" />\r\n <span>{isTR ? 'Silmeyi Geri Al' : 'Restore Row'}</span>\r\n </button>\r\n )}\r\n </div>\r\n ))}\r\n {deletedRowsData.length > visibleLimit && (\r\n <button\r\n type=\"button\"\r\n onClick={() => setVisibleLimit((prev) => prev + 200)}\r\n style={{\r\n padding: '8px 14px',\r\n borderRadius: 8,\r\n border: `1px solid ${theme.dom.popoverBorder}`,\r\n backgroundColor: 'transparent',\r\n color: theme.dom.popoverText,\r\n fontSize: 12,\r\n fontWeight: 700,\r\n cursor: 'pointer',\r\n textAlign: 'center',\r\n }}\r\n >\r\n {isTR\r\n ? `Daha Fazla Göster (+200) — Kalan: ${(deletedRowsData.length - visibleLimit).toLocaleString('tr-TR')} satır`\r\n : `Load More (+200) — Remaining: ${(deletedRowsData.length - visibleLimit).toLocaleString('en-US')} rows`}\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* 2. UPDATED ROWS SECTION */}\r\n {(activeTab === 'all' || activeTab === 'updated') && updated.length > 0 && (\r\n <div>\r\n <div style={{ fontSize: 12.5, fontWeight: 800, color: '#38BDF8', marginBottom: 8, display: 'flex', alignItems: 'center', gap: 6 }}>\r\n <MaterialIcon name=\"edit_note\" size={16} color=\"#38BDF8\" />\r\n <span>\r\n {isTR\r\n ? `GÜNCELLENEN SATIRLAR VE HÜCRELER (${updated.length} Satır)`\r\n : `MODIFIED ROWS & CELLS (${updated.length} Rows)`}\r\n </span>\r\n </div>\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\r\n {updated.map((item) => (\r\n <div\r\n key={String(item.key)}\r\n style={{\r\n padding: '10px 14px',\r\n borderRadius: 10,\r\n border: '1px solid rgba(56, 189, 248, 0.32)',\r\n backgroundColor: 'rgba(56, 189, 248, 0.06)',\r\n }}\r\n >\r\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: 6 }}>\r\n <span style={{ fontWeight: 700, fontSize: 13 }}>\r\n {getRowSummaryLabel(item.rowData, item.key)}\r\n </span>\r\n {onRevertUpdate && (\r\n <button\r\n type=\"button\"\r\n onClick={() => onRevertUpdate(item.key)}\r\n style={{\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 4,\r\n padding: '3px 8px',\r\n borderRadius: 6,\r\n border: `1px solid ${theme.dom.popoverBorder}`,\r\n backgroundColor: 'transparent',\r\n color: theme.dom.popoverText,\r\n fontSize: 11,\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n }}\r\n >\r\n <MaterialIcon name=\"undo\" size={13} />\r\n <span>{isTR ? 'Satırı Geri Al' : 'Revert Row'}</span>\r\n </button>\r\n )}\r\n </div>\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: 5 }}>\r\n {Object.entries(item.values).map(([colId, newVal]) => {\r\n const oldVal = item.oldValues?.[colId];\r\n return (\r\n <div\r\n key={colId}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n gap: 8,\r\n padding: '5px 8px',\r\n borderRadius: 6,\r\n backgroundColor: theme.isDark ? 'rgba(0,0,0,0.25)' : 'rgba(255,255,255,0.75)',\r\n fontSize: 12,\r\n }}\r\n >\r\n <div>\r\n <strong>{colTitleMap.get(colId) || colId}:</strong>{' '}\r\n <span style={{ textDecoration: 'line-through', opacity: 0.65, color: '#F87171' }}>\r\n {formatVal(oldVal)}\r\n </span>{' '}\r\n <span style={{ margin: '0 4px', opacity: 0.6 }}>→</span>\r\n <span style={{ fontWeight: 700, color: '#22C55E' }}>\r\n {formatVal(newVal)}\r\n </span>\r\n </div>\r\n {onRevertUpdate && (\r\n <button\r\n type=\"button\"\r\n onClick={() => onRevertUpdate(item.key, colId)}\r\n title={isTR ? 'Bu hücreyi eski değerine döndür' : 'Revert this cell'}\r\n style={{\r\n border: 'none',\r\n background: 'none',\r\n color: '#38BDF8',\r\n fontSize: 11,\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n }}\r\n >\r\n {isTR ? 'Geri Al' : 'Revert'}\r\n </button>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* 3. INSERTED ROWS SECTION */}\r\n {(activeTab === 'all' || activeTab === 'inserted') && inserted.length > 0 && (\r\n <div>\r\n <div style={{ fontSize: 12.5, fontWeight: 800, color: '#22C55E', marginBottom: 8, display: 'flex', alignItems: 'center', gap: 6 }}>\r\n <MaterialIcon name=\"playlist_add_check\" size={16} color=\"#22C55E\" />\r\n <span>\r\n {isTR\r\n ? `YENİ EKLENEN SATIRLAR (${inserted.length} Kayıt)`\r\n : `NEWLY INSERTED ROWS (${inserted.length} Records)`}\r\n </span>\r\n </div>\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\r\n {inserted.map((row) => {\r\n const key = row.id;\r\n return (\r\n <div\r\n key={String(key)}\r\n style={{\r\n padding: '10px 14px',\r\n borderRadius: 10,\r\n border: '1px solid rgba(34, 197, 94, 0.35)',\r\n backgroundColor: 'rgba(34, 197, 94, 0.08)',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n gap: 12,\r\n }}\r\n >\r\n <div style={{ fontWeight: 700, fontSize: 13, color: '#4ADE80' }}>\r\n {getRowSummaryLabel(row, key)}\r\n </div>\r\n {onRevertInsert && (\r\n <button\r\n type=\"button\"\r\n onClick={() => onRevertInsert(key)}\r\n style={{\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 4,\r\n padding: '4px 9px',\r\n borderRadius: 6,\r\n border: '1px solid rgba(34, 197, 94, 0.4)',\r\n backgroundColor: 'transparent',\r\n color: '#4ADE80',\r\n fontSize: 11.5,\r\n fontWeight: 700,\r\n cursor: 'pointer',\r\n }}\r\n >\r\n <MaterialIcon name=\"delete\" size={14} color=\"#4ADE80\" />\r\n <span>{isTR ? 'Eklemeyi İptal Et' : 'Remove Row'}</span>\r\n </button>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* 4. JSON PAYLOAD PREVIEW SECTION */}\r\n {activeTab === 'payload' && (\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>\r\n <div\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n }}\r\n >\r\n <div style={{ fontSize: 12.5, fontWeight: 800, color: '#A855F7', display: 'flex', alignItems: 'center', gap: 6 }}>\r\n <MaterialIcon name=\"data_object\" size={16} color=\"#A855F7\" />\r\n <span>\r\n {isTR\r\n ? 'BACKEND API SAVE / BATCH COMMIT JSON PAYLOAD'\r\n : 'BACKEND API SAVE / BATCH COMMIT JSON PAYLOAD'}\r\n </span>\r\n </div>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n navigator.clipboard?.writeText(formattedJsonPayload);\r\n setCopiedPayload(true);\r\n setTimeout(() => setCopiedPayload(false), 1800);\r\n }}\r\n style={{\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 5,\r\n padding: '5px 10px',\r\n borderRadius: 6,\r\n border: '1px solid rgba(168, 85, 247, 0.45)',\r\n backgroundColor: 'rgba(168, 85, 247, 0.14)',\r\n color: '#C084FC',\r\n fontSize: 11.5,\r\n fontWeight: 700,\r\n cursor: 'pointer',\r\n }}\r\n >\r\n <MaterialIcon name={copiedPayload ? 'check' : 'content_copy'} size={14} color=\"#C084FC\" />\r\n <span>\r\n {copiedPayload\r\n ? isTR\r\n ? 'Kopyalandı!'\r\n : 'Copied!'\r\n : isTR\r\n ? 'JSON Payload Kopyala'\r\n : 'Copy JSON Payload'}\r\n </span>\r\n </button>\r\n </div>\r\n <pre\r\n style={{\r\n margin: 0,\r\n padding: 14,\r\n borderRadius: 10,\r\n backgroundColor: theme.isDark ? '#090D16' : '#0F172A',\r\n color: '#E2E8F0',\r\n border: '1px solid rgba(168, 85, 247, 0.35)',\r\n fontSize: 11.5,\r\n lineHeight: 1.5,\r\n fontFamily: \"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace\",\r\n overflowX: 'auto',\r\n maxHeight: 340,\r\n }}\r\n >\r\n {formattedJsonPayload}\r\n </pre>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Footer Actions */}\r\n <div\r\n style={{\r\n padding: '14px 22px',\r\n borderTop: `1px solid ${theme.dom.popoverBorder}`,\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n gap: 10,\r\n backgroundColor: theme.isDark ? 'rgba(255,255,255,0.02)' : 'rgba(0,0,0,0.02)',\r\n }}\r\n >\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n onDiscardAll();\r\n onClose();\r\n }}\r\n style={{\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 6,\r\n padding: '8px 14px',\r\n borderRadius: 8,\r\n border: '1px solid rgba(239, 68, 68, 0.45)',\r\n backgroundColor: 'rgba(239, 68, 68, 0.1)',\r\n color: '#F87171',\r\n fontSize: 12.5,\r\n fontWeight: 700,\r\n cursor: 'pointer',\r\n }}\r\n >\r\n <MaterialIcon name=\"history\" size={15} color=\"#F87171\" />\r\n <span>{isTR ? 'Tüm Değişikliklerden Vazgeç' : 'Discard All Changes'}</span>\r\n </button>\r\n\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 10 }}>\r\n <button\r\n type=\"button\"\r\n onClick={onClose}\r\n style={{\r\n padding: '8px 14px',\r\n borderRadius: 8,\r\n border: `1px solid ${theme.dom.popoverBorder}`,\r\n backgroundColor: 'transparent',\r\n color: theme.dom.popoverText,\r\n fontSize: 12.5,\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n }}\r\n >\r\n {isTR ? 'Kapat' : 'Close'}\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n disabled={totalOps === 0}\r\n onClick={() => {\r\n onConfirmSave();\r\n onClose();\r\n }}\r\n style={{\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 6,\r\n padding: '8px 16px',\r\n borderRadius: 8,\r\n border: 'none',\r\n backgroundColor: totalOps === 0 ? '#4B5563' : '#22C55E',\r\n color: '#FFFFFF',\r\n fontSize: 13,\r\n fontWeight: 800,\r\n cursor: totalOps === 0 ? 'not-allowed' : 'pointer',\r\n boxShadow: totalOps > 0 ? '0 4px 14px rgba(34, 197, 94, 0.4)' : 'none',\r\n }}\r\n >\r\n <MaterialIcon name=\"save\" size={16} color=\"#FFFFFF\" />\r\n <span>\r\n {isTR\r\n ? `Onayla ve Toplu Kaydet (${totalOps})`\r\n : `Confirm & Batch Save (${totalOps})`}\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import React, { useState } from 'react';\r\nimport { IGridThemeTokens } from '../theme/IGridTheme';\r\nimport { IGridLocale } from '../i18n/IGridLocale';\r\nimport { MaterialIcon } from '../ui/MaterialIcon';\r\n\r\nexport interface DeleteConfirmProgressModalProps {\r\n rowKeys: any[];\r\n sampleRows: Record<string, any>[];\r\n batchMode: boolean;\r\n theme: IGridThemeTokens;\r\n locale: IGridLocale;\r\n onConfirm: (onProgress: (processed: number, total: number) => void) => Promise<void>;\r\n onCancel: () => void;\r\n}\r\n\r\nexport const DeleteConfirmProgressModal: React.FC<DeleteConfirmProgressModalProps> = ({\r\n rowKeys,\r\n sampleRows,\r\n batchMode,\r\n theme,\r\n locale,\r\n onConfirm,\r\n onCancel,\r\n}) => {\r\n const isTR = locale.code.startsWith('tr');\r\n const totalCount = rowKeys.length;\r\n\r\n const [isDeleting, setIsDeleting] = useState<boolean>(false);\r\n const [processedCount, setProcessedCount] = useState<number>(0);\r\n\r\n const percent =\r\n totalCount > 0 ? Math.min(100, Math.round((processedCount / totalCount) * 100)) : 0;\r\n\r\n const handleStartDelete = async () => {\r\n if (isDeleting) return;\r\n setIsDeleting(true);\r\n setProcessedCount(0);\r\n\r\n // Yield a frame so the progress bar UI mounts immediately before batch processing starts\r\n await new Promise((r) => setTimeout(r, 20));\r\n\r\n await onConfirm((processed) => {\r\n setProcessedCount(processed);\r\n });\r\n };\r\n\r\n return (\r\n <div\r\n onMouseDown={(e) => e.stopPropagation()}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n if (!isDeleting && e.target === e.currentTarget) {\r\n onCancel();\r\n }\r\n }}\r\n style={{\r\n position: 'fixed',\r\n inset: 0,\r\n zIndex: 10000,\r\n backgroundColor: 'rgba(6, 10, 18, 0.72)',\r\n backdropFilter: 'blur(8px)',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n padding: 20,\r\n fontFamily: theme.fontFamily,\r\n }}\r\n >\r\n <div\r\n style={{\r\n width: '100%',\r\n maxWidth: 480,\r\n borderRadius: 16,\r\n backgroundColor: theme.dom.popoverBg,\r\n color: theme.dom.popoverText,\r\n border: `1px solid ${theme.dom.popoverBorder}`,\r\n boxShadow: '0 28px 70px rgba(0, 0, 0, 0.65)',\r\n overflow: 'hidden',\r\n }}\r\n >\r\n {/* Header */}\r\n <div\r\n style={{\r\n padding: '16px 20px',\r\n borderBottom: `1px solid ${theme.dom.popoverBorder}`,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n backgroundColor: 'rgba(239, 68, 68, 0.08)',\r\n }}\r\n >\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 10 }}>\r\n <div\r\n style={{\r\n width: 36,\r\n height: 36,\r\n borderRadius: 10,\r\n backgroundColor: 'rgba(239, 68, 68, 0.18)',\r\n color: '#EF4444',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n }}\r\n >\r\n <MaterialIcon name=\"warning\" size={20} color=\"#EF4444\" />\r\n </div>\r\n <div>\r\n <div style={{ fontSize: 15.5, fontWeight: 800 }}>\r\n {isDeleting\r\n ? isTR\r\n ? 'Satırlar Siliniyor...'\r\n : 'Deleting Selected Rows...'\r\n : isTR\r\n ? 'Silme İşlemini Onaylayın'\r\n : 'Confirm Row Deletion'}\r\n </div>\r\n <div style={{ fontSize: 12, opacity: 0.75, marginTop: 2 }}>\r\n {isTR\r\n ? `Toplam ${totalCount.toLocaleString('tr-TR')} kayıt seçildi`\r\n : `${totalCount.toLocaleString('en-US')} records selected`}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {!isDeleting && (\r\n <button\r\n type=\"button\"\r\n onClick={onCancel}\r\n style={{\r\n width: 30,\r\n height: 30,\r\n borderRadius: 8,\r\n border: `1px solid ${theme.dom.popoverBorder}`,\r\n backgroundColor: 'transparent',\r\n color: theme.dom.popoverText,\r\n cursor: 'pointer',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n }}\r\n >\r\n <MaterialIcon name=\"close\" size={16} />\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* Body */}\r\n <div style={{ padding: '18px 20px', display: 'flex', flexDirection: 'column', gap: 14 }}>\r\n {!isDeleting ? (\r\n <>\r\n <div style={{ fontSize: 13.5, lineHeight: 1.5, fontWeight: 600 }}>\r\n {isTR ? (\r\n <>\r\n Seçili{' '}\r\n <strong style={{ color: '#F87171' }}>\r\n {totalCount.toLocaleString('tr-TR')} satırı\r\n </strong>{' '}\r\n silmek istediğinize emin misiniz?\r\n </>\r\n ) : (\r\n <>\r\n Are you sure you want to delete{' '}\r\n <strong style={{ color: '#F87171' }}>\r\n {totalCount.toLocaleString('en-US')} selected rows\r\n </strong>\r\n ?\r\n </>\r\n )}\r\n </div>\r\n\r\n {/* Sample Preview of rows to be deleted */}\r\n {sampleRows.length > 0 && (\r\n <div\r\n style={{\r\n padding: '10px 12px',\r\n borderRadius: 10,\r\n backgroundColor: theme.isDark ? 'rgba(0,0,0,0.28)' : 'rgba(15,23,42,0.04)',\r\n border: `1px solid ${theme.dom.popoverBorder}`,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 5,\r\n fontSize: 12,\r\n }}\r\n >\r\n <div style={{ fontSize: 11, fontWeight: 700, opacity: 0.7 }}>\r\n {isTR ? 'Silinecek Kayıt Önizlemesi:' : 'Preview of Rows to Delete:'}\r\n </div>\r\n {sampleRows.slice(0, 4).map((r, i) => (\r\n <div\r\n key={String(r.id ?? i)}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n padding: '3px 0',\r\n borderBottom:\r\n i < Math.min(sampleRows.length, 4) - 1\r\n ? `1px dashed ${theme.dom.popoverBorder}`\r\n : 'none',\r\n }}\r\n >\r\n <span style={{ fontWeight: 700, color: '#F87171' }}>\r\n #{r.id} {r.code ? `• ${r.code}` : ''}\r\n </span>\r\n <span style={{ opacity: 0.85 }}>\r\n {r.company || r.name || r.city || ''}\r\n </span>\r\n </div>\r\n ))}\r\n {totalCount > 4 && (\r\n <div style={{ fontSize: 11.5, fontWeight: 700, color: '#94A3B8', paddingTop: 2 }}>\r\n {isTR\r\n ? `+ ${(totalCount - 4).toLocaleString('tr-TR')} diğer satır daha silinecek...`\r\n : `+ ${(totalCount - 4).toLocaleString('en-US')} more rows...`}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {batchMode && (\r\n <div\r\n style={{\r\n fontSize: 11.5,\r\n padding: '8px 10px',\r\n borderRadius: 8,\r\n backgroundColor: 'rgba(56, 189, 248, 0.1)',\r\n border: '1px solid rgba(56, 189, 248, 0.25)',\r\n color: '#38BDF8',\r\n lineHeight: 1.4,\r\n }}\r\n >\r\n ℹ️{' '}\r\n {isTR\r\n ? 'Toplu Düzenleme (Batch) modu aktif olduğu için silinen satırları \"Toplu Kaydet\" öncesinde Değişiklik Özeti penceresinden geri alabilirsiniz.'\r\n : 'Batch mode is active: you can still restore deleted rows before committing Batch Save.'}\r\n </div>\r\n )}\r\n </>\r\n ) : (\r\n /* LIVE PROGRESS BAR VIEW */\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: 12, padding: '8px 0' }}>\r\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\r\n <span style={{ fontSize: 13, fontWeight: 700 }}>\r\n {isTR\r\n ? `İşleniyor: ${processedCount.toLocaleString('tr-TR')} / ${totalCount.toLocaleString('tr-TR')} satır`\r\n : `Processing: ${processedCount.toLocaleString('en-US')} / ${totalCount.toLocaleString('en-US')} rows`}\r\n </span>\r\n <span style={{ fontSize: 15, fontWeight: 800, color: '#EF4444' }}>{percent}%</span>\r\n </div>\r\n\r\n <div\r\n style={{\r\n width: '100%',\r\n height: 12,\r\n borderRadius: 999,\r\n backgroundColor: theme.isDark ? '#1E293B' : '#E2E8F0',\r\n overflow: 'hidden',\r\n }}\r\n >\r\n <div\r\n style={{\r\n width: `${percent}%`,\r\n height: '100%',\r\n borderRadius: 999,\r\n background: 'linear-gradient(90deg, #EF4444, #F97316)',\r\n transition: 'width 80ms linear',\r\n }}\r\n />\r\n </div>\r\n\r\n <div style={{ fontSize: 11.5, opacity: 0.75, textAlign: 'center' }}>\r\n {isTR\r\n ? 'Sanal indeks ve özet tabloları güncelleniyor, lütfen bekleyin...'\r\n : 'Updating virtual viewport & summary indices, please wait...'}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Footer Buttons */}\r\n {!isDeleting && (\r\n <div\r\n style={{\r\n padding: '12px 20px',\r\n borderTop: `1px solid ${theme.dom.popoverBorder}`,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'flex-end',\r\n gap: 10,\r\n backgroundColor: theme.isDark ? 'rgba(255,255,255,0.02)' : 'rgba(0,0,0,0.02)',\r\n }}\r\n >\r\n <button\r\n type=\"button\"\r\n onClick={onCancel}\r\n style={{\r\n padding: '8px 14px',\r\n borderRadius: 8,\r\n border: `1px solid ${theme.dom.popoverBorder}`,\r\n backgroundColor: 'transparent',\r\n color: theme.dom.popoverText,\r\n fontSize: 12.5,\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n }}\r\n >\r\n {isTR ? 'Vazgeç' : 'Cancel'}\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n onClick={handleStartDelete}\r\n style={{\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 6,\r\n padding: '8px 16px',\r\n borderRadius: 8,\r\n border: 'none',\r\n backgroundColor: '#EF4444',\r\n color: '#FFFFFF',\r\n fontSize: 13,\r\n fontWeight: 800,\r\n cursor: 'pointer',\r\n boxShadow: '0 4px 14px rgba(239, 68, 68, 0.4)',\r\n }}\r\n >\r\n <MaterialIcon name=\"delete_forever\" size={16} color=\"#FFFFFF\" />\r\n <span>\r\n {isTR\r\n ? `Evet, ${totalCount.toLocaleString('tr-TR')} Satırı Sil`\r\n : `Yes, Delete ${totalCount.toLocaleString('en-US')} Rows`}\r\n </span>\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import React, { useId } from 'react';\n\nexport interface SheetGLLogoProps {\n size?: number;\n glow?: boolean;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport const SHEETGL_GRADIENT =\n 'linear-gradient(110deg, #c4b5fd 0%, #a855f7 30%, #818cf8 66%, #38bdf8 100%)';\n\nexport const SheetGLLogo: React.FC<SheetGLLogoProps> = ({\n size = 22,\n glow = false,\n className,\n style,\n}) => {\n const rawId = useId().replace(/:/g, '');\n const p = `sgl_${rawId}`;\n const height = (size * 46) / 48;\n\n return (\n <div\n className={className}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n position: 'relative',\n width: size,\n height,\n filter: glow\n ? 'drop-shadow(0 0 18px rgba(134, 59, 255, 0.55)) drop-shadow(0 0 34px rgba(71, 191, 255, 0.35))'\n : 'drop-shadow(0 1px 2px rgba(0, 0, 0, 0.15))',\n flexShrink: 0,\n ...style,\n }}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={height}\n fill=\"none\"\n viewBox=\"0 0 48 46\"\n style={{ width: '100%', height: '100%', display: 'block' }}\n >\n <path\n fill=\"#863bff\"\n d=\"M25.946 44.938c-.664.845-2.021.375-2.021-.698V33.937a2.26 2.26 0 0 0-2.262-2.262H10.287c-.92 0-1.456-1.04-.92-1.788l7.48-10.471c1.07-1.497 0-3.578-1.842-3.578H1.237c-.92 0-1.456-1.04-.92-1.788L10.013.474c.214-.297.556-.474.92-.474h28.894c.92 0 1.456 1.04.92 1.788l-7.48 10.471c-1.07 1.498 0 3.579 1.842 3.579h11.377c.943 0 1.473 1.088.89 1.83L25.947 44.94z\"\n style={{ fill: '#863bff', fillOpacity: 1 }}\n />\n <mask\n id={`${p}_mask`}\n width=\"48\"\n height=\"46\"\n x=\"0\"\n y=\"0\"\n maskUnits=\"userSpaceOnUse\"\n style={{ maskType: 'alpha' }}\n >\n <path\n fill=\"#000\"\n d=\"M25.842 44.938c-.664.844-2.021.375-2.021-.698V33.937a2.26 2.26 0 0 0-2.262-2.262H10.183c-.92 0-1.456-1.04-.92-1.788l7.48-10.471c1.07-1.498 0-3.579-1.842-3.579H1.133c-.92 0-1.456-1.04-.92-1.787L9.91.473c.214-.297.556-.474.92-.474h28.894c.92 0 1.456 1.04.92 1.788l-7.48 10.471c-1.07 1.498 0 3.578 1.842 3.578h11.377c.943 0 1.473 1.088.89 1.832L25.843 44.94z\"\n style={{ fill: '#000', fillOpacity: 1 }}\n />\n </mask>\n <g mask={`url(#${p}_mask)`}>\n <g filter={`url(#${p}_b)`}>\n <ellipse\n cx=\"5.508\"\n cy=\"14.704\"\n fill=\"#ede6ff\"\n rx=\"5.508\"\n ry=\"14.704\"\n transform=\"matrix(.00324 1 1 -.00324 -4.47 31.516)\"\n />\n </g>\n <g filter={`url(#${p}_c)`}>\n <ellipse\n cx=\"10.399\"\n cy=\"29.851\"\n fill=\"#ede6ff\"\n rx=\"10.399\"\n ry=\"29.851\"\n transform=\"matrix(.00324 1 1 -.00324 -39.328 7.883)\"\n />\n </g>\n <g filter={`url(#${p}_d)`}>\n <ellipse\n cx=\"5.508\"\n cy=\"30.487\"\n fill=\"#7e14ff\"\n rx=\"5.508\"\n ry=\"30.487\"\n transform=\"rotate(89.814 -25.913 -14.639)scale(1 -1)\"\n />\n </g>\n <g filter={`url(#${p}_e)`}>\n <ellipse\n cx=\"5.508\"\n cy=\"30.599\"\n fill=\"#7e14ff\"\n rx=\"5.508\"\n ry=\"30.599\"\n transform=\"rotate(89.814 -32.644 -3.334)scale(1 -1)\"\n />\n </g>\n <g filter={`url(#${p}_f)`}>\n <ellipse\n cx=\"5.508\"\n cy=\"30.599\"\n fill=\"#7e14ff\"\n rx=\"5.508\"\n ry=\"30.599\"\n transform=\"matrix(.00324 1 1 -.00324 -34.34 30.47)\"\n />\n </g>\n <g filter={`url(#${p}_g)`}>\n <ellipse\n cx=\"14.072\"\n cy=\"22.078\"\n fill=\"#ede6ff\"\n rx=\"14.072\"\n ry=\"22.078\"\n transform=\"rotate(93.35 24.506 48.493)scale(-1 1)\"\n />\n </g>\n <g filter={`url(#${p}_h)`}>\n <ellipse\n cx=\"3.47\"\n cy=\"21.501\"\n fill=\"#7e14ff\"\n rx=\"3.47\"\n ry=\"21.501\"\n transform=\"rotate(89.009 28.708 47.59)scale(-1 1)\"\n />\n </g>\n <g filter={`url(#${p}_i)`}>\n <ellipse\n cx=\"3.47\"\n cy=\"21.501\"\n fill=\"#7e14ff\"\n rx=\"3.47\"\n ry=\"21.501\"\n transform=\"rotate(89.009 28.708 47.59)scale(-1 1)\"\n />\n </g>\n <g filter={`url(#${p}_j)`}>\n <ellipse\n cx=\".387\"\n cy=\"8.972\"\n fill=\"#7e14ff\"\n rx=\"4.407\"\n ry=\"29.108\"\n transform=\"rotate(39.51 .387 8.972)\"\n />\n </g>\n <g filter={`url(#${p}_k)`}>\n <ellipse\n cx=\"47.523\"\n cy=\"-6.092\"\n fill=\"#7e14ff\"\n rx=\"4.407\"\n ry=\"29.108\"\n transform=\"rotate(37.892 47.523 -6.092)\"\n />\n </g>\n <g filter={`url(#${p}_l)`}>\n <ellipse\n cx=\"41.412\"\n cy=\"6.333\"\n fill=\"#47bfff\"\n rx=\"5.971\"\n ry=\"9.665\"\n transform=\"rotate(37.892 41.412 6.333)\"\n />\n </g>\n <g filter={`url(#${p}_m)`}>\n <ellipse\n cx=\"-1.879\"\n cy=\"38.332\"\n fill=\"#7e14ff\"\n rx=\"4.407\"\n ry=\"29.108\"\n transform=\"rotate(37.892 -1.88 38.332)\"\n />\n </g>\n <g filter={`url(#${p}_n)`}>\n <ellipse\n cx=\"-1.879\"\n cy=\"38.332\"\n fill=\"#7e14ff\"\n rx=\"4.407\"\n ry=\"29.108\"\n transform=\"rotate(37.892 -1.88 38.332)\"\n />\n </g>\n <g filter={`url(#${p}_o)`}>\n <ellipse\n cx=\"35.651\"\n cy=\"29.907\"\n fill=\"#7e14ff\"\n rx=\"4.407\"\n ry=\"29.108\"\n transform=\"rotate(37.892 35.651 29.907)\"\n />\n </g>\n <g filter={`url(#${p}_p)`}>\n <ellipse\n cx=\"38.418\"\n cy=\"32.4\"\n fill=\"#47bfff\"\n rx=\"5.971\"\n ry=\"15.297\"\n transform=\"rotate(37.892 38.418 32.4)\"\n />\n </g>\n </g>\n <defs>\n <filter id={`${p}_b`} width=\"60.045\" height=\"41.654\" x=\"-19.77\" y=\"16.149\" colorInterpolationFilters=\"sRGB\" filterUnits=\"userSpaceOnUse\">\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feBlend in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\" />\n <feGaussianBlur result=\"effect1_foregroundBlur\" stdDeviation=\"7.659\" />\n </filter>\n <filter id={`${p}_c`} width=\"90.34\" height=\"51.437\" x=\"-54.613\" y=\"-7.533\" colorInterpolationFilters=\"sRGB\" filterUnits=\"userSpaceOnUse\">\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feBlend in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\" />\n <feGaussianBlur result=\"effect1_foregroundBlur\" stdDeviation=\"7.659\" />\n </filter>\n <filter id={`${p}_d`} width=\"79.355\" height=\"29.4\" x=\"-49.64\" y=\"2.03\" colorInterpolationFilters=\"sRGB\" filterUnits=\"userSpaceOnUse\">\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feBlend in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\" />\n <feGaussianBlur result=\"effect1_foregroundBlur\" stdDeviation=\"4.596\" />\n </filter>\n <filter id={`${p}_e`} width=\"79.579\" height=\"29.4\" x=\"-45.045\" y=\"20.029\" colorInterpolationFilters=\"sRGB\" filterUnits=\"userSpaceOnUse\">\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feBlend in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\" />\n <feGaussianBlur result=\"effect1_foregroundBlur\" stdDeviation=\"4.596\" />\n </filter>\n <filter id={`${p}_f`} width=\"79.579\" height=\"29.4\" x=\"-43.513\" y=\"21.178\" colorInterpolationFilters=\"sRGB\" filterUnits=\"userSpaceOnUse\">\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feBlend in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\" />\n <feGaussianBlur result=\"effect1_foregroundBlur\" stdDeviation=\"4.596\" />\n </filter>\n <filter id={`${p}_g`} width=\"74.749\" height=\"58.852\" x=\"15.756\" y=\"-17.901\" colorInterpolationFilters=\"sRGB\" filterUnits=\"userSpaceOnUse\">\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feBlend in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\" />\n <feGaussianBlur result=\"effect1_foregroundBlur\" stdDeviation=\"7.659\" />\n </filter>\n <filter id={`${p}_h`} width=\"61.377\" height=\"25.362\" x=\"23.548\" y=\"2.284\" colorInterpolationFilters=\"sRGB\" filterUnits=\"userSpaceOnUse\">\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feBlend in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\" />\n <feGaussianBlur result=\"effect1_foregroundBlur\" stdDeviation=\"4.596\" />\n </filter>\n <filter id={`${p}_i`} width=\"61.377\" height=\"25.362\" x=\"23.548\" y=\"2.284\" colorInterpolationFilters=\"sRGB\" filterUnits=\"userSpaceOnUse\">\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feBlend in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\" />\n <feGaussianBlur result=\"effect1_foregroundBlur\" stdDeviation=\"4.596\" />\n </filter>\n <filter id={`${p}_j`} width=\"56.045\" height=\"63.649\" x=\"-27.636\" y=\"-22.853\" colorInterpolationFilters=\"sRGB\" filterUnits=\"userSpaceOnUse\">\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feBlend in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\" />\n <feGaussianBlur result=\"effect1_foregroundBlur\" stdDeviation=\"4.596\" />\n </filter>\n <filter id={`${p}_k`} width=\"54.814\" height=\"64.646\" x=\"20.116\" y=\"-38.415\" colorInterpolationFilters=\"sRGB\" filterUnits=\"userSpaceOnUse\">\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feBlend in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\" />\n <feGaussianBlur result=\"effect1_foregroundBlur\" stdDeviation=\"4.596\" />\n </filter>\n <filter id={`${p}_l`} width=\"33.541\" height=\"35.313\" x=\"24.641\" y=\"-11.323\" colorInterpolationFilters=\"sRGB\" filterUnits=\"userSpaceOnUse\">\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feBlend in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\" />\n <feGaussianBlur result=\"effect1_foregroundBlur\" stdDeviation=\"4.596\" />\n </filter>\n <filter id={`${p}_m`} width=\"54.814\" height=\"64.646\" x=\"-29.286\" y=\"6.009\" colorInterpolationFilters=\"sRGB\" filterUnits=\"userSpaceOnUse\">\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feBlend in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\" />\n <feGaussianBlur result=\"effect1_foregroundBlur\" stdDeviation=\"4.596\" />\n </filter>\n <filter id={`${p}_n`} width=\"54.814\" height=\"64.646\" x=\"-29.286\" y=\"6.009\" colorInterpolationFilters=\"sRGB\" filterUnits=\"userSpaceOnUse\">\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feBlend in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\" />\n <feGaussianBlur result=\"effect1_foregroundBlur\" stdDeviation=\"4.596\" />\n </filter>\n <filter id={`${p}_o`} width=\"54.814\" height=\"64.646\" x=\"8.244\" y=\"-2.416\" colorInterpolationFilters=\"sRGB\" filterUnits=\"userSpaceOnUse\">\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feBlend in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\" />\n <feGaussianBlur result=\"effect1_foregroundBlur\" stdDeviation=\"4.596\" />\n </filter>\n <filter id={`${p}_p`} width=\"39.409\" height=\"43.623\" x=\"18.713\" y=\"10.588\" colorInterpolationFilters=\"sRGB\" filterUnits=\"userSpaceOnUse\">\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feBlend in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\" />\n <feGaussianBlur result=\"effect1_foregroundBlur\" stdDeviation=\"4.596\" />\n </filter>\n </defs>\n </svg>\n </div>\n );\n};\n","declare const __SHEETGL_VERSION__: string | undefined;\n\nexport const SHEETGL_VERSION: string =\n typeof __SHEETGL_VERSION__ !== 'undefined' ? __SHEETGL_VERSION__ : '2.0.2';\n","import React, { useState, useEffect } from 'react';\r\nimport { IGridThemeTokens } from '../theme/IGridTheme';\r\nimport { ThemeInput } from '../theme/ThemeEngine';\r\nimport {\r\n ColumnDef,\r\n GridPermissions,\r\n GridSummaryConfig,\r\n GridToolbarConfig,\r\n GridToolbarCustomItem,\r\n RowSelectionMode,\r\n ToolbarButtonDisplayMode,\r\n} from '../types/grid';\r\nimport { SummaryType } from '../types/group';\r\nimport { IGridLocale } from '../i18n/IGridLocale';\r\nimport { SheetGLLogo } from './SheetGLLogo';\r\nimport { MaterialIcon } from './MaterialIcon';\nimport { SHEETGL_VERSION } from '../version';\r\n\r\nexport interface ToolBarProps {\r\n theme: IGridThemeTokens;\r\n locale: IGridLocale;\r\n currentThemeName: string;\r\n onThemeChange: (theme: ThemeInput) => void;\r\n onLocaleChange?: (localeCode: string) => void;\r\n searchKeyword: string;\r\n onSearchChange: (keyword: string) => void;\r\n onExportCsv: () => void;\r\n groups: string[];\r\n onToggleGroupColumn: (columnId: string) => void;\r\n onExpandAllGroups?: () => void;\r\n onCollapseAllGroups?: () => void;\r\n availableColumns: ColumnDef[];\r\n onUpdateColumn?: (colId: string, patch: Partial<ColumnDef>) => void;\r\n summaryTypes?: Record<string, SummaryType>;\r\n onChangeSummaryType?: (colId: string, sType: SummaryType) => void;\r\n permissions?: GridPermissions;\r\n onPermissionsChange?: (perms: GridPermissions) => void;\r\n onAddRow?: () => void;\r\n onDuplicateRow?: () => void;\r\n onDeleteRow?: () => void;\r\n canUndo?: boolean;\r\n canRedo?: boolean;\r\n onUndo?: () => void;\r\n onRedo?: () => void;\r\n pendingChangesCount?: number;\r\n onSaveBatch?: () => void;\r\n onDiscardBatch?: () => void;\r\n onInspectBatchChanges?: () => void;\r\n selectedRowCount?: number;\r\n selectionMode?: RowSelectionMode;\r\n onSelectionModeChange?: (mode: RowSelectionMode) => void;\r\n activeFilterCount?: number;\r\n onClearAllFilters?: () => void;\r\n toolbarConfig?: GridToolbarConfig;\r\n onUpdateToolbarConfig?: (patch: Partial<GridToolbarConfig>) => void;\r\n summaryConfig?: GridSummaryConfig;\r\n onUpdateSummaryConfig?: (patch: Partial<GridSummaryConfig>) => void;\r\n}\r\n\r\nexport const ToolBar: React.FC<ToolBarProps> = ({\r\n theme,\r\n locale,\r\n currentThemeName,\r\n onThemeChange,\r\n onLocaleChange,\r\n searchKeyword,\r\n onSearchChange,\r\n onExportCsv,\r\n groups,\r\n onToggleGroupColumn,\r\n onExpandAllGroups,\r\n onCollapseAllGroups,\r\n availableColumns,\r\n onUpdateColumn,\r\n summaryTypes = {},\r\n onChangeSummaryType,\r\n permissions,\r\n onPermissionsChange,\r\n onAddRow,\r\n onDuplicateRow,\r\n onDeleteRow,\r\n canUndo,\r\n canRedo,\r\n onUndo,\r\n onRedo,\r\n pendingChangesCount = 0,\r\n onSaveBatch,\r\n onDiscardBatch,\r\n onInspectBatchChanges,\r\n selectedRowCount = 0,\r\n selectionMode = 'none',\r\n onSelectionModeChange,\r\n activeFilterCount = 0,\r\n onClearAllFilters,\r\n toolbarConfig,\r\n onUpdateToolbarConfig,\r\n summaryConfig,\r\n onUpdateSummaryConfig,\r\n}) => {\r\n const [showColSettings, setShowColSettings] = useState(false);\r\n const [settingsTab, setSettingsTab] = useState<'columns' | 'layout'>('columns');\r\n const [isMobile, setIsMobile] = useState<boolean>(() =>\r\n typeof window !== 'undefined' ? window.innerWidth < 740 : false\r\n );\r\n const [showMobileMore, setShowMobileMore] = useState<boolean>(false);\r\n\r\n useEffect(() => {\r\n const onResize = () => setIsMobile(window.innerWidth < 740);\r\n window.addEventListener('resize', onResize);\r\n return () => window.removeEventListener('resize', onResize);\r\n }, []);\r\n\r\n const isTR = locale.code.startsWith('tr');\r\n\r\n if (toolbarConfig?.visible === false) {\r\n return null;\r\n }\r\n\r\n const rawDisplayMode: ToolbarButtonDisplayMode = toolbarConfig?.buttonDisplayMode || 'icon-text';\r\n const displayMode: ToolbarButtonDisplayMode = isMobile ? 'icon' : rawDisplayMode;\r\n const allowDisplayModeSwitch = toolbarConfig?.allowDisplayModeSwitch !== false;\r\n\r\n const showBrand = toolbarConfig?.showBrand !== false;\r\n const showAddRow = toolbarConfig?.showAddRow !== false;\r\n const showDuplicateRow = toolbarConfig?.showDuplicateRow !== false;\r\n const showDeleteRow = toolbarConfig?.showDeleteRow !== false;\r\n const showUndoRedo = toolbarConfig?.showUndoRedo !== false;\r\n const showSearch = toolbarConfig?.showSearch !== false;\r\n const showGroupBy = toolbarConfig?.showGroupBy !== false;\r\n const showClearFilters = toolbarConfig?.showClearFilters !== false;\r\n const showBatchActions = toolbarConfig?.showBatchActions !== false;\r\n const showPermissionsSwitch = toolbarConfig?.showPermissionsSwitch !== false;\r\n const showColumnSettings = toolbarConfig?.showColumnSettings !== false;\r\n const showLocaleSwitch = toolbarConfig?.showLocaleSwitch !== false;\r\n const showThemeSwitch = toolbarConfig?.showThemeSwitch !== false;\r\n const showExportCsv = toolbarConfig?.showExportCsv !== false;\r\n\r\n const isReadonlyMode = permissions?.mode === 'readonly' || permissions?.mode === 'read';\r\n const canAdd = !isReadonlyMode && permissions?.allowAdding !== false;\r\n const canDup = !isReadonlyMode && permissions?.allowDuplicating !== false;\r\n const canDel = !isReadonlyMode && permissions?.allowDeleting !== false;\r\n const canEdit = !isReadonlyMode && permissions?.allowUpdating !== false;\r\n\r\n const btnStyle = (\r\n disabled?: boolean,\r\n highlight?: boolean,\r\n modeOverride?: ToolbarButtonDisplayMode\r\n ): React.CSSProperties => {\r\n const m = modeOverride || displayMode;\r\n return {\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: m === 'icon-text' ? 5 : 0,\r\n padding: m === 'icon' ? '5px 7px' : '4px 9px',\r\n borderRadius: 6,\r\n border: `1px solid ${highlight ? theme.dom.accentColor : theme.dom.inputBorder}`,\r\n backgroundColor: highlight ? theme.dom.accentColor : theme.dom.inputBg,\r\n color: highlight ? '#FFFFFF' : theme.dom.toolbarText,\r\n fontSize: 11,\r\n fontWeight: 600,\r\n cursor: disabled ? 'not-allowed' : 'pointer',\r\n opacity: disabled ? 0.42 : 1,\r\n fontFamily: theme.fontFamily,\r\n whiteSpace: 'nowrap',\r\n transition: 'all 0.12s ease',\r\n };\r\n };\r\n\r\n /**\r\n * Renders button content according to ToolbarButtonDisplayMode:\r\n * - 'icon': Google Material Symbols icon only\r\n * - 'icon-text': Google Material Symbols icon + text label\r\n * - 'text': Text label only\r\n */\r\n const renderBtnContent = (\r\n iconName: string,\r\n label: string,\r\n modeOverride?: ToolbarButtonDisplayMode,\r\n iconColor?: string,\r\n iconSize: number = 15\r\n ) => {\r\n const m = modeOverride || displayMode;\r\n return (\r\n <>\r\n {(m === 'icon' || m === 'icon-text') && (\r\n <MaterialIcon name={iconName} size={iconSize} color={iconColor} />\r\n )}\r\n {(m === 'icon-text' || m === 'text') && <span>{label}</span>}\r\n </>\r\n );\r\n };\r\n\r\n const renderCustomItem = (item: GridToolbarCustomItem) => {\r\n const itemMode = item.displayMode || displayMode;\r\n const isPrimary = item.variant === 'primary' || item.active;\r\n const isDanger = item.variant === 'danger';\r\n const isSuccess = item.variant === 'success';\r\n\r\n const baseStyle = btnStyle(item.disabled, isPrimary, itemMode);\r\n if (isDanger) {\r\n baseStyle.color = '#FF453A';\r\n baseStyle.borderColor = 'rgba(255, 69, 58, 0.35)';\r\n } else if (isSuccess) {\r\n baseStyle.backgroundColor = '#30D158';\r\n baseStyle.borderColor = '#30D158';\r\n baseStyle.color = '#FFFFFF';\r\n }\r\n\r\n return (\r\n <button\r\n key={item.id}\r\n type=\"button\"\r\n disabled={item.disabled}\r\n title={item.tooltip || item.label}\r\n onClick={item.onClick}\r\n style={baseStyle}\r\n >\r\n {item.icon\r\n ? renderBtnContent(\r\n item.icon,\r\n item.label,\r\n itemMode,\r\n isPrimary || isSuccess ? '#FFFFFF' : isDanger ? '#FF453A' : undefined\r\n )\r\n : item.label}\r\n </button>\r\n );\r\n };\r\n\r\n const leftCustomItems = (toolbarConfig?.customItems || []).filter(\r\n (i) => (i.position || 'left') === 'left'\r\n );\r\n const rightCustomItems = (toolbarConfig?.customItems || []).filter(\r\n (i) => i.position === 'right'\r\n );\r\n\r\n return (\r\n <div\r\n style={{\r\n display: 'flex',\r\n flexDirection: 'column',\r\n backgroundColor: theme.dom.toolbarBg,\r\n borderBottom: `1px solid ${theme.dom.toolbarBorder}`,\r\n backdropFilter: theme.dom.glassBackdrop,\r\n WebkitBackdropFilter: theme.dom.glassBackdrop,\r\n color: theme.dom.toolbarText,\r\n fontFamily: theme.fontFamily,\r\n fontSize: 12,\r\n userSelect: 'none',\r\n position: 'relative',\r\n zIndex: 140,\r\n }}\r\n >\r\n {/* PRIMARY TOOLBAR ROW */}\r\n <div\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n padding: '7px 12px',\r\n gap: 10,\r\n flexWrap: 'wrap',\r\n }}\r\n >\r\n {/* Left: Brand + CRUD Action Buttons + Undo/Redo + Custom Left Items */}\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 6, flexWrap: 'wrap' }}>\r\n {showBrand && (\r\n <>\r\n <div\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 6,\r\n fontWeight: 700,\r\n fontSize: 13,\r\n marginRight: 4,\r\n }}\r\n >\r\n <SheetGLLogo size={20} />\r\n <div style={{ display: 'flex', alignItems: 'baseline', gap: 5 }}>\r\n <span style={{ fontWeight: 800, letterSpacing: '-0.02em' }}>\r\n Sheet\r\n <span\r\n style={{\r\n background:\r\n 'linear-gradient(110deg, #c4b5fd 0%, #a855f7 32%, #818cf8 68%, #38bdf8 100%)',\r\n WebkitBackgroundClip: 'text',\r\n WebkitTextFillColor: 'transparent',\r\n }}\r\n >\r\n GL\r\n </span>\r\n </span>\r\n <span\r\n style={{\r\n fontSize: 10,\r\n fontWeight: 600,\r\n fontFamily: \"'JetBrains Mono', monospace\",\r\n color: theme.name === 'apple-dark' ? '#38BDF8' : '#7C3AED',\r\n opacity: 0.88,\r\n }}\r\n >\r\n v{SHEETGL_VERSION}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div\r\n style={{\r\n width: 1,\r\n height: 18,\r\n backgroundColor: theme.dom.toolbarBorder,\r\n margin: '0 2px',\r\n }}\r\n />\r\n </>\r\n )}\r\n\r\n {/* CRUD Action Buttons */}\r\n {showAddRow && onAddRow && (\r\n <button\r\n type=\"button\"\r\n disabled={!canAdd}\r\n onClick={onAddRow}\r\n title={isTR ? 'Yeni Satır Ekle (Insert)' : 'Insert New Row'}\r\n style={btnStyle(!canAdd)}\r\n >\r\n {renderBtnContent('add', isTR ? 'Satır Ekle' : 'Add Row', undefined, '#30D158')}\r\n </button>\r\n )}\r\n\r\n {showDuplicateRow && onDuplicateRow && (\r\n <button\r\n type=\"button\"\r\n disabled={!canDup}\r\n onClick={onDuplicateRow}\r\n title={isTR ? 'Seçili Satırı Çoğalt (Ctrl+Shift+D)' : 'Duplicate Selected Row'}\r\n style={btnStyle(!canDup)}\r\n >\r\n {renderBtnContent(\r\n 'content_copy',\r\n isTR ? 'Çoğalt' : 'Duplicate',\r\n undefined,\r\n theme.dom.accentColor\r\n )}\r\n </button>\r\n )}\r\n\r\n {showDeleteRow && onDeleteRow && (\r\n <button\r\n type=\"button\"\r\n disabled={!canDel}\r\n onClick={onDeleteRow}\r\n title={\r\n selectedRowCount > 0\r\n ? isTR\r\n ? `Seçili ${selectedRowCount} Satırı Sil`\r\n : `Delete ${selectedRowCount} Selected Rows`\r\n : isTR\r\n ? 'Seçili Satırı Sil'\r\n : 'Delete Selected Row'\r\n }\r\n style={{\r\n ...btnStyle(!canDel),\r\n color: canDel ? '#FF453A' : theme.dom.toolbarText,\r\n }}\r\n >\r\n {renderBtnContent(\r\n 'delete',\r\n selectedRowCount > 0\r\n ? isTR\r\n ? `Sil (${selectedRowCount})`\r\n : `Delete (${selectedRowCount})`\r\n : isTR\r\n ? 'Sil'\r\n : 'Delete',\r\n undefined,\r\n canDel ? '#FF453A' : undefined\r\n )}\r\n </button>\r\n )}\r\n\r\n {(!isMobile || showMobileMore) && toolbarConfig?.showSelectionModeSwitch && onSelectionModeChange && (\r\n <select\r\n value={selectionMode}\r\n onChange={(e) => onSelectionModeChange(e.target.value as RowSelectionMode)}\r\n title={isTR ? 'Satır Seçim Modu' : 'Row Selection Mode'}\r\n style={{\r\n padding: '4px 8px',\r\n backgroundColor: theme.dom.inputBg,\r\n color: theme.dom.inputText,\r\n border: `1px solid ${theme.dom.inputBorder}`,\r\n borderRadius: 6,\r\n outline: 'none',\r\n fontSize: 11,\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n }}\r\n >\r\n <option value=\"none\">{isTR ? 'Seçim: Hücre (Yok)' : 'Select: Cell Only'}</option>\r\n <option value=\"single\">{isTR ? 'Seçim: Tekli (Single)' : 'Select: Single Row'}</option>\r\n <option value=\"multiple\">{isTR ? 'Seçim: Çoklu (Multiple)' : 'Select: Multiple Choice'}</option>\r\n </select>\r\n )}\r\n\r\n {/* Undo / Redo */}\r\n {showUndoRedo && (onUndo || onRedo) && (\r\n <>\r\n <div\r\n style={{\r\n width: 1,\r\n height: 18,\r\n backgroundColor: theme.dom.toolbarBorder,\r\n margin: '0 2px',\r\n }}\r\n />\r\n <button\r\n type=\"button\"\r\n disabled={!canUndo || !canEdit}\r\n onClick={onUndo}\r\n title={isTR ? 'Geri Al (Ctrl+Z)' : 'Undo (Ctrl+Z)'}\r\n style={btnStyle(!canUndo || !canEdit)}\r\n >\r\n {renderBtnContent('undo', isTR ? 'Geri Al' : 'Undo')}\r\n </button>\r\n <button\r\n type=\"button\"\r\n disabled={!canRedo || !canEdit}\r\n onClick={onRedo}\r\n title={isTR ? 'İleri Al (Ctrl+Y)' : 'Redo (Ctrl+Y)'}\r\n style={btnStyle(!canRedo || !canEdit)}\r\n >\r\n {renderBtnContent('redo', isTR ? 'İleri Al' : 'Redo')}\r\n </button>\r\n </>\r\n )}\r\n\r\n {leftCustomItems.map(renderCustomItem)}\r\n </div>\r\n\r\n {/* Center: Search + Group Selector + Active Filter Clear */}\r\n <div\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: isMobile ? 6 : 8,\r\n flex: 1,\r\n maxWidth: 500,\r\n minWidth: isMobile ? 115 : 200,\r\n }}\r\n >\r\n {showSearch && (\r\n <div style={{ position: 'relative', flex: 1 }}>\r\n <span\r\n style={{\r\n position: 'absolute',\r\n left: 8,\r\n top: '50%',\r\n transform: 'translateY(-50%)',\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n pointerEvents: 'none',\r\n }}\r\n >\r\n <MaterialIcon\r\n name=\"search\"\r\n size={15}\r\n color={theme.isDark ? '#8E8E93' : '#6E6E73'}\r\n />\r\n </span>\r\n <input\r\n type=\"text\"\r\n placeholder={locale.searchPlaceholder}\r\n value={searchKeyword}\r\n onChange={(e) => onSearchChange(e.target.value)}\r\n style={{\r\n width: '100%',\r\n padding: '5px 26px 5px 28px',\r\n backgroundColor: theme.dom.inputBg,\r\n color: theme.dom.inputText,\r\n border: `1px solid ${theme.dom.inputBorder}`,\r\n borderRadius: 6,\r\n outline: 'none',\r\n fontSize: 12,\r\n fontFamily: theme.fontFamily,\r\n boxSizing: 'border-box',\r\n }}\r\n />\r\n {searchKeyword && (\r\n <button\r\n type=\"button\"\r\n onClick={() => onSearchChange('')}\r\n style={{\r\n position: 'absolute',\r\n right: 5,\r\n top: '50%',\r\n transform: 'translateY(-50%)',\r\n border: 'none',\r\n background: 'transparent',\r\n color: '#8E8E93',\r\n cursor: 'pointer',\r\n padding: 2,\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n }}\r\n >\r\n <MaterialIcon name=\"close\" size={14} color=\"#8E8E93\" />\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n {(!isMobile || showMobileMore) && showGroupBy && (\r\n <div style={{ position: 'relative', display: 'inline-flex', alignItems: 'center' }}>\r\n <MaterialIcon\r\n name=\"workspaces\"\r\n size={14}\r\n color={theme.isDark ? '#8E8E93' : '#6E6E73'}\r\n style={{ position: 'absolute', left: 7, pointerEvents: 'none' }}\r\n />\r\n <select\r\n value=\"\"\r\n disabled={permissions?.allowGrouping === false}\r\n onChange={(e) => {\r\n if (e.target.value) {\r\n onToggleGroupColumn(e.target.value);\r\n }\r\n }}\r\n style={{\r\n padding: '5px 8px 5px 24px',\r\n backgroundColor: theme.dom.inputBg,\r\n color: theme.dom.inputText,\r\n border: `1px solid ${theme.dom.inputBorder}`,\r\n borderRadius: 6,\r\n outline: 'none',\r\n fontSize: 11,\r\n cursor: 'pointer',\r\n }}\r\n >\r\n <option value=\"\">{locale.addGroup}</option>\r\n {availableColumns\r\n .filter((c) => c.type !== 'sparkline' && c.type !== 'action')\r\n .map((c) => (\r\n <option key={c.id} value={c.id}>\r\n {c.title} {groups.includes(c.id) ? '✓' : ''}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n )}\r\n\r\n {showClearFilters && activeFilterCount > 0 && onClearAllFilters && (\r\n <button\r\n type=\"button\"\r\n onClick={onClearAllFilters}\r\n title={isTR ? 'Tüm aktif filtreleri temizle' : 'Clear all active filters'}\r\n style={{\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 4,\r\n padding: displayMode === 'icon' ? '5px 7px' : '4px 8px',\r\n borderRadius: 6,\r\n border: `1px solid ${theme.dom.accentColor}`,\r\n backgroundColor: theme.isDark\r\n ? 'rgba(10,132,255,0.16)'\r\n : 'rgba(0,122,255,0.1)',\r\n color: theme.dom.accentColor,\r\n fontSize: 11,\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n whiteSpace: 'nowrap',\r\n }}\r\n >\r\n {renderBtnContent(\r\n 'filter_alt_off',\r\n isTR ? `Filtreler (${activeFilterCount})` : `Filters (${activeFilterCount})`,\r\n undefined,\r\n theme.dom.accentColor\r\n )}\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* Right: Batch Save Bar + Display Mode Switch + Permissions + Column/Summary Settings + Locale + Theme + Export */}\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 6, flexWrap: 'wrap' }}>\r\n {/* Batch Save / Discard Controls */}\r\n {showBatchActions && pendingChangesCount > 0 && (\r\n <div\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 5,\r\n padding: '2px 6px',\r\n borderRadius: 7,\r\n backgroundColor: theme.isDark\r\n ? 'rgba(48, 209, 88, 0.14)'\r\n : 'rgba(52, 199, 89, 0.12)',\r\n border: '1px solid rgba(48, 209, 88, 0.4)',\r\n }}\r\n >\r\n <button\r\n type=\"button\"\r\n onClick={onInspectBatchChanges || onSaveBatch}\r\n title={\r\n isTR\r\n ? 'Bekleyen değişiklikleri ve silinecek satırları incelemek için tıklayın'\r\n : 'Click to inspect pending changes and rows marked for deletion'\r\n }\r\n style={{\r\n fontSize: 11,\r\n fontWeight: 700,\r\n color: '#30D158',\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 4,\r\n padding: '3px 7px',\r\n borderRadius: 5,\r\n border: '1px dashed rgba(48, 209, 88, 0.55)',\r\n backgroundColor: 'rgba(48, 209, 88, 0.1)',\r\n cursor: 'pointer',\r\n }}\r\n >\r\n <MaterialIcon name=\"pending_actions\" size={14} color=\"#30D158\" />\r\n <span>\r\n {pendingChangesCount} {isTR ? 'Değişiklik' : 'Unsaved'}\r\n </span>\r\n </button>\r\n {onSaveBatch && (\r\n <button\r\n type=\"button\"\r\n onClick={onSaveBatch}\r\n title={isTR ? 'Toplu Kaydet (Batch Save)' : 'Batch Save Changes'}\r\n style={{\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 4,\r\n padding: displayMode === 'icon' ? '4px 6px' : '3px 8px',\r\n borderRadius: 5,\r\n border: 'none',\r\n backgroundColor: '#30D158',\r\n color: '#FFFFFF',\r\n fontSize: 11,\r\n fontWeight: 700,\r\n cursor: 'pointer',\r\n }}\r\n >\r\n {renderBtnContent(\r\n 'save',\r\n isTR ? 'Toplu Kaydet' : 'Batch Save',\r\n undefined,\r\n '#FFFFFF',\r\n 14\r\n )}\r\n </button>\r\n )}\r\n {onDiscardBatch && (\r\n <button\r\n type=\"button\"\r\n onClick={onDiscardBatch}\r\n title={isTR ? 'Değişiklikleri Geri Al' : 'Discard Changes'}\r\n style={{\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 4,\r\n padding: displayMode === 'icon' ? '4px 6px' : '3px 7px',\r\n borderRadius: 5,\r\n border: `1px solid ${theme.dom.inputBorder}`,\r\n backgroundColor: 'transparent',\r\n color: theme.dom.toolbarText,\r\n fontSize: 11,\r\n cursor: 'pointer',\r\n }}\r\n >\r\n {renderBtnContent(\r\n 'restore',\r\n isTR ? 'Vazgeç' : 'Discard',\r\n undefined,\r\n undefined,\r\n 14\r\n )}\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Toolbar Button Display Mode Switcher (Icon | Icon+Text | Text) */}\r\n {(!isMobile || showMobileMore) && allowDisplayModeSwitch && onUpdateToolbarConfig && (\r\n <div\r\n title={\r\n isTR\r\n ? 'Toolbar Buton Görünümü: İkon / İkon+Metin / Metin'\r\n : 'Toolbar Button Display Mode: Icon / Icon+Text / Text'\r\n }\r\n style={{\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n backgroundColor: theme.dom.inputBg,\r\n border: `1px solid ${theme.dom.inputBorder}`,\r\n borderRadius: 6,\r\n padding: 1,\r\n gap: 1,\r\n }}\r\n >\r\n {(\r\n [\r\n {\r\n mode: 'icon' as ToolbarButtonDisplayMode,\r\n icon: 'apps',\r\n label: isTR ? 'İkon' : 'Icon',\r\n tip: isTR ? 'Sadece İkon (Icon Only)' : 'Icon Only',\r\n },\r\n {\r\n mode: 'icon-text' as ToolbarButtonDisplayMode,\r\n icon: 'view_sidebar',\r\n label: isTR ? 'İkon+Metin' : 'Icon+Text',\r\n tip: isTR ? 'İkon + Metin (Icon + Text)' : 'Icon + Text',\r\n },\r\n {\r\n mode: 'text' as ToolbarButtonDisplayMode,\r\n icon: 'text_fields',\r\n label: isTR ? 'Metin' : 'Text',\r\n tip: isTR ? 'Sadece Metin (Text Only)' : 'Text Only',\r\n },\r\n ] as const\r\n ).map((opt) => {\r\n const active = displayMode === opt.mode;\r\n return (\r\n <button\r\n key={opt.mode}\r\n type=\"button\"\r\n title={opt.tip}\r\n onClick={() => onUpdateToolbarConfig({ buttonDisplayMode: opt.mode })}\r\n style={{\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 3,\r\n padding: '3px 6px',\r\n borderRadius: 4,\r\n border: 'none',\r\n backgroundColor: active ? theme.dom.accentColor : 'transparent',\r\n color: active ? '#FFFFFF' : theme.dom.toolbarText,\r\n fontSize: 10,\r\n fontWeight: active ? 700 : 500,\r\n cursor: 'pointer',\r\n fontFamily: theme.fontFamily,\r\n }}\r\n >\r\n <MaterialIcon\r\n name={opt.icon}\r\n size={13}\r\n color={active ? '#FFFFFF' : undefined}\r\n />\r\n <span>{opt.label}</span>\r\n </button>\r\n );\r\n })}\r\n </div>\r\n )}\r\n\r\n {/* Permission Mode Switcher */}\r\n {(!isMobile || showMobileMore) && showPermissionsSwitch && onPermissionsChange && (\r\n <div style={{ position: 'relative', display: 'inline-flex', alignItems: 'center' }}>\r\n <MaterialIcon\r\n name={\r\n permissions?.mode === 'readonly'\r\n ? 'lock'\r\n : permissions?.mode === 'read'\r\n ? 'visibility'\r\n : 'edit_note'\r\n }\r\n size={14}\r\n color={isReadonlyMode ? '#FF9F0A' : theme.dom.accentColor}\r\n style={{ position: 'absolute', left: 7, pointerEvents: 'none' }}\r\n />\r\n <select\r\n value={permissions?.mode || 'write'}\r\n onChange={(e) => {\r\n const mode = e.target.value as 'write' | 'read' | 'readonly';\r\n onPermissionsChange({\r\n ...permissions,\r\n mode,\r\n allowUpdating: mode === 'write',\r\n allowAdding: mode === 'write',\r\n allowDeleting: mode === 'write',\r\n allowDuplicating: mode === 'write',\r\n allowClipboardPaste: mode === 'write',\r\n });\r\n }}\r\n title={isTR ? 'Tablo Yetki Modu (Permissions)' : 'Grid Permission Mode'}\r\n style={{\r\n padding: '4px 8px 4px 24px',\r\n backgroundColor: isReadonlyMode\r\n ? 'rgba(255, 159, 10, 0.16)'\r\n : theme.dom.inputBg,\r\n color: isReadonlyMode ? '#FF9F0A' : theme.dom.inputText,\r\n border: `1px solid ${\r\n isReadonlyMode ? 'rgba(255,159,10,0.4)' : theme.dom.inputBorder\r\n }`,\r\n borderRadius: 6,\r\n outline: 'none',\r\n fontSize: 11,\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n }}\r\n >\r\n <option value=\"write\">\r\n {isTR ? 'Yetki: Yazma (Write)' : 'Perm: Write (Full)'}\r\n </option>\r\n <option value=\"readonly\">\r\n {isTR ? 'Yetki: Salt Okunur (ReadOnly)' : 'Perm: Read-Only'}\r\n </option>\r\n <option value=\"read\">\r\n {isTR ? 'Yetki: Sadece Okuma (Read)' : 'Perm: Read View'}\r\n </option>\r\n </select>\r\n </div>\r\n )}\r\n\r\n {/* Column, Toolbar & Summary Settings Popover Toggle */}\r\n {showColumnSettings && (\r\n <div style={{ position: 'relative' }}>\r\n <button\r\n type=\"button\"\r\n title={\r\n isTR\r\n ? 'Sütun, Toolbar ve Özet Satırı Ayarları'\r\n : 'Columns, Toolbar & Summary Settings'\r\n }\r\n onClick={() => setShowColSettings((v) => !v)}\r\n style={btnStyle(false, showColSettings)}\r\n >\r\n {renderBtnContent(\r\n 'tune',\r\n isTR ? 'Ayarlar' : 'Configure',\r\n undefined,\r\n showColSettings ? '#FFFFFF' : undefined\r\n )}\r\n </button>\r\n\r\n {showColSettings && (\r\n <div\r\n onMouseDown={(e) => e.stopPropagation()}\r\n style={{\r\n position: isMobile ? 'fixed' : 'absolute',\r\n left: isMobile ? 10 : undefined,\r\n right: isMobile ? 10 : 0,\r\n top: isMobile ? 64 : 'calc(100% + 6px)',\r\n width: isMobile ? 'auto' : 400,\r\n maxWidth: isMobile ? 420 : undefined,\r\n margin: isMobile ? '0 auto' : undefined,\r\n maxHeight: isMobile ? '78vh' : 420,\r\n overflowY: 'auto',\r\n backgroundColor: theme.dom.popoverBg,\r\n color: theme.dom.popoverText,\r\n border: `1px solid ${theme.dom.popoverBorder}`,\r\n borderRadius: 10,\r\n boxShadow: theme.dom.popoverShadow,\r\n backdropFilter: theme.dom.glassBackdrop,\r\n padding: 12,\r\n zIndex: isMobile ? 600 : 200,\r\n }}\r\n >\r\n {/* Header + Tabs */}\r\n <div\r\n style={{\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n marginBottom: 8,\r\n paddingBottom: 6,\r\n borderBottom: `1px solid ${theme.dom.popoverBorder}`,\r\n }}\r\n >\r\n <div style={{ display: 'flex', gap: 4 }}>\r\n <button\r\n type=\"button\"\r\n onClick={() => setSettingsTab('columns')}\r\n style={{\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 4,\r\n padding: '4px 8px',\r\n borderRadius: 5,\r\n border: 'none',\r\n backgroundColor:\r\n settingsTab === 'columns' ? theme.dom.accentColor : 'transparent',\r\n color:\r\n settingsTab === 'columns' ? '#FFFFFF' : theme.dom.popoverText,\r\n fontSize: 11,\r\n fontWeight: 700,\r\n cursor: 'pointer',\r\n }}\r\n >\r\n <MaterialIcon\r\n name=\"view_column\"\r\n size={14}\r\n color={settingsTab === 'columns' ? '#FFFFFF' : undefined}\r\n />\r\n <span>{isTR ? 'Sütunlar ve Özet' : 'Columns & Summary'}</span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => setSettingsTab('layout')}\r\n style={{\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 4,\r\n padding: '4px 8px',\r\n borderRadius: 5,\r\n border: 'none',\r\n backgroundColor:\r\n settingsTab === 'layout' ? theme.dom.accentColor : 'transparent',\r\n color:\r\n settingsTab === 'layout' ? '#FFFFFF' : theme.dom.popoverText,\r\n fontSize: 11,\r\n fontWeight: 700,\r\n cursor: 'pointer',\r\n }}\r\n >\r\n <MaterialIcon\r\n name=\"dashboard_customize\"\r\n size={14}\r\n color={settingsTab === 'layout' ? '#FFFFFF' : undefined}\r\n />\r\n <span>{isTR ? 'Toolbar & Özet Satırı' : 'Toolbar & Summary Row'}</span>\r\n </button>\r\n </div>\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowColSettings(false)}\r\n style={{\r\n border: 'none',\r\n background: 'transparent',\r\n color: '#8E8E93',\r\n cursor: 'pointer',\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n }}\r\n >\r\n <MaterialIcon name=\"close\" size={16} color=\"#8E8E93\" />\r\n </button>\r\n </div>\r\n\r\n {settingsTab === 'columns' ? (\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\r\n {availableColumns.map((col) => {\r\n const isRO = Boolean(col.readonly || col.permission === 'readonly');\r\n const isPinned = Boolean(col.pinned);\r\n const sumType = summaryTypes[col.id] || 'none';\r\n return (\r\n <div\r\n key={col.id}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n gap: 6,\r\n padding: '5px 8px',\r\n borderRadius: 6,\r\n backgroundColor: theme.isDark\r\n ? 'rgba(255,255,255,0.03)'\r\n : 'rgba(0,0,0,0.025)',\r\n fontSize: 11,\r\n }}\r\n >\r\n <div\r\n style={{\r\n flex: 1,\r\n fontWeight: 600,\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n }}\r\n >\r\n {col.title}\r\n </div>\r\n\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 4 }}>\r\n {/* Toggle ReadOnly vs Write */}\r\n <button\r\n type=\"button\"\r\n onClick={() =>\r\n onUpdateColumn?.(col.id, {\r\n readonly: !isRO,\r\n permission: !isRO ? 'readonly' : 'write',\r\n })\r\n }\r\n style={{\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 3,\r\n padding: '2px 6px',\r\n fontSize: 10,\r\n borderRadius: 4,\r\n border: `1px solid ${theme.dom.popoverBorder}`,\r\n backgroundColor: isRO\r\n ? 'rgba(255,159,10,0.16)'\r\n : 'rgba(48,209,88,0.15)',\r\n color: isRO ? '#FF9F0A' : '#30D158',\r\n cursor: 'pointer',\r\n fontWeight: 600,\r\n }}\r\n >\r\n <MaterialIcon\r\n name={isRO ? 'lock' : 'edit'}\r\n size={11}\r\n color={isRO ? '#FF9F0A' : '#30D158'}\r\n />\r\n <span>{isRO ? 'ReadOnly' : 'Write'}</span>\r\n </button>\r\n\r\n {/* Toggle Pin */}\r\n <button\r\n type=\"button\"\r\n onClick={() =>\r\n onUpdateColumn?.(col.id, {\r\n pinned: isPinned ? false : 'left',\r\n })\r\n }\r\n style={{\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 3,\r\n padding: '2px 6px',\r\n fontSize: 10,\r\n borderRadius: 4,\r\n border: `1px solid ${theme.dom.popoverBorder}`,\r\n backgroundColor: isPinned\r\n ? theme.dom.accentColor\r\n : 'transparent',\r\n color: isPinned ? '#FFFFFF' : theme.dom.popoverText,\r\n cursor: 'pointer',\r\n }}\r\n >\r\n <MaterialIcon\r\n name=\"push_pin\"\r\n size={11}\r\n filled={isPinned}\r\n color={isPinned ? '#FFFFFF' : undefined}\r\n />\r\n <span>{isPinned ? 'Pinned' : 'Pin'}</span>\r\n </button>\r\n\r\n {/* Summary Selector */}\r\n <select\r\n value={sumType}\r\n onChange={(e) =>\r\n onChangeSummaryType?.(col.id, e.target.value as SummaryType)\r\n }\r\n style={{\r\n padding: '2px 4px',\r\n fontSize: 10,\r\n borderRadius: 4,\r\n border: `1px solid ${theme.dom.popoverBorder}`,\r\n backgroundColor: theme.dom.inputBg,\r\n color: theme.dom.inputText,\r\n cursor: 'pointer',\r\n }}\r\n >\r\n <option value=\"none\">No Sum</option>\r\n <option value=\"sum\">SUM</option>\r\n <option value=\"avg\">AVG</option>\r\n <option value=\"min\">MIN</option>\r\n <option value=\"max\">MAX</option>\r\n <option value=\"count\">COUNT</option>\r\n </select>\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n ) : (\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>\r\n {/* Toolbar Button Display Mode */}\r\n {onUpdateToolbarConfig && (\r\n <div\r\n style={{\r\n padding: 8,\r\n borderRadius: 7,\r\n backgroundColor: theme.isDark\r\n ? 'rgba(255,255,255,0.03)'\r\n : 'rgba(0,0,0,0.025)',\r\n }}\r\n >\r\n <div\r\n style={{\r\n fontSize: 11,\r\n fontWeight: 700,\r\n marginBottom: 6,\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 5,\r\n }}\r\n >\r\n <MaterialIcon\r\n name=\"smart_button\"\r\n size={14}\r\n color={theme.dom.accentColor}\r\n />\r\n <span>\r\n {isTR\r\n ? 'Toolbar Buton Görünüm Modu'\r\n : 'Toolbar Button Display Mode'}\r\n </span>\r\n </div>\r\n <div style={{ display: 'flex', gap: 6 }}>\r\n {(\r\n [\r\n {\r\n mode: 'icon' as ToolbarButtonDisplayMode,\r\n icon: 'apps',\r\n label: isTR ? 'Sadece İkon' : 'Icon Only',\r\n },\r\n {\r\n mode: 'icon-text' as ToolbarButtonDisplayMode,\r\n icon: 'view_sidebar',\r\n label: isTR ? 'İkon + Metin' : 'Icon + Text',\r\n },\r\n {\r\n mode: 'text' as ToolbarButtonDisplayMode,\r\n icon: 'text_fields',\r\n label: isTR ? 'Sadece Metin' : 'Text Only',\r\n },\r\n ] as const\r\n ).map((m) => {\r\n const active = displayMode === m.mode;\r\n return (\r\n <button\r\n key={m.mode}\r\n type=\"button\"\r\n onClick={() =>\r\n onUpdateToolbarConfig({ buttonDisplayMode: m.mode })\r\n }\r\n style={{\r\n flex: 1,\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: 4,\r\n padding: '5px 8px',\r\n borderRadius: 6,\r\n border: `1px solid ${\r\n active ? theme.dom.accentColor : theme.dom.popoverBorder\r\n }`,\r\n backgroundColor: active\r\n ? theme.dom.accentColor\r\n : 'transparent',\r\n color: active ? '#FFFFFF' : theme.dom.popoverText,\r\n fontSize: 11,\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n }}\r\n >\r\n <MaterialIcon\r\n name={m.icon}\r\n size={14}\r\n color={active ? '#FFFFFF' : undefined}\r\n />\r\n <span>{m.label}</span>\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Toolbar Items Visibility */}\r\n {onUpdateToolbarConfig && (\r\n <div\r\n style={{\r\n padding: 8,\r\n borderRadius: 7,\r\n backgroundColor: theme.isDark\r\n ? 'rgba(255,255,255,0.03)'\r\n : 'rgba(0,0,0,0.025)',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 5,\r\n }}\r\n >\r\n <div\r\n style={{\r\n fontSize: 11,\r\n fontWeight: 700,\r\n marginBottom: 2,\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 5,\r\n }}\r\n >\r\n <MaterialIcon\r\n name=\"web_asset\"\r\n size={14}\r\n color={theme.dom.accentColor}\r\n />\r\n <span>\r\n {isTR ? 'Toolbar Elemanları' : 'Toolbar Visible Controls'}\r\n </span>\r\n </div>\r\n {(\r\n [\r\n {\r\n key: 'showAddRow' as const,\r\n val: showAddRow,\r\n label: isTR ? 'Satır Ekle Butonu' : 'Add Row Button',\r\n },\r\n {\r\n key: 'showDuplicateRow' as const,\r\n val: showDuplicateRow,\r\n label: isTR ? 'Çoğalt Butonu' : 'Duplicate Button',\r\n },\r\n {\r\n key: 'showDeleteRow' as const,\r\n val: showDeleteRow,\r\n label: isTR ? 'Sil Butonu' : 'Delete Button',\r\n },\r\n {\r\n key: 'showUndoRedo' as const,\r\n val: showUndoRedo,\r\n label: isTR ? 'Geri Al / İleri Al' : 'Undo / Redo Buttons',\r\n },\r\n {\r\n key: 'showSearch' as const,\r\n val: showSearch,\r\n label: isTR ? 'Arama Kutusu' : 'Global Search Box',\r\n },\r\n {\r\n key: 'showGroupBy' as const,\r\n val: showGroupBy,\r\n label: isTR ? 'Gruplama Seçicisi' : 'Group By Selector',\r\n },\r\n {\r\n key: 'showExportCsv' as const,\r\n val: showExportCsv,\r\n label: isTR ? 'CSV Dışa Aktar' : 'Export CSV Button',\r\n },\r\n ] as const\r\n ).map((item) => (\r\n <label\r\n key={item.key}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n fontSize: 11,\r\n cursor: 'pointer',\r\n }}\r\n >\r\n <span>{item.label}</span>\r\n <input\r\n type=\"checkbox\"\r\n checked={item.val}\r\n onChange={(e) =>\r\n onUpdateToolbarConfig({ [item.key]: e.target.checked })\r\n }\r\n />\r\n </label>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* Summary Row Settings */}\r\n {onUpdateSummaryConfig && (\r\n <div\r\n style={{\r\n padding: 8,\r\n borderRadius: 7,\r\n backgroundColor: theme.isDark\r\n ? 'rgba(255,255,255,0.03)'\r\n : 'rgba(0,0,0,0.025)',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 5,\r\n }}\r\n >\r\n <div\r\n style={{\r\n fontSize: 11,\r\n fontWeight: 700,\r\n marginBottom: 2,\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 5,\r\n }}\r\n >\r\n <MaterialIcon\r\n name=\"functions\"\r\n size={14}\r\n color={theme.dom.accentColor}\r\n />\r\n <span>\r\n {isTR\r\n ? 'Özet Satırı (Summary Row) Ayarları'\r\n : 'Summary Row Configuration'}\r\n </span>\r\n </div>\r\n {(\r\n [\r\n {\r\n key: 'visible' as const,\r\n val: summaryConfig?.visible !== false,\r\n label: isTR\r\n ? 'Özet Satırını Göster (Summary Row)'\r\n : 'Show Summary Footer Row',\r\n },\r\n {\r\n key: 'showTotalCount' as const,\r\n val: summaryConfig?.showTotalCount !== false,\r\n label: isTR\r\n ? 'Toplam Kayıt Sayısı'\r\n : 'Show Total Row Count',\r\n },\r\n {\r\n key: 'showSelectionStats' as const,\r\n val: summaryConfig?.showSelectionStats !== false,\r\n label: isTR\r\n ? 'Canlı Hücre Seçim İstatistikleri'\r\n : 'Show Live Selection Stats',\r\n },\r\n {\r\n key: 'showColumnSummaries' as const,\r\n val: summaryConfig?.showColumnSummaries !== false,\r\n label: isTR\r\n ? 'Sütun Özet Hesaplamaları'\r\n : 'Show Column Summaries',\r\n },\r\n ] as const\r\n ).map((item) => (\r\n <label\r\n key={item.key}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n fontSize: 11,\r\n cursor: 'pointer',\r\n }}\r\n >\r\n <span>{item.label}</span>\r\n <input\r\n type=\"checkbox\"\r\n checked={item.val}\r\n onChange={(e) =>\r\n onUpdateSummaryConfig({ [item.key]: e.target.checked })\r\n }\r\n />\r\n </label>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {(!isMobile || showMobileMore) && showLocaleSwitch && onLocaleChange && (\r\n <select\r\n value={locale.code}\r\n onChange={(e) => onLocaleChange(e.target.value)}\r\n style={{\r\n padding: '4px 7px',\r\n backgroundColor: theme.dom.inputBg,\r\n color: theme.dom.inputText,\r\n border: `1px solid ${theme.dom.inputBorder}`,\r\n borderRadius: 6,\r\n outline: 'none',\r\n fontSize: 11,\r\n cursor: 'pointer',\r\n fontWeight: 500,\r\n }}\r\n >\r\n <option value=\"en-US\">EN</option>\r\n <option value=\"tr-TR\">TR</option>\r\n </select>\r\n )}\r\n\r\n {(!isMobile || showMobileMore) && showThemeSwitch && (\r\n <select\r\n value={currentThemeName}\r\n onChange={(e) => onThemeChange(e.target.value as ThemeInput)}\r\n style={{\r\n padding: '4px 7px',\r\n backgroundColor: theme.dom.inputBg,\r\n color: theme.dom.inputText,\r\n border: `1px solid ${theme.dom.inputBorder}`,\r\n borderRadius: 6,\r\n outline: 'none',\r\n fontSize: 11,\r\n cursor: 'pointer',\r\n }}\r\n >\r\n <option value=\"apple-light\">Apple Light</option>\r\n <option value=\"apple-dark\">Apple Dark</option>\r\n <option value=\"google-light\">Google Light</option>\r\n <option value=\"google-dark\">Google Dark</option>\r\n <option value=\"system\">{locale.systemTheme}</option>\r\n </select>\r\n )}\r\n\r\n {rightCustomItems.map(renderCustomItem)}\r\n\r\n {(!isMobile || showMobileMore) && showExportCsv && permissions?.allowExport !== false && (\r\n <button\r\n type=\"button\"\r\n onClick={onExportCsv}\r\n title={locale.exportCsv}\r\n style={btnStyle(false, true)}\r\n >\r\n {renderBtnContent('download', locale.exportCsv, undefined, '#FFFFFF')}\r\n </button>\r\n )}\r\n\r\n {isMobile && (\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowMobileMore((v) => !v)}\r\n title={isTR ? 'Diğer Araçları Göster/Gizle' : 'Toggle Extra Toolbar Controls'}\r\n style={btnStyle(false, showMobileMore, 'icon')}\r\n >\r\n <MaterialIcon\r\n name={showMobileMore ? 'expand_less' : 'more_horiz'}\r\n size={16}\r\n color={showMobileMore ? '#FFFFFF' : undefined}\r\n />\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* SECONDARY GROUPING BREADCRUMB BAR (Shown when grouping is active) */}\r\n {groups.length > 0 && (\r\n <div\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n padding: '4px 14px',\r\n borderTop: `1px solid ${theme.dom.toolbarBorder}`,\r\n backgroundColor: theme.isDark ? 'rgba(255,255,255,0.02)' : 'rgba(0,0,0,0.02)',\r\n fontSize: 11,\r\n }}\r\n >\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 6, flexWrap: 'wrap' }}>\r\n <span\r\n style={{\r\n color: '#8E8E93',\r\n fontWeight: 600,\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 4,\r\n }}\r\n >\r\n <MaterialIcon name=\"account_tree\" size={14} color=\"#8E8E93\" />\r\n {isTR ? 'Aktif Gruplar:' : 'Grouped By:'}\r\n </span>\r\n {groups.map((colId, idx) => {\r\n const col = availableColumns.find((c) => c.id === colId);\r\n return (\r\n <React.Fragment key={colId}>\r\n {idx > 0 && <span style={{ color: '#8E8E93' }}>›</span>}\r\n <span\r\n style={{\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 5,\r\n padding: '2px 8px',\r\n borderRadius: 12,\r\n backgroundColor: theme.dom.badgeBg,\r\n color: theme.dom.badgeText,\r\n fontWeight: 600,\r\n }}\r\n >\r\n <span>{col?.title || colId}</span>\r\n <button\r\n type=\"button\"\r\n onClick={() => onToggleGroupColumn(colId)}\r\n style={{\r\n border: 'none',\r\n background: 'transparent',\r\n color: theme.dom.badgeText,\r\n cursor: 'pointer',\r\n padding: 0,\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n }}\r\n >\r\n <MaterialIcon name=\"close\" size={13} color={theme.dom.badgeText} />\r\n </button>\r\n </span>\r\n </React.Fragment>\r\n );\r\n })}\r\n </div>\r\n\r\n <div style={{ display: 'flex', gap: 6 }}>\r\n {onExpandAllGroups && (\r\n <button\r\n type=\"button\"\r\n onClick={onExpandAllGroups}\r\n title={isTR ? 'Tüm Grupları Aç' : 'Expand All Groups'}\r\n style={{\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 4,\r\n padding: '2px 8px',\r\n fontSize: 10,\r\n borderRadius: 4,\r\n border: `1px solid ${theme.dom.inputBorder}`,\r\n backgroundColor: 'transparent',\r\n color: theme.dom.toolbarText,\r\n cursor: 'pointer',\r\n }}\r\n >\r\n {renderBtnContent(\r\n 'unfold_more',\r\n isTR ? 'Tümünü Aç' : 'Expand All',\r\n undefined,\r\n undefined,\r\n 13\r\n )}\r\n </button>\r\n )}\r\n {onCollapseAllGroups && (\r\n <button\r\n type=\"button\"\r\n onClick={onCollapseAllGroups}\r\n title={isTR ? 'Tüm Grupları Kapat' : 'Collapse All Groups'}\r\n style={{\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 4,\r\n padding: '2px 8px',\r\n fontSize: 10,\r\n borderRadius: 4,\r\n border: `1px solid ${theme.dom.inputBorder}`,\r\n backgroundColor: 'transparent',\r\n color: theme.dom.toolbarText,\r\n cursor: 'pointer',\r\n }}\r\n >\r\n {renderBtnContent(\r\n 'unfold_less',\r\n isTR ? 'Tümünü Kapat' : 'Collapse All',\r\n undefined,\r\n undefined,\r\n 13\r\n )}\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import { CellPaintContext } from '../../IColumnTypePlugin';\r\nimport { SelectOption } from '../../../types/grid';\r\n\r\nfunction resolveTagColors(opt: SelectOption, isDark: boolean): { bg: string; fg: string; border?: string } {\r\n if (!isDark) {\r\n return {\r\n bg: opt.bg || '#E0E7FF',\r\n fg: opt.fg || '#1E40AF',\r\n border: undefined,\r\n };\r\n }\r\n\r\n if (opt.darkBg && opt.darkFg) {\r\n return {\r\n bg: opt.darkBg,\r\n fg: opt.darkFg,\r\n border: `${opt.darkFg}33`,\r\n };\r\n }\r\n\r\n return {\r\n bg: 'rgba(99, 102, 241, 0.18)',\r\n fg: '#818CF8',\r\n border: 'rgba(99, 102, 241, 0.32)',\r\n };\r\n}\r\n\r\nexport function normalizeMultiValue(value: any): string[] {\r\n if (value === null || value === undefined || value === '') return [];\r\n if (Array.isArray(value)) {\r\n const result: string[] = [];\r\n for (const v of value) {\r\n if (v === null || v === undefined) continue;\r\n if (Array.isArray(v) || typeof v === 'string') {\r\n result.push(...normalizeMultiValue(v));\r\n } else {\r\n const s = String(v).trim();\r\n if (s) result.push(s);\r\n }\r\n }\r\n return Array.from(new Set(result.filter(Boolean)));\r\n }\r\n if (typeof value === 'string') {\r\n let str = value.trim();\r\n if (!str) return [];\r\n\r\n // 1. Recursive JSON parse if wrapped in array brackets e.g. [\"A\", \"B\"] or \"[\\\"A\\\", \\\"B\\\"]\"\r\n while (\r\n (str.startsWith('[') && str.endsWith(']')) ||\r\n (str.startsWith('\"[') && str.endsWith(']\"'))\r\n ) {\r\n try {\r\n const parsed = JSON.parse(str);\r\n if (Array.isArray(parsed)) {\r\n return normalizeMultiValue(parsed);\r\n }\r\n if (typeof parsed === 'string') {\r\n str = parsed.trim();\r\n continue;\r\n }\r\n break;\r\n } catch {\r\n // Fallback: strip outer brackets and quotes\r\n str = str.replace(/^\\[+\\s*|\\]+\\s*$/g, '').trim();\r\n break;\r\n }\r\n }\r\n\r\n // 2. Split by comma, semicolon, pipe, or ' + '\r\n return Array.from(\r\n new Set(\r\n str\r\n .split(/[,;|]|\\s\\+\\s/)\r\n .map((s) => s.replace(/^[\"'\\s]+|[\"'\\s]+$/g, '').trim())\r\n .filter((s) => s.length > 0 && s !== 'null' && s !== 'undefined')\r\n )\r\n );\r\n }\r\n return [String(value).trim()].filter(Boolean);\r\n}\r\n\r\nexport function paintMultiSelect({\r\n ctx,\r\n value,\r\n column,\r\n theme,\r\n x,\r\n y,\r\n width,\r\n height,\r\n isHovered,\r\n isSelected,\r\n}: CellPaintContext<string[] | string>): void {\r\n const items = normalizeMultiValue(value);\r\n\r\n ctx.save();\r\n const pad = 6;\r\n const pillH = 20;\r\n const pillY = y + (height - pillH) / 2;\r\n const maxRight = x + width - 22; // Reserve space for dropdown arrow\r\n\r\n let curX = x + pad;\r\n ctx.font = `600 ${theme.fontSize - 2}px ${theme.fontFamily}`;\r\n ctx.textBaseline = 'middle';\r\n ctx.textAlign = 'left';\r\n\r\n for (let i = 0; i < items.length; i++) {\r\n const rawVal = items[i];\r\n const opt = column.options?.find((o) => o.value === rawVal) ?? {\r\n value: rawVal,\r\n label: rawVal,\r\n };\r\n const colors = resolveTagColors(opt, theme.isDark);\r\n const textW = ctx.measureText(opt.label).width;\r\n const pillW = Math.min(textW + 14, 110);\r\n\r\n const remainingCount = items.length - i;\r\n const reserveForMore = remainingCount > 1 ? 28 : 0;\r\n\r\n if (curX + pillW + reserveForMore > maxRight && i > 0) {\r\n // Draw +N overflow badge\r\n const moreText = `+${remainingCount}`;\r\n const moreW = ctx.measureText(moreText).width + 10;\r\n if (curX + moreW <= maxRight + 6) {\r\n ctx.fillStyle = theme.isDark ? 'rgba(255,255,255,0.12)' : 'rgba(15,23,42,0.08)';\r\n ctx.beginPath();\r\n ctx.roundRect(curX, pillY, moreW, pillH, 4);\r\n ctx.fill();\r\n\r\n ctx.fillStyle = theme.canvas.cellText;\r\n ctx.fillText(moreText, curX + 5, y + height / 2);\r\n }\r\n break;\r\n }\r\n\r\n const drawW = Math.max(24, Math.min(pillW, maxRight - curX));\r\n if (drawW < 24) break;\r\n\r\n // Pill background\r\n ctx.fillStyle = colors.bg;\r\n ctx.beginPath();\r\n ctx.roundRect(curX, pillY, drawW, pillH, 4);\r\n ctx.fill();\r\n\r\n if (colors.border) {\r\n ctx.strokeStyle = colors.border;\r\n ctx.lineWidth = 1;\r\n ctx.stroke();\r\n }\r\n\r\n // Pill label clipped\r\n ctx.save();\r\n ctx.beginPath();\r\n ctx.rect(curX + 4, pillY, drawW - 8, pillH);\r\n ctx.clip();\r\n ctx.fillStyle = colors.fg;\r\n ctx.fillText(opt.label, curX + 7, y + height / 2);\r\n ctx.restore();\r\n\r\n curX += drawW + 4;\r\n }\r\n\r\n // Dropdown arrow icon (▼) on right\r\n ctx.fillStyle =\r\n isSelected || isHovered\r\n ? theme.dom.accentColor\r\n : theme.isDark\r\n ? '#8E8E93'\r\n : '#AEAEB2';\r\n ctx.beginPath();\r\n const arrowX = x + width - 12;\r\n const arrowY = y + height / 2;\r\n ctx.moveTo(arrowX - 3.5, arrowY - 2);\r\n ctx.lineTo(arrowX + 3.5, arrowY - 2);\r\n ctx.lineTo(arrowX, arrowY + 2.5);\r\n ctx.closePath();\r\n ctx.fill();\r\n\r\n ctx.restore();\r\n}\r\n","import React, { useEffect, useState, useRef, useMemo } from 'react';\r\nimport { IGridThemeTokens } from '../theme/IGridTheme';\r\nimport { ColumnDef, ToolbarButtonDisplayMode } from '../types/grid';\r\nimport { IGridLocale } from '../i18n/IGridLocale';\r\nimport { MaterialIcon } from './MaterialIcon';\r\nimport { FilterEngine } from '../core/FilterEngine';\r\nimport { normalizeMultiValue } from '../columns/types/MultiSelectColumn/MultiSelectPainter';\r\n\r\n\r\nexport interface FormulaBarProps {\r\n activeCoords: { row: number; col: number };\r\n selectionSpan?: { rows: number; cols: number };\r\n column?: ColumnDef;\r\n currentValue: any;\r\n isEditable?: boolean;\r\n canDuplicate?: boolean;\r\n buttonDisplayMode?: ToolbarButtonDisplayMode;\r\n onCommitValue?: (newValue: any) => void;\r\n onDuplicateDown?: () => void;\r\n onDuplicateRight?: () => void;\r\n onDuplicateRow?: () => void;\r\n onOpenSparklineModal?: () => void;\r\n theme: IGridThemeTokens;\r\n locale?: IGridLocale;\r\n}\r\n\r\nfunction getExcelColName(colIndex: number): string {\r\n let n = colIndex;\r\n let name = '';\r\n while (n >= 0) {\r\n name = String.fromCharCode((n % 26) + 65) + name;\r\n n = Math.floor(n / 26) - 1;\r\n }\r\n return name;\r\n}\r\n\r\n/**\r\n * Interactive Single Select / Dropdown editor for the Excel-like Formula Bar\r\n */\r\nconst FormulaBarSelect: React.FC<{\r\n column: ColumnDef;\r\n currentValue: any;\r\n isEditable: boolean;\r\n onCommitValue: (newVal: any) => void;\r\n theme: IGridThemeTokens;\r\n locale?: IGridLocale;\r\n}> = ({ column, currentValue, isEditable, onCommitValue, theme, locale }) => {\r\n const options = column.options || [];\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [search, setSearch] = useState('');\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const isTR = locale?.code?.startsWith('tr');\r\n\r\n const selectedOpt = options.find(\r\n (o) => o.value === currentValue || String(o.value) === String(currentValue)\r\n );\r\n const displayLabel = selectedOpt ? selectedOpt.label : currentValue != null ? String(currentValue) : '';\r\n\r\n const filteredOptions = useMemo(() => {\r\n if (!search.trim()) return options;\r\n const q = search.toLowerCase();\r\n return options.filter(\r\n (o) => o.label.toLowerCase().includes(q) || String(o.value).toLowerCase().includes(q)\r\n );\r\n }, [options, search]);\r\n\r\n useEffect(() => {\r\n if (!isOpen) return;\r\n const handleOutside = (e: MouseEvent) => {\r\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\r\n setIsOpen(false);\r\n }\r\n };\r\n window.addEventListener('mousedown', handleOutside);\r\n return () => window.removeEventListener('mousedown', handleOutside);\r\n }, [isOpen]);\r\n\r\n return (\r\n <div ref={containerRef} style={{ position: 'relative', flex: 1, minWidth: 200 }}>\r\n <div\r\n onClick={() => {\r\n if (isEditable) setIsOpen(!isOpen);\r\n }}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n height: 26,\r\n padding: '0 8px',\r\n border: `1px solid ${isOpen ? theme.dom.accentColor : theme.canvas.gridLine}`,\r\n borderRadius: 4,\r\n backgroundColor: isEditable\r\n ? theme.canvas.bg\r\n : theme.isDark\r\n ? 'rgba(255,255,255,0.04)'\r\n : 'rgba(0,0,0,0.03)',\r\n color: theme.canvas.cellText,\r\n cursor: isEditable ? 'pointer' : 'default',\r\n fontSize: 12,\r\n boxSizing: 'border-box',\r\n }}\r\n >\r\n <span\r\n style={{\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n fontWeight: 500,\r\n }}\r\n >\r\n {displayLabel || (\r\n <span style={{ color: theme.isDark ? '#8E8E93' : '#AEAEB2' }}>\r\n {isTR ? 'Değer seçin (Dropdown)...' : 'Select value (Dropdown)...'}\r\n </span>\r\n )}\r\n </span>\r\n {isEditable && (\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 4, marginLeft: 6, flexShrink: 0 }}>\r\n {displayLabel && (\r\n <button\r\n type=\"button\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onCommitValue('');\r\n }}\r\n title={isTR ? 'Seçimi Temizle' : 'Clear Selection'}\r\n style={{\r\n border: 'none',\r\n background: 'transparent',\r\n color: '#8E8E93',\r\n cursor: 'pointer',\r\n padding: 0,\r\n display: 'flex',\r\n alignItems: 'center',\r\n }}\r\n >\r\n <MaterialIcon name=\"close\" size={13} color=\"#8E8E93\" />\r\n </button>\r\n )}\r\n <MaterialIcon\r\n name=\"arrow_drop_down\"\r\n size={16}\r\n color={theme.isDark ? '#8E8E93' : '#64748B'}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n\r\n {isOpen && isEditable && (\r\n <div\r\n onMouseDown={(e) => e.stopPropagation()}\r\n style={{\r\n position: 'absolute',\r\n top: 'calc(100% + 4px)',\r\n left: 0,\r\n width: Math.max(260, containerRef.current?.clientWidth || 260),\r\n maxHeight: 280,\r\n padding: 6,\r\n backgroundColor: theme.dom.popoverBg,\r\n color: theme.dom.popoverText,\r\n border: `1px solid ${theme.dom.popoverBorder}`,\r\n borderRadius: 8,\r\n boxShadow: theme.dom.popoverShadow,\r\n backdropFilter: theme.dom.glassBackdrop,\r\n zIndex: 9999,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 4,\r\n }}\r\n >\r\n {options.length > 5 && (\r\n <div style={{ padding: '2px 2px 4px' }}>\r\n <input\r\n autoFocus\r\n type=\"text\"\r\n placeholder={isTR ? 'Seçeneklerde ara...' : 'Search options...'}\r\n value={search}\r\n onChange={(e) => setSearch(e.target.value)}\r\n style={{\r\n width: '100%',\r\n height: 26,\r\n padding: '0 8px',\r\n borderRadius: 4,\r\n border: `1px solid ${theme.dom.inputBorder}`,\r\n backgroundColor: theme.dom.inputBg,\r\n color: theme.dom.inputText,\r\n fontSize: 11,\r\n outline: 'none',\r\n boxSizing: 'border-box',\r\n }}\r\n />\r\n </div>\r\n )}\r\n\r\n <div\r\n style={{\r\n maxHeight: 210,\r\n overflowY: 'auto',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 1,\r\n }}\r\n >\r\n {filteredOptions.length === 0 ? (\r\n <div\r\n style={{\r\n padding: '8px 10px',\r\n fontSize: 11,\r\n color: '#8E8E93',\r\n textAlign: 'center',\r\n }}\r\n >\r\n {isTR ? 'Eşleşen seçenek bulunamadı' : 'No matching options'}\r\n </div>\r\n ) : (\r\n filteredOptions.map((opt) => {\r\n const isSelected =\r\n opt.value === currentValue || String(opt.value) === String(currentValue);\r\n return (\r\n <button\r\n key={String(opt.value)}\r\n type=\"button\"\r\n onClick={() => {\r\n onCommitValue(opt.value);\r\n setIsOpen(false);\r\n setSearch('');\r\n }}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n padding: '5px 8px',\r\n borderRadius: 4,\r\n border: 'none',\r\n backgroundColor: isSelected ? theme.dom.accentColor : 'transparent',\r\n color: isSelected ? '#FFFFFF' : theme.dom.popoverText,\r\n cursor: 'pointer',\r\n fontSize: 11,\r\n textAlign: 'left',\r\n }}\r\n >\r\n <span>{opt.label}</span>\r\n {isSelected && <MaterialIcon name=\"check\" size={13} color=\"#FFFFFF\" />}\r\n </button>\r\n );\r\n })\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\n/**\r\n * Interactive Multiple Choice / MultiSelect editor for the Excel-like Formula Bar\r\n */\r\nconst FormulaBarMultiSelect: React.FC<{\r\n column: ColumnDef;\r\n currentValue: any;\r\n isEditable: boolean;\r\n onCommitValue: (newVal: any) => void;\r\n theme: IGridThemeTokens;\r\n locale?: IGridLocale;\r\n}> = ({ column, currentValue, isEditable, onCommitValue, theme, locale }) => {\r\n const options = column.options || [];\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [search, setSearch] = useState('');\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const isTR = locale?.code?.startsWith('tr');\r\n const separator = (column as any)?.separator || ', ';\r\n\r\n const selectedList = useMemo<string[]>(() => {\r\n return normalizeMultiValue(currentValue);\r\n }, [currentValue]);\r\n\r\n const handleToggleOption = (valStr: string) => {\r\n let next: string[];\r\n if (selectedList.includes(valStr)) {\r\n next = selectedList.filter((v) => v !== valStr);\r\n } else {\r\n next = [...selectedList, valStr];\r\n }\r\n const finalVal = Array.isArray(currentValue) && (column as any)?.saveAsArray ? next : next.join(separator);\r\n onCommitValue(finalVal);\r\n };\r\n\r\n const handleRemoveTag = (e: React.MouseEvent, valStr: string) => {\r\n e.stopPropagation();\r\n const next = selectedList.filter((v) => v !== valStr);\r\n const finalVal = Array.isArray(currentValue) && (column as any)?.saveAsArray ? next : next.join(separator);\r\n onCommitValue(finalVal);\r\n };\r\n\r\n useEffect(() => {\r\n if (!isOpen) return;\r\n const handleOutside = (e: MouseEvent) => {\r\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\r\n setIsOpen(false);\r\n }\r\n };\r\n window.addEventListener('mousedown', handleOutside);\r\n return () => window.removeEventListener('mousedown', handleOutside);\r\n }, [isOpen]);\r\n\r\n const filteredOptions = useMemo(() => {\r\n if (!search.trim()) return options;\r\n const q = search.toLowerCase();\r\n return options.filter(\r\n (o) => o.label.toLowerCase().includes(q) || String(o.value).toLowerCase().includes(q)\r\n );\r\n }, [options, search]);\r\n\r\n return (\r\n <div ref={containerRef} style={{ position: 'relative', flex: 1, minWidth: 200 }}>\r\n <div\r\n onClick={() => {\r\n if (isEditable) setIsOpen(!isOpen);\r\n }}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 4,\r\n minHeight: 26,\r\n padding: '2px 6px',\r\n border: `1px solid ${isOpen ? theme.dom.accentColor : theme.canvas.gridLine}`,\r\n borderRadius: 4,\r\n backgroundColor: isEditable\r\n ? theme.canvas.bg\r\n : theme.isDark\r\n ? 'rgba(255,255,255,0.04)'\r\n : 'rgba(0,0,0,0.03)',\r\n color: theme.canvas.cellText,\r\n cursor: isEditable ? 'pointer' : 'default',\r\n flexWrap: 'wrap',\r\n boxSizing: 'border-box',\r\n }}\r\n >\r\n {selectedList.length === 0 ? (\r\n <span\r\n style={{\r\n fontSize: 11,\r\n color: theme.isDark ? '#8E8E93' : '#AEAEB2',\r\n padding: '0 4px',\r\n }}\r\n >\r\n {isTR ? 'Çoklu seçim yapın (Multiple Choice)...' : 'Select multiple choices...'}\r\n </span>\r\n ) : (\r\n selectedList.map((item) => (\r\n <span\r\n key={item}\r\n style={{\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 3,\r\n padding: '1px 6px',\r\n borderRadius: 3,\r\n backgroundColor: theme.isDark\r\n ? 'rgba(59, 130, 246, 0.22)'\r\n : 'rgba(59, 130, 246, 0.12)',\r\n color: theme.isDark ? '#60a5fa' : '#2563eb',\r\n fontSize: 10,\r\n fontWeight: 600,\r\n }}\r\n >\r\n <span>{item}</span>\r\n {isEditable && (\r\n <button\r\n type=\"button\"\r\n onClick={(e) => handleRemoveTag(e, item)}\r\n style={{\r\n border: 'none',\r\n background: 'transparent',\r\n cursor: 'pointer',\r\n padding: 0,\r\n color: 'inherit',\r\n display: 'flex',\r\n }}\r\n >\r\n <MaterialIcon name=\"close\" size={10} />\r\n </button>\r\n )}\r\n </span>\r\n ))\r\n )}\r\n\r\n {isEditable && (\r\n <span style={{ marginLeft: 'auto', display: 'flex', alignItems: 'center' }}>\r\n <MaterialIcon\r\n name=\"arrow_drop_down\"\r\n size={16}\r\n color={theme.isDark ? '#8E8E93' : '#64748B'}\r\n />\r\n </span>\r\n )}\r\n </div>\r\n\r\n {isOpen && isEditable && (\r\n <div\r\n onMouseDown={(e) => e.stopPropagation()}\r\n style={{\r\n position: 'absolute',\r\n top: 'calc(100% + 4px)',\r\n left: 0,\r\n width: Math.max(260, containerRef.current?.clientWidth || 260),\r\n maxHeight: 280,\r\n padding: 6,\r\n backgroundColor: theme.dom.popoverBg,\r\n color: theme.dom.popoverText,\r\n border: `1px solid ${theme.dom.popoverBorder}`,\r\n borderRadius: 8,\r\n boxShadow: theme.dom.popoverShadow,\r\n backdropFilter: theme.dom.glassBackdrop,\r\n zIndex: 9999,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 4,\r\n }}\r\n >\r\n {options.length > 5 && (\r\n <input\r\n autoFocus\r\n type=\"text\"\r\n placeholder={isTR ? 'Seçeneklerde ara...' : 'Search options...'}\r\n value={search}\r\n onChange={(e) => setSearch(e.target.value)}\r\n style={{\r\n width: '100%',\r\n height: 26,\r\n padding: '0 8px',\r\n borderRadius: 4,\r\n border: `1px solid ${theme.dom.inputBorder}`,\r\n backgroundColor: theme.dom.inputBg,\r\n color: theme.dom.inputText,\r\n fontSize: 11,\r\n outline: 'none',\r\n boxSizing: 'border-box',\r\n }}\r\n />\r\n )}\r\n\r\n <div\r\n style={{\r\n maxHeight: 220,\r\n overflowY: 'auto',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 2,\r\n }}\r\n >\r\n {filteredOptions.length === 0 ? (\r\n <div\r\n style={{\r\n padding: '8px 10px',\r\n fontSize: 11,\r\n color: '#8E8E93',\r\n textAlign: 'center',\r\n }}\r\n >\r\n {isTR ? 'Seçenek bulunamadı' : 'No options found'}\r\n </div>\r\n ) : (\r\n filteredOptions.map((opt) => {\r\n const valStr = String(opt.value);\r\n const isChecked = selectedList.includes(valStr);\r\n return (\r\n <label\r\n key={valStr}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 6,\r\n padding: '4px 6px',\r\n borderRadius: 4,\r\n cursor: 'pointer',\r\n fontSize: 11,\r\n backgroundColor: isChecked\r\n ? theme.isDark\r\n ? 'rgba(59, 130, 246, 0.15)'\r\n : 'rgba(59, 130, 246, 0.08)'\r\n : 'transparent',\r\n }}\r\n >\r\n <input\r\n type=\"checkbox\"\r\n checked={isChecked}\r\n onChange={() => handleToggleOption(valStr)}\r\n />\r\n <span>{opt.label}</span>\r\n </label>\r\n );\r\n })\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\n/**\r\n * Interactive Date / DateTime editor for the Excel-like Formula Bar\r\n */\r\nconst FormulaBarDate: React.FC<{\r\n column: ColumnDef;\r\n currentValue: any;\r\n isEditable: boolean;\r\n onCommitValue: (newVal: any) => void;\r\n theme: IGridThemeTokens;\r\n locale?: IGridLocale;\r\n}> = ({ column, currentValue, isEditable, onCommitValue, theme, locale }) => {\r\n const isDateTime = column.type === 'datetime';\r\n const isTR = locale?.code?.startsWith('tr');\r\n\r\n const isoVal = useMemo(() => {\r\n if (!currentValue) return '';\r\n const str = String(currentValue).trim();\r\n if (isDateTime) {\r\n if (str.includes('T')) return str.slice(0, 16);\r\n if (str.includes(' ')) return str.replace(' ', 'T').slice(0, 16);\r\n }\r\n if (/^\\d{4}-\\d{2}-\\d{2}/.test(str)) {\r\n return str.slice(0, 10);\r\n }\r\n const dmy = str.match(/^(\\d{1,2})[./-](\\d{1,2})[./-](\\d{4})/);\r\n if (dmy) {\r\n const day = dmy[1].padStart(2, '0');\r\n const mon = dmy[2].padStart(2, '0');\r\n const yr = dmy[3];\r\n return `${yr}-${mon}-${day}`;\r\n }\r\n return '';\r\n }, [currentValue, isDateTime]);\r\n\r\n const [dateDraft, setDateDraft] = useState(isoVal);\r\n\r\n useEffect(() => {\r\n setDateDraft(isoVal);\r\n }, [isoVal]);\r\n\r\n const handleDateChange = (newVal: string) => {\r\n setDateDraft(newVal);\r\n onCommitValue(newVal);\r\n };\r\n\r\n const handleSetToday = () => {\r\n const today = new Date().toISOString().slice(0, 10);\r\n const finalVal = isDateTime ? `${today}T12:00` : today;\r\n handleDateChange(finalVal);\r\n };\r\n\r\n return (\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 6, flex: 1 }}>\r\n <input\r\n type={isDateTime ? 'datetime-local' : 'date'}\r\n value={dateDraft}\r\n disabled={!isEditable}\r\n onChange={(e) => handleDateChange(e.target.value)}\r\n style={{\r\n flex: 1,\r\n maxWidth: isDateTime ? 220 : 160,\r\n height: 26,\r\n padding: '0 8px',\r\n border: `1px solid ${theme.canvas.gridLine}`,\r\n borderRadius: 4,\r\n backgroundColor: isEditable\r\n ? theme.canvas.bg\r\n : theme.isDark\r\n ? 'rgba(255,255,255,0.04)'\r\n : 'rgba(0,0,0,0.03)',\r\n color: theme.canvas.cellText,\r\n fontFamily: 'monospace',\r\n fontSize: 12,\r\n outline: 'none',\r\n boxSizing: 'border-box',\r\n cursor: isEditable ? 'pointer' : 'default',\r\n }}\r\n />\r\n {isEditable && (\r\n <>\r\n <button\r\n type=\"button\"\r\n onClick={handleSetToday}\r\n style={{\r\n padding: '3px 8px',\r\n borderRadius: 4,\r\n border: `1px solid ${theme.canvas.gridLine}`,\r\n backgroundColor: theme.canvas.bg,\r\n color: theme.dom.accentColor,\r\n fontSize: 10,\r\n fontWeight: 700,\r\n cursor: 'pointer',\r\n whiteSpace: 'nowrap',\r\n }}\r\n >\r\n {isTR ? 'Bugün' : 'Today'}\r\n </button>\r\n {dateDraft && (\r\n <button\r\n type=\"button\"\r\n onClick={() => handleDateChange('')}\r\n title={isTR ? 'Tarihi Temizle' : 'Clear Date'}\r\n style={{\r\n border: 'none',\r\n background: 'transparent',\r\n color: '#8E8E93',\r\n cursor: 'pointer',\r\n display: 'flex',\r\n alignItems: 'center',\r\n padding: 2,\r\n }}\r\n >\r\n <MaterialIcon name=\"close\" size={13} color=\"#8E8E93\" />\r\n </button>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\n/**\r\n * Interactive Boolean editor for the Excel-like Formula Bar\r\n */\r\nconst FormulaBarBoolean: React.FC<{\r\n currentValue: any;\r\n isEditable: boolean;\r\n onCommitValue: (newVal: boolean) => void;\r\n theme: IGridThemeTokens;\r\n locale?: IGridLocale;\r\n}> = ({ currentValue, isEditable, onCommitValue, theme, locale }) => {\r\n const isTR = locale?.code?.startsWith('tr');\r\n const isChecked = ['true', '1', 1, true, 'yes', 'evet'].includes(currentValue);\r\n\r\n return (\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, height: 26 }}>\r\n <button\r\n type=\"button\"\r\n disabled={!isEditable}\r\n onClick={() => onCommitValue(!isChecked)}\r\n style={{\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 5,\r\n padding: '2px 10px',\r\n borderRadius: 4,\r\n border: `1px solid ${isChecked ? '#22C55E' : theme.canvas.gridLine}`,\r\n backgroundColor: isChecked\r\n ? 'rgba(34, 197, 94, 0.15)'\r\n : theme.isDark\r\n ? 'rgba(255,255,255,0.05)'\r\n : 'rgba(0,0,0,0.04)',\r\n color: isChecked ? '#22C55E' : theme.canvas.cellText,\r\n fontSize: 11,\r\n fontWeight: 700,\r\n cursor: isEditable ? 'pointer' : 'default',\r\n }}\r\n >\r\n <MaterialIcon\r\n name={isChecked ? 'check_box' : 'check_box_outline_blank'}\r\n size={14}\r\n color={isChecked ? '#22C55E' : undefined}\r\n />\r\n <span>\r\n {isChecked\r\n ? isTR\r\n ? 'EVET (True)'\r\n : 'TRUE'\r\n : isTR\r\n ? 'HAYIR (False)'\r\n : 'FALSE'}\r\n </span>\r\n </button>\r\n </div>\r\n );\r\n};\r\n\r\nexport const FormulaBar: React.FC<FormulaBarProps> = ({\r\n activeCoords,\r\n selectionSpan,\r\n column,\r\n currentValue,\r\n isEditable = true,\r\n canDuplicate = true,\r\n buttonDisplayMode = 'icon-text',\r\n onCommitValue,\r\n onDuplicateDown,\r\n onDuplicateRight,\r\n onDuplicateRow,\r\n onOpenSparklineModal,\r\n theme,\r\n locale,\r\n}) => {\r\n const isTR = locale?.code?.startsWith('tr');\r\n const isSparkline = column?.type === 'sparkline';\r\n\r\n const isMultiSelectCol =\r\n column?.type === 'multiselect' ||\r\n Boolean((column as any)?.multiple) ||\r\n (Boolean((column as any)?.separator) && column?.type !== 'date' && column?.type !== 'datetime');\r\n\r\n const isSelectCol =\r\n !isMultiSelectCol &&\r\n (column?.type === 'select' ||\r\n column?.type === 'dropdown' ||\r\n column?.type === 'lookup' ||\r\n (column?.options && column.options.length > 0));\r\n\r\n const isDateCol = column?.type === 'date' || column?.type === 'datetime';\r\n const isBoolCol = column?.type === 'boolean';\r\n\r\n const displayVal = isSparkline\r\n ? isTR\r\n ? '[7 Günlük Trend Grafiği — Detaylı grafik görünümü için hücreye tıklayın]'\r\n : '[7-Day Trend Chart — Click cell to open detailed chart dialog]'\r\n : currentValue != null && currentValue !== ''\r\n ? isDateCol\r\n ? FilterEngine.formatLocalizedDate(currentValue, locale?.code, column?.type === 'datetime')\r\n : Array.isArray(currentValue)\r\n ? currentValue.join(', ')\r\n : typeof currentValue === 'object'\r\n ? JSON.stringify(currentValue)\r\n : String(currentValue)\r\n : '';\r\n\r\n const [draft, setDraft] = useState<string>(displayVal);\r\n const [isFocused, setIsFocused] = useState<boolean>(false);\r\n const [isMobile, setIsMobile] = useState<boolean>(() =>\r\n typeof window !== 'undefined' ? window.innerWidth < 680 : false\r\n );\r\n\r\n useEffect(() => {\r\n const onResize = () => setIsMobile(window.innerWidth < 680);\r\n window.addEventListener('resize', onResize);\r\n return () => window.removeEventListener('resize', onResize);\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (!isFocused) {\r\n setDraft(displayVal);\r\n }\r\n }, [displayVal, isFocused, activeCoords.row, activeCoords.col]);\r\n\r\n const excelRef = `${getExcelColName(activeCoords.col)}${activeCoords.row + 1}`;\r\n const hasMultiSpan = selectionSpan && (selectionSpan.rows > 1 || selectionSpan.cols > 1);\r\n\r\n const commitDraft = () => {\r\n if (!isEditable || !onCommitValue || !column) return;\r\n if (draft === displayVal) return;\r\n\r\n let parsed: any = draft;\r\n if (\r\n column.type === 'number' ||\r\n column.type === 'currency' ||\r\n column.type === 'percent' ||\r\n column.type === 'progress' ||\r\n column.type === 'rating'\r\n ) {\r\n const n = parseFloat(draft.replace(/[%$,]/g, (m) => (m === ',' ? '.' : '')));\r\n parsed = isNaN(n) ? 0 : n;\r\n } else if (column.type === 'boolean') {\r\n parsed = ['true', '1', 'yes', 'evet', 'doğru'].includes(draft.trim().toLowerCase());\r\n } else if (column.type === 'date' || column.type === 'datetime') {\r\n const pd = FilterEngine.parseDateParts(draft);\r\n if (pd) {\r\n parsed =\r\n column.type === 'datetime'\r\n ? `${pd.isoDate} ${String(pd.hasTime ? pd.hour : 9).padStart(2, '0')}:${String(\r\n pd.hasTime ? pd.minute : 0\r\n ).padStart(2, '0')}`\r\n : pd.isoDate;\r\n }\r\n } else if (column.type === 'multiselect') {\r\n parsed = draft\r\n .split(/[,;|]/)\r\n .map((s) => s.trim())\r\n .filter(Boolean);\r\n } else if (column.type === 'object') {\r\n try {\r\n const obj = JSON.parse(draft);\r\n if (obj && typeof obj === 'object' && !Array.isArray(obj)) {\r\n parsed = obj;\r\n }\r\n } catch {\r\n const out: Record<string, any> = {};\r\n for (const pair of draft.split(/[,;|]/)) {\r\n const idx = pair.indexOf(':');\r\n if (idx > 0) {\r\n const k = pair.slice(0, idx).trim();\r\n const v = pair.slice(idx + 1).trim();\r\n if (k) out[k] = v;\r\n }\r\n }\r\n if (Object.keys(out).length > 0) parsed = out;\r\n }\r\n }\r\n onCommitValue(parsed);\r\n };\r\n\r\n const effectiveBtnMode: ToolbarButtonDisplayMode = isMobile ? 'icon' : buttonDisplayMode;\r\n\r\n const renderBtnContent = (iconName: string, label: string, iconColor?: string) => (\r\n <>\r\n {(effectiveBtnMode === 'icon' || effectiveBtnMode === 'icon-text') && (\r\n <MaterialIcon name={iconName} size={13} color={iconColor} />\r\n )}\r\n {(effectiveBtnMode === 'icon-text' || effectiveBtnMode === 'text') && <span>{label}</span>}\r\n </>\r\n );\r\n\r\n return (\r\n <div\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n padding: isMobile ? '4px 8px' : '4px 12px',\r\n backgroundColor: theme.canvas.rowNumberBg,\r\n borderBottom: `1px solid ${theme.canvas.gridLine}`,\r\n gap: isMobile ? 5 : 8,\r\n fontFamily: theme.fontFamily,\r\n fontSize: 12,\r\n userSelect: 'none',\r\n overflowX: 'auto',\r\n }}\r\n >\r\n {/* Coordinate Box (Excel Name Box) */}\r\n <div\r\n style={{\r\n padding: isMobile ? '2px 6px' : '2px 8px',\r\n backgroundColor: theme.canvas.bg,\r\n color: theme.dom.accentColor,\r\n border: `1px solid ${theme.canvas.gridLine}`,\r\n borderRadius: 4,\r\n fontFamily: 'monospace',\r\n fontWeight: 700,\r\n minWidth: isMobile ? 42 : 84,\r\n textAlign: 'center',\r\n fontSize: 11,\r\n flexShrink: 0,\r\n }}\r\n >\r\n {hasMultiSpan\r\n ? `${selectionSpan.rows}×${selectionSpan.cols}`\r\n : isMobile\r\n ? excelRef\r\n : `${excelRef} (R${activeCoords.row + 1}:C${activeCoords.col + 1})`}\r\n </div>\r\n\r\n {/* Column Type & Permission Badges */}\r\n {column && (\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 4, flexShrink: 0 }}>\r\n <span\r\n style={{\r\n padding: '2px 5px',\r\n backgroundColor: theme.dom.badgeBg,\r\n color: theme.dom.badgeText,\r\n borderRadius: 4,\r\n fontSize: 10,\r\n fontFamily: 'monospace',\r\n fontWeight: 600,\r\n textTransform: 'uppercase',\r\n }}\r\n >\r\n {column.type}\r\n </span>\r\n <span\r\n style={{\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 3,\r\n padding: '2px 5px',\r\n backgroundColor: isEditable\r\n ? 'rgba(48, 209, 88, 0.14)'\r\n : 'rgba(255, 159, 10, 0.16)',\r\n color: isEditable ? '#30D158' : '#FF9F0A',\r\n borderRadius: 4,\r\n fontSize: 10,\r\n fontFamily: 'monospace',\r\n fontWeight: 700,\r\n }}\r\n >\r\n <MaterialIcon\r\n name={isEditable ? 'edit' : 'lock'}\r\n size={11}\r\n color={isEditable ? '#30D158' : '#FF9F0A'}\r\n />\r\n {!isMobile && <span>{isEditable ? 'WRITE' : 'READONLY'}</span>}\r\n </span>\r\n </div>\r\n )}\r\n\r\n {/* fx Symbol */}\r\n {!isMobile && (\r\n <MaterialIcon\r\n name=\"functions\"\r\n size={15}\r\n color={theme.isDark ? '#8E8E93' : '#AEAEB2'}\r\n title=\"Formula / Value Bar\"\r\n />\r\n )}\r\n\r\n {/* Interactive Value / Formula Input Area Adapted to Column Type */}\r\n {!column ? (\r\n <input\r\n type=\"text\"\r\n readOnly\r\n value=\"\"\r\n placeholder={isTR ? 'Hücre seçilmedi' : 'No cell selected'}\r\n style={{\r\n flex: 1,\r\n height: 26,\r\n padding: '0 8px',\r\n border: `1px solid ${theme.canvas.gridLine}`,\r\n borderRadius: 4,\r\n backgroundColor: theme.canvas.bg,\r\n color: theme.canvas.cellText,\r\n fontSize: 12,\r\n outline: 'none',\r\n }}\r\n />\r\n ) : isMultiSelectCol ? (\r\n <FormulaBarMultiSelect\r\n column={column}\r\n currentValue={currentValue}\r\n isEditable={isEditable}\r\n onCommitValue={onCommitValue || (() => {})}\r\n theme={theme}\r\n locale={locale}\r\n />\r\n ) : isSelectCol ? (\r\n <FormulaBarSelect\r\n column={column}\r\n currentValue={currentValue}\r\n isEditable={isEditable}\r\n onCommitValue={onCommitValue || (() => {})}\r\n theme={theme}\r\n locale={locale}\r\n />\r\n ) : isDateCol ? (\r\n <FormulaBarDate\r\n column={column}\r\n currentValue={currentValue}\r\n isEditable={isEditable}\r\n onCommitValue={onCommitValue || (() => {})}\r\n theme={theme}\r\n locale={locale}\r\n />\r\n ) : isBoolCol ? (\r\n <FormulaBarBoolean\r\n currentValue={currentValue}\r\n isEditable={isEditable}\r\n onCommitValue={onCommitValue || (() => {})}\r\n theme={theme}\r\n locale={locale}\r\n />\r\n ) : (\r\n <input\r\n type=\"text\"\r\n value={draft}\r\n readOnly={!isEditable || isSparkline || column?.type === 'action'}\r\n onFocus={() => setIsFocused(true)}\r\n onBlur={() => {\r\n setIsFocused(false);\r\n commitDraft();\r\n }}\r\n onChange={(e) => setDraft(e.target.value)}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter') {\r\n (e.target as HTMLInputElement).blur();\r\n } else if (e.key === 'Escape') {\r\n setDraft(displayVal);\r\n (e.target as HTMLInputElement).blur();\r\n }\r\n }}\r\n placeholder={\r\n isEditable\r\n ? isTR\r\n ? 'Hücre değerini düzenle...'\r\n : 'Edit cell value...'\r\n : isTR\r\n ? 'Salt okunur hücre'\r\n : 'Readonly cell'\r\n }\r\n style={{\r\n flex: 1,\r\n height: 26,\r\n padding: '0 8px',\r\n border: `1px solid ${\r\n isFocused ? theme.dom.accentColor : theme.canvas.gridLine\r\n }`,\r\n borderRadius: 4,\r\n backgroundColor: isEditable\r\n ? theme.canvas.bg\r\n : theme.isDark\r\n ? 'rgba(255,255,255,0.04)'\r\n : 'rgba(0,0,0,0.03)',\r\n color: theme.canvas.cellText,\r\n fontFamily: theme.fontFamily,\r\n fontSize: 12,\r\n outline: 'none',\r\n boxSizing: 'border-box',\r\n }}\r\n />\r\n )}\r\n\r\n {/* Excel Duplicate Down Button */}\r\n {canDuplicate && onDuplicateDown && (\r\n <button\r\n type=\"button\"\r\n onClick={onDuplicateDown}\r\n disabled={!isEditable}\r\n title={\r\n isTR\r\n ? 'Mevcut hücre değerini bir alt satıra kopyala (Ctrl+D)'\r\n : 'Duplicate current cell value down (Ctrl+D)'\r\n }\r\n style={{\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 4,\r\n padding: isMobile ? '3px 6px' : '3px 8px',\r\n borderRadius: 4,\r\n border: `1px solid ${theme.canvas.gridLine}`,\r\n backgroundColor: theme.canvas.bg,\r\n color: isEditable ? theme.canvas.cellText : theme.dom.toolbarText,\r\n opacity: isEditable ? 1 : 0.45,\r\n cursor: isEditable ? 'pointer' : 'not-allowed',\r\n fontSize: 11,\r\n fontWeight: 500,\r\n whiteSpace: 'nowrap',\r\n flexShrink: 0,\r\n }}\r\n >\r\n {renderBtnContent('arrow_downward', isTR ? 'Aşağı Çoğalt' : 'Fill Down')}\r\n </button>\r\n )}\r\n\r\n {/* Excel Duplicate Right Button */}\r\n {canDuplicate && onDuplicateRight && (\r\n <button\r\n type=\"button\"\r\n onClick={onDuplicateRight}\r\n disabled={!isEditable}\r\n title={\r\n isTR\r\n ? 'Mevcut hücre değerini bir sağ sütuna kopyala (Alt+R)'\r\n : 'Duplicate current cell value right (Alt+R)'\r\n }\r\n style={{\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 4,\r\n padding: isMobile ? '3px 6px' : '3px 8px',\r\n borderRadius: 4,\r\n border: `1px solid ${theme.canvas.gridLine}`,\r\n backgroundColor: theme.canvas.bg,\r\n color: isEditable ? theme.canvas.cellText : theme.dom.toolbarText,\r\n opacity: isEditable ? 1 : 0.45,\r\n cursor: isEditable ? 'pointer' : 'not-allowed',\r\n fontSize: 11,\r\n fontWeight: 500,\r\n whiteSpace: 'nowrap',\r\n flexShrink: 0,\r\n }}\r\n >\r\n {renderBtnContent('arrow_forward', isTR ? 'Sağa Çoğalt' : 'Fill Right')}\r\n </button>\r\n )}\r\n\r\n {/* Clone Active Row Button */}\r\n {canDuplicate && onDuplicateRow && (\r\n <button\r\n type=\"button\"\r\n onClick={onDuplicateRow}\r\n disabled={!isEditable}\r\n title={\r\n isTR\r\n ? 'Seçili satırın tam kopyasını oluştur (Ctrl+Shift+D)'\r\n : 'Clone selected row (Ctrl+Shift+D)'\r\n }\r\n style={{\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 4,\r\n padding: isMobile ? '3px 6px' : '3px 8px',\r\n borderRadius: 4,\r\n border: `1px solid ${theme.canvas.gridLine}`,\r\n backgroundColor: theme.canvas.bg,\r\n color: isEditable ? theme.canvas.cellText : theme.dom.toolbarText,\r\n opacity: isEditable ? 1 : 0.45,\r\n cursor: isEditable ? 'pointer' : 'not-allowed',\r\n fontSize: 11,\r\n fontWeight: 500,\r\n whiteSpace: 'nowrap',\r\n flexShrink: 0,\r\n }}\r\n >\r\n {renderBtnContent('content_copy', isTR ? 'Satırı Klonla' : 'Clone Row')}\r\n </button>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import React, { useState, useRef, useEffect, useMemo } from 'react';\r\nimport { IGridThemeTokens } from '../theme/IGridTheme';\r\nimport { ColumnDef, GridSummaryConfig, SelectionStatMetric } from '../types/grid';\r\nimport { SummaryType } from '../types/group';\r\nimport { IGridLocale } from '../i18n/IGridLocale';\r\nimport { MaterialIcon } from './MaterialIcon';\r\nimport { GeometryEngine } from '../core/GeometryEngine';\r\n\r\nexport interface SelectionSummaryStats {\r\n count: number;\r\n numericCount: number;\r\n sum: number;\r\n avg: number;\r\n min: number;\r\n max: number;\r\n}\r\n\r\nexport interface SummaryFooterProps {\r\n summaries?: Record<string, number>;\r\n summaryTypes?: Record<string, SummaryType>;\r\n onChangeSummaryType?: (columnId: string, summaryType: SummaryType) => void;\r\n summaryConfig?: GridSummaryConfig;\r\n onUpdateSummaryConfig?: (patch: Partial<GridSummaryConfig>) => void;\r\n selectionStats?: SelectionSummaryStats | null;\r\n columns: ColumnDef[];\r\n theme: IGridThemeTokens;\r\n locale: IGridLocale;\r\n totalRowCount: number;\r\n unfilteredRowCount?: number;\r\n geometry?: GeometryEngine;\r\n scrollContainerRef?: React.RefObject<HTMLDivElement | null>;\r\n}\r\n\r\nconst SUMMARY_TYPE_ICONS: Record<SummaryType, string> = {\r\n sum: 'functions',\r\n avg: 'analytics',\r\n min: 'south',\r\n max: 'north',\r\n count: 'tag',\r\n none: 'block',\r\n};\r\n\r\ninterface SummaryCellProps {\r\n col: ColumnDef;\r\n val?: number;\r\n summaryType?: SummaryType;\r\n allowConfiguration: boolean;\r\n onChangeSummaryType?: (columnId: string, summaryType: SummaryType) => void;\r\n theme: IGridThemeTokens;\r\n locale: IGridLocale;\r\n formatSummaryVal: (colId: string, val: number, sType: SummaryType) => string;\r\n isTR: boolean;\r\n}\r\n\r\nconst SummaryCell: React.FC<SummaryCellProps> = ({\r\n col,\r\n val,\r\n summaryType,\r\n allowConfiguration,\r\n onChangeSummaryType,\r\n theme,\r\n locale,\r\n formatSummaryVal,\r\n isTR,\r\n}) => {\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [isHovered, setIsHovered] = useState(false);\r\n const cellRef = useRef<HTMLDivElement>(null);\r\n const [popoverPos, setPopoverPos] = useState<{ top: number; left: number } | null>(null);\r\n\r\n // Safely normalize summaryType into a valid lowercase string\r\n const normalizedType = useMemo<SummaryType | undefined>(() => {\r\n const raw = summaryType as any;\r\n if (!raw) return undefined;\r\n if (typeof raw === 'string') return raw.toLowerCase() as SummaryType;\r\n if (typeof raw === 'object' && raw !== null) {\r\n const candidate = raw.summaryType || raw.type || raw.name;\r\n if (typeof candidate === 'string') return candidate.toLowerCase() as SummaryType;\r\n }\r\n return undefined;\r\n }, [summaryType]);\r\n\r\n const effectiveSummaryType =\r\n normalizedType ||\r\n (typeof col.summaryType === 'string' ? (col.summaryType.toLowerCase() as SummaryType) : undefined);\r\n\r\n const summaryTypeStr = effectiveSummaryType || '';\r\n const hasSummary = val !== undefined && summaryTypeStr !== '' && summaryTypeStr !== 'none';\r\n const isNumeric =\r\n col.type === 'number' ||\r\n col.type === 'currency' ||\r\n col.type === 'percent' ||\r\n col.type === 'integer';\r\n const isSpecialCol =\r\n col.id === '__selection__' ||\r\n col.id === '__actions__' ||\r\n col.type === 'action' ||\r\n col.type === 'sparkline';\r\n\r\n const handleToggleDropdown = (e: React.MouseEvent) => {\r\n if (!allowConfiguration || isSpecialCol || !onChangeSummaryType) return;\r\n e.stopPropagation();\r\n if (!isOpen && cellRef.current) {\r\n const rect = cellRef.current.getBoundingClientRect();\r\n const popWidth = 165;\r\n const popHeight = 220;\r\n let top = rect.top - popHeight - 4;\r\n if (top < 10) top = rect.bottom + 4;\r\n let left = Math.min(rect.left, window.innerWidth - popWidth - 10);\r\n if (left < 10) left = 10;\r\n setPopoverPos({ top, left });\r\n setIsOpen(true);\r\n } else {\r\n setIsOpen(false);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n if (!isOpen) return;\r\n const handleOutsideClick = (e: MouseEvent) => {\r\n if (cellRef.current && !cellRef.current.contains(e.target as Node)) {\r\n setIsOpen(false);\r\n }\r\n };\r\n window.addEventListener('mousedown', handleOutsideClick);\r\n return () => window.removeEventListener('mousedown', handleOutsideClick);\r\n }, [isOpen]);\r\n\r\n if (isSpecialCol) {\r\n return <div ref={cellRef} style={{ width: '100%', height: '100%' }} />;\r\n }\r\n\r\n const formattedVal = hasSummary\r\n ? formatSummaryVal(col.id, val!, (effectiveSummaryType as SummaryType) || 'sum')\r\n : '';\r\n\r\n return (\r\n <div\r\n ref={cellRef}\r\n onMouseEnter={() => setIsHovered(true)}\r\n onMouseLeave={() => setIsHovered(false)}\r\n onClick={handleToggleDropdown}\r\n style={{\r\n width: '100%',\r\n height: '100%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: isNumeric ? 'flex-end' : 'flex-start',\r\n padding: '0 6px',\r\n gap: 4,\r\n cursor: allowConfiguration ? 'pointer' : 'default',\r\n backgroundColor: isOpen\r\n ? theme.isDark\r\n ? 'rgba(59, 130, 246, 0.2)'\r\n : 'rgba(59, 130, 246, 0.1)'\r\n : isHovered\r\n ? theme.isDark\r\n ? 'rgba(255, 255, 255, 0.05)'\r\n : 'rgba(0, 0, 0, 0.04)'\r\n : 'transparent',\r\n boxSizing: 'border-box',\r\n overflow: 'hidden',\r\n userSelect: 'none',\r\n }}\r\n title={\r\n hasSummary\r\n ? `${col.title || col.id}: ${summaryTypeStr.toUpperCase()} = ${formattedVal} (${\r\n isTR ? 'Değiştirmek için tıkla' : 'Click to change'\r\n })`\r\n : allowConfiguration\r\n ? `${col.title || col.id} (${isTR ? 'Özet eklemek için tıkla' : 'Click to add summary'})`\r\n : undefined\r\n }\r\n >\r\n {hasSummary ? (\r\n <>\r\n {/* Summary Type Pill: e.g. SUM, AVG */}\r\n <span\r\n style={{\r\n fontSize: 9,\r\n fontWeight: 800,\r\n padding: '1px 4px',\r\n borderRadius: 3,\r\n backgroundColor: theme.isDark\r\n ? 'rgba(59, 130, 246, 0.25)'\r\n : 'rgba(59, 130, 246, 0.12)',\r\n color: theme.isDark ? '#60a5fa' : '#2563eb',\r\n fontFamily: 'monospace',\r\n textTransform: 'uppercase',\r\n lineHeight: '12px',\r\n flexShrink: 0,\r\n }}\r\n >\r\n {summaryTypeStr.toUpperCase()}\r\n </span>\r\n\r\n {/* Formatted Number */}\r\n <span\r\n style={{\r\n fontSize: 11,\r\n fontWeight: 700,\r\n fontFamily: 'monospace',\r\n color: theme.canvas.cellText,\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n }}\r\n >\r\n {formattedVal}\r\n </span>\r\n\r\n {/* Subtle dropdown indicator */}\r\n {allowConfiguration && (\r\n <span\r\n style={{\r\n fontSize: 8,\r\n color: theme.isDark ? '#94a3b8' : '#94a3b8',\r\n marginLeft: 1,\r\n flexShrink: 0,\r\n }}\r\n >\r\n ▾\r\n </span>\r\n )}\r\n </>\r\n ) : (\r\n isHovered &&\r\n allowConfiguration && (\r\n <span\r\n style={{\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 2,\r\n fontSize: 9,\r\n fontWeight: 700,\r\n color: theme.dom.accentColor,\r\n padding: '1px 4px',\r\n borderRadius: 3,\r\n backgroundColor: theme.isDark\r\n ? 'rgba(59, 130, 246, 0.15)'\r\n : 'rgba(59, 130, 246, 0.08)',\r\n }}\r\n >\r\n + {isTR ? 'Özet' : 'Add'}\r\n </span>\r\n )\r\n )}\r\n\r\n {/* Floating Dropdown Menu (Fixed Coordinates to Prevent Overflow Clipping) */}\r\n {isOpen && popoverPos && allowConfiguration && onChangeSummaryType && (\r\n <div\r\n onMouseDown={(e) => e.stopPropagation()}\r\n onClick={(e) => e.stopPropagation()}\r\n style={{\r\n position: 'fixed',\r\n top: popoverPos.top,\r\n left: popoverPos.left,\r\n width: 165,\r\n padding: 6,\r\n backgroundColor: theme.dom.popoverBg,\r\n color: theme.dom.popoverText,\r\n border: `1px solid ${theme.dom.popoverBorder}`,\r\n borderRadius: 8,\r\n boxShadow: theme.dom.popoverShadow,\r\n backdropFilter: theme.dom.glassBackdrop,\r\n zIndex: 9999,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 2,\r\n }}\r\n >\r\n <div\r\n style={{\r\n fontSize: 10,\r\n fontWeight: 700,\r\n color: '#8E8E93',\r\n padding: '2px 6px 4px',\r\n borderBottom: `1px solid ${theme.dom.popoverBorder}`,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n }}\r\n >\r\n <span style={{ overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\r\n {col.title || col.id}\r\n </span>\r\n <MaterialIcon name=\"functions\" size={12} color=\"#8E8E93\" />\r\n </div>\r\n\r\n {(['sum', 'avg', 'min', 'max', 'count', 'none'] as SummaryType[]).map((t) => {\r\n const isSelected = (effectiveSummaryType || 'none') === t;\r\n return (\r\n <button\r\n key={t}\r\n type=\"button\"\r\n onClick={() => {\r\n onChangeSummaryType(col.id, t);\r\n setIsOpen(false);\r\n }}\r\n style={{\r\n padding: '5px 8px',\r\n textAlign: 'left',\r\n fontSize: 11,\r\n fontWeight: isSelected ? 700 : 500,\r\n border: 'none',\r\n borderRadius: 4,\r\n backgroundColor: isSelected ? theme.dom.accentColor : 'transparent',\r\n color: isSelected ? '#FFFFFF' : theme.dom.popoverText,\r\n cursor: 'pointer',\r\n textTransform: 'uppercase',\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 6,\r\n }}\r\n >\r\n <MaterialIcon\r\n name={t === 'none' ? 'delete' : SUMMARY_TYPE_ICONS[t]}\r\n size={13}\r\n color={isSelected ? '#FFFFFF' : theme.dom.accentColor}\r\n />\r\n <span>\r\n {t === 'none'\r\n ? isTR\r\n ? 'Kaldır (None)'\r\n : 'Remove (None)'\r\n : t === 'sum'\r\n ? isTR\r\n ? 'Toplam (SUM)'\r\n : 'Sum (SUM)'\r\n : t === 'avg'\r\n ? isTR\r\n ? 'Ortalama (AVG)'\r\n : 'Average (AVG)'\r\n : t === 'min'\r\n ? isTR\r\n ? 'Minimum (MIN)'\r\n : 'Min (MIN)'\r\n : t === 'max'\r\n ? isTR\r\n ? 'Maksimum (MAX)'\r\n : 'Max (MAX)'\r\n : isTR\r\n ? 'Adet (COUNT)'\r\n : 'Count (COUNT)'}\r\n </span>\r\n </button>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport const SummaryFooter: React.FC<SummaryFooterProps> = ({\r\n summaries,\r\n summaryTypes = {},\r\n onChangeSummaryType,\r\n summaryConfig,\r\n onUpdateSummaryConfig,\r\n selectionStats,\r\n columns,\r\n theme,\r\n locale,\r\n totalRowCount,\r\n unfilteredRowCount,\r\n geometry,\r\n scrollContainerRef,\r\n}) => {\r\n const [showAddSummary, setShowAddSummary] = useState<boolean>(false);\r\n const summaryScrollRef = useRef<HTMLDivElement>(null);\r\n const isTR = locale.code.startsWith('tr');\r\n\r\n const isVisible = summaryConfig?.visible !== false;\r\n if (!isVisible) return null;\r\n\r\n const showTotalCount = summaryConfig?.showTotalCount !== false;\r\n const showSelectionStats = summaryConfig?.showSelectionStats !== false;\r\n const showColumnSummaries = summaryConfig?.showColumnSummaries !== false;\r\n const allowConfiguration = summaryConfig?.allowConfiguration !== false;\r\n const activeMetrics: SelectionStatMetric[] = summaryConfig?.selectionMetrics || [\r\n 'count',\r\n 'sum',\r\n 'avg',\r\n 'min',\r\n 'max',\r\n ];\r\n\r\n const hasMetric = (m: SelectionStatMetric) => activeMetrics.includes(m);\r\n\r\n const formatSummaryVal = (colId: string, val: number, sType: SummaryType): string => {\r\n const itemOverride = summaryConfig?.items?.find((i) => i.columnId === colId);\r\n if (sType === 'count') {\r\n const base = val.toLocaleString(locale.code);\r\n return `${itemOverride?.prefix || ''}${base}${itemOverride?.suffix || ''}`;\r\n }\r\n const col = columns.find((c) => c.id === colId);\r\n const digits = itemOverride?.decimalDigits ?? (col?.type === 'currency' ? 2 : 2);\r\n const formattedNum = val.toLocaleString(locale.code, {\r\n minimumFractionDigits: col?.type === 'currency' ? Math.min(2, digits) : 0,\r\n maximumFractionDigits: digits,\r\n });\r\n if (itemOverride?.prefix || itemOverride?.suffix) {\r\n return `${itemOverride.prefix || ''}${formattedNum}${itemOverride.suffix || ''}`;\r\n }\r\n if (col?.type === 'currency') {\r\n return `${col.currencySymbol || '$'}${formattedNum}`;\r\n }\r\n if (col?.type === 'progress' || col?.type === 'percent') {\r\n return `${formattedNum}%`;\r\n }\r\n return formattedNum;\r\n };\r\n\r\n // 1. Column Partitioning: Frozen vs Scrollable\r\n const rowNumberWidth = geometry?.rowNumberWidth ?? 54;\r\n\r\n const frozenColumns = useMemo(() => {\r\n if (geometry?.frozenColumns && geometry.frozenColumns.length > 0) {\r\n return geometry.frozenColumns;\r\n }\r\n return columns.filter((c) => c.pinned === 'left' || c.pinned === true);\r\n }, [geometry, columns]);\r\n\r\n const scrollableColumns = useMemo(() => {\r\n if (geometry?.scrollableColumns && geometry.scrollableColumns.length > 0) {\r\n return geometry.scrollableColumns;\r\n }\r\n return columns.filter(\r\n (c) => c.pinned !== 'left' && c.pinned !== true && c.pinned !== 'right'\r\n );\r\n }, [geometry, columns]);\r\n\r\n const rightPinnedColumns = useMemo(() => {\r\n return columns.filter((c) => c.pinned === 'right');\r\n }, [columns]);\r\n\r\n const totalScrollableWidth = useMemo(() => {\r\n return scrollableColumns.reduce((sum, c) => sum + (c.width || 100), 0);\r\n }, [scrollableColumns]);\r\n\r\n // 2. Synchronize Horizontal Scroll with Main Grid (Bi-directional, 60fps native)\r\n useEffect(() => {\r\n const sc = scrollContainerRef?.current;\r\n const summary = summaryScrollRef.current;\r\n if (!sc || !summary) return;\r\n\r\n let isSyncing = false;\r\n\r\n const onGridScroll = () => {\r\n if (isSyncing) return;\r\n isSyncing = true;\r\n summary.scrollLeft = sc.scrollLeft;\r\n requestAnimationFrame(() => {\r\n isSyncing = false;\r\n });\r\n };\r\n\r\n const onSummaryWheel = (e: WheelEvent) => {\r\n if (Math.abs(e.deltaX) > 0) {\r\n sc.scrollLeft += e.deltaX;\r\n }\r\n };\r\n\r\n sc.addEventListener('scroll', onGridScroll, { passive: true });\r\n summary.addEventListener('wheel', onSummaryWheel, { passive: true });\r\n\r\n summary.scrollLeft = sc.scrollLeft;\r\n\r\n return () => {\r\n sc.removeEventListener('scroll', onGridScroll);\r\n summary.removeEventListener('wheel', onSummaryWheel);\r\n };\r\n }, [scrollContainerRef]);\r\n\r\n // Determine if selection stats pill should be visible\r\n const hasSelectionStats = Boolean(\r\n showSelectionStats && selectionStats && selectionStats.count > 1\r\n );\r\n\r\n return (\r\n <div\r\n className=\"sheetgl-summary-container\"\r\n style={{\r\n display: 'flex',\r\n flexDirection: 'column',\r\n width: '100%',\r\n backgroundColor: theme.canvas.rowNumberBg,\r\n borderTop: `2px solid ${theme.canvas.gridLine}`,\r\n color: theme.dom.toolbarText,\r\n fontFamily: theme.fontFamily,\r\n fontSize: 11,\r\n userSelect: 'none',\r\n position: 'relative',\r\n zIndex: 130,\r\n }}\r\n >\r\n {/* Optional Range Selection Stats Bar (floating or slim bar) */}\r\n {hasSelectionStats && selectionStats && (\r\n <div\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 10,\r\n padding: '4px 12px',\r\n backgroundColor: theme.isDark\r\n ? 'rgba(10, 132, 255, 0.15)'\r\n : 'rgba(0, 122, 255, 0.08)',\r\n borderBottom: `1px solid ${\r\n theme.isDark ? 'rgba(10,132,255,0.35)' : 'rgba(0,122,255,0.25)'\r\n }`,\r\n color: theme.dom.accentColor,\r\n fontWeight: 600,\r\n fontSize: 11,\r\n }}\r\n >\r\n {hasMetric('count') && (\r\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 4 }}>\r\n <MaterialIcon name=\"select_all\" size={13} color={theme.dom.accentColor} />\r\n {isTR ? 'Seçim' : 'Selected'} ({selectionStats.count})\r\n </span>\r\n )}\r\n {selectionStats.numericCount > 0 && (\r\n <>\r\n {hasMetric('sum') && (\r\n <span>\r\n SUM:{' '}\r\n <strong>\r\n {selectionStats.sum.toLocaleString(locale.code, {\r\n maximumFractionDigits: 2,\r\n })}\r\n </strong>\r\n </span>\r\n )}\r\n {hasMetric('avg') && (\r\n <span>\r\n AVG:{' '}\r\n <strong>\r\n {selectionStats.avg.toLocaleString(locale.code, {\r\n maximumFractionDigits: 2,\r\n })}\r\n </strong>\r\n </span>\r\n )}\r\n {hasMetric('min') && (\r\n <span>\r\n MIN:{' '}\r\n <strong>\r\n {selectionStats.min.toLocaleString(locale.code, {\r\n maximumFractionDigits: 2,\r\n })}\r\n </strong>\r\n </span>\r\n )}\r\n {hasMetric('max') && (\r\n <span>\r\n MAX:{' '}\r\n <strong>\r\n {selectionStats.max.toLocaleString(locale.code, {\r\n maximumFractionDigits: 2,\r\n })}\r\n </strong>\r\n </span>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Pinned Column-Aligned Summary Row */}\r\n {showColumnSummaries && (\r\n <div\r\n className=\"sheetgl-summary-row\"\r\n style={{\r\n height: 32,\r\n display: 'flex',\r\n alignItems: 'stretch',\r\n width: '100%',\r\n backgroundColor: theme.canvas.rowNumberBg,\r\n position: 'relative',\r\n overflow: 'hidden',\r\n fontSize: 11,\r\n fontFamily: theme.fontFamily,\r\n boxSizing: 'border-box',\r\n }}\r\n >\r\n {/* 1. Left Frozen Area */}\r\n <div\r\n style={{\r\n display: 'flex',\r\n alignItems: 'stretch',\r\n flexShrink: 0,\r\n zIndex: 10,\r\n backgroundColor: theme.canvas.rowNumberBg,\r\n borderRight:\r\n frozenColumns.length > 0 || rowNumberWidth > 0\r\n ? `1px solid ${theme.canvas.gridLine}`\r\n : 'none',\r\n boxShadow:\r\n frozenColumns.length > 0\r\n ? theme.isDark\r\n ? '2px 0 6px rgba(0,0,0,0.3)'\r\n : '2px 0 6px rgba(0,0,0,0.06)'\r\n : 'none',\r\n }}\r\n >\r\n {/* Row Number Column Cell */}\r\n {rowNumberWidth > 0 && (\r\n <div\r\n style={{\r\n width: rowNumberWidth,\r\n minWidth: rowNumberWidth,\r\n maxWidth: rowNumberWidth,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n borderRight: `1px solid ${theme.canvas.gridLine}`,\r\n boxSizing: 'border-box',\r\n backgroundColor: theme.canvas.rowNumberBg,\r\n }}\r\n >\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowAddSummary(true)}\r\n title={isTR ? 'Tüm Sütun Özet Ayarları' : 'Summary Settings'}\r\n style={{\r\n background: 'transparent',\r\n border: 'none',\r\n cursor: allowConfiguration ? 'pointer' : 'default',\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: 2,\r\n color: theme.dom.accentColor,\r\n fontWeight: 800,\r\n fontSize: 12,\r\n padding: '2px 4px',\r\n borderRadius: 4,\r\n }}\r\n >\r\n <span>Σ</span>\r\n </button>\r\n </div>\r\n )}\r\n\r\n {/* Frozen Columns */}\r\n {frozenColumns.map((col) => (\r\n <div\r\n key={col.id}\r\n style={{\r\n width: col.width,\r\n minWidth: col.width,\r\n maxWidth: col.width,\r\n borderRight: `1px solid ${theme.canvas.gridLine}`,\r\n boxSizing: 'border-box',\r\n backgroundColor: theme.canvas.rowNumberBg,\r\n display: 'flex',\r\n alignItems: 'stretch',\r\n }}\r\n >\r\n <SummaryCell\r\n col={col}\r\n val={summaries?.[col.id]}\r\n summaryType={\r\n (summaryTypes && summaryTypes[col.id]) ||\r\n col.summaryType ||\r\n summaryConfig?.items?.find((i) => i.columnId === col.id)?.summaryType\r\n }\r\n allowConfiguration={allowConfiguration}\r\n onChangeSummaryType={onChangeSummaryType}\r\n theme={theme}\r\n locale={locale}\r\n formatSummaryVal={formatSummaryVal}\r\n isTR={isTR}\r\n />\r\n </div>\r\n ))}\r\n </div>\r\n\r\n {/* 2. Middle Scrollable Area */}\r\n <div\r\n ref={summaryScrollRef}\r\n style={{\r\n flex: 1,\r\n display: 'flex',\r\n alignItems: 'stretch',\r\n overflowX: 'hidden',\r\n position: 'relative',\r\n backgroundColor: theme.canvas.bg,\r\n }}\r\n >\r\n <div\r\n style={{\r\n display: 'flex',\r\n alignItems: 'stretch',\r\n minWidth: totalScrollableWidth,\r\n flexShrink: 0,\r\n }}\r\n >\r\n {scrollableColumns.map((col) => (\r\n <div\r\n key={col.id}\r\n style={{\r\n width: col.width,\r\n minWidth: col.width,\r\n maxWidth: col.width,\r\n borderRight: `1px solid ${theme.canvas.gridLine}`,\r\n boxSizing: 'border-box',\r\n display: 'flex',\r\n alignItems: 'stretch',\r\n }}\r\n >\r\n <SummaryCell\r\n col={col}\r\n val={summaries?.[col.id]}\r\n summaryType={\r\n (summaryTypes && summaryTypes[col.id]) ||\r\n col.summaryType ||\r\n summaryConfig?.items?.find((i) => i.columnId === col.id)?.summaryType\r\n }\r\n allowConfiguration={allowConfiguration}\r\n onChangeSummaryType={onChangeSummaryType}\r\n theme={theme}\r\n locale={locale}\r\n formatSummaryVal={formatSummaryVal}\r\n isTR={isTR}\r\n />\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* 3. Right Pinned Area (if any) */}\r\n {rightPinnedColumns.length > 0 && (\r\n <div\r\n style={{\r\n display: 'flex',\r\n alignItems: 'stretch',\r\n flexShrink: 0,\r\n zIndex: 10,\r\n backgroundColor: theme.canvas.rowNumberBg,\r\n borderLeft: `1px solid ${theme.canvas.gridLine}`,\r\n }}\r\n >\r\n {rightPinnedColumns.map((col) => (\r\n <div\r\n key={col.id}\r\n style={{\r\n width: col.width,\r\n minWidth: col.width,\r\n maxWidth: col.width,\r\n borderRight: `1px solid ${theme.canvas.gridLine}`,\r\n boxSizing: 'border-box',\r\n display: 'flex',\r\n alignItems: 'stretch',\r\n }}\r\n >\r\n <SummaryCell\r\n col={col}\r\n val={summaries?.[col.id]}\r\n summaryType={\r\n (summaryTypes && summaryTypes[col.id]) ||\r\n col.summaryType ||\r\n summaryConfig?.items?.find((i) => i.columnId === col.id)?.summaryType\r\n }\r\n allowConfiguration={allowConfiguration}\r\n onChangeSummaryType={onChangeSummaryType}\r\n theme={theme}\r\n locale={locale}\r\n formatSummaryVal={formatSummaryVal}\r\n isTR={isTR}\r\n />\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* 4. Right Spacer matching vertical scrollbar width buffer */}\r\n <div\r\n style={{\r\n width: 14,\r\n minWidth: 14,\r\n maxWidth: 14,\r\n flexShrink: 0,\r\n backgroundColor: theme.canvas.rowNumberBg,\r\n }}\r\n />\r\n </div>\r\n )}\r\n\r\n {/* Global Configuration Modal Dialog */}\r\n {showAddSummary && allowConfiguration && onChangeSummaryType && (\r\n <div\r\n onMouseDown={(e) => e.stopPropagation()}\r\n style={{\r\n position: 'fixed',\r\n bottom: 44,\r\n right: 12,\r\n left: 12,\r\n width: 'auto',\r\n maxWidth: 320,\r\n marginLeft: 'auto',\r\n maxHeight: '75vh',\r\n overflowY: 'auto',\r\n padding: 12,\r\n backgroundColor: theme.dom.popoverBg,\r\n color: theme.dom.popoverText,\r\n border: `1px solid ${theme.dom.popoverBorder}`,\r\n borderRadius: 10,\r\n boxShadow: theme.dom.popoverShadow,\r\n backdropFilter: theme.dom.glassBackdrop,\r\n zIndex: 9999,\r\n }}\r\n >\r\n <div\r\n style={{\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n marginBottom: 8,\r\n paddingBottom: 6,\r\n borderBottom: `1px solid ${theme.dom.popoverBorder}`,\r\n }}\r\n >\r\n <span\r\n style={{\r\n fontWeight: 700,\r\n fontSize: 11,\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 5,\r\n }}\r\n >\r\n <MaterialIcon name=\"functions\" size={15} color={theme.dom.accentColor} />\r\n {isTR ? 'Özet Satırı (Summary Row) Ayarları' : 'Summary Row Configuration'}\r\n </span>\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowAddSummary(false)}\r\n style={{\r\n border: 'none',\r\n background: 'transparent',\r\n color: '#8E8E93',\r\n cursor: 'pointer',\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n }}\r\n >\r\n <MaterialIcon name=\"close\" size={15} color=\"#8E8E93\" />\r\n </button>\r\n </div>\r\n\r\n {/* Summary Row Display Toggles */}\r\n {onUpdateSummaryConfig && (\r\n <div\r\n style={{\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 5,\r\n marginBottom: 10,\r\n paddingBottom: 8,\r\n borderBottom: `1px solid ${theme.dom.popoverBorder}`,\r\n }}\r\n >\r\n <label\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n fontSize: 11,\r\n cursor: 'pointer',\r\n }}\r\n >\r\n <span>{isTR ? 'Canlı Hücre Seçim Özeti' : 'Show Range Selection Stats'}</span>\r\n <input\r\n type=\"checkbox\"\r\n checked={showSelectionStats}\r\n onChange={(e) =>\r\n onUpdateSummaryConfig({ showSelectionStats: e.target.checked })\r\n }\r\n />\r\n </label>\r\n <label\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n fontSize: 11,\r\n cursor: 'pointer',\r\n }}\r\n >\r\n <span>{isTR ? 'Sütun Özet Satırı' : 'Show Column Summary Row'}</span>\r\n <input\r\n type=\"checkbox\"\r\n checked={showColumnSummaries}\r\n onChange={(e) =>\r\n onUpdateSummaryConfig({ showColumnSummaries: e.target.checked })\r\n }\r\n />\r\n </label>\r\n </div>\r\n )}\r\n\r\n <div\r\n style={{\r\n fontSize: 10,\r\n fontWeight: 700,\r\n color: '#8E8E93',\r\n marginBottom: 4,\r\n textTransform: 'uppercase',\r\n }}\r\n >\r\n {isTR ? 'Sütun Bazlı Hesaplama Türü' : 'Column Aggregation Type'}\r\n </div>\r\n\r\n {columns\r\n .filter((c) => c.type !== 'sparkline' && c.type !== 'action' && c.id !== '__selection__')\r\n .map((col) => {\r\n const rawCur = (summaryTypes && summaryTypes[col.id]) || col.summaryType;\r\n const cur = typeof rawCur === 'string'\r\n ? rawCur.toLowerCase()\r\n : (typeof rawCur === 'object' && rawCur !== null\r\n ? String((rawCur as any).summaryType || (rawCur as any).type || 'none').toLowerCase()\r\n : 'none');\r\n return (\r\n <div\r\n key={col.id}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n padding: '4px 0',\r\n fontSize: 11,\r\n }}\r\n >\r\n <span\r\n style={{\r\n fontWeight: cur !== 'none' ? 600 : 400,\r\n maxWidth: 160,\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n }}\r\n >\r\n {col.title || col.id}\r\n </span>\r\n <select\r\n value={cur}\r\n onChange={(e) =>\r\n onChangeSummaryType(col.id, e.target.value as SummaryType)\r\n }\r\n style={{\r\n padding: '2px 6px',\r\n borderRadius: 4,\r\n border: `1px solid ${theme.dom.inputBorder}`,\r\n backgroundColor: theme.dom.inputBg,\r\n color: theme.dom.inputText,\r\n fontSize: 10,\r\n fontWeight: 600,\r\n }}\r\n >\r\n <option value=\"none\">NONE</option>\r\n <option value=\"sum\">SUM</option>\r\n <option value=\"avg\">AVG</option>\r\n <option value=\"min\">MIN</option>\r\n <option value=\"max\">MAX</option>\r\n <option value=\"count\">COUNT</option>\r\n </select>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import { GroupDescriptor, SummaryType, VirtualRow } from '../types/group';\r\nimport { FilterEngine } from './FilterEngine';\r\n\r\nexport class GroupingEngine {\r\n private static formatGroupKeyVal(raw: any): string {\r\n if (raw === null || raw === undefined || raw === '') return '(Blank)';\r\n if (Array.isArray(raw)) {\r\n return raw.length > 0 ? raw.join(', ') : '(Blank)';\r\n }\r\n if (typeof raw === 'object') {\r\n const entries = Object.entries(raw);\r\n return entries.length > 0\r\n ? entries.map(([k, v]) => `${k}: ${String(v)}`).join(' • ')\r\n : '(Blank)';\r\n }\r\n return String(raw);\r\n }\r\n\r\n public static collectGroupKeys(\r\n data: any[],\r\n groups: GroupDescriptor[],\r\n maxAutoExpandLevel: number = 0\r\n ): Set<string> {\r\n const keys = new Set<string>();\r\n if (!groups || groups.length === 0) return keys;\r\n\r\n const visit = (items: any[], level: number, parentKey: string) => {\r\n if (level >= groups.length || level > maxAutoExpandLevel) return;\r\n const field = groups[level].selector;\r\n const buckets = new Map<any, any[]>();\r\n for (let i = 0; i < items.length; i++) {\r\n const val = this.formatGroupKeyVal(items[i][field]);\r\n let b = buckets.get(val);\r\n if (!b) {\r\n b = [];\r\n buckets.set(val, b);\r\n }\r\n b.push(items[i]);\r\n }\r\n for (const [val, bucketItems] of buckets.entries()) {\r\n const groupKey = parentKey ? `${parentKey}|${field}:${val}` : `${field}:${val}`;\r\n keys.add(groupKey);\r\n visit(bucketItems, level + 1, groupKey);\r\n }\r\n };\r\n\r\n visit(data, 0, '');\r\n return keys;\r\n }\r\n\r\n public static projectVirtualRows(\r\n data: any[],\r\n groups: GroupDescriptor[],\r\n expandedKeys: Set<string>,\r\n summaryConfig?: Record<string, SummaryType>\r\n ): VirtualRow[] {\r\n if (!groups || groups.length === 0) {\r\n return data.map((item, rawIndex) => ({\r\n type: 'data',\r\n rawIndex,\r\n data: item,\r\n }));\r\n }\r\n\r\n const result: VirtualRow[] = [];\r\n this.groupRecursive(data, groups, 0, '', expandedKeys, result, summaryConfig);\r\n return result;\r\n }\r\n\r\n private static groupRecursive(\r\n items: any[],\r\n groups: GroupDescriptor[],\r\n level: number,\r\n parentKey: string,\r\n expandedKeys: Set<string>,\r\n out: VirtualRow[],\r\n summaryConfig?: Record<string, SummaryType>\r\n ): void {\r\n if (level >= groups.length) {\r\n for (const item of items) {\r\n out.push({\r\n type: 'data',\r\n rawIndex: item.__rawIndex ?? 0,\r\n data: item,\r\n });\r\n }\r\n return;\r\n }\r\n\r\n const currentGroup = groups[level];\r\n const field = currentGroup.selector;\r\n\r\n const buckets = new Map<any, any[]>();\r\n for (let i = 0; i < items.length; i++) {\r\n const item = items[i];\r\n const val = this.formatGroupKeyVal(item[field]);\r\n let bucket = buckets.get(val);\r\n if (!bucket) {\r\n bucket = [];\r\n buckets.set(val, bucket);\r\n }\r\n bucket.push(item);\r\n }\r\n\r\n for (const [val, bucketItems] of buckets.entries()) {\r\n const groupKey = parentKey ? `${parentKey}|${field}:${val}` : `${field}:${val}`;\r\n const isExpanded = expandedKeys.has(groupKey);\r\n\r\n const summaries: Record<string, number> = {};\r\n const summaryTypes: Record<string, SummaryType> = {};\r\n\r\n if (summaryConfig) {\r\n for (const [sf, sType] of Object.entries(summaryConfig)) {\r\n if (!sType || sType === 'none') continue;\r\n if (sType === 'count') {\r\n summaries[sf] = bucketItems.length;\r\n summaryTypes[sf] = 'count';\r\n continue;\r\n }\r\n let sum = 0;\r\n let count = 0;\r\n let min = Infinity;\r\n let max = -Infinity;\r\n for (const bi of bucketItems) {\r\n const raw = bi[sf];\r\n const num = typeof raw === 'number' ? raw : FilterEngine.parseNumeric(raw);\r\n if (raw !== null && raw !== undefined && raw !== '' && !isNaN(num)) {\r\n sum += num;\r\n count++;\r\n if (num < min) min = num;\r\n if (num > max) max = num;\r\n }\r\n }\r\n if (count > 0) {\r\n summaryTypes[sf] = sType;\r\n if (sType === 'sum') summaries[sf] = sum;\r\n else if (sType === 'avg') summaries[sf] = sum / count;\r\n else if (sType === 'min') summaries[sf] = min;\r\n else if (sType === 'max') summaries[sf] = max;\r\n }\r\n }\r\n }\r\n\r\n out.push({\r\n type: 'group',\r\n level,\r\n groupKey,\r\n field,\r\n value: val,\r\n rowCount: bucketItems.length,\r\n isExpanded,\r\n summaries,\r\n summaryTypes,\r\n });\r\n\r\n if (isExpanded) {\r\n this.groupRecursive(\r\n bucketItems,\r\n groups,\r\n level + 1,\r\n groupKey,\r\n expandedKeys,\r\n out,\r\n summaryConfig\r\n );\r\n }\r\n }\r\n }\r\n}\r\n","import { IDataStore, BatchChanges } from '../types/store';\r\nimport { FilterDescriptor, SortDescriptor, DistinctItem } from '../types/filter';\r\nimport { GroupDescriptor, SummaryType, VirtualRow } from '../types/group';\r\nimport { FilterEngine, BLANK_FILTER_TOKEN } from '../core/FilterEngine';\r\nimport { SortEngine } from '../core/SortEngine';\r\nimport { GroupingEngine } from '../core/GroupingEngine';\r\n\r\nexport interface LocalDataStoreOptions {\r\n data: any[];\r\n keyField?: string;\r\n batchMode?: boolean;\r\n initialSummaries?: Record<string, SummaryType>;\r\n}\r\n\r\nexport class LocalDataStore implements IDataStore {\r\n private rawData: any[] = [];\r\n private keyField: string;\r\n\r\n // Filtered & sorted data\r\n private processedData: any[] = [];\r\n // Projected virtual rows (data + group headers)\r\n private virtualRows: VirtualRow[] = [];\r\n\r\n private currentFilter: FilterDescriptor | null = null;\r\n private currentSearch: string = '';\r\n private currentSort: SortDescriptor[] = [];\r\n private currentGroups: GroupDescriptor[] = [];\r\n private expandedGroupKeys = new Set<string>();\r\n\r\n // Configurable summary types per column\r\n private summaryTypes: Record<string, SummaryType> = {};\r\n\r\n // Batch / Dirty tracking\r\n private batchMode: boolean = true;\r\n private originalRowSnapshots = new Map<any, Record<string, any>>();\r\n private dirtyCells = new Map<any, Set<string>>();\r\n private insertedKeys = new Set<any>();\r\n private deletedRows = new Map<any, { data: Record<string, any>; index: number }>();\r\n private distinctCache = new Map<string, DistinctItem[]>();\r\n\r\n private listeners = new Map<string, Set<(...args: any[]) => void>>();\r\n\r\n constructor(options: LocalDataStoreOptions) {\r\n this.keyField = options.keyField || 'id';\r\n this.batchMode = options.batchMode ?? true;\r\n if (options.initialSummaries) {\r\n this.summaryTypes = { ...options.initialSummaries };\r\n }\r\n this.setData(options.data || []);\r\n }\r\n\r\n public isRemote(): boolean {\r\n return false;\r\n }\r\n\r\n public setData(data: any[]): void {\r\n this.rawData = data.map((item, idx) => ({\r\n ...item,\r\n __rawIndex: idx,\r\n [this.keyField]: item[this.keyField] ?? idx + 1,\r\n }));\r\n\r\n // Auto-initialize default summary types if empty\r\n if (Object.keys(this.summaryTypes).length === 0 && this.rawData.length > 0) {\r\n const sample = this.rawData[0];\r\n for (const key of Object.keys(sample)) {\r\n if (key === this.keyField || key.startsWith('__')) continue;\r\n if (typeof sample[key] === 'number') {\r\n if (key === 'rating' || key === 'progress') {\r\n this.summaryTypes[key] = 'avg';\r\n } else {\r\n this.summaryTypes[key] = 'sum';\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.originalRowSnapshots.clear();\r\n this.dirtyCells.clear();\r\n this.insertedKeys.clear();\r\n this.deletedRows.clear();\r\n this.distinctCache.clear();\r\n\r\n this.recompute();\r\n }\r\n\r\n public getRowCount(): number {\r\n return this.virtualRows.length;\r\n }\r\n\r\n public getFilteredRowCount(): number {\r\n return this.processedData.length;\r\n }\r\n\r\n public getTotalDatasetRowCount(): number {\r\n return this.rawData.length;\r\n }\r\n\r\n public getViewRow(rowIndex: number): VirtualRow | undefined {\r\n return this.virtualRows[rowIndex];\r\n }\r\n\r\n public getRawData(): any[] {\r\n return this.rawData;\r\n }\r\n\r\n public getRawRowByKey(rowKey: any): Record<string, any> | undefined {\r\n return this.rawData.find((r) => r[this.keyField] === rowKey);\r\n }\r\n\r\n public async ensureRange(_startRow: number, _endRow: number): Promise<void> {\r\n return Promise.resolve();\r\n }\r\n\r\n public async setFilter(filter: FilterDescriptor | null): Promise<void> {\r\n this.currentFilter = filter;\r\n this.recompute();\r\n return Promise.resolve();\r\n }\r\n\r\n public async setSearch(keyword: string): Promise<void> {\r\n this.currentSearch = keyword;\r\n this.recompute();\r\n return Promise.resolve();\r\n }\r\n\r\n public async setSorting(sortRules: SortDescriptor[]): Promise<void> {\r\n this.currentSort = sortRules;\r\n this.recompute();\r\n return Promise.resolve();\r\n }\r\n\r\n public async setGrouping(groupDescriptors: GroupDescriptor[]): Promise<void> {\r\n this.currentGroups = groupDescriptors;\r\n // Start groups collapsed so all group headers & summaries are immediately visible\r\n this.expandedGroupKeys.clear();\r\n for (const g of groupDescriptors) {\r\n if (g.isExpanded) {\r\n const keys = GroupingEngine.collectGroupKeys(this.processedData, groupDescriptors, 0);\r\n keys.forEach((k) => this.expandedGroupKeys.add(k));\r\n break;\r\n }\r\n }\r\n this.recompute();\r\n return Promise.resolve();\r\n }\r\n\r\n public async toggleGroup(groupKey: string): Promise<void> {\r\n if (this.expandedGroupKeys.has(groupKey)) {\r\n this.expandedGroupKeys.delete(groupKey);\r\n } else {\r\n this.expandedGroupKeys.add(groupKey);\r\n }\r\n this.recomputeVirtualRowsOnly();\r\n return Promise.resolve();\r\n }\r\n\r\n public expandAllGroups(): void {\r\n const allKeys = GroupingEngine.collectGroupKeys(\r\n this.processedData,\r\n this.currentGroups,\r\n this.currentGroups.length\r\n );\r\n this.expandedGroupKeys = allKeys;\r\n this.recomputeVirtualRowsOnly();\r\n }\r\n\r\n public collapseAllGroups(): void {\r\n this.expandedGroupKeys.clear();\r\n this.recomputeVirtualRowsOnly();\r\n }\r\n\r\n private isValueEqual(a: any, b: any): boolean {\r\n if (a === b) return true;\r\n if (Array.isArray(a) && Array.isArray(b)) {\r\n if (a.length !== b.length) return false;\r\n for (let i = 0; i < a.length; i++) {\r\n if (a[i] !== b[i]) return false;\r\n }\r\n return true;\r\n }\r\n if (\r\n a &&\r\n b &&\r\n typeof a === 'object' &&\r\n typeof b === 'object' &&\r\n !Array.isArray(a) &&\r\n !Array.isArray(b)\r\n ) {\r\n return JSON.stringify(a) === JSON.stringify(b);\r\n }\r\n return false;\r\n }\r\n\r\n private ensureSnapshot(rowKey: any, item: Record<string, any>): void {\r\n if (!this.originalRowSnapshots.has(rowKey) && !this.insertedKeys.has(rowKey)) {\r\n const snap: Record<string, any> = {};\r\n for (const [k, v] of Object.entries(item)) {\r\n snap[k] = Array.isArray(v)\r\n ? [...v]\r\n : v && typeof v === 'object'\r\n ? { ...v }\r\n : v;\r\n }\r\n this.originalRowSnapshots.set(rowKey, snap);\r\n }\r\n }\r\n\r\n private markCellDirty(rowKey: any, columnId: string, newValue: any): void {\r\n if (this.insertedKeys.has(rowKey)) return;\r\n const orig = this.originalRowSnapshots.get(rowKey);\r\n let set = this.dirtyCells.get(rowKey);\r\n if (!set) {\r\n set = new Set<string>();\r\n this.dirtyCells.set(rowKey, set);\r\n }\r\n if (orig && this.isValueEqual(orig[columnId], newValue)) {\r\n set.delete(columnId);\r\n if (set.size === 0) {\r\n this.dirtyCells.delete(rowKey);\r\n }\r\n } else {\r\n set.add(columnId);\r\n }\r\n }\r\n\r\n public async setCell(rowKey: any, columnId: string, value: any): Promise<void> {\r\n const item = this.rawData.find((r) => r[this.keyField] === rowKey);\r\n if (item) {\r\n if (this.isValueEqual(item[columnId], value)) return Promise.resolve();\r\n if (this.batchMode) {\r\n this.ensureSnapshot(rowKey, item);\r\n this.markCellDirty(rowKey, columnId, value);\r\n }\r\n item[columnId] = Array.isArray(value) ? [...value] : value;\r\n delete item.__searchIndex;\r\n this.distinctCache.clear();\r\n this.recompute();\r\n }\r\n return Promise.resolve();\r\n }\r\n\r\n public async setCellsBatch(\r\n updates: Array<{ rowKey: any; columnId: string; value: any }>\r\n ): Promise<void> {\r\n if (!updates || updates.length === 0) return Promise.resolve();\r\n const rowMap = new Map<any, Record<string, any>>();\r\n for (const r of this.rawData) {\r\n rowMap.set(r[this.keyField], r);\r\n }\r\n\r\n let changed = false;\r\n for (const u of updates) {\r\n const item = rowMap.get(u.rowKey);\r\n if (item && item[u.columnId] !== u.value) {\r\n if (this.batchMode) {\r\n this.ensureSnapshot(u.rowKey, item);\r\n this.markCellDirty(u.rowKey, u.columnId, u.value);\r\n }\r\n item[u.columnId] = u.value;\r\n delete item.__searchIndex;\r\n changed = true;\r\n }\r\n }\r\n\r\n if (changed) {\r\n this.distinctCache.clear();\r\n this.recompute();\r\n }\r\n return Promise.resolve();\r\n }\r\n\r\n public async updateRowFields(rowKey: any, patch: Record<string, any>): Promise<void> {\r\n const item = this.rawData.find((r) => r[this.keyField] === rowKey);\r\n if (item) {\r\n for (const [colId, val] of Object.entries(patch)) {\r\n if (colId === this.keyField || colId.startsWith('__')) continue;\r\n if (this.batchMode) {\r\n this.ensureSnapshot(rowKey, item);\r\n this.markCellDirty(rowKey, colId, val);\r\n }\r\n item[colId] = val;\r\n }\r\n delete item.__searchIndex;\r\n this.distinctCache.clear();\r\n this.recompute();\r\n }\r\n return Promise.resolve();\r\n }\r\n\r\n private generateNextKey(): any {\r\n let maxId = 0;\r\n for (const r of this.rawData) {\r\n const k = Number(r[this.keyField]);\r\n if (!isNaN(k) && k > maxId) maxId = k;\r\n }\r\n return maxId > 0 ? maxId + 1 : Date.now();\r\n }\r\n\r\n public async insertRow(\r\n rowData: Record<string, any>,\r\n targetViewRowIndex?: number\r\n ): Promise<Record<string, any>> {\r\n const newKey = rowData[this.keyField] ?? this.generateNextKey();\r\n const newRow: Record<string, any> = {\r\n ...rowData,\r\n [this.keyField]: newKey,\r\n __rawIndex: this.rawData.length,\r\n };\r\n\r\n let insertIdx = 0; // Default at top so user immediately sees newly added row\r\n if (targetViewRowIndex !== undefined && targetViewRowIndex >= 0) {\r\n const vRow = this.virtualRows[targetViewRowIndex];\r\n if (vRow && vRow.type === 'data') {\r\n const rawIdx = this.rawData.findIndex(\r\n (r) => r[this.keyField] === vRow.data[this.keyField]\r\n );\r\n if (rawIdx !== -1) {\r\n insertIdx = rawIdx + 1;\r\n }\r\n } else if (targetViewRowIndex >= this.virtualRows.length) {\r\n insertIdx = this.rawData.length;\r\n }\r\n }\r\n\r\n this.rawData.splice(insertIdx, 0, newRow);\r\n // Reindex __rawIndex\r\n for (let i = 0; i < this.rawData.length; i++) {\r\n this.rawData[i].__rawIndex = i;\r\n }\r\n\r\n if (this.batchMode) {\r\n this.insertedKeys.add(newKey);\r\n }\r\n\r\n this.distinctCache.clear();\r\n this.recompute();\r\n return Promise.resolve(newRow);\r\n }\r\n\r\n public async duplicateRow(\r\n rowKey: any,\r\n targetViewRowIndex?: number\r\n ): Promise<Record<string, any> | null> {\r\n const sourceIdx = this.rawData.findIndex((r) => r[this.keyField] === rowKey);\r\n if (sourceIdx === -1) return Promise.resolve(null);\r\n\r\n const source = this.rawData[sourceIdx];\r\n const newKey = this.generateNextKey();\r\n\r\n // Deep clone arrays/objects inside row (like sparkline)\r\n const cloned: Record<string, any> = {};\r\n for (const [k, v] of Object.entries(source)) {\r\n if (Array.isArray(v)) cloned[k] = [...v];\r\n else if (v && typeof v === 'object') cloned[k] = { ...v };\r\n else cloned[k] = v;\r\n }\r\n\r\n cloned[this.keyField] = newKey;\r\n if (typeof cloned.code === 'string' && cloned.code.startsWith('ACC-')) {\r\n cloned.code = `ACC-${100000 + Number(newKey)}`;\r\n }\r\n\r\n const insertIdx =\r\n targetViewRowIndex !== undefined ? sourceIdx + 1 : sourceIdx + 1;\r\n this.rawData.splice(insertIdx, 0, cloned);\r\n\r\n for (let i = 0; i < this.rawData.length; i++) {\r\n this.rawData[i].__rawIndex = i;\r\n }\r\n\r\n if (this.batchMode) {\r\n this.insertedKeys.add(newKey);\r\n }\r\n\r\n this.distinctCache.clear();\r\n this.recompute();\r\n return Promise.resolve(cloned);\r\n }\r\n\r\n public async deleteRow(rowKey: any): Promise<void> {\r\n const idx = this.rawData.findIndex((r) => r[this.keyField] === rowKey);\r\n if (idx === -1) return Promise.resolve();\r\n\r\n const [removed] = this.rawData.splice(idx, 1);\r\n if (this.batchMode) {\r\n if (this.insertedKeys.has(rowKey)) {\r\n this.insertedKeys.delete(rowKey);\r\n } else {\r\n const origData = this.originalRowSnapshots.get(rowKey) || removed;\r\n this.deletedRows.set(rowKey, { data: { ...origData }, index: idx });\r\n }\r\n this.dirtyCells.delete(rowKey);\r\n }\r\n\r\n for (let i = 0; i < this.rawData.length; i++) {\r\n this.rawData[i].__rawIndex = i;\r\n }\r\n\r\n this.distinctCache.clear();\r\n this.recompute();\r\n return Promise.resolve();\r\n }\r\n\r\n public async deleteRowsBatch(\r\n rowKeys: any[],\r\n onProgress?: (processed: number, total: number) => void\r\n ): Promise<number> {\r\n if (!rowKeys || rowKeys.length === 0) return 0;\r\n const keySet = new Set<any>(rowKeys);\r\n const totalToProcess = keySet.size;\r\n const totalRaw = this.rawData.length;\r\n const keptRows: Record<string, any>[] = [];\r\n let removedCount = 0;\r\n\r\n // Process in chunks so the UI progress bar updates smoothly at 60 FPS without freezing on 100k rows\r\n const chunkSize = totalToProcess > 2000 ? Math.max(4000, Math.floor(totalRaw / 6)) : totalRaw + 1;\r\n\r\n for (let start = 0; start < totalRaw; start += chunkSize) {\r\n const end = Math.min(totalRaw, start + chunkSize);\r\n for (let i = start; i < end; i++) {\r\n const row = this.rawData[i];\r\n const rk = row[this.keyField];\r\n if (keySet.has(rk)) {\r\n removedCount++;\r\n if (this.batchMode) {\r\n if (this.insertedKeys.has(rk)) {\r\n this.insertedKeys.delete(rk);\r\n } else {\r\n const origData = this.originalRowSnapshots.get(rk) || row;\r\n this.deletedRows.set(rk, { data: origData, index: i });\r\n }\r\n this.dirtyCells.delete(rk);\r\n }\r\n } else {\r\n row.__rawIndex = keptRows.length;\r\n keptRows.push(row);\r\n }\r\n }\r\n\r\n if (onProgress) {\r\n onProgress(Math.min(totalToProcess, removedCount), totalToProcess);\r\n }\r\n if (end < totalRaw) {\r\n await new Promise((r) => setTimeout(r, 16));\r\n }\r\n }\r\n\r\n this.rawData = keptRows;\r\n this.distinctCache.clear();\r\n this.recompute();\r\n onProgress?.(totalToProcess, totalToProcess);\r\n return removedCount;\r\n }\r\n\r\n public async restoreRow(rowData: Record<string, any>, rawIndex?: number): Promise<void> {\r\n const key = rowData[this.keyField];\r\n const existingIdx = this.rawData.findIndex((r) => r[this.keyField] === key);\r\n if (existingIdx !== -1) return Promise.resolve();\r\n\r\n const targetIdx =\r\n rawIndex !== undefined ? Math.min(Math.max(0, rawIndex), this.rawData.length) : 0;\r\n this.rawData.splice(targetIdx, 0, { ...rowData });\r\n this.deletedRows.delete(key);\r\n\r\n for (let i = 0; i < this.rawData.length; i++) {\r\n this.rawData[i].__rawIndex = i;\r\n }\r\n\r\n this.distinctCache.clear();\r\n this.recompute();\r\n return Promise.resolve();\r\n }\r\n\r\n // ============================================================================\r\n // BATCH MODE & DIRTY STATE METHODS\r\n // ============================================================================\r\n public setBatchMode(enabled: boolean): void {\r\n this.batchMode = enabled;\r\n }\r\n\r\n public isBatchMode(): boolean {\r\n return this.batchMode;\r\n }\r\n\r\n public isCellDirty(rowKey: any, columnId: string): boolean {\r\n return this.dirtyCells.get(rowKey)?.has(columnId) ?? false;\r\n }\r\n\r\n public isColumnDirty(columnId: string): boolean {\r\n for (const cols of this.dirtyCells.values()) {\r\n if (cols.has(columnId)) return true;\r\n }\r\n return false;\r\n }\r\n\r\n public isRowInserted(rowKey: any): boolean {\r\n return this.insertedKeys.has(rowKey);\r\n }\r\n\r\n public hasPendingChanges(): boolean {\r\n return (\r\n this.insertedKeys.size > 0 ||\r\n this.dirtyCells.size > 0 ||\r\n this.deletedRows.size > 0\r\n );\r\n }\r\n\r\n public getPendingChangesCount(): number {\r\n return this.insertedKeys.size + this.dirtyCells.size + this.deletedRows.size;\r\n }\r\n\r\n public getPendingChanges(): BatchChanges {\r\n const inserted: any[] = [];\r\n for (const key of this.insertedKeys) {\r\n const row = this.rawData.find((r) => r[this.keyField] === key);\r\n if (row) {\r\n const clean = { ...row };\r\n delete clean.__rawIndex;\r\n inserted.push(clean);\r\n }\r\n }\r\n\r\n const updated: Array<{\r\n key: any;\r\n values: Record<string, any>;\r\n oldValues?: Record<string, any>;\r\n rowData?: Record<string, any>;\r\n }> = [];\r\n for (const [key, cols] of this.dirtyCells.entries()) {\r\n if (cols.size === 0 || this.insertedKeys.has(key)) continue;\r\n const row = this.rawData.find((r) => r[this.keyField] === key);\r\n if (row) {\r\n const orig = this.originalRowSnapshots.get(key) || {};\r\n const values: Record<string, any> = {};\r\n const oldValues: Record<string, any> = {};\r\n for (const c of cols) {\r\n values[c] = row[c];\r\n oldValues[c] = orig[c];\r\n }\r\n const cleanRow = { ...row };\r\n delete cleanRow.__rawIndex;\r\n updated.push({ key, values, oldValues, rowData: cleanRow });\r\n }\r\n }\r\n\r\n const deleted = Array.from(this.deletedRows.keys());\r\n const deletedRowsData = Array.from(this.deletedRows.entries()).map(([key, entry]) => {\r\n const clean = { ...entry.data };\r\n delete clean.__rawIndex;\r\n return { key, data: clean };\r\n });\r\n\r\n return { inserted, updated, deleted, deletedRowsData };\r\n }\r\n\r\n public revertPendingDelete(rowKey: any): void {\r\n const entry = this.deletedRows.get(rowKey);\r\n if (!entry) return;\r\n const idx = Math.min(Math.max(0, entry.index), this.rawData.length);\r\n this.rawData.splice(idx, 0, { ...entry.data });\r\n this.deletedRows.delete(rowKey);\r\n for (let i = 0; i < this.rawData.length; i++) {\r\n this.rawData[i].__rawIndex = i;\r\n }\r\n this.distinctCache.clear();\r\n this.recompute();\r\n }\r\n\r\n public revertPendingUpdate(rowKey: any, columnId?: string): void {\r\n const orig = this.originalRowSnapshots.get(rowKey);\r\n const cols = this.dirtyCells.get(rowKey);\r\n const row = this.rawData.find((r) => r[this.keyField] === rowKey);\r\n if (!orig || !cols || !row) return;\r\n\r\n if (columnId) {\r\n row[columnId] = orig[columnId];\r\n cols.delete(columnId);\r\n if (cols.size === 0) {\r\n this.dirtyCells.delete(rowKey);\r\n this.originalRowSnapshots.delete(rowKey);\r\n }\r\n } else {\r\n for (const c of cols) {\r\n row[c] = orig[c];\r\n }\r\n this.dirtyCells.delete(rowKey);\r\n this.originalRowSnapshots.delete(rowKey);\r\n }\r\n delete row.__searchIndex;\r\n this.distinctCache.clear();\r\n this.recompute();\r\n }\r\n\r\n public revertPendingInsert(rowKey: any): void {\r\n if (!this.insertedKeys.has(rowKey)) return;\r\n this.insertedKeys.delete(rowKey);\r\n this.rawData = this.rawData.filter((r) => r[this.keyField] !== rowKey);\r\n for (let i = 0; i < this.rawData.length; i++) {\r\n this.rawData[i].__rawIndex = i;\r\n }\r\n this.distinctCache.clear();\r\n this.recompute();\r\n }\r\n\r\n public async saveBatchChanges(): Promise<BatchChanges> {\r\n const changes = this.getPendingChanges();\r\n this.originalRowSnapshots.clear();\r\n this.dirtyCells.clear();\r\n this.insertedKeys.clear();\r\n this.deletedRows.clear();\r\n this.emit('loaded');\r\n return Promise.resolve(changes);\r\n }\r\n\r\n public discardBatchChanges(): void {\r\n // 1. Remove uncommitted inserted rows\r\n if (this.insertedKeys.size > 0) {\r\n this.rawData = this.rawData.filter((r) => !this.insertedKeys.has(r[this.keyField]));\r\n }\r\n\r\n // 2. Restore deleted rows\r\n if (this.deletedRows.size > 0) {\r\n const entries = Array.from(this.deletedRows.values()).sort((a, b) => a.index - b.index);\r\n for (const entry of entries) {\r\n const idx = Math.min(entry.index, this.rawData.length);\r\n this.rawData.splice(idx, 0, { ...entry.data });\r\n }\r\n }\r\n\r\n // 3. Revert modified cells to original snapshots\r\n for (const [key, orig] of this.originalRowSnapshots.entries()) {\r\n const row = this.rawData.find((r) => r[this.keyField] === key);\r\n if (row) {\r\n Object.assign(row, orig);\r\n }\r\n }\r\n\r\n for (let i = 0; i < this.rawData.length; i++) {\r\n this.rawData[i].__rawIndex = i;\r\n }\r\n\r\n this.originalRowSnapshots.clear();\r\n this.dirtyCells.clear();\r\n this.insertedKeys.clear();\r\n this.deletedRows.clear();\r\n this.distinctCache.clear();\r\n\r\n this.recompute();\r\n }\r\n\r\n public async commitBatch(changes: BatchChanges): Promise<void> {\r\n if (changes.updated) {\r\n for (const u of changes.updated) {\r\n const item = this.rawData.find((r) => r[this.keyField] === u.key);\r\n if (item) Object.assign(item, u.values);\r\n }\r\n }\r\n if (changes.inserted) {\r\n for (const ins of changes.inserted) {\r\n this.rawData.unshift({\r\n ...ins,\r\n __rawIndex: 0,\r\n [this.keyField]: ins[this.keyField] ?? this.generateNextKey(),\r\n });\r\n }\r\n }\r\n if (changes.deleted) {\r\n const delKeys = new Set(changes.deleted);\r\n this.rawData = this.rawData.filter((r) => !delKeys.has(r[this.keyField]));\r\n }\r\n this.originalRowSnapshots.clear();\r\n this.dirtyCells.clear();\r\n this.insertedKeys.clear();\r\n this.deletedRows.clear();\r\n this.distinctCache.clear();\r\n this.recompute();\r\n return Promise.resolve();\r\n }\r\n\r\n public async getDistinctValues(\r\n columnId: string,\r\n search?: string,\r\n baseFilter?: FilterDescriptor | null\r\n ): Promise<DistinctItem[]> {\r\n const hasBaseFilter =\r\n baseFilter !== undefined &&\r\n baseFilter !== null &&\r\n Array.isArray(baseFilter) &&\r\n baseFilter.length > 0;\r\n const filterKey = hasBaseFilter ? JSON.stringify(baseFilter) : '__NO_FILTER__';\r\n const cleanGlobalSearch = this.currentSearch ? this.currentSearch.toLowerCase().trim() : '';\r\n const cacheKey = `${columnId}::f=${filterKey}::s=${cleanGlobalSearch}`;\r\n\r\n let baseItems = this.distinctCache.get(cacheKey);\r\n\r\n if (!baseItems) {\r\n let sourceRows = this.rawData;\r\n if (hasBaseFilter) {\r\n sourceRows = sourceRows.filter((row) => FilterEngine.evaluateRow(row, baseFilter!));\r\n }\r\n if (cleanGlobalSearch) {\r\n sourceRows = sourceRows.filter((row) => FilterEngine.matchSearch(row, cleanGlobalSearch));\r\n }\r\n\r\n const counts = new Map<any, number>();\r\n let blankCount = 0;\r\n\r\n for (let i = 0; i < sourceRows.length; i++) {\r\n const val = sourceRows[i][columnId];\r\n if (\r\n val === undefined ||\r\n val === null ||\r\n val === '' ||\r\n (Array.isArray(val) && val.length === 0) ||\r\n (typeof val === 'object' && !Array.isArray(val) && Object.keys(val).length === 0)\r\n ) {\r\n blankCount++;\r\n } else if (Array.isArray(val)) {\r\n for (const elem of val) {\r\n if (elem !== undefined && elem !== null && elem !== '') {\r\n counts.set(elem, (counts.get(elem) || 0) + 1);\r\n }\r\n }\r\n } else if (typeof val === 'object') {\r\n const formatted = Object.entries(val)\r\n .map(([k, v]) => `${k}: ${String(v)}`)\r\n .join(' • ');\r\n counts.set(formatted, (counts.get(formatted) || 0) + 1);\r\n } else {\r\n counts.set(val, (counts.get(val) || 0) + 1);\r\n }\r\n }\r\n\r\n baseItems = Array.from(counts.entries()).map(([val, count]) => ({\r\n value: val,\r\n label: String(val),\r\n count,\r\n }));\r\n\r\n baseItems.sort((a, b) => SortEngine.compareValues(a.value, b.value));\r\n\r\n if (blankCount > 0) {\r\n baseItems.unshift({\r\n value: BLANK_FILTER_TOKEN,\r\n label: '(Blank)',\r\n count: blankCount,\r\n });\r\n }\r\n\r\n this.distinctCache.set(cacheKey, baseItems);\r\n }\r\n\r\n if (search) {\r\n const s = search.toLowerCase().trim();\r\n if (s) {\r\n return Promise.resolve(baseItems.filter((it) => it.label.toLowerCase().includes(s)));\r\n }\r\n }\r\n\r\n return Promise.resolve(baseItems);\r\n }\r\n\r\n // ============================================================================\r\n // DYNAMIC SUMMARY ENGINE\r\n // ============================================================================\r\n public getSummaryTypes(): Record<string, SummaryType> {\r\n return { ...this.summaryTypes };\r\n }\r\n\r\n public setSummaryType(columnId: string, summaryType: SummaryType): void {\r\n if (summaryType === 'none') {\r\n delete this.summaryTypes[columnId];\r\n } else {\r\n this.summaryTypes[columnId] = summaryType;\r\n }\r\n this.recomputeVirtualRowsOnly();\r\n }\r\n\r\n public getSummaries(): Record<string, number> | undefined {\r\n if (this.processedData.length === 0) return undefined;\r\n const result: Record<string, number> = {};\r\n\r\n for (const [colId, sType] of Object.entries(this.summaryTypes)) {\r\n if (!sType || sType === 'none') continue;\r\n\r\n if (sType === 'count') {\r\n let nonNullCount = 0;\r\n for (let i = 0; i < this.processedData.length; i++) {\r\n const v = this.processedData[i][colId];\r\n if (v !== null && v !== undefined && v !== '') nonNullCount++;\r\n }\r\n result[colId] = nonNullCount;\r\n continue;\r\n }\r\n\r\n let sum = 0;\r\n let count = 0;\r\n let min = Infinity;\r\n let max = -Infinity;\r\n\r\n for (let i = 0; i < this.processedData.length; i++) {\r\n const raw = this.processedData[i][colId];\r\n const num = typeof raw === 'number' ? raw : FilterEngine.parseNumeric(raw);\r\n if (raw !== null && raw !== undefined && raw !== '' && !isNaN(num)) {\r\n sum += num;\r\n count++;\r\n if (num < min) min = num;\r\n if (num > max) max = num;\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n if (sType === 'sum') result[colId] = sum;\r\n else if (sType === 'avg') result[colId] = sum / count;\r\n else if (sType === 'min') result[colId] = min;\r\n else if (sType === 'max') result[colId] = max;\r\n } else {\r\n result[colId] = 0;\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public on(event: string, callback: (...args: any[]) => void): void {\r\n if (!this.listeners.has(event)) {\r\n this.listeners.set(event, new Set());\r\n }\r\n this.listeners.get(event)!.add(callback);\r\n }\r\n\r\n public off(event: string, callback: (...args: any[]) => void): void {\r\n this.listeners.get(event)?.delete(callback);\r\n }\r\n\r\n private emit(event: string, ...args: any[]): void {\r\n this.listeners.get(event)?.forEach((cb) => cb(...args));\r\n }\r\n\r\n private recompute(): void {\r\n this.emit('loading');\r\n\r\n // 1. Filter\r\n let filtered = this.rawData;\r\n if (this.currentFilter) {\r\n filtered = filtered.filter((row) => FilterEngine.evaluateRow(row, this.currentFilter));\r\n }\r\n\r\n // 2. Global Search (Fast Lowercase Pre-Indexed Substring Search)\r\n if (this.currentSearch) {\r\n const cleanKeyword = this.currentSearch.toLowerCase().trim();\r\n if (cleanKeyword) {\r\n filtered = filtered.filter((row) => FilterEngine.matchSearch(row, cleanKeyword));\r\n }\r\n }\r\n\r\n // 3. Multi-Sort\r\n if (this.currentSort.length > 0) {\r\n const cmp = SortEngine.createComparator(this.currentSort);\r\n filtered = [...filtered].sort(cmp);\r\n }\r\n\r\n this.processedData = filtered;\r\n\r\n // 4. Grouping & Virtual Row Projection\r\n this.recomputeVirtualRowsOnly();\r\n }\r\n\r\n private recomputeVirtualRowsOnly(): void {\r\n this.virtualRows = GroupingEngine.projectVirtualRows(\r\n this.processedData,\r\n this.currentGroups,\r\n this.expandedGroupKeys,\r\n this.summaryTypes\r\n );\r\n this.emit('loaded');\r\n }\r\n}\r\n","import { CellPaintContext } from '../../IColumnTypePlugin';\n\nexport function paintText({ ctx, value, theme, x, y, width, height }: CellPaintContext<string>): void {\n if (value === null || value === undefined || value === '' || typeof value === 'function') return;\n\n const padX = 10;\n const maxW = width - padX * 2;\n if (maxW <= 0) return;\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(x + padX, y, maxW, height);\n ctx.clip();\n\n ctx.fillStyle = theme.canvas.cellText;\n ctx.font = `normal ${theme.fontSize}px ${theme.fontFamily}`;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillText(String(value), x + padX, y + height / 2);\n\n ctx.restore();\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { CellEditorProps } from '../../IColumnTypePlugin';\n\nexport const TextEditor: React.FC<CellEditorProps<string>> = ({\n value,\n rect,\n theme,\n initialChar,\n onCommit,\n onCancel,\n}) => {\n const [text, setText] = useState<string>(initialChar ?? (value != null ? String(value) : ''));\n const inputRef = useRef<HTMLInputElement | null>(null);\n const committedRef = useRef<boolean>(false);\n\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n if (!initialChar) {\n inputRef.current.select();\n } else {\n const len = inputRef.current.value.length;\n inputRef.current.setSelectionRange(len, len);\n }\n }\n }, [initialChar]);\n\n const safeCommit = (val: string, dir?: 'down' | 'right' | 'left' | 'none') => {\n if (committedRef.current) return;\n committedRef.current = true;\n onCommit(val, dir);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n e.stopPropagation();\n if (e.key === 'Enter') {\n e.preventDefault();\n safeCommit(text, e.shiftKey ? 'none' : 'down');\n } else if (e.key === 'Tab') {\n e.preventDefault();\n safeCommit(text, e.shiftKey ? 'left' : 'right');\n } else if (e.key === 'Escape') {\n e.preventDefault();\n committedRef.current = true;\n onCancel();\n }\n };\n\n return (\n <div\n onMouseDown={(e) => e.stopPropagation()}\n onClick={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n style={{\n position: 'absolute',\n left: rect.x,\n top: rect.y,\n width: Math.max(rect.width, 110),\n height: rect.height,\n zIndex: 100,\n }}\n >\n <input\n ref={inputRef}\n type=\"text\"\n value={text}\n onChange={(e) => setText(e.target.value)}\n onKeyDown={handleKeyDown}\n onBlur={() => safeCommit(text, 'none')}\n style={{\n width: '100%',\n height: '100%',\n padding: '0 8px',\n boxSizing: 'border-box',\n backgroundColor: theme.dom.inputBg,\n color: theme.dom.inputText,\n border: `2px solid ${theme.dom.inputFocusBorder}`,\n outline: 'none',\n fontFamily: theme.fontFamily,\n fontSize: `${theme.fontSize}px`,\n borderRadius: 3,\n boxShadow: theme.dom.popoverShadow,\n }}\n />\n </div>\n );\n};\n","import { IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { paintText } from './TextPainter';\nimport { TextEditor } from './TextEditor';\n\nexport const TextColumnPlugin: IColumnTypePlugin<string> = {\n type: 'text',\n paint: paintText,\n editorComponent: TextEditor,\n\n onKeyDown({ event, openEditor }) {\n // First-key capture: Klavyeden herhangi bir harfe basıldığında editörü doğrudan o harfle aç\n if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {\n event.preventDefault();\n openEditor(event.key);\n return true;\n }\n return false;\n },\n\n parseClipboard(text) {\n return text.trim();\n },\n\n formatClipboard(value) {\n return value != null ? String(value) : '';\n },\n\n comparator(a, b) {\n return String(a ?? '').localeCompare(String(b ?? ''), 'tr-TR', { numeric: true });\n },\n};\n","import { CellPaintContext } from '../../IColumnTypePlugin';\n\nconst formatters = new Map<string, Intl.NumberFormat>();\n\nfunction getFormatter(localeCode: string, minDigits: number, maxDigits: number, useGrouping: boolean = true): Intl.NumberFormat {\n const key = `${localeCode}_${minDigits}_${maxDigits}_${useGrouping}`;\n let fmt = formatters.get(key);\n if (!fmt) {\n try {\n fmt = new Intl.NumberFormat(localeCode, {\n minimumFractionDigits: minDigits,\n maximumFractionDigits: maxDigits,\n useGrouping,\n });\n } catch {\n fmt = new Intl.NumberFormat('tr-TR', {\n minimumFractionDigits: minDigits,\n maximumFractionDigits: maxDigits,\n useGrouping,\n });\n }\n formatters.set(key, fmt);\n }\n return fmt;\n}\n\nexport function paintNumber({ ctx, value, column, theme, locale, x, y, width, height }: CellPaintContext<number>): void {\n if (value === null || value === undefined || value === ('' as any) || isNaN(Number(value))) return;\n\n const num = Number(value);\n const code = locale?.code || 'tr-TR';\n let formatted: string;\n\n if (column.id === 'id') {\n formatted = String(Math.trunc(num));\n } else if (column.decimalDigits !== undefined) {\n formatted = getFormatter(code, column.decimalDigits, column.decimalDigits, true).format(num);\n } else if (Number.isInteger(num)) {\n formatted = getFormatter(code, 0, 0, true).format(num);\n } else {\n formatted = getFormatter(code, 0, 2, true).format(num);\n }\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(x + 6, y, width - 12, height);\n ctx.clip();\n\n ctx.fillStyle = num < 0 ? (theme.isDark ? '#FF453A' : '#DC2626') : theme.canvas.cellText;\n ctx.font = `normal ${theme.fontSize}px ${theme.fontFamily}`;\n ctx.textAlign = column.align || 'right';\n const textX = column.align === 'center' ? x + width / 2 : column.align === 'left' ? x + 10 : x + width - 10;\n ctx.textBaseline = 'middle';\n ctx.fillText(formatted, textX, y + height / 2);\n\n ctx.restore();\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { CellEditorProps } from '../../IColumnTypePlugin';\n\nexport const NumberEditor: React.FC<CellEditorProps<number>> = ({\n value,\n rect,\n theme,\n initialChar,\n onCommit,\n onCancel,\n}) => {\n const [val, setVal] = useState<string>(initialChar ?? (value != null ? String(value) : ''));\n const inputRef = useRef<HTMLInputElement | null>(null);\n const committedRef = useRef<boolean>(false);\n\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n if (!initialChar) {\n inputRef.current.select();\n } else {\n const len = inputRef.current.value.length;\n inputRef.current.setSelectionRange(len, len);\n }\n }\n }, [initialChar]);\n\n const commitParsed = (moveDir?: 'down' | 'right' | 'left' | 'none') => {\n if (committedRef.current) return;\n committedRef.current = true;\n const clean = val.replace(/\\s/g, '').replace(',', '.');\n const parsed = parseFloat(clean);\n onCommit(isNaN(parsed) ? 0 : parsed, moveDir);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n e.stopPropagation();\n if (e.key === 'Enter') {\n e.preventDefault();\n commitParsed(e.shiftKey ? 'none' : 'down');\n } else if (e.key === 'Tab') {\n e.preventDefault();\n commitParsed(e.shiftKey ? 'left' : 'right');\n } else if (e.key === 'Escape') {\n e.preventDefault();\n committedRef.current = true;\n onCancel();\n }\n };\n\n return (\n <div\n onMouseDown={(e) => e.stopPropagation()}\n onClick={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n style={{\n position: 'absolute',\n left: rect.x,\n top: rect.y,\n width: Math.max(rect.width, 100),\n height: rect.height,\n zIndex: 100,\n }}\n >\n <input\n ref={inputRef}\n type=\"text\"\n value={val}\n onChange={(e) => setVal(e.target.value)}\n onKeyDown={handleKeyDown}\n onBlur={() => commitParsed('none')}\n style={{\n width: '100%',\n height: '100%',\n padding: '0 8px',\n textAlign: 'right',\n boxSizing: 'border-box',\n backgroundColor: theme.dom.inputBg,\n color: theme.dom.inputText,\n border: `2px solid ${theme.dom.inputFocusBorder}`,\n outline: 'none',\n fontFamily: theme.fontFamily,\n fontSize: `${theme.fontSize}px`,\n borderRadius: 3,\n boxShadow: theme.dom.popoverShadow,\n }}\n />\n </div>\n );\n};\n","import { IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { paintNumber } from './NumberPainter';\nimport { NumberEditor } from './NumberEditor';\n\nexport const NumberColumnPlugin: IColumnTypePlugin<number> = {\n type: 'number',\n paint: paintNumber,\n editorComponent: NumberEditor,\n\n onKeyDown({ event, openEditor }) {\n if (/^[0-9.,-]$/.test(event.key) && !event.ctrlKey && !event.metaKey && !event.altKey) {\n event.preventDefault();\n openEditor(event.key);\n return true;\n }\n return false;\n },\n\n parseClipboard(text) {\n const clean = text.replace(/\\./g, '').replace(',', '.').replace(/[^0-9.-]/g, '');\n const num = parseFloat(clean);\n return isNaN(num) ? 0 : num;\n },\n\n formatClipboard(value) {\n return value != null ? String(value) : '';\n },\n\n comparator(a, b) {\n return (Number(a) || 0) - (Number(b) || 0);\n },\n};\n","import { CellPaintContext } from '../../IColumnTypePlugin';\n\nconst formatters = new Map<string, Intl.NumberFormat>();\n\nfunction getFormatter(localeCode: string, digits: number): Intl.NumberFormat {\n const key = `${localeCode}_${digits}`;\n let fmt = formatters.get(key);\n if (!fmt) {\n try {\n fmt = new Intl.NumberFormat(localeCode, {\n minimumFractionDigits: digits,\n maximumFractionDigits: digits,\n });\n } catch {\n fmt = new Intl.NumberFormat('tr-TR', {\n minimumFractionDigits: digits,\n maximumFractionDigits: digits,\n });\n }\n formatters.set(key, fmt);\n }\n return fmt;\n}\n\nexport function paintCurrency({ ctx, value, column, theme, locale, x, y, width, height }: CellPaintContext<number>): void {\n if (value === null || value === undefined || isNaN(Number(value))) return;\n\n const num = Number(value);\n const digits = column.decimalDigits ?? 2;\n const symbol = column.currencySymbol ?? '₺';\n const code = locale?.code || 'tr-TR';\n const isTR = code.startsWith('tr');\n const numStr = getFormatter(code, digits).format(num);\n const formatted = isTR\n ? `${numStr} ${symbol}`\n : num < 0\n ? `-${symbol}${numStr.replace(/^-/, '')}`\n : `${symbol}${numStr}`;\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(x + 6, y, width - 12, height);\n ctx.clip();\n\n ctx.fillStyle = num < 0 ? (theme.isDark ? '#FF453A' : '#DC2626') : theme.canvas.cellText;\n ctx.font = `500 ${theme.fontSize}px ${theme.fontFamily}`;\n ctx.textAlign = 'right';\n ctx.textBaseline = 'middle';\n ctx.fillText(formatted, x + width - 10, y + height / 2);\n\n ctx.restore();\n}\n","import { IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { paintCurrency } from './CurrencyPainter';\nimport { NumberEditor } from '../NumberColumn/NumberEditor';\n\nexport const CurrencyColumnPlugin: IColumnTypePlugin<number> = {\n type: 'currency',\n paint: paintCurrency,\n editorComponent: NumberEditor,\n\n onKeyDown({ event, openEditor }) {\n if (/^[0-9.,-]$/.test(event.key) && !event.ctrlKey && !event.metaKey && !event.altKey) {\n event.preventDefault();\n openEditor(event.key);\n return true;\n }\n return false;\n },\n\n parseClipboard(text) {\n const clean = text.trim();\n // Handle both US (12,345.67) and TR/EU (12.345,67) formats gracefully\n if (clean.includes(',') && clean.includes('.')) {\n const lastComma = clean.lastIndexOf(',');\n const lastDot = clean.lastIndexOf('.');\n if (lastComma > lastDot) {\n const num = parseFloat(clean.replace(/\\./g, '').replace(',', '.').replace(/[^0-9.-]/g, ''));\n return isNaN(num) ? 0 : num;\n } else {\n const num = parseFloat(clean.replace(/,/g, '').replace(/[^0-9.-]/g, ''));\n return isNaN(num) ? 0 : num;\n }\n } else if (clean.includes(',')) {\n const num = parseFloat(clean.replace(',', '.').replace(/[^0-9.-]/g, ''));\n return isNaN(num) ? 0 : num;\n }\n const num = parseFloat(clean.replace(/[^0-9.-]/g, ''));\n return isNaN(num) ? 0 : num;\n },\n\n formatClipboard(value, column) {\n const sym = column.currencySymbol ?? '$';\n return value != null ? `${value} ${sym}` : '';\n },\n\n comparator(a, b) {\n return (Number(a) || 0) - (Number(b) || 0);\n },\n};\n","import { CellPaintContext } from '../../IColumnTypePlugin';\nimport { NumberEditor } from '../NumberColumn/NumberEditor';\nimport { IColumnTypePlugin } from '../../IColumnTypePlugin';\n\nexport function paintPercent({\n ctx,\n value,\n column,\n theme,\n locale,\n x,\n y,\n width,\n height,\n}: CellPaintContext<number>): void {\n if (value === null || value === undefined || value === ('' as any)) return;\n const num = Number(value);\n if (isNaN(num)) return;\n\n const digits = column.decimalDigits ?? 1;\n const formatted = num.toLocaleString(locale.code, {\n minimumFractionDigits: digits,\n maximumFractionDigits: digits,\n });\n\n const showSign = column.showVarianceSign ?? true;\n const signPrefix = showSign && num > 0 ? '+' : '';\n const arrow = showSign ? (num > 0 ? '▲ ' : num < 0 ? '▼ ' : '') : '';\n const text = `${arrow}${signPrefix}${formatted}%`;\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(x + 6, y, width - 12, height);\n ctx.clip();\n\n if (showSign && num > 0) {\n ctx.fillStyle = theme.isDark ? '#34D399' : '#059669';\n } else if (showSign && num < 0) {\n ctx.fillStyle = theme.isDark ? '#F87171' : '#DC2626';\n } else {\n ctx.fillStyle = theme.canvas.cellText;\n }\n\n ctx.font = `600 ${theme.fontSize}px ${theme.fontFamily}`;\n ctx.textAlign = 'right';\n ctx.textBaseline = 'middle';\n ctx.fillText(text, x + width - 10, y + height / 2);\n ctx.restore();\n}\n\nexport const PercentColumnPlugin: IColumnTypePlugin<number> = {\n type: 'percent',\n paint: paintPercent,\n editorComponent: NumberEditor,\n\n onKeyDown({ event, openEditor }) {\n if (/^[0-9.,+-]$/.test(event.key) && !event.ctrlKey && !event.metaKey) {\n event.preventDefault();\n openEditor(event.key);\n return true;\n }\n return false;\n },\n\n parseClipboard(text) {\n const clean = text.replace(/[%▲▼+\\s]/g, '').replace(',', '.');\n const n = parseFloat(clean);\n return isNaN(n) ? 0 : n;\n },\n\n formatClipboard(value) {\n const n = Number(value);\n return isNaN(n) ? '0%' : `${n}%`;\n },\n\n comparator(a, b) {\n return (Number(a) || 0) - (Number(b) || 0);\n },\n};\n","import { CellPaintContext } from '../../IColumnTypePlugin';\n\nexport function paintBoolean({ ctx, value, theme, x, y, width, height }: CellPaintContext<boolean>): void {\n const size = 16;\n const boxX = Math.round(x + (width - size) / 2);\n const boxY = Math.round(y + (height - size) / 2);\n\n ctx.save();\n ctx.lineWidth = 1.5;\n\n if (value) {\n ctx.fillStyle = theme.canvas.selectionBorder;\n ctx.beginPath();\n ctx.roundRect(boxX, boxY, size, size, 3);\n ctx.fill();\n\n ctx.strokeStyle = '#FFFFFF';\n ctx.beginPath();\n ctx.moveTo(boxX + 3.5, boxY + 8);\n ctx.lineTo(boxX + 6.5, boxY + 11.5);\n ctx.lineTo(boxX + 12.5, boxY + 4.5);\n ctx.stroke();\n } else {\n ctx.strokeStyle = theme.isDark ? '#5A5A5E' : '#C7C7CC';\n ctx.fillStyle = theme.canvas.bg;\n ctx.beginPath();\n ctx.roundRect(boxX, boxY, size, size, 3);\n ctx.fill();\n ctx.stroke();\n }\n\n ctx.restore();\n}\n","import { IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { paintBoolean } from './BooleanPainter';\n\nexport const BooleanColumnPlugin: IColumnTypePlugin<boolean> = {\n type: 'boolean',\n paint: paintBoolean,\n editorComponent: undefined, // Zero-DOM: DOM açmadan doğrudan canvas üstünden çalışır\n\n onPointerDown({ value, setValue }) {\n setValue(!value);\n return { handled: true };\n },\n\n onKeyDown({ event, value, setValue }) {\n if (event.key === ' ') {\n event.preventDefault();\n setValue(!value);\n return true;\n }\n return false;\n },\n\n parseClipboard(text) {\n const clean = text.trim().toLowerCase();\n return ['true', '1', 'evet', 'aktif', 'yes'].includes(clean);\n },\n\n formatClipboard(value) {\n return value ? 'DOĞRU' : 'YANLIŞ';\n },\n\n comparator(a, b) {\n return (a === b ? 0 : a ? 1 : -1);\n },\n};\n","import { CellPaintContext } from '../../IColumnTypePlugin';\nimport { SelectOption } from '../../../types/grid';\n\n/**\n * Açık renkleri Dark Mode için Apple / Google tarzı yarı saydam ve canlı renklere dönüştürür\n */\nfunction resolveBadgeColors(\n opt: SelectOption,\n isDark: boolean\n): { bg?: string; fg?: string; border?: string; isBadge: boolean } {\n // 1. Kullanıcı özel bg / darkBg verdiyse (ör. Status rozetleri için renk tanımlıysa) rozet olarak çiz\n if (opt.bg || opt.darkBg) {\n if (isDark) {\n return {\n bg: opt.darkBg || opt.bg,\n fg: opt.darkFg || '#F5F5F7',\n border: opt.darkFg ? `${opt.darkFg}33` : undefined,\n isBadge: true,\n };\n }\n return {\n bg: opt.bg,\n fg: opt.fg || '#1D1D1F',\n border: undefined,\n isBadge: true,\n };\n }\n\n // 2. Akıllı renk tahmini - yalnızca opt.bg bir renk anahtarı içeriyorsa\n const bg = (opt.bg || '').toLowerCase();\n const fg = (opt.fg || '').toLowerCase();\n if (bg) {\n if (bg.includes('dcfce7') || fg.includes('166534') || bg.includes('green') || bg.includes('emerald')) {\n return {\n bg: isDark ? 'rgba(48, 209, 88, 0.16)' : '#dcfce7',\n fg: isDark ? '#30D158' : '#166534',\n border: isDark ? 'rgba(48, 209, 88, 0.28)' : undefined,\n isBadge: true,\n };\n }\n if (bg.includes('fef3c7') || fg.includes('92400e') || bg.includes('yellow') || bg.includes('amber')) {\n return {\n bg: isDark ? 'rgba(255, 159, 10, 0.16)' : '#fef3c7',\n fg: isDark ? '#FF9F0A' : '#92400e',\n border: isDark ? 'rgba(255, 159, 10, 0.28)' : undefined,\n isBadge: true,\n };\n }\n if (bg.includes('e0f2fe') || fg.includes('075985') || bg.includes('blue') || bg.includes('sky')) {\n return {\n bg: isDark ? 'rgba(10, 132, 255, 0.16)' : '#e0f2fe',\n fg: isDark ? '#64D2FF' : '#075985',\n border: isDark ? 'rgba(10, 132, 255, 0.28)' : undefined,\n isBadge: true,\n };\n }\n if (bg.includes('fee2e2') || fg.includes('991b1b') || bg.includes('red') || bg.includes('rose')) {\n return {\n bg: isDark ? 'rgba(255, 69, 58, 0.16)' : '#fee2e2',\n fg: isDark ? '#FF453A' : '#991b1b',\n border: isDark ? 'rgba(255, 69, 58, 0.28)' : undefined,\n isBadge: true,\n };\n }\n }\n\n // 3. Normal düzenlenebilir dropdown sütunu: Gri kutu YOK! Hücre normal renginde görünür.\n return {\n isBadge: false,\n };\n}\n\nexport function paintSelect({\n ctx,\n value,\n column,\n theme,\n x,\n y,\n width,\n height,\n isSelected,\n isHovered,\n}: CellPaintContext<string>): void {\n if (value == null || value === '') return;\n\n const opt = column.options?.find(\n (o) => o.value === value || String(o.value) === String(value)\n ) ?? {\n value,\n label: String(value),\n };\n\n const badgeInfo = resolveBadgeColors(opt, theme.isDark);\n\n ctx.save();\n\n if (badgeInfo.isBadge && badgeInfo.bg) {\n // Yalnızca belirgin bir renk rozeti atanmış seçeneklerde renkli hap çiz\n const pad = 6;\n const pillH = 22;\n const pillY = y + (height - pillH) / 2;\n const pillW = Math.min(width - pad * 2 - 18, 180);\n\n if (pillW > 20) {\n ctx.fillStyle = badgeInfo.bg;\n ctx.beginPath();\n ctx.roundRect(x + pad, pillY, pillW, pillH, 4);\n ctx.fill();\n\n if (badgeInfo.border) {\n ctx.strokeStyle = badgeInfo.border;\n ctx.lineWidth = 1;\n ctx.stroke();\n }\n\n ctx.beginPath();\n ctx.rect(x + pad + 6, pillY, pillW - 12, pillH);\n ctx.clip();\n\n ctx.fillStyle = badgeInfo.fg || theme.canvas.cellText;\n ctx.font = `600 ${theme.fontSize - 1}px ${theme.fontFamily}`;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillText(opt.label, x + pad + 8, y + height / 2);\n }\n } else {\n // Normal düzenlenebilir dropdown: Gri zemin YOK. Temiz hücre metni\n const textStartX = x + 8;\n const maxTextW = Math.max(0, width - 26);\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(textStartX, y, maxTextW, height);\n ctx.clip();\n\n ctx.fillStyle = theme.canvas.cellText;\n ctx.font = `500 ${theme.fontSize}px ${theme.fontFamily}`;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillText(opt.label, textStartX, y + height / 2);\n ctx.restore();\n }\n\n // Sağ taraftaki zarif açılır ok ikonu (▼)\n if (width > 36) {\n const arrowX = x + width - 12;\n const arrowY = y + height / 2;\n ctx.fillStyle =\n isSelected || isHovered\n ? theme.dom.accentColor\n : theme.isDark\n ? '#8E8E93'\n : '#AEAEB2';\n ctx.beginPath();\n ctx.moveTo(arrowX - 3.5, arrowY - 2);\n ctx.lineTo(arrowX + 3.5, arrowY - 2);\n ctx.lineTo(arrowX, arrowY + 2.5);\n ctx.closePath();\n ctx.fill();\n }\n\n ctx.restore();\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { CellEditorProps } from '../../IColumnTypePlugin';\n\nexport const SelectEditor: React.FC<CellEditorProps<string>> = ({\n value,\n column,\n rect,\n theme,\n locale,\n initialChar,\n onCommit,\n onCancel,\n}) => {\n const options = column.options || [];\n const [search, setSearch] = useState<string>(initialChar || '');\n const [highlightedIndex, setHighlightedIndex] = useState<number>(() => {\n const idx = options.findIndex((o) => o.value === value);\n return idx >= 0 ? idx : 0;\n });\n const containerRef = useRef<HTMLDivElement | null>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n const filtered = options.filter(\n (o) =>\n o.label.toLowerCase().includes(search.toLowerCase()) ||\n o.value.toLowerCase().includes(search.toLowerCase())\n );\n\n useEffect(() => {\n inputRef.current?.focus();\n }, []);\n\n useEffect(() => {\n const handleOutside = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n onCancel();\n }\n };\n document.addEventListener('mousedown', handleOutside, true);\n return () => document.removeEventListener('mousedown', handleOutside, true);\n }, [onCancel]);\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n e.stopPropagation();\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setHighlightedIndex((prev) => Math.min(prev + 1, Math.max(0, filtered.length - 1)));\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setHighlightedIndex((prev) => Math.max(prev - 1, 0));\n } else if (e.key === 'Enter') {\n e.preventDefault();\n if (filtered[highlightedIndex]) {\n onCommit(filtered[highlightedIndex].value, 'down');\n } else {\n onCancel();\n }\n } else if (e.key === 'Tab') {\n e.preventDefault();\n if (filtered[highlightedIndex]) {\n onCommit(filtered[highlightedIndex].value, e.shiftKey ? 'left' : 'right');\n } else {\n onCancel();\n }\n } else if (e.key === 'Escape') {\n e.preventDefault();\n onCancel();\n }\n };\n\n return (\n <div\n ref={containerRef}\n onMouseDown={(e) => e.stopPropagation()}\n onClick={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n style={{\n position: 'absolute',\n left: Math.max(4, rect.x),\n top: rect.y,\n minWidth: Math.max(rect.width, 190),\n zIndex: 120,\n backgroundColor: theme.dom.popoverBg,\n color: theme.dom.popoverText,\n border: `1px solid ${theme.dom.popoverBorder}`,\n borderRadius: 8,\n boxShadow: theme.dom.popoverShadow,\n backdropFilter: theme.dom.glassBackdrop,\n overflow: 'hidden',\n }}\n >\n <div style={{ padding: 6, borderBottom: `1px solid ${theme.dom.popoverBorder}` }}>\n <input\n ref={inputRef}\n type=\"text\"\n value={search}\n onChange={(e) => {\n setSearch(e.target.value);\n setHighlightedIndex(0);\n }}\n onKeyDown={handleKeyDown}\n placeholder={locale?.searchValuesPlaceholder || 'Search values...'}\n style={{\n width: '100%',\n padding: '5px 8px',\n backgroundColor: theme.dom.inputBg,\n color: theme.dom.inputText,\n border: `1px solid ${theme.dom.inputBorder}`,\n borderRadius: 4,\n outline: 'none',\n fontSize: 12,\n fontFamily: theme.fontFamily,\n boxSizing: 'border-box',\n }}\n />\n </div>\n\n <div style={{ maxHeight: 190, overflowY: 'auto', padding: 4 }}>\n {filtered.length === 0 ? (\n <div style={{ padding: '8px 12px', fontSize: 12, color: '#8E8E93' }}>\n {locale?.noMatches || 'No matching records'}\n </div>\n ) : (\n filtered.map((opt, i) => {\n const isSelected = opt.value === value;\n const isHigh = i === highlightedIndex;\n return (\n <div\n key={opt.value}\n onMouseDown={(e) => {\n e.stopPropagation();\n onCommit(opt.value, 'none');\n }}\n onMouseEnter={() => setHighlightedIndex(i)}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '6px 10px',\n borderRadius: 4,\n cursor: 'pointer',\n backgroundColor: isHigh\n ? theme.isDark\n ? 'rgba(255,255,255,0.08)'\n : 'rgba(0,0,0,0.05)'\n : 'transparent',\n fontSize: 12,\n fontFamily: theme.fontFamily,\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>\n {(opt.bg || opt.darkFg) && (\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n backgroundColor: theme.isDark\n ? opt.darkFg || '#60A5FA'\n : opt.fg || opt.bg || '#3B82F6',\n }}\n />\n )}\n <span>{opt.label}</span>\n </div>\n {isSelected && <span style={{ color: theme.dom.accentColor, fontWeight: 700 }}>✓</span>}\n </div>\n );\n })\n )}\n </div>\n </div>\n );\n};\n","import { IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { paintSelect } from './SelectPainter';\nimport { SelectEditor } from './SelectEditor';\n\nexport const SelectColumnPlugin: IColumnTypePlugin<string> = {\n type: 'select',\n paint: paintSelect,\n editorComponent: SelectEditor,\n\n onPointerDown({ localX, column }) {\n // Sağdaki ok alanına tıklandıysa doğrudan editörü aç\n if (localX > column.width - 28) {\n return { handled: true, shouldOpenEditor: true };\n }\n return { handled: false };\n },\n\n onKeyDown({ event, openEditor }) {\n if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {\n event.preventDefault();\n openEditor(event.key);\n return true;\n }\n if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault();\n openEditor();\n return true;\n }\n return false;\n },\n\n parseClipboard(text, column) {\n const clean = text.trim().toLowerCase();\n const match = column.options?.find(\n (o) => o.value.toLowerCase() === clean || o.label.toLowerCase() === clean\n );\n return match ? match.value : text.trim();\n },\n\n formatClipboard(value, column) {\n const match = column.options?.find((o) => o.value === value);\n return match ? match.label : String(value ?? '');\n },\n\n comparator(a, b) {\n return String(a ?? '').localeCompare(String(b ?? ''), 'tr-TR');\n },\n};\n","import { CellPaintContext } from '../../IColumnTypePlugin';\n\nexport function paintDropdown({\n ctx,\n value,\n column,\n theme,\n x,\n y,\n width,\n height,\n isHovered,\n isSelected,\n}: CellPaintContext<string>): void {\n ctx.save();\n\n const opt = column.options?.find(\n (o) => o.value === value || o.label.toLowerCase() === String(value ?? '').toLowerCase()\n );\n const displayLabel = opt ? opt.label : value != null ? String(value) : '';\n\n // Optional subtle color dot on left if option defines colors\n let textStartX = x + 8;\n if (displayLabel && opt && (opt.bg || opt.darkFg || opt.fg)) {\n const dotColor = theme.isDark\n ? opt.darkFg || '#38BDF8'\n : opt.fg || '#0284C7';\n ctx.fillStyle = dotColor;\n ctx.beginPath();\n ctx.arc(x + 12, y + height / 2, 3.5, 0, Math.PI * 2);\n ctx.fill();\n textStartX = x + 21;\n }\n\n // Cell label text\n if (displayLabel) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(textStartX, y, Math.max(0, width - (textStartX - x) - 28), height);\n ctx.clip();\n\n ctx.fillStyle = theme.canvas.cellText;\n ctx.font = `500 ${theme.fontSize}px ${theme.fontFamily}`;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillText(displayLabel, textStartX, y + height / 2);\n ctx.restore();\n }\n\n // ComboBox Dropdown Button on right side of cell\n if (width > 48) {\n const btnSize = 18;\n const btnX = x + width - btnSize - 5;\n const btnY = y + (height - btnSize) / 2;\n\n ctx.fillStyle =\n isSelected || isHovered\n ? theme.isDark\n ? 'rgba(56, 189, 248, 0.16)'\n : 'rgba(2, 132, 199, 0.10)'\n : theme.isDark\n ? 'rgba(255, 255, 255, 0.05)'\n : 'rgba(15, 23, 42, 0.04)';\n ctx.beginPath();\n ctx.roundRect(btnX, btnY, btnSize, btnSize, 4);\n ctx.fill();\n\n // Chevron arrow\n ctx.fillStyle =\n isSelected || isHovered\n ? theme.dom.accentColor\n : theme.isDark\n ? '#94A3B8'\n : '#64748B';\n ctx.beginPath();\n const cx = btnX + btnSize / 2;\n const cy = btnY + btnSize / 2;\n ctx.moveTo(cx - 3.5, cy - 1.5);\n ctx.lineTo(cx + 3.5, cy - 1.5);\n ctx.lineTo(cx, cy + 2.5);\n ctx.closePath();\n ctx.fill();\n }\n\n ctx.restore();\n}\n","import { IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { paintDropdown } from './DropdownPainter';\nimport { SelectEditor } from '../SelectColumn/SelectEditor';\n\nexport const DropdownColumnPlugin: IColumnTypePlugin<string> = {\n type: 'dropdown',\n paint: paintDropdown,\n editorComponent: SelectEditor,\n\n onPointerDown({ localX, column }) {\n if (localX > column.width - 28) {\n return { handled: true, shouldOpenEditor: true };\n }\n return { handled: false };\n },\n\n onKeyDown({ event, openEditor }) {\n if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {\n event.preventDefault();\n openEditor(event.key);\n return true;\n }\n if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault();\n openEditor();\n return true;\n }\n return false;\n },\n\n parseClipboard(text, column) {\n const clean = text.trim().toLowerCase();\n const match = column.options?.find(\n (o) => o.value.toLowerCase() === clean || o.label.toLowerCase() === clean\n );\n return match ? match.value : text.trim();\n },\n\n formatClipboard(value, column) {\n const match = column.options?.find((o) => o.value === value);\n return match ? match.label : String(value ?? '');\n },\n\n comparator(a, b) {\n return String(a ?? '').localeCompare(String(b ?? ''), 'tr-TR');\n },\n};\n","import React, { useEffect, useRef, useState } from 'react';\r\nimport { CellEditorProps } from '../../IColumnTypePlugin';\r\nimport { normalizeMultiValue } from './MultiSelectPainter';\r\n\r\nexport const MultiSelectEditor: React.FC<CellEditorProps<string[] | string>> = ({\r\n value,\r\n column,\r\n rect,\r\n theme,\r\n locale,\r\n initialChar,\r\n onCommit,\r\n onCancel,\r\n}) => {\r\n const options = column.options || [];\r\n const [selected, setSelected] = useState<string[]>(() => normalizeMultiValue(value));\r\n const [search, setSearch] = useState<string>(initialChar || '');\r\n const [highlightedIndex, setHighlightedIndex] = useState<number>(0);\r\n\r\n const containerRef = useRef<HTMLDivElement | null>(null);\r\n const inputRef = useRef<HTMLInputElement | null>(null);\r\n const latestSelectedRef = useRef<string[]>(selected);\r\n latestSelectedRef.current = selected;\r\n\r\n const isTR = locale?.code?.startsWith('tr');\r\n\r\n const filtered = options.filter(\r\n (o) =>\r\n o.label.toLowerCase().includes(search.toLowerCase()) ||\r\n o.value.toLowerCase().includes(search.toLowerCase())\r\n );\r\n\r\n useEffect(() => {\r\n inputRef.current?.focus();\r\n }, []);\r\n\r\n const commitValue = (items: string[], moveDir: 'none' | 'down' | 'left' | 'right') => {\r\n const sep = (column as any).separator || ', ';\r\n const cleanItems = items.map((s) => String(s).trim().replace(/^[\"'\\s]+|[\"'\\s]+$/g, '')).filter(Boolean);\r\n const finalVal = Array.isArray(value) && (column as any).saveAsArray ? cleanItems : cleanItems.join(sep);\r\n onCommit(finalVal, moveDir);\r\n };\r\n\r\n // Commit when clicking outside\r\n useEffect(() => {\r\n const handleOutside = (e: MouseEvent) => {\r\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\r\n commitValue(latestSelectedRef.current, 'none');\r\n }\r\n };\r\n document.addEventListener('mousedown', handleOutside, true);\r\n return () => document.removeEventListener('mousedown', handleOutside, true);\r\n }, [onCommit]);\r\n\r\n const toggleValue = (val: string) => {\r\n setSelected((prev) =>\r\n prev.includes(val) ? prev.filter((item) => item !== val) : [...prev, val]\r\n );\r\n };\r\n\r\n const handleSelectAll = () => {\r\n setSelected(options.map((o) => o.value));\r\n };\r\n\r\n const handleClearAll = () => {\r\n setSelected([]);\r\n };\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent) => {\r\n e.stopPropagation();\r\n if (e.key === 'ArrowDown') {\r\n e.preventDefault();\r\n setHighlightedIndex((prev) => Math.min(prev + 1, Math.max(0, filtered.length - 1)));\r\n } else if (e.key === 'ArrowUp') {\r\n e.preventDefault();\r\n setHighlightedIndex((prev) => Math.max(prev - 1, 0));\r\n } else if (e.key === ' ' && filtered[highlightedIndex] && search === '') {\r\n e.preventDefault();\r\n toggleValue(filtered[highlightedIndex].value);\r\n } else if (e.key === 'Enter') {\r\n e.preventDefault();\r\n commitValue(selected, 'down');\r\n } else if (e.key === 'Tab') {\r\n e.preventDefault();\r\n commitValue(selected, e.shiftKey ? 'left' : 'right');\r\n } else if (e.key === 'Escape') {\r\n e.preventDefault();\r\n onCancel();\r\n }\r\n };\r\n\r\n return (\r\n <div\r\n ref={containerRef}\r\n onMouseDown={(e) => e.stopPropagation()}\r\n onClick={(e) => e.stopPropagation()}\r\n onDoubleClick={(e) => e.stopPropagation()}\r\n style={{\r\n position: 'absolute',\r\n left: Math.max(4, rect.x),\r\n top: rect.y,\r\n minWidth: Math.max(rect.width, 235),\r\n zIndex: 125,\r\n backgroundColor: theme.dom.popoverBg,\r\n color: theme.dom.popoverText,\r\n border: `1px solid ${theme.dom.popoverBorder}`,\r\n borderRadius: 10,\r\n boxShadow: theme.dom.popoverShadow,\r\n backdropFilter: theme.dom.glassBackdrop,\r\n overflow: 'hidden',\r\n fontFamily: theme.fontFamily,\r\n userSelect: 'none',\r\n }}\r\n >\r\n {/* Search Box */}\r\n <div style={{ padding: 8, borderBottom: `1px solid ${theme.dom.popoverBorder}` }}>\r\n <input\r\n ref={inputRef}\r\n type=\"text\"\r\n value={search}\r\n onChange={(e) => {\r\n setSearch(e.target.value);\r\n setHighlightedIndex(0);\r\n }}\r\n onKeyDown={handleKeyDown}\r\n placeholder={isTR ? 'Çoklu seçim ara...' : 'Search multiple choices...'}\r\n style={{\r\n width: '100%',\r\n padding: '5px 8px',\r\n backgroundColor: theme.dom.inputBg,\r\n color: theme.dom.inputText,\r\n border: `1px solid ${theme.dom.inputBorder}`,\r\n borderRadius: 6,\r\n outline: 'none',\r\n fontSize: 12,\r\n fontFamily: theme.fontFamily,\r\n boxSizing: 'border-box',\r\n }}\r\n />\r\n <div\r\n style={{\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n marginTop: 6,\r\n fontSize: 11,\r\n }}\r\n >\r\n <span style={{ color: '#8E8E93', fontWeight: 600 }}>\r\n {isTR ? `${selected.length} seçildi` : `${selected.length} selected`}\r\n </span>\r\n <div style={{ display: 'flex', gap: 8 }}>\r\n <button\r\n type=\"button\"\r\n onClick={handleSelectAll}\r\n style={{\r\n border: 'none',\r\n background: 'none',\r\n color: theme.dom.accentColor,\r\n fontSize: 11,\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n padding: 0,\r\n }}\r\n >\r\n {isTR ? 'Tümünü Seç' : 'Select All'}\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={handleClearAll}\r\n style={{\r\n border: 'none',\r\n background: 'none',\r\n color: '#8E8E93',\r\n fontSize: 11,\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n padding: 0,\r\n }}\r\n >\r\n {isTR ? 'Temizle' : 'Clear'}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Multi-Checkbox Options List */}\r\n <div style={{ maxHeight: 200, overflowY: 'auto', padding: 4 }}>\r\n {filtered.length === 0 ? (\r\n <div style={{ padding: '8px 12px', fontSize: 12, color: '#8E8E93' }}>\r\n {locale?.noMatches || 'No matching options'}\r\n </div>\r\n ) : (\r\n filtered.map((opt, i) => {\r\n const isChecked = selected.includes(opt.value);\r\n const isHigh = i === highlightedIndex;\r\n return (\r\n <div\r\n key={opt.value}\r\n onClick={() => toggleValue(opt.value)}\r\n onMouseEnter={() => setHighlightedIndex(i)}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n padding: '6px 10px',\r\n borderRadius: 6,\r\n cursor: 'pointer',\r\n backgroundColor: isHigh\r\n ? theme.isDark\r\n ? 'rgba(255,255,255,0.08)'\r\n : 'rgba(0,0,0,0.05)'\r\n : 'transparent',\r\n fontSize: 12,\r\n }}\r\n >\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\r\n <input\r\n type=\"checkbox\"\r\n checked={isChecked}\r\n onChange={() => {}}\r\n style={{\r\n cursor: 'pointer',\r\n accentColor: theme.dom.accentColor,\r\n margin: 0,\r\n }}\r\n />\r\n <span\r\n style={{\r\n padding: '2px 7px',\r\n borderRadius: 4,\r\n fontSize: 11,\r\n fontWeight: 600,\r\n backgroundColor: theme.isDark\r\n ? opt.darkBg || 'rgba(99,102,241,0.18)'\r\n : opt.bg || '#E0E7FF',\r\n color: theme.isDark\r\n ? opt.darkFg || '#818CF8'\r\n : opt.fg || '#1E40AF',\r\n }}\r\n >\r\n {opt.label}\r\n </span>\r\n </div>\r\n </div>\r\n );\r\n })\r\n )}\r\n </div>\r\n\r\n {/* Footer Commit Buttons */}\r\n <div\r\n style={{\r\n display: 'flex',\r\n justifyContent: 'flex-end',\r\n gap: 6,\r\n padding: '6px 8px',\r\n borderTop: `1px solid ${theme.dom.popoverBorder}`,\r\n }}\r\n >\r\n <button\r\n type=\"button\"\r\n onClick={onCancel}\r\n style={{\r\n padding: '4px 10px',\r\n fontSize: 11,\r\n borderRadius: 5,\r\n border: `1px solid ${theme.dom.popoverBorder}`,\r\n backgroundColor: 'transparent',\r\n color: theme.dom.popoverText,\r\n cursor: 'pointer',\r\n }}\r\n >\r\n {locale?.cancel || (isTR ? 'İptal' : 'Cancel')}\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => onCommit(selected, 'none')}\r\n style={{\r\n padding: '4px 12px',\r\n fontSize: 11,\r\n fontWeight: 600,\r\n borderRadius: 5,\r\n border: 'none',\r\n backgroundColor: theme.dom.accentColor,\r\n color: '#FFFFFF',\r\n cursor: 'pointer',\r\n }}\r\n >\r\n {locale?.apply || (isTR ? 'Uygula' : 'Apply')} ({selected.length})\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import { IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { paintMultiSelect, normalizeMultiValue } from './MultiSelectPainter';\nimport { MultiSelectEditor } from './MultiSelectEditor';\n\nexport const MultiSelectColumnPlugin: IColumnTypePlugin<string[] | string> = {\n type: 'multiselect',\n paint: paintMultiSelect,\n editorComponent: MultiSelectEditor,\n\n onPointerDown({ localX, column }) {\n if (localX > column.width - 28) {\n return { handled: true, shouldOpenEditor: true };\n }\n return { handled: false };\n },\n\n onKeyDown({ event, openEditor }) {\n if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault();\n openEditor();\n return true;\n }\n if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {\n event.preventDefault();\n openEditor(event.key);\n return true;\n }\n return false;\n },\n\n parseClipboard(text, column) {\n const parts = normalizeMultiValue(text);\n if (!column.options || column.options.length === 0) return parts;\n return parts.map((p) => {\n const clean = p.toLowerCase();\n const match = column.options?.find(\n (o) => o.value.toLowerCase() === clean || o.label.toLowerCase() === clean\n );\n return match ? match.value : p;\n });\n },\n\n formatClipboard(value, column) {\n const items = normalizeMultiValue(value);\n return items\n .map((v) => {\n const match = column.options?.find((o) => o.value === v);\n return match ? match.label : v;\n })\n .join(', ');\n },\n\n comparator(a, b) {\n const strA = normalizeMultiValue(a).join(', ');\n const strB = normalizeMultiValue(b).join(', ');\n return strA.localeCompare(strB, 'tr-TR');\n },\n};\n","import { CellPaintContext } from '../../IColumnTypePlugin';\n\nfunction getInitials(label: string): string {\n const parts = label.trim().split(/\\s+/);\n if (parts.length >= 2) {\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n }\n return label.slice(0, 2).toUpperCase();\n}\n\nexport function paintLookup({\n ctx,\n value,\n column,\n theme,\n x,\n y,\n width,\n height,\n isHovered,\n isSelected,\n}: CellPaintContext<string>): void {\n const rawVal = value != null ? String(value) : '';\n if (!rawVal) return;\n\n const opt = column.options?.find((o) => String(o.value) === rawVal) || {\n value: rawVal,\n label: rawVal,\n };\n\n ctx.save();\n const centerY = y + height / 2;\n const avatarR = 10;\n const avatarCX = x + 8 + avatarR;\n\n // 1. Draw Circular Avatar Badge\n const avatarBg = theme.isDark\n ? opt.darkBg || 'rgba(139, 92, 246, 0.25)'\n : opt.bg || '#EDE9FE';\n const avatarFg = theme.isDark ? opt.darkFg || '#C4B5FD' : opt.fg || '#5B21B6';\n\n ctx.fillStyle = avatarBg;\n ctx.beginPath();\n ctx.arc(avatarCX, centerY, avatarR, 0, Math.PI * 2);\n ctx.fill();\n\n ctx.fillStyle = avatarFg;\n ctx.font = `700 9.5px ${theme.fontFamily}`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(getInitials(opt.label), avatarCX, centerY);\n\n // 2. Draw Primary Display Label + Subtitle clipped\n const textX = avatarCX + avatarR + 7;\n const maxTextW = width - (textX - x) - 22;\n\n if (maxTextW > 16) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(textX, y, maxTextW, height);\n ctx.clip();\n\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.font = `600 ${theme.fontSize - 1}px ${theme.fontFamily}`;\n ctx.fillStyle = theme.canvas.cellText;\n ctx.fillText(opt.label, textX, centerY);\n\n if (opt.subtitle) {\n const labelW = ctx.measureText(opt.label).width;\n ctx.font = `400 ${theme.fontSize - 2.5}px ${theme.fontFamily}`;\n ctx.fillStyle = theme.isDark ? '#94A3B8' : '#64748B';\n ctx.fillText(` · ${opt.subtitle}`, textX + labelW, centerY);\n }\n\n ctx.restore();\n }\n\n // 3. Draw Chevron\n ctx.fillStyle =\n isSelected || isHovered\n ? theme.dom.accentColor\n : theme.isDark\n ? '#64748B'\n : '#94A3B8';\n ctx.beginPath();\n const arrowX = x + width - 11;\n ctx.moveTo(arrowX - 3.5, centerY - 2);\n ctx.lineTo(arrowX + 3.5, centerY - 2);\n ctx.lineTo(arrowX, centerY + 2.5);\n ctx.closePath();\n ctx.fill();\n\n ctx.restore();\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { CellEditorProps } from '../../IColumnTypePlugin';\n\nexport const LookupEditor: React.FC<CellEditorProps<string>> = ({\n value,\n column,\n rect,\n theme,\n locale,\n initialChar,\n onCommit,\n onCancel,\n}) => {\n const options = column.options || [];\n const [search, setSearch] = useState<string>(initialChar || '');\n const [highlightedIndex, setHighlightedIndex] = useState<number>(0);\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const isTR = locale?.code?.startsWith('tr');\n\n const filtered = options.filter((o) => {\n const q = search.toLowerCase();\n return (\n o.label.toLowerCase().includes(q) ||\n o.value.toLowerCase().includes(q) ||\n (o.subtitle && o.subtitle.toLowerCase().includes(q))\n );\n });\n\n useEffect(() => {\n inputRef.current?.focus();\n }, []);\n\n useEffect(() => {\n const handleOutside = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n onCancel();\n }\n };\n document.addEventListener('mousedown', handleOutside, true);\n return () => document.removeEventListener('mousedown', handleOutside, true);\n }, [onCancel]);\n\n return (\n <div\n ref={containerRef}\n onMouseDown={(e) => e.stopPropagation()}\n onClick={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n style={{\n position: 'absolute',\n left: Math.max(4, rect.x),\n top: rect.y,\n minWidth: Math.max(rect.width, 250),\n zIndex: 128,\n backgroundColor: theme.dom.popoverBg,\n color: theme.dom.popoverText,\n border: `1px solid ${theme.dom.popoverBorder}`,\n borderRadius: 10,\n boxShadow: theme.dom.popoverShadow,\n backdropFilter: theme.dom.glassBackdrop,\n overflow: 'hidden',\n fontFamily: theme.fontFamily,\n userSelect: 'none',\n }}\n >\n <div style={{ padding: 8, borderBottom: `1px solid ${theme.dom.popoverBorder}` }}>\n <input\n ref={inputRef}\n type=\"text\"\n value={search}\n onChange={(e) => {\n setSearch(e.target.value);\n setHighlightedIndex(0);\n }}\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setHighlightedIndex((p) => Math.min(p + 1, Math.max(0, filtered.length - 1)));\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setHighlightedIndex((p) => Math.max(p - 1, 0));\n } else if (e.key === 'Enter' && filtered[highlightedIndex]) {\n e.preventDefault();\n onCommit(filtered[highlightedIndex].value, 'down');\n } else if (e.key === 'Escape') {\n e.preventDefault();\n onCancel();\n }\n }}\n placeholder={isTR ? 'Kayıt, isim veya ID ara...' : 'Search entity, name, or ID...'}\n style={{\n width: '100%',\n padding: '6px 9px',\n borderRadius: 6,\n border: `1px solid ${theme.dom.inputBorder}`,\n backgroundColor: theme.dom.inputBg,\n color: theme.dom.inputText,\n fontSize: 12,\n outline: 'none',\n boxSizing: 'border-box',\n }}\n />\n </div>\n\n <div style={{ maxHeight: 220, overflowY: 'auto', padding: 4 }}>\n {filtered.map((opt, idx) => {\n const isSelected = String(opt.value) === String(value);\n const isHigh = idx === highlightedIndex;\n return (\n <div\n key={opt.value}\n onClick={() => onCommit(opt.value, 'none')}\n onMouseEnter={() => setHighlightedIndex(idx)}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '7px 10px',\n borderRadius: 6,\n cursor: 'pointer',\n backgroundColor: isHigh\n ? theme.isDark\n ? 'rgba(255,255,255,0.08)'\n : 'rgba(0,0,0,0.05)'\n : 'transparent',\n }}\n >\n <div>\n <div style={{ fontWeight: 600, fontSize: 12.5 }}>{opt.label}</div>\n {opt.subtitle && (\n <div style={{ fontSize: 11, color: '#8E8E93' }}>{opt.subtitle}</div>\n )}\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>\n <span\n style={{\n fontSize: 10.5,\n fontFamily: 'monospace',\n padding: '2px 6px',\n borderRadius: 4,\n backgroundColor: theme.dom.badgeBg,\n color: theme.dom.badgeText,\n }}\n >\n {opt.value}\n </span>\n {isSelected && <span style={{ color: theme.dom.accentColor, fontWeight: 700 }}>✓</span>}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n","import { IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { paintLookup } from './LookupPainter';\nimport { LookupEditor } from './LookupEditor';\n\nexport const LookupColumnPlugin: IColumnTypePlugin<string> = {\n type: 'lookup',\n paint: paintLookup,\n editorComponent: LookupEditor,\n\n onPointerDown({ localX, column }) {\n if (localX > column.width - 26) {\n return { handled: true, shouldOpenEditor: true };\n }\n return { handled: false };\n },\n\n onKeyDown({ event, openEditor }) {\n if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault();\n openEditor();\n return true;\n }\n if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {\n event.preventDefault();\n openEditor(event.key);\n return true;\n }\n return false;\n },\n\n parseClipboard(text, column) {\n const clean = text.trim().toLowerCase();\n const match = column.options?.find(\n (o) => o.value.toLowerCase() === clean || o.label.toLowerCase() === clean\n );\n return match ? match.value : text.trim();\n },\n\n formatClipboard(value, column) {\n const match = column.options?.find((o) => o.value === value);\n return match ? match.label : String(value ?? '');\n },\n\n comparator(a, b) {\n return String(a ?? '').localeCompare(String(b ?? ''), 'tr-TR');\n },\n};\n","import { CellPaintContext } from '../../IColumnTypePlugin';\n\nexport function normalizeObjectValue(value: any): Record<string, any> {\n if (!value) return {};\n if (typeof value === 'object' && !Array.isArray(value)) {\n return value as Record<string, any>;\n }\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (!trimmed) return {};\n if (trimmed.startsWith('{') && trimmed.endsWith('}')) {\n try {\n const parsed = JSON.parse(trimmed);\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return parsed;\n }\n } catch {\n // Fallback to key:value parser below\n }\n }\n const out: Record<string, any> = {};\n const pairs = trimmed.split(/[,;|]/);\n for (const pair of pairs) {\n const idx = pair.indexOf(':');\n if (idx > 0) {\n const k = pair.slice(0, idx).trim();\n const rawV = pair.slice(idx + 1).trim();\n if (k) {\n if (rawV === 'true') out[k] = true;\n else if (rawV === 'false') out[k] = false;\n else if (rawV !== '' && !isNaN(Number(rawV))) out[k] = Number(rawV);\n else out[k] = rawV;\n }\n }\n }\n if (Object.keys(out).length > 0) return out;\n return { value: trimmed };\n }\n return { value };\n}\n\nexport function formatObjectSummary(value: any, displayKey?: string): string {\n const obj = normalizeObjectValue(value);\n const entries = Object.entries(obj);\n if (entries.length === 0) return '';\n\n if (displayKey && obj[displayKey] !== undefined) {\n const primary = String(obj[displayKey]);\n const rest = entries\n .filter(([k]) => k !== displayKey)\n .map(([k, v]) => `${k}: ${String(v)}`)\n .join(' • ');\n return rest ? `${primary} (${rest})` : primary;\n }\n\n return entries.map(([k, v]) => `${k}: ${String(v)}`).join(' • ');\n}\n\nexport function paintObject({\n ctx,\n value,\n column,\n theme,\n x,\n y,\n width,\n height,\n isHovered,\n isSelected,\n}: CellPaintContext<Record<string, any>>): void {\n const obj = normalizeObjectValue(value);\n const entries = Object.entries(obj);\n\n ctx.save();\n const pad = 8;\n const centerY = y + height / 2;\n\n // 1. Draw {N} Object Badge\n const badgeText = `{${entries.length}}`;\n ctx.font = `700 ${theme.fontSize - 3}px monospace`;\n const badgeW = Math.max(24, ctx.measureText(badgeText).width + 10);\n const badgeH = 18;\n const badgeX = x + pad;\n const badgeY = centerY - badgeH / 2;\n\n ctx.fillStyle = theme.isDark ? 'rgba(56, 189, 248, 0.16)' : 'rgba(2, 132, 199, 0.1)';\n ctx.beginPath();\n ctx.roundRect(badgeX, badgeY, badgeW, badgeH, 4);\n ctx.fill();\n\n ctx.strokeStyle = theme.isDark ? 'rgba(56, 189, 248, 0.35)' : 'rgba(2, 132, 199, 0.25)';\n ctx.lineWidth = 1;\n ctx.stroke();\n\n ctx.fillStyle = theme.isDark ? '#38BDF8' : '#0284C7';\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(badgeText, badgeX + badgeW / 2, centerY);\n\n // 2. Draw Key-Value Summary Text clipped\n const textStartX = badgeX + badgeW + 7;\n const maxTextW = width - (textStartX - x) - 24;\n\n if (maxTextW > 16 && entries.length > 0) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(textStartX, y, maxTextW, height);\n ctx.clip();\n\n const summary = formatObjectSummary(obj, column.objectDisplayKey);\n ctx.font = `500 ${theme.fontSize - 1}px ${theme.fontFamily}`;\n ctx.fillStyle = theme.canvas.cellText;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillText(summary, textStartX, centerY);\n ctx.restore();\n }\n\n // 3. Draw Inspector Icon on right\n ctx.fillStyle =\n isSelected || isHovered\n ? theme.dom.accentColor\n : theme.isDark\n ? '#64748B'\n : '#94A3B8';\n ctx.font = `700 11px ${theme.fontFamily}`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText('⤢', x + width - 12, centerY);\n\n ctx.restore();\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { CellEditorProps } from '../../IColumnTypePlugin';\nimport { normalizeObjectValue } from './ObjectPainter';\n\ninterface KeyValuePair {\n key: string;\n value: string;\n}\n\nfunction parseScalarValue(raw: string): any {\n const trimmed = raw.trim();\n if (trimmed === 'true') return true;\n if (trimmed === 'false') return false;\n if (trimmed === 'null') return null;\n if (trimmed !== '' && !isNaN(Number(trimmed))) return Number(trimmed);\n return raw;\n}\n\nexport const ObjectEditor: React.FC<CellEditorProps<Record<string, any>>> = ({\n value,\n column,\n rect,\n theme,\n locale,\n onCommit,\n onCancel,\n}) => {\n const initialObj = normalizeObjectValue(value);\n const [mode, setMode] = useState<'kv' | 'json'>('kv');\n const [pairs, setPairs] = useState<KeyValuePair[]>(() => {\n const entries = Object.entries(initialObj);\n return entries.length > 0\n ? entries.map(([k, v]) => ({\n key: k,\n value: typeof v === 'object' ? JSON.stringify(v) : String(v ?? ''),\n }))\n : [{ key: 'key', value: '' }];\n });\n const [jsonText, setJsonText] = useState<string>(() => JSON.stringify(initialObj, null, 2));\n const [jsonError, setJsonError] = useState<string | null>(null);\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const isTR = locale?.code?.startsWith('tr');\n\n const buildObjectFromPairs = (list: KeyValuePair[]): Record<string, any> => {\n const out: Record<string, any> = {};\n for (const item of list) {\n const k = item.key.trim();\n if (!k) continue;\n out[k] = parseScalarValue(item.value);\n }\n return out;\n };\n\n const handleSave = (moveDir: 'down' | 'right' | 'left' | 'none' = 'none') => {\n if (mode === 'json') {\n try {\n const parsed = JSON.parse(jsonText || '{}');\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n setJsonError(isTR ? 'Geçerli bir JSON nesnesi ({...}) girin' : 'Must be a valid JSON object ({...})');\n return;\n }\n onCommit(parsed, moveDir);\n } catch (err: any) {\n setJsonError(err?.message || 'Invalid JSON');\n }\n } else {\n onCommit(buildObjectFromPairs(pairs), moveDir);\n }\n };\n\n useEffect(() => {\n const handleOutside = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n handleSave('none');\n }\n };\n document.addEventListener('mousedown', handleOutside, true);\n return () => document.removeEventListener('mousedown', handleOutside, true);\n });\n\n const switchMode = (nextMode: 'kv' | 'json') => {\n if (nextMode === mode) return;\n if (nextMode === 'json') {\n const obj = buildObjectFromPairs(pairs);\n setJsonText(JSON.stringify(obj, null, 2));\n setJsonError(null);\n setMode('json');\n } else {\n try {\n const parsed = JSON.parse(jsonText || '{}');\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n setPairs(\n Object.entries(parsed).map(([k, v]) => ({\n key: k,\n value: typeof v === 'object' ? JSON.stringify(v) : String(v ?? ''),\n }))\n );\n setJsonError(null);\n setMode('kv');\n }\n } catch {\n setJsonError(isTR ? 'JSON hatası düzeltilmeden geçiş yapılamaz' : 'Fix JSON syntax error first');\n }\n }\n };\n\n return (\n <div\n ref={containerRef}\n onMouseDown={(e) => e.stopPropagation()}\n onClick={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.key === 'Escape') {\n e.preventDefault();\n onCancel();\n } else if (e.key === 'Enter' && (e.ctrlKey || e.metaKey)) {\n e.preventDefault();\n handleSave('down');\n }\n }}\n style={{\n position: 'absolute',\n left: Math.max(4, rect.x),\n top: rect.y,\n width: Math.max(rect.width, 320),\n zIndex: 130,\n backgroundColor: theme.dom.popoverBg,\n color: theme.dom.popoverText,\n border: `1px solid ${theme.dom.popoverBorder}`,\n borderRadius: 10,\n boxShadow: theme.dom.popoverShadow,\n backdropFilter: theme.dom.glassBackdrop,\n overflow: 'hidden',\n fontFamily: theme.fontFamily,\n userSelect: 'none',\n }}\n >\n {/* Header & Mode Switcher */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '8px 10px',\n borderBottom: `1px solid ${theme.dom.popoverBorder}`,\n backgroundColor: theme.isDark ? 'rgba(255,255,255,0.03)' : 'rgba(0,0,0,0.02)',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 6, fontSize: 12, fontWeight: 700 }}>\n <span style={{ color: theme.dom.accentColor, fontFamily: 'monospace' }}>{'{ }'}</span>\n <span>{column.title}</span>\n </div>\n <div style={{ display: 'flex', gap: 4 }}>\n <button\n type=\"button\"\n onClick={() => switchMode('kv')}\n style={{\n padding: '3px 8px',\n fontSize: 11,\n fontWeight: 600,\n borderRadius: 5,\n border: 'none',\n cursor: 'pointer',\n backgroundColor: mode === 'kv' ? theme.dom.accentColor : 'transparent',\n color: mode === 'kv' ? '#FFFFFF' : theme.dom.popoverText,\n }}\n >\n Key-Value\n </button>\n <button\n type=\"button\"\n onClick={() => switchMode('json')}\n style={{\n padding: '3px 8px',\n fontSize: 11,\n fontWeight: 600,\n borderRadius: 5,\n border: 'none',\n cursor: 'pointer',\n backgroundColor: mode === 'json' ? theme.dom.accentColor : 'transparent',\n color: mode === 'json' ? '#FFFFFF' : theme.dom.popoverText,\n }}\n >\n JSON\n </button>\n </div>\n </div>\n\n {/* Body */}\n <div style={{ padding: 10, maxHeight: 230, overflowY: 'auto' }}>\n {mode === 'kv' ? (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n {pairs.map((p, idx) => (\n <div key={idx} style={{ display: 'flex', alignItems: 'center', gap: 6 }}>\n <input\n type=\"text\"\n value={p.key}\n placeholder=\"key\"\n onChange={(e) => {\n const next = [...pairs];\n next[idx] = { ...next[idx], key: e.target.value };\n setPairs(next);\n }}\n style={{\n width: 100,\n padding: '5px 7px',\n borderRadius: 5,\n border: `1px solid ${theme.dom.inputBorder}`,\n backgroundColor: theme.dom.inputBg,\n color: theme.dom.accentColor,\n fontSize: 12,\n fontFamily: 'monospace',\n fontWeight: 600,\n outline: 'none',\n }}\n />\n <span style={{ color: '#8E8E93', fontWeight: 700 }}>:</span>\n <input\n type=\"text\"\n value={p.value}\n placeholder=\"value\"\n onChange={(e) => {\n const next = [...pairs];\n next[idx] = { ...next[idx], value: e.target.value };\n setPairs(next);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleSave('down');\n }\n }}\n style={{\n flex: 1,\n padding: '5px 7px',\n borderRadius: 5,\n border: `1px solid ${theme.dom.inputBorder}`,\n backgroundColor: theme.dom.inputBg,\n color: theme.dom.inputText,\n fontSize: 12,\n outline: 'none',\n }}\n />\n <button\n type=\"button\"\n onClick={() => setPairs((prev) => prev.filter((_, i) => i !== idx))}\n style={{\n border: 'none',\n background: 'transparent',\n color: '#EF4444',\n cursor: 'pointer',\n fontSize: 12,\n padding: '2px 4px',\n }}\n title={isTR ? 'Alanı Sil' : 'Remove Field'}\n >\n ✕\n </button>\n </div>\n ))}\n <button\n type=\"button\"\n onClick={() => setPairs((prev) => [...prev, { key: '', value: '' }])}\n style={{\n alignSelf: 'flex-start',\n marginTop: 4,\n padding: '4px 9px',\n borderRadius: 5,\n border: `1px dashed ${theme.dom.popoverBorder}`,\n backgroundColor: 'transparent',\n color: theme.dom.accentColor,\n fontSize: 11.5,\n fontWeight: 600,\n cursor: 'pointer',\n }}\n >\n + {isTR ? 'Alan Ekle (Key-Value)' : 'Add Property'}\n </button>\n </div>\n ) : (\n <div>\n <textarea\n value={jsonText}\n onChange={(e) => {\n setJsonText(e.target.value);\n setJsonError(null);\n }}\n rows={6}\n style={{\n width: '100%',\n padding: 8,\n borderRadius: 6,\n border: `1px solid ${jsonError ? '#EF4444' : theme.dom.inputBorder}`,\n backgroundColor: theme.dom.inputBg,\n color: theme.dom.inputText,\n fontFamily: 'monospace',\n fontSize: 12,\n outline: 'none',\n boxSizing: 'border-box',\n resize: 'vertical',\n }}\n />\n {jsonError && (\n <div style={{ color: '#EF4444', fontSize: 11, marginTop: 4, fontWeight: 600 }}>\n ⚠ {jsonError}\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '6px 10px',\n borderTop: `1px solid ${theme.dom.popoverBorder}`,\n }}\n >\n <span style={{ fontSize: 10.5, color: '#8E8E93' }}>\n {isTR ? 'Ctrl+Enter ile kaydet' : 'Ctrl+Enter to save'}\n </span>\n <div style={{ display: 'flex', gap: 6 }}>\n <button\n type=\"button\"\n onClick={onCancel}\n style={{\n padding: '4px 10px',\n fontSize: 11,\n borderRadius: 5,\n border: `1px solid ${theme.dom.popoverBorder}`,\n backgroundColor: 'transparent',\n color: theme.dom.popoverText,\n cursor: 'pointer',\n }}\n >\n {isTR ? 'İptal' : 'Cancel'}\n </button>\n <button\n type=\"button\"\n onClick={() => handleSave('none')}\n style={{\n padding: '4px 12px',\n fontSize: 11,\n fontWeight: 600,\n borderRadius: 5,\n border: 'none',\n backgroundColor: theme.dom.accentColor,\n color: '#FFFFFF',\n cursor: 'pointer',\n }}\n >\n {isTR ? 'Uygula' : 'Apply'}\n </button>\n </div>\n </div>\n </div>\n );\n};\n","import { IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { paintObject, normalizeObjectValue, formatObjectSummary } from './ObjectPainter';\nimport { ObjectEditor } from './ObjectEditor';\n\nexport const ObjectColumnPlugin: IColumnTypePlugin<Record<string, any>> = {\n type: 'object',\n paint: paintObject,\n editorComponent: ObjectEditor,\n\n onPointerDown({ localX, column }) {\n if (localX > column.width - 26) {\n return { handled: true, shouldOpenEditor: true };\n }\n return { handled: false };\n },\n\n onKeyDown({ event, openEditor }) {\n if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault();\n openEditor();\n return true;\n }\n return false;\n },\n\n parseClipboard(text) {\n return normalizeObjectValue(text);\n },\n\n formatClipboard(value) {\n const obj = normalizeObjectValue(value);\n return JSON.stringify(obj);\n },\n\n comparator(a, b) {\n const strA = formatObjectSummary(a);\n const strB = formatObjectSummary(b);\n return strA.localeCompare(strB, 'tr-TR');\n },\n};\n","import { CellPaintContext } from '../../IColumnTypePlugin';\nimport { FilterEngine } from '../../../core/FilterEngine';\n\nexport function paintDate({\n ctx,\n value,\n theme,\n locale,\n x,\n y,\n width,\n height,\n isHovered,\n isSelected,\n}: CellPaintContext<string | Date>): void {\n ctx.save();\n\n if (value) {\n const dateStr = FilterEngine.formatLocalizedDate(value, locale?.code);\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(x + 8, y, Math.max(0, width - 30), height);\n ctx.clip();\n\n ctx.fillStyle = theme.canvas.cellText;\n ctx.font = `normal ${theme.fontSize}px ${theme.fontFamily}`;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillText(dateStr, x + 8, y + height / 2);\n ctx.restore();\n }\n\n // Subtle Calendar Icon on right side of cell\n if (width > 60) {\n const iconX = x + width - 19;\n const iconY = y + height / 2 - 6;\n ctx.strokeStyle = isSelected || isHovered\n ? theme.dom.accentColor\n : theme.isDark\n ? 'rgba(255,255,255,0.35)'\n : 'rgba(0,0,0,0.35)';\n ctx.lineWidth = 1.2;\n ctx.strokeRect(iconX, iconY + 1, 11, 10);\n ctx.beginPath();\n ctx.moveTo(iconX, iconY + 4);\n ctx.lineTo(iconX + 11, iconY + 4);\n ctx.moveTo(iconX + 3, iconY - 1);\n ctx.lineTo(iconX + 3, iconY + 2);\n ctx.moveTo(iconX + 8, iconY - 1);\n ctx.lineTo(iconX + 8, iconY + 2);\n ctx.stroke();\n }\n\n ctx.restore();\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { CellEditorProps } from '../../IColumnTypePlugin';\nimport { FilterEngine } from '../../../core/FilterEngine';\nimport { MaterialIcon } from '../../../ui/MaterialIcon';\n\nfunction parseIsoParts(raw: any): { year: number; month: number; day: number; formatted: string } {\n const now = new Date();\n if (!raw) {\n const y = now.getFullYear();\n const m = now.getMonth() + 1;\n const d = now.getDate();\n return {\n year: y,\n month: m,\n day: d,\n formatted: `${y}-${String(m).padStart(2, '0')}-${String(d).padStart(2, '0')}`,\n };\n }\n const str = String(raw).trim();\n const isoMatch = str.match(/^(\\d{4})-(\\d{1,2})-(\\d{1,2})/);\n if (isoMatch) {\n const y = parseInt(isoMatch[1], 10);\n const m = parseInt(isoMatch[2], 10);\n const d = parseInt(isoMatch[3], 10);\n return {\n year: y,\n month: m,\n day: d,\n formatted: `${y}-${String(m).padStart(2, '0')}-${String(d).padStart(2, '0')}`,\n };\n }\n const dmyMatch = str.match(/^(\\d{1,2})[./-](\\d{1,2})[./-](\\d{4})/);\n if (dmyMatch) {\n const d = parseInt(dmyMatch[1], 10);\n const m = parseInt(dmyMatch[2], 10);\n const y = parseInt(dmyMatch[3], 10);\n return {\n year: y,\n month: m,\n day: d,\n formatted: `${y}-${String(m).padStart(2, '0')}-${String(d).padStart(2, '0')}`,\n };\n }\n const parsed = new Date(str);\n if (!isNaN(parsed.getTime())) {\n const y = parsed.getFullYear();\n const m = parsed.getMonth() + 1;\n const d = parsed.getDate();\n return {\n year: y,\n month: m,\n day: d,\n formatted: `${y}-${String(m).padStart(2, '0')}-${String(d).padStart(2, '0')}`,\n };\n }\n return {\n year: now.getFullYear(),\n month: now.getMonth() + 1,\n day: now.getDate(),\n formatted: str,\n };\n}\n\nexport const DateEditor: React.FC<CellEditorProps<string>> = ({\n value,\n rect,\n theme,\n locale,\n onCommit,\n onCancel,\n}) => {\n const initial = parseIsoParts(value);\n const localeCode = locale?.code || 'tr-TR';\n const [dateVal, setDateVal] = useState<string>(() =>\n value ? FilterEngine.formatLocalizedDate(initial.formatted, localeCode) : ''\n );\n const [viewYear, setViewYear] = useState<number>(initial.year);\n const [viewMonth, setViewMonth] = useState<number>(initial.month); // 1..12\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const latestValRef = useRef<string>(dateVal);\n latestValRef.current = dateVal;\n\n const normalizeCommitValue = (rawStr: string): string => {\n const trimmed = rawStr.trim();\n if (!trimmed) return '';\n const parsed = FilterEngine.parseDateParts(trimmed);\n return parsed ? parsed.isoDate : trimmed;\n };\n\n useEffect(() => {\n inputRef.current?.focus();\n inputRef.current?.select();\n }, []);\n\n // Close & commit when clicking outside the DateEditor container\n useEffect(() => {\n const handleOutsideMouseDown = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n onCommit(normalizeCommitValue(latestValRef.current), 'none');\n }\n };\n document.addEventListener('mousedown', handleOutsideMouseDown, true);\n return () => {\n document.removeEventListener('mousedown', handleOutsideMouseDown, true);\n };\n }, [onCommit]);\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n e.stopPropagation();\n if (e.key === 'Enter') {\n e.preventDefault();\n onCommit(normalizeCommitValue(dateVal), e.shiftKey ? 'none' : 'down');\n } else if (e.key === 'Tab') {\n e.preventDefault();\n onCommit(normalizeCommitValue(dateVal), e.shiftKey ? 'left' : 'right');\n } else if (e.key === 'Escape') {\n e.preventDefault();\n onCancel();\n }\n };\n\n const handlePrevMonth = () => {\n if (viewMonth === 1) {\n setViewMonth(12);\n setViewYear((y) => y - 1);\n } else {\n setViewMonth((m) => m - 1);\n }\n };\n\n const handleNextMonth = () => {\n if (viewMonth === 12) {\n setViewMonth(1);\n setViewYear((y) => y + 1);\n } else {\n setViewMonth((m) => m + 1);\n }\n };\n\n const selectDay = (day: number) => {\n const nextIso = `${viewYear}-${String(viewMonth).padStart(2, '0')}-${String(day).padStart(2, '0')}`;\n setDateVal(nextIso);\n onCommit(nextIso, 'none');\n };\n\n const selectToday = () => {\n const now = new Date();\n const nextIso = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}`;\n setDateVal(nextIso);\n onCommit(nextIso, 'none');\n };\n\n // Build days in current month view\n const daysInMonth = new Date(viewYear, viewMonth, 0).getDate();\n const firstDayOfWeek = (new Date(viewYear, viewMonth - 1, 1).getDay() + 6) % 7; // Monday = 0\n const cells: Array<number | null> = [];\n for (let i = 0; i < firstDayOfWeek; i++) cells.push(null);\n for (let d = 1; d <= daysInMonth; d++) cells.push(d);\n\n const isTR = locale?.code?.startsWith('tr');\n const monthNames = isTR\n ? ['Ocak', 'Şubat', 'Mart', 'Nisan', 'Mayıs', 'Haziran', 'Temmuz', 'Ağustos', 'Eylül', 'Ekim', 'Kasım', 'Aralık']\n : ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n const weekDays = isTR\n ? ['Pt', 'Sa', 'Ça', 'Pe', 'Cu', 'Ct', 'Pz']\n : ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'];\n\n const selectedParts = dateVal ? parseIsoParts(dateVal) : null;\n\n return (\n <div\n ref={containerRef}\n onMouseDown={(e) => e.stopPropagation()}\n onClick={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n style={{\n position: 'absolute',\n left: Math.max(4, rect.x),\n top: rect.y,\n zIndex: 120,\n fontFamily: theme.fontFamily,\n }}\n >\n {/* Inline Cell Input */}\n <div\n style={{\n width: Math.max(rect.width, 145),\n height: rect.height,\n backgroundColor: theme.dom.inputBg,\n border: `2px solid ${theme.dom.inputFocusBorder}`,\n borderRadius: 4,\n display: 'flex',\n alignItems: 'center',\n boxSizing: 'border-box',\n boxShadow: theme.dom.popoverShadow,\n }}\n >\n <input\n ref={inputRef}\n type=\"text\"\n value={dateVal}\n placeholder={isTR ? 'GG.AA.YYYY' : 'MM/DD/YYYY'}\n onChange={(e) => {\n const val = e.target.value;\n setDateVal(val);\n const p = FilterEngine.parseDateParts(val);\n if (p) {\n setViewYear(p.year);\n setViewMonth(p.month);\n }\n }}\n onKeyDown={handleKeyDown}\n style={{\n width: '100%',\n height: '100%',\n padding: '0 8px',\n boxSizing: 'border-box',\n backgroundColor: 'transparent',\n color: theme.dom.inputText,\n border: 'none',\n outline: 'none',\n fontFamily: theme.fontFamily,\n fontSize: `${theme.fontSize}px`,\n }}\n />\n </div>\n\n {/* Interactive Calendar Dropdown */}\n <div\n style={{\n marginTop: 4,\n width: 236,\n padding: 10,\n backgroundColor: theme.dom.popoverBg,\n color: theme.dom.popoverText,\n border: `1px solid ${theme.dom.popoverBorder}`,\n borderRadius: 10,\n boxShadow: theme.dom.popoverShadow,\n backdropFilter: theme.dom.glassBackdrop,\n userSelect: 'none',\n }}\n >\n {/* Header: Month / Year Navigation */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 8,\n }}\n >\n <button\n type=\"button\"\n onClick={handlePrevMonth}\n style={{\n width: 26,\n height: 26,\n borderRadius: 6,\n border: `1px solid ${theme.dom.popoverBorder}`,\n backgroundColor: 'transparent',\n color: theme.dom.popoverText,\n cursor: 'pointer',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 0,\n }}\n >\n <MaterialIcon name=\"chevron_left\" size={16} color={theme.dom.popoverText} />\n </button>\n <div style={{ display: 'flex', alignItems: 'center', gap: 4 }}>\n <select\n value={viewYear}\n onChange={(e) => setViewYear(Number(e.target.value))}\n style={{\n padding: '2px 4px',\n fontSize: 11.5,\n fontWeight: 700,\n borderRadius: 5,\n border: `1px solid ${theme.dom.popoverBorder}`,\n backgroundColor: theme.dom.inputBg,\n color: theme.dom.popoverText,\n outline: 'none',\n cursor: 'pointer',\n }}\n >\n {Array.from({ length: 41 }, (_, i) => new Date().getFullYear() - 25 + i).map((yr) => (\n <option key={yr} value={yr}>\n {yr}\n </option>\n ))}\n </select>\n <MaterialIcon name=\"chevron_right\" size={13} color=\"#8E8E93\" />\n <select\n value={viewMonth}\n onChange={(e) => setViewMonth(Number(e.target.value))}\n style={{\n padding: '2px 4px',\n fontSize: 11.5,\n fontWeight: 600,\n borderRadius: 5,\n border: `1px solid ${theme.dom.popoverBorder}`,\n backgroundColor: theme.dom.inputBg,\n color: theme.dom.popoverText,\n outline: 'none',\n cursor: 'pointer',\n }}\n >\n {monthNames.map((mName, i) => (\n <option key={i + 1} value={i + 1}>\n {String(i + 1).padStart(2, '0')} - {mName}\n </option>\n ))}\n </select>\n </div>\n <button\n type=\"button\"\n onClick={handleNextMonth}\n style={{\n width: 26,\n height: 26,\n borderRadius: 6,\n border: `1px solid ${theme.dom.popoverBorder}`,\n backgroundColor: 'transparent',\n color: theme.dom.popoverText,\n cursor: 'pointer',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 0,\n }}\n >\n <MaterialIcon name=\"chevron_right\" size={16} color={theme.dom.popoverText} />\n </button>\n </div>\n\n {/* Weekday Headers */}\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(7, 1fr)',\n gap: 2,\n marginBottom: 4,\n textAlign: 'center',\n fontSize: 10,\n fontWeight: 600,\n color: '#8E8E93',\n }}\n >\n {weekDays.map((wd) => (\n <div key={wd} style={{ padding: '2px 0' }}>\n {wd}\n </div>\n ))}\n </div>\n\n {/* Days Grid */}\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(7, 1fr)',\n gap: 2,\n }}\n >\n {cells.map((day, idx) => {\n if (day === null) {\n return <div key={`empty_${idx}`} style={{ height: 26 }} />;\n }\n const isSelectedDay =\n selectedParts &&\n selectedParts.year === viewYear &&\n selectedParts.month === viewMonth &&\n selectedParts.day === day;\n\n return (\n <button\n key={day}\n type=\"button\"\n onClick={() => selectDay(day)}\n style={{\n height: 26,\n borderRadius: 6,\n border: 'none',\n backgroundColor: isSelectedDay\n ? theme.dom.accentColor\n : 'transparent',\n color: isSelectedDay ? '#FFFFFF' : theme.dom.popoverText,\n fontWeight: isSelectedDay ? 700 : 500,\n fontSize: 11,\n cursor: 'pointer',\n transition: 'background 0.12s',\n }}\n >\n {day}\n </button>\n );\n })}\n </div>\n\n {/* Footer Actions: Clear & Today */}\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n marginTop: 8,\n paddingTop: 8,\n borderTop: `1px solid ${theme.dom.popoverBorder}`,\n }}\n >\n <button\n type=\"button\"\n onClick={() => onCommit('', 'none')}\n style={{\n padding: '4px 8px',\n fontSize: 11,\n borderRadius: 4,\n border: `1px solid ${theme.dom.popoverBorder}`,\n backgroundColor: 'transparent',\n color: theme.dom.popoverText,\n cursor: 'pointer',\n }}\n >\n {locale?.clear || 'Clear'}\n </button>\n <button\n type=\"button\"\n onClick={selectToday}\n style={{\n padding: '4px 10px',\n fontSize: 11,\n fontWeight: 600,\n borderRadius: 4,\n border: 'none',\n backgroundColor: theme.dom.accentColor,\n color: '#FFFFFF',\n cursor: 'pointer',\n }}\n >\n {isTR ? 'Bugün' : 'Today'}\n </button>\n </div>\n </div>\n </div>\n );\n};\n","import { IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { paintDate } from './DatePainter';\nimport { DateEditor } from './DateEditor';\n\nexport const DateColumnPlugin: IColumnTypePlugin<string> = {\n type: 'date',\n paint: paintDate,\n editorComponent: DateEditor,\n\n onPointerDown({ localX, column }) {\n if (localX > column.width - 28) {\n return { handled: true, shouldOpenEditor: true };\n }\n return { handled: false };\n },\n\n onKeyDown({ event, openEditor }) {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n openEditor();\n return true;\n }\n if (/^[0-9]$/.test(event.key) && !event.ctrlKey && !event.metaKey && !event.altKey) {\n event.preventDefault();\n openEditor(event.key);\n return true;\n }\n return false;\n },\n\n parseClipboard(text) {\n const raw = text.trim();\n // Convert DD.MM.YYYY to YYYY-MM-DD if pasted in European format\n const dmy = raw.match(/^(\\d{1,2})[./-](\\d{1,2})[./-](\\d{4})$/);\n if (dmy) {\n return `${dmy[3]}-${dmy[2].padStart(2, '0')}-${dmy[1].padStart(2, '0')}`;\n }\n return raw;\n },\n\n formatClipboard(value) {\n return value != null ? String(value) : '';\n },\n\n comparator(a, b) {\n const timeA = a ? new Date(a).getTime() : 0;\n const timeB = b ? new Date(b).getTime() : 0;\n return timeA - timeB;\n },\n};\n","import { CellPaintContext } from '../../IColumnTypePlugin';\nimport { FilterEngine } from '../../../core/FilterEngine';\n\nexport function formatDateTimeDisplay(\n value: string | Date,\n localeCode: string = 'tr-TR'\n): { datePart: string; timePart: string } {\n if (!value) return { datePart: '', timePart: '' };\n const parsed = FilterEngine.parseDateParts(value);\n if (parsed) {\n const hh = String(parsed.hasTime ? parsed.hour : 9).padStart(2, '0');\n const mm = String(parsed.hasTime ? parsed.minute : 0).padStart(2, '0');\n return {\n datePart: FilterEngine.formatLocalizedDate(value, localeCode),\n timePart: `${hh}:${mm}`,\n };\n }\n return { datePart: String(value), timePart: '' };\n}\n\nexport function paintDateTime({\n ctx,\n value,\n theme,\n locale,\n x,\n y,\n width,\n height,\n isHovered,\n isSelected,\n}: CellPaintContext<string | Date>): void {\n ctx.save();\n\n if (value) {\n const { datePart, timePart } = formatDateTimeDisplay(value, locale?.code);\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(x + 8, y, Math.max(0, width - 30), height);\n ctx.clip();\n\n ctx.fillStyle = theme.canvas.cellText;\n ctx.font = `normal ${theme.fontSize}px ${theme.fontFamily}`;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillText(datePart, x + 8, y + height / 2);\n\n if (timePart) {\n const dateW = ctx.measureText(datePart).width;\n const pillX = x + 14 + dateW;\n const pillH = 18;\n const pillY = y + (height - pillH) / 2;\n\n ctx.font = `600 ${theme.fontSize - 2}px monospace`;\n const timeW = ctx.measureText(timePart).width + 10;\n\n ctx.fillStyle = theme.isDark ? 'rgba(56, 189, 248, 0.14)' : 'rgba(2, 132, 199, 0.09)';\n ctx.beginPath();\n ctx.roundRect(pillX, pillY, timeW, pillH, 4);\n ctx.fill();\n\n ctx.fillStyle = theme.isDark ? '#38BDF8' : '#0284C7';\n ctx.fillText(timePart, pillX + 5, y + height / 2);\n }\n\n ctx.restore();\n }\n\n // Calendar + Clock Icon on right side of cell\n if (width > 70) {\n const iconX = x + width - 19;\n const iconY = y + height / 2 - 6;\n ctx.strokeStyle =\n isSelected || isHovered\n ? theme.dom.accentColor\n : theme.isDark\n ? 'rgba(255,255,255,0.35)'\n : 'rgba(0,0,0,0.35)';\n ctx.lineWidth = 1.2;\n ctx.strokeRect(iconX, iconY + 1, 11, 10);\n ctx.beginPath();\n ctx.moveTo(iconX, iconY + 4);\n ctx.lineTo(iconX + 11, iconY + 4);\n ctx.moveTo(iconX + 3, iconY - 1);\n ctx.lineTo(iconX + 3, iconY + 2);\n ctx.moveTo(iconX + 8, iconY - 1);\n ctx.lineTo(iconX + 8, iconY + 2);\n ctx.stroke();\n }\n\n ctx.restore();\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { CellEditorProps } from '../../IColumnTypePlugin';\nimport { FilterEngine } from '../../../core/FilterEngine';\nimport { MaterialIcon } from '../../../ui/MaterialIcon';\n\ninterface ParsedDateTime {\n year: number;\n month: number;\n day: number;\n hour: number;\n minute: number;\n formatted: string;\n}\n\nfunction parseDateTimeParts(raw: any): ParsedDateTime {\n const now = new Date();\n if (!raw) {\n const y = now.getFullYear();\n const m = now.getMonth() + 1;\n const d = now.getDate();\n const hh = now.getHours();\n const mm = now.getMinutes();\n return {\n year: y,\n month: m,\n day: d,\n hour: hh,\n minute: mm,\n formatted: `${y}-${String(m).padStart(2, '0')}-${String(d).padStart(2, '0')} ${String(hh).padStart(2, '0')}:${String(mm).padStart(2, '0')}`,\n };\n }\n const str = String(raw).trim();\n const isoMatch = str.match(\n /^(\\d{4})-(\\d{1,2})-(\\d{1,2})(?:[T\\s]+(\\d{1,2}):(\\d{1,2}))?/\n );\n if (isoMatch) {\n const y = parseInt(isoMatch[1], 10);\n const m = parseInt(isoMatch[2], 10);\n const d = parseInt(isoMatch[3], 10);\n const hh = isoMatch[4] !== undefined ? parseInt(isoMatch[4], 10) : 9;\n const mm = isoMatch[5] !== undefined ? parseInt(isoMatch[5], 10) : 0;\n return {\n year: y,\n month: m,\n day: d,\n hour: hh,\n minute: mm,\n formatted: `${y}-${String(m).padStart(2, '0')}-${String(d).padStart(2, '0')} ${String(hh).padStart(2, '0')}:${String(mm).padStart(2, '0')}`,\n };\n }\n return {\n year: now.getFullYear(),\n month: now.getMonth() + 1,\n day: now.getDate(),\n hour: 9,\n minute: 0,\n formatted: str,\n };\n}\n\nexport const DateTimeEditor: React.FC<CellEditorProps<string>> = ({\n value,\n rect,\n theme,\n locale,\n onCommit,\n onCancel,\n}) => {\n const initial = parseDateTimeParts(value);\n const localeCode = locale?.code || 'tr-TR';\n const [textVal, setTextVal] = useState<string>(() =>\n FilterEngine.formatLocalizedDate(initial.formatted, localeCode, true)\n );\n const [viewYear, setViewYear] = useState<number>(initial.year);\n const [viewMonth, setViewMonth] = useState<number>(initial.month);\n const [selDay, setSelDay] = useState<number>(initial.day);\n const [selHour, setSelHour] = useState<number>(initial.hour);\n const [selMinute, setSelMinute] = useState<number>(initial.minute);\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const latestValRef = useRef<string>(textVal);\n latestValRef.current = textVal;\n\n const buildFormatted = (y: number, m: number, d: number, hh: number, mm: number) =>\n `${y}-${String(m).padStart(2, '0')}-${String(d).padStart(2, '0')} ${String(hh).padStart(2, '0')}:${String(mm).padStart(2, '0')}`;\n\n const normalizeDateTimeCommit = (rawStr: string): string => {\n const trimmed = rawStr.trim();\n if (!trimmed) return '';\n const p = FilterEngine.parseDateParts(trimmed);\n if (p) {\n return buildFormatted(\n p.year,\n p.month,\n p.day,\n p.hasTime ? p.hour : selHour,\n p.hasTime ? p.minute : selMinute\n );\n }\n return buildFormatted(viewYear, viewMonth, selDay, selHour, selMinute);\n };\n\n useEffect(() => {\n inputRef.current?.focus();\n inputRef.current?.select();\n }, []);\n\n useEffect(() => {\n const handleOutside = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n onCommit(normalizeDateTimeCommit(latestValRef.current), 'none');\n }\n };\n document.addEventListener('mousedown', handleOutside, true);\n return () => document.removeEventListener('mousedown', handleOutside, true);\n }, [onCommit, viewYear, viewMonth, selDay, selHour, selMinute]);\n\n const updateParts = (y: number, m: number, d: number, hh: number, mm: number) => {\n setViewYear(y);\n setViewMonth(m);\n setSelDay(d);\n setSelHour(hh);\n setSelMinute(mm);\n const isoDt = buildFormatted(y, m, d, hh, mm);\n setTextVal(FilterEngine.formatLocalizedDate(isoDt, localeCode, true));\n };\n\n const handlePrevMonth = () => {\n if (viewMonth === 1) {\n updateParts(viewYear - 1, 12, selDay, selHour, selMinute);\n } else {\n updateParts(viewYear, viewMonth - 1, selDay, selHour, selMinute);\n }\n };\n\n const handleNextMonth = () => {\n if (viewMonth === 12) {\n updateParts(viewYear + 1, 1, selDay, selHour, selMinute);\n } else {\n updateParts(viewYear, viewMonth + 1, selDay, selHour, selMinute);\n }\n };\n\n const handleSelectNow = () => {\n const now = new Date();\n const nextStr = buildFormatted(\n now.getFullYear(),\n now.getMonth() + 1,\n now.getDate(),\n now.getHours(),\n now.getMinutes()\n );\n onCommit(nextStr, 'none');\n };\n\n const daysInMonth = new Date(viewYear, viewMonth, 0).getDate();\n const firstDayOfWeek = (new Date(viewYear, viewMonth - 1, 1).getDay() + 6) % 7;\n const cells: Array<number | null> = [];\n for (let i = 0; i < firstDayOfWeek; i++) cells.push(null);\n for (let d = 1; d <= daysInMonth; d++) cells.push(d);\n\n const isTR = locale?.code?.startsWith('tr');\n const monthNames = isTR\n ? ['Ocak', 'Şubat', 'Mart', 'Nisan', 'Mayıs', 'Haziran', 'Temmuz', 'Ağustos', 'Eylül', 'Ekim', 'Kasım', 'Aralık']\n : ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n const weekDays = isTR\n ? ['Pt', 'Sa', 'Ça', 'Pe', 'Cu', 'Ct', 'Pz']\n : ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'];\n\n const hours = Array.from({ length: 24 }, (_, i) => i);\n const minutes = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55];\n\n return (\n <div\n ref={containerRef}\n onMouseDown={(e) => e.stopPropagation()}\n onClick={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n style={{\n position: 'absolute',\n left: Math.max(4, rect.x),\n top: rect.y,\n zIndex: 125,\n fontFamily: theme.fontFamily,\n }}\n >\n {/* Inline Input */}\n <div\n style={{\n width: Math.max(rect.width, 175),\n height: rect.height,\n backgroundColor: theme.dom.inputBg,\n border: `2px solid ${theme.dom.inputFocusBorder}`,\n borderRadius: 4,\n display: 'flex',\n alignItems: 'center',\n boxSizing: 'border-box',\n boxShadow: theme.dom.popoverShadow,\n }}\n >\n <input\n ref={inputRef}\n type=\"text\"\n value={textVal}\n placeholder={isTR ? 'GG.AA.YYYY SS:DD' : 'MM/DD/YYYY HH:mm'}\n onChange={(e) => setTextVal(e.target.value)}\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.key === 'Enter') {\n e.preventDefault();\n onCommit(normalizeDateTimeCommit(textVal), 'down');\n } else if (e.key === 'Tab') {\n e.preventDefault();\n onCommit(normalizeDateTimeCommit(textVal), e.shiftKey ? 'left' : 'right');\n } else if (e.key === 'Escape') {\n e.preventDefault();\n onCancel();\n }\n }}\n style={{\n width: '100%',\n height: '100%',\n padding: '0 8px',\n boxSizing: 'border-box',\n backgroundColor: 'transparent',\n color: theme.dom.inputText,\n border: 'none',\n outline: 'none',\n fontFamily: theme.fontFamily,\n fontSize: `${theme.fontSize}px`,\n }}\n />\n </div>\n\n {/* Calendar + Time Popover */}\n <div\n style={{\n marginTop: 4,\n width: 330,\n padding: 10,\n backgroundColor: theme.dom.popoverBg,\n color: theme.dom.popoverText,\n border: `1px solid ${theme.dom.popoverBorder}`,\n borderRadius: 10,\n boxShadow: theme.dom.popoverShadow,\n backdropFilter: theme.dom.glassBackdrop,\n userSelect: 'none',\n }}\n >\n <div style={{ display: 'flex', gap: 10 }}>\n {/* Left: Calendar */}\n <div style={{ flex: 1 }}>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 6,\n }}\n >\n <button\n type=\"button\"\n onClick={handlePrevMonth}\n style={{\n width: 24,\n height: 24,\n borderRadius: 5,\n border: `1px solid ${theme.dom.popoverBorder}`,\n backgroundColor: 'transparent',\n color: theme.dom.popoverText,\n cursor: 'pointer',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 0,\n }}\n >\n <MaterialIcon name=\"chevron_left\" size={15} color={theme.dom.popoverText} />\n </button>\n <div style={{ display: 'flex', alignItems: 'center', gap: 3 }}>\n <select\n value={viewYear}\n onChange={(e) => updateParts(Number(e.target.value), viewMonth, selDay, selHour, selMinute)}\n style={{\n padding: '2px 3px',\n fontSize: 11,\n fontWeight: 700,\n borderRadius: 4,\n border: `1px solid ${theme.dom.popoverBorder}`,\n backgroundColor: theme.dom.inputBg,\n color: theme.dom.popoverText,\n outline: 'none',\n cursor: 'pointer',\n }}\n >\n {Array.from({ length: 41 }, (_, i) => new Date().getFullYear() - 25 + i).map((yr) => (\n <option key={yr} value={yr}>\n {yr}\n </option>\n ))}\n </select>\n <MaterialIcon name=\"chevron_right\" size={12} color=\"#8E8E93\" />\n <select\n value={viewMonth}\n onChange={(e) => updateParts(viewYear, Number(e.target.value), selDay, selHour, selMinute)}\n style={{\n padding: '2px 3px',\n fontSize: 11,\n fontWeight: 600,\n borderRadius: 4,\n border: `1px solid ${theme.dom.popoverBorder}`,\n backgroundColor: theme.dom.inputBg,\n color: theme.dom.popoverText,\n outline: 'none',\n cursor: 'pointer',\n }}\n >\n {monthNames.map((mName, i) => (\n <option key={i + 1} value={i + 1}>\n {String(i + 1).padStart(2, '0')} - {mName}\n </option>\n ))}\n </select>\n </div>\n <button\n type=\"button\"\n onClick={handleNextMonth}\n style={{\n width: 24,\n height: 24,\n borderRadius: 5,\n border: `1px solid ${theme.dom.popoverBorder}`,\n backgroundColor: 'transparent',\n color: theme.dom.popoverText,\n cursor: 'pointer',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 0,\n }}\n >\n <MaterialIcon name=\"chevron_right\" size={15} color={theme.dom.popoverText} />\n </button>\n </div>\n\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(7, 1fr)',\n gap: 2,\n marginBottom: 4,\n textAlign: 'center',\n fontSize: 10,\n fontWeight: 600,\n color: '#8E8E93',\n }}\n >\n {weekDays.map((wd) => (\n <div key={wd}>{wd}</div>\n ))}\n </div>\n\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(7, 1fr)', gap: 2 }}>\n {cells.map((day, idx) => {\n if (day === null) return <div key={`e_${idx}`} style={{ height: 24 }} />;\n const isSelectedDay = day === selDay;\n return (\n <button\n key={day}\n type=\"button\"\n onClick={() => updateParts(viewYear, viewMonth, day, selHour, selMinute)}\n onDoubleClick={() => {\n const nextStr = buildFormatted(viewYear, viewMonth, day, selHour, selMinute);\n onCommit(nextStr, 'none');\n }}\n style={{\n height: 24,\n borderRadius: 5,\n border: 'none',\n backgroundColor: isSelectedDay ? theme.dom.accentColor : 'transparent',\n color: isSelectedDay ? '#FFFFFF' : theme.dom.popoverText,\n fontWeight: isSelectedDay ? 700 : 500,\n fontSize: 11,\n cursor: 'pointer',\n }}\n >\n {day}\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Right: Hour & Minute Columns */}\n <div\n style={{\n width: 98,\n borderLeft: `1px solid ${theme.dom.popoverBorder}`,\n paddingLeft: 8,\n display: 'flex',\n flexDirection: 'column',\n }}\n >\n <div\n style={{\n fontSize: 10,\n fontWeight: 700,\n color: '#8E8E93',\n textAlign: 'center',\n marginBottom: 4,\n }}\n >\n {isTR ? 'SAAT : DK' : 'HR : MIN'}\n </div>\n <div style={{ display: 'flex', gap: 4, height: 170 }}>\n {/* Hours */}\n <div style={{ flex: 1, overflowY: 'auto', display: 'flex', flexDirection: 'column', gap: 2 }}>\n {hours.map((h) => {\n const active = h === selHour;\n return (\n <button\n key={h}\n type=\"button\"\n onClick={() => updateParts(viewYear, viewMonth, selDay, h, selMinute)}\n style={{\n padding: '3px 0',\n fontSize: 11,\n fontFamily: 'monospace',\n fontWeight: active ? 700 : 500,\n borderRadius: 4,\n border: 'none',\n backgroundColor: active ? theme.dom.accentColor : 'transparent',\n color: active ? '#FFFFFF' : theme.dom.popoverText,\n cursor: 'pointer',\n }}\n >\n {String(h).padStart(2, '0')}\n </button>\n );\n })}\n </div>\n {/* Minutes */}\n <div style={{ flex: 1, overflowY: 'auto', display: 'flex', flexDirection: 'column', gap: 2 }}>\n {minutes.map((m) => {\n const active = m === selMinute;\n return (\n <button\n key={m}\n type=\"button\"\n onClick={() => updateParts(viewYear, viewMonth, selDay, selHour, m)}\n style={{\n padding: '3px 0',\n fontSize: 11,\n fontFamily: 'monospace',\n fontWeight: active ? 700 : 500,\n borderRadius: 4,\n border: 'none',\n backgroundColor: active ? theme.dom.accentColor : 'transparent',\n color: active ? '#FFFFFF' : theme.dom.popoverText,\n cursor: 'pointer',\n }}\n >\n {String(m).padStart(2, '0')}\n </button>\n );\n })}\n </div>\n </div>\n </div>\n </div>\n\n {/* Footer Actions */}\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginTop: 8,\n paddingTop: 8,\n borderTop: `1px solid ${theme.dom.popoverBorder}`,\n }}\n >\n <div style={{ display: 'flex', gap: 6 }}>\n <button\n type=\"button\"\n onClick={() => onCommit('', 'none')}\n style={{\n padding: '4px 8px',\n fontSize: 11,\n borderRadius: 4,\n border: `1px solid ${theme.dom.popoverBorder}`,\n backgroundColor: 'transparent',\n color: theme.dom.popoverText,\n cursor: 'pointer',\n }}\n >\n {locale?.clear || (isTR ? 'Temizle' : 'Clear')}\n </button>\n <button\n type=\"button\"\n onClick={handleSelectNow}\n style={{\n padding: '4px 8px',\n fontSize: 11,\n borderRadius: 4,\n border: `1px solid ${theme.dom.popoverBorder}`,\n backgroundColor: 'transparent',\n color: theme.dom.accentColor,\n fontWeight: 600,\n cursor: 'pointer',\n }}\n >\n {isTR ? 'Şimdi' : 'Now'}\n </button>\n </div>\n\n <button\n type=\"button\"\n onClick={() => onCommit(textVal, 'none')}\n style={{\n padding: '4px 12px',\n fontSize: 11,\n fontWeight: 600,\n borderRadius: 4,\n border: 'none',\n backgroundColor: theme.dom.accentColor,\n color: '#FFFFFF',\n cursor: 'pointer',\n }}\n >\n {locale?.apply || (isTR ? 'Uygula' : 'Apply')}\n </button>\n </div>\n </div>\n </div>\n );\n};\n","import { IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { paintDateTime } from './DateTimePainter';\nimport { DateTimeEditor } from './DateTimeEditor';\n\nexport const DateTimeColumnPlugin: IColumnTypePlugin<string> = {\n type: 'datetime',\n paint: paintDateTime,\n editorComponent: DateTimeEditor,\n\n onPointerDown({ localX, column }) {\n if (localX > column.width - 28) {\n return { handled: true, shouldOpenEditor: true };\n }\n return { handled: false };\n },\n\n onKeyDown({ event, openEditor }) {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n openEditor();\n return true;\n }\n if (/^[0-9]$/.test(event.key) && !event.ctrlKey && !event.metaKey && !event.altKey) {\n event.preventDefault();\n openEditor(event.key);\n return true;\n }\n return false;\n },\n\n parseClipboard(text) {\n const raw = text.trim();\n const dmy = raw.match(\n /^(\\d{1,2})[./-](\\d{1,2})[./-](\\d{4})(?:\\s+(\\d{1,2}):(\\d{1,2}))?/\n );\n if (dmy) {\n const hh = (dmy[4] || '09').padStart(2, '0');\n const mm = (dmy[5] || '00').padStart(2, '0');\n return `${dmy[3]}-${dmy[2].padStart(2, '0')}-${dmy[1].padStart(2, '0')} ${hh}:${mm}`;\n }\n return raw;\n },\n\n formatClipboard(value) {\n return value != null ? String(value) : '';\n },\n\n comparator(a, b) {\n const strA = String(a ?? '');\n const strB = String(b ?? '');\n return strA.localeCompare(strB);\n },\n};\n","import { CellPaintContext } from '../../IColumnTypePlugin';\n\nexport function paintTime({\n ctx,\n value,\n theme,\n x,\n y,\n width,\n height,\n isHovered,\n isSelected,\n}: CellPaintContext<string>): void {\n ctx.save();\n\n if (value) {\n const str = String(value).trim();\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(x + 8, y, Math.max(0, width - 30), height);\n ctx.clip();\n\n ctx.fillStyle = theme.canvas.cellText;\n ctx.font = `600 ${theme.fontSize}px ${theme.fontFamily}`;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillText(str, x + 8, y + height / 2);\n ctx.restore();\n }\n\n // Subtle Clock Icon on right side of cell\n if (width > 55) {\n const cx = x + width - 14;\n const cy = y + height / 2;\n const r = 5.5;\n\n ctx.strokeStyle =\n isSelected || isHovered\n ? theme.dom.accentColor\n : theme.isDark\n ? 'rgba(255,255,255,0.38)'\n : 'rgba(0,0,0,0.38)';\n ctx.lineWidth = 1.25;\n ctx.beginPath();\n ctx.arc(cx, cy, r, 0, Math.PI * 2);\n ctx.stroke();\n\n // Clock hands\n ctx.beginPath();\n ctx.moveTo(cx, cy);\n ctx.lineTo(cx, cy - 3.2);\n ctx.moveTo(cx, cy);\n ctx.lineTo(cx + 2.6, cy + 1.2);\n ctx.stroke();\n }\n\n ctx.restore();\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { CellEditorProps } from '../../IColumnTypePlugin';\n\nfunction parseTimeParts(raw: any): { hour: number; minute: number; formatted: string } {\n if (!raw) {\n return { hour: 9, minute: 0, formatted: '09:00' };\n }\n const str = String(raw).trim();\n const m = str.match(/^(\\d{1,2}):(\\d{1,2})/);\n if (m) {\n const hh = Math.min(23, Math.max(0, parseInt(m[1], 10)));\n const mm = Math.min(59, Math.max(0, parseInt(m[2], 10)));\n return {\n hour: hh,\n minute: mm,\n formatted: `${String(hh).padStart(2, '0')}:${String(mm).padStart(2, '0')}`,\n };\n }\n return { hour: 9, minute: 0, formatted: str };\n}\n\nexport const TimeEditor: React.FC<CellEditorProps<string>> = ({\n value,\n rect,\n theme,\n locale,\n onCommit,\n onCancel,\n}) => {\n const initial = parseTimeParts(value);\n const [timeVal, setTimeVal] = useState<string>(value ? initial.formatted : '09:00');\n const [selHour, setSelHour] = useState<number>(initial.hour);\n const [selMinute, setSelMinute] = useState<number>(initial.minute);\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const latestValRef = useRef<string>(timeVal);\n latestValRef.current = timeVal;\n\n const isTR = locale?.code?.startsWith('tr');\n\n useEffect(() => {\n inputRef.current?.focus();\n inputRef.current?.select();\n }, []);\n\n useEffect(() => {\n const handleOutside = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n onCommit(latestValRef.current, 'none');\n }\n };\n document.addEventListener('mousedown', handleOutside, true);\n return () => document.removeEventListener('mousedown', handleOutside, true);\n }, [onCommit]);\n\n const updateTime = (hh: number, mm: number, commitImmediate = false) => {\n const nextStr = `${String(hh).padStart(2, '0')}:${String(mm).padStart(2, '0')}`;\n setSelHour(hh);\n setSelMinute(mm);\n setTimeVal(nextStr);\n if (commitImmediate) {\n onCommit(nextStr, 'none');\n }\n };\n\n const handleSelectNow = () => {\n const now = new Date();\n updateTime(now.getHours(), now.getMinutes(), true);\n };\n\n const hours = Array.from({ length: 24 }, (_, i) => i);\n const minutes = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55];\n const presets = ['08:30', '09:00', '12:00', '14:30', '17:00', '18:00'];\n\n return (\n <div\n ref={containerRef}\n onMouseDown={(e) => e.stopPropagation()}\n onClick={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n style={{\n position: 'absolute',\n left: Math.max(4, rect.x),\n top: rect.y,\n zIndex: 125,\n fontFamily: theme.fontFamily,\n }}\n >\n {/* Inline Input */}\n <div\n style={{\n width: Math.max(rect.width, 115),\n height: rect.height,\n backgroundColor: theme.dom.inputBg,\n border: `2px solid ${theme.dom.inputFocusBorder}`,\n borderRadius: 4,\n display: 'flex',\n alignItems: 'center',\n boxSizing: 'border-box',\n boxShadow: theme.dom.popoverShadow,\n }}\n >\n <input\n ref={inputRef}\n type=\"text\"\n value={timeVal}\n placeholder=\"HH:mm\"\n onChange={(e) => {\n setTimeVal(e.target.value);\n const p = parseTimeParts(e.target.value);\n setSelHour(p.hour);\n setSelMinute(p.minute);\n }}\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.key === 'Enter') {\n e.preventDefault();\n onCommit(timeVal, 'down');\n } else if (e.key === 'Tab') {\n e.preventDefault();\n onCommit(timeVal, e.shiftKey ? 'left' : 'right');\n } else if (e.key === 'Escape') {\n e.preventDefault();\n onCancel();\n }\n }}\n style={{\n width: '100%',\n height: '100%',\n padding: '0 8px',\n boxSizing: 'border-box',\n backgroundColor: 'transparent',\n color: theme.dom.inputText,\n border: 'none',\n outline: 'none',\n fontFamily: theme.fontFamily,\n fontSize: `${theme.fontSize}px`,\n }}\n />\n </div>\n\n {/* Time Picker Popover */}\n <div\n style={{\n marginTop: 4,\n width: 215,\n padding: 10,\n backgroundColor: theme.dom.popoverBg,\n color: theme.dom.popoverText,\n border: `1px solid ${theme.dom.popoverBorder}`,\n borderRadius: 10,\n boxShadow: theme.dom.popoverShadow,\n backdropFilter: theme.dom.glassBackdrop,\n userSelect: 'none',\n }}\n >\n {/* Quick Preset Chips */}\n <div\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n gap: 4,\n marginBottom: 8,\n paddingBottom: 8,\n borderBottom: `1px solid ${theme.dom.popoverBorder}`,\n }}\n >\n {presets.map((p) => {\n const active = timeVal === p;\n return (\n <button\n key={p}\n type=\"button\"\n onClick={() => onCommit(p, 'none')}\n style={{\n padding: '3px 7px',\n fontSize: 11,\n fontFamily: 'monospace',\n fontWeight: active ? 700 : 500,\n borderRadius: 5,\n border: `1px solid ${active ? theme.dom.accentColor : theme.dom.popoverBorder}`,\n backgroundColor: active ? theme.dom.accentColor : 'transparent',\n color: active ? '#FFFFFF' : theme.dom.popoverText,\n cursor: 'pointer',\n }}\n >\n {p}\n </button>\n );\n })}\n </div>\n\n {/* Hour & Minute Columns */}\n <div style={{ display: 'flex', gap: 8 }}>\n <div style={{ flex: 1 }}>\n <div style={{ fontSize: 10, fontWeight: 700, color: '#8E8E93', textAlign: 'center', marginBottom: 4 }}>\n {isTR ? 'SAAT' : 'HOUR'}\n </div>\n <div\n style={{\n height: 140,\n overflowY: 'auto',\n display: 'grid',\n gridTemplateColumns: 'repeat(2, 1fr)',\n gap: 2,\n }}\n >\n {hours.map((h) => {\n const active = h === selHour;\n return (\n <button\n key={h}\n type=\"button\"\n onClick={() => updateTime(h, selMinute)}\n style={{\n padding: '4px 0',\n fontSize: 11,\n fontFamily: 'monospace',\n fontWeight: active ? 700 : 500,\n borderRadius: 4,\n border: 'none',\n backgroundColor: active ? theme.dom.accentColor : 'transparent',\n color: active ? '#FFFFFF' : theme.dom.popoverText,\n cursor: 'pointer',\n }}\n >\n {String(h).padStart(2, '0')}\n </button>\n );\n })}\n </div>\n </div>\n\n <div style={{ flex: 1 }}>\n <div style={{ fontSize: 10, fontWeight: 700, color: '#8E8E93', textAlign: 'center', marginBottom: 4 }}>\n {isTR ? 'DAKİKA' : 'MIN'}\n </div>\n <div\n style={{\n height: 140,\n overflowY: 'auto',\n display: 'grid',\n gridTemplateColumns: 'repeat(2, 1fr)',\n gap: 2,\n }}\n >\n {minutes.map((m) => {\n const active = m === selMinute;\n return (\n <button\n key={m}\n type=\"button\"\n onClick={() => updateTime(selHour, m)}\n style={{\n padding: '4px 0',\n fontSize: 11,\n fontFamily: 'monospace',\n fontWeight: active ? 700 : 500,\n borderRadius: 4,\n border: 'none',\n backgroundColor: active ? theme.dom.accentColor : 'transparent',\n color: active ? '#FFFFFF' : theme.dom.popoverText,\n cursor: 'pointer',\n }}\n >\n {String(m).padStart(2, '0')}\n </button>\n );\n })}\n </div>\n </div>\n </div>\n\n {/* Footer */}\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginTop: 8,\n paddingTop: 8,\n borderTop: `1px solid ${theme.dom.popoverBorder}`,\n }}\n >\n <div style={{ display: 'flex', gap: 6 }}>\n <button\n type=\"button\"\n onClick={() => onCommit('', 'none')}\n style={{\n padding: '4px 8px',\n fontSize: 11,\n borderRadius: 4,\n border: `1px solid ${theme.dom.popoverBorder}`,\n backgroundColor: 'transparent',\n color: theme.dom.popoverText,\n cursor: 'pointer',\n }}\n >\n {locale?.clear || (isTR ? 'Temizle' : 'Clear')}\n </button>\n <button\n type=\"button\"\n onClick={handleSelectNow}\n style={{\n padding: '4px 8px',\n fontSize: 11,\n borderRadius: 4,\n border: `1px solid ${theme.dom.popoverBorder}`,\n backgroundColor: 'transparent',\n color: theme.dom.accentColor,\n fontWeight: 600,\n cursor: 'pointer',\n }}\n >\n {isTR ? 'Şimdi' : 'Now'}\n </button>\n </div>\n <button\n type=\"button\"\n onClick={() => onCommit(timeVal, 'none')}\n style={{\n padding: '4px 12px',\n fontSize: 11,\n fontWeight: 600,\n borderRadius: 4,\n border: 'none',\n backgroundColor: theme.dom.accentColor,\n color: '#FFFFFF',\n cursor: 'pointer',\n }}\n >\n {locale?.apply || (isTR ? 'Uygula' : 'Apply')}\n </button>\n </div>\n </div>\n </div>\n );\n};\n","import { IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { paintTime } from './TimePainter';\nimport { TimeEditor } from './TimeEditor';\n\nexport const TimeColumnPlugin: IColumnTypePlugin<string> = {\n type: 'time',\n paint: paintTime,\n editorComponent: TimeEditor,\n\n onPointerDown({ localX, column }) {\n if (localX > column.width - 28) {\n return { handled: true, shouldOpenEditor: true };\n }\n return { handled: false };\n },\n\n onKeyDown({ event, openEditor }) {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n openEditor();\n return true;\n }\n if (/^[0-9]$/.test(event.key) && !event.ctrlKey && !event.metaKey && !event.altKey) {\n event.preventDefault();\n openEditor(event.key);\n return true;\n }\n return false;\n },\n\n parseClipboard(text) {\n return text.trim();\n },\n\n formatClipboard(value) {\n return value != null ? String(value) : '';\n },\n\n comparator(a, b) {\n return String(a ?? '').localeCompare(String(b ?? ''));\n },\n};\n","import { CellPaintContext, IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { TextEditor } from '../TextColumn/TextEditor';\n\nexport function paintEmail({\n ctx,\n value,\n theme,\n x,\n y,\n width,\n height,\n}: CellPaintContext<string>): void {\n const email = value != null ? String(value).trim() : '';\n if (!email) return;\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(x + 6, y, width - 12, height);\n ctx.clip();\n\n const centerY = y + height / 2;\n\n // Draw mail icon badge\n ctx.fillStyle = theme.isDark ? '#38BDF8' : '#0284C7';\n ctx.font = `600 12px ${theme.fontFamily}`;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillText('✉', x + 8, centerY);\n\n // Draw email text\n ctx.fillStyle = theme.canvas.cellText;\n ctx.font = `500 ${theme.fontSize - 1}px ${theme.fontFamily}`;\n ctx.fillText(email, x + 26, centerY);\n\n ctx.restore();\n}\n\nexport const EmailColumnPlugin: IColumnTypePlugin<string> = {\n type: 'email',\n paint: paintEmail,\n editorComponent: TextEditor,\n\n onKeyDown({ event, openEditor }) {\n if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {\n event.preventDefault();\n openEditor(event.key);\n return true;\n }\n return false;\n },\n\n parseClipboard(text) {\n return text.trim();\n },\n\n formatClipboard(value) {\n return String(value ?? '');\n },\n\n comparator(a, b) {\n return String(a ?? '').localeCompare(String(b ?? ''), 'tr-TR');\n },\n};\n","import { CellPaintContext, IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { TextEditor } from '../TextColumn/TextEditor';\n\nexport function paintUrl({\n ctx,\n value,\n theme,\n x,\n y,\n width,\n height,\n isHovered,\n}: CellPaintContext<string>): void {\n const raw = value != null ? String(value).trim() : '';\n if (!raw) return;\n\n const display = raw.replace(/^https?:\\/\\/(www\\.)?/i, '').replace(/\\/$/, '');\n const centerY = y + height / 2;\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(x + 6, y, width - 26, height);\n ctx.clip();\n\n ctx.fillStyle = theme.isDark ? '#38BDF8' : '#0284C7';\n ctx.font = `500 ${theme.fontSize - 1}px ${theme.fontFamily}`;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillText(display, x + 8, centerY);\n\n if (isHovered) {\n const textW = Math.min(ctx.measureText(display).width, width - 34);\n ctx.strokeStyle = theme.isDark ? '#38BDF8' : '#0284C7';\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(x + 8, centerY + 7);\n ctx.lineTo(x + 8 + textW, centerY + 7);\n ctx.stroke();\n }\n ctx.restore();\n\n // Draw external link launch icon on right\n ctx.save();\n ctx.fillStyle = isHovered ? theme.dom.accentColor : theme.isDark ? '#64748B' : '#94A3B8';\n ctx.font = `700 11px ${theme.fontFamily}`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText('↗', x + width - 12, centerY);\n ctx.restore();\n}\n\nexport const UrlColumnPlugin: IColumnTypePlugin<string> = {\n type: 'url',\n paint: paintUrl,\n editorComponent: TextEditor,\n\n onPointerDown({ localX, column, value }) {\n if (localX > column.width - 24 && value) {\n const href = /^https?:\\/\\//i.test(String(value))\n ? String(value)\n : `https://${String(value)}`;\n if (typeof window !== 'undefined') {\n window.open(href, '_blank', 'noopener,noreferrer');\n }\n return { handled: true, shouldOpenEditor: false };\n }\n return { handled: false };\n },\n\n onKeyDown({ event, openEditor }) {\n if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {\n event.preventDefault();\n openEditor(event.key);\n return true;\n }\n return false;\n },\n\n parseClipboard(text) {\n return text.trim();\n },\n\n formatClipboard(value) {\n return String(value ?? '');\n },\n\n comparator(a, b) {\n return String(a ?? '').localeCompare(String(b ?? ''), 'tr-TR');\n },\n};\n","import { CellPaintContext, IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { TextEditor } from '../TextColumn/TextEditor';\n\nexport function paintPhone({\n ctx,\n value,\n theme,\n x,\n y,\n width,\n height,\n}: CellPaintContext<string>): void {\n const phone = value != null ? String(value).trim() : '';\n if (!phone) return;\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(x + 6, y, width - 12, height);\n ctx.clip();\n\n const centerY = y + height / 2;\n\n ctx.fillStyle = theme.isDark ? '#34D399' : '#059669';\n ctx.font = `600 11px ${theme.fontFamily}`;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillText('☎', x + 8, centerY);\n\n ctx.fillStyle = theme.canvas.cellText;\n ctx.font = `500 ${theme.fontSize - 1}px monospace`;\n ctx.fillText(phone, x + 24, centerY);\n\n ctx.restore();\n}\n\nexport const PhoneColumnPlugin: IColumnTypePlugin<string> = {\n type: 'phone',\n paint: paintPhone,\n editorComponent: TextEditor,\n\n onKeyDown({ event, openEditor }) {\n if (/^[0-9+()-\\s]$/.test(event.key) && !event.ctrlKey && !event.metaKey) {\n event.preventDefault();\n openEditor(event.key);\n return true;\n }\n return false;\n },\n\n parseClipboard(text) {\n return text.trim();\n },\n\n formatClipboard(value) {\n return String(value ?? '');\n },\n\n comparator(a, b) {\n return String(a ?? '').localeCompare(String(b ?? ''), 'tr-TR');\n },\n};\n","import React, { useEffect, useRef, useState } from 'react';\nimport { CellEditorProps } from '../../IColumnTypePlugin';\n\nconst PRESET_COLORS = [\n '#38BDF8',\n '#2563EB',\n '#6366F1',\n '#8B5CF6',\n '#EC4899',\n '#F43F5E',\n '#EF4444',\n '#F97316',\n '#F59E0B',\n '#EAB308',\n '#10B981',\n '#14B8A6',\n];\n\nexport const ColorEditor: React.FC<CellEditorProps<string>> = ({\n value,\n rect,\n theme,\n onCommit,\n onCancel,\n}) => {\n const [hex, setHex] = useState<string>(String(value || '#38BDF8'));\n const containerRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n const handleOutside = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n onCommit(hex, 'none');\n }\n };\n document.addEventListener('mousedown', handleOutside, true);\n return () => document.removeEventListener('mousedown', handleOutside, true);\n }, [hex, onCommit]);\n\n return (\n <div\n ref={containerRef}\n onMouseDown={(e) => e.stopPropagation()}\n onClick={(e) => e.stopPropagation()}\n style={{\n position: 'absolute',\n left: Math.max(4, rect.x),\n top: rect.y,\n width: 210,\n zIndex: 130,\n padding: 10,\n backgroundColor: theme.dom.popoverBg,\n color: theme.dom.popoverText,\n border: `1px solid ${theme.dom.popoverBorder}`,\n borderRadius: 10,\n boxShadow: theme.dom.popoverShadow,\n backdropFilter: theme.dom.glassBackdrop,\n fontFamily: theme.fontFamily,\n }}\n >\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(6, 1fr)',\n gap: 6,\n marginBottom: 10,\n }}\n >\n {PRESET_COLORS.map((c) => (\n <button\n key={c}\n type=\"button\"\n onClick={() => onCommit(c, 'none')}\n style={{\n width: 24,\n height: 24,\n borderRadius: 5,\n backgroundColor: c,\n border:\n hex.toLowerCase() === c.toLowerCase()\n ? '2px solid #FFFFFF'\n : '1px solid rgba(255,255,255,0.2)',\n cursor: 'pointer',\n padding: 0,\n }}\n />\n ))}\n </div>\n <div style={{ display: 'flex', gap: 6, alignItems: 'center' }}>\n <input\n type=\"color\"\n value={/^#[0-9a-fA-F]{6}$/.test(hex) ? hex : '#38BDF8'}\n onChange={(e) => setHex(e.target.value.toUpperCase())}\n style={{ width: 28, height: 28, padding: 0, border: 'none', cursor: 'pointer', background: 'none' }}\n />\n <input\n type=\"text\"\n value={hex}\n onChange={(e) => setHex(e.target.value)}\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.key === 'Enter') onCommit(hex, 'down');\n if (e.key === 'Escape') onCancel();\n }}\n style={{\n flex: 1,\n padding: '5px 7px',\n borderRadius: 5,\n border: `1px solid ${theme.dom.inputBorder}`,\n backgroundColor: theme.dom.inputBg,\n color: theme.dom.inputText,\n fontSize: 12,\n fontFamily: 'monospace',\n outline: 'none',\n }}\n />\n </div>\n </div>\n );\n};\n","import { CellPaintContext, IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { ColorEditor } from './ColorEditor';\n\nexport function paintColor({\n ctx,\n value,\n theme,\n x,\n y,\n width,\n height,\n}: CellPaintContext<string>): void {\n const color = value != null && String(value).trim() ? String(value).trim() : '#38BDF8';\n const centerY = y + height / 2;\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(x + 6, y, width - 12, height);\n ctx.clip();\n\n // Swatch box\n const swatchSize = 16;\n const swatchX = x + 8;\n const swatchY = centerY - swatchSize / 2;\n\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.roundRect(swatchX, swatchY, swatchSize, swatchSize, 4);\n ctx.fill();\n\n ctx.strokeStyle = theme.isDark ? 'rgba(255,255,255,0.25)' : 'rgba(0,0,0,0.18)';\n ctx.lineWidth = 1;\n ctx.stroke();\n\n // Hex text\n ctx.fillStyle = theme.canvas.cellText;\n ctx.font = `600 ${theme.fontSize - 2}px monospace`;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillText(color.toUpperCase(), swatchX + swatchSize + 8, centerY);\n\n ctx.restore();\n}\n\nexport const ColorColumnPlugin: IColumnTypePlugin<string> = {\n type: 'color',\n paint: paintColor,\n editorComponent: ColorEditor,\n\n onPointerDown() {\n return { handled: true, shouldOpenEditor: true };\n },\n\n onKeyDown({ event, openEditor }) {\n if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault();\n openEditor();\n return true;\n }\n return false;\n },\n\n parseClipboard(text) {\n return text.trim();\n },\n\n formatClipboard(value) {\n return String(value ?? '#38BDF8');\n },\n\n comparator(a, b) {\n return String(a ?? '').localeCompare(String(b ?? ''), 'tr-TR');\n },\n};\n","import { CellPaintContext } from '../../IColumnTypePlugin';\n\nexport function paintRating({ ctx, value, theme, x, y, width, height }: CellPaintContext<number>): void {\n const rating = Math.max(0, Math.min(5, Math.round(Number(value) || 0)));\n const starCount = 5;\n const starSize = 13;\n const gap = 3;\n const startX = x + 8;\n const midY = y + height / 2;\n\n ctx.save();\n for (let i = 0; i < starCount; i++) {\n const sx = startX + i * (starSize + gap);\n if (sx + starSize > x + width) break;\n\n const isFilled = i < rating;\n ctx.fillStyle = isFilled ? '#F59E0B' : theme.isDark ? '#48484A' : '#D1D1D6';\n\n // 5 köşeli vektörel yıldız çizimi\n drawStar(ctx, sx + starSize / 2, midY, 5, starSize / 2, starSize / 4);\n ctx.fill();\n }\n ctx.restore();\n}\n\nfunction drawStar(\n ctx: CanvasRenderingContext2D,\n cx: number,\n cy: number,\n spikes: number,\n outerRadius: number,\n innerRadius: number\n) {\n let rot = (Math.PI / 2) * 3;\n let x = cx;\n let y = cy;\n const step = Math.PI / spikes;\n\n ctx.beginPath();\n ctx.moveTo(cx, cy - outerRadius);\n for (let i = 0; i < spikes; i++) {\n x = cx + Math.cos(rot) * outerRadius;\n y = cy + Math.sin(rot) * outerRadius;\n ctx.lineTo(x, y);\n rot += step;\n\n x = cx + Math.cos(rot) * innerRadius;\n y = cy + Math.sin(rot) * innerRadius;\n ctx.lineTo(x, y);\n rot += step;\n }\n ctx.lineTo(cx, cy - outerRadius);\n ctx.closePath();\n}\n","import { IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { paintRating } from './RatingPainter';\n\nexport const RatingColumnPlugin: IColumnTypePlugin<number> = {\n type: 'rating',\n paint: paintRating,\n editorComponent: undefined, // Zero-DOM: Tıklamayla doğrudan puanlama\n\n onPointerDown({ localX, setValue }) {\n // Tıklanan yıldızın indeksini hesapla (1..5)\n const starIndex = Math.ceil((localX - 8) / 16);\n if (starIndex >= 1 && starIndex <= 5) {\n setValue(starIndex);\n return { handled: true };\n }\n return { handled: false };\n },\n\n onKeyDown({ event, setValue }) {\n // 1-5 tuşlarına basıldığında doğrudan o puanı ata\n if (/^[1-5]$/.test(event.key)) {\n event.preventDefault();\n setValue(Number(event.key));\n return true;\n }\n return false;\n },\n\n parseClipboard(text) {\n const num = parseInt(text.trim(), 10);\n return isNaN(num) ? 0 : Math.max(0, Math.min(5, num));\n },\n\n formatClipboard(value) {\n return `${value ?? 0} / 5 Yıldız`;\n },\n\n comparator(a, b) {\n return (Number(a) || 0) - (Number(b) || 0);\n },\n};\n","import { CellPaintContext } from '../../IColumnTypePlugin';\n\nexport function paintProgress({ ctx, value, theme, locale, x, y, width, height }: CellPaintContext<number>): void {\n const pct = Math.max(0, Math.min(100, Math.round(Number(value) || 0)));\n const isTR = (locale?.code || 'tr-TR').startsWith('tr');\n const pad = 6;\n const barH = 18;\n const barY = y + (height - barH) / 2;\n const barTotalW = width - pad * 2;\n const fillW = (barTotalW * pct) / 100;\n\n ctx.save();\n\n // Arka plan rayı (Track)\n ctx.fillStyle = theme.isDark ? '#2C2C2E' : '#E5E5EA';\n ctx.beginPath();\n ctx.roundRect(x + pad, barY, barTotalW, barH, 4);\n ctx.fill();\n\n // Doluluk barı (Fill)\n if (fillW > 0) {\n const isCompleted = pct === 100;\n ctx.fillStyle = isCompleted ? '#10B981' : theme.canvas.selectionBorder;\n ctx.beginPath();\n ctx.roundRect(x + pad, barY, fillW, barH, 4);\n ctx.fill();\n }\n\n // Yüzde metni\n ctx.fillStyle = pct > 55 ? '#FFFFFF' : theme.canvas.cellText;\n ctx.font = `600 11px ${theme.fontFamily}`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(isTR ? `%${pct}` : `${pct}%`, x + width / 2, y + height / 2);\n\n ctx.restore();\n}\n","import { IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { paintProgress } from './ProgressPainter';\nimport { NumberEditor } from '../NumberColumn/NumberEditor';\n\nexport const ProgressColumnPlugin: IColumnTypePlugin<number> = {\n type: 'progress',\n paint: paintProgress,\n editorComponent: NumberEditor,\n\n onKeyDown({ event, openEditor }) {\n if (/^[0-9]$/.test(event.key) && !event.ctrlKey && !event.metaKey && !event.altKey) {\n event.preventDefault();\n openEditor(event.key);\n return true;\n }\n return false;\n },\n\n parseClipboard(text) {\n const num = parseFloat(text.replace(/[^0-9.-]/g, ''));\n return isNaN(num) ? 0 : Math.max(0, Math.min(100, num));\n },\n\n formatClipboard(value) {\n return `${value ?? 0}%`;\n },\n\n comparator(a, b) {\n return (Number(a) || 0) - (Number(b) || 0);\n },\n};\n","import { CellPaintContext } from '../../IColumnTypePlugin';\n\nexport function paintSparkline({\n ctx,\n value,\n column,\n theme,\n x,\n y,\n width,\n height,\n isHovered,\n isSelected,\n}: CellPaintContext<number[]>): void {\n const points: number[] = Array.isArray(value) ? value : [];\n if (points.length < 2) return;\n\n const padX = 8;\n const rightReserve = isHovered || isSelected ? 26 : 10;\n const padY = 8;\n const w = width - padX - rightReserve;\n const h = height - padY * 2;\n if (w <= 0 || h <= 0) return;\n\n const min = Math.min(...points);\n const max = Math.max(...points);\n const range = max - min || 1;\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(x + padX, y, w + 4, height);\n ctx.clip();\n\n const strokeColor = column.sparklineColor || theme.canvas.selectionBorder;\n ctx.strokeStyle = strokeColor;\n ctx.lineWidth = 1.8;\n ctx.lineJoin = 'round';\n ctx.lineCap = 'round';\n\n ctx.beginPath();\n points.forEach((val, i) => {\n const px = x + padX + (i / (points.length - 1)) * w;\n const py = y + height - padY - ((val - min) / range) * h;\n if (i === 0) ctx.moveTo(px, py);\n else ctx.lineTo(px, py);\n });\n ctx.stroke();\n\n // Son noktanın üzerine minik nokta koy\n const lastVal = points[points.length - 1];\n const lastX = x + padX + w;\n const lastY = y + height - padY - ((lastVal - min) / range) * h;\n ctx.fillStyle = strokeColor;\n ctx.beginPath();\n ctx.arc(lastX, lastY, 2.5, 0, Math.PI * 2);\n ctx.fill();\n ctx.restore();\n\n // Hover veya seçili durumda sağda \"Detaylı Grafik Modalı Aç (↗)\" ikonu göster\n if (isHovered || isSelected) {\n ctx.save();\n const btnSize = 18;\n const btnX = x + width - btnSize - 4;\n const btnY = y + (height - btnSize) / 2;\n\n ctx.fillStyle = theme.isDark ? 'rgba(56, 189, 248, 0.2)' : 'rgba(2, 132, 199, 0.12)';\n ctx.beginPath();\n ctx.roundRect(btnX, btnY, btnSize, btnSize, 4);\n ctx.fill();\n\n ctx.fillStyle = theme.dom.accentColor;\n ctx.font = `700 11px ${theme.fontFamily}`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText('↗', btnX + btnSize / 2, btnY + btnSize / 2);\n ctx.restore();\n }\n}\n","import { IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { paintSparkline } from './SparklinePainter';\n\nexport const SparklineColumnPlugin: IColumnTypePlugin<number[]> = {\n type: 'sparkline',\n paint: paintSparkline,\n editorComponent: undefined, // Salt okunur grafik\n\n parseClipboard(text) {\n return text.split(',').map((s) => parseFloat(s.trim())).filter((n) => !isNaN(n));\n },\n\n formatClipboard(value) {\n return Array.isArray(value) ? value.join(',') : '';\n },\n};\n","import { CellPaintContext } from '../../IColumnTypePlugin';\n\nexport function paintAction({ ctx, column, theme, x, y, width, height, isHovered }: CellPaintContext): void {\n const pad = 6;\n const btnH = 22;\n const btnY = y + (height - btnH) / 2;\n const btnW = width - pad * 2;\n if (btnW <= 10) return;\n\n ctx.save();\n\n // Buton arka planı\n ctx.fillStyle = isHovered\n ? theme.canvas.selectionBorder\n : theme.isDark\n ? '#2C2C2E'\n : '#F2F2F7';\n ctx.beginPath();\n ctx.roundRect(x + pad, btnY, btnW, btnH, 4);\n ctx.fill();\n\n // Buton çerçevesi\n ctx.strokeStyle = theme.isDark ? '#3A3A3C' : '#E5E5EA';\n ctx.lineWidth = 1;\n ctx.stroke();\n\n // Buton metni\n ctx.fillStyle = isHovered ? '#FFFFFF' : theme.canvas.cellText;\n ctx.font = `500 11px ${theme.fontFamily}`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(column.buttonText || 'İşlem', x + width / 2, y + height / 2);\n\n ctx.restore();\n}\n","import { IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { paintAction } from './ActionPainter';\n\nexport const ActionColumnPlugin: IColumnTypePlugin<any> = {\n type: 'action',\n paint: paintAction,\n\n onPointerDown({ column, row, rowIndex, value }) {\n if (column.onActionClick) {\n column.onActionClick(row ?? value, rowIndex ?? 0);\n return { handled: true };\n }\n return { handled: false };\n },\n\n onKeyDown({ event, column, row, rowIndex, value }) {\n if (event.key === 'Enter') {\n event.preventDefault();\n if (column.onActionClick) {\n column.onActionClick(row ?? value, rowIndex ?? 0);\n return true;\n }\n }\n return false;\n },\n};\n","import { CellPaintContext } from '../../IColumnTypePlugin';\n\nexport function paintPdf({\n ctx,\n value,\n theme,\n x,\n y,\n width,\n height,\n isHovered,\n column,\n}: CellPaintContext<string>): void {\n const raw = value != null ? String(value).trim() : '';\n if (!raw) {\n return;\n }\n\n const centerY = y + height / 2;\n const btnHeight = 22;\n const btnY = centerY - btnHeight / 2;\n\n const totalW = 78;\n const startX =\n column.align === 'left'\n ? x + 8\n : column.align === 'right'\n ? x + width - totalW - 8\n : x + Math.max(6, (width - totalW) / 2);\n\n const btn1X = startX;\n const btn1W = 48;\n const btn2X = startX + 52;\n const btn2W = 26;\n\n ctx.save();\n\n // Button 1: PDF Badge\n const isDark = theme.isDark;\n const bg1 = isDark\n ? isHovered\n ? 'rgba(239, 68, 68, 0.35)'\n : 'rgba(239, 68, 68, 0.18)'\n : isHovered\n ? 'rgba(220, 38, 38, 0.20)'\n : 'rgba(239, 68, 68, 0.10)';\n\n const border1 = isDark ? 'rgba(239, 68, 68, 0.65)' : 'rgba(220, 38, 38, 0.50)';\n\n ctx.beginPath();\n if (typeof ctx.roundRect === 'function') {\n ctx.roundRect(btn1X, btnY, btn1W, btnHeight, 4);\n } else {\n ctx.rect(btn1X, btnY, btn1W, btnHeight);\n }\n ctx.fillStyle = bg1;\n ctx.fill();\n ctx.strokeStyle = border1;\n ctx.lineWidth = 1;\n ctx.stroke();\n\n ctx.fillStyle = isDark ? '#F87171' : '#DC2626';\n ctx.font = `700 10.5px ${theme.fontFamily}`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText('📄 PDF', btn1X + btn1W / 2, centerY + 0.5);\n\n // Button 2: Open in New Tab\n const bg2 = isDark\n ? isHovered\n ? 'rgba(56, 189, 248, 0.28)'\n : 'rgba(255, 255, 255, 0.06)'\n : isHovered\n ? 'rgba(2, 132, 199, 0.18)'\n : 'rgba(0, 0, 0, 0.04)';\n\n const border2 = isDark\n ? isHovered\n ? '#38BDF8'\n : 'rgba(255, 255, 255, 0.15)'\n : isHovered\n ? '#0284C7'\n : 'rgba(0, 0, 0, 0.12)';\n\n ctx.beginPath();\n if (typeof ctx.roundRect === 'function') {\n ctx.roundRect(btn2X, btnY, btn2W, btnHeight, 4);\n } else {\n ctx.rect(btn2X, btnY, btn2W, btnHeight);\n }\n ctx.fillStyle = bg2;\n ctx.fill();\n ctx.strokeStyle = border2;\n ctx.lineWidth = 1;\n ctx.stroke();\n\n ctx.fillStyle = isDark ? (isHovered ? '#38BDF8' : '#94A3B8') : isHovered ? '#0284C7' : '#64748B';\n ctx.font = `700 13px ${theme.fontFamily}`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText('↗', btn2X + btn2W / 2, centerY);\n\n ctx.restore();\n}\n","import { IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { paintPdf } from './PdfPainter';\n\nfunction resolvePdfUrl(rawVal: any, prefix?: string): string {\n const str = rawVal != null ? String(rawVal).trim() : '';\n if (!str) return '';\n if (/^https?:\\/\\//i.test(str)) return str;\n const p = prefix != null ? prefix : '/';\n if (str.startsWith('/')) return str;\n return `${p}${str}`;\n}\n\nexport const PdfColumnPlugin: IColumnTypePlugin<string> = {\n type: 'pdf',\n paint: paintPdf,\n\n onPointerDown({ localX, column, row, rowIndex, value }) {\n const raw = value != null ? String(value).trim() : '';\n if (!raw) return { handled: false };\n\n const totalW = 78;\n const startX =\n column.align === 'left'\n ? 8\n : column.align === 'right'\n ? column.width - totalW - 8\n : Math.max(6, (column.width - totalW) / 2);\n\n const btn2X = startX + 52;\n const btn2W = 26;\n const resolvedUrl = resolvePdfUrl(raw, column.urlPrefix);\n\n // If clicked on button 2 (external link icon ↗)\n if (localX >= btn2X && localX <= btn2X + btn2W) {\n if (column.onPdfOpenNewTabClick) {\n column.onPdfOpenNewTabClick(resolvedUrl, row, rowIndex ?? 0);\n } else if (typeof window !== 'undefined') {\n window.open(resolvedUrl, '_blank', 'noopener,noreferrer');\n }\n return { handled: true, shouldOpenEditor: false };\n }\n\n // Clicked button 1 (PDF badge) or anywhere in cell\n if (column.onPdfClick) {\n column.onPdfClick(resolvedUrl, row, rowIndex ?? 0);\n return { handled: true, shouldOpenEditor: false };\n }\n\n // Default: Dispatch custom event for SheetGL host to open viewer modal\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent('sheetgl-open-pdf', {\n detail: {\n url: resolvedUrl,\n title: column.title,\n row,\n rowIndex,\n column,\n },\n })\n );\n }\n\n return { handled: true, shouldOpenEditor: false };\n },\n\n comparator(a, b) {\n return String(a ?? '').localeCompare(String(b ?? ''), 'tr-TR');\n },\n\n formatClipboard(val) {\n return String(val ?? '');\n },\n\n parseClipboard(text) {\n return text.trim();\n },\n};\n","import { ColumnTypeRegistry } from './ColumnTypeRegistry';\nimport { TextColumnPlugin } from './types/TextColumn';\nimport { NumberColumnPlugin } from './types/NumberColumn';\nimport { CurrencyColumnPlugin } from './types/CurrencyColumn';\nimport { PercentColumnPlugin } from './types/PercentColumn';\nimport { BooleanColumnPlugin } from './types/BooleanColumn';\nimport { SelectColumnPlugin } from './types/SelectColumn';\nimport { DropdownColumnPlugin } from './types/DropdownColumn';\nimport { MultiSelectColumnPlugin } from './types/MultiSelectColumn';\nimport { LookupColumnPlugin } from './types/LookupColumn';\nimport { ObjectColumnPlugin } from './types/ObjectColumn';\nimport { DateColumnPlugin } from './types/DateColumn';\nimport { DateTimeColumnPlugin } from './types/DateTimeColumn';\nimport { TimeColumnPlugin } from './types/TimeColumn';\nimport { EmailColumnPlugin } from './types/EmailColumn';\nimport { UrlColumnPlugin } from './types/UrlColumn';\nimport { PhoneColumnPlugin } from './types/PhoneColumn';\nimport { ColorColumnPlugin } from './types/ColorColumn';\nimport { RatingColumnPlugin } from './types/RatingColumn';\nimport { ProgressColumnPlugin } from './types/ProgressColumn';\nimport { SparklineColumnPlugin } from './types/SparklineColumn';\nimport { ActionColumnPlugin } from './types/ActionColumn';\nimport { PdfColumnPlugin } from './types/PdfColumn';\n\nlet initialized = false;\n\nexport function initDefaultColumnPlugins(): void {\n if (initialized) return;\n\n ColumnTypeRegistry.register(TextColumnPlugin);\n ColumnTypeRegistry.register(NumberColumnPlugin);\n ColumnTypeRegistry.register(CurrencyColumnPlugin);\n ColumnTypeRegistry.register(PercentColumnPlugin);\n ColumnTypeRegistry.register(BooleanColumnPlugin);\n ColumnTypeRegistry.register(SelectColumnPlugin);\n ColumnTypeRegistry.register(DropdownColumnPlugin);\n ColumnTypeRegistry.register(MultiSelectColumnPlugin);\n ColumnTypeRegistry.register(LookupColumnPlugin);\n ColumnTypeRegistry.register(ObjectColumnPlugin);\n ColumnTypeRegistry.register(DateColumnPlugin);\n ColumnTypeRegistry.register(DateTimeColumnPlugin);\n ColumnTypeRegistry.register(TimeColumnPlugin);\n ColumnTypeRegistry.register(EmailColumnPlugin);\n ColumnTypeRegistry.register(UrlColumnPlugin);\n ColumnTypeRegistry.register(PhoneColumnPlugin);\n ColumnTypeRegistry.register(ColorColumnPlugin);\n ColumnTypeRegistry.register(RatingColumnPlugin);\n ColumnTypeRegistry.register(ProgressColumnPlugin);\n ColumnTypeRegistry.register(SparklineColumnPlugin);\n ColumnTypeRegistry.register(ActionColumnPlugin);\n ColumnTypeRegistry.register(PdfColumnPlugin);\n\n initialized = true;\n}\n","import { IGridLocale } from '../IGridLocale';\n\nexport const enUS: IGridLocale = {\n code: 'en-US',\n language: 'English (US)',\n\n searchPlaceholder: 'Search in table (Ctrl+F)...',\n addGroup: '+ Add to Group',\n exportCsv: 'Export CSV',\n rows: 'Rows',\n columns: 'Columns',\n systemTheme: 'System (Auto)',\n\n formulaBarPlaceholder: 'Empty',\n totalRecords: 'Total Records',\n\n searchValuesPlaceholder: 'Search values...',\n selectAll: '(Select All)',\n clear: 'Clear',\n apply: 'Apply',\n cancel: 'Cancel',\n loading: 'Loading...',\n noMatches: 'No matching records',\n\n emptyText: '(Blank)',\n trueText: 'TRUE',\n falseText: 'FALSE',\n ratingOutOf: (val: number) => `${val} / 5 Stars`,\n groupRecordCount: (count: number) => `${count.toLocaleString('en-US')} records`,\n};\n","import { IGridLocale } from '../IGridLocale';\n\nexport const trTR: IGridLocale = {\n code: 'tr-TR',\n language: 'Türkçe (TR)',\n\n searchPlaceholder: 'Tabloda ara (Ctrl+F)...',\n addGroup: '+ Gruba Ekle',\n exportCsv: 'CSV İndir',\n rows: 'Satır',\n columns: 'Sütun',\n systemTheme: 'Sistem (Otomatik)',\n\n formulaBarPlaceholder: 'Boş',\n totalRecords: 'Toplam Kayıt',\n\n searchValuesPlaceholder: 'Değer ara...',\n selectAll: '(Tümünü Seç)',\n clear: 'Temizle',\n apply: 'Uygula',\n cancel: 'İptal',\n loading: 'Yükleniyor...',\n noMatches: 'Kayıt bulunamadı',\n\n emptyText: '(Boş)',\n trueText: 'DOĞRU',\n falseText: 'YANLIŞ',\n ratingOutOf: (val: number) => `${val} / 5 Yıldız`,\n groupRecordCount: (count: number) => `${count.toLocaleString('tr-TR')} kayıt`,\n};\n","import { IGridLocale } from './IGridLocale';\nimport { enUS } from './locales/enUS';\nimport { trTR } from './locales/trTR';\n\nexport type { IGridLocale };\nexport type LocaleInput = string | Partial<IGridLocale>;\n\nexport class LocaleEngine {\n private static locales: Map<string, IGridLocale> = new Map([\n ['en', enUS],\n ['en-US', enUS],\n ['tr', trTR],\n ['tr-TR', trTR],\n ]);\n\n public static registerLocale(name: string, locale: IGridLocale): void {\n this.locales.set(name, locale);\n }\n\n public static detectBrowserLocaleCode(): 'tr' | 'en' {\n if (typeof navigator !== 'undefined' && navigator.language) {\n return navigator.language.toLowerCase().startsWith('tr') ? 'tr' : 'en';\n }\n return 'en';\n }\n\n public static resolve(input?: LocaleInput): IGridLocale {\n if (!input || input === 'auto') {\n const code = this.detectBrowserLocaleCode();\n return this.locales.get(code) || enUS;\n }\n\n if (typeof input === 'string') {\n const exact = this.locales.get(input);\n if (exact) return exact;\n if (input.toLowerCase().startsWith('tr')) return trTR;\n return enUS;\n }\n\n return {\n ...enUS,\n ...input,\n };\n }\n}\n","import React, { useEffect, useRef, useState, useMemo, useCallback, forwardRef, useImperativeHandle } from 'react';\r\nimport { GridApi } from '../core/GridApi';\r\nimport { useGridSelection } from '../hooks/useGridSelection';\r\nimport { useGridGeometry } from '../hooks/useGridGeometry';\r\nimport {\r\n ColumnDef,\r\n ColumnGroupDef,\r\n ActiveOverlayState,\r\n GridPermissions,\r\n GridToolbarConfig,\r\n GridSummaryConfig,\r\n RowSelectionMode,\r\n EditingStartEvent,\r\n CellValueChangingEvent,\r\n CellValueChangedEvent,\r\n RowInsertingEvent,\r\n RowInsertedEvent,\r\n RowUpdatingEvent,\r\n RowUpdatedEvent,\r\n RowRemovingEvent,\r\n RowRemovedEvent,\r\n SavingEvent,\r\n SavedEvent,\r\n} from '../types/grid';\r\nimport { IDataStore, BatchChanges, RemoteOperationsConfig } from '../types/store';\r\nimport { ColumnFilterState, FilterDescriptor, SortDescriptor } from '../types/filter';\r\nimport { GroupDescriptor, SummaryType } from '../types/group';\r\nimport { IGridThemeTokens } from '../theme/IGridTheme';\r\nimport { ThemeEngine, ThemeInput } from '../theme/ThemeEngine';\r\nimport { GeometryEngine } from '../core/GeometryEngine';\r\nimport { SelectionModel } from '../core/SelectionModel';\r\nimport { HistoryManager } from '../core/HistoryManager';\r\nimport { ValidationEngine } from '../core/ValidationEngine';\r\nimport { CanvasRenderer } from '../renderer/CanvasRenderer';\r\nimport { DynamicCellEditor } from '../overlays/DynamicCellEditor';\r\nimport { HeaderFilterPopover } from '../overlays/HeaderFilterPopover';\r\nimport { ContextMenuOverlay, ContextMenuState } from '../overlays/ContextMenuOverlay';\r\nimport { SparklineModalOverlay, SparklineModalState } from '../overlays/SparklineModalOverlay';\r\nimport { PdfPreviewModalOverlay, PdfPreviewModalState } from '../overlays/PdfPreviewModalOverlay';\r\nimport { BatchChangesModal } from '../overlays/BatchChangesModal';\r\nimport { DeleteConfirmProgressModal } from '../overlays/DeleteConfirmProgressModal';\r\nimport { ToolBar } from './ToolBar';\r\nimport { FormulaBar } from './FormulaBar';\r\nimport { SummaryFooter, SelectionSummaryStats } from './SummaryFooter';\r\nimport { MaterialIcon } from './MaterialIcon';\r\nimport { LocalDataStore } from '../data/LocalDataStore';\r\nimport { initDefaultColumnPlugins } from '../columns/initPlugins';\r\nimport { ColumnTypeRegistry } from '../columns/ColumnTypeRegistry';\r\nimport { LocaleEngine, LocaleInput, IGridLocale } from '../i18n/LocaleEngine';\r\n\r\nexport interface SheetGLProps {\r\n dataSource: any[] | IDataStore;\r\n columns: ColumnDef[];\r\n /** Optional Banded Column Group definitions for multi-level header bands and group-wide theme-aware coloring */\r\n columnGroups?: ColumnGroupDef[];\r\n /** Height of the top Banded Column Group header row in pixels when column groups are active (default: 30) */\r\n groupHeaderHeight?: number;\r\n theme?: ThemeInput;\r\n onThemeChange?: (themeName: string) => void;\r\n locale?: LocaleInput;\r\n onLocaleChange?: (localeCode: 'tr' | 'en', locale: IGridLocale) => void;\r\n rowHeight?: number;\r\n headerHeight?: number;\r\n initialSort?: SortDescriptor[];\r\n initialGroups?: GroupDescriptor[];\r\n permissions?: GridPermissions;\r\n batchEditMode?: boolean;\r\n /**\r\n * Toolbar visibility & configuration (`buttonDisplayMode: 'icon' | 'icon-text' | 'text'`, item visibility, customItems)\r\n */\r\n toolbar?: boolean | GridToolbarConfig;\r\n onToolbarConfigChange?: (config: GridToolbarConfig) => void;\r\n /**\r\n * Summary Row (bottom footer) visibility & configuration (`showTotalCount`, `showSelectionStats`, `showColumnSummaries`, `items`, `columnSummaryTypes`)\r\n */\r\n summaryRow?: boolean | GridSummaryConfig;\r\n onSummaryConfigChange?: (config: GridSummaryConfig) => void;\r\n /** Whether to show the Excel Formula & Coordinate Bar below the toolbar (default: true) */\r\n showFormulaBar?: boolean;\r\n /** Row selection mode: 'none' | 'single' (Single Choice) | 'multiple' (Multiple Choice with checkboxes) */\r\n selectionMode?: RowSelectionMode;\r\n onSelectionModeChange?: (mode: RowSelectionMode) => void;\r\n selectedRowKeys?: any[];\r\n onSelectionChanged?: (selectedRowKeys: any[], selectedRowsData: any[]) => void;\r\n onPermissionsChange?: (permissions: GridPermissions) => void;\r\n onCellChange?: (row: any, columnId: string, value: any) => void;\r\n /** DevExtreme-style remote operations configuration */\r\n remoteOperations?: boolean | RemoteOperationsConfig;\r\n /** Filter change callback */\r\n /** Callback when user clicks PDF viewer button in a PDF/file column */\r\n onPdfPreviewClick?: (url: string, row: any, column: ColumnDef) => void;\r\n onFilterChange?: (\r\n filter: FilterDescriptor | null,\r\n columnFilters: Record<string, ColumnFilterState>\r\n ) => void;\r\n /** Callback fired when a column is interactively resized */\r\n onColumnResize?: (columnId: string, newWidth: number) => void;\r\n\r\n /** Navigation direction when Enter key commits cell edit: 'down' | 'right' | 'auto' (default: 'auto' which moves right on inserted rows and down on existing rows) */\r\n enterNavigation?: 'down' | 'right' | 'auto';\r\n // Enterprise Lifecycle Event Triggers\r\n onEditingStart?: (e: EditingStartEvent) => void;\r\n onCellValueChanging?: (e: CellValueChangingEvent) => void;\r\n onCellValueChanged?: (\r\n e: CellValueChangedEvent\r\n ) => void | Record<string, any> | Promise<void | Record<string, any>>;\r\n onRowInserting?: (e: RowInsertingEvent) => void | Promise<void>;\r\n onRowInserted?: (e: RowInsertedEvent) => void;\r\n onRowUpdating?: (e: RowUpdatingEvent) => void | Promise<void>;\r\n onRowUpdated?: (e: RowUpdatedEvent) => void;\r\n onRowRemoving?: (e: RowRemovingEvent) => void | Promise<void>;\r\n onRowRemoved?: (e: RowRemovedEvent) => void;\r\n onSaving?: (e: SavingEvent) => void | Promise<void>;\r\n onSaved?: (e: SavedEvent) => void;\r\n onAddNewRow?: () => void;\r\n onRefresh?: () => void;\r\n\r\n style?: React.CSSProperties;\r\n className?: string;\r\n}\r\n\r\nexport function compileColumnFilters(\r\n map: Record<string, ColumnFilterState>,\r\n excludeColumnId?: string\r\n): FilterDescriptor | null {\r\n const states = Object.values(map);\r\n if (states.length === 0) return null;\r\n\r\n const singleFilters: FilterDescriptor[] = [];\r\n for (const st of states) {\r\n if (excludeColumnId && st.columnId === excludeColumnId) continue;\r\n if (st.mode === 'values') {\r\n if (st.semanticFilter) {\r\n singleFilters.push(st.semanticFilter);\r\n } else if (st.selectedValues) {\r\n singleFilters.push([st.columnId, 'in', st.selectedValues]);\r\n }\r\n } else if (st.mode === 'condition' && st.operator) {\r\n if (st.operator === 'between') {\r\n singleFilters.push([st.columnId, 'between', [st.value1, st.value2]]);\r\n } else {\r\n singleFilters.push([st.columnId, st.operator, st.value1]);\r\n }\r\n }\r\n }\r\n\r\n if (singleFilters.length === 0) return null;\r\n if (singleFilters.length === 1) return singleFilters[0];\r\n\r\n const composite: any[] = [];\r\n singleFilters.forEach((f, idx) => {\r\n if (idx > 0) composite.push('and');\r\n composite.push(f);\r\n });\r\n return composite;\r\n}\r\n\r\nexport const SheetGL = forwardRef<GridApi, SheetGLProps>((\r\n {\r\n dataSource,\r\n columns: userColumns,\r\n columnGroups = [],\r\n groupHeaderHeight = 30,\r\n theme: userTheme = 'apple-dark',\r\n onThemeChange,\r\n locale: userLocale,\r\n onLocaleChange,\r\n rowHeight = 34,\r\n headerHeight = 38,\r\n initialSort = [],\r\n initialGroups = [],\r\n permissions: userPermissions,\r\n batchEditMode = true,\r\n toolbar: userToolbar,\r\n onToolbarConfigChange,\r\n summaryRow: userSummaryRow,\r\n onSummaryConfigChange,\r\n showFormulaBar = true,\r\n enterNavigation = 'auto',\r\n selectionMode: userSelectionMode = 'none',\r\n onSelectionModeChange,\r\n selectedRowKeys: userSelectedRowKeys,\r\n onSelectionChanged,\r\n onPermissionsChange,\r\n onPdfPreviewClick,\r\n onCellChange,\r\n onEditingStart,\r\n onCellValueChanging,\r\n onCellValueChanged,\r\n onRowInserting,\r\n onRowInserted,\r\n onRowUpdating,\r\n onRowUpdated,\r\n onRowRemoving,\r\n onRowRemoved,\r\n onSaving,\r\n onSaved,\r\n onAddNewRow,\r\n onRefresh,\r\n remoteOperations,\r\n onFilterChange,\r\n onColumnResize,\r\n style,\r\n className,\r\n },\r\n ref\r\n) => {\r\n // 1. Initialize Default Column Plugins synchronously on first render\r\n useMemo(() => {\r\n initDefaultColumnPlugins();\r\n }, []);\r\n\r\n // 2. DataStore Adaptation\r\n const store = useMemo<IDataStore>(() => {\r\n if (Array.isArray(dataSource)) {\r\n const initialSummaries: Record<string, SummaryType> = {};\r\n userColumns.forEach((c) => {\r\n if (c.summaryType) {\r\n initialSummaries[c.id] = c.summaryType;\r\n }\r\n });\r\n if (userSummaryRow && typeof userSummaryRow === 'object') {\r\n if (userSummaryRow.columnSummaryTypes) {\r\n Object.assign(initialSummaries, userSummaryRow.columnSummaryTypes);\r\n }\r\n if (Array.isArray(userSummaryRow.items)) {\r\n userSummaryRow.items.forEach((item) => {\r\n initialSummaries[item.columnId] = item.summaryType;\r\n });\r\n }\r\n }\r\n return new LocalDataStore({\r\n data: dataSource,\r\n keyField: 'id',\r\n batchMode: batchEditMode,\r\n initialSummaries: Object.keys(initialSummaries).length > 0 ? initialSummaries : undefined,\r\n });\r\n }\r\n return dataSource;\r\n }, [dataSource]);\r\n\r\n useEffect(() => {\r\n store.setBatchMode?.(batchEditMode);\r\n }, [store, batchEditMode]);\r\n\r\n // 3. Theme Resolution\r\n const [currentThemeName, setCurrentThemeName] = useState<ThemeInput>(userTheme);\r\n const [resolvedTheme, setResolvedTheme] = useState<IGridThemeTokens>(() =>\r\n ThemeEngine.resolve(userTheme)\r\n );\r\n\r\n useEffect(() => {\r\n setCurrentThemeName(userTheme);\r\n }, [userTheme]);\r\n\r\n useEffect(() => {\r\n setResolvedTheme(ThemeEngine.resolve(currentThemeName));\r\n if (currentThemeName === 'system') {\r\n const unsub = ThemeEngine.watchSystem(() => {\r\n setResolvedTheme(ThemeEngine.resolve('system'));\r\n });\r\n return unsub;\r\n }\r\n }, [currentThemeName]);\r\n\r\n // 3b. Locale Resolution (i18n)\r\n const [currentLocale, setCurrentLocale] = useState<IGridLocale>(() =>\r\n LocaleEngine.resolve(userLocale)\r\n );\r\n\r\n useEffect(() => {\r\n if (userLocale) {\r\n setCurrentLocale(LocaleEngine.resolve(userLocale));\r\n }\r\n }, [userLocale]);\r\n\r\n // 3c. Permissions State\r\n const [permissions, setPermissions] = useState<GridPermissions>(\r\n userPermissions || {\r\n mode: 'write',\r\n allowAdding: true,\r\n allowUpdating: true,\r\n allowDeleting: true,\r\n allowDuplicating: true,\r\n allowClipboardPaste: true,\r\n allowExport: true,\r\n allowFiltering: true,\r\n allowSorting: true,\r\n allowGrouping: true,\r\n allowBatchSave: true,\r\n }\r\n );\r\n\r\n useEffect(() => {\r\n if (userPermissions) {\r\n setPermissions(userPermissions);\r\n }\r\n }, [userPermissions]);\r\n\r\n const handleUpdatePermissions = (next: GridPermissions) => {\r\n setPermissions(next);\r\n onPermissionsChange?.(next);\r\n };\r\n\r\n // 3d. Toolbar & Summary Row Configuration State\r\n const [toolbarConfig, setToolbarConfig] = useState<GridToolbarConfig>(() => {\r\n if (userToolbar === false) return { visible: false, buttonDisplayMode: 'icon-text' };\r\n if (userToolbar && typeof userToolbar === 'object') {\r\n return { visible: true, buttonDisplayMode: 'icon-text', ...userToolbar };\r\n }\r\n return { visible: true, buttonDisplayMode: 'icon-text' };\r\n });\r\n\r\n useEffect(() => {\r\n if (userToolbar === false) {\r\n setToolbarConfig((prev) => ({ ...prev, visible: false }));\r\n } else if (userToolbar === true) {\r\n setToolbarConfig((prev) => ({ ...prev, visible: true }));\r\n } else if (userToolbar && typeof userToolbar === 'object') {\r\n setToolbarConfig((prev) => ({\r\n ...prev,\r\n visible: userToolbar.visible !== false,\r\n ...userToolbar,\r\n }));\r\n }\r\n }, [userToolbar]);\r\n\r\n const handleUpdateToolbarConfig = useCallback(\r\n (patch: Partial<GridToolbarConfig>) => {\r\n setToolbarConfig((prev) => {\r\n const next = { ...prev, ...patch };\r\n onToolbarConfigChange?.(next);\r\n return next;\r\n });\r\n },\r\n [onToolbarConfigChange]\r\n );\r\n\r\n const [summaryConfig, setSummaryConfig] = useState<GridSummaryConfig>(() => {\r\n if (userSummaryRow === false) return { visible: false };\r\n if (userSummaryRow && typeof userSummaryRow === 'object') {\r\n return {\r\n visible: true,\r\n showTotalCount: true,\r\n showSelectionStats: true,\r\n showColumnSummaries: true,\r\n allowConfiguration: true,\r\n ...userSummaryRow,\r\n };\r\n }\r\n return {\r\n visible: true,\r\n showTotalCount: true,\r\n showSelectionStats: true,\r\n showColumnSummaries: true,\r\n allowConfiguration: true,\r\n };\r\n });\r\n\r\n useEffect(() => {\r\n if (userSummaryRow === false) {\r\n setSummaryConfig((prev) => ({ ...prev, visible: false }));\r\n } else if (userSummaryRow === true) {\r\n setSummaryConfig((prev) => ({ ...prev, visible: true }));\r\n } else if (userSummaryRow && typeof userSummaryRow === 'object') {\r\n setSummaryConfig((prev) => ({\r\n ...prev,\r\n visible: userSummaryRow.visible !== false,\r\n ...userSummaryRow,\r\n }));\r\n if (userSummaryRow.columnSummaryTypes) {\r\n Object.entries(userSummaryRow.columnSummaryTypes).forEach(([colId, sType]) => {\r\n store.setSummaryType?.(colId, sType);\r\n });\r\n }\r\n if (Array.isArray(userSummaryRow.items)) {\r\n userSummaryRow.items.forEach((item) => {\r\n store.setSummaryType?.(item.columnId, item.summaryType);\r\n });\r\n }\r\n }\r\n }, [userSummaryRow, store]);\r\n\r\n const handleUpdateSummaryConfig = useCallback(\r\n (patch: Partial<GridSummaryConfig>) => {\r\n setSummaryConfig((prev) => {\r\n const next = { ...prev, ...patch };\r\n onSummaryConfigChange?.(next);\r\n return next;\r\n });\r\n },\r\n [onSummaryConfigChange]\r\n );\r\n\r\n // 4. Row Selection State\r\n const [rowSelectionMode, setRowSelectionMode] = useState<RowSelectionMode>(userSelectionMode);\r\n useEffect(() => {\r\n setRowSelectionMode(userSelectionMode);\r\n }, [userSelectionMode]);\r\n\r\n const [selectedRowKeysSet, setSelectedRowKeysSet] = useState<Set<any>>(\r\n () => new Set(userSelectedRowKeys || [])\r\n );\r\n useEffect(() => {\r\n if (userSelectedRowKeys) {\r\n setSelectedRowKeysSet(new Set(userSelectedRowKeys));\r\n }\r\n }, [userSelectedRowKeys]);\r\n\r\n // 4b. Geometry & Layout Hook\r\n const {\r\n containerRef,\r\n gridSurfaceRef,\r\n scrollContainerRef,\r\n geometryRef,\r\n columns,\r\n effectiveColumns,\r\n setColumns,\r\n updateColumnDef: handleUpdateColumnDef,\r\n setColumnWidth: handleSetColumnWidth,\r\n getColumnWidth: handleGetColumnWidth,\r\n resizingCol,\r\n setResizingCol,\r\n scrollPosRef,\r\n scrollIndicator,\r\n setScrollIndicator,\r\n handleScroll,\r\n ensureCellVisible,\r\n scrollTo,\r\n scrollToTop,\r\n scrollToBottom,\r\n getViewportCoords,\r\n checkEdgeAutoScroll,\r\n getTotalWidth,\r\n getTotalHeight,\r\n } = useGridGeometry({\r\n userColumns,\r\n rowHeight,\r\n headerHeight,\r\n columnGroups,\r\n groupHeaderHeight,\r\n rowSelectionMode,\r\n rowCount: store.getRowCount(),\r\n onRequestRender: () => requestRenderRef.current(),\r\n onActiveOverlayClear: () => setActiveOverlay(null),\r\n onColumnResize,\r\n });\r\n\r\n\r\n const historyRef = useRef<HistoryManager>(new HistoryManager(100));\r\n // 5. UI State Management\r\n const [sortRules, setSortRules] = useState<SortDescriptor[]>(initialSort);\r\n const [groups, setGroups] = useState<GroupDescriptor[]>(initialGroups);\r\n const [columnFilters, setColumnFilters] = useState<Record<string, ColumnFilterState>>({});\r\n const [searchKeyword, setSearchKeyword] = useState<string>('');\r\n const [activeOverlay, setActiveOverlay] = useState<ActiveOverlayState | null>(null);\r\n const [editorValidationError, setEditorValidationError] = useState<string | null>(null);\r\n const [isEditorValidating, setIsEditorValidating] = useState<boolean>(false);\r\n const [headerFilterState, setHeaderFilterState] = useState<{\r\n column: ColumnDef;\r\n rect: { x: number; y: number; width: number; height: number };\r\n } | null>(null);\r\n\r\n const activeBaseFilter = useMemo(() => {\r\n if (!headerFilterState) return undefined;\r\n return compileColumnFilters(columnFilters, headerFilterState.column.id);\r\n }, [columnFilters, headerFilterState?.column.id]);\r\n const [contextMenu, setContextMenu] = useState<ContextMenuState | null>(null);\r\n const [sparklineModal, setSparklineModal] = useState<SparklineModalState | null>(null);\r\n const [pdfModal, setPdfModal] = useState<PdfPreviewModalState | null>(null);\r\n const [showBatchModal, setShowBatchModal] = useState<boolean>(false);\r\n const [deleteConfirmModal, setDeleteConfirmModal] = useState<{\r\n rowKeys: any[];\r\n sampleRows: Record<string, any>[];\r\n singleRowIndex?: number;\r\n } | null>(null);\r\n const [toastMessage, setToastMessage] = useState<{ text: string; type: 'info' | 'warning' | 'success' } | null>(null);\r\n\r\n // Hover & Drag States\r\n const hoveredCellRef = useRef<{ row: number; col: number } | null>(null);\r\n const hoveredFilterColRef = useRef<number | null>(null);\r\n const [cursorStyle, setCursorStyle] = useState<string>('cell');\r\n\r\n const [fillDragState, setFillDragState] = useState<{\r\n mode: 'corner' | 'right-duplicate';\r\n sourceRange: { minRow: number; maxRow: number; minCol: number; maxCol: number };\r\n targetRange: { minRow: number; maxRow: number; minCol: number; maxCol: number };\r\n } | null>(null);\r\n\r\n // Async Backend Cascading Row Loading Keys\r\n const loadingRowKeysRef = useRef<Set<any>>(new Set());\r\n\r\n // Internal clipboard fallback for context menu Copy/Paste\r\n const internalClipboardRef = useRef<string>('');\r\n\r\n // DOM Element Refs (canvas remains local to SheetGL)\r\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\r\n\r\n const showToast = useCallback((text: string, type: 'info' | 'warning' | 'success' = 'info') => {\r\n setToastMessage({ text, type });\r\n setTimeout(() => {\r\n setToastMessage((prev) => (prev?.text === text ? null : prev));\r\n }, 2600);\r\n }, []);\r\n\r\n // Store listener\r\n const [storeVersion, setStoreVersion] = useState<number>(0);\r\n useEffect(() => {\r\n const handleLoaded = () => {\r\n setStoreVersion((v) => v + 1);\r\n };\r\n store.on('loaded', handleLoaded);\r\n return () => store.off('loaded', handleLoaded);\r\n }, [store]);\r\n\r\n // Apply initialSort and initialGroups if provided\r\n useEffect(() => {\r\n if (initialSort.length > 0) {\r\n store.setSorting(initialSort);\r\n }\r\n if (initialGroups.length > 0) {\r\n store.setGrouping(initialGroups);\r\n }\r\n }, []);\r\n\r\n const requestRenderRef = useRef<() => void>(() => {});\r\n\r\n // 5b. Selection Hook\r\n const {\r\n selectionRef,\r\n selectionVersion,\r\n setSelectionVersion,\r\n selectedCellUI,\r\n setSelectedCellUI,\r\n isDraggingSelection,\r\n setIsDraggingSelection,\r\n isDraggingRowNumbers,\r\n setIsDraggingRowNumbers,\r\n selectCell,\r\n selectRange,\r\n selectAll,\r\n selectFullRow,\r\n moveSelection: hookMoveSelection,\r\n clearSelection,\r\n stopDragging,\r\n getActiveCell,\r\n getSelectedRange,\r\n } = useGridSelection({\r\n onRequestRender: () => requestRenderRef.current(),\r\n });\r\n\r\n const activeFilterColumnIds = useMemo(\r\n () => new Set(Object.keys(columnFilters)),\r\n [columnFilters]\r\n );\r\n\r\n // 6. 60 FPS Render Loop\r\n const requestRender = useCallback(() => {\r\n if (!canvasRef.current) return;\r\n requestAnimationFrame(() => {\r\n if (!canvasRef.current) return;\r\n const surfaceW =\r\n gridSurfaceRef.current?.clientWidth ||\r\n containerRef.current?.clientWidth ||\r\n canvasRef.current.clientWidth ||\r\n 0;\r\n if (surfaceW > 0) {\r\n geometryRef.current.setViewportWidth(surfaceW);\r\n }\r\n CanvasRenderer.render({\r\n canvas: canvasRef.current,\r\n geometry: geometryRef.current,\r\n store,\r\n selection: selectionRef.current,\r\n theme: resolvedTheme,\r\n locale: currentLocale,\r\n scrollLeft: scrollPosRef.current.left,\r\n scrollTop: scrollPosRef.current.top,\r\n sortRules,\r\n searchKeyword,\r\n hoveredCell: hoveredCellRef.current,\r\n hoveredFilterColIndex: hoveredFilterColRef.current,\r\n activeFilterColumnIds,\r\n fillDragRange: fillDragState?.targetRange || null,\r\n loadingRowKeys: loadingRowKeysRef.current,\r\n permissions,\r\n selectionMode: rowSelectionMode,\r\n selectedRowKeys: selectedRowKeysSet,\r\n });\r\n });\r\n }, [\r\n store,\r\n resolvedTheme,\r\n currentLocale,\r\n sortRules,\r\n searchKeyword,\r\n activeFilterColumnIds,\r\n fillDragState,\r\n permissions,\r\n rowSelectionMode,\r\n selectedRowKeysSet,\r\n ]);\r\n\r\n requestRenderRef.current = requestRender;\r\n\r\n // 6b. Expose Imperative GridApi\r\n useImperativeHandle(\r\n ref,\r\n (): GridApi => ({\r\n requestRender,\r\n selectCell,\r\n selectRange,\r\n clearSelection,\r\n selectAll: () => selectAll(store.getRowCount(), geometryRef.current.columns.length),\r\n getActiveCell,\r\n getSelectedRange,\r\n ensureCellVisible,\r\n scrollTo,\r\n setColumnWidth: handleSetColumnWidth,\r\n getColumnWidth: handleGetColumnWidth,\r\n getTotalWidth,\r\n getTotalHeight: () => getTotalHeight(store.getRowCount()),\r\n }),\r\n [\r\n requestRender,\r\n selectCell,\r\n selectRange,\r\n clearSelection,\r\n selectAll,\r\n store,\r\n getActiveCell,\r\n getSelectedRange,\r\n ensureCellVisible,\r\n scrollTo,\r\n handleSetColumnWidth,\r\n handleGetColumnWidth,\r\n getTotalWidth,\r\n getTotalHeight,\r\n ]\r\n );\r\n\r\n useEffect(() => {\r\n requestRender();\r\n }, [requestRender, resolvedTheme, currentLocale, storeVersion, effectiveColumns, selectionVersion, rowSelectionMode, selectedRowKeysSet]);\r\n\r\n // 6c. PDF Preview Custom Event Listener\r\n useEffect(() => {\r\n const handleOpenPdfEvent = (e: Event) => {\r\n const custom = e as CustomEvent<{ url: string; title: string; row: any; column: ColumnDef }>;\r\n if (custom.detail) {\r\n if (onPdfPreviewClick) {\r\n onPdfPreviewClick(custom.detail.url, custom.detail.row, custom.detail.column);\r\n } else {\r\n setPdfModal({\r\n url: custom.detail.url,\r\n title: custom.detail.title,\r\n column: custom.detail.column,\r\n row: custom.detail.row,\r\n });\r\n }\r\n }\r\n };\r\n window.addEventListener('sheetgl-open-pdf', handleOpenPdfEvent);\r\n\r\n return () => {\r\n window.removeEventListener('sheetgl-open-pdf', handleOpenPdfEvent);\r\n };\r\n }, [onPdfPreviewClick]);\r\n // ============================================================================\r\n // PERMISSION & EDITABILITY CHECKER\r\n // ============================================================================\r\n const canEditCell = useCallback(\r\n (row: Record<string, any> | undefined, colDef: ColumnDef | undefined, rowIndex: number = 0, silent: boolean = false): boolean => {\r\n if (!colDef || !row) return false;\r\n const cType = (colDef.type || '').toLowerCase();\r\n if (cType === 'sparkline' || cType === 'action' || cType === 'pdf') return false;\r\n\r\n if (\r\n permissions.mode === 'read' ||\r\n permissions.mode === 'readonly' ||\r\n permissions.allowUpdating === false\r\n ) {\r\n if (!silent) {\r\n showToast(\r\n currentLocale.code.startsWith('tr')\r\n ? '🔒 Tablo şu anda Salt Okunur (Read-Only) modunda.'\r\n : '🔒 Grid is currently in Read-Only permission mode.',\r\n 'warning'\r\n );\r\n }\r\n return false;\r\n }\r\n\r\n if (colDef.readonly || colDef.permission === 'readonly' || colDef.permission === 'read') {\r\n if (!silent) {\r\n showToast(\r\n currentLocale.code.startsWith('tr')\r\n ? `🔒 \"${colDef.title}\" sütunu salt okunurdur (Read-Only).`\r\n : `🔒 Column \"${colDef.title}\" is Read-Only.`,\r\n 'warning'\r\n );\r\n }\r\n return false;\r\n }\r\n\r\n if (colDef.canEdit && !colDef.canEdit(row, colDef)) {\r\n if (!silent) {\r\n showToast(\r\n currentLocale.code.startsWith('tr')\r\n ? `🔒 Bu satır için \"${colDef.title}\" düzenlenemez.`\r\n : `🔒 \"${colDef.title}\" is locked for this record.`,\r\n 'warning'\r\n );\r\n }\r\n return false;\r\n }\r\n\r\n if (onEditingStart && !silent) {\r\n const keyField = (store as any).getKeyField?.() || (store as any).keyField || 'id';\r\n const rowKey = row[keyField] ?? row.id ?? row.legacy_id ?? rowIndex;\r\n const evt: EditingStartEvent = {\r\n row,\r\n rowKey,\r\n rowIndex,\r\n column: colDef,\r\n value: row[colDef.id],\r\n cancel: false,\r\n };\r\n onEditingStart(evt);\r\n if (evt.cancel) {\r\n showToast(\r\n currentLocale.code.startsWith('tr')\r\n ? `🔒 Düzenleme onEditingStart kuralı tarafından engellendi.`\r\n : `🔒 Editing canceled by onEditingStart trigger.`,\r\n 'warning'\r\n );\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n },\r\n [permissions, onEditingStart, currentLocale, showToast]\r\n );\r\n\r\n // ============================================================================\r\n // UNIFIED CELL MUTATION & CASCADING TRIGGER PIPELINE\r\n // ============================================================================\r\n const commitSingleCellEdit = useCallback(\r\n async (\r\n rowIndex: number,\r\n colDef: ColumnDef,\r\n newValue: any,\r\n recordHistory: boolean = true\r\n ): Promise<boolean> => {\r\n const vRow = store.getViewRow(rowIndex);\r\n if (!vRow || vRow.type !== 'data') return false;\r\n\r\n const rowData = vRow.data;\r\n const keyField = (store as any).getKeyField?.() || (store as any).keyField || 'id';\r\n const rowKey = rowData[keyField] ?? rowData.id ?? rowData.legacy_id ?? rowIndex;\r\n const oldValue = rowData[colDef.id];\r\n\r\n if (oldValue === newValue) {\r\n setEditorValidationError(null);\r\n return true;\r\n }\r\n if (!canEditCell(rowData, colDef, rowIndex, false)) return false;\r\n\r\n // 1. Static & Async Column Validation Rules + Legacy Validator Check\r\n const isTR = currentLocale.code.startsWith('tr');\r\n const hasAsyncRule =\r\n colDef.validationRules?.some((r) => r.type === 'async') || Boolean(colDef.validator);\r\n if (hasAsyncRule) {\r\n loadingRowKeysRef.current.add(rowKey);\r\n requestRender();\r\n }\r\n try {\r\n const valRes = await ValidationEngine.validateCell(newValue, rowData, colDef, isTR);\r\n if (!valRes.valid) {\r\n const msg =\r\n valRes.message ||\r\n (isTR ? 'Doğrulama kuralı hatası: Giriş engellendi!' : 'Validation rule failed: Entry blocked!');\r\n setEditorValidationError(msg);\r\n showToast(`⛔ ${msg}`, 'warning');\r\n return false;\r\n }\r\n setEditorValidationError(null);\r\n } finally {\r\n if (hasAsyncRule) {\r\n loadingRowKeysRef.current.delete(rowKey);\r\n requestRender();\r\n }\r\n }\r\n\r\n // 2. Lifecycle onCellValueChanging Trigger\r\n let finalValue = newValue;\r\n if (onCellValueChanging) {\r\n const changingEvt: CellValueChangingEvent = {\r\n row: rowData,\r\n rowKey,\r\n rowIndex,\r\n column: colDef,\r\n oldValue,\r\n newValue,\r\n cancel: false,\r\n };\r\n onCellValueChanging(changingEvt);\r\n if (changingEvt.cancel) {\r\n if (changingEvt.errorMessage) {\r\n showToast(`⚠️ ${changingEvt.errorMessage}`, 'warning');\r\n }\r\n return false;\r\n }\r\n finalValue = changingEvt.newValue;\r\n }\r\n\r\n // 3. Lifecycle onRowUpdating Trigger\r\n if (onRowUpdating) {\r\n const rowUpdEvt: RowUpdatingEvent = {\r\n key: rowKey,\r\n oldData: { ...rowData },\r\n newData: { [colDef.id]: finalValue },\r\n cancel: false,\r\n };\r\n await onRowUpdating(rowUpdEvt);\r\n if (rowUpdEvt.cancel) return false;\r\n }\r\n\r\n const prevRowSnapshot = { ...rowData };\r\n\r\n // 4. Commit Primary Value\r\n await store.setCell(rowKey, colDef.id, finalValue);\r\n onCellChange?.(rowData, colDef.id, finalValue);\r\n\r\n // 5. Cascading Column setCellValue & Async Backend Lookup Trigger\r\n const cascadingPatch: Record<string, any> = {};\r\n if (colDef.setCellValue) {\r\n try {\r\n loadingRowKeysRef.current.add(rowKey);\r\n requestRender();\r\n\r\n const draftNewData: Record<string, any> = {};\r\n const maybePromise = colDef.setCellValue(draftNewData, finalValue, prevRowSnapshot, {\r\n rowKey,\r\n columnId: colDef.id,\r\n store,\r\n });\r\n\r\n const resolvedPatch =\r\n maybePromise instanceof Promise ? await maybePromise : maybePromise;\r\n\r\n Object.assign(cascadingPatch, draftNewData, resolvedPatch || {});\r\n if (Object.keys(cascadingPatch).length > 0) {\r\n await store.updateRowFields?.(rowKey, cascadingPatch);\r\n }\r\n } finally {\r\n loadingRowKeysRef.current.delete(rowKey);\r\n requestRender();\r\n }\r\n }\r\n\r\n // 6. Lifecycle onCellValueChanged Trigger (supports sync or async backend patch)\r\n if (onCellValueChanged) {\r\n try {\r\n const changedEvt: CellValueChangedEvent = {\r\n row: rowData,\r\n rowKey,\r\n rowIndex,\r\n column: colDef,\r\n oldValue,\r\n newValue: finalValue,\r\n updateRow: (patch) => {\r\n Object.assign(cascadingPatch, patch);\r\n store.updateRowFields?.(rowKey, patch);\r\n },\r\n };\r\n const res = onCellValueChanged(changedEvt);\r\n if (res instanceof Promise) {\r\n loadingRowKeysRef.current.add(rowKey);\r\n requestRender();\r\n const asyncPatch = await res;\r\n if (asyncPatch && typeof asyncPatch === 'object') {\r\n Object.assign(cascadingPatch, asyncPatch);\r\n await store.updateRowFields?.(rowKey, asyncPatch);\r\n }\r\n loadingRowKeysRef.current.delete(rowKey);\r\n } else if (res && typeof res === 'object') {\r\n Object.assign(cascadingPatch, res);\r\n await store.updateRowFields?.(rowKey, res);\r\n }\r\n } catch {\r\n loadingRowKeysRef.current.delete(rowKey);\r\n }\r\n }\r\n\r\n // 7. Record Undo/Redo Command (including any cascading fields!)\r\n if (recordHistory) {\r\n const fullNewPatch: Record<string, any> = {\r\n [colDef.id]: finalValue,\r\n ...cascadingPatch,\r\n };\r\n const fullOldPatch: Record<string, any> = {};\r\n for (const k of Object.keys(fullNewPatch)) {\r\n fullOldPatch[k] = prevRowSnapshot[k];\r\n }\r\n\r\n historyRef.current.push({\r\n description: `Edit ${colDef.title}`,\r\n undo: () => {\r\n store.updateRowFields?.(rowKey, fullOldPatch);\r\n setStoreVersion((v) => v + 1);\r\n },\r\n redo: () => {\r\n store.updateRowFields?.(rowKey, fullNewPatch);\r\n setStoreVersion((v) => v + 1);\r\n },\r\n });\r\n }\r\n\r\n onRowUpdated?.({ key: rowKey, data: rowData });\r\n setStoreVersion((v) => v + 1);\r\n requestRender();\r\n return true;\r\n },\r\n [\r\n store,\r\n canEditCell,\r\n onCellValueChanging,\r\n onRowUpdating,\r\n onCellChange,\r\n onCellValueChanged,\r\n onRowUpdated,\r\n currentLocale,\r\n showToast,\r\n requestRender,\r\n ]\r\n );\r\n\r\n // ============================================================================\r\n // BATCH RANGE MUTATION (FOR FILL HANDLE, DUPLICATE & PASTE)\r\n // ============================================================================\r\n const applyBatchCellUpdates = useCallback(\r\n async (\r\n updates: Array<{ rowIndex: number; rowKey: any; colDef: ColumnDef; newValue: any }>,\r\n description: string\r\n ) => {\r\n if (updates.length === 0) return;\r\n\r\n const allowedUpdates: Array<{\r\n rowIndex: number;\r\n rowKey: any;\r\n colDef: ColumnDef;\r\n oldValue: any;\r\n newValue: any;\r\n rowData: Record<string, any>;\r\n }> = [];\r\n\r\n for (const u of updates) {\r\n const vRow = store.getViewRow(u.rowIndex);\r\n if (!vRow || vRow.type !== 'data') continue;\r\n if (!canEditCell(vRow.data, u.colDef, u.rowIndex, true)) continue;\r\n allowedUpdates.push({\r\n ...u,\r\n oldValue: vRow.data[u.colDef.id],\r\n rowData: vRow.data,\r\n });\r\n }\r\n\r\n if (allowedUpdates.length === 0) {\r\n showToast(\r\n currentLocale.code.startsWith('tr')\r\n ? '🔒 Seçili hücreler salt okunur (Read-Only).'\r\n : '🔒 Target cells are Read-Only.',\r\n 'warning'\r\n );\r\n return;\r\n }\r\n\r\n // If single cell, run through full cascading pipeline\r\n if (allowedUpdates.length === 1) {\r\n const single = allowedUpdates[0];\r\n await commitSingleCellEdit(single.rowIndex, single.colDef, single.newValue, true);\r\n return;\r\n }\r\n\r\n // Validate all items against column validationRules & validator\r\n const isTR = currentLocale.code.startsWith('tr');\r\n const validatedUpdates: typeof allowedUpdates = [];\r\n let firstErrorMsg: string | null = null;\r\n let rejectedCount = 0;\r\n\r\n for (const u of allowedUpdates) {\r\n const valRes = await ValidationEngine.validateCell(u.newValue, u.rowData, u.colDef, isTR);\r\n if (valRes.valid) {\r\n validatedUpdates.push(u);\r\n } else {\r\n rejectedCount++;\r\n if (!firstErrorMsg) {\r\n firstErrorMsg =\r\n valRes.message ||\r\n (isTR ? 'Doğrulama kuralına uymayan değer engellendi!' : 'Invalid value blocked by validation rule!');\r\n }\r\n }\r\n }\r\n\r\n if (rejectedCount > 0 && firstErrorMsg) {\r\n showToast(\r\n rejectedCount === 1\r\n ? `⛔ ${firstErrorMsg}`\r\n : isTR\r\n ? `⛔ ${rejectedCount} hücre doğrulama kuralına uymadığı için engellendi (${firstErrorMsg})`\r\n : `⛔ ${rejectedCount} cells blocked by validation rule (${firstErrorMsg})`,\r\n 'warning'\r\n );\r\n }\r\n\r\n if (validatedUpdates.length === 0) {\r\n return;\r\n }\r\n\r\n const forwardBatch = validatedUpdates.map((u) => ({\r\n rowKey: u.rowKey,\r\n columnId: u.colDef.id,\r\n value: u.newValue,\r\n }));\r\n const backwardBatch = validatedUpdates.map((u) => ({\r\n rowKey: u.rowKey,\r\n columnId: u.colDef.id,\r\n value: u.oldValue,\r\n }));\r\n\r\n if (store.setCellsBatch) {\r\n await store.setCellsBatch(forwardBatch);\r\n } else {\r\n for (const f of forwardBatch) {\r\n await store.setCell(f.rowKey, f.columnId, f.value);\r\n }\r\n }\r\n\r\n // Also trigger cascading setCellValue for updated rows if any column defines setCellValue\r\n for (const u of validatedUpdates) {\r\n onCellChange?.(u.rowData, u.colDef.id, u.newValue);\r\n if (u.colDef.setCellValue) {\r\n const draft: Record<string, any> = {};\r\n const res = u.colDef.setCellValue(draft, u.newValue, u.rowData, {\r\n rowKey: u.rowKey,\r\n columnId: u.colDef.id,\r\n store,\r\n });\r\n if (res instanceof Promise) {\r\n loadingRowKeysRef.current.add(u.rowKey);\r\n res.then((patch) => {\r\n const combined = { ...draft, ...(patch || {}) };\r\n if (Object.keys(combined).length > 0) {\r\n store.updateRowFields?.(u.rowKey, combined);\r\n }\r\n loadingRowKeysRef.current.delete(u.rowKey);\r\n requestRender();\r\n });\r\n } else {\r\n const combined = { ...draft, ...(res || {}) };\r\n if (Object.keys(combined).length > 0) {\r\n await store.updateRowFields?.(u.rowKey, combined);\r\n }\r\n }\r\n }\r\n }\r\n\r\n historyRef.current.push({\r\n description,\r\n undo: () => {\r\n store.setCellsBatch?.(backwardBatch);\r\n setStoreVersion((v) => v + 1);\r\n },\r\n redo: () => {\r\n store.setCellsBatch?.(forwardBatch);\r\n setStoreVersion((v) => v + 1);\r\n },\r\n });\r\n\r\n setStoreVersion((v) => v + 1);\r\n requestRender();\r\n },\r\n [store, canEditCell, commitSingleCellEdit, onCellChange, currentLocale, showToast, requestRender]\r\n );\r\n\r\n // ============================================================================\r\n // CRUD ROW ACTIONS (INSERT, DUPLICATE ROW, DELETE ROW, BATCH SAVE)\r\n // ============================================================================\r\n const handleInsertRow = useCallback(\r\n async (targetRowIndex?: number) => {\r\n if (\r\n permissions.mode === 'read' ||\r\n permissions.mode === 'readonly' ||\r\n permissions.allowAdding === false\r\n ) {\r\n showToast(\r\n currentLocale.code.startsWith('tr')\r\n ? '🔒 Yeni satır ekleme yetkiniz kapalı.'\r\n : '🔒 Row insertion is disabled by permissions.',\r\n 'warning'\r\n );\r\n return;\r\n }\r\n\r\n const defaultRow: Record<string, any> = {};\r\n for (const col of columns) {\r\n if (col.id === 'id') continue;\r\n if (col.defaultValue !== undefined) {\r\n defaultRow[col.id] = col.defaultValue;\r\n } else if (col.type === 'number' || col.type === 'currency') {\r\n defaultRow[col.id] = 0;\r\n } else if (col.type === 'boolean') {\r\n defaultRow[col.id] = false;\r\n } else if (col.type === 'rating') {\r\n defaultRow[col.id] = 3;\r\n } else if (col.type === 'progress') {\r\n defaultRow[col.id] = 50;\r\n } else if (col.type === 'select' || col.type === 'dropdown') {\r\n defaultRow[col.id] = col.options?.[0]?.value ?? '';\r\n } else if (col.type === 'multiselect') {\r\n defaultRow[col.id] = (col as any).defaultValue ?? '';\r\n } else if (col.type === 'date') {\r\n defaultRow[col.id] = new Date().toISOString().split('T')[0];\r\n } else if (col.type === 'datetime') {\r\n const now = new Date();\r\n defaultRow[col.id] = `${now.toISOString().split('T')[0]} ${String(now.getHours()).padStart(2, '0')}:${String(now.getMinutes()).padStart(2, '0')}`;\r\n } else if (col.type === 'time') {\r\n defaultRow[col.id] = '09:30';\r\n } else if (col.type === 'sparkline') {\r\n defaultRow[col.id] = [25, 40, 35, 60, 55, 75, 85];\r\n } else if (col.type === 'text') {\r\n defaultRow[col.id] = col.id === 'company' ? 'New Enterprise Record' : col.id === 'city' ? 'New York' : col.id === 'category' ? 'Enterprise SaaS' : col.id === 'code' ? `ACC-${Math.floor(100000 + Math.random() * 900000)}` : '';\r\n }\r\n }\r\n\r\n if (onRowInserting) {\r\n const evt: RowInsertingEvent = {\r\n data: defaultRow,\r\n targetRowIndex,\r\n cancel: false,\r\n };\r\n await onRowInserting(evt);\r\n if (evt.cancel) return;\r\n }\r\n\r\n const created = await store.insertRow?.(defaultRow, targetRowIndex);\r\n if (created) {\r\n const newKey = created.id;\r\n historyRef.current.push({\r\n description: 'Insert Row',\r\n undo: () => {\r\n store.deleteRow?.(newKey);\r\n setStoreVersion((v) => v + 1);\r\n },\r\n redo: () => {\r\n store.restoreRow?.(created, 0);\r\n setStoreVersion((v) => v + 1);\r\n },\r\n });\r\n onRowInserted?.({ data: created, key: newKey });\r\n showToast(\r\n currentLocale.code.startsWith('tr')\r\n ? `✨ Yeni satır eklendi (#${newKey})`\r\n : `✨ New row inserted (#${newKey})`,\r\n 'success'\r\n );\r\n setStoreVersion((v) => v + 1);\r\n requestRender();\r\n }\r\n },\r\n [permissions, columns, onRowInserting, store, onRowInserted, currentLocale, showToast, requestRender]\r\n );\r\n\r\n const handleDuplicateRow = useCallback(\r\n async (rowIndex?: number) => {\r\n const targetIdx = rowIndex ?? selectionRef.current.activeCell.row;\r\n const vRow = store.getViewRow(targetIdx);\r\n if (!vRow || vRow.type !== 'data') return;\r\n\r\n if (\r\n permissions.mode === 'read' ||\r\n permissions.mode === 'readonly' ||\r\n permissions.allowDuplicating === false ||\r\n permissions.allowAdding === false\r\n ) {\r\n showToast(\r\n currentLocale.code.startsWith('tr')\r\n ? '🔒 Satır çoğaltma yetkisi kapalı.'\r\n : '🔒 Row duplication is disabled by permissions.',\r\n 'warning'\r\n );\r\n return;\r\n }\r\n\r\n const sourceKey = vRow.data.id ?? targetIdx;\r\n const duplicated = await store.duplicateRow?.(sourceKey, targetIdx);\r\n if (duplicated) {\r\n const newKey = duplicated.id;\r\n historyRef.current.push({\r\n description: 'Duplicate Row',\r\n undo: () => {\r\n store.deleteRow?.(newKey);\r\n setStoreVersion((v) => v + 1);\r\n },\r\n redo: () => {\r\n store.restoreRow?.(duplicated, targetIdx + 1);\r\n setStoreVersion((v) => v + 1);\r\n },\r\n });\r\n onRowInserted?.({ data: duplicated, key: newKey });\r\n showToast(\r\n currentLocale.code.startsWith('tr')\r\n ? `📑 Satır çoğaltıldı (#${sourceKey} → #${newKey})`\r\n : `📑 Row duplicated (#${sourceKey} → #${newKey})`,\r\n 'success'\r\n );\r\n setStoreVersion((v) => v + 1);\r\n requestRender();\r\n }\r\n },\r\n [store, permissions, onRowInserted, currentLocale, showToast, requestRender]\r\n );\r\n\r\n const handleDeleteRow = useCallback(\r\n async (rowIndex?: number) => {\r\n if (\r\n permissions.mode === 'read' ||\r\n permissions.mode === 'readonly' ||\r\n permissions.allowDeleting === false\r\n ) {\r\n showToast(\r\n currentLocale.code.startsWith('tr')\r\n ? '🔒 Satır silme yetkisi kapalı.'\r\n : '🔒 Row deletion is disabled by permissions.',\r\n 'warning'\r\n );\r\n return;\r\n }\r\n\r\n // If multiple/single rows are checked via Selection Column and no explicit context-menu rowIndex was forced\r\n if (selectedRowKeysSet.size > 0 && rowIndex === undefined) {\r\n const keysToDelete = Array.from(selectedRowKeysSet);\r\n const sampleRows: Record<string, any>[] = [];\r\n const totalView = store.getRowCount();\r\n for (let r = 0; r < totalView && sampleRows.length < 4; r++) {\r\n const vr = store.getViewRow(r);\r\n if (vr && vr.type === 'data' && selectedRowKeysSet.has(vr.data.id ?? r)) {\r\n sampleRows.push(vr.data);\r\n }\r\n }\r\n setDeleteConfirmModal({\r\n rowKeys: keysToDelete,\r\n sampleRows,\r\n });\r\n return;\r\n }\r\n\r\n const targetIdx = rowIndex ?? selectionRef.current.activeCell.row;\r\n const vRow = store.getViewRow(targetIdx);\r\n if (!vRow || vRow.type !== 'data') return;\r\n\r\n const rowKey = vRow.data.id ?? targetIdx;\r\n const snapshot = { ...vRow.data };\r\n\r\n // Open confirmation modal for single row deletion as well\r\n setDeleteConfirmModal({\r\n rowKeys: [rowKey],\r\n sampleRows: [snapshot],\r\n singleRowIndex: targetIdx,\r\n });\r\n },\r\n [permissions, selectedRowKeysSet, store, currentLocale, showToast]\r\n );\r\n\r\n const executeConfirmedDelete = useCallback(\r\n async (onProgress: (processed: number, total: number) => void) => {\r\n if (!deleteConfirmModal) return;\r\n const { rowKeys, sampleRows, singleRowIndex } = deleteConfirmModal;\r\n\r\n if (rowKeys.length === 1 && singleRowIndex !== undefined && sampleRows[0]) {\r\n const rowKey = rowKeys[0];\r\n const snapshot = sampleRows[0];\r\n if (onRowRemoving) {\r\n const evt: RowRemovingEvent = { key: rowKey, data: snapshot, cancel: false };\r\n await onRowRemoving(evt);\r\n if (evt.cancel) {\r\n setDeleteConfirmModal(null);\r\n return;\r\n }\r\n }\r\n onProgress(1, 1);\r\n await store.deleteRow?.(rowKey);\r\n if (selectedRowKeysSet.has(rowKey)) {\r\n setSelectedRowKeysSet((prev) => {\r\n const next = new Set(prev);\r\n next.delete(rowKey);\r\n return next;\r\n });\r\n }\r\n historyRef.current.push({\r\n description: 'Delete Row',\r\n undo: () => {\r\n store.restoreRow?.(snapshot, singleRowIndex);\r\n setStoreVersion((v) => v + 1);\r\n },\r\n redo: () => {\r\n store.deleteRow?.(rowKey);\r\n setStoreVersion((v) => v + 1);\r\n },\r\n });\r\n onRowRemoved?.({ key: rowKey, data: snapshot });\r\n setDeleteConfirmModal(null);\r\n showToast(\r\n currentLocale.code.startsWith('tr')\r\n ? `🗑️ Satır silindi (#${rowKey})`\r\n : `🗑️ Row deleted (#${rowKey})`,\r\n 'info'\r\n );\r\n setStoreVersion((v) => v + 1);\r\n requestRender();\r\n return;\r\n }\r\n\r\n // Multi-row / Bulk deletion with progress bar and O(N) chunked processing\r\n if (store.deleteRowsBatch) {\r\n await store.deleteRowsBatch(rowKeys, onProgress);\r\n } else {\r\n for (let i = 0; i < rowKeys.length; i++) {\r\n await store.deleteRow?.(rowKeys[i]);\r\n onProgress(i + 1, rowKeys.length);\r\n }\r\n }\r\n\r\n setSelectedRowKeysSet(new Set());\r\n onSelectionChanged?.([], []);\r\n onRowRemoved?.({\r\n key: `${rowKeys.length} rows`,\r\n data: { deletedCount: rowKeys.length, sampleKeys: rowKeys.slice(0, 20) },\r\n });\r\n setDeleteConfirmModal(null);\r\n showToast(\r\n currentLocale.code.startsWith('tr')\r\n ? `🗑️ Seçili ${rowKeys.length.toLocaleString('tr-TR')} satır silindi.`\r\n : `🗑️ Deleted ${rowKeys.length.toLocaleString('en-US')} selected rows.`,\r\n 'info'\r\n );\r\n setStoreVersion((v) => v + 1);\r\n requestRender();\r\n },\r\n [\r\n deleteConfirmModal,\r\n store,\r\n selectedRowKeysSet,\r\n onSelectionChanged,\r\n onRowRemoving,\r\n onRowRemoved,\r\n currentLocale,\r\n showToast,\r\n requestRender,\r\n ]\r\n );\r\n\r\n const commitBatchSave = useCallback(async () => {\r\n const changes = store.getPendingChanges?.();\r\n if (!changes) return;\r\n\r\n if (onSaving) {\r\n const evt: SavingEvent = { changes, cancel: false };\r\n await onSaving(evt);\r\n if (evt.cancel) return;\r\n }\r\n\r\n const committed = await store.saveBatchChanges?.();\r\n if (committed) {\r\n onSaved?.({ changes: committed });\r\n const count =\r\n (committed.inserted?.length || 0) +\r\n (committed.updated?.length || 0) +\r\n (committed.deleted?.length || 0);\r\n showToast(\r\n currentLocale.code.startsWith('tr')\r\n ? `✅ Toplu kayıt başarılı (${count} işlem kaydedildi).`\r\n : `✅ Batch save completed (${count} changes committed).`,\r\n 'success'\r\n );\r\n setStoreVersion((v) => v + 1);\r\n requestRender();\r\n }\r\n }, [store, onSaving, onSaved, currentLocale, showToast, requestRender]);\r\n\r\n const handleSaveBatch = useCallback(() => {\r\n const fastCount = store.getPendingChangesCount?.();\r\n if (fastCount !== undefined && fastCount > 1) {\r\n setShowBatchModal(true);\r\n return;\r\n }\r\n const changes = store.getPendingChanges?.();\r\n if (!changes) return;\r\n const totalOps =\r\n (changes.inserted?.length || 0) +\r\n (changes.updated?.length || 0) +\r\n (changes.deleted?.length || 0);\r\n\r\n // If there are multiple operations or any row deletions, open the Batch Changes Summary Modal first!\r\n if (totalOps > 1 || (changes.deleted?.length || 0) > 0) {\r\n setShowBatchModal(true);\r\n return;\r\n }\r\n commitBatchSave();\r\n }, [store, commitBatchSave]);\r\n\r\n const handleDiscardBatch = useCallback(() => {\r\n store.discardBatchChanges?.();\r\n historyRef.current.clear();\r\n showToast(\r\n currentLocale.code.startsWith('tr')\r\n ? '↩️ Kaydedilmemiş tüm değişiklikler geri alındı.'\r\n : '↩️ All unsaved batch changes discarded.',\r\n 'info'\r\n );\r\n setStoreVersion((v) => v + 1);\r\n requestRender();\r\n }, [store, currentLocale, showToast, requestRender]);\r\n\r\n // ============================================================================\r\n // CELL DUPLICATION HELPERS (FILL DOWN, FILL RIGHT & DRAG AUTOFILL)\r\n // ============================================================================\r\n const handleDuplicateCellDown = useCallback(() => {\r\n const norm = selectionRef.current.getNormalizedRange();\r\n const geom = geometryRef.current;\r\n const updates: Array<{ rowIndex: number; rowKey: any; colDef: ColumnDef; newValue: any }> = [];\r\n\r\n if (norm.maxRow > norm.minRow) {\r\n // Excel Ctrl+D when multiple rows selected: copy top row of selection down into all selected rows\r\n const topRow = store.getViewRow(norm.minRow);\r\n if (!topRow || topRow.type !== 'data') return;\r\n for (let r = norm.minRow + 1; r <= norm.maxRow; r++) {\r\n const targetRow = store.getViewRow(r);\r\n if (!targetRow || targetRow.type !== 'data') continue;\r\n for (let c = norm.minCol; c <= norm.maxCol; c++) {\r\n const colDef = geom.columns[c];\r\n if (!colDef) continue;\r\n updates.push({\r\n rowIndex: r,\r\n rowKey: targetRow.data.id ?? r,\r\n colDef,\r\n newValue: topRow.data[colDef.id],\r\n });\r\n }\r\n }\r\n } else {\r\n // Single row selected: duplicate active cell(s) into the row directly below (and move selection down)\r\n const nextR = norm.minRow + 1;\r\n if (nextR >= store.getRowCount()) return;\r\n const srcRow = store.getViewRow(norm.minRow);\r\n const dstRow = store.getViewRow(nextR);\r\n if (!srcRow || srcRow.type !== 'data' || !dstRow || dstRow.type !== 'data') return;\r\n\r\n for (let c = norm.minCol; c <= norm.maxCol; c++) {\r\n const colDef = geom.columns[c];\r\n if (!colDef) continue;\r\n updates.push({\r\n rowIndex: nextR,\r\n rowKey: dstRow.data.id ?? nextR,\r\n colDef,\r\n newValue: srcRow.data[colDef.id],\r\n });\r\n }\r\n selectionRef.current.setActiveCell(nextR, selectionRef.current.activeCell.col);\r\n setSelectedCellUI({ row: nextR, col: selectionRef.current.activeCell.col });\r\n setSelectionVersion((v) => v + 1);\r\n }\r\n\r\n applyBatchCellUpdates(updates, 'Duplicate Cell Down');\r\n }, [store, applyBatchCellUpdates]);\r\n\r\n const handleDuplicateCellRight = useCallback(() => {\r\n const norm = selectionRef.current.getNormalizedRange();\r\n const geom = geometryRef.current;\r\n const updates: Array<{ rowIndex: number; rowKey: any; colDef: ColumnDef; newValue: any }> = [];\r\n\r\n if (norm.maxCol > norm.minCol) {\r\n // Excel Ctrl+R when multiple columns selected: copy leftmost column into selected columns on right\r\n for (let r = norm.minRow; r <= norm.maxRow; r++) {\r\n const vRow = store.getViewRow(r);\r\n if (!vRow || vRow.type !== 'data') continue;\r\n const srcColDef = geom.columns[norm.minCol];\r\n if (!srcColDef) continue;\r\n const srcVal = vRow.data[srcColDef.id];\r\n\r\n for (let c = norm.minCol + 1; c <= norm.maxCol; c++) {\r\n const dstColDef = geom.columns[c];\r\n if (!dstColDef) continue;\r\n const plugin = ColumnTypeRegistry.get(dstColDef.type);\r\n const coercedVal = plugin.parseClipboard\r\n ? plugin.parseClipboard(String(srcVal ?? ''), dstColDef)\r\n : srcVal;\r\n updates.push({\r\n rowIndex: r,\r\n rowKey: vRow.data.id ?? r,\r\n colDef: dstColDef,\r\n newValue: coercedVal,\r\n });\r\n }\r\n }\r\n } else {\r\n // Single column selected: duplicate into next editable column on the right (or below if same type)\r\n const nextC = norm.minCol + 1;\r\n if (nextC < geom.columns.length) {\r\n const srcColDef = geom.columns[norm.minCol];\r\n const dstColDef = geom.columns[nextC];\r\n if (srcColDef && dstColDef) {\r\n for (let r = norm.minRow; r <= norm.maxRow; r++) {\r\n const vRow = store.getViewRow(r);\r\n if (!vRow || vRow.type !== 'data') continue;\r\n const srcVal = vRow.data[srcColDef.id];\r\n const plugin = ColumnTypeRegistry.get(dstColDef.type);\r\n const coercedVal = plugin.parseClipboard\r\n ? plugin.parseClipboard(String(srcVal ?? ''), dstColDef)\r\n : srcVal;\r\n updates.push({\r\n rowIndex: r,\r\n rowKey: vRow.data.id ?? r,\r\n colDef: dstColDef,\r\n newValue: coercedVal,\r\n });\r\n }\r\n selectionRef.current.setActiveCell(selectionRef.current.activeCell.row, nextC);\r\n setSelectedCellUI({ row: selectionRef.current.activeCell.row, col: nextC });\r\n setSelectionVersion((v) => v + 1);\r\n }\r\n }\r\n }\r\n\r\n applyBatchCellUpdates(updates, 'Duplicate Cell Right');\r\n }, [store, applyBatchCellUpdates]);\r\n\r\n // ============================================================================\r\n // COLUMN SORTING, GROUPING, FILTERING & COLUMN UPDATES\r\n // ============================================================================\r\n const handleHeaderSort = (colIndex: number, isShift: boolean, explicitDesc?: boolean | null) => {\r\n if (permissions.allowSorting === false) return;\r\n const col = geometryRef.current.columns[colIndex];\r\n if (!col || col.sortable === false) return;\r\n\r\n let nextRules: SortDescriptor[] = [];\r\n const existingIndex = sortRules.findIndex((s) => s.selector === col.id);\r\n\r\n if (explicitDesc !== undefined) {\r\n if (explicitDesc === null) {\r\n nextRules = sortRules.filter((s) => s.selector !== col.id);\r\n } else {\r\n nextRules = [{ selector: col.id, desc: explicitDesc }];\r\n }\r\n } else if (isShift) {\r\n nextRules = [...sortRules];\r\n if (existingIndex !== -1) {\r\n if (!nextRules[existingIndex].desc) {\r\n nextRules[existingIndex] = { ...nextRules[existingIndex], desc: true };\r\n } else {\r\n nextRules.splice(existingIndex, 1);\r\n }\r\n } else {\r\n nextRules.push({ selector: col.id, desc: false });\r\n }\r\n } else {\r\n if (existingIndex !== -1) {\r\n if (!sortRules[existingIndex].desc) {\r\n nextRules = [{ selector: col.id, desc: true }];\r\n } else {\r\n nextRules = [];\r\n }\r\n } else {\r\n nextRules = [{ selector: col.id, desc: false }];\r\n }\r\n }\r\n\r\n setSortRules(nextRules);\r\n store.setSorting(nextRules);\r\n };\r\n\r\n const handleToggleGroupColumn = (colId: string) => {\r\n if (permissions.allowGrouping === false) return;\r\n const targetCol = columns.find((c) => c.id === colId);\r\n if (targetCol && (targetCol.type === 'sparkline' || targetCol.type === 'action' || targetCol.groupable === false)) {\r\n return;\r\n }\r\n setGroups((prevGroups) => {\r\n const exists = prevGroups.some((g) => g.selector === colId);\r\n const nextGroups = exists\r\n ? prevGroups.filter((g) => g.selector !== colId)\r\n : [...prevGroups, { selector: colId }];\r\n store.setGrouping(nextGroups);\r\n if (scrollContainerRef.current) {\r\n scrollContainerRef.current.scrollTop = 0;\r\n }\r\n scrollPosRef.current.top = 0;\r\n selectionRef.current.setActiveCell(0, 0);\r\n setSelectedCellUI({ row: 0, col: 0 });\r\n setStoreVersion((v) => v + 1);\r\n requestRender();\r\n\r\n const colTitle = columns.find((c) => c.id === colId)?.title.replace(' ⚡', '') || colId;\r\n showToast(\r\n exists\r\n ? currentLocale.code.startsWith('tr')\r\n ? `📂 \"${colTitle}\" gruplaması kaldırıldı.`\r\n : `📂 Ungrouped \"${colTitle}\".`\r\n : currentLocale.code.startsWith('tr')\r\n ? `📁 \"${colTitle}\" sütununa göre gruplandı. Satırları görmek için gruba tıklayın.`\r\n : `📁 Grouped by \"${colTitle}\". Click any group row to expand.`,\r\n 'info'\r\n );\r\n return nextGroups;\r\n });\r\n };\r\n\r\n const handleApplyColumnFilter = async (colId: string, filterState: ColumnFilterState | null) => {\r\n const next = { ...columnFilters };\r\n if (!filterState) {\r\n delete next[colId];\r\n } else {\r\n next[colId] = filterState;\r\n }\r\n setColumnFilters(next);\r\n\r\n const compiled = compileColumnFilters(next);\r\n await store.setFilter(compiled);\r\n\r\n if (scrollContainerRef.current) {\r\n scrollContainerRef.current.scrollTop = 0;\r\n }\r\n scrollPosRef.current.top = 0;\r\n\r\n const maxR = Math.max(0, store.getRowCount() - 1);\r\n const activeCol = selectionRef.current.activeCell.col;\r\n selectionRef.current.setActiveCell(Math.min(selectionRef.current.activeCell.row, maxR), activeCol);\r\n\r\n setStoreVersion((v) => v + 1);\r\n requestRender();\r\n\r\n const matchedCount = store.getFilteredRowCount?.() ?? store.getRowCount();\r\n const isTR = currentLocale.code.startsWith('tr');\r\n if (filterState) {\r\n showToast(\r\n isTR\r\n ? `🔍 Filtre uygulandı: ${matchedCount.toLocaleString('tr-TR')} kayıt listeleniyor.`\r\n : `🔍 Filter applied: ${matchedCount.toLocaleString('en-US')} matching rows.`,\r\n 'info'\r\n );\r\n } else {\r\n showToast(\r\n isTR ? '🧹 Sütun filtresi temizlendi.' : '🧹 Column filter cleared.',\r\n 'info'\r\n );\r\n }\r\n onFilterChange?.(compiled, next);\r\n };\r\n\r\n const handleClearAllFilters = async () => {\r\n setColumnFilters({});\r\n await store.setFilter(null);\r\n if (scrollContainerRef.current) {\r\n scrollContainerRef.current.scrollTop = 0;\r\n }\r\n scrollPosRef.current.top = 0;\r\n setStoreVersion((v) => v + 1);\r\n requestRender();\r\n onFilterChange?.(null, {});\r\n };\r\n\r\n const handleChangeSummaryType = (colId: string, summaryType: SummaryType) => {\r\n store.setSummaryType?.(colId, summaryType);\r\n setStoreVersion((v) => v + 1);\r\n requestRender();\r\n };\r\n\r\n // ============================================================================\r\n // DRAG SELECTION & FILL HANDLE DRAG EFFECT (WITH AUTO-SCROLL AT EDGES)\r\n // ============================================================================\r\n useEffect(() => {\r\n if (!isDraggingSelection && !isDraggingRowNumbers && !fillDragState) return;\r\n\r\n const handleWindowMouseMove = (e: MouseEvent) => {\r\n const surface = gridSurfaceRef.current;\r\n const sc = scrollContainerRef.current;\r\n if (!surface || !sc) return;\r\n\r\n const rect = surface.getBoundingClientRect();\r\n const x = e.clientX - rect.left;\r\n const y = e.clientY - rect.top;\r\n\r\n // Auto-scroll when dragging near viewport edges\r\n checkEdgeAutoScroll(x, y, rect);\r\n\r\n const rowCount = store.getRowCount();\r\n if (rowCount === 0) return;\r\n\r\n const clampedY = Math.max(geometryRef.current.headerHeight + 2, Math.min(y, rect.height - 2));\r\n const virtualY = clampedY - geometryRef.current.headerHeight + scrollPosRef.current.top;\r\n const targetRow = Math.max(0, Math.min(rowCount - 1, Math.floor(virtualY / geometryRef.current.rowHeight)));\r\n\r\n if (isDraggingRowNumbers) {\r\n selectionRef.current.setRangeEnd(targetRow, geometryRef.current.columns.length - 1);\r\n setSelectionVersion((v) => v + 1);\r\n requestRender();\r\n return;\r\n }\r\n\r\n const hit = geometryRef.current.hitTest(\r\n Math.max(geometryRef.current.rowNumberWidth + 2, Math.min(x, rect.width - 2)),\r\n clampedY,\r\n scrollPosRef.current.left,\r\n scrollPosRef.current.top,\r\n rowCount\r\n );\r\n if (!hit) return;\r\n\r\n if (isDraggingSelection) {\r\n const selRange = selectionRef.current.selectionRange;\r\n const startCol = selRange ? selRange.startCol : selectionRef.current.activeCell.col;\r\n const startColDef = geometryRef.current.columns[startCol];\r\n const startColType = (startColDef?.type || '').toLowerCase();\r\n if (startColType === 'action' || startColType === 'pdf') {\r\n setIsDraggingSelection(false);\r\n return;\r\n }\r\n\r\n selectionRef.current.setRangeEnd(hit.row, hit.col);\r\n setSelectionVersion((v) => v + 1);\r\n requestRender();\r\n } else if (fillDragState) {\r\n const srcColDef = geometryRef.current.columns[fillDragState.sourceRange.minCol];\r\n const srcColType = (srcColDef?.type || '').toLowerCase();\r\n if (srcColType === 'action' || srcColType === 'pdf') {\r\n setFillDragState(null);\r\n return;\r\n }\r\n const src = fillDragState.sourceRange;\r\n const minRow = Math.min(src.minRow, hit.row);\r\n const maxRow = Math.max(src.maxRow, hit.row);\r\n const minCol = Math.min(src.minCol, hit.col);\r\n const maxCol = Math.max(src.maxCol, hit.col);\r\n\r\n setFillDragState((prev) =>\r\n prev\r\n ? {\r\n ...prev,\r\n targetRange: { minRow, maxRow, minCol, maxCol },\r\n }\r\n : null\r\n );\r\n }\r\n };\r\n\r\n const handleWindowMouseUp = () => {\r\n if (isDraggingSelection) {\r\n setIsDraggingSelection(false);\r\n }\r\n if (isDraggingRowNumbers) {\r\n setIsDraggingRowNumbers(false);\r\n }\r\n if (fillDragState) {\r\n const { mode, sourceRange, targetRange } = fillDragState;\r\n setFillDragState(null);\r\n\r\n const isSameRange =\r\n sourceRange.minRow === targetRange.minRow &&\r\n sourceRange.maxRow === targetRange.maxRow &&\r\n sourceRange.minCol === targetRange.minCol &&\r\n sourceRange.maxCol === targetRange.maxCol;\r\n\r\n if (isSameRange && mode === 'right-duplicate') {\r\n // Single click on right-side duplicate button -> duplicate cell down or right!\r\n handleDuplicateCellDown();\r\n return;\r\n }\r\n\r\n if (!isSameRange) {\r\n const geom = geometryRef.current;\r\n const updates: Array<{ rowIndex: number; rowKey: any; colDef: ColumnDef; newValue: any }> = [];\r\n const srcHeight = sourceRange.maxRow - sourceRange.minRow + 1;\r\n const srcWidth = sourceRange.maxCol - sourceRange.minCol + 1;\r\n\r\n for (let r = targetRange.minRow; r <= targetRange.maxRow; r++) {\r\n const dstRow = store.getViewRow(r);\r\n if (!dstRow || dstRow.type !== 'data') continue;\r\n\r\n for (let c = targetRange.minCol; c <= targetRange.maxCol; c++) {\r\n // Skip cells that were already inside sourceRange\r\n if (\r\n r >= sourceRange.minRow &&\r\n r <= sourceRange.maxRow &&\r\n c >= sourceRange.minCol &&\r\n c <= sourceRange.maxCol\r\n ) {\r\n continue;\r\n }\r\n\r\n const srcR =\r\n sourceRange.minRow +\r\n ((((r - sourceRange.minRow) % srcHeight) + srcHeight) % srcHeight);\r\n const srcC =\r\n sourceRange.minCol +\r\n ((((c - sourceRange.minCol) % srcWidth) + srcWidth) % srcWidth);\r\n\r\n const srcViewRow = store.getViewRow(srcR);\r\n const srcColDef = geom.columns[srcC];\r\n const dstColDef = geom.columns[c];\r\n if (!srcViewRow || srcViewRow.type !== 'data' || !srcColDef || !dstColDef) continue;\r\n\r\n let val = srcViewRow.data[srcColDef.id];\r\n\r\n // Smart Series increment for Account Code patterns (e.g. ACC-100001)\r\n if (typeof val === 'string' && /^([A-Za-z-]+)(\\d+)$/.test(val) && srcC === c) {\r\n const m = val.match(/^([A-Za-z-]+)(\\d+)$/);\r\n if (m) {\r\n const offset = r - srcR;\r\n val = `${m[1]}${Number(m[2]) + offset}`;\r\n }\r\n } else if (srcC !== c) {\r\n const plugin = ColumnTypeRegistry.get(dstColDef.type);\r\n if (plugin.parseClipboard) {\r\n val = plugin.parseClipboard(String(val ?? ''), dstColDef);\r\n }\r\n }\r\n\r\n updates.push({\r\n rowIndex: r,\r\n rowKey: dstRow.data.id ?? r,\r\n colDef: dstColDef,\r\n newValue: val,\r\n });\r\n }\r\n }\r\n\r\n selectionRef.current.selectionRange = {\r\n startRow: targetRange.minRow,\r\n startCol: targetRange.minCol,\r\n endRow: targetRange.maxRow,\r\n endCol: targetRange.maxCol,\r\n };\r\n setSelectionVersion((v) => v + 1);\r\n applyBatchCellUpdates(updates, 'AutoFill Cells');\r\n }\r\n }\r\n };\r\n\r\n window.addEventListener('mousemove', handleWindowMouseMove);\r\n window.addEventListener('mouseup', handleWindowMouseUp);\r\n window.addEventListener('blur', handleWindowMouseUp);\r\n return () => {\r\n window.removeEventListener('mousemove', handleWindowMouseMove);\r\n window.removeEventListener('mouseup', handleWindowMouseUp);\r\n window.removeEventListener('blur', handleWindowMouseUp);\r\n };\r\n }, [\r\n isDraggingSelection,\r\n isDraggingRowNumbers,\r\n fillDragState,\r\n store,\r\n applyBatchCellUpdates,\r\n handleDuplicateCellDown,\r\n requestRender,\r\n ]);\r\n\r\n // ============================================================================\r\n // NAVIGATION & AUTO-SCROLL INTO VIEW\r\n // ============================================================================\r\n const moveSelection = (dRow: number, dCol: number, isRangeSelect: boolean = false) => {\r\n hookMoveSelection(\r\n dRow,\r\n dCol,\r\n isRangeSelect,\r\n store.getRowCount(),\r\n geometryRef.current.columns.length\r\n );\r\n const active = getActiveCell();\r\n ensureCellVisible(active.row, active.col);\r\n };\r\n\r\n // ============================================================================\r\n // OPEN INLINE MICRO-DOM EDITOR\r\n // ============================================================================\r\n const openEditorForCell = (row: number, col: number, initialChar?: string) => {\r\n const geom = geometryRef.current;\r\n const colDef = geom.columns[col];\r\n const vRow = store.getViewRow(row);\r\n if (!vRow || vRow.type === 'group') return;\r\n\r\n if (colDef?.type === 'sparkline') {\r\n setSparklineModal({\r\n rowIndex: row,\r\n rowData: vRow.data,\r\n column: colDef,\r\n points: Array.isArray(vRow.data[colDef.id]) ? vRow.data[colDef.id] : [],\r\n });\r\n return;\r\n }\r\n\r\n if (!canEditCell(vRow.data, colDef, row, false)) return;\r\n\r\n const plugin = ColumnTypeRegistry.get(colDef.type);\r\n if (!plugin.editorComponent) return;\r\n\r\n const screenRect = geom.getColumnScreenRect(col, scrollPosRef.current.left);\r\n const y = geom.headerHeight + row * geom.rowHeight - scrollPosRef.current.top;\r\n\r\n setEditorValidationError(null);\r\n setIsEditorValidating(false);\r\n setActiveOverlay({\r\n row,\r\n col,\r\n x: screenRect.x,\r\n y,\r\n width: screenRect.width,\r\n height: geom.rowHeight,\r\n column: colDef,\r\n initialValue: vRow.data[colDef.id],\r\n initialChar,\r\n });\r\n };\r\n\r\n // ============================================================================\r\n // VIEWPORT MOUSE EVENTS (FIXED COORDINATE SYSTEM)\r\n // ============================================================================\r\n const handleSurfaceMouseMove = (e: React.MouseEvent<HTMLDivElement>) => {\r\n if (resizingCol || isDraggingSelection || isDraggingRowNumbers || fillDragState) return;\r\n const { x, y, onScrollbar } = getViewportCoords(e);\r\n if (onScrollbar) {\r\n setCursorStyle('default');\r\n return;\r\n }\r\n\r\n const geom = geometryRef.current;\r\n const sl = scrollPosRef.current.left;\r\n const st = scrollPosRef.current.top;\r\n\r\n // 1. Check Resize Handle\r\n const resizeHit = geom.hitTestColumnResize(x, y, sl);\r\n if (resizeHit) {\r\n setCursorStyle('col-resize');\r\n if (hoveredFilterColRef.current !== null) {\r\n hoveredFilterColRef.current = null;\r\n requestRender();\r\n }\r\n return;\r\n }\r\n\r\n // 2. Check Header & Filter Button Hover\r\n if (y <= geom.headerHeight) {\r\n const headerHit = geom.hitTestHeader(x, y, sl);\r\n const nextFilterCol = headerHit?.isFilterIconHit ? headerHit.colIndex : null;\r\n if (hoveredFilterColRef.current !== nextFilterCol) {\r\n hoveredFilterColRef.current = nextFilterCol;\r\n requestRender();\r\n }\r\n setCursorStyle(headerHit ? 'pointer' : 'default');\r\n return;\r\n }\r\n\r\n if (hoveredFilterColRef.current !== null) {\r\n hoveredFilterColRef.current = null;\r\n requestRender();\r\n }\r\n\r\n // 2b. Check Group Row Hover (Across entire row width including left chevron)\r\n const hoveredRowIdx = Math.floor((y - geom.headerHeight + st) / geom.rowHeight);\r\n if (hoveredRowIdx >= 0 && hoveredRowIdx < store.getRowCount()) {\r\n const hVRow = store.getViewRow(hoveredRowIdx);\r\n if (hVRow && hVRow.type === 'group') {\r\n if (hoveredCellRef.current?.row !== hoveredRowIdx || hoveredCellRef.current?.col !== -1) {\r\n hoveredCellRef.current = { row: hoveredRowIdx, col: -1 };\r\n requestRender();\r\n }\r\n setCursorStyle('pointer');\r\n return;\r\n }\r\n }\r\n\r\n // 3. Check Fill Handle / Right Duplicate Button Hover (Skip for sparkline / action / readonly)\r\n const normForHover = selectionRef.current.getNormalizedRange();\r\n const activeColForHover = geom.columns[normForHover.maxCol];\r\n const hoverColType = (activeColForHover?.type || '').toLowerCase();\r\n const isSpecialNonDup =\r\n !activeColForHover ||\r\n hoverColType === 'sparkline' ||\r\n hoverColType === 'action' ||\r\n hoverColType === 'pdf' ||\r\n CanvasRenderer.isColumnReadonly(activeColForHover, permissions);\r\n\r\n if (!isSpecialNonDup) {\r\n const fhHit = geom.hitTestFillHandle(x, y, sl, st, selectionRef.current);\r\n if (fhHit) {\r\n setCursorStyle(fhHit === 'corner' ? 'crosshair' : 'copy');\r\n return;\r\n }\r\n }\r\n\r\n // 4. Check Row Number Gutter\r\n if (x <= geom.rowNumberWidth) {\r\n setCursorStyle('pointer');\r\n return;\r\n }\r\n\r\n // 5. Cell Hover\r\n const hit = geom.hitTest(x, y, sl, st, store.getRowCount());\r\n if (\r\n hit?.row !== hoveredCellRef.current?.row ||\r\n hit?.col !== hoveredCellRef.current?.col\r\n ) {\r\n hoveredCellRef.current = hit ? { row: hit.row, col: hit.col } : null;\r\n requestRender();\r\n }\r\n setCursorStyle('cell');\r\n };\r\n\r\n const handleSurfaceMouseDown = (e: React.MouseEvent<HTMLDivElement>) => {\r\n if (e.button !== 0) return; // Only left click here; right click handled in onContextMenu\r\n\r\n const { x, y, onScrollbar } = getViewportCoords(e);\r\n if (onScrollbar) return; // Let native scrollbar handle thumb dragging\r\n\r\n if (activeOverlay) setActiveOverlay(null);\r\n if (headerFilterState) setHeaderFilterState(null);\r\n if (contextMenu) setContextMenu(null);\r\n\r\n const geom = geometryRef.current;\r\n const sl = scrollPosRef.current.left;\r\n const st = scrollPosRef.current.top;\r\n const rowCount = store.getRowCount();\r\n\r\n // A. Column Resize Handle\r\n const resizeHit = geom.hitTestColumnResize(x, y, sl);\r\n if (resizeHit) {\r\n const col = geom.columns[resizeHit.colIndex];\r\n setResizingCol({\r\n colIndex: resizeHit.colIndex,\r\n colId: col.id,\r\n startX: e.clientX,\r\n initialWidth: col.width,\r\n });\r\n return;\r\n }\r\n\r\n // B. Top-Left Select-All Box\r\n if (x <= geom.rowNumberWidth && y <= geom.headerHeight) {\r\n if (rowCount > 0 && geom.columns.length > 0) {\r\n selectionRef.current.setActiveCell(0, 0);\r\n selectionRef.current.setRangeEnd(rowCount - 1, geom.columns.length - 1);\r\n setSelectedCellUI({ row: 0, col: 0 });\r\n setSelectionVersion((v) => v + 1);\r\n requestRender();\r\n }\r\n return;\r\n }\r\n\r\n // C. Header Click (Select-All Checkbox, Sort, or Filter Funnel Button)\r\n if (y <= geom.headerHeight && x > geom.rowNumberWidth) {\r\n const headerHit = geom.hitTestHeader(x, y, sl);\r\n if (headerHit) {\r\n if (headerHit.column.id === '__selection__' && rowSelectionMode === 'multiple') {\r\n if (rowCount > 0 && selectedRowKeysSet.size >= rowCount) {\r\n setSelectedRowKeysSet(new Set());\r\n onSelectionChanged?.([], []);\r\n } else {\r\n const nextKeys = new Set<any>();\r\n const nextData: any[] = [];\r\n for (let r = 0; r < rowCount; r++) {\r\n const vr = store.getViewRow(r);\r\n if (vr && vr.type === 'data') {\r\n const k = vr.data.id ?? r;\r\n nextKeys.add(k);\r\n nextData.push(vr.data);\r\n }\r\n }\r\n setSelectedRowKeysSet(nextKeys);\r\n onSelectionChanged?.(Array.from(nextKeys), nextData);\r\n }\r\n requestRender();\r\n return;\r\n }\r\n if (\r\n headerHit.isGroupHeaderHit &&\r\n headerHit.groupColIndices &&\r\n headerHit.groupColIndices.length > 0\r\n ) {\r\n if (rowCount > 0) {\r\n const startCol = headerHit.groupColIndices[0];\r\n const endCol = headerHit.groupColIndices[headerHit.groupColIndices.length - 1];\r\n selectionRef.current.setActiveCell(0, startCol);\r\n selectionRef.current.setRangeEnd(rowCount - 1, endCol);\r\n setSelectedCellUI({ row: 0, col: startCol });\r\n setSelectionVersion((v) => v + 1);\r\n requestRender();\r\n }\r\n return;\r\n }\r\n if (headerHit.isFilterIconHit && permissions.allowFiltering !== false) {\r\n setHeaderFilterState({\r\n column: headerHit.column,\r\n rect: {\r\n x: headerHit.headerX,\r\n y: 0,\r\n width: headerHit.headerWidth,\r\n height: geom.headerHeight,\r\n },\r\n });\r\n } else {\r\n handleHeaderSort(headerHit.colIndex, e.shiftKey);\r\n }\r\n }\r\n return;\r\n }\r\n\r\n // C2. Group Row Click (Works anywhere across the group row, including the left ▶/▼ chevron!)\r\n if (y > geom.headerHeight) {\r\n const clickedRowIdx = Math.floor((y - geom.headerHeight + st) / geom.rowHeight);\r\n if (clickedRowIdx >= 0 && clickedRowIdx < rowCount) {\r\n const clickedVRow = store.getViewRow(clickedRowIdx);\r\n if (clickedVRow && clickedVRow.type === 'group') {\r\n store.toggleGroup(clickedVRow.groupKey);\r\n setStoreVersion((v) => v + 1);\r\n requestRender();\r\n containerRef.current?.focus();\r\n return;\r\n }\r\n }\r\n }\r\n\r\n // D. Fill Handle or Right-Side Cell Duplicate Handle\r\n const normForDup = selectionRef.current.getNormalizedRange();\r\n const activeColForDup = geom.columns[normForDup.maxCol];\r\n const dupColType = (activeColForDup?.type || '').toLowerCase();\r\n const isSpecialNonDupCol =\r\n !activeColForDup ||\r\n dupColType === 'sparkline' ||\r\n dupColType === 'action' ||\r\n dupColType === 'pdf' ||\r\n CanvasRenderer.isColumnReadonly(activeColForDup, permissions);\r\n\r\n const canDup =\r\n !isSpecialNonDupCol &&\r\n permissions.mode !== 'read' &&\r\n permissions.mode !== 'readonly' &&\r\n permissions.allowUpdating !== false &&\r\n permissions.allowDuplicating !== false;\r\n\r\n if (canDup) {\r\n const fhHit = geom.hitTestFillHandle(x, y, sl, st, selectionRef.current);\r\n if (fhHit) {\r\n const norm = selectionRef.current.getNormalizedRange();\r\n setFillDragState({\r\n mode: fhHit,\r\n sourceRange: norm,\r\n targetRange: norm,\r\n });\r\n return;\r\n }\r\n }\r\n\r\n // E. Row Number Gutter Click (Select Full Row)\r\n const rowNumHit = geom.hitTestRowNumber(x, y, st, rowCount);\r\n if (rowNumHit !== null && geom.columns.length > 0) {\r\n if (e.shiftKey) {\r\n selectionRef.current.setRangeEnd(rowNumHit, geom.columns.length - 1);\r\n } else {\r\n selectionRef.current.setActiveCell(rowNumHit, 0);\r\n selectionRef.current.setRangeEnd(rowNumHit, geom.columns.length - 1);\r\n setSelectedCellUI({ row: rowNumHit, col: 0 });\r\n }\r\n setIsDraggingRowNumbers(true);\r\n setSelectionVersion((v) => v + 1);\r\n requestRender();\r\n containerRef.current?.focus();\r\n return;\r\n }\r\n\r\n // F. Data Cell Click\r\n const hit = geom.hitTest(x, y, sl, st, rowCount);\r\n if (!hit) return;\r\n\r\n const vRow = store.getViewRow(hit.row);\r\n // Group Header Expand/Collapse\r\n if (vRow && vRow.type === 'group') {\r\n store.toggleGroup(vRow.groupKey);\r\n return;\r\n }\r\n\r\n const colDef = geom.columns[hit.col];\r\n const colType = (colDef?.type || '').toLowerCase();\r\n const isInteractiveCol = colType === 'action' || colType === 'pdf';\r\n\r\n if (e.shiftKey && !isInteractiveCol) {\r\n selectionRef.current.setRangeEnd(hit.row, hit.col);\r\n } else {\r\n selectionRef.current.setActiveCell(hit.row, hit.col);\r\n setSelectedCellUI({ row: hit.row, col: hit.col });\r\n if (!isInteractiveCol) {\r\n setIsDraggingSelection(true);\r\n } else {\r\n setIsDraggingSelection(false);\r\n }\r\n }\r\n setSelectionVersion((v) => v + 1);\r\n\r\n // Row Selection Column Click ('__selection__')\r\n if (colDef.id === '__selection__' && vRow && vRow.type === 'data') {\r\n setIsDraggingSelection(false);\r\n const rKey = vRow.data.id ?? hit.row;\r\n setSelectedRowKeysSet((prev) => {\r\n const next = new Set(prev);\r\n if (rowSelectionMode === 'single') {\r\n if (next.has(rKey)) {\r\n next.clear();\r\n } else {\r\n next.clear();\r\n next.add(rKey);\r\n }\r\n } else {\r\n if (next.has(rKey)) next.delete(rKey);\r\n else next.add(rKey);\r\n }\r\n if (onSelectionChanged) {\r\n const rowsData: any[] = [];\r\n for (let r = 0; r < rowCount; r++) {\r\n const vr = store.getViewRow(r);\r\n if (vr && vr.type === 'data' && next.has(vr.data.id ?? r)) {\r\n rowsData.push(vr.data);\r\n }\r\n }\r\n onSelectionChanged(Array.from(next), rowsData);\r\n }\r\n return next;\r\n });\r\n requestRender();\r\n containerRef.current?.focus();\r\n return;\r\n }\r\n\r\n const plugin = ColumnTypeRegistry.get(colDef.type);\r\n\r\n // Clicking the expand icon (or clicking a sparkline cell) opens the Detailed Trend Chart Modal\r\n if (colDef.type === 'sparkline' && vRow && vRow.type === 'data') {\r\n if (hit.localX > colDef.width - 28) {\r\n setIsDraggingSelection(false);\r\n setSparklineModal({\r\n rowIndex: hit.row,\r\n rowData: vRow.data,\r\n column: colDef,\r\n points: Array.isArray(vRow.data[colDef.id]) ? vRow.data[colDef.id] : [],\r\n });\r\n requestRender();\r\n return;\r\n }\r\n }\r\n\r\n if (plugin.onPointerDown && vRow && vRow.type === 'data') {\r\n // Action & PDF columns work even in read mode; mutable plugins check canEditCell\r\n const isActionOrPdf = colType === 'action' || colType === 'pdf';\r\n if (isActionOrPdf || canEditCell(vRow.data, colDef, hit.row, false)) {\r\n let shouldFocusContainer = true;\r\n const res = plugin.onPointerDown({\r\n localX: hit.localX,\r\n localY: hit.localY,\r\n value: vRow.data[colDef.id],\r\n row: vRow.data,\r\n rowIndex: hit.row,\r\n column: colDef,\r\n setValue: (newVal) => {\r\n commitSingleCellEdit(hit.row, colDef, newVal, true);\r\n },\r\n });\r\n\r\n if (res && res.handled) {\r\n setIsDraggingSelection(false);\r\n setFillDragState(null);\r\n selectionRef.current.setActiveCell(hit.row, hit.col);\r\n setSelectionVersion((v) => v + 1);\r\n }\r\n\r\n if (res && res.shouldOpenEditor) {\r\n shouldFocusContainer = false;\r\n setIsDraggingSelection(false);\r\n openEditorForCell(hit.row, hit.col);\r\n }\r\n\r\n requestRender();\r\n if (shouldFocusContainer) {\r\n containerRef.current?.focus();\r\n }\r\n return;\r\n }\r\n }\r\n\r\n requestRender();\r\n containerRef.current?.focus();\r\n };\r\n\r\n const handleSurfaceDoubleClick = (e: React.MouseEvent<HTMLDivElement>) => {\r\n const { x, y, onScrollbar } = getViewportCoords(e);\r\n if (onScrollbar) return;\r\n\r\n const geom = geometryRef.current;\r\n const sl = scrollPosRef.current.left;\r\n const st = scrollPosRef.current.top;\r\n\r\n // Double-clicking Fill Handle -> duplicate down!\r\n const fhHit = geom.hitTestFillHandle(x, y, sl, st, selectionRef.current);\r\n if (fhHit) {\r\n handleDuplicateCellDown();\r\n return;\r\n }\r\n\r\n const hit = geom.hitTest(x, y, sl, st, store.getRowCount());\r\n if (!hit) return;\r\n\r\n setIsDraggingSelection(false);\r\n openEditorForCell(hit.row, hit.col);\r\n };\r\n\r\n const handleSurfaceContextMenu = (e: React.MouseEvent<HTMLDivElement>) => {\r\n e.preventDefault();\r\n const { x, y, onScrollbar } = getViewportCoords(e);\r\n if (onScrollbar) return;\r\n\r\n if (activeOverlay) setActiveOverlay(null);\r\n if (headerFilterState) setHeaderFilterState(null);\r\n\r\n const geom = geometryRef.current;\r\n const sl = scrollPosRef.current.left;\r\n const st = scrollPosRef.current.top;\r\n const rowCount = store.getRowCount();\r\n\r\n // 1. Header Right-Click\r\n if (y <= geom.headerHeight && x > geom.rowNumberWidth) {\r\n const headerHit = geom.hitTestHeader(x, y, sl);\r\n if (headerHit) {\r\n setContextMenu({\r\n targetType: 'header',\r\n x,\r\n y,\r\n row: 0,\r\n col: headerHit.colIndex,\r\n column: headerHit.column,\r\n });\r\n }\r\n return;\r\n }\r\n\r\n // 1b. Group Row Right-Click\r\n if (y > geom.headerHeight) {\r\n const clickedRowIdx = Math.floor((y - geom.headerHeight + st) / geom.rowHeight);\r\n if (clickedRowIdx >= 0 && clickedRowIdx < rowCount) {\r\n const gRow = store.getViewRow(clickedRowIdx);\r\n if (gRow && gRow.type === 'group') {\r\n const groupCol = geom.columns.find((c) => c.id === gRow.field) || geom.columns[0];\r\n setContextMenu({\r\n targetType: 'cell',\r\n x,\r\n y,\r\n row: clickedRowIdx,\r\n col: 0,\r\n column: groupCol,\r\n rowData: {},\r\n });\r\n return;\r\n }\r\n }\r\n }\r\n\r\n // 2. Row Number Right-Click\r\n const rowNumHit = geom.hitTestRowNumber(x, y, st, rowCount);\r\n if (rowNumHit !== null) {\r\n const vRow = store.getViewRow(rowNumHit);\r\n if (vRow && vRow.type === 'data') {\r\n selectionRef.current.setActiveCell(rowNumHit, 0);\r\n selectionRef.current.setRangeEnd(rowNumHit, geom.columns.length - 1);\r\n setSelectedCellUI({ row: rowNumHit, col: 0 });\r\n setSelectionVersion((v) => v + 1);\r\n requestRender();\r\n\r\n setContextMenu({\r\n targetType: 'rownumber',\r\n x,\r\n y,\r\n row: rowNumHit,\r\n col: 0,\r\n column: geom.columns[0],\r\n rowData: vRow.data,\r\n });\r\n }\r\n return;\r\n }\r\n\r\n // 3. Cell Right-Click\r\n const hit = geom.hitTest(x, y, sl, st, rowCount);\r\n if (!hit) return;\r\n\r\n const vRow = store.getViewRow(hit.row);\r\n if (!vRow || vRow.type !== 'data') return;\r\n\r\n if (!selectionRef.current.isCellSelected(hit.row, hit.col)) {\r\n selectionRef.current.setActiveCell(hit.row, hit.col);\r\n setSelectedCellUI({ row: hit.row, col: hit.col });\r\n setSelectionVersion((v) => v + 1);\r\n requestRender();\r\n }\r\n\r\n setContextMenu({\r\n targetType: 'cell',\r\n x,\r\n y,\r\n row: hit.row,\r\n col: hit.col,\r\n column: geom.columns[hit.col],\r\n rowData: vRow.data,\r\n });\r\n };\r\n\r\n // ============================================================================\r\n // MOBILE TOUCH GESTURES (DOUBLE-TAP TO EDIT & LONG-PRESS CONTEXT MENU)\r\n // ============================================================================\r\n const touchStateRef = useRef<{\r\n startX: number;\r\n startY: number;\r\n moved: boolean;\r\n longPressTimer: number | null;\r\n lastTapTime: number;\r\n lastTapRow: number;\r\n lastTapCol: number;\r\n }>({\r\n startX: 0,\r\n startY: 0,\r\n moved: false,\r\n longPressTimer: null,\r\n lastTapTime: 0,\r\n lastTapRow: -1,\r\n lastTapCol: -1,\r\n });\r\n\r\n const handleSurfaceTouchStart = (e: React.TouchEvent<HTMLDivElement>) => {\r\n if (e.touches.length !== 1) return;\r\n const touch = e.touches[0];\r\n const surface = gridSurfaceRef.current;\r\n if (!surface) return;\r\n\r\n const rect = surface.getBoundingClientRect();\r\n const x = touch.clientX - rect.left;\r\n const y = touch.clientY - rect.top;\r\n\r\n if (touchStateRef.current.longPressTimer) {\r\n window.clearTimeout(touchStateRef.current.longPressTimer);\r\n }\r\n\r\n touchStateRef.current.startX = touch.clientX;\r\n touchStateRef.current.startY = touch.clientY;\r\n touchStateRef.current.moved = false;\r\n\r\n touchStateRef.current.longPressTimer = window.setTimeout(() => {\r\n if (touchStateRef.current.moved) return;\r\n const geom = geometryRef.current;\r\n const sl = scrollPosRef.current.left;\r\n const st = scrollPosRef.current.top;\r\n const rowCount = store.getRowCount();\r\n const hit = geom.hitTest(x, y, sl, st, rowCount);\r\n if (hit) {\r\n const vRow = store.getViewRow(hit.row);\r\n if (vRow && vRow.type === 'data') {\r\n setIsDraggingSelection(false);\r\n selectionRef.current.setActiveCell(hit.row, hit.col);\r\n setSelectedCellUI({ row: hit.row, col: hit.col });\r\n setSelectionVersion((v) => v + 1);\r\n requestRender();\r\n if (typeof navigator !== 'undefined' && navigator.vibrate) {\r\n navigator.vibrate(15);\r\n }\r\n setContextMenu({\r\n targetType: 'cell',\r\n x,\r\n y,\r\n row: hit.row,\r\n col: hit.col,\r\n column: geom.columns[hit.col],\r\n rowData: vRow.data,\r\n });\r\n }\r\n }\r\n }, 480);\r\n };\r\n\r\n const handleSurfaceTouchMove = (e: React.TouchEvent<HTMLDivElement>) => {\r\n if (e.touches.length !== 1) return;\r\n const touch = e.touches[0];\r\n const dx = Math.abs(touch.clientX - touchStateRef.current.startX);\r\n const dy = Math.abs(touch.clientY - touchStateRef.current.startY);\r\n if (dx > 8 || dy > 8) {\r\n touchStateRef.current.moved = true;\r\n if (touchStateRef.current.longPressTimer) {\r\n window.clearTimeout(touchStateRef.current.longPressTimer);\r\n touchStateRef.current.longPressTimer = null;\r\n }\r\n if (isDraggingSelection) {\r\n setIsDraggingSelection(false);\r\n }\r\n }\r\n };\r\n\r\n const handleSurfaceTouchEnd = (e: React.TouchEvent<HTMLDivElement>) => {\r\n if (touchStateRef.current.longPressTimer) {\r\n window.clearTimeout(touchStateRef.current.longPressTimer);\r\n touchStateRef.current.longPressTimer = null;\r\n }\r\n if (touchStateRef.current.moved || e.changedTouches.length !== 1) return;\r\n\r\n const touch = e.changedTouches[0];\r\n const surface = gridSurfaceRef.current;\r\n if (!surface) return;\r\n\r\n const rect = surface.getBoundingClientRect();\r\n const x = touch.clientX - rect.left;\r\n const y = touch.clientY - rect.top;\r\n\r\n const geom = geometryRef.current;\r\n const sl = scrollPosRef.current.left;\r\n const st = scrollPosRef.current.top;\r\n const hit = geom.hitTest(x, y, sl, st, store.getRowCount());\r\n if (!hit) return;\r\n\r\n const now = Date.now();\r\n if (\r\n now - touchStateRef.current.lastTapTime < 340 &&\r\n touchStateRef.current.lastTapRow === hit.row &&\r\n touchStateRef.current.lastTapCol === hit.col\r\n ) {\r\n touchStateRef.current.lastTapTime = 0;\r\n setIsDraggingSelection(false);\r\n openEditorForCell(hit.row, hit.col);\r\n } else {\r\n touchStateRef.current.lastTapTime = now;\r\n touchStateRef.current.lastTapRow = hit.row;\r\n touchStateRef.current.lastTapCol = hit.col;\r\n }\r\n };\r\n\r\n // ============================================================================\r\n // CLEAR SELECTED CELLS\r\n // ============================================================================\r\n const handleClearSelectedCells = useCallback(() => {\r\n const norm = selectionRef.current.getNormalizedRange();\r\n const geom = geometryRef.current;\r\n const updates: Array<{ rowIndex: number; rowKey: any; colDef: ColumnDef; newValue: any }> = [];\r\n\r\n for (let r = norm.minRow; r <= norm.maxRow; r++) {\r\n const vRow = store.getViewRow(r);\r\n if (!vRow || vRow.type !== 'data') continue;\r\n for (let c = norm.minCol; c <= norm.maxCol; c++) {\r\n const colDef = geom.columns[c];\r\n if (!colDef) continue;\r\n const emptyVal =\r\n colDef.type === 'number' || colDef.type === 'currency' || colDef.type === 'progress' || colDef.type === 'rating'\r\n ? 0\r\n : colDef.type === 'boolean'\r\n ? false\r\n : '';\r\n updates.push({\r\n rowIndex: r,\r\n rowKey: vRow.data.id ?? r,\r\n colDef,\r\n newValue: emptyVal,\r\n });\r\n }\r\n }\r\n\r\n applyBatchCellUpdates(updates, 'Clear Cells');\r\n }, [store, applyBatchCellUpdates]);\r\n\r\n // ============================================================================\r\n // EXCEL TSV CLIPBOARD COPY & PASTE\r\n // ============================================================================\r\n const buildSelectedTsv = useCallback((): string => {\r\n const norm = selectionRef.current.getNormalizedRange();\r\n const rowsText: string[] = [];\r\n\r\n for (let r = norm.minRow; r <= norm.maxRow; r++) {\r\n const vRow = store.getViewRow(r);\r\n if (!vRow || vRow.type === 'group') continue;\r\n\r\n const cellsText: string[] = [];\r\n for (let c = norm.minCol; c <= norm.maxCol; c++) {\r\n const colDef = geometryRef.current.columns[c];\r\n if (!colDef) continue;\r\n const val = vRow.data[colDef.id];\r\n const plugin = ColumnTypeRegistry.get(colDef.type);\r\n const formatted = plugin.formatClipboard\r\n ? plugin.formatClipboard(val, colDef)\r\n : String(val ?? '');\r\n cellsText.push(formatted);\r\n }\r\n rowsText.push(cellsText.join('\\t'));\r\n }\r\n\r\n return rowsText.join('\\n');\r\n }, [store]);\r\n\r\n const applyPastedTsv = useCallback(\r\n (text: string) => {\r\n if (!text) return;\r\n if (\r\n permissions.mode === 'read' ||\r\n permissions.mode === 'readonly' ||\r\n permissions.allowUpdating === false ||\r\n permissions.allowClipboardPaste === false\r\n ) {\r\n showToast(\r\n currentLocale.code.startsWith('tr')\r\n ? '🔒 Panodan yapıştırma yetkisi kapalı.'\r\n : '🔒 Clipboard paste is disabled by permissions.',\r\n 'warning'\r\n );\r\n return;\r\n }\r\n\r\n const lines = text.replace(/\\r/g, '').split('\\n');\r\n if (lines.length > 1 && lines[lines.length - 1] === '') {\r\n lines.pop();\r\n }\r\n\r\n const norm = selectionRef.current.getNormalizedRange();\r\n const geom = geometryRef.current;\r\n const updates: Array<{ rowIndex: number; rowKey: any; colDef: ColumnDef; newValue: any }> = [];\r\n\r\n // Excel Behavior: If a single cell is in clipboard and multiple cells are selected, fill entire selection!\r\n const isSingleClipboardValue = lines.length === 1 && !lines[0].includes('\\t');\r\n const hasMultiSelection = norm.maxRow > norm.minRow || norm.maxCol > norm.minCol;\r\n\r\n if (isSingleClipboardValue && hasMultiSelection) {\r\n const rawCellText = lines[0];\r\n for (let r = norm.minRow; r <= norm.maxRow; r++) {\r\n const vRow = store.getViewRow(r);\r\n if (!vRow || vRow.type !== 'data') continue;\r\n for (let c = norm.minCol; c <= norm.maxCol; c++) {\r\n const colDef = geom.columns[c];\r\n if (!colDef) continue;\r\n const plugin = ColumnTypeRegistry.get(colDef.type);\r\n const parsedVal = plugin.parseClipboard\r\n ? plugin.parseClipboard(rawCellText, colDef)\r\n : rawCellText.trim();\r\n updates.push({\r\n rowIndex: r,\r\n rowKey: vRow.data.id ?? r,\r\n colDef,\r\n newValue: parsedVal,\r\n });\r\n }\r\n }\r\n } else {\r\n const startRow = norm.minRow;\r\n const startCol = norm.minCol;\r\n\r\n lines.forEach((line, rOffset) => {\r\n const targetRow = startRow + rOffset;\r\n if (targetRow >= store.getRowCount()) return;\r\n\r\n const vRow = store.getViewRow(targetRow);\r\n if (!vRow || vRow.type !== 'data') return;\r\n\r\n const cells = line.split('\\t');\r\n cells.forEach((cellText, cOffset) => {\r\n const targetCol = startCol + cOffset;\r\n if (targetCol >= geom.columns.length) return;\r\n\r\n const colDef = geom.columns[targetCol];\r\n if (!colDef) return;\r\n const plugin = ColumnTypeRegistry.get(colDef.type);\r\n const parsedVal = plugin.parseClipboard\r\n ? plugin.parseClipboard(cellText, colDef)\r\n : cellText.trim();\r\n\r\n updates.push({\r\n rowIndex: targetRow,\r\n rowKey: vRow.data.id ?? targetRow,\r\n colDef,\r\n newValue: parsedVal,\r\n });\r\n });\r\n });\r\n }\r\n\r\n applyBatchCellUpdates(updates, 'Paste from Clipboard');\r\n },\r\n [permissions, store, applyBatchCellUpdates, currentLocale, showToast]\r\n );\r\n\r\n const handleCopy = (e: React.ClipboardEvent) => {\r\n if (activeOverlay) return;\r\n const { col } = selectionRef.current.activeCell;\r\n const colDef = geometryRef.current.columns[col];\r\n if (colDef?.type === 'sparkline') return;\r\n e.preventDefault();\r\n const tsv = buildSelectedTsv();\r\n internalClipboardRef.current = tsv;\r\n e.clipboardData.setData('text/plain', tsv);\r\n showToast(\r\n currentLocale.code.startsWith('tr')\r\n ? '📋 Seçili hücreler panoya kopyalandı (TSV).'\r\n : '📋 Selected range copied to clipboard (TSV).',\r\n 'info'\r\n );\r\n };\r\n\r\n const handlePaste = (e: React.ClipboardEvent) => {\r\n if (activeOverlay) return;\r\n const text = e.clipboardData.getData('text/plain') || internalClipboardRef.current;\r\n if (!text) return;\r\n e.preventDefault();\r\n applyPastedTsv(text);\r\n };\r\n\r\n // ============================================================================\r\n // KEYBOARD NAVIGATION & EXCEL SHORTCUTS\r\n // ============================================================================\r\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\r\n if (activeOverlay) return;\r\n\r\n const { row, col } = selectionRef.current.activeCell;\r\n const colDef = geometryRef.current.columns[col];\r\n const vRow = store.getViewRow(row);\r\n\r\n // Excel & Web Shortcuts with Ctrl / Meta\r\n if (e.ctrlKey || e.metaKey) {\r\n const k = e.key.toLowerCase();\r\n if (k === 's') {\r\n e.preventDefault();\r\n handleSaveBatch();\r\n return;\r\n }\r\n if (k === 'n') {\r\n e.preventDefault();\r\n onAddNewRow?.();\r\n return;\r\n }\r\n if (k === 'd') {\r\n e.preventDefault();\r\n handleDuplicateCellDown();\r\n return;\r\n }\r\n // Note: Never hijack Ctrl+R / Ctrl+F5 for cell duplication; allow browser reload\r\n if (k === 'r' || k === 'f5') {\r\n onRefresh?.();\r\n return;\r\n }\r\n if (k === 'z') {\r\n e.preventDefault();\r\n if (e.shiftKey) historyRef.current.redo();\r\n else historyRef.current.undo();\r\n setStoreVersion((v) => v + 1);\r\n requestRender();\r\n return;\r\n }\r\n if (k === 'y') {\r\n e.preventDefault();\r\n historyRef.current.redo();\r\n setStoreVersion((v) => v + 1);\r\n requestRender();\r\n return;\r\n }\r\n if (k === 'a') {\r\n e.preventDefault();\r\n if (store.getRowCount() > 0 && geometryRef.current.columns.length > 0) {\r\n selectionRef.current.setActiveCell(0, 0);\r\n selectionRef.current.setRangeEnd(\r\n store.getRowCount() - 1,\r\n geometryRef.current.columns.length - 1\r\n );\r\n setSelectionVersion((v) => v + 1);\r\n requestRender();\r\n }\r\n return;\r\n }\r\n }\r\n\r\n // F5 / Refresh Key\r\n if (e.key === 'F5') {\r\n onRefresh?.();\r\n return;\r\n }\r\n\r\n // Alt+R for Duplicate Cell Right (keeps Ctrl+R clean for browser reload)\r\n if (e.altKey && (e.key === 'r' || e.key === 'R')) {\r\n e.preventDefault();\r\n handleDuplicateCellRight();\r\n return;\r\n }\r\n\r\n // Shift+D for Row Duplication\r\n if (e.shiftKey && e.key === 'D' && !e.ctrlKey && !e.metaKey) {\r\n e.preventDefault();\r\n handleDuplicateRow(row);\r\n return;\r\n }\r\n\r\n // Toggle Group Row with Space or Enter\r\n if (vRow && vRow.type === 'group' && (e.key === 'Enter' || e.key === ' ')) {\r\n e.preventDefault();\r\n store.toggleGroup(vRow.groupKey);\r\n setStoreVersion((v) => v + 1);\r\n requestRender();\r\n return;\r\n }\r\n\r\n // Plugin-specific key handlers (Space toggle for Boolean, 1-5 for Rating, initial char for Text/Number)\r\n if (colDef && vRow && vRow.type === 'data' && !e.ctrlKey && !e.metaKey && !e.altKey) {\r\n const plugin = ColumnTypeRegistry.get(colDef.type);\r\n if (plugin.onKeyDown) {\r\n const isAction = colDef.type === 'action';\r\n if (isAction || canEditCell(vRow.data, colDef, row, true)) {\r\n const handled = plugin.onKeyDown({\r\n event: e,\r\n value: vRow.data[colDef.id],\r\n row: vRow.data,\r\n rowIndex: row,\r\n column: colDef,\r\n setValue: (newVal) => {\r\n commitSingleCellEdit(row, colDef, newVal, true);\r\n },\r\n openEditor: (char) => openEditorForCell(row, col, char),\r\n });\r\n if (handled) return;\r\n }\r\n }\r\n }\r\n\r\n switch (e.key) {\r\n case 'ArrowUp':\r\n e.preventDefault();\r\n moveSelection(-1, 0, e.shiftKey);\r\n break;\r\n case 'ArrowDown':\r\n e.preventDefault();\r\n moveSelection(1, 0, e.shiftKey);\r\n break;\r\n case 'ArrowLeft':\r\n e.preventDefault();\r\n moveSelection(0, -1, e.shiftKey);\r\n break;\r\n case 'ArrowRight':\r\n e.preventDefault();\r\n moveSelection(0, 1, e.shiftKey);\r\n break;\r\n case 'Tab':\r\n e.preventDefault();\r\n moveSelection(0, e.shiftKey ? -1 : 1);\r\n break;\r\n case 'Enter':\r\n case 'F2':\r\n e.preventDefault();\r\n openEditorForCell(row, col);\r\n break;\r\n case 'Delete':\r\n case 'Backspace':\r\n e.preventDefault();\r\n handleClearSelectedCells();\r\n break;\r\n }\r\n };\r\n\r\n // ============================================================================\r\n // CSV EXPORT\r\n // ============================================================================\r\n const exportCsv = () => {\r\n if (permissions.allowExport === false) return;\r\n const cols = geometryRef.current.columns;\r\n const headerRow = cols.map((c) => `\"${c.title.replace(/\"/g, '\"\"')}\"`).join(',');\r\n const rows: string[] = [headerRow];\r\n\r\n for (let r = 0; r < store.getRowCount(); r++) {\r\n const vRow = store.getViewRow(r);\r\n if (!vRow || vRow.type === 'group') continue;\r\n\r\n const cellVals = cols.map((c) => {\r\n const val = vRow.data[c.id];\r\n return `\"${String(val ?? '').replace(/\"/g, '\"\"')}\"`;\r\n });\r\n rows.push(cellVals.join(','));\r\n }\r\n\r\n const blob = new Blob(['\\uFEFF' + rows.join('\\r\\n')], { type: 'text/csv;charset=utf-8;' });\r\n const url = URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.setAttribute('download', `sheetgl_export_${new Date().toISOString().slice(0, 10)}.csv`);\r\n document.body.appendChild(link);\r\n link.click();\r\n document.body.removeChild(link);\r\n };\r\n\r\n // ============================================================================\r\n // LIVE SELECTION AGGREGATIONS (EXCEL STATUS BAR STATS)\r\n // ============================================================================\r\n const selectionStats = useMemo<SelectionSummaryStats | null>(() => {\r\n const norm = selectionRef.current.getNormalizedRange();\r\n const rowSpan = norm.maxRow - norm.minRow + 1;\r\n const colSpan = norm.maxCol - norm.minCol + 1;\r\n if (rowSpan * colSpan <= 1) return null;\r\n\r\n // Cap calculation to 2,000 cells for instant 60 FPS responsiveness\r\n if (rowSpan * colSpan > 2000) {\r\n return {\r\n count: rowSpan * colSpan,\r\n numericCount: 0,\r\n sum: 0,\r\n avg: 0,\r\n min: 0,\r\n max: 0,\r\n };\r\n }\r\n\r\n let count = 0;\r\n let numericCount = 0;\r\n let sum = 0;\r\n let min = Infinity;\r\n let max = -Infinity;\r\n\r\n for (let r = norm.minRow; r <= norm.maxRow; r++) {\r\n const vRow = store.getViewRow(r);\r\n if (!vRow || vRow.type !== 'data') continue;\r\n for (let c = norm.minCol; c <= norm.maxCol; c++) {\r\n const colDef = geometryRef.current.columns[c];\r\n if (!colDef) continue;\r\n const val = vRow.data[colDef.id];\r\n if (val !== null && val !== undefined && val !== '') {\r\n count++;\r\n if (typeof val === 'number' && !isNaN(val)) {\r\n numericCount++;\r\n sum += val;\r\n if (val < min) min = val;\r\n if (val > max) max = val;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return {\r\n count,\r\n numericCount,\r\n sum,\r\n avg: numericCount > 0 ? sum / numericCount : 0,\r\n min: numericCount > 0 ? min : 0,\r\n max: numericCount > 0 ? max : 0,\r\n };\r\n }, [store, selectionVersion, storeVersion]);\r\n\r\n // Active Cell & Pending Batch Changes Info\r\n const currentColumn = geometryRef.current.columns[selectedCellUI.col];\r\n const activeViewRow = store.getViewRow(selectedCellUI.row);\r\n const currentCellValue =\r\n activeViewRow && activeViewRow.type === 'data' && currentColumn\r\n ? activeViewRow.data[currentColumn.id]\r\n : '';\r\n const isActiveCellEditable = Boolean(\r\n activeViewRow &&\r\n activeViewRow.type === 'data' &&\r\n currentColumn &&\r\n canEditCell(activeViewRow.data, currentColumn, selectedCellUI.row, true)\r\n );\r\n\r\n const pendingChanges = showBatchModal ? store.getPendingChanges?.() : undefined;\r\n const pendingChangesCount =\r\n store.getPendingChangesCount !== undefined\r\n ? store.getPendingChangesCount()\r\n : (pendingChanges?.inserted?.length || 0) +\r\n (pendingChanges?.updated?.length || 0) +\r\n (pendingChanges?.deleted?.length || 0);\r\n\r\n const normRange = selectionRef.current.getNormalizedRange();\r\n const selectionSpan = {\r\n rows: normRange.maxRow - normRange.minRow + 1,\r\n cols: normRange.maxCol - normRange.minCol + 1,\r\n };\r\n\r\n return (\r\n <div\r\n ref={containerRef}\r\n tabIndex={0}\r\n onKeyDown={handleKeyDown}\r\n onCopy={handleCopy}\r\n onPaste={handlePaste}\r\n className={`sheetgl-container ${className || ''}`}\r\n style={{\r\n display: 'flex',\r\n flexDirection: 'column',\r\n width: '100%',\r\n height: '100%',\r\n outline: 'none',\r\n backgroundColor: resolvedTheme.canvas.bg,\r\n color: resolvedTheme.canvas.cellText,\r\n fontFamily: resolvedTheme.fontFamily,\r\n boxSizing: 'border-box',\r\n overflow: activeOverlay || headerFilterState || contextMenu ? 'visible' : 'hidden',\r\n position: 'relative',\r\n zIndex: activeOverlay || headerFilterState || contextMenu ? 60 : undefined,\r\n ...style,\r\n }}\r\n >\r\n {/* 1. TOP TOOLBAR */}\r\n <ToolBar\r\n theme={resolvedTheme}\r\n locale={currentLocale}\r\n currentThemeName={typeof currentThemeName === 'string' ? currentThemeName : 'custom'}\r\n onThemeChange={(nextTheme) => {\r\n setCurrentThemeName(nextTheme);\r\n if (typeof nextTheme === 'string') {\r\n onThemeChange?.(nextTheme);\r\n }\r\n }}\r\n onLocaleChange={(code) => {\r\n const resolved = LocaleEngine.resolve(code);\r\n setCurrentLocale(resolved);\r\n onLocaleChange?.(resolved.code.startsWith('tr') ? 'tr' : 'en', resolved);\r\n }}\r\n searchKeyword={searchKeyword}\r\n onSearchChange={async (k) => {\r\n setSearchKeyword(k);\r\n await store.setSearch(k);\r\n setStoreVersion((v) => v + 1);\r\n requestRender();\r\n }}\r\n onExportCsv={exportCsv}\r\n groups={groups.map((g) => g.selector)}\r\n onToggleGroupColumn={handleToggleGroupColumn}\r\n onExpandAllGroups={() => {\r\n store.expandAllGroups?.();\r\n setStoreVersion((v) => v + 1);\r\n requestRender();\r\n }}\r\n onCollapseAllGroups={() => {\r\n store.collapseAllGroups?.();\r\n if (scrollContainerRef.current) {\r\n scrollContainerRef.current.scrollTop = 0;\r\n }\r\n scrollPosRef.current.top = 0;\r\n setStoreVersion((v) => v + 1);\r\n requestRender();\r\n }}\r\n availableColumns={columns}\r\n onUpdateColumn={handleUpdateColumnDef}\r\n summaryTypes={store.getSummaryTypes?.()}\r\n onChangeSummaryType={handleChangeSummaryType}\r\n permissions={permissions}\r\n onPermissionsChange={handleUpdatePermissions}\r\n onAddRow={() => handleInsertRow(0)}\r\n onDuplicateRow={() => handleDuplicateRow(selectedCellUI.row)}\r\n onDeleteRow={() => handleDeleteRow()}\r\n canUndo={historyRef.current.canUndo()}\r\n canRedo={historyRef.current.canRedo()}\r\n onUndo={() => {\r\n historyRef.current.undo();\r\n setStoreVersion((v) => v + 1);\r\n requestRender();\r\n }}\r\n onRedo={() => {\r\n historyRef.current.redo();\r\n setStoreVersion((v) => v + 1);\r\n requestRender();\r\n }}\r\n pendingChangesCount={pendingChangesCount}\r\n onSaveBatch={handleSaveBatch}\r\n onDiscardBatch={handleDiscardBatch}\r\n onInspectBatchChanges={() => setShowBatchModal(true)}\r\n selectedRowCount={selectedRowKeysSet.size}\r\n selectionMode={rowSelectionMode}\r\n onSelectionModeChange={(m) => {\r\n setRowSelectionMode(m);\r\n if (m === 'none') {\r\n setSelectedRowKeysSet(new Set());\r\n onSelectionChanged?.([], []);\r\n } else if (m === 'single' && selectedRowKeysSet.size > 1) {\r\n const first = Array.from(selectedRowKeysSet)[0];\r\n setSelectedRowKeysSet(new Set([first]));\r\n }\r\n onSelectionModeChange?.(m);\r\n }}\r\n activeFilterCount={Object.keys(columnFilters).length}\r\n onClearAllFilters={handleClearAllFilters}\r\n toolbarConfig={toolbarConfig}\r\n onUpdateToolbarConfig={handleUpdateToolbarConfig}\r\n summaryConfig={summaryConfig}\r\n onUpdateSummaryConfig={handleUpdateSummaryConfig}\r\n />\r\n\r\n {/* 2. FORMULA & COORDINATE BAR */}\r\n {showFormulaBar && (\r\n <FormulaBar\r\n activeCoords={selectedCellUI}\r\n selectionSpan={selectionSpan}\r\n column={currentColumn}\r\n currentValue={currentCellValue}\r\n isEditable={isActiveCellEditable}\r\n buttonDisplayMode={toolbarConfig.buttonDisplayMode || 'icon-text'}\r\n canDuplicate={\r\n permissions.mode !== 'read' &&\r\n permissions.mode !== 'readonly' &&\r\n permissions.allowDuplicating !== false\r\n }\r\n onCommitValue={(newVal) => {\r\n if (currentColumn) {\r\n commitSingleCellEdit(selectedCellUI.row, currentColumn, newVal, true);\r\n }\r\n }}\r\n onDuplicateDown={handleDuplicateCellDown}\r\n onDuplicateRight={handleDuplicateCellRight}\r\n onDuplicateRow={() => handleDuplicateRow(selectedCellUI.row)}\r\n onOpenSparklineModal={() => {\r\n if (\r\n currentColumn?.type === 'sparkline' &&\r\n activeViewRow &&\r\n activeViewRow.type === 'data'\r\n ) {\r\n setSparklineModal({\r\n rowIndex: selectedCellUI.row,\r\n rowData: activeViewRow.data,\r\n column: currentColumn,\r\n points: Array.isArray(activeViewRow.data[currentColumn.id])\r\n ? activeViewRow.data[currentColumn.id]\r\n : [],\r\n });\r\n }\r\n }}\r\n theme={resolvedTheme}\r\n locale={currentLocale}\r\n />\r\n )}\r\n\r\n {/* 3. MAIN GRID SURFACE (CANVAS + VIRTUAL SCROLLBAR + MICRO-DOM OVERLAYS) */}\r\n <div\r\n ref={gridSurfaceRef}\r\n onMouseDown={handleSurfaceMouseDown}\r\n onMouseMove={handleSurfaceMouseMove}\r\n onDoubleClick={handleSurfaceDoubleClick}\r\n onContextMenu={handleSurfaceContextMenu}\r\n onTouchStart={handleSurfaceTouchStart}\r\n onTouchMove={handleSurfaceTouchMove}\r\n onTouchEnd={handleSurfaceTouchEnd}\r\n style={{\r\n position: 'relative',\r\n flex: 1,\r\n overflow: activeOverlay || headerFilterState || contextMenu ? 'visible' : 'hidden',\r\n cursor: resizingCol ? 'col-resize' : cursorStyle,\r\n }}\r\n >\r\n {/* Physical 2D Canvas */}\r\n <canvas\r\n ref={canvasRef}\r\n style={{\r\n position: 'absolute',\r\n inset: 0,\r\n width: '100%',\r\n height: '100%',\r\n display: 'block',\r\n pointerEvents: 'none',\r\n zIndex: 10,\r\n }}\r\n />\r\n\r\n {/* Virtual Scroll Container */}\r\n <div\r\n ref={scrollContainerRef}\r\n onScroll={handleScroll}\r\n style={{\r\n position: 'absolute',\r\n inset: 0,\r\n overflow: 'auto',\r\n zIndex: 20,\r\n }}\r\n >\r\n {/* Virtual Sizing Spacer (Adds 18px right buffer so vertical scrollbar never covers rightmost header filter icon) */}\r\n <div\r\n style={{\r\n width: getTotalWidth(),\r\n height: getTotalHeight(store.getRowCount()),\r\n pointerEvents: 'none',\r\n }}\r\n />\r\n </div>\r\n\r\n {/* Right-Side Scroll Indicator Pill & Quick Jump Buttons */}\r\n {scrollIndicator.visible && store.getRowCount() > 30 && (\r\n <div\r\n style={{\r\n position: 'absolute',\r\n right: 24,\r\n top: Math.max(\r\n geometryRef.current.headerHeight + 8,\r\n Math.min(\r\n (gridSurfaceRef.current?.clientHeight || 400) - 44,\r\n geometryRef.current.headerHeight +\r\n ((scrollIndicator.row / Math.max(1, store.getRowCount())) *\r\n ((gridSurfaceRef.current?.clientHeight || 400) -\r\n geometryRef.current.headerHeight -\r\n 44))\r\n )\r\n ),\r\n zIndex: 90,\r\n padding: '4px 10px',\r\n borderRadius: 6,\r\n backgroundColor: resolvedTheme.dom.popoverBg,\r\n color: resolvedTheme.dom.popoverText,\r\n border: `1px solid ${resolvedTheme.dom.popoverBorder}`,\r\n boxShadow: resolvedTheme.dom.popoverShadow,\r\n fontSize: 11,\r\n fontWeight: 700,\r\n pointerEvents: 'none',\r\n fontFamily: 'monospace',\r\n }}\r\n >\r\n {currentLocale.rows}: {scrollIndicator.row.toLocaleString(currentLocale.code)} /{' '}\r\n {store.getRowCount().toLocaleString(currentLocale.code)}\r\n </div>\r\n )}\r\n\r\n {/* Right-Bottom Quick Scroll Navigation Controls */}\r\n {store.getRowCount() > 25 && (\r\n <div\r\n onMouseDown={(e) => e.stopPropagation()}\r\n style={{\r\n position: 'absolute',\r\n right: 22,\r\n bottom: 18,\r\n zIndex: 85,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 4,\r\n }}\r\n >\r\n <button\r\n type=\"button\"\r\n title=\"Scroll to Top\"\r\n onClick={scrollToTop}\r\n style={{\r\n width: 26,\r\n height: 26,\r\n borderRadius: 6,\r\n border: `1px solid ${resolvedTheme.dom.popoverBorder}`,\r\n backgroundColor: resolvedTheme.dom.popoverBg,\r\n color: resolvedTheme.dom.popoverText,\r\n boxShadow: resolvedTheme.dom.popoverShadow,\r\n cursor: 'pointer',\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n }}\r\n >\r\n <MaterialIcon name=\"vertical_align_top\" size={16} />\r\n </button>\r\n <button\r\n type=\"button\"\r\n title=\"Scroll to Bottom\"\r\n onClick={scrollToBottom}\r\n style={{\r\n width: 26,\r\n height: 26,\r\n borderRadius: 6,\r\n border: `1px solid ${resolvedTheme.dom.popoverBorder}`,\r\n backgroundColor: resolvedTheme.dom.popoverBg,\r\n color: resolvedTheme.dom.popoverText,\r\n boxShadow: resolvedTheme.dom.popoverShadow,\r\n cursor: 'pointer',\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n }}\r\n >\r\n <MaterialIcon name=\"vertical_align_bottom\" size={16} />\r\n </button>\r\n </div>\r\n )}\r\n\r\n {/* Toast Feedback Notification */}\r\n {toastMessage && (\r\n <div\r\n style={{\r\n position: 'absolute',\r\n bottom: 16,\r\n left: '50%',\r\n transform: 'translateX(-50%)',\r\n zIndex: 200,\r\n padding: '7px 14px',\r\n borderRadius: 8,\r\n backgroundColor:\r\n toastMessage.type === 'warning'\r\n ? 'rgba(255, 159, 10, 0.95)'\r\n : toastMessage.type === 'success'\r\n ? 'rgba(48, 209, 88, 0.95)'\r\n : resolvedTheme.dom.popoverBg,\r\n color:\r\n toastMessage.type === 'warning' || toastMessage.type === 'success'\r\n ? '#FFFFFF'\r\n : resolvedTheme.dom.popoverText,\r\n border: `1px solid ${resolvedTheme.dom.popoverBorder}`,\r\n boxShadow: resolvedTheme.dom.popoverShadow,\r\n fontSize: 12,\r\n fontWeight: 600,\r\n pointerEvents: 'none',\r\n }}\r\n >\r\n {toastMessage.text}\r\n </div>\r\n )}\r\n\r\n {/* 4. DYNAMIC MICRO-DOM CELL EDITOR */}\r\n {activeOverlay && (\r\n <DynamicCellEditor\r\n overlay={activeOverlay}\r\n theme={resolvedTheme}\r\n locale={currentLocale}\r\n validationError={editorValidationError}\r\n isValidating={isEditorValidating}\r\n onCommit={async (newVal, moveDir) => {\r\n if (isEditorValidating) return;\r\n const targetRow = activeOverlay.row;\r\n const targetCol = activeOverlay.column;\r\n const hasAsync =\r\n targetCol.validationRules?.some((r) => r.type === 'async') ||\r\n Boolean(targetCol.validator);\r\n\r\n if (hasAsync) {\r\n setIsEditorValidating(true);\r\n }\r\n const ok = await commitSingleCellEdit(targetRow, targetCol, newVal, true);\r\n if (hasAsync) {\r\n setIsEditorValidating(false);\r\n }\r\n\r\n if (ok) {\r\n setEditorValidationError(null);\r\n setActiveOverlay(null);\r\n\r\n const vRow = store.getViewRow(targetRow);\r\n const rowData = vRow && vRow.type === 'data' ? vRow.data : undefined;\r\n const rowKey = rowData ? (rowData[(store as any).keyField ?? 'id'] ?? rowData.id) : undefined;\r\n const isInserted = (store as any).isRowInserted\r\n ? (store as any).isRowInserted(rowKey)\r\n : Boolean(rowData?.__isNew || String(rowKey ?? '').startsWith('new_'));\r\n\r\n let effectiveDir = moveDir;\r\n if (moveDir === 'down') {\r\n if (enterNavigation === 'right' || (enterNavigation === 'auto' && isInserted)) {\r\n effectiveDir = 'right';\r\n }\r\n }\r\n\r\n if (effectiveDir === 'down') {\r\n moveSelection(1, 0);\r\n } else if (effectiveDir === 'right') {\r\n const geom = geometryRef.current;\r\n let nextCol = activeOverlay.col + 1;\r\n while (\r\n nextCol < geom.columns.length &&\r\n rowData &&\r\n !canEditCell(rowData, geom.columns[nextCol], targetRow, true)\r\n ) {\r\n nextCol++;\r\n }\r\n if (nextCol < geom.columns.length) {\r\n const dCol = nextCol - activeOverlay.col;\r\n moveSelection(0, dCol);\r\n } else {\r\n moveSelection(0, 1);\r\n }\r\n } else if (effectiveDir === 'left') {\r\n const geom = geometryRef.current;\r\n let prevCol = activeOverlay.col - 1;\r\n while (\r\n prevCol >= 0 &&\r\n rowData &&\r\n !canEditCell(rowData, geom.columns[prevCol], targetRow, true)\r\n ) {\r\n prevCol--;\r\n }\r\n if (prevCol >= 0) {\r\n const dCol = prevCol - activeOverlay.col;\r\n moveSelection(0, dCol);\r\n } else {\r\n moveSelection(0, -1);\r\n }\r\n } else {\r\n requestRender();\r\n }\r\n containerRef.current?.focus();\r\n } else {\r\n // Keep editor open with user's attempted value so they can fix the validation error or press Escape\r\n setActiveOverlay((prev) =>\r\n prev\r\n ? {\r\n ...prev,\r\n initialValue: newVal,\r\n initialChar: undefined,\r\n }\r\n : null\r\n );\r\n }\r\n }}\r\n onCancel={() => {\r\n setEditorValidationError(null);\r\n setIsEditorValidating(false);\r\n setActiveOverlay(null);\r\n containerRef.current?.focus();\r\n }}\r\n />\r\n )}\r\n\r\n {/* 5. EXCEL HEADER FILTER POPOVER */}\r\n {headerFilterState && (\r\n <HeaderFilterPopover\r\n column={headerFilterState.column}\r\n anchorRect={headerFilterState.rect}\r\n viewportWidth={gridSurfaceRef.current?.clientWidth || 1000}\r\n theme={resolvedTheme}\r\n locale={currentLocale}\r\n store={store}\r\n activeFilter={columnFilters[headerFilterState.column.id]}\r\n baseFilter={activeBaseFilter}\r\n onApply={(filterState) => {\r\n handleApplyColumnFilter(headerFilterState.column.id, filterState);\r\n setHeaderFilterState(null);\r\n }}\r\n onSort={(desc) => {\r\n const colIdx = geometryRef.current.columns.findIndex(\r\n (c) => c.id === headerFilterState.column.id\r\n );\r\n if (colIdx !== -1) {\r\n handleHeaderSort(colIdx, false, desc);\r\n }\r\n }}\r\n onToggleGroup={() => handleToggleGroupColumn(headerFilterState.column.id)}\r\n isGrouped={groups.some((g) => g.selector === headerFilterState.column.id)}\r\n onClose={() => setHeaderFilterState(null)}\r\n />\r\n )}\r\n\r\n {/* 6. EXCEL RIGHT-CLICK CONTEXT MENU */}\r\n {contextMenu && (\r\n <ContextMenuOverlay\r\n menu={contextMenu}\r\n viewportWidth={gridSurfaceRef.current?.clientWidth || 1000}\r\n viewportHeight={gridSurfaceRef.current?.clientHeight || 600}\r\n theme={resolvedTheme}\r\n locale={currentLocale}\r\n permissions={permissions}\r\n isCellEditable={\r\n contextMenu.rowData && contextMenu.column\r\n ? canEditCell(contextMenu.rowData, contextMenu.column, contextMenu.row, true)\r\n : false\r\n }\r\n isGroupedByCol={\r\n contextMenu.column\r\n ? groups.some((g) => g.selector === contextMenu.column!.id)\r\n : false\r\n }\r\n currentSummaryType={\r\n contextMenu.column\r\n ? store.getSummaryTypes?.()[contextMenu.column.id] || 'none'\r\n : 'none'\r\n }\r\n onCopy={() => {\r\n const tsv = buildSelectedTsv();\r\n internalClipboardRef.current = tsv;\r\n navigator.clipboard?.writeText(tsv).catch(() => {});\r\n showToast(\r\n currentLocale.code.startsWith('tr')\r\n ? '📋 Kopyalandı (TSV)'\r\n : '📋 Copied to clipboard (TSV)',\r\n 'info'\r\n );\r\n }}\r\n onPaste={() => {\r\n if (navigator.clipboard?.readText) {\r\n navigator.clipboard\r\n .readText()\r\n .then((txt) => applyPastedTsv(txt || internalClipboardRef.current))\r\n .catch(() => applyPastedTsv(internalClipboardRef.current));\r\n } else {\r\n applyPastedTsv(internalClipboardRef.current);\r\n }\r\n }}\r\n onDuplicateCellDown={handleDuplicateCellDown}\r\n onDuplicateCellRight={handleDuplicateCellRight}\r\n onDuplicateRow={() => handleDuplicateRow(contextMenu.row)}\r\n onInsertRowAbove={() => handleInsertRow(Math.max(0, contextMenu.row - 1))}\r\n onInsertRowBelow={() => handleInsertRow(contextMenu.row)}\r\n onClearCells={handleClearSelectedCells}\r\n onDeleteRow={() => handleDeleteRow(contextMenu.row)}\r\n onFilterByCellValue={() => {\r\n if (contextMenu.column && contextMenu.rowData) {\r\n const val = contextMenu.rowData[contextMenu.column.id];\r\n handleApplyColumnFilter(contextMenu.column.id, {\r\n columnId: contextMenu.column.id,\r\n mode: 'values',\r\n selectedValues: [val],\r\n });\r\n }\r\n }}\r\n onToggleGroupColumn={() => {\r\n if (contextMenu.column) {\r\n handleToggleGroupColumn(contextMenu.column.id);\r\n }\r\n }}\r\n onSortColumn={(desc) => {\r\n handleHeaderSort(contextMenu.col, false, desc);\r\n }}\r\n onTogglePinColumn={() => {\r\n if (contextMenu.column) {\r\n handleUpdateColumnDef(contextMenu.column.id, {\r\n pinned: contextMenu.column.pinned ? false : 'left',\r\n });\r\n }\r\n }}\r\n onToggleColumnReadonly={() => {\r\n if (contextMenu.column) {\r\n const nextRO = !contextMenu.column.readonly;\r\n handleUpdateColumnDef(contextMenu.column.id, {\r\n readonly: nextRO,\r\n permission: nextRO ? 'readonly' : 'write',\r\n });\r\n }\r\n }}\r\n onChangeSummaryType={(sType) => {\r\n if (contextMenu.column) {\r\n handleChangeSummaryType(contextMenu.column.id, sType);\r\n }\r\n }}\r\n onOpenSparklineModal={() => {\r\n if (contextMenu.column?.type === 'sparkline' && contextMenu.rowData) {\r\n setSparklineModal({\r\n rowIndex: contextMenu.row,\r\n rowData: contextMenu.rowData,\r\n column: contextMenu.column,\r\n points: Array.isArray(contextMenu.rowData[contextMenu.column.id])\r\n ? contextMenu.rowData[contextMenu.column.id]\r\n : [],\r\n });\r\n }\r\n }}\r\n onClose={() => setContextMenu(null)}\r\n />\r\n )}\r\n\r\n {/* 6b. DETAILED SPARKLINE TREND CHART MODAL DIALOG */}\r\n {pdfModal && (\r\n <PdfPreviewModalOverlay\r\n modal={pdfModal}\r\n theme={resolvedTheme}\r\n locale={currentLocale}\r\n onClose={() => setPdfModal(null)}\r\n />\r\n )}\r\n\r\n {sparklineModal && (\r\n <SparklineModalOverlay\r\n modal={sparklineModal}\r\n theme={resolvedTheme}\r\n locale={currentLocale}\r\n onClose={() => {\r\n setSparklineModal(null);\r\n containerRef.current?.focus();\r\n }}\r\n />\r\n )}\r\n\r\n {/* 6c. BATCH CHANGES INSPECTION & CONFIRMATION MODAL */}\r\n {showBatchModal && pendingChanges && (\r\n <BatchChangesModal\r\n changes={pendingChanges}\r\n columns={columns}\r\n theme={resolvedTheme}\r\n locale={currentLocale}\r\n onConfirmSave={commitBatchSave}\r\n onDiscardAll={handleDiscardBatch}\r\n onRevertDelete={(rk) => {\r\n store.revertPendingDelete?.(rk);\r\n setStoreVersion((v) => v + 1);\r\n requestRender();\r\n }}\r\n onRevertUpdate={(rk, colId) => {\r\n store.revertPendingUpdate?.(rk, colId);\r\n setStoreVersion((v) => v + 1);\r\n requestRender();\r\n }}\r\n onRevertInsert={(rk) => {\r\n store.revertPendingInsert?.(rk);\r\n setStoreVersion((v) => v + 1);\r\n requestRender();\r\n }}\r\n onClose={() => {\r\n setShowBatchModal(false);\r\n containerRef.current?.focus();\r\n }}\r\n />\r\n )}\r\n\r\n {/* 6d. ROW DELETION CONFIRMATION & PROGRESS BAR MODAL */}\r\n {deleteConfirmModal && (\r\n <DeleteConfirmProgressModal\r\n rowKeys={deleteConfirmModal.rowKeys}\r\n sampleRows={deleteConfirmModal.sampleRows}\r\n batchMode={Boolean(store.isBatchMode?.())}\r\n theme={resolvedTheme}\r\n locale={currentLocale}\r\n onConfirm={executeConfirmedDelete}\r\n onCancel={() => {\r\n setDeleteConfirmModal(null);\r\n containerRef.current?.focus();\r\n }}\r\n />\r\n )}\r\n </div>\r\n\r\n {/* 7. CONFIGURABLE SUMMARY FOOTER & LIVE RANGE SELECTION STATS */}\r\n <SummaryFooter\r\n summaries={store.getSummaries()}\r\n summaryTypes={store.getSummaryTypes?.()}\r\n onChangeSummaryType={handleChangeSummaryType}\r\n summaryConfig={summaryConfig}\r\n onUpdateSummaryConfig={handleUpdateSummaryConfig}\r\n selectionStats={selectionStats}\r\n columns={effectiveColumns}\r\n geometry={geometryRef.current}\r\n scrollContainerRef={scrollContainerRef}\r\n theme={resolvedTheme}\r\n locale={currentLocale}\r\n totalRowCount={store.getFilteredRowCount?.() ?? store.getRowCount()}\r\n unfilteredRowCount={store.getTotalDatasetRowCount?.() ?? store.getRowCount()}\r\n />\r\n </div>\r\n );\r\n});\r\n\r\nSheetGL.displayName = 'SheetGL';\r\n\r\n\r\n","export class BlockCache<T = any> {\n private cache = new Map<number, T[]>();\n private readonly maxBlocks: number;\n public readonly blockSize: number;\n\n constructor(blockSize: number = 100, maxBlocks: number = 30) {\n this.blockSize = blockSize;\n this.maxBlocks = maxBlocks;\n }\n\n public getBlockIndex(rowIndex: number): number {\n return Math.floor(rowIndex / this.blockSize);\n }\n\n public getRow(rowIndex: number): T | undefined {\n const blockIndex = this.getBlockIndex(rowIndex);\n const block = this.cache.get(blockIndex);\n if (!block) return undefined;\n\n // LRU tazeleme\n this.cache.delete(blockIndex);\n this.cache.set(blockIndex, block);\n\n const offset = rowIndex % this.blockSize;\n return block[offset];\n }\n\n public setBlock(blockIndex: number, rows: T[]): void {\n if (this.cache.has(blockIndex)) {\n this.cache.delete(blockIndex);\n } else if (this.cache.size >= this.maxBlocks) {\n // En eski bloğu sil (LRU eviction)\n const oldestKey = this.cache.keys().next().value;\n if (oldestKey !== undefined) {\n this.cache.delete(oldestKey);\n }\n }\n this.cache.set(blockIndex, rows);\n }\n\n public hasBlock(blockIndex: number): boolean {\n return this.cache.has(blockIndex);\n }\n\n public clear(): void {\n this.cache.clear();\n }\n}\n","import {\r\n IDataStore,\r\n BatchChanges,\r\n RemoteOperationsConfig,\r\n DataGridQuery,\r\n LoadResult,\r\n} from '../types/store';\r\nimport { FilterDescriptor, SortDescriptor, DistinctItem } from '../types/filter';\r\nimport { GroupDescriptor, VirtualRow } from '../types/group';\r\nimport { BlockCache } from './BlockCache';\r\nimport { FilterEngine, BLANK_FILTER_TOKEN } from '../core/FilterEngine';\r\nimport { SortEngine } from '../core/SortEngine';\r\n\r\nexport interface RemoteDateTreeDayPayload {\r\n day: number;\r\n isoDate?: string;\r\n count: number;\r\n values?: any[];\r\n}\r\n\r\nexport interface RemoteDateTreeMonthPayload {\r\n month: number;\r\n count: number;\r\n days?: RemoteDateTreeDayPayload[];\r\n}\r\n\r\nexport interface RemoteDateTreeYearPayload {\r\n year: number;\r\n count: number;\r\n months?: RemoteDateTreeMonthPayload[];\r\n}\r\n\r\nexport interface RemoteDataStoreOptions {\r\n url?: string;\r\n keyField?: string;\r\n remoteOperations?: RemoteOperationsConfig;\r\n headers?: Record<string, string>;\r\n blockSize?: number;\r\n /** Alias for blockSize as documented in REMOTE_OPERATIONS_GUIDE.md */\r\n chunkSize?: number;\r\n method?: 'GET' | 'POST';\r\n /** Custom loader function for advanced environments (e.g. Qmi custom API client) */\r\n load?: (query: DataGridQuery) => Promise<LoadResult>;\r\n /** Alias for load */\r\n customLoad?: (query: DataGridQuery) => Promise<LoadResult>;\r\n /** Custom distinct value loader for remote column filters */\r\n loadDistinct?: (\r\n columnId: string,\r\n search?: string,\r\n baseFilter?: FilterDescriptor | null\r\n ) => Promise<DistinctItem[]>;\r\n /** Custom single cell updater */\r\n update?: (key: any, values: Record<string, any>) => Promise<void>;\r\n /** Custom batch changes committer */\r\n commit?: (changes: BatchChanges) => Promise<void>;\r\n}\r\n\r\nexport class RemoteDataStore implements IDataStore {\r\n private url: string;\r\n private keyField: string;\r\n private headers: Record<string, string>;\r\n private method: 'GET' | 'POST';\r\n private remoteOperations: Required<RemoteOperationsConfig>;\r\n private cache: BlockCache<any>;\r\n private customLoad?: (query: DataGridQuery) => Promise<LoadResult>;\r\n private customLoadDistinct?: (\r\n columnId: string,\r\n search?: string,\r\n baseFilter?: FilterDescriptor | null\r\n ) => Promise<DistinctItem[]>;\r\n private customUpdate?: (key: any, values: Record<string, any>) => Promise<void>;\r\n private customCommit?: (changes: BatchChanges) => Promise<void>;\r\n\r\n private totalCount: number = 0;\r\n private unfilteredTotalCount: number = 0;\r\n private hasInitialFetchTriggered: boolean = false;\r\n private summaries?: Record<string, number>;\r\n private currentFilter: FilterDescriptor | null = null;\r\n private currentSearch: string = '';\r\n private currentSort: SortDescriptor[] = [];\r\n private currentGroups: GroupDescriptor[] = [];\r\n\r\n private currentAbortController: AbortController | null = null;\r\n private pendingBlockRequests = new Set<number>();\r\n private distinctCache = new Map<string, DistinctItem[]>();\r\n private listeners = new Map<string, Set<(...args: any[]) => void>>();\r\n\r\n constructor(options: RemoteDataStoreOptions) {\r\n this.url = options.url || '';\r\n this.keyField = options.keyField || 'id';\r\n this.headers = options.headers || { 'Content-Type': 'application/json' };\r\n this.method = options.method || 'POST';\r\n this.customLoad = options.load || options.customLoad;\r\n this.customLoadDistinct = options.loadDistinct;\r\n this.customUpdate = options.update;\r\n this.customCommit = options.commit;\r\n\r\n this.remoteOperations = {\r\n paging: options.remoteOperations?.paging ?? true,\r\n filtering: options.remoteOperations?.filtering ?? true,\r\n sorting: options.remoteOperations?.sorting ?? true,\r\n grouping: options.remoteOperations?.grouping ?? true,\r\n summary: options.remoteOperations?.summary ?? true,\r\n distinct: options.remoteOperations?.distinct ?? true,\r\n };\r\n\r\n const resolvedBlockSize = options.blockSize || options.chunkSize || 100;\r\n this.cache = new BlockCache<any>(resolvedBlockSize, 50);\r\n\r\n // Immediately trigger initial load of block 0\r\n this.fetchBlock(0).catch(() => {});\r\n }\r\n\r\n public isRemote(): boolean {\r\n return true;\r\n }\r\n\r\n public getRowCount(): number {\r\n return this.totalCount;\r\n }\r\n\r\n public getTotalCount(): number {\r\n return this.totalCount;\r\n }\r\n\r\n public setTotalCount(count: number): void {\r\n this.totalCount = count;\r\n this.emit('loaded');\r\n }\r\n\r\n public getFilteredRowCount(): number {\r\n return this.totalCount;\r\n }\r\n\r\n public getTotalDatasetRowCount(): number {\r\n return this.unfilteredTotalCount > 0 ? this.unfilteredTotalCount : this.totalCount;\r\n }\r\n\r\n public getViewRow(rowIndex: number): VirtualRow | undefined {\r\n const data = this.cache.getRow(rowIndex);\r\n if (!data) {\r\n if (this.totalCount > 0 && rowIndex < this.totalCount) {\r\n this.ensureRange(\r\n rowIndex,\r\n Math.min(this.totalCount - 1, rowIndex + this.cache.blockSize)\r\n );\r\n }\r\n return undefined;\r\n }\r\n return {\r\n type: 'data',\r\n rawIndex: rowIndex,\r\n data,\r\n };\r\n }\r\n\r\n public async ensureRange(startRow: number, endRow: number): Promise<void> {\r\n if (\r\n !this.hasInitialFetchTriggered &&\r\n this.totalCount === 0 &&\r\n this.pendingBlockRequests.size === 0\r\n ) {\r\n this.hasInitialFetchTriggered = true;\r\n return this.fetchBlock(0);\r\n }\r\n\r\n const startBlock = this.cache.getBlockIndex(startRow);\r\n const endBlock = this.cache.getBlockIndex(endRow);\r\n\r\n const missingBlocks: number[] = [];\r\n for (let b = startBlock; b <= endBlock; b++) {\r\n if (!this.cache.hasBlock(b) && !this.pendingBlockRequests.has(b)) {\r\n missingBlocks.push(b);\r\n }\r\n }\r\n\r\n if (missingBlocks.length === 0) return Promise.resolve();\r\n\r\n return Promise.all(missingBlocks.map((b) => this.fetchBlock(b))).then(() => {});\r\n }\r\n\r\n private buildRequestUrlWithParams(payload: Record<string, any>): string {\r\n const [baseUrl, query] = this.url.split('?');\r\n const params = new URLSearchParams(query || '');\r\n if (payload.skip !== undefined) params.set('skip', String(payload.skip));\r\n if (payload.take !== undefined) params.set('take', String(payload.take));\r\n if (payload.requireTotalCount !== undefined) {\r\n params.set('requireTotalCount', String(payload.requireTotalCount));\r\n }\r\n if (payload.filter) params.set('filter', JSON.stringify(payload.filter));\r\n if (payload.sort && payload.sort.length > 0) params.set('sort', JSON.stringify(payload.sort));\r\n if (payload.group && payload.group.length > 0) params.set('group', JSON.stringify(payload.group));\r\n if (payload.search) params.set('search', String(payload.search));\r\n return `${baseUrl}?${params.toString()}`;\r\n }\r\n\r\n private async fetchBlock(blockIndex: number): Promise<void> {\r\n this.pendingBlockRequests.add(blockIndex);\r\n this.hasInitialFetchTriggered = true;\r\n\r\n const skip = this.remoteOperations.paging ? blockIndex * this.cache.blockSize : 0;\r\n const take = this.remoteOperations.paging ? this.cache.blockSize : 10000;\r\n\r\n if (!this.currentAbortController) {\r\n this.currentAbortController = new AbortController();\r\n }\r\n const signal = this.currentAbortController.signal;\r\n\r\n const payload: DataGridQuery = {\r\n skip,\r\n take,\r\n filter: this.remoteOperations.filtering ? this.currentFilter : null,\r\n sort: this.remoteOperations.sorting ? this.currentSort : [],\r\n search: this.remoteOperations.filtering ? this.currentSearch : '',\r\n group: this.remoteOperations.grouping ? this.currentGroups : [],\r\n };\r\n\r\n try {\r\n this.emit('loading');\r\n let json: any;\r\n\r\n if (this.customLoad) {\r\n json = await this.customLoad(payload);\r\n } else if (this.method === 'GET') {\r\n const reqUrl = this.buildRequestUrlWithParams(payload);\r\n const res = await fetch(reqUrl, {\r\n method: 'GET',\r\n headers: this.headers,\r\n signal,\r\n });\r\n if (!res.ok) throw new Error(`HTTP Error: ${res.status}`);\r\n json = await res.json();\r\n } else if (this.url) {\r\n const res = await fetch(this.url, {\r\n method: 'POST',\r\n headers: this.headers,\r\n body: JSON.stringify(payload),\r\n signal,\r\n });\r\n if (!res.ok) throw new Error(`HTTP Error: ${res.status}`);\r\n json = await res.json();\r\n } else {\r\n json = { data: [], totalCount: 0 };\r\n }\r\n\r\n let rows: any[] = json.data || json.rows || [];\r\n\r\n // Client-side fallback when specific remoteOperations flags are disabled\r\n if (!this.remoteOperations.filtering) {\r\n if (this.currentFilter) {\r\n rows = rows.filter((r) => FilterEngine.evaluateRow(r, this.currentFilter));\r\n }\r\n if (this.currentSearch) {\r\n const clean = this.currentSearch.toLowerCase().trim();\r\n if (clean) {\r\n rows = rows.filter((r) => FilterEngine.matchSearch(r, clean));\r\n }\r\n }\r\n }\r\n if (!this.remoteOperations.sorting && this.currentSort.length > 0) {\r\n const cmp = SortEngine.createComparator(this.currentSort);\r\n rows = [...rows].sort(cmp);\r\n }\r\n\r\n this.totalCount = json.totalCount ?? json.total_count ?? rows.length;\r\n if (typeof json.unfilteredTotalCount === 'number') {\r\n this.unfilteredTotalCount = json.unfilteredTotalCount;\r\n } else if (!this.currentFilter && !this.currentSearch) {\r\n this.unfilteredTotalCount = this.totalCount;\r\n } else if (this.unfilteredTotalCount === 0) {\r\n this.unfilteredTotalCount = this.totalCount;\r\n }\r\n\r\n if (json.summary && typeof json.summary === 'object' && !Array.isArray(json.summary)) {\r\n this.summaries = json.summary;\r\n } else if (\r\n json.summaries &&\r\n typeof json.summaries === 'object' &&\r\n !Array.isArray(json.summaries)\r\n ) {\r\n this.summaries = json.summaries;\r\n }\r\n\r\n if (!this.remoteOperations.paging) {\r\n const totalBlocks = Math.ceil(rows.length / this.cache.blockSize);\r\n for (let b = 0; b < totalBlocks; b++) {\r\n const slice = rows.slice(b * this.cache.blockSize, (b + 1) * this.cache.blockSize);\r\n this.cache.setBlock(b, slice);\r\n }\r\n } else {\r\n this.cache.setBlock(blockIndex, rows);\r\n }\r\n\r\n this.pendingBlockRequests.delete(blockIndex);\r\n this.emit('loaded');\r\n } catch (err: any) {\r\n this.pendingBlockRequests.delete(blockIndex);\r\n if (err?.name !== 'AbortError') {\r\n this.emit('error', err);\r\n }\r\n }\r\n }\r\n\r\n public async setFilter(filter: FilterDescriptor | null): Promise<void> {\r\n this.currentFilter = filter;\r\n await this.resetAndReloadAsync();\r\n }\r\n\r\n public async setSearch(keyword: string): Promise<void> {\r\n this.currentSearch = keyword;\r\n await this.resetAndReloadAsync();\r\n }\r\n\r\n public async setSorting(sortRules: SortDescriptor[]): Promise<void> {\r\n this.currentSort = sortRules;\r\n await this.resetAndReloadAsync();\r\n }\r\n\r\n public async setGrouping(groupDescriptors: GroupDescriptor[]): Promise<void> {\r\n this.currentGroups = groupDescriptors;\r\n await this.resetAndReloadAsync();\r\n }\r\n\r\n public async toggleGroup(_groupKey: string): Promise<void> {\r\n await this.resetAndReloadAsync();\r\n }\r\n\r\n public async setCell(rowKey: any, columnId: string, value: any): Promise<void> {\r\n try {\r\n if (this.customUpdate) {\r\n await this.customUpdate(rowKey, { [columnId]: value });\r\n } else if (this.url) {\r\n const [baseUrl, query] = this.url.split('?');\r\n const qs = query ? `?${query}` : '';\r\n await fetch(`${baseUrl}/${rowKey}${qs}`, {\r\n method: 'PATCH',\r\n headers: this.headers,\r\n body: JSON.stringify({ [columnId]: value }),\r\n });\r\n }\r\n this.distinctCache.clear();\r\n await this.resetAndReloadAsync();\r\n } catch (err) {\r\n this.emit('error', err);\r\n }\r\n }\r\n\r\n public async commitBatch(changes: BatchChanges): Promise<void> {\r\n try {\r\n if (this.customCommit) {\r\n await this.customCommit(changes);\r\n } else if (this.url) {\r\n const [baseUrl, query] = this.url.split('?');\r\n const qs = query ? `?${query}` : '';\r\n await fetch(`${baseUrl}/batch${qs}`, {\r\n method: 'POST',\r\n headers: this.headers,\r\n body: JSON.stringify(changes),\r\n });\r\n }\r\n this.distinctCache.clear();\r\n await this.resetAndReloadAsync();\r\n } catch (err) {\r\n this.emit('error', err);\r\n }\r\n }\r\n\r\n /**\r\n * Flattens a server-side semantic Year > Month > Day tree payload into DistinctItem[]\r\n * so HeaderFilterPopover builds the exact hierarchical date tree with server row counts.\r\n */\r\n private static normalizeRemoteDateTree(\r\n yearsPayload: RemoteDateTreeYearPayload[],\r\n blankCount?: number\r\n ): DistinctItem[] {\r\n const items: DistinctItem[] = [];\r\n if (blankCount && blankCount > 0) {\r\n items.push({\r\n value: BLANK_FILTER_TOKEN,\r\n label: '(Blank)',\r\n count: blankCount,\r\n });\r\n }\r\n\r\n for (const yNode of yearsPayload) {\r\n const yr = Number(yNode.year);\r\n if (isNaN(yr)) continue;\r\n if (Array.isArray(yNode.months) && yNode.months.length > 0) {\r\n for (const mNode of yNode.months) {\r\n const mo = Number(mNode.month);\r\n if (isNaN(mo)) continue;\r\n const mPad = String(mo).padStart(2, '0');\r\n if (Array.isArray(mNode.days) && mNode.days.length > 0) {\r\n for (const dNode of mNode.days) {\r\n const dy = Number(dNode.day);\r\n const dPad = String(dy).padStart(2, '0');\r\n const iso = dNode.isoDate || `${yr}-${mPad}-${dPad}`;\r\n items.push({\r\n value: iso,\r\n label: iso,\r\n count: dNode.count ?? 1,\r\n });\r\n }\r\n } else {\r\n // Month-level summary node fallback -> represent as first day of month\r\n const iso = `${yr}-${mPad}-01`;\r\n items.push({\r\n value: iso,\r\n label: iso,\r\n count: mNode.count ?? 1,\r\n });\r\n }\r\n }\r\n } else {\r\n const iso = `${yr}-01-01`;\r\n items.push({\r\n value: iso,\r\n label: iso,\r\n count: yNode.count ?? 1,\r\n });\r\n }\r\n }\r\n\r\n return items;\r\n }\r\n\r\n public async getDistinctValues(\r\n columnId: string,\r\n search?: string,\r\n baseFilter?: FilterDescriptor | null\r\n ): Promise<DistinctItem[]> {\r\n if (this.customLoadDistinct) {\r\n return this.customLoadDistinct(columnId, search, baseFilter);\r\n }\r\n if (!this.url) return [];\r\n\r\n const effectiveFilter = baseFilter !== undefined ? baseFilter : this.currentFilter;\r\n const filterKey =\r\n effectiveFilter && Array.isArray(effectiveFilter) && effectiveFilter.length > 0\r\n ? JSON.stringify(effectiveFilter)\r\n : '__NO_FILTER__';\r\n const cleanSearch = (search || '').trim();\r\n const globalSearchKey = this.currentSearch ? this.currentSearch.toLowerCase().trim() : '';\r\n const cacheKey = `${columnId}::f=${filterKey}::gs=${globalSearchKey}::s=${cleanSearch}`;\r\n\r\n const cached = this.distinctCache.get(cacheKey);\r\n if (cached) return cached;\r\n\r\n try {\r\n const [baseUrl, query] = this.url.split('?');\r\n const params = new URLSearchParams(query || '');\r\n params.set('column', columnId);\r\n params.set('field', columnId);\r\n params.set('action', 'distinct');\r\n if (cleanSearch) params.set('search', cleanSearch);\r\n if (effectiveFilter && Array.isArray(effectiveFilter) && effectiveFilter.length > 0) {\r\n params.set('filter', JSON.stringify(effectiveFilter));\r\n }\r\n if (globalSearchKey) {\r\n params.set('globalSearch', globalSearchKey);\r\n }\r\n\r\n // Supports both REST /distinct subpath and query parameters\r\n const distinctBase = baseUrl.endsWith('/') ? `${baseUrl}distinct` : `${baseUrl}/distinct`;\r\n const distinctUrl = `${distinctBase}?${params.toString()}`;\r\n\r\n const res = await fetch(distinctUrl, {\r\n method: 'GET',\r\n headers: this.headers,\r\n });\r\n if (!res.ok) return [];\r\n const json = await res.json();\r\n\r\n let items: DistinctItem[] = [];\r\n if (Array.isArray(json.tree) || Array.isArray(json.years)) {\r\n items = RemoteDataStore.normalizeRemoteDateTree(\r\n json.tree || json.years,\r\n json.blankCount\r\n );\r\n } else if (Array.isArray(json.items)) {\r\n items = json.items;\r\n } else if (Array.isArray(json.data)) {\r\n items = json.data;\r\n }\r\n\r\n const normalizedItems: DistinctItem[] = items.map((it: any) => {\r\n if (typeof it === 'object' && it !== null && 'value' in it) {\r\n return {\r\n value: it.value,\r\n label: it.label !== undefined ? String(it.label) : String(it.value),\r\n count: typeof it.count === 'number' ? it.count : undefined,\r\n };\r\n }\r\n return {\r\n value: it,\r\n label: String(it),\r\n };\r\n });\r\n\r\n this.distinctCache.set(cacheKey, normalizedItems);\r\n return normalizedItems;\r\n } catch {\r\n return [];\r\n }\r\n }\r\n\r\n public getSummaries(): Record<string, number> | undefined {\r\n return this.summaries;\r\n }\r\n\r\n public on(event: string, callback: (...args: any[]) => void): void {\r\n if (!this.listeners.has(event)) {\r\n this.listeners.set(event, new Set());\r\n }\r\n this.listeners.get(event)!.add(callback);\r\n }\r\n\r\n public off(event: string, callback: (...args: any[]) => void): void {\r\n this.listeners.get(event)?.delete(callback);\r\n }\r\n\r\n private emit(event: string, ...args: any[]): void {\r\n this.listeners.get(event)?.forEach((cb) => cb(...args));\r\n }\r\n\r\n private async resetAndReloadAsync(): Promise<void> {\r\n if (this.currentAbortController) {\r\n this.currentAbortController.abort();\r\n }\r\n this.currentAbortController = new AbortController();\r\n this.cache.clear();\r\n this.pendingBlockRequests.clear();\r\n this.hasInitialFetchTriggered = true;\r\n await this.fetchBlock(0);\r\n }\r\n\r\n public resetAndReload(): void {\r\n this.resetAndReloadAsync().catch(() => {});\r\n }\r\n}\r\n"],"mappings":"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"}
|