@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.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,21 @@ 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
+ const text = full || "";
1042
+ return text.length > 200 ? `${text.slice(0, 200).trimEnd()}...` : text;
1043
+ })() }) : /* @__PURE__ */ jsxRuntime.jsx(Typography4__default.default, { variant: "body1", children: result.description }),
1044
+ 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
1045
  ] })
1047
1046
  ] })
1048
1047
  }
@@ -1097,21 +1096,60 @@ var PlayerResultCard = ({
1097
1096
  return /* @__PURE__ */ jsxRuntime.jsx(BaseSearchResultCard_default, { result, onClick, icon: playerIcon, tags });
1098
1097
  };
1099
1098
  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
1099
+ var TableResultCard = ({
1100
+ result,
1101
+ onClick,
1102
+ tags
1103
+ }) => {
1104
+ const rawCapacity = result.capacity;
1105
+ const hasDefinedCapacity = typeof rawCapacity === "number" && Number.isFinite(rawCapacity) && rawCapacity > 0;
1106
+ const capacity = hasDefinedCapacity ? rawCapacity : 0;
1107
+ const activePlayers = typeof result.numPlayers === "number" ? result.numPlayers : 0;
1108
+ const availableSlots = Math.max(capacity - activePlayers, 0);
1109
+ const hasDM = typeof result.hasDM === "boolean" ? result.hasDM : Boolean(result.dungeonMaster);
1110
+ const occupancyPercentage = hasDefinedCapacity ? activePlayers / capacity * 100 : 100;
1111
+ const tableIcon = /* @__PURE__ */ jsxRuntime.jsx(
1112
+ TableRestaurantIcon__default.default,
1113
+ {
1114
+ sx: {
1115
+ fontSize: 40,
1116
+ color: "primary.main"
1117
+ }
1118
+ }
1119
+ );
1120
+ return /* @__PURE__ */ jsxRuntime.jsx(BaseSearchResultCard_default, { result, onClick, icon: tableIcon, tags, children: /* @__PURE__ */ jsxRuntime.jsxs(Box2__default.default, { sx: { mb: 2 }, children: [
1121
+ /* @__PURE__ */ jsxRuntime.jsxs(Box2__default.default, { sx: { display: "flex", justifyContent: "space-between", alignItems: "center", mb: 1 }, children: [
1122
+ /* @__PURE__ */ jsxRuntime.jsxs(Typography4__default.default, { variant: "body2", children: [
1123
+ /* @__PURE__ */ jsxRuntime.jsx("strong", { children: "Players:" }),
1124
+ " ",
1125
+ hasDefinedCapacity ? `${activePlayers}/${capacity}` : activePlayers
1111
1126
  ] }),
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" })
1127
+ typeof hasDM === "boolean" && /* @__PURE__ */ jsxRuntime.jsx(
1128
+ Chip2__default.default,
1129
+ {
1130
+ icon: hasDM ? /* @__PURE__ */ jsxRuntime.jsx(SupervisorAccountIcon__default.default, {}) : /* @__PURE__ */ jsxRuntime.jsx(PersonIcon__default.default, {}),
1131
+ label: hasDM ? "DM Present" : "No DM",
1132
+ color: hasDM ? "success" : "warning",
1133
+ size: "small"
1134
+ }
1135
+ )
1113
1136
  ] }),
1114
- /* @__PURE__ */ jsxRuntime.jsx(material.LinearProgress, { variant: "determinate", value: occupancy, sx: { height: 8, borderRadius: 4 } })
1137
+ /* @__PURE__ */ jsxRuntime.jsx(
1138
+ LinearProgress__default.default,
1139
+ {
1140
+ variant: "determinate",
1141
+ value: occupancyPercentage,
1142
+ sx: {
1143
+ height: 10,
1144
+ borderRadius: 5,
1145
+ backgroundColor: "#e0e0e0",
1146
+ "& .MuiLinearProgress-bar": {
1147
+ backgroundColor: hasDefinedCapacity ? availableSlots > 0 ? "#4caf50" : "#f44336" : "#2196f3"
1148
+ }
1149
+ }
1150
+ }
1151
+ ),
1152
+ 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
1153
  ] }) });
1116
1154
  };
1117
1155
  var TableResultCard_default = TableResultCard;
@@ -1130,20 +1168,42 @@ var EventResultCard = ({
1130
1168
  try {
1131
1169
  const date = new Date(dateString);
1132
1170
  return date.toLocaleDateString("en-US", options);
1133
- } catch {
1171
+ } catch (error) {
1134
1172
  return dateString;
1135
1173
  }
1136
1174
  };
1137
1175
  const formattedDate = result.date ? formatDate(result.date) : "Date TBD";
1138
1176
  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 })
