@collabdt/core 0.0.54 → 0.0.56

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 (83) hide show
  1. package/dist/core/components/AppSidebarContent.d.ts.map +1 -1
  2. package/dist/core/components/AppSidebarContent.js +32 -5
  3. package/dist/core/components/AppSidebarContent.js.map +1 -1
  4. package/dist/core/components/authentication/AuthPage.d.ts.map +1 -1
  5. package/dist/core/components/authentication/AuthPage.js +3 -2
  6. package/dist/core/components/authentication/AuthPage.js.map +1 -1
  7. package/dist/core/components/authentication/Signin.d.ts +5 -1
  8. package/dist/core/components/authentication/Signin.d.ts.map +1 -1
  9. package/dist/core/components/authentication/Signin.js +17 -6
  10. package/dist/core/components/authentication/Signin.js.map +1 -1
  11. package/dist/core/components/instance-not-found/src/OrganizationNotFoundSection.d.ts.map +1 -1
  12. package/dist/core/components/instance-not-found/src/OrganizationNotFoundSection.js +152 -156
  13. package/dist/core/components/instance-not-found/src/OrganizationNotFoundSection.js.map +1 -1
  14. package/dist/core/components/organizationConfig/src/organizationConfigContent.d.ts.map +1 -1
  15. package/dist/core/components/organizationConfig/src/organizationConfigContent.js +146 -150
  16. package/dist/core/components/organizationConfig/src/organizationConfigContent.js.map +1 -1
  17. package/dist/core/components/settings/src/OrganizationSettingsPanel.d.ts.map +1 -1
  18. package/dist/core/components/settings/src/OrganizationSettingsPanel.js +4 -2
  19. package/dist/core/components/settings/src/OrganizationSettingsPanel.js.map +1 -1
  20. package/dist/core/components/support/BugReportDialog.d.ts +7 -0
  21. package/dist/core/components/support/BugReportDialog.d.ts.map +1 -0
  22. package/dist/core/components/support/BugReportDialog.js +117 -0
  23. package/dist/core/components/support/BugReportDialog.js.map +1 -0
  24. package/dist/core/components/support/FeatureRequestDialog.d.ts +8 -0
  25. package/dist/core/components/support/FeatureRequestDialog.d.ts.map +1 -0
  26. package/dist/core/components/support/FeatureRequestDialog.js +116 -0
  27. package/dist/core/components/support/FeatureRequestDialog.js.map +1 -0
  28. package/dist/core/components/support/SupportMenu.d.ts +10 -0
  29. package/dist/core/components/support/SupportMenu.d.ts.map +1 -0
  30. package/dist/core/components/support/SupportMenu.js +78 -0
  31. package/dist/core/components/support/SupportMenu.js.map +1 -0
  32. package/dist/core/components/ui/AnimatedBackground.d.ts.map +1 -1
  33. package/dist/core/components/ui/AnimatedBackground.js +3 -1
  34. package/dist/core/components/ui/AnimatedBackground.js.map +1 -1
  35. package/dist/core/components/ui/AppSidebar.d.ts.map +1 -1
  36. package/dist/core/components/ui/AppSidebar.js +11 -11
  37. package/dist/core/components/ui/AppSidebar.js.map +1 -1
  38. package/dist/core/components/ui/Navbar.d.ts.map +1 -1
  39. package/dist/core/components/ui/Navbar.js +15 -23
  40. package/dist/core/components/ui/Navbar.js.map +1 -1
  41. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.d.ts.map +1 -1
  42. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.js +3 -1
  43. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.js.map +1 -1
  44. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.d.ts.map +1 -1
  45. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.js +4 -2
  46. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.js.map +1 -1
  47. package/dist/core/components/viewers/map/datasets/RowActions.d.ts.map +1 -1
  48. package/dist/core/components/viewers/map/datasets/RowActions.js +3 -1
  49. package/dist/core/components/viewers/map/datasets/RowActions.js.map +1 -1
  50. package/dist/core/components/viewers/map/datasets/index.js +2 -2
  51. package/dist/core/components/viewers/map/datasets/index.js.map +1 -1
  52. package/dist/core/components/viewers/map/datasets/src/minioDatasets.d.ts +1 -1
  53. package/dist/core/components/viewers/map/datasets/src/minioDatasets.d.ts.map +1 -1
  54. package/dist/core/components/viewers/map/datasets/src/minioDatasets.js +3 -5
  55. package/dist/core/components/viewers/map/datasets/src/minioDatasets.js.map +1 -1
  56. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.d.ts.map +1 -1
  57. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.js +5 -3
  58. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.js.map +1 -1
  59. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.js +1 -1
  60. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.js.map +1 -1
  61. package/dist/core/components/viewers/pointcloud/PointCloudViewer.d.ts.map +1 -1
  62. package/dist/core/components/viewers/pointcloud/PointCloudViewer.js +4 -2
  63. package/dist/core/components/viewers/pointcloud/PointCloudViewer.js.map +1 -1
  64. package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.d.ts.map +1 -1
  65. package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.js +4 -2
  66. package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.js.map +1 -1
  67. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.d.ts.map +1 -1
  68. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.js +7 -5
  69. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.js.map +1 -1
  70. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudUploadPanel.d.ts.map +1 -1
  71. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudUploadPanel.js +15 -8
  72. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudUploadPanel.js.map +1 -1
  73. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.d.ts.map +1 -1
  74. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.js +13 -12
  75. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.js.map +1 -1
  76. package/dist/core/components/viewers/pointcloud/utils/potreeLoader.d.ts.map +1 -1
  77. package/dist/core/components/viewers/pointcloud/utils/potreeLoader.js +1 -1
  78. package/dist/core/components/viewers/pointcloud/utils/potreeLoader.js.map +1 -1
  79. package/dist/core/store/AppConfig/context.d.ts +10 -1
  80. package/dist/core/store/AppConfig/context.d.ts.map +1 -1
  81. package/dist/core/store/AppConfig/context.js +26 -5
  82. package/dist/core/store/AppConfig/context.js.map +1 -1
  83. package/package.json +1 -1
@@ -8,7 +8,6 @@ import { Button } from "../../ui/Button";
8
8
  import { Card } from "../../ui/Card";
9
9
  import { Input } from "../../ui/Input";
10
10
  import { Textarea } from "../../ui/Textarea";
11
- import Footer from "../../ui/Footer";
12
11
  function OrganizationConfigContent() {
13
12
  const t = useTranslations("OrganizationConfig");
14
13
  const router = useRouter();
@@ -54,174 +53,171 @@ function OrganizationConfigContent() {
54
53
  setLoading(false);
55
54
  }
56
55
  }
