@peak-ai/canvas 1.5.1 → 1.5.2-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/constants/index.d.ts +2 -0
- package/constants/index.js +1 -1
- package/constants/index.js.map +1 -1
- package/package.json +1 -1
- package/plugins/helpers/data-table.d.ts +3 -1
- package/plugins/helpers/data-table.js +14 -1
- package/plugins/helpers/data-table.js.map +1 -1
- package/plugins/helpers/render-components.js +3 -3
- package/plugins/helpers/render-components.js.map +1 -1
- package/shadcn/components/ui/unified-filter.d.ts +8 -0
- package/shadcn/components/ui/unified-filter.js +15 -0
- package/shadcn/components/ui/unified-filter.js.map +1 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
type UnifiedFilterProps = {
|
|
2
|
+
isEditable?: boolean;
|
|
3
|
+
gjsModel: any;
|
|
4
|
+
performInteraction: (payload: Record<string, any>) => Promise<void>;
|
|
5
|
+
isTemplateView?: boolean;
|
|
6
|
+
};
|
|
7
|
+
export declare function renderUnifiedFilter({ gjsModel, performInteraction, isTemplateView }: UnifiedFilterProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import _asyncToGenerator from"@babel/runtime/helpers/asyncToGenerator";import _extends from"@babel/runtime/helpers/extends";import _regeneratorRuntime from"@babel/runtime/regenerator";/* eslint-disable @typescript-eslint/no-explicit-any */import{useCallback,useEffect,useRef,useState}from"react";import{ChevronDown,ChevronUp,ChevronRight,ListFilter as FilterIcon,Loader2Icon}from"lucide-react";import{Button}from"./button";import{Checkbox}from"./checkbox";import{ScrollArea}from"./scroll-area";import{getAffectedComponentsWithLoader}from"../../../helpers";import{jsx as _jsx,jsxs as _jsxs}from"react/jsx-runtime";function FilterSection(_ref){var filter=_ref.filter,selectedValues=_ref.selectedValues,isExpanded=_ref.isExpanded,searchQuery=_ref.searchQuery,onToggleExpand=_ref.onToggleExpand,onValueChange=_ref.onValueChange,onSearchChange=_ref.onSearchChange,isDisabled=_ref.isDisabled;var actualOptions=function(){if(filter.options&&typeof filter.options==="object"&&filter.options.name==="__peak_placeholder"){return[]}return Array.isArray(filter.options)?filter.options:[]}();var filteredOptions=actualOptions.filter(function(opt){return String(opt.label).toLowerCase().includes(searchQuery.toLowerCase())});var isMultiSelect=filter.filterType==="multiselect";var allOptionsSelected=selectedValues.length===actualOptions.length&&actualOptions.length>0;var handleOptionToggle=useCallback(function(val){if(isMultiSelect){onValueChange(selectedValues.includes(val)?selectedValues.filter(function(v){return v!==val}):[].concat(selectedValues,[val]))}else{if(selectedValues.includes(val)){onValueChange([])}else{onValueChange([val])}}},[isMultiSelect,selectedValues,onValueChange]);var handleClearAll=function handleClearAll(){onValueChange([])};var handleSelectAll=function handleSelectAll(){onValueChange(actualOptions.map(function(o){return o.value}))};var ChevronIcon=isExpanded?ChevronDown:ChevronRight;return/*#__PURE__*/_jsxs("div",{className:"border-b border-gray-200 last:border-b-0",children:[/*#__PURE__*/_jsx("button",{type:"button",onClick:onToggleExpand,disabled:isDisabled,className:"w-full flex items-center justify-between p-3 hover:bg-gray-50 transition-colors text-left",children:/*#__PURE__*/_jsxs("div",{className:"flex items-center gap-2 flex-1",children:[/*#__PURE__*/_jsx(ChevronIcon,{size:16,className:"text-gray-500 flex-shrink-0"}),/*#__PURE__*/_jsx("span",{className:"text-sm font-medium text-gray-900",children:filter.text}),selectedValues.length>0&&/*#__PURE__*/_jsx("span",{className:"text-xs bg-blue-100 text-blue-800 px-2 py-0.5 rounded-full flex-shrink-0",children:selectedValues.length})]})}),isExpanded&&/*#__PURE__*/_jsxs("div",{className:"px-3 pb-3 pt-2",children:[/*#__PURE__*/_jsx("input",{type:"text",placeholder:"Search...",value:searchQuery,onChange:function onChange(e){return onSearchChange(e.target.value)},className:"w-full mb-3 px-2 py-1 border rounded focus:outline-none text-sm",disabled:isDisabled,onClick:function onClick(e){return e.stopPropagation()}}),isMultiSelect&&/*#__PURE__*/_jsxs("div",{className:"flex items-center mb-3",children:[/*#__PURE__*/_jsx(Checkbox,{checked:allOptionsSelected,onCheckedChange:function onCheckedChange(){return allOptionsSelected?handleClearAll():handleSelectAll()},disabled:isDisabled}),/*#__PURE__*/_jsx("span",{className:"ml-2 text-sm text-gray-900",children:"Select All"}),selectedValues.length>0&&/*#__PURE__*/_jsx("button",{type:"button",className:"ml-auto text-sm text-blue-600 hover:underline",onMouseDown:function onMouseDown(e){e.stopPropagation();e.preventDefault()},onClick:handleClearAll,disabled:isDisabled,children:"Clear All"})]}),/*#__PURE__*/_jsx(ScrollArea,{viewportClassName:"max-h-48 overflow-y-auto mb-2 space-y-2",children:filteredOptions.length>0?filteredOptions.map(function(opt){return/*#__PURE__*/_jsxs("label",{className:"flex items-center space-x-2 hover:bg-gray-100 rounded p-1 transition hover:cursor-pointer",onClick:function onClick(e){e.preventDefault();e.stopPropagation();if(!isDisabled){handleOptionToggle(opt.value)}},children:[/*#__PURE__*/_jsx(Checkbox,{checked:selectedValues.includes(opt.value),onChange:function onChange(){// Prevent checkbox from toggling when clicking label
|
|
2
|
+
},disabled:isDisabled}),/*#__PURE__*/_jsx("span",{className:"text-sm text-gray-900",children:opt.label})]},opt.value)}):/*#__PURE__*/_jsx("div",{className:"text-sm text-gray-500 py-2",children:"No results found"})})]})]})}export function renderUnifiedFilter(_ref2){var gjsModel=_ref2.gjsModel,performInteraction=_ref2.performInteraction,_ref2$isTemplateView=_ref2.isTemplateView,isTemplateView=_ref2$isTemplateView===void 0?false:_ref2$isTemplateView;var _useState=useState(_extends({},gjsModel.get("componentProps"))),componentData=_useState[0],setComponentData=_useState[1];var _componentData$filter=componentData.filters,filters=_componentData$filter===void 0?[]:_componentData$filter,_componentData$classN=componentData.className,className=_componentData$classN===void 0?"":_componentData$classN;var actualFilters=function(){if(!Array.isArray(filters)){return[]}return filters.filter(function(f){return f&&typeof f==="object"&&f.id&&f.text&&f.filterKey})}();var wrapperRef=useRef(null);var _useState2=useState(_extends({},gjsModel.get("attributes"))),attributes=_useState2[0],setAttributes=_useState2[1];var _useState3=useState(false),isDropdownOpen=_useState3[0],setIsDropdownOpen=_useState3[1];var _useState4=useState(false),isApplying=_useState4[0],setIsApplying=_useState4[1];var _useState5=useState({left:"auto",right:"0"}),dropdownPosition=_useState5[0],setDropdownPosition=_useState5[1];// Track expanded sections
|
|
3
|
+
var _useState6=useState(new Set),expandedSections=_useState6[0],setExpandedSections=_useState6[1];// Track search queries per filter
|
|
4
|
+
var _useState7=useState({}),searchQueries=_useState7[0],setSearchQueries=_useState7[1];// Track pending selected values (before Apply)
|
|
5
|
+
var _useState8=useState(function(){var initial={};actualFilters.forEach(function(filter){initial[filter.id]=Array.isArray(filter.value)&&filter.value.length>0?filter.value:Array.isArray(filter["default"])?filter["default"]:[]});return initial}),pendingValues=_useState8[0],setPendingValues=_useState8[1];// Track last applied values (for Cancel)
|
|
6
|
+
var _useState9=useState(function(){var initial={};actualFilters.forEach(function(filter){initial[filter.id]=Array.isArray(filter.value)&&filter.value.length>0?filter.value:Array.isArray(filter["default"])?filter["default"]:[]});return initial}),appliedValues=_useState9[0],setAppliedValues=_useState9[1];var hasError=attributes.error||componentData.error;var isLoading=!isTemplateView&&!hasError&&(attributes.interactionApiInProgress||isApplying||attributes.loading);var isBusy=isLoading;// Calculate total selected count across all filters
|
|
7
|
+
var totalSelectedCount=Object.values(pendingValues).reduce(function(sum,values){return sum+values.length},0);useEffect(function(){var _document$getElementB;if(!isDropdownOpen||!wrapperRef.current){return}var filterRect=wrapperRef.current.getBoundingClientRect();var dropdownWidth=320;var iframeViewportWidth=document.documentElement.clientWidth;var iframeBodyWidth=((_document$getElementB=document.getElementById("dashboard-root"))==null?void 0:_document$getElementB.clientWidth)||iframeViewportWidth;var spaceToRight=iframeBodyWidth-filterRect.right;var spaceToLeft=filterRect.left;if(spaceToLeft>=dropdownWidth){setDropdownPosition({left:"auto",right:"0px"})}else if(spaceToRight<dropdownWidth&&spaceToLeft<dropdownWidth){var shiftLeft=dropdownWidth-spaceToRight+16;setDropdownPosition({left:"-"+shiftLeft+"px",right:"auto"})}else if(spaceToRight>=dropdownWidth){setDropdownPosition({left:"0px",right:"auto"})}},[isDropdownOpen]);useEffect(function(){function updateComponentData(){var newData=_extends({},gjsModel.get("componentProps"));setComponentData(newData);// Update pending and applied values when filters change externally
|
|
8
|
+
var newFilters=function(){if(!Array.isArray(newData.filters)){return[]}return newData.filters.filter(function(f){return f&&typeof f==="object"&&f.id&&f.text&&f.filterKey})}();var newPendingValues={};var newAppliedValues={};newFilters.forEach(function(filter){newPendingValues[filter.id]=Array.isArray(filter.value)&&filter.value.length>0?filter.value:Array.isArray(filter["default"])?filter["default"]:[];newAppliedValues[filter.id]=Array.isArray(filter.value)&&filter.value.length>0?filter.value:Array.isArray(filter["default"])?filter["default"]:[]});setPendingValues(newPendingValues);setAppliedValues(newAppliedValues)}function updateAttributes(){setAttributes(_extends({},gjsModel.get("attributes")))}gjsModel.on("change:componentProps",updateComponentData);gjsModel.on("change:attributes",updateAttributes);return function(){gjsModel.off("change:componentProps",updateComponentData);gjsModel.off("change:attributes",updateAttributes)}},[gjsModel]);useEffect(function(){var _wrapperRef$current$o,_wrapperRef$current;var doc=(_wrapperRef$current$o=(_wrapperRef$current=wrapperRef.current)==null?void 0:_wrapperRef$current.ownerDocument)!=null?_wrapperRef$current$o:document;function handleOutsideClick(e){if(isDropdownOpen&&wrapperRef.current&&!wrapperRef.current.contains(e.target)){setIsDropdownOpen(false);// Reset pending values to applied values on close without apply
|
|
9
|
+
setPendingValues(_extends({},appliedValues));// Clear search queries
|
|
10
|
+
setSearchQueries({})}}function handleEscape(e){if(e.key==="Escape"){setIsDropdownOpen(false);setPendingValues(_extends({},appliedValues));setSearchQueries({})}}doc.addEventListener("pointerdown",handleOutsideClick);doc.addEventListener("keydown",handleEscape);return function(){doc.removeEventListener("pointerdown",handleOutsideClick);doc.removeEventListener("keydown",handleEscape)}},[isDropdownOpen,appliedValues]);var handleToggleSection=useCallback(function(filterId){setExpandedSections(function(prev){var next=new Set(prev);if(next.has(filterId)){next["delete"](filterId)}else{next.add(filterId)}return next})},[]);var handleValueChange=useCallback(function(filterId,values){setPendingValues(function(prev){var _extends2;return _extends({},prev,(_extends2={},_extends2[filterId]=values,_extends2))})},[]);var handleSearchChange=useCallback(function(filterId,query){setSearchQueries(function(prev){var _extends3;return _extends({},prev,(_extends3={},_extends3[filterId]=query,_extends3))})},[]);function handleApply(){return _handleApply.apply(this,arguments)}function _handleApply(){_handleApply=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(){var updatedFilters,allAffectedComponents,id;return _regeneratorRuntime.wrap(function _callee$(_context){while(1)switch(_context.prev=_context.next){case 0:setIsApplying(true);_context.prev=1;// Update component props with new filter values
|
|
11
|
+
updatedFilters=actualFilters.map(function(filter){return _extends({},filter,{value:pendingValues[filter.id]||[]})});gjsModel.set("componentProps",_extends({},gjsModel.get("componentProps"),{filters:updatedFilters}));// Collect all affected components (deduplicated)
|
|
12
|
+
allAffectedComponents=new Set;actualFilters.forEach(function(filter){if(Array.isArray(filter.affectedComponents)){filter.affectedComponents.forEach(function(id){return allAffectedComponents.add(id)})}});id=gjsModel.get("id");_context.next=9;return performInteraction({interactionType:"filter",id:id,affectedComponents:getAffectedComponentsWithLoader([id].concat(Array.from(allAffectedComponents)),true),filterValues:pendingValues});case 9:// Update applied values after successful apply
|
|
13
|
+
setAppliedValues(_extends({},pendingValues));setIsDropdownOpen(false);setSearchQueries({});case 12:_context.prev=12;setIsApplying(false);return _context.finish(12);case 15:case"end":return _context.stop()}},_callee,null,[[1,,12,15]])}));return _handleApply.apply(this,arguments)}function handleCancel(){// Revert to applied values
|
|
14
|
+
setPendingValues(_extends({},appliedValues));setIsDropdownOpen(false);setSearchQueries({})}var ChevronIcon=isDropdownOpen?ChevronUp:ChevronDown;return/*#__PURE__*/_jsxs("div",{ref:wrapperRef,className:"relative inline-block "+className,style:{color:"#2A44D4",backgroundColor:"rgb(255 255 255)"},children:[/*#__PURE__*/_jsxs(Button,{variant:"outline",size:"sm",disabled:isBusy,onClick:function onClick(){return setIsDropdownOpen(function(prev){return!prev})},className:"px-2 "+(isDropdownOpen?"bg-purple-50 border-purple-300 text-purple-700 hover:bg-purple-100":""),children:[/*#__PURE__*/_jsx(FilterIcon,{size:16,className:isDropdownOpen?"text-purple-700":""}),"FILTER",isLoading?/*#__PURE__*/_jsx(Loader2Icon,{className:"ml-2 animate-spin",size:16}):/*#__PURE__*/_jsx(ChevronIcon,{size:16,className:"ml-1 "+(isDropdownOpen?"text-purple-700":"")})]}),isDropdownOpen&&/*#__PURE__*/_jsxs("div",{className:"absolute top-full mt-2 w-80 bg-white border rounded-lg shadow-lg ring-1 ring-black ring-opacity-5 z-50",style:dropdownPosition,children:[/*#__PURE__*/_jsx("div",{className:"p-4 border-b border-gray-200",children:/*#__PURE__*/_jsx("h3",{className:"text-sm font-semibold text-gray-900",children:"Filters"})}),/*#__PURE__*/_jsx(ScrollArea,{viewportClassName:"max-h-96 overflow-y-auto",children:actualFilters.length>0?actualFilters.map(function(filter){return/*#__PURE__*/_jsx(FilterSection,{filter:filter,selectedValues:pendingValues[filter.id]||[],isExpanded:expandedSections.has(filter.id),searchQuery:searchQueries[filter.id]||"",onToggleExpand:function onToggleExpand(){return handleToggleSection(filter.id)},onValueChange:function onValueChange(values){return handleValueChange(filter.id,values)},onSearchChange:function onSearchChange(query){return handleSearchChange(filter.id,query)},isDisabled:isBusy},filter.id)}):/*#__PURE__*/_jsx("div",{className:"p-4 text-sm text-gray-500",children:"No filters configured"})}),/*#__PURE__*/_jsxs("div",{className:"p-4 border-t border-gray-200 flex justify-end space-x-2",children:[/*#__PURE__*/_jsx(Button,{variant:"ghost",size:"sm",onClick:handleCancel,disabled:isApplying,className:"bg-[#EAECFB] border border-[#2A44D4] text-[#263DBF] hover:bg-[#EAECFB] hover:text-[#263DBF]",children:"Cancel"}),/*#__PURE__*/_jsxs(Button,{variant:"default",size:"sm",onClick:handleApply,disabled:isBusy,className:"bg-[#2A44D4] text-white hover:bg-[#2A44D4] hover:text-white",children:[isApplying&&/*#__PURE__*/_jsx(Loader2Icon,{className:"animate-spin mr-2",size:16}),"Apply"]})]})]})]})}
|
|
15
|
+
//# sourceMappingURL=unified-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unified-filter.js","names":["useCallback","useEffect","useRef","useState","ChevronDown","ChevronUp","ChevronRight","ListFilter","FilterIcon","Loader2Icon","Button","Checkbox","ScrollArea","getAffectedComponentsWithLoader","jsx","_jsx","jsxs","_jsxs","FilterSection","_ref","filter","selectedValues","isExpanded","searchQuery","onToggleExpand","onValueChange","onSearchChange","isDisabled","actualOptions","options","name","Array","isArray","filteredOptions","opt","String","label","toLowerCase","includes","isMultiSelect","filterType","allOptionsSelected","length","handleOptionToggle","val","v","concat","handleClearAll","handleSelectAll","map","o","value","ChevronIcon","className","children","type","onClick","disabled","size","text","placeholder","onChange","e","target","stopPropagation","checked","onCheckedChange","onMouseDown","preventDefault","viewportClassName","renderUnifiedFilter","_ref2","gjsModel","performInteraction","_ref2$isTemplateView","isTemplateView","_useState","_extends","get","componentData","setComponentData","_componentData$filter","filters","_componentData$classN","actualFilters","f","id","filterKey","wrapperRef","_useState2","attributes","setAttributes","_useState3","isDropdownOpen","setIsDropdownOpen","_useState4","isApplying","setIsApplying","_useState5","left","right","dropdownPosition","setDropdownPosition","_useState6","Set","expandedSections","setExpandedSections","_useState7","searchQueries","setSearchQueries","_useState8","initial","forEach","pendingValues","setPendingValues","_useState9","appliedValues","setAppliedValues","hasError","error","isLoading","interactionApiInProgress","loading","isBusy","totalSelectedCount","Object","values","reduce","sum","_document$getElementB","current","filterRect","getBoundingClientRect","dropdownWidth","iframeViewportWidth","document","documentElement","clientWidth","iframeBodyWidth","getElementById","spaceToRight","spaceToLeft","shiftLeft","updateComponentData","newData","newFilters","newPendingValues","newAppliedValues","updateAttributes","on","off","_wrapperRef$current$o","_wrapperRef$current","doc","ownerDocument","handleOutsideClick","contains","handleEscape","key","addEventListener","removeEventListener","handleToggleSection","filterId","prev","next","has","add","handleValueChange","_extends2","handleSearchChange","query","_extends3","handleApply","_handleApply","apply","arguments","_asyncToGenerator","_regeneratorRuntime","mark","_callee","updatedFilters","allAffectedComponents","wrap","_callee$","_context","set","affectedComponents","interactionType","from","filterValues","finish","stop","handleCancel","ref","style","color","backgroundColor","variant"],"sources":["../../../../src/shadcn/components/ui/unified-filter.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { ChevronDown, ChevronUp, ChevronRight, ListFilter as FilterIcon, Loader2Icon } from 'lucide-react';\n\nimport { Button } from './button';\nimport { Checkbox } from './checkbox';\nimport { ScrollArea } from './scroll-area';\nimport { getAffectedComponentsWithLoader } from '../../../helpers';\n\ntype FilterOption = {\n label: string;\n value: string;\n};\n\ntype UnifiedFilterConfig = {\n id: string;\n text: string;\n filterKey: string;\n options: FilterOption[];\n filterType: 'multiselect' | 'singleselect';\n value?: string[];\n default?: string[];\n affectedComponents?: string[];\n affectedMetrics?: string[];\n metricsMapping?: Record<string, string>;\n};\n\ntype UnifiedFilterProps = {\n isEditable?: boolean;\n gjsModel: any;\n performInteraction: (payload: Record<string, any>) => Promise<void>;\n isTemplateView?: boolean;\n};\n\ntype FilterSectionProps = {\n filter: UnifiedFilterConfig;\n selectedValues: string[];\n isExpanded: boolean;\n searchQuery: string;\n onToggleExpand: () => void;\n onValueChange: (values: string[]) => void;\n onSearchChange: (query: string) => void;\n isDisabled: boolean;\n};\n\nfunction FilterSection({\n filter,\n selectedValues,\n isExpanded,\n searchQuery,\n onToggleExpand,\n onValueChange,\n onSearchChange,\n isDisabled,\n}: FilterSectionProps) {\n const actualOptions = (() => {\n if (filter.options && typeof filter.options === 'object' && (filter.options as any).name === '__peak_placeholder') {\n return [];\n }\n return Array.isArray(filter.options) ? filter.options : [];\n })();\n\n const filteredOptions = actualOptions.filter((opt: FilterOption) =>\n String(opt.label).toLowerCase().includes(searchQuery.toLowerCase()),\n );\n\n const isMultiSelect = filter.filterType === 'multiselect';\n const allOptionsSelected = selectedValues.length === actualOptions.length && actualOptions.length > 0;\n\n const handleOptionToggle = useCallback(\n (val: string) => {\n if (isMultiSelect) {\n onValueChange(\n selectedValues.includes(val)\n ? selectedValues.filter((v) => v !== val)\n : [...selectedValues, val],\n );\n } else {\n if (selectedValues.includes(val)) {\n onValueChange([]);\n } else {\n onValueChange([val]);\n }\n }\n },\n [isMultiSelect, selectedValues, onValueChange],\n );\n\n const handleClearAll = () => {\n onValueChange([]);\n };\n\n const handleSelectAll = () => {\n onValueChange(actualOptions.map((o: FilterOption) => o.value));\n };\n\n const ChevronIcon = isExpanded ? ChevronDown : ChevronRight;\n\n return (\n <div className=\"border-b border-gray-200 last:border-b-0\">\n <button\n type=\"button\"\n onClick={onToggleExpand}\n disabled={isDisabled}\n className=\"w-full flex items-center justify-between p-3 hover:bg-gray-50 transition-colors text-left\"\n >\n <div className=\"flex items-center gap-2 flex-1\">\n <ChevronIcon size={16} className=\"text-gray-500 flex-shrink-0\" />\n <span className=\"text-sm font-medium text-gray-900\">{filter.text}</span>\n {selectedValues.length > 0 && (\n <span className=\"text-xs bg-blue-100 text-blue-800 px-2 py-0.5 rounded-full flex-shrink-0\">\n {selectedValues.length}\n </span>\n )}\n </div>\n </button>\n\n {isExpanded && (\n <div className=\"px-3 pb-3 pt-2\">\n <input\n type=\"text\"\n placeholder=\"Search...\"\n value={searchQuery}\n onChange={(e) => onSearchChange(e.target.value)}\n className=\"w-full mb-3 px-2 py-1 border rounded focus:outline-none text-sm\"\n disabled={isDisabled}\n onClick={(e) => e.stopPropagation()}\n />\n\n {isMultiSelect && (\n <div className=\"flex items-center mb-3\">\n <Checkbox\n checked={allOptionsSelected}\n onCheckedChange={() => (allOptionsSelected ? handleClearAll() : handleSelectAll())}\n disabled={isDisabled}\n />\n <span className=\"ml-2 text-sm text-gray-900\">Select All</span>\n {selectedValues.length > 0 && (\n <button\n type=\"button\"\n className=\"ml-auto text-sm text-blue-600 hover:underline\"\n onMouseDown={(e) => {\n e.stopPropagation();\n e.preventDefault();\n }}\n onClick={handleClearAll}\n disabled={isDisabled}\n >\n Clear All\n </button>\n )}\n </div>\n )}\n\n <ScrollArea viewportClassName=\"max-h-48 overflow-y-auto mb-2 space-y-2\">\n {filteredOptions.length > 0 ? (\n filteredOptions.map((opt) => (\n <label\n key={opt.value}\n className=\"flex items-center space-x-2 hover:bg-gray-100 rounded p-1 transition hover:cursor-pointer\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (!isDisabled) {\n handleOptionToggle(opt.value);\n }\n }}\n >\n <Checkbox\n checked={selectedValues.includes(opt.value)}\n onChange={() => {\n // Prevent checkbox from toggling when clicking label\n }}\n disabled={isDisabled}\n />\n <span className=\"text-sm text-gray-900\">{opt.label}</span>\n </label>\n ))\n ) : (\n <div className=\"text-sm text-gray-500 py-2\">No results found</div>\n )}\n </ScrollArea>\n </div>\n )}\n </div>\n );\n}\n\nexport function renderUnifiedFilter({ gjsModel, performInteraction, isTemplateView = false }: UnifiedFilterProps) {\n const [componentData, setComponentData] = useState({ ...gjsModel.get('componentProps') });\n\n const {\n filters = [],\n className = '',\n } = componentData;\n\n const actualFilters = (() => {\n if (!Array.isArray(filters)) {\n return [];\n }\n return filters.filter((f: any) => f && typeof f === 'object' && f.id && f.text && f.filterKey);\n })() as UnifiedFilterConfig[];\n\n const wrapperRef = useRef<HTMLDivElement>(null);\n\n const [attributes, setAttributes] = useState({ ...gjsModel.get('attributes') });\n const [isDropdownOpen, setIsDropdownOpen] = useState(false);\n const [isApplying, setIsApplying] = useState(false);\n const [dropdownPosition, setDropdownPosition] = useState({ left: 'auto', right: '0' });\n\n // Track expanded sections\n const [expandedSections, setExpandedSections] = useState<Set<string>>(new Set());\n\n // Track search queries per filter\n const [searchQueries, setSearchQueries] = useState<Record<string, string>>({});\n\n // Track pending selected values (before Apply)\n const [pendingValues, setPendingValues] = useState<Record<string, string[]>>(() => {\n const initial: Record<string, string[]> = {};\n actualFilters.forEach((filter) => {\n initial[filter.id] = Array.isArray(filter.value) && filter.value.length > 0\n ? filter.value\n : (Array.isArray(filter.default) ? filter.default : []);\n });\n return initial;\n });\n\n // Track last applied values (for Cancel)\n const [appliedValues, setAppliedValues] = useState<Record<string, string[]>>(() => {\n const initial: Record<string, string[]> = {};\n actualFilters.forEach((filter) => {\n initial[filter.id] = Array.isArray(filter.value) && filter.value.length > 0\n ? filter.value\n : (Array.isArray(filter.default) ? filter.default : []);\n });\n return initial;\n });\n\n const hasError = attributes.error || componentData.error;\n const isLoading = !isTemplateView && !hasError && (attributes.interactionApiInProgress || isApplying || attributes.loading);\n const isBusy = isLoading;\n\n // Calculate total selected count across all filters\n const totalSelectedCount = Object.values(pendingValues).reduce((sum, values) => sum + values.length, 0);\n\n useEffect(() => {\n if (!isDropdownOpen || !wrapperRef.current) {\n return;\n }\n\n const filterRect = wrapperRef.current.getBoundingClientRect();\n const dropdownWidth = 320;\n const iframeViewportWidth = document.documentElement.clientWidth;\n const iframeBodyWidth =\n document.getElementById('dashboard-root')?.clientWidth || iframeViewportWidth;\n\n const spaceToRight = iframeBodyWidth - filterRect.right;\n const spaceToLeft = filterRect.left;\n\n if (spaceToLeft >= dropdownWidth) {\n setDropdownPosition({ left: 'auto', right: '0px' });\n } else if (spaceToRight < dropdownWidth && spaceToLeft < dropdownWidth) {\n const shiftLeft = dropdownWidth - spaceToRight + 16;\n setDropdownPosition({ left: `-${shiftLeft}px`, right: 'auto' });\n } else if (spaceToRight >= dropdownWidth) {\n setDropdownPosition({ left: '0px', right: 'auto' });\n }\n }, [isDropdownOpen]);\n\n useEffect(() => {\n function updateComponentData() {\n const newData = { ...gjsModel.get('componentProps') };\n setComponentData(newData);\n\n // Update pending and applied values when filters change externally\n const newFilters = (() => {\n if (!Array.isArray(newData.filters)) {\n return [];\n }\n return newData.filters.filter((f: any) => f && typeof f === 'object' && f.id && f.text && f.filterKey);\n })() as UnifiedFilterConfig[];\n\n const newPendingValues: Record<string, string[]> = {};\n const newAppliedValues: Record<string, string[]> = {};\n newFilters.forEach((filter) => {\n newPendingValues[filter.id] = Array.isArray(filter.value) && filter.value.length > 0\n ? filter.value\n : (Array.isArray(filter.default) ? filter.default : []);\n newAppliedValues[filter.id] = Array.isArray(filter.value) && filter.value.length > 0\n ? filter.value\n : (Array.isArray(filter.default) ? filter.default : []);\n });\n setPendingValues(newPendingValues);\n setAppliedValues(newAppliedValues);\n }\n\n function updateAttributes() {\n setAttributes({ ...gjsModel.get('attributes') });\n }\n\n gjsModel.on('change:componentProps', updateComponentData);\n gjsModel.on('change:attributes', updateAttributes);\n\n return () => {\n gjsModel.off('change:componentProps', updateComponentData);\n gjsModel.off('change:attributes', updateAttributes);\n };\n }, [gjsModel]);\n\n useEffect(() => {\n const doc = wrapperRef.current?.ownerDocument ?? document;\n\n function handleOutsideClick(e: PointerEvent) {\n if (isDropdownOpen && wrapperRef.current && !wrapperRef.current.contains(e.target as Node)) {\n setIsDropdownOpen(false);\n // Reset pending values to applied values on close without apply\n setPendingValues({ ...appliedValues });\n // Clear search queries\n setSearchQueries({});\n }\n }\n\n function handleEscape(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n setIsDropdownOpen(false);\n setPendingValues({ ...appliedValues });\n setSearchQueries({});\n }\n }\n\n doc.addEventListener('pointerdown', handleOutsideClick);\n doc.addEventListener('keydown', handleEscape);\n\n return () => {\n doc.removeEventListener('pointerdown', handleOutsideClick);\n doc.removeEventListener('keydown', handleEscape);\n };\n }, [isDropdownOpen, appliedValues]);\n\n const handleToggleSection = useCallback((filterId: string) => {\n setExpandedSections((prev) => {\n const next = new Set(prev);\n if (next.has(filterId)) {\n next.delete(filterId);\n } else {\n next.add(filterId);\n }\n return next;\n });\n }, []);\n\n const handleValueChange = useCallback((filterId: string, values: string[]) => {\n setPendingValues((prev) => ({\n ...prev,\n [filterId]: values,\n }));\n }, []);\n\n const handleSearchChange = useCallback((filterId: string, query: string) => {\n setSearchQueries((prev) => ({\n ...prev,\n [filterId]: query,\n }));\n }, []);\n\n async function handleApply() {\n setIsApplying(true);\n\n try {\n // Update component props with new filter values\n const updatedFilters = actualFilters.map((filter) => ({\n ...filter,\n value: pendingValues[filter.id] || [],\n }));\n\n gjsModel.set('componentProps', {\n ...gjsModel.get('componentProps'),\n filters: updatedFilters,\n });\n\n // Collect all affected components (deduplicated)\n const allAffectedComponents = new Set<string>();\n actualFilters.forEach((filter) => {\n if (Array.isArray(filter.affectedComponents)) {\n filter.affectedComponents.forEach((id) => allAffectedComponents.add(id));\n }\n });\n\n const id = gjsModel.get('id');\n\n await performInteraction({\n interactionType: 'filter',\n id,\n affectedComponents: getAffectedComponentsWithLoader([id, ...Array.from(allAffectedComponents)], true),\n filterValues: pendingValues,\n });\n\n // Update applied values after successful apply\n setAppliedValues({ ...pendingValues });\n setIsDropdownOpen(false);\n setSearchQueries({});\n } finally {\n setIsApplying(false);\n }\n }\n\n function handleCancel() {\n // Revert to applied values\n setPendingValues({ ...appliedValues });\n setIsDropdownOpen(false);\n setSearchQueries({});\n }\n\n const ChevronIcon = isDropdownOpen ? ChevronUp : ChevronDown;\n\n return (\n <div\n ref={wrapperRef}\n className={`relative inline-block ${className}`}\n style={{ color: '#2A44D4', backgroundColor: 'rgb(255 255 255)' }}\n >\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={isBusy}\n onClick={() => setIsDropdownOpen((prev) => !prev)}\n className={`px-2 ${isDropdownOpen ? 'bg-purple-50 border-purple-300 text-purple-700 hover:bg-purple-100' : ''}`}\n >\n <FilterIcon size={16} className={isDropdownOpen ? 'text-purple-700' : ''} />\n FILTER\n {isLoading ? (\n <Loader2Icon className=\"ml-2 animate-spin\" size={16} />\n ) : (\n <ChevronIcon size={16} className={`ml-1 ${isDropdownOpen ? 'text-purple-700' : ''}`} />\n )}\n </Button>\n\n {isDropdownOpen && (\n <div\n className=\"absolute top-full mt-2 w-80 bg-white border rounded-lg shadow-lg ring-1 ring-black ring-opacity-5 z-50\"\n style={dropdownPosition}\n >\n <div className=\"p-4 border-b border-gray-200\">\n <h3 className=\"text-sm font-semibold text-gray-900\">Filters</h3>\n </div>\n\n <ScrollArea viewportClassName=\"max-h-96 overflow-y-auto\">\n {actualFilters.length > 0 ? (\n actualFilters.map((filter) => (\n <FilterSection\n key={filter.id}\n filter={filter}\n selectedValues={pendingValues[filter.id] || []}\n isExpanded={expandedSections.has(filter.id)}\n searchQuery={searchQueries[filter.id] || ''}\n onToggleExpand={() => handleToggleSection(filter.id)}\n onValueChange={(values) => handleValueChange(filter.id, values)}\n onSearchChange={(query) => handleSearchChange(filter.id, query)}\n isDisabled={isBusy}\n />\n ))\n ) : (\n <div className=\"p-4 text-sm text-gray-500\">No filters configured</div>\n )}\n </ScrollArea>\n\n <div className=\"p-4 border-t border-gray-200 flex justify-end space-x-2\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleCancel}\n disabled={isApplying}\n className=\"bg-[#EAECFB] border border-[#2A44D4] text-[#263DBF] hover:bg-[#EAECFB] hover:text-[#263DBF]\"\n >\n Cancel\n </Button>\n <Button\n variant=\"default\"\n size=\"sm\"\n onClick={handleApply}\n disabled={isBusy}\n className=\"bg-[#2A44D4] text-white hover:bg-[#2A44D4] hover:text-white\"\n >\n {isApplying && <Loader2Icon className=\"animate-spin mr-2\" size={16} />}\n Apply\n </Button>\n </div>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|