1177
+ const eventIcon = /* @__PURE__ */ jsxRuntime.jsx(
1178
+ EventIcon__default.default,
1179
+ {
1180
+ sx: {
1181
+ fontSize: 40,
1182
+ color: "primary.main"
1183
+ }
1184
+ }
1185
+ );
1186
+ return /* @__PURE__ */ jsxRuntime.jsx(BaseSearchResultCard_default, { result, onClick, icon: eventIcon, tags, children: /* @__PURE__ */ jsxRuntime.jsxs(Box2__default.default, { sx: { mb: 2 }, children: [
1187
+ /* @__PURE__ */ jsxRuntime.jsxs(Box2__default.default, { sx: { display: "flex", alignItems: "center", mb: 1 }, children: [
1188
+ /* @__PURE__ */ jsxRuntime.jsx(CalendarTodayIcon__default.default, { sx: { mr: 1, color: "primary.main" } }),
1189
+ /* @__PURE__ */ jsxRuntime.jsxs(Typography4__default.default, { variant: "body2", children: [
1190
+ /* @__PURE__ */ jsxRuntime.jsx("strong", { children: "Date:" }),
1191
+ " ",
1192
+ formattedDate
1193
+ ] })
1194
+ ] }),
1195
+ /* @__PURE__ */ jsxRuntime.jsxs(Box2__default.default, { sx: { display: "flex", alignItems: "center" }, children: [
1196
+ /* @__PURE__ */ jsxRuntime.jsx(LocationOnIcon__default.default, { sx: { mr: 1, color: "primary.main" } }),
1197
+ /* @__PURE__ */ jsxRuntime.jsxs(Typography4__default.default, { variant: "body2", children: [
1198
+ /* @__PURE__ */ jsxRuntime.jsx("strong", { children: "Location:" }),
1199
+ " ",
1200
+ location
1201
+ ] })
1143
1202
  ] }),
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 })
1203
+ result.organizer && /* @__PURE__ */ jsxRuntime.jsxs(Typography4__default.default, { variant: "body2", sx: { mt: 1 }, children: [
1204
+ /* @__PURE__ */ jsxRuntime.jsx("strong", { children: "Organizer:" }),
1205
+ " ",
1206
+ result.organizer
1147
1207
  ] })
1148
1208
  ] }) });
1149
1209
  };
@@ -1151,9 +1211,11 @@ var EventResultCard_default = EventResultCard;
1151
1211
  var ResultsContainer = ({
1152
1212
  results,
1153
1213
  onResultClick,
1154
- tags
1214
+ tags,
1215
+ pagination,
1216
+ onPacketChange
1155
1217
  }) => {
1156
- if (results.length === 0 || !results.map) {
1218
+ if (!results || results.length === 0 || !results.map) {
1157
1219
  return /* @__PURE__ */ jsxRuntime.jsx(Box2__default.default, { sx: { textAlign: "center", py: 4 }, children: "No results found. Try adjusting your filters." });
1158
1220
  }
1159
1221
  const onPlayerClick = (id) => {
@@ -1165,43 +1227,68 @@ var ResultsContainer = ({
1165
1227
  const onEventClick = (id) => {
1166
1228
  onResultClick == null ? void 0 : onResultClick(id, "event");
1167
1229
  };
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
- }) });
1230
+ const handlePacketChange = (_event, packet) => {
1231
+ onPacketChange == null ? void 0 : onPacketChange(packet);
1232
+ };
1233
+ const startResult = pagination ? (pagination.currentPacket - 1) * pagination.packetSize + 1 : 1;
1234
+ const endResult = pagination ? Math.min(pagination.currentPacket * pagination.packetSize, pagination.totalResults) : results.length;
1235
+ return /* @__PURE__ */ jsxRuntime.jsxs(Box2__default.default, { sx: { display: "flex", flexDirection: "column", gap: 2 }, children: [
1236
+ 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: [
1237
+ "Showing ",
1238
+ startResult,
1239
+ "-",
1240
+ endResult,
1241
+ " of ",
1242
+ pagination.totalResults,
1243
+ " results"
1244
+ ] }) }),
1245
+ results.map((result) => {
1246
+ switch (result.type) {
1247
+ case "player":
1248
+ return /* @__PURE__ */ jsxRuntime.jsx(
1249
+ PlayerResultCard_default,
1250
+ {
1251
+ result,
1252
+ onClick: onPlayerClick,
1253
+ tags
1254
+ },
1255
+ result.id
1256
+ );
1257
+ case "table":
1258
+ return /* @__PURE__ */ jsxRuntime.jsx(
1259
+ TableResultCard_default,
1260
+ {
1261
+ result,
1262
+ onClick: onTableClick,
1263
+ tags
1264
+ },
1265
+ result.id
1266
+ );
1267
+ case "event":
1268
+ return /* @__PURE__ */ jsxRuntime.jsx(
1269
+ EventResultCard_default,
1270
+ {
1271
+ result,
1272
+ onClick: onEventClick,
1273
+ tags
1274
+ },
1275
+ result.id
1276
+ );
1277
+ default:
1278
+ console.error(`Unknown result type: ${result.type}`);
1279
+ return null;
1280
+ }
1281
+ }),
1282
+ pagination && pagination.totalPackets > 1 && /* @__PURE__ */ jsxRuntime.jsx(Box2__default.default, { sx: { display: "flex", justifyContent: "center", mt: 4 }, children: /* @__PURE__ */ jsxRuntime.jsx(
1283
+ Pagination__default.default,
1284
+ {
1285
+ count: pagination.totalPackets,
1286
+ page: pagination.currentPacket,
1287
+ onChange: handlePacketChange,
1288
+ color: "primary"
1289
+ }
1290
+ ) })
1291
+ ] });
1205
1292
  };
