@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.cjs CHANGED
@@ -15,24 +15,30 @@ var Grid8 = require('@mui/material/Grid');
15
15
  var Card10 = require('@mui/material/Card');
16
16
  var CardContent10 = require('@mui/material/CardContent');
17
17
  var CardHeader4 = require('@mui/material/CardHeader');
18
- var Divider2 = require('@mui/material/Divider');
18
+ var Divider3 = require('@mui/material/Divider');
19
+ var Typography4 = require('@mui/material/Typography');
20
+ var Pagination = require('@mui/material/Pagination');
19
21
  var Avatar = require('@mui/material/Avatar');
20
- var CasinoIcon = require('@mui/icons-material/Casino');
22
+ var Chip2 = require('@mui/material/Chip');
23
+ var LinearProgress = require('@mui/material/LinearProgress');
24
+ var PersonIcon = require('@mui/icons-material/Person');
25
+ var SupervisorAccountIcon = require('@mui/icons-material/SupervisorAccount');
26
+ var TableRestaurantIcon = require('@mui/icons-material/TableRestaurant');
21
27
  var CalendarTodayIcon = require('@mui/icons-material/CalendarToday');
22
28
  var LocationOnIcon = require('@mui/icons-material/LocationOn');
23
29
  var EventIcon = require('@mui/icons-material/Event');
24
30
  var Autocomplete = require('@mui/material/Autocomplete');
25
31
  var Popper = require('@mui/material/Popper');
26
- var Typography10 = require('@mui/material/Typography');
32
+ var FormControlLabel = require('@mui/material/FormControlLabel');
33
+ var Checkbox = require('@mui/material/Checkbox');
27
34
  var FormControl2 = require('@mui/material/FormControl');
28
35
  var RadioGroup = require('@mui/material/RadioGroup');
29
- var FormControlLabel = require('@mui/material/FormControlLabel');
30
36
  var Radio = require('@mui/material/Radio');
31
37
  var TextField4 = require('@mui/material/TextField');
32
38
  var FormGroup = require('@mui/material/FormGroup');
33
- var Checkbox = require('@mui/material/Checkbox');
34
39
  var Button7 = require('@mui/material/Button');
35
40
  var SearchIcon = require('@mui/icons-material/Search');
41
+ var CircularProgress3 = require('@mui/material/CircularProgress');
36
42
  var Image2 = require('next/image');
37
43
  var ListIcon = require('@mui/icons-material/List');
38
44
  var SaveIcon = require('@mui/icons-material/Save');
@@ -51,24 +57,30 @@ var Grid8__default = /*#__PURE__*/_interopDefault(Grid8);
51
57
  var Card10__default = /*#__PURE__*/_interopDefault(Card10);
52
58
  var CardContent10__default = /*#__PURE__*/_interopDefault(CardContent10);
53
59
  var CardHeader4__default = /*#__PURE__*/_interopDefault(CardHeader4);
54
- var Divider2__default = /*#__PURE__*/_interopDefault(Divider2);
60
+ var Divider3__default = /*#__PURE__*/_interopDefault(Divider3);
61
+ var Typography4__default = /*#__PURE__*/_interopDefault(Typography4);
62
+ var Pagination__default = /*#__PURE__*/_interopDefault(Pagination);
55
63
  var Avatar__default = /*#__PURE__*/_interopDefault(Avatar);
56
- var CasinoIcon__default = /*#__PURE__*/_interopDefault(CasinoIcon);
64
+ var Chip2__default = /*#__PURE__*/_interopDefault(Chip2);
65
+ var LinearProgress__default = /*#__PURE__*/_interopDefault(LinearProgress);
66
+ var PersonIcon__default = /*#__PURE__*/_interopDefault(PersonIcon);
67
+ var SupervisorAccountIcon__default = /*#__PURE__*/_interopDefault(SupervisorAccountIcon);
68
+ var TableRestaurantIcon__default = /*#__PURE__*/_interopDefault(TableRestaurantIcon);
57
69
  var CalendarTodayIcon__default = /*#__PURE__*/_interopDefault(CalendarTodayIcon);
58
70
  var LocationOnIcon__default = /*#__PURE__*/_interopDefault(LocationOnIcon);
59
71
  var EventIcon__default = /*#__PURE__*/_interopDefault(EventIcon);
60
72
  var Autocomplete__default = /*#__PURE__*/_interopDefault(Autocomplete);
61
73
  var Popper__default = /*#__PURE__*/_interopDefault(Popper);
62
- var Typography10__default = /*#__PURE__*/_interopDefault(Typography10);
74
+ var FormControlLabel__default = /*#__PURE__*/_interopDefault(FormControlLabel);
75
+ var Checkbox__default = /*#__PURE__*/_interopDefault(Checkbox);
63
76
  var FormControl2__default = /*#__PURE__*/_interopDefault(FormControl2);
64
77
  var RadioGroup__default = /*#__PURE__*/_interopDefault(RadioGroup);
65
- var FormControlLabel__default = /*#__PURE__*/_interopDefault(FormControlLabel);
66
78
  var Radio__default = /*#__PURE__*/_interopDefault(Radio);
67
79
  var TextField4__default = /*#__PURE__*/_interopDefault(TextField4);
68
80
  var FormGroup__default = /*#__PURE__*/_interopDefault(FormGroup);
69
- var Checkbox__default = /*#__PURE__*/_interopDefault(Checkbox);
70
81
  var Button7__default = /*#__PURE__*/_interopDefault(Button7);
71
82
  var SearchIcon__default = /*#__PURE__*/_interopDefault(SearchIcon);
83
+ var CircularProgress3__default = /*#__PURE__*/_interopDefault(CircularProgress3);
72
84
  var Image2__default = /*#__PURE__*/_interopDefault(Image2);
73
85
  var ListIcon__default = /*#__PURE__*/_interopDefault(ListIcon);
74
86
  var SaveIcon__default = /*#__PURE__*/_interopDefault(SaveIcon);
@@ -975,6 +987,14 @@ var generateLink = function(link) {
975
987
  link.text
976
988
  );
977
989
  };
