@mbpockets/shared-ui 0.1.19 → 0.1.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/dist/EventPage/index.cjs +209 -121
  2. package/dist/EventPage/index.cjs.map +1 -1
  3. package/dist/EventPage/index.mjs +201 -119
  4. package/dist/EventPage/index.mjs.map +1 -1
  5. package/dist/EventPage.cjs +209 -121
  6. package/dist/EventPage.cjs.map +1 -1
  7. package/dist/EventPage.mjs +201 -119
  8. package/dist/EventPage.mjs.map +1 -1
  9. package/dist/PlayerPage/index.cjs +289 -92
  10. package/dist/PlayerPage/index.cjs.map +1 -1
  11. package/dist/PlayerPage/index.d.cts +1 -1
  12. package/dist/PlayerPage/index.d.ts +1 -1
  13. package/dist/PlayerPage/index.mjs +287 -90
  14. package/dist/PlayerPage/index.mjs.map +1 -1
  15. package/dist/PlayerPage.cjs +289 -92
  16. package/dist/PlayerPage.cjs.map +1 -1
  17. package/dist/PlayerPage.d.cts +24 -6
  18. package/dist/PlayerPage.d.ts +24 -6
  19. package/dist/PlayerPage.mjs +287 -90
  20. package/dist/PlayerPage.mjs.map +1 -1
  21. package/dist/ProfilePage/index.cjs +474 -44
  22. package/dist/ProfilePage/index.cjs.map +1 -1
  23. package/dist/ProfilePage/index.d.cts +2 -1
  24. package/dist/ProfilePage/index.d.ts +2 -1
  25. package/dist/ProfilePage/index.mjs +469 -39
  26. package/dist/ProfilePage/index.mjs.map +1 -1
  27. package/dist/ProfilePage.cjs +474 -44
  28. package/dist/ProfilePage.cjs.map +1 -1
  29. package/dist/ProfilePage.d.cts +4 -10
  30. package/dist/ProfilePage.d.ts +4 -10
  31. package/dist/ProfilePage.mjs +469 -39
  32. package/dist/ProfilePage.mjs.map +1 -1
  33. package/dist/SearchPage/Filters/index.cjs +149 -43
  34. package/dist/SearchPage/Filters/index.cjs.map +1 -1
  35. package/dist/SearchPage/Filters/index.d.cts +1 -2
  36. package/dist/SearchPage/Filters/index.d.ts +1 -2
  37. package/dist/SearchPage/Filters/index.mjs +146 -42
  38. package/dist/SearchPage/Filters/index.mjs.map +1 -1
  39. package/dist/SearchPage/Filters.cjs +149 -43
  40. package/dist/SearchPage/Filters.cjs.map +1 -1
  41. package/dist/SearchPage/Filters.d.cts +38 -3
  42. package/dist/SearchPage/Filters.d.ts +38 -3
  43. package/dist/SearchPage/Filters.mjs +146 -42
  44. package/dist/SearchPage/Filters.mjs.map +1 -1
  45. package/dist/SearchPage/Results/index.cjs +139 -67
  46. package/dist/SearchPage/Results/index.cjs.map +1 -1
  47. package/dist/SearchPage/Results/index.mjs +127 -63
  48. package/dist/SearchPage/Results/index.mjs.map +1 -1
  49. package/dist/SearchPage/Results.cjs +139 -67
  50. package/dist/SearchPage/Results.cjs.map +1 -1
  51. package/dist/SearchPage/Results.d.cts +21 -12
  52. package/dist/SearchPage/Results.d.ts +21 -12
  53. package/dist/SearchPage/Results.mjs +127 -63
  54. package/dist/SearchPage/Results.mjs.map +1 -1
  55. package/dist/SearchPage/index.cjs +496 -221
  56. package/dist/SearchPage/index.cjs.map +1 -1
  57. package/dist/SearchPage/index.d.cts +1 -1
  58. package/dist/SearchPage/index.d.ts +1 -1
  59. package/dist/SearchPage/index.mjs +483 -216
  60. package/dist/SearchPage/index.mjs.map +1 -1
  61. package/dist/SearchPage.cjs +496 -221
  62. package/dist/SearchPage.cjs.map +1 -1
  63. package/dist/SearchPage.d.cts +78 -7
  64. package/dist/SearchPage.d.ts +78 -7
  65. package/dist/SearchPage.mjs +483 -216
  66. package/dist/SearchPage.mjs.map +1 -1
  67. package/dist/TablePage/index.cjs +10 -1
  68. package/dist/TablePage/index.cjs.map +1 -1
  69. package/dist/TablePage/index.d.cts +2 -2
  70. package/dist/TablePage/index.d.ts +2 -2
  71. package/dist/TablePage/index.mjs +10 -2
  72. package/dist/TablePage/index.mjs.map +1 -1
  73. package/dist/TablePage.cjs +10 -1
  74. package/dist/TablePage.cjs.map +1 -1
  75. package/dist/TablePage.d.cts +7 -2
  76. package/dist/TablePage.d.ts +7 -2
  77. package/dist/TablePage.mjs +10 -2
  78. package/dist/TablePage.mjs.map +1 -1
  79. package/dist/index.cjs +789 -331
  80. package/dist/index.cjs.map +1 -1
  81. package/dist/index.d.cts +4 -5
  82. package/dist/index.d.ts +4 -5
  83. package/dist/index.mjs +772 -324
  84. package/dist/index.mjs.map +1 -1
  85. package/dist/mocks/SearchResults.cjs +22 -15
  86. package/dist/mocks/SearchResults.cjs.map +1 -1
  87. package/dist/mocks/SearchResults.d.cts +3 -15
  88. package/dist/mocks/SearchResults.d.ts +3 -15
  89. package/dist/mocks/SearchResults.mjs +22 -15
  90. package/dist/mocks/SearchResults.mjs.map +1 -1
  91. package/dist/mocks/index.cjs +22 -15
  92. package/dist/mocks/index.cjs.map +1 -1
  93. package/dist/mocks/index.d.cts +2 -1
  94. package/dist/mocks/index.d.ts +2 -1
  95. package/dist/mocks/index.mjs +22 -15
  96. package/dist/mocks/index.mjs.map +1 -1
  97. package/dist/mocks.cjs +22 -15
  98. package/dist/mocks.cjs.map +1 -1
  99. package/dist/mocks.d.cts +2 -1
  100. package/dist/mocks.d.ts +2 -1
  101. package/dist/mocks.mjs +22 -15
  102. package/dist/mocks.mjs.map +1 -1
  103. package/dist/{common → shared}/index.cjs.map +1 -1
  104. package/dist/{common → shared}/index.d.cts +1 -1
  105. package/dist/{common → shared}/index.d.ts +1 -1
  106. package/dist/{common → shared}/index.mjs.map +1 -1
  107. package/dist/{common.cjs → shared.cjs} +2 -2
  108. package/dist/{common.cjs.map → shared.cjs.map} +1 -1
  109. package/dist/{common.css → shared.css} +1 -1
  110. package/dist/{common.mjs → shared.mjs} +2 -2
  111. package/dist/{common.mjs.map → shared.mjs.map} +1 -1
  112. package/dist/types/index.d.cts +1 -1
  113. package/dist/types/index.d.ts +1 -1
  114. package/dist/types/search.d.cts +23 -1
  115. package/dist/types/search.d.ts +23 -1
  116. package/dist/types.d.cts +1 -1
  117. package/dist/types.d.ts +1 -1
  118. package/package.json +1 -1
  119. /package/dist/{common → shared}/Modal/index.cjs +0 -0
  120. /package/dist/{common → shared}/Modal/index.cjs.map +0 -0
  121. /package/dist/{common → shared}/Modal/index.css +0 -0
  122. /package/dist/{common → shared}/Modal/index.css.map +0 -0
  123. /package/dist/{common → shared}/Modal/index.d.cts +0 -0
  124. /package/dist/{common → shared}/Modal/index.d.ts +0 -0
  125. /package/dist/{common → shared}/Modal/index.mjs +0 -0
  126. /package/dist/{common → shared}/Modal/index.mjs.map +0 -0
  127. /package/dist/{common → shared}/Modal.cjs +0 -0
  128. /package/dist/{common → shared}/Modal.cjs.map +0 -0
  129. /package/dist/{common → shared}/Modal.css +0 -0
  130. /package/dist/{common → shared}/Modal.css.map +0 -0
  131. /package/dist/{common → shared}/Modal.d.cts +0 -0
  132. /package/dist/{common → shared}/Modal.d.ts +0 -0
  133. /package/dist/{common → shared}/Modal.mjs +0 -0
  134. /package/dist/{common → shared}/Modal.mjs.map +0 -0
  135. /package/dist/{common → shared}/index.cjs +0 -0
  136. /package/dist/{common → shared}/index.css +0 -0
  137. /package/dist/{common → shared}/index.css.map +0 -0
  138. /package/dist/{common → shared}/index.mjs +0 -0
  139. /package/dist/{common.css.map → shared.css.map} +0 -0
  140. /package/dist/{common.d.cts → shared.d.cts} +0 -0
  141. /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,22 @@ 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
