Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
29354ae
Add radio group component
gjmooney Nov 27, 2025
fb5b3dd
Add Command and Dialog
gjmooney Nov 27, 2025
a82984a
playing
gjmooney Nov 26, 2025
c2451b4
css
gjmooney Nov 28, 2025
4233884
Move to hook
gjmooney Nov 28, 2025
d92b2ad
Compose hooks
gjmooney Dec 1, 2025
b32ca6d
Better names
gjmooney Dec 1, 2025
c1e52d0
Build filter object
gjmooney Dec 1, 2025
3ea5998
Context refactor
gjmooney Dec 1, 2025
dae3903
Added limit; pagination wip
gjmooney Dec 1, 2025
670d3b4
Move where links are saved
gjmooney Dec 2, 2025
4ebe966
Remove placeholder section
gjmooney Dec 2, 2025
94eb08e
Links in context
gjmooney Dec 2, 2025
c1b8373
Might regret
gjmooney Dec 2, 2025
9cf2420
pre moving context update to hook
gjmooney Dec 2, 2025
3a2fc4c
Remove redundant state
gjmooney Dec 4, 2025
40e341e
woooooooooo
gjmooney Dec 4, 2025
3afcee4
Remove debug logs
gjmooney Dec 4, 2025
91551f0
Restore add to map
gjmooney Dec 4, 2025
2e089d3
working mostly
gjmooney Dec 5, 2025
ceef8c1
Move common stuff to generic hook
gjmooney Dec 5, 2025
337509d
Big ole refactor
gjmooney Dec 5, 2025
d3a9fe9
Rename function
gjmooney Dec 8, 2025
c169496
Use ref to build query
gjmooney Dec 8, 2025
9af9cb6
Handle prev and use currentpage in UI
gjmooney Dec 8, 2025
91a63b5
CSS fix
gjmooney Dec 8, 2025
33335ef
Thank god
gjmooney Dec 8, 2025
51f4c1d
Get total pages again
gjmooney Dec 8, 2025
2a07265
comments
gjmooney Dec 9, 2025
d59b349
disable page numebr links
gjmooney Dec 9, 2025
15d2d6c
pagination works??
gjmooney Dec 9, 2025
43bfc00
Accept prev and previous
gjmooney Dec 9, 2025
53b9c0d
Move addToMap to context
gjmooney Dec 9, 2025
fe25f2f
handler comment for later
gjmooney Dec 9, 2025
4e56ab0
refactor execute query
gjmooney Dec 9, 2025
00b639f
paginatio update
gjmooney Dec 9, 2025
28bbb6b
Remove redundant fetch finally
gjmooney Dec 9, 2025
ef6faa3
Lint
gjmooney Dec 10, 2025
bab6c98
Pagination stuff
gjmooney Dec 10, 2025
8d643f2
Clean up
gjmooney Dec 10, 2025
00f7b06
Some css
gjmooney Dec 10, 2025
fd96a2b
Saving filter state but restore this
gjmooney Dec 10, 2025
bb098c7
Move inline styles to css
gjmooney Dec 11, 2025
1b74796
Use border color for borders
gjmooney Dec 11, 2025
99daf06
Still good
gjmooney Dec 11, 2025
bd5879f
Renaming is fun
gjmooney Dec 11, 2025
05985ca
Clean round 1 fin
gjmooney Dec 11, 2025
ecdbd17
Better naming
gjmooney Dec 11, 2025
8ac2535
Use @ imports and remove unused things
gjmooney Dec 12, 2025
c3e27bc
Better typing for queries
gjmooney Dec 12, 2025
04bf7c8
Derive all state from hook
gjmooney Dec 12, 2025
3039a7d
I hate time
gjmooney Dec 12, 2025
75ff305
Ill never stop renaming
gjmooney Dec 12, 2025
8bf356c
Move types where they go
gjmooney Dec 12, 2025
2c26ac8
Format datetime for display
gjmooney Dec 12, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions packages/base/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,10 @@
"@mapbox/vector-tile": "^2.0.3",
"@naisutech/react-tree": "^3.0.1",
"@radix-ui/react-checkbox": "^1.3.2",
"@radix-ui/react-dialog": "^1.1.15",
"@radix-ui/react-dropdown-menu": "^2.1.15",
"@radix-ui/react-popover": "^1.1.14",
"@radix-ui/react-radio-group": "^1.3.8",
"@radix-ui/react-slot": "^1.2.3",
"@radix-ui/react-tabs": "^1.1.12",
"@radix-ui/react-toggle-group": "^1.1.10",
Expand All @@ -75,6 +77,7 @@
"ajv": "^8.14.0",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"cmdk": "^1.1.1",
"colormap": "^2.3.2",
"d3-color": "^3.1.0",
"date-fns": "^4.1.0",
Expand Down
2 changes: 1 addition & 1 deletion packages/base/src/panelview/leftpanel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ import {
TabsList,
TabsTrigger,
} from '../shared/components/Tabs';
import StacPanel from '../stacBrowser/components/StacPanel';
import FilterComponent from './components/filter-panel/Filter';
import StacPanel from '../stacBrowser/components/StacPanel';

