powr-sdk-web 5.6.10 → 5.6.12

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 _t6 in e) "default" !== _t6 && {}.hasOwnProperty.call(e, _t6) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t6)) && (i.get || i.set) ? o(f, _t6, i) : f[_t6] = e[_t6]); 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,70 @@ 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: '',
72
+ description: '',
63
73
  fields: []
64
74
  }),
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
75
  _useState16 = _slicedToArray(_useState15, 2),
74
- showDetailModal = _useState16[0],
75
- setShowDetailModal = _useState16[1];
76
- var _useState17 = (0, _react.useState)('responses'),
76
+ formDraft = _useState16[0],
77
+ setFormDraft = _useState16[1];
78
+ var _useState17 = (0, _react.useState)(false),
77
79
  _useState18 = _slicedToArray(_useState17, 2),
78
- activeTab = _useState18[0],
79
- setActiveTab = _useState18[1];
80
- var _useState19 = (0, _react.useState)([]),
80
+ showEditModal = _useState18[0],
81
+ setShowEditModal = _useState18[1];
82
+ var _useState19 = (0, _react.useState)({
83
+ formTitle: '',
84
+ formName: '',
85
+ formId: '',
86
+ description: '',
87
+ fields: []
88
+ }),
81
89
  _useState20 = _slicedToArray(_useState19, 2),
82
- formResponses = _useState20[0],
83
- setFormResponses = _useState20[1];
84
- var _useState21 = (0, _react.useState)(0),
90
+ editDraft = _useState20[0],
91
+ setEditDraft = _useState20[1];
92
+ var _useState21 = (0, _react.useState)(''),
85
93
  _useState22 = _slicedToArray(_useState21, 2),
86
- responseCount = _useState22[0],
87
- setResponseCount = _useState22[1];
94
+ editFeedback = _useState22[0],
95
+ setEditFeedback = _useState22[1];
88
96
  var _useState23 = (0, _react.useState)(false),
89
97
  _useState24 = _slicedToArray(_useState23, 2),
90
- loadingResponses = _useState24[0],
91
- setLoadingResponses = _useState24[1];
98
+ isUpdating = _useState24[0],
99
+ setIsUpdating = _useState24[1];
100
+ var _useState25 = (0, _react.useState)(null),
101
+ _useState26 = _slicedToArray(_useState25, 2),
102
+ selectedForm = _useState26[0],
103
+ setSelectedForm = _useState26[1];
104
+ var _useState27 = (0, _react.useState)(false),
105
+ _useState28 = _slicedToArray(_useState27, 2),
106
+ showDetailModal = _useState28[0],
107
+ setShowDetailModal = _useState28[1];
108
+ var _useState29 = (0, _react.useState)('responses'),
109
+ _useState30 = _slicedToArray(_useState29, 2),
110
+ activeTab = _useState30[0],
111
+ setActiveTab = _useState30[1];
112
+ var _useState31 = (0, _react.useState)([]),
113
+ _useState32 = _slicedToArray(_useState31, 2),
114
+ formResponses = _useState32[0],
115
+ setFormResponses = _useState32[1];
116
+ var _useState33 = (0, _react.useState)(0),
117
+ _useState34 = _slicedToArray(_useState33, 2),
118
+ responseCount = _useState34[0],
119
+ setResponseCount = _useState34[1];
120
+ var _useState35 = (0, _react.useState)(false),
121
+ _useState36 = _slicedToArray(_useState35, 2),
122
+ loadingResponses = _useState36[0],
123
+ setLoadingResponses = _useState36[1];
92
124
  var fetchForms = /*#__PURE__*/function () {
93
125
  var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
94
126
  var _yield$apiCall, data, ok, _t;
@@ -200,14 +232,176 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
200
232
  onFormAction(type, message);
201
233
  }
202
234
  };
235
+ var getFormPublicUrl = function getFormPublicUrl(formName) {
236
+ if (!formName) return '';
237
+ var base = (formPublicBaseUrl === null || formPublicBaseUrl === void 0 ? void 0 : formPublicBaseUrl.replace(/\/$/, '')) || (typeof window !== 'undefined' ? "".concat(window.location.origin, "/forms") : '/forms');
238
+ return "".concat(base, "?id=").concat(encodeURIComponent(formName));
239
+ };
240
+ var copyFormLink = /*#__PURE__*/function () {
241
+ var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(formName, event) {
242
+ var _event$stopPropagatio;
243
+ var url, _t3;
244
+ return _regenerator().w(function (_context3) {
245
+ while (1) switch (_context3.p = _context3.n) {
246
+ case 0:
247
+ event === null || event === void 0 || (_event$stopPropagatio = event.stopPropagation) === null || _event$stopPropagatio === void 0 || _event$stopPropagatio.call(event);
248
+ url = getFormPublicUrl(formName);
249
+ if (url) {
250
+ _context3.n = 1;
251
+ break;
252
+ }
253
+ return _context3.a(2);
254
+ case 1:
255
+ _context3.p = 1;
256
+ _context3.n = 2;
257
+ return navigator.clipboard.writeText(url);
258
+ case 2:
259
+ setCopiedFormName(formName);
260
+ setTimeout(function () {
261
+ return setCopiedFormName('');
262
+ }, 2000);
263
+ _context3.n = 4;
264
+ break;
265
+ case 3:
266
+ _context3.p = 3;
267
+ _t3 = _context3.v;
268
+ notify('error', 'Could not copy link');
269
+ case 4:
270
+ return _context3.a(2);
271
+ }
272
+ }, _callee3, null, [[1, 3]]);
273
+ }));
274
+ return function copyFormLink(_x2, _x3) {
275
+ return _ref4.apply(this, arguments);
276
+ };
277
+ }();
278
+ var FormPublicLink = function FormPublicLink(_ref5) {
279
+ var formName = _ref5.formName,
280
+ _ref5$compact = _ref5.compact,
281
+ compact = _ref5$compact === void 0 ? false : _ref5$compact;
282
+ var url = getFormPublicUrl(formName);
283
+ if (!url) return null;
284
+ return /*#__PURE__*/_react["default"].createElement("div", {
285
+ className: "flex items-center gap-2 ".concat(compact ? 'mt-1' : 'mt-2'),
286
+ onClick: function onClick(e) {
287
+ return e.stopPropagation();
288
+ }
289
+ }, /*#__PURE__*/_react["default"].createElement("a", {
290
+ href: url,
291
+ target: "_blank",
292
+ rel: "noopener noreferrer",
293
+ className: "text-xs text-blue-600 hover:text-blue-800 underline truncate max-w-md"
294
+ }, url), /*#__PURE__*/_react["default"].createElement("button", {
295
+ type: "button",
296
+ onClick: function onClick(e) {
297
+ return copyFormLink(formName, e);
298
+ },
299
+ className: "shrink-0 text-xs text-gray-600 hover:text-gray-900 border border-gray-300 rounded px-2 py-0.5"
300
+ }, copiedFormName === formName ? 'Copied!' : 'Copy'));
301
+ };
203
302
  var resetFormDraft = function resetFormDraft() {
303
+ setCreatedFormLink('');
204
304
  setFormDraft({
205
305
  formTitle: '',
206
306
  formName: '',
207
307
  formId: '',
308
+ description: '',
208
309
  fields: []
209
310
  });
210
311
  };
