diff --git a/.github/workflows/firebase-hosting-pull-request.yml b/.github/workflows/firebase-hosting-pull-request.yml index 3bbd438..778789d 100644 --- a/.github/workflows/firebase-hosting-pull-request.yml +++ b/.github/workflows/firebase-hosting-pull-request.yml @@ -40,6 +40,7 @@ jobs: with: repoToken: ${{ secrets.GITHUB_TOKEN }} firebaseServiceAccount: ${{ secrets.FIREBASE_SERVICE_ACCOUNT_NWPLUS_UBC_DEV }} + channelId: pr${{ github.event.pull_request.number }}-${{ github.run_id }} expires: 10d projectId: nwplus-ubc-dev target: admin-portal-dev diff --git a/src/components/features/query/popovers/filter-rows.tsx b/src/components/features/query/popovers/filter-rows.tsx index 7c92ec0..e87e89e 100644 --- a/src/components/features/query/popovers/filter-rows.tsx +++ b/src/components/features/query/popovers/filter-rows.tsx @@ -9,7 +9,7 @@ import { SelectValue, } from "@/components/ui/select"; import { Input } from "@/components/ui/input"; -import { X, Plus } from "lucide-react"; +import { X, Plus, Pencil, Check } from "lucide-react"; import { Badge } from "@/components/ui/badge"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import type { FilterRowsSelection } from "@/lib/firebase/types"; @@ -42,6 +42,7 @@ interface FilterRowsProps { filterSelections: FilterRowsSelection[]; onAddFilter: (filter: FilterRowsSelection) => void; onRemoveFilter: (filterId: string) => void; + onFilterUpdate: (filterId: string, filter: FilterRowsSelection) => void; onFilterOperatorChange: (filterId: string, operator: 'AND' | 'OR') => void; } @@ -55,6 +56,7 @@ export function FilterRows({ filterSelections, onAddFilter, onRemoveFilter, + onFilterUpdate, onFilterOperatorChange }: FilterRowsProps) { const [open, setOpen] = useState(false); @@ -62,24 +64,37 @@ export function FilterRows({ const [newFilterCondition, setNewFilterCondition] = useState(""); const [newFilterValue, setNewFilterValue] = useState(""); const [newFilterOperator, setNewFilterOperator] = useState<'AND' | 'OR'>('AND'); + const [editingFilterId, setEditingFilterId] = useState(null); const type = columnTypes[newFilterColumn] || "string"; const conditionOptions = CONDITION_OPTIONS[type] || CONDITION_OPTIONS.string; - const handleAddFilter = () => { + const handleCommitFilter = () => { if (newFilterColumn && newFilterCondition && newFilterValue) { - const newFilter: FilterRowsSelection = { - id: crypto.randomUUID(), - filterColumn: newFilterColumn, - filterCondition: newFilterCondition, - filterValue: newFilterValue, - logicalOperator: newFilterOperator, - }; - onAddFilter(newFilter); + if (editingFilterId) { + const updatedFilter: FilterRowsSelection = { + id: editingFilterId, + filterColumn: newFilterColumn, + filterCondition: newFilterCondition, + filterValue: newFilterValue, + logicalOperator: newFilterOperator, + }; + onFilterUpdate(editingFilterId, updatedFilter); + } else { + const newFilter: FilterRowsSelection = { + id: crypto.randomUUID(), + filterColumn: newFilterColumn, + filterCondition: newFilterCondition, + filterValue: newFilterValue, + logicalOperator: newFilterOperator, + }; + onAddFilter(newFilter); + } setNewFilterColumn(""); setNewFilterCondition(""); setNewFilterValue(""); setNewFilterOperator('AND'); + setEditingFilterId(null); } }; @@ -87,6 +102,14 @@ export function FilterRows({ onRemoveFilter(filterId); }; + const handleEditFilter = (filter: FilterRowsSelection) => { + setNewFilterColumn(filter.filterColumn); + setNewFilterCondition(filter.filterCondition); + setNewFilterValue(filter.filterValue); + setNewFilterOperator(filter.logicalOperator || 'AND'); + setEditingFilterId(filter.id); + }; + const getFilterDisplayText = (filter: FilterRowsSelection) => { const conditionLabel = CONDITION_OPTIONS[columnTypes[filter.filterColumn] || "string"] ?.find(opt => opt.value === filter.filterCondition)?.label || filter.filterCondition; @@ -106,7 +129,16 @@ export function FilterRows({ }; return ( - + { + if (!isOpen) { + setNewFilterColumn(""); + setNewFilterCondition(""); + setNewFilterValue(""); + setNewFilterOperator('AND'); + setEditingFilterId(null); + } + setOpen(isOpen); + }}>
+ {editingFilterId && ( + + )}
diff --git a/src/components/features/query/query-filters.tsx b/src/components/features/query/query-filters.tsx index 190e6aa..e52dd7d 100644 --- a/src/components/features/query/query-filters.tsx +++ b/src/components/features/query/query-filters.tsx @@ -18,6 +18,7 @@ export function QueryFilters({ availableColumns }: QueryFiltersProps) { filterSelections, onFilterAdd, onFilterRemove, + onFilterUpdate, onFilterOperatorChange, sorting, onSortingChange, @@ -115,6 +116,7 @@ export function QueryFilters({ availableColumns }: QueryFiltersProps) { filterSelections={filterSelections} onAddFilter={onFilterAdd} onRemoveFilter={onFilterRemove} + onFilterUpdate={onFilterUpdate} onFilterOperatorChange={onFilterOperatorChange} /> diff --git a/src/providers/query-provider.tsx b/src/providers/query-provider.tsx index 70d4da9..cb3c990 100644 --- a/src/providers/query-provider.tsx +++ b/src/providers/query-provider.tsx @@ -127,6 +127,7 @@ interface QueryContextType { onFilterAdd: (selection: FilterRowsSelection) => void; onFilterRemove: (filterId: string) => void; onFilterOperatorChange: (filterId: string, operator: 'AND' | 'OR') => void; + onFilterUpdate: (filterId: string, selection: FilterRowsSelection) => void; onSortingChange: (updater: SortingState | ((prev: SortingState) => SortingState)) => void; } @@ -246,6 +247,12 @@ export function QueryProvider({ children }: QueryProviderProps) { )); }, []); + const handleFilterUpdate = useCallback((filterId: string, selection: FilterRowsSelection) => { + setFilterSelections(prev => prev.map(filter => + filter.id === filterId ? { ...selection, id: filterId } : filter + )); + }, []); + const value = { hackathons, selectedHackathon, @@ -262,6 +269,7 @@ export function QueryProvider({ children }: QueryProviderProps) { onFilterAdd: handleFilterAdd, onFilterRemove: handleFilterRemove, onFilterOperatorChange: handleFilterOperatorChange, + onFilterUpdate: handleFilterUpdate, onSortingChange: setSorting, };