1206
1293
  var ResultsContainer_default = ResultsContainer;
1207
1294
  var ScrollableResultsList = ({
@@ -1219,21 +1306,14 @@ var TablesScrollableList = ({
1219
1306
  results,
1220
1307
  tags,
1221
1308
  maxHeight,
1222
- onResultClick,
1223
- sortBy = "availability"
1309
+ onResultClick
1224
1310
  }) => {
1225
1311
  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
1312
  const handleClick = (id) => onResultClick == null ? void 0 : onResultClick(id);
1233
1313
  return /* @__PURE__ */ jsxRuntime.jsx(
1234
1314
  ScrollableResultsList_default,
1235
1315
  {
1236
- results: sortedTables,
1316
+ results: tables,
1237
1317
  tags,
1238
1318
  maxHeight,
1239
1319
  onResultClick: (id, type) => {
@@ -1251,8 +1331,8 @@ var EventTablesCard = ({
1251
1331
  }) => {
1252
1332
  return /* @__PURE__ */ jsxRuntime.jsxs(Card10__default.default, { elevation: 6, sx: { width: "100%", boxShadow: "0px 8px 24px rgba(0, 0, 0, 0.15)" }, children: [
1253
1333
  /* @__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" }) })
1334
+ /* @__PURE__ */ jsxRuntime.jsx(Divider3__default.default, {}),
1335
+ /* @__PURE__ */ jsxRuntime.jsx(CardContent10__default.default, { children: /* @__PURE__ */ jsxRuntime.jsx(TablesScrollableList_default, { results: tables, tags, maxHeight, onResultClick: onTableClick }) })
1256
1336
  ] });
1257
1337
  };
1258
1338
  var EventTablesCard_default = EventTablesCard;
@@ -1812,6 +1892,26 @@ function PlayerPageLayout({
1812
1892
  ] }) })
1813
1893
  ] }) }) });
1814
1894
  }
