powr-sdk-web 5.8.2 → 5.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+
3
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports["default"] = PowrBaseAdminFull;
8
+ var _react = _interopRequireDefault(require("react"));
9
+ var _index = _interopRequireDefault(require("./index"));
10
+ var _optionalSectionLoaders = require("./optionalSectionLoaders");
11
+ var _excluded = ["sectionLoaders"];
12
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
13
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
14
+ 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; }
15
+ 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; }
16
+ 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; }
17
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
18
+ 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); }
19
+ function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
20
+ function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
21
+ /**
22
+ * Full PowrBaseAdmin for host apps that already install optional peers
23
+ * (Excelrs / Spriny via the package root export).
24
+ * Prefer `powr-sdk-web/dist/admin` in lean apps (Ampy Ops) to avoid monaco/lucide.
25
+ */
26
+ function PowrBaseAdminFull(props) {
27
+ var sectionLoaders = props.sectionLoaders,
28
+ rest = _objectWithoutProperties(props, _excluded);
29
+ return /*#__PURE__*/_react["default"].createElement(_index["default"], _extends({}, rest, {
30
+ sectionLoaders: _objectSpread(_objectSpread({}, _optionalSectionLoaders.OPTIONAL_SECTION_LOADERS), sectionLoaders || {})
31
+ }));
32
+ }
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.CORE_SECTION_LOADERS = void 0;
7
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
8
+ 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 _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
9
+ /**
10
+ * Core admin sections — no heavy optional peers (monaco / lucide / hot-toast).
11
+ * Safe for apps that only need Users (e.g. Ampy Ops).
12
+ */
13
+ var CORE_SECTION_LOADERS = exports.CORE_SECTION_LOADERS = {
14
+ users: function users() {
15
+ return Promise.resolve().then(function () {
16
+ return _interopRequireWildcard(require('../users/admin'));
17
+ });
18
+ },
19
+ notifications: function notifications() {
20
+ return Promise.resolve().then(function () {
21
+ return _interopRequireWildcard(require('../notifications/admin'));
22
+ });
23
+ },
24
+ invoices: function invoices() {
25
+ return Promise.resolve().then(function () {
26
+ return _interopRequireWildcard(require('../invoices/admin'));
27
+ });
28
+ },
29
+ slides: function slides() {
30
+ return Promise.resolve().then(function () {
31
+ return _interopRequireWildcard(require('../slides/admin'));
32
+ });
33
+ },
34
+ forms: function forms() {
35
+ return Promise.resolve().then(function () {
36
+ return _interopRequireWildcard(require('../forms/admin'));
37
+ });
38
+ },
39
+ waitlist: function waitlist() {
40
+ return Promise.resolve().then(function () {
41
+ return _interopRequireWildcard(require('../waitlists/admin'));
42
+ });
43
+ },
44
+ feeds: function feeds() {
45
+ return Promise.resolve().then(function () {
46
+ return _interopRequireWildcard(require('../feeds/admin'));
47
+ });
48
+ }
49
+ };
@@ -7,36 +7,117 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports["default"] = void 0;
8
8
  var _react = _interopRequireWildcard(require("react"));
9
9
  var _propTypes = _interopRequireDefault(require("prop-types"));
10
- var _admin = _interopRequireDefault(require("../users/admin"));
11
- var _admin2 = _interopRequireDefault(require("../functions/admin"));
12
- var _admin3 = _interopRequireDefault(require("../notifications/admin"));
13
- var _admin4 = _interopRequireDefault(require("../invoices/admin"));
14
- var _admin5 = _interopRequireDefault(require("../slides/admin"));
15
- var _admin6 = _interopRequireDefault(require("../forms/admin"));
16
- var _admin7 = _interopRequireDefault(require("../waitlists/admin"));
17
- var _admin8 = _interopRequireDefault(require("../feeds/admin"));
18
- var _admin9 = _interopRequireDefault(require("../tasks/admin"));
10
+ var _coreSectionLoaders = require("./coreSectionLoaders");
19
11
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
20
- 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 _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
12
+ 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); }
21
13
  function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
