powr-sdk-web 5.6.9 → 5.6.11

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.
@@ -30,6 +30,7 @@ var AdminDashboard = function AdminDashboard(_ref) {
30
30
  projectId = _ref.projectId,
31
31
  _ref$sections = _ref.sections,
32
32
  sections = _ref$sections === void 0 ? [] : _ref$sections,
33
+ formPublicBaseUrl = _ref.formPublicBaseUrl,
33
34
  _ref$theme = _ref.theme,
34
35
  theme = _ref$theme === void 0 ? "default" : _ref$theme;
35
36
  var _useState = (0, _react.useState)(null),
@@ -190,6 +191,7 @@ var AdminDashboard = function AdminDashboard(_ref) {
190
191
  var sectionProps = {
191
192
  apiUrl: apiUrl,
192
193
  projectId: projectId,
194
+ formPublicBaseUrl: formPublicBaseUrl,
193
195
  theme: theme === 'dark' ? 'dark' : 'blue'
194
196
  };
195
197
  switch (currentSection) {
@@ -272,6 +274,7 @@ var AdminDashboard = function AdminDashboard(_ref) {
272
274
  AdminDashboard.propTypes = {
273
275
  projectId: _propTypes["default"].string,
274
276
  sections: _propTypes["default"].arrayOf(_propTypes["default"].string),
277
+ formPublicBaseUrl: _propTypes["default"].string,
275
278
  theme: _propTypes["default"].oneOf(['default', 'dark'])
276
279
  };
277
280
  var _default = exports["default"] = AdminDashboard;
@@ -7,7 +7,7 @@ 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 _t4 in e) "default" !== _t4 && {}.hasOwnProperty.call(e, _t4) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t4)) && (i.get || i.set) ? o(f, _t4, i) : f[_t4] = e[_t4]); 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 _t5 in e) "default" !== _t5 && {}.hasOwnProperty.call(e, _t5) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t5)) && (i.get || i.set) ? o(f, _t5, i) : f[_t5] = e[_t5]); return f; })(e, t); }
11
11
  function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
12
12
  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."); }
13
13
  function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
@@ -30,6 +30,7 @@ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
30
30
  var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
31
31
  var projectId = _ref.projectId,
32
32
  apiUrl = _ref.apiUrl,
33
+ formPublicBaseUrl = _ref.formPublicBaseUrl,
33
34
  onFormAction = _ref.onFormAction,
34
35
  onRefresh = _ref.onRefresh;
35
36
  var _useState = (0, _react.useState)([]),
@@ -56,39 +57,47 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
56
57
  _useState10 = _slicedToArray(_useState1, 2),
57
58
  createFeedback = _useState10[0],
58
59
  setCreateFeedback = _useState10[1];