57
- return /* @__PURE__ */ jsxs(Fragment, { children: [
58
- /* @__PURE__ */ jsx("section", { className: "min-h-screen py-32 relative flex items-center z-10", children: /* @__PURE__ */ jsx("div", { className: "container mx-auto px-6", children: /* @__PURE__ */ jsxs(
59
- motion.div,
60
- {
61
- initial: { opacity: 0, y: 30 },
62
- animate: { opacity: 1, y: 0 },
63
- className: "max-w-5xl mx-auto",
64
- children: [
65
- /* @__PURE__ */ jsxs("div", { className: "text-center mb-16 space-y-6", children: [
66
- /* @__PURE__ */ jsx("h1", { className: "text-4xl md:text-5xl font-bold", children: t("title") }),
67
- /* @__PURE__ */ jsx("p", { className: "text-lg text-muted-foreground max-w-3xl mx-auto", children: t("description") })
68
- ] }),
69
- /* @__PURE__ */ jsxs("div", { className: "grid lg:grid-cols-3 gap-8", children: [
70
- /* @__PURE__ */ jsxs(Card, { className: "lg:col-span-2 p-8", children: [
71
- /* @__PURE__ */ jsx("h3", { className: "text-2xl font-bold mb-6", children: t("setupTitle") }),
72
- /* @__PURE__ */ jsx("p", { className: "text-muted-foreground mb-8", children: t("setupDescription") }),
73
- /* @__PURE__ */ jsxs("form", { onSubmit: handleSubmit, className: "space-y-6", children: [
74
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
75
- /* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children: "Organization Name / Slug" }),
76
- /* @__PURE__ */ jsx(
77
- Input,
78
- {
79
- name: "orgName",
80
- placeholder: "my-org",
81
- required: true,
82
- minLength: 3,
83
- maxLength: 63,
84
- pattern: "^[a-z0-9.-]+$"
85
- }
86
- ),
87
- /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: "3\u201363 characters. Lowercase letters, numbers, dots, and hyphens only." })
88
- ] }),
89
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
90
- /* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children: "Organization Title" }),
91
- /* @__PURE__ */ jsx(
92
- Input,
93
- {
94
- name: "orgTitle",
95
- placeholder: "Organization Title",
96
- required: true
97
- }
98
- )
99
- ] }),
100
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
101
- /* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children: "Organization Description" }),
102
- /* @__PURE__ */ jsx(
103
- Textarea,
104
- {
105
- name: "orgDescription",
106
- placeholder: "Organization Description",
107
- rows: 4,
108
- required: true
109
- }
110
- )
111
- ] }),
112
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
113
- /* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children: "Languages" }),
114
- /* @__PURE__ */ jsxs(
115
- "select",
116
- {
117
- name: "orgLanguages",
118
- multiple: true,
119
- defaultValue: ["En"],
120
- className: "w-full rounded-md border border-input bg-background px-3 py-2 min-h-[100px]",
121
- children: [
122
- /* @__PURE__ */ jsx("option", { value: "En", children: "English" }),
123
- /* @__PURE__ */ jsx("option", { value: "Fr", children: "French" }),
124
- /* @__PURE__ */ jsx("option", { value: "Es", children: "Spanish" })
125
- ]
126
- }
127
- ),
128
- /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: "Hold Ctrl (Windows) / Cmd (Mac) to select multiple languages" })
129
- ] }),
130
- /* @__PURE__ */ jsxs("div", { className: "border-t pt-6", children: [
131
- /* @__PURE__ */ jsx("h4", { className: "font-semibold mb-4", children: "Administrator Account" }),
132
- /* @__PURE__ */ jsxs("div", { className: "grid sm:grid-cols-2 gap-4", children: [
133
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
134
- /* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children: "Admin Name" }),
135
- /* @__PURE__ */ jsx(
136
- Input,
137
- {
138
- name: "adminName",
139
- placeholder: "Admin Name",
140
- required: true
141
- }
142
- )
143
- ] }),
144
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
145
- /* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children: "Admin Email" }),
146
- /* @__PURE__ */ jsx(
147
- Input,
148
- {
149
- name: "adminEmail",
150
- type: "email",
151
- placeholder: "admin@example.com",
152
- required: true
153
- }
154
- )
155
- ] })
156
- ] }),
157
- /* @__PURE__ */ jsxs("div", { className: "mt-4 flex flex-col gap-2", children: [
158
- /* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children: "Password" }),
159
- /* @__PURE__ */ jsx(
160
- Input,
161
- {
162
- name: "adminPassword",
163
- type: "password",
164
- placeholder: "Password",
165
- minLength: 8,
166
- required: true
167
- }
168
- )
169
- ] })
170
- ] }),
171
- error && /* @__PURE__ */ jsx("div", { className: "rounded-md border border-red-500/20 bg-red-500/10 p-4 text-sm text-red-500", children: error }),
56
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx("section", { className: "min-h-screen py-32 relative flex items-center z-10", children: /* @__PURE__ */ jsx("div", { className: "container mx-auto px-6", children: /* @__PURE__ */ jsxs(
57
+ motion.div,
58
+ {
59
+ initial: { opacity: 0, y: 30 },
60
+ animate: { opacity: 1, y: 0 },
61
+ className: "max-w-5xl mx-auto",
62
+ children: [
63
+ /* @__PURE__ */ jsxs("div", { className: "text-center mb-16 space-y-6", children: [
64
+ /* @__PURE__ */ jsx("h1", { className: "text-4xl md:text-5xl font-bold", children: t("title") }),
65
+ /* @__PURE__ */ jsx("p", { className: "text-lg text-muted-foreground max-w-3xl mx-auto", children: t("description") })
66
+ ] }),
67
+ /* @__PURE__ */ jsxs("div", { className: "grid lg:grid-cols-3 gap-8", children: [
68
+ /* @__PURE__ */ jsxs(Card, { className: "lg:col-span-2 p-8", children: [
69
+ /* @__PURE__ */ jsx("h3", { className: "text-2xl font-bold mb-6", children: t("setupTitle") }),
70
+ /* @__PURE__ */ jsx("p", { className: "text-muted-foreground mb-8", children: t("setupDescription") }),
71
+ /* @__PURE__ */ jsxs("form", { onSubmit: handleSubmit, className: "space-y-6", children: [
72
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
73
+ /* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children: "Organization Name" }),
172
74
  /* @__PURE__ */ jsx(
173
- Button,
75
+ Input,
174
76
  {
175
- type: "submit",
176
- size: "lg",
177
- className: "gradient-button w-full",
178
- disabled: loading,
179
- children: loading ? "Initializing Instance..." : "Initialize Instance"
77
+ name: "orgName",
78
+ placeholder: "my-org",
79
+ required: true,
80
+ minLength: 3,
81
+ maxLength: 63,
82
+ pattern: "^[a-z0-9.-]+$"
83
+ }
84
+ ),
85
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: "3\u201363 characters. Lowercase letters, numbers, dots, and hyphens only." })
86
+ ] }),
87
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
88
+ /* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children: "Organization Title" }),
89
+ /* @__PURE__ */ jsx(
90
+ Input,
91
+ {
92
+ name: "orgTitle",
93
+ placeholder: "Organization Title",
94
+ required: true
180
95
  }
181
96
  )
182
- ] })
183
- ] }),
184
- /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
185
- /* @__PURE__ */ jsxs(Card, { className: "p-6 hover-card", children: [
186
- /* @__PURE__ */ jsx("h3", { className: "text-lg font-bold mb-3", children: t("contactInfoTitle") }),
187
- /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
188
- /* @__PURE__ */ jsxs("div", { children: [
189
- /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground mb-1", children: t("emailLabel") }),
97
+ ] }),
98
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
99
+ /* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children: "Organization Description" }),
100
+ /* @__PURE__ */ jsx(
101
+ Textarea,
102
+ {
103
+ name: "orgDescription",
104
+ placeholder: "Organization Description",
105
+ rows: 4,
106
+ required: true
107
+ }
108
+ )
109
+ ] }),
110
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
111
+ /* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children: "Languages" }),
112
+ /* @__PURE__ */ jsxs(
113
+ "select",
114
+ {
115
+ name: "orgLanguages",
116
+ multiple: true,
117
+ defaultValue: ["En"],
118
+ className: "w-full rounded-md border border-input bg-background px-3 py-2 min-h-[100px]",
119
+ children: [
120
+ /* @__PURE__ */ jsx("option", { value: "En", children: "English" }),
121
+ /* @__PURE__ */ jsx("option", { value: "Fr", children: "French" }),
122
+ /* @__PURE__ */ jsx("option", { value: "Es", children: "Spanish" })
123
+ ]
124
+ }
125
+ ),
126
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: "Hold Ctrl (Windows) / Cmd (Mac) to select multiple languages" })
127
+ ] }),
128
+ /* @__PURE__ */ jsxs("div", { className: "border-t pt-6", children: [
129
+ /* @__PURE__ */ jsx("h4", { className: "font-semibold mb-4", children: "Administrator Account" }),
130
+ /* @__PURE__ */ jsxs("div", { className: "grid sm:grid-cols-2 gap-4", children: [
131
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
132
+ /* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children: "Admin Name" }),
190
133
  /* @__PURE__ */ jsx(
191
- "a",
134
+ Input,
192
135
  {
193
- href: "mailto:info@collabdt.org",
194
- className: "text-primary hover:underline font-medium text-sm",
195
- children: "info@collabdt.org"
136
+ name: "adminName",
137
+ placeholder: "Admin Name",
138
+ required: true
196
139
  }
197
140
  )
198
141
  ] }),
199
- /* @__PURE__ */ jsxs("div", { children: [
200
- /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground mb-1", children: t("websiteLabel") }),
142
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
143
+ /* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children: "Admin Email" }),
201
144
  /* @__PURE__ */ jsx(
202
- "a",
145
+ Input,
203
146
  {
204
- href: "https://collabdt.org",
205
- target: "_blank",
206
- rel: "noopener noreferrer",
207
- className: "text-primary hover:underline font-medium text-sm",
208
- children: "collabdt.org"
147
+ name: "adminEmail",
148
+ type: "email",
149
+ placeholder: "admin@example.com",
150
+ required: true
209
151
  }
210
152
  )
211
153
  ] })
154
+ ] }),
155
+ /* @__PURE__ */ jsxs("div", { className: "mt-4 flex flex-col gap-2", children: [
156
+ /* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children: "Password" }),
157
+ /* @__PURE__ */ jsx(
158
+ Input,
159
+ {
160
+ name: "adminPassword",
161
+ type: "password",
162
+ placeholder: "Password",
163
+ minLength: 8,
164
+ required: true
165
+ }
166
+ )
212
167
  ] })
213
168
  ] }),
214
- /* @__PURE__ */ jsxs(Card, { className: "p-6 hover-card bg-primary/5 border-primary/20", children: [
215
- /* @__PURE__ */ jsx("h3", { className: "text-lg font-bold mb-3", children: t("needHelpTitle") }),
216
- /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: t("needHelpDescription") })
169
+ error && /* @__PURE__ */ jsx("div", { className: "rounded-md border border-red-500/20 bg-red-500/10 p-4 text-sm text-red-500", children: error }),
170
+ /* @__PURE__ */ jsx(
171
+ Button,
172
+ {
173
+ type: "submit",
174
+ size: "lg",
175
+ className: "gradient-button w-full",
176
+ disabled: loading,
177
+ children: loading ? "Initializing Instance..." : "Initialize Instance"
178
+ }
179
+ )
180
+ ] })
181
+ ] }),
182
+ /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
183
+ /* @__PURE__ */ jsxs(Card, { className: "p-6 hover-card", children: [
184
+ /* @__PURE__ */ jsx("h3", { className: "text-lg font-bold mb-3", children: t("contactInfoTitle") }),
185
+ /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
186
+ /* @__PURE__ */ jsxs("div", { children: [
187
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground mb-1", children: t("emailLabel") }),
188
+ /* @__PURE__ */ jsx(
189
+ "a",
190
+ {
191
+ href: "mailto:info@collabdt.org",
192
+ className: "text-primary hover:underline font-medium text-sm",
193
+ children: "info@collabdt.org"
194
+ }
195
+ )
196
+ ] }),
197
+ /* @__PURE__ */ jsxs("div", { children: [
198
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground mb-1", children: t("websiteLabel") }),
199
+ /* @__PURE__ */ jsx(
200
+ "a",
201
+ {
202
+ href: "https://collabdt.org",
203
+ target: "_blank",
204
+ rel: "noopener noreferrer",
205
+ className: "text-primary hover:underline font-medium text-sm",
206
+ children: "collabdt.org"
207
+ }
208
+ )
209
+ ] })
217
210
  ] })
211
+ ] }),
212
+ /* @__PURE__ */ jsxs(Card, { className: "p-6 hover-card bg-primary/5 border-primary/20", children: [
213
+ /* @__PURE__ */ jsx("h3", { className: "text-lg font-bold mb-3", children: t("needHelpTitle") }),
214
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground mb-4", children: t("needHelpDescription") })
218
215
  ] })
219
216
  ] })
220
- ]
221
- }
222
- ) }) }),
223
- /* @__PURE__ */ jsx(Footer, {})
224
- ] });
217
+ ] })
218
+ ]
219
+ }
220
+ ) }) }) });
225
221
  }
