From 7ad85ac8b730045d2d5824ece81527255b4cc5ae Mon Sep 17 00:00:00 2001 From: ken-zlai Date: Fri, 22 Nov 2024 16:51:15 -0700 Subject: [PATCH 1/3] move everything to joins page, update search/default page, etc --- .../NavigationBar/NavigationBar.svelte | 34 +++++++++-- frontend/src/lib/types/Entity/Entity.ts | 32 ++++++++++ frontend/src/lib/types/Model/Model.ts | 12 +++- frontend/src/routes/+layout.svelte | 10 +-- frontend/src/routes/+page.server.ts | 2 +- frontend/src/routes/groupbys/+page.svelte | 5 -- .../routes/{models => joins}/+page.server.ts | 0 frontend/src/routes/joins/+page.svelte | 61 ++++++++++++++++++- .../{models => joins}/[slug]/+page.server.ts | 0 .../{models => joins}/[slug]/+page.svelte | 0 frontend/src/routes/models/+page.svelte | 56 ----------------- 11 files changed, 132 insertions(+), 80 deletions(-) create mode 100644 frontend/src/lib/types/Entity/Entity.ts delete mode 100644 frontend/src/routes/groupbys/+page.svelte rename frontend/src/routes/{models => joins}/+page.server.ts (100%) rename frontend/src/routes/{models => joins}/[slug]/+page.server.ts (100%) rename frontend/src/routes/{models => joins}/[slug]/+page.svelte (100%) delete mode 100644 frontend/src/routes/models/+page.svelte diff --git a/frontend/src/lib/components/NavigationBar/NavigationBar.svelte b/frontend/src/lib/components/NavigationBar/NavigationBar.svelte index 222d362042..781742bdf3 100644 --- a/frontend/src/lib/components/NavigationBar/NavigationBar.svelte +++ b/frontend/src/lib/components/NavigationBar/NavigationBar.svelte @@ -29,13 +29,13 @@ AdjustmentsHorizontal, ArrowsUpDown } from 'svelte-hero-icons'; - import type { IconSource } from 'svelte-hero-icons'; import { goto } from '$app/navigation'; import { isMacOS } from '$lib/util/browser'; import { Badge } from '$lib/components/ui/badge'; + import { getEntity, type Entity } from '$lib/types/Entity/Entity'; type Props = { - navItems: { label: string; href: string; icon: IconSource }[]; + navItems: Entity[]; user: { name: string; avatar: string }; }; @@ -129,16 +129,16 @@ {#each navItems as item}
  • @@ -200,9 +200,31 @@ {:else} {#each searchResults as model} - handleSelect(`/models/${encodeURIComponent(model.name)}`)}> + + handleSelect(`${getEntity('models').path}/${encodeURIComponent(model.name)}`)} + > + {model.name} + + handleSelect(`${getEntity('joins').path}/${encodeURIComponent(model.join.name)}`)} + > + + {model.join.name} + + {#each model.join.groupBys as groupBy} + + handleSelect(`${getEntity('groupbys').path}/${encodeURIComponent(groupBy.name)}`)} + > + + {groupBy.name} + + {/each} {/each} {/if} diff --git a/frontend/src/lib/types/Entity/Entity.ts b/frontend/src/lib/types/Entity/Entity.ts new file mode 100644 index 0000000000..3b497b5a93 --- /dev/null +++ b/frontend/src/lib/types/Entity/Entity.ts @@ -0,0 +1,32 @@ +import { Cube, PuzzlePiece, Square3Stack3d } from 'svelte-hero-icons'; + +export const entityConfig = [ + { + label: 'Models', + path: '/models', + icon: Cube, + id: 'models' + }, + { + label: 'GroupBys', + path: '/groupbys', + icon: PuzzlePiece, + id: 'groupbys' + }, + { + label: 'Joins', + path: '/joins', + icon: Square3Stack3d, + id: 'joins' + } +] as const; + +export type Entity = (typeof entityConfig)[number]; +export type EntityId = Entity['id']; + +// Helper function to get entity by ID +export function getEntity(id: EntityId): Entity { + const entity = entityConfig.find((entity) => entity.id === id); + if (!entity) throw new Error(`Entity with id "${id}" not found`); + return entity; +} diff --git a/frontend/src/lib/types/Model/Model.ts b/frontend/src/lib/types/Model/Model.ts index fb67e8d37d..16b00bf963 100644 --- a/frontend/src/lib/types/Model/Model.ts +++ b/frontend/src/lib/types/Model/Model.ts @@ -4,7 +4,7 @@ export type Model = { production: boolean; team: string; modelType: string; - join: JoinTimeSeriesResponse; // todo: this type needs to be updated to match the actual response once that WIP is finished + join: Join; }; export type ModelsResponse = { @@ -23,6 +23,16 @@ export type TimeSeriesResponse = { id: string; items: TimeSeriesItem[]; }; +export type Join = { + name: string; + joinFeatures: string[]; + groupBys: GroupBy[]; +}; + +export type GroupBy = { + name: string; + features: string[]; +}; export type JoinTimeSeriesResponse = { name: string; // todo: rename to joinName diff --git a/frontend/src/routes/+layout.svelte b/frontend/src/routes/+layout.svelte index a754a64a2c..282723e082 100644 --- a/frontend/src/routes/+layout.svelte +++ b/frontend/src/routes/+layout.svelte @@ -6,7 +6,7 @@ import NavigationBar from '$lib/components/NavigationBar/NavigationBar.svelte'; import BreadcrumbNav from '$lib/components/BreadcrumbNav/BreadcrumbNav.svelte'; import { ScrollArea } from '$lib/components/ui/scroll-area'; - import { Cube, PuzzlePiece, Square3Stack3d } from 'svelte-hero-icons'; + import { entityConfig } from '$lib/types/Entity/Entity'; let { children }: { children: Snippet } = $props(); @@ -16,12 +16,6 @@ avatar: '/path/to/avatar.jpg' }; - const navItems = [ - { label: 'Models', href: '/models', icon: Cube }, - { label: 'GroupBys', href: '/groupbys', icon: PuzzlePiece }, - { label: 'Joins', href: '/joins', icon: Square3Stack3d } - ]; - const breadcrumbs = $derived($page.url.pathname.split('/').filter(Boolean)); @@ -29,7 +23,7 @@ - + entity.id === 'joins')} {user} />
    - import ComingSoonPage from '$lib/components/ComingSoonPage/ComingSoonPage.svelte'; - - - diff --git a/frontend/src/routes/models/+page.server.ts b/frontend/src/routes/joins/+page.server.ts similarity index 100% rename from frontend/src/routes/models/+page.server.ts rename to frontend/src/routes/joins/+page.server.ts diff --git a/frontend/src/routes/joins/+page.svelte b/frontend/src/routes/joins/+page.svelte index a6cf0f1602..684b67f3e4 100644 --- a/frontend/src/routes/joins/+page.svelte +++ b/frontend/src/routes/joins/+page.svelte @@ -1,5 +1,60 @@ - - + + +
    + +
    + + + + + Join + Model + Team + Type + Online + Production + + + + {#each models as model} + + + + {model.join.name} + + + + {model.name} + + {model.team} + {model.modelType} + + + + + + + + {/each} + +
    + diff --git a/frontend/src/routes/models/[slug]/+page.server.ts b/frontend/src/routes/joins/[slug]/+page.server.ts similarity index 100% rename from frontend/src/routes/models/[slug]/+page.server.ts rename to frontend/src/routes/joins/[slug]/+page.server.ts diff --git a/frontend/src/routes/models/[slug]/+page.svelte b/frontend/src/routes/joins/[slug]/+page.svelte similarity index 100% rename from frontend/src/routes/models/[slug]/+page.svelte rename to frontend/src/routes/joins/[slug]/+page.svelte diff --git a/frontend/src/routes/models/+page.svelte b/frontend/src/routes/models/+page.svelte deleted file mode 100644 index 76ca35b441..0000000000 --- a/frontend/src/routes/models/+page.svelte +++ /dev/null @@ -1,56 +0,0 @@ - - - - -
    - -
    - - - - - Model - Team - Type - Online - Production - - - - {#each models as model} - - - - {model.name} - - - {model.team} - {model.modelType} - - - - - - - - {/each} - -
    - From 281fcc4c7865fcd10c86842e622ad23e993679fd Mon Sep 17 00:00:00 2001 From: ken-zlai Date: Sat, 23 Nov 2024 08:35:27 -0700 Subject: [PATCH 2/3] URL-encode dynamic parameters in links to prevent potential issues. --- frontend/src/routes/joins/+page.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/routes/joins/+page.svelte b/frontend/src/routes/joins/+page.svelte index 684b67f3e4..274e458e17 100644 --- a/frontend/src/routes/joins/+page.svelte +++ b/frontend/src/routes/joins/+page.svelte @@ -38,7 +38,7 @@ {#each models as model} - + {model.join.name} From 8f62e420988dc753cebd93e40e9fda9738a5743e Mon Sep 17 00:00:00 2001 From: ken-zlai Date: Sat, 23 Nov 2024 08:40:04 -0700 Subject: [PATCH 3/3] add nullValue to test --- frontend/src/lib/types/Model/Model.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/lib/types/Model/Model.test.ts b/frontend/src/lib/types/Model/Model.test.ts index b617996c93..948a9bad94 100644 --- a/frontend/src/lib/types/Model/Model.test.ts +++ b/frontend/src/lib/types/Model/Model.test.ts @@ -71,7 +71,7 @@ describe('Model types', () => { if (timeseriesResult.items.length > 0) { const item = timeseriesResult.items[0]; - const expectedItemKeys = ['value', 'ts', 'label']; + const expectedItemKeys = ['value', 'ts', 'label', 'nullValue']; expect(Object.keys(item)).toEqual(expect.arrayContaining(expectedItemKeys)); // Log a warning if there are additional fields @@ -184,7 +184,7 @@ describe('Model types', () => { if (subItem.points.length > 0) { const point = subItem.points[0]; - const expectedPointKeys = ['value', 'ts', 'label']; + const expectedPointKeys = ['value', 'ts', 'label', 'nullValue']; expect(Object.keys(point)).toEqual(expect.arrayContaining(expectedPointKeys)); // Log a warning if there are additional fields