@mbpockets/shared-ui 0.1.20 → 0.2.0

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 +208 -121
  2. package/dist/EventPage/index.cjs.map +1 -1
  3. package/dist/EventPage/index.mjs +200 -119
  4. package/dist/EventPage/index.mjs.map +1 -1
  5. package/dist/EventPage.cjs +208 -121
  6. package/dist/EventPage.cjs.map +1 -1
  7. package/dist/EventPage.mjs +200 -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 +138 -67
  30. package/dist/SearchPage/Results/index.cjs.map +1 -1
  31. package/dist/SearchPage/Results/index.mjs +126 -63
  32. package/dist/SearchPage/Results/index.mjs.map +1 -1
  33. package/dist/SearchPage/Results.cjs +138 -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 +126 -63
  38. package/dist/SearchPage/Results.mjs.map +1 -1
  39. package/dist/SearchPage/index.cjs +495 -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 +482 -216
  44. package/dist/SearchPage/index.mjs.map +1 -1
  45. package/dist/SearchPage.cjs +495 -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 +482 -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 +446 -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 +434 -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,21 @@ 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
+ const text = full || "";
998
+ return text.length > 200 ? `${text.slice(0, 200).trimEnd()}...` : text;
999
+ })() }) : /* @__PURE__ */ jsx(Typography4, { variant: "body1", children: result.description }),
1000
+ result.tags && result.tags.length > 0 && /* @__PURE__ */ jsx(Box2, { sx: { mt: 1, display: "flex", flexWrap: "wrap", gap: 1 }, children: renderTagsFromIds(result.tags, tags) })
1008
1001
  ] })
1009
1002
  ] })
1010
1003
  }
@@ -1059,21 +1052,60 @@ var PlayerResultCard = ({
1059
1052
  return /* @__PURE__ */ jsx(BaseSearchResultCard_default, { result, onClick, icon: playerIcon, tags });
1060
1053
  };
1061
1054
  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
1055
+ var TableResultCard = ({
1056
+ result,
1057
+ onClick,
1058
+ tags
1059
+ }) => {
1060
+ const rawCapacity = result.capacity;
1061
+ const hasDefinedCapacity = typeof rawCapacity === "number" && Number.isFinite(rawCapacity) && rawCapacity > 0;
1062
+ const capacity = hasDefinedCapacity ? rawCapacity : 0;
1063
+ const activePlayers = typeof result.numPlayers === "number" ? result.numPlayers : 0;
1064
+ const availableSlots = Math.max(capacity - activePlayers, 0);
1065
+ const hasDM = typeof result.hasDM === "boolean" ? result.hasDM : Boolean(result.dungeonMaster);
1066
+ const occupancyPercentage = hasDefinedCapacity ? activePlayers / capacity * 100 : 100;
1067
+ const tableIcon = /* @__PURE__ */ jsx(
1068
+ TableRestaurantIcon,
1069
+ {
1070
+ sx: {
1071
+ fontSize: 40,
1072
+ color: "primary.main"
1073
+ }
1074
+ }
1075
+ );
1076
+ return /* @__PURE__ */ jsx(BaseSearchResultCard_default, { result, onClick, icon: tableIcon, tags, children: /* @__PURE__ */ jsxs(Box2, { sx: { mb: 2 }, children: [
1077
+ /* @__PURE__ */ jsxs(Box2, { sx: { display: "flex", justifyContent: "space-between", alignItems: "center", mb: 1 }, children: [
1078
+ /* @__PURE__ */ jsxs(Typography4, { variant: "body2", children: [
1079
+ /* @__PURE__ */ jsx("strong", { children: "Players:" }),
1080
+ " ",
1081
+ hasDefinedCapacity ? `${activePlayers}/${capacity}` : activePlayers
1073
1082
  ] }),
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" })
1083
+ typeof hasDM === "boolean" && /* @__PURE__ */ jsx(
1084
+ Chip2,
1085
+ {
1086
+ icon: hasDM ? /* @__PURE__ */ jsx(SupervisorAccountIcon, {}) : /* @__PURE__ */ jsx(PersonIcon, {}),
1087
+ label: hasDM ? "DM Present" : "No DM",
1088
+ color: hasDM ? "success" : "warning",
1089
+ size: "small"
1090
+ }
1091
+ )
1075
1092
  ] }),
1076
- /* @__PURE__ */ jsx(LinearProgress, { variant: "determinate", value: occupancy, sx: { height: 8, borderRadius: 4 } })
1093
+ /* @__PURE__ */ jsx(
1094
+ LinearProgress,
1095
+ {
1096
+ variant: "determinate",
1097
+ value: occupancyPercentage,
1098
+ sx: {
1099
+ height: 10,
1100
+ borderRadius: 5,
1101
+ backgroundColor: "#e0e0e0",
1102
+ "& .MuiLinearProgress-bar": {
1103
+ backgroundColor: hasDefinedCapacity ? availableSlots > 0 ? "#4caf50" : "#f44336" : "#2196f3"
1104
+ }
1105
+ }
1106
+ }
1107
+ ),
1108
+ hasDefinedCapacity && /* @__PURE__ */ jsx(Typography4, { variant: "body2", sx: { mt: 0.5, textAlign: "right" }, children: availableSlots > 0 ? `${availableSlots} slot${availableSlots !== 1 ? "s" : ""} available` : "Table full" })
1077
1109
  ] }) });
1078
1110
  };
1079
1111
  var TableResultCard_default = TableResultCard;
@@ -1092,20 +1124,42 @@ var EventResultCard = ({
1092
1124
  try {
1093
1125
  const date = new Date(dateString);
1094
1126
  return date.toLocaleDateString("en-US", options);
1095
- } catch {
1127
+ } catch (error) {
1096
1128
  return dateString;
1097
1129
  }
1098
1130
  };
1099
1131
  const formattedDate = result.date ? formatDate(result.date) : "Date TBD";
1100
1132
  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 })
