powr-sdk-web 5.6.12 → 5.6.14

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.
@@ -70,6 +70,7 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
70
70
  formName: '',
71
71
  formId: '',
72
72
  description: '',
73
+ imageUrl: '',
73
74
  fields: []
74
75
  }),
75
76
  _useState16 = _slicedToArray(_useState15, 2),
@@ -84,6 +85,7 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
84
85
  formName: '',
85
86
  formId: '',
86
87
  description: '',
88
+ imageUrl: '',
87
89
  fields: []
88
90
  }),
89
91
  _useState20 = _slicedToArray(_useState19, 2),
@@ -306,6 +308,7 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
306
308
  formName: '',
307
309
  formId: '',
308
310
  description: '',
311
+ imageUrl: '',
309
312
  fields: []
310
313
  });
311
314
  };
@@ -315,6 +318,7 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
315
318
  formName: form.formName || '',
316
319
  formId: form.formId || '',
317
320
  description: form.description || '',
321
+ imageUrl: form.imageUrl || '',
318
322
  fields: (form.fields || []).map(function (field, index) {
319
323
  return _objectSpread({
320
324
  id: "".concat(field.name || 'field', "-").concat(index),
@@ -529,6 +533,7 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
529
533
  formName: validation.trimmedName,
530
534
  formId: validation.trimmedId,
531
535
  description: formDraft.description.trim(),
536
+ imageUrl: formDraft.imageUrl.trim(),
532
537
  fields: validation.normalizedFields
533
538
  };
534
539
  _context4.n = 4;
@@ -601,6 +606,7 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
601
606
  formTitle: validation.trimmedTitle,
602
607
  formId: validation.trimmedId,
603
608
  description: editDraft.description.trim(),
609
+ imageUrl: editDraft.imageUrl.trim(),
604
610
  fields: validation.normalizedFields
605
611
  };
606
612
  _context5.n = 4;
@@ -949,7 +955,25 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
949
955
  placeholder: "Instructions or context shown at the top of the public form",
950
956
  rows: 3,
951
957
  className: "w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
952
- })), renderFieldBuilder(formDraft, {
958
+ })), /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("label", {
959
+ htmlFor: "formImageUrl",
960
+ className: "block text-sm font-medium text-gray-700 mb-1"
961
+ }, "Banner / share image URL (optional)"), /*#__PURE__*/_react["default"].createElement("input", {
962
+ id: "formImageUrl",
963
+ type: "url",
964
+ value: formDraft.imageUrl,
965
+ onChange: function onChange(e) {
966
+ return setFormDraft(function (prev) {
967
+ return _objectSpread(_objectSpread({}, prev), {}, {
968
+ imageUrl: e.target.value
969
+ });
970
+ });
971
+ },
972
+ placeholder: "https://www.excelrs.dev/bannar1.jpg",
973
+ className: "w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
974
+ }), /*#__PURE__*/_react["default"].createElement("p", {
975
+ className: "text-xs text-gray-500 mt-1"
976
+ }, "Used for the form banner and link previews (Open Graph / Twitter).")), renderFieldBuilder(formDraft, {
953
977
  addFieldFn: addField,
954
978
  updateFieldFn: updateField,
955
979
  removeFieldFn: removeField
@@ -1047,7 +1071,13 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
1047
1071
  className: "font-medium text-gray-700"
1048
1072
  }, "Description:"), /*#__PURE__*/_react["default"].createElement("p", {
1049
1073
  className: "text-gray-900 whitespace-pre-wrap"
1050
- }, selectedForm.description))), /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("p", {
1074
+ }, selectedForm.description)), selectedForm.imageUrl && /*#__PURE__*/_react["default"].createElement("div", {
1075
+ className: "md:col-span-2"
1076
+ }, /*#__PURE__*/_react["default"].createElement("p", {
1077
+ className: "font-medium text-gray-700"
1078
+ }, "Banner / share image:"), /*#__PURE__*/_react["default"].createElement("p", {
1079
+ className: "text-gray-900 break-all"
1080
+ }, selectedForm.imageUrl))), /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("p", {
1051
1081
  className: "font-medium text-gray-700 mb-2"
1052
1082
  }, "Form Fields:"), /*#__PURE__*/_react["default"].createElement("div", {
1053
1083
  className: "bg-gray-50 p-4 rounded-lg"
@@ -1201,7 +1231,25 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
1201
1231
  placeholder: "Instructions or context shown at the top of the public form",
1202
1232
  rows: 3,
1203
1233
  className: "w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
1204
- })), renderFieldBuilder(editDraft, {
1234
+ })), /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("label", {
1235
+ htmlFor: "editFormImageUrl",
1236
+ className: "block text-sm font-medium text-gray-700 mb-1"
1237
+ }, "Banner / share image URL (optional)"), /*#__PURE__*/_react["default"].createElement("input", {
1238
+ id: "editFormImageUrl",
1239
+ type: "url",
1240
+ value: editDraft.imageUrl,
1241
+ onChange: function onChange(e) {
1242
+ return setEditDraft(function (prev) {
1243
+ return _objectSpread(_objectSpread({}, prev), {}, {
1244
+ imageUrl: e.target.value
1245
+ });
1246
+ });
1247
+ },
1248
+ placeholder: "https://www.excelrs.dev/bannar1.jpg",
1249
+ className: "w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
1250
+ }), /*#__PURE__*/_react["default"].createElement("p", {
1251
+ className: "text-xs text-gray-500 mt-1"
1252
+ }, "Used for the form banner and link previews (Open Graph / Twitter).")), renderFieldBuilder(editDraft, {
1205
1253
  addFieldFn: addEditField,
1206
1254
  updateFieldFn: updateEditField,
1207
1255
  removeFieldFn: removeEditField
@@ -7,7 +7,12 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports["default"] = void 0;
8
8
  var _react = _interopRequireWildcard(require("react"));
9
9
  var _auth = require("../utils/auth");
10
- function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t2 in e) "default" !== _t2 && {}.hasOwnProperty.call(e, _t2) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t2)) && (i.get || i.set) ? o(f, _t2, i) : f[_t2] = e[_t2]); return f; })(e, t); }
10
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t3 in e) "default" !== _t3 && {}.hasOwnProperty.call(e, _t3) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t3)) && (i.get || i.set) ? o(f, _t3, i) : f[_t3] = e[_t3]); return f; })(e, t); }
11
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
12
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
13
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
14
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
15
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
11
16
  function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