+ if (typeof full !== "string") return "";
554
+ const text = full || "";
555
+ return text.length > 200 ? `${text.slice(0, 200).trimEnd()}...` : text;
556
+ })() }) : /* @__PURE__ */ jsxRuntime.jsx(Typography6__default.default, { variant: "body1", children: result.description }),
557
+ 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
558
  ] })
435
559
  ] })
436
560
  }
@@ -485,21 +609,60 @@ var PlayerResultCard = ({
485
609
  return /* @__PURE__ */ jsxRuntime.jsx(BaseSearchResultCard_default, { result, onClick, icon: playerIcon, tags });
486
610
  };
487
611
  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
612
+ var TableResultCard = ({
613
+ result,
614
+ onClick,
615
+ tags
616
+ }) => {
617
+ const rawCapacity = result.capacity;
618
+ const hasDefinedCapacity = typeof rawCapacity === "number" && Number.isFinite(rawCapacity) && rawCapacity > 0;
619
+ const capacity = hasDefinedCapacity ? rawCapacity : 0;
620
+ const activePlayers = typeof result.numPlayers === "number" ? result.numPlayers : 0;
621
+ const availableSlots = Math.max(capacity - activePlayers, 0);
622
+ const hasDM = typeof result.hasDM === "boolean" ? result.hasDM : Boolean(result.dungeonMaster);
623
+ const occupancyPercentage = hasDefinedCapacity ? activePlayers / capacity * 100 : 100;
624
+ const tableIcon = /* @__PURE__ */ jsxRuntime.jsx(
625
+ TableRestaurantIcon__default.default,
626
+ {
627
+ sx: {
628
+ fontSize: 40,
629
+ color: "primary.main"
630
+ }
631
+ }
632
+ );
633
+ return /* @__PURE__ */ jsxRuntime.jsx(BaseSearchResultCard_default, { result, onClick, icon: tableIcon, tags, children: /* @__PURE__ */ jsxRuntime.jsxs(Box8__default.default, { sx: { mb: 2 }, children: [
634
+ /* @__PURE__ */ jsxRuntime.jsxs(Box8__default.default, { sx: { display: "flex", justifyContent: "space-between", alignItems: "center", mb: 1 }, children: [
635
+ /* @__PURE__ */ jsxRuntime.jsxs(Typography6__default.default, { variant: "body2", children: [
636
+ /* @__PURE__ */ jsxRuntime.jsx("strong", { children: "Players:" }),
637
+ " ",
638
+ hasDefinedCapacity ? `${activePlayers}/${capacity}` : activePlayers
499
639
  ] }),
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" })
640
+ typeof hasDM === "boolean" && /* @__PURE__ */ jsxRuntime.jsx(
641
+ Chip2__default.default,
642
+ {
643
+ icon: hasDM ? /* @__PURE__ */ jsxRuntime.jsx(SupervisorAccountIcon__default.default, {}) : /* @__PURE__ */ jsxRuntime.jsx(PersonIcon__default.default, {}),
644
+ label: hasDM ? "DM Present" : "No DM",
645
+ color: hasDM ? "success" : "warning",
646
+ size: "small"
647
+ }
648
+ )
501
649
  ] }),
502
- /* @__PURE__ */ jsxRuntime.jsx(material.LinearProgress, { variant: "determinate", value: occupancy, sx: { height: 8, borderRadius: 4 } })
650
+ /* @__PURE__ */ jsxRuntime.jsx(
651
+ LinearProgress__default.default,
652
+ {
653
+ variant: "determinate",
654
+ value: occupancyPercentage,
655
+ sx: {
656
+ height: 10,
657
+ borderRadius: 5,
658
+ backgroundColor: "#e0e0e0",
659
+ "& .MuiLinearProgress-bar": {
660
+ backgroundColor: hasDefinedCapacity ? availableSlots > 0 ? "#4caf50" : "#f44336" : "#2196f3"
661
+ }
662
+ }
663
+ }
664
+ ),
665
+ 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
666
  ] }) });
504
667
  };
505
668
  var TableResultCard_default = TableResultCard;
@@ -518,20 +681,42 @@ var EventResultCard = ({
518
681
  try {
519
682
  const date = new Date(dateString);
520
683
  return date.toLocaleDateString("en-US", options);
521
- } catch {
684
+ } catch (error) {
522
685
  return dateString;
523
686
  }
524
687
  };
525
688
  const formattedDate = result.date ? formatDate(result.date) : "Date TBD";
526
689
  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 })
