@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
package/dist/common.cjs
ADDED
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
var react = require('react');
|
|
5
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
6
|
+
var material = require('@mui/material');
|
|
7
|
+
var Autocomplete = require('@mui/material/Autocomplete');
|
|
8
|
+
var Card = require('@mui/material/Card');
|
|
9
|
+
var CardContent = require('@mui/material/CardContent');
|
|
10
|
+
var CardHeader = require('@mui/material/CardHeader');
|
|
11
|
+
var Grid = require('@mui/material/Grid');
|
|
12
|
+
var Popper = require('@mui/material/Popper');
|
|
13
|
+
var TextField = require('@mui/material/TextField');
|
|
14
|
+
|
|
15
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
16
|
+
|
|
17
|
+
var Autocomplete__default = /*#__PURE__*/_interopDefault(Autocomplete);
|
|
18
|
+
var Card__default = /*#__PURE__*/_interopDefault(Card);
|
|
19
|
+
var CardContent__default = /*#__PURE__*/_interopDefault(CardContent);
|
|
20
|
+
var CardHeader__default = /*#__PURE__*/_interopDefault(CardHeader);
|
|
21
|
+
var Grid__default = /*#__PURE__*/_interopDefault(Grid);
|
|
22
|
+
var Popper__default = /*#__PURE__*/_interopDefault(Popper);
|
|
23
|
+
var TextField__default = /*#__PURE__*/_interopDefault(TextField);
|
|
24
|
+
|
|
25
|
+
// src/components/shared/AutoResizingTextarea.tsx
|
|
26
|
+
var AutoResizingTextarea = (props) => {
|
|
27
|
+
const { isInEditMode, onChange, textareaRef, value } = props;
|
|
28
|
+
react.useEffect(() => {
|
|
29
|
+
if (isInEditMode && textareaRef.current) {
|
|
30
|
+
const textarea = textareaRef.current;
|
|
31
|
+
textarea.style.height = "auto";
|
|
32
|
+
textarea.style.height = `${textarea.scrollHeight}px`;
|
|
33
|
+
}
|
|
34
|
+
}, [isInEditMode, textareaRef, value]);
|
|
35
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
36
|
+
"textarea",
|
|
37
|
+
{
|
|
38
|
+
ref: textareaRef,
|
|
39
|
+
value,
|
|
40
|
+
onChange: (e) => onChange(e.target.value),
|
|
41
|
+
style: {
|
|
42
|
+
backgroundColor: "#fffbea",
|
|
43
|
+
overflow: "hidden",
|
|
44
|
+
resize: "none",
|
|
45
|
+
width: "100%"
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
);
|
|
49
|
+
};
|
|
50
|
+
var AutoResizingTextarea_default = AutoResizingTextarea;
|
|
51
|
+
var NextGameCountdown = ({ nextGameTime }) => {
|
|
52
|
+
const [timeLeft, setTimeLeft] = react.useState("");
|
|
53
|
+
react.useEffect(() => {
|
|
54
|
+
if (!nextGameTime) return;
|
|
55
|
+
const timer = setInterval(() => {
|
|
56
|
+
const now = (/* @__PURE__ */ new Date()).getTime();
|
|
57
|
+
const distance = new Date(nextGameTime).getTime() - now;
|
|
58
|
+
if (distance < 0) {
|
|
59
|
+
clearInterval(timer);
|
|
60
|
+
setTimeLeft("Started");
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const days = Math.floor(distance / (1e3 * 60 * 60 * 24));
|
|
64
|
+
const hours = Math.floor(distance % (1e3 * 60 * 60 * 24) / (1e3 * 60 * 60));
|
|
65
|
+
const minutes = Math.floor(distance % (1e3 * 60 * 60) / (1e3 * 60));
|
|
66
|
+
const seconds = Math.floor(distance % (1e3 * 60) / 1e3);
|
|
67
|
+
let timeString = "";
|
|
68
|
+
if (days > 0) timeString += `${days}d `;
|
|
69
|
+
if (hours > 0 || days > 0) timeString += `${hours}h `;
|
|
70
|
+
timeString += `${minutes}m ${seconds}s`;
|
|
71
|
+
setTimeLeft(timeString);
|
|
72
|
+
}, 1e3);
|
|
73
|
+
return () => clearInterval(timer);
|
|
74
|
+
}, [nextGameTime]);
|
|
75
|
+
if (!nextGameTime) return null;
|
|
76
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(material.Typography, { variant: "body2", color: "primary", sx: { fontWeight: "bold" }, children: [
|
|
77
|
+
"Next Game: ",
|
|
78
|
+
timeLeft
|
|
79
|
+
] });
|
|
80
|
+
};
|
|
81
|
+
function generateTagsDisplay(tag) {
|
|
82
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
83
|
+
"span",
|
|
84
|
+
{
|
|
85
|
+
className: "inline-block text-sm px-3 py-1 rounded-full outline-black outline-2 font-outlined",
|
|
86
|
+
style: {
|
|
87
|
+
marginTop: "6px",
|
|
88
|
+
marginRight: "6px",
|
|
89
|
+
marginBottom: "6px",
|
|
90
|
+
background: tag.color || "#bfbcbb",
|
|
91
|
+
color: "white",
|
|
92
|
+
textShadow: "black 0.2em 0.2em 0.4em"
|
|
93
|
+
},
|
|
94
|
+
children: tag.label
|
|
95
|
+
},
|
|
96
|
+
tag.id
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
function renderTagsFromIds(ids, legalTags) {
|
|
100
|
+
if (!ids || !legalTags || legalTags.length === 0) {
|
|
101
|
+
return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, {});
|
|
102
|
+
}
|
|
103
|
+
const validTags = ids.map((id) => legalTags.find((tag) => tag.id === id)).filter((tag) => Boolean(tag));
|
|
104
|
+
return validTags.map((tag) => generateTagsDisplay(tag));
|
|
105
|
+
}
|
|
106
|
+
function TagEditor({
|
|
107
|
+
title = "Tags",
|
|
108
|
+
selectedTags,
|
|
109
|
+
possibleTags,
|
|
110
|
+
onToggleTag
|
|
111
|
+
}) {
|
|
112
|
+
const [inputValue, setInputValue] = react.useState("");
|
|
113
|
+
const selectedIds = react.useMemo(() => selectedTags.map((tag) => tag.id), [selectedTags]);
|
|
114
|
+
const options = react.useMemo(
|
|
115
|
+
() => possibleTags.map((tag) => ({ value: tag.id, label: tag.label })),
|
|
116
|
+
[possibleTags]
|
|
117
|
+
);
|
|
118
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Grid__default.default, { container: true, children: /* @__PURE__ */ jsxRuntime.jsx(Grid__default.default, { size: { xs: 12 }, children: /* @__PURE__ */ jsxRuntime.jsxs(Card__default.default, { children: [
|
|
119
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
120
|
+
CardHeader__default.default,
|
|
121
|
+
{
|
|
122
|
+
title,
|
|
123
|
+
style: {
|
|
124
|
+
background: "linear-gradient(135deg, rgba(25, 118, 210, 0.8), rgba(25, 118, 210, 1))",
|
|
125
|
+
color: "#FFFFFF",
|
|
126
|
+
fontSize: "1.5rem",
|
|
127
|
+
textShadow: "0px 3px 6px rgba(0, 0, 0, 0.5)"
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
),
|
|
131
|
+
/* @__PURE__ */ jsxRuntime.jsxs(CardContent__default.default, { children: [
|
|
132
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-2 flex flex-wrap gap-2", children: selectedTags.map((tag) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
133
|
+
"span",
|
|
134
|
+
{
|
|
135
|
+
className: "inline-block text-sm px-3 py-1 rounded-full outline-black outline-2 font-outlined",
|
|
136
|
+
style: {
|
|
137
|
+
background: tag.color || "#bfbcbb",
|
|
138
|
+
color: "white",
|
|
139
|
+
textShadow: "black 0.2em 0.2em 0.4em"
|
|
140
|
+
},
|
|
141
|
+
children: [
|
|
142
|
+
tag.label,
|
|
143
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
144
|
+
"button",
|
|
145
|
+
{
|
|
146
|
+
type: "button",
|
|
147
|
+
onClick: () => onToggleTag(tag.id),
|
|
148
|
+
className: "ml-2 text-red-500 bg-white bg-opacity-50 rounded-full outline-black outline-2 font-outlined",
|
|
149
|
+
children: "\xD7"
|
|
150
|
+
}
|
|
151
|
+
)
|
|
152
|
+
]
|
|
153
|
+
},
|
|
154
|
+
tag.id
|
|
155
|
+
)) }),
|
|
156
|
+
/* @__PURE__ */ jsxRuntime.jsx(Grid__default.default, { container: true, spacing: 3, children: /* @__PURE__ */ jsxRuntime.jsx(Grid__default.default, { sx: { marginTop: 3, width: "100%" }, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
157
|
+
Autocomplete__default.default,
|
|
158
|
+
{
|
|
159
|
+
options,
|
|
160
|
+
filterOptions: (availableOptions, state) => availableOptions.filter(
|
|
161
|
+
(option) => !selectedIds.includes(option.value) && option.label.toLowerCase().includes(state.inputValue.toLowerCase())
|
|
162
|
+
).slice(0, 3),
|
|
163
|
+
value: null,
|
|
164
|
+
inputValue,
|
|
165
|
+
onInputChange: (event, newInputValue) => {
|
|
166
|
+
if (event && event.type === "change") {
|
|
167
|
+
setInputValue(newInputValue);
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
onChange: (event, newValue) => {
|
|
171
|
+
if (newValue) {
|
|
172
|
+
onToggleTag(newValue.value);
|
|
173
|
+
}
|
|
174
|
+
setInputValue("");
|
|
175
|
+
},
|
|
176
|
+
slots: { popper: CustomPopper },
|
|
177
|
+
renderInput: (params) => /* @__PURE__ */ jsxRuntime.jsx(TextField__default.default, { ...params, label: "Select Tags" })
|
|
178
|
+
},
|
|
179
|
+
selectedIds.join("-")
|
|
180
|
+
) }) })
|
|
181
|
+
] })
|
|
182
|
+
] }) }) });
|
|
183
|
+
}
|
|
184
|
+
var CustomPopper = (props) => {
|
|
185
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
186
|
+
Popper__default.default,
|
|
187
|
+
{
|
|
188
|
+
...props,
|
|
189
|
+
modifiers: [
|
|
190
|
+
{
|
|
191
|
+
name: "preventOverflow",
|
|
192
|
+
options: { boundary: "viewport" }
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
name: "offset",
|
|
196
|
+
options: { offset: [0, -10] }
|
|
197
|
+
}
|
|
198
|
+
],
|
|
199
|
+
placement: "top-start"
|
|
200
|
+
}
|
|
201
|
+
);
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
exports.AutoResizingTextarea = AutoResizingTextarea_default;
|
|
205
|
+
exports.NextGameCountdown = NextGameCountdown;
|
|
206
|
+
exports.TagEditor = TagEditor;
|
|
207
|
+
exports.generateTagsDisplay = generateTagsDisplay;
|
|
208
|
+
exports.renderTagsFromIds = renderTagsFromIds;
|
|
209
|
+
//# sourceMappingURL=common.cjs.map
|
|
210
|
+
//# sourceMappingURL=common.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/shared/AutoResizingTextarea.tsx","../src/components/shared/NextGameCountdown.tsx","../src/components/shared/TagComponents.tsx","../src/components/shared/TagEditor.tsx"],"names":["useEffect","jsx","useState","jsxs","Typography","Fragment","useMemo","Grid","Card","CardHeader","CardContent","Autocomplete","TextField","Popper"],"mappings":"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","file":"common.cjs","sourcesContent":["\"use client\"\r\n\r\nimport React, {Dispatch, SetStateAction, useEffect} from 'react';\r\n\r\ninterface IAutoResizingTextareaProps {\r\n isInEditMode: boolean;\r\n onChange: Dispatch<SetStateAction<string>>;\r\n textareaRef: React.RefObject<HTMLTextAreaElement | null>;\r\n value: string;\r\n}\r\n\r\nconst AutoResizingTextarea: React.FC<IAutoResizingTextareaProps> = (props: IAutoResizingTextareaProps) => {\r\n const { isInEditMode, onChange, textareaRef, value } = props;\r\n\r\n useEffect(() => {\r\n if (isInEditMode && textareaRef.current) {\r\n const textarea = textareaRef.current;\r\n\r\n textarea.style.height = 'auto';\r\n textarea.style.height = `${textarea.scrollHeight}px`;\r\n }\r\n }, [isInEditMode, textareaRef, value]); // Run effect when entering edit mode or value changes\r\n\r\n return (\r\n <textarea\r\n ref={textareaRef}\r\n value={value}\r\n onChange={(e) => onChange(e.target.value)}\r\n style={{\r\n backgroundColor: '#fffbea',\r\n overflow: 'hidden',\r\n resize: 'none',\r\n width: '100%'\r\n }}\r\n />\r\n );\r\n}\r\n\r\nexport default AutoResizingTextarea;\r\n","\"use client\";\n\nimport React, { useState, useEffect } from 'react';\r\nimport { Typography } from '@mui/material';\r\n\r\nexport const NextGameCountdown = ({ nextGameTime }: { nextGameTime?: Date | string }) => {\r\n const [timeLeft, setTimeLeft] = useState<string>('');\r\n\r\n useEffect(() => {\r\n if (!nextGameTime) return;\r\n\r\n const timer = setInterval(() => {\r\n const now = new Date().getTime();\r\n const distance = new Date(nextGameTime).getTime() - now;\r\n\r\n if (distance < 0) {\r\n clearInterval(timer);\r\n setTimeLeft('Started');\r\n return;\r\n }\r\n\r\n const days = Math.floor(distance / (1000 * 60 * 60 * 24));\r\n const hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));\r\n const minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));\r\n const seconds = Math.floor((distance % (1000 * 60)) / 1000);\r\n\r\n let timeString = '';\r\n if (days > 0) timeString += `${days}d `;\r\n if (hours > 0 || days > 0) timeString += `${hours}h `;\r\n timeString += `${minutes}m ${seconds}s`;\r\n\r\n setTimeLeft(timeString);\r\n }, 1000);\r\n\r\n return () => clearInterval(timer);\r\n }, [nextGameTime]);\r\n\r\n if (!nextGameTime) return null;\r\n\r\n return (\r\n <Typography variant=\"body2\" color=\"primary\" sx={{ fontWeight: 'bold' }}>\r\n Next Game: {timeLeft}\r\n </Typography>\r\n );\r\n};\r\n","\"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\";\n\nimport React, { useMemo, useState } from \"react\";\nimport Autocomplete from \"@mui/material/Autocomplete\";\nimport Card from \"@mui/material/Card\";\nimport CardContent from \"@mui/material/CardContent\";\nimport CardHeader from \"@mui/material/CardHeader\";\nimport Grid from \"@mui/material/Grid\";\nimport Popper, { PopperProps } from \"@mui/material/Popper\";\nimport TextField from \"@mui/material/TextField\";\nimport type { Tag } from \"@/types/tag\";\n\nexport interface TagEditorProps {\n title?: string;\n selectedTags: Tag[];\n possibleTags: Tag[];\n onToggleTag: (id: number) => void;\n}\n\nexport function TagEditor({\n title = \"Tags\",\n selectedTags,\n possibleTags,\n onToggleTag,\n}: TagEditorProps) {\n const [inputValue, setInputValue] = useState(\"\");\n const selectedIds = useMemo(() => selectedTags.map((tag) => tag.id), [selectedTags]);\n\n const options = useMemo(\n () => possibleTags.map((tag) => ({ value: tag.id, label: tag.label })),\n [possibleTags]\n );\n\n return (\n <Grid container>\n <Grid size={{ xs: 12 }}>\n <Card>\n <CardHeader\n title={title}\n style={{\n background: \"linear-gradient(135deg, rgba(25, 118, 210, 0.8), rgba(25, 118, 210, 1))\",\n color: \"#FFFFFF\",\n fontSize: \"1.5rem\",\n textShadow: \"0px 3px 6px rgba(0, 0, 0, 0.5)\",\n }}\n />\n <CardContent>\n <div className=\"mt-2 flex flex-wrap gap-2\">\n {selectedTags.map((tag) => (\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 background: tag.color || \"#bfbcbb\",\n color: \"white\",\n textShadow: \"black 0.2em 0.2em 0.4em\",\n }}\n >\n {tag.label}\n <button\n type=\"button\"\n onClick={() => onToggleTag(tag.id)}\n className=\"ml-2 text-red-500 bg-white bg-opacity-50 rounded-full outline-black outline-2 font-outlined\"\n >\n ×\n </button>\n </span>\n ))}\n </div>\n <Grid container spacing={3}>\n <Grid sx={{ marginTop: 3, width: \"100%\" }}>\n <Autocomplete\n key={selectedIds.join(\"-\")}\n options={options}\n filterOptions={(availableOptions, state) =>\n availableOptions\n .filter(\n (option) =>\n !selectedIds.includes(option.value) &&\n option.label.toLowerCase().includes(state.inputValue.toLowerCase())\n )\n .slice(0, 3)\n }\n value={null}\n inputValue={inputValue}\n onInputChange={(event, newInputValue) => {\n if (event && event.type === \"change\") {\n setInputValue(newInputValue);\n }\n }}\n onChange={(event, newValue) => {\n if (newValue) {\n onToggleTag(newValue.value);\n }\n setInputValue(\"\");\n }}\n slots={{ popper: CustomPopper }}\n renderInput={(params) => <TextField {...params} label=\"Select Tags\" />}\n />\n </Grid>\n </Grid>\n </CardContent>\n </Card>\n </Grid>\n </Grid>\n );\n}\n\nconst CustomPopper = (props: PopperProps) => {\n return (\n <Popper\n {...props}\n modifiers={[\n {\n name: \"preventOverflow\",\n options: { boundary: \"viewport\" },\n },\n {\n name: \"offset\",\n options: { offset: [0, -10] },\n },\n ]}\n placement=\"top-start\"\n />\n );\n};\n"]}
|
package/dist/common.css
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/* src/components/shared/Modal/style.css */
|
|
2
|
+
.modal-container {
|
|
3
|
+
margin: auto;
|
|
4
|
+
color: #000000;
|
|
5
|
+
top: 20px;
|
|
6
|
+
flex-direction: column;
|
|
7
|
+
width: fit-content;
|
|
8
|
+
height: fit-content;
|
|
9
|
+
background-color: lightgrey;
|
|
10
|
+
display: flex;
|
|
11
|
+
}
|
|
12
|
+
.modal-overlay {
|
|
13
|
+
position: fixed;
|
|
14
|
+
margin: auto;
|
|
15
|
+
color: #000000;
|
|
16
|
+
top: 20px;
|
|
17
|
+
flex-direction: column;
|
|
18
|
+
width: 100%;
|
|
19
|
+
height: 100%;
|
|
20
|
+
background-color: rgba(0, 0, 0, 0.5);
|
|
21
|
+
display: flex;
|
|
22
|
+
justify-content: center;
|
|
23
|
+
align-items: center;
|
|
24
|
+
z-index: 1000;
|
|
25
|
+
}
|
|
26
|
+
.modal-content {
|
|
27
|
+
padding: 20px;
|
|
28
|
+
display: flex;
|
|
29
|
+
flex-direction: column;
|
|
30
|
+
}
|
|
31
|
+
.modal-content button {
|
|
32
|
+
border: outset 1px;
|
|
33
|
+
border-radius: 0;
|
|
34
|
+
color: black;
|
|
35
|
+
cursor: pointer;
|
|
36
|
+
margin: auto;
|
|
37
|
+
padding: 8px 48px;
|
|
38
|
+
}
|
|
39
|
+
.modal-content button:focus {
|
|
40
|
+
outline: 1px dotted #333;
|
|
41
|
+
outline-offset: -4px;
|
|
42
|
+
}
|
|
43
|
+
.modal-control-strip {
|
|
44
|
+
align-content: end;
|
|
45
|
+
display: flex;
|
|
46
|
+
justify-content: flex-end;
|
|
47
|
+
padding: 5px;
|
|
48
|
+
}
|
|
49
|
+
/*# sourceMappingURL=common.css.map */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/shared/Modal/style.css"],"sourcesContent":["\r\n .modal-container {\r\n margin: auto;\r\n color: #000000;\r\n top: 20px;\r\n flex-direction: column;\r\n width: fit-content;\r\n height: fit-content;\r\n background-color: lightgrey;\r\n display: flex;\r\n }\r\n\r\n .modal-overlay {\r\n position: fixed;\r\n margin: auto;\r\n color: #000000;\r\n top: 20px;\r\n flex-direction: column;\r\n width: 100%;\r\n height: 100%;\r\n background-color: rgba(0, 0, 0, 0.5);\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n z-index: 1000;\r\n }\r\n .modal-content {\r\n padding: 20px;\r\n display: flex;\r\n flex-direction: column;\r\n }\r\n .modal-content button {\r\n border: outset 1px;\r\n border-radius: 0;\r\n color: black;\r\n cursor: pointer;\r\n margin: auto;\r\n padding: 8px 48px;\r\n }\r\n .modal-content button:focus {\r\n outline: 1px dotted #333;\r\n outline-offset: -4px;\r\n }\r\n .modal-control-strip {\r\n align-content: end;\r\n display: flex;\r\n justify-content: flex-end;\r\n padding: 5px;\r\n }"],"mappings":";AACI,CAAC;AACG,UAAQ;AACR,SAAO;AACP,OAAK;AACL,kBAAgB;AAChB,SAAO;AACP,UAAQ;AACR,oBAAkB;AAClB,WAAS;AACb;AAEA,CAAC;AACG,YAAU;AACV,UAAQ;AACR,SAAO;AACP,OAAK;AACL,kBAAgB;AAChB,SAAO;AACP,UAAQ;AACR,oBAAkB,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AAChC,WAAS;AACT,mBAAiB;AACjB,eAAa;AACb,WAAS;AACb;AACA,CAAC;AACG,WAAS;AACT,WAAS;AACT,kBAAgB;AACpB;AACA,CALC,cAKc;AACP,UAAQ,OAAO;AACf,iBAAe;AACf,SAAO;AACP,UAAQ;AACR,UAAQ;AACR,WAAS,IAAI;AACjB;AACJ,CAbC,cAac,MAAM;AACb,WAAS,IAAI,OAAO;AACpB,kBAAgB;AACxB;AACA,CAAC;AACG,iBAAe;AACf,WAAS;AACT,mBAAiB;AACjB,WAAS;AACb;","names":[]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import React__default, { Dispatch, SetStateAction } from 'react';
|
|
2
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
3
|
+
import { Tag } from './types/tag';
|
|
4
|
+
|
|
5
|
+
interface IAutoResizingTextareaProps {
|
|
6
|
+
isInEditMode: boolean;
|
|
7
|
+
onChange: Dispatch<SetStateAction<string>>;
|
|
8
|
+
textareaRef: React__default.RefObject<HTMLTextAreaElement | null>;
|
|
9
|
+
value: string;
|
|
10
|
+
}
|
|
11
|
+
declare const AutoResizingTextarea: React__default.FC<IAutoResizingTextareaProps>;
|
|
12
|
+
|
|
13
|
+
declare const NextGameCountdown: ({ nextGameTime }: {
|
|
14
|
+
nextGameTime?: Date | string;
|
|
15
|
+
}) => react_jsx_runtime.JSX.Element | null;
|
|
16
|
+
|
|
17
|
+
declare function generateTagsDisplay(tag: Tag): react_jsx_runtime.JSX.Element;
|
|
18
|
+
declare function renderTagsFromIds(ids: number[] | undefined, legalTags: Tag[]): react_jsx_runtime.JSX.Element | react_jsx_runtime.JSX.Element[];
|
|
19
|
+
|
|
20
|
+
interface TagEditorProps {
|
|
21
|
+
title?: string;
|
|
22
|
+
selectedTags: Tag[];
|
|
23
|
+
possibleTags: Tag[];
|
|
24
|
+
onToggleTag: (id: number) => void;
|
|
25
|
+
}
|
|
26
|
+
declare function TagEditor({ title, selectedTags, possibleTags, onToggleTag, }: TagEditorProps): react_jsx_runtime.JSX.Element;
|
|
27
|
+
|
|
28
|
+
export { AutoResizingTextarea, NextGameCountdown, TagEditor, type TagEditorProps, generateTagsDisplay, renderTagsFromIds };
|
package/dist/common.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import React__default, { Dispatch, SetStateAction } from 'react';
|
|
2
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
3
|
+
import { Tag } from './types/tag';
|
|
4
|
+
|
|
5
|
+
interface IAutoResizingTextareaProps {
|
|
6
|
+
isInEditMode: boolean;
|
|
7
|
+
onChange: Dispatch<SetStateAction<string>>;
|
|
8
|
+
textareaRef: React__default.RefObject<HTMLTextAreaElement | null>;
|
|
9
|
+
value: string;
|
|
10
|
+
}
|
|
11
|
+
declare const AutoResizingTextarea: React__default.FC<IAutoResizingTextareaProps>;
|
|
12
|
+
|
|
13
|
+
declare const NextGameCountdown: ({ nextGameTime }: {
|
|
14
|
+
nextGameTime?: Date | string;
|
|
15
|
+
}) => react_jsx_runtime.JSX.Element | null;
|
|
16
|
+
|
|
17
|
+
declare function generateTagsDisplay(tag: Tag): react_jsx_runtime.JSX.Element;
|
|
18
|
+
declare function renderTagsFromIds(ids: number[] | undefined, legalTags: Tag[]): react_jsx_runtime.JSX.Element | react_jsx_runtime.JSX.Element[];
|
|
19
|
+
|
|
20
|
+
interface TagEditorProps {
|
|
21
|
+
title?: string;
|
|
22
|
+
selectedTags: Tag[];
|
|
23
|
+
possibleTags: Tag[];
|
|
24
|
+
onToggleTag: (id: number) => void;
|
|
25
|
+
}
|
|
26
|
+
declare function TagEditor({ title, selectedTags, possibleTags, onToggleTag, }: TagEditorProps): react_jsx_runtime.JSX.Element;
|
|
27
|
+
|
|
28
|
+
export { AutoResizingTextarea, NextGameCountdown, TagEditor, type TagEditorProps, generateTagsDisplay, renderTagsFromIds };
|
package/dist/common.mjs
ADDED
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useEffect, useState, useMemo } from 'react';
|
|
3
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
4
|
+
import { Typography } from '@mui/material';
|
|
5
|
+
import Autocomplete from '@mui/material/Autocomplete';
|
|
6
|
+
import Card from '@mui/material/Card';
|
|
7
|
+
import CardContent from '@mui/material/CardContent';
|
|
8
|
+
import CardHeader from '@mui/material/CardHeader';
|
|
9
|
+
import Grid from '@mui/material/Grid';
|
|
10
|
+
import Popper from '@mui/material/Popper';
|
|
11
|
+
import TextField from '@mui/material/TextField';
|
|
12
|
+
|
|
13
|
+
// src/components/shared/AutoResizingTextarea.tsx
|
|
14
|
+
var AutoResizingTextarea = (props) => {
|
|
15
|
+
const { isInEditMode, onChange, textareaRef, value } = props;
|
|
16
|
+
useEffect(() => {
|
|
17
|
+
if (isInEditMode && textareaRef.current) {
|
|
18
|
+
const textarea = textareaRef.current;
|
|
19
|
+
textarea.style.height = "auto";
|
|
20
|
+
textarea.style.height = `${textarea.scrollHeight}px`;
|
|
21
|
+
}
|
|
22
|
+
}, [isInEditMode, textareaRef, value]);
|
|
23
|
+
return /* @__PURE__ */ jsx(
|
|
24
|
+
"textarea",
|
|
25
|
+
{
|
|
26
|
+
ref: textareaRef,
|
|
27
|
+
value,
|
|
28
|
+
onChange: (e) => onChange(e.target.value),
|
|
29
|
+
style: {
|
|
30
|
+
backgroundColor: "#fffbea",
|
|
31
|
+
overflow: "hidden",
|
|
32
|
+
resize: "none",
|
|
33
|
+
width: "100%"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
);
|
|
37
|
+
};
|
|
38
|
+
var AutoResizingTextarea_default = AutoResizingTextarea;
|
|
39
|
+
var NextGameCountdown = ({ nextGameTime }) => {
|
|
40
|
+
const [timeLeft, setTimeLeft] = useState("");
|
|
41
|
+
useEffect(() => {
|
|
42
|
+
if (!nextGameTime) return;
|
|
43
|
+
const timer = setInterval(() => {
|
|
44
|
+
const now = (/* @__PURE__ */ new Date()).getTime();
|
|
45
|
+
const distance = new Date(nextGameTime).getTime() - now;
|
|
46
|
+
if (distance < 0) {
|
|
47
|
+
clearInterval(timer);
|
|
48
|
+
setTimeLeft("Started");
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const days = Math.floor(distance / (1e3 * 60 * 60 * 24));
|
|
52
|
+
const hours = Math.floor(distance % (1e3 * 60 * 60 * 24) / (1e3 * 60 * 60));
|
|
53
|
+
const minutes = Math.floor(distance % (1e3 * 60 * 60) / (1e3 * 60));
|
|
54
|
+
const seconds = Math.floor(distance % (1e3 * 60) / 1e3);
|
|
55
|
+
let timeString = "";
|
|
56
|
+
if (days > 0) timeString += `${days}d `;
|
|
57
|
+
if (hours > 0 || days > 0) timeString += `${hours}h `;
|
|
58
|
+
timeString += `${minutes}m ${seconds}s`;
|
|
59
|
+
setTimeLeft(timeString);
|
|
60
|
+
}, 1e3);
|
|
61
|
+
return () => clearInterval(timer);
|
|
62
|
+
}, [nextGameTime]);
|
|
63
|
+
if (!nextGameTime) return null;
|
|
64
|
+
return /* @__PURE__ */ jsxs(Typography, { variant: "body2", color: "primary", sx: { fontWeight: "bold" }, children: [
|
|
65
|
+
"Next Game: ",
|
|
66
|
+
timeLeft
|
|
67
|
+
] });
|
|
68
|
+
};
|
|
69
|
+
function generateTagsDisplay(tag) {
|
|
70
|
+
return /* @__PURE__ */ jsx(
|
|
71
|
+
"span",
|
|
72
|
+
{
|
|
73
|
+
className: "inline-block text-sm px-3 py-1 rounded-full outline-black outline-2 font-outlined",
|
|
74
|
+
style: {
|
|
75
|
+
marginTop: "6px",
|
|
76
|
+
marginRight: "6px",
|
|
77
|
+
marginBottom: "6px",
|
|
78
|
+
background: tag.color || "#bfbcbb",
|
|
79
|
+
color: "white",
|
|
80
|
+
textShadow: "black 0.2em 0.2em 0.4em"
|
|
81
|
+
},
|
|
82
|
+
children: tag.label
|
|
83
|
+
},
|
|
84
|
+
tag.id
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
function renderTagsFromIds(ids, legalTags) {
|
|
88
|
+
if (!ids || !legalTags || legalTags.length === 0) {
|
|
89
|
+
return /* @__PURE__ */ jsx(Fragment, {});
|
|
90
|
+
}
|
|
91
|
+
const validTags = ids.map((id) => legalTags.find((tag) => tag.id === id)).filter((tag) => Boolean(tag));
|
|
92
|
+
return validTags.map((tag) => generateTagsDisplay(tag));
|
|
93
|
+
}
|
|
94
|
+
function TagEditor({
|
|
95
|
+
title = "Tags",
|
|
96
|
+
selectedTags,
|
|
97
|
+
possibleTags,
|
|
98
|
+
onToggleTag
|
|
99
|
+
}) {
|
|
100
|
+
const [inputValue, setInputValue] = useState("");
|
|
101
|
+
const selectedIds = useMemo(() => selectedTags.map((tag) => tag.id), [selectedTags]);
|
|
102
|
+
const options = useMemo(
|
|
103
|
+
() => possibleTags.map((tag) => ({ value: tag.id, label: tag.label })),
|
|
104
|
+
[possibleTags]
|
|
105
|
+
);
|
|
106
|
+
return /* @__PURE__ */ jsx(Grid, { container: true, children: /* @__PURE__ */ jsx(Grid, { size: { xs: 12 }, children: /* @__PURE__ */ jsxs(Card, { children: [
|
|
107
|
+
/* @__PURE__ */ jsx(
|
|
108
|
+
CardHeader,
|
|
109
|
+
{
|
|
110
|
+
title,
|
|
111
|
+
style: {
|
|
112
|
+
background: "linear-gradient(135deg, rgba(25, 118, 210, 0.8), rgba(25, 118, 210, 1))",
|
|
113
|
+
color: "#FFFFFF",
|
|
114
|
+
fontSize: "1.5rem",
|
|
115
|
+
textShadow: "0px 3px 6px rgba(0, 0, 0, 0.5)"
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
),
|
|
119
|
+
/* @__PURE__ */ jsxs(CardContent, { children: [
|
|
120
|
+
/* @__PURE__ */ jsx("div", { className: "mt-2 flex flex-wrap gap-2", children: selectedTags.map((tag) => /* @__PURE__ */ jsxs(
|
|
121
|
+
"span",
|
|
122
|
+
{
|
|
123
|
+
className: "inline-block text-sm px-3 py-1 rounded-full outline-black outline-2 font-outlined",
|
|
124
|
+
style: {
|
|
125
|
+
background: tag.color || "#bfbcbb",
|
|
126
|
+
color: "white",
|
|
127
|
+
textShadow: "black 0.2em 0.2em 0.4em"
|
|
128
|
+
},
|
|
129
|
+
children: [
|
|
130
|
+
tag.label,
|
|
131
|
+
/* @__PURE__ */ jsx(
|
|
132
|
+
"button",
|
|
133
|
+
{
|
|
134
|
+
type: "button",
|
|
135
|
+
onClick: () => onToggleTag(tag.id),
|
|
136
|
+
className: "ml-2 text-red-500 bg-white bg-opacity-50 rounded-full outline-black outline-2 font-outlined",
|
|
137
|
+
children: "\xD7"
|
|
138
|
+
}
|
|
139
|
+
)
|
|
140
|
+
]
|
|
141
|
+
},
|
|
142
|
+
tag.id
|
|
143
|
+
)) }),
|
|
144
|
+
/* @__PURE__ */ jsx(Grid, { container: true, spacing: 3, children: /* @__PURE__ */ jsx(Grid, { sx: { marginTop: 3, width: "100%" }, children: /* @__PURE__ */ jsx(
|
|
145
|
+
Autocomplete,
|
|
146
|
+
{
|
|
147
|
+
options,
|
|
148
|
+
filterOptions: (availableOptions, state) => availableOptions.filter(
|
|
149
|
+
(option) => !selectedIds.includes(option.value) && option.label.toLowerCase().includes(state.inputValue.toLowerCase())
|
|
150
|
+
).slice(0, 3),
|
|
151
|
+
value: null,
|
|
152
|
+
inputValue,
|
|
153
|
+
onInputChange: (event, newInputValue) => {
|
|
154
|
+
if (event && event.type === "change") {
|
|
155
|
+
setInputValue(newInputValue);
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
onChange: (event, newValue) => {
|
|
159
|
+
if (newValue) {
|
|
160
|
+
onToggleTag(newValue.value);
|
|
161
|
+
}
|
|
162
|
+
setInputValue("");
|
|
163
|
+
},
|
|
164
|
+
slots: { popper: CustomPopper },
|
|
165
|
+
renderInput: (params) => /* @__PURE__ */ jsx(TextField, { ...params, label: "Select Tags" })
|
|
166
|
+
},
|
|
167
|
+
selectedIds.join("-")
|
|
168
|
+
) }) })
|
|
169
|
+
] })
|
|
170
|
+
] }) }) });
|
|
171
|
+
}
|
|
172
|
+
var CustomPopper = (props) => {
|
|
173
|
+
return /* @__PURE__ */ jsx(
|
|
174
|
+
Popper,
|
|
175
|
+
{
|
|
176
|
+
...props,
|
|
177
|
+
modifiers: [
|
|
178
|
+
{
|
|
179
|
+
name: "preventOverflow",
|
|
180
|
+
options: { boundary: "viewport" }
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
name: "offset",
|
|
184
|
+
options: { offset: [0, -10] }
|
|
185
|
+
}
|
|
186
|
+
],
|
|
187
|
+
placement: "top-start"
|
|
188
|
+
}
|
|
189
|
+
);
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
export { AutoResizingTextarea_default as AutoResizingTextarea, NextGameCountdown, TagEditor, generateTagsDisplay, renderTagsFromIds };
|
|
193
|
+
//# sourceMappingURL=common.mjs.map
|
|
194
|
+
//# sourceMappingURL=common.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/shared/AutoResizingTextarea.tsx","../src/components/shared/NextGameCountdown.tsx","../src/components/shared/TagComponents.tsx","../src/components/shared/TagEditor.tsx"],"names":["useEffect","jsx","useState","jsxs"],"mappings":"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","file":"common.mjs","sourcesContent":["\"use client\"\r\n\r\nimport React, {Dispatch, SetStateAction, useEffect} from 'react';\r\n\r\ninterface IAutoResizingTextareaProps {\r\n isInEditMode: boolean;\r\n onChange: Dispatch<SetStateAction<string>>;\r\n textareaRef: React.RefObject<HTMLTextAreaElement | null>;\r\n value: string;\r\n}\r\n\r\nconst AutoResizingTextarea: React.FC<IAutoResizingTextareaProps> = (props: IAutoResizingTextareaProps) => {\r\n const { isInEditMode, onChange, textareaRef, value } = props;\r\n\r\n useEffect(() => {\r\n if (isInEditMode && textareaRef.current) {\r\n const textarea = textareaRef.current;\r\n\r\n textarea.style.height = 'auto';\r\n textarea.style.height = `${textarea.scrollHeight}px`;\r\n }\r\n }, [isInEditMode, textareaRef, value]); // Run effect when entering edit mode or value changes\r\n\r\n return (\r\n <textarea\r\n ref={textareaRef}\r\n value={value}\r\n onChange={(e) => onChange(e.target.value)}\r\n style={{\r\n backgroundColor: '#fffbea',\r\n overflow: 'hidden',\r\n resize: 'none',\r\n width: '100%'\r\n }}\r\n />\r\n );\r\n}\r\n\r\nexport default AutoResizingTextarea;\r\n","\"use client\";\n\nimport React, { useState, useEffect } from 'react';\r\nimport { Typography } from '@mui/material';\r\n\r\nexport const NextGameCountdown = ({ nextGameTime }: { nextGameTime?: Date | string }) => {\r\n const [timeLeft, setTimeLeft] = useState<string>('');\r\n\r\n useEffect(() => {\r\n if (!nextGameTime) return;\r\n\r\n const timer = setInterval(() => {\r\n const now = new Date().getTime();\r\n const distance = new Date(nextGameTime).getTime() - now;\r\n\r\n if (distance < 0) {\r\n clearInterval(timer);\r\n setTimeLeft('Started');\r\n return;\r\n }\r\n\r\n const days = Math.floor(distance / (1000 * 60 * 60 * 24));\r\n const hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));\r\n const minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));\r\n const seconds = Math.floor((distance % (1000 * 60)) / 1000);\r\n\r\n let timeString = '';\r\n if (days > 0) timeString += `${days}d `;\r\n if (hours > 0 || days > 0) timeString += `${hours}h `;\r\n timeString += `${minutes}m ${seconds}s`;\r\n\r\n setTimeLeft(timeString);\r\n }, 1000);\r\n\r\n return () => clearInterval(timer);\r\n }, [nextGameTime]);\r\n\r\n if (!nextGameTime) return null;\r\n\r\n return (\r\n <Typography variant=\"body2\" color=\"primary\" sx={{ fontWeight: 'bold' }}>\r\n Next Game: {timeLeft}\r\n </Typography>\r\n );\r\n};\r\n","\"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\";\n\nimport React, { useMemo, useState } from \"react\";\nimport Autocomplete from \"@mui/material/Autocomplete\";\nimport Card from \"@mui/material/Card\";\nimport CardContent from \"@mui/material/CardContent\";\nimport CardHeader from \"@mui/material/CardHeader\";\nimport Grid from \"@mui/material/Grid\";\nimport Popper, { PopperProps } from \"@mui/material/Popper\";\nimport TextField from \"@mui/material/TextField\";\nimport type { Tag } from \"@/types/tag\";\n\nexport interface TagEditorProps {\n title?: string;\n selectedTags: Tag[];\n possibleTags: Tag[];\n onToggleTag: (id: number) => void;\n}\n\nexport function TagEditor({\n title = \"Tags\",\n selectedTags,\n possibleTags,\n onToggleTag,\n}: TagEditorProps) {\n const [inputValue, setInputValue] = useState(\"\");\n const selectedIds = useMemo(() => selectedTags.map((tag) => tag.id), [selectedTags]);\n\n const options = useMemo(\n () => possibleTags.map((tag) => ({ value: tag.id, label: tag.label })),\n [possibleTags]\n );\n\n return (\n <Grid container>\n <Grid size={{ xs: 12 }}>\n <Card>\n <CardHeader\n title={title}\n style={{\n background: \"linear-gradient(135deg, rgba(25, 118, 210, 0.8), rgba(25, 118, 210, 1))\",\n color: \"#FFFFFF\",\n fontSize: \"1.5rem\",\n textShadow: \"0px 3px 6px rgba(0, 0, 0, 0.5)\",\n }}\n />\n <CardContent>\n <div className=\"mt-2 flex flex-wrap gap-2\">\n {selectedTags.map((tag) => (\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 background: tag.color || \"#bfbcbb\",\n color: \"white\",\n textShadow: \"black 0.2em 0.2em 0.4em\",\n }}\n >\n {tag.label}\n <button\n type=\"button\"\n onClick={() => onToggleTag(tag.id)}\n className=\"ml-2 text-red-500 bg-white bg-opacity-50 rounded-full outline-black outline-2 font-outlined\"\n >\n ×\n </button>\n </span>\n ))}\n </div>\n <Grid container spacing={3}>\n <Grid sx={{ marginTop: 3, width: \"100%\" }}>\n <Autocomplete\n key={selectedIds.join(\"-\")}\n options={options}\n filterOptions={(availableOptions, state) =>\n availableOptions\n .filter(\n (option) =>\n !selectedIds.includes(option.value) &&\n option.label.toLowerCase().includes(state.inputValue.toLowerCase())\n )\n .slice(0, 3)\n }\n value={null}\n inputValue={inputValue}\n onInputChange={(event, newInputValue) => {\n if (event && event.type === \"change\") {\n setInputValue(newInputValue);\n }\n }}\n onChange={(event, newValue) => {\n if (newValue) {\n onToggleTag(newValue.value);\n }\n setInputValue(\"\");\n }}\n slots={{ popper: CustomPopper }}\n renderInput={(params) => <TextField {...params} label=\"Select Tags\" />}\n />\n </Grid>\n </Grid>\n </CardContent>\n </Card>\n </Grid>\n </Grid>\n );\n}\n\nconst CustomPopper = (props: PopperProps) => {\n return (\n <Popper\n {...props}\n modifiers={[\n {\n name: \"preventOverflow\",\n options: { boundary: \"viewport\" },\n },\n {\n name: \"offset\",\n options: { offset: [0, -10] },\n },\n ]}\n placement=\"top-start\"\n />\n );\n};\n"]}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { EventDB, EventEditContextValue } from './types/event';
|
|
3
|
+
import { ReactNode } from 'react';
|
|
4
|
+
|
|
5
|
+
type EventBannerProps = {
|
|
6
|
+
attendees: number;
|
|
7
|
+
numGames: number;
|
|
8
|
+
bannerUrl?: EventDB["bannerUrl"];
|
|
9
|
+
links?: EventDB["links"];
|
|
10
|
+
title?: EventDB["title"];
|
|
11
|
+
eventTag?: EventDB["eventTag"];
|
|
12
|
+
bannerColor?: string;
|
|
13
|
+
};
|
|
14
|
+
type EventBannerEditPayload = {
|
|
15
|
+
bannerUrl: EventDB["bannerUrl"];
|
|
16
|
+
bannerColor?: EventDB["bannerColor"];
|
|
17
|
+
links: EventDB["links"];
|
|
18
|
+
title: EventDB["title"];
|
|
19
|
+
eventTag: EventDB["eventTag"];
|
|
20
|
+
};
|
|
21
|
+
declare function EventBanner(props: EventBannerProps): react_jsx_runtime.JSX.Element | null;
|
|
22
|
+
|
|
23
|
+
type EventBannerEditProps = {
|
|
24
|
+
initialValue: EventBannerEditPayload;
|
|
25
|
+
onCancel: () => void;
|
|
26
|
+
onSave: (payload: Partial<EventBannerEditPayload>) => Promise<void> | void;
|
|
27
|
+
};
|
|
28
|
+
declare function EventBannerEdit({ initialValue, onCancel, onSave, }: EventBannerEditProps): react_jsx_runtime.JSX.Element;
|
|
29
|
+
|
|
30
|
+
type EventBasicInfoEditPayload = {
|
|
31
|
+
description: string;
|
|
32
|
+
startingDate?: string;
|
|
33
|
+
endingDate?: string;
|
|
34
|
+
date: string;
|
|
35
|
+
timezone: string;
|
|
36
|
+
};
|
|
37
|
+
type EventBasicInfoEditProps = {
|
|
38
|
+
initialValue: EventBasicInfoEditPayload;
|
|
39
|
+
onCancel: () => void;
|
|
40
|
+
onSave: (payload: Partial<EventBasicInfoEditPayload>) => Promise<void> | void;
|
|
41
|
+
};
|
|
42
|
+
declare function EventBasicInfoEdit({ initialValue, onCancel, onSave, }: EventBasicInfoEditProps): react_jsx_runtime.JSX.Element;
|
|
43
|
+
|
|
44
|
+
type ExtendedEventEditContextValue = EventEditContextValue & {
|
|
45
|
+
event: EventDB | null;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Provider props
|
|
49
|
+
*/
|
|
50
|
+
type EventEditProviderProps = {
|
|
51
|
+
value?: Partial<EventEditContextValue>;
|
|
52
|
+
initialEvent: EventDB;
|
|
53
|
+
children: ReactNode;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Provider component
|
|
57
|
+
*/
|
|
58
|
+
declare function EventEditProvider({ value, initialEvent, children, }: EventEditProviderProps): react_jsx_runtime.JSX.Element;
|
|
59
|
+
/**
|
|
60
|
+
* Hook for consuming context
|
|
61
|
+
*/
|
|
62
|
+
declare function useEventEdit(): ExtendedEventEditContextValue;
|
|
63
|
+
|
|
64
|
+
export { EventBanner as E, EventBannerEdit as a, type EventBannerEditPayload as b, type EventBannerProps as c, EventBasicInfoEdit as d, type EventBasicInfoEditPayload as e, EventEditProvider as f, useEventEdit as u };
|