export interface ILeftPanelClickHandlerParams {
type: SelectionType;
Expand Down
26 changes: 26 additions & 0 deletions packages/base/src/shared/components/CheckboxWithLabel.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import React from 'react';

import Checkbox from '@/src/shared/components/Checkbox';

interface ICheckboxWithLabelProps {
checked: boolean;
onCheckedChange: (checked: boolean) => void;
label: string;
}

const CheckboxWithLabel: React.FC<ICheckboxWithLabelProps> = ({
checked,
onCheckedChange,
label,
}) => {
return (
<div>
<span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>
<Checkbox checked={checked} onCheckedChange={onCheckedChange} />
{label}
</span>
</div>
);
};

export default CheckboxWithLabel;
182 changes: 182 additions & 0 deletions packages/base/src/shared/components/Command.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,182 @@
import { Command as CommandPrimitive } from 'cmdk';
import { SearchIcon } from 'lucide-react';
import * as React from 'react';

import {
Dialog,
DialogContent,
DialogDescription,
DialogHeader,
DialogTitle,
} from '@/src/shared/components/Dialog';
import { cn } from './utils';

function Command({
className,
...props
}: React.ComponentProps<typeof CommandPrimitive>) {
return (
<CommandPrimitive
data-slot="command"
className={cn(
'bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-md',
className,
)}
{...props}
/>
);
}

function CommandDialog({
title = 'Command Palette',
description = 'Search for a command to run...',
children,
className,
showCloseButton = true,
...props
}: React.ComponentProps<typeof Dialog> & {
title?: string;
description?: string;
className?: string;
showCloseButton?: boolean;
}) {
return (
<Dialog {...props}>
<DialogHeader className="sr-only">
<DialogTitle>{title}</DialogTitle>
<DialogDescription>{description}</DialogDescription>
</DialogHeader>
<DialogContent
className={cn('overflow-hidden p-0', className)}
showCloseButton={showCloseButton}
>
<Command className="[&_[cmdk-group-heading]]:text-muted-foreground **:data-[slot=command-input-wrapper]:h-12 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group]]:px-2 [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5">
{children}
</Command>
</DialogContent>
</Dialog>
);
}

function CommandInput({
className,
...props
}: React.ComponentProps<typeof CommandPrimitive.Input>) {
return (
<div
data-slot="command-input-wrapper"
className="flex h-9 items-center gap-2 border-b px-3"
>
<SearchIcon className="size-4 shrink-0 opacity-50" />
<CommandPrimitive.Input
data-slot="command-input"
className={cn(
'placeholder:text-muted-foreground flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50',
className,
)}
{...props}
/>
</div>
);
}

function CommandList({
className,
...props
}: React.ComponentProps<typeof CommandPrimitive.List>) {
return (
<CommandPrimitive.List
data-slot="command-list"
className={cn(
'max-h-[300px] scroll-py-1 overflow-x-hidden overflow-y-auto',
className,
)}
{...props}
/>
);
}

function CommandEmpty({
...props
}: React.ComponentProps<typeof CommandPrimitive.Empty>) {
return (
<CommandPrimitive.Empty
data-slot="command-empty"
className="py-6 text-center text-sm"
{...props}
/>
);
}

function CommandGroup({
className,
...props
}: React.ComponentProps<typeof CommandPrimitive.Group>) {
return (
<CommandPrimitive.Group
data-slot="command-group"
className={cn(
'text-foreground [&_[cmdk-group-heading]]:text-muted-foreground overflow-hidden p-1 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium',
className,
)}
{...props}
/>
);
}

function CommandSeparator({
className,
...props
}: React.ComponentProps<typeof CommandPrimitive.Separator>) {
return (
<CommandPrimitive.Separator
data-slot="command-separator"
className={cn('bg-border -mx-1 h-px', className)}
{...props}
/>
);
}

function CommandItem({
className,
...props
}: React.ComponentProps<typeof CommandPrimitive.Item>) {
return (
<CommandPrimitive.Item
data-slot="command-item"
className={cn(
"data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
className,
)}
{...props}
/>
);
}

function CommandShortcut({
className,
...props
}: React.ComponentProps<'span'>) {
return (
<span
data-slot="command-shortcut"
className={cn(
'text-muted-foreground ml-auto text-xs tracking-widest',
className,
)}
{...props}
/>
);
}

export {
Command,
CommandDialog,
CommandInput,
CommandList,
CommandEmpty,
CommandGroup,
CommandItem,
CommandShortcut,
CommandSeparator,
};
132 changes: 132 additions & 0 deletions packages/base/src/shared/components/Dialog.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
import * as DialogPrimitive from '@radix-ui/react-dialog';
import { XIcon } from 'lucide-react';
import * as React from 'react';

import { cn } from './utils';

function Dialog({
...props
}: React.ComponentProps<typeof DialogPrimitive.Root>) {
return <DialogPrimitive.Root data-slot="dialog" {...props} />;
}

function DialogTrigger({
...props
}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {
return <DialogPrimitive.Trigger data-slot="dialog-trigger" {...props} />;
}

function DialogPortal({
...props
}: React.ComponentProps<typeof DialogPrimitive.Portal>) {
return <DialogPrimitive.Portal data-slot="dialog-portal" {...props} />;
}

function DialogClose({
...props
}: React.ComponentProps<typeof DialogPrimitive.Close>) {
return <DialogPrimitive.Close data-slot="dialog-close" {...props} />;
}

function DialogOverlay({
className,
...props
}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {
return (
<DialogPrimitive.Overlay
data-slot="dialog-overlay"
className={cn('jgis-dialog-overlay', className)}
{...props}
/>
);
}

function DialogContent({
className,
children,
showCloseButton = true,
...props
}: React.ComponentProps<typeof DialogPrimitive.Content> & {
showCloseButton?: boolean;
}) {
return (
<DialogPortal data-slot="dialog-portal">
<DialogOverlay />
<DialogPrimitive.Content
data-slot="dialog-content"
className={cn('jgis-dialog-content', className)}
{...props}
>
{children}
{showCloseButton && (
<DialogPrimitive.Close
data-slot="dialog-close"
className="jgis-dialog-close"
>
<XIcon />
<span className="jgis-sr-only">Close</span>
</DialogPrimitive.Close>
)}
</DialogPrimitive.Content>
</DialogPortal>
);
}

function DialogHeader({ className, ...props }: React.ComponentProps<'div'>) {
return (
<div
data-slot="dialog-header"
className={cn('jgis-dialog-header', className)}
{...props}
/>
);
}

function DialogFooter({ className, ...props }: React.ComponentProps<'div'>) {
return (
<div
data-slot="dialog-footer"
className={cn('jgis-dialog-footer', className)}
{...props}
/>
);
}

function DialogTitle({
className,
...props
}: React.ComponentProps<typeof DialogPrimitive.Title>) {
return (
<DialogPrimitive.Title
data-slot="dialog-title"
className={cn('jgis-dialog-title', className)}
{...props}
/>
);
}

function DialogDescription({
className,
...props
}: React.ComponentProps<typeof DialogPrimitive.Description>) {
return (
<DialogPrimitive.Description
data-slot="dialog-description"
className={cn('jgis-dialog-description', className)}
{...props}
/>
);
}

export {
Dialog,
DialogClose,
DialogContent,
DialogDescription,
DialogFooter,
DialogHeader,
DialogOverlay,
DialogPortal,
DialogTitle,
DialogTrigger,
};
Loading
Loading