@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
@@ -1,61 +1,93 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var Typography2 = require('@mui/material/Typography');
4
+ var FormControlLabel = require('@mui/material/FormControlLabel');
5
+ var Checkbox = require('@mui/material/Checkbox');
6
+ var Box8 = require('@mui/material/Box');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+ var Typography6 = require('@mui/material/Typography');
5
9
  var FormControl = require('@mui/material/FormControl');
6
10
  var RadioGroup = require('@mui/material/RadioGroup');
7
- var FormControlLabel = require('@mui/material/FormControlLabel');
8
11
  var Radio = require('@mui/material/Radio');
9
- var jsxRuntime = require('react/jsx-runtime');
10
12
  var React = require('react');
11
- var Box2 = require('@mui/material/Box');
12
13
  var Autocomplete = require('@mui/material/Autocomplete');
13
14
  var TextField = require('@mui/material/TextField');
14
15
  var Popper = require('@mui/material/Popper');
15
- var Divider = require('@mui/material/Divider');
16
+ var Divider2 = require('@mui/material/Divider');
16
17
  var FormGroup = require('@mui/material/FormGroup');
17
- var Checkbox = require('@mui/material/Checkbox');
18
18
  var Button = require('@mui/material/Button');
19
19
  var SearchIcon = require('@mui/icons-material/Search');
20
+ var Pagination = require('@mui/material/Pagination');
20
21
  var Avatar = require('@mui/material/Avatar');
22
+ var Card2 = require('@mui/material/Card');
23
+ var CardContent2 = require('@mui/material/CardContent');
21
24
  var material = require('@mui/material');
22
- var CasinoIcon = require('@mui/icons-material/Casino');
25
+ var Chip2 = require('@mui/material/Chip');
26
+ var LinearProgress = require('@mui/material/LinearProgress');
27
+ var PersonIcon = require('@mui/icons-material/Person');
28
+ var SupervisorAccountIcon = require('@mui/icons-material/SupervisorAccount');
29
+ var TableRestaurantIcon = require('@mui/icons-material/TableRestaurant');
23
30
  var CalendarTodayIcon = require('@mui/icons-material/CalendarToday');
24
31
  var LocationOnIcon = require('@mui/icons-material/LocationOn');
25
32
  var EventIcon = require('@mui/icons-material/Event');
26
33
  var Grid = require('@mui/material/Grid');
27
- var Card2 = require('@mui/material/Card');
28
34
  var CardHeader = require('@mui/material/CardHeader');
29
- var CardContent2 = require('@mui/material/CardContent');
35
+ var CircularProgress = require('@mui/material/CircularProgress');
30
36
 
31
37
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
32
38
 
33
- var Typography2__default = /*#__PURE__*/_interopDefault(Typography2);
39
+ var FormControlLabel__default = /*#__PURE__*/_interopDefault(FormControlLabel);
40
+ var Checkbox__default = /*#__PURE__*/_interopDefault(Checkbox);
41
+ var Box8__default = /*#__PURE__*/_interopDefault(Box8);
42
+ var Typography6__default = /*#__PURE__*/_interopDefault(Typography6);
34
43
  var FormControl__default = /*#__PURE__*/_interopDefault(FormControl);
35
44
  var RadioGroup__default = /*#__PURE__*/_interopDefault(RadioGroup);
36
- var FormControlLabel__default = /*#__PURE__*/_interopDefault(FormControlLabel);
37
45
  var Radio__default = /*#__PURE__*/_interopDefault(Radio);
38
46
  var React__default = /*#__PURE__*/_interopDefault(React);
39
- var Box2__default = /*#__PURE__*/_interopDefault(Box2);
40
47
  var Autocomplete__default = /*#__PURE__*/_interopDefault(Autocomplete);
41
48
  var TextField__default = /*#__PURE__*/_interopDefault(TextField);
42
49
  var Popper__default = /*#__PURE__*/_interopDefault(Popper);
43
- var Divider__default = /*#__PURE__*/_interopDefault(Divider);
50
+ var Divider2__default = /*#__PURE__*/_interopDefault(Divider2);
44
51
  var FormGroup__default = /*#__PURE__*/_interopDefault(FormGroup);
45
- var Checkbox__default = /*#__PURE__*/_interopDefault(Checkbox);
46
52
  var Button__default = /*#__PURE__*/_interopDefault(Button);
47
53
  var SearchIcon__default = /*#__PURE__*/_interopDefault(SearchIcon);
54
+ var Pagination__default = /*#__PURE__*/_interopDefault(Pagination);
48
55
  var Avatar__default = /*#__PURE__*/_interopDefault(Avatar);
49
- var CasinoIcon__default = /*#__PURE__*/_interopDefault(CasinoIcon);
56
+ var Card2__default = /*#__PURE__*/_interopDefault(Card2);
57
+ var CardContent2__default = /*#__PURE__*/_interopDefault(CardContent2);
58
+ var Chip2__default = /*#__PURE__*/_interopDefault(Chip2);
59
+ var LinearProgress__default = /*#__PURE__*/_interopDefault(LinearProgress);
60
+ var PersonIcon__default = /*#__PURE__*/_interopDefault(PersonIcon);
61
+ var SupervisorAccountIcon__default = /*#__PURE__*/_interopDefault(SupervisorAccountIcon);
62
+ var TableRestaurantIcon__default = /*#__PURE__*/_interopDefault(TableRestaurantIcon);
50
63
  var CalendarTodayIcon__default = /*#__PURE__*/_interopDefault(CalendarTodayIcon);
51
64
  var LocationOnIcon__default = /*#__PURE__*/_interopDefault(LocationOnIcon);
52
65
  var EventIcon__default = /*#__PURE__*/_interopDefault(EventIcon);
53
66
  var Grid__default = /*#__PURE__*/_interopDefault(Grid);
54
- var Card2__default = /*#__PURE__*/_interopDefault(Card2);
55
67
  var CardHeader__default = /*#__PURE__*/_interopDefault(CardHeader);
56
- var CardContent2__default = /*#__PURE__*/_interopDefault(CardContent2);
68
+ var CircularProgress__default = /*#__PURE__*/_interopDefault(CircularProgress);
57
69
 