1133
+ const eventIcon = /* @__PURE__ */ jsx(
1134
+ EventIcon,
1135
+ {
1136
+ sx: {
1137
+ fontSize: 40,
1138
+ color: "primary.main"
1139
+ }
1140
+ }
1141
+ );
1142
+ return /* @__PURE__ */ jsx(BaseSearchResultCard_default, { result, onClick, icon: eventIcon, tags, children: /* @__PURE__ */ jsxs(Box2, { sx: { mb: 2 }, children: [
1143
+ /* @__PURE__ */ jsxs(Box2, { sx: { display: "flex", alignItems: "center", mb: 1 }, children: [
1144
+ /* @__PURE__ */ jsx(CalendarTodayIcon, { sx: { mr: 1, color: "primary.main" } }),
1145
+ /* @__PURE__ */ jsxs(Typography4, { variant: "body2", children: [
1146
+ /* @__PURE__ */ jsx("strong", { children: "Date:" }),
1147
+ " ",
1148
+ formattedDate
1149
+ ] })
1150
+ ] }),
1151
+ /* @__PURE__ */ jsxs(Box2, { sx: { display: "flex", alignItems: "center" }, children: [
1152
+ /* @__PURE__ */ jsx(LocationOnIcon, { sx: { mr: 1, color: "primary.main" } }),
1153
+ /* @__PURE__ */ jsxs(Typography4, { variant: "body2", children: [
1154
+ /* @__PURE__ */ jsx("strong", { children: "Location:" }),
1155
+ " ",
1156
+ location
1157
+ ] })
1105
1158
  ] }),
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 })
1159
+ result.organizer && /* @__PURE__ */ jsxs(Typography4, { variant: "body2", sx: { mt: 1 }, children: [
1160
+ /* @__PURE__ */ jsx("strong", { children: "Organizer:" }),
1161
+ " ",
1162
+ result.organizer
1109
1163
  ] })
1110
1164
  ] }) });
1111
1165
  };
