@burdenoff/microfe-tours 2026.518.2 → 2026.523.1

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 (52) hide show
  1. package/dist/index.js +2 -1
  2. package/dist/tours/ToursAdminRoot.d.ts.map +1 -1
  3. package/dist/tours/ToursAdminRoot.js +23 -20
  4. package/dist/tours/ToursAdminRoot.js.map +1 -1
  5. package/dist/tours/ToursUserRoot.d.ts.map +1 -1
  6. package/dist/tours/ToursUserRoot.js +25 -22
  7. package/dist/tours/ToursUserRoot.js.map +1 -1
  8. package/dist/tours/hooks/useMediaLibrary.js +3 -3
  9. package/dist/tours/hooks/useTourBuilder.js +10 -10
  10. package/dist/tours/hooks/useTourLifecycle.js +3 -3
  11. package/dist/tours/i18n.d.ts +5 -1
  12. package/dist/tours/i18n.d.ts.map +1 -1
  13. package/dist/tours/i18n.js +4 -0
  14. package/dist/tours/i18n.js.map +1 -1
  15. package/dist/tours/index.d.ts +1 -0
  16. package/dist/tours/index.d.ts.map +1 -1
  17. package/dist/tours/index.js +1 -0
  18. package/dist/tours/pages/AnalyticsDashboardPage.d.ts.map +1 -1
  19. package/dist/tours/pages/AnalyticsDashboardPage.js +5 -5
  20. package/dist/tours/pages/AnalyticsDashboardPage.js.map +1 -1
  21. package/dist/tours/pages/MediaLibraryPage.d.ts.map +1 -1
  22. package/dist/tours/pages/MediaLibraryPage.js +97 -96
  23. package/dist/tours/pages/MediaLibraryPage.js.map +1 -1
  24. package/dist/tours/pages/SchedulerPage.d.ts.map +1 -1
  25. package/dist/tours/pages/SchedulerPage.js +129 -126
  26. package/dist/tours/pages/SchedulerPage.js.map +1 -1
  27. package/dist/tours/pages/StepEditorPage.d.ts.map +1 -1
  28. package/dist/tours/pages/StepEditorPage.js +133 -128
  29. package/dist/tours/pages/StepEditorPage.js.map +1 -1
  30. package/dist/tours/pages/SystemAnalyticsPage.d.ts.map +1 -1
  31. package/dist/tours/pages/SystemAnalyticsPage.js +3 -3
  32. package/dist/tours/pages/SystemAnalyticsPage.js.map +1 -1
  33. package/dist/tours/pages/TemplateLibraryPage.d.ts.map +1 -1
  34. package/dist/tours/pages/TemplateLibraryPage.js +97 -94
  35. package/dist/tours/pages/TemplateLibraryPage.js.map +1 -1
  36. package/dist/tours/pages/TourBuilderPage.d.ts.map +1 -1
  37. package/dist/tours/pages/TourBuilderPage.js +232 -230
  38. package/dist/tours/pages/TourBuilderPage.js.map +1 -1
  39. package/dist/tours/pages/TourPreviewPage.d.ts.map +1 -1
  40. package/dist/tours/pages/TourPreviewPage.js +20 -18
  41. package/dist/tours/pages/TourPreviewPage.js.map +1 -1
  42. package/dist/tours/pages/ToursListPage.js +14 -14
  43. package/dist/tours/pages/ToursListPage.js.map +1 -1
  44. package/dist/tours/store/toursStore.d.ts +1 -0
  45. package/dist/tours/store/toursStore.d.ts.map +1 -1
  46. package/dist/tours/store/toursStore.js +14 -0
  47. package/dist/tours/store/toursStore.js.map +1 -1
  48. package/dist/tours/telemetry.d.ts +9 -0
  49. package/dist/tours/telemetry.d.ts.map +1 -0
  50. package/dist/tours/telemetry.js +19 -0
  51. package/dist/tours/telemetry.js.map +1 -0
  52. package/package.json +2 -2
