@burdenoff/microfe-channel 2026.527.1 → 2026.530.2

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 (25) hide show
  1. package/dist/channel/ChannelRoutes.js +5 -5
  2. package/dist/channel/ChannelRoutes.js.map +1 -1
  3. package/dist/channel/constants/permissions.js +3 -0
  4. package/dist/channel/constants/permissions.js.map +1 -1
  5. package/dist/channel/modules/channels/pages/ChannelDashboardPage.js +227 -221
  6. package/dist/channel/modules/channels/pages/ChannelDashboardPage.js.map +1 -1
  7. package/dist/channel/modules/channels/pages/ChannelDetailsPage.js +392 -391
  8. package/dist/channel/modules/channels/pages/ChannelDetailsPage.js.map +1 -1
  9. package/dist/channel/modules/channels/pages/ChannelUsersPage.js +1 -1
  10. package/dist/channel/modules/channels/pages/ChannelUsersPage.js.map +1 -1
  11. package/dist/channel/modules/channels/pages/ChannelsListPage.js +216 -212
  12. package/dist/channel/modules/channels/pages/ChannelsListPage.js.map +1 -1
  13. package/dist/channel/modules/channels/pages/ConnectionDetailsPage.js +99 -98
  14. package/dist/channel/modules/channels/pages/ConnectionDetailsPage.js.map +1 -1
  15. package/dist/channel/modules/channels/pages/ConnectionsListPage.js +129 -126
  16. package/dist/channel/modules/channels/pages/ConnectionsListPage.js.map +1 -1
  17. package/dist/channel/modules/channels/pages/CreateChannelPage.js +40 -50
  18. package/dist/channel/modules/channels/pages/CreateChannelPage.js.map +1 -1
  19. package/dist/channel/modules/channels/pages/DeliveryHistoryPage.js +1 -1
  20. package/dist/channel/modules/channels/pages/DeliveryHistoryPage.js.map +1 -1
  21. package/dist/channel/modules/channels/pages/WebhookEventsPage.js +1 -1
  22. package/dist/channel/modules/channels/pages/WebhookEventsPage.js.map +1 -1
  23. package/dist/channel/pages/ChannelLandingPage.js +50 -34
  24. package/dist/channel/pages/ChannelLandingPage.js.map +1 -1
  25. package/package.json +2 -2