@@ -1113,9 +1167,11 @@ var EventResultCard_default = EventResultCard;
1113
1167
  var ResultsContainer = ({
1114
1168
  results,
1115
1169
  onResultClick,
1116
- tags
1170
+ tags,
1171
+ pagination,
1172
+ onPacketChange
1117
1173
  }) => {
1118
- if (results.length === 0 || !results.map) {
1174
+ if (!results || results.length === 0 || !results.map) {
1119
1175
  return /* @__PURE__ */ jsx(Box2, { sx: { textAlign: "center", py: 4 }, children: "No results found. Try adjusting your filters." });
1120
1176
  }
1121
1177
  const onPlayerClick = (id) => {
@@ -1127,43 +1183,68 @@ var ResultsContainer = ({
1127
1183
  const onEventClick = (id) => {
1128
1184
  onResultClick == null ? void 0 : onResultClick(id, "event");
1129
1185
  };
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
- }) });
1186
+ const handlePacketChange = (_event, packet) => {
1187
+ onPacketChange == null ? void 0 : onPacketChange(packet);
1188
+ };
1189
+ const startResult = pagination ? (pagination.currentPacket - 1) * pagination.packetSize + 1 : 1;
1190
+ const endResult = pagination ? Math.min(pagination.currentPacket * pagination.packetSize, pagination.totalResults) : results.length;
1191
+ return /* @__PURE__ */ jsxs(Box2, { sx: { display: "flex", flexDirection: "column", gap: 2 }, children: [
1192
+ pagination && /* @__PURE__ */ jsx(Box2, { sx: { display: "flex", justifyContent: "space-between", alignItems: "center", mb: 1 }, children: /* @__PURE__ */ jsxs(Typography4, { variant: "body2", color: "text.secondary", children: [
1193
+ "Showing ",
1194
+ startResult,
1195
+ "-",
1196
+ endResult,
1197
+ " of ",
1198
+ pagination.totalResults,
1199
+ " results"
1200
+ ] }) }),
1201
+ results.map((result) => {
1202
+ switch (result.type) {
1203
+ case "player":
1204
+ return /* @__PURE__ */ jsx(
1205
+ PlayerResultCard_default,
1206
+ {
1207
+ result,
1208
+ onClick: onPlayerClick,
1209
+ tags
1210
+ },
1211
+ result.id
1212
+ );
1213
+ case "table":
1214
+ return /* @__PURE__ */ jsx(
1215
+ TableResultCard_default,
1216
+ {
1217
+ result,
1218
+ onClick: onTableClick,
1219
+ tags
1220
+ },
1221
+ result.id
1222
+ );
1223
+ case "event":
1224
+ return /* @__PURE__ */ jsx(
1225
+ EventResultCard_default,
1226
+ {
1227
+ result,
1228
+ onClick: onEventClick,
1229
+ tags
1230
+ },
1231
+ result.id
1232
+ );
1233
+ default:
1234
+ console.error(`Unknown result type: ${result.type}`);
1235
+ return null;
1236
+ }
1237
+ }),
1238
+ pagination && pagination.totalPackets > 1 && /* @__PURE__ */ jsx(Box2, { sx: { display: "flex", justifyContent: "center", mt: 4 }, children: /* @__PURE__ */ jsx(
1239
+ Pagination,
1240
+ {
1241
+ count: pagination.totalPackets,
1242
+ page: pagination.currentPacket,
1243
+ onChange: handlePacketChange,
1244
+ color: "primary"
1245
+ }
1246
+ ) })
1247
+ ] });
1167
1248
  };
1168
1249
  var ResultsContainer_default = ResultsContainer;
1169
1250
  var ScrollableResultsList = ({
@@ -1181,21 +1262,14 @@ var TablesScrollableList = ({
1181
1262
  results,
1182
1263
  tags,
1183
1264
  maxHeight,
1184
- onResultClick,
1185
- sortBy = "availability"
1265
+ onResultClick
1186
1266
  }) => {
1187
1267
  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
1268
  const handleClick = (id) => onResultClick == null ? void 0 : onResultClick(id);
1195
1269
  return /* @__PURE__ */ jsx(
1196
1270
  ScrollableResultsList_default,
1197
1271
  {
1198
- results: sortedTables,
1272
+ results: tables,
1199
1273
  tags,
1200
1274
  maxHeight,
1201
1275
  onResultClick: (id, type) => {
@@ -1213,8 +1287,8 @@ var EventTablesCard = ({
1213
1287
  }) => {
1214
1288
  return /* @__PURE__ */ jsxs(Card10, { elevation: 6, sx: { width: "100%", boxShadow: "0px 8px 24px rgba(0, 0, 0, 0.15)" }, children: [
1215
1289
  /* @__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" }) })
1290
+ /* @__PURE__ */ jsx(Divider3, {}),
1291
+ /* @__PURE__ */ jsx(CardContent10, { children: /* @__PURE__ */ jsx(TablesScrollableList_default, { results: tables, tags, maxHeight, onResultClick: onTableClick }) })
1218
1292
  ] });
1219
1293
  };
1220
1294
  var EventTablesCard_default = EventTablesCard;
@@ -1774,6 +1848,26 @@ function PlayerPageLayout({
1774
1848
  ] }) })
1775
1849
  ] }) }) });