@@ -1,188 +1,189 @@
1
- import { useToursPermissionAccess as e } from "../hooks/useToursPermissionAccess.js";
2
- import { TOUR_PERMISSIONS as t } from "../../constants/permissions.js";
3
- import { formatFileSize as n } from "../utils/index.js";
4
- import { useMediaLibrary as r } from "../hooks/useMediaLibrary.js";
5
- import { useCallback as i, useEffect as a, useState as o } from "react";
6
- import { PermissionGate as s } from "@burdenoff/fe-libs/shared/components";
7
- import { FileText as c, Image as l, Music as u, Search as d, Trash2 as f, Upload as p, Video as m } from "lucide-react";
8
- import { jsx as h, jsxs as g } from "react/jsx-runtime";
9
- import { useI18n as _ } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
1
+ import { useToursContext as e } from "../providers/ToursProvider.js";
2
+ import { useToursPermissionAccess as t } from "../hooks/useToursPermissionAccess.js";
3
+ import { TOUR_PERMISSIONS as n } from "../../constants/permissions.js";
4
+ import { emitToursApiFailed as r } from "../telemetry.js";
5
+ import { formatFileSize as i } from "../utils/index.js";
6
+ import { useMediaLibrary as a } from "../hooks/useMediaLibrary.js";
7
+ import { useCallback as o, useEffect as s, useState as c } from "react";
8
+ import { PermissionGate as l } from "@burdenoff/fe-libs/shared/components";
9
+ import { FileText as u, Image as d, Music as f, Search as p, Trash2 as m, Upload as h, Video as g } from "lucide-react";
10
+ import { jsx as _, jsxs as v } from "react/jsx-runtime";
11
+ import { useI18n as y } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
12
+ import { useEventBus as b } from "@burdenoff/fe-libs/shared/events";
10
13
  //#region src/tours/pages/MediaLibraryPage.tsx