312
+ var populateEditDraft = function populateEditDraft(form) {
313
+ return {
314
+ formTitle: form.formTitle || '',
315
+ formName: form.formName || '',
316
+ formId: form.formId || '',
317
+ description: form.description || '',
318
+ fields: (form.fields || []).map(function (field, index) {
319
+ return _objectSpread({
320
+ id: "".concat(field.name || 'field', "-").concat(index),
321
+ name: field.name || '',
322
+ label: field.label || '',
323
+ type: field.type || 'text',
324
+ required: !!field.required,
325
+ description: field.description || ''
326
+ }, field.type === 'radio' ? {
327
+ options: field.options || []
328
+ } : {});
329
+ })
330
+ };
331
+ };
332
+ var normalizeFieldsForSave = function normalizeFieldsForSave(fields) {
333
+ var usedNames = new Set();
334
+ return fields.map(function (field, index, allFields) {
335
+ var _field$name, _field$description;
336
+ var others = allFields.filter(function (_, i) {
337
+ return i !== index;
338
+ });
339
+ var name = ((_field$name = field.name) === null || _field$name === void 0 ? void 0 : _field$name.trim()) || uniqueFieldName(field.label, index, others);
340
+ var candidate = name;
341
+ var suffix = 2;
342
+ while (usedNames.has(candidate)) {
343
+ candidate = "".concat(name).concat(suffix);
344
+ suffix += 1;
345
+ }
346
+ usedNames.add(candidate);
347
+ return _objectSpread(_objectSpread({
348
+ name: candidate,
349
+ label: field.label.trim(),
350
+ type: field.type,
351
+ required: !!field.required
352
+ }, (_field$description = field.description) !== null && _field$description !== void 0 && _field$description.trim() ? {
353
+ description: field.description.trim()
354
+ } : {}), field.type === 'radio' ? {
355
+ options: field.options || []
356
+ } : {});
357
+ });
358
+ };
359
+ var validateFormDraft = function validateFormDraft(draft) {
360
+ var trimmedTitle = draft.formTitle.trim();
361
+ var trimmedName = draft.formName.trim();
362
+ var trimmedId = draft.formId.trim();
363
+ if (!trimmedTitle || !trimmedName || !trimmedId) {
364
+ return {
365
+ valid: false,
366
+ message: 'Form title, name, and ID are required'
367
+ };
368
+ }
369
+ if (draft.fields.length === 0) {
370
+ return {
371
+ valid: false,
372
+ message: 'Add at least one field'
373
+ };
374
+ }
375
+ var hasInvalidField = draft.fields.some(function (field) {
376
+ var _field$name2, _field$label;
377
+ return !((_field$name2 = field.name) !== null && _field$name2 !== void 0 && _field$name2.trim()) || !((_field$label = field.label) !== null && _field$label !== void 0 && _field$label.trim());
378
+ });
379
+ if (hasInvalidField) {
380
+ return {
381
+ valid: false,
382
+ message: 'Each field needs a name and label'
383
+ };
384
+ }
385
+ var fieldNames = draft.fields.map(function (field) {
386
+ return field.name.trim();
387
+ });
388
+ var duplicateNames = fieldNames.filter(function (name, index) {
389
+ return fieldNames.indexOf(name) !== index;
390
+ });
391
+ if (duplicateNames.length > 0) {
392
+ return {
393
+ valid: false,
394
+ message: "Each field needs a unique name. Duplicate: ".concat(_toConsumableArray(new Set(duplicateNames)).join(', '))
395
+ };
396
+ }
397
+ return {
398
+ valid: true,
399
+ trimmedTitle: trimmedTitle,
400
+ trimmedName: trimmedName,
401
+ trimmedId: trimmedId,
402
+ normalizedFields: normalizeFieldsForSave(draft.fields)
403
+ };
404
+ };
211
405
  var slugify = function slugify(value) {
212
406
  return value.toLowerCase().trim().replace(/[^a-z0-9]+/g, '').slice(0, 32);
213
407
  };
@@ -239,7 +433,8 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
239
433
  id: "".concat(Date.now(), "-").concat(index)
240
434
  }, defaults), {}, {
241
435
  type: type,
242
- required: false
436
+ required: false,
437
+ description: ''
243
438
  }, type === 'radio' ? {
244
439
  options: ['Option 1', 'Option 2']
245
440
  } : {})])
@@ -264,136 +459,297 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
264
459
  });
265
460
  });
266
461
  };
