@vicacha-devs/strapi-plugin-bookings 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 (82) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +23 -2
  3. package/dist/admin/App-BrB9n7EO.mjs +371 -0
  4. package/dist/admin/App-ZlqOsILc.js +371 -0
  5. package/dist/admin/SettingsPage-LR6F2vyx.js +410 -0
  6. package/dist/admin/SettingsPage-Xas3gvn4.mjs +410 -0
  7. package/dist/admin/ar-9_2mxMp2.js +339 -0
  8. package/dist/admin/ar-CrM4yxqb.mjs +339 -0
  9. package/dist/admin/de-D3NbAP6M.mjs +339 -0
  10. package/dist/admin/de-DBaO-D7Z.js +339 -0
  11. package/dist/admin/en-Cu-rn_xM.mjs +339 -0
  12. package/dist/admin/en-DAoI7qkk.js +339 -0
  13. package/dist/admin/es-DUqsu82s.js +339 -0
  14. package/dist/admin/es-Y0zfya4P.mjs +339 -0
  15. package/dist/admin/fr-BkLta_o8.js +339 -0
  16. package/dist/admin/fr-BrzKRqet.mjs +339 -0
  17. package/dist/admin/getTranslation-CZAJyMSt.mjs +5 -0
  18. package/dist/admin/getTranslation-Cd0_4UtW.js +4 -0
  19. package/dist/admin/id-BZz53ViW.mjs +339 -0
  20. package/dist/admin/id-ByxSagzq.js +339 -0
  21. package/dist/admin/index.js +1497 -0
  22. package/dist/admin/index.mjs +1492 -0
  23. package/dist/admin/pt-BSCDUkdd.js +339 -0
  24. package/dist/admin/pt-DUfISuZf.mjs +339 -0
  25. package/dist/admin/src/components/Initializer.d.ts +6 -0
  26. package/dist/admin/src/components/PluginIcon.d.ts +3 -0
  27. package/dist/admin/src/components/RRuleInput.d.ts +3 -0
  28. package/dist/admin/src/components/bookings/BookingSidePanel.d.ts +10 -0
  29. package/dist/admin/src/components/bookings/BookingsGridCanvas.d.ts +20 -0
  30. package/dist/admin/src/components/bookings/QuickCreateBookingModal.d.ts +11 -0
  31. package/dist/admin/src/index.d.ts +24 -0
  32. package/dist/admin/src/pages/App.d.ts +3 -0
  33. package/dist/admin/src/pages/CalendarPage.d.ts +3 -0
  34. package/dist/admin/src/pages/SettingsPage.d.ts +3 -0
  35. package/dist/admin/src/permissions.d.ts +29 -0
  36. package/dist/admin/src/pluginId.d.ts +1 -0
  37. package/dist/admin/src/translations/cmLabels.d.ts +1 -0
  38. package/dist/admin/src/translations/cmPlaceholders.d.ts +1 -0
  39. package/dist/admin/src/utils/getTranslation.d.ts +2 -0
  40. package/dist/admin/tr-_nhc9hk6.mjs +339 -0
  41. package/dist/admin/tr-r17l5F2K.js +339 -0
  42. package/dist/admin/ur-8edBd0Qo.mjs +339 -0
  43. package/dist/admin/ur-Dw_TAOZ3.js +339 -0
  44. package/dist/admin/zh-CeR0swEm.mjs +339 -0
  45. package/dist/admin/zh-D0z5sxxN.js +339 -0
  46. package/dist/server/index.js +3547 -0
  47. package/dist/server/index.mjs +3545 -0
  48. package/dist/server/src/bootstrap.d.ts +6 -0
  49. package/dist/server/src/config/index.d.ts +6 -0
  50. package/dist/server/src/content-types/booking/schema.json.d.ts +117 -0
  51. package/dist/server/src/content-types/index.d.ts +265 -0
  52. package/dist/server/src/content-types/resource/schema.json.d.ts +147 -0
  53. package/dist/server/src/controllers/admin.d.ts +30 -0
  54. package/dist/server/src/controllers/content-api.d.ts +32 -0
  55. package/dist/server/src/controllers/index.d.ts +28 -0
  56. package/dist/server/src/destroy.d.ts +5 -0
  57. package/dist/server/src/errors.d.ts +18 -0
  58. package/dist/server/src/index.d.ts +347 -0
  59. package/dist/server/src/register.d.ts +5 -0
  60. package/dist/server/src/routes/admin.d.ts +14 -0
  61. package/dist/server/src/routes/content-api.d.ts +9 -0
  62. package/dist/server/src/routes/index.d.ts +30 -0
  63. package/dist/server/src/services/availability.d.ts +8 -0
  64. package/dist/server/src/services/index.d.ts +12 -0
  65. package/dist/server/src/services/reservation.d.ts +6 -0
  66. package/dist/server/src/services/reservationHelpers.d.ts +41 -0
  67. package/dist/server/src/services/reservationHostCapacity.d.ts +16 -0
  68. package/dist/server/src/services/reservationMutations.d.ts +32 -0
  69. package/dist/server/src/services/reservationSources.d.ts +4 -0
  70. package/dist/server/src/services/reservationValidators.d.ts +27 -0
  71. package/dist/server/src/services/settings.d.ts +8 -0
  72. package/dist/server/src/types.d.ts +99 -0
  73. package/dist/shared/calendarSystems.d.ts +3 -0
  74. package/dist/shared/icalAndCsv.d.ts +16 -0
  75. package/dist/shared/index.d.ts +6 -0
  76. package/dist/shared/index.js +752 -0
  77. package/dist/shared/index.mjs +729 -0
  78. package/dist/shared/pluginId.d.ts +2 -0
  79. package/dist/shared/slotEngine.d.ts +19 -0
  80. package/dist/shared/slotTimezone.d.ts +45 -0
  81. package/dist/shared/types.d.ts +245 -0
  82. package/package.json +111 -3