690
+ const eventIcon = /* @__PURE__ */ jsxRuntime.jsx(
691
+ EventIcon__default.default,
692
+ {
693
+ sx: {
694
+ fontSize: 40,
695
+ color: "primary.main"
696
+ }
697
+ }
698
+ );
699
+ return /* @__PURE__ */ jsxRuntime.jsx(BaseSearchResultCard_default, { result, onClick, icon: eventIcon, tags, children: /* @__PURE__ */ jsxRuntime.jsxs(Box8__default.default, { sx: { mb: 2 }, children: [
700
+ /* @__PURE__ */ jsxRuntime.jsxs(Box8__default.default, { sx: { display: "flex", alignItems: "center", mb: 1 }, children: [
701
+ /* @__PURE__ */ jsxRuntime.jsx(CalendarTodayIcon__default.default, { sx: { mr: 1, color: "primary.main" } }),
702
+ /* @__PURE__ */ jsxRuntime.jsxs(Typography6__default.default, { variant: "body2", children: [
703
+ /* @__PURE__ */ jsxRuntime.jsx("strong", { children: "Date:" }),
704
+ " ",
705
+ formattedDate
706
+ ] })
531
707
  ] }),
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 })
708
+ /* @__PURE__ */ jsxRuntime.jsxs(Box8__default.default, { sx: { display: "flex", alignItems: "center" }, children: [
709
+ /* @__PURE__ */ jsxRuntime.jsx(LocationOnIcon__default.default, { sx: { mr: 1, color: "primary.main" } }),
710
+ /* @__PURE__ */ jsxRuntime.jsxs(Typography6__default.default, { variant: "body2", children: [
711
+ /* @__PURE__ */ jsxRuntime.jsx("strong", { children: "Location:" }),
712
+ " ",
713
+ location
714
+ ] })
715
+ ] }),
716
+ result.organizer && /* @__PURE__ */ jsxRuntime.jsxs(Typography6__default.default, { variant: "body2", sx: { mt: 1 }, children: [
717
+ /* @__PURE__ */ jsxRuntime.jsx("strong", { children: "Organizer:" }),
718
+ " ",
719
+ result.organizer
535
720
  ] })
536
721
  ] }) });