14
+ 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 }; })(); }
15
+ 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); }
16
+ 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); }
17
+ function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
18
+ 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; }
19
+ 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; }
20
+ 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; }
21
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
22
+ 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); }
22
23
  function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
23
24
  function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
24
25
  function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
25
26
  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; }
26
27
  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; } }
27
- function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } // Import all admin components
28
- var AdminDashboard = function AdminDashboard(_ref) {
29
- var apiUrl = _ref.apiUrl,
30
- projectId = _ref.projectId,
31
- _ref$sections = _ref.sections,
32
- sections = _ref$sections === void 0 ? [] : _ref$sections,
33
- formPublicBaseUrl = _ref.formPublicBaseUrl,
34
- _ref$theme = _ref.theme,
35
- theme = _ref$theme === void 0 ? "default" : _ref$theme;
28
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
29
+ function normalizeSectionKey(section) {
30
+ return String(section || '').trim().toLowerCase();
31
+ }
32
+ function resolveLoader(sectionKey, loaders) {
33
+ if (loaders[sectionKey]) return loaders[sectionKey];
34
+ // Accept "Wait List" / "WaitLists" style labels for waitlist
35
+ if (sectionKey.replace(/\s+/g, '') === 'waitlists') return loaders.waitlist;
36
+ return null;
37
+ }
38
+ var MissingSection = function MissingSection(_ref) {
39
+ var section = _ref.section,
40
+ theme = _ref.theme;
41
+ var color = theme === 'dark' ? '#f9fafb' : '#1f2937';
42
+ var muted = theme === 'dark' ? '#9ca3af' : '#6b7280';
43
+ return /*#__PURE__*/_react["default"].createElement("div", {
44
+ style: {
45
+ padding: 16,
46
+ color: color
47
+ }
48
+ }, /*#__PURE__*/_react["default"].createElement("h3", {
49
+ style: {
50
+ margin: '0 0 8px 0'
51
+ }
52
+ }, "Section unavailable: ", section), /*#__PURE__*/_react["default"].createElement("p", {
53
+ style: {
54
+ margin: 0,
55
+ color: muted,
56
+ lineHeight: 1.5
57
+ }
58
+ }, "This section needs optional peer dependencies. Install them in the host app, then pass loaders from ", /*#__PURE__*/_react["default"].createElement("code", null, "powr-sdk-web/dist/admin/optionalSectionLoaders"), " via the", ' ', /*#__PURE__*/_react["default"].createElement("code", null, "sectionLoaders"), " prop."));
59
+ };
60
+ var AdminDashboard = function AdminDashboard(_ref2) {
61
+ var apiUrl = _ref2.apiUrl,
62
+ projectId = _ref2.projectId,
63
+ _ref2$sections = _ref2.sections,
64
+ sections = _ref2$sections === void 0 ? [] : _ref2$sections,
65
+ formPublicBaseUrl = _ref2.formPublicBaseUrl,
66
+ _ref2$theme = _ref2.theme,
67
+ theme = _ref2$theme === void 0 ? 'default' : _ref2$theme,
68
+ _ref2$sectionLoaders = _ref2.sectionLoaders,
69
+ sectionLoaders = _ref2$sectionLoaders === void 0 ? {} : _ref2$sectionLoaders,
70
+ _ref2$roleOptions = _ref2.roleOptions,
71
+ roleOptions = _ref2$roleOptions === void 0 ? null : _ref2$roleOptions,
72
+ _ref2$usersProps = _ref2.usersProps,
73
+ usersProps = _ref2$usersProps === void 0 ? null : _ref2$usersProps;
36
74
  var _useState = (0, _react.useState)(null),
37
75
  _useState2 = _slicedToArray(_useState, 2),
38
76
  currentSection = _useState2[0],
39
77
  setCurrentSection = _useState2[1];
78
+ var loaders = (0, _react.useMemo)(function () {
79
+ return _objectSpread(_objectSpread({}, _coreSectionLoaders.CORE_SECTION_LOADERS), sectionLoaders);
80
+ }, [sectionLoaders]);
81
+ var LazySection = (0, _react.useMemo)(function () {
82
+ if (!currentSection) return null;
83
+ var loader = resolveLoader(currentSection, loaders);
84
+ if (!loader) {
85
+ return function () {
86
+ return /*#__PURE__*/_react["default"].createElement(MissingSection, {
87
+ section: currentSection,
88
+ theme: theme
89
+ });
90
+ };
91
+ }
92
+ return /*#__PURE__*/(0, _react.lazy)(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
93
+ var mod, _t;
94
+ return _regenerator().w(function (_context) {
95
+ while (1) switch (_context.p = _context.n) {
96
+ case 0:
97
+ _context.p = 0;
98
+ _context.n = 1;
99
+ return loader();
100
+ case 1:
101
+ mod = _context.v;
102
+ return _context.a(2, {
103
+ "default": mod["default"] || mod
104
+ });
105
+ case 2:
106
+ _context.p = 2;
107
+ _t = _context.v;
108
+ console.error("[PowrBaseAdmin] Failed to load section \"".concat(currentSection, "\""), _t);
109
+ return _context.a(2, {
110
+ "default": function _default() {
111
+ return /*#__PURE__*/_react["default"].createElement(MissingSection, {
112
+ section: currentSection,
113
+ theme: theme
114
+ });
115
+ }
116
+ });
117
+ }
118
+ }, _callee, null, [[0, 2]]);
119
+ })));
120
+ }, [currentSection, loaders, theme]);
40
121
  var getThemeStyles = function getThemeStyles() {
41
122
  var baseStyles = {
42
123
  container: {
@@ -160,10 +241,12 @@ var AdminDashboard = function AdminDashboard(_ref) {
160
241
  borderRadius: '12px',
161
242
  padding: '24px',
162
243
  marginTop: '16px'
244
+ },
245
+ loading: {
246
+ padding: '24px',
247
+ color: '#6b7280'
163
248
  }
164
249
  };
165
-
166
- // Theme variations
167
250
  if (theme === 'dark') {
168
251
  baseStyles.container.backgroundColor = '#1f2937';
169
252
  baseStyles.title.color = '#f9fafb';
@@ -177,69 +260,56 @@ var AdminDashboard = function AdminDashboard(_ref) {
177
260
  baseStyles.statLabel.color = '#9ca3af';
178
261
  baseStyles.sectionContainer.backgroundColor = '#374151';
179
262
  baseStyles.sectionContainer.borderColor = '#4b5563';
263
+ baseStyles.loading.color = '#9ca3af';
180
264
  }
181
265
  return baseStyles;
182
266
  };
183
267
  var styles = getThemeStyles();
184
268
  var handleCardClick = function handleCardClick(section) {
185
- setCurrentSection(section.toLowerCase());
269
+ setCurrentSection(normalizeSectionKey(section));
186
270
  };
187
271
  var handleBackToDashboard = function handleBackToDashboard() {
188
272
  setCurrentSection(null);
189
273
  };
190
274
  var renderAdminSection = function renderAdminSection() {
275
+ if (!LazySection) return null;
191
276
  var sectionProps = {
192
277
  apiUrl: apiUrl,
193
278
  projectId: projectId,
194
279
  formPublicBaseUrl: formPublicBaseUrl,
195
280
  theme: theme === 'dark' ? 'dark' : 'blue'
196
281
  };
197
- switch (currentSection) {
198
- case 'users':
199
- return /*#__PURE__*/_react["default"].createElement(_admin["default"], _extends({}, sectionProps, {
200
- showActions: true
201
- }));
202
- case 'functions':
203
- return /*#__PURE__*/_react["default"].createElement(_admin2["default"], sectionProps);
204
- case 'notifications':
205
- return /*#__PURE__*/_react["default"].createElement(_admin3["default"], sectionProps);
206
- case 'invoices':
207
- return /*#__PURE__*/_react["default"].createElement(_admin4["default"], sectionProps);
208
- case 'slides':
209
- return /*#__PURE__*/_react["default"].createElement(_admin5["default"], sectionProps);
210
- case 'forms':
211
- return /*#__PURE__*/_react["default"].createElement(_admin6["default"], sectionProps);
212
- case 'waitlist':
213
- return /*#__PURE__*/_react["default"].createElement(_admin7["default"], sectionProps);
214
- case 'feeds':
215
- return /*#__PURE__*/_react["default"].createElement(_admin8["default"], sectionProps);
216
- case 'tasks':
217
- return /*#__PURE__*/_react["default"].createElement(_admin9["default"], _extends({}, sectionProps, {
218
- onError: function onError(message) {
219
- return alert(message);
220
- }
221
- }));
222
- default:
223
- return null;
224
- }
282
+ var extraProps = currentSection === 'users' ? _objectSpread(_objectSpread({
283
+ showActions: true
284
+ }, roleOptions ? {
285
+ roleOptions: roleOptions
286
+ } : {}), usersProps || {}) : currentSection === 'tasks' ? {
287
+ onError: function onError(message) {
288
+ return alert(message);
289
+ }
290
+ } : {};
291
+ return /*#__PURE__*/_react["default"].createElement(_react.Suspense, {
292
+ fallback: /*#__PURE__*/_react["default"].createElement("div", {
293
+ style: styles.loading
294
+ }, "Loading ", currentSection, "\u2026")
295
+ }, /*#__PURE__*/_react["default"].createElement(LazySection, _extends({}, sectionProps, extraProps)));
225
296
  };
226
297
  if (currentSection) {
227
298
  return /*#__PURE__*/_react["default"].createElement("div", {
228
299
  style: styles.container
229
300
  }, /*#__PURE__*/_react["default"].createElement("button", {
301
+ type: "button",
230
302
  style: styles.backButton,
231
303
  onClick: handleBackToDashboard
232
304
  }, "\u2190 Back to Dashboard"), /*#__PURE__*/_react["default"].createElement("div", {
233
305
  style: styles.sectionContainer
234
306
  }, renderAdminSection()));
235
307
  }
236
-
237
- // Show the main dashboard
238
308
  return /*#__PURE__*/_react["default"].createElement("div", {
239
309
  style: styles.container
240
310
  }, /*#__PURE__*/_react["default"].createElement("div", {
241
311
  style: styles.grid
242
- }, sections.map(function (section, index) {
312
+ }, sections.map(function (section) {
243
313
  return /*#__PURE__*/_react["default"].createElement("div", {
244
314
  key: section,
245
315
  style: styles.card,
@@ -261,6 +331,7 @@ var AdminDashboard = function AdminDashboard(_ref) {
261
331
  }, section)), /*#__PURE__*/_react["default"].createElement("p", {
262
332
  style: styles.cardDescription
263
333
  }, "Manage your ", section.toLowerCase(), " settings"), /*#__PURE__*/_react["default"].createElement("button", {
334
+ type: "button",
264
335
  style: styles.cardButton,
265
336
  onMouseEnter: function onMouseEnter(e) {
266
337
  e.target.style.background = styles.cardButtonHover.background;
@@ -272,9 +343,16 @@ var AdminDashboard = function AdminDashboard(_ref) {
272
343
  })));
273
344
  };
274
345
  AdminDashboard.propTypes = {
346
+ apiUrl: _propTypes["default"].string,
275
347
  projectId: _propTypes["default"].string,
276
348
  sections: _propTypes["default"].arrayOf(_propTypes["default"].string),
277
349
  formPublicBaseUrl: _propTypes["default"].string,
278
- theme: _propTypes["default"].oneOf(['default', 'dark'])
350
+ theme: _propTypes["default"].oneOf(['default', 'dark']),
351
+ sectionLoaders: _propTypes["default"].objectOf(_propTypes["default"].func),
352
+ roleOptions: _propTypes["default"].arrayOf(_propTypes["default"].shape({
353
+ value: _propTypes["default"].number.isRequired,
354
+ label: _propTypes["default"].string.isRequired
355
+ })),
356
+ usersProps: _propTypes["default"].object
279
357
  };
280
- var _default = exports["default"] = AdminDashboard;
358
+ var _default2 = exports["default"] = AdminDashboard;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = exports.OPTIONAL_SECTION_LOADERS = void 0;
7
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
8
+ 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 _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
9
+ /**
10
+ * Heavy admin sections. Import only from apps that install optional peers:
11
+ * lucide-react, @monaco-editor/react, react-hot-toast
12
+ *
13
+ * @example
14
+ * import PowrBaseAdmin from 'powr-sdk-web/dist/admin';
15
+ * import { OPTIONAL_SECTION_LOADERS } from 'powr-sdk-web/dist/admin/optionalSectionLoaders';
16
+ * <PowrBaseAdmin sections={['Users','Functions']} sectionLoaders={OPTIONAL_SECTION_LOADERS} />
17
+ */
18
+ var OPTIONAL_SECTION_LOADERS = exports.OPTIONAL_SECTION_LOADERS = {
19
+ functions: function functions() {
20
+ return Promise.resolve().then(function () {
21
+ return _interopRequireWildcard(require('../functions/admin'));
22
+ });
23
+ },
24
+ tasks: function tasks() {
25
+ return Promise.resolve().then(function () {
26
+ return _interopRequireWildcard(require('../tasks/admin'));
27
+ });
28
+ }
29
+ };
30
+ var _default = exports["default"] = OPTIONAL_SECTION_LOADERS;
package/dist/index.js CHANGED
@@ -48,7 +48,7 @@ Object.defineProperty(exports, "PowrBaseActivities", {
48
48
  Object.defineProperty(exports, "PowrBaseAdmin", {
49
49
  enumerable: true,
50
50
  get: function get() {
51
- return _admin["default"];
51
+ return _PowrBaseAdminFull["default"];
52
52
  }
53
53
  });
54
54
  Object.defineProperty(exports, "PowrBaseBlogs", {
@@ -325,7 +325,7 @@ var _forms = _interopRequireDefault(require("./forms"));
325
325
  var _chat = _interopRequireDefault(require("./chat"));
326
326
  var _feeds = _interopRequireDefault(require("./feeds"));
327
327
  var _thread = _interopRequireDefault(require("./thread"));
328
- var _admin = _interopRequireDefault(require("./admin"));
328
+ var _PowrBaseAdminFull = _interopRequireDefault(require("./admin/PowrBaseAdminFull"));
329
329
  var _tools = _interopRequireDefault(require("./tools"));
330
330
  var _tasks = _interopRequireDefault(require("./tasks"));
331
331
  var _powrVerify = _interopRequireDefault(require("./powrVerify"));
@@ -13,6 +13,10 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
13
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
14
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
15
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); }
16
+ function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
17
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
18
+ function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
19
+ function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
16
20
  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 }; })(); }
17
21
  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); }
18
22
  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); }