12
17
  function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
13
18
  function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
@@ -18,17 +23,36 @@ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r)
18
23
  function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
19
24
  function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
20
25
  function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
26
+ var ROLE_OPTIONS = [{
27
+ value: 1,
28
+ label: 'Student'
29
+ }, {
30
+ value: 300,
31
+ label: 'College admin'
32
+ }, {
33
+ value: 900,
34
+ label: 'Client'
35
+ }, {
36
+ value: 100,
37
+ label: 'Admin'
38
+ }];
39
+ var normalizeAccess = function normalizeAccess(access) {
40
+ if (access === 100 || access === 300 || access === 900) return access;
41
+ return 1;
42
+ };
21
43
  var PowrBaseUsersAdmin = function PowrBaseUsersAdmin(_ref) {
22
44
  var apiUrl = _ref.apiUrl,
23
45
  projectId = _ref.projectId,
24
46
  _ref$theme = _ref.theme,
25
- theme = _ref$theme === void 0 ? "blue" : _ref$theme,
47
+ theme = _ref$theme === void 0 ? 'blue' : _ref$theme,
26
48
  _ref$onUserClick = _ref.onUserClick,
27
49
  onUserClick = _ref$onUserClick === void 0 ? null : _ref$onUserClick,
28
50
  _ref$showActions = _ref.showActions,
29
51
  showActions = _ref$showActions === void 0 ? true : _ref$showActions,
30
52
  _ref$onAddUser = _ref.onAddUser,
31
- onAddUser = _ref$onAddUser === void 0 ? null : _ref$onAddUser;
53
+ onAddUser = _ref$onAddUser === void 0 ? null : _ref$onAddUser,
54
+ _ref$onRoleChange = _ref.onRoleChange,
55
+ onRoleChange = _ref$onRoleChange === void 0 ? null : _ref$onRoleChange;
32
56
  var _useState = (0, _react.useState)([]),
33
57
  _useState2 = _slicedToArray(_useState, 2),
34
58
  users = _useState2[0],
@@ -41,9 +65,23 @@ var PowrBaseUsersAdmin = function PowrBaseUsersAdmin(_ref) {
41
65
  _useState6 = _slicedToArray(_useState5, 2),
42
66
  error = _useState6[0],
43
67
  setError = _useState6[1];
68
+ var _useState7 = (0, _react.useState)(''),
69
+ _useState8 = _slicedToArray(_useState7, 2),
70
+ feedback = _useState8[0],
71
+ setFeedback = _useState8[1];
72
+ var _useState9 = (0, _react.useState)(null),
73
+ _useState0 = _slicedToArray(_useState9, 2),
74
+ updatingUserId = _useState0[0],
75
+ setUpdatingUserId = _useState0[1];
44
76
  (0, _react.useEffect)(function () {
45
77
  fetchUsers();
46
78
  }, [projectId]);
79
+ var getUserId = function getUserId(user) {
80
+ if (!user) return null;
81
+ if (user.userId) return String(user.userId);
82
+ if (user._id) return String(user._id);
83
+ return null;
84
+ };
47
85
  var fetchUsers = /*#__PURE__*/function () {
48
86
  var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
49
87
  var _yield$apiCall, data, ok, _t;
@@ -52,6 +90,7 @@ var PowrBaseUsersAdmin = function PowrBaseUsersAdmin(_ref) {
52
90
  case 0:
53
91
  _context.p = 0;
54
92
  setLoading(true);
93
+ setError(null);
55
94
  _context.n = 1;
56
95
  return (0, _auth.apiCall)(apiUrl, "/profiles", projectId);
57
96
  case 1:
@@ -89,16 +128,97 @@ var PowrBaseUsersAdmin = function PowrBaseUsersAdmin(_ref) {
89
128
  };
90
129
  }();
91
130
  var getBadgeVariant = function getBadgeVariant(access) {
92
- if (access === 100) return "bg-red-100 text-red-800";
93
- if (access === 900) return "bg-blue-100 text-blue-800";
94
- return "bg-gray-100 text-gray-800";
131
+ if (access === 100) return 'bg-red-100 text-red-800';
132
+ if (access === 300) return 'bg-purple-100 text-purple-800';
133
+ if (access === 900) return 'bg-blue-100 text-blue-800';
134
+ return 'bg-gray-100 text-gray-800';
95
135
  };
96
136
  var getBadgeText = function getBadgeText(access) {
97
- if (access === 100) return "Admin";
98
- if (access === 900) return "Client";
99
- return "Employee";
137
+ var option = ROLE_OPTIONS.find(function (role) {
138
+ return role.value === normalizeAccess(access);
139
+ });
140
+ return (option === null || option === void 0 ? void 0 : option.label) || 'Student';
100
141
  };
142
+ var updateUserRole = /*#__PURE__*/function () {
143
+ var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(user, newAccess) {
144
+ var userId, _yield$apiCall2, data, ok, message, _message, _t2;
145
+ return _regenerator().w(function (_context2) {
146
+ while (1) switch (_context2.p = _context2.n) {
147
+ case 0:
148
+ userId = getUserId(user);
149
+ if (userId) {
150
+ _context2.n = 1;
151
+ break;
152
+ }
153
+ setFeedback('Could not resolve user id');
154
+ return _context2.a(2);
155
+ case 1:
156
+ if (!(normalizeAccess(user.access) === newAccess)) {
157
+ _context2.n = 2;
158
+ break;
159
+ }
160
+ return _context2.a(2);
161
+ case 2:
162
+ setUpdatingUserId(userId);
163
+ setFeedback('');
164
+ _context2.p = 3;
165
+ _context2.n = 4;
166
+ return (0, _auth.apiCall)(apiUrl, "/users/".concat(userId), projectId, {
167
+ method: 'PUT',
168
+ body: {
169
+ access: newAccess
170
+ }
171
+ });
172
+ case 4:
173
+ _yield$apiCall2 = _context2.v;
174
+ data = _yield$apiCall2.data;
175
+ ok = _yield$apiCall2.ok;
176
+ if (ok) {
177
+ _context2.n = 5;
178
+ break;
179
+ }
180
+ throw new Error(data.message || 'Failed to update role');
181
+ case 5:
182
+ setUsers(function (prev) {
183
+ return prev.map(function (item) {
184
+ return getUserId(item) === userId ? _objectSpread(_objectSpread({}, item), {}, {
185
+ access: newAccess
186
+ }) : item;
187
+ });
188
+ });
189
+ message = 'Role updated. User must log out and log back in.';
190
+ setFeedback(message);
191
+ if (onRoleChange) {
192
+ onRoleChange('success', message, user, newAccess);
193
+ }
194
+ _context2.n = 7;
195
+ break;
196
+ case 6:
197
+ _context2.p = 6;
198
+ _t2 = _context2.v;
199
+ _message = _t2.message || 'Failed to update role';
200
+ setFeedback(_message);
201
+ if (onRoleChange) {
202
+ onRoleChange('error', _message, user, newAccess);
203
+ }
204
+ case 7:
205
+ _context2.p = 7;
206
+ setUpdatingUserId(null);
207
+ setTimeout(function () {
208
+ return setFeedback('');
209
+ }, 4000);
210
+ return _context2.f(7);
211
+ case 8:
212
+ return _context2.a(2);
213
+ }
214
+ }, _callee2, null, [[3, 6, 7, 8]]);
215
+ }));
216
+ return function updateUserRole(_x, _x2) {
217
+ return _ref3.apply(this, arguments);
218
+ };
219
+ }();
101
220
  var formatDate = function formatDate(dateString) {
221
+ if (!dateString) return '—';
102
222
  return new Date(dateString).toLocaleDateString();
103
223
  };
104
224
  if (loading) {
@@ -119,12 +239,16 @@ var PowrBaseUsersAdmin = function PowrBaseUsersAdmin(_ref) {
119
239
  className: "bg-white rounded-lg shadow"
120
240
  }, /*#__PURE__*/_react["default"].createElement("div", {
121
241
  className: "px-6 py-4 border-b border-gray-200 flex justify-between items-center"
122
- }, /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("p", {
242
+ }, /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("h2", {
243
+ className: "text-lg font-semibold text-gray-900"
244
+ }, "Users"), /*#__PURE__*/_react["default"].createElement("p", {
123
245
  className: "mt-1 text-sm text-gray-500"
124
246
  }, users.length, " user", users.length !== 1 ? 's' : '', " found")), showActions && onAddUser && /*#__PURE__*/_react["default"].createElement("button", {
125
247
  onClick: onAddUser,
126
248
  className: "bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-md text-sm font-medium"
127
- }, "Add User")), /*#__PURE__*/_react["default"].createElement("div", {
249
+ }, "Add User")), feedback && /*#__PURE__*/_react["default"].createElement("div", {
250
+ className: "mx-6 mt-4 rounded-lg border border-blue-200 bg-blue-50 px-4 py-3 text-sm text-blue-800"
251
+ }, feedback), /*#__PURE__*/_react["default"].createElement("div", {
128
252
  className: "overflow-x-auto"
129
253
  }, /*#__PURE__*/_react["default"].createElement("table", {
130
254
  className: "min-w-full divide-y divide-gray-200"
@@ -136,15 +260,15 @@ var PowrBaseUsersAdmin = function PowrBaseUsersAdmin(_ref) {
136
260
  className: "px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"
137
261
  }, "Role"), /*#__PURE__*/_react["default"].createElement("th", {
138
262
  className: "px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"
139
- }, "Joined"), showActions && /*#__PURE__*/_react["default"].createElement("th", {
140
- className: "px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"
141
- }, "Actions"))), /*#__PURE__*/_react["default"].createElement("tbody", {
263
+ }, "Joined"))), /*#__PURE__*/_react["default"].createElement("tbody", {
142
264
  className: "bg-white divide-y divide-gray-200"
143
265
  }, users.map(function (user) {
144
266
  var _user$fullName;
267
+ var userId = getUserId(user);
268
+ var isUpdating = updatingUserId === userId;
145
269
  return /*#__PURE__*/_react["default"].createElement("tr", {
146
- key: user._id,
147
- className: onUserClick ? "cursor-pointer hover:bg-gray-50" : "",
270
+ key: userId || user._id,
271
+ className: onUserClick ? 'cursor-pointer hover:bg-gray-50' : '',
148
272
  onClick: function onClick() {
149
273
  return onUserClick && onUserClick(user);
150
274
  }
@@ -165,18 +289,31 @@ var PowrBaseUsersAdmin = function PowrBaseUsersAdmin(_ref) {
165
289
  }, user.fullName || 'Unknown User'), /*#__PURE__*/_react["default"].createElement("div", {
166
290
  className: "text-sm text-gray-500"
167
291
  }, user.email || user.phoneNumber || 'No contact info')))), /*#__PURE__*/_react["default"].createElement("td", {
168
- className: "px-6 py-4 whitespace-nowrap"
169
- }, /*#__PURE__*/_react["default"].createElement("span", {
292
+ className: "px-6 py-4 whitespace-nowrap",
293
+ onClick: function onClick(e) {
294
+ return e.stopPropagation();
295
+ }
296
+ }, showActions ? /*#__PURE__*/_react["default"].createElement("div", {
297
+ className: "flex items-center gap-2"
298
+ }, /*#__PURE__*/_react["default"].createElement("select", {
299
+ value: normalizeAccess(user.access),
300
+ disabled: isUpdating,
301
+ onChange: function onChange(e) {
302
+ return updateUserRole(user, Number(e.target.value));
303
+ },
304
+ className: "text-sm border border-gray-300 rounded-md px-2 py-1.5 bg-white focus:outline-none focus:ring-2 focus:ring-blue-500 disabled:opacity-50"
305
+ }, ROLE_OPTIONS.map(function (role) {
306
+ return /*#__PURE__*/_react["default"].createElement("option", {
307
+ key: role.value,
308
+ value: role.value
309
+ }, role.label);
310
+ })), isUpdating && /*#__PURE__*/_react["default"].createElement("span", {
311
+ className: "text-xs text-gray-500"
312
+ }, "Saving...")) : /*#__PURE__*/_react["default"].createElement("span", {
170
313
  className: "inline-flex px-2 py-1 text-xs font-semibold rounded-full ".concat(getBadgeVariant(user.access))
171
314
  }, getBadgeText(user.access))), /*#__PURE__*/_react["default"].createElement("td", {
172
315
  className: "px-6 py-4 whitespace-nowrap text-sm text-gray-500"
173
- }, formatDate(user.createdAt)), showActions && /*#__PURE__*/_react["default"].createElement("td", {
174
- className: "px-6 py-4 whitespace-nowrap text-sm font-medium"
175
- }, /*#__PURE__*/_react["default"].createElement("button", {
176
- className: "text-indigo-600 hover:text-indigo-900 mr-3"
177
- }, "Edit"), /*#__PURE__*/_react["default"].createElement("button", {
178
- className: "text-red-600 hover:text-red-900"
179
- }, "Remove")));
316
+ }, formatDate(user.createdAt)));
180
317
  })))), users.length === 0 && /*#__PURE__*/_react["default"].createElement("div", {
181
318
  className: "text-center py-8"
182
319
  }, /*#__PURE__*/_react["default"].createElement("div", {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "powr-sdk-web",
3
- "version": "5.6.12",
3
+ "version": "5.6.14",
4
4
  "main": "dist/index.js",
5
5
  "scripts": {
6
6
  "build": "babel src -d dist --copy-files",