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.cjs","names":["useRef","useState","useCallback","useState","useMemo","useRef","useCallback","_Fragment","useState","useRef","useMemo","_Fragment","useRef","_Fragment","useState","_Fragment","useState","useState","_Fragment","useId","useState","_Fragment","React","useState","useRef","useMemo","_Fragment","useState","useRef","useMemo","_Fragment","useState","useRef","formatters","getFormatter","useState","useRef","useState","useRef","useState","useRef","useState","useRef","useState","useRef","useState","useRef","useState","useRef","useState","useRef","useState","useRef","forwardRef","useMemo","useState","useCallback","useRef","__create","__defProp","__getOwnPropDesc","__getOwnPropNames","__getProtoOf","__hasOwnProp","__copyProps","from","keys","i","n","key","to","except","k","desc","__toESM","mod","isNodeMode","target","react","react_jsx_runtime","SelectionModel","row","col","minRow","maxRow","minCol","maxCol","useGridSelection","selectionRef","selectionVersion","setSelectionVersion","selectedCellUI","setSelectedCellUI","isDraggingSelection","setIsDraggingSelection","isDraggingRowNumbers","setIsDraggingRowNumbers","notifyChange","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","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","activeCols","rowSelectionMode","geometryRef","containerRef","gridSurfaceRef","scrollContainerRef","scrollPosRef","scrollIndicator","setScrollIndicator","scrollHideTimerRef","resizingCol","setResizingCol","latestResizedWidthRef","handleMouseMove","deltaX","newWidth","prev","handleMouseUp","onColumnResize","handleResize","observer","updateColumnDef","patch","setColumnWidth","getColumnWidth","handleScroll","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","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","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","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","onApply","semanticFilter","normalizedV1","normalizedV2","handleClear","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","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","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","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","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","checkEdgeAutoScroll","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","onRefresh","char","exportCsv","cellVals","blob","url","rowSpan","colSpan","numericCount","currentColumn","activeViewRow","currentCellValue","isActiveCellEditable","pendingChanges","normRange","className","nextTheme","showFormulaBar","scrollToTop","scrollToBottom","hasAsync","isInserted","effectiveDir","enterNavigation","prevCol","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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"}
|