1776
1850
  }
1851
+ var ExpiredTablesFilter = ({
1852
+ includeExpiredTables,
1853
+ onChange
1854
+ }) => {
1855
+ return /* @__PURE__ */ jsx(Box2, { sx: { mt: 2 }, children: /* @__PURE__ */ jsx(
1856
+ FormControlLabel,
1857
+ {
1858
+ control: /* @__PURE__ */ jsx(
1859
+ Checkbox,
1860
+ {
1861
+ checked: includeExpiredTables,
1862
+ onChange: (e) => onChange(e.target.checked),
1863
+ color: "primary"
1864
+ }
1865
+ ),
1866
+ label: "Show expired tables"
1867
+ }
1868
+ ) });
1869
+ };
1870
+ var ExpiredTablesFilter_default = ExpiredTablesFilter;
1777
1871
  var SORT_OPTIONS = [
1778
1872
  { id: "relevance", label: "Relevance" },
1779
1873
  { id: "newest", label: "Newest" },
@@ -1787,7 +1881,7 @@ var SortOptions = ({
1787
1881
  onChange == null ? void 0 : onChange(event.target.value);
1788
1882
  };
1789
1883
  return /* @__PURE__ */ jsxs(Fragment, { children: [
1790
- /* @__PURE__ */ jsx(Typography10, { variant: "h6", gutterBottom: true, children: "Sort By" }),
1884
+ /* @__PURE__ */ jsx(Typography4, { variant: "h6", gutterBottom: true, children: "Sort By" }),
1791
1885
  /* @__PURE__ */ jsx(FormControl2, { children: /* @__PURE__ */ jsx(RadioGroup, { defaultValue: defaultValue2, onChange: handleSortChange, children: SORT_OPTIONS.map((option) => /* @__PURE__ */ jsx(
1792
1886
  FormControlLabel,
1793
1887
  {
@@ -1802,11 +1896,19 @@ var SortOptions = ({
1802
1896
  var SortOptions_default = SortOptions;
1803
1897
  var TagsFilter = ({
1804
1898
  onChange,
1805
- tags: Tags = []
1899
+ tags: Tags = [],
1900
+ initialSelectedTags
1806
1901
  }) => {
1807
- const [mustHaveTags, setMustHaveTags] = React7.useState([]);
1808
- const [mustNotHaveTags, setMustNotHaveTags] = React7.useState([]);
1809
- const [shouldHaveAtLeastOneTags, setShouldHaveAtLeastOneTags] = React7.useState([]);
1902
+ const [mustHaveTags, setMustHaveTags] = React7.useState((initialSelectedTags == null ? void 0 : initialSelectedTags.mustHave) || []);
1903
+ const [mustNotHaveTags, setMustNotHaveTags] = React7.useState((initialSelectedTags == null ? void 0 : initialSelectedTags.mustNotHave) || []);
1904
+ const [shouldHaveAtLeastOneTags, setShouldHaveAtLeastOneTags] = React7.useState((initialSelectedTags == null ? void 0 : initialSelectedTags.shouldHaveAtLeastOne) || []);
1905
+ React7.useEffect(() => {
1906
+ if (initialSelectedTags) {
1907
+ setMustHaveTags(initialSelectedTags.mustHave || []);
1908
+ setMustNotHaveTags(initialSelectedTags.mustNotHave || []);
1909
+ setShouldHaveAtLeastOneTags(initialSelectedTags.shouldHaveAtLeastOne || []);
1910
+ }
1911
+ }, [initialSelectedTags]);
1810
1912
  Tags = !!Tags ? Tags : [];
1811
1913
  const [inputValues, setInputValues] = React7.useState({
1812
1914
  mustHave: "",
@@ -1816,7 +1918,7 @@ var TagsFilter = ({
1816
1918
  const tagOptions = React7.useMemo(() => {
1817
1919
  console.log("available tags: " + JSON.stringify(Tags));
1818
1920
  console.log(!Tags);
1819
- if (!Tags || Tags.length == 0 || !Tags.map) return [];
1921
+ if (!Tags || Tags.length === 0 || !Tags.map) return [];
1820
1922
  return Tags.map((tag) => ({
1821
1923
  value: tag.id,
1822
1924
  label: tag.label
@@ -1848,7 +1950,7 @@ var TagsFilter = ({
1848
1950
  };
1849
1951
  const renderSelectedTags = (selectedTags, category) => {
1850
1952
  const tagValues = [];
1851
- if (!Tags || Tags.length == 0 || !Tags.map) return null;
1953
+ if (!Tags || Tags.length === 0 || !Tags.map) return null;
1852
1954
  Tags.forEach((tag) => {
1853
1955
  if (selectedTags.includes(tag.id)) {
1854
1956
  tagValues.push(tag);
@@ -1857,27 +1959,11 @@ var TagsFilter = ({
1857
1959
  if (tagValues.length === 0) {
1858
1960
  return null;
1859
1961
  }
1860
- return /* @__PURE__ */ jsx(Box2, { sx: { display: "flex", flexWrap: "wrap", gap: 1, mb: 2 }, children: tagValues.map((tag) => /* @__PURE__ */ jsxs(
1861
- "span",
1962
+ return /* @__PURE__ */ jsx(Box2, { sx: { display: "flex", flexWrap: "wrap", gap: 1, mb: 2 }, children: tagValues.map((tag) => /* @__PURE__ */ jsx(
1963
+ Chip,
1862
1964
  {
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
- ]
1965
+ tag,
1966
+ removeCallback: (tagId) => handleTagChange(tagId, category)
1881
1967
  },
1882
1968
  tag.id
1883
1969
  )) });
@@ -1885,7 +1971,7 @@ var TagsFilter = ({
1885
1971
  const createTagSelector = (category, label) => {
1886
1972
  const selectedTags = category === "mustHave" ? mustHaveTags : category === "mustNotHave" ? mustNotHaveTags : shouldHaveAtLeastOneTags;
1887
1973
  return /* @__PURE__ */ jsxs(Fragment, { children: [
1888
- /* @__PURE__ */ jsx(Typography10, { variant: "subtitle1", gutterBottom: true, sx: { mt: 2 }, children: label }),
1974
+ /* @__PURE__ */ jsx(Typography4, { variant: "subtitle1", gutterBottom: true, sx: { mt: 2 }, children: label }),
1889
1975
  renderSelectedTags(selectedTags, category),
1890
1976
  /* @__PURE__ */ jsx(
1891
1977
  Autocomplete,
@@ -1938,11 +2024,11 @@ var TagsFilter = ({
1938
2024
  ] });
1939
2025
  };
1940
2026
  return /* @__PURE__ */ jsxs(Fragment, { children: [
1941
- /* @__PURE__ */ jsx(Typography10, { variant: "h6", gutterBottom: true, children: "Tags" }),
2027
+ /* @__PURE__ */ jsx(Typography4, { variant: "h6", gutterBottom: true, children: "Tags" }),
1942
2028
  createTagSelector("mustHave", "Must Have Tags"),
1943
- /* @__PURE__ */ jsx(Divider2, { sx: { my: 2 } }),
2029
+ /* @__PURE__ */ jsx(Divider3, { sx: { my: 2 } }),
1944
2030
  createTagSelector("mustNotHave", "Must Not Have Tags"),
1945
- /* @__PURE__ */ jsx(Divider2, { sx: { my: 2 } }),
2031
+ /* @__PURE__ */ jsx(Divider3, { sx: { my: 2 } }),
1946
2032
  createTagSelector("shouldHaveAtLeastOne", "Should Contain At Least One Tag")
1947
2033
  ] });
1948
2034
  };
@@ -1972,21 +2058,80 @@ var CustomPopper2 = (props) => {
1972
2058
  );
1973
2059
  };
1974
2060
  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([]);
2061
+ var TextSearchCard = ({ onChange, selectedTypes, initialTextSearch }) => {
2062
+ const [query, setQuery] = React7.useState((initialTextSearch == null ? void 0 : initialTextSearch.query) || "");
2063
+ const [titleOnly, setTitleOnly] = React7.useState((initialTextSearch == null ? void 0 : initialTextSearch.titleOnly) || false);
2064
+ useEffect(() => {
2065
+ if (initialTextSearch) {
2066
+ setQuery(initialTextSearch.query || "");
2067
+ setTitleOnly(initialTextSearch.titleOnly || false);
2068
+ }
2069
+ }, [initialTextSearch]);
2070
+ const shouldShow = selectedTypes.includes("table") || selectedTypes.includes("event");
2071
+ if (!shouldShow) {
2072
+ return null;
2073
+ }
2074
+ const handleQueryChange = (e) => {
2075
+ const newQuery = e.target.value;
2076
+ setQuery(newQuery);
2077
+ if (onChange) {
2078
+ onChange({ query: newQuery, titleOnly });
2079
+ }
2080
+ };
2081
+ const handleTitleOnlyChange = (e) => {
2082
+ const newTitleOnly = e.target.checked;
2083
+ setTitleOnly(newTitleOnly);
2084
+ if (onChange) {
2085
+ onChange({ query, titleOnly: newTitleOnly });
2086
+ }
2087
+ };
2088
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
2089
+ /* @__PURE__ */ jsx(Typography4, { variant: "h6", gutterBottom: true, children: "Text Search" }),
2090
+ /* @__PURE__ */ jsxs(Box2, { sx: { mb: 2 }, children: [
2091
+ /* @__PURE__ */ jsx(
2092
+ TextField4,
2093
+ {
2094
+ fullWidth: true,
2095
+ label: "Search in title and description",
2096
+ variant: "outlined",
2097
+ value: query,
2098
+ onChange: handleQueryChange,
2099
+ placeholder: "Enter search terms...",
2100
+ sx: { mb: 1 }
2101
+ }
2102
+ ),
2103
+ /* @__PURE__ */ jsx(
2104
+ FormControlLabel,
2105
+ {
2106
+ control: /* @__PURE__ */ jsx(
2107
+ Checkbox,
2108
+ {
2109
+ checked: titleOnly,
2110
+ onChange: handleTitleOnlyChange
2111
+ }
2112
+ ),
2113
+ label: "Search in title only"
2114
+ }
2115
+ )
2116
+ ] })
2117
+ ] });
2118
+ };
2119
+ var TextSearchCard_default = TextSearchCard;
2120
+ var TypeFilter = ({ types, initialSelectedTypes = [], onChange }) => {
2121
+ const [selectedTypes, setSelectedTypes] = React7.useState(initialSelectedTypes);
2122
+ useEffect(() => {
2123
+ setSelectedTypes(initialSelectedTypes);
2124
+ }, [initialSelectedTypes]);
1982
2125
  const handleTypeChange = (typeId) => {
1983
2126
  const newSelectedTypes = selectedTypes.includes(typeId) ? selectedTypes.filter((id) => id !== typeId) : [...selectedTypes, typeId];
1984
2127
  setSelectedTypes(newSelectedTypes);
1985
- onChange == null ? void 0 : onChange(newSelectedTypes);
2128
+ if (onChange) {
2129
+ onChange(newSelectedTypes);
2130
+ }
1986
2131
  };
1987
2132
  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(
2133
+ /* @__PURE__ */ jsx(Typography4, { variant: "h6", gutterBottom: true, children: "Type" }),
2134
+ /* @__PURE__ */ jsx(FormGroup, { children: types.map((type) => /* @__PURE__ */ jsx(
1990
2135
  FormControlLabel,
1991
2136
  {
1992
2137
  control: /* @__PURE__ */ jsx(
@@ -1994,7 +2139,8 @@ var TypeFilter = ({ onChange }) => {
1994
2139
  {
1995
2140
  checked: selectedTypes.includes(type.id),
1996
2141
  onChange: () => handleTypeChange(type.id),
1997
- disabled: type.disabled
2142
+ disabled: type.id === "event",
2143
+ title: type.id === "event" ? "Coming soon! Currently only player and table search are supported." : ""
1998
2144
  }
1999
2145
  ),
2000
2146
  label: type.label
@@ -2005,22 +2151,67 @@ var TypeFilter = ({ onChange }) => {
2005
2151
  };
2006
2152
  var TypeFilter_default = TypeFilter;
2007
2153
  var FiltersContainer = ({
2154
+ initialSelectedTypes = [],
2155
+ initialSelectedTags,
2156
+ initialTextSearch,
2157
+ includeExpiredTables = false,
2008
2158
  onTypeChange,
2009
2159
  onTagChange,
2160
+ onTextSearchChange,
2161
+ onIncludeExpiredTablesChange,
2010
2162
  onSubmit,
2011
- tags
2163
+ tags,
2164
+ searchTypes
2012
2165
  }) => {
2166
+ const [selectedTypes, setSelectedTypes] = React7.useState(initialSelectedTypes);
2167
+ useEffect(() => {
2168
+ setSelectedTypes(initialSelectedTypes);
2169
+ }, [initialSelectedTypes]);
2170
+ const handleTypeChange = (types) => {
2171
+ setSelectedTypes(types);
2172
+ if (onTypeChange) {
2173
+ onTypeChange(types);
2174
+ }
2175
+ };
2013
2176
  return /* @__PURE__ */ jsxs(Box2, { children: [
2014
- /* @__PURE__ */ jsx(TypeFilter_default, { onChange: onTypeChange }),
2015
- /* @__PURE__ */ jsx(Divider2, { sx: { my: 2 } }),
2177
+ /* @__PURE__ */ jsx(
2178
+ TypeFilter_default,
2179
+ {
2180
+ types: searchTypes,
2181
+ initialSelectedTypes,
2182
+ onChange: handleTypeChange
2183
+ }
2184
+ ),
2185
+ /* @__PURE__ */ jsx(Divider3, { sx: { my: 2 } }),
2186
+ /* @__PURE__ */ jsx(
2187
+ TextSearchCard_default,
2188
+ {
2189
+ selectedTypes,
2190
+ initialTextSearch,
2191
+ onChange: onTextSearchChange
2192
+ }
2193
+ ),
2194
+ (selectedTypes.includes("table") || selectedTypes.includes("event")) && /* @__PURE__ */ jsx(Divider3, { sx: { my: 2 } }),
2016
2195
  /* @__PURE__ */ jsx(
2017
2196
  TagsFilter_default,
2018
2197
  {
2019
2198
  tags,
2199
+ initialSelectedTags,
2020
2200
  onChange: onTagChange
2021
2201
  }
2022
2202
  ),
2023
- /* @__PURE__ */ jsx(Divider2, { sx: { my: 2 } }),
2203
+ /* @__PURE__ */ jsx(Divider3, { sx: { my: 2 } }),
2204
+ selectedTypes.includes("table") && /* @__PURE__ */ jsxs(Fragment, { children: [
2205
+ /* @__PURE__ */ jsx(
2206
+ ExpiredTablesFilter_default,
2207
+ {
2208
+ includeExpiredTables,
2209
+ onChange: onIncludeExpiredTablesChange || (() => {
2210
+ })
2211
+ }
2212
+ ),
2213
+ /* @__PURE__ */ jsx(Divider3, { sx: { my: 2 } })
2214
+ ] }),
2024
2215
  /* @__PURE__ */ jsx(Box2, { sx: { display: "flex", justifyContent: "center", mt: 2 }, children: /* @__PURE__ */ jsx(
2025
2216
  Button7,
2026
2217
  {
@@ -2078,16 +2269,75 @@ var SearchResultCard_default = SearchResultCard;
2078
2269
  function SearchPageLayout({
2079
2270
  results,
2080
2271
  title = "Search Results",
2272
+ initialSelectedTypes = [],
2273
+ initialSelectedTags = {
2274
+ mustHave: [],
2275
+ mustNotHave: [],
2276
+ shouldHaveAtLeastOne: []
2277
+ },
2278
+ initialTextSearch = {
2279
+ query: "",
2280
+ titleOnly: false
2281
+ },
2282
+ includeExpiredTables: initialIncludeExpiredTables = false,
2081
2283
  onTypeChange,
2082
2284
  onTagChange,
2285
+ onTextSearchChange,
2286
+ onIncludeExpiredTablesChange,
2083
2287
  onSubmit,
2084
2288
  onResultClick,
2289
+ onPacketChange,
2290
+ pagination,
2085
2291
  validTags,
2086
- allTags
2292
+ allTags,
2293
+ searchTypes,
2294
+ isLoading = false
2087
2295
  }) {
2088
- "use client";
2089
2296
  const theme = useTheme();
2090
2297
  const isMobile = useMediaQuery(theme.breakpoints.down("md"));
2298
+ const [selectedTypes, setSelectedTypes] = useState(initialSelectedTypes);
2299
+ const [selectedTags, setSelectedTags] = useState(initialSelectedTags);
2300
+ const [textSearch, setTextSearch] = useState(initialTextSearch);
2301
+ const [includeExpiredTables, setIncludeExpiredTables] = useState(initialIncludeExpiredTables);
2302
+ useEffect(() => {
2303
+ setSelectedTypes(initialSelectedTypes);
2304
+ }, [initialSelectedTypes]);
2305
+ useEffect(() => {
2306
+ setSelectedTags(initialSelectedTags);
2307
+ }, [initialSelectedTags]);
2308
+ useEffect(() => {
2309
+ setTextSearch(initialTextSearch);
2310
+ }, [initialTextSearch]);
2311
+ useEffect(() => {
2312
+ setIncludeExpiredTables(initialIncludeExpiredTables);
2313
+ }, [initialIncludeExpiredTables]);
2314
+ const handleTypeChange = (types) => {
2315
+ setSelectedTypes(types);
2316
+ if (onTypeChange) onTypeChange(types);
2317
+ };
2318
+ const handleTagChange = (tags) => {
2319
+ setSelectedTags(tags);
2320
+ if (onTagChange) onTagChange(tags);
2321
+ };
2322
+ const handleTextSearchChange = (ts) => {
2323
+ setTextSearch(ts);
2324
+ if (onTextSearchChange) onTextSearchChange(ts);
2325
+ };
2326
+ const handleIncludeExpiredTablesChange = (include) => {
2327
+ setIncludeExpiredTables(include);
2328
+ if (onIncludeExpiredTablesChange) onIncludeExpiredTablesChange(include);
2329
+ };
2330
+ const handleSubmit = () => {
2331
+ const currentCriteria = {
2332
+ selectedTypes,
2333
+ selectedTags,
2334
+ textSearch,
2335
+ includeExpiredTables
2336
+ };
2337
+ if (onSubmit) {
2338
+ onSubmit(currentCriteria);
2339
+ }
2340
+ };
2091
2341
  return /* @__PURE__ */ jsxs(Box2, { sx: { padding: 2 }, children: [
2092
2342
  /* @__PURE__ */ jsx(Card10, { sx: { marginBottom: 2 }, children: /* @__PURE__ */ jsx(
2093
2343
  CardHeader4,
@@ -2118,10 +2368,17 @@ function SearchPageLayout({
2118
2368
  /* @__PURE__ */ jsx(CardContent10, { children: /* @__PURE__ */ jsx(
2119
2369
  FiltersContainer_default,
2120
2370
  {
2121
- onTypeChange,
2122
- onTagChange,
2123
- onSubmit,
2124
- tags: validTags
2371
+ initialSelectedTypes: selectedTypes,
2372
+ initialSelectedTags: selectedTags,
2373
+ initialTextSearch: textSearch,
2374
+ includeExpiredTables,
2375
+ onTypeChange: handleTypeChange,
2376
+ onTagChange: handleTagChange,
2377
+ onTextSearchChange: handleTextSearchChange,
2378
+ onIncludeExpiredTablesChange: handleIncludeExpiredTablesChange,
2379
+ onSubmit: handleSubmit,
2380
+ tags: validTags,
2381
+ searchTypes
2125
2382
  }
2126
2383
  ) })
2127
2384
  ] }) }),
@@ -2138,10 +2395,12 @@ function SearchPageLayout({
2138
2395
  }
2139
2396
  }
2140
2397
  ),
2141
- /* @__PURE__ */ jsx(CardContent10, { children: /* @__PURE__ */ jsx(
2398
+ /* @__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
2399
  ResultsContainer_default,
2143
2400
  {
2144
2401
  results,
2402
+ pagination,
2403
+ onPacketChange,
2145
2404
  onResultClick,
2146
2405
  tags: allTags
2147
2406
  }
@@ -2696,6 +2955,6 @@ var renderEditableTags = function(selectedTags, allTags, onToggleTag) {
2696
2955
  };
2697
2956
  var TablePageLayout_default = TablePageLayout;
2698
2957
 
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 };
2958
+ 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
2959
  //# sourceMappingURL=index.mjs.map
2701
2960
  //# sourceMappingURL=index.mjs.map