aboutsummaryrefslogtreecommitdiff
path: root/src/components/input/FilterEditForm.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/input/FilterEditForm.tsx')
-rw-r--r--src/components/input/FilterEditForm.tsx95
1 files changed, 95 insertions, 0 deletions
diff --git a/src/components/input/FilterEditForm.tsx b/src/components/input/FilterEditForm.tsx
new file mode 100644
index 0000000..44f4384
--- /dev/null
+++ b/src/components/input/FilterEditForm.tsx
@@ -0,0 +1,95 @@
+import { Button, Column, Row, Tab, TabList, TabPanel, Tabs } from '@umami/react-zen';
+import { useState } from 'react';
+import { useFilters, useMessages, useMobile, useNavigation } from '@/components/hooks';
+import { FieldFilters } from '@/components/input/FieldFilters';
+import { SegmentFilters } from '@/components/input/SegmentFilters';
+
+export interface FilterEditFormProps {
+ websiteId?: string;
+ onChange?: (params: { filters: any[]; segment?: string; cohort?: string }) => void;
+ onClose?: () => void;
+}
+
+export function FilterEditForm({ websiteId, onChange, onClose }: FilterEditFormProps) {
+ const {
+ query: { segment, cohort },
+ pathname,
+ } = useNavigation();
+ const { filters } = useFilters();
+ const { formatMessage, labels } = useMessages();
+ const [currentFilters, setCurrentFilters] = useState(filters);
+ const [currentSegment, setCurrentSegment] = useState(segment);
+ const [currentCohort, setCurrentCohort] = useState(cohort);
+ const { isMobile } = useMobile();
+ const excludeFilters = pathname.includes('/pixels') || pathname.includes('/links');
+
+ const handleReset = () => {
+ setCurrentFilters([]);
+ setCurrentSegment(undefined);
+ setCurrentCohort(undefined);
+ };
+
+ const handleSave = () => {
+ onChange?.({
+ filters: currentFilters.filter(f => f.value),
+ segment: currentSegment,
+ cohort: currentCohort,
+ });
+ onClose?.();
+ };
+
+ const handleSegmentChange = (id: string, type: string) => {
+ setCurrentSegment(type === 'segment' ? id : undefined);
+ setCurrentCohort(type === 'cohort' ? id : undefined);
+ };
+
+ return (
+ <Column width={isMobile ? 'auto' : '800px'} gap="6">
+ <Column minHeight="500px">
+ <Tabs>
+ <TabList>
+ <Tab id="fields">{formatMessage(labels.fields)}</Tab>
+ {!excludeFilters && (
+ <>
+ <Tab id="segments">{formatMessage(labels.segments)}</Tab>
+ <Tab id="cohorts">{formatMessage(labels.cohorts)}</Tab>
+ </>
+ )}
+ </TabList>
+ <TabPanel id="fields">
+ <FieldFilters
+ websiteId={websiteId}
+ value={currentFilters}
+ onChange={setCurrentFilters}
+ exclude={excludeFilters ? ['path', 'title', 'hostname', 'tag', 'event'] : []}
+ />
+ </TabPanel>
+ <TabPanel id="segments">
+ <SegmentFilters
+ websiteId={websiteId}
+ segmentId={currentSegment}
+ onChange={handleSegmentChange}
+ />
+ </TabPanel>
+ <TabPanel id="cohorts">
+ <SegmentFilters
+ type="cohort"
+ websiteId={websiteId}
+ segmentId={currentCohort}
+ onChange={handleSegmentChange}
+ />
+ </TabPanel>
+ </Tabs>
+ </Column>
+ <Row alignItems="center" justifyContent="space-between" gap>
+ <Button onPress={handleReset}>{formatMessage(labels.reset)}</Button>
+ <Row alignItems="center" justifyContent="flex-end" gridColumn="span 2" gap>
+ <Button onPress={onClose}>{formatMessage(labels.cancel)}</Button>
+ <Button variant="primary" onPress={handleSave}>
+ {formatMessage(labels.apply)}
+ </Button>
+ </Row>
+ </Row>
+ </Column>
+ );
+}