@mbpockets/shared-ui 0.1.18
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.
- package/LICENSE +681 -0
- package/README.md +85 -0
- package/dist/EventPage/editMode/index.cjs +573 -0
- package/dist/EventPage/editMode/index.cjs.map +1 -0
- package/dist/EventPage/editMode/index.d.cts +5 -0
- package/dist/EventPage/editMode/index.d.ts +5 -0
- package/dist/EventPage/editMode/index.mjs +559 -0
- package/dist/EventPage/editMode/index.mjs.map +1 -0
- package/dist/EventPage/editMode.cjs +573 -0
- package/dist/EventPage/editMode.cjs.map +1 -0
- package/dist/EventPage/editMode.d.cts +5 -0
- package/dist/EventPage/editMode.d.ts +5 -0
- package/dist/EventPage/editMode.mjs +559 -0
- package/dist/EventPage/editMode.mjs.map +1 -0
- package/dist/EventPage/index.cjs +1245 -0
- package/dist/EventPage/index.cjs.map +1 -0
- package/dist/EventPage/index.d.cts +6 -0
- package/dist/EventPage/index.d.ts +6 -0
- package/dist/EventPage/index.mjs +1215 -0
- package/dist/EventPage/index.mjs.map +1 -0
- package/dist/EventPage.cjs +1245 -0
- package/dist/EventPage.cjs.map +1 -0
- package/dist/EventPage.d.cts +42 -0
- package/dist/EventPage.d.ts +42 -0
- package/dist/EventPage.mjs +1215 -0
- package/dist/EventPage.mjs.map +1 -0
- package/dist/PlayerPage/index.cjs +370 -0
- package/dist/PlayerPage/index.cjs.map +1 -0
- package/dist/PlayerPage/index.d.cts +4 -0
- package/dist/PlayerPage/index.d.ts +4 -0
- package/dist/PlayerPage/index.mjs +358 -0
- package/dist/PlayerPage/index.mjs.map +1 -0
- package/dist/PlayerPage.cjs +370 -0
- package/dist/PlayerPage.cjs.map +1 -0
- package/dist/PlayerPage.d.cts +32 -0
- package/dist/PlayerPage.d.ts +32 -0
- package/dist/PlayerPage.mjs +358 -0
- package/dist/PlayerPage.mjs.map +1 -0
- package/dist/ProfilePage/index.cjs +136 -0
- package/dist/ProfilePage/index.cjs.map +1 -0
- package/dist/ProfilePage/index.d.cts +3 -0
- package/dist/ProfilePage/index.d.ts +3 -0
- package/dist/ProfilePage/index.mjs +124 -0
- package/dist/ProfilePage/index.mjs.map +1 -0
- package/dist/ProfilePage.cjs +136 -0
- package/dist/ProfilePage.cjs.map +1 -0
- package/dist/ProfilePage.d.cts +10 -0
- package/dist/ProfilePage.d.ts +10 -0
- package/dist/ProfilePage.mjs +124 -0
- package/dist/ProfilePage.mjs.map +1 -0
- package/dist/SearchPage/Filters/index.cjs +270 -0
- package/dist/SearchPage/Filters/index.cjs.map +1 -0
- package/dist/SearchPage/Filters/index.d.cts +4 -0
- package/dist/SearchPage/Filters/index.d.ts +4 -0
- package/dist/SearchPage/Filters/index.mjs +250 -0
- package/dist/SearchPage/Filters/index.mjs.map +1 -0
- package/dist/SearchPage/Filters.cjs +270 -0
- package/dist/SearchPage/Filters.cjs.map +1 -0
- package/dist/SearchPage/Filters.d.cts +31 -0
- package/dist/SearchPage/Filters.d.ts +31 -0
- package/dist/SearchPage/Filters.mjs +250 -0
- package/dist/SearchPage/Filters.mjs.map +1 -0
- package/dist/SearchPage/Results/index.cjs +226 -0
- package/dist/SearchPage/Results/index.cjs.map +1 -0
- package/dist/SearchPage/Results/index.d.cts +4 -0
- package/dist/SearchPage/Results/index.d.ts +4 -0
- package/dist/SearchPage/Results/index.mjs +212 -0
- package/dist/SearchPage/Results/index.mjs.map +1 -0
- package/dist/SearchPage/Results.cjs +226 -0
- package/dist/SearchPage/Results.cjs.map +1 -0
- package/dist/SearchPage/Results.d.cts +53 -0
- package/dist/SearchPage/Results.d.ts +53 -0
- package/dist/SearchPage/Results.mjs +212 -0
- package/dist/SearchPage/Results.mjs.map +1 -0
- package/dist/SearchPage/index.cjs +737 -0
- package/dist/SearchPage/index.cjs.map +1 -0
- package/dist/SearchPage/index.d.cts +7 -0
- package/dist/SearchPage/index.d.ts +7 -0
- package/dist/SearchPage/index.mjs +695 -0
- package/dist/SearchPage/index.mjs.map +1 -0
- package/dist/SearchPage.cjs +737 -0
- package/dist/SearchPage.cjs.map +1 -0
- package/dist/SearchPage.d.cts +110 -0
- package/dist/SearchPage.d.ts +110 -0
- package/dist/SearchPage.mjs +695 -0
- package/dist/SearchPage.mjs.map +1 -0
- package/dist/TablePage/GameTableProvider/index.cjs +26 -0
- package/dist/TablePage/GameTableProvider/index.cjs.map +1 -0
- package/dist/TablePage/GameTableProvider/index.d.cts +4 -0
- package/dist/TablePage/GameTableProvider/index.d.ts +4 -0
- package/dist/TablePage/GameTableProvider/index.mjs +19 -0
- package/dist/TablePage/GameTableProvider/index.mjs.map +1 -0
- package/dist/TablePage/GameTableProvider.cjs +26 -0
- package/dist/TablePage/GameTableProvider.cjs.map +1 -0
- package/dist/TablePage/GameTableProvider.d.cts +15 -0
- package/dist/TablePage/GameTableProvider.d.ts +15 -0
- package/dist/TablePage/GameTableProvider.mjs +19 -0
- package/dist/TablePage/GameTableProvider.mjs.map +1 -0
- package/dist/TablePage/ModalProvider/index.cjs +83 -0
- package/dist/TablePage/ModalProvider/index.cjs.map +1 -0
- package/dist/TablePage/ModalProvider/index.css +49 -0
- package/dist/TablePage/ModalProvider/index.css.map +1 -0
- package/dist/TablePage/ModalProvider/index.d.cts +3 -0
- package/dist/TablePage/ModalProvider/index.d.ts +3 -0
- package/dist/TablePage/ModalProvider/index.mjs +79 -0
- package/dist/TablePage/ModalProvider/index.mjs.map +1 -0
- package/dist/TablePage/ModalProvider.cjs +83 -0
- package/dist/TablePage/ModalProvider.cjs.map +1 -0
- package/dist/TablePage/ModalProvider.css +49 -0
- package/dist/TablePage/ModalProvider.css.map +1 -0
- package/dist/TablePage/ModalProvider.d.cts +17 -0
- package/dist/TablePage/ModalProvider.d.ts +17 -0
- package/dist/TablePage/ModalProvider.mjs +79 -0
- package/dist/TablePage/ModalProvider.mjs.map +1 -0
- package/dist/TablePage/index.cjs +606 -0
- package/dist/TablePage/index.cjs.map +1 -0
- package/dist/TablePage/index.css +49 -0
- package/dist/TablePage/index.css.map +1 -0
- package/dist/TablePage/index.d.cts +10 -0
- package/dist/TablePage/index.d.ts +10 -0
- package/dist/TablePage/index.mjs +579 -0
- package/dist/TablePage/index.mjs.map +1 -0
- package/dist/TablePage/players/index.cjs +85 -0
- package/dist/TablePage/players/index.cjs.map +1 -0
- package/dist/TablePage/players/index.d.cts +4 -0
- package/dist/TablePage/players/index.d.ts +4 -0
- package/dist/TablePage/players/index.mjs +76 -0
- package/dist/TablePage/players/index.mjs.map +1 -0
- package/dist/TablePage/players.cjs +85 -0
- package/dist/TablePage/players.cjs.map +1 -0
- package/dist/TablePage/players.d.cts +22 -0
- package/dist/TablePage/players.d.ts +22 -0
- package/dist/TablePage/players.mjs +76 -0
- package/dist/TablePage/players.mjs.map +1 -0
- package/dist/TablePage.cjs +606 -0
- package/dist/TablePage.cjs.map +1 -0
- package/dist/TablePage.css +49 -0
- package/dist/TablePage.css.map +1 -0
- package/dist/TablePage.d.cts +54 -0
- package/dist/TablePage.d.ts +54 -0
- package/dist/TablePage.mjs +579 -0
- package/dist/TablePage.mjs.map +1 -0
- package/dist/common/Modal/index.cjs +64 -0
- package/dist/common/Modal/index.cjs.map +1 -0
- package/dist/common/Modal/index.css +49 -0
- package/dist/common/Modal/index.css.map +1 -0
- package/dist/common/Modal/index.d.cts +2 -0
- package/dist/common/Modal/index.d.ts +2 -0
- package/dist/common/Modal/index.mjs +62 -0
- package/dist/common/Modal/index.mjs.map +1 -0
- package/dist/common/Modal.cjs +64 -0
- package/dist/common/Modal.cjs.map +1 -0
- package/dist/common/Modal.css +49 -0
- package/dist/common/Modal.css.map +1 -0
- package/dist/common/Modal.d.cts +9 -0
- package/dist/common/Modal.d.ts +9 -0
- package/dist/common/Modal.mjs +62 -0
- package/dist/common/Modal.mjs.map +1 -0
- package/dist/common/index.cjs +210 -0
- package/dist/common/index.cjs.map +1 -0
- package/dist/common/index.css +49 -0
- package/dist/common/index.css.map +1 -0
- package/dist/common/index.d.cts +4 -0
- package/dist/common/index.d.ts +4 -0
- package/dist/common/index.mjs +194 -0
- package/dist/common/index.mjs.map +1 -0
- package/dist/common.cjs +210 -0
- package/dist/common.cjs.map +1 -0
- package/dist/common.css +49 -0
- package/dist/common.css.map +1 -0
- package/dist/common.d.cts +28 -0
- package/dist/common.d.ts +28 -0
- package/dist/common.mjs +194 -0
- package/dist/common.mjs.map +1 -0
- package/dist/index-D7WHhl3Q.d.ts +64 -0
- package/dist/index-DC0kK3aC.d.cts +64 -0
- package/dist/index.cjs +2608 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.css +49 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.cts +20 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.mjs +2529 -0
- package/dist/index.mjs.map +1 -0
- package/dist/mocks/EventDB.cjs +171 -0
- package/dist/mocks/EventDB.cjs.map +1 -0
- package/dist/mocks/EventDB.d.cts +6 -0
- package/dist/mocks/EventDB.d.ts +6 -0
- package/dist/mocks/EventDB.mjs +169 -0
- package/dist/mocks/EventDB.mjs.map +1 -0
- package/dist/mocks/Events.cjs +59 -0
- package/dist/mocks/Events.cjs.map +1 -0
- package/dist/mocks/Events.d.cts +13 -0
- package/dist/mocks/Events.d.ts +13 -0
- package/dist/mocks/Events.mjs +57 -0
- package/dist/mocks/Events.mjs.map +1 -0
- package/dist/mocks/Players.cjs +75 -0
- package/dist/mocks/Players.cjs.map +1 -0
- package/dist/mocks/Players.d.cts +15 -0
- package/dist/mocks/Players.d.ts +15 -0
- package/dist/mocks/Players.mjs +73 -0
- package/dist/mocks/Players.mjs.map +1 -0
- package/dist/mocks/SearchResults.cjs +143 -0
- package/dist/mocks/SearchResults.cjs.map +1 -0
- package/dist/mocks/SearchResults.d.cts +30 -0
- package/dist/mocks/SearchResults.d.ts +30 -0
- package/dist/mocks/SearchResults.mjs +137 -0
- package/dist/mocks/SearchResults.mjs.map +1 -0
- package/dist/mocks/Tables.cjs +133 -0
- package/dist/mocks/Tables.cjs.map +1 -0
- package/dist/mocks/Tables.d.cts +38 -0
- package/dist/mocks/Tables.d.ts +38 -0
- package/dist/mocks/Tables.mjs +131 -0
- package/dist/mocks/Tables.mjs.map +1 -0
- package/dist/mocks/Tags.cjs +142 -0
- package/dist/mocks/Tags.cjs.map +1 -0
- package/dist/mocks/Tags.d.cts +5 -0
- package/dist/mocks/Tags.d.ts +5 -0
- package/dist/mocks/Tags.mjs +140 -0
- package/dist/mocks/Tags.mjs.map +1 -0
- package/dist/mocks/index.cjs +566 -0
- package/dist/mocks/index.cjs.map +1 -0
- package/dist/mocks/index.d.cts +8 -0
- package/dist/mocks/index.d.ts +8 -0
- package/dist/mocks/index.mjs +555 -0
- package/dist/mocks/index.mjs.map +1 -0
- package/dist/mocks.cjs +566 -0
- package/dist/mocks.cjs.map +1 -0
- package/dist/mocks.d.cts +8 -0
- package/dist/mocks.d.ts +8 -0
- package/dist/mocks.mjs +555 -0
- package/dist/mocks.mjs.map +1 -0
- package/dist/types/event.cjs +4 -0
- package/dist/types/event.cjs.map +1 -0
- package/dist/types/event.d.cts +37 -0
- package/dist/types/event.d.ts +37 -0
- package/dist/types/event.mjs +3 -0
- package/dist/types/event.mjs.map +1 -0
- package/dist/types/index.cjs +4 -0
- package/dist/types/index.cjs.map +1 -0
- package/dist/types/index.d.cts +6 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.mjs +3 -0
- package/dist/types/index.mjs.map +1 -0
- package/dist/types/player.cjs +4 -0
- package/dist/types/player.cjs.map +1 -0
- package/dist/types/player.d.cts +20 -0
- package/dist/types/player.d.ts +20 -0
- package/dist/types/player.mjs +3 -0
- package/dist/types/player.mjs.map +1 -0
- package/dist/types/search.cjs +4 -0
- package/dist/types/search.cjs.map +1 -0
- package/dist/types/search.d.cts +20 -0
- package/dist/types/search.d.ts +20 -0
- package/dist/types/search.mjs +3 -0
- package/dist/types/search.mjs.map +1 -0
- package/dist/types/table.cjs +4 -0
- package/dist/types/table.cjs.map +1 -0
- package/dist/types/table.d.cts +21 -0
- package/dist/types/table.d.ts +21 -0
- package/dist/types/table.mjs +3 -0
- package/dist/types/table.mjs.map +1 -0
- package/dist/types/tables.cjs +4 -0
- package/dist/types/tables.cjs.map +1 -0
- package/dist/types/tables.d.cts +21 -0
- package/dist/types/tables.d.ts +21 -0
- package/dist/types/tables.mjs +3 -0
- package/dist/types/tables.mjs.map +1 -0
- package/dist/types/tag.cjs +4 -0
- package/dist/types/tag.cjs.map +1 -0
- package/dist/types/tag.d.cts +14 -0
- package/dist/types/tag.d.ts +14 -0
- package/dist/types/tag.mjs +3 -0
- package/dist/types/tag.mjs.map +1 -0
- package/dist/types.cjs +4 -0
- package/dist/types.cjs.map +1 -0
- package/dist/types.d.cts +6 -0
- package/dist/types.d.ts +6 -0
- package/dist/types.mjs +3 -0
- package/dist/types.mjs.map +1 -0
- package/package.json +117 -0
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
var material = require('@mui/material');
|
|
5
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
6
|
+
var CalendarTodayIcon = require('@mui/icons-material/CalendarToday');
|
|
7
|
+
var LocationOnIcon = require('@mui/icons-material/LocationOn');
|
|
8
|
+
var EventIcon = require('@mui/icons-material/Event');
|
|
9
|
+
var Avatar = require('@mui/material/Avatar');
|
|
10
|
+
var CasinoIcon = require('@mui/icons-material/Casino');
|
|
11
|
+
|
|
12
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
|
+
|
|
14
|
+
var CalendarTodayIcon__default = /*#__PURE__*/_interopDefault(CalendarTodayIcon);
|
|
15
|
+
var LocationOnIcon__default = /*#__PURE__*/_interopDefault(LocationOnIcon);
|
|
16
|
+
var EventIcon__default = /*#__PURE__*/_interopDefault(EventIcon);
|
|
17
|
+
var Avatar__default = /*#__PURE__*/_interopDefault(Avatar);
|
|
18
|
+
var CasinoIcon__default = /*#__PURE__*/_interopDefault(CasinoIcon);
|
|
19
|
+
|
|
20
|
+
function generateTagsDisplay(tag) {
|
|
21
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
22
|
+
"span",
|
|
23
|
+
{
|
|
24
|
+
className: "inline-block text-sm px-3 py-1 rounded-full outline-black outline-2 font-outlined",
|
|
25
|
+
style: {
|
|
26
|
+
marginTop: "6px",
|
|
27
|
+
marginRight: "6px",
|
|
28
|
+
marginBottom: "6px",
|
|
29
|
+
background: tag.color || "#bfbcbb",
|
|
30
|
+
color: "white",
|
|
31
|
+
textShadow: "black 0.2em 0.2em 0.4em"
|
|
32
|
+
},
|
|
33
|
+
children: tag.label
|
|
34
|
+
},
|
|
35
|
+
tag.id
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
var BaseSearchResultCard = ({
|
|
39
|
+
result,
|
|
40
|
+
onClick,
|
|
41
|
+
children,
|
|
42
|
+
icon,
|
|
43
|
+
tags
|
|
44
|
+
}) => {
|
|
45
|
+
const handleClick = () => {
|
|
46
|
+
if (onClick) {
|
|
47
|
+
onClick(result.id);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
51
|
+
material.Card,
|
|
52
|
+
{
|
|
53
|
+
elevation: 6,
|
|
54
|
+
sx: {
|
|
55
|
+
width: "100%",
|
|
56
|
+
cursor: onClick ? "pointer" : "default",
|
|
57
|
+
boxShadow: "0px 8px 24px rgba(0, 0, 0, 0.15)",
|
|
58
|
+
transition: "box-shadow 0.3s ease-in-out",
|
|
59
|
+
"&:hover": {
|
|
60
|
+
boxShadow: "0px 12px 28px rgba(0, 0, 0, 0.2)"
|
|
61
|
+
},
|
|
62
|
+
marginBottom: 2
|
|
63
|
+
},
|
|
64
|
+
onClick: handleClick,
|
|
65
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs(material.CardContent, { sx: { display: "flex", alignItems: "flex-start" }, children: [
|
|
66
|
+
icon && /* @__PURE__ */ jsxRuntime.jsx(material.Box, { sx: { mr: 2, display: "flex", alignItems: "center", pt: 0.5 }, children: icon }),
|
|
67
|
+
/* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { flex: 1 }, children: [
|
|
68
|
+
/* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "h6", sx: { mb: 1 }, children: result.title }),
|
|
69
|
+
children,
|
|
70
|
+
/* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "body1", children: result.description }),
|
|
71
|
+
result.tags && result.tags.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(material.Box, { sx: { mt: 1 }, children: /* @__PURE__ */ jsxRuntime.jsx(material.Box, { sx: {
|
|
72
|
+
display: "block",
|
|
73
|
+
whiteSpace: "nowrap",
|
|
74
|
+
overflow: "hidden",
|
|
75
|
+
textOverflow: "clip",
|
|
76
|
+
pl: 0.5
|
|
77
|
+
// Add some padding to prevent clipping of the leftmost tag
|
|
78
|
+
}, children: (() => {
|
|
79
|
+
const MAX_VISIBLE = 5;
|
|
80
|
+
const tagObjs = result.tags.map((tagId) => tags.find((t) => t.id === tagId)).filter((t) => Boolean(t));
|
|
81
|
+
const visible = tagObjs.slice(0, MAX_VISIBLE);
|
|
82
|
+
const hiddenCount = Math.max(tagObjs.length - visible.length, 0);
|
|
83
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
84
|
+
visible.map((tag) => generateTagsDisplay(tag)),
|
|
85
|
+
hiddenCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
86
|
+
"span",
|
|
87
|
+
{
|
|
88
|
+
className: "inline-block text-sm px-3 py-1 rounded-full outline-black outline-2 font-outlined",
|
|
89
|
+
style: {
|
|
90
|
+
marginTop: "6px",
|
|
91
|
+
marginRight: "6px",
|
|
92
|
+
marginBottom: "6px",
|
|
93
|
+
background: "#9e9e9e",
|
|
94
|
+
color: "white",
|
|
95
|
+
textShadow: "black 0.2em 0.2em 0.4em"
|
|
96
|
+
},
|
|
97
|
+
children: [
|
|
98
|
+
"+",
|
|
99
|
+
hiddenCount,
|
|
100
|
+
" more"
|
|
101
|
+
]
|
|
102
|
+
}
|
|
103
|
+
)
|
|
104
|
+
] });
|
|
105
|
+
})() }) })
|
|
106
|
+
] })
|
|
107
|
+
] })
|
|
108
|
+
}
|
|
109
|
+
);
|
|
110
|
+
};
|
|
111
|
+
var BaseSearchResultCard_default = BaseSearchResultCard;
|
|
112
|
+
var EventResultCard = ({
|
|
113
|
+
result,
|
|
114
|
+
onClick,
|
|
115
|
+
tags
|
|
116
|
+
}) => {
|
|
117
|
+
const formatDate = (dateString) => {
|
|
118
|
+
const options = {
|
|
119
|
+
weekday: "long",
|
|
120
|
+
year: "numeric",
|
|
121
|
+
month: "long",
|
|
122
|
+
day: "numeric"
|
|
123
|
+
};
|
|
124
|
+
try {
|
|
125
|
+
const date = new Date(dateString);
|
|
126
|
+
return date.toLocaleDateString("en-US", options);
|
|
127
|
+
} catch {
|
|
128
|
+
return dateString;
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
const formattedDate = result.date ? formatDate(result.date) : "Date TBD";
|
|
132
|
+
const location = result.location || "Location TBD";
|
|
133
|
+
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: [
|
|
134
|
+
/* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { display: "flex", alignItems: "center", mb: 0.5 }, children: [
|
|
135
|
+
/* @__PURE__ */ jsxRuntime.jsx(CalendarTodayIcon__default.default, { sx: { mr: 1, fontSize: "small", color: "text.secondary" } }),
|
|
136
|
+
/* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "body2", color: "text.secondary", children: formattedDate })
|
|
137
|
+
] }),
|
|
138
|
+
/* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { display: "flex", alignItems: "center", mb: 1 }, children: [
|
|
139
|
+
/* @__PURE__ */ jsxRuntime.jsx(LocationOnIcon__default.default, { sx: { mr: 1, fontSize: "small", color: "text.secondary" } }),
|
|
140
|
+
/* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "body2", color: "text.secondary", children: location })
|
|
141
|
+
] })
|
|
142
|
+
] }) });
|
|
143
|
+
};
|
|
144
|
+
var EventResultCard_default = EventResultCard;
|
|
145
|
+
var PlayerResultCard = ({
|
|
146
|
+
result,
|
|
147
|
+
onClick,
|
|
148
|
+
tags
|
|
149
|
+
}) => {
|
|
150
|
+
const firstLetter = result.title.charAt(0).toUpperCase();
|
|
151
|
+
const getAvatarColor = (name) => {
|
|
152
|
+
const colors = [
|
|
153
|
+
"#F44336",
|
|
154
|
+
"#E91E63",
|
|
155
|
+
"#9C27B0",
|
|
156
|
+
"#673AB7",
|
|
157
|
+
"#3F51B5",
|
|
158
|
+
"#2196F3",
|
|
159
|
+
"#03A9F4",
|
|
160
|
+
"#00BCD4",
|
|
161
|
+
"#009688",
|
|
162
|
+
"#4CAF50",
|
|
163
|
+
"#8BC34A",
|
|
164
|
+
"#CDDC39",
|
|
165
|
+
"#FFEB3B",
|
|
166
|
+
"#FFC107",
|
|
167
|
+
"#FF9800",
|
|
168
|
+
"#FF5722"
|
|
169
|
+
];
|
|
170
|
+
let hash = 0;
|
|
171
|
+
for (let i = 0; i < name.length; i++) {
|
|
172
|
+
hash = name.charCodeAt(i) + ((hash << 5) - hash);
|
|
173
|
+
}
|
|
174
|
+
return colors[Math.abs(hash) % colors.length];
|
|
175
|
+
};
|
|
176
|
+
const avatarColor = getAvatarColor(result.title);
|
|
177
|
+
const playerIcon = /* @__PURE__ */ jsxRuntime.jsx(
|
|
178
|
+
Avatar__default.default,
|
|
179
|
+
{
|
|
180
|
+
src: result.imageUrl,
|
|
181
|
+
alt: result.title,
|
|
182
|
+
sx: {
|
|
183
|
+
width: 40,
|
|
184
|
+
height: 40,
|
|
185
|
+
bgcolor: !result.imageUrl ? avatarColor : void 0
|
|
186
|
+
},
|
|
187
|
+
children: !result.imageUrl && firstLetter
|
|
188
|
+
}
|
|
189
|
+
);
|
|
190
|
+
return /* @__PURE__ */ jsxRuntime.jsx(BaseSearchResultCard_default, { result, onClick, icon: playerIcon, tags });
|
|
191
|
+
};
|
|
192
|
+
var PlayerResultCard_default = PlayerResultCard;
|
|
193
|
+
var SearchResultCard = ({
|
|
194
|
+
result,
|
|
195
|
+
onClick,
|
|
196
|
+
tags
|
|
197
|
+
}) => {
|
|
198
|
+
return /* @__PURE__ */ jsxRuntime.jsx(BaseSearchResultCard_default, { result, onClick, tags });
|
|
199
|
+
};
|
|
200
|
+
var SearchResultCard_default = SearchResultCard;
|
|
201
|
+
var TableResultCard = ({ result, tags, onClick }) => {
|
|
202
|
+
const capacity = result.capacity || 1;
|
|
203
|
+
const numPlayers = result.numPlayers || 0;
|
|
204
|
+
const occupancy = numPlayers / capacity * 100;
|
|
205
|
+
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: [
|
|
206
|
+
/* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { display: "flex", justifyContent: "space-between", alignItems: "center", mb: 0.5 }, children: [
|
|
207
|
+
/* @__PURE__ */ jsxRuntime.jsxs(material.Typography, { variant: "body2", color: "text.secondary", children: [
|
|
208
|
+
"Players: ",
|
|
209
|
+
numPlayers,
|
|
210
|
+
" / ",
|
|
211
|
+
capacity
|
|
212
|
+
] }),
|
|
213
|
+
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" })
|
|
214
|
+
] }),
|
|
215
|
+
/* @__PURE__ */ jsxRuntime.jsx(material.LinearProgress, { variant: "determinate", value: occupancy, sx: { height: 8, borderRadius: 4 } })
|
|
216
|
+
] }) });
|
|
217
|
+
};
|
|
218
|
+
var TableResultCard_default = TableResultCard;
|
|
219
|
+
|
|
220
|
+
exports.BaseSearchResultCard = BaseSearchResultCard_default;
|
|
221
|
+
exports.EventResultCard = EventResultCard_default;
|
|
222
|
+
exports.PlayerResultCard = PlayerResultCard_default;
|
|
223
|
+
exports.SearchResultCard = SearchResultCard_default;
|
|
224
|
+
exports.TableResultCard = TableResultCard_default;
|
|
225
|
+
//# sourceMappingURL=Results.cjs.map
|
|
226
|
+
//# sourceMappingURL=Results.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/shared/TagComponents.tsx","../../src/components/SearchPage/Results/BaseSearchResultCard.tsx","../../src/components/SearchPage/Results/EventResultCard.tsx","../../src/components/SearchPage/Results/PlayerResultCard.tsx","../../src/components/SearchPage/Results/SearchResultCard.tsx","../../src/components/SearchPage/Results/TableResultCard.tsx"],"names":["jsx","Card","jsxs","CardContent","Box","Typography","Fragment","EventIcon","CalendarTodayIcon","LocationOnIcon","Avatar","CasinoIcon","Chip","LinearProgress"],"mappings":"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","file":"Results.cjs","sourcesContent":["\"use client\";\n\nimport React from \"react\";\nimport type { Tag } from \"@/types/tag\";\n\nexport function generateTagsDisplay(tag: Tag) {\n return (\n <span\n key={tag.id}\n className=\"inline-block text-sm px-3 py-1 rounded-full outline-black outline-2 font-outlined\"\n style={{\n marginTop:\"6px\",\n marginRight: \"6px\",\n marginBottom: \"6px\",\n background: tag.color || '#bfbcbb',\n color: \"white\",\n textShadow: \"black 0.2em 0.2em 0.4em\"\n }}\n >\n {tag.label}\n </span>\n )\n}\n\nexport function renderTagsFromIds(ids: number[] | undefined, legalTags: Tag[]) {\n if (!ids || !legalTags || legalTags.length === 0) { return ( <></>) }\n const validTags = ids\n .map((id) => legalTags.find((tag) => tag.id === id))\n .filter((tag): tag is Tag => Boolean(tag));\n\n return validTags.map((tag) => generateTagsDisplay(tag));\n}\n","\"use client\"\nimport React from 'react';\nimport { Card, CardContent, Typography, Box } from '@mui/material';\nimport { Tag } from '@/types/tag';\nimport { SearchResultItem } from '@/types/search';\nimport { generateTagsDisplay } from \"@/components/shared/TagComponents\";\n\nexport interface BaseSearchResultCardProps {\n result: SearchResultItem;\n onClick?: (id: number) => void;\n icon?: React.ReactNode;\n children?: React.ReactNode;\n tags: Tag[];\n}\n\n/**\n * Base component for displaying search results with common functionality\n */\nexport const BaseSearchResultCard: React.FC<BaseSearchResultCardProps> = ({ \n result,\n onClick,\n children,\n icon,\n tags\n}) => {\n const handleClick = () => {\n if (onClick) {\n onClick(result.id);\n }\n };\n\n return (\n <Card \n elevation={6}\n sx={{ \n width: '100%', \n cursor: onClick ? 'pointer' : 'default',\n boxShadow: '0px 8px 24px rgba(0, 0, 0, 0.15)',\n transition: 'box-shadow 0.3s ease-in-out',\n '&:hover': {\n boxShadow: '0px 12px 28px rgba(0, 0, 0, 0.2)'\n },\n marginBottom: 2\n }}\n onClick={handleClick}\n >\n <CardContent sx={{ display: 'flex', alignItems: 'flex-start' }}>\n {/* Icon on the left */}\n {icon && (\n <Box sx={{ mr: 2, display: 'flex', alignItems: 'center', pt: 0.5 }}>\n {icon}\n </Box>\n )}\n \n {/* Content on the right */}\n <Box sx={{ flex: 1 }}>\n <Typography variant=\"h6\" sx={{ mb: 1 }}>\n {result.title}\n </Typography>\n \n {/* Specialized content will be inserted here */}\n {children}\n \n <Typography variant=\"body1\">\n {result.description}\n </Typography>\n \n {result.tags && result.tags.length > 0 && (\n <Box sx={{ mt: 1 }}>\n <Box sx={{\n display: 'block',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'clip',\n pl: 0.5 // Add some padding to prevent clipping of the leftmost tag\n }}>\n {(() => {\n const MAX_VISIBLE = 5; // heuristic: show up to 5 tags on one line\n const tagObjs = result.tags\n .map((tagId) => tags.find((t) => t.id === tagId))\n .filter((t): t is Tag => Boolean(t));\n const visible = tagObjs.slice(0, MAX_VISIBLE);\n const hiddenCount = Math.max(tagObjs.length - visible.length, 0);\n return (\n <>\n {visible.map((tag) => generateTagsDisplay(tag))}\n {hiddenCount > 0 && (\n <span\n className=\"inline-block text-sm px-3 py-1 rounded-full outline-black outline-2 font-outlined\"\n style={{\n marginTop: '6px',\n marginRight: '6px',\n marginBottom: '6px',\n background: '#9e9e9e',\n color: 'white',\n textShadow: 'black 0.2em 0.2em 0.4em'\n }}\n >\n +{hiddenCount} more\n </span>\n )}\n </>\n );\n })()}\n </Box>\n </Box>\n )}\n </Box>\n </CardContent>\n </Card>\n );\n};\n\nexport default BaseSearchResultCard;","\"use client\"\nimport React from 'react';\nimport { Box, Typography } from '@mui/material';\nimport CalendarTodayIcon from '@mui/icons-material/CalendarToday';\nimport LocationOnIcon from '@mui/icons-material/LocationOn';\nimport EventIcon from '@mui/icons-material/Event';\nimport BaseSearchResultCard from './BaseSearchResultCard';\nimport { Tag } from '@/types/tag';\nimport { SearchResultItem } from '@/types/search';\n\ninterface EventResultCardProps {\n result: SearchResultItem;\n onClick?: (id: number) => void;\n tags: Tag[];\n}\n\nconst EventResultCard: React.FC<EventResultCardProps> = ({\n result,\n onClick,\n tags,\n}) => {\n const formatDate = (dateString: string) => {\n const options: Intl.DateTimeFormatOptions = {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n };\n\n try {\n const date = new Date(dateString);\n return date.toLocaleDateString('en-US', options);\n } catch {\n return dateString;\n }\n };\n\n const formattedDate = result.date ? formatDate(result.date) : 'Date TBD';\n const location = result.location || 'Location TBD';\n\n return (\n <BaseSearchResultCard result={result} onClick={onClick} icon={<EventIcon color=\"primary\" />} tags={tags}>\n <Box sx={{ mb: 1 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', mb: 0.5 }}>\n <CalendarTodayIcon sx={{ mr: 1, fontSize: 'small', color: 'text.secondary' }} />\n <Typography variant=\"body2\" color=\"text.secondary\">\n {formattedDate}\n </Typography>\n </Box>\n <Box sx={{ display: 'flex', alignItems: 'center', mb: 1 }}>\n <LocationOnIcon sx={{ mr: 1, fontSize: 'small', color: 'text.secondary' }} />\n <Typography variant=\"body2\" color=\"text.secondary\">\n {location}\n </Typography>\n </Box>\n </Box>\n </BaseSearchResultCard>\n );\n};\n\nexport default EventResultCard;\n","\"use client\"\nimport React from 'react';\nimport Avatar from '@mui/material/Avatar';\nimport BaseSearchResultCard from './BaseSearchResultCard';\nimport { Tag } from \"@/types/tag\";\nimport { SearchResultItem } from '@/types/search';\n\ninterface PlayerResultCardProps {\n result: SearchResultItem;\n onClick?: (id: number) => void;\n tags: Tag[];\n}\n\n/**\n * Component for displaying player search results\n * Displays player avatars with consistent color hashing/fallbacks\n */\nconst PlayerResultCard: React.FC<PlayerResultCardProps> = ({ \n result,\n onClick,\n tags\n}) => {\n // Get the first letter of the username for the avatar fallback\n const firstLetter = result.title.charAt(0).toUpperCase();\n \n // Generate a consistent color based on the username\n const getAvatarColor = (name: string) => {\n const colors = [\n '#F44336', '#E91E63', '#9C27B0', '#673AB7', \n '#3F51B5', '#2196F3', '#03A9F4', '#00BCD4', \n '#009688', '#4CAF50', '#8BC34A', '#CDDC39', \n '#FFEB3B', '#FFC107', '#FF9800', '#FF5722'\n ];\n \n let hash = 0;\n for (let i = 0; i < name.length; i++) {\n hash = name.charCodeAt(i) + ((hash << 5) - hash);\n }\n \n return colors[Math.abs(hash) % colors.length];\n };\n \n const avatarColor = getAvatarColor(result.title);\n \n const playerIcon = (\n <Avatar \n src={result.imageUrl} \n alt={result.title}\n sx={{ \n width: 40, \n height: 40, \n bgcolor: !result.imageUrl ? avatarColor : undefined\n }}\n >\n {!result.imageUrl && firstLetter}\n </Avatar>\n );\n\n return (\n <BaseSearchResultCard result={result} onClick={onClick} icon={playerIcon} tags={tags}>\n {/* No additional content needed */}\n </BaseSearchResultCard>\n );\n};\n\nexport default PlayerResultCard;","\"use client\";\n\nimport React from 'react';\r\nimport BaseSearchResultCard from './BaseSearchResultCard';\r\nimport { Tag } from '@/types/tag';\r\n\r\ninterface SearchResultCardProps {\r\n result: any;\r\n onClick?: (id: number) => void;\r\n tags: Tag[];\r\n}\r\n\r\n/**\r\n * @deprecated Use specialized card components (PlayerResultCard, TableResultCard, EventResultCard) instead\r\n * This component is kept for backward compatibility\r\n */\r\nconst SearchResultCard: React.FC<SearchResultCardProps> = ({ \r\n result,\r\n onClick,\r\n tags,\r\n}) => {\r\n return (\r\n <BaseSearchResultCard result={result} onClick={onClick} tags={tags}>\r\n {/* No specialized content for the generic card */}\r\n </BaseSearchResultCard>\r\n );\r\n};\r\n\r\nexport default SearchResultCard;","\"use client\"\nimport React from 'react';\nimport { BaseSearchResultCard } from './BaseSearchResultCard';\nimport { Box, Typography, LinearProgress, Chip } from '@mui/material';\nimport CasinoIcon from '@mui/icons-material/Casino';\nimport { Tag } from '@/types/tag';\nimport { SearchResultItem } from '@/types/search';\n\ninterface TableResultCardProps {\n result: SearchResultItem;\n tags: Tag[];\n onClick?: (id: number) => void;\n}\n\nexport const TableResultCard: React.FC<TableResultCardProps> = ({ result, tags, onClick }) => {\n const capacity = result.capacity || 1;\n const numPlayers = result.numPlayers || 0;\n const occupancy = (numPlayers / capacity) * 100;\n \n return (\n <BaseSearchResultCard result={result} tags={tags} onClick={onClick} icon={<CasinoIcon color=\"primary\" />}>\n <Box sx={{ mb: 1 }}>\n <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', mb: 0.5 }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Players: {numPlayers} / {capacity}\n </Typography>\n {result.dungeonMaster ? (\n <Chip label=\"DM Present\" size=\"small\" color=\"success\" variant=\"outlined\" />\n ) : (\n <Chip label=\"No DM\" size=\"small\" color=\"warning\" variant=\"outlined\" />\n )}\n </Box>\n <LinearProgress variant=\"determinate\" value={occupancy} sx={{ height: 8, borderRadius: 4 }} />\n </Box>\n </BaseSearchResultCard>\n );\n};\n\nexport default TableResultCard;"]}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import React__default from 'react';
|
|
2
|
+
import { Tag } from '../types/tag';
|
|
3
|
+
import { SearchResultItem } from '../types/search';
|
|
4
|
+
|
|
5
|
+
interface BaseSearchResultCardProps {
|
|
6
|
+
result: SearchResultItem;
|
|
7
|
+
onClick?: (id: number) => void;
|
|
8
|
+
icon?: React__default.ReactNode;
|
|
9
|
+
children?: React__default.ReactNode;
|
|
10
|
+
tags: Tag[];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Base component for displaying search results with common functionality
|
|
14
|
+
*/
|
|
15
|
+
declare const BaseSearchResultCard: React__default.FC<BaseSearchResultCardProps>;
|
|
16
|
+
|
|
17
|
+
interface EventResultCardProps {
|
|
18
|
+
result: SearchResultItem;
|
|
19
|
+
onClick?: (id: number) => void;
|
|
20
|
+
tags: Tag[];
|
|
21
|
+
}
|
|
22
|
+
declare const EventResultCard: React__default.FC<EventResultCardProps>;
|
|
23
|
+
|
|
24
|
+
interface PlayerResultCardProps {
|
|
25
|
+
result: SearchResultItem;
|
|
26
|
+
onClick?: (id: number) => void;
|
|
27
|
+
tags: Tag[];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Component for displaying player search results
|
|
31
|
+
* Displays player avatars with consistent color hashing/fallbacks
|
|
32
|
+
*/
|
|
33
|
+
declare const PlayerResultCard: React__default.FC<PlayerResultCardProps>;
|
|
34
|
+
|
|
35
|
+
interface SearchResultCardProps {
|
|
36
|
+
result: any;
|
|
37
|
+
onClick?: (id: number) => void;
|
|
38
|
+
tags: Tag[];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* @deprecated Use specialized card components (PlayerResultCard, TableResultCard, EventResultCard) instead
|
|
42
|
+
* This component is kept for backward compatibility
|
|
43
|
+
*/
|
|
44
|
+
declare const SearchResultCard: React__default.FC<SearchResultCardProps>;
|
|
45
|
+
|
|
46
|
+
interface TableResultCardProps {
|
|
47
|
+
result: SearchResultItem;
|
|
48
|
+
tags: Tag[];
|
|
49
|
+
onClick?: (id: number) => void;
|
|
50
|
+
}
|
|
51
|
+
declare const TableResultCard: React__default.FC<TableResultCardProps>;
|
|
52
|
+
|
|
53
|
+
export { BaseSearchResultCard, type BaseSearchResultCardProps, EventResultCard, PlayerResultCard, SearchResultCard, TableResultCard };
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import React__default from 'react';
|
|
2
|
+
import { Tag } from '../types/tag';
|
|
3
|
+
import { SearchResultItem } from '../types/search';
|
|
4
|
+
|
|
5
|
+
interface BaseSearchResultCardProps {
|
|
6
|
+
result: SearchResultItem;
|
|
7
|
+
onClick?: (id: number) => void;
|
|
8
|
+
icon?: React__default.ReactNode;
|
|
9
|
+
children?: React__default.ReactNode;
|
|
10
|
+
tags: Tag[];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Base component for displaying search results with common functionality
|
|
14
|
+
*/
|
|
15
|
+
declare const BaseSearchResultCard: React__default.FC<BaseSearchResultCardProps>;
|
|
16
|
+
|
|
17
|
+
interface EventResultCardProps {
|
|
18
|
+
result: SearchResultItem;
|
|
19
|
+
onClick?: (id: number) => void;
|
|
20
|
+
tags: Tag[];
|
|
21
|
+
}
|
|
22
|
+
declare const EventResultCard: React__default.FC<EventResultCardProps>;
|
|
23
|
+
|
|
24
|
+
interface PlayerResultCardProps {
|
|
25
|
+
result: SearchResultItem;
|
|
26
|
+
onClick?: (id: number) => void;
|
|
27
|
+
tags: Tag[];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Component for displaying player search results
|
|
31
|
+
* Displays player avatars with consistent color hashing/fallbacks
|
|
32
|
+
*/
|
|
33
|
+
declare const PlayerResultCard: React__default.FC<PlayerResultCardProps>;
|
|
34
|
+
|
|
35
|
+
interface SearchResultCardProps {
|
|
36
|
+
result: any;
|
|
37
|
+
onClick?: (id: number) => void;
|
|
38
|
+
tags: Tag[];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* @deprecated Use specialized card components (PlayerResultCard, TableResultCard, EventResultCard) instead
|
|
42
|
+
* This component is kept for backward compatibility
|
|
43
|
+
*/
|
|
44
|
+
declare const SearchResultCard: React__default.FC<SearchResultCardProps>;
|
|
45
|
+
|
|
46
|
+
interface TableResultCardProps {
|
|
47
|
+
result: SearchResultItem;
|
|
48
|
+
tags: Tag[];
|
|
49
|
+
onClick?: (id: number) => void;
|
|
50
|
+
}
|
|
51
|
+
declare const TableResultCard: React__default.FC<TableResultCardProps>;
|
|
52
|
+
|
|
53
|
+
export { BaseSearchResultCard, type BaseSearchResultCardProps, EventResultCard, PlayerResultCard, SearchResultCard, TableResultCard };
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Card, CardContent, Box, Typography, Chip, LinearProgress } from '@mui/material';
|
|
3
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
4
|
+
import CalendarTodayIcon from '@mui/icons-material/CalendarToday';
|
|
5
|
+
import LocationOnIcon from '@mui/icons-material/LocationOn';
|
|
6
|
+
import EventIcon from '@mui/icons-material/Event';
|
|
7
|
+
import Avatar from '@mui/material/Avatar';
|
|
8
|
+
import CasinoIcon from '@mui/icons-material/Casino';
|
|
9
|
+
|
|
10
|
+
function generateTagsDisplay(tag) {
|
|
11
|
+
return /* @__PURE__ */ jsx(
|
|
12
|
+
"span",
|
|
13
|
+
{
|
|
14
|
+
className: "inline-block text-sm px-3 py-1 rounded-full outline-black outline-2 font-outlined",
|
|
15
|
+
style: {
|
|
16
|
+
marginTop: "6px",
|
|
17
|
+
marginRight: "6px",
|
|
18
|
+
marginBottom: "6px",
|
|
19
|
+
background: tag.color || "#bfbcbb",
|
|
20
|
+
color: "white",
|
|
21
|
+
textShadow: "black 0.2em 0.2em 0.4em"
|
|
22
|
+
},
|
|
23
|
+
children: tag.label
|
|
24
|
+
},
|
|
25
|
+
tag.id
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
var BaseSearchResultCard = ({
|
|
29
|
+
result,
|
|
30
|
+
onClick,
|
|
31
|
+
children,
|
|
32
|
+
icon,
|
|
33
|
+
tags
|
|
34
|
+
}) => {
|
|
35
|
+
const handleClick = () => {
|
|
36
|
+
if (onClick) {
|
|
37
|
+
onClick(result.id);
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
return /* @__PURE__ */ jsx(
|
|
41
|
+
Card,
|
|
42
|
+
{
|
|
43
|
+
elevation: 6,
|
|
44
|
+
sx: {
|
|
45
|
+
width: "100%",
|
|
46
|
+
cursor: onClick ? "pointer" : "default",
|
|
47
|
+
boxShadow: "0px 8px 24px rgba(0, 0, 0, 0.15)",
|
|
48
|
+
transition: "box-shadow 0.3s ease-in-out",
|
|
49
|
+
"&:hover": {
|
|
50
|
+
boxShadow: "0px 12px 28px rgba(0, 0, 0, 0.2)"
|
|
51
|
+
},
|
|
52
|
+
marginBottom: 2
|
|
53
|
+
},
|
|
54
|
+
onClick: handleClick,
|
|
55
|
+
children: /* @__PURE__ */ jsxs(CardContent, { sx: { display: "flex", alignItems: "flex-start" }, children: [
|
|
56
|
+
icon && /* @__PURE__ */ jsx(Box, { sx: { mr: 2, display: "flex", alignItems: "center", pt: 0.5 }, children: icon }),
|
|
57
|
+
/* @__PURE__ */ jsxs(Box, { sx: { flex: 1 }, children: [
|
|
58
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h6", sx: { mb: 1 }, children: result.title }),
|
|
59
|
+
children,
|
|
60
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body1", children: result.description }),
|
|
61
|
+
result.tags && result.tags.length > 0 && /* @__PURE__ */ jsx(Box, { sx: { mt: 1 }, children: /* @__PURE__ */ jsx(Box, { sx: {
|
|
62
|
+
display: "block",
|
|
63
|
+
whiteSpace: "nowrap",
|
|
64
|
+
overflow: "hidden",
|
|
65
|
+
textOverflow: "clip",
|
|
66
|
+
pl: 0.5
|
|
67
|
+
// Add some padding to prevent clipping of the leftmost tag
|
|
68
|
+
}, children: (() => {
|
|
69
|
+
const MAX_VISIBLE = 5;
|
|
70
|
+
const tagObjs = result.tags.map((tagId) => tags.find((t) => t.id === tagId)).filter((t) => Boolean(t));
|
|
71
|
+
const visible = tagObjs.slice(0, MAX_VISIBLE);
|
|
72
|
+
const hiddenCount = Math.max(tagObjs.length - visible.length, 0);
|
|
73
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
74
|
+
visible.map((tag) => generateTagsDisplay(tag)),
|
|
75
|
+
hiddenCount > 0 && /* @__PURE__ */ jsxs(
|
|
76
|
+
"span",
|
|
77
|
+
{
|
|
78
|
+
className: "inline-block text-sm px-3 py-1 rounded-full outline-black outline-2 font-outlined",
|
|
79
|
+
style: {
|
|
80
|
+
marginTop: "6px",
|
|
81
|
+
marginRight: "6px",
|
|
82
|
+
marginBottom: "6px",
|
|
83
|
+
background: "#9e9e9e",
|
|
84
|
+
color: "white",
|
|
85
|
+
textShadow: "black 0.2em 0.2em 0.4em"
|
|
86
|
+
},
|
|
87
|
+
children: [
|
|
88
|
+
"+",
|
|
89
|
+
hiddenCount,
|
|
90
|
+
" more"
|
|
91
|
+
]
|
|
92
|
+
}
|
|
93
|
+
)
|
|
94
|
+
] });
|
|
95
|
+
})() }) })
|
|
96
|
+
] })
|
|
97
|
+
] })
|
|
98
|
+
}
|
|
99
|
+
);
|
|
100
|
+
};
|
|
101
|
+
var BaseSearchResultCard_default = BaseSearchResultCard;
|
|
102
|
+
var EventResultCard = ({
|
|
103
|
+
result,
|
|
104
|
+
onClick,
|
|
105
|
+
tags
|
|
106
|
+
}) => {
|
|
107
|
+
const formatDate = (dateString) => {
|
|
108
|
+
const options = {
|
|
109
|
+
weekday: "long",
|
|
110
|
+
year: "numeric",
|
|
111
|
+
month: "long",
|
|
112
|
+
day: "numeric"
|
|
113
|
+
};
|
|
114
|
+
try {
|
|
115
|
+
const date = new Date(dateString);
|
|
116
|
+
return date.toLocaleDateString("en-US", options);
|
|
117
|
+
} catch {
|
|
118
|
+
return dateString;
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
const formattedDate = result.date ? formatDate(result.date) : "Date TBD";
|
|
122
|
+
const location = result.location || "Location TBD";
|
|
123
|
+
return /* @__PURE__ */ jsx(BaseSearchResultCard_default, { result, onClick, icon: /* @__PURE__ */ jsx(EventIcon, { color: "primary" }), tags, children: /* @__PURE__ */ jsxs(Box, { sx: { mb: 1 }, children: [
|
|
124
|
+
/* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "center", mb: 0.5 }, children: [
|
|
125
|
+
/* @__PURE__ */ jsx(CalendarTodayIcon, { sx: { mr: 1, fontSize: "small", color: "text.secondary" } }),
|
|
126
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.secondary", children: formattedDate })
|
|
127
|
+
] }),
|
|
128
|
+
/* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "center", mb: 1 }, children: [
|
|
129
|
+
/* @__PURE__ */ jsx(LocationOnIcon, { sx: { mr: 1, fontSize: "small", color: "text.secondary" } }),
|
|
130
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.secondary", children: location })
|
|
131
|
+
] })
|
|
132
|
+
] }) });
|
|
133
|
+
};
|
|
134
|
+
var EventResultCard_default = EventResultCard;
|
|
135
|
+
var PlayerResultCard = ({
|
|
136
|
+
result,
|
|
137
|
+
onClick,
|
|
138
|
+
tags
|
|
139
|
+
}) => {
|
|
140
|
+
const firstLetter = result.title.charAt(0).toUpperCase();
|
|
141
|
+
const getAvatarColor = (name) => {
|
|
142
|
+
const colors = [
|
|
143
|
+
"#F44336",
|
|
144
|
+
"#E91E63",
|
|
145
|
+
"#9C27B0",
|
|
146
|
+
"#673AB7",
|
|
147
|
+
"#3F51B5",
|
|
148
|
+
"#2196F3",
|
|
149
|
+
"#03A9F4",
|
|
150
|
+
"#00BCD4",
|
|
151
|
+
"#009688",
|
|
152
|
+
"#4CAF50",
|
|
153
|
+
"#8BC34A",
|
|
154
|
+
"#CDDC39",
|
|
155
|
+
"#FFEB3B",
|
|
156
|
+
"#FFC107",
|
|
157
|
+
"#FF9800",
|
|
158
|
+
"#FF5722"
|
|
159
|
+
];
|
|
160
|
+
let hash = 0;
|
|
161
|
+
for (let i = 0; i < name.length; i++) {
|
|
162
|
+
hash = name.charCodeAt(i) + ((hash << 5) - hash);
|
|
163
|
+
}
|
|
164
|
+
return colors[Math.abs(hash) % colors.length];
|
|
165
|
+
};
|
|
166
|
+
const avatarColor = getAvatarColor(result.title);
|
|
167
|
+
const playerIcon = /* @__PURE__ */ jsx(
|
|
168
|
+
Avatar,
|
|
169
|
+
{
|
|
170
|
+
src: result.imageUrl,
|
|
171
|
+
alt: result.title,
|
|
172
|
+
sx: {
|
|
173
|
+
width: 40,
|
|
174
|
+
height: 40,
|
|
175
|
+
bgcolor: !result.imageUrl ? avatarColor : void 0
|
|
176
|
+
},
|
|
177
|
+
children: !result.imageUrl && firstLetter
|
|
178
|
+
}
|
|
179
|
+
);
|
|
180
|
+
return /* @__PURE__ */ jsx(BaseSearchResultCard_default, { result, onClick, icon: playerIcon, tags });
|
|
181
|
+
};
|
|
182
|
+
var PlayerResultCard_default = PlayerResultCard;
|
|
183
|
+
var SearchResultCard = ({
|
|
184
|
+
result,
|
|
185
|
+
onClick,
|
|
186
|
+
tags
|
|
187
|
+
}) => {
|
|
188
|
+
return /* @__PURE__ */ jsx(BaseSearchResultCard_default, { result, onClick, tags });
|
|
189
|
+
};
|
|
190
|
+
var SearchResultCard_default = SearchResultCard;
|
|
191
|
+
var TableResultCard = ({ result, tags, onClick }) => {
|
|
192
|
+
const capacity = result.capacity || 1;
|
|
193
|
+
const numPlayers = result.numPlayers || 0;
|
|
194
|
+
const occupancy = numPlayers / capacity * 100;
|
|
195
|
+
return /* @__PURE__ */ jsx(BaseSearchResultCard, { result, tags, onClick, icon: /* @__PURE__ */ jsx(CasinoIcon, { color: "primary" }), children: /* @__PURE__ */ jsxs(Box, { sx: { mb: 1 }, children: [
|
|
196
|
+
/* @__PURE__ */ jsxs(Box, { sx: { display: "flex", justifyContent: "space-between", alignItems: "center", mb: 0.5 }, children: [
|
|
197
|
+
/* @__PURE__ */ jsxs(Typography, { variant: "body2", color: "text.secondary", children: [
|
|
198
|
+
"Players: ",
|
|
199
|
+
numPlayers,
|
|
200
|
+
" / ",
|
|
201
|
+
capacity
|
|
202
|
+
] }),
|
|
203
|
+
result.dungeonMaster ? /* @__PURE__ */ jsx(Chip, { label: "DM Present", size: "small", color: "success", variant: "outlined" }) : /* @__PURE__ */ jsx(Chip, { label: "No DM", size: "small", color: "warning", variant: "outlined" })
|
|
204
|
+
] }),
|
|
205
|
+
/* @__PURE__ */ jsx(LinearProgress, { variant: "determinate", value: occupancy, sx: { height: 8, borderRadius: 4 } })
|
|
206
|
+
] }) });
|
|
207
|
+
};
|
|
208
|
+
var TableResultCard_default = TableResultCard;
|
|
209
|
+
|
|
210
|
+
export { BaseSearchResultCard_default as BaseSearchResultCard, EventResultCard_default as EventResultCard, PlayerResultCard_default as PlayerResultCard, SearchResultCard_default as SearchResultCard, TableResultCard_default as TableResultCard };
|
|
211
|
+
//# sourceMappingURL=Results.mjs.map
|
|
212
|
+
//# sourceMappingURL=Results.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/shared/TagComponents.tsx","../../src/components/SearchPage/Results/BaseSearchResultCard.tsx","../../src/components/SearchPage/Results/EventResultCard.tsx","../../src/components/SearchPage/Results/PlayerResultCard.tsx","../../src/components/SearchPage/Results/SearchResultCard.tsx","../../src/components/SearchPage/Results/TableResultCard.tsx"],"names":["jsx","Fragment","jsxs","Box","Typography"],"mappings":"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","file":"Results.mjs","sourcesContent":["\"use client\";\n\nimport React from \"react\";\nimport type { Tag } from \"@/types/tag\";\n\nexport function generateTagsDisplay(tag: Tag) {\n return (\n <span\n key={tag.id}\n className=\"inline-block text-sm px-3 py-1 rounded-full outline-black outline-2 font-outlined\"\n style={{\n marginTop:\"6px\",\n marginRight: \"6px\",\n marginBottom: \"6px\",\n background: tag.color || '#bfbcbb',\n color: \"white\",\n textShadow: \"black 0.2em 0.2em 0.4em\"\n }}\n >\n {tag.label}\n </span>\n )\n}\n\nexport function renderTagsFromIds(ids: number[] | undefined, legalTags: Tag[]) {\n if (!ids || !legalTags || legalTags.length === 0) { return ( <></>) }\n const validTags = ids\n .map((id) => legalTags.find((tag) => tag.id === id))\n .filter((tag): tag is Tag => Boolean(tag));\n\n return validTags.map((tag) => generateTagsDisplay(tag));\n}\n","\"use client\"\nimport React from 'react';\nimport { Card, CardContent, Typography, Box } from '@mui/material';\nimport { Tag } from '@/types/tag';\nimport { SearchResultItem } from '@/types/search';\nimport { generateTagsDisplay } from \"@/components/shared/TagComponents\";\n\nexport interface BaseSearchResultCardProps {\n result: SearchResultItem;\n onClick?: (id: number) => void;\n icon?: React.ReactNode;\n children?: React.ReactNode;\n tags: Tag[];\n}\n\n/**\n * Base component for displaying search results with common functionality\n */\nexport const BaseSearchResultCard: React.FC<BaseSearchResultCardProps> = ({ \n result,\n onClick,\n children,\n icon,\n tags\n}) => {\n const handleClick = () => {\n if (onClick) {\n onClick(result.id);\n }\n };\n\n return (\n <Card \n elevation={6}\n sx={{ \n width: '100%', \n cursor: onClick ? 'pointer' : 'default',\n boxShadow: '0px 8px 24px rgba(0, 0, 0, 0.15)',\n transition: 'box-shadow 0.3s ease-in-out',\n '&:hover': {\n boxShadow: '0px 12px 28px rgba(0, 0, 0, 0.2)'\n },\n marginBottom: 2\n }}\n onClick={handleClick}\n >\n <CardContent sx={{ display: 'flex', alignItems: 'flex-start' }}>\n {/* Icon on the left */}\n {icon && (\n <Box sx={{ mr: 2, display: 'flex', alignItems: 'center', pt: 0.5 }}>\n {icon}\n </Box>\n )}\n \n {/* Content on the right */}\n <Box sx={{ flex: 1 }}>\n <Typography variant=\"h6\" sx={{ mb: 1 }}>\n {result.title}\n </Typography>\n \n {/* Specialized content will be inserted here */}\n {children}\n \n <Typography variant=\"body1\">\n {result.description}\n </Typography>\n \n {result.tags && result.tags.length > 0 && (\n <Box sx={{ mt: 1 }}>\n <Box sx={{\n display: 'block',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'clip',\n pl: 0.5 // Add some padding to prevent clipping of the leftmost tag\n }}>\n {(() => {\n const MAX_VISIBLE = 5; // heuristic: show up to 5 tags on one line\n const tagObjs = result.tags\n .map((tagId) => tags.find((t) => t.id === tagId))\n .filter((t): t is Tag => Boolean(t));\n const visible = tagObjs.slice(0, MAX_VISIBLE);\n const hiddenCount = Math.max(tagObjs.length - visible.length, 0);\n return (\n <>\n {visible.map((tag) => generateTagsDisplay(tag))}\n {hiddenCount > 0 && (\n <span\n className=\"inline-block text-sm px-3 py-1 rounded-full outline-black outline-2 font-outlined\"\n style={{\n marginTop: '6px',\n marginRight: '6px',\n marginBottom: '6px',\n background: '#9e9e9e',\n color: 'white',\n textShadow: 'black 0.2em 0.2em 0.4em'\n }}\n >\n +{hiddenCount} more\n </span>\n )}\n </>\n );\n })()}\n </Box>\n </Box>\n )}\n </Box>\n </CardContent>\n </Card>\n );\n};\n\nexport default BaseSearchResultCard;","\"use client\"\nimport React from 'react';\nimport { Box, Typography } from '@mui/material';\nimport CalendarTodayIcon from '@mui/icons-material/CalendarToday';\nimport LocationOnIcon from '@mui/icons-material/LocationOn';\nimport EventIcon from '@mui/icons-material/Event';\nimport BaseSearchResultCard from './BaseSearchResultCard';\nimport { Tag } from '@/types/tag';\nimport { SearchResultItem } from '@/types/search';\n\ninterface EventResultCardProps {\n result: SearchResultItem;\n onClick?: (id: number) => void;\n tags: Tag[];\n}\n\nconst EventResultCard: React.FC<EventResultCardProps> = ({\n result,\n onClick,\n tags,\n}) => {\n const formatDate = (dateString: string) => {\n const options: Intl.DateTimeFormatOptions = {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n };\n\n try {\n const date = new Date(dateString);\n return date.toLocaleDateString('en-US', options);\n } catch {\n return dateString;\n }\n };\n\n const formattedDate = result.date ? formatDate(result.date) : 'Date TBD';\n const location = result.location || 'Location TBD';\n\n return (\n <BaseSearchResultCard result={result} onClick={onClick} icon={<EventIcon color=\"primary\" />} tags={tags}>\n <Box sx={{ mb: 1 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', mb: 0.5 }}>\n <CalendarTodayIcon sx={{ mr: 1, fontSize: 'small', color: 'text.secondary' }} />\n <Typography variant=\"body2\" color=\"text.secondary\">\n {formattedDate}\n </Typography>\n </Box>\n <Box sx={{ display: 'flex', alignItems: 'center', mb: 1 }}>\n <LocationOnIcon sx={{ mr: 1, fontSize: 'small', color: 'text.secondary' }} />\n <Typography variant=\"body2\" color=\"text.secondary\">\n {location}\n </Typography>\n </Box>\n </Box>\n </BaseSearchResultCard>\n );\n};\n\nexport default EventResultCard;\n","\"use client\"\nimport React from 'react';\nimport Avatar from '@mui/material/Avatar';\nimport BaseSearchResultCard from './BaseSearchResultCard';\nimport { Tag } from \"@/types/tag\";\nimport { SearchResultItem } from '@/types/search';\n\ninterface PlayerResultCardProps {\n result: SearchResultItem;\n onClick?: (id: number) => void;\n tags: Tag[];\n}\n\n/**\n * Component for displaying player search results\n * Displays player avatars with consistent color hashing/fallbacks\n */\nconst PlayerResultCard: React.FC<PlayerResultCardProps> = ({ \n result,\n onClick,\n tags\n}) => {\n // Get the first letter of the username for the avatar fallback\n const firstLetter = result.title.charAt(0).toUpperCase();\n \n // Generate a consistent color based on the username\n const getAvatarColor = (name: string) => {\n const colors = [\n '#F44336', '#E91E63', '#9C27B0', '#673AB7', \n '#3F51B5', '#2196F3', '#03A9F4', '#00BCD4', \n '#009688', '#4CAF50', '#8BC34A', '#CDDC39', \n '#FFEB3B', '#FFC107', '#FF9800', '#FF5722'\n ];\n \n let hash = 0;\n for (let i = 0; i < name.length; i++) {\n hash = name.charCodeAt(i) + ((hash << 5) - hash);\n }\n \n return colors[Math.abs(hash) % colors.length];\n };\n \n const avatarColor = getAvatarColor(result.title);\n \n const playerIcon = (\n <Avatar \n src={result.imageUrl} \n alt={result.title}\n sx={{ \n width: 40, \n height: 40, \n bgcolor: !result.imageUrl ? avatarColor : undefined\n }}\n >\n {!result.imageUrl && firstLetter}\n </Avatar>\n );\n\n return (\n <BaseSearchResultCard result={result} onClick={onClick} icon={playerIcon} tags={tags}>\n {/* No additional content needed */}\n </BaseSearchResultCard>\n );\n};\n\nexport default PlayerResultCard;","\"use client\";\n\nimport React from 'react';\r\nimport BaseSearchResultCard from './BaseSearchResultCard';\r\nimport { Tag } from '@/types/tag';\r\n\r\ninterface SearchResultCardProps {\r\n result: any;\r\n onClick?: (id: number) => void;\r\n tags: Tag[];\r\n}\r\n\r\n/**\r\n * @deprecated Use specialized card components (PlayerResultCard, TableResultCard, EventResultCard) instead\r\n * This component is kept for backward compatibility\r\n */\r\nconst SearchResultCard: React.FC<SearchResultCardProps> = ({ \r\n result,\r\n onClick,\r\n tags,\r\n}) => {\r\n return (\r\n <BaseSearchResultCard result={result} onClick={onClick} tags={tags}>\r\n {/* No specialized content for the generic card */}\r\n </BaseSearchResultCard>\r\n );\r\n};\r\n\r\nexport default SearchResultCard;","\"use client\"\nimport React from 'react';\nimport { BaseSearchResultCard } from './BaseSearchResultCard';\nimport { Box, Typography, LinearProgress, Chip } from '@mui/material';\nimport CasinoIcon from '@mui/icons-material/Casino';\nimport { Tag } from '@/types/tag';\nimport { SearchResultItem } from '@/types/search';\n\ninterface TableResultCardProps {\n result: SearchResultItem;\n tags: Tag[];\n onClick?: (id: number) => void;\n}\n\nexport const TableResultCard: React.FC<TableResultCardProps> = ({ result, tags, onClick }) => {\n const capacity = result.capacity || 1;\n const numPlayers = result.numPlayers || 0;\n const occupancy = (numPlayers / capacity) * 100;\n \n return (\n <BaseSearchResultCard result={result} tags={tags} onClick={onClick} icon={<CasinoIcon color=\"primary\" />}>\n <Box sx={{ mb: 1 }}>\n <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', mb: 0.5 }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Players: {numPlayers} / {capacity}\n </Typography>\n {result.dungeonMaster ? (\n <Chip label=\"DM Present\" size=\"small\" color=\"success\" variant=\"outlined\" />\n ) : (\n <Chip label=\"No DM\" size=\"small\" color=\"warning\" variant=\"outlined\" />\n )}\n </Box>\n <LinearProgress variant=\"determinate\" value={occupancy} sx={{ height: 8, borderRadius: 4 }} />\n </Box>\n </BaseSearchResultCard>\n );\n};\n\nexport default TableResultCard;"]}
|