462
+ var addEditField = function addEditField(type) {
463
+ setEditDraft(function (prev) {
464
+ var index = prev.fields.length + 1;
465
+ var defaults = type === 'mobile' ? {
466
+ name: 'whatsapp',
467
+ label: 'Mobile Number'
468
+ } : {
469
+ name: "field".concat(index),
470
+ label: "Field ".concat(index)
471
+ };
472
+ return _objectSpread(_objectSpread({}, prev), {}, {
473
+ fields: [].concat(_toConsumableArray(prev.fields), [_objectSpread(_objectSpread({
474
+ id: "".concat(Date.now(), "-").concat(index)
475
+ }, defaults), {}, {
476
+ type: type,
477
+ required: false,
478
+ description: ''
479
+ }, type === 'radio' ? {
480
+ options: ['Option 1', 'Option 2']
481
+ } : {})])
482
+ });
483
+ });
484
+ };
485
+ var updateEditField = function updateEditField(index, updates) {
486
+ setEditDraft(function (prev) {
487
+ return _objectSpread(_objectSpread({}, prev), {}, {
488
+ fields: prev.fields.map(function (field, i) {
489
+ return i === index ? _objectSpread(_objectSpread({}, field), updates) : field;
490
+ })
491
+ });
492
+ });
493
+ };
494
+ var removeEditField = function removeEditField(index) {
495
+ setEditDraft(function (prev) {
496
+ return _objectSpread(_objectSpread({}, prev), {}, {
497
+ fields: prev.fields.filter(function (_, i) {
498
+ return i !== index;
499
+ })
500
+ });
501
+ });
502
+ };
267
503
  var createForm = /*#__PURE__*/function () {
268
- var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() {
269
- var trimmedTitle, trimmedName, trimmedId, hasInvalidField, fieldNames, duplicateNames, usedNames, normalizedFields, payload, _yield$apiCall3, result, ok, errorMessage, _t3;
270
- return _regenerator().w(function (_context3) {
271
- while (1) switch (_context3.p = _context3.n) {
504
+ var _ref6 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4() {
505
+ var validation, payload, _yield$apiCall3, result, ok, errorMessage, _t4;
506
+ return _regenerator().w(function (_context4) {
507
+ while (1) switch (_context4.p = _context4.n) {
272
508
  case 0:
273
509
  setCreateFeedback('');
274
510
  if (projectId) {
275
- _context3.n = 1;
511
+ _context4.n = 1;
276
512
  break;
277
513
  }
278
514
  notify('error', 'Project ID is required');
279
- return _context3.a(2);
515
+ return _context4.a(2);
280
516
  case 1:
281
- trimmedTitle = formDraft.formTitle.trim();
282
- trimmedName = formDraft.formName.trim();
283
- trimmedId = formDraft.formId.trim();
284
- if (!(!trimmedTitle || !trimmedName || !trimmedId)) {
285
- _context3.n = 2;
517
+ validation = validateFormDraft(formDraft);
518
+ if (validation.valid) {
519
+ _context4.n = 2;
286
520
  break;
287
521
  }
288
- notify('error', 'Form title, name, and ID are required');
289
- return _context3.a(2);
522
+ notify('error', validation.message);
523
+ return _context4.a(2);
290
524
  case 2:
291
- if (!(formDraft.fields.length === 0)) {
292
- _context3.n = 3;
293
- break;
294
- }
295
- notify('error', 'Add at least one field');
296
- return _context3.a(2);
297
- case 3:
298
- hasInvalidField = formDraft.fields.some(function (field) {
299
- var _field$name, _field$label;
300
- 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());
301
- });
302
- if (!hasInvalidField) {
303
- _context3.n = 4;
304
- break;
305
- }
306
- notify('error', 'Each field needs a name and label');
307
- return _context3.a(2);
308
- case 4:
309
- fieldNames = formDraft.fields.map(function (field) {
310
- return field.name.trim();
311
- });
312
- duplicateNames = fieldNames.filter(function (name, index) {
313
- return fieldNames.indexOf(name) !== index;
314
- });
315
- if (!(duplicateNames.length > 0)) {
316
- _context3.n = 5;
317
- break;
318
- }
319
- notify('error', "Each field needs a unique name. Duplicate: ".concat(_toConsumableArray(new Set(duplicateNames)).join(', ')));
320
- return _context3.a(2);
321
- case 5:
322
525
  setIsSaving(true);
323
- _context3.p = 6;
324
- usedNames = new Set();
325
- normalizedFields = formDraft.fields.map(function (field, index, allFields) {
326
- var _field$name2;
327
- var others = allFields.filter(function (_, i) {
328
- return i !== index;
329
- });
330
- var name = ((_field$name2 = field.name) === null || _field$name2 === void 0 ? void 0 : _field$name2.trim()) || uniqueFieldName(field.label, index, others);
331
- var candidate = name;
332
- var suffix = 2;
333
- while (usedNames.has(candidate)) {
334
- candidate = "".concat(name).concat(suffix);
335
- suffix += 1;
336
- }
337
- usedNames.add(candidate);
338
- return _objectSpread({
339
- name: candidate,
340
- label: field.label.trim(),
341
- type: field.type,
342
- required: !!field.required
343
- }, field.type === 'radio' ? {
344
- options: field.options || []
345
- } : {});
346
- });
526
+ _context4.p = 3;
347
527
  payload = {
348
- formTitle: trimmedTitle,
349
- formName: trimmedName,
350
- formId: trimmedId,
351
- fields: normalizedFields
528
+ formTitle: validation.trimmedTitle,
529
+ formName: validation.trimmedName,
530
+ formId: validation.trimmedId,
531
+ description: formDraft.description.trim(),
532
+ fields: validation.normalizedFields
352
533
  };
353
- _context3.n = 7;
534
+ _context4.n = 4;
354
535
  return (0, _auth.apiCall)(apiUrl, "/forms/create-form", projectId, {
355
536
  method: 'POST',
356
537
  body: payload
357
538
  });
358
- case 7:
359
- _yield$apiCall3 = _context3.v;
539
+ case 4:
540
+ _yield$apiCall3 = _context4.v;
360
541
  result = _yield$apiCall3.data;
361
542
  ok = _yield$apiCall3.ok;
362
543
  if (ok) {
363
- _context3.n = 8;
544
+ _context4.n = 5;
364
545
  break;
365
546
  }
366
547
  throw new Error(result.message || 'Failed to create form');
367
- case 8:
548
+ case 5:
368
549
  notify('success', result.message || 'Form created successfully!');
369
- resetFormDraft();
370
- setCreateFeedback('');
371
- setShowCreateModal(false);
550
+ setCreatedFormLink(getFormPublicUrl(validation.trimmedName));
372
551
  fetchForms();
373
552
  if (onRefresh) {
374
553
  onRefresh();
375
554
  }
376
- _context3.n = 10;
555
+ _context4.n = 7;
377
556
  break;
378
- case 9:
379
- _context3.p = 9;
380
- _t3 = _context3.v;
381
- console.error('Error creating form:', _t3);
382
- errorMessage = _t3 instanceof Error ? _t3.message : 'Failed to create form';
557
+ case 6:
558
+ _context4.p = 6;
559
+ _t4 = _context4.v;
560
+ console.error('Error creating form:', _t4);
561
+ errorMessage = _t4 instanceof Error ? _t4.message : 'Failed to create form';
383
562
  notify('error', errorMessage);
384
- case 10:
385
- _context3.p = 10;
563
+ case 7:
564
+ _context4.p = 7;
386
565
  setIsSaving(false);
387
- return _context3.f(10);
388
- case 11:
389
- return _context3.a(2);
566
+ return _context4.f(7);
567
+ case 8:
568
+ return _context4.a(2);
390
569
  }
391
- }, _callee3, null, [[6, 9, 10, 11]]);
570
+ }, _callee4, null, [[3, 6, 7, 8]]);
392
571
  }));
393
572
  return function createForm() {
394
- return _ref4.apply(this, arguments);
573
+ return _ref6.apply(this, arguments);
574
+ };
575
+ }();
576
+ var updateForm = /*#__PURE__*/function () {
577
+ var _ref7 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee5() {
578
+ var validation, payload, _yield$apiCall4, result, ok, updatedForm, _t5;
579
+ return _regenerator().w(function (_context5) {
580
+ while (1) switch (_context5.p = _context5.n) {
581
+ case 0:
582
+ setEditFeedback('');
583
+ if (projectId) {
584
+ _context5.n = 1;
585
+ break;
586
+ }
587
+ setEditFeedback('Project ID is required');
588
+ return _context5.a(2);
589
+ case 1:
590
+ validation = validateFormDraft(editDraft);
591
+ if (validation.valid) {
592
+ _context5.n = 2;
593
+ break;
594
+ }
595
+ setEditFeedback(validation.message);
596
+ return _context5.a(2);
597
+ case 2:
598
+ setIsUpdating(true);
599
+ _context5.p = 3;
600
+ payload = {
601
+ formTitle: validation.trimmedTitle,
602
+ formId: validation.trimmedId,
603
+ description: editDraft.description.trim(),
604
+ fields: validation.normalizedFields
605
+ };
606
+ _context5.n = 4;
607
+ return (0, _auth.apiCall)(apiUrl, "/forms/update-form/".concat(encodeURIComponent(editDraft.formName)), projectId, {
608
+ method: 'PUT',
609
+ body: payload
610
+ });
611
+ case 4:
612
+ _yield$apiCall4 = _context5.v;
613
+ result = _yield$apiCall4.data;
614
+ ok = _yield$apiCall4.ok;
615
+ if (ok) {
616
+ _context5.n = 5;
617
+ break;
618
+ }
619
+ throw new Error(result.message || 'Failed to update form');
620
+ case 5:
621
+ updatedForm = result.data || _objectSpread(_objectSpread(_objectSpread({}, selectedForm), payload), {}, {
622
+ formName: editDraft.formName
623
+ });
624
+ setSelectedForm(updatedForm);
625
+ setShowEditModal(false);
626
+ setEditFeedback('');
627
+ fetchForms();
628
+ if (onRefresh) {
629
+ onRefresh();
630
+ }
631
+ if (onFormAction) {
632
+ onFormAction('success', result.message || 'Form updated successfully!');
633
+ }
634
+ _context5.n = 7;
635
+ break;
636
+ case 6:
637
+ _context5.p = 6;
638
+ _t5 = _context5.v;
639
+ console.error('Error updating form:', _t5);
640
+ setEditFeedback(_t5 instanceof Error ? _t5.message : 'Failed to update form');
641
+ case 7:
642
+ _context5.p = 7;
643
+ setIsUpdating(false);
644
+ return _context5.f(7);
645
+ case 8:
646
+ return _context5.a(2);
647
+ }
648
+ }, _callee5, null, [[3, 6, 7, 8]]);
649
+ }));
650
+ return function updateForm() {
651
+ return _ref7.apply(this, arguments);
395
652
  };
