@mbpockets/shared-ui 0.1.20 → 0.1.21

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.
Files changed (125) hide show
  1. package/dist/EventPage/index.cjs +209 -121
  2. package/dist/EventPage/index.cjs.map +1 -1
  3. package/dist/EventPage/index.mjs +201 -119
  4. package/dist/EventPage/index.mjs.map +1 -1
  5. package/dist/EventPage.cjs +209 -121
  6. package/dist/EventPage.cjs.map +1 -1
  7. package/dist/EventPage.mjs +201 -119
  8. package/dist/EventPage.mjs.map +1 -1
  9. package/dist/PlayerPage/index.cjs.map +1 -1
  10. package/dist/PlayerPage/index.mjs.map +1 -1
  11. package/dist/PlayerPage.cjs.map +1 -1
  12. package/dist/PlayerPage.mjs.map +1 -1
  13. package/dist/ProfilePage/index.cjs.map +1 -1
  14. package/dist/ProfilePage/index.mjs.map +1 -1
  15. package/dist/ProfilePage.cjs.map +1 -1
  16. package/dist/ProfilePage.mjs.map +1 -1
  17. package/dist/SearchPage/Filters/index.cjs +149 -43
  18. package/dist/SearchPage/Filters/index.cjs.map +1 -1
  19. package/dist/SearchPage/Filters/index.d.cts +1 -2
  20. package/dist/SearchPage/Filters/index.d.ts +1 -2
  21. package/dist/SearchPage/Filters/index.mjs +146 -42
  22. package/dist/SearchPage/Filters/index.mjs.map +1 -1
  23. package/dist/SearchPage/Filters.cjs +149 -43
  24. package/dist/SearchPage/Filters.cjs.map +1 -1
  25. package/dist/SearchPage/Filters.d.cts +38 -3
  26. package/dist/SearchPage/Filters.d.ts +38 -3
  27. package/dist/SearchPage/Filters.mjs +146 -42
  28. package/dist/SearchPage/Filters.mjs.map +1 -1
  29. package/dist/SearchPage/Results/index.cjs +139 -67
  30. package/dist/SearchPage/Results/index.cjs.map +1 -1
  31. package/dist/SearchPage/Results/index.mjs +127 -63
  32. package/dist/SearchPage/Results/index.mjs.map +1 -1
  33. package/dist/SearchPage/Results.cjs +139 -67
  34. package/dist/SearchPage/Results.cjs.map +1 -1
  35. package/dist/SearchPage/Results.d.cts +21 -12
  36. package/dist/SearchPage/Results.d.ts +21 -12
  37. package/dist/SearchPage/Results.mjs +127 -63
  38. package/dist/SearchPage/Results.mjs.map +1 -1
  39. package/dist/SearchPage/index.cjs +496 -221
  40. package/dist/SearchPage/index.cjs.map +1 -1
  41. package/dist/SearchPage/index.d.cts +1 -1
  42. package/dist/SearchPage/index.d.ts +1 -1
  43. package/dist/SearchPage/index.mjs +483 -216
  44. package/dist/SearchPage/index.mjs.map +1 -1
  45. package/dist/SearchPage.cjs +496 -221
  46. package/dist/SearchPage.cjs.map +1 -1
  47. package/dist/SearchPage.d.cts +78 -7
  48. package/dist/SearchPage.d.ts +78 -7
  49. package/dist/SearchPage.mjs +483 -216
  50. package/dist/SearchPage.mjs.map +1 -1
  51. package/dist/TablePage/index.cjs +10 -1
  52. package/dist/TablePage/index.cjs.map +1 -1
  53. package/dist/TablePage/index.d.cts +2 -2
  54. package/dist/TablePage/index.d.ts +2 -2
  55. package/dist/TablePage/index.mjs +10 -2
  56. package/dist/TablePage/index.mjs.map +1 -1
  57. package/dist/TablePage.cjs +10 -1
  58. package/dist/TablePage.cjs.map +1 -1
  59. package/dist/TablePage.d.cts +7 -2
  60. package/dist/TablePage.d.ts +7 -2
  61. package/dist/TablePage.mjs +10 -2
  62. package/dist/TablePage.mjs.map +1 -1
  63. package/dist/index.cjs +447 -178
  64. package/dist/index.cjs.map +1 -1
  65. package/dist/index.d.cts +3 -3
  66. package/dist/index.d.ts +3 -3
  67. package/dist/index.mjs +435 -175
  68. package/dist/index.mjs.map +1 -1
  69. package/dist/mocks/SearchResults.cjs +22 -15
  70. package/dist/mocks/SearchResults.cjs.map +1 -1
  71. package/dist/mocks/SearchResults.d.cts +3 -15
  72. package/dist/mocks/SearchResults.d.ts +3 -15
  73. package/dist/mocks/SearchResults.mjs +22 -15
  74. package/dist/mocks/SearchResults.mjs.map +1 -1
  75. package/dist/mocks/index.cjs +22 -15
  76. package/dist/mocks/index.cjs.map +1 -1
  77. package/dist/mocks/index.d.cts +2 -1
  78. package/dist/mocks/index.d.ts +2 -1
  79. package/dist/mocks/index.mjs +22 -15
  80. package/dist/mocks/index.mjs.map +1 -1
  81. package/dist/mocks.cjs +22 -15
  82. package/dist/mocks.cjs.map +1 -1
  83. package/dist/mocks.d.cts +2 -1
  84. package/dist/mocks.d.ts +2 -1
  85. package/dist/mocks.mjs +22 -15
  86. package/dist/mocks.mjs.map +1 -1
  87. package/dist/{common → shared}/index.cjs.map +1 -1
  88. package/dist/{common → shared}/index.d.cts +1 -1
  89. package/dist/{common → shared}/index.d.ts +1 -1
  90. package/dist/{common → shared}/index.mjs.map +1 -1
  91. package/dist/{common.cjs → shared.cjs} +2 -2
  92. package/dist/{common.cjs.map → shared.cjs.map} +1 -1
  93. package/dist/{common.css → shared.css} +1 -1
  94. package/dist/{common.mjs → shared.mjs} +2 -2
  95. package/dist/{common.mjs.map → shared.mjs.map} +1 -1
  96. package/dist/types/index.d.cts +1 -1
  97. package/dist/types/index.d.ts +1 -1
  98. package/dist/types/search.d.cts +23 -1
  99. package/dist/types/search.d.ts +23 -1
  100. package/dist/types.d.cts +1 -1
  101. package/dist/types.d.ts +1 -1
  102. package/package.json +1 -1
  103. /package/dist/{common → shared}/Modal/index.cjs +0 -0
  104. /package/dist/{common → shared}/Modal/index.cjs.map +0 -0
  105. /package/dist/{common → shared}/Modal/index.css +0 -0
  106. /package/dist/{common → shared}/Modal/index.css.map +0 -0
  107. /package/dist/{common → shared}/Modal/index.d.cts +0 -0
  108. /package/dist/{common → shared}/Modal/index.d.ts +0 -0
  109. /package/dist/{common → shared}/Modal/index.mjs +0 -0
  110. /package/dist/{common → shared}/Modal/index.mjs.map +0 -0
  111. /package/dist/{common → shared}/Modal.cjs +0 -0
  112. /package/dist/{common → shared}/Modal.cjs.map +0 -0
  113. /package/dist/{common → shared}/Modal.css +0 -0
  114. /package/dist/{common → shared}/Modal.css.map +0 -0
  115. /package/dist/{common → shared}/Modal.d.cts +0 -0
  116. /package/dist/{common → shared}/Modal.d.ts +0 -0
  117. /package/dist/{common → shared}/Modal.mjs +0 -0
  118. /package/dist/{common → shared}/Modal.mjs.map +0 -0
  119. /package/dist/{common → shared}/index.cjs +0 -0
  120. /package/dist/{common → shared}/index.css +0 -0
  121. /package/dist/{common → shared}/index.css.map +0 -0
  122. /package/dist/{common → shared}/index.mjs +0 -0
  123. /package/dist/{common.css.map → shared.css.map} +0 -0
  124. /package/dist/{common.d.cts → shared.d.cts} +0 -0
  125. /package/dist/{common.d.ts → shared.d.ts} +0 -0
