@myrjfa/ui 1.0.7 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"app-sidebar.d.ts","sourceRoot":"","sources":["../../src/dashboard/app-sidebar.tsx"],"names":[],"mappings":"AAoBA,OAAO,EACL,OAAO,EAIR,MAAM,iBAAiB,CAAA;AAGxB,wBAAgB,UAAU,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,OAAO,CAAC,2CA6H5E"}
1
+ {"version":3,"file":"app-sidebar.d.ts","sourceRoot":"","sources":["../../src/dashboard/app-sidebar.tsx"],"names":[],"mappings":"AAsBA,OAAO,EACL,OAAO,EAIR,MAAM,iBAAiB,CAAA;AAGxB,wBAAgB,UAAU,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,OAAO,CAAC,2CA+I5E"}
@@ -57,11 +57,20 @@ var __rest = (this && this.__rest) || function (s, e) {
57
57
  }
58
58
  return t;
59
59
  };
60
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
61
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
62
+ if (ar || !(i in from)) {
63
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
64
+ ar[i] = from[i];
65
+ }
66
+ }
67
+ return to.concat(ar || Array.prototype.slice.call(from));
68
+ };
60
69
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
61
70
  import { logoutUser } from "@myrjfa/state/dist/lib/auth";
62
71
  import { isLoggedInAtom, userAtom, userLoadingAtom } from "@myrjfa/state/dist/lib/userAtom";
63
72
  import { useAtom, useAtomValue, useSetAtom } from "jotai";
64
- import { Bell, HelpCircleIcon, LayoutDashboardIcon, LogOutIcon, User } from "lucide-react";
73
+ import { FileText, HelpCircleIcon, Inbox, LayoutDashboardIcon, LogOutIcon, Package, User } from "lucide-react";
65
74
  import { useRouter } from "next/navigation";
66
75
  import { useEffect } from "react";
67
76
  import { NavMain } from "../dashboard/nav-main";
@@ -87,7 +96,7 @@ export function AppSidebar(_a) {
87
96
  }, [loading, user, router]);
88
97
  // Navigation data