396
653
  }();
654
+ var openEditModal = function openEditModal(form) {
655
+ setEditDraft(populateEditDraft(form));
656
+ setEditFeedback('');
657
+ setShowEditModal(true);
658
+ };
659
+ var renderFieldBuilder = function renderFieldBuilder(draft, _ref8) {
660
+ var addFieldFn = _ref8.addFieldFn,
661
+ updateFieldFn = _ref8.updateFieldFn,
662
+ removeFieldFn = _ref8.removeFieldFn;
663
+ return /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("div", {
664
+ className: "flex items-center justify-between mb-3"
665
+ }, /*#__PURE__*/_react["default"].createElement("h3", {
666
+ className: "text-sm font-semibold text-gray-900"
667
+ }, "Fields"), /*#__PURE__*/_react["default"].createElement("div", {
668
+ className: "flex flex-wrap gap-2"
669
+ }, ['text', 'email', 'mobile', 'textarea', 'radio', 'fileUploader'].map(function (type) {
670
+ return /*#__PURE__*/_react["default"].createElement("button", {
671
+ key: type,
672
+ type: "button",
673
+ onClick: function onClick() {
674
+ return addFieldFn(type);
675
+ },
676
+ className: "px-3 py-1 text-xs rounded-full border border-gray-300 hover:bg-gray-50"
677
+ }, "+ ", type);
678
+ }))), draft.fields.length === 0 ? /*#__PURE__*/_react["default"].createElement("div", {
679
+ className: "rounded-lg border border-dashed border-gray-300 p-6 text-center text-sm text-gray-500"
680
+ }, "Add fields using the buttons above") : /*#__PURE__*/_react["default"].createElement("div", {
681
+ className: "space-y-4"
682
+ }, draft.fields.map(function (field, index) {
683
+ return /*#__PURE__*/_react["default"].createElement("div", {
684
+ key: field.id || index,
685
+ className: "rounded-lg border border-gray-200 p-4 space-y-3"
686
+ }, /*#__PURE__*/_react["default"].createElement("div", {
687
+ className: "flex items-center justify-between"
688
+ }, /*#__PURE__*/_react["default"].createElement("span", {
689
+ className: "text-sm font-medium text-gray-700 capitalize"
690
+ }, field.type, " field"), /*#__PURE__*/_react["default"].createElement("button", {
691
+ type: "button",
692
+ onClick: function onClick() {
693
+ return removeFieldFn(index);
694
+ },
695
+ className: "text-sm text-red-600 hover:text-red-700"
696
+ }, "Remove")), /*#__PURE__*/_react["default"].createElement("div", {
697
+ className: "grid grid-cols-1 md:grid-cols-2 gap-3"
698
+ }, /*#__PURE__*/_react["default"].createElement("input", {
699
+ type: "text",
700
+ value: field.label,
701
+ onChange: function onChange(e) {
702
+ return updateFieldFn(index, {
703
+ label: e.target.value
704
+ });
705
+ },
706
+ placeholder: "Label",
707
+ className: "w-full px-3 py-2 border border-gray-300 rounded-md"
708
+ }), /*#__PURE__*/_react["default"].createElement("input", {
709
+ type: "text",
710
+ value: field.name,
711
+ onChange: function onChange(e) {
712
+ return updateFieldFn(index, {
713
+ name: slugify(e.target.value)
714
+ });
715
+ },
716
+ placeholder: "name",
717
+ className: "w-full px-3 py-2 border border-gray-300 rounded-md"
718
+ })), /*#__PURE__*/_react["default"].createElement("input", {
719
+ type: "text",
720
+ value: field.description || '',
721
+ onChange: function onChange(e) {
722
+ return updateFieldFn(index, {
723
+ description: e.target.value
724
+ });
725
+ },
726
+ placeholder: "Help text (optional, shown below the label)",
727
+ className: "w-full px-3 py-2 border border-gray-300 rounded-md text-sm"
728
+ }), /*#__PURE__*/_react["default"].createElement("label", {
729
+ className: "flex items-center gap-2 text-sm text-gray-700"
730
+ }, /*#__PURE__*/_react["default"].createElement("input", {
731
+ type: "checkbox",
732
+ checked: !!field.required,
733
+ onChange: function onChange(e) {
734
+ return updateFieldFn(index, {
735
+ required: e.target.checked
736
+ });
737
+ }
738
+ }), "Required"), field.type === 'radio' && /*#__PURE__*/_react["default"].createElement("textarea", {
739
+ value: (field.options || []).join('\n'),
740
+ onChange: function onChange(e) {
741
+ return updateFieldFn(index, {
742
+ options: e.target.value.split('\n').map(function (option) {
743
+ return option.trim();
744
+ }).filter(Boolean)
745
+ });
746
+ },
747
+ placeholder: "One option per line",
748
+ rows: 3,
749
+ className: "w-full px-3 py-2 border border-gray-300 rounded-md"
750
+ }));
751
+ })));
752
+ };
397
753
  var handleViewForm = function handleViewForm(form) {
398
754
  setSelectedForm(form);
399
755
  setActiveTab('responses');
@@ -481,7 +837,10 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
481
837
  className: "text-xs text-gray-400"
482
838
  }, "ID: ", form.formId), /*#__PURE__*/_react["default"].createElement("p", {
483
839
  className: "text-xs text-gray-400"
484
- }, "Name: ", form.formName)))), /*#__PURE__*/_react["default"].createElement("div", {
840
+ }, "Name: ", form.formName), /*#__PURE__*/_react["default"].createElement(FormPublicLink, {
841
+ formName: form.formName,
842
+ compact: true
843
+ })))), /*#__PURE__*/_react["default"].createElement("div", {
485
844
  className: "text-sm text-gray-500"
486
845
  }, ((_form$fields = form.fields) === null || _form$fields === void 0 ? void 0 : _form$fields.length) || 0, " fields"));