1895
+ var ExpiredTablesFilter = ({
1896
+ includeExpiredTables,
1897
+ onChange
1898
+ }) => {
1899
+ return /* @__PURE__ */ jsxRuntime.jsx(Box2__default.default, { sx: { mt: 2 }, children: /* @__PURE__ */ jsxRuntime.jsx(
1900
+ FormControlLabel__default.default,
1901
+ {
1902
+ control: /* @__PURE__ */ jsxRuntime.jsx(
1903
+ Checkbox__default.default,
1904
+ {
1905
+ checked: includeExpiredTables,
1906
+ onChange: (e) => onChange(e.target.checked),
1907
+ color: "primary"
1908
+ }
1909
+ ),
1910
+ label: "Show expired tables"
1911
+ }
1912
+ ) });
1913
+ };
1914
+ var ExpiredTablesFilter_default = ExpiredTablesFilter;
1815
1915
  var SORT_OPTIONS = [
1816
1916
  { id: "relevance", label: "Relevance" },
1817
1917
  { id: "newest", label: "Newest" },
@@ -1825,7 +1925,7 @@ var SortOptions = ({
1825
1925
  onChange == null ? void 0 : onChange(event.target.value);
1826
1926
  };
1827
1927
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1828
- /* @__PURE__ */ jsxRuntime.jsx(Typography10__default.default, { variant: "h6", gutterBottom: true, children: "Sort By" }),
1928
+ /* @__PURE__ */ jsxRuntime.jsx(Typography4__default.default, { variant: "h6", gutterBottom: true, children: "Sort By" }),
1829
1929
  /* @__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
1930
  FormControlLabel__default.default,
1831
1931
  {
@@ -1840,11 +1940,19 @@ var SortOptions = ({
1840
1940
  var SortOptions_default = SortOptions;
1841
1941
  var TagsFilter = ({
1842
1942
  onChange,
1843
- tags: Tags = []
1943
+ tags: Tags = [],
1944
+ initialSelectedTags
1844
1945
  }) => {
1845
- const [mustHaveTags, setMustHaveTags] = React7__default.default.useState([]);
1846
- const [mustNotHaveTags, setMustNotHaveTags] = React7__default.default.useState([]);
1847
- const [shouldHaveAtLeastOneTags, setShouldHaveAtLeastOneTags] = React7__default.default.useState([]);
1946
+ const [mustHaveTags, setMustHaveTags] = React7__default.default.useState((initialSelectedTags == null ? void 0 : initialSelectedTags.mustHave) || []);
1947
+ const [mustNotHaveTags, setMustNotHaveTags] = React7__default.default.useState((initialSelectedTags == null ? void 0 : initialSelectedTags.mustNotHave) || []);
1948
+ const [shouldHaveAtLeastOneTags, setShouldHaveAtLeastOneTags] = React7__default.default.useState((initialSelectedTags == null ? void 0 : initialSelectedTags.shouldHaveAtLeastOne) || []);
1949
+ React7__default.default.useEffect(() => {
1950
+ if (initialSelectedTags) {
1951
+ setMustHaveTags(initialSelectedTags.mustHave || []);
1952
+ setMustNotHaveTags(initialSelectedTags.mustNotHave || []);
1953
+ setShouldHaveAtLeastOneTags(initialSelectedTags.shouldHaveAtLeastOne || []);
1954
+ }
1955
+ }, [initialSelectedTags]);
1848
1956
  Tags = !!Tags ? Tags : [];
1849
1957
  const [inputValues, setInputValues] = React7__default.default.useState({
1850
1958
  mustHave: "",
@@ -1854,7 +1962,7 @@ var TagsFilter = ({
1854
1962
  const tagOptions = React7__default.default.useMemo(() => {
1855
1963
  console.log("available tags: " + JSON.stringify(Tags));
1856
1964
  console.log(!Tags);
1857
- if (!Tags || Tags.length == 0 || !Tags.map) return [];
1965
+ if (!Tags || Tags.length === 0 || !Tags.map) return [];
1858
1966
  return Tags.map((tag) => ({
1859
1967
  value: tag.id,
1860
1968
  label: tag.label
@@ -1886,7 +1994,7 @@ var TagsFilter = ({
1886
1994
  };
1887
1995
  const renderSelectedTags = (selectedTags, category) => {
1888
1996
  const tagValues = [];
1889
- if (!Tags || Tags.length == 0 || !Tags.map) return null;
1997
+ if (!Tags || Tags.length === 0 || !Tags.map) return null;
1890
1998
  Tags.forEach((tag) => {
1891
1999
  if (selectedTags.includes(tag.id)) {
1892
2000
  tagValues.push(tag);
@@ -1895,27 +2003,11 @@ var TagsFilter = ({
1895
2003
  if (tagValues.length === 0) {
1896
2004
  return null;
1897
2005
  }
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",
2006
+ return /* @__PURE__ */ jsxRuntime.jsx(Box2__default.default, { sx: { display: "flex", flexWrap: "wrap", gap: 1, mb: 2 }, children: tagValues.map((tag) => /* @__PURE__ */ jsxRuntime.jsx(
2007
+ Chip,
1900
2008
  {
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
- ]
2009
+ tag,
2010
+ removeCallback: (tagId) => handleTagChange(tagId, category)
1919
2011
  },
1920
2012
  tag.id
1921
2013
  )) });
@@ -1923,7 +2015,7 @@ var TagsFilter = ({
1923
2015
  const createTagSelector = (category, label) => {
1924
2016
  const selectedTags = category === "mustHave" ? mustHaveTags : category === "mustNotHave" ? mustNotHaveTags : shouldHaveAtLeastOneTags;
1925
2017
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1926
- /* @__PURE__ */ jsxRuntime.jsx(Typography10__default.default, { variant: "subtitle1", gutterBottom: true, sx: { mt: 2 }, children: label }),
2018
+ /* @__PURE__ */ jsxRuntime.jsx(Typography4__default.default, { variant: "subtitle1", gutterBottom: true, sx: { mt: 2 }, children: label }),
1927
2019
  renderSelectedTags(selectedTags, category),
1928
2020
  /* @__PURE__ */ jsxRuntime.jsx(
1929
2021
  Autocomplete__default.default,
@@ -1976,11 +2068,11 @@ var TagsFilter = ({
1976
2068
  ] });
1977
2069
  };
1978
2070
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1979
- /* @__PURE__ */ jsxRuntime.jsx(Typography10__default.default, { variant: "h6", gutterBottom: true, children: "Tags" }),
2071
+ /* @__PURE__ */ jsxRuntime.jsx(Typography4__default.default, { variant: "h6", gutterBottom: true, children: "Tags" }),
1980
2072
  createTagSelector("mustHave", "Must Have Tags"),
1981
- /* @__PURE__ */ jsxRuntime.jsx(Divider2__default.default, { sx: { my: 2 } }),
2073
+ /* @__PURE__ */ jsxRuntime.jsx(Divider3__default.default, { sx: { my: 2 } }),
1982
2074
  createTagSelector("mustNotHave", "Must Not Have Tags"),
1983
- /* @__PURE__ */ jsxRuntime.jsx(Divider2__default.default, { sx: { my: 2 } }),
2075
+ /* @__PURE__ */ jsxRuntime.jsx(Divider3__default.default, { sx: { my: 2 } }),
1984
2076
  createTagSelector("shouldHaveAtLeastOne", "Should Contain At Least One Tag")
1985
2077
  ] });
