@vicacha-devs/strapi-plugin-events 0.0.0-stage → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +121 -2
  3. package/dist/admin/CalendarPage-CwCvPDRx.js +1215 -0
  4. package/dist/admin/CalendarPage-Dz7g19qp.mjs +1215 -0
  5. package/dist/admin/RRuleInput-BQl-siRj.js +11 -0
  6. package/dist/admin/RRuleInput-C8bR37X9.mjs +6 -0
  7. package/dist/admin/SettingsPage-CNG9AEO_.mjs +415 -0
  8. package/dist/admin/SettingsPage-DhjtKDmY.js +415 -0
  9. package/dist/admin/ar-mMKUXxch.js +216 -0
  10. package/dist/admin/ar-tWKEvJLB.mjs +216 -0
  11. package/dist/admin/de-CGk8UZ3W.js +216 -0
  12. package/dist/admin/de-OdbJEFs0.mjs +216 -0
  13. package/dist/admin/en-Dskn9ZPa.mjs +216 -0
  14. package/dist/admin/en-imdSlLhJ.js +216 -0
  15. package/dist/admin/es-DcMsMHrI.mjs +216 -0
  16. package/dist/admin/es-DkqqxUJQ.js +216 -0
  17. package/dist/admin/fr-BTEIPOFw.mjs +216 -0
  18. package/dist/admin/fr-D92B_ZTv.js +216 -0
  19. package/dist/admin/index-BTq_X4uT.js +1005 -0
  20. package/dist/admin/index-BatOiwBu.mjs +1006 -0
  21. package/dist/admin/index.js +6 -0
  22. package/dist/admin/index.mjs +6 -0
  23. package/dist/admin/it-CAxPpL_9.mjs +216 -0
  24. package/dist/admin/it-ClKaSCgv.js +216 -0
  25. package/dist/admin/nl-CS1aUfT7.mjs +216 -0
  26. package/dist/admin/nl-F6FIi7zw.js +216 -0
  27. package/dist/admin/pl-BfmBU9FW.mjs +216 -0
  28. package/dist/admin/pl-p8VLXi02.js +216 -0
  29. package/dist/admin/pt-BUdH0uSw.js +216 -0
  30. package/dist/admin/pt-DdulKcbk.mjs +216 -0
  31. package/dist/admin/src/components/EventSidePanel.d.ts +13 -0
  32. package/dist/admin/src/components/Initializer.d.ts +5 -0
  33. package/dist/admin/src/components/PluginIcon.d.ts +2 -0
  34. package/dist/admin/src/components/RRuleInput.d.ts +3 -0
  35. package/dist/admin/src/components/events/AttendeesManagerPanel.d.ts +15 -0
  36. package/dist/admin/src/components/events/EventsDirectoryPanel.d.ts +11 -0
  37. package/dist/admin/src/components/events/EventsKpiCards.d.ts +16 -0
  38. package/dist/admin/src/components/events/QuickCreateEventPanel.d.ts +21 -0
  39. package/dist/admin/src/components/events/calendarPageHelpers.d.ts +8 -0
  40. package/dist/admin/src/fields/rruleField.d.ts +41 -0
  41. package/dist/admin/src/index.d.ts +15 -0
  42. package/dist/admin/src/pages/CalendarPage.d.ts +3 -0
  43. package/dist/admin/src/pages/SettingsPage.d.ts +3 -0
  44. package/dist/admin/src/permissions.d.ts +15 -0
  45. package/dist/admin/src/translations/cmLabels.d.ts +1 -0
  46. package/dist/admin/src/translations/cmPlaceholders.d.ts +1 -0
  47. package/dist/admin/tr-Bp50qvL8.mjs +216 -0
  48. package/dist/admin/tr-C7G9mPtg.js +216 -0
  49. package/dist/server/index.js +3709 -0
  50. package/dist/server/index.mjs +3705 -0
  51. package/dist/server/src/bootstrap.d.ts +5 -0
  52. package/dist/server/src/config/index.d.ts +7 -0
  53. package/dist/server/src/content-types/event/schema.json.d.ts +279 -0
  54. package/dist/server/src/content-types/index.d.ts +366 -0
  55. package/dist/server/src/content-types/registration/schema.json.d.ts +86 -0
  56. package/dist/server/src/controllers/admin.d.ts +17 -0
  57. package/dist/server/src/controllers/content-api.d.ts +14 -0
  58. package/dist/server/src/controllers/index.d.ts +28 -0
  59. package/dist/server/src/destroy.d.ts +5 -0
  60. package/dist/server/src/index.d.ts +551 -0
  61. package/dist/server/src/middlewares/index.d.ts +2 -0
  62. package/dist/server/src/policies/index.d.ts +2 -0
  63. package/dist/server/src/register.d.ts +5 -0
  64. package/dist/server/src/routes/admin.d.ts +17 -0
  65. package/dist/server/src/routes/content-api.d.ts +12 -0
  66. package/dist/server/src/routes/index.d.ts +30 -0
  67. package/dist/server/src/services/ical.d.ts +18 -0
  68. package/dist/server/src/services/index.d.ts +110 -0
  69. package/dist/server/src/services/occurrence.d.ts +44 -0
  70. package/dist/server/src/services/occurrenceHelpers.d.ts +16 -0
  71. package/dist/server/src/services/occurrencePayloadHelpers.d.ts +30 -0
  72. package/dist/server/src/services/occurrenceRsvpBatch.d.ts +25 -0
  73. package/dist/server/src/services/rsvp.d.ts +51 -0
  74. package/dist/server/src/services/rsvpHelpers.d.ts +52 -0
  75. package/dist/server/src/services/rsvpMutations.d.ts +34 -0
  76. package/dist/server/src/services/rsvpSecurity.d.ts +22 -0
  77. package/dist/server/src/services/settings.d.ts +10 -0
  78. package/dist/server/src/types.d.ts +171 -0
  79. package/dist/shared/calendarSystems.d.ts +6 -0
  80. package/dist/shared/icalGenerator.d.ts +25 -0
  81. package/dist/shared/index.d.ts +6 -0
  82. package/dist/shared/index.js +753 -0
  83. package/dist/shared/index.mjs +727 -0
  84. package/dist/shared/pluginId.d.ts +4 -0
  85. package/dist/shared/rruleEngine.d.ts +20 -0
  86. package/dist/shared/spotlightHelpers.d.ts +17 -0
  87. package/dist/shared/types.d.ts +309 -0
  88. package/dist/shared/urlAndPosterHelpers.d.ts +18 -0
  89. package/package.json +109 -3
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const strapiAdmin = require("@vicacha-devs/strapi-plugin-calendar/strapi-admin");
4
+ Object.defineProperty(exports, "RRuleInput", {
5
+ enumerable: true,
6
+ get: () => strapiAdmin.RRuleInput
7
+ });
8
+ Object.defineProperty(exports, "default", {
9
+ enumerable: true,
10
+ get: () => strapiAdmin.RRuleInput
11
+ });
@@ -0,0 +1,6 @@
1
+ import { RRuleInput } from "@vicacha-devs/strapi-plugin-calendar/strapi-admin";
2
+ import { RRuleInput as RRuleInput2, RRuleInput as RRuleInput3 } from "@vicacha-devs/strapi-plugin-calendar/strapi-admin";
3
+ export {
4
+ RRuleInput2 as RRuleInput,
5
+ RRuleInput3 as default
6
+ };
@@ -0,0 +1,415 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { Box, Flex, Typography, Button, Tabs, Field, NumberInput, Checkbox, Badge, TextInput } from "@strapi/design-system";
3
+ import { useFetchClient, useNotification, Layouts } from "@strapi/strapi/admin";
4
+ import { useRef, useCallback, useState, useEffect } from "react";
5
+ import { useIntl } from "react-intl";
6
+ import { P as PLUGIN_ID } from "./index-BatOiwBu.mjs";
7
+ const SUB_CARD_BORDER_STYLE = {
8
+ border: "1px solid rgba(128, 128, 128, 0.18)"
9
+ };
10
+ const SettingsPage = () => {
11
+ const { formatMessage } = useIntl();
12
+ const { get, put } = useFetchClient();
13
+ const { toggleNotification } = useNotification();
14
+ const isMountedRef = useRef(true);
15
+ const t = useCallback(
16
+ (id, defaultMessage) => formatMessage({ id: `${PLUGIN_ID}.${id}`, defaultMessage }),
17
+ [formatMessage]
18
+ );
19
+ const [settings, setSettings] = useState(null);
20
+ const [loadError, setLoadError] = useState(false);
21
+ const [saving, setSaving] = useState(false);
22
+ const [savedBanner, setSavedBanner] = useState(null);
23
+ useEffect(() => {
24
+ isMountedRef.current = true;
25
+ return () => {
26
+ isMountedRef.current = false;
27
+ };
28
+ }, []);
29
+ const loadSettings = useCallback(async () => {
30
+ setLoadError(false);
31
+ try {
32
+ const res = await get(
33
+ `/${PLUGIN_ID}/settings`
34
+ );
35
+ if (isMountedRef.current && res?.data?.data) {
36
+ setSettings(res.data.data);
37
+ }
38
+ } catch {
39
+ if (isMountedRef.current) {
40
+ setLoadError(true);
41
+ toggleNotification({
42
+ type: "danger",
43
+ message: t("settings.loadError", "Could not load settings.")
44
+ });
45
+ }
46
+ }
47
+ }, [get, t, toggleNotification]);
48
+ useEffect(() => {
49
+ void loadSettings();
50
+ }, [loadSettings]);
51
+ const handleSave = async () => {
52
+ if (!settings) return;
53
+ setSaving(true);
54
+ setSavedBanner(null);
55
+ try {
56
+ const res = await put(`/${PLUGIN_ID}/settings`, settings);
57
+ if (!isMountedRef.current) return;
58
+ if (res?.data?.data) {
59
+ setSettings(res.data.data);
60
+ }
61
+ const successMsg = t(
62
+ "settings.saved",
63
+ "Events plugin settings saved successfully."
64
+ );
65
+ setSavedBanner(successMsg);
66
+ toggleNotification({ type: "success", message: successMsg });
67
+ } catch {
68
+ if (!isMountedRef.current) return;
69
+ toggleNotification({
70
+ type: "danger",
71
+ message: t("settings.error", "Could not save settings.")
72
+ });
73
+ } finally {
74
+ if (isMountedRef.current) {
75
+ setSaving(false);
76
+ }
77
+ }
78
+ };
79
+ if (!settings) {
80
+ if (loadError) {
81
+ return /* @__PURE__ */ jsx(Layouts.Root, { children: /* @__PURE__ */ jsx(Box, { padding: 6, children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "flex-start", gap: 3, children: [
82
+ /* @__PURE__ */ jsx(Typography, { variant: "omega", textColor: "danger600", children: t("settings.loadError", "Could not load settings.") }),
83
+ /* @__PURE__ */ jsx(Button, { variant: "secondary", onClick: () => void loadSettings(), children: t("common.retry", "Retry") })
84
+ ] }) }) });
85
+ }
86
+ return /* @__PURE__ */ jsx(Layouts.Root, { children: /* @__PURE__ */ jsx(Box, { padding: 6, children: /* @__PURE__ */ jsx(Typography, { variant: "omega", children: t("settings.loading", "Loading Events & RSVP settings...") }) }) });
87
+ }
88
+ return /* @__PURE__ */ jsx(Layouts.Root, { children: /* @__PURE__ */ jsx(Box, { padding: 6, background: "neutral100", children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 5, children: [
89
+ /* @__PURE__ */ jsxs(
90
+ Flex,
91
+ {
92
+ justifyContent: "space-between",
93
+ alignItems: "center",
94
+ wrap: "wrap",
95
+ gap: 3,
96
+ children: [
97
+ /* @__PURE__ */ jsxs(Box, { children: [
98
+ /* @__PURE__ */ jsx(Typography, { variant: "alpha", fontWeight: "bold", children: t("settings.title", "Events & RSVP Settings") }),
99
+ /* @__PURE__ */ jsx(Box, { paddingTop: 1, children: /* @__PURE__ */ jsx(Typography, { variant: "epsilon", textColor: "neutral600", children: t(
100
+ "settings.subtitle",
101
+ "Configure RSVP capacity, waitlist promotion automation, and public iCal (.ics) syndication."
102
+ ) }) })
103
+ ] }),
104
+ /* @__PURE__ */ jsx(Button, { variant: "default", loading: saving, onClick: handleSave, children: t("common.save", "Save Settings") })
105
+ ]
106
+ }
107
+ ),
108
+ savedBanner && /* @__PURE__ */ jsx(Box, { padding: 3, background: "success100", hasRadius: true, children: /* @__PURE__ */ jsx(
109
+ Typography,
110
+ {
111
+ variant: "omega",
112
+ fontWeight: "bold",
113
+ textColor: "success700",
114
+ children: savedBanner
115
+ }
116
+ ) }),
117
+ /* @__PURE__ */ jsxs(Tabs.Root, { defaultValue: "rsvp", children: [
118
+ /* @__PURE__ */ jsxs(
119
+ Tabs.List,
120
+ {
121
+ "aria-label": t("settings.title", "Events & RSVP Settings"),
122
+ children: [
123
+ /* @__PURE__ */ jsx(Tabs.Trigger, { value: "rsvp", children: t(
124
+ "settings.section.rsvp",
125
+ "RSVP, Capacity & Waitlist Automation"
126
+ ) }),
127
+ /* @__PURE__ */ jsx(Tabs.Trigger, { value: "feed", children: t("settings.section.general", "iCal (.ics) Feed & Timezone") })
128
+ ]
129
+ }
130
+ ),
131
+ /* @__PURE__ */ jsx(Tabs.Content, { value: "rsvp", children: /* @__PURE__ */ jsx(
132
+ Box,
133
+ {
134
+ padding: 6,
135
+ background: "neutral0",
136
+ hasRadius: true,
137
+ shadow: "tableShadow",
138
+ style: { borderTopLeftRadius: 0, borderTopRightRadius: 0 },
139
+ children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 4, children: [
140
+ /* @__PURE__ */ jsx(Typography, { variant: "delta", fontWeight: "bold", children: t(
141
+ "settings.section.rsvp",
142
+ "RSVP, Capacity & Waitlist Automation"
143
+ ) }),
144
+ /* @__PURE__ */ jsxs(
145
+ Box,
146
+ {
147
+ style: {
148
+ display: "grid",
149
+ gridTemplateColumns: "repeat(2, minmax(0, 1fr))",
150
+ gap: 16
151
+ },
152
+ children: [
153
+ /* @__PURE__ */ jsxs(
154
+ Field.Root,
155
+ {
156
+ hint: t(
157
+ "settings.defaultCapacityHint",
158
+ "Default seat capacity for newly created RSVP events."
159
+ ),
160
+ children: [
161
+ /* @__PURE__ */ jsx(Field.Label, { children: t(
162
+ "settings.defaultCapacity",
163
+ "Default Event Capacity"
164
+ ) }),
165
+ /* @__PURE__ */ jsx(
166
+ NumberInput,
167
+ {
168
+ placeholder: t(
169
+ "settings.defaultCapacity.placeholder",
170
+ "e.g., 100"
171
+ ),
172
+ value: settings.defaultCapacity ?? 100,
173
+ onValueChange: (val) => setSettings(
174
+ (prev) => prev ? {
175
+ ...prev,
176
+ defaultCapacity: val && val >= 1 ? val : 100
177
+ } : prev
178
+ )
179
+ }
180
+ ),
181
+ /* @__PURE__ */ jsx(Field.Hint, {})
182
+ ]
183
+ }
184
+ ),
185
+ /* @__PURE__ */ jsxs(
186
+ Field.Root,
187
+ {
188
+ hint: t(
189
+ "settings.maxGuestsHint",
190
+ "Maximum number of seats a single RSVP submission may reserve."
191
+ ),
192
+ children: [
193
+ /* @__PURE__ */ jsx(Field.Label, { children: t("settings.maxGuests", "Max Guests per Registration") }),
194
+ /* @__PURE__ */ jsx(
195
+ NumberInput,
196
+ {
197
+ placeholder: t(
198
+ "settings.maxGuests.placeholder",
199
+ "e.g., 5"
200
+ ),
201
+ value: settings.defaultMaxGuestsPerRegistration ?? 5,
202
+ onValueChange: (val) => setSettings(
203
+ (prev) => prev ? {
204
+ ...prev,
205
+ defaultMaxGuestsPerRegistration: val && val >= 1 ? val : 5
206
+ } : prev
207
+ )
208
+ }
209
+ ),
210
+ /* @__PURE__ */ jsx(Field.Hint, {})
211
+ ]
212
+ }
213
+ )
214
+ ]
215
+ }
216
+ ),
217
+ /* @__PURE__ */ jsxs(
218
+ "div",
219
+ {
220
+ style: {
221
+ display: "grid",
222
+ gridTemplateColumns: "repeat(2, minmax(0, 1fr))",
223
+ gap: 16
224
+ },
225
+ children: [
226
+ /* @__PURE__ */ jsxs(
227
+ Box,
228
+ {
229
+ padding: 4,
230
+ background: "neutral100",
231
+ hasRadius: true,
232
+ style: SUB_CARD_BORDER_STYLE,
233
+ children: [
234
+ /* @__PURE__ */ jsx(
235
+ Checkbox,
236
+ {
237
+ checked: settings.waitlistEnabledByDefault,
238
+ onCheckedChange: (checked) => setSettings(
239
+ (prev) => prev ? {
240
+ ...prev,
241
+ waitlistEnabledByDefault: Boolean(checked)
242
+ } : prev
243
+ ),
244
+ children: t(
245
+ "settings.waitlistEnabledByDefault",
246
+ "Enable Waitlist & Automatic Promotion"
247
+ )
248
+ }
249
+ ),
250
+ /* @__PURE__ */ jsx(Box, { paddingTop: 2, children: /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: t(
251
+ "settings.waitlistEnabledByDefaultHint",
252
+ "Automatically promotes waitlisted attendees in FIFO order when a confirmed attendee cancels."
253
+ ) }) })
254
+ ]
255
+ }
256
+ ),
257
+ /* @__PURE__ */ jsxs(
258
+ Box,
259
+ {
260
+ padding: 4,
261
+ background: "neutral100",
262
+ hasRadius: true,
263
+ style: SUB_CARD_BORDER_STYLE,
264
+ children: [
265
+ /* @__PURE__ */ jsx(
266
+ Checkbox,
267
+ {
268
+ checked: settings.sendRsvpEmails,
269
+ onCheckedChange: (checked) => setSettings(
270
+ (prev) => prev ? {
271
+ ...prev,
272
+ sendRsvpEmails: Boolean(checked)
273
+ } : prev
274
+ ),
275
+ children: t(
276
+ "settings.sendRsvpEmails",
277
+ "Send Confirmation & Waitlist Promotion Emails"
278
+ )
279
+ }
280
+ ),
281
+ /* @__PURE__ */ jsx(Box, { paddingTop: 2, children: /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: t(
282
+ "settings.sendRsvpEmailsHint",
283
+ "Dispatches confirmation and waitlist promotion emails via the Strapi Email plugin."
284
+ ) }) })
285
+ ]
286
+ }
287
+ )
288
+ ]
289
+ }
290
+ )
291
+ ] })
292
+ }
293
+ ) }),
294
+ /* @__PURE__ */ jsx(Tabs.Content, { value: "feed", children: /* @__PURE__ */ jsx(
295
+ Box,
296
+ {
297
+ padding: 6,
298
+ background: "neutral0",
299
+ hasRadius: true,
300
+ shadow: "tableShadow",
301
+ style: { borderTopLeftRadius: 0, borderTopRightRadius: 0 },
302
+ children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 4, children: [
303
+ /* @__PURE__ */ jsxs(
304
+ Flex,
305
+ {
306
+ justifyContent: "space-between",
307
+ alignItems: "center",
308
+ wrap: "wrap",
309
+ gap: 2,
310
+ children: [
311
+ /* @__PURE__ */ jsxs(Box, { children: [
312
+ /* @__PURE__ */ jsx(Typography, { variant: "delta", fontWeight: "bold", children: t(
313
+ "settings.section.general",
314
+ "iCal (.ics) Feed & Timezone"
315
+ ) }),
316
+ /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: t(
317
+ "settings.section.generalHint",
318
+ "Default timezone and public iCal (.ics) feed title exported for community calendar subscriptions."
319
+ ) })
320
+ ] }),
321
+ /* @__PURE__ */ jsxs(Badge, { active: true, children: [
322
+ t("settings.badge.timezone", "Timezone"),
323
+ ":",
324
+ " ",
325
+ settings.defaultTimezone || "UTC"
326
+ ] })
327
+ ]
328
+ }
329
+ ),
330
+ /* @__PURE__ */ jsxs(
331
+ Box,
332
+ {
333
+ style: {
334
+ display: "grid",
335
+ gridTemplateColumns: "repeat(2, minmax(0, 1fr))",
336
+ gap: 16
337
+ },
338
+ children: [
339
+ /* @__PURE__ */ jsxs(
340
+ Field.Root,
341
+ {
342
+ hint: t(
343
+ "settings.defaultTimezoneHint",
344
+ "IANA timezone identifier used for event recurrence and iCal exports."
345
+ ),
346
+ children: [
347
+ /* @__PURE__ */ jsx(Field.Label, { children: t(
348
+ "settings.defaultTimezone",
349
+ "Default Timezone (IANA)"
350
+ ) }),
351
+ /* @__PURE__ */ jsx(
352
+ TextInput,
353
+ {
354
+ placeholder: t(
355
+ "settings.defaultTimezone.placeholder",
356
+ "e.g., America/Bogota"
357
+ ),
358
+ value: settings.defaultTimezone ?? "",
359
+ onChange: (e) => {
360
+ const nextVal = e.target.value;
361
+ setSettings(
362
+ (prev) => prev ? { ...prev, defaultTimezone: nextVal } : prev
363
+ );
364
+ }
365
+ }
366
+ ),
367
+ /* @__PURE__ */ jsx(Field.Hint, {})
368
+ ]
369
+ }
370
+ ),
371
+ /* @__PURE__ */ jsxs(
372
+ Field.Root,
373
+ {
374
+ hint: t(
375
+ "settings.feedTitleHint",
376
+ "Calendar name shown when users subscribe in Google, Apple, or Outlook Calendar."
377
+ ),
378
+ children: [
379
+ /* @__PURE__ */ jsx(Field.Label, { children: t(
380
+ "settings.feedTitle",
381
+ "Public iCal (.ics) Feed Title"
382
+ ) }),
383
+ /* @__PURE__ */ jsx(
384
+ TextInput,
385
+ {
386
+ placeholder: t(
387
+ "settings.feedTitle.placeholder",
388
+ "e.g., Events Calendar"
389
+ ),
390
+ value: settings.feedTitle ?? "",
391
+ onChange: (e) => {
392
+ const nextVal = e.target.value;
393
+ setSettings(
394
+ (prev) => prev ? { ...prev, feedTitle: nextVal } : prev
395
+ );
396
+ }
397
+ }
398
+ ),
399
+ /* @__PURE__ */ jsx(Field.Hint, {})
400
+ ]
401
+ }
402
+ )
403
+ ]
404
+ }
405
+ )
406
+ ] })
407
+ }
408
+ ) })
409
+ ] })
410
+ ] }) }) });
411
+ };
412
+ export {
413
+ SettingsPage,
414
+ SettingsPage as default
415
+ };