487
846
  })))), showCreateModal && /*#__PURE__*/_react["default"].createElement("div", {
@@ -490,9 +849,26 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
490
849
  className: "bg-white rounded-2xl shadow-xl p-8 w-full max-w-3xl max-h-[90vh] overflow-y-auto"
491
850
  }, /*#__PURE__*/_react["default"].createElement("h2", {
492
851
  className: "text-xl font-bold text-gray-800 mb-6"
493
- }, "Create New Form"), createFeedback && /*#__PURE__*/_react["default"].createElement("div", {
852
+ }, "Create New Form"), createFeedback && !createdFormLink && /*#__PURE__*/_react["default"].createElement("div", {
494
853
  className: "mb-4 rounded-lg border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700"
495
- }, createFeedback), /*#__PURE__*/_react["default"].createElement("div", {
854
+ }, createFeedback), createdFormLink && /*#__PURE__*/_react["default"].createElement("div", {
855
+ className: "mb-4 rounded-lg border border-green-200 bg-green-50 px-4 py-3 text-sm text-green-800 space-y-2"
856
+ }, /*#__PURE__*/_react["default"].createElement("p", {
857
+ className: "font-medium"
858
+ }, "Form created! Share this link:"), /*#__PURE__*/_react["default"].createElement("div", {
859
+ className: "flex flex-wrap items-center gap-2"
860
+ }, /*#__PURE__*/_react["default"].createElement("a", {
861
+ href: createdFormLink,
862
+ target: "_blank",
863
+ rel: "noopener noreferrer",
864
+ className: "text-blue-700 underline break-all"
865
+ }, createdFormLink), /*#__PURE__*/_react["default"].createElement("button", {
866
+ type: "button",
867
+ onClick: function onClick() {
868
+ return copyFormLink(formDraft.formName.trim());
869
+ },
870
+ className: "text-xs border border-green-300 rounded px-2 py-1 bg-white"
871
+ }, "Copy link"))), !createdFormLink && /*#__PURE__*/_react["default"].createElement("div", {
496
872
  className: "space-y-6"
497
873
  }, /*#__PURE__*/_react["default"].createElement("div", {
498
874
  className: "grid grid-cols-1 md:grid-cols-2 gap-4"
@@ -550,87 +926,44 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
550
926
  className: "w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
551
927
  }), /*#__PURE__*/_react["default"].createElement("p", {
552
928
  className: "text-xs text-gray-500 mt-1"
553
- }, "Used in URLs like `/forms?id=workshopform`"))), /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("div", {
554
- className: "flex items-center justify-between mb-3"
555
- }, /*#__PURE__*/_react["default"].createElement("h3", {
556
- className: "text-sm font-semibold text-gray-900"
557
- }, "Fields"), /*#__PURE__*/_react["default"].createElement("div", {
558
- className: "flex flex-wrap gap-2"
559
- }, ['text', 'email', 'mobile', 'textarea', 'radio', 'fileUploader'].map(function (type) {
560
- return /*#__PURE__*/_react["default"].createElement("button", {
561
- key: type,
562
- type: "button",
563
- onClick: function onClick() {
564
- return addField(type);
565
- },
566
- className: "px-3 py-1 text-xs rounded-full border border-gray-300 hover:bg-gray-50"
567
- }, "+ ", type);
568
- }))), formDraft.fields.length === 0 ? /*#__PURE__*/_react["default"].createElement("div", {
569
- className: "rounded-lg border border-dashed border-gray-300 p-6 text-center text-sm text-gray-500"
570
- }, "Add fields using the buttons above") : /*#__PURE__*/_react["default"].createElement("div", {
571
- className: "space-y-4"
572
- }, formDraft.fields.map(function (field, index) {
573
- return /*#__PURE__*/_react["default"].createElement("div", {
574
- key: field.id || index,
575
- className: "rounded-lg border border-gray-200 p-4 space-y-3"
576
- }, /*#__PURE__*/_react["default"].createElement("div", {
577
- className: "flex items-center justify-between"
578
- }, /*#__PURE__*/_react["default"].createElement("span", {
579
- className: "text-sm font-medium text-gray-700 capitalize"
580
- }, field.type, " field"), /*#__PURE__*/_react["default"].createElement("button", {
581
- type: "button",
582
- onClick: function onClick() {
583
- return removeField(index);
584
- },
585
- className: "text-sm text-red-600 hover:text-red-700"
586
- }, "Remove")), /*#__PURE__*/_react["default"].createElement("div", {
587
- className: "grid grid-cols-1 md:grid-cols-2 gap-3"
588
- }, /*#__PURE__*/_react["default"].createElement("input", {
589
- type: "text",
590
- value: field.label,
591
- onChange: function onChange(e) {
592
- return updateField(index, {
593
- label: e.target.value
594
- });
595
- },
596
- placeholder: "Label",
597
- className: "w-full px-3 py-2 border border-gray-300 rounded-md"
598
- }), /*#__PURE__*/_react["default"].createElement("input", {
599
- type: "text",
600
- value: field.name,
601
- onChange: function onChange(e) {
602
- return updateField(index, {
603
- name: slugify(e.target.value)
604
- });
605
- },
606
- placeholder: "name",
607
- className: "w-full px-3 py-2 border border-gray-300 rounded-md"
608
- })), /*#__PURE__*/_react["default"].createElement("label", {
609
- className: "flex items-center gap-2 text-sm text-gray-700"
610
- }, /*#__PURE__*/_react["default"].createElement("input", {
611
- type: "checkbox",
612
- checked: !!field.required,
613
- onChange: function onChange(e) {
614
- return updateField(index, {
615
- required: e.target.checked
616
- });
617
- }
618
- }), "Required"), field.type === 'radio' && /*#__PURE__*/_react["default"].createElement("textarea", {
619
- value: (field.options || []).join('\n'),
620
- onChange: function onChange(e) {
621
- return updateField(index, {
622
- options: e.target.value.split('\n').map(function (option) {
623
- return option.trim();
624
- }).filter(Boolean)
929
+ }, "Used in URLs like `/forms?id=workshopform`"), formDraft.formName.trim() && /*#__PURE__*/_react["default"].createElement("div", {
930
+ className: "mt-2 rounded-md border border-blue-100 bg-blue-50 px-3 py-2"
931
+ }, /*#__PURE__*/_react["default"].createElement("p", {
932
+ className: "text-xs font-medium text-blue-900 mb-1"
933
+ }, "Public form link"), /*#__PURE__*/_react["default"].createElement(FormPublicLink, {
934
+ formName: formDraft.formName.trim(),
935
+ compact: true
936
+ })))), /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("label", {
937
+ htmlFor: "formDescription",
938
+ className: "block text-sm font-medium text-gray-700 mb-1"
939
+ }, "Description (optional)"), /*#__PURE__*/_react["default"].createElement("textarea", {
940
+ id: "formDescription",
941
+ value: formDraft.description,
942
+ onChange: function onChange(e) {
943
+ return setFormDraft(function (prev) {
944
+ return _objectSpread(_objectSpread({}, prev), {}, {
945
+ description: e.target.value
625
946
  });
626
- },
627
- placeholder: "One option per line",
628
- rows: 3,
629
- className: "w-full px-3 py-2 border border-gray-300 rounded-md"
630
- }));
631
- })))), /*#__PURE__*/_react["default"].createElement("div", {
947
+ });
948
+ },
949
+ placeholder: "Instructions or context shown at the top of the public form",
950
+ rows: 3,
951
+ 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, {
953
+ addFieldFn: addField,
954
+ updateFieldFn: updateField,
955
+ removeFieldFn: removeField
956
+ })), /*#__PURE__*/_react["default"].createElement("div", {
632
957
  className: "flex justify-end gap-4 mt-6"
633
- }, /*#__PURE__*/_react["default"].createElement("button", {
958
+ }, createdFormLink ? /*#__PURE__*/_react["default"].createElement("button", {
959
+ type: "button",
960
+ onClick: function onClick() {
961
+ resetFormDraft();
962
+ setCreateFeedback('');
963
+ setShowCreateModal(false);
964
+ },
965
+ className: "bg-blue-600 text-white hover:bg-blue-700 px-4 py-2 rounded-md"
966
+ }, "Done") : /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("button", {
634
967
  type: "button",
635
968
  onClick: function onClick() {
636
969
  resetFormDraft();
@@ -645,7 +978,7 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
645
978
  className: "bg-blue-600 text-white hover:bg-blue-700 px-4 py-2 rounded-md disabled:opacity-50"
646
979
  }, isSaving ? /*#__PURE__*/_react["default"].createElement("div", {
647
980
  className: "animate-spin h-5 w-5 mx-auto border-2 border-white border-t-transparent rounded-full"
648
- }) : 'Create Form')))), showDetailModal && selectedForm && /*#__PURE__*/_react["default"].createElement("div", {
981
+ }) : 'Create Form'))))), showDetailModal && selectedForm && /*#__PURE__*/_react["default"].createElement("div", {
649
982
  className: "fixed inset-0 flex items-center justify-center bg-black bg-opacity-50 z-50"
650
983
  }, /*#__PURE__*/_react["default"].createElement("div", {
651
984
  className: "bg-white rounded-2xl shadow-xl p-8 w-full max-w-4xl max-h-[90vh] overflow-y-auto"
@@ -653,7 +986,15 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
653
986
  className: "flex items-center justify-between mb-6"
654
987
  }, /*#__PURE__*/_react["default"].createElement("h2", {
655
988
  className: "text-xl font-bold text-gray-800"
656
- }, selectedForm.formTitle), /*#__PURE__*/_react["default"].createElement("button", {
989
+ }, selectedForm.formTitle), /*#__PURE__*/_react["default"].createElement("div", {
990
+ className: "flex items-center gap-2"
991
+ }, /*#__PURE__*/_react["default"].createElement("button", {
992
+ type: "button",
993
+ onClick: function onClick() {
994
+ return openEditModal(selectedForm);
995
+ },
996
+ className: "text-sm bg-blue-600 hover:bg-blue-700 text-white px-3 py-1.5 rounded-md"
997
+ }, "Edit Form"), /*#__PURE__*/_react["default"].createElement("button", {
657
998
  onClick: function onClick() {
658
999
  return setShowDetailModal(false);
659
1000
  },
@@ -668,7 +1009,13 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
668
1009
  strokeLinejoin: "round",
669
1010
  strokeWidth: 2,
670
1011
  d: "M6 18L18 6M6 6l12 12"
671
- })))), /*#__PURE__*/_react["default"].createElement("div", {
1012
+ }))))), /*#__PURE__*/_react["default"].createElement("div", {
1013
+ className: "mb-4 rounded-lg border border-blue-100 bg-blue-50 px-4 py-3"
1014
+ }, /*#__PURE__*/_react["default"].createElement("p", {
1015
+ className: "text-sm font-medium text-blue-900 mb-1"
1016
+ }, "Public form link"), /*#__PURE__*/_react["default"].createElement(FormPublicLink, {
1017
+ formName: selectedForm.formName
1018
+ })), /*#__PURE__*/_react["default"].createElement("div", {
672
1019
  className: "mb-4"
673
1020
  }, /*#__PURE__*/_react["default"].createElement("div", {
674
1021
  className: "flex space-x-4 border-b border-gray-200"
@@ -694,7 +1041,13 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
694
1041
  className: "font-medium text-gray-700"
695
1042
  }, "Form Name:"), /*#__PURE__*/_react["default"].createElement("p", {
696
1043
  className: "text-gray-900"
697
- }, selectedForm.formName))), /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("p", {
1044
+ }, selectedForm.formName)), selectedForm.description && /*#__PURE__*/_react["default"].createElement("div", {
1045
+ className: "md:col-span-2"
1046
+ }, /*#__PURE__*/_react["default"].createElement("p", {
1047
+ className: "font-medium text-gray-700"
1048
+ }, "Description:"), /*#__PURE__*/_react["default"].createElement("p", {
1049
+ className: "text-gray-900 whitespace-pre-wrap"
1050
+ }, selectedForm.description))), /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("p", {
698
1051
  className: "font-medium text-gray-700 mb-2"
699
1052
  }, "Form Fields:"), /*#__PURE__*/_react["default"].createElement("div", {
700
1053
  className: "bg-gray-50 p-4 rounded-lg"
@@ -777,6 +1130,97 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
777
1130
  }, "View Raw Data"), /*#__PURE__*/_react["default"].createElement("pre", {
778
1131
  className: "mt-2 text-xs bg-gray-50 p-3 rounded overflow-x-auto"
779
1132
  }, JSON.stringify(response, null, 2)))));