11
- function v() {
12
- let { t: v } = _(), y = i((e, t) => {
13
- let n = v(e);
14
+ function x() {
15
+ let { t: x } = y(), S = o((e, t) => {
16
+ let n = x(e);
14
17
  return n === e ? t : n;
15
- }, [v]), { hasPermission: b, isLoading: x } = e(), S = b(t.TOUR_MEDIA_LIST);
16
- b(t.TOUR_MEDIA_CREATE);
17
- let C = b(t.TOUR_MEDIA_DELETE), { media: w, fetchMedia: T, uploadMedia: E, deleteMedia: D, uploadProgress: O } = r(), [k, A] = o(""), [j, M] = o("all");
18
- a(() => {
19
- x || !S || T(j === "all" ? void 0 : j, k);
18
+ }, [x]), C = e(), w = b(), { hasPermission: T, isLoading: E } = t(), D = T(n.TOUR_MEDIA_LIST), O = T(n.TOUR_MEDIA_DELETE), { media: k, fetchMedia: A, uploadMedia: j, deleteMedia: M, uploadProgress: N } = a(), [P, F] = c(""), [I, L] = c("all");
19
+ s(() => {
20
+ E || !D || A(I === "all" ? void 0 : I, P);
20
21
  }, [
21
- T,
22
- j,
23
- k,
24
- x,
25
- S
22
+ A,
23
+ I,
24
+ P,
25
+ E,
26
+ D
26
27
  ]);
27
- let N = async (e) => {
28
+ let R = async (e) => {
28
29
  if (e) {
29
30
  for (let t = 0; t < e.length; t++) try {
30
- await E(e[t]);
31
- } catch (e) {
32
- console.error("Failed to upload file:", e);
31
+ await j(e[t]);
32
+ } catch {
33
+ r(w, "media.upload", C);
33
34
  }
34
- T(j === "all" ? void 0 : j, k);
35
+ A(I === "all" ? void 0 : I, P);
35
36
  }
36
- }, P = (e) => {
37
+ }, z = (e) => {
37
38
  switch (e) {
38
- case "IMAGE": return /* @__PURE__ */ h(l, { size: 20 });
39
- case "VIDEO": return /* @__PURE__ */ h(m, { size: 20 });
40
- case "AUDIO": return /* @__PURE__ */ h(u, { size: 20 });
41
- case "DOCUMENT": return /* @__PURE__ */ h(c, { size: 20 });
39
+ case "IMAGE": return /* @__PURE__ */ _(d, { size: 20 });
40
+ case "VIDEO": return /* @__PURE__ */ _(g, { size: 20 });
41
+ case "AUDIO": return /* @__PURE__ */ _(f, { size: 20 });
42
+ case "DOCUMENT": return /* @__PURE__ */ _(u, { size: 20 });
42
43
  }
43
44
  };
44
- return /* @__PURE__ */ g("div", {
45
+ return /* @__PURE__ */ v("div", {
45
46
  className: "space-y-4 sm:space-y-6 p-3 sm:p-6",
46
47
  children: [
47
- /* @__PURE__ */ g("div", {
48
+ /* @__PURE__ */ v("div", {
48
49
  className: "flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3",
49
- children: [/* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("h1", {
50
+ children: [/* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("h1", {
50
51
  className: "text-xl sm:text-2xl font-bold",
51
- children: y("mediaLibrary.title", "Media Library")
52
- }), /* @__PURE__ */ h("p", {
52
+ children: S("mediaLibrary.title", "Media Library")
53
+ }), /* @__PURE__ */ _("p", {
53
54
  className: "text-sm text-muted-foreground",
54
- children: y("mediaLibrary.subtitle", "Upload and manage media for tour steps")
55
- })] }), /* @__PURE__ */ h(s, {
56
- permission: t.TOUR_MEDIA_CREATE,
57
- children: /* @__PURE__ */ g("label", {
55
+ children: S("mediaLibrary.subtitle", "Upload and manage media for tour steps")
56
+ })] }), /* @__PURE__ */ _(l, {
57
+ permission: n.TOUR_MEDIA_CREATE,
58
+ children: /* @__PURE__ */ v("label", {
58
59
  className: "w-full sm:w-auto px-4 py-2 bg-primary text-primary-foreground rounded-md hover:bg-primary/90 cursor-pointer flex items-center justify-center gap-2",
59
60
  children: [
60
- /* @__PURE__ */ h(p, { size: 20 }),
61
- y("mediaLibrary.uploadMedia", "Upload Media"),
62
- /* @__PURE__ */ h("input", {
61
+ /* @__PURE__ */ _(h, { size: 20 }),
62
+ S("mediaLibrary.uploadMedia", "Upload Media"),
63
+ /* @__PURE__ */ _("input", {
63
64
  type: "file",
64
65
  multiple: !0,
65
66
  accept: "image/*,video/*,audio/*,.pdf,.doc,.docx",
66
- onChange: (e) => N(e.target.files),
67
+ onChange: (e) => R(e.target.files),
67
68
  className: "hidden"
68
69
  })
69
70
  ]
70
71
  })
71
72
  })]
72
73
  }),
73
- /* @__PURE__ */ g("div", {
74
+ /* @__PURE__ */ v("div", {
74
75
  className: "flex flex-col sm:flex-row gap-3",
75
- children: [/* @__PURE__ */ g("div", {
76
+ children: [/* @__PURE__ */ v("div", {
76
77
  className: "flex-1 relative",
77
- children: [/* @__PURE__ */ h(d, {
78
+ children: [/* @__PURE__ */ _(p, {
78
79
  className: "absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground",
79
80
  size: 20
80
- }), /* @__PURE__ */ h("input", {
81
+ }), /* @__PURE__ */ _("input", {
81
82
  type: "text",
82
- placeholder: y("mediaLibrary.searchPlaceholder", "Search media..."),
83
- value: k,
84
- onChange: (e) => A(e.target.value),
85
- className: "w-full pl-[3.25rem] pr-4 py-2 border border-border rounded-md bg-background"
83
+ placeholder: S("mediaLibrary.searchPlaceholder", "Search media..."),
84
+ value: P,
85
+ onChange: (e) => F(e.target.value),
86
+ className: "w-full pl-[3.25rem] pr-4 py-2 min-h-[44px] border border-border rounded-md bg-background"
86
87
  })]
87
- }), /* @__PURE__ */ g("select", {
88
- value: j,
89
- onChange: (e) => M(e.target.value),
90
- className: "px-4 py-2 border border-border rounded-md bg-background",
88
+ }), /* @__PURE__ */ v("select", {
89
+ value: I,
90
+ onChange: (e) => L(e.target.value),
91
+ className: "px-4 py-2 min-h-[44px] border border-border rounded-md bg-background",
91
92
  children: [
92
- /* @__PURE__ */ h("option", {
93
+ /* @__PURE__ */ _("option", {
93
94
  value: "all",
94
- children: y("mediaLibrary.allTypes", "All Types")
95
+ children: S("mediaLibrary.allTypes", "All Types")
95
96
  }),
96
- /* @__PURE__ */ h("option", {
97
+ /* @__PURE__ */ _("option", {
97
98
  value: "IMAGE",
98
- children: y("mediaLibrary.typeImages", "Images")
99
+ children: S("mediaLibrary.typeImages", "Images")
99
100
  }),
100
- /* @__PURE__ */ h("option", {
101
+ /* @__PURE__ */ _("option", {
101
102
  value: "VIDEO",
102
- children: y("mediaLibrary.typeVideos", "Videos")
103
+ children: S("mediaLibrary.typeVideos", "Videos")
103
104
  }),
104
- /* @__PURE__ */ h("option", {
105
+ /* @__PURE__ */ _("option", {
105
106
  value: "AUDIO",
106
- children: y("mediaLibrary.typeAudio", "Audio")
107
+ children: S("mediaLibrary.typeAudio", "Audio")
107
108
  }),
108
- /* @__PURE__ */ h("option", {
109
+ /* @__PURE__ */ _("option", {
109
110
  value: "DOCUMENT",
110
- children: y("mediaLibrary.typeDocuments", "Documents")
111
+ children: S("mediaLibrary.typeDocuments", "Documents")
111
112
  })
112
113
  ]
113
114
  })]
114
115
  }),
115
- Object.keys(O).length > 0 && /* @__PURE__ */ h("div", {
116
+ Object.keys(N).length > 0 && /* @__PURE__ */ _("div", {
116
117
  className: "space-y-2",
117
- children: Object.entries(O).map(([e, t]) => /* @__PURE__ */ g("div", {
118
+ children: Object.entries(N).map(([e, t]) => /* @__PURE__ */ v("div", {
118
119
  className: "border border-border rounded-md p-3",
119
- children: [/* @__PURE__ */ g("div", {
120
+ children: [/* @__PURE__ */ v("div", {
120
121
  className: "flex items-center justify-between mb-2",
121
- children: [/* @__PURE__ */ h("span", {
122
+ children: [/* @__PURE__ */ _("span", {
122
123
  className: "text-sm",
123
- children: y("mediaLibrary.uploading", "Uploading...")
124
- }), /* @__PURE__ */ g("span", {
124
+ children: S("mediaLibrary.uploading", "Uploading...")
125
+ }), /* @__PURE__ */ v("span", {
125
126
  className: "text-sm text-muted-foreground",
126
127
  children: [t, "%"]
127
128
  })]
128
- }), /* @__PURE__ */ h("div", {
129
+ }), /* @__PURE__ */ _("div", {
129
130
  className: "w-full bg-muted rounded-full h-2",
130
- children: /* @__PURE__ */ h("div", {
131
+ children: /* @__PURE__ */ _("div", {
131
132
  className: "bg-primary h-2 rounded-full transition-all",
132
133
  style: { width: `${t}%` }
133
134
  })
134
135
  })]
135
136
  }, e))
136
137
  }),
137
- w.length > 0 ? /* @__PURE__ */ h("div", {
138
+ k.length > 0 ? /* @__PURE__ */ _("div", {
138
139
  className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",
139
- children: w.map((e) => /* @__PURE__ */ g("div", {
140
+ children: k.map((e) => /* @__PURE__ */ v("div", {
140
141
  className: "border border-border rounded-md overflow-hidden hover:shadow-md transition-shadow",
141
- children: [/* @__PURE__ */ h("div", {
142
+ children: [/* @__PURE__ */ _("div", {
142
143
  className: "aspect-video bg-muted flex items-center justify-center",
143
- children: e.type === "IMAGE" ? /* @__PURE__ */ h("img", {
144
+ children: e.type === "IMAGE" ? /* @__PURE__ */ _("img", {
144
145
  src: e.cdnUrl,
145
146
  alt: e.altText || e.name,
146
147
  className: "w-full h-full object-cover"
147
- }) : /* @__PURE__ */ h("div", {
148
+ }) : /* @__PURE__ */ _("div", {
148
149
  className: "text-muted-foreground",
149
- children: P(e.type)
150
+ children: z(e.type)
150
151
  })
151
- }), /* @__PURE__ */ g("div", {
152
+ }), /* @__PURE__ */ v("div", {
152
153
  className: "p-3",
153
154
  children: [
154
- /* @__PURE__ */ h("h3", {
155
+ /* @__PURE__ */ _("h3", {
155
156
  className: "font-medium text-sm truncate",
156
157
  children: e.name
157
158
  }),
158
- /* @__PURE__ */ g("div", {
159
+ /* @__PURE__ */ v("div", {
159
160
  className: "flex items-center justify-between mt-2 text-xs text-muted-foreground",
160
- children: [/* @__PURE__ */ h("span", { children: e.type }), /* @__PURE__ */ h("span", { children: n(e.size) })]
161
+ children: [/* @__PURE__ */ _("span", { children: e.type }), /* @__PURE__ */ _("span", { children: i(e.size) })]
161
162
  }),
162
- C && /* @__PURE__ */ g("button", {
163
+ O && /* @__PURE__ */ v("button", {
163
164
  onClick: () => {
164
- window.confirm(y("mediaLibrary.deleteConfirm", "Delete this media?")) && D(e.id);
165
+ window.confirm(S("mediaLibrary.deleteConfirm", "Delete this media?")) && M(e.id);
165
166
  },
166
- className: "mt-2 w-full px-2 py-1 text-xs text-destructive border border-destructive/30 rounded hover:bg-destructive/10 flex items-center justify-center gap-1",
167
- children: [/* @__PURE__ */ h(f, { size: 12 }), y("mediaLibrary.delete", "Delete")]
167
+ className: "mt-2 w-full px-2 py-2 min-h-[44px] text-xs text-destructive border border-destructive/30 rounded hover:bg-destructive/10 flex items-center justify-center gap-1",
168
+ children: [/* @__PURE__ */ _(m, { size: 12 }), S("mediaLibrary.delete", "Delete")]
168
169
  })
169
170
  ]
170
171
  })]
171
172
  }, e.id))
172
- }) : /* @__PURE__ */ g("div", {
173
+ }) : /* @__PURE__ */ v("div", {
173
174
  className: "text-center py-12 border border-dashed border-border rounded-md",
174
175
  children: [
175
- /* @__PURE__ */ h(p, {
176
+ /* @__PURE__ */ _(h, {
176
177
  className: "mx-auto mb-4 text-muted-foreground",
177
178
  size: 48
178
179
  }),
179
- /* @__PURE__ */ h("p", {
180
+ /* @__PURE__ */ _("p", {
180
181
  className: "text-muted-foreground mb-2",
181
- children: y("mediaLibrary.noMedia", "No media files")
182
+ children: S("mediaLibrary.noMedia", "No media files")
182
183
  }),
183
- /* @__PURE__ */ h("p", {
184
+ /* @__PURE__ */ _("p", {
184
185
  className: "text-sm text-muted-foreground",
185
- children: y("mediaLibrary.uploadFirstMedia", "Upload your first media file to get started")
186
+ children: S("mediaLibrary.uploadFirstMedia", "Upload your first media file to get started")
186
187
  })
187
188
  ]
188
189
  })
@@ -190,6 +191,6 @@ function v() {
190
191
  });
191
192
  }
192
193
  //#endregion
193
- export { v as MediaLibraryPage };
194
+ export { x as MediaLibraryPage };
194
195
 
195
196
  //# sourceMappingURL=MediaLibraryPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MediaLibraryPage.js","names":[],"sources":["../../../src/tours/pages/MediaLibraryPage.tsx"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react';\nimport { Upload, Search, Image as ImageIcon, Video, Music, FileText, Trash2 } from 'lucide-react';\nimport { PermissionGate } from '@burdenoff/fe-libs/shared/components';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { useMediaLibrary } from '../hooks/useMediaLibrary';\nimport { useToursPermissionAccess } from '../hooks/useToursPermissionAccess';\nimport { TOUR_PERMISSIONS } from '../../constants/permissions';\nimport { formatFileSize } from '../utils';\nimport type { TourMediaType } from '../types';\n\n/**\n * Media library page\n * Browse, upload, and manage tour media\n */\nexport function MediaLibraryPage() {\n const { t } = useI18n();\n const tr = useCallback(\n (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n },\n [t]\n );\n\n const { hasPermission, isLoading: permissionsLoading } = useToursPermissionAccess();\n const canListMedia = hasPermission(TOUR_PERMISSIONS.TOUR_MEDIA_LIST);\n const canUploadMedia = hasPermission(TOUR_PERMISSIONS.TOUR_MEDIA_CREATE);\n const canDeleteMedia = hasPermission(TOUR_PERMISSIONS.TOUR_MEDIA_DELETE);\n\n const { media, fetchMedia, uploadMedia, deleteMedia, uploadProgress } = useMediaLibrary();\n\n const [searchQuery, setSearchQuery] = useState('');\n const [typeFilter, setTypeFilter] = useState<TourMediaType | 'all'>('all');\n\n useEffect(() => {\n if (permissionsLoading || !canListMedia) return;\n fetchMedia(typeFilter === 'all' ? undefined : typeFilter, searchQuery);\n }, [fetchMedia, typeFilter, searchQuery, permissionsLoading, canListMedia]);\n\n const handleFileUpload = async (files: FileList | null) => {\n if (!files) return;\n\n for (let i = 0; i < files.length; i++) {\n try {\n await uploadMedia(files[i]);\n } catch (error) {\n console.error('Failed to upload file:', error);\n }\n }\n\n // Refresh media list\n fetchMedia(typeFilter === 'all' ? undefined : typeFilter, searchQuery);\n };\n\n const getMediaIcon = (type: TourMediaType) => {\n switch (type) {\n case 'IMAGE':\n return <ImageIcon size={20} />;\n case 'VIDEO':\n return <Video size={20} />;\n case 'AUDIO':\n return <Music size={20} />;\n case 'DOCUMENT':\n return <FileText size={20} />;\n }\n };\n\n return (\n <div className=\"space-y-4 sm:space-y-6 p-3 sm:p-6\">\n {/* Header */}\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3\">\n <div>\n <h1 className=\"text-xl sm:text-2xl font-bold\">\n {tr('mediaLibrary.title', 'Media Library')}\n </h1>\n <p className=\"text-sm text-muted-foreground\">\n {tr('mediaLibrary.subtitle', 'Upload and manage media for tour steps')}\n </p>\n </div>\n <PermissionGate permission={TOUR_PERMISSIONS.TOUR_MEDIA_CREATE}>\n <label className=\"w-full sm:w-auto px-4 py-2 bg-primary text-primary-foreground rounded-md hover:bg-primary/90 cursor-pointer flex items-center justify-center gap-2\">\n <Upload size={20} />\n {tr('mediaLibrary.uploadMedia', 'Upload Media')}\n <input\n type=\"file\"\n multiple\n accept=\"image/*,video/*,audio/*,.pdf,.doc,.docx\"\n onChange={(e) => handleFileUpload(e.target.files)}\n className=\"hidden\"\n />\n </label>\n </PermissionGate>\n </div>\n\n {/* Filters */}\n <div className=\"flex flex-col sm:flex-row gap-3\">\n <div className=\"flex-1 relative\">\n <Search\n className=\"absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground\"\n size={20}\n />\n <input\n type=\"text\"\n placeholder={tr('mediaLibrary.searchPlaceholder', 'Search media...')}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"w-full pl-[3.25rem] pr-4 py-2 border border-border rounded-md bg-background\"\n />\n </div>\n <select\n value={typeFilter}\n onChange={(e) => setTypeFilter(e.target.value as TourMediaType | 'all')}\n className=\"px-4 py-2 border border-border rounded-md bg-background\"\n >\n <option value=\"all\">{tr('mediaLibrary.allTypes', 'All Types')}</option>\n <option value=\"IMAGE\">{tr('mediaLibrary.typeImages', 'Images')}</option>\n <option value=\"VIDEO\">{tr('mediaLibrary.typeVideos', 'Videos')}</option>\n <option value=\"AUDIO\">{tr('mediaLibrary.typeAudio', 'Audio')}</option>\n <option value=\"DOCUMENT\">{tr('mediaLibrary.typeDocuments', 'Documents')}</option>\n </select>\n </div>\n\n {/* Upload Progress */}\n {Object.keys(uploadProgress).length > 0 && (\n <div className=\"space-y-2\">\n {Object.entries(uploadProgress).map(([fileId, progress]) => (\n <div key={fileId} className=\"border border-border rounded-md p-3\">\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-sm\">{tr('mediaLibrary.uploading', 'Uploading...')}</span>\n <span className=\"text-sm text-muted-foreground\">{progress}%</span>\n </div>\n <div className=\"w-full bg-muted rounded-full h-2\">\n <div\n className=\"bg-primary h-2 rounded-full transition-all\"\n style={{ width: `${progress}%` }}\n />\n </div>\n </div>\n ))}\n </div>\n )}\n\n {/* Media Grid */}\n {media.length > 0 ? (\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4\">\n {media.map((item) => (\n <div\n key={item.id}\n className=\"border border-border rounded-md overflow-hidden hover:shadow-md transition-shadow\"\n >\n {/* Thumbnail */}\n <div className=\"aspect-video bg-muted flex items-center justify-center\">\n {item.type === 'IMAGE' ? (\n <img\n src={item.cdnUrl}\n alt={item.altText || item.name}\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <div className=\"text-muted-foreground\">{getMediaIcon(item.type)}</div>\n )}\n </div>\n\n {/* Info */}\n <div className=\"p-3\">\n <h3 className=\"font-medium text-sm truncate\">{item.name}</h3>\n <div className=\"flex items-center justify-between mt-2 text-xs text-muted-foreground\">\n <span>{item.type}</span>\n <span>{formatFileSize(item.size)}</span>\n </div>\n {canDeleteMedia && (\n <button\n onClick={() => {\n if (window.confirm(tr('mediaLibrary.deleteConfirm', 'Delete this media?')))\n deleteMedia(item.id);\n }}\n className=\"mt-2 w-full px-2 py-1 text-xs text-destructive border border-destructive/30 rounded hover:bg-destructive/10 flex items-center justify-center gap-1\"\n >\n <Trash2 size={12} />\n {tr('mediaLibrary.delete', 'Delete')}\n </button>\n )}\n </div>\n </div>\n ))}\n </div>\n ) : (\n <div className=\"text-center py-12 border border-dashed border-border rounded-md\">\n <Upload className=\"mx-auto mb-4 text-muted-foreground\" size={48} />\n <p className=\"text-muted-foreground mb-2\">\n {tr('mediaLibrary.noMedia', 'No media files')}\n </p>\n <p className=\"text-sm text-muted-foreground\">\n {tr('mediaLibrary.uploadFirstMedia', 'Upload your first media file to get started')}\n </p>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"MediaLibraryPage.js","names":[],"sources":["../../../src/tours/pages/MediaLibraryPage.tsx"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react';\nimport { Upload, Search, Image as ImageIcon, Video, Music, FileText, Trash2 } from 'lucide-react';\nimport { PermissionGate } from '@burdenoff/fe-libs/shared/components';\nimport { useEventBus } from '@burdenoff/fe-libs/shared/events';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { useMediaLibrary } from '../hooks/useMediaLibrary';\nimport { useToursPermissionAccess } from '../hooks/useToursPermissionAccess';\nimport { useToursContext } from '../providers/ToursProvider';\nimport { TOUR_PERMISSIONS } from '../../constants/permissions';\nimport { formatFileSize } from '../utils';\nimport type { TourMediaType } from '../types';\nimport { emitToursApiFailed } from '../telemetry';\n\n/**\n * Media library page\n * Browse, upload, and manage tour media\n */\nexport function MediaLibraryPage() {\n const { t } = useI18n();\n const tr = useCallback(\n (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n },\n [t]\n );\n\n const toursContext = useToursContext();\n const eventBus = useEventBus();\n\n const { hasPermission, isLoading: permissionsLoading } = useToursPermissionAccess();\n const canListMedia = hasPermission(TOUR_PERMISSIONS.TOUR_MEDIA_LIST);\n const canDeleteMedia = hasPermission(TOUR_PERMISSIONS.TOUR_MEDIA_DELETE);\n\n const { media, fetchMedia, uploadMedia, deleteMedia, uploadProgress } = useMediaLibrary();\n\n const [searchQuery, setSearchQuery] = useState('');\n const [typeFilter, setTypeFilter] = useState<TourMediaType | 'all'>('all');\n\n useEffect(() => {\n if (permissionsLoading || !canListMedia) return;\n fetchMedia(typeFilter === 'all' ? undefined : typeFilter, searchQuery);\n }, [fetchMedia, typeFilter, searchQuery, permissionsLoading, canListMedia]);\n\n const handleFileUpload = async (files: FileList | null) => {\n if (!files) return;\n\n for (let i = 0; i < files.length; i++) {\n try {\n await uploadMedia(files[i]);\n } catch {\n emitToursApiFailed(eventBus, 'media.upload', toursContext);\n }\n }\n\n // Refresh media list\n fetchMedia(typeFilter === 'all' ? undefined : typeFilter, searchQuery);\n };\n\n const getMediaIcon = (type: TourMediaType) => {\n switch (type) {\n case 'IMAGE':\n return <ImageIcon size={20} />;\n case 'VIDEO':\n return <Video size={20} />;\n case 'AUDIO':\n return <Music size={20} />;\n case 'DOCUMENT':\n return <FileText size={20} />;\n }\n };\n\n return (\n <div className=\"space-y-4 sm:space-y-6 p-3 sm:p-6\">\n {/* Header */}\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3\">\n <div>\n <h1 className=\"text-xl sm:text-2xl font-bold\">\n {tr('mediaLibrary.title', 'Media Library')}\n </h1>\n <p className=\"text-sm text-muted-foreground\">\n {tr('mediaLibrary.subtitle', 'Upload and manage media for tour steps')}\n </p>\n </div>\n <PermissionGate permission={TOUR_PERMISSIONS.TOUR_MEDIA_CREATE}>\n <label className=\"w-full sm:w-auto px-4 py-2 bg-primary text-primary-foreground rounded-md hover:bg-primary/90 cursor-pointer flex items-center justify-center gap-2\">\n <Upload size={20} />\n {tr('mediaLibrary.uploadMedia', 'Upload Media')}\n <input\n type=\"file\"\n multiple\n accept=\"image/*,video/*,audio/*,.pdf,.doc,.docx\"\n onChange={(e) => handleFileUpload(e.target.files)}\n className=\"hidden\"\n />\n </label>\n </PermissionGate>\n </div>\n\n {/* Filters */}\n <div className=\"flex flex-col sm:flex-row gap-3\">\n <div className=\"flex-1 relative\">\n <Search\n className=\"absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground\"\n size={20}\n />\n <input\n type=\"text\"\n placeholder={tr('mediaLibrary.searchPlaceholder', 'Search media...')}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"w-full pl-[3.25rem] pr-4 py-2 min-h-[44px] border border-border rounded-md bg-background\"\n />\n </div>\n <select\n value={typeFilter}\n onChange={(e) => setTypeFilter(e.target.value as TourMediaType | 'all')}\n className=\"px-4 py-2 min-h-[44px] border border-border rounded-md bg-background\"\n >\n <option value=\"all\">{tr('mediaLibrary.allTypes', 'All Types')}</option>\n <option value=\"IMAGE\">{tr('mediaLibrary.typeImages', 'Images')}</option>\n <option value=\"VIDEO\">{tr('mediaLibrary.typeVideos', 'Videos')}</option>\n <option value=\"AUDIO\">{tr('mediaLibrary.typeAudio', 'Audio')}</option>\n <option value=\"DOCUMENT\">{tr('mediaLibrary.typeDocuments', 'Documents')}</option>\n </select>\n </div>\n\n {/* Upload Progress */}\n {Object.keys(uploadProgress).length > 0 && (\n <div className=\"space-y-2\">\n {Object.entries(uploadProgress).map(([fileId, progress]) => (\n <div key={fileId} className=\"border border-border rounded-md p-3\">\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-sm\">{tr('mediaLibrary.uploading', 'Uploading...')}</span>\n <span className=\"text-sm text-muted-foreground\">{progress}%</span>\n </div>\n <div className=\"w-full bg-muted rounded-full h-2\">\n <div\n className=\"bg-primary h-2 rounded-full transition-all\"\n style={{ width: `${progress}%` }}\n />\n </div>\n </div>\n ))}\n </div>\n )}\n\n {/* Media Grid */}\n {media.length > 0 ? (\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4\">\n {media.map((item) => (\n <div\n key={item.id}\n className=\"border border-border rounded-md overflow-hidden hover:shadow-md transition-shadow\"\n >\n {/* Thumbnail */}\n <div className=\"aspect-video bg-muted flex items-center justify-center\">\n {item.type === 'IMAGE' ? (\n <img\n src={item.cdnUrl}\n alt={item.altText || item.name}\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <div className=\"text-muted-foreground\">{getMediaIcon(item.type)}</div>\n )}\n </div>\n\n {/* Info */}\n <div className=\"p-3\">\n <h3 className=\"font-medium text-sm truncate\">{item.name}</h3>\n <div className=\"flex items-center justify-between mt-2 text-xs text-muted-foreground\">\n <span>{item.type}</span>\n <span>{formatFileSize(item.size)}</span>\n </div>\n {canDeleteMedia && (\n <button\n onClick={() => {\n if (window.confirm(tr('mediaLibrary.deleteConfirm', 'Delete this media?')))\n deleteMedia(item.id);\n }}\n className=\"mt-2 w-full px-2 py-2 min-h-[44px] text-xs text-destructive border border-destructive/30 rounded hover:bg-destructive/10 flex items-center justify-center gap-1\"\n >\n <Trash2 size={12} />\n {tr('mediaLibrary.delete', 'Delete')}\n </button>\n )}\n </div>\n </div>\n ))}\n </div>\n ) : (\n <div className=\"text-center py-12 border border-dashed border-border rounded-md\">\n <Upload className=\"mx-auto mb-4 text-muted-foreground\" size={48} />\n <p className=\"text-muted-foreground mb-2\">\n {tr('mediaLibrary.noMedia', 'No media files')}\n </p>\n <p className=\"text-sm text-muted-foreground\">\n {tr('mediaLibrary.uploadFirstMedia', 'Upload your first media file to get started')}\n </p>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"SchedulerPage.d.ts","sourceRoot":"","sources":["../../../src/tours/pages/SchedulerPage.tsx"],"names":[],"mappings":"AAYA;;;GAGG;AACH,wBAAgB,aAAa,4CA4P5B"}
1
+ {"version":3,"file":"SchedulerPage.d.ts","sourceRoot":"","sources":["../../../src/tours/pages/SchedulerPage.tsx"],"names":[],"mappings":"AAcA;;;GAGG;AACH,wBAAgB,aAAa,4CAoQ5B"}