537
722
  };
@@ -539,10 +724,12 @@ var EventResultCard_default = EventResultCard;
539
724
  var ResultsContainer = ({
540
725
  results,
541
726
  onResultClick,
542
- tags
727
+ tags,
728
+ pagination,
729
+ onPacketChange
543
730
  }) => {
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." });
731
+ if (!results || results.length === 0 || !results.map) {
732
+ return /* @__PURE__ */ jsxRuntime.jsx(Box8__default.default, { sx: { textAlign: "center", py: 4 }, children: "No results found. Try adjusting your filters." });
546
733
  }
547
734
  const onPlayerClick = (id) => {
548
735
  onResultClick == null ? void 0 : onResultClick(id, "player");
@@ -553,43 +740,68 @@ var ResultsContainer = ({
553
740
  const onEventClick = (id) => {
554
741
  onResultClick == null ? void 0 : onResultClick(id, "event");
555
742
  };
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
- }) });
743
+ const handlePacketChange = (_event, packet) => {
744
+ onPacketChange == null ? void 0 : onPacketChange(packet);
745
+ };
746
+ const startResult = pagination ? (pagination.currentPacket - 1) * pagination.packetSize + 1 : 1;
747
+ const endResult = pagination ? Math.min(pagination.currentPacket * pagination.packetSize, pagination.totalResults) : results.length;
748
+ return /* @__PURE__ */ jsxRuntime.jsxs(Box8__default.default, { sx: { display: "flex", flexDirection: "column", gap: 2 }, children: [
749
+ 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: [
750
+ "Showing ",
751
+ startResult,
752
+ "-",
753
+ endResult,
754
+ " of ",
755
+ pagination.totalResults,
756
+ " results"
757
+ ] }) }),
758
+ results.map((result, index) => {
759
+ switch (result.type) {
760
+ case "player":
761
+ return /* @__PURE__ */ jsxRuntime.jsx(
762
+ PlayerResultCard_default,
763
+ {
764
+ result,
765
+ onClick: onPlayerClick,
766
+ tags
767
+ },
768
+ result.id
769
+ );
770
+ case "table":
771
+ return /* @__PURE__ */ jsxRuntime.jsx(
772
+ TableResultCard_default,
773
+ {
774
+ result,
775
+ onClick: onTableClick,
776
+ tags
777
+ },
778
+ result.id
779
+ );
780
+ case "event":
781
+ return /* @__PURE__ */ jsxRuntime.jsx(
782
+ EventResultCard_default,
783
+ {
784
+ result,
785
+ onClick: onEventClick,
786
+ tags
787
+ },
788
+ result.id
789
+ );
790
+ default:
791
+ console.error(`Unknown result type: ${result.type}`);
792
+ return null;
793
+ }
794
+ }),
795
+ pagination && pagination.totalPackets > 1 && /* @__PURE__ */ jsxRuntime.jsx(Box8__default.default, { sx: { display: "flex", justifyContent: "center", mt: 4 }, children: /* @__PURE__ */ jsxRuntime.jsx(
796
+ Pagination__default.default,
797
+ {
798
+ count: pagination.totalPackets,
799
+ page: pagination.currentPacket,
800
+ onChange: handlePacketChange,
801
+ color: "primary"
802
+ }
803
+ ) })
804
+ ] });
593
805
  };