package/dist/index.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import React7, { createContext, useState, useEffect, useContext, useMemo, useRef } from 'react';
3
3
  import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
4
- import { Box, Grid, TextField, Tooltip, IconButton, Button, CircularProgress, Dialog, DialogTitle, DialogContent, DialogActions, Card, CardContent, Typography, FormControl, InputLabel, Select, MenuItem, Chip as Chip$1, LinearProgress, CardMedia, CardHeader, useTheme, useMediaQuery, NoSsr } from '@mui/material';
4
+ import { Box, Grid, TextField, Tooltip, IconButton, Button, CircularProgress, Dialog, DialogTitle, DialogContent, DialogActions, Card, CardContent, Typography, FormControl, InputLabel, Select, MenuItem, CardMedia, CardHeader, useTheme, useMediaQuery, NoSsr } from '@mui/material';
5
5
  import DeleteIcon from '@mui/icons-material/Delete';
6
6
  import EditIcon from '@mui/icons-material/Edit';
7
7
  import AddIcon from '@mui/icons-material/Add';
@@ -13,24 +13,30 @@ import Grid8 from '@mui/material/Grid';
13
13
  import Card10 from '@mui/material/Card';
14
14
  import CardContent10 from '@mui/material/CardContent';
15
15
  import CardHeader4 from '@mui/material/CardHeader';
16
- import Divider2 from '@mui/material/Divider';
16
+ import Divider3 from '@mui/material/Divider';
17
+ import Typography4 from '@mui/material/Typography';
18
+ import Pagination from '@mui/material/Pagination';
17
19
  import Avatar from '@mui/material/Avatar';
18
- import CasinoIcon from '@mui/icons-material/Casino';
20
+ import Chip2 from '@mui/material/Chip';
21
+ import LinearProgress from '@mui/material/LinearProgress';
22
+ import PersonIcon from '@mui/icons-material/Person';
23
+ import SupervisorAccountIcon from '@mui/icons-material/SupervisorAccount';
24
+ import TableRestaurantIcon from '@mui/icons-material/TableRestaurant';
19
25
  import CalendarTodayIcon from '@mui/icons-material/CalendarToday';
20
26
  import LocationOnIcon from '@mui/icons-material/LocationOn';
21
27
  import EventIcon from '@mui/icons-material/Event';
22
28
  import Autocomplete from '@mui/material/Autocomplete';
23
29
  import Popper from '@mui/material/Popper';
24
- import Typography10 from '@mui/material/Typography';
30
+ import FormControlLabel from '@mui/material/FormControlLabel';
31
+ import Checkbox from '@mui/material/Checkbox';
25
32
  import FormControl2 from '@mui/material/FormControl';
26
33
  import RadioGroup from '@mui/material/RadioGroup';
27
- import FormControlLabel from '@mui/material/FormControlLabel';
28
34
  import Radio from '@mui/material/Radio';
29
35
  import TextField4 from '@mui/material/TextField';
30
36
  import FormGroup from '@mui/material/FormGroup';
31
- import Checkbox from '@mui/material/Checkbox';
32
37
  import Button7 from '@mui/material/Button';
33
38
  import SearchIcon from '@mui/icons-material/Search';
39
+ import CircularProgress3 from '@mui/material/CircularProgress';
34
40
  import Image2 from 'next/image';
35
41
  import ListIcon from '@mui/icons-material/List';
36
42
  import SaveIcon from '@mui/icons-material/Save';
@@ -937,6 +943,14 @@ var generateLink = function(link) {
937
943
  link.text
938
944
  );
939
945
  };