780
- }))))));
1133
+ }))))), showEditModal && /*#__PURE__*/_react["default"].createElement("div", {
1134
+ className: "fixed inset-0 flex items-center justify-center bg-black bg-opacity-50 z-[60] p-4"
1135
+ }, /*#__PURE__*/_react["default"].createElement("div", {
1136
+ className: "bg-white rounded-2xl shadow-xl p-8 w-full max-w-3xl max-h-[90vh] overflow-y-auto"
1137
+ }, /*#__PURE__*/_react["default"].createElement("h2", {
1138
+ className: "text-xl font-bold text-gray-800 mb-6"
1139
+ }, "Edit Form"), editFeedback && /*#__PURE__*/_react["default"].createElement("div", {
1140
+ className: "mb-4 rounded-lg border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700"
1141
+ }, editFeedback), /*#__PURE__*/_react["default"].createElement("div", {
1142
+ className: "space-y-6"
1143
+ }, /*#__PURE__*/_react["default"].createElement("div", {
1144
+ className: "grid grid-cols-1 md:grid-cols-2 gap-4"
1145
+ }, /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("label", {
1146
+ htmlFor: "editFormTitle",
1147
+ className: "block text-sm font-medium text-gray-700 mb-1"
1148
+ }, "Form Title *"), /*#__PURE__*/_react["default"].createElement("input", {
1149
+ id: "editFormTitle",
1150
+ type: "text",
1151
+ value: editDraft.formTitle,
1152
+ onChange: function onChange(e) {
1153
+ return setEditDraft(function (prev) {
1154
+ return _objectSpread(_objectSpread({}, prev), {}, {
1155
+ formTitle: e.target.value
1156
+ });
1157
+ });
1158
+ },
1159
+ className: "w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
1160
+ })), /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("label", {
1161
+ htmlFor: "editFormId",
1162
+ className: "block text-sm font-medium text-gray-700 mb-1"
1163
+ }, "Form ID *"), /*#__PURE__*/_react["default"].createElement("input", {
1164
+ id: "editFormId",
1165
+ type: "text",
1166
+ value: editDraft.formId,
1167
+ onChange: function onChange(e) {
1168
+ return setEditDraft(function (prev) {
1169
+ return _objectSpread(_objectSpread({}, prev), {}, {
1170
+ formId: e.target.value.toUpperCase()
1171
+ });
1172
+ });
1173
+ },
1174
+ className: "w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
1175
+ })), /*#__PURE__*/_react["default"].createElement("div", {
1176
+ className: "md:col-span-2"
1177
+ }, /*#__PURE__*/_react["default"].createElement("label", {
1178
+ htmlFor: "editFormName",
1179
+ className: "block text-sm font-medium text-gray-700 mb-1"
1180
+ }, "Form Name (URL slug)"), /*#__PURE__*/_react["default"].createElement("input", {
1181
+ id: "editFormName",
1182
+ type: "text",
1183
+ value: editDraft.formName,
1184
+ disabled: true,
1185
+ className: "w-full px-3 py-2 border border-gray-200 rounded-md bg-gray-50 text-gray-500"
1186
+ }), /*#__PURE__*/_react["default"].createElement("p", {
1187
+ className: "text-xs text-gray-500 mt-1"
1188
+ }, "Form name cannot be changed after creation"))), /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("label", {
1189
+ htmlFor: "editFormDescription",
1190
+ className: "block text-sm font-medium text-gray-700 mb-1"
1191
+ }, "Description (optional)"), /*#__PURE__*/_react["default"].createElement("textarea", {
1192
+ id: "editFormDescription",
1193
+ value: editDraft.description,
1194
+ onChange: function onChange(e) {
1195
+ return setEditDraft(function (prev) {
1196
+ return _objectSpread(_objectSpread({}, prev), {}, {
1197
+ description: e.target.value
1198
+ });
1199
+ });
1200
+ },
1201
+ placeholder: "Instructions or context shown at the top of the public form",
1202
+ rows: 3,
1203
+ 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, {
1205
+ addFieldFn: addEditField,
1206
+ updateFieldFn: updateEditField,
1207
+ removeFieldFn: removeEditField
1208
+ })), /*#__PURE__*/_react["default"].createElement("div", {
1209
+ className: "flex justify-end gap-4 mt-6"
1210
+ }, /*#__PURE__*/_react["default"].createElement("button", {
1211
+ type: "button",
1212
+ onClick: function onClick() {
1213
+ setShowEditModal(false);
1214
+ setEditFeedback('');
1215
+ },
1216
+ className: "bg-gray-300 text-gray-700 hover:bg-gray-400 px-4 py-2 rounded-md"
1217
+ }, "Cancel"), /*#__PURE__*/_react["default"].createElement("button", {
1218
+ type: "button",
1219
+ onClick: updateForm,
1220
+ disabled: isUpdating,
1221
+ className: "bg-blue-600 text-white hover:bg-blue-700 px-4 py-2 rounded-md disabled:opacity-50"
1222
+ }, isUpdating ? /*#__PURE__*/_react["default"].createElement("div", {
1223
+ className: "animate-spin h-5 w-5 mx-auto border-2 border-white border-t-transparent rounded-full"
1224
+ }) : 'Save Changes')))));
781
1225
  };