58
- // src/components/SearchPage/Filters/SortOptions.tsx
70
+ // src/components/SearchPage/Filters/ExpiredTablesFilter.tsx
71
+ var ExpiredTablesFilter = ({
72
+ includeExpiredTables,
73
+ onChange
74
+ }) => {
75
+ return /* @__PURE__ */ jsxRuntime.jsx(Box8__default.default, { sx: { mt: 2 }, children: /* @__PURE__ */ jsxRuntime.jsx(
76
+ FormControlLabel__default.default,
77
+ {
78
+ control: /* @__PURE__ */ jsxRuntime.jsx(
79
+ Checkbox__default.default,
80
+ {
81
+ checked: includeExpiredTables,
82
+ onChange: (e) => onChange(e.target.checked),
83
+ color: "primary"
84
+ }
85
+ ),
86
+ label: "Show expired tables"
87
+ }
88
+ ) });
89
+ };
90
+ var ExpiredTablesFilter_default = ExpiredTablesFilter;
59
91
  var SORT_OPTIONS = [
60
92
  { id: "relevance", label: "Relevance" },
61
93
  { id: "newest", label: "Newest" },
@@ -69,7 +101,7 @@ var SortOptions = ({
69
101
  onChange == null ? void 0 : onChange(event.target.value);
70
102
  };
71
103
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
72
- /* @__PURE__ */ jsxRuntime.jsx(Typography2__default.default, { variant: "h6", gutterBottom: true, children: "Sort By" }),
104
+ /* @__PURE__ */ jsxRuntime.jsx(Typography6__default.default, { variant: "h6", gutterBottom: true, children: "Sort By" }),
73
105
  /* @__PURE__ */ jsxRuntime.jsx(FormControl__default.default, { children: /* @__PURE__ */ jsxRuntime.jsx(RadioGroup__default.default, { defaultValue, onChange: handleSortChange, children: SORT_OPTIONS.map((option) => /* @__PURE__ */ jsxRuntime.jsx(
74
106
  FormControlLabel__default.default,
75
107
  {
@@ -82,13 +114,53 @@ var SortOptions = ({
82
114
  ] });
83
115
  };
84
116
  var SortOptions_default = SortOptions;
117
+ function Chip({ tag, removeCallback }) {
118
+ var _a;
119
+ const color = (_a = tag.color) != null ? _a : "#bfbcbb";
120
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: /* @__PURE__ */ jsxRuntime.jsxs(
121
+ "span",
122
+ {
123
+ className: "inline-block text-sm px-3 py-1 rounded-full border-2 font-outlined text-white m-0.5 font-stretch-105% font-sans",
124
+ style: {
125
+ borderColor: `color-mix(in srgb, ${color}, black 50%)`,
126
+ background: `linear-gradient(160deg, color-mix(in srgb, ${color}, white 10%) 0%, color-mix(in srgb, ${color}, black 60%) 100%)`,
127
+ textShadow: "black 1.5px 1px 1.5px",
128
+ filter: `drop-shadow(2px 2px 1.5px color-mix(in srgb, ${color}, black 80%))`
129
+ },
130
+ children: [
131
+ tag.label,
132
+ removeCallback && /* @__PURE__ */ jsxRuntime.jsx(
133
+ "button",
134
+ {
135
+ type: "button",
136
+ onClick: () => removeCallback(tag.id),
137
+ className: "ml-2 text-white hover:text-red-700 focus:outline-none pl-0.5 pr-1 cursor-pointer hover:bg-white rounded-full",
138
+ style: {
139
+ textShadow: "black 1px 1px 1px"
140
+ },
141
+ children: "X"
142
+ }
143
+ )
144
+ ]
145
+ },
146
+ tag.id
147
+ ) });
148
+ }
85
149
  var TagsFilter = ({
86
150
  onChange,
87
- tags: Tags = []
151
+ tags: Tags = [],
152
+ initialSelectedTags
88
153
  }) => {
89
- const [mustHaveTags, setMustHaveTags] = React__default.default.useState([]);
90
- const [mustNotHaveTags, setMustNotHaveTags] = React__default.default.useState([]);
91
- const [shouldHaveAtLeastOneTags, setShouldHaveAtLeastOneTags] = React__default.default.useState([]);
154
+ const [mustHaveTags, setMustHaveTags] = React__default.default.useState((initialSelectedTags == null ? void 0 : initialSelectedTags.mustHave) || []);
155
+ const [mustNotHaveTags, setMustNotHaveTags] = React__default.default.useState((initialSelectedTags == null ? void 0 : initialSelectedTags.mustNotHave) || []);
156
+ const [shouldHaveAtLeastOneTags, setShouldHaveAtLeastOneTags] = React__default.default.useState((initialSelectedTags == null ? void 0 : initialSelectedTags.shouldHaveAtLeastOne) || []);
157
+ React__default.default.useEffect(() => {
158
+ if (initialSelectedTags) {
159
+ setMustHaveTags(initialSelectedTags.mustHave || []);
160
+ setMustNotHaveTags(initialSelectedTags.mustNotHave || []);
161
+ setShouldHaveAtLeastOneTags(initialSelectedTags.shouldHaveAtLeastOne || []);
162
+ }
163
+ }, [initialSelectedTags]);
92
164
  Tags = !!Tags ? Tags : [];
93
165
  const [inputValues, setInputValues] = React__default.default.useState({
94
166
  mustHave: "",
@@ -98,7 +170,7 @@ var TagsFilter = ({
98
170
  const tagOptions = React__default.default.useMemo(() => {
99
171
  console.log("available tags: " + JSON.stringify(Tags));
100
172
  console.log(!Tags);
101
- if (!Tags || Tags.length == 0 || !Tags.map) return [];
173
+ if (!Tags || Tags.length === 0 || !Tags.map) return [];
102
174
  return Tags.map((tag) => ({
103
175
  value: tag.id,
104
176
  label: tag.label
@@ -130,7 +202,7 @@ var TagsFilter = ({
130
202
  };
131
203
  const renderSelectedTags = (selectedTags, category) => {
132
204
  const tagValues = [];
133
- if (!Tags || Tags.length == 0 || !Tags.map) return null;
205
+ if (!Tags || Tags.length === 0 || !Tags.map) return null;
134
206
  Tags.forEach((tag) => {
135
207
  if (selectedTags.includes(tag.id)) {
136
208
  tagValues.push(tag);
@@ -139,27 +211,11 @@ var TagsFilter = ({
139
211
  if (tagValues.length === 0) {
140
212
  return null;
141
213
  }
142
- return /* @__PURE__ */ jsxRuntime.jsx(Box2__default.default, { sx: { display: "flex", flexWrap: "wrap", gap: 1, mb: 2 }, children: tagValues.map((tag) => /* @__PURE__ */ jsxRuntime.jsxs(
143
- "span",
214
+ return /* @__PURE__ */ jsxRuntime.jsx(Box8__default.default, { sx: { display: "flex", flexWrap: "wrap", gap: 1, mb: 2 }, children: tagValues.map((tag) => /* @__PURE__ */ jsxRuntime.jsx(
215
+ Chip,
144
216
  {
145
- className: "inline-block text-sm px-3 py-1 rounded-full outline-black outline-2 font-outlined",
146
- style: {
147
- background: tag.color || "#bfbcbb",
148
- color: "white",
149
- textShadow: "black 0.2em 0.2em 0.4em"
150
- },
151
- children: [
152
- tag.label,
153
- /* @__PURE__ */ jsxRuntime.jsx(
154
- "button",
155
- {
156
- type: "button",
157
- onClick: () => handleTagChange(tag.id, category),
158
- className: "ml-2 text-red-500 bg-white bg-opacity-50 rounded-full outline-black outline-2 font-outlined",
159
- children: "\xD7"
160
- }
161
- )
162
- ]
217
+ tag,
218
+ removeCallback: (tagId) => handleTagChange(tagId, category)
163
219
  },
164
220
  tag.id
165
221
  )) });
@@ -167,7 +223,7 @@ var TagsFilter = ({
167
223
  const createTagSelector = (category, label) => {
168
224
  const selectedTags = category === "mustHave" ? mustHaveTags : category === "mustNotHave" ? mustNotHaveTags : shouldHaveAtLeastOneTags;
169
225
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
170
- /* @__PURE__ */ jsxRuntime.jsx(Typography2__default.default, { variant: "subtitle1", gutterBottom: true, sx: { mt: 2 }, children: label }),
226
+ /* @__PURE__ */ jsxRuntime.jsx(Typography6__default.default, { variant: "subtitle1", gutterBottom: true, sx: { mt: 2 }, children: label }),
171
227
  renderSelectedTags(selectedTags, category),
172
228
  /* @__PURE__ */ jsxRuntime.jsx(
173
229
  Autocomplete__default.default,
@@ -220,11 +276,11 @@ var TagsFilter = ({
220
276
  ] });
221
277
  };
222
278
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
223
- /* @__PURE__ */ jsxRuntime.jsx(Typography2__default.default, { variant: "h6", gutterBottom: true, children: "Tags" }),
279
+ /* @__PURE__ */ jsxRuntime.jsx(Typography6__default.default, { variant: "h6", gutterBottom: true, children: "Tags" }),
224
280
  createTagSelector("mustHave", "Must Have Tags"),
225
- /* @__PURE__ */ jsxRuntime.jsx(Divider__default.default, { sx: { my: 2 } }),
281
+ /* @__PURE__ */ jsxRuntime.jsx(Divider2__default.default, { sx: { my: 2 } }),
226
282
  createTagSelector("mustNotHave", "Must Not Have Tags"),
227
- /* @__PURE__ */ jsxRuntime.jsx(Divider__default.default, { sx: { my: 2 } }),
283
+ /* @__PURE__ */ jsxRuntime.jsx(Divider2__default.default, { sx: { my: 2 } }),
228
284
  createTagSelector("shouldHaveAtLeastOne", "Should Contain At Least One Tag")
229
285
  ] });
230
286
  };
@@ -254,21 +310,80 @@ var CustomPopper = (props) => {
254
310
  );
255
311
  };
256
312
  var TagsFilter_default = TagsFilter;
257
- var FILTER_TYPES = [
258
- { id: "player", label: "Players" },
259
- { id: "event", label: "Events", disabled: true },
260
- { id: "table", label: "Tables", disabled: true }
261
- ];
262
- var TypeFilter = ({ onChange }) => {
263
- const [selectedTypes, setSelectedTypes] = React__default.default.useState([]);
313
+ var TextSearchCard = ({ onChange, selectedTypes, initialTextSearch }) => {
314
+ const [query, setQuery] = React__default.default.useState((initialTextSearch == null ? void 0 : initialTextSearch.query) || "");
315
+ const [titleOnly, setTitleOnly] = React__default.default.useState((initialTextSearch == null ? void 0 : initialTextSearch.titleOnly) || false);
316
+ React.useEffect(() => {
317
+ if (initialTextSearch) {
318
+ setQuery(initialTextSearch.query || "");
319
+ setTitleOnly(initialTextSearch.titleOnly || false);
320
+ }
321
+ }, [initialTextSearch]);
322
+ const shouldShow = selectedTypes.includes("table") || selectedTypes.includes("event");
323
+ if (!shouldShow) {
324
+ return null;
325
+ }
326
+ const handleQueryChange = (e) => {
327
+ const newQuery = e.target.value;
328
+ setQuery(newQuery);
329
+ if (onChange) {
330
+ onChange({ query: newQuery, titleOnly });
331
+ }
332
+ };
333
+ const handleTitleOnlyChange = (e) => {
334
+ const newTitleOnly = e.target.checked;
335
+ setTitleOnly(newTitleOnly);
336
+ if (onChange) {
337
+ onChange({ query, titleOnly: newTitleOnly });
338
+ }
339
+ };
340
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
341
+ /* @__PURE__ */ jsxRuntime.jsx(Typography6__default.default, { variant: "h6", gutterBottom: true, children: "Text Search" }),
342
+ /* @__PURE__ */ jsxRuntime.jsxs(Box8__default.default, { sx: { mb: 2 }, children: [
343
+ /* @__PURE__ */ jsxRuntime.jsx(
344
+ TextField__default.default,
345
+ {
346
+ fullWidth: true,
347
+ label: "Search in title and description",
348
+ variant: "outlined",
349
+ value: query,
350
+ onChange: handleQueryChange,
351
+ placeholder: "Enter search terms...",
352
+ sx: { mb: 1 }
353
+ }
354
+ ),
355
+ /* @__PURE__ */ jsxRuntime.jsx(
356
+ FormControlLabel__default.default,
357
+ {
358
+ control: /* @__PURE__ */ jsxRuntime.jsx(
359
+ Checkbox__default.default,
360
+ {
361
+ checked: titleOnly,
362
+ onChange: handleTitleOnlyChange
363
+ }
364
+ ),
365
+ label: "Search in title only"
366
+ }
367
+ )
368
+ ] })
369
+ ] });
370
+ };
371
+ var TextSearchCard_default = TextSearchCard;
372
+ var TypeFilter = ({ types, initialSelectedTypes = [], onChange }) => {
373
+ const [selectedTypes, setSelectedTypes] = React__default.default.useState(initialSelectedTypes);
374
+ React.useEffect(() => {
375
+ setSelectedTypes(initialSelectedTypes);
376
+ }, [initialSelectedTypes]);
264
377
  const handleTypeChange = (typeId) => {
265
378
  const newSelectedTypes = selectedTypes.includes(typeId) ? selectedTypes.filter((id) => id !== typeId) : [...selectedTypes, typeId];
266
379
  setSelectedTypes(newSelectedTypes);
267
- onChange == null ? void 0 : onChange(newSelectedTypes);
380
+ if (onChange) {
381
+ onChange(newSelectedTypes);
382
+ }
268
383
  };
269
384
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
270
- /* @__PURE__ */ jsxRuntime.jsx(Typography2__default.default, { variant: "h6", gutterBottom: true, children: "Type" }),
271
- /* @__PURE__ */ jsxRuntime.jsx(FormGroup__default.default, { children: FILTER_TYPES.map((type) => /* @__PURE__ */ jsxRuntime.jsx(
385
+ /* @__PURE__ */ jsxRuntime.jsx(Typography6__default.default, { variant: "h6", gutterBottom: true, children: "Type" }),
386
+ /* @__PURE__ */ jsxRuntime.jsx(FormGroup__default.default, { children: types.map((type) => /* @__PURE__ */ jsxRuntime.jsx(
272
387
  FormControlLabel__default.default,
273
388
  {
274
389
  control: /* @__PURE__ */ jsxRuntime.jsx(
@@ -276,7 +391,8 @@ var TypeFilter = ({ onChange }) => {
276
391
  {
277
392
  checked: selectedTypes.includes(type.id),
278
393
  onChange: () => handleTypeChange(type.id),
279
- disabled: type.disabled
394
+ disabled: type.id === "event",
395
+ title: type.id === "event" ? "Coming soon! Currently only player and table search are supported." : ""
280
396
  }
281
397
  ),
282
398
  label: type.label
@@ -287,23 +403,68 @@ var TypeFilter = ({ onChange }) => {
287
403
  };
288
404
  var TypeFilter_default = TypeFilter;
289
405
  var FiltersContainer = ({
406
+ initialSelectedTypes = [],
407
+ initialSelectedTags,
408
+ initialTextSearch,
409
+ includeExpiredTables = false,
290
410
  onTypeChange,
291
411
  onTagChange,
412
+ onTextSearchChange,
413
+ onIncludeExpiredTablesChange,
292
414
  onSubmit,
293
- tags
415
+ tags,
416
+ searchTypes
294
417
  }) => {
295
- return /* @__PURE__ */ jsxRuntime.jsxs(Box2__default.default, { children: [
296
- /* @__PURE__ */ jsxRuntime.jsx(TypeFilter_default, { onChange: onTypeChange }),
297
- /* @__PURE__ */ jsxRuntime.jsx(Divider__default.default, { sx: { my: 2 } }),
418
+ const [selectedTypes, setSelectedTypes] = React__default.default.useState(initialSelectedTypes);
419
+ React.useEffect(() => {
420
+ setSelectedTypes(initialSelectedTypes);
421
+ }, [initialSelectedTypes]);
422
+ const handleTypeChange = (types) => {
423
+ setSelectedTypes(types);
424
+ if (onTypeChange) {
425
+ onTypeChange(types);
426
+ }
427
+ };
428
+ return /* @__PURE__ */ jsxRuntime.jsxs(Box8__default.default, { children: [
429
+ /* @__PURE__ */ jsxRuntime.jsx(
430
+ TypeFilter_default,
431
+ {
432
+ types: searchTypes,
433
+ initialSelectedTypes,
434
+ onChange: handleTypeChange
435
+ }
436
+ ),
437
+ /* @__PURE__ */ jsxRuntime.jsx(Divider2__default.default, { sx: { my: 2 } }),
438
+ /* @__PURE__ */ jsxRuntime.jsx(
439
+ TextSearchCard_default,
440
+ {
441
+ selectedTypes,
442
+ initialTextSearch,
443
+ onChange: onTextSearchChange
444
+ }
445
+ ),
446
+ (selectedTypes.includes("table") || selectedTypes.includes("event")) && /* @__PURE__ */ jsxRuntime.jsx(Divider2__default.default, { sx: { my: 2 } }),
298
447
  /* @__PURE__ */ jsxRuntime.jsx(
299
448
  TagsFilter_default,
300
449
  {
301
450
  tags,
451
+ initialSelectedTags,
302
452
  onChange: onTagChange
303
453
  }
304
454
  ),
305
- /* @__PURE__ */ jsxRuntime.jsx(Divider__default.default, { sx: { my: 2 } }),
306
- /* @__PURE__ */ jsxRuntime.jsx(Box2__default.default, { sx: { display: "flex", justifyContent: "center", mt: 2 }, children: /* @__PURE__ */ jsxRuntime.jsx(
455
+ /* @__PURE__ */ jsxRuntime.jsx(Divider2__default.default, { sx: { my: 2 } }),
456
+ selectedTypes.includes("table") && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
457
+ /* @__PURE__ */ jsxRuntime.jsx(
458
+ ExpiredTablesFilter_default,
459
+ {
460
+ includeExpiredTables,
461
+ onChange: onIncludeExpiredTablesChange || (() => {
462
+ })
463
+ }
464
+ ),
465
+ /* @__PURE__ */ jsxRuntime.jsx(Divider2__default.default, { sx: { my: 2 } })
466
+ ] }),
467
+ /* @__PURE__ */ jsxRuntime.jsx(Box8__default.default, { sx: { display: "flex", justifyContent: "center", mt: 2 }, children: /* @__PURE__ */ jsxRuntime.jsx(
307
468
  Button__default.default,
308
469
  {
309
470
  variant: "contained",
@@ -328,41 +489,24 @@ var FiltersContainer = ({
328
489
  ] });
329
490
  };
330
491
  var FiltersContainer_default = FiltersContainer;
331
- function Chip({ tag, removeCallback }) {
332
- var _a;
333
- const color = (_a = tag.color) != null ? _a : "#bfbcbb";
334
- return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: /* @__PURE__ */ jsxRuntime.jsxs(
335
- "span",
336
- {
337
- className: "inline-block text-sm px-3 py-1 rounded-full border-2 font-outlined text-white m-0.5 font-stretch-105% font-sans",
338
- style: {
339
- borderColor: `color-mix(in srgb, ${color}, black 50%)`,
340
- background: `linear-gradient(160deg, color-mix(in srgb, ${color}, white 10%) 0%, color-mix(in srgb, ${color}, black 60%) 100%)`,
341
- textShadow: "black 1.5px 1px 1.5px",
342
- filter: `drop-shadow(2px 2px 1.5px color-mix(in srgb, ${color}, black 80%))`
343
- },
344
- children: [
345
- tag.label,
346
- removeCallback && /* @__PURE__ */ jsxRuntime.jsx(
347
- "button",
348
- {
349
- type: "button",
350
- onClick: () => removeCallback(tag.id),
351
- className: "ml-2 text-white hover:text-red-700 focus:outline-none pl-0.5 pr-1 cursor-pointer hover:bg-white rounded-full",
352
- style: {
353
- textShadow: "black 1px 1px 1px"
354
- },
355
- children: "X"
356
- }
357
- )
358
- ]
359
- },
360
- tag.id
361
- ) });
362
- }
492
+ var NextGameLabel = ({ nextGameTime }) => {
493
+ const date = typeof nextGameTime === "string" ? new Date(nextGameTime) : nextGameTime;
494
+ return /* @__PURE__ */ jsxRuntime.jsxs(material.Typography, { variant: "caption", sx: { display: "block", mb: 1, color: "primary.main", fontWeight: "bold" }, children: [
495
+ "Next Game: ",
496
+ date.toLocaleString()
497
+ ] });
498
+ };
499
+ var NextGameLabel_default = NextGameLabel;
363
500
  function generateTagsDisplay(tag) {
364
501
  return /* @__PURE__ */ jsxRuntime.jsx(Chip, { tag }, tag.id);
365
502
  }
503
+ function renderTagsFromIds(ids, legalTags) {
504
+ if (!ids || !legalTags || legalTags.length === 0) {
505
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, {});
506
+ }
507
+ const validTags = ids.map((id) => legalTags.find((tag) => tag.id === id)).filter((tag) => Boolean(tag));
508
+ return validTags.map((tag) => generateTagsDisplay(tag));
509
+ }
366
510
  var BaseSearchResultCard = ({
367
511
  result,
368
512
  onClick,
@@ -370,13 +514,19 @@ var BaseSearchResultCard = ({
370
514
  icon,
371
515
  tags
372
516
  }) => {
373
- const handleClick = () => {
517
+ const handleClick = (e) => {
374
518
  if (onClick) {
375
- onClick(result.id);
519
+ if (e.ctrlKey || e.metaKey || e.shiftKey) {
520
+ e.stopPropagation();
521
+ const url = `/${result.type}/${result.id}`;
522
+ window.open(url, "_blank");
523
+ } else {
524
+ onClick(result.id);
525
+ }
376
526
  }
377
527
  };
378
528
  return /* @__PURE__ */ jsxRuntime.jsx(
379
- material.Card,
529
+ Card2__default.default,
380
530
  {
381
531
  elevation: 6,
382
532
  sx: {
@@ -389,48 +539,21 @@ var BaseSearchResultCard = ({
389
539
  },
390
540
  marginBottom: 2
391
541
  },
392
- onClick: handleClick,
393
- children: /* @__PURE__ */ jsxRuntime.jsxs(material.CardContent, { sx: { display: "flex", alignItems: "flex-start" }, children: [
394
- icon && /* @__PURE__ */ jsxRuntime.jsx(material.Box, { sx: { mr: 2, display: "flex", alignItems: "center", pt: 0.5 }, children: icon }),
395
- /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { flex: 1 }, children: [
396
- /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "h6", sx: { mb: 1 }, children: result.title }),
542
+ onClick: (e) => handleClick(e),
543
+ children: /* @__PURE__ */ jsxRuntime.jsxs(CardContent2__default.default, { sx: { display: "flex", alignItems: "flex-start" }, children: [
544
+ icon && /* @__PURE__ */ jsxRuntime.jsx(Box8__default.default, { sx: { mr: 2, display: "flex", alignItems: "center", pt: 0.5 }, children: icon }),
545
+ /* @__PURE__ */ jsxRuntime.jsxs(Box8__default.default, { sx: { flex: 1 }, children: [
546
+ /* @__PURE__ */ jsxRuntime.jsx(Typography6__default.default, { variant: "h6", sx: { mb: 1 }, children: result.title }),
547
+ result.nextGameTime && /* @__PURE__ */ jsxRuntime.jsx(NextGameLabel_default, { nextGameTime: result.nextGameTime }),
548
+ result.type === "table" && result.shortDescription ? /* @__PURE__ */ jsxRuntime.jsx(Typography6__default.default, { variant: "body2", sx: { mb: 1 }, children: result.shortDescription }) : null,
397
549
  children,
398
- /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "body1", children: result.description }),
399
- result.tags && result.tags.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(material.Box, { sx: { mt: 1 }, children: /* @__PURE__ */ jsxRuntime.jsx(material.Box, { sx: {
400
- display: "block",
401
- whiteSpace: "nowrap",
402
- overflow: "hidden",
403
- textOverflow: "clip",
404
- pl: 0.5
405
- // Add some padding to prevent clipping of the leftmost tag
406
- }, children: (() => {
407
- const MAX_VISIBLE = 5;
408
- const tagObjs = result.tags.map((tagId) => tags.find((t) => t.id === tagId)).filter((t) => Boolean(t));
409
- const visible = tagObjs.slice(0, MAX_VISIBLE);
410
- const hiddenCount = Math.max(tagObjs.length - visible.length, 0);
411
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
412
- visible.map((tag) => generateTagsDisplay(tag)),
413
- hiddenCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs(
414
- "span",
415
- {
416
- className: "inline-block text-sm px-3 py-1 rounded-full outline-black outline-2 font-outlined",
417
- style: {
418
- marginTop: "6px",
419
- marginRight: "6px",
420
- marginBottom: "6px",
421
- background: "#9e9e9e",
422
- color: "white",
423
- textShadow: "black 0.2em 0.2em 0.4em"
424
- },
425
- children: [
426
- "+",
427
- hiddenCount,
428
- " more"
429
- ]
430
- }
431
- )
432
- ] });
433
- })() }) })
550
+ result.type === "table" ? /* @__PURE__ */ jsxRuntime.jsx(Typography6__default.default, { variant: "body1", children: (() => {
551
+ var _a, _b;
552
+ const full = (_b = (_a = result.fullDescription) != null ? _a : result.description) != null ? _b : "";
553
+ const text = full || "";
554
+ return text.length > 200 ? `${text.slice(0, 200).trimEnd()}...` : text;
555
+ })() }) : /* @__PURE__ */ jsxRuntime.jsx(Typography6__default.default, { variant: "body1", children: result.description }),
556
+ result.tags && result.tags.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(Box8__default.default, { sx: { mt: 1, display: "flex", flexWrap: "wrap", gap: 1 }, children: renderTagsFromIds(result.tags, tags) })
434
557
  ] })
435
558
  ] })
436
559
  }
@@ -485,21 +608,60 @@ var PlayerResultCard = ({
485
608
  return /* @__PURE__ */ jsxRuntime.jsx(BaseSearchResultCard_default, { result, onClick, icon: playerIcon, tags });
486
609
  };
487
610
  var PlayerResultCard_default = PlayerResultCard;
488
- var TableResultCard = ({ result, tags, onClick }) => {
489
- const capacity = result.capacity || 1;
490
- const numPlayers = result.numPlayers || 0;
491
- const occupancy = numPlayers / capacity * 100;
492
- 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: [
493
- /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { display: "flex", justifyContent: "space-between", alignItems: "center", mb: 0.5 }, children: [
494
- /* @__PURE__ */ jsxRuntime.jsxs(material.Typography, { variant: "body2", color: "text.secondary", children: [
495
- "Players: ",
496
- numPlayers,
497
- " / ",
498
- capacity
611
+ var TableResultCard = ({
612
+ result,
613
+ onClick,
614
+ tags
615
+ }) => {
616
+ const rawCapacity = result.capacity;
617
+ const hasDefinedCapacity = typeof rawCapacity === "number" && Number.isFinite(rawCapacity) && rawCapacity > 0;
618
+ const capacity = hasDefinedCapacity ? rawCapacity : 0;
619
+ const activePlayers = typeof result.numPlayers === "number" ? result.numPlayers : 0;
620
+ const availableSlots = Math.max(capacity - activePlayers, 0);
621
+ const hasDM = typeof result.hasDM === "boolean" ? result.hasDM : Boolean(result.dungeonMaster);
622
+ const occupancyPercentage = hasDefinedCapacity ? activePlayers / capacity * 100 : 100;
623
+ const tableIcon = /* @__PURE__ */ jsxRuntime.jsx(
624
+ TableRestaurantIcon__default.default,
625
+ {
626
+ sx: {
627
+ fontSize: 40,
628
+ color: "primary.main"
629
+ }
630
+ }
631
+ );
632
+ return /* @__PURE__ */ jsxRuntime.jsx(BaseSearchResultCard_default, { result, onClick, icon: tableIcon, tags, children: /* @__PURE__ */ jsxRuntime.jsxs(Box8__default.default, { sx: { mb: 2 }, children: [
633
+ /* @__PURE__ */ jsxRuntime.jsxs(Box8__default.default, { sx: { display: "flex", justifyContent: "space-between", alignItems: "center", mb: 1 }, children: [
634
+ /* @__PURE__ */ jsxRuntime.jsxs(Typography6__default.default, { variant: "body2", children: [
635
+ /* @__PURE__ */ jsxRuntime.jsx("strong", { children: "Players:" }),
636
+ " ",
637
+ hasDefinedCapacity ? `${activePlayers}/${capacity}` : activePlayers
499
638
  ] }),
500
- 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" })
639
+ typeof hasDM === "boolean" && /* @__PURE__ */ jsxRuntime.jsx(
640
+ Chip2__default.default,
641
+ {
642
+ icon: hasDM ? /* @__PURE__ */ jsxRuntime.jsx(SupervisorAccountIcon__default.default, {}) : /* @__PURE__ */ jsxRuntime.jsx(PersonIcon__default.default, {}),
643
+ label: hasDM ? "DM Present" : "No DM",
644
+ color: hasDM ? "success" : "warning",
645
+ size: "small"
646
+ }
647
+ )
501
648
  ] }),
502
- /* @__PURE__ */ jsxRuntime.jsx(material.LinearProgress, { variant: "determinate", value: occupancy, sx: { height: 8, borderRadius: 4 } })
649
+ /* @__PURE__ */ jsxRuntime.jsx(
650
+ LinearProgress__default.default,
651
+ {
652
+ variant: "determinate",
653
+ value: occupancyPercentage,
654
+ sx: {
655
+ height: 10,
656
+ borderRadius: 5,
657
+ backgroundColor: "#e0e0e0",
658
+ "& .MuiLinearProgress-bar": {
659
+ backgroundColor: hasDefinedCapacity ? availableSlots > 0 ? "#4caf50" : "#f44336" : "#2196f3"
660
+ }
661
+ }
662
+ }
663
+ ),
664
+ hasDefinedCapacity && /* @__PURE__ */ jsxRuntime.jsx(Typography6__default.default, { variant: "body2", sx: { mt: 0.5, textAlign: "right" }, children: availableSlots > 0 ? `${availableSlots} slot${availableSlots !== 1 ? "s" : ""} available` : "Table full" })
503
665
  ] }) });
504
666
  };
505
667
  var TableResultCard_default = TableResultCard;
@@ -518,20 +680,42 @@ var EventResultCard = ({
518
680
  try {
519
681
  const date = new Date(dateString);
520
682
  return date.toLocaleDateString("en-US", options);
521
- } catch {
683
+ } catch (error) {
522
684
  return dateString;
523
685
  }
524
686
  };
525
687
  const formattedDate = result.date ? formatDate(result.date) : "Date TBD";
526
688
  const location = result.location || "Location TBD";
527
- 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: [
528
- /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { display: "flex", alignItems: "center", mb: 0.5 }, children: [
529
- /* @__PURE__ */ jsxRuntime.jsx(CalendarTodayIcon__default.default, { sx: { mr: 1, fontSize: "small", color: "text.secondary" } }),
530
- /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "body2", color: "text.secondary", children: formattedDate })
689
+ const eventIcon = /* @__PURE__ */ jsxRuntime.jsx(
690
+ EventIcon__default.default,
691
+ {
692
+ sx: {
693
+ fontSize: 40,
694
+ color: "primary.main"
695
+ }
696
+ }
697
+ );
698
+ return /* @__PURE__ */ jsxRuntime.jsx(BaseSearchResultCard_default, { result, onClick, icon: eventIcon, tags, children: /* @__PURE__ */ jsxRuntime.jsxs(Box8__default.default, { sx: { mb: 2 }, children: [
699
+ /* @__PURE__ */ jsxRuntime.jsxs(Box8__default.default, { sx: { display: "flex", alignItems: "center", mb: 1 }, children: [
700
+ /* @__PURE__ */ jsxRuntime.jsx(CalendarTodayIcon__default.default, { sx: { mr: 1, color: "primary.main" } }),
701
+ /* @__PURE__ */ jsxRuntime.jsxs(Typography6__default.default, { variant: "body2", children: [
702
+ /* @__PURE__ */ jsxRuntime.jsx("strong", { children: "Date:" }),
703
+ " ",
704
+ formattedDate
705
+ ] })
531
706
  ] }),
532
- /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { display: "flex", alignItems: "center", mb: 1 }, children: [
533
- /* @__PURE__ */ jsxRuntime.jsx(LocationOnIcon__default.default, { sx: { mr: 1, fontSize: "small", color: "text.secondary" } }),
534
- /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "body2", color: "text.secondary", children: location })
707
+ /* @__PURE__ */ jsxRuntime.jsxs(Box8__default.default, { sx: { display: "flex", alignItems: "center" }, children: [
708
+ /* @__PURE__ */ jsxRuntime.jsx(LocationOnIcon__default.default, { sx: { mr: 1, color: "primary.main" } }),
709
+ /* @__PURE__ */ jsxRuntime.jsxs(Typography6__default.default, { variant: "body2", children: [
710
+ /* @__PURE__ */ jsxRuntime.jsx("strong", { children: "Location:" }),
711
+ " ",
712
+ location
713
+ ] })
714
+ ] }),
715
+ result.organizer && /* @__PURE__ */ jsxRuntime.jsxs(Typography6__default.default, { variant: "body2", sx: { mt: 1 }, children: [
716
+ /* @__PURE__ */ jsxRuntime.jsx("strong", { children: "Organizer:" }),
717
+ " ",
718
+ result.organizer
535
719
  ] })
536
720
  ] }) });
537
721
  };
@@ -539,10 +723,12 @@ var EventResultCard_default = EventResultCard;
539
723
  var ResultsContainer = ({
540
724
  results,
541
725
  onResultClick,
542
- tags
726
+ tags,
727
+ pagination,
728
+ onPacketChange
543
729
  }) => {
544
- if (results.length === 0 || !results.map) {
545
- return /* @__PURE__ */ jsxRuntime.jsx(Box2__default.default, { sx: { textAlign: "center", py: 4 }, children: "No results found. Try adjusting your filters." });
730
+ if (!results || results.length === 0 || !results.map) {
731
+ return /* @__PURE__ */ jsxRuntime.jsx(Box8__default.default, { sx: { textAlign: "center", py: 4 }, children: "No results found. Try adjusting your filters." });
546
732
  }
547
733
  const onPlayerClick = (id) => {
548
734
  onResultClick == null ? void 0 : onResultClick(id, "player");
@@ -553,43 +739,68 @@ var ResultsContainer = ({
553
739
  const onEventClick = (id) => {
554
740
  onResultClick == null ? void 0 : onResultClick(id, "event");
555
741
  };
556
- return /* @__PURE__ */ jsxRuntime.jsx(Box2__default.default, { sx: { display: "flex", flexDirection: "column", gap: 2 }, children: results.map((result) => {
557
- switch (result.type) {
558
- case "player":
559
- return /* @__PURE__ */ jsxRuntime.jsx(
560
- PlayerResultCard_default,
561
- {
562
- result,
563
- onClick: onPlayerClick,
564
- tags
565
- },
566
- result.id
567
- );
568
- case "table":
569
- return /* @__PURE__ */ jsxRuntime.jsx(
570
- TableResultCard_default,
571
- {
572
- result,
573
- onClick: onTableClick,
574
- tags
575
- },
576
- result.id
577
- );
578
- case "event":
579
- return /* @__PURE__ */ jsxRuntime.jsx(
580
- EventResultCard_default,
581
- {
582
- result,
583
- onClick: onEventClick,
584
- tags
585
- },
586
- result.id
587
- );
588
- default:
589
- console.error(`Unknown result type: ${result.type}`);
590
- return null;
591
- }
592
- }) });
742
+ const handlePacketChange = (_event, packet) => {
743
+ onPacketChange == null ? void 0 : onPacketChange(packet);
744
+ };
745
+ const startResult = pagination ? (pagination.currentPacket - 1) * pagination.packetSize + 1 : 1;
746
+ const endResult = pagination ? Math.min(pagination.currentPacket * pagination.packetSize, pagination.totalResults) : results.length;
747
+ return /* @__PURE__ */ jsxRuntime.jsxs(Box8__default.default, { sx: { display: "flex", flexDirection: "column", gap: 2 }, children: [
748
+ pagination && /* @__PURE__ */ jsxRuntime.jsx(Box8__default.default, { sx: { display: "flex", justifyContent: "space-between", alignItems: "center", mb: 1 }, children: /* @__PURE__ */ jsxRuntime.jsxs(Typography6__default.default, { variant: "body2", color: "text.secondary", children: [
749
+ "Showing ",
750
+ startResult,
751
+ "-",
752
+ endResult,
753
+ " of ",
754
+ pagination.totalResults,
755
+ " results"
756
+ ] }) }),
757
+ results.map((result) => {
758
+ switch (result.type) {
759
+ case "player":
760
+ return /* @__PURE__ */ jsxRuntime.jsx(
761
+ PlayerResultCard_default,
762
+ {
763
+ result,
764
+ onClick: onPlayerClick,
765
+ tags
766
+ },
767
+ result.id
768
+ );
769
+ case "table":
770
+ return /* @__PURE__ */ jsxRuntime.jsx(
771
+ TableResultCard_default,
772
+ {
773
+ result,
774
+ onClick: onTableClick,
775
+ tags
776
+ },
777
+ result.id
778
+ );
779
+ case "event":
780
+ return /* @__PURE__ */ jsxRuntime.jsx(
781
+ EventResultCard_default,
782
+ {
783
+ result,
784
+ onClick: onEventClick,
785
+ tags
786
+ },
787
+ result.id
788
+ );
789
+ default:
790
+ console.error(`Unknown result type: ${result.type}`);
791
+ return null;
792
+ }
793
+ }),
794
+ pagination && pagination.totalPackets > 1 && /* @__PURE__ */ jsxRuntime.jsx(Box8__default.default, { sx: { display: "flex", justifyContent: "center", mt: 4 }, children: /* @__PURE__ */ jsxRuntime.jsx(
795
+ Pagination__default.default,
796
+ {
797
+ count: pagination.totalPackets,
798
+ page: pagination.currentPacket,
799
+ onChange: handlePacketChange,
800
+ color: "primary"
801
+ }
802
+ ) })
803
+ ] });
593
804
  };
594
805
  var ResultsContainer_default = ResultsContainer;
595
806
  var ScrollableResultsList = ({
@@ -600,7 +811,7 @@ var ScrollableResultsList = ({
600
811
  emptyText
601
812
  }) => {
602
813
  const hasResults = Array.isArray(results) && results.length > 0;
603
- return /* @__PURE__ */ jsxRuntime.jsx(Box2__default.default, { sx: { maxHeight, overflowY: "auto", pr: 1 }, children: hasResults ? /* @__PURE__ */ jsxRuntime.jsx(ResultsContainer_default, { results, onResultClick, tags }) : /* @__PURE__ */ jsxRuntime.jsx(Box2__default.default, { sx: { textAlign: "center", py: 2 }, children: emptyText || "No results to display." }) });
814
+ return /* @__PURE__ */ jsxRuntime.jsx(Box8__default.default, { sx: { maxHeight, overflowY: "auto", pr: 1 }, children: hasResults ? /* @__PURE__ */ jsxRuntime.jsx(ResultsContainer_default, { results, onResultClick, tags }) : /* @__PURE__ */ jsxRuntime.jsx(Box8__default.default, { sx: { textAlign: "center", py: 2 }, children: emptyText || "No results to display." }) });
604
815
  };
605
816
  var ScrollableResultsList_default = ScrollableResultsList;
606
817
  var PlayersScrollableList = ({
@@ -635,17 +846,76 @@ var SearchResultCard_default = SearchResultCard;
635
846
  function SearchPageLayout({
636
847
  results,
637
848
  title = "Search Results",
849
+ initialSelectedTypes = [],
850
+ initialSelectedTags = {
851
+ mustHave: [],
852
+ mustNotHave: [],
853
+ shouldHaveAtLeastOne: []
854
+ },
855
+ initialTextSearch = {
856
+ query: "",
857
+ titleOnly: false
858
+ },
859
+ includeExpiredTables: initialIncludeExpiredTables = false,
638
860
  onTypeChange,
639
861
  onTagChange,
862
+ onTextSearchChange,
863
+ onIncludeExpiredTablesChange,
640
864
  onSubmit,
641
865
  onResultClick,
866
+ onPacketChange,
867
+ pagination,
642
868
  validTags,
643
- allTags
869
+ allTags,
870
+ searchTypes,
871
+ isLoading = false
644
872
  }) {
645
- "use client";
646
873
  const theme = material.useTheme();
647
874
  const isMobile = material.useMediaQuery(theme.breakpoints.down("md"));
648
- return /* @__PURE__ */ jsxRuntime.jsxs(Box2__default.default, { sx: { padding: 2 }, children: [
875
+ const [selectedTypes, setSelectedTypes] = React.useState(initialSelectedTypes);
876
+ const [selectedTags, setSelectedTags] = React.useState(initialSelectedTags);
877
+ const [textSearch, setTextSearch] = React.useState(initialTextSearch);
878
+ const [includeExpiredTables, setIncludeExpiredTables] = React.useState(initialIncludeExpiredTables);
879
+ React.useEffect(() => {
880
+ setSelectedTypes(initialSelectedTypes);
881
+ }, [initialSelectedTypes]);
882
+ React.useEffect(() => {
883
+ setSelectedTags(initialSelectedTags);
884
+ }, [initialSelectedTags]);
885
+ React.useEffect(() => {
886
+ setTextSearch(initialTextSearch);
887
+ }, [initialTextSearch]);
888
+ React.useEffect(() => {
889
+ setIncludeExpiredTables(initialIncludeExpiredTables);
890
+ }, [initialIncludeExpiredTables]);
891
+ const handleTypeChange = (types) => {
892
+ setSelectedTypes(types);
893
+ if (onTypeChange) onTypeChange(types);
894
+ };
895
+ const handleTagChange = (tags) => {
896
+ setSelectedTags(tags);
897
+ if (onTagChange) onTagChange(tags);
898
+ };
899
+ const handleTextSearchChange = (ts) => {
900
+ setTextSearch(ts);
901
+ if (onTextSearchChange) onTextSearchChange(ts);
902
+ };
903
+ const handleIncludeExpiredTablesChange = (include) => {
904
+ setIncludeExpiredTables(include);
905
+ if (onIncludeExpiredTablesChange) onIncludeExpiredTablesChange(include);
906
+ };
907
+ const handleSubmit = () => {
908
+ const currentCriteria = {
909
+ selectedTypes,
910
+ selectedTags,
911
+ textSearch,
912
+ includeExpiredTables
913
+ };
914
+ if (onSubmit) {
915
+ onSubmit(currentCriteria);
916
+ }
917
+ };
918
+ return /* @__PURE__ */ jsxRuntime.jsxs(Box8__default.default, { sx: { padding: 2 }, children: [
649
919
  /* @__PURE__ */ jsxRuntime.jsx(Card2__default.default, { sx: { marginBottom: 2 }, children: /* @__PURE__ */ jsxRuntime.jsx(
650
920
  CardHeader__default.default,
651
921
  {
@@ -675,10 +945,17 @@ function SearchPageLayout({
675
945
  /* @__PURE__ */ jsxRuntime.jsx(CardContent2__default.default, { children: /* @__PURE__ */ jsxRuntime.jsx(
676
946
  FiltersContainer_default,
677
947
  {
678
- onTypeChange,
679
- onTagChange,
680
- onSubmit,
681
- tags: validTags
948
+ initialSelectedTypes: selectedTypes,
949
+ initialSelectedTags: selectedTags,
950
+ initialTextSearch: textSearch,
951
+ includeExpiredTables,
952
+ onTypeChange: handleTypeChange,
953
+ onTagChange: handleTagChange,
954
+ onTextSearchChange: handleTextSearchChange,
955
+ onIncludeExpiredTablesChange: handleIncludeExpiredTablesChange,
956
+ onSubmit: handleSubmit,
957
+ tags: validTags,
958
+ searchTypes
682
959
  }
683
960
  ) })
684
961
  ] }) }),
@@ -695,10 +972,12 @@ function SearchPageLayout({
695
972
  }
696
973
  }
697
974
  ),
698
- /* @__PURE__ */ jsxRuntime.jsx(CardContent2__default.default, { children: /* @__PURE__ */ jsxRuntime.jsx(
975
+ /* @__PURE__ */ jsxRuntime.jsx(CardContent2__default.default, { children: isLoading ? /* @__PURE__ */ jsxRuntime.jsx(Box8__default.default, { sx: { display: "flex", justifyContent: "center", py: 8 }, children: /* @__PURE__ */ jsxRuntime.jsx(CircularProgress__default.default, { size: 60, thickness: 4 }) }) : /* @__PURE__ */ jsxRuntime.jsx(
699
976
  ResultsContainer_default,
700
977
  {
701
978
  results,
979
+ pagination,
980
+ onPacketChange,
702
981
  onResultClick,
703
982
  tags: allTags
704
983
  }
@@ -711,21 +990,14 @@ var TablesScrollableList = ({
711
990
  results,
712
991
  tags,
713
992
  maxHeight,
714
- onResultClick,
715
- sortBy = "availability"
993
+ onResultClick
716
994
  }) => {
717
995
  const tables = (results || []).filter((r) => (r == null ? void 0 : r.type) === "table");
718
- const getAvailableSlots = (r) => {
719
- const capacity = typeof r.capacity === "number" ? r.capacity : 0;
720
- const playersCount = typeof r.numPlayers === "number" ? r.numPlayers : 0;
721
- return Math.max(capacity - playersCount, 0);
722
- };
723
- const sortedTables = sortBy === "availability" ? [...tables].sort((a, b) => getAvailableSlots(b) - getAvailableSlots(a)) : tables;
724
996
  const handleClick = (id) => onResultClick == null ? void 0 : onResultClick(id);
725
997
  return /* @__PURE__ */ jsxRuntime.jsx(
726
998
  ScrollableResultsList_default,
727
999
  {
728
- results: sortedTables,
1000
+ results: tables,
729
1001
  tags,
730
1002
  maxHeight,
731
1003
  onResultClick: (id, type) => {
@@ -738,6 +1010,7 @@ var TablesScrollableList_default = TablesScrollableList;
738
1010
 
739
1011
  exports.BaseSearchResultCard = BaseSearchResultCard_default;
740
1012
  exports.EventResultCard = EventResultCard_default;
1013
+ exports.ExpiredTablesFilter = ExpiredTablesFilter_default;
741
1014
  exports.FiltersContainer = FiltersContainer_default;
742
1015
  exports.PlayerResultCard = PlayerResultCard_default;
743
1016
  exports.PlayersScrollableList = PlayersScrollableList_default;
@@ -749,6 +1022,7 @@ exports.SortOptions = SortOptions_default;
749
1022
  exports.TableResultCard = TableResultCard_default;
750
1023
  exports.TablesScrollableList = TablesScrollableList_default;
751
1024
  exports.TagsFilter = TagsFilter_default;
1025
+ exports.TextSearchCard = TextSearchCard_default;
752
1026
  exports.TypeFilter = TypeFilter_default;
753
1027
  //# sourceMappingURL=index.cjs.map
754
1028
  //# sourceMappingURL=index.cjs.map