946
+ var NextGameLabel = ({ nextGameTime }) => {
947
+ const date = typeof nextGameTime === "string" ? new Date(nextGameTime) : nextGameTime;
948
+ return /* @__PURE__ */ jsxs(Typography, { variant: "caption", sx: { display: "block", mb: 1, color: "primary.main", fontWeight: "bold" }, children: [
949
+ "Next Game: ",
950
+ date.toLocaleString()
951
+ ] });
952
+ };
953
+ var NextGameLabel_default = NextGameLabel;
940
954
  var BaseSearchResultCard = ({
941
955
  result,
942
956
  onClick,
@@ -944,13 +958,19 @@ var BaseSearchResultCard = ({
944
958
  icon,
945
959
  tags
946
960
  }) => {
947
- const handleClick = () => {
961
+ const handleClick = (e) => {
948
962
  if (onClick) {
949
- onClick(result.id);
963
+ if (e.ctrlKey || e.metaKey || e.shiftKey) {
964
+ e.stopPropagation();
965
+ const url = `/${result.type}/${result.id}`;
966
+ window.open(url, "_blank");
967
+ } else {
968
+ onClick(result.id);
969
+ }
950
970
  }
951
971
  };
952
972
  return /* @__PURE__ */ jsx(
953
- Card,
973
+ Card10,
954
974
  {
955
975
  elevation: 6,
956
976
  sx: {
@@ -963,48 +983,22 @@ var BaseSearchResultCard = ({
963
983
  },
964
984
  marginBottom: 2
965
985
  },
966
- onClick: handleClick,
967
- children: /* @__PURE__ */ jsxs(CardContent, { sx: { display: "flex", alignItems: "flex-start" }, children: [
968
- icon && /* @__PURE__ */ jsx(Box, { sx: { mr: 2, display: "flex", alignItems: "center", pt: 0.5 }, children: icon }),
969
- /* @__PURE__ */ jsxs(Box, { sx: { flex: 1 }, children: [
970
- /* @__PURE__ */ jsx(Typography, { variant: "h6", sx: { mb: 1 }, children: result.title }),
986
+ onClick: (e) => handleClick(e),
987
+ children: /* @__PURE__ */ jsxs(CardContent10, { sx: { display: "flex", alignItems: "flex-start" }, children: [
988
+ icon && /* @__PURE__ */ jsx(Box2, { sx: { mr: 2, display: "flex", alignItems: "center", pt: 0.5 }, children: icon }),
989
+ /* @__PURE__ */ jsxs(Box2, { sx: { flex: 1 }, children: [
990
+ /* @__PURE__ */ jsx(Typography4, { variant: "h6", sx: { mb: 1 }, children: result.title }),
991
+ result.nextGameTime && /* @__PURE__ */ jsx(NextGameLabel_default, { nextGameTime: result.nextGameTime }),
992
+ result.type === "table" && result.shortDescription ? /* @__PURE__ */ jsx(Typography4, { variant: "body2", sx: { mb: 1 }, children: result.shortDescription }) : null,
971
993
  children,
972
- /* @__PURE__ */ jsx(Typography, { variant: "body1", children: result.description }),
973
- result.tags && result.tags.length > 0 && /* @__PURE__ */ jsx(Box, { sx: { mt: 1 }, children: /* @__PURE__ */ jsx(Box, { sx: {
974
- display: "block",
975
- whiteSpace: "nowrap",
976
- overflow: "hidden",
977
- textOverflow: "clip",
978
- pl: 0.5
979
- // Add some padding to prevent clipping of the leftmost tag
980
- }, children: (() => {
981
- const MAX_VISIBLE = 5;
982
- const tagObjs = result.tags.map((tagId) => tags.find((t) => t.id === tagId)).filter((t) => Boolean(t));
983
- const visible = tagObjs.slice(0, MAX_VISIBLE);
984
- const hiddenCount = Math.max(tagObjs.length - visible.length, 0);
985
- return /* @__PURE__ */ jsxs(Fragment, { children: [
986
- visible.map((tag) => generateTagsDisplay(tag)),
987
- hiddenCount > 0 && /* @__PURE__ */ jsxs(
988
- "span",
989
- {
990
- className: "inline-block text-sm px-3 py-1 rounded-full outline-black outline-2 font-outlined",
991
- style: {
992
- marginTop: "6px",
993
- marginRight: "6px",
994
- marginBottom: "6px",
995
- background: "#9e9e9e",
996
- color: "white",
997
- textShadow: "black 0.2em 0.2em 0.4em"
998
- },
999
- children: [
1000
- "+",
1001
- hiddenCount,
1002
- " more"
1003
- ]
1004
- }
1005
- )
1006
- ] });
1007
- })() }) })
994
+ result.type === "table" ? /* @__PURE__ */ jsx(Typography4, { variant: "body1", children: (() => {
995
+ var _a, _b;
996
+ const full = (_b = (_a = result.fullDescription) != null ? _a : result.description) != null ? _b : "";
997
+ if (typeof full !== "string") return "";
998
+ const text = full || "";
999
+ return text.length > 200 ? `${text.slice(0, 200).trimEnd()}...` : text;
1000
+ })() }) : /* @__PURE__ */ jsx(Typography4, { variant: "body1", children: result.description }),
1001
+ result.tags && result.tags.length > 0 && /* @__PURE__ */ jsx(Box2, { sx: { mt: 1, display: "flex", flexWrap: "wrap", gap: 1 }, children: renderTagsFromIds(result.tags, tags) })
1008
1002
  ] })
1009
1003
  ] })
1010
1004
  }
@@ -1059,21 +1053,60 @@ var PlayerResultCard = ({
1059
1053
  return /* @__PURE__ */ jsx(BaseSearchResultCard_default, { result, onClick, icon: playerIcon, tags });
1060
1054
  };
1061
1055
  var PlayerResultCard_default = PlayerResultCard;
1062
- var TableResultCard = ({ result, tags, onClick }) => {
1063
- const capacity = result.capacity || 1;
1064
- const numPlayers = result.numPlayers || 0;
1065
- const occupancy = numPlayers / capacity * 100;
1066
- return /* @__PURE__ */ jsx(BaseSearchResultCard, { result, tags, onClick, icon: /* @__PURE__ */ jsx(CasinoIcon, { color: "primary" }), children: /* @__PURE__ */ jsxs(Box, { sx: { mb: 1 }, children: [
1067
- /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", justifyContent: "space-between", alignItems: "center", mb: 0.5 }, children: [
1068
- /* @__PURE__ */ jsxs(Typography, { variant: "body2", color: "text.secondary", children: [
1069
- "Players: ",
1070
- numPlayers,
1071
- " / ",
1072
- capacity
1056
+ var TableResultCard = ({
1057
+ result,
1058
+ onClick,
1059
+ tags
1060
+ }) => {
1061
+ const rawCapacity = result.capacity;
1062
+ const hasDefinedCapacity = typeof rawCapacity === "number" && Number.isFinite(rawCapacity) && rawCapacity > 0;
1063
+ const capacity = hasDefinedCapacity ? rawCapacity : 0;
1064
+ const activePlayers = typeof result.numPlayers === "number" ? result.numPlayers : 0;
1065
+ const availableSlots = Math.max(capacity - activePlayers, 0);
1066
+ const hasDM = typeof result.hasDM === "boolean" ? result.hasDM : Boolean(result.dungeonMaster);
1067
+ const occupancyPercentage = hasDefinedCapacity ? activePlayers / capacity * 100 : 100;
1068
+ const tableIcon = /* @__PURE__ */ jsx(
1069
+ TableRestaurantIcon,
1070
+ {
1071
+ sx: {
1072
+ fontSize: 40,
1073
+ color: "primary.main"
1074
+ }
1075
+ }
1076
+ );
1077
+ return /* @__PURE__ */ jsx(BaseSearchResultCard_default, { result, onClick, icon: tableIcon, tags, children: /* @__PURE__ */ jsxs(Box2, { sx: { mb: 2 }, children: [
1078
+ /* @__PURE__ */ jsxs(Box2, { sx: { display: "flex", justifyContent: "space-between", alignItems: "center", mb: 1 }, children: [
1079
+ /* @__PURE__ */ jsxs(Typography4, { variant: "body2", children: [
1080
+ /* @__PURE__ */ jsx("strong", { children: "Players:" }),
1081
+ " ",
1082
+ hasDefinedCapacity ? `${activePlayers}/${capacity}` : activePlayers
1073
1083
  ] }),
1074
- result.dungeonMaster ? /* @__PURE__ */ jsx(Chip$1, { label: "DM Present", size: "small", color: "success", variant: "outlined" }) : /* @__PURE__ */ jsx(Chip$1, { label: "No DM", size: "small", color: "warning", variant: "outlined" })
1084
+ typeof hasDM === "boolean" && /* @__PURE__ */ jsx(
1085
+ Chip2,
1086
+ {
1087
+ icon: hasDM ? /* @__PURE__ */ jsx(SupervisorAccountIcon, {}) : /* @__PURE__ */ jsx(PersonIcon, {}),
1088
+ label: hasDM ? "DM Present" : "No DM",
1089
+ color: hasDM ? "success" : "warning",
1090
+ size: "small"
1091
+ }
1092
+ )
1075
1093
  ] }),
1076
- /* @__PURE__ */ jsx(LinearProgress, { variant: "determinate", value: occupancy, sx: { height: 8, borderRadius: 4 } })
1094
+ /* @__PURE__ */ jsx(
1095
+ LinearProgress,
1096
+ {
1097
+ variant: "determinate",
1098
+ value: occupancyPercentage,
1099
+ sx: {
1100
+ height: 10,
1101
+ borderRadius: 5,
1102
+ backgroundColor: "#e0e0e0",
1103
+ "& .MuiLinearProgress-bar": {
1104
+ backgroundColor: hasDefinedCapacity ? availableSlots > 0 ? "#4caf50" : "#f44336" : "#2196f3"
1105
+ }
1106
+ }
1107
+ }
1108
+ ),
1109
+ hasDefinedCapacity && /* @__PURE__ */ jsx(Typography4, { variant: "body2", sx: { mt: 0.5, textAlign: "right" }, children: availableSlots > 0 ? `${availableSlots} slot${availableSlots !== 1 ? "s" : ""} available` : "Table full" })
1077
1110
  ] }) });
1078
1111
  };
1079
1112
  var TableResultCard_default = TableResultCard;
@@ -1092,20 +1125,42 @@ var EventResultCard = ({
1092
1125
  try {
1093
1126
  const date = new Date(dateString);
1094
1127
  return date.toLocaleDateString("en-US", options);
1095
- } catch {
1128
+ } catch (error) {
1096
1129
  return dateString;
1097
1130
  }
1098
1131
  };
1099
1132
  const formattedDate = result.date ? formatDate(result.date) : "Date TBD";
1100
1133
  const location = result.location || "Location TBD";
1101
- return /* @__PURE__ */ jsx(BaseSearchResultCard_default, { result, onClick, icon: /* @__PURE__ */ jsx(EventIcon, { color: "primary" }), tags, children: /* @__PURE__ */ jsxs(Box, { sx: { mb: 1 }, children: [
1102
- /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "center", mb: 0.5 }, children: [
1103
- /* @__PURE__ */ jsx(CalendarTodayIcon, { sx: { mr: 1, fontSize: "small", color: "text.secondary" } }),
1104
- /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.secondary", children: formattedDate })
1134
+ const eventIcon = /* @__PURE__ */ jsx(
1135
+ EventIcon,
1136
+ {
1137
+ sx: {
1138
+ fontSize: 40,
1139
+ color: "primary.main"
1140
+ }
1141
+ }
1142
+ );
1143
+ return /* @__PURE__ */ jsx(BaseSearchResultCard_default, { result, onClick, icon: eventIcon, tags, children: /* @__PURE__ */ jsxs(Box2, { sx: { mb: 2 }, children: [
1144
+ /* @__PURE__ */ jsxs(Box2, { sx: { display: "flex", alignItems: "center", mb: 1 }, children: [
1145
+ /* @__PURE__ */ jsx(CalendarTodayIcon, { sx: { mr: 1, color: "primary.main" } }),
1146
+ /* @__PURE__ */ jsxs(Typography4, { variant: "body2", children: [
1147
+ /* @__PURE__ */ jsx("strong", { children: "Date:" }),
1148
+ " ",
1149
+ formattedDate
1150
+ ] })
1151
+ ] }),
1152
+ /* @__PURE__ */ jsxs(Box2, { sx: { display: "flex", alignItems: "center" }, children: [
1153
+ /* @__PURE__ */ jsx(LocationOnIcon, { sx: { mr: 1, color: "primary.main" } }),
1154
+ /* @__PURE__ */ jsxs(Typography4, { variant: "body2", children: [
1155
+ /* @__PURE__ */ jsx("strong", { children: "Location:" }),
1156
+ " ",
1157
+ location
1158
+ ] })
1105
1159
  ] }),
1106
- /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "center", mb: 1 }, children: [
1107
- /* @__PURE__ */ jsx(LocationOnIcon, { sx: { mr: 1, fontSize: "small", color: "text.secondary" } }),
1108
- /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.secondary", children: location })
1160
+ result.organizer && /* @__PURE__ */ jsxs(Typography4, { variant: "body2", sx: { mt: 1 }, children: [
1161
+ /* @__PURE__ */ jsx("strong", { children: "Organizer:" }),
1162
+ " ",
1163
+ result.organizer
1109
1164
  ] })
1110
1165
  ] }) });
1111
1166
  };
@@ -1113,9 +1168,11 @@ var EventResultCard_default = EventResultCard;
1113
1168
  var ResultsContainer = ({
1114
1169
  results,
1115
1170
  onResultClick,
1116
- tags
1171
+ tags,
1172
+ pagination,
1173
+ onPacketChange
1117
1174
  }) => {
1118
- if (results.length === 0 || !results.map) {
1175
+ if (!results || results.length === 0 || !results.map) {
1119
1176
  return /* @__PURE__ */ jsx(Box2, { sx: { textAlign: "center", py: 4 }, children: "No results found. Try adjusting your filters." });
1120
1177
  }
1121
1178
  const onPlayerClick = (id) => {
@@ -1127,43 +1184,68 @@ var ResultsContainer = ({
1127
1184
  const onEventClick = (id) => {
1128
1185
  onResultClick == null ? void 0 : onResultClick(id, "event");
1129
1186
  };
1130
- return /* @__PURE__ */ jsx(Box2, { sx: { display: "flex", flexDirection: "column", gap: 2 }, children: results.map((result) => {
1131
- switch (result.type) {
1132
- case "player":
1133
- return /* @__PURE__ */ jsx(
1134
- PlayerResultCard_default,
1135
- {
1136
- result,
1137
- onClick: onPlayerClick,
1138
- tags
1139
- },
1140
- result.id
1141
- );
1142
- case "table":
1143
- return /* @__PURE__ */ jsx(
1144
- TableResultCard_default,
1145
- {
1146
- result,
1147
- onClick: onTableClick,
1148
- tags
1149
- },
1150
- result.id
1151
- );
1152
- case "event":
1153
- return /* @__PURE__ */ jsx(
1154
- EventResultCard_default,
1155
- {
1156
- result,
1157
- onClick: onEventClick,
1158
- tags
1159
- },
1160
- result.id
1161
- );
1162
- default:
1163
- console.error(`Unknown result type: ${result.type}`);
1164
- return null;
1165
- }
1166
- }) });
1187
+ const handlePacketChange = (_event, packet) => {
1188
+ onPacketChange == null ? void 0 : onPacketChange(packet);
1189
+ };
1190
+ const startResult = pagination ? (pagination.currentPacket - 1) * pagination.packetSize + 1 : 1;
1191
+ const endResult = pagination ? Math.min(pagination.currentPacket * pagination.packetSize, pagination.totalResults) : results.length;
1192
+ return /* @__PURE__ */ jsxs(Box2, { sx: { display: "flex", flexDirection: "column", gap: 2 }, children: [
1193
+ pagination && /* @__PURE__ */ jsx(Box2, { sx: { display: "flex", justifyContent: "space-between", alignItems: "center", mb: 1 }, children: /* @__PURE__ */ jsxs(Typography4, { variant: "body2", color: "text.secondary", children: [
1194
+ "Showing ",
1195
+ startResult,
1196
+ "-",
1197
+ endResult,
1198
+ " of ",
1199
+ pagination.totalResults,
1200
+ " results"
1201
+ ] }) }),
1202
+ results.map((result, index) => {
1203
+ switch (result.type) {
1204
+ case "player":
1205
+ return /* @__PURE__ */ jsx(
1206
+ PlayerResultCard_default,
1207
+ {
1208
+ result,
1209
+ onClick: onPlayerClick,
1210
+ tags
1211
+ },
1212
+ result.id
1213
+ );
1214
+ case "table":
1215
+ return /* @__PURE__ */ jsx(
1216
+ TableResultCard_default,
1217
+ {
1218
+ result,
1219
+ onClick: onTableClick,
1220
+ tags
1221
+ },
1222
+ result.id
1223
+ );
1224
+ case "event":
1225
+ return /* @__PURE__ */ jsx(
1226
+ EventResultCard_default,
1227
+ {
1228
+ result,
1229
+ onClick: onEventClick,
1230
+ tags
1231
+ },
1232
+ result.id
1233
+ );
1234
+ default:
1235
+ console.error(`Unknown result type: ${result.type}`);
1236
+ return null;
1237
+ }
1238
+ }),
1239
+ pagination && pagination.totalPackets > 1 && /* @__PURE__ */ jsx(Box2, { sx: { display: "flex", justifyContent: "center", mt: 4 }, children: /* @__PURE__ */ jsx(
1240
+ Pagination,
1241
+ {
1242
+ count: pagination.totalPackets,
1243
+ page: pagination.currentPacket,
1244
+ onChange: handlePacketChange,
1245
+ color: "primary"
1246
+ }
1247
+ ) })
1248
+ ] });
1167
1249
  };
1168
1250
  var ResultsContainer_default = ResultsContainer;
1169
1251
  var ScrollableResultsList = ({
@@ -1181,21 +1263,14 @@ var TablesScrollableList = ({
1181
1263
  results,
1182
1264
  tags,
1183
1265
  maxHeight,
1184
- onResultClick,
1185
- sortBy = "availability"
1266
+ onResultClick
1186
1267
  }) => {
1187
1268
  const tables = (results || []).filter((r) => (r == null ? void 0 : r.type) === "table");
1188
- const getAvailableSlots = (r) => {
1189
- const capacity = typeof r.capacity === "number" ? r.capacity : 0;
1190
- const playersCount = typeof r.numPlayers === "number" ? r.numPlayers : 0;
1191
- return Math.max(capacity - playersCount, 0);
1192
- };
1193
- const sortedTables = sortBy === "availability" ? [...tables].sort((a, b) => getAvailableSlots(b) - getAvailableSlots(a)) : tables;
1194
1269
  const handleClick = (id) => onResultClick == null ? void 0 : onResultClick(id);
1195
1270
  return /* @__PURE__ */ jsx(
1196
1271
  ScrollableResultsList_default,
1197
1272
  {
1198
- results: sortedTables,
1273
+ results: tables,
1199
1274
  tags,
1200
1275
  maxHeight,
1201
1276
  onResultClick: (id, type) => {
@@ -1213,8 +1288,8 @@ var EventTablesCard = ({
1213
1288
  }) => {
1214
1289
  return /* @__PURE__ */ jsxs(Card10, { elevation: 6, sx: { width: "100%", boxShadow: "0px 8px 24px rgba(0, 0, 0, 0.15)" }, children: [
1215
1290
  /* @__PURE__ */ jsx(CardHeader4, { title: "Tables" }),
1216
- /* @__PURE__ */ jsx(Divider2, {}),
1217
- /* @__PURE__ */ jsx(CardContent10, { children: /* @__PURE__ */ jsx(TablesScrollableList_default, { results: tables, tags, maxHeight, onResultClick: onTableClick, sortBy: "availability" }) })
1291
+ /* @__PURE__ */ jsx(Divider3, {}),
1292
+ /* @__PURE__ */ jsx(CardContent10, { children: /* @__PURE__ */ jsx(TablesScrollableList_default, { results: tables, tags, maxHeight, onResultClick: onTableClick }) })
1218
1293
  ] });
1219
1294
  };
1220
1295
  var EventTablesCard_default = EventTablesCard;
@@ -1774,6 +1849,26 @@ function PlayerPageLayout({
1774
1849
  ] }) })
1775
1850
  ] }) }) });
1776
1851
  }
1852
+ var ExpiredTablesFilter = ({
1853
+ includeExpiredTables,
1854
+ onChange
1855
+ }) => {
1856
+ return /* @__PURE__ */ jsx(Box2, { sx: { mt: 2 }, children: /* @__PURE__ */ jsx(
1857
+ FormControlLabel,
1858
+ {
1859
+ control: /* @__PURE__ */ jsx(
1860
+ Checkbox,
1861
+ {
1862
+ checked: includeExpiredTables,
1863
+ onChange: (e) => onChange(e.target.checked),
1864
+ color: "primary"
1865
+ }
1866
+ ),
1867
+ label: "Show expired tables"
1868
+ }
1869
+ ) });
1870
+ };
1871
+ var ExpiredTablesFilter_default = ExpiredTablesFilter;
1777
1872
  var SORT_OPTIONS = [
1778
1873
  { id: "relevance", label: "Relevance" },
1779
1874
  { id: "newest", label: "Newest" },
@@ -1787,7 +1882,7 @@ var SortOptions = ({
1787
1882
  onChange == null ? void 0 : onChange(event.target.value);
1788
1883
  };
1789
1884
  return /* @__PURE__ */ jsxs(Fragment, { children: [
1790
- /* @__PURE__ */ jsx(Typography10, { variant: "h6", gutterBottom: true, children: "Sort By" }),
1885
+ /* @__PURE__ */ jsx(Typography4, { variant: "h6", gutterBottom: true, children: "Sort By" }),
1791
1886
  /* @__PURE__ */ jsx(FormControl2, { children: /* @__PURE__ */ jsx(RadioGroup, { defaultValue: defaultValue2, onChange: handleSortChange, children: SORT_OPTIONS.map((option) => /* @__PURE__ */ jsx(
1792
1887
  FormControlLabel,
1793
1888
  {
@@ -1802,11 +1897,19 @@ var SortOptions = ({
1802
1897
  var SortOptions_default = SortOptions;
1803
1898
  var TagsFilter = ({
1804
1899
  onChange,
1805
- tags: Tags = []
1900
+ tags: Tags = [],
1901
+ initialSelectedTags
1806
1902
  }) => {
1807
- const [mustHaveTags, setMustHaveTags] = React7.useState([]);
1808
- const [mustNotHaveTags, setMustNotHaveTags] = React7.useState([]);
1809
- const [shouldHaveAtLeastOneTags, setShouldHaveAtLeastOneTags] = React7.useState([]);
1903
+ const [mustHaveTags, setMustHaveTags] = React7.useState((initialSelectedTags == null ? void 0 : initialSelectedTags.mustHave) || []);
1904
+ const [mustNotHaveTags, setMustNotHaveTags] = React7.useState((initialSelectedTags == null ? void 0 : initialSelectedTags.mustNotHave) || []);
1905
+ const [shouldHaveAtLeastOneTags, setShouldHaveAtLeastOneTags] = React7.useState((initialSelectedTags == null ? void 0 : initialSelectedTags.shouldHaveAtLeastOne) || []);
1906
+ React7.useEffect(() => {
1907
+ if (initialSelectedTags) {
1908
+ setMustHaveTags(initialSelectedTags.mustHave || []);
1909
+ setMustNotHaveTags(initialSelectedTags.mustNotHave || []);
1910
+ setShouldHaveAtLeastOneTags(initialSelectedTags.shouldHaveAtLeastOne || []);
1911
+ }
1912
+ }, [initialSelectedTags]);
1810
1913
  Tags = !!Tags ? Tags : [];
1811
1914
  const [inputValues, setInputValues] = React7.useState({
1812
1915
  mustHave: "",
@@ -1816,7 +1919,7 @@ var TagsFilter = ({
1816
1919
  const tagOptions = React7.useMemo(() => {
1817
1920
  console.log("available tags: " + JSON.stringify(Tags));
1818
1921
  console.log(!Tags);
1819
- if (!Tags || Tags.length == 0 || !Tags.map) return [];
1922
+ if (!Tags || Tags.length === 0 || !Tags.map) return [];
1820
1923
  return Tags.map((tag) => ({
1821
1924
  value: tag.id,
1822
1925
  label: tag.label
@@ -1848,7 +1951,7 @@ var TagsFilter = ({
1848
1951
  };
1849
1952
  const renderSelectedTags = (selectedTags, category) => {
1850
1953
  const tagValues = [];
1851
- if (!Tags || Tags.length == 0 || !Tags.map) return null;
1954
+ if (!Tags || Tags.length === 0 || !Tags.map) return null;
1852
1955
  Tags.forEach((tag) => {
1853
1956
  if (selectedTags.includes(tag.id)) {
1854
1957
  tagValues.push(tag);
@@ -1857,27 +1960,11 @@ var TagsFilter = ({
1857
1960
  if (tagValues.length === 0) {
1858
1961
  return null;
1859
1962
  }
1860
- return /* @__PURE__ */ jsx(Box2, { sx: { display: "flex", flexWrap: "wrap", gap: 1, mb: 2 }, children: tagValues.map((tag) => /* @__PURE__ */ jsxs(
1861
- "span",
1963
+ return /* @__PURE__ */ jsx(Box2, { sx: { display: "flex", flexWrap: "wrap", gap: 1, mb: 2 }, children: tagValues.map((tag) => /* @__PURE__ */ jsx(
1964
+ Chip,
1862
1965
  {
1863
- className: "inline-block text-sm px-3 py-1 rounded-full outline-black outline-2 font-outlined",
1864
- style: {
1865
- background: tag.color || "#bfbcbb",
1866
- color: "white",
1867
- textShadow: "black 0.2em 0.2em 0.4em"
1868
- },
1869
- children: [
1870
- tag.label,
1871
- /* @__PURE__ */ jsx(
1872
- "button",
1873
- {
1874
- type: "button",
1875
- onClick: () => handleTagChange(tag.id, category),
1876
- className: "ml-2 text-red-500 bg-white bg-opacity-50 rounded-full outline-black outline-2 font-outlined",
1877
- children: "\xD7"
1878
- }
1879
- )
1880
- ]
1966
+ tag,
1967
+ removeCallback: (tagId) => handleTagChange(tagId, category)
1881
1968
  },
1882
1969
  tag.id
1883
1970
  )) });
@@ -1885,7 +1972,7 @@ var TagsFilter = ({
1885
1972
  const createTagSelector = (category, label) => {
1886
1973
  const selectedTags = category === "mustHave" ? mustHaveTags : category === "mustNotHave" ? mustNotHaveTags : shouldHaveAtLeastOneTags;
1887
1974
  return /* @__PURE__ */ jsxs(Fragment, { children: [
1888
- /* @__PURE__ */ jsx(Typography10, { variant: "subtitle1", gutterBottom: true, sx: { mt: 2 }, children: label }),
1975
+ /* @__PURE__ */ jsx(Typography4, { variant: "subtitle1", gutterBottom: true, sx: { mt: 2 }, children: label }),
1889
1976
  renderSelectedTags(selectedTags, category),
1890
1977
  /* @__PURE__ */ jsx(
1891
1978
  Autocomplete,
@@ -1938,11 +2025,11 @@ var TagsFilter = ({
1938
2025
  ] });
1939
2026
  };
1940
2027
  return /* @__PURE__ */ jsxs(Fragment, { children: [
1941
- /* @__PURE__ */ jsx(Typography10, { variant: "h6", gutterBottom: true, children: "Tags" }),
2028
+ /* @__PURE__ */ jsx(Typography4, { variant: "h6", gutterBottom: true, children: "Tags" }),
1942
2029
  createTagSelector("mustHave", "Must Have Tags"),
1943
- /* @__PURE__ */ jsx(Divider2, { sx: { my: 2 } }),
2030
+ /* @__PURE__ */ jsx(Divider3, { sx: { my: 2 } }),
1944
2031
  createTagSelector("mustNotHave", "Must Not Have Tags"),
1945
- /* @__PURE__ */ jsx(Divider2, { sx: { my: 2 } }),
2032
+ /* @__PURE__ */ jsx(Divider3, { sx: { my: 2 } }),
1946
2033
  createTagSelector("shouldHaveAtLeastOne", "Should Contain At Least One Tag")
1947
2034
  ] });
1948
2035
  };
@@ -1972,21 +2059,80 @@ var CustomPopper2 = (props) => {
1972
2059
  );
1973
2060
  };
1974
2061
  var TagsFilter_default = TagsFilter;
1975
- var FILTER_TYPES = [
1976
- { id: "player", label: "Players" },
1977
- { id: "event", label: "Events", disabled: true },
1978
- { id: "table", label: "Tables", disabled: true }
1979
- ];
1980
- var TypeFilter = ({ onChange }) => {
1981
- const [selectedTypes, setSelectedTypes] = React7.useState([]);
2062
+ var TextSearchCard = ({ onChange, selectedTypes, initialTextSearch }) => {
2063
+ const [query, setQuery] = React7.useState((initialTextSearch == null ? void 0 : initialTextSearch.query) || "");
2064
+ const [titleOnly, setTitleOnly] = React7.useState((initialTextSearch == null ? void 0 : initialTextSearch.titleOnly) || false);
2065
+ useEffect(() => {
2066
+ if (initialTextSearch) {
2067
+ setQuery(initialTextSearch.query || "");
2068
+ setTitleOnly(initialTextSearch.titleOnly || false);
2069
+ }
2070
+ }, [initialTextSearch]);
2071
+ const shouldShow = selectedTypes.includes("table") || selectedTypes.includes("event");
2072
+ if (!shouldShow) {
2073
+ return null;
2074
+ }
2075
+ const handleQueryChange = (e) => {
2076
+ const newQuery = e.target.value;
2077
+ setQuery(newQuery);
2078
+ if (onChange) {
2079
+ onChange({ query: newQuery, titleOnly });
2080
+ }
2081
+ };
2082
+ const handleTitleOnlyChange = (e) => {
2083
+ const newTitleOnly = e.target.checked;
2084
+ setTitleOnly(newTitleOnly);
2085
+ if (onChange) {
2086
+ onChange({ query, titleOnly: newTitleOnly });
2087
+ }
2088
+ };
2089
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
2090
+ /* @__PURE__ */ jsx(Typography4, { variant: "h6", gutterBottom: true, children: "Text Search" }),
2091
+ /* @__PURE__ */ jsxs(Box2, { sx: { mb: 2 }, children: [
2092
+ /* @__PURE__ */ jsx(
2093
+ TextField4,
2094
+ {
2095
+ fullWidth: true,
2096
+ label: "Search in title and description",
2097
+ variant: "outlined",
2098
+ value: query,
2099
+ onChange: handleQueryChange,
2100
+ placeholder: "Enter search terms...",
2101
+ sx: { mb: 1 }
2102
+ }
2103
+ ),
2104
+ /* @__PURE__ */ jsx(
2105
+ FormControlLabel,
2106
+ {
2107
+ control: /* @__PURE__ */ jsx(
2108
+ Checkbox,
2109
+ {
2110
+ checked: titleOnly,
2111
+ onChange: handleTitleOnlyChange
2112
+ }
2113
+ ),
2114
+ label: "Search in title only"
2115
+ }
2116
+ )
2117
+ ] })
2118
+ ] });
2119
+ };
2120
+ var TextSearchCard_default = TextSearchCard;
2121
+ var TypeFilter = ({ types, initialSelectedTypes = [], onChange }) => {
2122
+ const [selectedTypes, setSelectedTypes] = React7.useState(initialSelectedTypes);
2123
+ useEffect(() => {
2124
+ setSelectedTypes(initialSelectedTypes);
2125
+ }, [initialSelectedTypes]);
1982
2126
  const handleTypeChange = (typeId) => {
1983
2127
  const newSelectedTypes = selectedTypes.includes(typeId) ? selectedTypes.filter((id) => id !== typeId) : [...selectedTypes, typeId];
1984
2128
  setSelectedTypes(newSelectedTypes);
1985
- onChange == null ? void 0 : onChange(newSelectedTypes);
2129
+ if (onChange) {
2130
+ onChange(newSelectedTypes);
2131
+ }
1986
2132
  };
1987
2133
  return /* @__PURE__ */ jsxs(Fragment, { children: [
1988
- /* @__PURE__ */ jsx(Typography10, { variant: "h6", gutterBottom: true, children: "Type" }),
1989
- /* @__PURE__ */ jsx(FormGroup, { children: FILTER_TYPES.map((type) => /* @__PURE__ */ jsx(
2134
+ /* @__PURE__ */ jsx(Typography4, { variant: "h6", gutterBottom: true, children: "Type" }),
2135
+ /* @__PURE__ */ jsx(FormGroup, { children: types.map((type) => /* @__PURE__ */ jsx(
1990
2136
  FormControlLabel,
1991
2137
  {
1992
2138
  control: /* @__PURE__ */ jsx(
@@ -1994,7 +2140,8 @@ var TypeFilter = ({ onChange }) => {
1994
2140
  {
1995
2141
  checked: selectedTypes.includes(type.id),
1996
2142
  onChange: () => handleTypeChange(type.id),
1997
- disabled: type.disabled
2143
+ disabled: type.id === "event",
2144
+ title: type.id === "event" ? "Coming soon! Currently only player and table search are supported." : ""
1998
2145
  }
1999
2146
  ),
2000
2147
  label: type.label
@@ -2005,22 +2152,67 @@ var TypeFilter = ({ onChange }) => {
2005
2152
  };
2006
2153
  var TypeFilter_default = TypeFilter;
2007
2154
  var FiltersContainer = ({
2155
+ initialSelectedTypes = [],
2156
+ initialSelectedTags,
2157
+ initialTextSearch,
2158
+ includeExpiredTables = false,
2008
2159
  onTypeChange,
2009
2160
  onTagChange,
2161
+ onTextSearchChange,
2162
+ onIncludeExpiredTablesChange,
2010
2163
  onSubmit,
2011
- tags
2164
+ tags,
2165
+ searchTypes
2012
2166
  }) => {
2167
+ const [selectedTypes, setSelectedTypes] = React7.useState(initialSelectedTypes);
2168
+ useEffect(() => {
2169
+ setSelectedTypes(initialSelectedTypes);
2170
+ }, [initialSelectedTypes]);
2171
+ const handleTypeChange = (types) => {
2172
+ setSelectedTypes(types);
2173
+ if (onTypeChange) {
2174
+ onTypeChange(types);
2175
+ }
2176
+ };
2013
2177
  return /* @__PURE__ */ jsxs(Box2, { children: [
2014
- /* @__PURE__ */ jsx(TypeFilter_default, { onChange: onTypeChange }),
2015
- /* @__PURE__ */ jsx(Divider2, { sx: { my: 2 } }),
2178
+ /* @__PURE__ */ jsx(
2179
+ TypeFilter_default,
2180
+ {
2181
+ types: searchTypes,
2182
+ initialSelectedTypes,
2183
+ onChange: handleTypeChange
2184
+ }
2185
+ ),
2186
+ /* @__PURE__ */ jsx(Divider3, { sx: { my: 2 } }),
2187
+ /* @__PURE__ */ jsx(
2188
+ TextSearchCard_default,
2189
+ {
2190
+ selectedTypes,
2191
+ initialTextSearch,
2192
+ onChange: onTextSearchChange
2193
+ }
2194
+ ),
2195
+ (selectedTypes.includes("table") || selectedTypes.includes("event")) && /* @__PURE__ */ jsx(Divider3, { sx: { my: 2 } }),
2016
2196
  /* @__PURE__ */ jsx(
2017
2197
  TagsFilter_default,
2018
2198
  {
2019
2199
  tags,
2200
+ initialSelectedTags,
2020
2201
  onChange: onTagChange
2021
2202
  }
2022
2203
  ),
2023
- /* @__PURE__ */ jsx(Divider2, { sx: { my: 2 } }),
2204
+ /* @__PURE__ */ jsx(Divider3, { sx: { my: 2 } }),
2205
+ selectedTypes.includes("table") && /* @__PURE__ */ jsxs(Fragment, { children: [
2206
+ /* @__PURE__ */ jsx(
2207
+ ExpiredTablesFilter_default,
2208
+ {
2209
+ includeExpiredTables,
2210
+ onChange: onIncludeExpiredTablesChange || (() => {
2211
+ })
2212
+ }
2213
+ ),
2214
+ /* @__PURE__ */ jsx(Divider3, { sx: { my: 2 } })
2215
+ ] }),
2024
2216
  /* @__PURE__ */ jsx(Box2, { sx: { display: "flex", justifyContent: "center", mt: 2 }, children: /* @__PURE__ */ jsx(
2025
2217
  Button7,
2026
2218
  {
@@ -2078,16 +2270,75 @@ var SearchResultCard_default = SearchResultCard;
2078
2270
  function SearchPageLayout({
2079
2271
  results,
2080
2272
  title = "Search Results",
2273
+ initialSelectedTypes = [],
2274
+ initialSelectedTags = {
2275
+ mustHave: [],
2276
+ mustNotHave: [],
2277
+ shouldHaveAtLeastOne: []
2278
+ },
2279
+ initialTextSearch = {
2280
+ query: "",
2281
+ titleOnly: false
2282
+ },
2283
+ includeExpiredTables: initialIncludeExpiredTables = false,
2081
2284
  onTypeChange,
2082
2285
  onTagChange,
2286
+ onTextSearchChange,
2287
+ onIncludeExpiredTablesChange,
2083
2288
  onSubmit,
2084
2289
  onResultClick,
2290
+ onPacketChange,
2291
+ pagination,
2085
2292
  validTags,
2086
- allTags
2293
+ allTags,
2294
+ searchTypes,
2295
+ isLoading = false
2087
2296
  }) {
2088
- "use client";
2089
2297
  const theme = useTheme();
2090
2298
  const isMobile = useMediaQuery(theme.breakpoints.down("md"));
2299
+ const [selectedTypes, setSelectedTypes] = useState(initialSelectedTypes);
2300
+ const [selectedTags, setSelectedTags] = useState(initialSelectedTags);
2301
+ const [textSearch, setTextSearch] = useState(initialTextSearch);
2302
+ const [includeExpiredTables, setIncludeExpiredTables] = useState(initialIncludeExpiredTables);
2303
+ useEffect(() => {
2304
+ setSelectedTypes(initialSelectedTypes);
2305
+ }, [initialSelectedTypes]);
2306
+ useEffect(() => {
2307
+ setSelectedTags(initialSelectedTags);
2308
+ }, [initialSelectedTags]);
2309
+ useEffect(() => {
2310
+ setTextSearch(initialTextSearch);
2311
+ }, [initialTextSearch]);
2312
+ useEffect(() => {
2313
+ setIncludeExpiredTables(initialIncludeExpiredTables);
2314
+ }, [initialIncludeExpiredTables]);
2315
+ const handleTypeChange = (types) => {
2316
+ setSelectedTypes(types);
2317
+ if (onTypeChange) onTypeChange(types);
2318
+ };
2319
+ const handleTagChange = (tags) => {
2320
+ setSelectedTags(tags);
2321
+ if (onTagChange) onTagChange(tags);
2322
+ };
2323
+ const handleTextSearchChange = (ts) => {
2324
+ setTextSearch(ts);
2325
+ if (onTextSearchChange) onTextSearchChange(ts);
2326
+ };
2327
+ const handleIncludeExpiredTablesChange = (include) => {
2328
+ setIncludeExpiredTables(include);
2329
+ if (onIncludeExpiredTablesChange) onIncludeExpiredTablesChange(include);
2330
+ };
2331
+ const handleSubmit = () => {
2332
+ const currentCriteria = {
2333
+ selectedTypes,
2334
+ selectedTags,
2335
+ textSearch,
2336
+ includeExpiredTables
2337
+ };
2338
+ if (onSubmit) {
2339
+ onSubmit(currentCriteria);
2340
+ }
2341
+ };
2091
2342
  return /* @__PURE__ */ jsxs(Box2, { sx: { padding: 2 }, children: [
2092
2343
  /* @__PURE__ */ jsx(Card10, { sx: { marginBottom: 2 }, children: /* @__PURE__ */ jsx(
2093
2344
  CardHeader4,
@@ -2118,10 +2369,17 @@ function SearchPageLayout({
2118
2369
  /* @__PURE__ */ jsx(CardContent10, { children: /* @__PURE__ */ jsx(
2119
2370
  FiltersContainer_default,
2120
2371
  {
2121
- onTypeChange,
2122
- onTagChange,
2123
- onSubmit,
2124
- tags: validTags
2372
+ initialSelectedTypes: selectedTypes,
2373
+ initialSelectedTags: selectedTags,
2374
+ initialTextSearch: textSearch,
2375
+ includeExpiredTables,
2376
+ onTypeChange: handleTypeChange,
2377
+ onTagChange: handleTagChange,
2378
+ onTextSearchChange: handleTextSearchChange,
2379
+ onIncludeExpiredTablesChange: handleIncludeExpiredTablesChange,
2380
+ onSubmit: handleSubmit,
2381
+ tags: validTags,
2382
+ searchTypes
2125
2383
  }
2126
2384
  ) })
2127
2385
  ] }) }),
@@ -2138,10 +2396,12 @@ function SearchPageLayout({
2138
2396
  }
2139
2397
  }
2140
2398
  ),
2141
- /* @__PURE__ */ jsx(CardContent10, { children: /* @__PURE__ */ jsx(
2399
+ /* @__PURE__ */ jsx(CardContent10, { children: isLoading ? /* @__PURE__ */ jsx(Box2, { sx: { display: "flex", justifyContent: "center", py: 8 }, children: /* @__PURE__ */ jsx(CircularProgress3, { size: 60, thickness: 4 }) }) : /* @__PURE__ */ jsx(
2142
2400
  ResultsContainer_default,
2143
2401
  {
2144
2402
  results,
2403
+ pagination,
2404
+ onPacketChange,
2145
2405
  onResultClick,
2146
2406
  tags: allTags
2147
2407
  }
@@ -2696,6 +2956,6 @@ var renderEditableTags = function(selectedTags, allTags, onToggleTag) {
2696
2956
  };
2697
2957
  var TablePageLayout_default = TablePageLayout;
2698
2958
 
2699
- export { AutoResizingTextarea_default as AutoResizingTextarea, BaseSearchResultCard_default as BaseSearchResultCard, CANDIDATE_TIMEZONES, Chip, DMHighlightsCard, EventBanner, EventBannerEdit, EventBasicInfo, EventBasicInfoEdit, EventEditProvider, EventPageLayout, EventResultCard_default as EventResultCard, EventTablesCard_default as EventTablesCard, FiltersContainer_default as FiltersContainer, GameTableProvider, ModalContext, ModalProvider_default as ModalProvider, NextGameCountdown, PlayerDetailsCard_default as PlayerDetailsCard, PlayerDisplayCard_default as PlayerDisplayCard, PlayerHighlightsCard, PlayerPageLayout, PlayerPromptCard_default as PlayerPromptCard, PlayerResultCard_default as PlayerResultCard, PlayerTagsCard_default as PlayerTagsCard, PlayerTagsEdit_default as PlayerTagsEdit, PlayersScrollableList_default as PlayersScrollableList, ResultsContainer_default as ResultsContainer, ScrollableResultsList_default as ScrollableResultsList, SearchPageLayout, SearchResultCard_default as SearchResultCard, SortOptions_default as SortOptions, TableActionsBar, TablePageLayout_default as TablePageLayout, TableResultCard_default as TableResultCard, TablesScrollableList_default as TablesScrollableList, TagEditor, TagsFilter_default as TagsFilter, TypeFilter_default as TypeFilter, generateTagsDisplay, renderTagsFromIds, useEventEdit, useGameTableContext, useModal };
2959
+ export { AutoResizingTextarea_default as AutoResizingTextarea, BaseSearchResultCard_default as BaseSearchResultCard, CANDIDATE_TIMEZONES, Chip, DMHighlightsCard, EventBanner, EventBannerEdit, EventBasicInfo, EventBasicInfoEdit, EventEditProvider, EventPageLayout, EventResultCard_default as EventResultCard, EventTablesCard_default as EventTablesCard, ExpiredTablesFilter_default as ExpiredTablesFilter, FiltersContainer_default as FiltersContainer, GameTableProvider, ModalContext, ModalProvider_default as ModalProvider, NextGameCountdown, NextGameLabel_default as NextGameLabel, PlayerDetailsCard_default as PlayerDetailsCard, PlayerDisplayCard_default as PlayerDisplayCard, PlayerHighlightsCard, PlayerPageLayout, PlayerPromptCard_default as PlayerPromptCard, PlayerResultCard_default as PlayerResultCard, PlayerTagsCard_default as PlayerTagsCard, PlayerTagsEdit_default as PlayerTagsEdit, PlayersScrollableList_default as PlayersScrollableList, ResultsContainer_default as ResultsContainer, ScrollableResultsList_default as ScrollableResultsList, SearchPageLayout, SearchResultCard_default as SearchResultCard, SortOptions_default as SortOptions, TableActionsBar, TablePageLayout_default as TablePageLayout, TableResultCard_default as TableResultCard, TablesScrollableList_default as TablesScrollableList, TagEditor, TagsFilter_default as TagsFilter, TextSearchCard_default as TextSearchCard, TypeFilter_default as TypeFilter, generateTagsDisplay, renderTagsFromIds, useEventEdit, useGameTableContext, useModal };
2700
2960
  //# sourceMappingURL=index.mjs.map
2701
2961
  //# sourceMappingURL=index.mjs.map