782
1226
  var _default = exports["default"] = PowrFormsAdmin;
@@ -176,6 +176,7 @@ var PowrForm = function PowrForm(_ref) {
176
176
  label: field.label,
177
177
  required: field.required,
178
178
  error: errors[field.name],
179
+ description: field.description,
179
180
  theme: theme
180
181
  }, /*#__PURE__*/_react["default"].createElement("input", _extends({
181
182
  type: "email"
@@ -194,6 +195,7 @@ var PowrForm = function PowrForm(_ref) {
194
195
  label: field.label,
195
196
  required: field.required,
196
197
  error: errors[field.name],
198
+ description: field.description,
197
199
  theme: theme
198
200
  }, /*#__PURE__*/_react["default"].createElement("input", _extends({
199
201
  type: "text"
@@ -208,6 +210,7 @@ var PowrForm = function PowrForm(_ref) {
208
210
  label: field.label,
209
211
  required: field.required,
210
212
  error: errors[field.name],
213
+ description: field.description,
211
214
  theme: theme
212
215
  }, /*#__PURE__*/_react["default"].createElement("input", _extends({
213
216
  type: "tel",
@@ -226,7 +229,8 @@ var PowrForm = function PowrForm(_ref) {
226
229
  return /*#__PURE__*/_react["default"].createElement(InputField, {
227
230
  key: field.name,
228
231
  label: field.label,
229
- required: field.required
232
+ required: field.required,
233
+ description: field.description
230
234
  }, /*#__PURE__*/_react["default"].createElement("textarea", _extends({}, register(field.name, {
231
235
  required: field.required
232
236
  }), {
@@ -240,6 +244,7 @@ var PowrForm = function PowrForm(_ref) {
240
244
  options: field.options || [],
241
245
  register: register,
242
246
  error: errors[field.name],
247
+ description: field.description,
243
248
  theme: theme
244
249
  });
245
250
  case "custom":
@@ -267,7 +272,9 @@ var PowrForm = function PowrForm(_ref) {
267
272
  className: "block text-base font-medium mb-1"
268
273
  }, field.label, " ", field.required && /*#__PURE__*/_react["default"].createElement("span", {
269
274
  className: "text-red-600"
270
- }, "*")), /*#__PURE__*/_react["default"].createElement("input", {
275
+ }, "*")), field.description && /*#__PURE__*/_react["default"].createElement("p", {
276
+ className: "text-sm text-gray-500 mb-2"
277
+ }, field.description), /*#__PURE__*/_react["default"].createElement("input", {
271
278
  type: "file",
272
279
  accept: "image/*,application/pdf",
273
280
  onChange: function onChange(e) {
@@ -317,7 +324,9 @@ var PowrForm = function PowrForm(_ref) {
317
324
  className: "border-b-4 ".concat(borderColor, " pb-6 mb-8")
318
325
  }, /*#__PURE__*/_react["default"].createElement("h1", {
319
326
  className: "text-3xl font-bold text-gray-800"
320
- }, formSchema.formTitle)), successMessage && /*#__PURE__*/_react["default"].createElement("div", {
327
+ }, formSchema.formTitle), formSchema.description && /*#__PURE__*/_react["default"].createElement("p", {
328
+ className: "text-gray-600 mt-3 text-base leading-relaxed"
329
+ }, formSchema.description)), successMessage && /*#__PURE__*/_react["default"].createElement("div", {
321
330
  className: "mb-8 flex flex-col items-center justify-center p-6 bg-green-50 border border-green-300 rounded-lg shadow animate-fade-in"
322
331
  }, /*#__PURE__*/_react["default"].createElement("div", {
323
332
  className: "mb-2"
@@ -368,13 +377,16 @@ var InputField = function InputField(_ref4) {
368
377
  required = _ref4.required,
369
378
  error = _ref4.error,
370
379
  children = _ref4.children,
380
+ description = _ref4.description,
371
381
  _ref4$theme = _ref4.theme,
372
382
  theme = _ref4$theme === void 0 ? "purple" : _ref4$theme;
373
383
  return /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("label", {
374
384
  className: "block text-base font-medium mb-1"
375
385
  }, label, " ", required && /*#__PURE__*/_react["default"].createElement("span", {
376
386
  className: "text-red-600"
377
- }, "*")), children, error && /*#__PURE__*/_react["default"].createElement("p", {
387
+ }, "*")), description && /*#__PURE__*/_react["default"].createElement("p", {
388
+ className: "text-sm text-gray-500 mb-2"
389
+ }, description), children, error && /*#__PURE__*/_react["default"].createElement("p", {
378
390
  className: "text-red-600 text-sm mt-1"
379
391
  }, error.message));
380
392
  };
@@ -386,13 +398,16 @@ var RadioGroup = function RadioGroup(_ref5) {
386
398
  options = _ref5.options,
387
399
  register = _ref5.register,
388
400
  error = _ref5.error,
401
+ description = _ref5.description,
389
402
  _ref5$theme = _ref5.theme,
390
403
  theme = _ref5$theme === void 0 ? "purple" : _ref5$theme;
391
404
  return /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("label", {
392
405
  className: "block text-base font-medium mb-2"
393
406
  }, label, " ", /*#__PURE__*/_react["default"].createElement("span", {
394
407
  className: "text-red-600"
395
- }, "*")), /*#__PURE__*/_react["default"].createElement("div", {
408
+ }, "*")), description && /*#__PURE__*/_react["default"].createElement("p", {
409
+ className: "text-sm text-gray-500 mb-2"
410
+ }, description), /*#__PURE__*/_react["default"].createElement("div", {
396
411
  className: "flex flex-col gap-3"
397
412
  }, options.map(function (option) {
398
413
  return /*#__PURE__*/_react["default"].createElement("label", {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "powr-sdk-web",
3
- "version": "5.6.10",
3
+ "version": "5.6.12",
4
4
  "main": "dist/index.js",
5
5
  "scripts": {
6
6
  "build": "babel src -d dist --copy-files",