@@ -0,0 +1,1492 @@
1
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
+ import { Box, Flex, Typography, Badge, Button, Divider, Field, SingleSelect, SingleSelectOption, TextInput, Textarea, NumberInput } from "@strapi/design-system";
3
+ import React, { useState, useEffect, useRef } from "react";
4
+ import { Calendar } from "@strapi/icons";
5
+ import { RRuleInput } from "@vicacha-devs/strapi-plugin-calendar/strapi-admin";
6
+ const __variableDynamicImportRuntimeHelper = (glob, path, segs) => {
7
+ const v = glob[path];
8
+ if (v) {
9
+ return typeof v === "function" ? v() : Promise.resolve(v);
10
+ }
11
+ return new Promise((_, reject) => {
12
+ (typeof queueMicrotask === "function" ? queueMicrotask : setTimeout)(
13
+ reject.bind(
14
+ null,
15
+ new Error(
16
+ "Unknown variable dynamic import: " + path + (path.split("/").length !== segs ? ". Note that variables only represent file names one level deep." : "")
17
+ )
18
+ )
19
+ );
20
+ });
21
+ };
22
+ function freezeOptions(items) {
23
+ return Object.freeze(items.map((item) => Object.freeze({ ...item })));
24
+ }
25
+ freezeOptions([
26
+ { value: "es", label: "es — Español (Spanish)" },
27
+ { value: "en", label: "en — English" },
28
+ { value: "ar", label: "ar — العربية (Arabic)" },
29
+ { value: "tr", label: "tr — Türkçe (Turkish)" },
30
+ { value: "fr", label: "fr — Français (French)" },
31
+ { value: "de", label: "de — Deutsch (German)" },
32
+ { value: "pt", label: "pt — Português (Portuguese)" },
33
+ { value: "it", label: "it — Italiano (Italian)" },
34
+ { value: "nl", label: "nl — Nederlands (Dutch)" },
35
+ { value: "pl", label: "pl — Polski (Polish)" },
36
+ { value: "ru", label: "ru — Русский (Russian)" },
37
+ { value: "id", label: "id — Bahasa Indonesia" },
38
+ { value: "ur", label: "ur — اردو (Urdu)" },
39
+ { value: "zh", label: "zh — 中文 (Chinese)" }
40
+ ]);
41
+ freezeOptions([
42
+ {
43
+ value: "islamic-umalqura",
44
+ label: "islamic-umalqura (Hijri Umm al-Qura)"
45
+ },
46
+ { value: "islamic-civil", label: "islamic-civil (Tabular Islamic Civil)" },
47
+ { value: "islamic-tbla", label: "islamic-tbla (Tabular Astronomical)" },
48
+ { value: "hebrew", label: "hebrew (Hebrew)" },
49
+ { value: "persian", label: "persian (Solar Hijri)" },
50
+ { value: "none", label: "none (Gregorian Only)" }
51
+ ]);
52
+ const VALID_LOCALE_RE = /^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8}){0,4}$/;
53
+ function isTranslationRecord(value) {
54
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
55
+ }
56
+ function extractDictionary(loaded) {
57
+ if (!isTranslationRecord(loaded)) {
58
+ return void 0;
59
+ }
60
+ if ("default" in loaded) {
61
+ return isTranslationRecord(loaded.default) ? loaded.default : void 0;
62
+ }
63
+ return loaded;
64
+ }
65
+ function getLookupCandidates(locale, fallbackToLanguage) {
66
+ const trimmed = locale.trim();
67
+ if (!VALID_LOCALE_RE.test(trimmed)) {
68
+ return [];
69
+ }
70
+ if (!fallbackToLanguage || !trimmed.includes("-")) {
71
+ return [trimmed];
72
+ }
73
+ const base = trimmed.split("-")[0];
74
+ return base && base !== trimmed ? [trimmed, base] : [trimmed];
75
+ }
76
+ function prefixPluginTranslations(trad, pluginId, options) {
77
+ const normalizedPluginId = typeof pluginId === "string" ? pluginId.trim() : "";
78
+ if (!normalizedPluginId) {
79
+ throw new TypeError("pluginId can't be empty");
80
+ }
81
+ const result = {};
82
+ if (options?.baseTranslations) {
83
+ for (const [key, value] of Object.entries(options.baseTranslations)) {
84
+ if (typeof value === "string") {
85
+ result[key] = value;
86
+ }
87
+ }
88
+ }
89
+ const prefix = `${normalizedPluginId}.`;
90
+ const explicitPrefixed = [];
91
+ for (const [key, value] of Object.entries(trad)) {
92
+ if (typeof value !== "string") {
93
+ continue;
94
+ }
95
+ if (options?.keepUnprefixed) {
96
+ result[key] = value;
97
+ }
98
+ if (key.startsWith(prefix)) {
99
+ explicitPrefixed.push([key, value]);
100
+ } else {
101
+ result[`${prefix}${key}`] = value;
102
+ }
103
+ }
104
+ for (const [key, value] of explicitPrefixed) {
105
+ result[key] = value;
106
+ }
107
+ return result;
108
+ }
109
+ function createRegisterTrads(options) {
110
+ const { pluginId, defaultLocales = ["en", "es", "ar", "tr"], supportedLocales, keepUnprefixed = true, fallbackToLanguageCode = true, loadTranslation, translations, getBaseTranslations, onLoaded } = options;
111
+ const normalizedPluginId = typeof pluginId === "string" ? pluginId.trim() : "";
112
+ if (!normalizedPluginId) {
113
+ throw new TypeError("pluginId can't be empty");
114
+ }
115
+ const supportedSet = supportedLocales ? new Set(supportedLocales) : void 0;
116
+ const effectiveDefaults = supportedSet ? defaultLocales.filter((loc) => getLookupCandidates(loc, fallbackToLanguageCode).some((candidate) => supportedSet.has(candidate))) : defaultLocales;
117
+ return async function registerTrads({ locales = [] } = {}) {
118
+ const allLocales = effectiveDefaults.length > 0 ? Array.from(/* @__PURE__ */ new Set([...locales, ...effectiveDefaults])) : Array.from(new Set(locales));
119
+ return Promise.all(allLocales.map(async (locale) => {
120
+ const candidates = getLookupCandidates(locale, fallbackToLanguageCode);
121
+ if (candidates.length === 0) {
122
+ return { data: {}, locale };
123
+ }
124
+ if (supportedSet && !candidates.some((candidate) => supportedSet.has(candidate))) {
125
+ return { data: {}, locale };
126
+ }
127
+ let rawData;
128
+ for (const candidate of candidates) {
129
+ if (translations && Object.hasOwn(translations, candidate)) {
130
+ rawData = extractDictionary(translations[candidate]);
131
+ if (rawData) {
132
+ break;
133
+ }
134
+ }
135
+ if (loadTranslation) {
136
+ try {
137
+ const loaded = await loadTranslation(candidate);
138
+ rawData = extractDictionary(loaded);
139
+ if (rawData) {
140
+ break;
141
+ }
142
+ } catch {
143
+ }
144
+ }
145
+ }
146
+ const baseTranslations = getBaseTranslations?.(locale);
147
+ const hasBase = Boolean(baseTranslations) && Object.keys(baseTranslations).length > 0;
148
+ if (!rawData && !hasBase) {
149
+ return { data: {}, locale };
150
+ }
151
+ const prefixed = prefixPluginTranslations(rawData ?? {}, normalizedPluginId, {
152
+ keepUnprefixed,
153
+ baseTranslations
154
+ });
155
+ onLoaded?.(locale, prefixed);
156
+ return { data: prefixed, locale };
157
+ }));
158
+ };
159
+ }
160
+ function maskEmailForPreview(email) {
161
+ const parts = email.split("@");
162
+ if (parts.length !== 2) return "***";
163
+ const [local, domain] = parts;
164
+ const visible = local.slice(0, 2);
165
+ return `${visible}***@${domain}`;
166
+ }
167
+ const BookingsGridCanvas = ({
168
+ t,
169
+ bookings,
170
+ onSelectBooking
171
+ }) => {
172
+ return /* @__PURE__ */ jsx(Box, { background: "neutral0", hasRadius: true, shadow: "tableShadow", padding: 4, children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 3, children: [
173
+ /* @__PURE__ */ jsx(Typography, { variant: "delta", tag: "h3", children: t("listTitle", "Reservations & Bookings Ledger") }),
174
+ bookings.length === 0 ? /* @__PURE__ */ jsx(Typography, { variant: "omega", textColor: "neutral600", children: t("empty", "No bookings found for the selected filters.") }) : bookings.map((b) => /* @__PURE__ */ jsx(
175
+ Box,
176
+ {
177
+ padding: 3,
178
+ background: "neutral100",
179
+ hasRadius: true,
180
+ children: /* @__PURE__ */ jsxs(
181
+ Flex,
182
+ {
183
+ justifyContent: "space-between",
184
+ alignItems: "center",
185
+ wrap: "wrap",
186
+ gap: 2,
187
+ children: [
188
+ /* @__PURE__ */ jsxs(Flex, { gap: 3, alignItems: "center", wrap: "wrap", children: [
189
+ /* @__PURE__ */ jsx(Badge, { children: b.bookingCode }),
190
+ /* @__PURE__ */ jsx(Typography, { variant: "omega", fontWeight: "bold", children: b.customerName }),
191
+ b.customerEmail && /* @__PURE__ */ jsxs(Typography, { variant: "pi", textColor: "neutral600", children: [
192
+ "(",
193
+ maskEmailForPreview(b.customerEmail),
194
+ ")"
195
+ ] }),
196
+ b.resourceName && /* @__PURE__ */ jsx(Badge, { backgroundColor: "primary100", textColor: "primary700", children: b.resourceName }),
197
+ b.assignedHost && /* @__PURE__ */ jsx(
198
+ Badge,
199
+ {
200
+ backgroundColor: "secondary100",
201
+ textColor: "secondary700",
202
+ children: b.assignedHost
203
+ }
204
+ ),
205
+ /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: b.startDate.slice(0, 16).replace("T", " ") }),
206
+ /* @__PURE__ */ jsxs(
207
+ Badge,
208
+ {
209
+ backgroundColor: b.status === "confirmed" ? "success100" : b.status === "pending" ? "warning100" : "neutral200",
210
+ textColor: b.status === "confirmed" ? "success700" : b.status === "pending" ? "warning700" : "neutral700",
211
+ children: [
212
+ t(`page.ui.${b.status}`, b.status.toUpperCase()),
213
+ " (",
214
+ b.partySize,
215
+ ")"
216
+ ]
217
+ }
218
+ )
219
+ ] }),
220
+ /* @__PURE__ */ jsx(
221
+ Button,
222
+ {
223
+ size: "S",
224
+ variant: "secondary",
225
+ onClick: () => onSelectBooking(b),
226
+ children: t("inspect", "Inspect")
227
+ }
228
+ )
229
+ ]
230
+ }
231
+ )
232
+ },
233
+ b.documentId
234
+ ))
235
+ ] }) });
236
+ };
237
+ const BOOKING_STATUSES = [
238
+ "pending",
239
+ "confirmed",
240
+ "completed",
241
+ "cancelled",
242
+ "no_show"
243
+ ];
244
+ const BookingDetailsSection = ({ t, booking }) => /* @__PURE__ */ jsxs(Fragment, { children: [
245
+ /* @__PURE__ */ jsxs(Flex, { gap: 2, wrap: "wrap", children: [
246
+ booking.resourceName && /* @__PURE__ */ jsx(Badge, { backgroundColor: "primary100", textColor: "primary700", children: booking.resourceName }),
247
+ /* @__PURE__ */ jsxs(Badge, { children: [
248
+ t("panel.partySize", "Party Size"),
249
+ ": ",
250
+ booking.partySize
251
+ ] }),
252
+ booking.preferredLanguage && /* @__PURE__ */ jsxs(Badge, { children: [
253
+ t("panel.language", "Lang"),
254
+ ":",
255
+ " ",
256
+ booking.preferredLanguage.toUpperCase()
257
+ ] })
258
+ ] }),
259
+ /* @__PURE__ */ jsx(Divider, {}),
260
+ /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 2, children: [
261
+ /* @__PURE__ */ jsx(Typography, { variant: "sigma", textColor: "neutral600", children: t("panel.schedule", "Schedule") }),
262
+ /* @__PURE__ */ jsxs(Typography, { variant: "omega", children: [
263
+ booking.startDate.slice(0, 16).replace("T", " "),
264
+ " →",
265
+ " ",
266
+ booking.endDate.slice(0, 16).replace("T", " "),
267
+ " (",
268
+ booking.timezone,
269
+ ")"
270
+ ] }),
271
+ booking.slotLabel && /* @__PURE__ */ jsxs(Typography, { variant: "pi", textColor: "neutral600", children: [
272
+ t("panel.slotLabel", "Slot"),
273
+ ": ",
274
+ booking.slotLabel
275
+ ] })
276
+ ] }),
277
+ /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 2, children: [
278
+ /* @__PURE__ */ jsx(Typography, { variant: "sigma", textColor: "neutral600", children: t("panel.customer", "Customer Details") }),
279
+ /* @__PURE__ */ jsx(Typography, { variant: "omega", fontWeight: "bold", children: booking.customerName }),
280
+ booking.organization && /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: booking.organization }),
281
+ /* @__PURE__ */ jsx(Typography, { variant: "pi", children: booking.customerEmail }),
282
+ booking.customerPhone && /* @__PURE__ */ jsx(Typography, { variant: "pi", children: booking.customerPhone }),
283
+ booking.notes && /* @__PURE__ */ jsx(Box, { padding: 2, background: "neutral100", hasRadius: true, children: /* @__PURE__ */ jsx(Typography, { variant: "pi", children: booking.notes }) })
284
+ ] })
285
+ ] });
286
+ const BookingSidePanel = ({
287
+ t,
288
+ booking,
289
+ onClose,
290
+ onUpdateStatus,
291
+ onOpenInContentManager
292
+ }) => {
293
+ const [status, setStatus] = useState(
294
+ booking?.status ?? "pending"
295
+ );
296
+ const [assignedHost, setAssignedHost] = useState(
297
+ booking?.assignedHost ?? ""
298
+ );
299
+ const [internalNotes, setInternalNotes] = useState(
300
+ booking?.internalNotes ?? ""
301
+ );
302
+ const [saving, setSaving] = useState(false);
303
+ React.useEffect(() => {
304
+ if (booking) {
305
+ setStatus(booking.status);
306
+ setAssignedHost(booking.assignedHost ?? "");
307
+ setInternalNotes(booking.internalNotes ?? "");
308
+ }
309
+ }, [booking]);
310
+ if (!booking) {
311
+ return null;
312
+ }
313
+ const handleSave = async () => {
314
+ setSaving(true);
315
+ try {
316
+ await onUpdateStatus(
317
+ booking.documentId,
318
+ status,
319
+ assignedHost.trim() || void 0,
320
+ internalNotes.trim() || void 0
321
+ );
322
+ } finally {
323
+ setSaving(false);
324
+ }
325
+ };
326
+ return /* @__PURE__ */ jsx(
327
+ Box,
328
+ {
329
+ background: "neutral0",
330
+ hasRadius: true,
331
+ shadow: "filterShadow",
332
+ padding: 5,
333
+ style: { minWidth: "340px", maxWidth: "420px" },
334
+ children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 4, children: [
335
+ /* @__PURE__ */ jsxs(Flex, { justifyContent: "space-between", alignItems: "center", children: [
336
+ /* @__PURE__ */ jsx(Badge, { children: booking.bookingCode }),
337
+ /* @__PURE__ */ jsx(Button, { variant: "tertiary", size: "S", onClick: onClose, children: t("panel.close", "Close") })
338
+ ] }),
339
+ /* @__PURE__ */ jsx(Typography, { variant: "delta", tag: "h3", children: booking.title || booking.customerName }),
340
+ /* @__PURE__ */ jsx(BookingDetailsSection, { t, booking }),
341
+ /* @__PURE__ */ jsx(Divider, {}),
342
+ /* @__PURE__ */ jsxs(Field.Root, { children: [
343
+ /* @__PURE__ */ jsx(Field.Label, { children: t("panel.status", "Booking Status") }),
344
+ /* @__PURE__ */ jsx(
345
+ SingleSelect,
346
+ {
347
+ placeholder: t(
348
+ "placeholder.select_booking_status",
349
+ "Select booking status"
350
+ ),
351
+ value: status,
352
+ onChange: (val) => setStatus(String(val)),
353
+ children: BOOKING_STATUSES.map((st) => /* @__PURE__ */ jsx(SingleSelectOption, { value: st, children: t(`page.ui.${st}`, st.toUpperCase()) }, st))
354
+ }
355
+ )
356
+ ] }),
357
+ /* @__PURE__ */ jsxs(Field.Root, { children: [
358
+ /* @__PURE__ */ jsx(Field.Label, { children: t("panel.assignedHost", "Assigned Staff / Host") }),
359
+ /* @__PURE__ */ jsx(
360
+ TextInput,
361
+ {
362
+ placeholder: t(
363
+ "placeholder.assign_guide_or_host",
364
+ "Assign guide or host..."
365
+ ),
366
+ value: assignedHost,
367
+ onChange: (e) => setAssignedHost(e.target.value)
368
+ }
369
+ )
370
+ ] }),
371
+ /* @__PURE__ */ jsxs(Field.Root, { children: [
372
+ /* @__PURE__ */ jsx(Field.Label, { children: t("panel.internalNotes", "Internal Notes") }),
373
+ /* @__PURE__ */ jsx(
374
+ Textarea,
375
+ {
376
+ placeholder: t(
377
+ "placeholder.internal_staff_notes",
378
+ "Internal staff notes..."
379
+ ),
380
+ value: internalNotes,
381
+ onChange: (e) => setInternalNotes(e.target.value)
382
+ }
383
+ )
384
+ ] }),
385
+ /* @__PURE__ */ jsxs(Flex, { gap: 2, justifyContent: "space-between", wrap: "wrap", children: [
386
+ /* @__PURE__ */ jsx(Button, { variant: "default", loading: saving, onClick: handleSave, children: t("panel.save", "Save Changes") }),
387
+ /* @__PURE__ */ jsx(
388
+ Button,
389
+ {
390
+ variant: "secondary",
391
+ onClick: () => onOpenInContentManager(booking),
392
+ children: t("panel.openEntry", "Open in Content Manager")
393
+ }
394
+ )
395
+ ] })
396
+ ] })
397
+ }
398
+ );
399
+ };
400
+ const WEEKDAY_TO_KEY = {
401
+ Sun: "0",
402
+ Mon: "1",
403
+ Tue: "2",
404
+ Wed: "3",
405
+ Thu: "4",
406
+ Fri: "5",
407
+ Sat: "6"
408
+ };
409
+ const formatterCache = /* @__PURE__ */ new Map();
410
+ function getZonedFormatter(timeZone) {
411
+ const cached = formatterCache.get(timeZone);
412
+ if (cached) return cached;
413
+ const dtf = new Intl.DateTimeFormat("en-US", {
414
+ timeZone,
415
+ year: "numeric",
416
+ month: "2-digit",
417
+ day: "2-digit",
418
+ weekday: "short",
419
+ hour: "2-digit",
420
+ minute: "2-digit",
421
+ second: "2-digit",
422
+ hourCycle: "h23"
423
+ });
424
+ if (formatterCache.size > 128) {
425
+ formatterCache.clear();
426
+ }
427
+ formatterCache.set(timeZone, dtf);
428
+ return dtf;
429
+ }
430
+ function normalizeTimeZone(tz) {
431
+ const trimmed = typeof tz === "string" ? tz.trim() : "";
432
+ if (!trimmed) return "UTC";
433
+ try {
434
+ getZonedFormatter(trimmed);
435
+ return trimmed;
436
+ } catch {
437
+ return "UTC";
438
+ }
439
+ }
440
+ function pad2(n) {
441
+ return String(n).padStart(2, "0");
442
+ }
443
+ function extractZonedWallClock(epochMs, rawTimeZone) {
444
+ const timeZone = normalizeTimeZone(rawTimeZone);
445
+ const dtf = getZonedFormatter(timeZone);
446
+ const parts = dtf.formatToParts(new Date(epochMs));
447
+ let year = 1970;
448
+ let month = 1;
449
+ let day = 1;
450
+ let hours = 0;
451
+ let minutes = 0;
452
+ let seconds = 0;
453
+ let dayKey = "4";
454
+ for (const part of parts) {
455
+ if (part.type === "year") year = Number.parseInt(part.value, 10);
456
+ else if (part.type === "month") month = Number.parseInt(part.value, 10);
457
+ else if (part.type === "day") day = Number.parseInt(part.value, 10);
458
+ else if (part.type === "hour") {
459
+ const h = Number.parseInt(part.value, 10);
460
+ hours = h === 24 ? 0 : h;
461
+ } else if (part.type === "minute") {
462
+ minutes = Number.parseInt(part.value, 10);
463
+ } else if (part.type === "second") {
464
+ seconds = Number.parseInt(part.value, 10);
465
+ } else if (part.type === "weekday") {
466
+ dayKey = WEEKDAY_TO_KEY[part.value] ?? "0";
467
+ }
468
+ }
469
+ const dateStr = `${String(year).padStart(4, "0")}-${pad2(month)}-${pad2(day)}`;
470
+ const ms = (epochMs % 1e3 + 1e3) % 1e3;
471
+ return {
472
+ year,
473
+ month,
474
+ day,
475
+ dateStr,
476
+ dayKey,
477
+ hours,
478
+ minutes,
479
+ seconds,
480
+ ms,
481
+ minutesOfDay: hours * 60 + minutes
482
+ };
483
+ }
484
+ function getTimeZoneOffsetMs(instantMs, timeZone) {
485
+ const parts = extractZonedWallClock(instantMs, timeZone);
486
+ const zonedAsUtcMs = Date.UTC(
487
+ parts.year,
488
+ parts.month - 1,
489
+ parts.day,
490
+ parts.hours,
491
+ parts.minutes,
492
+ parts.seconds,
493
+ 0
494
+ );
495
+ const truncatedInstant = Math.floor(instantMs / 1e3) * 1e3;
496
+ return zonedAsUtcMs - truncatedInstant;
497
+ }
498
+ function parseIsoDateYmd(dateStr) {
499
+ const match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(dateStr.trim());
500
+ if (!match) return null;
501
+ const year = Number.parseInt(match[1], 10);
502
+ const month = Number.parseInt(match[2], 10);
503
+ const day = Number.parseInt(match[3], 10);
504
+ if (month < 1 || month > 12 || day < 1 || day > 31) return null;
505
+ const check = new Date(Date.UTC(year, month - 1, day));
506
+ if (check.getUTCFullYear() !== year || check.getUTCMonth() !== month - 1 || check.getUTCDate() !== day) {
507
+ return null;
508
+ }
509
+ return { year, month, day };
510
+ }
511
+ function wallClockToUtcMs(dateStr, totalMinutes, rawTimeZone, strictGap = false) {
512
+ const ymd = parseIsoDateYmd(dateStr);
513
+ if (!ymd) return null;
514
+ const timeZone = normalizeTimeZone(rawTimeZone);
515
+ const extraDays = Math.floor(totalMinutes / 1440);
516
+ const remMins = (totalMinutes % 1440 + 1440) % 1440;
517
+ const targetUtcMidnight = Date.UTC(
518
+ ymd.year,
519
+ ymd.month - 1,
520
+ ymd.day + extraDays,
521
+ 0,
522
+ 0,
523
+ 0,
524
+ 0
525
+ );
526
+ const naiveUtcMs = targetUtcMidnight + remMins * 6e4;
527
+ const offset1 = getTimeZoneOffsetMs(naiveUtcMs, timeZone);
528
+ const guess1 = naiveUtcMs - offset1;
529
+ const offset2 = getTimeZoneOffsetMs(guess1, timeZone);
530
+ const guess2 = naiveUtcMs - offset2;
531
+ const targetDateObj = new Date(targetUtcMidnight);
532
+ const expectedDateStr = targetDateObj.toISOString().slice(0, 10);
533
+ const check2 = extractZonedWallClock(guess2, timeZone);
534
+ if (check2.dateStr === expectedDateStr && check2.minutesOfDay === remMins) {
535
+ return guess2;
536
+ }
537
+ const check1 = extractZonedWallClock(guess1, timeZone);
538
+ if (check1.dateStr === expectedDateStr && check1.minutesOfDay === remMins) {
539
+ return guess1;
540
+ }
541
+ return strictGap ? null : guess1;
542
+ }
543
+ function parseTimeMinutes(hhmm) {
544
+ const match = /^(\d{1,2}):(\d{2})$/.exec(hhmm.trim());
545
+ if (!match) return 9 * 60;
546
+ const hours = Number.parseInt(match[1], 10);
547
+ const minutes = Number.parseInt(match[2], 10);
548
+ if (hours === 24 && minutes === 0) return 1440;
549
+ const clampedH = Math.min(23, Math.max(0, hours));
550
+ const clampedM = Math.min(59, Math.max(0, minutes));
551
+ return clampedH * 60 + clampedM;
552
+ }
553
+ function optionalTrimmed(value) {
554
+ const trimmed = value.trim();
555
+ return trimmed.length > 0 ? trimmed : void 0;
556
+ }
557
+ const QuickCreateBookingModal = ({ t, isOpen, initialStartIso, resources, onClose, onSubmit }) => {
558
+ const [resourceDocumentId, setResourceDocumentId] = useState(
559
+ resources[0]?.documentId ?? ""
560
+ );
561
+ const [customerName, setCustomerName] = useState("");
562
+ const [customerEmail, setCustomerEmail] = useState("");
563
+ const [customerPhone, setCustomerPhone] = useState("");
564
+ const [organization, setOrganization] = useState("");
565
+ const [bookingDate, setBookingDate] = useState(initialStartIso.slice(0, 10));
566
+ const [bookingTime, setBookingTime] = useState(
567
+ initialStartIso.includes("T") ? initialStartIso.slice(11, 16) : "09:00"
568
+ );
569
+ const [partySize, setPartySize] = useState(1);
570
+ const [preferredLanguage, setPreferredLanguage] = useState("es");
571
+ const [assignedHost, setAssignedHost] = useState("");
572
+ const [notes, setNotes] = useState("");
573
+ const [saving, setSaving] = useState(false);
574
+ useEffect(() => {
575
+ setBookingDate(initialStartIso.slice(0, 10));
576
+ setBookingTime(
577
+ initialStartIso.includes("T") ? initialStartIso.slice(11, 16) : "09:00"
578
+ );
579
+ if (!resourceDocumentId && resources[0]?.documentId) {
580
+ setResourceDocumentId(resources[0].documentId);
581
+ }
582
+ }, [initialStartIso, resources, resourceDocumentId]);
583
+ useEffect(() => {
584
+ if (!isOpen) return void 0;
585
+ const handleKeyDown = (event) => {
586
+ if (event.key === "Escape") {
587
+ onClose();
588
+ }
589
+ };
590
+ window.addEventListener("keydown", handleKeyDown);
591
+ return () => {
592
+ window.removeEventListener("keydown", handleKeyDown);
593
+ };
594
+ }, [isOpen, onClose]);
595
+ if (!isOpen) {
596
+ return null;
597
+ }
598
+ const handleCreate = async () => {
599
+ const trimmedName = optionalTrimmed(customerName);
600
+ const trimmedEmail = optionalTrimmed(customerEmail);
601
+ if (!trimmedName || !trimmedEmail || !bookingDate) {
602
+ return;
603
+ }
604
+ const selectedResource = resources.find(
605
+ (r) => r.documentId === resourceDocumentId
606
+ );
607
+ const targetTz = selectedResource?.timezone ?? "UTC";
608
+ const startMins = parseTimeMinutes(bookingTime || "09:00");
609
+ const startEpochMs = wallClockToUtcMs(
610
+ bookingDate,
611
+ startMins,
612
+ targetTz,
613
+ false
614
+ );
615
+ if (startEpochMs === null) {
616
+ return;
617
+ }
618
+ setSaving(true);
619
+ try {
620
+ const startIso = new Date(startEpochMs).toISOString();
621
+ await onSubmit({
622
+ resourceDocumentId: optionalTrimmed(resourceDocumentId),
623
+ customerName: trimmedName,
624
+ customerEmail: trimmedEmail,
625
+ customerPhone: optionalTrimmed(customerPhone),
626
+ organization: optionalTrimmed(organization),
627
+ startDate: startIso,
628
+ timezone: targetTz,
629
+ partySize: Math.max(1, Math.trunc(partySize)),
630
+ preferredLanguage: optionalTrimmed(preferredLanguage),
631
+ assignedHost: optionalTrimmed(assignedHost),
632
+ notes: optionalTrimmed(notes)
633
+ });
634
+ setCustomerName("");
635
+ setCustomerEmail("");
636
+ setCustomerPhone("");
637
+ setOrganization("");
638
+ setNotes("");
639
+ onClose();
640
+ } catch {
641
+ } finally {
642
+ setSaving(false);
643
+ }
644
+ };
645
+ return /* @__PURE__ */ jsx(
646
+ "div",
647
+ {
648
+ role: "dialog",
649
+ "aria-modal": "true",
650
+ "aria-labelledby": "bookings-quick-create-title",
651
+ style: {
652
+ position: "fixed",
653
+ inset: 0,
654
+ zIndex: 1e3,
655
+ backgroundColor: "rgba(15, 23, 42, 0.65)",
656
+ display: "flex",
657
+ alignItems: "center",
658
+ justifyContent: "center",
659
+ padding: 16
660
+ },
661
+ onClick: onClose,
662
+ children: /* @__PURE__ */ jsx(
663
+ Box,
664
+ {
665
+ background: "neutral0",
666
+ hasRadius: true,
667
+ shadow: "popupShadow",
668
+ padding: 6,
669
+ style: {
670
+ width: "100%",
671
+ maxWidth: "580px",
672
+ maxHeight: "90vh",
673
+ overflowY: "auto",
674
+ border: "1px solid rgba(186, 230, 253, 0.5)"
675
+ },
676
+ onClick: (e) => e.stopPropagation(),
677
+ children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 4, children: [
678
+ /* @__PURE__ */ jsxs(Flex, { justifyContent: "space-between", alignItems: "center", children: [
679
+ /* @__PURE__ */ jsxs(Box, { children: [
680
+ /* @__PURE__ */ jsx(
681
+ Typography,
682
+ {
683
+ id: "bookings-quick-create-title",
684
+ variant: "beta",
685
+ tag: "h2",
686
+ children: t("modal.createTitle", "New Reservation / Booking")
687
+ }
688
+ ),
689
+ /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: t(
690
+ "modal.createSubtitle",
691
+ "Enter visitor or group details to schedule a confirmed or pending slot"
692
+ ) })
693
+ ] }),
694
+ /* @__PURE__ */ jsx(
695
+ Button,
696
+ {
697
+ variant: "tertiary",
698
+ size: "S",
699
+ "aria-label": t("panel.close", "Close"),
700
+ onClick: onClose,
701
+ children: "✕"
702
+ }
703
+ )
704
+ ] }),
705
+ resources.length > 0 && /* @__PURE__ */ jsxs(Field.Root, { children: [
706
+ /* @__PURE__ */ jsx(Field.Label, { children: t("modal.resource", "Bookable Resource / Service") }),
707
+ /* @__PURE__ */ jsx(
708
+ SingleSelect,
709
+ {
710
+ placeholder: t(
711
+ "placeholder.select_bookable_resource",
712
+ "Select bookable resource"
713
+ ),
714
+ value: resourceDocumentId,
715
+ onChange: (val) => setResourceDocumentId(String(val)),
716
+ children: resources.map((res) => /* @__PURE__ */ jsx(
717
+ SingleSelectOption,
718
+ {
719
+ value: res.documentId,
720
+ children: res.name
721
+ },
722
+ res.documentId
723
+ ))
724
+ }
725
+ )
726
+ ] }),
727
+ /* @__PURE__ */ jsxs(
728
+ "div",
729
+ {
730
+ style: {
731
+ display: "grid",
732
+ gridTemplateColumns: "repeat(auto-fit, minmax(220px, 1fr))",
733
+ gap: 12
734
+ },
735
+ children: [
736
+ /* @__PURE__ */ jsxs(Field.Root, { required: true, children: [
737
+ /* @__PURE__ */ jsx(Field.Label, { children: t("modal.customerName", "Visitor / Customer Name *") }),
738
+ /* @__PURE__ */ jsx(
739
+ TextInput,
740
+ {
741
+ placeholder: t(
742
+ "placeholder.e_g_prof_carlos_m_ndez",
743
+ "e.g., Prof. Carlos Méndez"
744
+ ),
745
+ value: customerName,
746
+ onChange: (e) => setCustomerName(e.target.value)
747
+ }
748
+ )
749
+ ] }),
750
+ /* @__PURE__ */ jsxs(Field.Root, { required: true, children: [
751
+ /* @__PURE__ */ jsx(Field.Label, { children: t("modal.customerEmail", "Customer Email *") }),
752
+ /* @__PURE__ */ jsx(
753
+ TextInput,
754
+ {
755
+ type: "email",
756
+ placeholder: t(
757
+ "placeholder.visitor_example_org",
758
+ "visitor@example.org"
759
+ ),
760
+ value: customerEmail,
761
+ onChange: (e) => setCustomerEmail(e.target.value)
762
+ }
763
+ )
764
+ ] })
765
+ ]
766
+ }
767
+ ),
768
+ /* @__PURE__ */ jsxs(
769
+ "div",
770
+ {
771
+ style: {
772
+ display: "grid",
773
+ gridTemplateColumns: "repeat(auto-fit, minmax(220px, 1fr))",
774
+ gap: 12
775
+ },
776
+ children: [
777
+ /* @__PURE__ */ jsxs(Field.Root, { children: [
778
+ /* @__PURE__ */ jsx(Field.Label, { children: t("modal.customerPhone", "Phone / WhatsApp") }),
779
+ /* @__PURE__ */ jsx(
780
+ TextInput,
781
+ {
782
+ placeholder: t(
783
+ "placeholder.57_300_000_0000",
784
+ "+57 300 000 0000"
785
+ ),
786
+ value: customerPhone,
787
+ onChange: (e) => setCustomerPhone(e.target.value)
788
+ }
789
+ )
790
+ ] }),
791
+ /* @__PURE__ */ jsxs(Field.Root, { children: [
792
+ /* @__PURE__ */ jsx(Field.Label, { children: t("modal.organization", "Organization / School / University") }),
793
+ /* @__PURE__ */ jsx(
794
+ TextInput,
795
+ {
796
+ placeholder: t(
797
+ "placeholder.e_g_universidad_nacional",
798
+ "e.g., Universidad Nacional"
799
+ ),
800
+ value: organization,
801
+ onChange: (e) => setOrganization(e.target.value)
802
+ }
803
+ )
804
+ ] })
805
+ ]
806
+ }
807
+ ),
808
+ /* @__PURE__ */ jsxs(
809
+ "div",
810
+ {
811
+ style: {
812
+ display: "grid",
813
+ gridTemplateColumns: "repeat(auto-fit, minmax(150px, 1fr))",
814
+ gap: 12
815
+ },
816
+ children: [
817
+ /* @__PURE__ */ jsxs(Field.Root, { required: true, children: [
818
+ /* @__PURE__ */ jsx(Field.Label, { children: t("modal.bookingDate", "Preferred Date *") }),
819
+ /* @__PURE__ */ jsx(
820
+ TextInput,
821
+ {
822
+ type: "date",
823
+ placeholder: t("placeholder.yyyy_mm_dd", "YYYY-MM-DD"),
824
+ value: bookingDate,
825
+ onChange: (e) => setBookingDate(e.target.value)
826
+ }
827
+ )
828
+ ] }),
829
+ /* @__PURE__ */ jsxs(Field.Root, { children: [
830
+ /* @__PURE__ */ jsx(Field.Label, { children: t("modal.bookingTime", "Start Time") }),
831
+ /* @__PURE__ */ jsx(
832
+ TextInput,
833
+ {
834
+ type: "time",
835
+ placeholder: t("placeholder.09_00", "09:00"),
836
+ value: bookingTime,
837
+ onChange: (e) => setBookingTime(e.target.value)
838
+ }
839
+ )
840
+ ] }),
841
+ /* @__PURE__ */ jsxs(Field.Root, { children: [
842
+ /* @__PURE__ */ jsx(Field.Label, { children: t("modal.partySize", "Group / Party Size") }),
843
+ /* @__PURE__ */ jsx(
844
+ NumberInput,
845
+ {
846
+ placeholder: t("placeholder.1", "1"),
847
+ value: partySize,
848
+ onValueChange: (val) => {
849
+ const num = Number(val ?? 1);
850
+ setPartySize(
851
+ Number.isFinite(num) ? Math.max(1, Math.trunc(num)) : 1
852
+ );
853
+ }
854
+ }
855
+ )
856
+ ] })
857
+ ]
858
+ }
859
+ ),
860
+ /* @__PURE__ */ jsxs(
861
+ "div",
862
+ {
863
+ style: {
864
+ display: "grid",
865
+ gridTemplateColumns: "repeat(auto-fit, minmax(220px, 1fr))",
866
+ gap: 12
867
+ },
868
+ children: [
869
+ /* @__PURE__ */ jsxs(Field.Root, { children: [
870
+ /* @__PURE__ */ jsx(Field.Label, { children: t("modal.preferredLanguage", "Preferred Guide Language") }),
871
+ /* @__PURE__ */ jsxs(
872
+ SingleSelect,
873
+ {
874
+ placeholder: t(
875
+ "placeholder.select_preferred_language",
876
+ "Select preferred language"
877
+ ),
878
+ value: preferredLanguage || "es",
879
+ onChange: (val) => setPreferredLanguage(String(val)),
880
+ children: [
881
+ /* @__PURE__ */ jsx(SingleSelectOption, { value: "es", children: t("modal.langEs", "Español (ES)") }),
882
+ /* @__PURE__ */ jsx(SingleSelectOption, { value: "en", children: t("modal.langEn", "English (EN)") }),
883
+ /* @__PURE__ */ jsx(SingleSelectOption, { value: "ar", children: t("modal.langAr", "العربية — Arabic (AR)") }),
884
+ /* @__PURE__ */ jsx(SingleSelectOption, { value: "tr", children: t("modal.langTr", "Türkçe — Turkish (TR)") })
885
+ ]
886
+ }
887
+ )
888
+ ] }),
889
+ /* @__PURE__ */ jsxs(Field.Root, { children: [
890
+ /* @__PURE__ */ jsx(Field.Label, { children: t("modal.assignedHost", "Assigned Host / Staff") }),
891
+ /* @__PURE__ */ jsx(
892
+ TextInput,
893
+ {
894
+ placeholder: t(
895
+ "placeholder.e_g_sheikh_ahmad_guide_team",
896
+ "e.g., Alex Morgan / Support Team"
897
+ ),
898
+ value: assignedHost,
899
+ onChange: (e) => setAssignedHost(e.target.value)
900
+ }
901
+ )
902
+ ] })
903
+ ]
904
+ }
905
+ ),
906
+ /* @__PURE__ */ jsxs(Field.Root, { children: [
907
+ /* @__PURE__ */ jsx(Field.Label, { children: t("modal.notes", "Visitor Notes & Special Requests") }),
908
+ /* @__PURE__ */ jsx(
909
+ Textarea,
910
+ {
911
+ placeholder: t(
912
+ "placeholder.academic_group_visit_accessibility_needs_or_topi",
913
+ "Academic group visit, accessibility needs, or topic requests..."
914
+ ),
915
+ value: notes,
916
+ onChange: (e) => setNotes(e.target.value)
917
+ }
918
+ )
919
+ ] }),
920
+ /* @__PURE__ */ jsxs(Flex, { justifyContent: "flex-end", gap: 2, paddingTop: 2, children: [
921
+ /* @__PURE__ */ jsx(Button, { variant: "tertiary", onClick: onClose, children: t("modal.cancel", "Cancel") }),
922
+ /* @__PURE__ */ jsx(Button, { variant: "default", loading: saving, onClick: handleCreate, children: t("modal.create", "Create Booking") })
923
+ ] })
924
+ ] })
925
+ }
926
+ )
927
+ }
928
+ );
929
+ };
930
+ const PLUGIN_ID = "bookings";
931
+ const Initializer = ({ setPlugin }) => {
932
+ const ref = useRef(setPlugin);
933
+ useEffect(() => {
934
+ ref.current?.(PLUGIN_ID);
935
+ }, []);
936
+ return null;
937
+ };
938
+ const PluginIcon = () => /* @__PURE__ */ jsx(Calendar, {});
939
+ const CM_LABEL_TRANSLATIONS = {
940
+ en: {
941
+ "content-manager.content-types.plugin::bookings.booking.bookingCode": "Booking Reference Code",
942
+ "content-manager.content-types.plugin::bookings.booking.title": "Title",
943
+ "content-manager.content-types.plugin::bookings.booking.resource": "Booked Resource / Space",
944
+ "content-manager.content-types.plugin::bookings.booking.customerName": "Visitor / Applicant Name",
945
+ "content-manager.content-types.plugin::bookings.booking.customerEmail": "Visitor / Applicant Email",
946
+ "content-manager.content-types.plugin::bookings.booking.customerPhone": "Visitor / Applicant Phone",
947
+ "content-manager.content-types.plugin::bookings.booking.organization": "Organization / Institution",
948
+ "content-manager.content-types.plugin::bookings.booking.startDate": "Start Date & Time",
949
+ "content-manager.content-types.plugin::bookings.booking.endDate": "End Date & Time",
950
+ "content-manager.content-types.plugin::bookings.booking.slotLabel": "Time Slot Label",
951
+ "content-manager.content-types.plugin::bookings.booking.timezone": "Timezone",
952
+ "content-manager.content-types.plugin::bookings.booking.partySize": "Group / Party Size",
953
+ "content-manager.content-types.plugin::bookings.booking.status": "Status",
954
+ "content-manager.content-types.plugin::bookings.booking.preferredLanguage": "Preferred Language",
955
+ "content-manager.content-types.plugin::bookings.booking.assignedHost": "Assigned Host / Guide",
956
+ "content-manager.content-types.plugin::bookings.booking.notes": "Notes",
957
+ "content-manager.content-types.plugin::bookings.booking.internalNotes": "Internal Staff Notes",
958
+ "content-manager.content-types.plugin::bookings.booking.cancelTokenHash": "Cancellation Token Hash",
959
+ "content-manager.content-types.plugin::bookings.booking.sourceCollection": "Source Collection",
960
+ "content-manager.content-types.plugin::bookings.booking.metadata": "Additional Metadata (JSON)",
961
+ "content-manager.content-types.plugin::bookings.booking.preferredGuideLanguage": "Preferred Guide Language",
962
+ "content-manager.content-types.plugin::bookings.booking.hijriDate": "Hijri Date (Islamic Calendar)",
963
+ "content-manager.content-types.plugin::bookings.booking.documentId": "Document ID",
964
+ "content-manager.content-types.plugin::bookings.resource.name": "Name",
965
+ "content-manager.content-types.plugin::bookings.resource.slug": "URL Slug",
966
+ "content-manager.content-types.plugin::bookings.resource.resourceType": "Resource Type",
967
+ "content-manager.content-types.plugin::bookings.resource.description": "Description",
968
+ "content-manager.content-types.plugin::bookings.resource.color": "Color (Hex)",
969
+ "content-manager.content-types.plugin::bookings.resource.timezone": "Timezone",
970
+ "content-manager.content-types.plugin::bookings.resource.slotDurationMinutes": "Slot Duration (Minutes)",
971
+ "content-manager.content-types.plugin::bookings.resource.bufferBeforeMinutes": "Buffer Before Slot (Minutes)",
972
+ "content-manager.content-types.plugin::bookings.resource.bufferAfterMinutes": "Buffer After Slot (Minutes)",
973
+ "content-manager.content-types.plugin::bookings.resource.capacityPerSlot": "Capacity per Slot",
974
+ "content-manager.content-types.plugin::bookings.resource.maxPartySize": "Maximum Group Size",
975
+ "content-manager.content-types.plugin::bookings.resource.minLeadTimeHours": "Minimum Lead Time (Hours)",
976
+ "content-manager.content-types.plugin::bookings.resource.maxAdvanceDays": "Maximum Advance Booking (Days)",
977
+ "content-manager.content-types.plugin::bookings.resource.requiresApproval": "Requires Staff Approval",
978
+ "content-manager.content-types.plugin::bookings.resource.weeklySchedule": "Weekly Availability Schedule",
979
+ "content-manager.content-types.plugin::bookings.resource.seasonalSchedules": "Seasonal Schedules",
980
+ "content-manager.content-types.plugin::bookings.resource.holidayRules": "Holiday & Festivity Rules",
981
+ "content-manager.content-types.plugin::bookings.resource.blackoutDates": "Blackout / Unavailable Dates",
982
+ "content-manager.content-types.plugin::bookings.resource.recurrenceRule": "Recurrence Rule (RRULE)",
983
+ "content-manager.content-types.plugin::bookings.resource.supportedLanguages": "Supported Languages",
984
+ "content-manager.content-types.plugin::bookings.resource.assignedHosts": "Assigned Hosts / Guides",
985
+ "content-manager.content-types.plugin::bookings.resource.location": "Location / Venue",
986
+ "content-manager.content-types.plugin::bookings.resource.price": "Price / Fee",
987
+ "content-manager.content-types.plugin::bookings.resource.currency": "Currency",
988
+ "content-manager.content-types.plugin::bookings.resource.isActive": "Active",
989
+ "content-manager.content-types.plugin::bookings.resource.metadata": "Additional Metadata (JSON)",
990
+ "content-manager.content-types.plugin::bookings.resource.bookings": "Associated Bookings",
991
+ "content-manager.content-types.plugin::bookings.resource.documentId": "Document ID",
992
+ "content-manager.enum.cancelled": "Cancelled",
993
+ "content-manager.enum.confirmed": "Confirmed",
994
+ "content-manager.enum.pending": "Pending",
995
+ "content-manager.enum.completed": "Completed",
996
+ "content-manager.enum.no_show": "No Show",
997
+ "content-manager.enum.service": "Service",
998
+ "content-manager.enum.appointment": "Appointment",
999
+ "content-manager.enum.room": "Room / Hall",
1000
+ "content-manager.enum.staff": "Staff Member",
1001
+ "content-manager.enum.equipment": "Equipment",
1002
+ "content-manager.enum.other": "Other"
1003
+ },
1004
+ es: {
1005
+ "content-manager.content-types.plugin::bookings.booking.bookingCode": "Código de Reserva",
1006
+ "content-manager.content-types.plugin::bookings.booking.title": "Título",
1007
+ "content-manager.content-types.plugin::bookings.booking.resource": "Recurso o Espacio Reservado",
1008
+ "content-manager.content-types.plugin::bookings.booking.customerName": "Nombre del Visitante o Solicitante",
1009
+ "content-manager.content-types.plugin::bookings.booking.customerEmail": "Correo del Visitante o Solicitante",
1010
+ "content-manager.content-types.plugin::bookings.booking.customerPhone": "Teléfono del Visitante o Solicitante",
1011
+ "content-manager.content-types.plugin::bookings.booking.organization": "Organización o Institución",
1012
+ "content-manager.content-types.plugin::bookings.booking.startDate": "Fecha y Hora de Inicio",
1013
+ "content-manager.content-types.plugin::bookings.booking.endDate": "Fecha y Hora de Fin",
1014
+ "content-manager.content-types.plugin::bookings.booking.slotLabel": "Etiqueta de Franja Horaria",
1015
+ "content-manager.content-types.plugin::bookings.booking.timezone": "Zona Horaria",
1016
+ "content-manager.content-types.plugin::bookings.booking.partySize": "Número de Personas (Tamaño del Grupo)",
1017
+ "content-manager.content-types.plugin::bookings.booking.status": "Estado",
1018
+ "content-manager.content-types.plugin::bookings.booking.preferredLanguage": "Idioma Preferido",
1019
+ "content-manager.content-types.plugin::bookings.booking.assignedHost": "Anfitrión o Guía Asignado",
1020
+ "content-manager.content-types.plugin::bookings.booking.notes": "Notas",
1021
+ "content-manager.content-types.plugin::bookings.booking.internalNotes": "Notas Internas del Personal",
1022
+ "content-manager.content-types.plugin::bookings.booking.cancelTokenHash": "Hash del Token de Cancelación",
1023
+ "content-manager.content-types.plugin::bookings.booking.sourceCollection": "Colección de Origen",
1024
+ "content-manager.content-types.plugin::bookings.booking.metadata": "Metadatos Adicionales (JSON)",
1025
+ "content-manager.content-types.plugin::bookings.booking.preferredGuideLanguage": "Idioma Preferido del Guía",
1026
+ "content-manager.content-types.plugin::bookings.booking.hijriDate": "Fecha Hijri (Calendario Islámico)",
1027
+ "content-manager.content-types.plugin::bookings.booking.documentId": "ID del Documento",
1028
+ "content-manager.content-types.plugin::bookings.resource.name": "Nombre",
1029
+ "content-manager.content-types.plugin::bookings.resource.slug": "Slug (URL Amigable)",
1030
+ "content-manager.content-types.plugin::bookings.resource.resourceType": "Tipo de Recurso",
1031
+ "content-manager.content-types.plugin::bookings.resource.description": "Descripción",
1032
+ "content-manager.content-types.plugin::bookings.resource.color": "Color (Hex)",
1033
+ "content-manager.content-types.plugin::bookings.resource.timezone": "Zona Horaria",
1034
+ "content-manager.content-types.plugin::bookings.resource.slotDurationMinutes": "Duración del Turno (Minutos)",
1035
+ "content-manager.content-types.plugin::bookings.resource.bufferBeforeMinutes": "Margen Previo al Turno (Minutos)",
1036
+ "content-manager.content-types.plugin::bookings.resource.bufferAfterMinutes": "Margen Posterior al Turno (Minutos)",
1037
+ "content-manager.content-types.plugin::bookings.resource.capacityPerSlot": "Capacidad por Franja Horaria",
1038
+ "content-manager.content-types.plugin::bookings.resource.maxPartySize": "Tamaño Máximo del Grupo",
1039
+ "content-manager.content-types.plugin::bookings.resource.minLeadTimeHours": "Anticipación Mínima para Reservar (Horas)",
1040
+ "content-manager.content-types.plugin::bookings.resource.maxAdvanceDays": "Anticipación Máxima de Reserva (Días)",
1041
+ "content-manager.content-types.plugin::bookings.resource.requiresApproval": "Requiere Aprobación Previa",
1042
+ "content-manager.content-types.plugin::bookings.resource.weeklySchedule": "Horario Semanal de Disponibilidad",
1043
+ "content-manager.content-types.plugin::bookings.resource.seasonalSchedules": "Horarios Especiales por Temporada",
1044
+ "content-manager.content-types.plugin::bookings.resource.holidayRules": "Reglas de Días Festivos",
1045
+ "content-manager.content-types.plugin::bookings.resource.blackoutDates": "Fechas Bloqueadas (No Disponibles)",
1046
+ "content-manager.content-types.plugin::bookings.resource.recurrenceRule": "Regla de Recurrencia (RRULE)",
1047
+ "content-manager.content-types.plugin::bookings.resource.supportedLanguages": "Idiomas Disponibles",
1048
+ "content-manager.content-types.plugin::bookings.resource.assignedHosts": "Anfitriones o Guías Asignados",
1049
+ "content-manager.content-types.plugin::bookings.resource.location": "Ubicación / Lugar",
1050
+ "content-manager.content-types.plugin::bookings.resource.price": "Precio / Tarifa",
1051
+ "content-manager.content-types.plugin::bookings.resource.currency": "Moneda",
1052
+ "content-manager.content-types.plugin::bookings.resource.isActive": "Activo",
1053
+ "content-manager.content-types.plugin::bookings.resource.metadata": "Metadatos Adicionales (JSON)",
1054
+ "content-manager.content-types.plugin::bookings.resource.bookings": "Reservas Asociadas",
1055
+ "content-manager.content-types.plugin::bookings.resource.documentId": "ID del Documento",
1056
+ "content-manager.enum.cancelled": "Cancelado",
1057
+ "content-manager.enum.confirmed": "Confirmado",
1058
+ "content-manager.enum.pending": "Pendiente",
1059
+ "content-manager.enum.completed": "Completado",
1060
+ "content-manager.enum.no_show": "No Asistió",
1061
+ "content-manager.enum.service": "Servicio",
1062
+ "content-manager.enum.appointment": "Cita",
1063
+ "content-manager.enum.room": "Salón / Espacio",
1064
+ "content-manager.enum.staff": "Personal / Guía",
1065
+ "content-manager.enum.equipment": "Equipamiento",
1066
+ "content-manager.enum.other": "Otro"
1067
+ },
1068
+ ar: {
1069
+ "content-manager.content-types.plugin::bookings.booking.bookingCode": "رمز الحجز المرجعي",
1070
+ "content-manager.content-types.plugin::bookings.booking.title": "العنوان",
1071
+ "content-manager.content-types.plugin::bookings.booking.resource": "المورد أو القاعة المحجوزة",
1072
+ "content-manager.content-types.plugin::bookings.booking.customerName": "اسم الزائر أو مقدم الطلب",
1073
+ "content-manager.content-types.plugin::bookings.booking.customerEmail": "البريد الإلكتروني للزائر",
1074
+ "content-manager.content-types.plugin::bookings.booking.customerPhone": "رقم هاتف الزائر",
1075
+ "content-manager.content-types.plugin::bookings.booking.organization": "المؤسسة أو الجهة",
1076
+ "content-manager.content-types.plugin::bookings.booking.startDate": "تاريخ ووقت البداية",
1077
+ "content-manager.content-types.plugin::bookings.booking.endDate": "تاريخ ووقت النهاية",
1078
+ "content-manager.content-types.plugin::bookings.booking.slotLabel": "تسمية الفترة الزمنية",
1079
+ "content-manager.content-types.plugin::bookings.booking.timezone": "المنطقة الزمنية",
1080
+ "content-manager.content-types.plugin::bookings.booking.partySize": "عدد الأفراد (حجم المجموعة)",
1081
+ "content-manager.content-types.plugin::bookings.booking.status": "الحالة",
1082
+ "content-manager.content-types.plugin::bookings.booking.preferredLanguage": "اللغة المفضلة",
1083
+ "content-manager.content-types.plugin::bookings.booking.assignedHost": "المضيف أو المرشد المعين",
1084
+ "content-manager.content-types.plugin::bookings.booking.notes": "ملاحظات",
1085
+ "content-manager.content-types.plugin::bookings.booking.internalNotes": "ملاحظات داخلية للموظفين",
1086
+ "content-manager.content-types.plugin::bookings.booking.cancelTokenHash": "تجزئة رمز الإلغاء",
1087
+ "content-manager.content-types.plugin::bookings.booking.sourceCollection": "المجموعة المصدرية",
1088
+ "content-manager.content-types.plugin::bookings.booking.metadata": "بيانات وصفية إضافية (JSON)",
1089
+ "content-manager.content-types.plugin::bookings.booking.preferredGuideLanguage": "لغة المرشد المفضلة",
1090
+ "content-manager.content-types.plugin::bookings.booking.hijriDate": "التاريخ الهجري",
1091
+ "content-manager.content-types.plugin::bookings.booking.documentId": "معرف المستند",
1092
+ "content-manager.content-types.plugin::bookings.resource.name": "الاسم",
1093
+ "content-manager.content-types.plugin::bookings.resource.slug": "المسار المختصر (Slug)",
1094
+ "content-manager.content-types.plugin::bookings.resource.resourceType": "نوع المورد",
1095
+ "content-manager.content-types.plugin::bookings.resource.description": "الوصف",
1096
+ "content-manager.content-types.plugin::bookings.resource.color": "اللون (Hex)",
1097
+ "content-manager.content-types.plugin::bookings.resource.timezone": "المنطقة الزمنية",
1098
+ "content-manager.content-types.plugin::bookings.resource.slotDurationMinutes": "مدة الفترة الزمنية (بالدقائق)",
1099
+ "content-manager.content-types.plugin::bookings.resource.bufferBeforeMinutes": "فترة الفاصل قبل الموعد (بالدقائق)",
1100
+ "content-manager.content-types.plugin::bookings.resource.bufferAfterMinutes": "فترة الفاصل بعد الموعد (بالدقائق)",
1101
+ "content-manager.content-types.plugin::bookings.resource.capacityPerSlot": "السعة لكل فترة زمنية",
1102
+ "content-manager.content-types.plugin::bookings.resource.maxPartySize": "الحد الأقصى لحجم المجموعة",
1103
+ "content-manager.content-types.plugin::bookings.resource.minLeadTimeHours": "الحد الأدنى للمهلة قبل الحجز (بالساعات)",
1104
+ "content-manager.content-types.plugin::bookings.resource.maxAdvanceDays": "الحد الأقصى للحجز المسبق (بالأيام)",
1105
+ "content-manager.content-types.plugin::bookings.resource.requiresApproval": "يتطلب موافقة الإدارة",
1106
+ "content-manager.content-types.plugin::bookings.resource.weeklySchedule": "جدول التوفر الأسبوعي",
1107
+ "content-manager.content-types.plugin::bookings.resource.seasonalSchedules": "الجداول الموسمية الخاصة",
1108
+ "content-manager.content-types.plugin::bookings.resource.holidayRules": "قواعد العطلات والمناسبات",
1109
+ "content-manager.content-types.plugin::bookings.resource.blackoutDates": "التواريخ المحجوبة (غير المتاحة)",
1110
+ "content-manager.content-types.plugin::bookings.resource.recurrenceRule": "قاعدة التكرار (RRULE)",
1111
+ "content-manager.content-types.plugin::bookings.resource.supportedLanguages": "اللغات المدعومة",
1112
+ "content-manager.content-types.plugin::bookings.resource.assignedHosts": "المضيفون أو المرشدون المعينون",
1113
+ "content-manager.content-types.plugin::bookings.resource.location": "الموقع / القاعة",
1114
+ "content-manager.content-types.plugin::bookings.resource.price": "السعر / الرسوم",
1115
+ "content-manager.content-types.plugin::bookings.resource.currency": "العملة",
1116
+ "content-manager.content-types.plugin::bookings.resource.isActive": "نشط",
1117
+ "content-manager.content-types.plugin::bookings.resource.metadata": "بيانات وصفية إضافية (JSON)",
1118
+ "content-manager.content-types.plugin::bookings.resource.bookings": "الحجوزات المرتبطة",
1119
+ "content-manager.content-types.plugin::bookings.resource.documentId": "معرف المستند",
1120
+ "content-manager.enum.cancelled": "ملغى",
1121
+ "content-manager.enum.confirmed": "مؤكد",
1122
+ "content-manager.enum.pending": "قيد الانتظار",
1123
+ "content-manager.enum.completed": "مكتمل",
1124
+ "content-manager.enum.no_show": "لم يحضر",
1125
+ "content-manager.enum.service": "خدمة",
1126
+ "content-manager.enum.appointment": "موعد",
1127
+ "content-manager.enum.room": "قاعة / غرفة",
1128
+ "content-manager.enum.staff": "موظف / مرشد",
1129
+ "content-manager.enum.equipment": "معدات",
1130
+ "content-manager.enum.other": "أخرى"
1131
+ },
1132
+ tr: {
1133
+ "content-manager.content-types.plugin::bookings.booking.bookingCode": "Rezervasyon Kodu",
1134
+ "content-manager.content-types.plugin::bookings.booking.title": "Başlık",
1135
+ "content-manager.content-types.plugin::bookings.booking.resource": "Rezerve Edilen Kaynak / Alan",
1136
+ "content-manager.content-types.plugin::bookings.booking.customerName": "Ziyaretçi / Başvuru Sahibi Adı",
1137
+ "content-manager.content-types.plugin::bookings.booking.customerEmail": "Ziyaretçi E-posta Adresi",
1138
+ "content-manager.content-types.plugin::bookings.booking.customerPhone": "Ziyaretçi Telefon Numarası",
1139
+ "content-manager.content-types.plugin::bookings.booking.organization": "Kurum / Organizasyon",
1140
+ "content-manager.content-types.plugin::bookings.booking.startDate": "Başlangıç Tarihi ve Saati",
1141
+ "content-manager.content-types.plugin::bookings.booking.endDate": "Bitiş Tarihi ve Saati",
1142
+ "content-manager.content-types.plugin::bookings.booking.slotLabel": "Zaman Dilimi Etiketi",
1143
+ "content-manager.content-types.plugin::bookings.booking.timezone": "Saat Dilimi",
1144
+ "content-manager.content-types.plugin::bookings.booking.partySize": "Kişi Sayısı (Grup Büyüklüğü)",
1145
+ "content-manager.content-types.plugin::bookings.booking.status": "Durum",
1146
+ "content-manager.content-types.plugin::bookings.booking.preferredLanguage": "Tercih Edilen Dil",
1147
+ "content-manager.content-types.plugin::bookings.booking.assignedHost": "Atanan Rehber / Görevli",
1148
+ "content-manager.content-types.plugin::bookings.booking.notes": "Notlar",
1149
+ "content-manager.content-types.plugin::bookings.booking.internalNotes": "Dahili Personel Notları",
1150
+ "content-manager.content-types.plugin::bookings.booking.cancelTokenHash": "İptal Jetonu Özeti (Hash)",
1151
+ "content-manager.content-types.plugin::bookings.booking.sourceCollection": "Kaynak Koleksiyon",
1152
+ "content-manager.content-types.plugin::bookings.booking.metadata": "Ek Meta Veriler (JSON)",
1153
+ "content-manager.content-types.plugin::bookings.booking.preferredGuideLanguage": "Tercih Edilen Rehber Dili",
1154
+ "content-manager.content-types.plugin::bookings.booking.hijriDate": "Hicri Tarih",
1155
+ "content-manager.content-types.plugin::bookings.booking.documentId": "Belge Kimliği (ID)",
1156
+ "content-manager.content-types.plugin::bookings.resource.name": "Ad",
1157
+ "content-manager.content-types.plugin::bookings.resource.slug": "Kısa Ad (URL Slug)",
1158
+ "content-manager.content-types.plugin::bookings.resource.resourceType": "Kaynak Türü",
1159
+ "content-manager.content-types.plugin::bookings.resource.description": "Açıklama",
1160
+ "content-manager.content-types.plugin::bookings.resource.color": "Renk (Hex)",
1161
+ "content-manager.content-types.plugin::bookings.resource.timezone": "Saat Dilimi",
1162
+ "content-manager.content-types.plugin::bookings.resource.slotDurationMinutes": "Seans Süresi (Dakika)",
1163
+ "content-manager.content-types.plugin::bookings.resource.bufferBeforeMinutes": "Seans Öncesi Ara Süre (Dakika)",
1164
+ "content-manager.content-types.plugin::bookings.resource.bufferAfterMinutes": "Seans Sonrası Ara Süre (Dakika)",
1165
+ "content-manager.content-types.plugin::bookings.resource.capacityPerSlot": "Seans Başına Kapasite",
1166
+ "content-manager.content-types.plugin::bookings.resource.maxPartySize": "Maksimum Grup Büyüklüğü",
1167
+ "content-manager.content-types.plugin::bookings.resource.minLeadTimeHours": "Minimum Ön Bildirim Süresi (Saat)",
1168
+ "content-manager.content-types.plugin::bookings.resource.maxAdvanceDays": "Maksimum İleri Tarihli Rezervasyon (Gün)",
1169
+ "content-manager.content-types.plugin::bookings.resource.requiresApproval": "Yönetici Onayı Gerektirir",
1170
+ "content-manager.content-types.plugin::bookings.resource.weeklySchedule": "Haftalık Uygunluk Programı",
1171
+ "content-manager.content-types.plugin::bookings.resource.seasonalSchedules": "Mevsimsel / Dönemsel Programlar",
1172
+ "content-manager.content-types.plugin::bookings.resource.holidayRules": "Tatil ve Bayram Kuralları",
1173
+ "content-manager.content-types.plugin::bookings.resource.blackoutDates": "Kapalı / Uygun Olmayan Tarihler",
1174
+ "content-manager.content-types.plugin::bookings.resource.recurrenceRule": "Tekrarlama Kuralı (RRULE)",
1175
+ "content-manager.content-types.plugin::bookings.resource.supportedLanguages": "Desteklenen Diller",
1176
+ "content-manager.content-types.plugin::bookings.resource.assignedHosts": "Atanan Rehberler / Görevliler",
1177
+ "content-manager.content-types.plugin::bookings.resource.location": "Konum / Mekan",
1178
+ "content-manager.content-types.plugin::bookings.resource.price": "Ücret / Fiyat",
1179
+ "content-manager.content-types.plugin::bookings.resource.currency": "Para Birimi",
1180
+ "content-manager.content-types.plugin::bookings.resource.isActive": "Aktif",
1181
+ "content-manager.content-types.plugin::bookings.resource.metadata": "Ek Meta Veriler (JSON)",
1182
+ "content-manager.content-types.plugin::bookings.resource.bookings": "İlgili Rezervasyonlar",
1183
+ "content-manager.content-types.plugin::bookings.resource.documentId": "Belge Kimliği (ID)",
1184
+ "content-manager.enum.cancelled": "İptal Edildi",
1185
+ "content-manager.enum.confirmed": "Onaylandı",
1186
+ "content-manager.enum.pending": "Beklemede",
1187
+ "content-manager.enum.completed": "Tamamlandı",
1188
+ "content-manager.enum.no_show": "Gelmedi",
1189
+ "content-manager.enum.service": "Hizmet",
1190
+ "content-manager.enum.appointment": "Randevu",
1191
+ "content-manager.enum.room": "Salon / Oda",
1192
+ "content-manager.enum.staff": "Personel / Rehber",
1193
+ "content-manager.enum.equipment": "Ekipman",
1194
+ "content-manager.enum.other": "Diğer"
1195
+ }
1196
+ };
1197
+ const CM_PLACEHOLDER_TRANSLATIONS = {
1198
+ en: {
1199
+ "content-manager.content-types.plugin::bookings.booking.bookingCode.placeholder": "Enter booking reference code...",
1200
+ "content-manager.content-types.plugin::bookings.booking.title.placeholder": "Enter title...",
1201
+ "content-manager.content-types.plugin::bookings.booking.resource.placeholder": "Enter booked resource / space...",
1202
+ "content-manager.content-types.plugin::bookings.booking.customerName.placeholder": "Enter visitor / applicant name...",
1203
+ "content-manager.content-types.plugin::bookings.booking.customerEmail.placeholder": "info@mezquitabogota.org",
1204
+ "content-manager.content-types.plugin::bookings.booking.customerPhone.placeholder": "+57 310 555 0199",
1205
+ "content-manager.content-types.plugin::bookings.booking.organization.placeholder": "Enter organization / institution...",
1206
+ "content-manager.content-types.plugin::bookings.booking.startDate.placeholder": "YYYY-MM-DD",
1207
+ "content-manager.content-types.plugin::bookings.booking.endDate.placeholder": "YYYY-MM-DD",
1208
+ "content-manager.content-types.plugin::bookings.booking.slotLabel.placeholder": "e.g., 10:00 AM",
1209
+ "content-manager.content-types.plugin::bookings.booking.timezone.placeholder": "America/Bogota",
1210
+ "content-manager.content-types.plugin::bookings.booking.partySize.placeholder": "Enter group / party size...",
1211
+ "content-manager.content-types.plugin::bookings.booking.status.placeholder": "Enter status...",
1212
+ "content-manager.content-types.plugin::bookings.booking.preferredLanguage.placeholder": "e.g., es, en, ar, tr",
1213
+ "content-manager.content-types.plugin::bookings.booking.assignedHost.placeholder": "Enter assigned host / guide...",
1214
+ "content-manager.content-types.plugin::bookings.booking.notes.placeholder": "Enter notes...",
1215
+ "content-manager.content-types.plugin::bookings.booking.internalNotes.placeholder": "Enter internal staff notes...",
1216
+ "content-manager.content-types.plugin::bookings.booking.cancelTokenHash.placeholder": "Enter cancellation token hash...",
1217
+ "content-manager.content-types.plugin::bookings.booking.sourceCollection.placeholder": "Enter source collection...",
1218
+ "content-manager.content-types.plugin::bookings.booking.metadata.placeholder": "Enter additional metadata (json)...",
1219
+ "content-manager.content-types.plugin::bookings.booking.preferredGuideLanguage.placeholder": "e.g., es, en, ar, tr",
1220
+ "content-manager.content-types.plugin::bookings.booking.hijriDate.placeholder": "e.g., 15 Ramadan 1447 AH",
1221
+ "content-manager.content-types.plugin::bookings.booking.documentId.placeholder": "Enter document id...",
1222
+ "content-manager.content-types.plugin::bookings.resource.name.placeholder": "Enter name...",
1223
+ "content-manager.content-types.plugin::bookings.resource.slug.placeholder": "auto-generated-url-slug",
1224
+ "content-manager.content-types.plugin::bookings.resource.resourceType.placeholder": "Enter resource type...",
1225
+ "content-manager.content-types.plugin::bookings.resource.description.placeholder": "Enter description...",
1226
+ "content-manager.content-types.plugin::bookings.resource.color.placeholder": "#0F766E",
1227
+ "content-manager.content-types.plugin::bookings.resource.timezone.placeholder": "America/Bogota",
1228
+ "content-manager.content-types.plugin::bookings.resource.slotDurationMinutes.placeholder": "Enter slot duration (minutes)...",
1229
+ "content-manager.content-types.plugin::bookings.resource.bufferBeforeMinutes.placeholder": "Enter buffer before slot (minutes)...",
1230
+ "content-manager.content-types.plugin::bookings.resource.bufferAfterMinutes.placeholder": "Enter buffer after slot (minutes)...",
1231
+ "content-manager.content-types.plugin::bookings.resource.capacityPerSlot.placeholder": "Enter capacity per slot...",
1232
+ "content-manager.content-types.plugin::bookings.resource.maxPartySize.placeholder": "Enter maximum group size...",
1233
+ "content-manager.content-types.plugin::bookings.resource.minLeadTimeHours.placeholder": "Enter minimum lead time (hours)...",
1234
+ "content-manager.content-types.plugin::bookings.resource.maxAdvanceDays.placeholder": "Enter maximum advance booking (days)...",
1235
+ "content-manager.content-types.plugin::bookings.resource.requiresApproval.placeholder": "Enter requires staff approval...",
1236
+ "content-manager.content-types.plugin::bookings.resource.weeklySchedule.placeholder": "Enter weekly availability schedule...",
1237
+ "content-manager.content-types.plugin::bookings.resource.seasonalSchedules.placeholder": "Enter seasonal schedules...",
1238
+ "content-manager.content-types.plugin::bookings.resource.holidayRules.placeholder": "Enter holiday & festivity rules...",
1239
+ "content-manager.content-types.plugin::bookings.resource.blackoutDates.placeholder": "Enter blackout / unavailable dates...",
1240
+ "content-manager.content-types.plugin::bookings.resource.recurrenceRule.placeholder": "Enter recurrence rule (rrule)...",
1241
+ "content-manager.content-types.plugin::bookings.resource.supportedLanguages.placeholder": "e.g., es, en, ar, tr",
1242
+ "content-manager.content-types.plugin::bookings.resource.assignedHosts.placeholder": "Enter assigned hosts / guides...",
1243
+ "content-manager.content-types.plugin::bookings.resource.location.placeholder": "Enter location / venue...",
1244
+ "content-manager.content-types.plugin::bookings.resource.price.placeholder": "Enter price / fee...",
1245
+ "content-manager.content-types.plugin::bookings.resource.currency.placeholder": "e.g., COP or USD",
1246
+ "content-manager.content-types.plugin::bookings.resource.isActive.placeholder": "Enter active...",
1247
+ "content-manager.content-types.plugin::bookings.resource.metadata.placeholder": "Enter additional metadata (json)...",
1248
+ "content-manager.content-types.plugin::bookings.resource.bookings.placeholder": "Enter associated bookings...",
1249
+ "content-manager.content-types.plugin::bookings.resource.documentId.placeholder": "Enter document id..."
1250
+ },
1251
+ es: {
1252
+ "content-manager.content-types.plugin::bookings.booking.bookingCode.placeholder": "Ingresa código de reserva...",
1253
+ "content-manager.content-types.plugin::bookings.booking.title.placeholder": "Ingresa título...",
1254
+ "content-manager.content-types.plugin::bookings.booking.resource.placeholder": "Ingresa recurso o espacio reservado...",
1255
+ "content-manager.content-types.plugin::bookings.booking.customerName.placeholder": "Ingresa nombre del visitante o solicitante...",
1256
+ "content-manager.content-types.plugin::bookings.booking.customerEmail.placeholder": "info@mezquitabogota.org",
1257
+ "content-manager.content-types.plugin::bookings.booking.customerPhone.placeholder": "+57 310 555 0199",
1258
+ "content-manager.content-types.plugin::bookings.booking.organization.placeholder": "Ingresa organización o institución...",
1259
+ "content-manager.content-types.plugin::bookings.booking.startDate.placeholder": "YYYY-MM-DD",
1260
+ "content-manager.content-types.plugin::bookings.booking.endDate.placeholder": "YYYY-MM-DD",
1261
+ "content-manager.content-types.plugin::bookings.booking.slotLabel.placeholder": "ej., 10:00 AM",
1262
+ "content-manager.content-types.plugin::bookings.booking.timezone.placeholder": "America/Bogota",
1263
+ "content-manager.content-types.plugin::bookings.booking.partySize.placeholder": "Ingresa número de personas (tamaño del grupo)...",
1264
+ "content-manager.content-types.plugin::bookings.booking.status.placeholder": "Ingresa estado...",
1265
+ "content-manager.content-types.plugin::bookings.booking.preferredLanguage.placeholder": "ej., es, en, ar, tr",
1266
+ "content-manager.content-types.plugin::bookings.booking.assignedHost.placeholder": "Ingresa anfitrión o guía asignado...",
1267
+ "content-manager.content-types.plugin::bookings.booking.notes.placeholder": "Ingresa notas...",
1268
+ "content-manager.content-types.plugin::bookings.booking.internalNotes.placeholder": "Ingresa notas internas del personal...",
1269
+ "content-manager.content-types.plugin::bookings.booking.cancelTokenHash.placeholder": "Ingresa hash del token de cancelación...",
1270
+ "content-manager.content-types.plugin::bookings.booking.sourceCollection.placeholder": "Ingresa colección de origen...",
1271
+ "content-manager.content-types.plugin::bookings.booking.metadata.placeholder": "Ingresa metadatos adicionales (json)...",
1272
+ "content-manager.content-types.plugin::bookings.booking.preferredGuideLanguage.placeholder": "ej., es, en, ar, tr",
1273
+ "content-manager.content-types.plugin::bookings.booking.hijriDate.placeholder": "ej., 15 Ramadán 1447 AH",
1274
+ "content-manager.content-types.plugin::bookings.booking.documentId.placeholder": "Ingresa id del documento...",
1275
+ "content-manager.content-types.plugin::bookings.resource.name.placeholder": "Ingresa nombre...",
1276
+ "content-manager.content-types.plugin::bookings.resource.slug.placeholder": "slug-generado-automaticamente",
1277
+ "content-manager.content-types.plugin::bookings.resource.resourceType.placeholder": "Ingresa tipo de recurso...",
1278
+ "content-manager.content-types.plugin::bookings.resource.description.placeholder": "Ingresa descripción...",
1279
+ "content-manager.content-types.plugin::bookings.resource.color.placeholder": "#0F766E",
1280
+ "content-manager.content-types.plugin::bookings.resource.timezone.placeholder": "America/Bogota",
1281
+ "content-manager.content-types.plugin::bookings.resource.slotDurationMinutes.placeholder": "Ingresa duración del turno (minutos)...",
1282
+ "content-manager.content-types.plugin::bookings.resource.bufferBeforeMinutes.placeholder": "Ingresa margen previo al turno (minutos)...",
1283
+ "content-manager.content-types.plugin::bookings.resource.bufferAfterMinutes.placeholder": "Ingresa margen posterior al turno (minutos)...",
1284
+ "content-manager.content-types.plugin::bookings.resource.capacityPerSlot.placeholder": "Ingresa capacidad por franja horaria...",
1285
+ "content-manager.content-types.plugin::bookings.resource.maxPartySize.placeholder": "Ingresa tamaño máximo del grupo...",
1286
+ "content-manager.content-types.plugin::bookings.resource.minLeadTimeHours.placeholder": "Ingresa anticipación mínima para reservar (horas)...",
1287
+ "content-manager.content-types.plugin::bookings.resource.maxAdvanceDays.placeholder": "Ingresa anticipación máxima de reserva (días)...",
1288
+ "content-manager.content-types.plugin::bookings.resource.requiresApproval.placeholder": "Ingresa requiere aprobación previa...",
1289
+ "content-manager.content-types.plugin::bookings.resource.weeklySchedule.placeholder": "Ingresa horario semanal de disponibilidad...",
1290
+ "content-manager.content-types.plugin::bookings.resource.seasonalSchedules.placeholder": "Ingresa horarios especiales por temporada...",
1291
+ "content-manager.content-types.plugin::bookings.resource.holidayRules.placeholder": "Ingresa reglas de días festivos...",
1292
+ "content-manager.content-types.plugin::bookings.resource.blackoutDates.placeholder": "Ingresa fechas bloqueadas (no disponibles)...",
1293
+ "content-manager.content-types.plugin::bookings.resource.recurrenceRule.placeholder": "Ingresa regla de recurrencia (rrule)...",
1294
+ "content-manager.content-types.plugin::bookings.resource.supportedLanguages.placeholder": "ej., es, en, ar, tr",
1295
+ "content-manager.content-types.plugin::bookings.resource.assignedHosts.placeholder": "Ingresa anfitriones o guías asignados...",
1296
+ "content-manager.content-types.plugin::bookings.resource.location.placeholder": "Ingresa ubicación / lugar...",
1297
+ "content-manager.content-types.plugin::bookings.resource.price.placeholder": "Ingresa precio / tarifa...",
1298
+ "content-manager.content-types.plugin::bookings.resource.currency.placeholder": "ej., COP o USD",
1299
+ "content-manager.content-types.plugin::bookings.resource.isActive.placeholder": "Ingresa activo...",
1300
+ "content-manager.content-types.plugin::bookings.resource.metadata.placeholder": "Ingresa metadatos adicionales (json)...",
1301
+ "content-manager.content-types.plugin::bookings.resource.bookings.placeholder": "Ingresa reservas asociadas...",
1302
+ "content-manager.content-types.plugin::bookings.resource.documentId.placeholder": "Ingresa id del documento..."
1303
+ },
1304
+ ar: {
1305
+ "content-manager.content-types.plugin::bookings.booking.bookingCode.placeholder": "أدخل رمز الحجز المرجعي...",
1306
+ "content-manager.content-types.plugin::bookings.booking.title.placeholder": "أدخل العنوان...",
1307
+ "content-manager.content-types.plugin::bookings.booking.resource.placeholder": "أدخل المورد أو القاعة المحجوزة...",
1308
+ "content-manager.content-types.plugin::bookings.booking.customerName.placeholder": "أدخل اسم الزائر أو مقدم الطلب...",
1309
+ "content-manager.content-types.plugin::bookings.booking.customerEmail.placeholder": "info@mezquitabogota.org",
1310
+ "content-manager.content-types.plugin::bookings.booking.customerPhone.placeholder": "+57 310 555 0199",
1311
+ "content-manager.content-types.plugin::bookings.booking.organization.placeholder": "أدخل المؤسسة أو الجهة...",
1312
+ "content-manager.content-types.plugin::bookings.booking.startDate.placeholder": "YYYY-MM-DD",
1313
+ "content-manager.content-types.plugin::bookings.booking.endDate.placeholder": "YYYY-MM-DD",
1314
+ "content-manager.content-types.plugin::bookings.booking.slotLabel.placeholder": "مثال: 10:00 صباحاً",
1315
+ "content-manager.content-types.plugin::bookings.booking.timezone.placeholder": "America/Bogota",
1316
+ "content-manager.content-types.plugin::bookings.booking.partySize.placeholder": "أدخل عدد الأفراد (حجم المجموعة)...",
1317
+ "content-manager.content-types.plugin::bookings.booking.status.placeholder": "أدخل الحالة...",
1318
+ "content-manager.content-types.plugin::bookings.booking.preferredLanguage.placeholder": "مثال: es, en, ar, tr",
1319
+ "content-manager.content-types.plugin::bookings.booking.assignedHost.placeholder": "أدخل المضيف أو المرشد المعين...",
1320
+ "content-manager.content-types.plugin::bookings.booking.notes.placeholder": "أدخل ملاحظات...",
1321
+ "content-manager.content-types.plugin::bookings.booking.internalNotes.placeholder": "أدخل ملاحظات داخلية للموظفين...",
1322
+ "content-manager.content-types.plugin::bookings.booking.cancelTokenHash.placeholder": "أدخل تجزئة رمز الإلغاء...",
1323
+ "content-manager.content-types.plugin::bookings.booking.sourceCollection.placeholder": "أدخل المجموعة المصدرية...",
1324
+ "content-manager.content-types.plugin::bookings.booking.metadata.placeholder": "أدخل بيانات وصفية إضافية (JSON)...",
1325
+ "content-manager.content-types.plugin::bookings.booking.preferredGuideLanguage.placeholder": "مثال: es, en, ar, tr",
1326
+ "content-manager.content-types.plugin::bookings.booking.hijriDate.placeholder": "مثال: ١٥ رمضان ١٤٤٧ هـ",
1327
+ "content-manager.content-types.plugin::bookings.booking.documentId.placeholder": "أدخل معرف المستند...",
1328
+ "content-manager.content-types.plugin::bookings.resource.name.placeholder": "أدخل الاسم...",
1329
+ "content-manager.content-types.plugin::bookings.resource.slug.placeholder": "معرف-الرابط-التلقائي",
1330
+ "content-manager.content-types.plugin::bookings.resource.resourceType.placeholder": "أدخل نوع المورد...",
1331
+ "content-manager.content-types.plugin::bookings.resource.description.placeholder": "أدخل الوصف...",
1332
+ "content-manager.content-types.plugin::bookings.resource.color.placeholder": "#0F766E",
1333
+ "content-manager.content-types.plugin::bookings.resource.timezone.placeholder": "America/Bogota",
1334
+ "content-manager.content-types.plugin::bookings.resource.slotDurationMinutes.placeholder": "أدخل مدة الفترة الزمنية (بالدقائق)...",
1335
+ "content-manager.content-types.plugin::bookings.resource.bufferBeforeMinutes.placeholder": "أدخل فترة الفاصل قبل الموعد (بالدقائق)...",
1336
+ "content-manager.content-types.plugin::bookings.resource.bufferAfterMinutes.placeholder": "أدخل فترة الفاصل بعد الموعد (بالدقائق)...",
1337
+ "content-manager.content-types.plugin::bookings.resource.capacityPerSlot.placeholder": "أدخل السعة لكل فترة زمنية...",
1338
+ "content-manager.content-types.plugin::bookings.resource.maxPartySize.placeholder": "أدخل الحد الأقصى لحجم المجموعة...",
1339
+ "content-manager.content-types.plugin::bookings.resource.minLeadTimeHours.placeholder": "أدخل الحد الأدنى للمهلة قبل الحجز (بالساعات)...",
1340
+ "content-manager.content-types.plugin::bookings.resource.maxAdvanceDays.placeholder": "أدخل الحد الأقصى للحجز المسبق (بالأيام)...",
1341
+ "content-manager.content-types.plugin::bookings.resource.requiresApproval.placeholder": "أدخل يتطلب موافقة الإدارة...",
1342
+ "content-manager.content-types.plugin::bookings.resource.weeklySchedule.placeholder": "أدخل جدول التوفر الأسبوعي...",
1343
+ "content-manager.content-types.plugin::bookings.resource.seasonalSchedules.placeholder": "أدخل الجداول الموسمية الخاصة...",
1344
+ "content-manager.content-types.plugin::bookings.resource.holidayRules.placeholder": "أدخل قواعد العطلات والمناسبات...",
1345
+ "content-manager.content-types.plugin::bookings.resource.blackoutDates.placeholder": "أدخل التواريخ المحجوبة (غير المتاحة)...",
1346
+ "content-manager.content-types.plugin::bookings.resource.recurrenceRule.placeholder": "أدخل قاعدة التكرار (RRULE)...",
1347
+ "content-manager.content-types.plugin::bookings.resource.supportedLanguages.placeholder": "مثال: es, en, ar, tr",
1348
+ "content-manager.content-types.plugin::bookings.resource.assignedHosts.placeholder": "أدخل المضيفون أو المرشدون المعينون...",
1349
+ "content-manager.content-types.plugin::bookings.resource.location.placeholder": "أدخل الموقع / القاعة...",
1350
+ "content-manager.content-types.plugin::bookings.resource.price.placeholder": "أدخل السعر / الرسوم...",
1351
+ "content-manager.content-types.plugin::bookings.resource.currency.placeholder": "مثال: COP أو USD",
1352
+ "content-manager.content-types.plugin::bookings.resource.isActive.placeholder": "أدخل نشط...",
1353
+ "content-manager.content-types.plugin::bookings.resource.metadata.placeholder": "أدخل بيانات وصفية إضافية (JSON)...",
1354
+ "content-manager.content-types.plugin::bookings.resource.bookings.placeholder": "أدخل الحجوزات المرتبطة...",
1355
+ "content-manager.content-types.plugin::bookings.resource.documentId.placeholder": "أدخل معرف المستند..."
1356
+ },
1357
+ tr: {
1358
+ "content-manager.content-types.plugin::bookings.booking.bookingCode.placeholder": "Rezervasyon Kodu girin...",
1359
+ "content-manager.content-types.plugin::bookings.booking.title.placeholder": "Başlık girin...",
1360
+ "content-manager.content-types.plugin::bookings.booking.resource.placeholder": "Rezerve Edilen Kaynak / Alan girin...",
1361
+ "content-manager.content-types.plugin::bookings.booking.customerName.placeholder": "Ziyaretçi / Başvuru Sahibi Adı girin...",
1362
+ "content-manager.content-types.plugin::bookings.booking.customerEmail.placeholder": "info@mezquitabogota.org",
1363
+ "content-manager.content-types.plugin::bookings.booking.customerPhone.placeholder": "+57 310 555 0199",
1364
+ "content-manager.content-types.plugin::bookings.booking.organization.placeholder": "Kurum / Organizasyon girin...",
1365
+ "content-manager.content-types.plugin::bookings.booking.startDate.placeholder": "YYYY-MM-DD",
1366
+ "content-manager.content-types.plugin::bookings.booking.endDate.placeholder": "YYYY-MM-DD",
1367
+ "content-manager.content-types.plugin::bookings.booking.slotLabel.placeholder": "örn., 10:00",
1368
+ "content-manager.content-types.plugin::bookings.booking.timezone.placeholder": "America/Bogota",
1369
+ "content-manager.content-types.plugin::bookings.booking.partySize.placeholder": "Kişi Sayısı (Grup Büyüklüğü) girin...",
1370
+ "content-manager.content-types.plugin::bookings.booking.status.placeholder": "Durum girin...",
1371
+ "content-manager.content-types.plugin::bookings.booking.preferredLanguage.placeholder": "örn., es, en, ar, tr",
1372
+ "content-manager.content-types.plugin::bookings.booking.assignedHost.placeholder": "Atanan Rehber / Görevli girin...",
1373
+ "content-manager.content-types.plugin::bookings.booking.notes.placeholder": "Notlar girin...",
1374
+ "content-manager.content-types.plugin::bookings.booking.internalNotes.placeholder": "Dahili Personel Notları girin...",
1375
+ "content-manager.content-types.plugin::bookings.booking.cancelTokenHash.placeholder": "İptal Jetonu Özeti (Hash) girin...",
1376
+ "content-manager.content-types.plugin::bookings.booking.sourceCollection.placeholder": "Kaynak Koleksiyon girin...",
1377
+ "content-manager.content-types.plugin::bookings.booking.metadata.placeholder": "Ek Meta Veriler (JSON) girin...",
1378
+ "content-manager.content-types.plugin::bookings.booking.preferredGuideLanguage.placeholder": "örn., es, en, ar, tr",
1379
+ "content-manager.content-types.plugin::bookings.booking.hijriDate.placeholder": "örn., 15 Ramazan 1447 H",
1380
+ "content-manager.content-types.plugin::bookings.booking.documentId.placeholder": "Belge Kimliği (ID) girin...",
1381
+ "content-manager.content-types.plugin::bookings.resource.name.placeholder": "Ad girin...",
1382
+ "content-manager.content-types.plugin::bookings.resource.slug.placeholder": "otomatik-url-kisa-adi",
1383
+ "content-manager.content-types.plugin::bookings.resource.resourceType.placeholder": "Kaynak Türü girin...",
1384
+ "content-manager.content-types.plugin::bookings.resource.description.placeholder": "Açıklama girin...",
1385
+ "content-manager.content-types.plugin::bookings.resource.color.placeholder": "#0F766E",
1386
+ "content-manager.content-types.plugin::bookings.resource.timezone.placeholder": "America/Bogota",
1387
+ "content-manager.content-types.plugin::bookings.resource.slotDurationMinutes.placeholder": "Seans Süresi (Dakika) girin...",
1388
+ "content-manager.content-types.plugin::bookings.resource.bufferBeforeMinutes.placeholder": "Seans Öncesi Ara Süre (Dakika) girin...",
1389
+ "content-manager.content-types.plugin::bookings.resource.bufferAfterMinutes.placeholder": "Seans Sonrası Ara Süre (Dakika) girin...",
1390
+ "content-manager.content-types.plugin::bookings.resource.capacityPerSlot.placeholder": "Seans Başına Kapasite girin...",
1391
+ "content-manager.content-types.plugin::bookings.resource.maxPartySize.placeholder": "Maksimum Grup Büyüklüğü girin...",
1392
+ "content-manager.content-types.plugin::bookings.resource.minLeadTimeHours.placeholder": "Minimum Ön Bildirim Süresi (Saat) girin...",
1393
+ "content-manager.content-types.plugin::bookings.resource.maxAdvanceDays.placeholder": "Maksimum İleri Tarihli Rezervasyon (Gün) girin...",
1394
+ "content-manager.content-types.plugin::bookings.resource.requiresApproval.placeholder": "Yönetici Onayı Gerektirir girin...",
1395
+ "content-manager.content-types.plugin::bookings.resource.weeklySchedule.placeholder": "Haftalık Uygunluk Programı girin...",
1396
+ "content-manager.content-types.plugin::bookings.resource.seasonalSchedules.placeholder": "Mevsimsel / Dönemsel Programlar girin...",
1397
+ "content-manager.content-types.plugin::bookings.resource.holidayRules.placeholder": "Tatil ve Bayram Kuralları girin...",
1398
+ "content-manager.content-types.plugin::bookings.resource.blackoutDates.placeholder": "Kapalı / Uygun Olmayan Tarihler girin...",
1399
+ "content-manager.content-types.plugin::bookings.resource.recurrenceRule.placeholder": "Tekrarlama Kuralı (RRULE) girin...",
1400
+ "content-manager.content-types.plugin::bookings.resource.supportedLanguages.placeholder": "örn., es, en, ar, tr",
1401
+ "content-manager.content-types.plugin::bookings.resource.assignedHosts.placeholder": "Atanan Rehberler / Görevliler girin...",
1402
+ "content-manager.content-types.plugin::bookings.resource.location.placeholder": "Konum / Mekan girin...",
1403
+ "content-manager.content-types.plugin::bookings.resource.price.placeholder": "Ücret / Fiyat girin...",
1404
+ "content-manager.content-types.plugin::bookings.resource.currency.placeholder": "örn., COP veya USD",
1405
+ "content-manager.content-types.plugin::bookings.resource.isActive.placeholder": "Aktif girin...",
1406
+ "content-manager.content-types.plugin::bookings.resource.metadata.placeholder": "Ek Meta Veriler (JSON) girin...",
1407
+ "content-manager.content-types.plugin::bookings.resource.bookings.placeholder": "İlgili Rezervasyonlar girin...",
1408
+ "content-manager.content-types.plugin::bookings.resource.documentId.placeholder": "Belge Kimliği (ID) girin..."
1409
+ }
1410
+ };
1411
+ const LOCALES = [
1412
+ "en",
1413
+ "es",
1414
+ "ar",
1415
+ "fr",
1416
+ "de",
1417
+ "pt",
1418
+ "tr",
1419
+ "id",
1420
+ "ur",
1421
+ "zh"
1422
+ ];
1423
+ const index = {
1424
+ register(app) {
1425
+ app.addMenuLink({
1426
+ to: `plugins/${PLUGIN_ID}`,
1427
+ icon: PluginIcon,
1428
+ intlLabel: {
1429
+ id: `${PLUGIN_ID}.plugin.name`,
1430
+ defaultMessage: "Bookings"
1431
+ },
1432
+ Component: () => import("./App-BrB9n7EO.mjs").then((mod) => ({
1433
+ default: mod.App
1434
+ })),
1435
+ permissions: []
1436
+ });
1437
+ const calendarSuiteSection = {
1438
+ id: "calendar",
1439
+ intlLabel: {
1440
+ id: "calendar.settings.section",
1441
+ defaultMessage: "Calendar, Events & Bookings"
1442
+ }
1443
+ };
1444
+ const bookingsSettingsLink = {
1445
+ intlLabel: {
1446
+ id: `${PLUGIN_ID}.settings.link`,
1447
+ defaultMessage: "Bookings & Availability"
1448
+ },
1449
+ id: `${PLUGIN_ID}-settings`,
1450
+ to: `${PLUGIN_ID}`,
1451
+ Component: () => import("./SettingsPage-Xas3gvn4.mjs").then((mod) => ({
1452
+ default: mod.SettingsPage
1453
+ })),
1454
+ permissions: []
1455
+ };
1456
+ try {
1457
+ if (typeof app.addSettingsLink === "function") {
1458
+ app.addSettingsLink(calendarSuiteSection.id, bookingsSettingsLink);
1459
+ } else {
1460
+ app.createSettingSection(calendarSuiteSection, [bookingsSettingsLink]);
1461
+ }
1462
+ } catch {
1463
+ app.createSettingSection(calendarSuiteSection, [bookingsSettingsLink]);
1464
+ }
1465
+ app.registerPlugin({
1466
+ id: PLUGIN_ID,
1467
+ initializer: Initializer,
1468
+ isReady: false,
1469
+ name: PLUGIN_ID
1470
+ });
1471
+ },
1472
+ bootstrap() {
1473
+ },
1474
+ registerTrads: createRegisterTrads({
1475
+ pluginId: PLUGIN_ID,
1476
+ defaultLocales: ["en", "es", "ar", "tr"],
1477
+ loadTranslation: (locale) => __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/ar.json": () => import("./ar-CrM4yxqb.mjs"), "./translations/de.json": () => import("./de-D3NbAP6M.mjs"), "./translations/en.json": () => import("./en-Cu-rn_xM.mjs"), "./translations/es.json": () => import("./es-Y0zfya4P.mjs"), "./translations/fr.json": () => import("./fr-BrzKRqet.mjs"), "./translations/id.json": () => import("./id-BZz53ViW.mjs"), "./translations/pt.json": () => import("./pt-DUfISuZf.mjs"), "./translations/tr.json": () => import("./tr-_nhc9hk6.mjs"), "./translations/ur.json": () => import("./ur-8edBd0Qo.mjs"), "./translations/zh.json": () => import("./zh-CeR0swEm.mjs") }), `./translations/${locale}.json`, 3),
1478
+ getBaseTranslations: (locale) => ({
1479
+ ...CM_LABEL_TRANSLATIONS[locale] ?? CM_LABEL_TRANSLATIONS.en,
1480
+ ...CM_PLACEHOLDER_TRANSLATIONS[locale] ?? CM_PLACEHOLDER_TRANSLATIONS.en
1481
+ })
1482
+ })
1483
+ };
1484
+ export {
1485
+ BookingSidePanel,
1486
+ BookingsGridCanvas,
1487
+ LOCALES,
1488
+ PLUGIN_ID,
1489
+ QuickCreateBookingModal,
1490
+ RRuleInput,
1491
+ index as default
1492
+ };