89
98
  var navData = {
90
- navMain: [
99
+ navMain: __spreadArray(__spreadArray(__spreadArray([
91
100
  {
92
101
  title: "Profile",
93
102
  url: user ? "/profile/".concat((_b = user.role) !== null && _b !== void 0 ? _b : "user", "/").concat(user.username) : "#",
@@ -97,13 +106,30 @@ export function AppSidebar(_a) {
97
106
  title: "Dashboard",
98
107
  url: user ? "/overview/".concat((_c = user.role) !== null && _c !== void 0 ? _c : "user") : "#",
99
108
  icon: LayoutDashboardIcon
100
- },
109
+ }
110
+ ], ((user === null || user === void 0 ? void 0 : user.role) === "admin" || (user === null || user === void 0 ? void 0 : user.role) === "host"
111
+ ? [
112
+ {
113
+ title: "My Tours",
114
+ url: "/overview/".concat(user.role, "/packages"),
115
+ icon: Package,
116
+ },
117
+ ]
118
+ : []), true), ((user === null || user === void 0 ? void 0 : user.role) === "admin" || (user === null || user === void 0 ? void 0 : user.role) === "host"
119
+ ? [
120
+ {
121
+ title: "Blogs",
122
+ url: "/overview/".concat(user.role, "/blogs"),
123
+ icon: FileText,
124
+ },
125
+ ]
126
+ : []), true), [
101
127
  {
102
128
  title: "Inbox",
103
129
  url: "/inbox",
104
- icon: Bell
130
+ icon: Inbox
105
131
  },
106
- ],
132
+ ], false),
107
133
  navSecondary: [
108
134
  {
109
135
  title: "Get Help",
@@ -1 +1 @@
1
- {"version":3,"file":"navbar.d.ts","sourceRoot":"","sources":["../../src/main/navbar.tsx"],"names":[],"mappings":"AAmBA,UAAU,WAAW;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAAE,IAAY,EAAE,EAAE,WAAW,2CAoN3D"}
1
+ {"version":3,"file":"navbar.d.ts","sourceRoot":"","sources":["../../src/main/navbar.tsx"],"names":[],"mappings":"AAoBA,UAAU,WAAW;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAAE,IAAY,EAAE,EAAE,WAAW,2CA2P3D"}
@@ -40,8 +40,9 @@ import { Popover, PopoverContent, PopoverTrigger } from "@radix-ui/react-popover
40
40
  import { Separator } from "@radix-ui/react-separator";
41
41
  import { logoutUser } from "@myrjfa/state/dist/lib/auth";
42
42
  import { isLoggedInAtom, userAtom, userLoadingAtom } from "@myrjfa/state/dist/lib/userAtom";
43
+ import { opportunityTypeOptions } from "@myrjfa/state/dist/lib/models/opportunities/opportunity";
43
44
  import { useAtom, useAtomValue } from "jotai";
44
- import { Globe, Heart, LayoutDashboardIcon, Store, Target, Luggage } from "lucide-react";
45
+ import { ChevronDown, Globe, Heart, LayoutDashboardIcon, Store, Target, Luggage } from "lucide-react";
45
46
  import Link from "next/link";
46
47
  import { useRouter } from "next/navigation";
47
48
  import { useEffect, useState } from "react";
@@ -111,7 +112,7 @@ export default function Navbar(_a) {
111
112
  var navItemColor = dark
112
113
  ? "hover:text-white text-gray-250"
113
114
  : "hover:text-foreground text-gray-750";
114
- return (_jsx("header", { className: "fixed top-0 left-0 z-[100] mx-auto transition-all duration-300 w-full ".concat(navbarBg, " ").concat(textColor, " ").concat(navbarBorder), children: _jsxs("div", { className: "mx-auto flex items-center justify-between gap-10 py-4 px-4 lg:px-8", children: [_jsxs(Link, { href: "/", className: "flex items-center gap-3", children: [_jsxs(Avatar, { className: "ml-2 -mr-4.5", children: [_jsx(AvatarImage, { src: "/images/logoicon.webp" }), _jsxs(AvatarFallback, { children: [(currentUser === null || currentUser === void 0 ? void 0 : currentUser.firstName.charAt(0)) || "D", (currentUser === null || currentUser === void 0 ? void 0 : currentUser.lastName.charAt(0)) || "P"] })] }), _jsx("span", { className: "font-heading text-xl font-bold", children: "rippeaze" })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsxs("nav", { className: "hidden md:flex items-center gap-10 justify-end", children: [_jsx(NavItem, { icon: _jsx(Target, { className: "h-5 w-5" }), label: "Opportunities", href: "/opportunities", className: navItemColor }), _jsx(NavItem, { icon: _jsx(Luggage, { className: "h-5 w-5" }), label: "Packages", href: "/packages", className: navItemColor }), _jsx(NavItem, { icon: _jsx(Globe, { className: "h-5 w-5" }), label: "Blogs", href: "/blogs", className: navItemColor }), currentUser ? _jsx(NavItem, { icon: _jsx(Store, { className: "h-5 w-5" }), label: "Become a Partner", href: "/contact", className: navItemColor })
115
+ return (_jsx("header", { className: "fixed top-0 left-0 z-[100] mx-auto transition-all duration-300 w-full ".concat(navbarBg, " ").concat(textColor, " ").concat(navbarBorder), children: _jsxs("div", { className: "mx-auto flex items-center justify-between gap-10 py-4 px-4 lg:px-8", children: [_jsxs(Link, { href: "/", className: "flex items-center gap-3", children: [_jsxs(Avatar, { className: "ml-2 -mr-4.5", children: [_jsx(AvatarImage, { src: "/images/logoicon.webp" }), _jsxs(AvatarFallback, { children: [(currentUser === null || currentUser === void 0 ? void 0 : currentUser.firstName.charAt(0)) || "D", (currentUser === null || currentUser === void 0 ? void 0 : currentUser.lastName.charAt(0)) || "P"] })] }), _jsx("span", { className: "font-heading text-xl font-bold", children: "rippeaze" })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsxs("nav", { className: "hidden md:flex items-center gap-10 justify-end", children: [_jsxs(Popover, { children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs("button", { className: "flex items-center gap-1 text-sm font-medium cursor-pointer ".concat(navItemColor), children: [_jsx(Target, { className: "h-5 w-5" }), _jsx("span", { children: "Opportunities" }), _jsx(ChevronDown, { className: "h-4 w-4" })] }) }), _jsx(PopoverContent, { className: "w-56 p-2 mt-3 bg-white rounded-lg shadow-lg border", align: "start", sideOffset: 5, children: _jsx("div", { className: "flex flex-col", children: opportunityTypeOptions.map(function (opt) { return (_jsxs(Link, { href: "/opportunities?type=".concat(opt.value), className: "px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 rounded-md flex flex-col", children: [_jsx("span", { className: "font-medium", children: opt.label }), _jsx("span", { className: "text-xs text-gray-500", children: opt.description })] }, opt.value)); }) }) })] }), _jsx(NavItem, { icon: _jsx(Luggage, { className: "h-5 w-5" }), label: "Packages", href: "/packages", className: navItemColor }), _jsx(NavItem, { icon: _jsx(Globe, { className: "h-5 w-5" }), label: "Blogs", href: "/blogs", className: navItemColor }), currentUser ? _jsx(NavItem, { icon: _jsx(Store, { className: "h-5 w-5" }), label: "Become a Partner", href: "/contact", className: navItemColor })
115
116
  : _jsx(NavItem, { icon: _jsx(Store, { className: "h-5 w-5" }), label: "Register as Business", href: "/auth/register?role=host", className: navItemColor }), isLoggedIn && _jsx(NotificationBell, { id: (_b = currentUser === null || currentUser === void 0 ? void 0 : currentUser.username) !== null && _b !== void 0 ? _b : null, navItemColor: navItemColor })] }), _jsx("div", { className: "hidden md:flex items-center gap-2", children: _jsxs(Popover, { children: [_jsx(PopoverTrigger, { asChild: true, children: _jsx(Button, { variant: "link", className: "flex w-full gap-1 cursor-pointer", children: _jsxs(Avatar, { className: "ml-5 mr-4.5", children: [_jsx(AvatarImage, { src: (_c = currentUser === null || currentUser === void 0 ? void 0 : currentUser.profilePic) !== null && _c !== void 0 ? _c : "/images/profile_placeholder.webp" }), _jsxs(AvatarFallback, { children: [(currentUser === null || currentUser === void 0 ? void 0 : currentUser.firstName.charAt(0)) || "D", (currentUser === null || currentUser === void 0 ? void 0 : currentUser.lastName.charAt(0)) || "P"] })] }) }) }), _jsx(PopoverContent, { className: "w-full p-0 mt-3 bg-".concat(dark ? "primary" : "white", " rounded-lg shadow-lg"), align: "end", sideOffset: 5, children: _jsxs("div", { className: "py-2 w-full", children: [_jsxs("div", { className: "px-4 py-3 border-b w-full", children: [_jsx("p", { className: "text-sm font-medium", children: (currentUser === null || currentUser === void 0 ? void 0 : currentUser.username) || "Guest" }), _jsx("p", { className: "text-xs text-gray-500", children: (currentUser === null || currentUser === void 0 ? void 0 : currentUser.email) || "user@example.com" })] }), _jsxs("div", { className: "flex flex-col", children: [isLoggedIn ?
116
117
  _jsxs(Link, { href: "/profile/".concat((currentUser === null || currentUser === void 0 ? void 0 : currentUser.role) || "user", "/").concat((currentUser === null || currentUser === void 0 ? void 0 : currentUser.username) || "Guest"), className: "w-full py-2 px-4 text-sm text-gray-700 hover:bg-gray-100 flex items-center gap-2", children: [_jsxs(Avatar, { className: "w-4 h-4", children: [_jsx(AvatarImage, { src: (_d = currentUser === null || currentUser === void 0 ? void 0 : currentUser.profilePic) !== null && _d !== void 0 ? _d : "/images/profile_placeholder.webp" }), _jsx(AvatarFallback, { children: "U" })] }), "Profile"] }) :
117
118
  _jsxs(Button, { variant: "ghost", onClick: function () { return router.push('/auth/login?role=user'); }, className: "w-full py-2 px-4 text-sm text-gray-700 hover:bg-gray-100 flex items-center gap-2 justify-start", children: [_jsxs(Avatar, { className: "w-4 h-4", children: [_jsx(AvatarImage, { src: "/images/profile_placeholder.webp" }), _jsx(AvatarFallback, { children: "U" })] }), "Login As Volunteer"] }), isLoggedIn && _jsxs(Link, { href: "/overview/".concat((currentUser === null || currentUser === void 0 ? void 0 : currentUser.role) || 'user'), className: "w-full py-2 px-4 text-sm text-gray-700 hover:bg-gray-100 flex items-center gap-2", children: [_jsx(LayoutDashboardIcon, { className: "h-4 w-4" }), "Dashboard"] }), isLoggedIn && ((currentUser === null || currentUser === void 0 ? void 0 : currentUser.role) === "user" || (currentUser === null || currentUser === void 0 ? void 0 : currentUser.role) == null) &&
@@ -144,7 +145,7 @@ export default function Navbar(_a) {
144
145
  });
145
146
  }); }, className: "w-full py-2 px-4 text-sm text-gray-700 hover:bg-gray-100 flex items-center gap-2 justify-start", children: [_jsxs(Avatar, { className: "w-4 h-4", children: [_jsx(AvatarImage, { src: "/images/profile_placeholder.webp" }), _jsx(AvatarFallback, { children: "H" })] }), "Login As Business"] }), _jsx(Separator, { className: "my-1" }), isLoggedIn && _jsx(Button, { variant: "outline", className: "py-2 mx-2 text-sm text-gray-700 hover:bg-gray-100 justify-center cursor-pointer", onClick: function () {
146
147
  logout();
147
- }, children: "Sign out" })] })] }) })] }) })] }), _jsx(MobileNavbar, { children: _jsx("div", { className: "rounded-b-lg py-4 px-4 shadow-xl ".concat("bg-background", " ").concat(textColor), children: _jsxs("nav", { className: "flex flex-col gap-1 pt-2", children: [_jsx(MobileNavItem, { icon: _jsx(Target, { className: "h-5 w-5" }), label: "Opportunities", href: "/opportunities" }), _jsx(MobileNavItem, { icon: _jsx(Luggage, { className: "h-5 w-5" }), label: "Packages", href: "/packages" }), _jsx(MobileNavItem, { icon: _jsx(Globe, { className: "h-5 w-5" }), label: "Blogs", href: "/blogs" }), currentUser ? _jsx(MobileNavItem, { icon: _jsx(Store, { className: "h-5 w-5" }), label: "Become a Partner", href: "/contact" }) :
148
+ }, children: "Sign out" })] })] }) })] }) })] }), _jsx(MobileNavbar, { children: _jsx("div", { className: "rounded-b-lg py-4 px-4 shadow-xl ".concat("bg-background", " ").concat(textColor), children: _jsxs("nav", { className: "flex flex-col gap-1 pt-2", children: [_jsxs("div", { className: "flex flex-col", children: [_jsxs("div", { className: "flex items-center gap-2 py-2 px-2 text-muted-foreground", children: [_jsx(Target, { className: "h-5 w-5" }), _jsx("span", { className: "text-sm font-medium", children: "Opportunities" })] }), _jsx("div", { className: "pl-8 flex flex-col gap-1", children: opportunityTypeOptions.map(function (opt) { return (_jsx(Link, { href: "/opportunities?type=".concat(opt.value), className: "py-1.5 px-2 text-sm text-gray-600 hover:text-foreground hover:bg-gray-100 rounded", children: opt.label }, opt.value)); }) })] }), _jsx(MobileNavItem, { icon: _jsx(Luggage, { className: "h-5 w-5" }), label: "Packages", href: "/packages" }), _jsx(MobileNavItem, { icon: _jsx(Globe, { className: "h-5 w-5" }), label: "Blogs", href: "/blogs" }), currentUser ? _jsx(MobileNavItem, { icon: _jsx(Store, { className: "h-5 w-5" }), label: "Become a Partner", href: "/contact" }) :
148
149
  _jsx(MobileNavItem, { icon: _jsx(Store, { className: "h-5 w-5" }), label: "Register as Business", href: "/auth/register?role=host" }), isLoggedIn && _jsx(MobileNotificationBell, {}), isLoggedIn && _jsx(MobileNavItem, { icon: _jsx(LayoutDashboardIcon, { className: "h-5 w-5" }), label: "Dashboard", href: "/overview/".concat((currentUser === null || currentUser === void 0 ? void 0 : currentUser.role) || 'user'), className: "md:hidden" }), isLoggedIn && ((currentUser === null || currentUser === void 0 ? void 0 : currentUser.role) === "user" || (currentUser === null || currentUser === void 0 ? void 0 : currentUser.role) == null) &&
149
150
  _jsx(MobileNavItem, { icon: _jsx(Heart, { className: "h-5 w-5" }), label: "Favourites", href: "/opportunities/favourites", className: "md:hidden" }), isLoggedIn ? _jsxs(Link, { href: "/profile/".concat((currentUser === null || currentUser === void 0 ? void 0 : currentUser.role) || "user", "/").concat((currentUser === null || currentUser === void 0 ? void 0 : currentUser.username) || "Guest"), className: "flex w-full gap-1 cursor-pointer my-2", children: [_jsxs(Avatar, { className: "w-5 h-5 ml-2", children: [_jsx(AvatarImage, { src: (currentUser === null || currentUser === void 0 ? void 0 : currentUser.profilePic) || "/images/profile_placeholder.webp" }), _jsx(AvatarFallback, { children: "DP" })] }), _jsx(Label, { htmlFor: "username", className: "cursor-pointer text-muted-foreground hover:text-foreground", children: (currentUser === null || currentUser === void 0 ? void 0 : currentUser.username) || "Guest" })] }) :
150
151
  _jsxs(Link, { href: "/auth/login", className: "flex w-full gap-1 cursor-pointer my-2", children: [_jsxs(Avatar, { className: "w-5 h-5 ml-2", children: [_jsx(AvatarImage, { src: "/images/profile_placeholder.webp" }), _jsx(AvatarFallback, { children: "U" })] }), _jsx(Label, { htmlFor: "username", className: "cursor-pointer text-muted-foreground hover:text-foreground", children: "Login As Volunteer" })] }), (currentUser === null || currentUser === void 0 ? void 0 : currentUser.role) === "host" ?
@@ -1,5 +1,31 @@
1
1
  import { TileProps } from "@myrjfa/state/dist/lib/models/tile";
2
- export default function FilterBar({ tiles }: {
2
+ export interface FilterOptionConfig {
3
+ label: string;
4
+ type: 'autoComplete' | 'select' | 'range';
5
+ datatype: 'string[]' | 'number' | 'string' | 'range';
6
+ displayName: string;
7
+ options?: readonly {
8
+ value: string;
9
+ label: string;
10
+ description?: string;
11
+ }[];
12
+ rangeUnit?: string;
13
+ rangeMin?: number;
14
+ rangeMax?: number;
15
+ rangeStep?: number;
16
+ rangeInputType?: 'slider' | 'number';
17
+ defaultValue?: string | number | string[] | {
18
+ min: number;
19
+ max: number;
20
+ };
21
+ deriveFromTiles?: keyof TileProps;
22
+ visibility?: 'bar' | 'expanded';
23
+ showForTypes?: string[];
24
+ groupWith?: string;
25
+ }
26
+ export interface FilterBarProps {
3
27
  tiles: TileProps[];
4
- }): import("react/jsx-runtime").JSX.Element;
28
+ filterConfig?: FilterOptionConfig[];
29
+ }
30
+ export default function FilterBar({ tiles, filterConfig }: FilterBarProps): import("react/jsx-runtime").JSX.Element;
5
31
  //# sourceMappingURL=filterBar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"filterBar.d.ts","sourceRoot":"","sources":["../../src/misc/filterBar.tsx"],"names":[],"mappings":"AASA,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAgT/D,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,SAAS,EAAE,CAAA;CAAE,2CAMlE"}
1
+ {"version":3,"file":"filterBar.d.ts","sourceRoot":"","sources":["../../src/misc/filterBar.tsx"],"names":[],"mappings":"AASA,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAK/D,MAAM,WAAW,kBAAkB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,cAAc,GAAG,QAAQ,GAAG,OAAO,CAAC;IAC1C,QAAQ,EAAE,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IACrD,WAAW,EAAE,MAAM,CAAC;IAEpB,OAAO,CAAC,EAAE,SAAS;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAE5E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAErC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAEzE,eAAe,CAAC,EAAE,MAAM,SAAS,CAAC;IAElC,UAAU,CAAC,EAAE,KAAK,GAAG,UAAU,CAAC;IAEhC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAExB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC3B,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,YAAY,CAAC,EAAE,kBAAkB,EAAE,CAAC;CACvC;AA+eD,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,cAAc,2CAMxE"}
@@ -27,78 +27,142 @@ import { Suspense, useEffect, useState } from "react";
27
27
  import { Button } from "./button";
28
28
  import Filter from "./filter";
29
29
  import { Sheet, SheetContent, SheetTitle, SheetTrigger } from "./sheet";
30
- var filterOptions = [
31
- { label: "destination", type: "autoComplete", datatype: "string[]", displayName: "Destination" },
32
- { label: "skill", type: "autoComplete", datatype: "string[]", displayName: "Skills" },
33
- { label: "rating", type: "select", datatype: "number", displayName: "Rating" },
30
+ import { Slider } from "./slider";
31
+ // Default filter options (backward compatible)
32
+ var defaultFilterOptions = [
33
+ { label: "destination", type: "autoComplete", datatype: "string[]", displayName: "Destination", deriveFromTiles: 'location', visibility: 'bar' },
34
+ { label: "skill", type: "autoComplete", datatype: "string[]", displayName: "Skills", deriveFromTiles: 'skills', visibility: 'bar' },
35
+ { label: "rating", type: "select", datatype: "number", displayName: "Rating", visibility: 'expanded' },
34
36
  ];
35
37
  function FilterBarComponent(_a) {
36
- var tiles = _a.tiles;
38
+ var tiles = _a.tiles, _b = _a.filterConfig, filterConfig = _b === void 0 ? defaultFilterOptions : _b;
37
39
  var searchParams = useSearchParams();
38
- var newParams = new URLSearchParams(searchParams);
39
40
  var pathname = usePathname();
40
41
  var router = useRouter();
41
- var _b = useState({
42
- destination: [],
43
- rating: 0,
44
- skill: [],
45
- category: [],
46
- hostRating: 0
47
- }), filterParam = _b[0], setFilterParam = _b[1];
42
+ // Initialize filter state from config
43
+ var getInitialFilterState = function () {
44
+ var state = {};
45
+ filterConfig.forEach(function (opt) {
46
+ if (opt.datatype === 'string[]') {
47
+ state[opt.label] = opt.defaultValue || [];
48
+ }
49
+ else if (opt.datatype === 'number') {
50
+ state[opt.label] = opt.defaultValue || 0;
51
+ }
52
+ else if (opt.datatype === 'range') {
53
+ state[opt.label] = opt.defaultValue || { min: 0, max: 100 };
54
+ }
55
+ else {
56
+ state[opt.label] = opt.defaultValue || '';
57
+ }
58
+ });
59
+ return state;
60
+ };
61
+ var _c = useState(getInitialFilterState), filterParam = _c[0], setFilterParam = _c[1];
48
62
  useEffect(function () {
49
- var _a, _b, _c;
50
- var destination = ((_a = searchParams.get("destination")) === null || _a === void 0 ? void 0 : _a.split(',')) || [];
51
- var rating = parseInt(searchParams.get("rating") || "0", 10);
52
- var skill = ((_b = searchParams.get("skill")) === null || _b === void 0 ? void 0 : _b.split(',')) || [];
53
- var category = ((_c = searchParams.get("category")) === null || _c === void 0 ? void 0 : _c.split(',')) || [];
54
- var hostRating = parseInt(searchParams.get("hostRating") || "0", 10);
55
- setFilterParam({
56
- destination: destination,
57
- rating: rating,
58
- skill: skill,
59
- category: category,
60
- hostRating: hostRating,
63
+ var newState = {};
64
+ filterConfig.forEach(function (opt) {
65
+ var param = searchParams.get(opt.label);
66
+ if (opt.datatype === 'string[]') {
67
+ newState[opt.label] = (param === null || param === void 0 ? void 0 : param.split(',').filter(Boolean)) || opt.defaultValue || [];
68
+ }
69
+ else if (opt.datatype === 'number') {
70
+ newState[opt.label] = parseInt(param || "0", 10) || opt.defaultValue || 0;
71
+ }
72
+ else if (opt.datatype === 'range') {
73
+ var minParam = searchParams.get("".concat(opt.label, "Min"));
74
+ var maxParam = searchParams.get("".concat(opt.label, "Max"));
75
+ var defaultRange = opt.defaultValue || { min: 0, max: 100 };
76
+ newState[opt.label] = {
77
+ min: minParam ? parseInt(minParam, 10) : defaultRange.min,
78
+ max: maxParam ? parseInt(maxParam, 10) : defaultRange.max
79
+ };
80
+ }
81
+ else {
82
+ newState[opt.label] = param || opt.defaultValue || '';
83
+ }
61
84
  });
62
- }, [searchParams]);
85
+ setFilterParam(newState);
86
+ }, [searchParams, filterConfig]);
63
87
  var changeMultiParams = function (params) {
88
+ var newParams = new URLSearchParams(searchParams);
64
89
  newParams.set('page', '1');
65
90
  Object.entries(params).forEach(function (_a) {
66
91
  var key = _a[0], value = _a[1];
67
- if (Array.isArray(value) && value.length > 0) {
92
+ if (typeof value === 'object' && 'min' in value && 'max' in value) {
93
+ // Range type - only set if different from default
94
+ var config = filterConfig.find(function (f) { return f.label === key; });
95
+ var defaultRange = (config === null || config === void 0 ? void 0 : config.defaultValue) || { min: 0, max: 100 };
96
+ if (value.min !== defaultRange.min || value.max !== defaultRange.max) {
97
+ newParams.set("".concat(key, "Min"), value.min.toString());
98
+ newParams.set("".concat(key, "Max"), value.max.toString());
99
+ }
100
+ else {
101
+ newParams.delete("".concat(key, "Min"));
102
+ newParams.delete("".concat(key, "Max"));
103
+ }
104
+ }
105
+ else if (Array.isArray(value) && value.length > 0) {
68
106
  newParams.set(key, value.join(','));
69
107
  }
70
- else if (value !== undefined && value !== null && value !== '' && value !== 0 && Array.isArray(value) === false) {
108
+ else if (value !== undefined && value !== null && value !== '' && value !== 0 && !Array.isArray(value)) {
71
109
  newParams.set(key, value.toString());
72
110
  }
73
111
  else {
74
112
  newParams.delete(key);
113
+ newParams.delete("".concat(key, "Min"));
114
+ newParams.delete("".concat(key, "Max"));
75
115
  }
76
116
  });
77
117
  router.replace("".concat(pathname, "?").concat(newParams.toString()));
78
- return newParams;
79
118
  };
80
- var filterMap = {
81
- destination: (tiles !== null && tiles !== void 0 ? tiles : []).map(function (tile) { return [retrieveState((tile === null || tile === void 0 ? void 0 : tile.location) || ''), retrieveCity((tile === null || tile === void 0 ? void 0 : tile.location) || '')]; }).flat(),
82
- skill: (tiles !== null && tiles !== void 0 ? tiles : []).flatMap(function (tile) { return tile.skills || []; }),
83
- rating: ["1 star and above", "2 star and above", "3 star and above", "4 star and above", "5 star only"],
119
+ // Get filter values based on config
120
+ var getFilterValues = function (opt) {
121
+ if (opt.deriveFromTiles === 'opportunityType' && opt.options) {
122
+ // For opportunityType, dynamically filter options based on what types exist in tiles
123
+ var availableTypes_1 = new Set((tiles !== null && tiles !== void 0 ? tiles : []).map(function (tile) { return tile.opportunityType || 'volunteer'; }));
124
+ return opt.options
125
+ .filter(function (o) { return availableTypes_1.has(o.value); })
126
+ .map(function (o) { return o.label; });
127
+ }
128
+ if (opt.options) {
129
+ return opt.options.map(function (o) { return o.label; });
130
+ }
131
+ if (opt.deriveFromTiles === 'location') {
132
+ return Array.from(new Set((tiles !== null && tiles !== void 0 ? tiles : []).map(function (tile) { return [retrieveState((tile === null || tile === void 0 ? void 0 : tile.location) || ''), retrieveCity((tile === null || tile === void 0 ? void 0 : tile.location) || '')]; }).flat().filter(Boolean)));
133
+ }
134
+ if (opt.deriveFromTiles === 'skills') {
135
+ return Array.from(new Set((tiles !== null && tiles !== void 0 ? tiles : []).flatMap(function (tile) { return tile.skills || []; })));
136
+ }
137
+ if (opt.label === 'rating') {
138
+ return ["1 star and above", "2 star and above", "3 star and above", "4 star and above", "5 star only"];
139
+ }
140
+ return tiles.map(function (tile) { return tile["".concat(opt.deriveFromTiles)]; });
84
141
  };
85
- var handleFilterChange = function (label, value, datatype) {
142
+ var handleFilterChange = function (label, value, datatype, options) {
86
143
  if (value === null || value === "clear") {
144
+ var config_1 = filterConfig.find(function (f) { return f.label === label; });
87
145
  setFilterParam(function (prev) {
88
146
  var _a;
89
- return (__assign(__assign({}, prev), (_a = {}, _a[label] = datatype.includes('[]') ? [] : (datatype === 'number' ? 0 : ''), _a)));
147
+ return (__assign(__assign({}, prev), (_a = {}, _a[label] = datatype.includes('[]') ? [] : (datatype === 'number' ? 0 : ((config_1 === null || config_1 === void 0 ? void 0 : config_1.defaultValue) || '')), _a)));
90
148
  });
91
149
  return;
92
150
  }
151
+ // For select with options, convert label to value
152
+ var actualValue = value;
153
+ if (options) {
154
+ var opt = options.find(function (o) { return o.label === value; });
155
+ if (opt)
156
+ actualValue = opt.value;
157
+ }
93
158
  setFilterParam(function (prev) {
94
159
  var _a, _b;
95
160
  var currentValues = prev[label];
96
- var newValue = datatype === 'number' ? Number(value[0]) : value;
161
+ var newValue = datatype === 'number' ? Number(value[0]) : actualValue;
97
162
  if (currentValues == newValue || (Array.isArray(currentValues) && currentValues.includes(newValue))) {
98
163
  return prev;
99
164
  }
100
165
  else if (Array.isArray(currentValues)) {
101
- // Add if not selected
102
166
  return __assign(__assign({}, prev), (_a = {}, _a[label] = __spreadArray(__spreadArray([], currentValues, true), [newValue], false), _a));
103
167
  }
104
168
  else {
@@ -106,91 +170,184 @@ function FilterBarComponent(_a) {
106
170
  }
107
171
  });
108
172
  };
109
- var removeFilter = function (label, value) {
173
+ var handleRangeChange = function (label, field, value) {
110
174
  setFilterParam(function (prev) {
111
- var _a;
112
- return (__assign(__assign({}, prev), (_a = {}, _a[label] = Array.isArray(prev[label])
113
- ? prev[label].filter(function (v) { return v !== value; })
114
- : prev[label] === value ? 0 : '', _a)));
175
+ var _a, _b;
176
+ var current = prev[label];
177
+ return __assign(__assign({}, prev), (_a = {}, _a[label] = __assign(__assign({}, current), (_b = {}, _b[field] = value, _b)), _a));
178
+ });
179
+ };
180
+ var removeFilter = function (label, value) {
181
+ var config = filterConfig.find(function (f) { return f.label === label; });
182
+ if ((config === null || config === void 0 ? void 0 : config.datatype) === 'range') {
183
+ // Reset range to default
184
+ var defaultRange_1 = config.defaultValue || { min: 0, max: 100 };
185
+ setFilterParam(function (prev) {
186
+ var _a;
187
+ return (__assign(__assign({}, prev), (_a = {}, _a[label] = defaultRange_1, _a)));
188
+ });
189
+ }
190
+ else {
191
+ setFilterParam(function (prev) {
192
+ var _a;
193
+ return (__assign(__assign({}, prev), (_a = {}, _a[label] = Array.isArray(prev[label])
194
+ ? prev[label].filter(function (v) { return v !== value; })
195
+ : prev[label] === value ? 0 : ((config === null || config === void 0 ? void 0 : config.defaultValue) || ''), _a)));
196
+ });
197
+ }
198
+ };
199
+ var _d = useState(false), sheetOpen = _d[0], setSheetOpen = _d[1];
200
+ // Get current opportunity type for conditional filters
201
+ var currentType = filterParam['type'] || 'volunteer';
202
+ // Filter configs based on showForTypes
203
+ var getVisibleConfigs = function (configs) {
204
+ return configs.filter(function (opt) {
205
+ if (!opt.showForTypes || opt.showForTypes.length === 0)
206
+ return true;
207
+ return opt.showForTypes.includes(currentType);
115
208
  });
116
209
  };
117
- var _c = useState(false), sheetOpen = _c[0], setSheetOpen = _c[1];
118
210
  var getActiveFilters = function () {
119
211
  var filters = [];
120
212
  Object.entries(filterParam).forEach(function (_a) {
121
213
  var key = _a[0], values = _a[1];
122
- if (Array.isArray(values) && values.length > 0) {
123
- var option_1 = filterOptions.find(function (opt) { return opt.label === key; });
124
- if (option_1) {
125
- values.forEach(function (value) {
126
- filters.push({
127
- label: key,
128
- value: value,
129
- displayName: option_1.displayName
130
- });
131
- });
132
- }
133
- }
134
- else if (!Array.isArray(values) && values !== 0) {
135
- var option = filterOptions.find(function (opt) { return opt.label === key; });
136
- if (option && values) {
214
+ var opt = filterConfig.find(function (o) { return o.label === key; });
215
+ if (!opt)
216
+ return;
217
+ if (typeof values === 'object' && 'min' in values && 'max' in values) {
218
+ // Range filter
219
+ var defaultRange = opt.defaultValue || { min: 0, max: 100 };
220
+ if (values.min !== defaultRange.min || values.max !== defaultRange.max) {
137
221
  filters.push({
138
222
  label: key,
139
- value: values,
140
- displayName: option.displayName
223
+ value: "".concat(values.min, "-").concat(values.max, " ").concat(opt.rangeUnit || ''),
224
+ displayName: opt.displayName,
225
+ isRange: true
141
226
  });
142
227
  }
143
228
  }
229
+ else if (Array.isArray(values) && values.length > 0) {
230
+ values.forEach(function (value) {
231
+ filters.push({ label: key, value: value, displayName: opt.displayName });
232
+ });
233
+ }
234
+ else if (!Array.isArray(values) && values !== 0 && values !== '' && values !== opt.defaultValue) {
235
+ // For select with options, show label not value
236
+ var displayValue = values;
237
+ if (opt.options) {
238
+ var found = opt.options.find(function (o) { return o.value === values; });
239
+ if (found)
240
+ displayValue = found.label;
241
+ }
242
+ filters.push({ label: key, value: displayValue, displayName: opt.displayName });
243
+ }
144
244
  });
145
245
  return filters;
146
246
  };
147
247
  var activeFilters = getActiveFilters();
148
248
  var clearAllFilters = function () {
149
- var clearedParams = {
150
- destination: [],
151
- rating: 0,
152
- skill: [],
153
- category: [],
154
- hostRating: 0
155
- };
249
+ var clearedParams = getInitialFilterState();
156
250
  setFilterParam(clearedParams);
157
251
  changeMultiParams(clearedParams);
158
252
  setSheetOpen(false);
159
253
  };
160
- return (_jsxs("div", { className: "w-4/5 max-w-5xl mx-auto", children: [_jsxs("div", { className: "items-center w-full bg-background shadow-md rounded-full px-4 py-3 md:py-2 flex", children: [filterOptions.slice(0, 3).map(function (_a) {
161
- var _b;
162
- var label = _a.label, type = _a.type, datatype = _a.datatype, displayName = _a.displayName;
163
- return (_jsxs("div", { className: "items-center flex-1 hidden md:flex", children: [_jsx("div", { className: "w-full", children: _jsx(Filter, { label: label, formType: type, selectedValue: datatype.includes('[]')
164
- ? filterParam[label].length > 0
165
- ? "".concat(filterParam[label].length, " selected")
166
- : ''
167
- : ((_b = filterParam[label]) === null || _b === void 0 ? void 0 : _b.toString()) + ' star or more', values: filterMap[label], onChange: function (value) { return handleFilterChange(label, value, datatype); } }) }), _jsx("div", { className: "h-6 w-px bg-gray-300 mx-4 md:h-8" })] }, label));
168
- }), _jsxs(Sheet, { open: sheetOpen, onOpenChange: setSheetOpen, children: [_jsx(SheetTrigger, { asChild: true, children: _jsxs("button", { className: "flex items-center gap-2 text-sm text-gray-600 cursor-pointer m-auto relative", children: [_jsx(SlidersHorizontal, { size: 16, className: "hidden md:block" }), _jsx(SearchIcon, { size: 16, className: "md:hidden" }), _jsx("div", { className: "md:hidden", children: "Start search..." })] }) }), _jsxs(SheetContent, { side: "top", className: "w-full p-8 z-200 md:items-center", children: [_jsx(SheetTitle, { className: "text-lg font-semibold mb-4", children: "Filters" }), _jsx("div", { className: "space-y-6 md:w-3/5", children: filterOptions.map(function (_a) {
169
- var _b;
170
- var label = _a.label, type = _a.type, datatype = _a.datatype, displayName = _a.displayName;
171
- return (_jsxs("div", { className: "space-y-2", children: [_jsx("label", { className: "text-sm font-medium text-gray-700", children: displayName }), _jsx("div", { className: "bg-gray-50 rounded-lg p-3", children: _jsx(Filter, { label: label, formType: type, selectedValue: datatype.includes('[]')
172
- ? filterParam[label].length > 0
173
- ? "".concat(filterParam[label].length, " selected")
174
- : ''
175
- : ((_b = filterParam[label]) === null || _b === void 0 ? void 0 : _b.toString()) + ' star or more', values: filterMap[label], onChange: function (value) { return handleFilterChange(label, value, datatype); } }) })] }, label));
254
+ var renderFilterInput = function (opt) {
255
+ var _a, _b, _c, _d, _e, _f, _g;
256
+ if (opt.type === 'range') {
257
+ var rangeValue = filterParam[opt.label];
258
+ var defaultRange = opt.defaultValue || { min: 0, max: 100 };
259
+ var minVal_1 = (_a = opt.rangeMin) !== null && _a !== void 0 ? _a : defaultRange.min;
260
+ var maxVal_1 = (_b = opt.rangeMax) !== null && _b !== void 0 ? _b : defaultRange.max;
261
+ var step = (_c = opt.rangeStep) !== null && _c !== void 0 ? _c : 1;
262
+ // Number inputs mode
263
+ if (opt.rangeInputType === 'number') {
264
+ // Inline style to hide number input spinners
265
+ var noSpinnerStyle = {
266
+ MozAppearance: 'textfield',
267
+ WebkitAppearance: 'none',
268
+ appearance: 'textfield'
269
+ };
270
+ return (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("input", { type: "number", placeholder: "Min", value: (rangeValue === null || rangeValue === void 0 ? void 0 : rangeValue.min) === undefined || (rangeValue === null || rangeValue === void 0 ? void 0 : rangeValue.min) === null || Number.isNaN(rangeValue === null || rangeValue === void 0 ? void 0 : rangeValue.min) ? '' : rangeValue.min, min: minVal_1, max: maxVal_1, onChange: function (e) {
271
+ var inputVal = e.target.value;
272
+ var val = inputVal === '' ? NaN : parseInt(inputVal);
273
+ setFilterParam(function (prev) {
274
+ var _a;
275
+ return (__assign(__assign({}, prev), (_a = {}, _a[opt.label] = __assign(__assign({}, prev[opt.label]), { min: val }), _a)));
276
+ });
277
+ }, onWheel: function (e) { return e.currentTarget.blur(); }, style: noSpinnerStyle, className: "w-20 px-2 py-1 border rounded text-sm [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none" }), _jsx("span", { className: "text-gray-500", children: "to" }), _jsx("input", { type: "number", placeholder: "Max", value: (rangeValue === null || rangeValue === void 0 ? void 0 : rangeValue.max) === undefined || (rangeValue === null || rangeValue === void 0 ? void 0 : rangeValue.max) === null || Number.isNaN(rangeValue === null || rangeValue === void 0 ? void 0 : rangeValue.max) ? '' : rangeValue.max, min: minVal_1, max: maxVal_1, onChange: function (e) {
278
+ var inputVal = e.target.value;
279
+ var val = inputVal === '' ? NaN : parseInt(inputVal);
280
+ setFilterParam(function (prev) {
281
+ var _a;
282
+ return (__assign(__assign({}, prev), (_a = {}, _a[opt.label] = __assign(__assign({}, prev[opt.label]), { max: val }), _a)));
283
+ });
284
+ }, onWheel: function (e) { return e.currentTarget.blur(); }, style: noSpinnerStyle, className: "w-20 px-2 py-1 border rounded text-sm [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none" }), opt.rangeUnit && _jsx("span", { className: "text-sm text-gray-500", children: opt.rangeUnit })] }));
285
+ }
286
+ // Slider mode (default)
287
+ return (_jsxs("div", { className: "flex flex-col gap-2 w-full", children: [_jsxs("div", { className: "flex justify-between text-sm text-gray-600", children: [_jsxs("span", { children: [(_d = rangeValue === null || rangeValue === void 0 ? void 0 : rangeValue.min) !== null && _d !== void 0 ? _d : minVal_1, " ", opt.rangeUnit] }), _jsxs("span", { children: [(_e = rangeValue === null || rangeValue === void 0 ? void 0 : rangeValue.max) !== null && _e !== void 0 ? _e : maxVal_1, " ", opt.rangeUnit] })] }), _jsx(Slider, { min: minVal_1, max: maxVal_1, step: step, value: [(_f = rangeValue === null || rangeValue === void 0 ? void 0 : rangeValue.min) !== null && _f !== void 0 ? _f : minVal_1, (_g = rangeValue === null || rangeValue === void 0 ? void 0 : rangeValue.max) !== null && _g !== void 0 ? _g : maxVal_1], onValueChange: function (values) {
288
+ setFilterParam(function (prev) {
289
+ var _a;
290
+ var _b, _c;
291
+ return (__assign(__assign({}, prev), (_a = {}, _a[opt.label] = { min: (_b = values[0]) !== null && _b !== void 0 ? _b : minVal_1, max: (_c = values[1]) !== null && _c !== void 0 ? _c : maxVal_1 }, _a)));
292
+ });
293
+ }, className: "w-full" })] }));
294
+ }
295
+ var selectedValue = (function () {
296
+ var val = filterParam[opt.label];
297
+ if (opt.datatype.includes('[]')) {
298
+ var arr = val;
299
+ return arr.length > 0 ? "".concat(arr.length, " selected") : '';
300
+ }
301
+ if (opt.datatype === 'number') {
302
+ return val ? "".concat(val, " star or more") : '';
303
+ }
304
+ // For select type, show label not value
305
+ if (opt.options && val) {
306
+ var found = opt.options.find(function (o) { return o.value === val; });
307
+ return (found === null || found === void 0 ? void 0 : found.label) || val.toString();
308
+ }
309
+ return (val === null || val === void 0 ? void 0 : val.toString()) || '';
310
+ })();
311
+ return (_jsx(Filter, { label: opt.label, formType: opt.type === 'select' ? 'select' : 'autoComplete', selectedValue: selectedValue, values: getFilterValues(opt), onChange: function (value) { return handleFilterChange(opt.label, value, opt.datatype, opt.options); } }));
312
+ };
313
+ // Separate bar filters from expanded filters
314
+ var visibleConfigs = getVisibleConfigs(filterConfig);
315
+ var barFilters = visibleConfigs.filter(function (f) { return f.visibility !== 'expanded'; });
316
+ var expandedFilters = visibleConfigs.filter(function (f) { return f.visibility === 'expanded'; });
317
+ return (_jsxs("div", { className: "w-4/5 max-w-5xl mx-auto", children: [_jsxs("div", { className: "items-center w-full bg-background shadow-md rounded-full px-4 py-3 md:py-2 flex", children: [barFilters.slice(0, 3).map(function (opt) { return (_jsxs("div", { className: "items-center flex-1 hidden md:flex", children: [_jsx("div", { className: "w-full", children: renderFilterInput(opt) }), _jsx("div", { className: "h-6 w-px bg-gray-300 mx-4 md:h-8" })] }, opt.label)); }), _jsxs(Sheet, { open: sheetOpen, onOpenChange: setSheetOpen, children: [_jsx(SheetTrigger, { asChild: true, children: _jsxs("button", { className: "flex items-center gap-2 text-sm text-gray-600 cursor-pointer m-auto relative", children: [_jsx(SlidersHorizontal, { size: 16, className: "hidden md:block" }), _jsx(SearchIcon, { size: 16, className: "md:hidden" }), _jsx("div", { className: "md:hidden", children: "Start search..." }), expandedFilters.length > 0 && (_jsxs("span", { className: "hidden md:block", children: ["+", expandedFilters.length, " more"] }))] }) }), _jsxs(SheetContent, { side: "top", className: "w-full p-8 z-200 md:items-center overflow-y-auto max-h-[80vh]", children: [_jsx(SheetTitle, { className: "text-lg font-semibold mb-4", children: "Filters" }), _jsx("div", { className: "space-y-6 md:w-3/5", children: visibleConfigs
318
+ .filter(function (opt) { return !opt.groupWith; }) // Only render non-grouped or group leaders
319
+ .map(function (opt) {
320
+ // Check if this filter has a grouped partner
321
+ var groupedFilter = visibleConfigs.find(function (f) { return f.groupWith === opt.label; });
322
+ if (groupedFilter) {
323
+ // Render grouped filters on same line
324
+ return (_jsxs("div", { className: "space-y-2", children: [_jsxs("label", { className: "text-sm font-medium text-gray-700", children: [groupedFilter.displayName, " & ", opt.displayName] }), _jsxs("div", { className: "bg-gray-50 rounded-lg p-3 flex items-center gap-4", children: [_jsx("div", { className: "w-28", children: renderFilterInput(groupedFilter) }), _jsx("div", { className: "flex-1", children: renderFilterInput(opt) })] })] }, opt.label));
325
+ }
326
+ // Regular filter
327
+ return (_jsxs("div", { className: "space-y-2", children: [_jsx("label", { className: "text-sm font-medium text-gray-700", children: opt.displayName }), _jsx("div", { className: "bg-gray-50 rounded-lg p-3", children: renderFilterInput(opt) })] }, opt.label));
176
328
  }) }), _jsxs("div", { className: "flex gap-3 mt-6 pt-4 border-t md:w-3/5", children: [_jsx(Button, { variant: "outline", onClick: clearAllFilters, className: "flex-1", children: "Clear All" }), _jsx(Button, { onClick: function () {
177
329
  changeMultiParams(filterParam);
178
330
  setSheetOpen(false);
179
- }, className: "flex-1", children: "Apply Filters" })] })] })] }), _jsx(Button, { variant: "default", onClick: function () { return changeMultiParams(filterParam); }, className: "ml-4 w-12 h-12 rounded-full items-center justify-center hidden md:flex cursor-pointer", children: _jsx(Search, { size: 20 }) })] }), activeFilters.length > 0 && (_jsx("div", { className: "max-w-5xl mx-auto mt-4", children: _jsxs("div", { className: "flex flex-wrap gap-2", children: [activeFilters.map(function (filter, index) { return (_jsxs("div", { className: "inline-flex items-center gap-1 bg-blue-100 text-blue-800 px-3 py-1 rounded-full text-sm border border-blue-200", children: [_jsxs("span", { className: "font-medium", children: [filter.displayName, ":"] }), _jsx("span", { children: typeof filter.value === 'number'
331
+ }, className: "flex-1", children: "Apply Filters" })] })] })] }), _jsx(Button, { variant: "default", onClick: function () { return changeMultiParams(filterParam); }, className: "ml-4 w-12 h-12 rounded-full items-center justify-center hidden md:flex cursor-pointer", children: _jsx(Search, { size: 20 }) })] }), activeFilters.length > 0 && (_jsx("div", { className: "max-w-5xl mx-auto mt-4", children: _jsxs("div", { className: "flex flex-wrap gap-2", children: [activeFilters.map(function (filter, index) { return (_jsxs("div", { className: "inline-flex items-center gap-1 bg-blue-100 text-blue-800 px-3 py-1 rounded-full text-sm border border-blue-200", children: [_jsxs("span", { className: "font-medium", children: [filter.displayName, ":"] }), _jsx("span", { children: typeof filter.value === 'number' && !filter.isRange
180
332
  ? "".concat(filter.value, " star or more")
181
333
  : filter.value }), _jsx("button", { onClick: function () {
182
- var _a;
183
334
  removeFilter(filter.label, filter.value);
184
- // Auto-apply the change
185
- var newParams = __assign(__assign({}, filterParam), (_a = {}, _a[filter.label] = Array.isArray(filterParam[filter.label])
186
- ? filterParam[filter.label].filter(function (v) { return v !== filter.value; })
187
- : 0, _a));
188
- changeMultiParams(newParams);
189
- }, className: "ml-1 hover:bg-blue-200 rounded-full p-1 transition-colors", children: _jsx(X, { size: 12 }) })] }, "".concat(filter.label, "-").concat(filter.value, "-").concat(index))); }), activeFilters.length > 0 && (_jsxs("button", { onClick: function () {
190
- clearAllFilters();
191
- }, className: "inline-flex items-center gap-1 bg-gray-100 text-gray-600 px-3 py-1 rounded-full text-sm border border-gray-200 hover:bg-gray-200 transition-colors", children: ["Clear All", _jsx(X, { size: 12 })] }))] }) }))] }));
335
+ var newState = __assign({}, filterParam);
336
+ if (filter.isRange) {
337
+ var config = filterConfig.find(function (f) { return f.label === filter.label; });
338
+ newState[filter.label] = (config === null || config === void 0 ? void 0 : config.defaultValue) || { min: 0, max: 100 };
339
+ }
340
+ else if (Array.isArray(filterParam[filter.label])) {
341
+ newState[filter.label] = filterParam[filter.label].filter(function (v) { return v !== filter.value; });
342
+ }
343
+ else {
344
+ var config = filterConfig.find(function (f) { return f.label === filter.label; });
345
+ newState[filter.label] = (config === null || config === void 0 ? void 0 : config.defaultValue) || 0;
346
+ }
347
+ changeMultiParams(newState);
348
+ }, className: "ml-1 hover:bg-blue-200 rounded-full p-1 transition-colors", children: _jsx(X, { size: 12 }) })] }, "".concat(filter.label, "-").concat(filter.value, "-").concat(index))); }), _jsxs("button", { onClick: clearAllFilters, className: "inline-flex items-center gap-1 bg-gray-100 text-gray-600 px-3 py-1 rounded-full text-sm border border-gray-200 hover:bg-gray-200 transition-colors", children: ["Clear All", _jsx(X, { size: 12 })] })] }) }))] }));
192
349
  }
193
350
  export default function FilterBar(_a) {
194
- var tiles = _a.tiles;
195
- return (_jsx(Suspense, { fallback: _jsx("div", { className: "w-full h-screen flex items-center justify-center", children: "Loading..." }), children: _jsx(FilterBarComponent, { tiles: tiles }) }));
351
+ var tiles = _a.tiles, filterConfig = _a.filterConfig;
352
+ return (_jsx(Suspense, { fallback: _jsx("div", { className: "w-full h-screen flex items-center justify-center", children: "Loading..." }), children: _jsx(FilterBarComponent, { tiles: tiles, filterConfig: filterConfig }) }));
196
353
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sidebar.d.ts","sourceRoot":"","sources":["../../src/misc/sidebar.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sidebar.d.ts","sourceRoot":"","sources":["../../src/misc/sidebar.tsx"],"names":[],"mappings":"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"}
@@ -49,7 +49,7 @@ function useSidebar() {
49
49
  return context;
50
50
  }
51
51
  function SidebarProvider(_a) {
52
- var _b = _a.defaultOpen, defaultOpen = _b === void 0 ? false : _b, openProp = _a.open, setOpenProp = _a.onOpenChange, className = _a.className, style = _a.style, children = _a.children, props = __rest(_a, ["defaultOpen", "open", "onOpenChange", "className", "style", "children"]);
52
+ var _b = _a.defaultOpen, defaultOpen = _b === void 0 ? true : _b, openProp = _a.open, setOpenProp = _a.onOpenChange, className = _a.className, style = _a.style, children = _a.children, props = __rest(_a, ["defaultOpen", "open", "onOpenChange", "className", "style", "children"]);
53
53
  var isMobile = useIsMobile();
54
54
  var _c = React.useState(false), openMobile = _c[0], setOpenMobile = _c[1];
55
55
  // This is the internal state of the sidebar.
@@ -0,0 +1,5 @@
1
+ import * as React from "react";
2
+ import * as SliderPrimitive from "@radix-ui/react-slider";
3
+ declare const Slider: React.ForwardRefExoticComponent<Omit<SliderPrimitive.SliderProps & React.RefAttributes<HTMLSpanElement>, "ref"> & React.RefAttributes<HTMLSpanElement>>;
4
+ export { Slider };
5
+ //# sourceMappingURL=slider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slider.d.ts","sourceRoot":"","sources":["../../src/misc/slider.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAA;AAIzD,QAAA,MAAM,MAAM,yJAuBV,CAAA;AAGF,OAAO,EAAE,MAAM,EAAE,CAAA"}
@@ -0,0 +1,34 @@
1
+ "use client";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __rest = (this && this.__rest) || function (s, e) {
14
+ var t = {};
15
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
16
+ t[p] = s[p];
17
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
18
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
19
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
20
+ t[p[i]] = s[p[i]];
21
+ }
22
+ return t;
23
+ };
24
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
25
+ import * as React from "react";
26
+ import * as SliderPrimitive from "@radix-ui/react-slider";
27
+ import { cn } from "@myrjfa/state/dist/lib/utils";
28
+ var Slider = React.forwardRef(function (_a, ref) {
29
+ var _b;
30
+ var className = _a.className, props = __rest(_a, ["className"]);
31
+ return (_jsxs(SliderPrimitive.Root, __assign({ ref: ref, className: cn("relative flex w-full touch-none select-none items-center", className) }, props, { children: [_jsx(SliderPrimitive.Track, { className: "relative h-2 w-full grow overflow-hidden rounded-full bg-secondary", children: _jsx(SliderPrimitive.Range, { className: "absolute h-full bg-primary" }) }), (_b = (props.value || props.defaultValue || [0])) === null || _b === void 0 ? void 0 : _b.map(function (_, index) { return (_jsx(SliderPrimitive.Thumb, { className: "block h-5 w-5 rounded-full border-2 border-primary bg-background ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50" }, index)); })] })));
32
+ });
33
+ Slider.displayName = SliderPrimitive.Root.displayName;
34
+ export { Slider };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@myrjfa/ui",
3
- "version": "1.0.7",
3
+ "version": "1.0.8",
4
4
  "description": "Shared UI components for my apps",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -51,7 +51,7 @@
51
51
  "zod": "*"
52
52
  },
53
53
  "devDependencies": {
54
- "@myrjfa/state": "^1.0.4",
54
+ "@myrjfa/state": "^1.0.7",
55
55
  "@types/react": "^19.1.10",
56
56
  "@types/react-dom": "^19.0.4",
57
57
  "date-fns": "^3.0.0",