594
806
  var ResultsContainer_default = ResultsContainer;
595
807
  var ScrollableResultsList = ({
@@ -600,7 +812,7 @@ var ScrollableResultsList = ({
600
812
  emptyText
601
813
  }) => {
602
814
  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." }) });
815
+ 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
816
  };
605
817
  var ScrollableResultsList_default = ScrollableResultsList;
606
818
  var PlayersScrollableList = ({
@@ -635,17 +847,76 @@ var SearchResultCard_default = SearchResultCard;
635
847
  function SearchPageLayout({
636
848
  results,
637
849
  title = "Search Results",
850
+ initialSelectedTypes = [],
851
+ initialSelectedTags = {
852
+ mustHave: [],
853
+ mustNotHave: [],
854
+ shouldHaveAtLeastOne: []
855
+ },
856
+ initialTextSearch = {
857
+ query: "",
858
+ titleOnly: false
859
+ },
860
+ includeExpiredTables: initialIncludeExpiredTables = false,
638
861
  onTypeChange,
639
862
  onTagChange,
863
+ onTextSearchChange,
864
+ onIncludeExpiredTablesChange,
640
865
  onSubmit,
641
866
  onResultClick,
867
+ onPacketChange,
868
+ pagination,
642
869
  validTags,
643
- allTags
870
+ allTags,
871
+ searchTypes,
872
+ isLoading = false
644
873
  }) {
645
- "use client";
646
874
  const theme = material.useTheme();
647
875
  const isMobile = material.useMediaQuery(theme.breakpoints.down("md"));
648
- return /* @__PURE__ */ jsxRuntime.jsxs(Box2__default.default, { sx: { padding: 2 }, children: [
876
+ const [selectedTypes, setSelectedTypes] = React.useState(initialSelectedTypes);
877
+ const [selectedTags, setSelectedTags] = React.useState(initialSelectedTags);
878
+ const [textSearch, setTextSearch] = React.useState(initialTextSearch);
879
+ const [includeExpiredTables, setIncludeExpiredTables] = React.useState(initialIncludeExpiredTables);
880
+ React.useEffect(() => {
881
+ setSelectedTypes(initialSelectedTypes);
882
+ }, [initialSelectedTypes]);
883
+ React.useEffect(() => {
884
+ setSelectedTags(initialSelectedTags);
885
+ }, [initialSelectedTags]);
886
+ React.useEffect(() => {
887
+ setTextSearch(initialTextSearch);
888
+ }, [initialTextSearch]);
889
+ React.useEffect(() => {
890
+ setIncludeExpiredTables(initialIncludeExpiredTables);
891
+ }, [initialIncludeExpiredTables]);
892
+ const handleTypeChange = (types) => {
893
+ setSelectedTypes(types);
894
+ if (onTypeChange) onTypeChange(types);
895
+ };
896
+ const handleTagChange = (tags) => {
897
+ setSelectedTags(tags);
898
+ if (onTagChange) onTagChange(tags);
899
+ };
900
+ const handleTextSearchChange = (ts) => {
901
+ setTextSearch(ts);
902
+ if (onTextSearchChange) onTextSearchChange(ts);
903
+ };
904
+ const handleIncludeExpiredTablesChange = (include) => {
905
+ setIncludeExpiredTables(include);
906
+ if (onIncludeExpiredTablesChange) onIncludeExpiredTablesChange(include);
907
+ };
908
+ const handleSubmit = () => {
909
+ const currentCriteria = {
910
+ selectedTypes,
911
+ selectedTags,
912
+ textSearch,
913
+ includeExpiredTables
914
+ };
915
+ if (onSubmit) {
916
+ onSubmit(currentCriteria);
917
+ }
918
+ };
919
+ return /* @__PURE__ */ jsxRuntime.jsxs(Box8__default.default, { sx: { padding: 2 }, children: [
649
920
  /* @__PURE__ */ jsxRuntime.jsx(Card2__default.default, { sx: { marginBottom: 2 }, children: /* @__PURE__ */ jsxRuntime.jsx(
650
921
  CardHeader__default.default,
651
922
  {
@@ -675,10 +946,17 @@ function SearchPageLayout({
675
946
  /* @__PURE__ */ jsxRuntime.jsx(CardContent2__default.default, { children: /* @__PURE__ */ jsxRuntime.jsx(
676
947
  FiltersContainer_default,
677
948
  {
678
- onTypeChange,
679
- onTagChange,
680
- onSubmit,
681
- tags: validTags
949
+ initialSelectedTypes: selectedTypes,
950
+ initialSelectedTags: selectedTags,
951
+ initialTextSearch: textSearch,
952
+ includeExpiredTables,
953
+ onTypeChange: handleTypeChange,
954
+ onTagChange: handleTagChange,
955
+ onTextSearchChange: handleTextSearchChange,
956
+ onIncludeExpiredTablesChange: handleIncludeExpiredTablesChange,
957
+ onSubmit: handleSubmit,
958
+ tags: validTags,
959
+ searchTypes
682
960
  }
683
961
  ) })
684
962
  ] }) }),
@@ -695,10 +973,12 @@ function SearchPageLayout({
695
973
  }
696
974
  }
697
975
  ),
698
- /* @__PURE__ */ jsxRuntime.jsx(CardContent2__default.default, { children: /* @__PURE__ */ jsxRuntime.jsx(
976
+ /* @__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
977
  ResultsContainer_default,
700
978
  {
701
979
  results,
980
+ pagination,
981
+ onPacketChange,
702
982
  onResultClick,
703
983
  tags: allTags
704
984
  }
@@ -711,21 +991,14 @@ var TablesScrollableList = ({
711
991
  results,
712
992
  tags,
713
993
  maxHeight,
714
- onResultClick,
715
- sortBy = "availability"
994
+ onResultClick
716
995
  }) => {
717
996
  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
997
  const handleClick = (id) => onResultClick == null ? void 0 : onResultClick(id);
725
998
  return /* @__PURE__ */ jsxRuntime.jsx(
726
999
  ScrollableResultsList_default,
727
1000
  {
728
- results: sortedTables,
1001
+ results: tables,
729
1002
  tags,
730
1003
  maxHeight,
731
1004
  onResultClick: (id, type) => {
@@ -738,6 +1011,7 @@ var TablesScrollableList_default = TablesScrollableList;
738
1011
 
739
1012
  exports.BaseSearchResultCard = BaseSearchResultCard_default;
740
1013
  exports.EventResultCard = EventResultCard_default;
1014
+ exports.ExpiredTablesFilter = ExpiredTablesFilter_default;
741
1015
  exports.FiltersContainer = FiltersContainer_default;
742
1016
  exports.PlayerResultCard = PlayerResultCard_default;
743
1017
  exports.PlayersScrollableList = PlayersScrollableList_default;
@@ -749,6 +1023,7 @@ exports.SortOptions = SortOptions_default;
749
1023
  exports.TableResultCard = TableResultCard_default;
750
1024
  exports.TablesScrollableList = TablesScrollableList_default;
751
1025
  exports.TagsFilter = TagsFilter_default;
1026
+ exports.TextSearchCard = TextSearchCard_default;
752
1027
  exports.TypeFilter = TypeFilter_default;
753
1028
  //# sourceMappingURL=SearchPage.cjs.map
754
1029
  //# sourceMappingURL=SearchPage.cjs.map