@@ -23,23 +27,14 @@ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r)
23
27
  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; }
24
28
  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; } }
25
29
  function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
26
- var ROLE_OPTIONS = [{
30
+ /** Generic Powr defaults — apps pass `roleOptions` for product-specific roles. */
31
+ var DEFAULT_ROLE_OPTIONS = [{
27
32
  value: 1,
28
- label: 'Student'
29
- }, {
30
- value: 300,
31
- label: 'College admin'
32
- }, {
33
- value: 900,
34
- label: 'Client'
33
+ label: 'User'
35
34
  }, {
36
35
  value: 100,
37
36
  label: 'Admin'
38
37
  }];
39
- var normalizeAccess = function normalizeAccess(access) {
40
- if (access === 100 || access === 300 || access === 900) return access;
41
- return 1;
42
- };
43
38
  var PowrBaseUsersAdmin = function PowrBaseUsersAdmin(_ref) {
44
39
  var apiUrl = _ref.apiUrl,
45
40
  projectId = _ref.projectId,
@@ -52,7 +47,9 @@ var PowrBaseUsersAdmin = function PowrBaseUsersAdmin(_ref) {
52
47
  _ref$onAddUser = _ref.onAddUser,
53
48
  onAddUser = _ref$onAddUser === void 0 ? null : _ref$onAddUser,
54
49
  _ref$onRoleChange = _ref.onRoleChange,
55
- onRoleChange = _ref$onRoleChange === void 0 ? null : _ref$onRoleChange;
50
+ onRoleChange = _ref$onRoleChange === void 0 ? null : _ref$onRoleChange,
51
+ _ref$roleOptions = _ref.roleOptions,
52
+ roleOptions = _ref$roleOptions === void 0 ? null : _ref$roleOptions;
56
53
  var _useState = (0, _react.useState)([]),
57
54
  _useState2 = _slicedToArray(_useState, 2),
58
55
  users = _useState2[0],
@@ -73,6 +70,15 @@ var PowrBaseUsersAdmin = function PowrBaseUsersAdmin(_ref) {
73
70
  _useState0 = _slicedToArray(_useState9, 2),
74
71
  updatingUserId = _useState0[0],
75
72
  setUpdatingUserId = _useState0[1];
73
+ var resolvedRoleOptions = (0, _react.useMemo)(function () {
74
+ if (Array.isArray(roleOptions) && roleOptions.length > 0) return roleOptions;
75
+ return DEFAULT_ROLE_OPTIONS;
76
+ }, [roleOptions]);
77
+ var knownAccessValues = (0, _react.useMemo)(function () {
78
+ return new Set(resolvedRoleOptions.map(function (role) {
79
+ return Number(role.value);
80
+ }));
81
+ }, [resolvedRoleOptions]);
76
82
  (0, _react.useEffect)(function () {
77
83
  fetchUsers();
78
84
  }, [projectId]);
@@ -127,17 +133,38 @@ var PowrBaseUsersAdmin = function PowrBaseUsersAdmin(_ref) {
127
133
  return _ref2.apply(this, arguments);
128
134
  };
129
135
  }();
136
+ var normalizeAccess = function normalizeAccess(access) {
137
+ var _resolvedRoleOptions$;
138
+ var n = Number(access);
139
+ if (knownAccessValues.has(n)) return n;
140
+ return Number((_resolvedRoleOptions$ = resolvedRoleOptions[0]) === null || _resolvedRoleOptions$ === void 0 ? void 0 : _resolvedRoleOptions$.value) || 1;
141
+ };
142
+ var optionsForUser = function optionsForUser(access) {
143
+ var n = Number(access);
144
+ if (Number.isFinite(n) && !knownAccessValues.has(n)) {
145
+ return [].concat(_toConsumableArray(resolvedRoleOptions), [{
146
+ value: n,
147
+ label: "Access ".concat(n)
148
+ }]);
149
+ }
150
+ return resolvedRoleOptions;
151
+ };
130
152
  var getBadgeVariant = function getBadgeVariant(access) {
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';
153
+ var n = Number(access);
154
+ if (n === 100) return 'bg-red-100 text-red-800';
155
+ if (n === 300) return 'bg-purple-100 text-purple-800';
156
+ if (n === 500) return 'bg-teal-100 text-teal-800';
157
+ if (n === 900) return 'bg-blue-100 text-blue-800';
134
158
  return 'bg-gray-100 text-gray-800';
135
159
  };
136
160
  var getBadgeText = function getBadgeText(access) {
137
- var option = ROLE_OPTIONS.find(function (role) {
138
- return role.value === normalizeAccess(access);
161
+ var n = Number(access);
162
+ var option = resolvedRoleOptions.find(function (role) {
163
+ return Number(role.value) === n;
139
164
  });
140
- return (option === null || option === void 0 ? void 0 : option.label) || 'Student';
165
+ if (option) return option.label;
166
+ if (Number.isFinite(n)) return "Access ".concat(n);
167
+ return 'User';
141
168
  };
142
169
  var updateUserRole = /*#__PURE__*/function () {
143
170
  var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(user, newAccess) {
@@ -153,7 +180,7 @@ var PowrBaseUsersAdmin = function PowrBaseUsersAdmin(_ref) {
153
180
  setFeedback('Could not resolve user id');
154
181
  return _context2.a(2);
155
182
  case 1:
156
- if (!(normalizeAccess(user.access) === newAccess)) {
183
+ if (!(Number(user.access) === newAccess)) {
157
184
  _context2.n = 2;
158
185
  break;
159
186
  }
@@ -266,6 +293,8 @@ var PowrBaseUsersAdmin = function PowrBaseUsersAdmin(_ref) {
266
293
  var _user$fullName;
267
294
  var userId = getUserId(user);
268
295
  var isUpdating = updatingUserId === userId;
296
+ var selectOptions = optionsForUser(user.access);
297
+ var selectValue = Number.isFinite(Number(user.access)) ? Number(user.access) : normalizeAccess(user.access);
269
298
  return /*#__PURE__*/_react["default"].createElement("tr", {
270
299
  key: userId || user._id,
271
300
  className: onUserClick ? 'cursor-pointer hover:bg-gray-50' : '',
@@ -296,13 +325,13 @@ var PowrBaseUsersAdmin = function PowrBaseUsersAdmin(_ref) {
296
325
  }, showActions ? /*#__PURE__*/_react["default"].createElement("div", {
297
326
  className: "flex items-center gap-2"
298
327
  }, /*#__PURE__*/_react["default"].createElement("select", {
299
- value: normalizeAccess(user.access),
328
+ value: selectValue,
300
329
  disabled: isUpdating,
301
330
  onChange: function onChange(e) {
302
331
  return updateUserRole(user, Number(e.target.value));
303
332
  },
304
333
  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) {
334
+ }, selectOptions.map(function (role) {
306
335
  return /*#__PURE__*/_react["default"].createElement("option", {
307
336
  key: role.value,
308
337
  value: role.value
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "powr-sdk-web",
3
- "version": "5.8.2",
3
+ "version": "5.9.1",
4
4
  "main": "dist/index.js",
5
5
  "scripts": {
6
6
  "build": "babel src -d dist --copy-files",
@@ -21,16 +21,37 @@
21
21
  "url": "git+https://github.com/lawaziatech/powr-sdk-web.git"
22
22
  },
23
23
  "peerDependencies": {
24
+ "@monaco-editor/react": "*",
24
25
  "filepond": "*",
26
+ "lucide-react": "*",
25
27
  "react": "*",
26
28
  "react-dom": "*",
29
+ "react-hot-toast": "*",
27
30
  "react-toastify": "*"
28
31
  },
32
+ "peerDependenciesMeta": {
33
+ "@monaco-editor/react": {
34
+ "optional": true
35
+ },
36
+ "filepond": {
37
+ "optional": true
38
+ },
39
+ "lucide-react": {
40
+ "optional": true
41
+ },
42
+ "react-hot-toast": {
43
+ "optional": true
44
+ },
45
+ "react-toastify": {
46
+ "optional": true
47
+ }
48
+ },
29
49
  "dependencies": {
30
50
  "axios": "^1.7.7",
31
51
  "filepond": "*",
32
52
  "firebase": "^12.2.1",
33
53
  "libphonenumber-js": "^1.12.9",
54
+ "prop-types": "^15.8.1",
34
55
  "react-filepond": "^7.1.2",
35
56
  "react-hook-form": "^7.58.0"
36
57
  },
@@ -38,7 +59,6 @@
38
59
  "@babel/cli": "^7.24.1",
39
60
  "@babel/core": "^7.24.4",
40
61
  "@babel/preset-env": "^7.24.4",
41
- "@babel/preset-react": "^7.24.1",
42
- "prop-types": "^15.8.1"
62
+ "@babel/preset-react": "^7.24.1"
43
63
  }
44
64
  }