@mbpockets/shared-ui 0.2.0 → 0.2.5
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/dist/EventPage/editMode/index.cjs.map +1 -1
- package/dist/EventPage/editMode/index.d.cts +1 -1
- package/dist/EventPage/editMode/index.d.ts +1 -1
- package/dist/EventPage/editMode/index.mjs.map +1 -1
- package/dist/EventPage/editMode.cjs.map +1 -1
- package/dist/EventPage/editMode.d.cts +1 -1
- package/dist/EventPage/editMode.d.ts +1 -1
- package/dist/EventPage/editMode.mjs.map +1 -1
- package/dist/EventPage/index.cjs +121 -63
- package/dist/EventPage/index.cjs.map +1 -1
- package/dist/EventPage/index.d.cts +1 -1
- package/dist/EventPage/index.d.ts +1 -1
- package/dist/EventPage/index.mjs +121 -63
- package/dist/EventPage/index.mjs.map +1 -1
- package/dist/EventPage.cjs +121 -63
- package/dist/EventPage.cjs.map +1 -1
- package/dist/EventPage.d.cts +4 -4
- package/dist/EventPage.d.ts +4 -4
- package/dist/EventPage.mjs +121 -63
- package/dist/EventPage.mjs.map +1 -1
- package/dist/PlayerPage/index.cjs +12 -8
- package/dist/PlayerPage/index.cjs.map +1 -1
- package/dist/PlayerPage/index.mjs +12 -8
- package/dist/PlayerPage/index.mjs.map +1 -1
- package/dist/PlayerPage.cjs +12 -8
- package/dist/PlayerPage.cjs.map +1 -1
- package/dist/PlayerPage.mjs +12 -8
- package/dist/PlayerPage.mjs.map +1 -1
- package/dist/ProfilePage/index.cjs +12 -8
- package/dist/ProfilePage/index.cjs.map +1 -1
- package/dist/ProfilePage/index.mjs +12 -8
- package/dist/ProfilePage/index.mjs.map +1 -1
- package/dist/ProfilePage.cjs +12 -8
- package/dist/ProfilePage.cjs.map +1 -1
- package/dist/ProfilePage.mjs +12 -8
- package/dist/ProfilePage.mjs.map +1 -1
- package/dist/SearchPage/Filters/index.cjs +38 -18
- package/dist/SearchPage/Filters/index.cjs.map +1 -1
- package/dist/SearchPage/Filters/index.d.cts +2 -1
- package/dist/SearchPage/Filters/index.d.ts +2 -1
- package/dist/SearchPage/Filters/index.mjs +34 -17
- package/dist/SearchPage/Filters/index.mjs.map +1 -1
- package/dist/SearchPage/Filters.cjs +38 -18
- package/dist/SearchPage/Filters.cjs.map +1 -1
- package/dist/SearchPage/Filters.d.cts +13 -1
- package/dist/SearchPage/Filters.d.ts +13 -1
- package/dist/SearchPage/Filters.mjs +34 -17
- package/dist/SearchPage/Filters.mjs.map +1 -1
- package/dist/SearchPage/Results/index.cjs +87 -48
- package/dist/SearchPage/Results/index.cjs.map +1 -1
- package/dist/SearchPage/Results/index.mjs +87 -48
- package/dist/SearchPage/Results/index.mjs.map +1 -1
- package/dist/SearchPage/Results.cjs +87 -48
- package/dist/SearchPage/Results.cjs.map +1 -1
- package/dist/SearchPage/Results.d.cts +10 -3
- package/dist/SearchPage/Results.d.ts +10 -3
- package/dist/SearchPage/Results.mjs +87 -48
- package/dist/SearchPage/Results.mjs.map +1 -1
- package/dist/SearchPage/index.cjs +207 -99
- package/dist/SearchPage/index.cjs.map +1 -1
- package/dist/SearchPage/index.d.cts +2 -2
- package/dist/SearchPage/index.d.ts +2 -2
- package/dist/SearchPage/index.mjs +203 -98
- package/dist/SearchPage/index.mjs.map +1 -1
- package/dist/SearchPage.cjs +207 -99
- package/dist/SearchPage.cjs.map +1 -1
- package/dist/SearchPage.d.cts +25 -3
- package/dist/SearchPage.d.ts +25 -3
- package/dist/SearchPage.mjs +203 -98
- package/dist/SearchPage.mjs.map +1 -1
- package/dist/TablePage/EditComponents/index.cjs +296 -0
- package/dist/TablePage/EditComponents/index.cjs.map +1 -0
- package/dist/TablePage/EditComponents/index.d.cts +3 -0
- package/dist/TablePage/EditComponents/index.d.ts +3 -0
- package/dist/TablePage/EditComponents/index.mjs +286 -0
- package/dist/TablePage/EditComponents/index.mjs.map +1 -0
- package/dist/TablePage/EditComponents.cjs +296 -0
- package/dist/TablePage/EditComponents.cjs.map +1 -0
- package/dist/TablePage/EditComponents.d.cts +21 -0
- package/dist/TablePage/EditComponents.d.ts +21 -0
- package/dist/TablePage/EditComponents.mjs +286 -0
- package/dist/TablePage/EditComponents.mjs.map +1 -0
- package/dist/TablePage/ModalProvider/index.cjs +59 -58
- package/dist/TablePage/ModalProvider/index.cjs.map +1 -1
- package/dist/TablePage/ModalProvider/index.d.cts +1 -1
- package/dist/TablePage/ModalProvider/index.d.ts +1 -1
- package/dist/TablePage/ModalProvider/index.mjs +50 -59
- package/dist/TablePage/ModalProvider/index.mjs.map +1 -1
- package/dist/TablePage/ModalProvider.cjs +59 -58
- package/dist/TablePage/ModalProvider.cjs.map +1 -1
- package/dist/TablePage/ModalProvider.d.cts +7 -2
- package/dist/TablePage/ModalProvider.d.ts +7 -2
- package/dist/TablePage/ModalProvider.mjs +50 -59
- package/dist/TablePage/ModalProvider.mjs.map +1 -1
- package/dist/TablePage/index.cjs +555 -331
- package/dist/TablePage/index.cjs.map +1 -1
- package/dist/TablePage/index.d.cts +3 -2
- package/dist/TablePage/index.d.ts +3 -2
- package/dist/TablePage/index.mjs +539 -320
- package/dist/TablePage/index.mjs.map +1 -1
- package/dist/TablePage/players/index.cjs +24 -4
- package/dist/TablePage/players/index.cjs.map +1 -1
- package/dist/TablePage/players/index.mjs +24 -4
- package/dist/TablePage/players/index.mjs.map +1 -1
- package/dist/TablePage/players.cjs +24 -4
- package/dist/TablePage/players.cjs.map +1 -1
- package/dist/TablePage/players.mjs +24 -4
- package/dist/TablePage/players.mjs.map +1 -1
- package/dist/TablePage.cjs +555 -331
- package/dist/TablePage.cjs.map +1 -1
- package/dist/TablePage.d.cts +4 -1
- package/dist/TablePage.d.ts +4 -1
- package/dist/TablePage.mjs +539 -320
- package/dist/TablePage.mjs.map +1 -1
- package/dist/{index-D7WHhl3Q.d.ts → index-B23RQop0.d.ts} +12 -12
- package/dist/{index-DC0kK3aC.d.cts → index-Csj8S4A4.d.cts} +12 -12
- package/dist/index.cjs +889 -424
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -4
- package/dist/index.d.ts +5 -4
- package/dist/index.mjs +870 -421
- package/dist/index.mjs.map +1 -1
- package/dist/mocks/{EventDB.cjs → EventDetails.cjs} +203 -3
- package/dist/mocks/EventDetails.cjs.map +1 -0
- package/dist/mocks/EventDetails.d.cts +6 -0
- package/dist/mocks/EventDetails.d.ts +6 -0
- package/dist/mocks/{EventDB.mjs → EventDetails.mjs} +203 -3
- package/dist/mocks/EventDetails.mjs.map +1 -0
- package/dist/mocks/Tables.cjs +1 -1
- package/dist/mocks/Tables.cjs.map +1 -1
- package/dist/mocks/Tables.mjs +1 -1
- package/dist/mocks/Tables.mjs.map +1 -1
- package/dist/mocks/Tags.cjs +200 -0
- package/dist/mocks/Tags.cjs.map +1 -1
- package/dist/mocks/Tags.mjs +200 -0
- package/dist/mocks/Tags.mjs.map +1 -1
- package/dist/mocks/index.cjs +202 -2
- package/dist/mocks/index.cjs.map +1 -1
- package/dist/mocks/index.d.cts +1 -1
- package/dist/mocks/index.d.ts +1 -1
- package/dist/mocks/index.mjs +202 -2
- package/dist/mocks/index.mjs.map +1 -1
- package/dist/mocks.cjs +202 -2
- package/dist/mocks.cjs.map +1 -1
- package/dist/mocks.d.cts +1 -1
- package/dist/mocks.d.ts +1 -1
- package/dist/mocks.mjs +202 -2
- package/dist/mocks.mjs.map +1 -1
- package/dist/shared/index.cjs +327 -64
- package/dist/shared/index.cjs.map +1 -1
- package/dist/shared/index.d.cts +1 -1
- package/dist/shared/index.d.ts +1 -1
- package/dist/shared/index.mjs +324 -64
- package/dist/shared/index.mjs.map +1 -1
- package/dist/shared.cjs +327 -64
- package/dist/shared.cjs.map +1 -1
- package/dist/shared.d.cts +25 -2
- package/dist/shared.d.ts +25 -2
- package/dist/shared.mjs +324 -64
- package/dist/shared.mjs.map +1 -1
- package/dist/types/event.d.cts +2 -3
- package/dist/types/event.d.ts +2 -3
- package/dist/types/index.d.cts +2 -2
- package/dist/types/index.d.ts +2 -2
- package/dist/types/search.d.cts +7 -1
- package/dist/types/search.d.ts +7 -1
- package/dist/types/tables.d.cts +1 -0
- package/dist/types/tables.d.ts +1 -0
- package/dist/types.d.cts +2 -2
- package/dist/types.d.ts +2 -2
- package/package.json +9 -2
- package/dist/TablePage/ModalProvider/index.css +0 -49
- package/dist/TablePage/ModalProvider/index.css.map +0 -1
- package/dist/TablePage/ModalProvider.css +0 -49
- package/dist/TablePage/ModalProvider.css.map +0 -1
- package/dist/TablePage/index.css +0 -49
- package/dist/TablePage/index.css.map +0 -1
- package/dist/TablePage.css +0 -49
- package/dist/TablePage.css.map +0 -1
- package/dist/index.css +0 -49
- package/dist/index.css.map +0 -1
- package/dist/mocks/EventDB.cjs.map +0 -1
- package/dist/mocks/EventDB.d.cts +0 -6
- package/dist/mocks/EventDB.d.ts +0 -6
- package/dist/mocks/EventDB.mjs.map +0 -1
- package/dist/shared/Modal/index.cjs +0 -64
- package/dist/shared/Modal/index.cjs.map +0 -1
- package/dist/shared/Modal/index.css +0 -49
- package/dist/shared/Modal/index.css.map +0 -1
- package/dist/shared/Modal/index.d.cts +0 -2
- package/dist/shared/Modal/index.d.ts +0 -2
- package/dist/shared/Modal/index.mjs +0 -62
- package/dist/shared/Modal/index.mjs.map +0 -1
- package/dist/shared/Modal.cjs +0 -64
- package/dist/shared/Modal.cjs.map +0 -1
- package/dist/shared/Modal.css +0 -49
- package/dist/shared/Modal.css.map +0 -1
- package/dist/shared/Modal.d.cts +0 -9
- package/dist/shared/Modal.d.ts +0 -9
- package/dist/shared/Modal.mjs +0 -62
- package/dist/shared/Modal.mjs.map +0 -1
- package/dist/shared/index.css +0 -49
- package/dist/shared/index.css.map +0 -1
- package/dist/shared.css +0 -49
- package/dist/shared.css.map +0 -1
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useState, useMemo } from 'react';
|
|
3
|
+
import { Box, Tooltip } from '@mui/material';
|
|
4
|
+
import TextField2 from '@mui/material/TextField';
|
|
5
|
+
import CasinoIcon from '@mui/icons-material/Casino';
|
|
6
|
+
import Grid from '@mui/material/Grid';
|
|
7
|
+
import Autocomplete from '@mui/material/Autocomplete';
|
|
8
|
+
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
9
|
+
|
|
10
|
+
// src/components/TablePage/EditComponents/EditTableDetailsForm.tsx
|
|
11
|
+
|
|
12
|
+
// src/components/shared/NameGenerator.ts
|
|
13
|
+
var getRandomTitle = () => {
|
|
14
|
+
const randomPrefix = titlePrefixes[Math.random() * titlePrefixes.length | 0];
|
|
15
|
+
const randomMiddle = tileMiddle[Math.random() * tileMiddle.length | 0];
|
|
16
|
+
const randomSuffix = titleSuffixes[Math.random() * titleSuffixes.length | 0];
|
|
17
|
+
return `${randomPrefix} ${randomMiddle} ${randomSuffix}`;
|
|
18
|
+
};
|
|
19
|
+
var getRandomTagline = () => taglines[Math.random() * taglines.length | 0];
|
|
20
|
+
var titlePrefixes = [
|
|
21
|
+
"The Knights of The",
|
|
22
|
+
"The Fellowship of The",
|
|
23
|
+
"The Order of The",
|
|
24
|
+
"The Infamous",
|
|
25
|
+
"The Legendary",
|
|
26
|
+
"The Dubious",
|
|
27
|
+
"The Sworn Guardians of The",
|
|
28
|
+
"The Ancient Guild of The",
|
|
29
|
+
"The Unstoppable",
|
|
30
|
+
"The Misfit",
|
|
31
|
+
"The Chaotic",
|
|
32
|
+
"The Brave",
|
|
33
|
+
"The Forgotten",
|
|
34
|
+
"The Wandering",
|
|
35
|
+
"The Noble Council of The",
|
|
36
|
+
"The Dread Pirates of The",
|
|
37
|
+
"The Honorable Society of The",
|
|
38
|
+
"The Cursed",
|
|
39
|
+
"The Unlikely Heroes of The",
|
|
40
|
+
"The Elders of The",
|
|
41
|
+
"The Seekers of The",
|
|
42
|
+
"The Champions of The",
|
|
43
|
+
"The Heralds of The",
|
|
44
|
+
"The Disciples of The",
|
|
45
|
+
"The Ragtag Band of The",
|
|
46
|
+
"The Cult of The"
|
|
47
|
+
];
|
|
48
|
+
var tileMiddle = [
|
|
49
|
+
"Round",
|
|
50
|
+
"Kitchen",
|
|
51
|
+
"Deepest",
|
|
52
|
+
"Sorcery",
|
|
53
|
+
"Munchkin",
|
|
54
|
+
"Shenanigan",
|
|
55
|
+
"Secret",
|
|
56
|
+
"Dungeon",
|
|
57
|
+
"Fireside",
|
|
58
|
+
"Tabletop",
|
|
59
|
+
"Midnight",
|
|
60
|
+
"Tavern",
|
|
61
|
+
"Goblin",
|
|
62
|
+
"Dragon",
|
|
63
|
+
"Critical",
|
|
64
|
+
"Natural Twenty",
|
|
65
|
+
"Counterspell",
|
|
66
|
+
"Nat One",
|
|
67
|
+
"Cardboard",
|
|
68
|
+
"Dice Tower",
|
|
69
|
+
"Campaign",
|
|
70
|
+
"Lore",
|
|
71
|
+
"Awkward",
|
|
72
|
+
"Unhinged",
|
|
73
|
+
"Chaotic Neutral",
|
|
74
|
+
"Homebrew",
|
|
75
|
+
"Side Quest"
|
|
76
|
+
];
|
|
77
|
+
var titleSuffixes = [
|
|
78
|
+
"Table",
|
|
79
|
+
"Dungeon",
|
|
80
|
+
"Cave",
|
|
81
|
+
"Crew",
|
|
82
|
+
"Team",
|
|
83
|
+
"League",
|
|
84
|
+
"Horde",
|
|
85
|
+
"Party",
|
|
86
|
+
"Conclave",
|
|
87
|
+
"Collective",
|
|
88
|
+
"Alliance",
|
|
89
|
+
"Syndicate",
|
|
90
|
+
"Guild",
|
|
91
|
+
"Cabal",
|
|
92
|
+
"Council",
|
|
93
|
+
"Expedition",
|
|
94
|
+
"Enclave",
|
|
95
|
+
"Consortium",
|
|
96
|
+
"Troupe",
|
|
97
|
+
"Vanguard",
|
|
98
|
+
"Cohort",
|
|
99
|
+
"Brotherhood",
|
|
100
|
+
"Sisterhood",
|
|
101
|
+
"Pantheon",
|
|
102
|
+
"Assembly",
|
|
103
|
+
"Coven"
|
|
104
|
+
];
|
|
105
|
+
var taglines = [
|
|
106
|
+
"Everyone is welcome!",
|
|
107
|
+
"Looking for serious players.",
|
|
108
|
+
"Get in nerds, we're gaming!",
|
|
109
|
+
"If you aren't there, you're square.",
|
|
110
|
+
"It will be legendary!",
|
|
111
|
+
"Beginners welcome \u2014 we were all level 1 once.",
|
|
112
|
+
"No experience necessary. Snacks encouraged.",
|
|
113
|
+
"Roleplayers, board gamers, and chaos gremlins welcome.",
|
|
114
|
+
"We don't metagame. Much.",
|
|
115
|
+
"All alignments accepted. True Neutral gets the snacks.",
|
|
116
|
+
"Where every session is a one-shot... until it isn't.",
|
|
117
|
+
"Homebrew rules may apply.",
|
|
118
|
+
"Warning: may contain excessive lore.",
|
|
119
|
+
"Critical failures celebrated as much as critical hits.",
|
|
120
|
+
"No powergamers. Okay, maybe one powergamer.",
|
|
121
|
+
"We finish campaigns. (Eventually.)",
|
|
122
|
+
"Veteran players seeking worthy companions.",
|
|
123
|
+
"Casuals only \u2014 we're here for the vibes.",
|
|
124
|
+
"Serious about fun, not about rules.",
|
|
125
|
+
"Min-maxers need not apply.",
|
|
126
|
+
"For those who read the rulebook... and those who definitely didn't.",
|
|
127
|
+
"Roll for initiative. Arrive on time.",
|
|
128
|
+
"Side quests are the main quest here.",
|
|
129
|
+
"Chaotic good energy required.",
|
|
130
|
+
"If you bring snacks, you can name the first NPC.",
|
|
131
|
+
"We read the rulebook so you don't have to.",
|
|
132
|
+
"Wargamers only \u2014 no take-backs, no mercy.",
|
|
133
|
+
"Everyone welcome. Meeple provided.",
|
|
134
|
+
"We always play the longest game on the shelf.",
|
|
135
|
+
"Worker placement. Resource management. Existential dread.",
|
|
136
|
+
"No phones at the table! We're here for the game.",
|
|
137
|
+
"Someone always flips the table. Metaphorically. Usually.",
|
|
138
|
+
"We have a designated rules lawyer. It's fine.",
|
|
139
|
+
"Cooperative games only \u2014 we can't handle another Monopoly incident.",
|
|
140
|
+
"Teaching time is half the fun!"
|
|
141
|
+
];
|
|
142
|
+
function Chip({ tag, removeCallback }) {
|
|
143
|
+
var _a;
|
|
144
|
+
const color = (_a = tag.color) != null ? _a : "#bfbcbb";
|
|
145
|
+
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs(
|
|
146
|
+
"span",
|
|
147
|
+
{
|
|
148
|
+
className: "inline-block text-sm px-3 py-1 rounded-full border-2 font-outlined text-white m-0.5 font-stretch-105% font-sans",
|
|
149
|
+
style: {
|
|
150
|
+
borderColor: `color-mix(in srgb, ${color}, black 50%)`,
|
|
151
|
+
background: `linear-gradient(160deg, color-mix(in srgb, ${color}, white 10%) 0%, color-mix(in srgb, ${color}, black 60%) 100%)`,
|
|
152
|
+
textShadow: "black 1.5px 1px 1.5px",
|
|
153
|
+
filter: `drop-shadow(2px 2px 1.5px color-mix(in srgb, ${color}, black 80%))`
|
|
154
|
+
},
|
|
155
|
+
children: [
|
|
156
|
+
tag.label,
|
|
157
|
+
removeCallback && /* @__PURE__ */ jsx(
|
|
158
|
+
"button",
|
|
159
|
+
{
|
|
160
|
+
type: "button",
|
|
161
|
+
onClick: () => removeCallback(tag.id),
|
|
162
|
+
className: "ml-2 text-white hover:text-red-700 focus:outline-none pl-0.5 pr-1 cursor-pointer hover:bg-white rounded-full",
|
|
163
|
+
style: {
|
|
164
|
+
textShadow: "black 1px 1px 1px"
|
|
165
|
+
},
|
|
166
|
+
children: "X"
|
|
167
|
+
}
|
|
168
|
+
)
|
|
169
|
+
]
|
|
170
|
+
},
|
|
171
|
+
tag.id
|
|
172
|
+
) });
|
|
173
|
+
}
|
|
174
|
+
function TagSelector({ initialTagIDs, allTags, onTagChange }) {
|
|
175
|
+
const [tagList, updateTagList] = useState(initialTagIDs);
|
|
176
|
+
const [inputValue, setInputValue] = useState("");
|
|
177
|
+
const toggleTag = (id) => tagList.find((t) => t === id) ? removeTag(id) : addTag(id);
|
|
178
|
+
const addTag = (id) => {
|
|
179
|
+
const newList = [...tagList, id];
|
|
180
|
+
updateTagList(newList);
|
|
181
|
+
onTagChange(newList);
|
|
182
|
+
};
|
|
183
|
+
const removeTag = (id) => {
|
|
184
|
+
const newList = tagList.filter((t) => t !== id);
|
|
185
|
+
updateTagList(newList);
|
|
186
|
+
onTagChange(newList);
|
|
187
|
+
};
|
|
188
|
+
const selectedTags = useMemo(() => allTags.filter((tag) => tagList.includes(tag.id)), [allTags, tagList]);
|
|
189
|
+
const options = useMemo(
|
|
190
|
+
() => allTags.map((tag) => ({ value: tag.id, label: tag.label })),
|
|
191
|
+
[allTags]
|
|
192
|
+
);
|
|
193
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
194
|
+
/* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-2", children: selectedTags.map((tag) => /* @__PURE__ */ jsx(
|
|
195
|
+
Chip,
|
|
196
|
+
{
|
|
197
|
+
tag,
|
|
198
|
+
removeCallback: () => toggleTag(tag.id)
|
|
199
|
+
},
|
|
200
|
+
tag.id
|
|
201
|
+
)) }),
|
|
202
|
+
/* @__PURE__ */ jsx(Grid, { container: true, spacing: 3, children: /* @__PURE__ */ jsx(Grid, { sx: { marginTop: 3, width: "100%", minWidth: "550px" }, children: /* @__PURE__ */ jsx(
|
|
203
|
+
Autocomplete,
|
|
204
|
+
{
|
|
205
|
+
options,
|
|
206
|
+
filterOptions: (availableOptions, state) => availableOptions.filter(
|
|
207
|
+
(option) => !tagList.includes(option.value) && option.label.toLowerCase().includes(state.inputValue.toLowerCase())
|
|
208
|
+
),
|
|
209
|
+
value: null,
|
|
210
|
+
inputValue,
|
|
211
|
+
onInputChange: (event, newInputValue) => {
|
|
212
|
+
if (event && event.type === "change") {
|
|
213
|
+
setInputValue(newInputValue);
|
|
214
|
+
}
|
|
215
|
+
},
|
|
216
|
+
onChange: (event, newValue) => {
|
|
217
|
+
if (newValue) {
|
|
218
|
+
toggleTag(newValue.value);
|
|
219
|
+
}
|
|
220
|
+
setInputValue("");
|
|
221
|
+
},
|
|
222
|
+
renderInput: (params) => /* @__PURE__ */ jsx(TextField2, { ...params, label: "Select Tags" })
|
|
223
|
+
},
|
|
224
|
+
tagList.join("-")
|
|
225
|
+
) }) })
|
|
226
|
+
] });
|
|
227
|
+
}
|
|
228
|
+
function EditTableDetailsForm({ initialTitle, initialSubtitle, onTitleChange, onSubtitleChange, allowEditingTitles, initialTagIDs, allTags, onTagChange }) {
|
|
229
|
+
const [title, setTitle] = useState(initialTitle);
|
|
230
|
+
const [subtitle, setSubtitle] = useState(initialSubtitle);
|
|
231
|
+
const handleTitleChange = (newTitle) => {
|
|
232
|
+
setTitle(newTitle);
|
|
233
|
+
onTitleChange(newTitle);
|
|
234
|
+
};
|
|
235
|
+
const handleSubtitleChange = (newSubtitle) => {
|
|
236
|
+
setSubtitle(newSubtitle);
|
|
237
|
+
onSubtitleChange(newSubtitle);
|
|
238
|
+
};
|
|
239
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
240
|
+
allowEditingTitles && /* @__PURE__ */ jsxs(Box, { className: "flex flex-col gap-4 mb-8", children: [
|
|
241
|
+
/* @__PURE__ */ jsxs(Box, { className: "inline-flex", children: [
|
|
242
|
+
/* @__PURE__ */ jsx(
|
|
243
|
+
TextField2,
|
|
244
|
+
{
|
|
245
|
+
sx: { minWidth: "400px" },
|
|
246
|
+
label: "Title",
|
|
247
|
+
onChange: (e) => handleTitleChange(e.target.value),
|
|
248
|
+
variant: "filled",
|
|
249
|
+
value: title
|
|
250
|
+
}
|
|
251
|
+
),
|
|
252
|
+
/* @__PURE__ */ jsx(Tooltip, { title: "Randomize", children: /* @__PURE__ */ jsx(
|
|
253
|
+
CasinoIcon,
|
|
254
|
+
{
|
|
255
|
+
sx: { cursor: "pointer", alignSelf: "center", ml: 1 },
|
|
256
|
+
onClick: () => handleTitleChange(getRandomTitle())
|
|
257
|
+
}
|
|
258
|
+
) })
|
|
259
|
+
] }),
|
|
260
|
+
/* @__PURE__ */ jsxs(Box, { className: "inline-flex min-w-96", children: [
|
|
261
|
+
/* @__PURE__ */ jsx(
|
|
262
|
+
TextField2,
|
|
263
|
+
{
|
|
264
|
+
sx: { minWidth: "400px" },
|
|
265
|
+
label: "Short Description or Tagline",
|
|
266
|
+
onChange: (e) => handleSubtitleChange(e.target.value),
|
|
267
|
+
variant: "filled",
|
|
268
|
+
value: subtitle
|
|
269
|
+
}
|
|
270
|
+
),
|
|
271
|
+
/* @__PURE__ */ jsx(Tooltip, { title: "Randomize", children: /* @__PURE__ */ jsx(
|
|
272
|
+
CasinoIcon,
|
|
273
|
+
{
|
|
274
|
+
sx: { cursor: "pointer", alignSelf: "center", ml: 1 },
|
|
275
|
+
onClick: () => handleSubtitleChange(getRandomTagline())
|
|
276
|
+
}
|
|
277
|
+
) })
|
|
278
|
+
] })
|
|
279
|
+
] }),
|
|
280
|
+
/* @__PURE__ */ jsx(TagSelector, { initialTagIDs, allTags, onTagChange })
|
|
281
|
+
] });
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
export { EditTableDetailsForm, TagSelector };
|
|
285
|
+
//# sourceMappingURL=EditComponents.mjs.map
|
|
286
|
+
//# sourceMappingURL=EditComponents.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/shared/NameGenerator.ts","../../src/components/shared/Chip.tsx","../../src/components/TablePage/EditComponents/TagSelector.tsx","../../src/components/TablePage/EditComponents/EditTableDetailsForm.tsx"],"names":["jsxs","Fragment","jsx","TextField","useState"],"mappings":"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","file":"EditComponents.mjs","sourcesContent":["\r\nexport const getRandomTitle = () => {\r\n const randomPrefix = titlePrefixes[Math.random() * titlePrefixes.length | 0];\r\n const randomMiddle = tileMiddle[Math.random() * tileMiddle.length | 0];\r\n const randomSuffix = titleSuffixes[Math.random() * titleSuffixes.length | 0];\r\n return `${randomPrefix} ${randomMiddle} ${randomSuffix}`;\r\n}\r\n\r\nexport const getRandomTagline = () => taglines[Math.random() * taglines.length | 0];\r\n\r\n\r\nconst titlePrefixes = [\r\n \"The Knights of The\",\r\n \"The Fellowship of The\",\r\n \"The Order of The\",\r\n \"The Infamous\",\r\n \"The Legendary\",\r\n \"The Dubious\",\r\n \"The Sworn Guardians of The\",\r\n \"The Ancient Guild of The\",\r\n \"The Unstoppable\",\r\n \"The Misfit\",\r\n \"The Chaotic\",\r\n \"The Brave\",\r\n \"The Forgotten\",\r\n \"The Wandering\",\r\n \"The Noble Council of The\",\r\n \"The Dread Pirates of The\",\r\n \"The Honorable Society of The\",\r\n \"The Cursed\",\r\n \"The Unlikely Heroes of The\",\r\n \"The Elders of The\",\r\n \"The Seekers of The\",\r\n \"The Champions of The\",\r\n \"The Heralds of The\",\r\n \"The Disciples of The\",\r\n \"The Ragtag Band of The\",\r\n \"The Cult of The\",\r\n];\r\n\r\nconst tileMiddle = [\r\n \"Round\",\r\n \"Kitchen\",\r\n \"Deepest\",\r\n \"Sorcery\",\r\n \"Munchkin\",\r\n \"Shenanigan\",\r\n \"Secret\",\r\n \"Dungeon\",\r\n \"Fireside\",\r\n \"Tabletop\",\r\n \"Midnight\",\r\n \"Tavern\",\r\n \"Goblin\",\r\n \"Dragon\",\r\n \"Critical\",\r\n \"Natural Twenty\",\r\n \"Counterspell\",\r\n \"Nat One\",\r\n \"Cardboard\",\r\n \"Dice Tower\",\r\n \"Campaign\",\r\n \"Lore\",\r\n \"Awkward\",\r\n \"Unhinged\",\r\n \"Chaotic Neutral\",\r\n \"Homebrew\",\r\n \"Side Quest\",\r\n];\r\n\r\nconst titleSuffixes = [\r\n \"Table\",\r\n \"Dungeon\",\r\n \"Cave\",\r\n \"Crew\",\r\n \"Team\",\r\n \"League\",\r\n \"Horde\",\r\n \"Party\",\r\n \"Conclave\",\r\n \"Collective\",\r\n \"Alliance\",\r\n \"Syndicate\",\r\n \"Guild\",\r\n \"Cabal\",\r\n \"Council\",\r\n \"Expedition\",\r\n \"Enclave\",\r\n \"Consortium\",\r\n \"Troupe\",\r\n \"Vanguard\",\r\n \"Cohort\",\r\n \"Brotherhood\",\r\n \"Sisterhood\",\r\n \"Pantheon\",\r\n \"Assembly\",\r\n \"Coven\",\r\n];\r\n\r\nconst taglines = [\r\n \"Everyone is welcome!\",\r\n \"Looking for serious players.\",\r\n \"Get in nerds, we're gaming!\",\r\n \"If you aren't there, you're square.\",\r\n \"It will be legendary!\",\r\n \"Beginners welcome — we were all level 1 once.\",\r\n \"No experience necessary. Snacks encouraged.\",\r\n \"Roleplayers, board gamers, and chaos gremlins welcome.\",\r\n \"We don't metagame. Much.\",\r\n \"All alignments accepted. True Neutral gets the snacks.\",\r\n \"Where every session is a one-shot... until it isn't.\",\r\n \"Homebrew rules may apply.\",\r\n \"Warning: may contain excessive lore.\",\r\n \"Critical failures celebrated as much as critical hits.\",\r\n \"No powergamers. Okay, maybe one powergamer.\",\r\n \"We finish campaigns. (Eventually.)\",\r\n \"Veteran players seeking worthy companions.\",\r\n \"Casuals only — we're here for the vibes.\",\r\n \"Serious about fun, not about rules.\",\r\n \"Min-maxers need not apply.\",\r\n \"For those who read the rulebook... and those who definitely didn't.\",\r\n \"Roll for initiative. Arrive on time.\",\r\n \"Side quests are the main quest here.\",\r\n \"Chaotic good energy required.\",\r\n \"If you bring snacks, you can name the first NPC.\",\r\n \"We read the rulebook so you don't have to.\",\r\n \"Wargamers only — no take-backs, no mercy.\",\r\n \"Everyone welcome. Meeple provided.\",\r\n \"We always play the longest game on the shelf.\",\r\n \"Worker placement. Resource management. Existential dread.\",\r\n \"No phones at the table! We're here for the game.\",\r\n \"Someone always flips the table. Metaphorically. Usually.\",\r\n \"We have a designated rules lawyer. It's fine.\",\r\n \"Cooperative games only — we can't handle another Monopoly incident.\",\r\n \"Teaching time is half the fun!\",\r\n];\r\n","import React from \"react\";\r\nimport {Tag} from \"@/types/tag\";\r\n\r\nexport default function Chip({ tag, removeCallback }: { tag: Tag, removeCallback?: (tagId: number) => void }) {\r\n const color = tag.color ?? \"#bfbcbb\";\r\n return (\r\n <>\r\n <span\r\n key={tag.id}\r\n className=\"inline-block text-sm px-3 py-1 rounded-full border-2 font-outlined text-white m-0.5 font-stretch-105% font-sans\"\r\n style={{\r\n borderColor: `color-mix(in srgb, ${color}, black 50%)`,\r\n background: `linear-gradient(160deg, color-mix(in srgb, ${color}, white 10%) 0%, color-mix(in srgb, ${color}, black 60%) 100%)`,\r\n textShadow: \"black 1.5px 1px 1.5px\",\r\n filter: `drop-shadow(2px 2px 1.5px color-mix(in srgb, ${color}, black 80%))`\r\n }}\r\n >\r\n {tag.label}\r\n {removeCallback && (\r\n <button\r\n type=\"button\"\r\n onClick={() => removeCallback(tag.id)}\r\n className=\"ml-2 text-white hover:text-red-700 focus:outline-none pl-0.5 pr-1 cursor-pointer hover:bg-white rounded-full\"\r\n style={{\r\n textShadow: \"black 1px 1px 1px\"\r\n }}\r\n >\r\n X\r\n </button>\r\n )}\r\n </span>\r\n </>\r\n )\r\n\r\n}","import React, {useMemo, useState} from \"react\";\r\nimport TextField from \"@mui/material/TextField\";\r\nimport Grid from \"@mui/material/Grid\";\r\nimport Autocomplete from \"@mui/material/Autocomplete\";\r\nimport Chip from \"../../shared/Chip\";\r\nimport {Tag} from \"@/types/tag\";\r\n\r\nexport function TagSelector({initialTagIDs, allTags, onTagChange}: {\r\n initialTagIDs: number[];\r\n allTags: Tag[];\r\n onTagChange: (tagIDs: number[]) => void;\r\n}) {\r\n const [tagList, updateTagList] = useState(initialTagIDs);\r\n const [inputValue, setInputValue] = useState(\"\");\r\n\r\n const toggleTag = (id: number) => tagList.find(t => t === id) ? removeTag(id) : addTag(id);\r\n const addTag = (id: number) => {\r\n const newList = [...tagList, id];\r\n updateTagList(newList);\r\n onTagChange(newList);\r\n };\r\n const removeTag = (id: number) => {\r\n const newList = tagList.filter(t => t !== id);\r\n updateTagList(newList);\r\n onTagChange(newList);\r\n }\r\n const selectedTags = useMemo(() => allTags.filter(tag => tagList.includes(tag.id)), [allTags, tagList]);\r\n const options = useMemo(\r\n () => allTags.map((tag) => ({ value: tag.id, label: tag.label })),\r\n [allTags]\r\n );\r\n\r\n return (\r\n <>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {selectedTags.map((tag) => (\r\n <Chip\r\n key={tag.id}\r\n tag={tag}\r\n removeCallback={() => toggleTag(tag.id)}\r\n />\r\n ))}\r\n </div>\r\n <Grid container spacing={3}>\r\n <Grid sx={{ marginTop: 3, width: \"100%\", minWidth: \"550px\" }}>\r\n <Autocomplete\r\n key={tagList.join(\"-\")}\r\n options={options}\r\n filterOptions={(availableOptions, state) =>\r\n availableOptions\r\n .filter(\r\n (option) =>\r\n !tagList.includes(option.value) &&\r\n option.label.toLowerCase().includes(state.inputValue.toLowerCase())\r\n )\r\n }\r\n value={null}\r\n inputValue={inputValue}\r\n onInputChange={(event, newInputValue) => {\r\n if (event && event.type === \"change\") {\r\n setInputValue(newInputValue);\r\n }\r\n }}\r\n onChange={(event, newValue) => {\r\n if (newValue) {\r\n toggleTag(newValue.value);\r\n }\r\n setInputValue(\"\");\r\n }}\r\n renderInput={(params) => <TextField {...params} label=\"Select Tags\" />}\r\n />\r\n </Grid>\r\n </Grid>\r\n </>\r\n );\r\n}\r\n","import React, {useState} from \"react\";\r\nimport {Box, Tooltip} from \"@mui/material\";\r\nimport TextField from \"@mui/material/TextField\";\r\nimport CasinoIcon from \"@mui/icons-material/Casino\";\r\nimport {getRandomTagline, getRandomTitle} from \"@/components/shared/NameGenerator\";\r\nimport {Tag} from \"@/types/tag\";\r\nimport {TagSelector} from \"./TagSelector\";\r\n\r\nexport function EditTableDetailsForm({initialTitle, initialSubtitle, onTitleChange, onSubtitleChange, allowEditingTitles, initialTagIDs, allTags, onTagChange}: {\r\n initialTitle: string;\r\n initialSubtitle: string;\r\n onTitleChange: (title: string) => void;\r\n onSubtitleChange: (subtitle: string) => void;\r\n allowEditingTitles?: boolean;\r\n onTagChange: (tagIDs: number[]) => void;\r\n initialTagIDs: number[],\r\n allTags: Tag[],\r\n}) {\r\n const [title, setTitle] = useState(initialTitle);\r\n const [subtitle, setSubtitle] = useState(initialSubtitle);\r\n const handleTitleChange = (newTitle: string) => {\r\n setTitle(newTitle);\r\n onTitleChange(newTitle);\r\n };\r\n\r\n const handleSubtitleChange = (newSubtitle: string) => {\r\n setSubtitle(newSubtitle);\r\n onSubtitleChange(newSubtitle);\r\n };\r\n\r\n return (\r\n <>\r\n {(allowEditingTitles && <Box className={\"flex flex-col gap-4 mb-8\"}>\r\n <Box className={\"inline-flex\"}>\r\n <TextField\r\n sx={{minWidth: \"400px\"}}\r\n label=\"Title\"\r\n onChange={(e) => handleTitleChange(e.target.value)}\r\n variant=\"filled\"\r\n value={title}\r\n />\r\n <Tooltip title=\"Randomize\">\r\n <CasinoIcon sx={{cursor: \"pointer\", alignSelf: \"center\", ml: 1}}\r\n onClick={() => handleTitleChange(getRandomTitle())}/>\r\n </Tooltip>\r\n </Box>\r\n <Box className={\"inline-flex min-w-96\"}>\r\n <TextField\r\n sx={{minWidth: \"400px\"}}\r\n label=\"Short Description or Tagline\"\r\n onChange={(e) => handleSubtitleChange(e.target.value)}\r\n variant=\"filled\"\r\n value={subtitle}\r\n />\r\n <Tooltip title=\"Randomize\">\r\n <CasinoIcon sx={{cursor: \"pointer\", alignSelf: \"center\", ml: 1}}\r\n onClick={() => handleSubtitleChange(getRandomTagline())}/>\r\n </Tooltip>\r\n </Box>\r\n </Box>)}\r\n\r\n <TagSelector initialTagIDs={initialTagIDs} allTags={allTags} onTagChange={onTagChange} />\r\n </>\r\n );\r\n}"]}
|
|
@@ -2,76 +2,77 @@
|
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
var react = require('react');
|
|
5
|
+
var Dialog = require('@mui/material/Dialog');
|
|
6
|
+
var DialogContent = require('@mui/material/DialogContent');
|
|
7
|
+
var DialogActions = require('@mui/material/DialogActions');
|
|
8
|
+
var Button = require('@mui/material/Button');
|
|
9
|
+
var IconButton = require('@mui/material/IconButton');
|
|
10
|
+
var CloseIcon = require('@mui/icons-material/Close');
|
|
11
|
+
var material = require('@mui/material');
|
|
12
|
+
var DialogTitle = require('@mui/material/DialogTitle');
|
|
5
13
|
var jsxRuntime = require('react/jsx-runtime');
|
|
6
14
|
|
|
15
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
16
|
+
|
|
17
|
+
var Dialog__default = /*#__PURE__*/_interopDefault(Dialog);
|
|
18
|
+
var DialogContent__default = /*#__PURE__*/_interopDefault(DialogContent);
|
|
19
|
+
var DialogActions__default = /*#__PURE__*/_interopDefault(DialogActions);
|
|
20
|
+
var Button__default = /*#__PURE__*/_interopDefault(Button);
|
|
21
|
+
var IconButton__default = /*#__PURE__*/_interopDefault(IconButton);
|
|
22
|
+
var CloseIcon__default = /*#__PURE__*/_interopDefault(CloseIcon);
|
|
23
|
+
var DialogTitle__default = /*#__PURE__*/_interopDefault(DialogTitle);
|
|
24
|
+
|
|
7
25
|
var ModalContext = react.createContext({
|
|
8
|
-
showModal: (
|
|
26
|
+
showModal: () => {
|
|
9
27
|
},
|
|
10
28
|
hideModal: () => {
|
|
11
29
|
}
|
|
12
30
|
});
|
|
13
31
|
var useModal = () => react.useContext(ModalContext);
|
|
14
|
-
var Modal = ({ onClose, children }) => {
|
|
15
|
-
const modalRef = react.useRef(null);
|
|
16
|
-
const previouslyFocusedElement = react.useRef(null);
|
|
17
|
-
react.useEffect(() => {
|
|
18
|
-
var _a;
|
|
19
|
-
if (children) {
|
|
20
|
-
previouslyFocusedElement.current = document.activeElement;
|
|
21
|
-
(_a = modalRef.current) == null ? void 0 : _a.focus();
|
|
22
|
-
}
|
|
23
|
-
return () => {
|
|
24
|
-
var _a2;
|
|
25
|
-
(_a2 = previouslyFocusedElement.current) == null ? void 0 : _a2.focus();
|
|
26
|
-
};
|
|
27
|
-
}, [children]);
|
|
28
|
-
const handleOnClose = () => {
|
|
29
|
-
onClose();
|
|
30
|
-
};
|
|
31
|
-
const handleKeyDown = (e) => {
|
|
32
|
-
var _a;
|
|
33
|
-
if (e.key !== "Tab") return;
|
|
34
|
-
const focusableElements = (_a = modalRef.current) == null ? void 0 : _a.querySelectorAll(
|
|
35
|
-
'button, [tabindex]:not([tabindex="-1"])'
|
|
36
|
-
);
|
|
37
|
-
if (!focusableElements || focusableElements.length === 0) return;
|
|
38
|
-
const first = focusableElements[0];
|
|
39
|
-
const last = focusableElements[focusableElements.length - 1];
|
|
40
|
-
if (e.shiftKey) {
|
|
41
|
-
if (document.activeElement === first) {
|
|
42
|
-
e.preventDefault();
|
|
43
|
-
last.focus();
|
|
44
|
-
}
|
|
45
|
-
} else {
|
|
46
|
-
if (document.activeElement === last) {
|
|
47
|
-
e.preventDefault();
|
|
48
|
-
first.focus();
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
};
|
|
52
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
53
|
-
"div",
|
|
54
|
-
{
|
|
55
|
-
className: "modal-overlay",
|
|
56
|
-
onKeyDown: handleKeyDown,
|
|
57
|
-
ref: modalRef,
|
|
58
|
-
role: "dialog",
|
|
59
|
-
tabIndex: -1,
|
|
60
|
-
children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "modal-container", children: [
|
|
61
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "modal-control-strip", children: /* @__PURE__ */ jsxRuntime.jsx("button", { onClick: handleOnClose, children: "X" }) }),
|
|
62
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "modal-content", children })
|
|
63
|
-
] })
|
|
64
|
-
}
|
|
65
|
-
);
|
|
66
|
-
};
|
|
67
|
-
var Modal_default = Modal;
|
|
68
32
|
var ModalProvider = ({ children }) => {
|
|
33
|
+
var _a;
|
|
69
34
|
const [modalContent, setModalContent] = react.useState(null);
|
|
70
|
-
const
|
|
71
|
-
const
|
|
35
|
+
const [displayModal, setDisplayModal] = react.useState(false);
|
|
36
|
+
const [title, setTitle] = react.useState("");
|
|
37
|
+
const [options, setOptions] = react.useState({});
|
|
38
|
+
const showModal = (content, title2, opts) => {
|
|
39
|
+
setModalContent(content);
|
|
40
|
+
setTitle(title2);
|
|
41
|
+
setOptions(opts != null ? opts : {});
|
|
42
|
+
setDisplayModal(true);
|
|
43
|
+
};
|
|
44
|
+
const hideModal = () => {
|
|
45
|
+
setDisplayModal(false);
|
|
46
|
+
};
|
|
72
47
|
return /* @__PURE__ */ jsxRuntime.jsxs(ModalContext.Provider, { value: { showModal, hideModal }, children: [
|
|
73
48
|
children,
|
|
74
|
-
|
|
49
|
+
/* @__PURE__ */ jsxRuntime.jsxs(Dialog__default.default, { open: displayModal, onClose: hideModal, sx: { height: "85%" }, children: [
|
|
50
|
+
/* @__PURE__ */ jsxRuntime.jsxs(material.Box, { children: [
|
|
51
|
+
/* @__PURE__ */ jsxRuntime.jsx(DialogTitle__default.default, { sx: { marginRight: "20px", minWidth: "400px" }, children: title }),
|
|
52
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
53
|
+
IconButton__default.default,
|
|
54
|
+
{
|
|
55
|
+
"aria-label": "close",
|
|
56
|
+
onClick: hideModal,
|
|
57
|
+
sx: { position: "absolute", right: 8, top: 8 },
|
|
58
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(CloseIcon__default.default, {})
|
|
59
|
+
}
|
|
60
|
+
)
|
|
61
|
+
] }),
|
|
62
|
+
/* @__PURE__ */ jsxRuntime.jsx(DialogContent__default.default, { sx: { paddingTop: 0 }, children: modalContent }),
|
|
63
|
+
(options.acceptText || options.onAccept) && /* @__PURE__ */ jsxRuntime.jsxs(DialogActions__default.default, { children: [
|
|
64
|
+
/* @__PURE__ */ jsxRuntime.jsx(Button__default.default, { variant: "contained", onClick: () => {
|
|
65
|
+
var _a2;
|
|
66
|
+
hideModal();
|
|
67
|
+
(_a2 = options.onAccept) == null ? void 0 : _a2.call(options);
|
|
68
|
+
}, children: (_a = options.acceptText) != null ? _a : "OK" }),
|
|
69
|
+
/* @__PURE__ */ jsxRuntime.jsx(Button__default.default, { onClick: () => {
|
|
70
|
+
var _a2;
|
|
71
|
+
hideModal();
|
|
72
|
+
(_a2 = options.onCancel) == null ? void 0 : _a2.call(options);
|
|
73
|
+
}, children: "Cancel" })
|
|
74
|
+
] })
|
|
75
|
+
] })
|
|
75
76
|
] });
|
|
76
77
|
};
|
|
77
78
|
var ModalProvider_default = ModalProvider;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/TablePage/ModalProvider/ModalContext.ts","../../../src/components/
|
|
1
|
+
{"version":3,"sources":["../../../src/components/TablePage/ModalProvider/ModalContext.ts","../../../src/components/TablePage/ModalProvider/ModalProvider.tsx"],"names":["createContext","useContext","useState","title","jsxs","Dialog","Box","jsx","DialogTitle","IconButton","CloseIcon","DialogContent","DialogActions","Button","_a"],"mappings":"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","file":"index.cjs","sourcesContent":["\"use client\"\r\nimport { createContext, ReactNode, useContext } from \"react\";\r\n\r\nexport type ModalOptions = {\r\n acceptText?: string;\r\n onAccept?: () => void;\r\n onCancel?: () => void;\r\n}\r\n\r\ntype ModalContextType = {\r\n showModal: (content: ReactNode, title: string, options?: ModalOptions) => void;\r\n hideModal: () => void;\r\n}\r\n\r\nexport const ModalContext = createContext<ModalContextType>({\r\n showModal: () => {},\r\n hideModal: () => {},\r\n});\r\n\r\nexport const useModal = () => useContext(ModalContext);","\"use client\";\r\n\r\nimport React, { ReactNode, useState } from \"react\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogActions from \"@mui/material/DialogActions\";\r\nimport Button from \"@mui/material/Button\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport { ModalContext, ModalOptions } from '@/components';\r\nimport {Box} from \"@mui/material\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\n\r\ntype ModalProviderProps = {\r\n children: ReactNode;\r\n}\r\n\r\nexport const ModalProvider = ({ children }: ModalProviderProps) => {\r\n const [modalContent, setModalContent] = useState<null | ReactNode>(null);\r\n const [displayModal, setDisplayModal] = useState(false);\r\n const [title, setTitle] = useState(\"\");\r\n const [options, setOptions] = useState<ModalOptions>({});\r\n\r\n const showModal = (content: ReactNode, title: string, opts?: ModalOptions) => {\r\n setModalContent(content);\r\n setTitle(title);\r\n setOptions(opts ?? {});\r\n setDisplayModal(true);\r\n }\r\n const hideModal = () => {\r\n setDisplayModal(false);\r\n };\r\n\r\n return (\r\n <ModalContext.Provider value={{ showModal, hideModal }}>\r\n {children}\r\n <Dialog open={displayModal} onClose={hideModal} sx={{height: \"85%\"}}>\r\n <Box>\r\n <DialogTitle sx={{marginRight: '20px', minWidth: '400px'}}>{title}</DialogTitle>\r\n <IconButton\r\n aria-label=\"close\"\r\n onClick={hideModal}\r\n sx={{ position: 'absolute', right: 8, top: 8 }}\r\n >\r\n <CloseIcon />\r\n </IconButton>\r\n </Box>\r\n <DialogContent sx={{paddingTop: 0}}>\r\n {modalContent}\r\n </DialogContent>\r\n {(options.acceptText || options.onAccept) && (\r\n <DialogActions>\r\n <Button variant=\"contained\" onClick={() => { hideModal(); options.onAccept?.(); }}>\r\n {options.acceptText ?? \"OK\"}\r\n </Button>\r\n <Button onClick={() => { hideModal(); options.onCancel?.(); }}>Cancel</Button>\r\n </DialogActions>\r\n )}\r\n </Dialog>\r\n </ModalContext.Provider>\r\n );\r\n}\r\n\r\nexport default ModalProvider;"]}
|
|
@@ -1,75 +1,66 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { createContext, useContext, useState
|
|
2
|
+
import { createContext, useContext, useState } from 'react';
|
|
3
|
+
import Dialog from '@mui/material/Dialog';
|
|
4
|
+
import DialogContent from '@mui/material/DialogContent';
|
|
5
|
+
import DialogActions from '@mui/material/DialogActions';
|
|
6
|
+
import Button from '@mui/material/Button';
|
|
7
|
+
import IconButton from '@mui/material/IconButton';
|
|
8
|
+
import CloseIcon from '@mui/icons-material/Close';
|
|
9
|
+
import { Box } from '@mui/material';
|
|
10
|
+
import DialogTitle from '@mui/material/DialogTitle';
|
|
3
11
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
4
12
|
|
|
5
13
|
var ModalContext = createContext({
|
|
6
|
-
showModal: (
|
|
14
|
+
showModal: () => {
|
|
7
15
|
},
|
|
8
16
|
hideModal: () => {
|
|
9
17
|
}
|
|
10
18
|
});
|
|
11
19
|
var useModal = () => useContext(ModalContext);
|
|
12
|
-
var Modal = ({ onClose, children }) => {
|
|
13
|
-
const modalRef = useRef(null);
|
|
14
|
-
const previouslyFocusedElement = useRef(null);
|
|
15
|
-
useEffect(() => {
|
|
16
|
-
var _a;
|
|
17
|
-
if (children) {
|
|
18
|
-
previouslyFocusedElement.current = document.activeElement;
|
|
19
|
-
(_a = modalRef.current) == null ? void 0 : _a.focus();
|
|
20
|
-
}
|
|
21
|
-
return () => {
|
|
22
|
-
var _a2;
|
|
23
|
-
(_a2 = previouslyFocusedElement.current) == null ? void 0 : _a2.focus();
|
|
24
|
-
};
|
|
25
|
-
}, [children]);
|
|
26
|
-
const handleOnClose = () => {
|
|
27
|
-
onClose();
|
|
28
|
-
};
|
|
29
|
-
const handleKeyDown = (e) => {
|
|
30
|
-
var _a;
|
|
31
|
-
if (e.key !== "Tab") return;
|
|
32
|
-
const focusableElements = (_a = modalRef.current) == null ? void 0 : _a.querySelectorAll(
|
|
33
|
-
'button, [tabindex]:not([tabindex="-1"])'
|
|
34
|
-
);
|
|
35
|
-
if (!focusableElements || focusableElements.length === 0) return;
|
|
36
|
-
const first = focusableElements[0];
|
|
37
|
-
const last = focusableElements[focusableElements.length - 1];
|
|
38
|
-
if (e.shiftKey) {
|
|
39
|
-
if (document.activeElement === first) {
|
|
40
|
-
e.preventDefault();
|
|
41
|
-
last.focus();
|
|
42
|
-
}
|
|
43
|
-
} else {
|
|
44
|
-
if (document.activeElement === last) {
|
|
45
|
-
e.preventDefault();
|
|
46
|
-
first.focus();
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
};
|
|
50
|
-
return /* @__PURE__ */ jsx(
|
|
51
|
-
"div",
|
|
52
|
-
{
|
|
53
|
-
className: "modal-overlay",
|
|
54
|
-
onKeyDown: handleKeyDown,
|
|
55
|
-
ref: modalRef,
|
|
56
|
-
role: "dialog",
|
|
57
|
-
tabIndex: -1,
|
|
58
|
-
children: /* @__PURE__ */ jsxs("div", { className: "modal-container", children: [
|
|
59
|
-
/* @__PURE__ */ jsx("div", { className: "modal-control-strip", children: /* @__PURE__ */ jsx("button", { onClick: handleOnClose, children: "X" }) }),
|
|
60
|
-
/* @__PURE__ */ jsx("div", { className: "modal-content", children })
|
|
61
|
-
] })
|
|
62
|
-
}
|
|
63
|
-
);
|
|
64
|
-
};
|
|
65
|
-
var Modal_default = Modal;
|
|
66
20
|
var ModalProvider = ({ children }) => {
|
|
21
|
+
var _a;
|
|
67
22
|
const [modalContent, setModalContent] = useState(null);
|
|
68
|
-
const
|
|
69
|
-
const
|
|
23
|
+
const [displayModal, setDisplayModal] = useState(false);
|
|
24
|
+
const [title, setTitle] = useState("");
|
|
25
|
+
const [options, setOptions] = useState({});
|
|
26
|
+
const showModal = (content, title2, opts) => {
|
|
27
|
+
setModalContent(content);
|
|
28
|
+
setTitle(title2);
|
|
29
|
+
setOptions(opts != null ? opts : {});
|
|
30
|
+
setDisplayModal(true);
|
|
31
|
+
};
|
|
32
|
+
const hideModal = () => {
|
|
33
|
+
setDisplayModal(false);
|
|
34
|
+
};
|
|
70
35
|
return /* @__PURE__ */ jsxs(ModalContext.Provider, { value: { showModal, hideModal }, children: [
|
|
71
36
|
children,
|
|
72
|
-
|
|
37
|
+
/* @__PURE__ */ jsxs(Dialog, { open: displayModal, onClose: hideModal, sx: { height: "85%" }, children: [
|
|
38
|
+
/* @__PURE__ */ jsxs(Box, { children: [
|
|
39
|
+
/* @__PURE__ */ jsx(DialogTitle, { sx: { marginRight: "20px", minWidth: "400px" }, children: title }),
|
|
40
|
+
/* @__PURE__ */ jsx(
|
|
41
|
+
IconButton,
|
|
42
|
+
{
|
|
43
|
+
"aria-label": "close",
|
|
44
|
+
onClick: hideModal,
|
|
45
|
+
sx: { position: "absolute", right: 8, top: 8 },
|
|
46
|
+
children: /* @__PURE__ */ jsx(CloseIcon, {})
|
|
47
|
+
}
|
|
48
|
+
)
|
|
49
|
+
] }),
|
|
50
|
+
/* @__PURE__ */ jsx(DialogContent, { sx: { paddingTop: 0 }, children: modalContent }),
|
|
51
|
+
(options.acceptText || options.onAccept) && /* @__PURE__ */ jsxs(DialogActions, { children: [
|
|
52
|
+
/* @__PURE__ */ jsx(Button, { variant: "contained", onClick: () => {
|
|
53
|
+
var _a2;
|
|
54
|
+
hideModal();
|
|
55
|
+
(_a2 = options.onAccept) == null ? void 0 : _a2.call(options);
|
|
56
|
+
}, children: (_a = options.acceptText) != null ? _a : "OK" }),
|
|
57
|
+
/* @__PURE__ */ jsx(Button, { onClick: () => {
|
|
58
|
+
var _a2;
|
|
59
|
+
hideModal();
|
|
60
|
+
(_a2 = options.onCancel) == null ? void 0 : _a2.call(options);
|
|
61
|
+
}, children: "Cancel" })
|
|
62
|
+
] })
|
|
63
|
+
] })
|
|
73
64
|
] });
|
|
74
65
|
};
|
|
75
66
|
var ModalProvider_default = ModalProvider;
|