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.
- package/dist/admin/index.js +3 -0
- package/dist/forms/admin.js +648 -204
- package/dist/forms/index.js +20 -5
- package/package.json +1 -1
package/dist/admin/index.js
CHANGED
|
@@ -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;
|
package/dist/forms/admin.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
75
|
-
|
|
76
|
-
var _useState17 = (0, _react.useState)(
|
|
76
|
+
formDraft = _useState16[0],
|
|
77
|
+
setFormDraft = _useState16[1];
|
|
78
|
+
var _useState17 = (0, _react.useState)(false),
|
|
77
79
|
_useState18 = _slicedToArray(_useState17, 2),
|
|
78
|
-
|
|
79
|
-
|
|
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
|
-
|
|
83
|
-
|
|
84
|
-
var _useState21 = (0, _react.useState)(
|
|
90
|
+
editDraft = _useState20[0],
|
|
91
|
+
setEditDraft = _useState20[1];
|
|
92
|
+
var _useState21 = (0, _react.useState)(''),
|
|
85
93
|
_useState22 = _slicedToArray(_useState21, 2),
|
|
86
|
-
|
|
87
|
-
|
|
94
|
+
editFeedback = _useState22[0],
|
|
95
|
+
setEditFeedback = _useState22[1];
|
|
88
96
|
var _useState23 = (0, _react.useState)(false),
|
|
89
97
|
_useState24 = _slicedToArray(_useState23, 2),
|
|
90
|
-
|
|
91
|
-
|
|
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
|
|
269
|
-
var
|
|
270
|
-
return _regenerator().w(function (
|
|
271
|
-
while (1) switch (
|
|
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
|
-
|
|
511
|
+
_context4.n = 1;
|
|
276
512
|
break;
|
|
277
513
|
}
|
|
278
514
|
notify('error', 'Project ID is required');
|
|
279
|
-
return
|
|
515
|
+
return _context4.a(2);
|
|
280
516
|
case 1:
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
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',
|
|
289
|
-
return
|
|
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
|
-
|
|
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
|
-
|
|
528
|
+
formTitle: validation.trimmedTitle,
|
|
529
|
+
formName: validation.trimmedName,
|
|
530
|
+
formId: validation.trimmedId,
|
|
531
|
+
description: formDraft.description.trim(),
|
|
532
|
+
fields: validation.normalizedFields
|
|
352
533
|
};
|
|
353
|
-
|
|
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
|
|
359
|
-
_yield$apiCall3 =
|
|
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
|
-
|
|
544
|
+
_context4.n = 5;
|
|
364
545
|
break;
|
|
365
546
|
}
|
|
366
547
|
throw new Error(result.message || 'Failed to create form');
|
|
367
|
-
case
|
|
548
|
+
case 5:
|
|
368
549
|
notify('success', result.message || 'Form created successfully!');
|
|
369
|
-
|
|
370
|
-
setCreateFeedback('');
|
|
371
|
-
setShowCreateModal(false);
|
|
550
|
+
setCreatedFormLink(getFormPublicUrl(validation.trimmedName));
|
|
372
551
|
fetchForms();
|
|
373
552
|
if (onRefresh) {
|
|
374
553
|
onRefresh();
|
|
375
554
|
}
|
|
376
|
-
|
|
555
|
+
_context4.n = 7;
|
|
377
556
|
break;
|
|
378
|
-
case
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
console.error('Error creating form:',
|
|
382
|
-
errorMessage =
|
|
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
|
|
385
|
-
|
|
563
|
+
case 7:
|
|
564
|
+
_context4.p = 7;
|
|
386
565
|
setIsSaving(false);
|
|
387
|
-
return
|
|
388
|
-
case
|
|
389
|
-
return
|
|
566
|
+
return _context4.f(7);
|
|
567
|
+
case 8:
|
|
568
|
+
return _context4.a(2);
|
|
390
569
|
}
|
|
391
|
-
},
|
|
570
|
+
}, _callee4, null, [[3, 6, 7, 8]]);
|
|
392
571
|
}));
|
|
393
572
|
return function createForm() {
|
|
394
|
-
return
|
|
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)
|
|
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`")
|
|
554
|
-
className: "
|
|
555
|
-
}, /*#__PURE__*/_react["default"].createElement("
|
|
556
|
-
className: "text-
|
|
557
|
-
}, "
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
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
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
}))
|
|
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("
|
|
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))
|
|
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;
|
package/dist/forms/index.js
CHANGED
|
@@ -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("
|
|
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)
|
|
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
|
-
}, "*")),
|
|
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("
|
|
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", {
|