@@ -8,12 +8,13 @@ import { HEALTH_I18N as ee, PLATFORM_I18N as te, STATUS_I18N as ne, translateLab
8
8
  import { useExportChannels as re } from "../hooks/useExport.js";
9
9
  import { useEffect as u, useMemo as d, useRef as ie, useState as f } from "react";
10
10
  import { useI18n as ae } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
11
- import { AlertCircle as p, AlertTriangle as m, CheckCircle2 as h, Download as oe, Eye as se, HelpCircle as g, Loader2 as _, Pencil as ce, Plus as v, Power as le, PowerOff as y, Radio as b, RefreshCw as ue, Search as de, Trash2 as fe, XCircle as x } from "lucide-react";
12
- import { useNavigate as pe } from "react-router-dom";
13
- import { jsx as S, jsxs as C } from "react/jsx-runtime";
14
- import { TagBadge as me } from "@burdenoff/fe-libs/tag";
11
+ import { AlertCircle as p, AlertTriangle as m, CheckCircle2 as h, Download as oe, Eye as se, HelpCircle as g, Loader2 as _, Pencil as ce, Plus as v, Power as le, PowerOff as y, Radio as ue, RefreshCw as de, Search as fe, Trash2 as pe, XCircle as b } from "lucide-react";
12
+ import { useNavigate as me } from "react-router-dom";
13
+ import { usePermissions as he } from "@burdenoff/fe-libs/shared/providers/shell";
14
+ import { jsx as x, jsxs as S } from "react/jsx-runtime";
15
+ import { TagBadge as ge } from "@burdenoff/fe-libs/tag";
15
16
  //#region src/channel/modules/channels/pages/ChannelsListPage.tsx
16
- var w = {
17
+ var C = {
17
18
  EMAIL: {
18
19
  label: "Email",
19
20
  color: "bg-accent-blue-subtle text-accent-blue"
@@ -54,7 +55,7 @@ var w = {
54
55
  label: "Webchat",
55
56
  color: "bg-accent-teal-subtle text-accent-teal"
56
57
  }
57
- }, T = {
58
+ }, w = {
58
59
  ACTIVE: {
59
60
  label: "Active",
60
61
  color: "text-status-success-text bg-status-success-bg-subtle",
@@ -68,7 +69,7 @@ var w = {
68
69
  ERROR: {
69
70
  label: "Error",
70
71
  color: "text-status-error-text bg-status-error-bg-subtle",
71
- icon: x
72
+ icon: b
72
73
  },
73
74
  SUSPENDED: {
74
75
  label: "Suspended",
@@ -80,7 +81,7 @@ var w = {
80
81
  color: "text-muted-foreground bg-muted",
81
82
  icon: y
82
83
  }
83
- }, E = {
84
+ }, T = {
84
85
  HEALTHY: {
85
86
  label: "Healthy",
86
87
  color: "text-status-success-text",
@@ -94,7 +95,7 @@ var w = {
94
95
  UNHEALTHY: {
95
96
  label: "Unhealthy",
96
97
  color: "text-status-error-text",
97
- icon: x
98
+ icon: b
98
99
  },
99
100
  UNKNOWN: {
100
101
  label: "Unknown",
@@ -102,24 +103,24 @@ var w = {
102
103
  icon: g
103
104
  }
104
105
  };
105
- function D() {
106
- let m = pe(), { t: h } = ae(), g = (e, t) => {
107
- let n = h(e);
106
+ function _e() {
107
+ let m = me(), { hasPermission: h } = he(), g = h(c.CHANNEL_CREATE), b = h(c.CHANNEL_UPDATE), { t: _e } = ae(), E = (e, t) => {
108
+ let n = _e(e);
108
109
  return n === e ? t : n;
109
- }, [x, D] = f(null), [he, O] = f(null), [k, A] = f(/* @__PURE__ */ new Set()), [j, M] = f(null), { organizationId: ge } = e(), { triggerExport: _e, isExporting: N, exportError: P } = re(ge ?? void 0), [F] = f(12), [I, L] = f(0), { channels: R, isLoading: z, error: B, total: V, filter: H, updateFilter: U, deleteChannel: W, activateChannel: G, deactivateChannel: K, runHealthCheck: q, refetch: J } = o(), Y = Math.max(1, Math.ceil(V / F)), ve = ie(J);
110
+ }, [ve, D] = f(null), [ye, O] = f(null), [k, A] = f(/* @__PURE__ */ new Set()), [j, M] = f(null), { organizationId: be } = e(), { triggerExport: xe, isExporting: N, exportError: P } = re(be ?? void 0), [F] = f(12), [I, L] = f(0), { channels: R, isLoading: Se, error: z, total: B, filter: V, updateFilter: H, deleteChannel: U, activateChannel: W, deactivateChannel: G, runHealthCheck: K, refetch: q } = o(), J = Math.max(1, Math.ceil(B / F)), Y = ie(q);
110
111
  u(() => {
111
- ve.current = J;
112
+ Y.current = q;
112
113
  }), u(() => {
113
- ve.current({
114
+ Y.current({
114
115
  offset: I * F,
115
116
  limit: F
116
117
  });
117
118
  }, [I, F]), u(() => {
118
119
  Promise.resolve().then(() => L(0));
119
120
  }, [
120
- H.search,
121
- H.platform,
122
- H.status
121
+ V.search,
122
+ V.platform,
123
+ V.status
123
124
  ]), u(() => {
124
125
  let e = [
125
126
  "channel.created",
@@ -128,13 +129,13 @@ function D() {
128
129
  "connection.created",
129
130
  "connection.updated",
130
131
  "connection.deleted"
131
- ].map((e) => a(e, () => void J()));
132
+ ].map((e) => a(e, () => void q()));
132
133
  return () => e.forEach((e) => e());
133
- }, [J]);
134
- let ye = async (e) => {
134
+ }, [q]);
135
+ let Ce = async (e) => {
135
136
  n("medium"), O(e);
136
137
  try {
137
- await W(e), r("success"), D(null);
138
+ await U(e), r("success"), D(null);
138
139
  } catch (e) {
139
140
  r("error"), i(e, {
140
141
  module: "channel",
@@ -143,10 +144,10 @@ function D() {
143
144
  } finally {
144
145
  O(null);
145
146
  }
146
- }, be = async (e) => {
147
+ }, we = async (e) => {
147
148
  O(e.id);
148
149
  try {
149
- e.status === "ACTIVE" ? await K(e.id) : await G(e.id);
150
+ e.status === "ACTIVE" ? await G(e.id) : await W(e.id);
150
151
  } catch (e) {
151
152
  i(e, {
152
153
  module: "channel",
@@ -155,10 +156,10 @@ function D() {
155
156
  } finally {
156
157
  O(null);
157
158
  }
158
- }, xe = async (e) => {
159
+ }, Te = async (e) => {
159
160
  O(e);
160
161
  try {
161
- await q(e);
162
+ await K(e);
162
163
  } catch (e) {
163
164
  i(e, {
164
165
  module: "channel",
@@ -167,22 +168,22 @@ function D() {
167
168
  } finally {
168
169
  O(null);
169
170
  }
170
- }, X = d(() => R.filter((e) => k.has(e.id)), [R, k]), Z = d(() => X.filter((e) => e.status === "ACTIVE"), [X]), Q = d(() => X.filter((e) => e.status !== "ACTIVE"), [X]), $ = R.length > 0 && R.every((e) => k.has(e.id)), Se = R.some((e) => k.has(e.id)) && !$, Ce = (e, t) => {
171
+ }, X = d(() => R.filter((e) => k.has(e.id)), [R, k]), Z = d(() => X.filter((e) => e.status === "ACTIVE"), [X]), Q = d(() => X.filter((e) => e.status !== "ACTIVE"), [X]), $ = R.length > 0 && R.every((e) => k.has(e.id)), Ee = R.some((e) => k.has(e.id)) && !$, De = (e, t) => {
171
172
  A((n) => {
172
173
  let r = new Set(n);
173
174
  return t ? r.add(e) : r.delete(e), r;
174
175
  });
175
- }, we = (e) => {
176
+ }, Oe = (e) => {
176
177
  A((t) => {
177
178
  let n = new Set(t);
178
179
  return R.forEach((t) => {
179
180
  e ? n.add(t.id) : n.delete(t.id);
180
181
  }), n;
181
182
  });
182
- }, Te = async () => {
183
+ }, ke = async () => {
183
184
  if (X.length === 0) return;
184
185
  n("medium");
185
- let e = g(X.length === 1 ? "channel.bulkDeleteConfirmSingle" : "channel.bulkDeleteConfirmMultiple", X.length === 1 ? "Delete 1 selected channel?" : `Delete ${X.length} selected channels?`), r = await t({
186
+ let e = E(X.length === 1 ? "channel.bulkDeleteConfirmSingle" : "channel.bulkDeleteConfirmMultiple", X.length === 1 ? "Delete 1 selected channel?" : `Delete ${X.length} selected channels?`), r = await t({
186
187
  title: "Delete channels",
187
188
  message: e,
188
189
  okButtonTitle: "Delete",
@@ -191,311 +192,314 @@ function D() {
191
192
  if (r === null ? window.confirm(e) : r) {
192
193
  M("delete");
193
194
  try {
194
- await Promise.allSettled(X.map((e) => W(e.id))), A(/* @__PURE__ */ new Set());
195
+ await Promise.allSettled(X.map((e) => U(e.id))), A(/* @__PURE__ */ new Set());
195
196
  } finally {
196
197
  M(null);
197
198
  }
198
199
  }
199
- }, Ee = async () => {
200
+ }, Ae = async () => {
200
201
  if (Q.length !== 0) {
201
202
  M("activate");
202
203
  try {
203
- await Promise.allSettled(Q.map((e) => G(e.id))), A(/* @__PURE__ */ new Set());
204
+ await Promise.allSettled(Q.map((e) => W(e.id))), A(/* @__PURE__ */ new Set());
204
205
  } finally {
205
206
  M(null);
206
207
  }
207
208
  }
208
- }, De = async () => {
209
+ }, je = async () => {
209
210
  if (Z.length !== 0) {
210
211
  M("deactivate");
211
212
  try {
212
- await Promise.allSettled(Z.map((e) => K(e.id))), A(/* @__PURE__ */ new Set());
213
+ await Promise.allSettled(Z.map((e) => G(e.id))), A(/* @__PURE__ */ new Set());
213
214
  } finally {
214
215
  M(null);
215
216
  }
216
217
  }
217
- }, Oe = async () => {
218
+ }, Me = async () => {
218
219
  if (X.length !== 0) {
219
220
  M("health");
220
221
  try {
221
- await Promise.allSettled(X.map((e) => q(e.id)));
222
+ await Promise.allSettled(X.map((e) => K(e.id)));
222
223
  } finally {
223
224
  M(null);
224
225
  }
225
226
  }
226
- }, ke = (e) => ({
227
- ...w[e] || {
227
+ }, Ne = (e) => ({
228
+ ...C[e] || {
228
229
  label: e,
229
230
  color: "bg-bg-sunken text-text-secondary"
230
231
  },
231
- label: l(e, te, g)
232
- }), Ae = (e) => ({
233
- ...T[e] || T.INACTIVE,
234
- label: l(e, ne, g)
235
- }), je = (e) => ({
236
- ...E[e] || E.UNKNOWN,
237
- label: l(e, ee, g)
232
+ label: l(e, te, E)
233
+ }), Pe = (e) => ({
234
+ ...w[e] || w.INACTIVE,
235
+ label: l(e, ne, E)
236
+ }), Fe = (e) => ({
237
+ ...T[e] || T.UNKNOWN,
238
+ label: l(e, ee, E)
238
239
  });
239
- return /* @__PURE__ */ S(s, {
240
+ return /* @__PURE__ */ x(s, {
240
241
  permission: c.CHANNEL_READ,
241
- children: /* @__PURE__ */ C("div", {
242
+ children: /* @__PURE__ */ S("div", {
242
243
  className: "space-y-4 sm:space-y-6 p-3 sm:p-6",
243
244
  children: [
244
- /* @__PURE__ */ C("div", {
245
+ /* @__PURE__ */ S("div", {
245
246
  className: "flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",
246
- children: [/* @__PURE__ */ C("div", { children: [/* @__PURE__ */ S("h1", {
247
+ children: [/* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("h1", {
247
248
  className: "text-xl sm:text-2xl font-bold text-foreground",
248
- children: g("channel.channels", "Channels")
249
- }), /* @__PURE__ */ C("p", {
249
+ children: E("channel.channels", "Channels")
250
+ }), /* @__PURE__ */ S("p", {
250
251
  className: "text-sm text-muted-foreground mt-1",
251
252
  children: [
252
- g("channel.manageChannels", "Manage your communication channels"),
253
+ E("channel.manageChannels", "Manage your communication channels"),
253
254
  " (",
254
- V,
255
+ B,
255
256
  " total)"
256
257
  ]
257
- })] }), /* @__PURE__ */ C("div", {
258
+ })] }), /* @__PURE__ */ S("div", {
258
259
  className: "flex items-center gap-2",
259
- children: [/* @__PURE__ */ S(s, {
260
- permission: c.CHANNEL_ADMIN,
261
- children: /* @__PURE__ */ C("button", {
260
+ children: [/* @__PURE__ */ x(s, {
261
+ permission: c.CHANNEL_EXPORT,
262
+ children: /* @__PURE__ */ S("button", {
262
263
  type: "button",
263
- onClick: () => void _e(),
264
+ onClick: () => void xe(),
264
265
  disabled: N,
265
266
  className: "flex items-center gap-2 px-4 py-2 text-sm font-medium text-fg border border-border hover:bg-bg-elevated rounded-lg transition-colors disabled:opacity-50 disabled:cursor-not-allowed",
266
- title: g("channel.exportCSV", "Export to CSV"),
267
- children: [N ? /* @__PURE__ */ S(_, {
267
+ title: E("channel.exportCSV", "Export to CSV"),
268
+ "data-tour": "channels-list-export-button",
269
+ children: [N ? /* @__PURE__ */ x(_, {
268
270
  size: 16,
269
271
  className: "animate-spin"
270
- }) : /* @__PURE__ */ S(oe, { size: 16 }), g("channel.export", "Export")]
272
+ }) : /* @__PURE__ */ x(oe, { size: 16 }), E("channel.export", "Export")]
271
273
  })
272
- }), /* @__PURE__ */ C("button", {
274
+ }), g && /* @__PURE__ */ S("button", {
273
275
  type: "button",
274
276
  onClick: () => m("/channels/create"),
275
277
  className: "flex items-center gap-2 px-4 py-2 text-sm font-medium text-action-primary-text bg-action-primary-bg hover:bg-action-primary-bg-hover rounded-lg transition-colors",
276
- children: [/* @__PURE__ */ S(v, { size: 16 }), g("channel.createChannel", "Create Channel")]
278
+ children: [/* @__PURE__ */ x(v, { size: 16 }), E("channel.createChannel", "Create Channel")]
277
279
  })]
278
280
  })]
279
281
  }),
280
- /* @__PURE__ */ C("div", {
282
+ /* @__PURE__ */ S("div", {
281
283
  className: "flex flex-col gap-3 sm:flex-row sm:items-center",
282
284
  children: [
283
- /* @__PURE__ */ C("div", {
285
+ /* @__PURE__ */ S("div", {
284
286
  className: "relative flex-1",
285
- children: [/* @__PURE__ */ S(de, {
287
+ children: [/* @__PURE__ */ x(fe, {
286
288
  size: 16,
287
289
  className: "absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground"
288
- }), /* @__PURE__ */ S("input", {
289
- "aria-label": g("channel.searchChannels", "Search channels..."),
290
+ }), /* @__PURE__ */ x("input", {
291
+ "aria-label": E("channel.searchChannels", "Search channels..."),
290
292
  type: "text",
291
- placeholder: g("channel.searchChannels", "Search channels..."),
292
- value: H.search || "",
293
- onChange: (e) => U({ search: e.target.value }),
293
+ placeholder: E("channel.searchChannels", "Search channels..."),
294
+ value: V.search || "",
295
+ onChange: (e) => H({ search: e.target.value }),
294
296
  className: "w-full pl-9 pr-4 py-2 text-sm bg-surface border border-border rounded-lg focus:outline-none focus:ring-2 focus:ring-action-primary-bg"
295
297
  })]
296
298
  }),
297
- /* @__PURE__ */ C("select", {
298
- value: H.platform || "",
299
- onChange: (e) => U({ platform: e.target.value || void 0 }),
299
+ /* @__PURE__ */ S("select", {
300
+ value: V.platform || "",
301
+ onChange: (e) => H({ platform: e.target.value || void 0 }),
300
302
  className: "px-3 py-2 text-sm bg-bg-surface text-text-primary border border-border rounded-lg focus:outline-none focus:ring-2 focus:ring-action-primary-bg",
301
- children: [/* @__PURE__ */ S("option", {
303
+ children: [/* @__PURE__ */ x("option", {
302
304
  value: "",
303
- children: g("channel.allPlatforms", "All Platforms")
304
- }), Object.entries(w).map(([e, t]) => /* @__PURE__ */ S("option", {
305
+ children: E("channel.allPlatforms", "All Platforms")
306
+ }), Object.entries(C).map(([e, t]) => /* @__PURE__ */ x("option", {
305
307
  value: e,
306
308
  children: t.label
307
309
  }, e))]
308
310
  }),
309
- /* @__PURE__ */ C("select", {
310
- value: H.status || "",
311
- onChange: (e) => U({ status: e.target.value || void 0 }),
311
+ /* @__PURE__ */ S("select", {
312
+ value: V.status || "",
313
+ onChange: (e) => H({ status: e.target.value || void 0 }),
312
314
  className: "px-3 py-2 text-sm bg-bg-surface text-text-primary border border-border rounded-lg focus:outline-none focus:ring-2 focus:ring-action-primary-bg",
313
- children: [/* @__PURE__ */ S("option", {
315
+ children: [/* @__PURE__ */ x("option", {
314
316
  value: "",
315
- children: g("channel.allStatus", "All Status")
316
- }), Object.entries(T).map(([e, t]) => /* @__PURE__ */ S("option", {
317
+ children: E("channel.allStatus", "All Status")
318
+ }), Object.entries(w).map(([e, t]) => /* @__PURE__ */ x("option", {
317
319
  value: e,
318
320
  children: t.label
319
321
  }, e))]
320
322
  })
321
323
  ]
322
324
  }),
323
- P && /* @__PURE__ */ C("div", {
325
+ P && /* @__PURE__ */ S("div", {
324
326
  className: "flex items-center gap-3 p-4 bg-status-error-bg-subtle border border-status-error-border rounded-lg",
325
- children: [/* @__PURE__ */ S(p, {
327
+ children: [/* @__PURE__ */ x(p, {
326
328
  size: 20,
327
329
  className: "text-status-error-text"
328
- }), /* @__PURE__ */ S("p", {
330
+ }), /* @__PURE__ */ x("p", {
329
331
  className: "text-sm text-status-error-text flex-1",
330
332
  children: P
331
333
  })]
332
334
  }),
333
- R.length > 0 && /* @__PURE__ */ C("div", {
335
+ R.length > 0 && /* @__PURE__ */ S("div", {
334
336
  className: "flex flex-col gap-3 rounded-lg border border-border bg-surface p-4 sm:flex-row sm:items-center sm:justify-between",
335
- children: [/* @__PURE__ */ C("label", {
337
+ "data-tour": "channels-list-bulk-actions",
338
+ children: [/* @__PURE__ */ S("label", {
336
339
  className: "flex items-center gap-2 text-sm text-foreground",
337
- children: [/* @__PURE__ */ S("input", {
340
+ children: [/* @__PURE__ */ x("input", {
338
341
  type: "checkbox",
339
342
  checked: $,
340
343
  ref: (e) => {
341
- e && (e.indeterminate = Se && !$);
344
+ e && (e.indeterminate = Ee && !$);
342
345
  },
343
- onChange: (e) => we(e.target.checked),
346
+ onChange: (e) => Oe(e.target.checked),
344
347
  "aria-label": "Select all channels",
345
348
  className: "size-4 rounded border-border text-primary"
346
- }), /* @__PURE__ */ S("span", { children: g("channel.selectAllVisible", "Select all visible") })]
347
- }), /* @__PURE__ */ C("div", {
349
+ }), /* @__PURE__ */ x("span", { children: E("channel.selectAllVisible", "Select all visible") })]
350
+ }), /* @__PURE__ */ S("div", {
348
351
  className: "flex flex-wrap items-center gap-2",
349
352
  children: [
350
- /* @__PURE__ */ C("span", {
353
+ /* @__PURE__ */ S("span", {
351
354
  className: "text-sm text-muted-foreground",
352
355
  children: [
353
356
  k.size,
354
357
  " ",
355
- g("channel.selectedCountLabel", "selected")
358
+ E("channel.selectedCountLabel", "selected")
356
359
  ]
357
360
  }),
358
- k.size > 0 && /* @__PURE__ */ S("button", {
361
+ k.size > 0 && /* @__PURE__ */ x("button", {
359
362
  type: "button",
360
363
  onClick: () => A(/* @__PURE__ */ new Set()),
361
364
  className: "text-sm text-muted-foreground hover:text-foreground",
362
- children: g("channel.clearSelection", "Clear selection")
365
+ children: E("channel.clearSelection", "Clear selection")
363
366
  }),
364
- /* @__PURE__ */ S(s, {
367
+ /* @__PURE__ */ x(s, {
365
368
  permission: c.CHANNEL_EXECUTE,
366
- children: /* @__PURE__ */ C("button", {
369
+ children: /* @__PURE__ */ S("button", {
367
370
  type: "button",
368
- onClick: Oe,
371
+ onClick: Me,
369
372
  disabled: X.length === 0 || j !== null,
370
373
  className: "px-3 py-2 text-sm font-medium border border-border rounded-md hover:bg-muted transition-colors disabled:opacity-50",
371
- children: [g("channel.healthCheck", "Health Check"), X.length > 0 ? ` (${X.length})` : ""]
374
+ children: [E("channel.healthCheck", "Health Check"), X.length > 0 ? ` (${X.length})` : ""]
372
375
  })
373
376
  }),
374
- /* @__PURE__ */ S(s, {
377
+ /* @__PURE__ */ x(s, {
375
378
  permission: c.CHANNEL_UPDATE,
376
- children: /* @__PURE__ */ C("button", {
379
+ children: /* @__PURE__ */ S("button", {
377
380
  type: "button",
378
- onClick: Ee,
381
+ onClick: Ae,
379
382
  disabled: Q.length === 0 || j !== null,
380
383
  className: "px-3 py-2 text-sm font-medium border border-status-success-border/30 text-status-success-text rounded-md hover:bg-status-success-bg-subtle transition-colors disabled:opacity-50",
381
- children: [g("channel.activateSelected", "Activate Selected"), Q.length > 0 ? ` (${Q.length})` : ""]
384
+ children: [E("channel.activateSelected", "Activate Selected"), Q.length > 0 ? ` (${Q.length})` : ""]
382
385
  })
383
386
  }),
384
- /* @__PURE__ */ S(s, {
387
+ /* @__PURE__ */ x(s, {
385
388
  permission: c.CHANNEL_UPDATE,
386
- children: /* @__PURE__ */ C("button", {
389
+ children: /* @__PURE__ */ S("button", {
387
390
  type: "button",
388
- onClick: De,
391
+ onClick: je,
389
392
  disabled: Z.length === 0 || j !== null,
390
393
  className: "px-3 py-2 text-sm font-medium border border-status-warning-border text-status-warning-text rounded-md hover:bg-status-warning-bg-subtle transition-colors disabled:opacity-50",
391
- children: [g("channel.deactivateSelected", "Deactivate Selected"), Z.length > 0 ? ` (${Z.length})` : ""]
394
+ children: [E("channel.deactivateSelected", "Deactivate Selected"), Z.length > 0 ? ` (${Z.length})` : ""]
392
395
  })
393
396
  }),
394
- /* @__PURE__ */ S(s, {
397
+ /* @__PURE__ */ x(s, {
395
398
  permission: c.CHANNEL_DELETE,
396
- children: /* @__PURE__ */ C("button", {
399
+ children: /* @__PURE__ */ S("button", {
397
400
  type: "button",
398
- onClick: Te,
401
+ onClick: ke,
399
402
  disabled: X.length === 0 || j !== null,
400
403
  className: "px-3 py-2 text-sm font-medium border border-status-error-border/30 text-status-error-text rounded-md hover:bg-status-error-bg-subtle transition-colors disabled:opacity-50",
401
- children: [g("channel.deleteSelected", "Delete Selected"), X.length > 0 ? ` (${X.length})` : ""]
404
+ children: [E("channel.deleteSelected", "Delete Selected"), X.length > 0 ? ` (${X.length})` : ""]
402
405
  })
403
406
  })
404
407
  ]
405
408
  })]
406
409
  }),
407
- B && /* @__PURE__ */ C("div", {
410
+ z && /* @__PURE__ */ S("div", {
408
411
  className: "flex items-center gap-3 p-4 bg-status-error-bg-subtle border border-status-error-border rounded-lg",
409
412
  children: [
410
- /* @__PURE__ */ S(p, {
413
+ /* @__PURE__ */ x(p, {
411
414
  size: 20,
412
415
  className: "text-status-error-text"
413
416
  }),
414
- /* @__PURE__ */ C("div", { children: [/* @__PURE__ */ S("p", {
417
+ /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
415
418
  className: "text-sm font-medium text-status-error-text",
416
- children: g("channel.loadFailed", "Failed to load channels")
417
- }), /* @__PURE__ */ S("p", {
419
+ children: E("channel.loadFailed", "Failed to load channels")
420
+ }), /* @__PURE__ */ x("p", {
418
421
  className: "text-xs text-status-error-text",
419
- children: B
422
+ children: z
420
423
  })] }),
421
- /* @__PURE__ */ S("button", {
424
+ /* @__PURE__ */ x("button", {
422
425
  type: "button",
423
- onClick: () => J(),
426
+ onClick: () => q(),
424
427
  className: "ml-auto px-3 py-1 text-sm text-status-error-text hover:bg-status-error-bg-subtle rounded transition-colors",
425
- children: g("channel.retry", "Retry")
428
+ children: E("channel.retry", "Retry")
426
429
  })
427
430
  ]
428
431
  }),
429
- z && R.length === 0 && /* @__PURE__ */ S("div", {
432
+ Se && R.length === 0 && /* @__PURE__ */ x("div", {
430
433
  className: "flex items-center justify-center py-12",
431
- children: /* @__PURE__ */ S(_, {
434
+ children: /* @__PURE__ */ x(_, {
432
435
  size: 32,
433
436
  className: "animate-spin text-accent-primary"
434
437
  })
435
438
  }),
436
- !z && !B && R.length === 0 && /* @__PURE__ */ C("div", {
439
+ !Se && !z && R.length === 0 && /* @__PURE__ */ S("div", {
437
440
  className: "flex flex-col items-center justify-center py-12 text-center",
438
441
  children: [
439
- /* @__PURE__ */ S(b, {
442
+ /* @__PURE__ */ x(ue, {
440
443
  size: 48,
441
444
  className: "text-muted-foreground mb-4"
442
445
  }),
443
- /* @__PURE__ */ S("h3", {
446
+ /* @__PURE__ */ x("h3", {
444
447
  className: "text-lg font-semibold text-foreground mb-2",
445
- children: g("channel.noChannelsFound", "No channels found")
448
+ children: E("channel.noChannelsFound", "No channels found")
446
449
  }),
447
- /* @__PURE__ */ S("p", {
450
+ /* @__PURE__ */ x("p", {
448
451
  className: "text-sm text-muted-foreground max-w-md mb-4",
449
- children: H.search || H.platform || H.status ? g("channel.adjustFilters", "Try adjusting your filters to see more channels.") : g("channel.createFirstChannelPrompt", "Create your first communication channel to get started.")
452
+ children: V.search || V.platform || V.status ? E("channel.adjustFilters", "Try adjusting your filters to see more channels.") : E("channel.createFirstChannelPrompt", "Create your first communication channel to get started.")
450
453
  }),
451
- !H.search && !H.platform && !H.status && /* @__PURE__ */ C("button", {
454
+ g && !V.search && !V.platform && !V.status && /* @__PURE__ */ S("button", {
452
455
  type: "button",
453
456
  onClick: () => m("/channels/create"),
454
457
  className: "flex items-center gap-2 px-4 py-2 text-sm font-medium text-action-primary-text bg-action-primary-bg hover:bg-action-primary-bg-hover rounded-lg transition-colors",
455
- children: [/* @__PURE__ */ S(v, { size: 16 }), g("channel.createChannel", "Create Channel")]
458
+ children: [/* @__PURE__ */ x(v, { size: 16 }), E("channel.createChannel", "Create Channel")]
456
459
  })
457
460
  ]
458
461
  }),
459
- R.length > 0 && /* @__PURE__ */ S("div", {
462
+ R.length > 0 && /* @__PURE__ */ x("div", {
460
463
  className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-3",
464
+ "data-tour": "channels-list-grid",
461
465
  children: R.map((e) => {
462
- let t = ke(e.platform), n = Ae(e.status), r = je(e.connectionHealth), i = n.icon, a = r.icon, o = he === e.id;
463
- return /* @__PURE__ */ C("div", {
466
+ let t = Ne(e.platform), n = Pe(e.status), r = Fe(e.connectionHealth), i = n.icon, a = r.icon, o = ye === e.id;
467
+ return /* @__PURE__ */ S("div", {
464
468
  className: `p-4 bg-surface border rounded-lg transition-colors group ${k.has(e.id) ? "ring-2 ring-action-primary-bg border-action-primary-bg/40" : "border-border hover:border-action-primary-bg/40"}`,
465
469
  children: [
466
- /* @__PURE__ */ C("div", {
470
+ /* @__PURE__ */ S("div", {
467
471
  className: "flex items-start justify-between mb-3",
468
- children: [/* @__PURE__ */ C("div", {
472
+ children: [/* @__PURE__ */ S("div", {
469
473
  className: "flex items-center gap-2",
470
474
  children: [
471
- /* @__PURE__ */ S("input", {
475
+ /* @__PURE__ */ x("input", {
472
476
  type: "checkbox",
473
477
  checked: k.has(e.id),
474
- onChange: (t) => Ce(e.id, t.target.checked),
478
+ onChange: (t) => De(e.id, t.target.checked),
475
479
  "aria-label": `Select channel ${e.name}`,
476
480
  className: "size-4 rounded border-border text-primary"
477
481
  }),
478
- /* @__PURE__ */ S(b, {
482
+ /* @__PURE__ */ x(ue, {
479
483
  size: 20,
480
484
  className: "text-accent-primary"
481
485
  }),
482
- /* @__PURE__ */ S("span", {
486
+ /* @__PURE__ */ x("span", {
483
487
  className: `px-2 py-0.5 text-xs font-semibold rounded-full ${t.color}`,
484
488
  children: t.label
485
489
  })
486
490
  ]
487
- }), /* @__PURE__ */ C("div", {
491
+ }), /* @__PURE__ */ S("div", {
488
492
  className: "flex items-center gap-1",
489
- children: [/* @__PURE__ */ S(i, {
493
+ children: [/* @__PURE__ */ x(i, {
490
494
  size: 14,
491
495
  className: n.color.split(" ")[0]
492
- }), /* @__PURE__ */ S("span", {
496
+ }), /* @__PURE__ */ x("span", {
493
497
  className: `px-2 py-0.5 text-xs font-medium rounded-full ${n.color}`,
494
498
  children: n.label
495
499
  })]
496
500
  })]
497
501
  }),
498
- /* @__PURE__ */ C("div", {
502
+ /* @__PURE__ */ S("div", {
499
503
  role: "button",
500
504
  tabIndex: 0,
501
505
  onClick: () => m(`/channels/${e.id}`),
@@ -504,134 +508,134 @@ function D() {
504
508
  },
505
509
  className: "cursor-pointer",
506
510
  children: [
507
- /* @__PURE__ */ S("h3", {
511
+ /* @__PURE__ */ x("h3", {
508
512
  className: "text-sm font-semibold text-foreground mb-1 truncate",
509
513
  children: e.name
510
514
  }),
511
- e.description && /* @__PURE__ */ S("p", {
515
+ e.description && /* @__PURE__ */ x("p", {
512
516
  className: "text-xs text-muted-foreground mb-2 line-clamp-2",
513
517
  children: e.description
514
518
  }),
515
- e.adapterType && /* @__PURE__ */ S("p", {
519
+ e.adapterType && /* @__PURE__ */ x("p", {
516
520
  className: "text-xs text-muted-foreground mb-2 font-mono",
517
521
  children: e.adapterType.replace(/_/g, " ")
518
522
  }),
519
- /* @__PURE__ */ S("div", {
523
+ /* @__PURE__ */ x("div", {
520
524
  className: "flex items-center gap-3 text-xs text-muted-foreground mb-2",
521
- children: /* @__PURE__ */ C("span", { children: [
522
- g("channel.priority", "Priority"),
525
+ children: /* @__PURE__ */ S("span", { children: [
526
+ E("channel.priority", "Priority"),
523
527
  ": ",
524
528
  e.priority
525
529
  ] })
526
530
  }),
527
- /* @__PURE__ */ C("div", {
531
+ /* @__PURE__ */ S("div", {
528
532
  className: "flex items-center gap-3 text-xs",
529
533
  children: [
530
- /* @__PURE__ */ C("div", {
534
+ /* @__PURE__ */ S("div", {
531
535
  className: "flex items-center gap-1",
532
- children: [/* @__PURE__ */ S(a, {
536
+ children: [/* @__PURE__ */ x(a, {
533
537
  size: 12,
534
538
  className: r.color
535
- }), /* @__PURE__ */ S("span", {
539
+ }), /* @__PURE__ */ x("span", {
536
540
  className: r.color,
537
541
  children: r.label
538
542
  })]
539
543
  }),
540
- /* @__PURE__ */ S("span", { children: "•" }),
541
- /* @__PURE__ */ S("span", {
544
+ /* @__PURE__ */ x("span", { children: "•" }),
545
+ /* @__PURE__ */ x("span", {
542
546
  className: e.isConnected ? "text-status-success-text" : "text-muted-foreground",
543
- children: e.isConnected ? g("channel.connected", "Connected") : g("channel.notConnected", "Not Connected")
547
+ children: e.isConnected ? E("channel.connected", "Connected") : E("channel.notConnected", "Not Connected")
544
548
  })
545
549
  ]
546
550
  })
547
551
  ]
548
552
  }),
549
- e.tagAssignments && e.tagAssignments.length > 0 && /* @__PURE__ */ C("div", {
553
+ e.tagAssignments && e.tagAssignments.length > 0 && /* @__PURE__ */ S("div", {
550
554
  className: "flex flex-wrap gap-1 mt-2",
551
555
  "aria-label": "Channel tags",
552
- children: [e.tagAssignments.slice(0, 4).map((e) => /* @__PURE__ */ S(me, {
556
+ children: [e.tagAssignments.slice(0, 4).map((e) => /* @__PURE__ */ x(ge, {
553
557
  id: e.tagId,
554
558
  label: e.tagId,
555
559
  size: "sm"
556
- }, e.id)), e.tagAssignments.length > 4 && /* @__PURE__ */ C("span", {
560
+ }, e.id)), e.tagAssignments.length > 4 && /* @__PURE__ */ S("span", {
557
561
  className: "text-xs text-muted-foreground",
558
562
  children: ["+", e.tagAssignments.length - 4]
559
563
  })]
560
564
  }),
561
- /* @__PURE__ */ C("div", {
565
+ /* @__PURE__ */ S("div", {
562
566
  className: "mt-3 pt-3 border-t border-border flex items-center justify-between opacity-0 group-hover:opacity-100 transition-opacity",
563
- children: [/* @__PURE__ */ C("div", {
567
+ children: [/* @__PURE__ */ S("div", {
564
568
  className: "flex items-center gap-1",
565
569
  children: [
566
- /* @__PURE__ */ S("button", {
570
+ /* @__PURE__ */ x("button", {
567
571
  type: "button",
568
572
  onClick: () => m(`/channels/${e.id}`),
569
573
  className: "p-1.5 text-muted-foreground hover:text-accent-primary hover:bg-accent-primary/10 rounded transition-colors cursor-pointer",
570
- title: g("channel.viewDetails", "View Details"),
571
- children: /* @__PURE__ */ S(se, { size: 14 })
574
+ title: E("channel.viewDetails", "View Details"),
575
+ children: /* @__PURE__ */ x(se, { size: 14 })
572
576
  }),
573
- /* @__PURE__ */ S("button", {
577
+ b && /* @__PURE__ */ x("button", {
574
578
  type: "button",
575
579
  onClick: () => m(`/channels/${e.id}/edit`),
576
580
  className: "p-1.5 text-muted-foreground hover:text-accent-primary hover:bg-accent-primary/10 rounded transition-colors cursor-pointer",
577
- title: g("channel.editChannel", "Edit Channel"),
578
- children: /* @__PURE__ */ S(ce, { size: 14 })
581
+ title: E("channel.editChannel", "Edit Channel"),
582
+ children: /* @__PURE__ */ x(ce, { size: 14 })
579
583
  }),
580
- /* @__PURE__ */ S(s, {
584
+ /* @__PURE__ */ x(s, {
581
585
  permission: c.CHANNEL_EXECUTE,
582
- children: /* @__PURE__ */ S("button", {
586
+ children: /* @__PURE__ */ x("button", {
583
587
  type: "button",
584
- onClick: () => xe(e.id),
588
+ onClick: () => Te(e.id),
585
589
  disabled: o,
586
590
  className: "p-1.5 text-muted-foreground hover:text-status-info-text hover:bg-status-info-bg-subtle rounded transition-colors disabled:opacity-50 cursor-pointer disabled:cursor-not-allowed",
587
- title: g("channel.runHealthCheck", "Run Health Check"),
588
- children: o ? /* @__PURE__ */ S(_, {
591
+ title: E("channel.runHealthCheck", "Run Health Check"),
592
+ children: o ? /* @__PURE__ */ x(_, {
589
593
  size: 14,
590
594
  className: "animate-spin"
591
- }) : /* @__PURE__ */ S(ue, { size: 14 })
595
+ }) : /* @__PURE__ */ x(de, { size: 14 })
592
596
  })
593
597
  }),
594
- /* @__PURE__ */ S(s, {
598
+ /* @__PURE__ */ x(s, {
595
599
  permission: c.CHANNEL_UPDATE,
596
- children: /* @__PURE__ */ S("button", {
600
+ children: /* @__PURE__ */ x("button", {
597
601
  type: "button",
598
- onClick: () => be(e),
602
+ onClick: () => we(e),
599
603
  disabled: o,
600
604
  className: `p-1.5 rounded transition-colors disabled:opacity-50 cursor-pointer disabled:cursor-not-allowed ${e.status === "ACTIVE" ? "text-muted-foreground hover:text-status-warning-text hover:bg-status-warning-bg-subtle" : "text-muted-foreground hover:text-status-success-text hover:bg-status-success-bg-subtle"}`,
601
- title: e.status === "ACTIVE" ? g("channel.deactivate", "Deactivate") : g("channel.activate", "Activate"),
602
- children: e.status === "ACTIVE" ? /* @__PURE__ */ S(y, { size: 14 }) : /* @__PURE__ */ S(le, { size: 14 })
605
+ title: e.status === "ACTIVE" ? E("channel.deactivate", "Deactivate") : E("channel.activate", "Activate"),
606
+ children: e.status === "ACTIVE" ? /* @__PURE__ */ x(y, { size: 14 }) : /* @__PURE__ */ x(le, { size: 14 })
603
607
  })
604
608
  })
605
609
  ]
606
- }), x === e.id ? /* @__PURE__ */ C("div", {
610
+ }), ve === e.id ? /* @__PURE__ */ S("div", {
607
611
  className: "flex items-center gap-2",
608
612
  children: [
609
- /* @__PURE__ */ S("span", {
613
+ /* @__PURE__ */ x("span", {
610
614
  className: "text-xs text-muted-foreground",
611
- children: g("channel.deleteQuestion", "Delete?")
615
+ children: E("channel.deleteQuestion", "Delete?")
612
616
  }),
613
- /* @__PURE__ */ S("button", {
617
+ /* @__PURE__ */ x("button", {
614
618
  type: "button",
615
- onClick: () => ye(e.id),
619
+ onClick: () => Ce(e.id),
616
620
  disabled: o,
617
621
  className: "px-2 py-1 text-xs text-status-error-text hover:bg-status-error-bg-subtle rounded transition-colors cursor-pointer disabled:cursor-not-allowed",
618
- children: o ? "..." : g("channel.yes", "Yes")
622
+ children: o ? "..." : E("channel.yes", "Yes")
619
623
  }),
620
- /* @__PURE__ */ S("button", {
624
+ /* @__PURE__ */ x("button", {
621
625
  type: "button",
622
626
  onClick: () => D(null),
623
627
  className: "px-2 py-1 text-xs text-muted-foreground hover:bg-muted rounded transition-colors cursor-pointer",
624
- children: g("channel.no", "No")
628
+ children: E("channel.no", "No")
625
629
  })
626
630
  ]
627
- }) : /* @__PURE__ */ S(s, {
631
+ }) : /* @__PURE__ */ x(s, {
628
632
  permission: c.CHANNEL_DELETE,
629
- children: /* @__PURE__ */ S("button", {
633
+ children: /* @__PURE__ */ x("button", {
630
634
  type: "button",
631
635
  onClick: () => D(e.id),
632
636
  className: "p-1.5 text-muted-foreground hover:text-status-error-text hover:bg-status-error-bg-subtle rounded transition-colors cursor-pointer",
633
- title: g("channel.deleteChannel", "Delete Channel"),
634
- children: /* @__PURE__ */ S(fe, { size: 14 })
637
+ title: E("channel.deleteChannel", "Delete Channel"),
638
+ children: /* @__PURE__ */ x(pe, { size: 14 })
635
639
  })
636
640
  })]
637
641
  })
@@ -639,55 +643,55 @@ function D() {
639
643
  }, e.id);
640
644
  })
641
645
  }),
642
- V > F && /* @__PURE__ */ C("div", {
646
+ B > F && /* @__PURE__ */ S("div", {
643
647
  className: "flex items-center justify-between px-1 py-2",
644
- children: [/* @__PURE__ */ C("p", {
648
+ children: [/* @__PURE__ */ S("p", {
645
649
  className: "text-sm text-muted-foreground",
646
650
  children: [
647
- g("channel.showing", "Showing"),
651
+ E("channel.showing", "Showing"),
648
652
  " ",
649
- /* @__PURE__ */ C("span", {
653
+ /* @__PURE__ */ S("span", {
650
654
  className: "font-medium text-foreground",
651
655
  children: [
652
656
  I * F + 1,
653
657
  "–",
654
- Math.min((I + 1) * F, V)
658
+ Math.min((I + 1) * F, B)
655
659
  ]
656
660
  }),
657
661
  " ",
658
- g("channel.of", "of"),
662
+ E("channel.of", "of"),
659
663
  " ",
660
- /* @__PURE__ */ S("span", {
664
+ /* @__PURE__ */ x("span", {
661
665
  className: "font-medium text-foreground",
662
- children: V
666
+ children: B
663
667
  }),
664
668
  " ",
665
- g("channel.channelsLower", "channels")
669
+ E("channel.channelsLower", "channels")
666
670
  ]
667
- }), /* @__PURE__ */ C("div", {
671
+ }), /* @__PURE__ */ S("div", {
668
672
  className: "flex items-center gap-2",
669
673
  children: [
670
- /* @__PURE__ */ S("button", {
674
+ /* @__PURE__ */ x("button", {
671
675
  type: "button",
672
676
  onClick: () => L((e) => Math.max(0, e - 1)),
673
677
  disabled: I === 0,
674
678
  className: "px-3 py-1.5 text-sm border border-border rounded-lg hover:bg-muted transition-colors disabled:opacity-40 disabled:cursor-not-allowed",
675
- children: g("channel.previous", "Previous")
679
+ children: E("channel.previous", "Previous")
676
680
  }),
677
- /* @__PURE__ */ C("span", {
681
+ /* @__PURE__ */ S("span", {
678
682
  className: "text-sm text-muted-foreground",
679
683
  children: [
680
684
  I + 1,
681
685
  " / ",
682
- Y
686
+ J
683
687
  ]
684
688
  }),
685
- /* @__PURE__ */ S("button", {
689
+ /* @__PURE__ */ x("button", {
686
690
  type: "button",
687
- onClick: () => L((e) => Math.min(Y - 1, e + 1)),
688
- disabled: I >= Y - 1,
691
+ onClick: () => L((e) => Math.min(J - 1, e + 1)),
692
+ disabled: I >= J - 1,
689
693
  className: "px-3 py-1.5 text-sm border border-border rounded-lg hover:bg-muted transition-colors disabled:opacity-40 disabled:cursor-not-allowed",
690
- children: g("channel.next", "Next")
694
+ children: E("channel.next", "Next")
691
695
  })
692
696
  ]
693
697
  })]
@@ -697,6 +701,6 @@ function D() {
697
701
  });
698
702
  }
699
703
  //#endregion
700
- export { D as ChannelsListPage };
704
+ export { _e as ChannelsListPage };
701
705
 
702
706
  //# sourceMappingURL=ChannelsListPage.js.map