226
222
  export {
227
223
  OrganizationConfigContent as default
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/core/components/organizationConfig/src/organizationConfigContent.tsx"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport { motion } from 'framer-motion'\r\nimport { useState } from 'react'\r\nimport { useRouter } from 'next/navigation'\r\nimport { useTranslations } from 'next-intl'\r\n\r\nimport { Button } from '../../ui/Button'\r\nimport { Card } from '../../ui/Card'\r\nimport { Input } from '../../ui/Input'\r\nimport { Textarea } from '../../ui/Textarea'\r\nimport Footer from '../../ui/Footer'\r\n\r\nexport default function OrganizationConfigContent() {\r\n const t = useTranslations('OrganizationConfig')\r\n const router = useRouter()\r\n\r\n const [error, setError] = useState<string | null>(null)\r\n const [loading, setLoading] = useState(false)\r\n\r\n function validateOrgName(name: string) {\r\n const regex = /^[a-z0-9.-]{3,63}$/\r\n return regex.test(name)\r\n }\r\n\r\n async function handleSubmit(\r\n e: React.FormEvent<HTMLFormElement>\r\n ) {\r\n e.preventDefault()\r\n\r\n setError(null)\r\n setLoading(true)\r\n \r\n \r\n const formData = new FormData(e.currentTarget)\r\n \r\n const orgLanguages = formData\r\n .getAll('orgLanguages')\r\n .map(String)\r\n\r\n const data = {\r\n orgName: formData.get('orgName'),\r\n orgTitle: formData.get('orgTitle'),\r\n orgDescription: formData.get('orgDescription'),\r\n orgLanguages,\r\n adminName: formData.get('adminName'),\r\n adminEmail: formData.get('adminEmail'),\r\n adminPassword: formData.get('adminPassword'),\r\n }\r\n\r\n try {\r\n const res = await fetch('/api/setup', {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify(data),\r\n })\r\n\r\n const json = await res.json()\r\n\r\n if (res.ok && json.success) {\r\n router.push(`/${data.orgName}/auth/signin`)\r\n return\r\n }\r\n\r\n setError(json.error ?? 'Failed to initialize instance.')\r\n } catch {\r\n setError('Network error. Please try again.')\r\n } finally {\r\n setLoading(false)\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n <section className=\"min-h-screen py-32 relative flex items-center z-10\">\r\n <div className=\"container mx-auto px-6\">\r\n <motion.div\r\n initial={{ opacity: 0, y: 30 }}\r\n animate={{ opacity: 1, y: 0 }}\r\n className=\"max-w-5xl mx-auto\"\r\n >\r\n <div className=\"text-center mb-16 space-y-6\">\r\n <h1 className=\"text-4xl md:text-5xl font-bold\">\r\n {t('title')}\r\n </h1>\r\n\r\n <p className=\"text-lg text-muted-foreground max-w-3xl mx-auto\">\r\n {t('description')}\r\n </p>\r\n </div>\r\n\r\n <div className=\"grid lg:grid-cols-3 gap-8\">\r\n <Card className=\"lg:col-span-2 p-8\">\r\n <h3 className=\"text-2xl font-bold mb-6\">\r\n {t('setupTitle')}\r\n </h3>\r\n\r\n <p className=\"text-muted-foreground mb-8\">\r\n {t('setupDescription')}\r\n </p>\r\n\r\n <form onSubmit={handleSubmit} className=\"space-y-6\">\r\n\r\n {/* Org Name */}\r\n <div className=\"flex flex-col gap-2\">\r\n <label className=\"text-sm font-medium\">\r\n Organization Name / Slug\r\n </label>\r\n <Input\r\n name=\"orgName\"\r\n placeholder=\"my-org\"\r\n required\r\n minLength={3}\r\n maxLength={63}\r\n pattern=\"^[a-z0-9.-]+$\"\r\n />\r\n <p className=\"text-xs text-muted-foreground\">\r\n 3–63 characters. Lowercase letters, numbers, dots, and hyphens only.\r\n </p>\r\n </div>\r\n\r\n {/* Org Title */}\r\n <div className=\"flex flex-col gap-2\">\r\n <label className=\"text-sm font-medium\">\r\n Organization Title\r\n </label>\r\n <Input\r\n name=\"orgTitle\"\r\n placeholder=\"Organization Title\"\r\n required\r\n />\r\n </div>\r\n\r\n {/* Org Description */}\r\n <div className=\"flex flex-col gap-2\">\r\n <label className=\"text-sm font-medium\">\r\n Organization Description\r\n </label>\r\n <Textarea\r\n name=\"orgDescription\"\r\n placeholder=\"Organization Description\"\r\n rows={4}\r\n required\r\n />\r\n </div>\r\n\r\n {/* Languages */}\r\n <div className=\"flex flex-col gap-2\">\r\n <label className=\"text-sm font-medium\">\r\n Languages\r\n </label>\r\n\r\n <select\r\n name=\"orgLanguages\"\r\n multiple\r\n defaultValue={['En']}\r\n className=\"w-full rounded-md border border-input bg-background px-3 py-2 min-h-[100px]\"\r\n >\r\n <option value=\"En\">English</option>\r\n <option value=\"Fr\">French</option>\r\n <option value=\"Es\">Spanish</option>\r\n </select>\r\n\r\n <p className=\"text-xs text-muted-foreground\">\r\n Hold Ctrl (Windows) / Cmd (Mac) to select multiple languages\r\n </p>\r\n </div>\r\n\r\n {/* Admin Section */}\r\n <div className=\"border-t pt-6\">\r\n <h4 className=\"font-semibold mb-4\">\r\n Administrator Account\r\n </h4>\r\n\r\n <div className=\"grid sm:grid-cols-2 gap-4\">\r\n <div className=\"flex flex-col gap-2\">\r\n <label className=\"text-sm font-medium\">\r\n Admin Name\r\n </label>\r\n <Input\r\n name=\"adminName\"\r\n placeholder=\"Admin Name\"\r\n required\r\n />\r\n </div>\r\n\r\n <div className=\"flex flex-col gap-2\">\r\n <label className=\"text-sm font-medium\">\r\n Admin Email\r\n </label>\r\n <Input\r\n name=\"adminEmail\"\r\n type=\"email\"\r\n placeholder=\"admin@example.com\"\r\n required\r\n />\r\n </div>\r\n </div>\r\n\r\n <div className=\"mt-4 flex flex-col gap-2\">\r\n <label className=\"text-sm font-medium\">\r\n Password\r\n </label>\r\n <Input\r\n name=\"adminPassword\"\r\n type=\"password\"\r\n placeholder=\"Password\"\r\n minLength={8}\r\n required\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Error */}\r\n {error && (\r\n <div className=\"rounded-md border border-red-500/20 bg-red-500/10 p-4 text-sm text-red-500\">\r\n {error}\r\n </div>\r\n )}\r\n\r\n <Button\r\n type=\"submit\"\r\n size=\"lg\"\r\n className=\"gradient-button w-full\"\r\n disabled={loading}\r\n >\r\n {loading ? 'Initializing Instance...' : 'Initialize Instance'}\r\n </Button>\r\n </form>\r\n </Card>\r\n\r\n <div className=\"space-y-6\">\r\n <Card className=\"p-6 hover-card\">\r\n <h3 className=\"text-lg font-bold mb-3\">\r\n {t('contactInfoTitle')}\r\n </h3>\r\n\r\n <div className=\"space-y-4\">\r\n <div>\r\n <p className=\"text-sm text-muted-foreground mb-1\">\r\n {t('emailLabel')}\r\n </p>\r\n\r\n <a\r\n href=\"mailto:info@collabdt.org\"\r\n className=\"text-primary hover:underline font-medium text-sm\"\r\n >\r\n info@collabdt.org\r\n </a>\r\n </div>\r\n\r\n <div>\r\n <p className=\"text-sm text-muted-foreground mb-1\">\r\n {t('websiteLabel')}\r\n </p>\r\n\r\n <a\r\n href=\"https://collabdt.org\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"text-primary hover:underline font-medium text-sm\"\r\n >\r\n collabdt.org\r\n </a>\r\n </div>\r\n </div>\r\n </Card>\r\n\r\n <Card className=\"p-6 hover-card bg-primary/5 border-primary/20\">\r\n <h3 className=\"text-lg font-bold mb-3\">\r\n {t('needHelpTitle')}\r\n </h3>\r\n\r\n <p className=\"text-sm text-muted-foreground\">\r\n {t('needHelpDescription')}\r\n </p>\r\n </Card>\r\n </div>\r\n </div>\r\n </motion.div>\r\n </div>\r\n </section>\r\n\r\n <Footer />\r\n </>\r\n )\r\n}"],"mappings":";AA8EI,mBASU,KADF,YARR;AAzEJ,SAAS,cAAc;AACvB,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAC1B,SAAS,uBAAuB;AAEhC,SAAS,cAAc;AACvB,SAAS,YAAY;AACrB,SAAS,aAAa;AACtB,SAAS,gBAAgB;AACzB,OAAO,YAAY;AAEJ,SAAR,4BAA6C;AAClD,QAAM,IAAI,gBAAgB,oBAAoB;AAC9C,QAAM,SAAS,UAAU;AAEzB,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAwB,IAAI;AACtD,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAE5C,WAAS,gBAAgB,MAAc;AACvC,UAAM,QAAQ;AACd,WAAO,MAAM,KAAK,IAAI;AAAA,EACtB;AAEA,iBAAe,aACb,GACA;AA9BJ;AA+BI,MAAE,eAAe;AAEjB,aAAS,IAAI;AACb,eAAW,IAAI;AAGf,UAAM,WAAW,IAAI,SAAS,EAAE,aAAa;AAE7C,UAAM,eAAe,SAClB,OAAO,cAAc,EACrB,IAAI,MAAM;AAEb,UAAM,OAAO;AAAA,MACX,SAAS,SAAS,IAAI,SAAS;AAAA,MAC/B,UAAU,SAAS,IAAI,UAAU;AAAA,MACjC,gBAAgB,SAAS,IAAI,gBAAgB;AAAA,MAC7C;AAAA,MACA,WAAW,SAAS,IAAI,WAAW;AAAA,MACnC,YAAY,SAAS,IAAI,YAAY;AAAA,MACrC,eAAe,SAAS,IAAI,eAAe;AAAA,IAC7C;AAEA,QAAI;AACF,YAAM,MAAM,MAAM,MAAM,cAAc;AAAA,QACpC,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU,IAAI;AAAA,MAC3B,CAAC;AAED,YAAM,OAAO,MAAM,IAAI,KAAK;AAE5B,UAAI,IAAI,MAAM,KAAK,SAAS;AAC1B,eAAO,KAAK,IAAI,KAAK,OAAO,cAAc;AAC1C;AAAA,MACF;AAEA,gBAAS,UAAK,UAAL,YAAc,gCAAgC;AAAA,IACzD,SAAQA,IAAA;AACN,eAAS,kCAAkC;AAAA,IAC7C,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,SACE,iCACE;AAAA,wBAAC,aAAQ,WAAU,sDACjB,8BAAC,SAAI,WAAU,0BACb;AAAA,MAAC,OAAO;AAAA,MAAP;AAAA,QACC,SAAS,EAAE,SAAS,GAAG,GAAG,GAAG;AAAA,QAC7B,SAAS,EAAE,SAAS,GAAG,GAAG,EAAE;AAAA,QAC5B,WAAU;AAAA,QAEV;AAAA,+BAAC,SAAI,WAAU,+BACb;AAAA,gCAAC,QAAG,WAAU,kCACX,YAAE,OAAO,GACZ;AAAA,YAEA,oBAAC,OAAE,WAAU,mDACV,YAAE,aAAa,GAClB;AAAA,aACF;AAAA,UAEA,qBAAC,SAAI,WAAU,6BACb;AAAA,iCAAC,QAAK,WAAU,qBACd;AAAA,kCAAC,QAAG,WAAU,2BACX,YAAE,YAAY,GACjB;AAAA,cAEA,oBAAC,OAAE,WAAU,8BACV,YAAE,kBAAkB,GACvB;AAAA,cAEA,qBAAC,UAAK,UAAU,cAAc,WAAU,aAGxC;AAAA,qCAAC,SAAI,WAAU,uBACb;AAAA,sCAAC,WAAM,WAAU,uBAAsB,sCAEvC;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACD,MAAK;AAAA,sBACL,aAAY;AAAA,sBACZ,UAAQ;AAAA,sBACR,WAAW;AAAA,sBACX,WAAW;AAAA,sBACX,SAAQ;AAAA;AAAA,kBACR;AAAA,kBACA,oBAAC,OAAE,WAAU,iCAAgC,uFAE7C;AAAA,mBACF;AAAA,gBAGA,qBAAC,SAAI,WAAU,uBACb;AAAA,sCAAC,WAAM,WAAU,uBAAsB,gCAEvC;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,aAAY;AAAA,sBACZ,UAAQ;AAAA;AAAA,kBACV;AAAA,mBACF;AAAA,gBAGA,qBAAC,SAAI,WAAU,uBACb;AAAA,sCAAC,WAAM,WAAU,uBAAsB,sCAEvC;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,aAAY;AAAA,sBACZ,MAAM;AAAA,sBACN,UAAQ;AAAA;AAAA,kBACV;AAAA,mBACF;AAAA,gBAGA,qBAAC,SAAI,WAAU,uBACb;AAAA,sCAAC,WAAM,WAAU,uBAAsB,uBAEvC;AAAA,kBAEA;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,UAAQ;AAAA,sBACR,cAAc,CAAC,IAAI;AAAA,sBACnB,WAAU;AAAA,sBAEV;AAAA,4CAAC,YAAO,OAAM,MAAK,qBAAO;AAAA,wBAC1B,oBAAC,YAAO,OAAM,MAAK,oBAAM;AAAA,wBACzB,oBAAC,YAAO,OAAM,MAAK,qBAAO;AAAA;AAAA;AAAA,kBAC5B;AAAA,kBAEA,oBAAC,OAAE,WAAU,iCAAgC,0EAE7C;AAAA,mBACF;AAAA,gBAGA,qBAAC,SAAI,WAAU,iBACb;AAAA,sCAAC,QAAG,WAAU,sBAAqB,mCAEnC;AAAA,kBAEA,qBAAC,SAAI,WAAU,6BACb;AAAA,yCAAC,SAAI,WAAU,uBACb;AAAA,0CAAC,WAAM,WAAU,uBAAsB,wBAEvC;AAAA,sBACA;AAAA,wBAAC;AAAA;AAAA,0BACC,MAAK;AAAA,0BACL,aAAY;AAAA,0BACZ,UAAQ;AAAA;AAAA,sBACV;AAAA,uBACF;AAAA,oBAEA,qBAAC,SAAI,WAAU,uBACb;AAAA,0CAAC,WAAM,WAAU,uBAAsB,yBAEvC;AAAA,sBACA;AAAA,wBAAC;AAAA;AAAA,0BACC,MAAK;AAAA,0BACL,MAAK;AAAA,0BACL,aAAY;AAAA,0BACZ,UAAQ;AAAA;AAAA,sBACV;AAAA,uBACF;AAAA,qBACF;AAAA,kBAEA,qBAAC,SAAI,WAAU,4BACb;AAAA,wCAAC,WAAM,WAAU,uBAAsB,sBAEvC;AAAA,oBACA;AAAA,sBAAC;AAAA;AAAA,wBACC,MAAK;AAAA,wBACL,MAAK;AAAA,wBACL,aAAY;AAAA,wBACZ,WAAW;AAAA,wBACX,UAAQ;AAAA;AAAA,oBACV;AAAA,qBACF;AAAA,mBACF;AAAA,gBAGC,SACC,oBAAC,SAAI,WAAU,8EACZ,iBACH;AAAA,gBAGF;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,MAAK;AAAA,oBACL,WAAU;AAAA,oBACV,UAAU;AAAA,oBAET,oBAAU,6BAA6B;AAAA;AAAA,gBAC1C;AAAA,iBACF;AAAA,eACA;AAAA,YAEA,qBAAC,SAAI,WAAU,aACf;AAAA,mCAAC,QAAK,WAAU,kBACd;AAAA,oCAAC,QAAG,WAAU,0BACX,YAAE,kBAAkB,GACvB;AAAA,gBAEA,qBAAC,SAAI,WAAU,aACb;AAAA,uCAAC,SACC;AAAA,wCAAC,OAAE,WAAU,sCACV,YAAE,YAAY,GACjB;AAAA,oBAEA;AAAA,sBAAC;AAAA;AAAA,wBACC,MAAK;AAAA,wBACL,WAAU;AAAA,wBACX;AAAA;AAAA,oBAED;AAAA,qBACF;AAAA,kBAEA,qBAAC,SACC;AAAA,wCAAC,OAAE,WAAU,sCACV,YAAE,cAAc,GACnB;AAAA,oBAEA;AAAA,sBAAC;AAAA;AAAA,wBACC,MAAK;AAAA,wBACL,QAAO;AAAA,wBACP,KAAI;AAAA,wBACJ,WAAU;AAAA,wBACX;AAAA;AAAA,oBAED;AAAA,qBACF;AAAA,mBACF;AAAA,iBACF;AAAA,cAEA,qBAAC,QAAK,WAAU,iDACd;AAAA,oCAAC,QAAG,WAAU,0BACX,YAAE,eAAe,GACpB;AAAA,gBAEA,oBAAC,OAAE,WAAU,iCACV,YAAE,qBAAqB,GAC1B;AAAA,iBACF;AAAA,eACF;AAAA,aACA;AAAA;AAAA;AAAA,IACF,GACF,GACF;AAAA,IAEA,oBAAC,UAAO;AAAA,KACV;AAEJ;","names":["e"]}
1
+ {"version":3,"sources":["../../../../../src/core/components/organizationConfig/src/organizationConfigContent.tsx"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport { motion } from 'framer-motion'\r\nimport { useState } from 'react'\r\nimport { useRouter } from 'next/navigation'\r\nimport { useTranslations } from 'next-intl'\r\n\r\nimport { Button } from '../../ui/Button'\r\nimport { Card } from '../../ui/Card'\r\nimport { Input } from '../../ui/Input'\r\nimport { Textarea } from '../../ui/Textarea'\r\n\r\nexport default function OrganizationConfigContent() {\r\n const t = useTranslations('OrganizationConfig')\r\n const router = useRouter()\r\n\r\n const [error, setError] = useState<string | null>(null)\r\n const [loading, setLoading] = useState(false)\r\n\r\n function validateOrgName(name: string) {\r\n const regex = /^[a-z0-9.-]{3,63}$/\r\n return regex.test(name)\r\n }\r\n\r\n async function handleSubmit(\r\n e: React.FormEvent<HTMLFormElement>\r\n ) {\r\n e.preventDefault()\r\n\r\n setError(null)\r\n setLoading(true)\r\n \r\n \r\n const formData = new FormData(e.currentTarget)\r\n \r\n const orgLanguages = formData\r\n .getAll('orgLanguages')\r\n .map(String)\r\n\r\n const data = {\r\n orgName: formData.get('orgName'),\r\n orgTitle: formData.get('orgTitle'),\r\n orgDescription: formData.get('orgDescription'),\r\n orgLanguages,\r\n adminName: formData.get('adminName'),\r\n adminEmail: formData.get('adminEmail'),\r\n adminPassword: formData.get('adminPassword'),\r\n }\r\n\r\n try {\r\n const res = await fetch('/api/setup', {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify(data),\r\n })\r\n\r\n const json = await res.json()\r\n\r\n if (res.ok && json.success) {\r\n router.push(`/${data.orgName}/auth/signin`)\r\n return\r\n }\r\n\r\n setError(json.error ?? 'Failed to initialize instance.')\r\n } catch {\r\n setError('Network error. Please try again.')\r\n } finally {\r\n setLoading(false)\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n <section className=\"min-h-screen py-32 relative flex items-center z-10\">\r\n <div className=\"container mx-auto px-6\">\r\n <motion.div\r\n initial={{ opacity: 0, y: 30 }}\r\n animate={{ opacity: 1, y: 0 }}\r\n className=\"max-w-5xl mx-auto\"\r\n >\r\n <div className=\"text-center mb-16 space-y-6\">\r\n <h1 className=\"text-4xl md:text-5xl font-bold\">\r\n {t('title')}\r\n </h1>\r\n\r\n <p className=\"text-lg text-muted-foreground max-w-3xl mx-auto\">\r\n {t('description')}\r\n </p>\r\n </div>\r\n\r\n <div className=\"grid lg:grid-cols-3 gap-8\">\r\n <Card className=\"lg:col-span-2 p-8\">\r\n <h3 className=\"text-2xl font-bold mb-6\">\r\n {t('setupTitle')}\r\n </h3>\r\n\r\n <p className=\"text-muted-foreground mb-8\">\r\n {t('setupDescription')}\r\n </p>\r\n\r\n <form onSubmit={handleSubmit} className=\"space-y-6\">\r\n\r\n {/* Org Name */}\r\n <div className=\"flex flex-col gap-2\">\r\n <label className=\"text-sm font-medium\">\r\n Organization Name \r\n </label>\r\n <Input\r\n name=\"orgName\"\r\n placeholder=\"my-org\"\r\n required\r\n minLength={3}\r\n maxLength={63}\r\n pattern=\"^[a-z0-9.-]+$\"\r\n />\r\n <p className=\"text-xs text-muted-foreground\">\r\n 3–63 characters. Lowercase letters, numbers, dots, and hyphens only.\r\n </p>\r\n </div>\r\n\r\n {/* Org Title */}\r\n <div className=\"flex flex-col gap-2\">\r\n <label className=\"text-sm font-medium\">\r\n Organization Title\r\n </label>\r\n <Input\r\n name=\"orgTitle\"\r\n placeholder=\"Organization Title\"\r\n required\r\n />\r\n </div>\r\n\r\n {/* Org Description */}\r\n <div className=\"flex flex-col gap-2\">\r\n <label className=\"text-sm font-medium\">\r\n Organization Description\r\n </label>\r\n <Textarea\r\n name=\"orgDescription\"\r\n placeholder=\"Organization Description\"\r\n rows={4}\r\n required\r\n />\r\n </div>\r\n\r\n {/* Languages */}\r\n <div className=\"flex flex-col gap-2\">\r\n <label className=\"text-sm font-medium\">\r\n Languages\r\n </label>\r\n\r\n <select\r\n name=\"orgLanguages\"\r\n multiple\r\n defaultValue={['En']}\r\n className=\"w-full rounded-md border border-input bg-background px-3 py-2 min-h-[100px]\"\r\n >\r\n <option value=\"En\">English</option>\r\n <option value=\"Fr\">French</option>\r\n <option value=\"Es\">Spanish</option>\r\n </select>\r\n\r\n <p className=\"text-xs text-muted-foreground\">\r\n Hold Ctrl (Windows) / Cmd (Mac) to select multiple languages\r\n </p>\r\n </div>\r\n\r\n {/* Admin Section */}\r\n <div className=\"border-t pt-6\">\r\n <h4 className=\"font-semibold mb-4\">\r\n Administrator Account\r\n </h4>\r\n\r\n <div className=\"grid sm:grid-cols-2 gap-4\">\r\n <div className=\"flex flex-col gap-2\">\r\n <label className=\"text-sm font-medium\">\r\n Admin Name\r\n </label>\r\n <Input\r\n name=\"adminName\"\r\n placeholder=\"Admin Name\"\r\n required\r\n />\r\n </div>\r\n\r\n <div className=\"flex flex-col gap-2\">\r\n <label className=\"text-sm font-medium\">\r\n Admin Email\r\n </label>\r\n <Input\r\n name=\"adminEmail\"\r\n type=\"email\"\r\n placeholder=\"admin@example.com\"\r\n required\r\n />\r\n </div>\r\n </div>\r\n\r\n <div className=\"mt-4 flex flex-col gap-2\">\r\n <label className=\"text-sm font-medium\">\r\n Password\r\n </label>\r\n <Input\r\n name=\"adminPassword\"\r\n type=\"password\"\r\n placeholder=\"Password\"\r\n minLength={8}\r\n required\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Error */}\r\n {error && (\r\n <div className=\"rounded-md border border-red-500/20 bg-red-500/10 p-4 text-sm text-red-500\">\r\n {error}\r\n </div>\r\n )}\r\n\r\n <Button\r\n type=\"submit\"\r\n size=\"lg\"\r\n className=\"gradient-button w-full\"\r\n disabled={loading}\r\n >\r\n {loading ? 'Initializing Instance...' : 'Initialize Instance'}\r\n </Button>\r\n </form>\r\n </Card>\r\n {/* Contact Info Card */}\r\n <div className=\"space-y-6\">\r\n <Card className=\"p-6 hover-card\">\r\n <h3 className=\"text-lg font-bold mb-3\">{t('contactInfoTitle')}</h3>\r\n <div className=\"space-y-4\">\r\n <div>\r\n <p className=\"text-sm text-muted-foreground mb-1\">{t('emailLabel')}</p>\r\n <a \r\n href=\"mailto:info@collabdt.org\" \r\n className=\"text-primary hover:underline font-medium text-sm\"\r\n >\r\n info@collabdt.org\r\n </a>\r\n </div>\r\n <div>\r\n <p className=\"text-sm text-muted-foreground mb-1\">{t('websiteLabel')}</p>\r\n <a \r\n href=\"https://collabdt.org\" \r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"text-primary hover:underline font-medium text-sm\"\r\n >\r\n collabdt.org\r\n </a>\r\n </div>\r\n </div>\r\n </Card>\r\n\r\n <Card className=\"p-6 hover-card bg-primary/5 border-primary/20\">\r\n <h3 className=\"text-lg font-bold mb-3\">{t('needHelpTitle')}</h3>\r\n <p className=\"text-sm text-muted-foreground mb-4\">\r\n {t('needHelpDescription')}\r\n </p>\r\n </Card>\r\n </div>\r\n </div>\r\n </motion.div>\r\n </div>\r\n </section>\r\n\r\n \r\n </>\r\n )\r\n}"],"mappings":"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","names":["e"]}
@@ -1 +1 @@
1
- {"version":3,"file":"OrganizationSettingsPanel.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/settings/src/OrganizationSettingsPanel.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAuB9B,MAAM,CAAC,OAAO,UAAU,yBAAyB,sBAschD"}
1
+ {"version":3,"file":"OrganizationSettingsPanel.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/settings/src/OrganizationSettingsPanel.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAyB9B,MAAM,CAAC,OAAO,UAAU,yBAAyB,sBA8chD"}
@@ -39,6 +39,7 @@ import {
39
39
  import { uploadOrganizationLogoToPublicBucket } from "../../../utils/imageUtils";
40
40
  import { useOrganization } from "../../../hooks/organizations/organizations";
41
41
  import OrganizationSkeleton from "./OrganizationSkeleton";
42
+ import { useAppConfigContext } from "../../../store/AppConfig/context";
42
43
  function OrganizationSettingsPanel() {
43
44
  var _a, _b, _c, _d, _e, _f;
44
45
  const t = useTranslations("OrganizationSettings");
@@ -111,8 +112,9 @@ function OrganizationSettingsPanel() {
111
112
  setSelectedLogoFile(null);
112
113
  setSelectedFaviconFile(null);
113
114
  };
114
- const logoUrl = selectedLogoFile ? URL.createObjectURL(selectedLogoFile) : (organization == null ? void 0 : organization.logoKey) ? `${process.env.NEXT_PUBLIC_MINIO_BUCKET_URL}/org-logos/${organization.logoKey}` : null;
115
- const faviconUrl = selectedFaviconFile ? URL.createObjectURL(selectedFaviconFile) : (organization == null ? void 0 : organization.faviconKey) ? `${process.env.NEXT_PUBLIC_MINIO_BUCKET_URL}/org-logos/${organization.faviconKey}` : null;
115
+ const { state: { runtimeConfig: { minioUrl } } } = useAppConfigContext();
116
+ const logoUrl = selectedLogoFile ? URL.createObjectURL(selectedLogoFile) : (organization == null ? void 0 : organization.logoKey) && minioUrl ? `${minioUrl}/org-logos/${organization.logoKey}` : null;
117
+ const faviconUrl = selectedFaviconFile ? URL.createObjectURL(selectedFaviconFile) : (organization == null ? void 0 : organization.faviconKey) && minioUrl ? `${minioUrl}/org-logos/${organization.faviconKey}` : null;
116
118
  if (isOrganizationLoading) {
117
119
  return /* @__PURE__ */ jsx(OrganizationSkeleton, {});
118
120
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/core/components/settings/src/OrganizationSettingsPanel.tsx"],"sourcesContent":["\"use client\"\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from 'react'\r\nimport { useSession } from 'next-auth/react'\r\nimport { toast } from 'sonner'\r\nimport { useTranslations } from 'next-intl'\r\nimport { MapContext, usePermissions } from '../../../store'\r\nimport * as LR from 'lucide-react'\r\n\r\nimport type { Organization } from '../../../types/dbTypes'\r\nimport { Button } from '../../ui/Button'\r\nimport { Input } from '../../ui/Input'\r\nimport { Textarea } from '../../ui/Textarea'\r\nimport { Separator } from '../../ui/Separator'\r\nimport {\r\n Select,\r\n SelectContent,\r\n SelectItem,\r\n SelectTrigger,\r\n SelectValue,\r\n} from '../../ui/Select'\r\nimport { uploadOrganizationLogoToPublicBucket } from '../../../utils/imageUtils'\r\nimport { useOrganization } from '../../../hooks/organizations/organizations'\r\nimport OrganizationSkeleton from './OrganizationSkeleton'\r\n\r\nexport default function OrganizationSettingsPanel() {\r\n const t = useTranslations('OrganizationSettings')\r\n\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const { data: session } = useSession()\r\n\r\n const {state: mapState} = React.useContext(MapContext)\r\n const { countrySubdivisionsData } = mapState.map;\r\n\r\n const user = session?.user\r\n const userOrganizationId = user?.organizationId\r\n const {\r\n organization: organizationData,\r\n isLoading: isOrganizationLoading,\r\n } = useOrganization(userOrganizationId ? String(userOrganizationId) : null)\r\n\r\n const [organization, setOrganization] = React.useState<Organization | null>(organizationData ?? null)\r\n const [editingValues, setEditingValues] = React.useState<Partial<Organization>>({})\r\n const [isEditing, setIsEditing] = React.useState(false)\r\n const [hasChanges, setHasChanges] = React.useState(false)\r\n const [selectedLogoFile, setSelectedLogoFile] = React.useState<File | null>(null)\r\n const [selectedFaviconFile, setSelectedFaviconFile] = React.useState<File | null>(null)\r\n\r\n React.useEffect(() => {\r\n if (organizationData) {\r\n setOrganization(organizationData)\r\n }\r\n }, [organizationData])\r\n\r\n const handleInputChange = (key: keyof Organization, value: any) => {\r\n setEditingValues(prev => ({\r\n ...prev,\r\n [key]: value,\r\n }))\r\n setHasChanges(true)\r\n }\r\n\r\n const getFieldValue = (property: keyof Organization) => {\r\n return Object.prototype.hasOwnProperty.call(editingValues, property)\r\n ? editingValues[property]\r\n : organization?.[property]\r\n }\r\n\r\n const handleSave = async () => {\r\n if (!organization) return\r\n\r\n try {\r\n const patch: Partial<Organization> = {\r\n ...editingValues,\r\n }\r\n\r\n // Upload logo if changed\r\n if (selectedLogoFile) {\r\n const logoKey = await uploadOrganizationLogoToPublicBucket(selectedLogoFile)\r\n patch.logoKey = logoKey\r\n }\r\n\r\n // Upload favicon if changed\r\n if (selectedFaviconFile) {\r\n const faviconKey = await uploadOrganizationLogoToPublicBucket(selectedFaviconFile)\r\n patch.faviconKey = faviconKey\r\n }\r\n\r\n const res = await fetch(`/api/organizations/${organization.id}`, {\r\n method: 'PATCH',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify(patch),\r\n })\r\n\r\n if (!res.ok) throw new Error('Failed to update organization')\r\n\r\n const responseData = await res.json()\r\n const updatedOrg = responseData?.organization ?? responseData\r\n setOrganization(updatedOrg)\r\n setEditingValues({})\r\n setIsEditing(false)\r\n setHasChanges(false)\r\n setSelectedLogoFile(null)\r\n setSelectedFaviconFile(null)\r\n toast.success('Organization updated successfully')\r\n } catch (error) {\r\n toast.error('Failed to update organization')\r\n }\r\n }\r\n\r\n const handleCancel = () => {\r\n setEditingValues({})\r\n setIsEditing(false)\r\n setHasChanges(false)\r\n setSelectedLogoFile(null)\r\n setSelectedFaviconFile(null)\r\n }\r\n\r\n const logoUrl = selectedLogoFile\r\n ? URL.createObjectURL(selectedLogoFile)\r\n : organization?.logoKey\r\n ? `${process.env.NEXT_PUBLIC_MINIO_BUCKET_URL}/org-logos/${organization.logoKey}`\r\n : null\r\n\r\n const faviconUrl = selectedFaviconFile\r\n ? URL.createObjectURL(selectedFaviconFile)\r\n : organization?.faviconKey\r\n ? `${process.env.NEXT_PUBLIC_MINIO_BUCKET_URL}/org-logos/${organization.faviconKey}`\r\n : null\r\n\r\n if (isOrganizationLoading) {\r\n return (\r\n <OrganizationSkeleton />\r\n )\r\n }\r\n\r\n if (!organization) {\r\n return (\r\n <div className=\"flex items-center justify-center h-full\">\r\n <p className=\"text-muted-foreground\">{t('messages.noOrganization')}</p>\r\n </div>\r\n )\r\n }\r\n\r\n const countrySubdivisions = \r\n countrySubdivisionsData\r\n ? Object.values(countrySubdivisionsData).map((subdivision: any) => subdivision.name)\r\n : []\r\n\r\n return (\r\n <div className=\"flex flex-col h-full overflow-hidden\">\r\n {/* Header */}\r\n <div className=\"flex justify-between items-center px-6 py-4 border-b\">\r\n <div>\r\n <h2 className=\"text-2xl font-semibold\">{t('header')}</h2>\r\n <p className=\"text-sm text-muted-foreground\">{t('subheader')}</p>\r\n </div>\r\n <div className=\"flex gap-2\">\r\n {isEditing ? (\r\n <>\r\n <Button variant=\"outline\" onClick={handleCancel} disabled={!ability.can('update', \"Organization\")}>\r\n {t('cancel')}\r\n </Button>\r\n <Button onClick={handleSave} disabled={!hasChanges || !ability.can('update', \"Organization\")}>\r\n <LR.Save className=\"mr-2\" />\r\n {t('save')}\r\n </Button>\r\n </>\r\n ) : (\r\n <Button onClick={() => setIsEditing(true)} disabled={!ability.can('update', \"Organization\")}>\r\n <LR.Pencil className=\"mr-2\" />\r\n {t('edit')}\r\n </Button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Content */}\r\n <div className=\"flex-1 overflow-auto p-6\">\r\n <div className=\"max-w-4xl mx-auto space-y-8\">\r\n {/* Branding Section */}\r\n <div className=\"space-y-4\">\r\n <h3 className=\"text-lg font-semibold\">{t('sections.branding')}</h3>\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\r\n {/* Logo */}\r\n <div className=\"space-y-2\">\r\n <label className=\"text-sm font-medium\">{t('fields.logo')}</label>\r\n <div className=\"flex items-center gap-4\">\r\n <div className=\"w-32 h-32 border rounded-lg overflow-hidden bg-muted flex items-center justify-center relative group\">\r\n {logoUrl ? (\r\n <img src={logoUrl} alt=\"Organization logo\" className=\"w-full h-full object-contain\" />\r\n ) : (\r\n <LR.Building2 className=\"h-12 w-12 text-muted-foreground\" />\r\n )}\r\n {isEditing && (\r\n <label className=\"absolute inset-0 bg-black/50 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center cursor-pointer\">\r\n <LR.Upload className=\"h-6 w-6 text-white\" />\r\n <input\r\n type=\"file\"\r\n accept=\"image/*\"\r\n className=\"hidden\"\r\n onChange={(e) => {\r\n const file = e.target.files?.[0]\r\n if (file) {\r\n setSelectedLogoFile(file)\r\n setHasChanges(true)\r\n }\r\n }}\r\n disabled={!ability.can('update', \"Organization\")}\r\n />\r\n </label>\r\n )}\r\n </div>\r\n {isEditing && logoUrl && (\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => {\r\n setSelectedLogoFile(null)\r\n handleInputChange('logoKey', null)\r\n }}\r\n disabled={!ability.can('update', \"Organization\")}\r\n >\r\n Remove\r\n </Button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Favicon */}\r\n <div className=\"space-y-2\">\r\n <label className=\"text-sm font-medium\">{t('fields.favicon')}</label>\r\n <div className=\"flex items-center gap-4\">\r\n <div className=\"w-16 h-16 border rounded-lg overflow-hidden bg-muted flex items-center justify-center relative group\">\r\n {faviconUrl ? (\r\n <img src={faviconUrl} alt=\"Favicon\" className=\"w-full h-full object-contain\" />\r\n ) : (\r\n <LR.Image className=\"h-6 w-6 text-muted-foreground\" />\r\n )}\r\n {isEditing && (\r\n <label className=\"absolute inset-0 bg-black/50 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center cursor-pointer\">\r\n <LR.Upload className=\"h-4 w-4 text-white\" />\r\n <input\r\n type=\"file\"\r\n accept=\"image/*\"\r\n className=\"hidden\"\r\n onChange={(e) => {\r\n const file = e.target.files?.[0]\r\n if (file) {\r\n setSelectedFaviconFile(file)\r\n setHasChanges(true)\r\n }\r\n }}\r\n disabled={!ability.can('update', \"Organization\")}\r\n />\r\n </label>\r\n )}\r\n </div>\r\n {isEditing && faviconUrl && (\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => {\r\n setSelectedFaviconFile(null)\r\n handleInputChange('faviconKey', null)\r\n }}\r\n disabled={!ability.can('update', \"Organization\")}\r\n >\r\n Remove\r\n </Button>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Colors */}\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div className=\"space-y-2\">\r\n <label className=\"text-sm font-medium\">{t('fields.mainColor')}</label>\r\n <div className=\"flex gap-2\">\r\n <Input\r\n type=\"color\"\r\n value={(getFieldValue('mainColor') as string) || '#000000'}\r\n onChange={(e) => handleInputChange('mainColor', e.target.value)}\r\n disabled={!isEditing || !ability.can('update', \"Organization\")}\r\n className=\"w-20 h-10 p-1\"\r\n \r\n />\r\n <Input\r\n type=\"text\"\r\n value={(getFieldValue('mainColor') as string) || ''}\r\n onChange={(e) => handleInputChange('mainColor', e.target.value)}\r\n disabled={!isEditing || !ability.can('update', \"Organization\")}\r\n placeholder=\"#000000\"\r\n />\r\n </div>\r\n </div>\r\n <div className=\"space-y-2\">\r\n <label className=\"text-sm font-medium\">{t('fields.secondaryColor')}</label>\r\n <div className=\"flex gap-2\">\r\n <Input\r\n type=\"color\"\r\n value={(getFieldValue('secondaryColor') as string) || '#000000'}\r\n onChange={(e) => handleInputChange('secondaryColor', e.target.value)}\r\n disabled={!isEditing || !ability.can('update', \"Organization\")}\r\n className=\"w-20 h-10 p-1\"\r\n />\r\n <Input\r\n type=\"text\"\r\n value={(getFieldValue('secondaryColor') as string) || ''}\r\n onChange={(e) => handleInputChange('secondaryColor', e.target.value)}\r\n disabled={!isEditing || !ability.can('update', \"Organization\")}\r\n placeholder=\"#000000\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <Separator />\r\n\r\n {/* Basic Information */}\r\n <div className=\"space-y-4\">\r\n <h3 className=\"text-lg font-semibold\">{t('sections.basicInfo')}</h3>\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div className=\"space-y-2\">\r\n <label className=\"text-sm font-medium\">{t('fields.name')}</label>\r\n <Input\r\n value={(getFieldValue('name') as string) || ''}\r\n onChange={(e) => handleInputChange('name', e.target.value)}\r\n disabled={!isEditing || !ability.can('update', \"Organization\")}\r\n />\r\n </div>\r\n <div className=\"space-y-2\">\r\n <label className=\"text-sm font-medium\">{t('fields.title')}</label>\r\n <Input\r\n value={(getFieldValue('title') as string) || ''}\r\n onChange={(e) => handleInputChange('title', e.target.value)}\r\n disabled={!isEditing || !ability.can('update', \"Organization\") }\r\n />\r\n </div>\r\n </div>\r\n <div className=\"space-y-2\">\r\n <label className=\"text-sm font-medium\">{t('fields.description')}</label>\r\n <Textarea\r\n value={(getFieldValue('description') as string) || ''}\r\n onChange={(e) => handleInputChange('description', e.target.value)}\r\n disabled={!isEditing || !ability.can('update', \"Organization\")}\r\n rows={4}\r\n />\r\n </div>\r\n </div>\r\n\r\n <Separator />\r\n\r\n {/* Location */}\r\n <div className=\"space-y-4\">\r\n <h3 className=\"text-lg font-semibold\">{t('sections.location')}</h3>\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div className=\"space-y-2\">\r\n <label className=\"text-sm font-medium\">{t('fields.countrySubdivision')}</label>\r\n <Select\r\n value={String(getFieldValue('countrySubdivision') || '')}\r\n onValueChange={(value) => handleInputChange('countrySubdivision', value)}\r\n disabled={!isEditing}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder={t('placeholders.selectProvince')} />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {countrySubdivisions.map((csName) => (\r\n <SelectItem key={csName} value={csName}>\r\n {csName}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n </div>\r\n <div className=\"space-y-2\">\r\n <label className=\"text-sm font-medium\">{t('fields.municipality')}</label>\r\n <Input\r\n value={(getFieldValue('municipality') as string) || ''}\r\n onChange={(e) => handleInputChange('municipality', e.target.value)}\r\n disabled={!isEditing || !ability.can('update', \"Organization\")}\r\n />\r\n </div>\r\n <div className=\"space-y-2\">\r\n <label className=\"text-sm font-medium\">{t('fields.postalCode')}</label>\r\n <Input\r\n value={(getFieldValue('postalCode') as string) || ''}\r\n onChange={(e) => handleInputChange('postalCode', e.target.value)}\r\n disabled={!isEditing || !ability.can('update', \"Organization\")}\r\n />\r\n </div>\r\n <div className=\"space-y-2\">\r\n <label className=\"text-sm font-medium\">{t('fields.locationId')}</label>\r\n <Input\r\n value={(getFieldValue('locationId') as string) || ''}\r\n onChange={(e) => handleInputChange('locationId', e.target.value)}\r\n disabled={!isEditing || !ability.can('update', \"Organization\")}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <Separator />\r\n\r\n {/* Map Configuration */}\r\n <div className=\"space-y-4\">\r\n <h3 className=\"text-lg font-semibold\">{t('sections.mapConfig')}</h3>\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\r\n <div className=\"space-y-2\">\r\n <label className=\"text-sm font-medium\">{t('fields.latitude')}</label>\r\n <Input\r\n type=\"number\"\r\n step=\"any\"\r\n value={(getFieldValue('lat') as number) ?? ''}\r\n onChange={(e) => handleInputChange('lat', e.target.value ? parseFloat(e.target.value) : null)}\r\n disabled={!isEditing || !ability.can('update', \"Organization\")}\r\n />\r\n </div>\r\n <div className=\"space-y-2\">\r\n <label className=\"text-sm font-medium\">{t('fields.longitude')}</label>\r\n <Input\r\n type=\"number\"\r\n step=\"any\"\r\n value={(getFieldValue('long') as number) ?? ''}\r\n onChange={(e) => handleInputChange('long', e.target.value ? parseFloat(e.target.value) : null)}\r\n disabled={!isEditing || !ability.can('update', \"Organization\")}\r\n />\r\n </div>\r\n <div className=\"space-y-2\">\r\n <label className=\"text-sm font-medium\">{t('fields.zoom')}</label>\r\n <Input\r\n type=\"number\"\r\n step=\"any\"\r\n value={(getFieldValue('zoom') as number) ?? ''}\r\n onChange={(e) => handleInputChange('zoom', e.target.value ? parseFloat(e.target.value) : null)}\r\n disabled={!isEditing || !ability.can('update', \"Organization\")}\r\n />\r\n </div>\r\n <div className=\"space-y-2\">\r\n <label className=\"text-sm font-medium\">{t('fields.minZoom')}</label>\r\n <Input\r\n type=\"number\"\r\n step=\"any\"\r\n value={(getFieldValue('minZoom') as number) ?? ''}\r\n onChange={(e) => handleInputChange('minZoom', e.target.value ? parseFloat(e.target.value) : null)}\r\n disabled={!isEditing || !ability.can('update', \"Organization\")}\r\n />\r\n </div>\r\n <div className=\"space-y-2\">\r\n <label className=\"text-sm font-medium\">{t('fields.bearing')}</label>\r\n <Input\r\n type=\"number\"\r\n step=\"any\"\r\n value={(getFieldValue('bearing') as number) ?? ''}\r\n onChange={(e) => handleInputChange('bearing', e.target.value ? parseFloat(e.target.value) : null)}\r\n disabled={!isEditing || !ability.can('update', \"Organization\")}\r\n />\r\n </div>\r\n <div className=\"space-y-2\">\r\n <label className=\"text-sm font-medium\">{t('fields.pitch')}</label>\r\n <Input\r\n type=\"number\"\r\n step=\"any\"\r\n value={(getFieldValue('pitch') as number) ?? ''}\r\n onChange={(e) => handleInputChange('pitch', e.target.value ? parseFloat(e.target.value) : null)}\r\n disabled={!isEditing || !ability.can('update', \"Organization\")}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n"],"mappings":"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","names":["_a"]}
1
+ {"version":3,"sources":["../../../../../src/core/components/settings/src/OrganizationSettingsPanel.tsx"],"sourcesContent":["\"use client\"\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from 'react'\r\nimport { useSession } from 'next-auth/react'\r\nimport { toast } from 'sonner'\r\nimport { useTranslations } from 'next-intl'\r\nimport { MapContext, usePermissions } from '../../../store'\r\nimport * as LR from 'lucide-react'\r\n\r\nimport type { Organization } from '../../../types/dbTypes'\r\nimport { Button } from '../../ui/Button'\r\nimport { Input } from '../../ui/Input'\r\nimport { Textarea } from '../../ui/Textarea'\r\nimport { Separator } from '../../ui/Separator'\r\nimport {\r\n Select,\r\n SelectContent,\r\n SelectItem,\r\n SelectTrigger,\r\n SelectValue,\r\n} from '../../ui/Select'\r\nimport { uploadOrganizationLogoToPublicBucket } from '../../../utils/imageUtils'\r\nimport { useOrganization } from '../../../hooks/organizations/organizations'\r\nimport OrganizationSkeleton from './OrganizationSkeleton'\r\n\r\nimport { useAppConfigContext } from '../../../store/AppConfig/context'\r\n\r\nexport default function OrganizationSettingsPanel() {\r\n const t = useTranslations('OrganizationSettings')\r\n\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const { data: session } = useSession()\r\n\r\n const {state: mapState} = React.useContext(MapContext)\r\n const { countrySubdivisionsData } = mapState.map;\r\n\r\n const user = session?.user\r\n const userOrganizationId = user?.organizationId\r\n const {\r\n organization: organizationData,\r\n isLoading: isOrganizationLoading,\r\n } = useOrganization(userOrganizationId ? String(userOrganizationId) : null)\r\n\r\n const [organization, setOrganization] = React.useState<Organization | null>(organizationData ?? null)\r\n const [editingValues, setEditingValues] = React.useState<Partial<Organization>>({})\r\n const [isEditing, setIsEditing] = React.useState(false)\r\n const [hasChanges, setHasChanges] = React.useState(false)\r\n const [selectedLogoFile, setSelectedLogoFile] = React.useState<File | null>(null)\r\n const [selectedFaviconFile, setSelectedFaviconFile] = React.useState<File | null>(null)\r\n\r\n React.useEffect(() => {\r\n if (organizationData) {\r\n setOrganization(organizationData)\r\n }\r\n }, [organizationData])\r\n\r\n const handleInputChange = (key: keyof Organization, value: any) => {\r\n setEditingValues(prev => ({\r\n ...prev,\r\n [key]: value,\r\n }))\r\n setHasChanges(true)\r\n }\r\n\r\n const getFieldValue = (property: keyof Organization) => {\r\n return Object.prototype.hasOwnProperty.call(editingValues, property)\r\n ? editingValues[property]\r\n : organization?.[property]\r\n }\r\n\r\n const handleSave = async () => {\r\n if (!organization) return\r\n\r\n try {\r\n const patch: Partial<Organization> = {\r\n ...editingValues,\r\n }\r\n\r\n // Upload logo if changed\r\n if (selectedLogoFile) {\r\n const logoKey = await uploadOrganizationLogoToPublicBucket(selectedLogoFile)\r\n patch.logoKey = logoKey\r\n }\r\n\r\n // Upload favicon if changed\r\n if (selectedFaviconFile) {\r\n const faviconKey = await uploadOrganizationLogoToPublicBucket(selectedFaviconFile)\r\n patch.faviconKey = faviconKey\r\n }\r\n\r\n const res = await fetch(`/api/organizations/${organization.id}`, {\r\n method: 'PATCH',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify(patch),\r\n })\r\n\r\n if (!res.ok) throw new Error('Failed to update organization')\r\n\r\n const responseData = await res.json()\r\n const updatedOrg = responseData?.organization ?? responseData\r\n setOrganization(updatedOrg)\r\n setEditingValues({})\r\n setIsEditing(false)\r\n setHasChanges(false)\r\n setSelectedLogoFile(null)\r\n setSelectedFaviconFile(null)\r\n toast.success('Organization updated successfully')\r\n } catch (error) {\r\n toast.error('Failed to update organization')\r\n }\r\n }\r\n\r\n const handleCancel = () => {\r\n setEditingValues({})\r\n setIsEditing(false)\r\n setHasChanges(false)\r\n setSelectedLogoFile(null)\r\n setSelectedFaviconFile(null)\r\n }\r\n\r\n const { state: { runtimeConfig: { minioUrl } } } = useAppConfigContext()\r\n\r\n const logoUrl = selectedLogoFile\r\n ? URL.createObjectURL(selectedLogoFile)\r\n : organization?.logoKey && minioUrl\r\n ? `${minioUrl}/org-logos/${organization.logoKey}`\r\n : null\r\n\r\n const faviconUrl = selectedFaviconFile\r\n ? URL.createObjectURL(selectedFaviconFile)\r\n : organization?.faviconKey && minioUrl\r\n ? `${minioUrl}/org-logos/${organization.faviconKey}`\r\n : null\r\n\r\n// const faviconUrl = selectedFaviconFile\r\n// ? URL.createObjectURL(selectedFaviconFile)\r\n// : organization?.faviconKey && minioUrl\r\n// ? `${minioUrl}/org-logos/${organization.faviconKey}`\r\n// : null\r\n \r\n if (isOrganizationLoading) {\r\n return (\r\n <OrganizationSkeleton />\r\n )\r\n }\r\n\r\n if (!organization) {\r\n return (\r\n <div className=\"flex items-center justify-center h-full\">\r\n <p className=\"text-muted-foreground\">{t('messages.noOrganization')}</p>\r\n </div>\r\n )\r\n }\r\n\r\n const countrySubdivisions = \r\n countrySubdivisionsData\r\n ? Object.values(countrySubdivisionsData).map((subdivision: any) => subdivision.name)\r\n : []\r\n\r\n return (\r\n <div className=\"flex flex-col h-full overflow-hidden\">\r\n {/* Header */}\r\n <div className=\"flex justify-between items-center px-6 py-4 border-b\">\r\n <div>\r\n <h2 className=\"text-2xl font-semibold\">{t('header')}</h2>\r\n <p className=\"text-sm text-muted-foreground\">{t('subheader')}</p>\r\n </div>\r\n <div className=\"flex gap-2\">\r\n {isEditing ? (\r\n <>\r\n <Button variant=\"outline\" onClick={handleCancel} disabled={!ability.can('update', \"Organization\")}>\r\n {t('cancel')}\r\n </Button>\r\n <Button onClick={handleSave} disabled={!hasChanges || !ability.can('update', \"Organization\")}>\r\n <LR.Save className=\"mr-2\" />\r\n {t('save')}\r\n </Button>\r\n </>\r\n ) : (\r\n <Button onClick={() => setIsEditing(true)} disabled={!ability.can('update', \"Organization\")}>\r\n <LR.Pencil className=\"mr-2\" />\r\n {t('edit')}\r\n </Button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Content */}\r\n <div className=\"flex-1 overflow-auto p-6\">\r\n <div className=\"max-w-4xl mx-auto space-y-8\">\r\n {/* Branding Section */}\r\n <div className=\"space-y-4\">\r\n <h3 className=\"text-lg font-semibold\">{t('sections.branding')}</h3>\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\r\n {/* Logo */}\r\n <div className=\"space-y-2\">\r\n <label className=\"text-sm font-medium\">{t('fields.logo')}</label>\r\n <div className=\"flex items-center gap-4\">\r\n <div className=\"w-32 h-32 border rounded-lg overflow-hidden bg-muted flex items-center justify-center relative group\">\r\n {logoUrl ? (\r\n <img src={logoUrl} alt=\"Organization logo\" className=\"w-full h-full object-contain\" />\r\n ) : (\r\n <LR.Building2 className=\"h-12 w-12 text-muted-foreground\" />\r\n )}\r\n {isEditing && (\r\n <label className=\"absolute inset-0 bg-black/50 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center cursor-pointer\">\r\n <LR.Upload className=\"h-6 w-6 text-white\" />\r\n <input\r\n type=\"file\"\r\n accept=\"image/*\"\r\n className=\"hidden\"\r\n onChange={(e) => {\r\n const file = e.target.files?.[0]\r\n if (file) {\r\n setSelectedLogoFile(file)\r\n setHasChanges(true)\r\n }\r\n }}\r\n disabled={!ability.can('update', \"Organization\")}\r\n />\r\n </label>\r\n )}\r\n </div>\r\n {isEditing && logoUrl && (\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => {\r\n setSelectedLogoFile(null)\r\n handleInputChange('logoKey', null)\r\n }}\r\n disabled={!ability.can('update', \"Organization\")}\r\n >\r\n Remove\r\n </Button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Favicon */}\r\n <div className=\"space-y-2\">\r\n <label className=\"text-sm font-medium\">{t('fields.favicon')}</label>\r\n <div className=\"flex items-center gap-4\">\r\n <div className=\"w-16 h-16 border rounded-lg overflow-hidden bg-muted flex items-center justify-center relative group\">\r\n {faviconUrl ? (\r\n <img src={faviconUrl} alt=\"Favicon\" className=\"w-full h-full object-contain\" />\r\n ) : (\r\n <LR.Image className=\"h-6 w-6 text-muted-foreground\" />\r\n )}\r\n {isEditing && (\r\n <label className=\"absolute inset-0 bg-black/50 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center cursor-pointer\">\r\n <LR.Upload className=\"h-4 w-4 text-white\" />\r\n <input\r\n type=\"file\"\r\n accept=\"image/*\"\r\n className=\"hidden\"\r\n onChange={(e) => {\r\n const file = e.target.files?.[0]\r\n if (file) {\r\n setSelectedFaviconFile(file)\r\n setHasChanges(true)\r\n }\r\n }}\r\n disabled={!ability.can('update', \"Organization\")}\r\n />\r\n </label>\r\n )}\r\n </div>\r\n {isEditing && faviconUrl && (\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => {\r\n setSelectedFaviconFile(null)\r\n handleInputChange('faviconKey', null)\r\n }}\r\n disabled={!ability.can('update', \"Organization\")}\r\n >\r\n Remove\r\n </Button>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Colors */}\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div className=\"space-y-2\">\r\n <label className=\"text-sm font-medium\">{t('fields.mainColor')}</label>\r\n <div className=\"flex gap-2\">\r\n <Input\r\n type=\"color\"\r\n value={(getFieldValue('mainColor') as string) || '#000000'}\r\n onChange={(e) => handleInputChange('mainColor', e.target.value)}\r\n disabled={!isEditing || !ability.can('update', \"Organization\")}\r\n className=\"w-20 h-10 p-1\"\r\n \r\n />\r\n <Input\r\n type=\"text\"\r\n value={(getFieldValue('mainColor') as string) || ''}\r\n onChange={(e) => handleInputChange('mainColor', e.target.value)}\r\n disabled={!isEditing || !ability.can('update', \"Organization\")}\r\n placeholder=\"#000000\"\r\n />\r\n </div>\r\n </div>\r\n <div className=\"space-y-2\">\r\n <label className=\"text-sm font-medium\">{t('fields.secondaryColor')}</label>\r\n <div className=\"flex gap-2\">\r\n <Input\r\n type=\"color\"\r\n value={(getFieldValue('secondaryColor') as string) || '#000000'}\r\n onChange={(e) => handleInputChange('secondaryColor', e.target.value)}\r\n disabled={!isEditing || !ability.can('update', \"Organization\")}\r\n className=\"w-20 h-10 p-1\"\r\n />\r\n <Input\r\n type=\"text\"\r\n value={(getFieldValue('secondaryColor') as string) || ''}\r\n onChange={(e) => handleInputChange('secondaryColor', e.target.value)}\r\n disabled={!isEditing || !ability.can('update', \"Organization\")}\r\n placeholder=\"#000000\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <Separator />\r\n\r\n {/* Basic Information */}\r\n <div className=\"space-y-4\">\r\n <h3 className=\"text-lg font-semibold\">{t('sections.basicInfo')}</h3>\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div className=\"space-y-2\">\r\n <label className=\"text-sm font-medium\">{t('fields.name')}</label>\r\n <Input\r\n value={(getFieldValue('name') as string) || ''}\r\n onChange={(e) => handleInputChange('name', e.target.value)}\r\n disabled={!isEditing || !ability.can('update', \"Organization\")}\r\n />\r\n </div>\r\n <div className=\"space-y-2\">\r\n <label className=\"text-sm font-medium\">{t('fields.title')}</label>\r\n <Input\r\n value={(getFieldValue('title') as string) || ''}\r\n onChange={(e) => handleInputChange('title', e.target.value)}\r\n disabled={!isEditing || !ability.can('update', \"Organization\") }\r\n />\r\n </div>\r\n </div>\r\n <div className=\"space-y-2\">\r\n <label className=\"text-sm font-medium\">{t('fields.description')}</label>\r\n <Textarea\r\n value={(getFieldValue('description') as string) || ''}\r\n onChange={(e) => handleInputChange('description', e.target.value)}\r\n disabled={!isEditing || !ability.can('update', \"Organization\")}\r\n rows={4}\r\n />\r\n </div>\r\n </div>\r\n\r\n <Separator />\r\n\r\n {/* Location */}\r\n <div className=\"space-y-4\">\r\n <h3 className=\"text-lg font-semibold\">{t('sections.location')}</h3>\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div className=\"space-y-2\">\r\n <label className=\"text-sm font-medium\">{t('fields.countrySubdivision')}</label>\r\n <Select\r\n value={String(getFieldValue('countrySubdivision') || '')}\r\n onValueChange={(value) => handleInputChange('countrySubdivision', value)}\r\n disabled={!isEditing}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder={t('placeholders.selectProvince')} />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {countrySubdivisions.map((csName) => (\r\n <SelectItem key={csName} value={csName}>\r\n {csName}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n </div>\r\n <div className=\"space-y-2\">\r\n <label className=\"text-sm font-medium\">{t('fields.municipality')}</label>\r\n <Input\r\n value={(getFieldValue('municipality') as string) || ''}\r\n onChange={(e) => handleInputChange('municipality', e.target.value)}\r\n disabled={!isEditing || !ability.can('update', \"Organization\")}\r\n />\r\n </div>\r\n <div className=\"space-y-2\">\r\n <label className=\"text-sm font-medium\">{t('fields.postalCode')}</label>\r\n <Input\r\n value={(getFieldValue('postalCode') as string) || ''}\r\n onChange={(e) => handleInputChange('postalCode', e.target.value)}\r\n disabled={!isEditing || !ability.can('update', \"Organization\")}\r\n />\r\n </div>\r\n <div className=\"space-y-2\">\r\n <label className=\"text-sm font-medium\">{t('fields.locationId')}</label>\r\n <Input\r\n value={(getFieldValue('locationId') as string) || ''}\r\n onChange={(e) => handleInputChange('locationId', e.target.value)}\r\n disabled={!isEditing || !ability.can('update', \"Organization\")}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <Separator />\r\n\r\n {/* Map Configuration */}\r\n <div className=\"space-y-4\">\r\n <h3 className=\"text-lg font-semibold\">{t('sections.mapConfig')}</h3>\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\r\n <div className=\"space-y-2\">\r\n <label className=\"text-sm font-medium\">{t('fields.latitude')}</label>\r\n <Input\r\n type=\"number\"\r\n step=\"any\"\r\n value={(getFieldValue('lat') as number) ?? ''}\r\n onChange={(e) => handleInputChange('lat', e.target.value ? parseFloat(e.target.value) : null)}\r\n disabled={!isEditing || !ability.can('update', \"Organization\")}\r\n />\r\n </div>\r\n <div className=\"space-y-2\">\r\n <label className=\"text-sm font-medium\">{t('fields.longitude')}</label>\r\n <Input\r\n type=\"number\"\r\n step=\"any\"\r\n value={(getFieldValue('long') as number) ?? ''}\r\n onChange={(e) => handleInputChange('long', e.target.value ? parseFloat(e.target.value) : null)}\r\n disabled={!isEditing || !ability.can('update', \"Organization\")}\r\n />\r\n </div>\r\n <div className=\"space-y-2\">\r\n <label className=\"text-sm font-medium\">{t('fields.zoom')}</label>\r\n <Input\r\n type=\"number\"\r\n step=\"any\"\r\n value={(getFieldValue('zoom') as number) ?? ''}\r\n onChange={(e) => handleInputChange('zoom', e.target.value ? parseFloat(e.target.value) : null)}\r\n disabled={!isEditing || !ability.can('update', \"Organization\")}\r\n />\r\n </div>\r\n <div className=\"space-y-2\">\r\n <label className=\"text-sm font-medium\">{t('fields.minZoom')}</label>\r\n <Input\r\n type=\"number\"\r\n step=\"any\"\r\n value={(getFieldValue('minZoom') as number) ?? ''}\r\n onChange={(e) => handleInputChange('minZoom', e.target.value ? parseFloat(e.target.value) : null)}\r\n disabled={!isEditing || !ability.can('update', \"Organization\")}\r\n />\r\n </div>\r\n <div className=\"space-y-2\">\r\n <label className=\"text-sm font-medium\">{t('fields.bearing')}</label>\r\n <Input\r\n type=\"number\"\r\n step=\"any\"\r\n value={(getFieldValue('bearing') as number) ?? ''}\r\n onChange={(e) => handleInputChange('bearing', e.target.value ? parseFloat(e.target.value) : null)}\r\n disabled={!isEditing || !ability.can('update', \"Organization\")}\r\n />\r\n </div>\r\n <div className=\"space-y-2\">\r\n <label className=\"text-sm font-medium\">{t('fields.pitch')}</label>\r\n <Input\r\n type=\"number\"\r\n step=\"any\"\r\n value={(getFieldValue('pitch') as number) ?? ''}\r\n onChange={(e) => handleInputChange('pitch', e.target.value ? parseFloat(e.target.value) : null)}\r\n disabled={!isEditing || !ability.can('update', \"Organization\")}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n"],"mappings":"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","names":["_a"]}