59
- var _useState11 = (0, _react.useState)({
60
+ var _useState11 = (0, _react.useState)(''),
61
+ _useState12 = _slicedToArray(_useState11, 2),
62
+ createdFormLink = _useState12[0],
63
+ setCreatedFormLink = _useState12[1];
64
+ var _useState13 = (0, _react.useState)(''),
65
+ _useState14 = _slicedToArray(_useState13, 2),
66
+ copiedFormName = _useState14[0],
67
+ setCopiedFormName = _useState14[1];
68
+ var _useState15 = (0, _react.useState)({
60
69
  formTitle: '',
61
70
  formName: '',
62
71
  formId: '',
63
72
  fields: []
64
73
  }),
65
- _useState12 = _slicedToArray(_useState11, 2),
66
- formDraft = _useState12[0],
67
- setFormDraft = _useState12[1];
68
- var _useState13 = (0, _react.useState)(null),
69
- _useState14 = _slicedToArray(_useState13, 2),
70
- selectedForm = _useState14[0],
71
- setSelectedForm = _useState14[1];
72
- var _useState15 = (0, _react.useState)(false),
73
74
  _useState16 = _slicedToArray(_useState15, 2),
74
- showDetailModal = _useState16[0],
75
- setShowDetailModal = _useState16[1];
76
- var _useState17 = (0, _react.useState)('responses'),
75
+ formDraft = _useState16[0],
76
+ setFormDraft = _useState16[1];
77
+ var _useState17 = (0, _react.useState)(null),
77
78
  _useState18 = _slicedToArray(_useState17, 2),
78
- activeTab = _useState18[0],
79
- setActiveTab = _useState18[1];
80
- var _useState19 = (0, _react.useState)([]),
79
+ selectedForm = _useState18[0],
80
+ setSelectedForm = _useState18[1];
81
+ var _useState19 = (0, _react.useState)(false),
81
82
  _useState20 = _slicedToArray(_useState19, 2),
82
- formResponses = _useState20[0],
83
- setFormResponses = _useState20[1];
84
- var _useState21 = (0, _react.useState)(0),
83
+ showDetailModal = _useState20[0],
84
+ setShowDetailModal = _useState20[1];
85
+ var _useState21 = (0, _react.useState)('responses'),
85
86
  _useState22 = _slicedToArray(_useState21, 2),
86
- responseCount = _useState22[0],
87
- setResponseCount = _useState22[1];
88
- var _useState23 = (0, _react.useState)(false),
87
+ activeTab = _useState22[0],
88
+ setActiveTab = _useState22[1];
89
+ var _useState23 = (0, _react.useState)([]),
89
90
  _useState24 = _slicedToArray(_useState23, 2),
90
- loadingResponses = _useState24[0],
91
- setLoadingResponses = _useState24[1];
91
+ formResponses = _useState24[0],
92
+ setFormResponses = _useState24[1];
93
+ var _useState25 = (0, _react.useState)(0),
94
+ _useState26 = _slicedToArray(_useState25, 2),
95
+ responseCount = _useState26[0],
96
+ setResponseCount = _useState26[1];
97
+ var _useState27 = (0, _react.useState)(false),
98
+ _useState28 = _slicedToArray(_useState27, 2),
99
+ loadingResponses = _useState28[0],
100
+ setLoadingResponses = _useState28[1];
92
101
  var fetchForms = /*#__PURE__*/function () {
93
102
  var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
94
103
  var _yield$apiCall, data, ok, _t;
@@ -200,7 +209,75 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
200
209
  onFormAction(type, message);
201
210
  }
202
211
  };
212
+ var getFormPublicUrl = function getFormPublicUrl(formName) {
213
+ if (!formName) return '';
214
+ var base = (formPublicBaseUrl === null || formPublicBaseUrl === void 0 ? void 0 : formPublicBaseUrl.replace(/\/$/, '')) || (typeof window !== 'undefined' ? "".concat(window.location.origin, "/forms") : '/forms');
215
+ return "".concat(base, "?id=").concat(encodeURIComponent(formName));
216
+ };
217
+ var copyFormLink = /*#__PURE__*/function () {
218
+ var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(formName, event) {
219
+ var _event$stopPropagatio;
220
+ var url, _t3;
221
+ return _regenerator().w(function (_context3) {
222
+ while (1) switch (_context3.p = _context3.n) {
223
+ case 0:
224
+ event === null || event === void 0 || (_event$stopPropagatio = event.stopPropagation) === null || _event$stopPropagatio === void 0 || _event$stopPropagatio.call(event);
225
+ url = getFormPublicUrl(formName);
226
+ if (url) {
227
+ _context3.n = 1;
228
+ break;
229
+ }
230
+ return _context3.a(2);
231
+ case 1:
232
+ _context3.p = 1;
233
+ _context3.n = 2;
234
+ return navigator.clipboard.writeText(url);
235
+ case 2:
236
+ setCopiedFormName(formName);
237
+ setTimeout(function () {
238
+ return setCopiedFormName('');
239
+ }, 2000);
240
+ _context3.n = 4;
241
+ break;
242
+ case 3:
243
+ _context3.p = 3;
244
+ _t3 = _context3.v;
245
+ notify('error', 'Could not copy link');
246
+ case 4:
247
+ return _context3.a(2);
248
+ }
249
+ }, _callee3, null, [[1, 3]]);
250
+ }));
251
+ return function copyFormLink(_x2, _x3) {
252
+ return _ref4.apply(this, arguments);
253
+ };
254
+ }();
255
+ var FormPublicLink = function FormPublicLink(_ref5) {
256
+ var formName = _ref5.formName,
257
+ _ref5$compact = _ref5.compact,
258
+ compact = _ref5$compact === void 0 ? false : _ref5$compact;
259
+ var url = getFormPublicUrl(formName);
260
+ if (!url) return null;
261
+ return /*#__PURE__*/_react["default"].createElement("div", {
262
+ className: "flex items-center gap-2 ".concat(compact ? 'mt-1' : 'mt-2'),
263
+ onClick: function onClick(e) {
264
+ return e.stopPropagation();
265
+ }
266
+ }, /*#__PURE__*/_react["default"].createElement("a", {
267
+ href: url,
268
+ target: "_blank",
269
+ rel: "noopener noreferrer",
270
+ className: "text-xs text-blue-600 hover:text-blue-800 underline truncate max-w-md"
271
+ }, url), /*#__PURE__*/_react["default"].createElement("button", {
272
+ type: "button",
273
+ onClick: function onClick(e) {
274
+ return copyFormLink(formName, e);
275
+ },
276
+ className: "shrink-0 text-xs text-gray-600 hover:text-gray-900 border border-gray-300 rounded px-2 py-0.5"
277
+ }, copiedFormName === formName ? 'Copied!' : 'Copy'));
278
+ };
203
279
  var resetFormDraft = function resetFormDraft() {
280
+ setCreatedFormLink('');
204
281
  setFormDraft({
205
282
  formTitle: '',
206
283
  formName: '',
@@ -225,12 +302,19 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
225
302
  return candidate;
226
303
  };
227
304
  var addField = function addField(type) {
228
- var index = formDraft.fields.length + 1;
229
305
  setFormDraft(function (prev) {
306
+ var index = prev.fields.length + 1;
307
+ var defaults = type === 'mobile' ? {
308
+ name: 'whatsapp',
309
+ label: 'Mobile Number'
310
+ } : {
311
+ name: "field".concat(index),
312
+ label: "Field ".concat(index)
313
+ };
230
314
  return _objectSpread(_objectSpread({}, prev), {}, {
231
- fields: [].concat(_toConsumableArray(prev.fields), [_objectSpread({
232
- name: "field".concat(index),
233
- label: "Field ".concat(index),
315
+ fields: [].concat(_toConsumableArray(prev.fields), [_objectSpread(_objectSpread({
316
+ id: "".concat(Date.now(), "-").concat(index)
317
+ }, defaults), {}, {
234
318
  type: type,
235
319
  required: false
236
320
  }, type === 'radio' ? {
@@ -258,46 +342,46 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
258
342
  });
259
343
  };
260
344
  var createForm = /*#__PURE__*/function () {
261
- var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() {
262
- var trimmedTitle, trimmedName, trimmedId, hasInvalidField, fieldNames, duplicateNames, payload, _yield$apiCall3, result, ok, errorMessage, _t3;
263
- return _regenerator().w(function (_context3) {
264
- while (1) switch (_context3.p = _context3.n) {
345
+ var _ref6 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4() {
346
+ var trimmedTitle, trimmedName, trimmedId, hasInvalidField, fieldNames, duplicateNames, usedNames, normalizedFields, payload, _yield$apiCall3, result, ok, errorMessage, _t4;
347
+ return _regenerator().w(function (_context4) {
348
+ while (1) switch (_context4.p = _context4.n) {
265
349
  case 0:
266
350
  setCreateFeedback('');
267
351
  if (projectId) {
268
- _context3.n = 1;
352
+ _context4.n = 1;
269
353
  break;
270
354
  }
271
355
  notify('error', 'Project ID is required');
272
- return _context3.a(2);
356
+ return _context4.a(2);
273
357
  case 1:
274
358
  trimmedTitle = formDraft.formTitle.trim();
275
359
  trimmedName = formDraft.formName.trim();
276
360
  trimmedId = formDraft.formId.trim();
277
361
  if (!(!trimmedTitle || !trimmedName || !trimmedId)) {
278
- _context3.n = 2;
362
+ _context4.n = 2;
279
363
  break;
280
364
  }
281
365
  notify('error', 'Form title, name, and ID are required');
282
- return _context3.a(2);
366
+ return _context4.a(2);
283
367
  case 2:
284
368
  if (!(formDraft.fields.length === 0)) {
285
- _context3.n = 3;
369
+ _context4.n = 3;
286
370
  break;
287
371
  }
288
372
  notify('error', 'Add at least one field');
289
- return _context3.a(2);
373
+ return _context4.a(2);
290
374
  case 3:
291
375
  hasInvalidField = formDraft.fields.some(function (field) {
292
376
  var _field$name, _field$label;
293
377
  return !((_field$name = field.name) !== null && _field$name !== void 0 && _field$name.trim()) || !((_field$label = field.label) !== null && _field$label !== void 0 && _field$label.trim());
294
378
  });
295
379
  if (!hasInvalidField) {
296
- _context3.n = 4;
380
+ _context4.n = 4;
297
381
  break;
298
382
  }
299
383
  notify('error', 'Each field needs a name and label');
300
- return _context3.a(2);
384
+ return _context4.a(2);
301
385
  case 4:
302
386
  fieldNames = formDraft.fields.map(function (field) {
303
387
  return field.name.trim();
@@ -306,71 +390,83 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
306
390
  return fieldNames.indexOf(name) !== index;
307
391
  });
308
392
  if (!(duplicateNames.length > 0)) {
309
- _context3.n = 5;
393
+ _context4.n = 5;
310
394
  break;
311
395
  }
312
396
  notify('error', "Each field needs a unique name. Duplicate: ".concat(_toConsumableArray(new Set(duplicateNames)).join(', ')));
313
- return _context3.a(2);
397
+ return _context4.a(2);
314
398
  case 5:
315
399
  setIsSaving(true);
316
- _context3.p = 6;
400
+ _context4.p = 6;
401
+ usedNames = new Set();
402
+ normalizedFields = formDraft.fields.map(function (field, index, allFields) {
403
+ var _field$name2;
404
+ var others = allFields.filter(function (_, i) {
405
+ return i !== index;
406
+ });
407
+ var name = ((_field$name2 = field.name) === null || _field$name2 === void 0 ? void 0 : _field$name2.trim()) || uniqueFieldName(field.label, index, others);
408
+ var candidate = name;
409
+ var suffix = 2;
410
+ while (usedNames.has(candidate)) {
411
+ candidate = "".concat(name).concat(suffix);
412
+ suffix += 1;
413
+ }
414
+ usedNames.add(candidate);
415
+ return _objectSpread({
416
+ name: candidate,
417
+ label: field.label.trim(),
418
+ type: field.type,
419
+ required: !!field.required
420
+ }, field.type === 'radio' ? {
421
+ options: field.options || []
422
+ } : {});
423
+ });
317
424
  payload = {
318
425
  formTitle: trimmedTitle,
319
426
  formName: trimmedName,
320
427
  formId: trimmedId,
321
- fields: formDraft.fields.map(function (field) {
322
- return _objectSpread({
323
- name: field.name.trim(),
324
- label: field.label.trim(),
325
- type: field.type,
326
- required: !!field.required
327
- }, field.type === 'radio' ? {
328
- options: field.options || []
329
- } : {});
330
- })
428
+ fields: normalizedFields
331
429
  };
332
- _context3.n = 7;
430
+ _context4.n = 7;
333
431
  return (0, _auth.apiCall)(apiUrl, "/forms/create-form", projectId, {
334
432
  method: 'POST',
335
433
  body: payload
336
434
  });
337
435
  case 7:
338
- _yield$apiCall3 = _context3.v;
436
+ _yield$apiCall3 = _context4.v;
339
437
  result = _yield$apiCall3.data;
340
438
  ok = _yield$apiCall3.ok;
341
439
  if (ok) {
342
- _context3.n = 8;
440
+ _context4.n = 8;
343
441
  break;
344
442
  }
345
443
  throw new Error(result.message || 'Failed to create form');
346
444
  case 8:
347
445
  notify('success', result.message || 'Form created successfully!');
348
- resetFormDraft();
349
- setCreateFeedback('');
350
- setShowCreateModal(false);
446
+ setCreatedFormLink(getFormPublicUrl(trimmedName));
351
447
  fetchForms();
352
448
  if (onRefresh) {
353
449
  onRefresh();
354
450
  }
355
- _context3.n = 10;
451
+ _context4.n = 10;
356
452
  break;
357
453
  case 9:
358
- _context3.p = 9;
359
- _t3 = _context3.v;
360
- console.error('Error creating form:', _t3);
361
- errorMessage = _t3 instanceof Error ? _t3.message : 'Failed to create form';
454
+ _context4.p = 9;
455
+ _t4 = _context4.v;
456
+ console.error('Error creating form:', _t4);
457
+ errorMessage = _t4 instanceof Error ? _t4.message : 'Failed to create form';
362
458
  notify('error', errorMessage);
363
459
  case 10:
364
- _context3.p = 10;
460
+ _context4.p = 10;
365
461
  setIsSaving(false);
366
- return _context3.f(10);
462
+ return _context4.f(10);
367
463
  case 11:
368
- return _context3.a(2);
464
+ return _context4.a(2);
369
465
  }
370
- }, _callee3, null, [[6, 9, 10, 11]]);
466
+ }, _callee4, null, [[6, 9, 10, 11]]);
371
467
  }));
372
468
  return function createForm() {
373
- return _ref4.apply(this, arguments);
469
+ return _ref6.apply(this, arguments);
374
470
  };
375
471
  }();
376
472
  var handleViewForm = function handleViewForm(form) {
@@ -460,7 +556,10 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
460
556
  className: "text-xs text-gray-400"
461
557
  }, "ID: ", form.formId), /*#__PURE__*/_react["default"].createElement("p", {
462
558
  className: "text-xs text-gray-400"
463
- }, "Name: ", form.formName)))), /*#__PURE__*/_react["default"].createElement("div", {
559
+ }, "Name: ", form.formName), /*#__PURE__*/_react["default"].createElement(FormPublicLink, {
560
+ formName: form.formName,
561
+ compact: true
562
+ })))), /*#__PURE__*/_react["default"].createElement("div", {
464
563
  className: "text-sm text-gray-500"
465
564
  }, ((_form$fields = form.fields) === null || _form$fields === void 0 ? void 0 : _form$fields.length) || 0, " fields"));
466
565
  })))), showCreateModal && /*#__PURE__*/_react["default"].createElement("div", {
@@ -469,9 +568,26 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
469
568
  className: "bg-white rounded-2xl shadow-xl p-8 w-full max-w-3xl max-h-[90vh] overflow-y-auto"
470
569
  }, /*#__PURE__*/_react["default"].createElement("h2", {
471
570
  className: "text-xl font-bold text-gray-800 mb-6"
472
- }, "Create New Form"), createFeedback && /*#__PURE__*/_react["default"].createElement("div", {
571
+ }, "Create New Form"), createFeedback && !createdFormLink && /*#__PURE__*/_react["default"].createElement("div", {
473
572
  className: "mb-4 rounded-lg border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700"
474
- }, createFeedback), /*#__PURE__*/_react["default"].createElement("div", {
573
+ }, createFeedback), createdFormLink && /*#__PURE__*/_react["default"].createElement("div", {
574
+ className: "mb-4 rounded-lg border border-green-200 bg-green-50 px-4 py-3 text-sm text-green-800 space-y-2"
575
+ }, /*#__PURE__*/_react["default"].createElement("p", {
576
+ className: "font-medium"
577
+ }, "Form created! Share this link:"), /*#__PURE__*/_react["default"].createElement("div", {
578
+ className: "flex flex-wrap items-center gap-2"
579
+ }, /*#__PURE__*/_react["default"].createElement("a", {
580
+ href: createdFormLink,
581
+ target: "_blank",
582
+ rel: "noopener noreferrer",
583
+ className: "text-blue-700 underline break-all"
584
+ }, createdFormLink), /*#__PURE__*/_react["default"].createElement("button", {
585
+ type: "button",
586
+ onClick: function onClick() {
587
+ return copyFormLink(formDraft.formName.trim());
588
+ },
589
+ className: "text-xs border border-green-300 rounded px-2 py-1 bg-white"
590
+ }, "Copy link"))), !createdFormLink && /*#__PURE__*/_react["default"].createElement("div", {
475
591
  className: "space-y-6"
476
592
  }, /*#__PURE__*/_react["default"].createElement("div", {
477
593
  className: "grid grid-cols-1 md:grid-cols-2 gap-4"
@@ -529,13 +645,20 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
529
645
  className: "w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
530
646
  }), /*#__PURE__*/_react["default"].createElement("p", {
531
647
  className: "text-xs text-gray-500 mt-1"
532
- }, "Used in URLs like `/forms?id=workshopform`"))), /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("div", {
648
+ }, "Used in URLs like `/forms?id=workshopform`"), formDraft.formName.trim() && /*#__PURE__*/_react["default"].createElement("div", {
649
+ className: "mt-2 rounded-md border border-blue-100 bg-blue-50 px-3 py-2"
650
+ }, /*#__PURE__*/_react["default"].createElement("p", {
651
+ className: "text-xs font-medium text-blue-900 mb-1"
652
+ }, "Public form link"), /*#__PURE__*/_react["default"].createElement(FormPublicLink, {
653
+ formName: formDraft.formName.trim(),
654
+ compact: true
655
+ })))), /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("div", {
533
656
  className: "flex items-center justify-between mb-3"
534
657
  }, /*#__PURE__*/_react["default"].createElement("h3", {
535
658
  className: "text-sm font-semibold text-gray-900"
536
659
  }, "Fields"), /*#__PURE__*/_react["default"].createElement("div", {
537
660
  className: "flex flex-wrap gap-2"
538
- }, ['text', 'email', 'textarea', 'radio', 'fileUploader'].map(function (type) {
661
+ }, ['text', 'email', 'mobile', 'textarea', 'radio', 'fileUploader'].map(function (type) {
539
662
  return /*#__PURE__*/_react["default"].createElement("button", {
540
663
  key: type,
541
664
  type: "button",
@@ -550,7 +673,7 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
550
673
  className: "space-y-4"
551
674
  }, formDraft.fields.map(function (field, index) {
552
675
  return /*#__PURE__*/_react["default"].createElement("div", {
553
- key: "".concat(field.name, "-").concat(index),
676
+ key: field.id || index,
554
677
  className: "rounded-lg border border-gray-200 p-4 space-y-3"
555
678
  }, /*#__PURE__*/_react["default"].createElement("div", {
556
679
  className: "flex items-center justify-between"
@@ -568,12 +691,8 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
568
691
  type: "text",
569
692
  value: field.label,
570
693
  onChange: function onChange(e) {
571
- var label = e.target.value;
572
- updateField(index, {
573
- label: label,
574
- name: uniqueFieldName(label, index, formDraft.fields.filter(function (_, i) {
575
- return i !== index;
576
- }))
694
+ return updateField(index, {
695
+ label: e.target.value
577
696
  });
578
697
  },
579
698
  placeholder: "Label",
@@ -613,7 +732,15 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
613
732
  }));
614
733
  })))), /*#__PURE__*/_react["default"].createElement("div", {
615
734
  className: "flex justify-end gap-4 mt-6"
616
- }, /*#__PURE__*/_react["default"].createElement("button", {
735
+ }, createdFormLink ? /*#__PURE__*/_react["default"].createElement("button", {
736
+ type: "button",
737
+ onClick: function onClick() {
738
+ resetFormDraft();
739
+ setCreateFeedback('');
740
+ setShowCreateModal(false);
741
+ },
742
+ className: "bg-blue-600 text-white hover:bg-blue-700 px-4 py-2 rounded-md"
743
+ }, "Done") : /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("button", {
617
744
  type: "button",
618
745
  onClick: function onClick() {
619
746
  resetFormDraft();
@@ -628,7 +755,7 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
628
755
  className: "bg-blue-600 text-white hover:bg-blue-700 px-4 py-2 rounded-md disabled:opacity-50"
629
756
  }, isSaving ? /*#__PURE__*/_react["default"].createElement("div", {
630
757
  className: "animate-spin h-5 w-5 mx-auto border-2 border-white border-t-transparent rounded-full"
631
- }) : 'Create Form')))), showDetailModal && selectedForm && /*#__PURE__*/_react["default"].createElement("div", {
758
+ }) : 'Create Form'))))), showDetailModal && selectedForm && /*#__PURE__*/_react["default"].createElement("div", {
632
759
  className: "fixed inset-0 flex items-center justify-center bg-black bg-opacity-50 z-50"
633
760
  }, /*#__PURE__*/_react["default"].createElement("div", {
634
761
  className: "bg-white rounded-2xl shadow-xl p-8 w-full max-w-4xl max-h-[90vh] overflow-y-auto"
@@ -652,6 +779,12 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
652
779
  strokeWidth: 2,
653
780
  d: "M6 18L18 6M6 6l12 12"
654
781
  })))), /*#__PURE__*/_react["default"].createElement("div", {
782
+ className: "mb-4 rounded-lg border border-blue-100 bg-blue-50 px-4 py-3"
783
+ }, /*#__PURE__*/_react["default"].createElement("p", {
784
+ className: "text-sm font-medium text-blue-900 mb-1"
785
+ }, "Public form link"), /*#__PURE__*/_react["default"].createElement(FormPublicLink, {
786
+ formName: selectedForm.formName
787
+ })), /*#__PURE__*/_react["default"].createElement("div", {
655
788
  className: "mb-4"
656
789
  }, /*#__PURE__*/_react["default"].createElement("div", {
657
790
  className: "flex space-x-4 border-b border-gray-200"
@@ -202,6 +202,26 @@ var PowrForm = function PowrForm(_ref) {
202
202
  }), {
203
203
  className: inputClass
204
204
  })));
205
+ case "mobile":
206
+ return /*#__PURE__*/_react["default"].createElement(InputField, {
207
+ key: field.name,
208
+ label: field.label,
209
+ required: field.required,
210
+ error: errors[field.name],
211
+ theme: theme
212
+ }, /*#__PURE__*/_react["default"].createElement("input", _extends({
213
+ type: "tel",
214
+ inputMode: "tel",
215
+ autoComplete: "tel"
216
+ }, register(field.name, {
217
+ required: field.required,
218
+ pattern: {
219
+ value: /^[0-9+\-\s()]{8,15}$/,
220
+ message: "Invalid mobile number"
221
+ }
222
+ }), {
223
+ className: inputClass
224
+ })));
205
225
  case "textarea":
206
226
  return /*#__PURE__*/_react["default"].createElement(InputField, {
207
227
  key: field.name,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "powr-sdk-web",
3
- "version": "5.6.9",
3
+ "version": "5.6.11",
4
4
  "main": "dist/index.js",
5
5
  "scripts": {
6
6
  "build": "babel src -d dist --copy-files",