From dcebeb7b5bcb51c0bea43528114fbe5ac3e70c17 Mon Sep 17 00:00:00 2001 From: nick-delirium Date: Tue, 28 Jan 2025 15:15:45 +0100 Subject: [PATCH] ui: fetcher, better type mapping --- .../Activity/EventDetailsModal.tsx | 85 +++++++++++++++---- .../DataManagement/Activity/Page.tsx | 60 ++++++++----- .../DataManagement/Activity/data/Event.ts | 21 ++++- 3 files changed, 128 insertions(+), 38 deletions(-) diff --git a/frontend/app/components/DataManagement/Activity/EventDetailsModal.tsx b/frontend/app/components/DataManagement/Activity/EventDetailsModal.tsx index 2140d1549..c2331842a 100644 --- a/frontend/app/components/DataManagement/Activity/EventDetailsModal.tsx +++ b/frontend/app/components/DataManagement/Activity/EventDetailsModal.tsx @@ -1,39 +1,61 @@ import React from 'react' import { EventData } from './data/Event' import { Segmented, Input } from 'antd'; -import { X } from 'lucide-react'; +import { X, List, Braces, Files } from 'lucide-react'; +import copy from 'copy-to-clipboard' function EventDetailsModal({ ev, onClose }: { ev: EventData, onClose: () => void }) { const tabs = [ { label: 'All Properties', + value: 'all', }, { label: 'Custom Properties', + value: 'custom', }, { label: 'Default Properties', + value: 'default', } ] const views = [ { - label: 'icn1', + label: , value: 'pretty', }, { - label: 'icn2', + label: , value: 'json', } ] const [query, setQuery] = React.useState('') + const [tab, setTab] = React.useState(tabs[0].value) const [view, setView] = React.useState(views[0].value) - const dataFields = { ...ev.$_defaultFields, ...ev.$_customFields } + const tabProps = { + all: { ...ev.$_defaultFields, ...ev.$_customFields }, + custom: ev.$_customFields, + default: ev.$_defaultFields, + } + const dataFields = tabProps[tab] const fieldArr = Object.entries(dataFields) - const filteredArr = fieldArr.filter(([key, value]) => { + const filteredArr = view === 'json' ? [] : fieldArr.filter(([key, value]) => { const qReg = new RegExp(query, 'ig') return qReg.test(key) || qReg.test(value) }) + const strProps = JSON.stringify({ + event: ev.name, + properties: dataFields + }, null, 4) + const highlightedJson = view === 'pretty' ? '' : query ? strProps.replace( + new RegExp(query, 'ig'), + (match) => `${match}` + ) : strProps + + const onCopy = () => { + copy(strProps) + } return (
@@ -45,10 +67,13 @@ function EventDetailsModal({ ev, onClose }: { ev: EventData, onClose: () => void
icn
-
{ev.name}
-
Play Session
+
{ev.name}
+
+ Play Session + +
- + setTab(v)} />
void placeholder={'Find Property'} />
-
- {filteredArr.map(([key, value]) => ( -
-
{key}
-
{value}
+ {view === 'pretty' ? +
+ {filteredArr.map(([key, value]) => ( +
+
{key}
+
{value}
+
+ ))}
- ))} -
+ : ( +
+
+ +
+
+        
+ )}
- ) + ); +} + +function Triangle({ size = 16, color = 'currentColor' }) { + return ( + + + + + ); } export default EventDetailsModal; \ No newline at end of file diff --git a/frontend/app/components/DataManagement/Activity/Page.tsx b/frontend/app/components/DataManagement/Activity/Page.tsx index 3e84d66b0..5260fd43b 100644 --- a/frontend/app/components/DataManagement/Activity/Page.tsx +++ b/frontend/app/components/DataManagement/Activity/Page.tsx @@ -7,9 +7,44 @@ import { Pagination } from 'UI'; import Event from './data/Event'; import { useModal } from 'App/components/Modal'; import EventDetailsModal from "./EventDetailsModal"; +import { useQuery } from '@tanstack/react-query'; + +const limit = 100; + +const fetcher = async (page: number): Promise<{ list: any[], total: number }> => { + const total = 3000; + return new Promise((resolve) => { + const testEv = new Event({ + name: 'test ev', + time: Date.now(), + defaultFields: { userId: '123', userCity: 'NY', userEnvironment: 'Mac OS' }, + customFields: {}, + isAutoCapture: false, + sessionId: '123123' + }); + const testAutoEv = new Event({ + name: 'auto test ev', + time: Date.now(), + defaultFields: { userId: '123', userCity: 'NY', userEnvironment: 'Mac OS' }, + customFields: {}, + isAutoCapture: true, + sessionId: '123123' + }); + const list = [testEv.toData(), testAutoEv.toData()]; + + resolve({ list, total }); + }) +} function ActivityPage() { + const [page, setPage] = React.useState(1); const [hiddenCols, setHiddenCols] = React.useState([]); + const { data, isPending } = useQuery({ + queryKey: ['data', 'events', page], + queryFn: () => fetcher(page), + initialData: { list: [], total: 0 }, + }); + const { list, total } = data; const appliedFilter = { filters: [] }; const onAddFilter = () => {}; const onUpdateFilter = () => {}; @@ -92,28 +127,12 @@ function ActivityPage() { hidden: hiddenCols.includes(col.key), })); - const page = 1; - const limit = 100; - const total = 3000; - const testEv = new Event( - 'test ev', - Date.now(), - { userId: '123', userCity: 'NY', userEnvironment: 'Mac OS' }, - {}, - false - ); - const testAutoEv = new Event( - 'test auto ev', - Date.now(), - { userId: '123', userCity: 'NY', userEnvironment: 'Mac OS' }, - {}, - true - ); - const list = [testEv.toData(), testAutoEv.toData()]; - const onPageChange = () => {}; + const onPageChange = (page: number) => { + setPage(page); + }; const onItemClick = (ev: Event) => { - showModal(, { width: 400, right: true }); + showModal(, { width: 420, right: true }); } return (
({ onClick: (event) => onItemClick(record) })} diff --git a/frontend/app/components/DataManagement/Activity/data/Event.ts b/frontend/app/components/DataManagement/Activity/data/Event.ts index da8855e73..305d08553 100644 --- a/frontend/app/components/DataManagement/Activity/data/Event.ts +++ b/frontend/app/components/DataManagement/Activity/data/Event.ts @@ -22,14 +22,31 @@ export default class Event { } customFields?: Record = undefined; - readonly $_isAutoCapture; + readonly $_isAutoCapture: boolean; + readonly $_sessionId: string; - constructor(name: string, time: string, defaultFields: DefaultFields, customFields?: Record, isAutoCapture = false) { + constructor( + { + name, + time, + defaultFields, + customFields, + sessionId, + isAutoCapture, +}: { + name: string; + time: string; + defaultFields: DefaultFields; + customFields?: Record; + sessionId: string; + isAutoCapture: boolean; + }) { this.name = name; this.time = time; this.defaultFields = defaultFields; this.customFields = customFields; this.$_isAutoCapture = isAutoCapture; + this.$_sessionId = sessionId; } toJSON() {