1986
2078
  };
@@ -2010,21 +2102,80 @@ var CustomPopper2 = (props) => {
2010
2102
  );
2011
2103
  };
2012
2104
  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([]);
2105
+ var TextSearchCard = ({ onChange, selectedTypes, initialTextSearch }) => {
2106
+ const [query, setQuery] = React7__default.default.useState((initialTextSearch == null ? void 0 : initialTextSearch.query) || "");
2107
+ const [titleOnly, setTitleOnly] = React7__default.default.useState((initialTextSearch == null ? void 0 : initialTextSearch.titleOnly) || false);
2108
+ React7.useEffect(() => {
2109
+ if (initialTextSearch) {
2110
+ setQuery(initialTextSearch.query || "");
2111
+ setTitleOnly(initialTextSearch.titleOnly || false);
2112
+ }
2113
+ }, [initialTextSearch]);
2114
+ const shouldShow = selectedTypes.includes("table") || selectedTypes.includes("event");
2115
+ if (!shouldShow) {
2116
+ return null;
2117
+ }
2118
+ const handleQueryChange = (e) => {
2119
+ const newQuery = e.target.value;
2120
+ setQuery(newQuery);
2121
+ if (onChange) {
2122
+ onChange({ query: newQuery, titleOnly });
2123
+ }
2124
+ };
2125
+ const handleTitleOnlyChange = (e) => {
2126
+ const newTitleOnly = e.target.checked;
2127
+ setTitleOnly(newTitleOnly);
2128
+ if (onChange) {
2129
+ onChange({ query, titleOnly: newTitleOnly });
2130
+ }
2131
+ };
2132
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2133
+ /* @__PURE__ */ jsxRuntime.jsx(Typography4__default.default, { variant: "h6", gutterBottom: true, children: "Text Search" }),
2134
+ /* @__PURE__ */ jsxRuntime.jsxs(Box2__default.default, { sx: { mb: 2 }, children: [
2135
+ /* @__PURE__ */ jsxRuntime.jsx(
2136
+ TextField4__default.default,
2137
+ {
2138
+ fullWidth: true,
2139
+ label: "Search in title and description",
2140
+ variant: "outlined",
2141
+ value: query,
2142
+ onChange: handleQueryChange,
2143
+ placeholder: "Enter search terms...",
2144
+ sx: { mb: 1 }
2145
+ }
2146
+ ),
2147
+ /* @__PURE__ */ jsxRuntime.jsx(
2148
+ FormControlLabel__default.default,
2149
+ {
2150
+ control: /* @__PURE__ */ jsxRuntime.jsx(
2151
+ Checkbox__default.default,
2152
+ {
2153
+ checked: titleOnly,
2154
+ onChange: handleTitleOnlyChange
2155
+ }
2156
+ ),
2157
+ label: "Search in title only"
2158
+ }
2159
+ )
2160
+ ] })
2161
+ ] });
2162
+ };
2163
+ var TextSearchCard_default = TextSearchCard;
2164
+ var TypeFilter = ({ types, initialSelectedTypes = [], onChange }) => {
2165
+ const [selectedTypes, setSelectedTypes] = React7__default.default.useState(initialSelectedTypes);
2166
+ React7.useEffect(() => {
2167
+ setSelectedTypes(initialSelectedTypes);
2168
+ }, [initialSelectedTypes]);
2020
2169
  const handleTypeChange = (typeId) => {
2021
2170
  const newSelectedTypes = selectedTypes.includes(typeId) ? selectedTypes.filter((id) => id !== typeId) : [...selectedTypes, typeId];
2022
2171
  setSelectedTypes(newSelectedTypes);
2023
- onChange == null ? void 0 : onChange(newSelectedTypes);
2172
+ if (onChange) {
2173
+ onChange(newSelectedTypes);
2174
+ }
2024
2175
  };
2025
2176
  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(
2177
+ /* @__PURE__ */ jsxRuntime.jsx(Typography4__default.default, { variant: "h6", gutterBottom: true, children: "Type" }),
2178
+ /* @__PURE__ */ jsxRuntime.jsx(FormGroup__default.default, { children: types.map((type) => /* @__PURE__ */ jsxRuntime.jsx(
2028
2179
  FormControlLabel__default.default,
2029
2180
  {
2030
2181
  control: /* @__PURE__ */ jsxRuntime.jsx(
@@ -2032,7 +2183,8 @@ var TypeFilter = ({ onChange }) => {
2032
2183
  {
2033
2184
  checked: selectedTypes.includes(type.id),
2034
2185
  onChange: () => handleTypeChange(type.id),
2035
- disabled: type.disabled
2186
+ disabled: type.id === "event",
2187
+ title: type.id === "event" ? "Coming soon! Currently only player and table search are supported." : ""
2036
2188
  }
2037
2189
  ),
2038
2190
  label: type.label
@@ -2043,22 +2195,67 @@ var TypeFilter = ({ onChange }) => {
2043
2195
  };
2044
2196
  var TypeFilter_default = TypeFilter;
2045
2197
  var FiltersContainer = ({
2198
+ initialSelectedTypes = [],
2199
+ initialSelectedTags,
2200
+ initialTextSearch,
2201
+ includeExpiredTables = false,
2046
2202
  onTypeChange,
2047
2203
  onTagChange,
2204
+ onTextSearchChange,
2205
+ onIncludeExpiredTablesChange,
2048
2206
  onSubmit,
2049
- tags
2207
+ tags,
2208
+ searchTypes
2050
2209
  }) => {
2210
+ const [selectedTypes, setSelectedTypes] = React7__default.default.useState(initialSelectedTypes);
2211
+ React7.useEffect(() => {
2212
+ setSelectedTypes(initialSelectedTypes);
2213
+ }, [initialSelectedTypes]);
2214
+ const handleTypeChange = (types) => {
2215
+ setSelectedTypes(types);
2216
+ if (onTypeChange) {
2217
+ onTypeChange(types);
2218
+ }
2219
+ };
2051
2220
  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 } }),
2221
+ /* @__PURE__ */ jsxRuntime.jsx(
2222
+ TypeFilter_default,
2223
+ {
2224
+ types: searchTypes,
2225
+ initialSelectedTypes,
2226
+ onChange: handleTypeChange
2227
+ }
2228
+ ),
2229
+ /* @__PURE__ */ jsxRuntime.jsx(Divider3__default.default, { sx: { my: 2 } }),
2230
+ /* @__PURE__ */ jsxRuntime.jsx(
2231
+ TextSearchCard_default,
2232
+ {
2233
+ selectedTypes,
2234
+ initialTextSearch,
2235
+ onChange: onTextSearchChange
2236
+ }
2237
+ ),
2238
+ (selectedTypes.includes("table") || selectedTypes.includes("event")) && /* @__PURE__ */ jsxRuntime.jsx(Divider3__default.default, { sx: { my: 2 } }),
2054
2239
  /* @__PURE__ */ jsxRuntime.jsx(
2055
2240
  TagsFilter_default,
2056
2241
  {
2057
2242
  tags,
2243
+ initialSelectedTags,
2058
2244
  onChange: onTagChange
2059
2245
  }
2060
2246
  ),
2061
- /* @__PURE__ */ jsxRuntime.jsx(Divider2__default.default, { sx: { my: 2 } }),
2247
+ /* @__PURE__ */ jsxRuntime.jsx(Divider3__default.default, { sx: { my: 2 } }),
2248
+ selectedTypes.includes("table") && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2249
+ /* @__PURE__ */ jsxRuntime.jsx(
2250
+ ExpiredTablesFilter_default,
2251
+ {
2252
+ includeExpiredTables,
2253
+ onChange: onIncludeExpiredTablesChange || (() => {
2254
+ })
2255
+ }
2256
+ ),
2257
+ /* @__PURE__ */ jsxRuntime.jsx(Divider3__default.default, { sx: { my: 2 } })
2258
+ ] }),
2062
2259
  /* @__PURE__ */ jsxRuntime.jsx(Box2__default.default, { sx: { display: "flex", justifyContent: "center", mt: 2 }, children: /* @__PURE__ */ jsxRuntime.jsx(
2063
2260
  Button7__default.default,
2064
2261
  {
@@ -2116,16 +2313,75 @@ var SearchResultCard_default = SearchResultCard;
2116
2313
  function SearchPageLayout({
2117
2314
  results,
2118
2315
  title = "Search Results",
2316
+ initialSelectedTypes = [],
2317
+ initialSelectedTags = {
2318
+ mustHave: [],
2319
+ mustNotHave: [],
2320
+ shouldHaveAtLeastOne: []
2321
+ },
2322
+ initialTextSearch = {
2323
+ query: "",
2324
+ titleOnly: false
2325
+ },
2326
+ includeExpiredTables: initialIncludeExpiredTables = false,
2119
2327
  onTypeChange,
2120
2328
  onTagChange,
2329
+ onTextSearchChange,
2330
+ onIncludeExpiredTablesChange,
2121
2331
  onSubmit,
2122
2332
  onResultClick,
2333
+ onPacketChange,
2334
+ pagination,
2123
2335
  validTags,
2124
- allTags
2336
+ allTags,
2337
+ searchTypes,
2338
+ isLoading = false
2125
2339
  }) {
2126
- "use client";
2127
2340
  const theme = material.useTheme();
2128
2341
  const isMobile = material.useMediaQuery(theme.breakpoints.down("md"));
2342
+ const [selectedTypes, setSelectedTypes] = React7.useState(initialSelectedTypes);
2343
+ const [selectedTags, setSelectedTags] = React7.useState(initialSelectedTags);
2344
+ const [textSearch, setTextSearch] = React7.useState(initialTextSearch);
2345
+ const [includeExpiredTables, setIncludeExpiredTables] = React7.useState(initialIncludeExpiredTables);
2346
+ React7.useEffect(() => {
2347
+ setSelectedTypes(initialSelectedTypes);
2348
+ }, [initialSelectedTypes]);
2349
+ React7.useEffect(() => {
2350
+ setSelectedTags(initialSelectedTags);
2351
+ }, [initialSelectedTags]);
2352
+ React7.useEffect(() => {
2353
+ setTextSearch(initialTextSearch);
2354
+ }, [initialTextSearch]);
2355
+ React7.useEffect(() => {
2356
+ setIncludeExpiredTables(initialIncludeExpiredTables);
2357
+ }, [initialIncludeExpiredTables]);
2358
+ const handleTypeChange = (types) => {
2359
+ setSelectedTypes(types);
2360
+ if (onTypeChange) onTypeChange(types);
2361
+ };
2362
+ const handleTagChange = (tags) => {
2363
+ setSelectedTags(tags);
2364
+ if (onTagChange) onTagChange(tags);
2365
+ };
2366
+ const handleTextSearchChange = (ts) => {
2367
+ setTextSearch(ts);
2368
+ if (onTextSearchChange) onTextSearchChange(ts);
2369
+ };
2370
+ const handleIncludeExpiredTablesChange = (include) => {
2371
+ setIncludeExpiredTables(include);
2372
+ if (onIncludeExpiredTablesChange) onIncludeExpiredTablesChange(include);
2373
+ };
2374
+ const handleSubmit = () => {
2375
+ const currentCriteria = {
2376
+ selectedTypes,
2377
+ selectedTags,
2378
+ textSearch,
2379
+ includeExpiredTables
2380
+ };
2381
+ if (onSubmit) {
2382
+ onSubmit(currentCriteria);
2383
+ }
2384
+ };
2129
2385
  return /* @__PURE__ */ jsxRuntime.jsxs(Box2__default.default, { sx: { padding: 2 }, children: [
2130
2386
  /* @__PURE__ */ jsxRuntime.jsx(Card10__default.default, { sx: { marginBottom: 2 }, children: /* @__PURE__ */ jsxRuntime.jsx(
2131
2387
  CardHeader4__default.default,
@@ -2156,10 +2412,17 @@ function SearchPageLayout({
2156
2412
  /* @__PURE__ */ jsxRuntime.jsx(CardContent10__default.default, { children: /* @__PURE__ */ jsxRuntime.jsx(
2157
2413
  FiltersContainer_default,
2158
2414
  {
2159
- onTypeChange,
2160
- onTagChange,
2161
- onSubmit,
2162
- tags: validTags
2415
+ initialSelectedTypes: selectedTypes,
2416
+ initialSelectedTags: selectedTags,
2417
+ initialTextSearch: textSearch,
2418
+ includeExpiredTables,
2419
+ onTypeChange: handleTypeChange,
2420
+ onTagChange: handleTagChange,
2421
+ onTextSearchChange: handleTextSearchChange,
2422
+ onIncludeExpiredTablesChange: handleIncludeExpiredTablesChange,
2423
+ onSubmit: handleSubmit,
2424
+ tags: validTags,
2425
+ searchTypes
2163
2426
  }
2164
2427
  ) })
2165
2428
  ] }) }),
@@ -2176,10 +2439,12 @@ function SearchPageLayout({
2176
2439
  }
2177
2440
  }
2178
2441
  ),
2179
- /* @__PURE__ */ jsxRuntime.jsx(CardContent10__default.default, { children: /* @__PURE__ */ jsxRuntime.jsx(
2442
+ /* @__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
2443
  ResultsContainer_default,
2181
2444
  {
2182
2445
  results,
2446
+ pagination,
2447
+ onPacketChange,
2183
2448
  onResultClick,
2184
2449
  tags: allTags
2185
2450
  }
@@ -2747,11 +3012,13 @@ exports.EventEditProvider = EventEditProvider;
2747
3012
  exports.EventPageLayout = EventPageLayout;
2748
3013
  exports.EventResultCard = EventResultCard_default;
2749
3014
  exports.EventTablesCard = EventTablesCard_default;
3015
+ exports.ExpiredTablesFilter = ExpiredTablesFilter_default;
2750
3016
  exports.FiltersContainer = FiltersContainer_default;
2751
3017
  exports.GameTableProvider = GameTableProvider;
2752
3018
  exports.ModalContext = ModalContext;
2753
3019
  exports.ModalProvider = ModalProvider_default;
2754
3020
  exports.NextGameCountdown = NextGameCountdown;
3021
+ exports.NextGameLabel = NextGameLabel_default;
2755
3022
  exports.PlayerDetailsCard = PlayerDetailsCard_default;
2756
3023
  exports.PlayerDisplayCard = PlayerDisplayCard_default;
2757
3024
  exports.PlayerHighlightsCard = PlayerHighlightsCard;
@@ -2772,6 +3039,7 @@ exports.TableResultCard = TableResultCard_default;
2772
3039
  exports.TablesScrollableList = TablesScrollableList_default;
2773
3040
  exports.TagEditor = TagEditor;
2774
3041
  exports.TagsFilter = TagsFilter_default;
3042
+ exports.TextSearchCard = TextSearchCard_default;
2775
3043
  exports.TypeFilter = TypeFilter_default;
2776
3044
  exports.generateTagsDisplay = generateTagsDisplay;
2777
3045
  exports.renderTagsFromIds = renderTagsFromIds;