990
+ var NextGameLabel = ({ nextGameTime }) => {
991
+ const date = typeof nextGameTime === "string" ? new Date(nextGameTime) : nextGameTime;
992
+ return /* @__PURE__ */ jsxRuntime.jsxs(material.Typography, { variant: "caption", sx: { display: "block", mb: 1, color: "primary.main", fontWeight: "bold" }, children: [
993
+ "Next Game: ",
994
+ date.toLocaleString()
995
+ ] });
996
+ };
997
+ var NextGameLabel_default = NextGameLabel;
978
998
  var BaseSearchResultCard = ({
979
999
  result,
980
1000
  onClick,
@@ -982,13 +1002,19 @@ var BaseSearchResultCard = ({
982
1002
  icon,
983
1003
  tags
984
1004
  }) => {
985
- const handleClick = () => {
1005
+ const handleClick = (e) => {
986
1006
  if (onClick) {
987
- onClick(result.id);
1007
+ if (e.ctrlKey || e.metaKey || e.shiftKey) {
1008
+ e.stopPropagation();
1009
+ const url = `/${result.type}/${result.id}`;
1010
+ window.open(url, "_blank");
1011
+ } else {
1012
+ onClick(result.id);
1013
+ }
988
1014
  }
989
1015
  };
990
1016
  return /* @__PURE__ */ jsxRuntime.jsx(
991
- material.Card,
1017
+ Card10__default.default,
992
1018
  {
993
1019
  elevation: 6,
994
1020
  sx: {
@@ -1001,48 +1027,22 @@ var BaseSearchResultCard = ({
1001
1027
  },
1002
1028
  marginBottom: 2
1003
1029
  },
1004
- onClick: handleClick,
1005
- children: /* @__PURE__ */ jsxRuntime.jsxs(material.CardContent, { sx: { display: "flex", alignItems: "flex-start" }, children: [
1006
- icon && /* @__PURE__ */ jsxRuntime.jsx(material.Box, { sx: { mr: 2, display: "flex", alignItems: "center", pt: 0.5 }, children: icon }),
1007
- /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { flex: 1 }, children: [
1008
- /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "h6", sx: { mb: 1 }, children: result.title }),
1030
+ onClick: (e) => handleClick(e),
1031
+ children: /* @__PURE__ */ jsxRuntime.jsxs(CardContent10__default.default, { sx: { display: "flex", alignItems: "flex-start" }, children: [
1032
+ icon && /* @__PURE__ */ jsxRuntime.jsx(Box2__default.default, { sx: { mr: 2, display: "flex", alignItems: "center", pt: 0.5 }, children: icon }),
1033
+ /* @__PURE__ */ jsxRuntime.jsxs(Box2__default.default, { sx: { flex: 1 }, children: [
1034
+ /* @__PURE__ */ jsxRuntime.jsx(Typography4__default.default, { variant: "h6", sx: { mb: 1 }, children: result.title }),
1035
+ result.nextGameTime && /* @__PURE__ */ jsxRuntime.jsx(NextGameLabel_default, { nextGameTime: result.nextGameTime }),
1036
+ result.type === "table" && result.shortDescription ? /* @__PURE__ */ jsxRuntime.jsx(Typography4__default.default, { variant: "body2", sx: { mb: 1 }, children: result.shortDescription }) : null,
1009
1037
  children,
1010
- /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "body1", children: result.description }),
1011
- result.tags && result.tags.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(material.Box, { sx: { mt: 1 }, children: /* @__PURE__ */ jsxRuntime.jsx(material.Box, { sx: {
1012
- display: "block",
1013
- whiteSpace: "nowrap",
1014
- overflow: "hidden",
1015
- textOverflow: "clip",
1016
- pl: 0.5
1017
- // Add some padding to prevent clipping of the leftmost tag
1018
- }, children: (() => {
1019
- const MAX_VISIBLE = 5;
1020
- const tagObjs = result.tags.map((tagId) => tags.find((t) => t.id === tagId)).filter((t) => Boolean(t));
1021
- const visible = tagObjs.slice(0, MAX_VISIBLE);
1022
- const hiddenCount = Math.max(tagObjs.length - visible.length, 0);
1023
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1024
- visible.map((tag) => generateTagsDisplay(tag)),
1025
- hiddenCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs(
1026
- "span",
1027
- {
1028
- className: "inline-block text-sm px-3 py-1 rounded-full outline-black outline-2 font-outlined",
1029
- style: {
1030
- marginTop: "6px",
1031
- marginRight: "6px",
1032
- marginBottom: "6px",
1033
- background: "#9e9e9e",
1034
- color: "white",
1035
- textShadow: "black 0.2em 0.2em 0.4em"
1036
- },
1037
- children: [
1038
- "+",
1039
- hiddenCount,
1040
- " more"
1041
- ]
1042
- }
1043
- )
1044
- ] });
1045
- })() }) })
1038
+ result.type === "table" ? /* @__PURE__ */ jsxRuntime.jsx(Typography4__default.default, { variant: "body1", children: (() => {
1039
+ var _a, _b;
1040
+ const full = (_b = (_a = result.fullDescription) != null ? _a : result.description) != null ? _b : "";
1041
+ if (typeof full !== "string") return "";
1042
+ const text = full || "";
1043
+ return text.length > 200 ? `${text.slice(0, 200).trimEnd()}...` : text;
1044
+ })() }) : /* @__PURE__ */ jsxRuntime.jsx(Typography4__default.default, { variant: "body1", children: result.description }),
1045
+ result.tags && result.tags.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(Box2__default.default, { sx: { mt: 1, display: "flex", flexWrap: "wrap", gap: 1 }, children: renderTagsFromIds(result.tags, tags) })
1046
1046
  ] })
1047
1047
  ] })
1048
1048
  }
@@ -1097,21 +1097,60 @@ var PlayerResultCard = ({
1097
1097
  return /* @__PURE__ */ jsxRuntime.jsx(BaseSearchResultCard_default, { result, onClick, icon: playerIcon, tags });
1098
1098
  };
1099
1099
  var PlayerResultCard_default = PlayerResultCard;
1100
- var TableResultCard = ({ result, tags, onClick }) => {
1101
- const capacity = result.capacity || 1;
1102
- const numPlayers = result.numPlayers || 0;
1103
- const occupancy = numPlayers / capacity * 100;
1104
- return /* @__PURE__ */ jsxRuntime.jsx(BaseSearchResultCard, { result, tags, onClick, icon: /* @__PURE__ */ jsxRuntime.jsx(CasinoIcon__default.default, { color: "primary" }), children: /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { mb: 1 }, children: [
1105
- /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { display: "flex", justifyContent: "space-between", alignItems: "center", mb: 0.5 }, children: [
1106
- /* @__PURE__ */ jsxRuntime.jsxs(material.Typography, { variant: "body2", color: "text.secondary", children: [
1107
- "Players: ",
1108
- numPlayers,
1109
- " / ",
1110
- capacity
1100
+ var TableResultCard = ({
1101
+ result,
1102
+ onClick,
1103
+ tags
1104
+ }) => {
1105
+ const rawCapacity = result.capacity;
1106
+ const hasDefinedCapacity = typeof rawCapacity === "number" && Number.isFinite(rawCapacity) && rawCapacity > 0;
1107
+ const capacity = hasDefinedCapacity ? rawCapacity : 0;
1108
+ const activePlayers = typeof result.numPlayers === "number" ? result.numPlayers : 0;
1109
+ const availableSlots = Math.max(capacity - activePlayers, 0);
1110
+ const hasDM = typeof result.hasDM === "boolean" ? result.hasDM : Boolean(result.dungeonMaster);
1111
+ const occupancyPercentage = hasDefinedCapacity ? activePlayers / capacity * 100 : 100;
1112
+ const tableIcon = /* @__PURE__ */ jsxRuntime.jsx(
1113
+ TableRestaurantIcon__default.default,
1114
+ {
1115
+ sx: {
1116
+ fontSize: 40,
1117
+ color: "primary.main"
1118
+ }
1119
+ }
1120
+ );
1121
+ return /* @__PURE__ */ jsxRuntime.jsx(BaseSearchResultCard_default, { result, onClick, icon: tableIcon, tags, children: /* @__PURE__ */ jsxRuntime.jsxs(Box2__default.default, { sx: { mb: 2 }, children: [
1122
+ /* @__PURE__ */ jsxRuntime.jsxs(Box2__default.default, { sx: { display: "flex", justifyContent: "space-between", alignItems: "center", mb: 1 }, children: [
1123
+ /* @__PURE__ */ jsxRuntime.jsxs(Typography4__default.default, { variant: "body2", children: [
1124
+ /* @__PURE__ */ jsxRuntime.jsx("strong", { children: "Players:" }),
1125
+ " ",
1126
+ hasDefinedCapacity ? `${activePlayers}/${capacity}` : activePlayers
1111
1127
  ] }),
1112
- result.dungeonMaster ? /* @__PURE__ */ jsxRuntime.jsx(material.Chip, { label: "DM Present", size: "small", color: "success", variant: "outlined" }) : /* @__PURE__ */ jsxRuntime.jsx(material.Chip, { label: "No DM", size: "small", color: "warning", variant: "outlined" })
1128
+ typeof hasDM === "boolean" && /* @__PURE__ */ jsxRuntime.jsx(
1129
+ Chip2__default.default,
1130
+ {
1131
+ icon: hasDM ? /* @__PURE__ */ jsxRuntime.jsx(SupervisorAccountIcon__default.default, {}) : /* @__PURE__ */ jsxRuntime.jsx(PersonIcon__default.default, {}),
1132
+ label: hasDM ? "DM Present" : "No DM",
1133
+ color: hasDM ? "success" : "warning",
1134
+ size: "small"
1135
+ }
1136
+ )
1113
1137
  ] }),
1114
- /* @__PURE__ */ jsxRuntime.jsx(material.LinearProgress, { variant: "determinate", value: occupancy, sx: { height: 8, borderRadius: 4 } })
1138
+ /* @__PURE__ */ jsxRuntime.jsx(
1139
+ LinearProgress__default.default,
1140
+ {
1141
+ variant: "determinate",
1142
+ value: occupancyPercentage,
1143
+ sx: {
1144
+ height: 10,
1145
+ borderRadius: 5,
1146
+ backgroundColor: "#e0e0e0",
1147
+ "& .MuiLinearProgress-bar": {
1148
+ backgroundColor: hasDefinedCapacity ? availableSlots > 0 ? "#4caf50" : "#f44336" : "#2196f3"
1149
+ }
1150
+ }
1151
+ }
1152
+ ),
1153
+ hasDefinedCapacity && /* @__PURE__ */ jsxRuntime.jsx(Typography4__default.default, { variant: "body2", sx: { mt: 0.5, textAlign: "right" }, children: availableSlots > 0 ? `${availableSlots} slot${availableSlots !== 1 ? "s" : ""} available` : "Table full" })
1115
1154
  ] }) });
1116
1155
  };
1117
1156
  var TableResultCard_default = TableResultCard;
@@ -1130,20 +1169,42 @@ var EventResultCard = ({
1130
1169
  try {
1131
1170
  const date = new Date(dateString);
1132
1171
  return date.toLocaleDateString("en-US", options);
1133
- } catch {
1172
+ } catch (error) {
1134
1173
  return dateString;
1135
1174
  }
1136
1175
  };
1137
1176
  const formattedDate = result.date ? formatDate(result.date) : "Date TBD";
1138
1177
  const location = result.location || "Location TBD";
1139
- return /* @__PURE__ */ jsxRuntime.jsx(BaseSearchResultCard_default, { result, onClick, icon: /* @__PURE__ */ jsxRuntime.jsx(EventIcon__default.default, { color: "primary" }), tags, children: /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { mb: 1 }, children: [
1140
- /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { display: "flex", alignItems: "center", mb: 0.5 }, children: [
1141
- /* @__PURE__ */ jsxRuntime.jsx(CalendarTodayIcon__default.default, { sx: { mr: 1, fontSize: "small", color: "text.secondary" } }),
1142
- /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "body2", color: "text.secondary", children: formattedDate })
1178
+ const eventIcon = /* @__PURE__ */ jsxRuntime.jsx(
1179
+ EventIcon__default.default,
1180
+ {
1181
+ sx: {
1182
+ fontSize: 40,
1183
+ color: "primary.main"
1184
+ }
1185
+ }
1186
+ );
1187
+ return /* @__PURE__ */ jsxRuntime.jsx(BaseSearchResultCard_default, { result, onClick, icon: eventIcon, tags, children: /* @__PURE__ */ jsxRuntime.jsxs(Box2__default.default, { sx: { mb: 2 }, children: [
1188
+ /* @__PURE__ */ jsxRuntime.jsxs(Box2__default.default, { sx: { display: "flex", alignItems: "center", mb: 1 }, children: [
1189
+ /* @__PURE__ */ jsxRuntime.jsx(CalendarTodayIcon__default.default, { sx: { mr: 1, color: "primary.main" } }),
1190
+ /* @__PURE__ */ jsxRuntime.jsxs(Typography4__default.default, { variant: "body2", children: [
1191
+ /* @__PURE__ */ jsxRuntime.jsx("strong", { children: "Date:" }),
1192
+ " ",
1193
+ formattedDate
1194
+ ] })
1195
+ ] }),
1196
+ /* @__PURE__ */ jsxRuntime.jsxs(Box2__default.default, { sx: { display: "flex", alignItems: "center" }, children: [
1197
+ /* @__PURE__ */ jsxRuntime.jsx(LocationOnIcon__default.default, { sx: { mr: 1, color: "primary.main" } }),
1198
+ /* @__PURE__ */ jsxRuntime.jsxs(Typography4__default.default, { variant: "body2", children: [
1199
+ /* @__PURE__ */ jsxRuntime.jsx("strong", { children: "Location:" }),
1200
+ " ",
1201
+ location
1202
+ ] })
1143
1203
  ] }),
1144
- /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { display: "flex", alignItems: "center", mb: 1 }, children: [
1145
- /* @__PURE__ */ jsxRuntime.jsx(LocationOnIcon__default.default, { sx: { mr: 1, fontSize: "small", color: "text.secondary" } }),
1146
- /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "body2", color: "text.secondary", children: location })
1204
+ result.organizer && /* @__PURE__ */ jsxRuntime.jsxs(Typography4__default.default, { variant: "body2", sx: { mt: 1 }, children: [
1205
+ /* @__PURE__ */ jsxRuntime.jsx("strong", { children: "Organizer:" }),
1206
+ " ",
1207
+ result.organizer
1147
1208
  ] })
1148
1209
  ] }) });
1149
1210
  };
@@ -1151,9 +1212,11 @@ var EventResultCard_default = EventResultCard;
1151
1212
  var ResultsContainer = ({
1152
1213
  results,
1153
1214
  onResultClick,
1154
- tags
1215
+ tags,
1216
+ pagination,
1217
+ onPacketChange
1155
1218
  }) => {
1156
- if (results.length === 0 || !results.map) {
1219
+ if (!results || results.length === 0 || !results.map) {
1157
1220
  return /* @__PURE__ */ jsxRuntime.jsx(Box2__default.default, { sx: { textAlign: "center", py: 4 }, children: "No results found. Try adjusting your filters." });
1158
1221
  }
1159
1222
  const onPlayerClick = (id) => {
@@ -1165,43 +1228,68 @@ var ResultsContainer = ({
1165
1228
  const onEventClick = (id) => {
1166
1229
  onResultClick == null ? void 0 : onResultClick(id, "event");
1167
1230
  };
1168
- return /* @__PURE__ */ jsxRuntime.jsx(Box2__default.default, { sx: { display: "flex", flexDirection: "column", gap: 2 }, children: results.map((result) => {
1169
- switch (result.type) {
1170
- case "player":
1171
- return /* @__PURE__ */ jsxRuntime.jsx(
1172
- PlayerResultCard_default,
1173
- {
1174
- result,
1175
- onClick: onPlayerClick,
1176
- tags
1177
- },
1178
- result.id
1179
- );
1180
- case "table":
1181
- return /* @__PURE__ */ jsxRuntime.jsx(
1182
- TableResultCard_default,
1183
- {
1184
- result,
1185
- onClick: onTableClick,
1186
- tags
1187
- },
1188
- result.id
1189
- );
1190
- case "event":
1191
- return /* @__PURE__ */ jsxRuntime.jsx(
1192
- EventResultCard_default,
1193
- {
1194
- result,
1195
- onClick: onEventClick,
1196
- tags
1197
- },
1198
- result.id
1199
- );
1200
- default:
1201
- console.error(`Unknown result type: ${result.type}`);
1202
- return null;
1203
- }
1204
- }) });
1231
+ const handlePacketChange = (_event, packet) => {
1232
+ onPacketChange == null ? void 0 : onPacketChange(packet);
1233
+ };
1234
+ const startResult = pagination ? (pagination.currentPacket - 1) * pagination.packetSize + 1 : 1;
1235
+ const endResult = pagination ? Math.min(pagination.currentPacket * pagination.packetSize, pagination.totalResults) : results.length;
1236
+ return /* @__PURE__ */ jsxRuntime.jsxs(Box2__default.default, { sx: { display: "flex", flexDirection: "column", gap: 2 }, children: [
1237
+ pagination && /* @__PURE__ */ jsxRuntime.jsx(Box2__default.default, { sx: { display: "flex", justifyContent: "space-between", alignItems: "center", mb: 1 }, children: /* @__PURE__ */ jsxRuntime.jsxs(Typography4__default.default, { variant: "body2", color: "text.secondary", children: [
1238
+ "Showing ",
1239
+ startResult,
1240
+ "-",
1241
+ endResult,
1242
+ " of ",
1243
+ pagination.totalResults,
1244
+ " results"
1245
+ ] }) }),
1246
+ results.map((result, index) => {
1247
+ switch (result.type) {
1248
+ case "player":
1249
+ return /* @__PURE__ */ jsxRuntime.jsx(
1250
+ PlayerResultCard_default,
1251
+ {
1252
+ result,
1253
+ onClick: onPlayerClick,
1254
+ tags
1255
+ },
1256
+ result.id
1257
+ );
1258
+ case "table":
1259
+ return /* @__PURE__ */ jsxRuntime.jsx(
1260
+ TableResultCard_default,
1261
+ {
1262
+ result,
1263
+ onClick: onTableClick,
1264
+ tags
1265
+ },
1266
+ result.id
1267
+ );
1268
+ case "event":
1269
+ return /* @__PURE__ */ jsxRuntime.jsx(
1270
+ EventResultCard_default,
1271
+ {
1272
+ result,
1273
+ onClick: onEventClick,
1274
+ tags
1275
+ },
1276
+ result.id
1277
+ );
1278
+ default:
1279
+ console.error(`Unknown result type: ${result.type}`);
1280
+ return null;
1281
+ }
1282
+ }),
1283
+ pagination && pagination.totalPackets > 1 && /* @__PURE__ */ jsxRuntime.jsx(Box2__default.default, { sx: { display: "flex", justifyContent: "center", mt: 4 }, children: /* @__PURE__ */ jsxRuntime.jsx(
1284
+ Pagination__default.default,
1285
+ {
1286
+ count: pagination.totalPackets,
1287
+ page: pagination.currentPacket,
1288
+ onChange: handlePacketChange,
1289
+ color: "primary"
1290
+ }
1291
+ ) })
1292
+ ] });
1205
1293
  };
1206
1294
  var ResultsContainer_default = ResultsContainer;
1207
1295
  var ScrollableResultsList = ({
@@ -1219,21 +1307,14 @@ var TablesScrollableList = ({
1219
1307
  results,
1220
1308
  tags,
1221
1309
  maxHeight,
1222
- onResultClick,
1223
- sortBy = "availability"
1310
+ onResultClick
1224
1311
  }) => {
1225
1312
  const tables = (results || []).filter((r) => (r == null ? void 0 : r.type) === "table");
1226
- const getAvailableSlots = (r) => {
1227
- const capacity = typeof r.capacity === "number" ? r.capacity : 0;
1228
- const playersCount = typeof r.numPlayers === "number" ? r.numPlayers : 0;
1229
- return Math.max(capacity - playersCount, 0);
1230
- };
1231
- const sortedTables = sortBy === "availability" ? [...tables].sort((a, b) => getAvailableSlots(b) - getAvailableSlots(a)) : tables;
1232
1313
  const handleClick = (id) => onResultClick == null ? void 0 : onResultClick(id);
1233
1314
  return /* @__PURE__ */ jsxRuntime.jsx(
1234
1315
  ScrollableResultsList_default,
1235
1316
  {
1236
- results: sortedTables,
1317
+ results: tables,
1237
1318
  tags,
1238
1319
  maxHeight,
1239
1320
  onResultClick: (id, type) => {
@@ -1251,8 +1332,8 @@ var EventTablesCard = ({
1251
1332
  }) => {
1252
1333
  return /* @__PURE__ */ jsxRuntime.jsxs(Card10__default.default, { elevation: 6, sx: { width: "100%", boxShadow: "0px 8px 24px rgba(0, 0, 0, 0.15)" }, children: [
1253
1334
  /* @__PURE__ */ jsxRuntime.jsx(CardHeader4__default.default, { title: "Tables" }),
1254
- /* @__PURE__ */ jsxRuntime.jsx(Divider2__default.default, {}),
1255
- /* @__PURE__ */ jsxRuntime.jsx(CardContent10__default.default, { children: /* @__PURE__ */ jsxRuntime.jsx(TablesScrollableList_default, { results: tables, tags, maxHeight, onResultClick: onTableClick, sortBy: "availability" }) })
1335
+ /* @__PURE__ */ jsxRuntime.jsx(Divider3__default.default, {}),
1336
+ /* @__PURE__ */ jsxRuntime.jsx(CardContent10__default.default, { children: /* @__PURE__ */ jsxRuntime.jsx(TablesScrollableList_default, { results: tables, tags, maxHeight, onResultClick: onTableClick }) })
1256
1337
  ] });
1257
1338
  };
1258
1339
  var EventTablesCard_default = EventTablesCard;
@@ -1812,6 +1893,26 @@ function PlayerPageLayout({
1812
1893
  ] }) })
1813
1894
  ] }) }) });
1814
1895
  }
1896
+ var ExpiredTablesFilter = ({
1897
+ includeExpiredTables,
1898
+ onChange
1899
+ }) => {
1900
+ return /* @__PURE__ */ jsxRuntime.jsx(Box2__default.default, { sx: { mt: 2 }, children: /* @__PURE__ */ jsxRuntime.jsx(
1901
+ FormControlLabel__default.default,
1902
+ {
1903
+ control: /* @__PURE__ */ jsxRuntime.jsx(
1904
+ Checkbox__default.default,
1905
+ {
1906
+ checked: includeExpiredTables,
1907
+ onChange: (e) => onChange(e.target.checked),
1908
+ color: "primary"
1909
+ }
1910
+ ),
1911
+ label: "Show expired tables"
1912
+ }
1913
+ ) });
1914
+ };
1915
+ var ExpiredTablesFilter_default = ExpiredTablesFilter;
1815
1916
  var SORT_OPTIONS = [
1816
1917
  { id: "relevance", label: "Relevance" },
1817
1918
  { id: "newest", label: "Newest" },
@@ -1825,7 +1926,7 @@ var SortOptions = ({
1825
1926
  onChange == null ? void 0 : onChange(event.target.value);
1826
1927
  };
1827
1928
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1828
- /* @__PURE__ */ jsxRuntime.jsx(Typography10__default.default, { variant: "h6", gutterBottom: true, children: "Sort By" }),
1929
+ /* @__PURE__ */ jsxRuntime.jsx(Typography4__default.default, { variant: "h6", gutterBottom: true, children: "Sort By" }),
1829
1930
  /* @__PURE__ */ jsxRuntime.jsx(FormControl2__default.default, { children: /* @__PURE__ */ jsxRuntime.jsx(RadioGroup__default.default, { defaultValue: defaultValue2, onChange: handleSortChange, children: SORT_OPTIONS.map((option) => /* @__PURE__ */ jsxRuntime.jsx(
1830
1931
  FormControlLabel__default.default,
1831
1932
  {
@@ -1840,11 +1941,19 @@ var SortOptions = ({
1840
1941
  var SortOptions_default = SortOptions;
1841
1942
  var TagsFilter = ({
1842
1943
  onChange,
1843
- tags: Tags = []
1944
+ tags: Tags = [],
1945
+ initialSelectedTags
1844
1946
  }) => {
1845
- const [mustHaveTags, setMustHaveTags] = React7__default.default.useState([]);
1846
- const [mustNotHaveTags, setMustNotHaveTags] = React7__default.default.useState([]);
1847
- const [shouldHaveAtLeastOneTags, setShouldHaveAtLeastOneTags] = React7__default.default.useState([]);
1947
+ const [mustHaveTags, setMustHaveTags] = React7__default.default.useState((initialSelectedTags == null ? void 0 : initialSelectedTags.mustHave) || []);
1948
+ const [mustNotHaveTags, setMustNotHaveTags] = React7__default.default.useState((initialSelectedTags == null ? void 0 : initialSelectedTags.mustNotHave) || []);
1949
+ const [shouldHaveAtLeastOneTags, setShouldHaveAtLeastOneTags] = React7__default.default.useState((initialSelectedTags == null ? void 0 : initialSelectedTags.shouldHaveAtLeastOne) || []);
1950
+ React7__default.default.useEffect(() => {
1951
+ if (initialSelectedTags) {
1952
+ setMustHaveTags(initialSelectedTags.mustHave || []);
1953
+ setMustNotHaveTags(initialSelectedTags.mustNotHave || []);
1954
+ setShouldHaveAtLeastOneTags(initialSelectedTags.shouldHaveAtLeastOne || []);
1955
+ }
1956
+ }, [initialSelectedTags]);
1848
1957
  Tags = !!Tags ? Tags : [];
1849
1958
  const [inputValues, setInputValues] = React7__default.default.useState({
1850
1959
  mustHave: "",
@@ -1854,7 +1963,7 @@ var TagsFilter = ({
1854
1963
  const tagOptions = React7__default.default.useMemo(() => {
1855
1964
  console.log("available tags: " + JSON.stringify(Tags));
1856
1965
  console.log(!Tags);
1857
- if (!Tags || Tags.length == 0 || !Tags.map) return [];
1966
+ if (!Tags || Tags.length === 0 || !Tags.map) return [];
1858
1967
  return Tags.map((tag) => ({
1859
1968
  value: tag.id,
1860
1969
  label: tag.label
@@ -1886,7 +1995,7 @@ var TagsFilter = ({
1886
1995
  };
1887
1996
  const renderSelectedTags = (selectedTags, category) => {
1888
1997
  const tagValues = [];
1889
- if (!Tags || Tags.length == 0 || !Tags.map) return null;
1998
+ if (!Tags || Tags.length === 0 || !Tags.map) return null;
1890
1999
  Tags.forEach((tag) => {
1891
2000
  if (selectedTags.includes(tag.id)) {
1892
2001
  tagValues.push(tag);
@@ -1895,27 +2004,11 @@ var TagsFilter = ({
1895
2004
  if (tagValues.length === 0) {
1896
2005
  return null;
1897
2006
  }
1898
- return /* @__PURE__ */ jsxRuntime.jsx(Box2__default.default, { sx: { display: "flex", flexWrap: "wrap", gap: 1, mb: 2 }, children: tagValues.map((tag) => /* @__PURE__ */ jsxRuntime.jsxs(
1899
- "span",
2007
+ return /* @__PURE__ */ jsxRuntime.jsx(Box2__default.default, { sx: { display: "flex", flexWrap: "wrap", gap: 1, mb: 2 }, children: tagValues.map((tag) => /* @__PURE__ */ jsxRuntime.jsx(
2008
+ Chip,
1900
2009
  {
1901
- className: "inline-block text-sm px-3 py-1 rounded-full outline-black outline-2 font-outlined",
1902
- style: {
1903
- background: tag.color || "#bfbcbb",
1904
- color: "white",
1905
- textShadow: "black 0.2em 0.2em 0.4em"
1906
- },
1907
- children: [
1908
- tag.label,
1909
- /* @__PURE__ */ jsxRuntime.jsx(
1910
- "button",
1911
- {
1912
- type: "button",
1913
- onClick: () => handleTagChange(tag.id, category),
1914
- className: "ml-2 text-red-500 bg-white bg-opacity-50 rounded-full outline-black outline-2 font-outlined",
1915
- children: "\xD7"
1916
- }
1917
- )
1918
- ]
2010
+ tag,
2011
+ removeCallback: (tagId) => handleTagChange(tagId, category)
1919
2012
  },
1920
2013
  tag.id
1921
2014
  )) });
@@ -1923,7 +2016,7 @@ var TagsFilter = ({
1923
2016
  const createTagSelector = (category, label) => {
1924
2017
  const selectedTags = category === "mustHave" ? mustHaveTags : category === "mustNotHave" ? mustNotHaveTags : shouldHaveAtLeastOneTags;
1925
2018
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1926
- /* @__PURE__ */ jsxRuntime.jsx(Typography10__default.default, { variant: "subtitle1", gutterBottom: true, sx: { mt: 2 }, children: label }),
2019
+ /* @__PURE__ */ jsxRuntime.jsx(Typography4__default.default, { variant: "subtitle1", gutterBottom: true, sx: { mt: 2 }, children: label }),
1927
2020
  renderSelectedTags(selectedTags, category),
1928
2021
  /* @__PURE__ */ jsxRuntime.jsx(
1929
2022
  Autocomplete__default.default,
@@ -1976,11 +2069,11 @@ var TagsFilter = ({
1976
2069
  ] });
1977
2070
  };
1978
2071
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1979
- /* @__PURE__ */ jsxRuntime.jsx(Typography10__default.default, { variant: "h6", gutterBottom: true, children: "Tags" }),
2072
+ /* @__PURE__ */ jsxRuntime.jsx(Typography4__default.default, { variant: "h6", gutterBottom: true, children: "Tags" }),
1980
2073
  createTagSelector("mustHave", "Must Have Tags"),
1981
- /* @__PURE__ */ jsxRuntime.jsx(Divider2__default.default, { sx: { my: 2 } }),
2074
+ /* @__PURE__ */ jsxRuntime.jsx(Divider3__default.default, { sx: { my: 2 } }),
1982
2075
  createTagSelector("mustNotHave", "Must Not Have Tags"),
1983
- /* @__PURE__ */ jsxRuntime.jsx(Divider2__default.default, { sx: { my: 2 } }),
2076
+ /* @__PURE__ */ jsxRuntime.jsx(Divider3__default.default, { sx: { my: 2 } }),
1984
2077
  createTagSelector("shouldHaveAtLeastOne", "Should Contain At Least One Tag")
1985
2078
  ] });
1986
2079
  };
@@ -2010,21 +2103,80 @@ var CustomPopper2 = (props) => {
2010
2103
  );
2011
2104
  };
2012
2105
  var TagsFilter_default = TagsFilter;
2013
- var FILTER_TYPES = [
2014
- { id: "player", label: "Players" },
2015
- { id: "event", label: "Events", disabled: true },
2016
- { id: "table", label: "Tables", disabled: true }
2017
- ];
2018
- var TypeFilter = ({ onChange }) => {
2019
- const [selectedTypes, setSelectedTypes] = React7__default.default.useState([]);
2106
+ var TextSearchCard = ({ onChange, selectedTypes, initialTextSearch }) => {
2107
+ const [query, setQuery] = React7__default.default.useState((initialTextSearch == null ? void 0 : initialTextSearch.query) || "");
2108
+ const [titleOnly, setTitleOnly] = React7__default.default.useState((initialTextSearch == null ? void 0 : initialTextSearch.titleOnly) || false);
2109
+ React7.useEffect(() => {
2110
+ if (initialTextSearch) {
2111
+ setQuery(initialTextSearch.query || "");
2112
+ setTitleOnly(initialTextSearch.titleOnly || false);
2113
+ }
2114
+ }, [initialTextSearch]);
2115
+ const shouldShow = selectedTypes.includes("table") || selectedTypes.includes("event");
2116
+ if (!shouldShow) {
2117
+ return null;
2118
+ }
2119
+ const handleQueryChange = (e) => {
2120
+ const newQuery = e.target.value;
2121
+ setQuery(newQuery);
2122
+ if (onChange) {
2123
+ onChange({ query: newQuery, titleOnly });
2124
+ }
2125
+ };
2126
+ const handleTitleOnlyChange = (e) => {
2127
+ const newTitleOnly = e.target.checked;
2128
+ setTitleOnly(newTitleOnly);
2129
+ if (onChange) {
2130
+ onChange({ query, titleOnly: newTitleOnly });
2131
+ }
2132
+ };
2133
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2134
+ /* @__PURE__ */ jsxRuntime.jsx(Typography4__default.default, { variant: "h6", gutterBottom: true, children: "Text Search" }),
2135
+ /* @__PURE__ */ jsxRuntime.jsxs(Box2__default.default, { sx: { mb: 2 }, children: [
2136
+ /* @__PURE__ */ jsxRuntime.jsx(
2137
+ TextField4__default.default,
2138
+ {
2139
+ fullWidth: true,
2140
+ label: "Search in title and description",
2141
+ variant: "outlined",
2142
+ value: query,
2143
+ onChange: handleQueryChange,
2144
+ placeholder: "Enter search terms...",
2145
+ sx: { mb: 1 }
2146
+ }
2147
+ ),
2148
+ /* @__PURE__ */ jsxRuntime.jsx(
2149
+ FormControlLabel__default.default,
2150
+ {
2151
+ control: /* @__PURE__ */ jsxRuntime.jsx(
2152
+ Checkbox__default.default,
2153
+ {
2154
+ checked: titleOnly,
2155
+ onChange: handleTitleOnlyChange
2156
+ }
2157
+ ),
2158
+ label: "Search in title only"
2159
+ }
2160
+ )
2161
+ ] })
2162
+ ] });
2163
+ };
2164
+ var TextSearchCard_default = TextSearchCard;
2165
+ var TypeFilter = ({ types, initialSelectedTypes = [], onChange }) => {
2166
+ const [selectedTypes, setSelectedTypes] = React7__default.default.useState(initialSelectedTypes);
2167
+ React7.useEffect(() => {
2168
+ setSelectedTypes(initialSelectedTypes);
2169
+ }, [initialSelectedTypes]);
2020
2170
  const handleTypeChange = (typeId) => {
2021
2171
  const newSelectedTypes = selectedTypes.includes(typeId) ? selectedTypes.filter((id) => id !== typeId) : [...selectedTypes, typeId];
2022
2172
  setSelectedTypes(newSelectedTypes);
2023
- onChange == null ? void 0 : onChange(newSelectedTypes);
2173
+ if (onChange) {
2174
+ onChange(newSelectedTypes);
2175
+ }
2024
2176
  };
2025
2177
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2026
- /* @__PURE__ */ jsxRuntime.jsx(Typography10__default.default, { variant: "h6", gutterBottom: true, children: "Type" }),
2027
- /* @__PURE__ */ jsxRuntime.jsx(FormGroup__default.default, { children: FILTER_TYPES.map((type) => /* @__PURE__ */ jsxRuntime.jsx(
2178
+ /* @__PURE__ */ jsxRuntime.jsx(Typography4__default.default, { variant: "h6", gutterBottom: true, children: "Type" }),
2179
+ /* @__PURE__ */ jsxRuntime.jsx(FormGroup__default.default, { children: types.map((type) => /* @__PURE__ */ jsxRuntime.jsx(
2028
2180
  FormControlLabel__default.default,
2029
2181
  {
2030
2182
  control: /* @__PURE__ */ jsxRuntime.jsx(
@@ -2032,7 +2184,8 @@ var TypeFilter = ({ onChange }) => {
2032
2184
  {
2033
2185
  checked: selectedTypes.includes(type.id),
2034
2186
  onChange: () => handleTypeChange(type.id),
2035
- disabled: type.disabled
2187
+ disabled: type.id === "event",
2188
+ title: type.id === "event" ? "Coming soon! Currently only player and table search are supported." : ""
2036
2189
  }
2037
2190
  ),
2038
2191
  label: type.label
@@ -2043,22 +2196,67 @@ var TypeFilter = ({ onChange }) => {
2043
2196
  };
2044
2197
  var TypeFilter_default = TypeFilter;
2045
2198
  var FiltersContainer = ({
2199
+ initialSelectedTypes = [],
2200
+ initialSelectedTags,
2201
+ initialTextSearch,
2202
+ includeExpiredTables = false,
2046
2203
  onTypeChange,
2047
2204
  onTagChange,
2205
+ onTextSearchChange,
2206
+ onIncludeExpiredTablesChange,
2048
2207
  onSubmit,
2049
- tags
2208
+ tags,
2209
+ searchTypes
2050
2210
  }) => {
2211
+ const [selectedTypes, setSelectedTypes] = React7__default.default.useState(initialSelectedTypes);
2212
+ React7.useEffect(() => {
2213
+ setSelectedTypes(initialSelectedTypes);
2214
+ }, [initialSelectedTypes]);
2215
+ const handleTypeChange = (types) => {
2216
+ setSelectedTypes(types);
2217
+ if (onTypeChange) {
2218
+ onTypeChange(types);
2219
+ }
2220
+ };
2051
2221
  return /* @__PURE__ */ jsxRuntime.jsxs(Box2__default.default, { children: [
2052
- /* @__PURE__ */ jsxRuntime.jsx(TypeFilter_default, { onChange: onTypeChange }),
2053
- /* @__PURE__ */ jsxRuntime.jsx(Divider2__default.default, { sx: { my: 2 } }),
2222
+ /* @__PURE__ */ jsxRuntime.jsx(
2223
+ TypeFilter_default,
2224
+ {
2225
+ types: searchTypes,
2226
+ initialSelectedTypes,
2227
+ onChange: handleTypeChange
2228
+ }
2229
+ ),
2230
+ /* @__PURE__ */ jsxRuntime.jsx(Divider3__default.default, { sx: { my: 2 } }),
2231
+ /* @__PURE__ */ jsxRuntime.jsx(
2232
+ TextSearchCard_default,
2233
+ {
2234
+ selectedTypes,
2235
+ initialTextSearch,
2236
+ onChange: onTextSearchChange
2237
+ }
2238
+ ),
2239
+ (selectedTypes.includes("table") || selectedTypes.includes("event")) && /* @__PURE__ */ jsxRuntime.jsx(Divider3__default.default, { sx: { my: 2 } }),
2054
2240
  /* @__PURE__ */ jsxRuntime.jsx(
2055
2241
  TagsFilter_default,
2056
2242
  {
2057
2243
  tags,
2244
+ initialSelectedTags,
2058
2245
  onChange: onTagChange
2059
2246
  }
2060
2247
  ),
2061
- /* @__PURE__ */ jsxRuntime.jsx(Divider2__default.default, { sx: { my: 2 } }),
2248
+ /* @__PURE__ */ jsxRuntime.jsx(Divider3__default.default, { sx: { my: 2 } }),
2249
+ selectedTypes.includes("table") && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2250
+ /* @__PURE__ */ jsxRuntime.jsx(
2251
+ ExpiredTablesFilter_default,
2252
+ {
2253
+ includeExpiredTables,
2254
+ onChange: onIncludeExpiredTablesChange || (() => {
2255
+ })
2256
+ }
2257
+ ),
2258
+ /* @__PURE__ */ jsxRuntime.jsx(Divider3__default.default, { sx: { my: 2 } })
2259
+ ] }),
2062
2260
  /* @__PURE__ */ jsxRuntime.jsx(Box2__default.default, { sx: { display: "flex", justifyContent: "center", mt: 2 }, children: /* @__PURE__ */ jsxRuntime.jsx(
2063
2261
  Button7__default.default,
2064
2262
  {
@@ -2116,16 +2314,75 @@ var SearchResultCard_default = SearchResultCard;
2116
2314
  function SearchPageLayout({
2117
2315
  results,
2118
2316
  title = "Search Results",
2317
+ initialSelectedTypes = [],
2318
+ initialSelectedTags = {
2319
+ mustHave: [],
2320
+ mustNotHave: [],
2321
+ shouldHaveAtLeastOne: []
2322
+ },
2323
+ initialTextSearch = {
2324
+ query: "",
2325
+ titleOnly: false
2326
+ },
2327
+ includeExpiredTables: initialIncludeExpiredTables = false,
2119
2328
  onTypeChange,
2120
2329
  onTagChange,
2330
+ onTextSearchChange,
2331
+ onIncludeExpiredTablesChange,
2121
2332
  onSubmit,
2122
2333
  onResultClick,
2334
+ onPacketChange,
2335
+ pagination,
2123
2336
  validTags,
2124
- allTags
2337
+ allTags,
2338
+ searchTypes,
2339
+ isLoading = false
2125
2340
  }) {
2126
- "use client";
2127
2341
  const theme = material.useTheme();
2128
2342
  const isMobile = material.useMediaQuery(theme.breakpoints.down("md"));
2343
+ const [selectedTypes, setSelectedTypes] = React7.useState(initialSelectedTypes);
2344
+ const [selectedTags, setSelectedTags] = React7.useState(initialSelectedTags);
2345
+ const [textSearch, setTextSearch] = React7.useState(initialTextSearch);
2346
+ const [includeExpiredTables, setIncludeExpiredTables] = React7.useState(initialIncludeExpiredTables);
2347
+ React7.useEffect(() => {
2348
+ setSelectedTypes(initialSelectedTypes);
2349
+ }, [initialSelectedTypes]);
2350
+ React7.useEffect(() => {
2351
+ setSelectedTags(initialSelectedTags);
2352
+ }, [initialSelectedTags]);
2353
+ React7.useEffect(() => {
2354
+ setTextSearch(initialTextSearch);
2355
+ }, [initialTextSearch]);
2356
+ React7.useEffect(() => {
2357
+ setIncludeExpiredTables(initialIncludeExpiredTables);
2358
+ }, [initialIncludeExpiredTables]);
2359
+ const handleTypeChange = (types) => {
2360
+ setSelectedTypes(types);
2361
+ if (onTypeChange) onTypeChange(types);
2362
+ };
2363
+ const handleTagChange = (tags) => {
2364
+ setSelectedTags(tags);
2365
+ if (onTagChange) onTagChange(tags);
2366
+ };
2367
+ const handleTextSearchChange = (ts) => {
2368
+ setTextSearch(ts);
2369
+ if (onTextSearchChange) onTextSearchChange(ts);
2370
+ };
2371
+ const handleIncludeExpiredTablesChange = (include) => {
2372
+ setIncludeExpiredTables(include);
2373
+ if (onIncludeExpiredTablesChange) onIncludeExpiredTablesChange(include);
2374
+ };
2375
+ const handleSubmit = () => {
2376
+ const currentCriteria = {
2377
+ selectedTypes,
2378
+ selectedTags,
2379
+ textSearch,
2380
+ includeExpiredTables
2381
+ };
2382
+ if (onSubmit) {
2383
+ onSubmit(currentCriteria);
2384
+ }
2385
+ };
2129
2386
  return /* @__PURE__ */ jsxRuntime.jsxs(Box2__default.default, { sx: { padding: 2 }, children: [
2130
2387
  /* @__PURE__ */ jsxRuntime.jsx(Card10__default.default, { sx: { marginBottom: 2 }, children: /* @__PURE__ */ jsxRuntime.jsx(
2131
2388
  CardHeader4__default.default,
@@ -2156,10 +2413,17 @@ function SearchPageLayout({
2156
2413
  /* @__PURE__ */ jsxRuntime.jsx(CardContent10__default.default, { children: /* @__PURE__ */ jsxRuntime.jsx(
2157
2414
  FiltersContainer_default,
2158
2415
  {
2159
- onTypeChange,
2160
- onTagChange,
2161
- onSubmit,
2162
- tags: validTags
2416
+ initialSelectedTypes: selectedTypes,
2417
+ initialSelectedTags: selectedTags,
2418
+ initialTextSearch: textSearch,
2419
+ includeExpiredTables,
2420
+ onTypeChange: handleTypeChange,
2421
+ onTagChange: handleTagChange,
2422
+ onTextSearchChange: handleTextSearchChange,
2423
+ onIncludeExpiredTablesChange: handleIncludeExpiredTablesChange,
2424
+ onSubmit: handleSubmit,
2425
+ tags: validTags,
2426
+ searchTypes
2163
2427
  }
2164
2428
  ) })
2165
2429
  ] }) }),
@@ -2176,10 +2440,12 @@ function SearchPageLayout({
2176
2440
  }
2177
2441
  }
2178
2442
  ),
2179
- /* @__PURE__ */ jsxRuntime.jsx(CardContent10__default.default, { children: /* @__PURE__ */ jsxRuntime.jsx(
2443
+ /* @__PURE__ */ jsxRuntime.jsx(CardContent10__default.default, { children: isLoading ? /* @__PURE__ */ jsxRuntime.jsx(Box2__default.default, { sx: { display: "flex", justifyContent: "center", py: 8 }, children: /* @__PURE__ */ jsxRuntime.jsx(CircularProgress3__default.default, { size: 60, thickness: 4 }) }) : /* @__PURE__ */ jsxRuntime.jsx(
2180
2444
  ResultsContainer_default,
2181
2445
  {
2182
2446
  results,
2447
+ pagination,
2448
+ onPacketChange,
2183
2449
  onResultClick,
2184
2450
  tags: allTags
2185
2451
  }
@@ -2747,11 +3013,13 @@ exports.EventEditProvider = EventEditProvider;
2747
3013
  exports.EventPageLayout = EventPageLayout;
2748
3014
  exports.EventResultCard = EventResultCard_default;
2749
3015
  exports.EventTablesCard = EventTablesCard_default;
3016
+ exports.ExpiredTablesFilter = ExpiredTablesFilter_default;
2750
3017
  exports.FiltersContainer = FiltersContainer_default;
2751
3018
  exports.GameTableProvider = GameTableProvider;
2752
3019
  exports.ModalContext = ModalContext;
2753
3020
  exports.ModalProvider = ModalProvider_default;
2754
3021
  exports.NextGameCountdown = NextGameCountdown;
3022
+ exports.NextGameLabel = NextGameLabel_default;
2755
3023
  exports.PlayerDetailsCard = PlayerDetailsCard_default;
2756
3024
  exports.PlayerDisplayCard = PlayerDisplayCard_default;
2757
3025
  exports.PlayerHighlightsCard = PlayerHighlightsCard;
@@ -2772,6 +3040,7 @@ exports.TableResultCard = TableResultCard_default;
2772
3040
  exports.TablesScrollableList = TablesScrollableList_default;
2773
3041
  exports.TagEditor = TagEditor;
2774
3042
  exports.TagsFilter = TagsFilter_default;
3043
+ exports.TextSearchCard = TextSearchCard_default;
2775
3044
  exports.TypeFilter = TypeFilter_default;
2776
3045
  exports.generateTagsDisplay = generateTagsDisplay;
2777
3046
  exports.renderTagsFromIds = renderTagsFromIds;