powr-sdk-web 5.6.8 → 5.6.10
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/forms/admin.js +124 -71
- package/dist/forms/index.js +20 -0
- package/package.json +1 -1
package/dist/forms/admin.js
CHANGED
|
@@ -52,39 +52,43 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
|
|
|
52
52
|
_useState0 = _slicedToArray(_useState9, 2),
|
|
53
53
|
isSaving = _useState0[0],
|
|
54
54
|
setIsSaving = _useState0[1];
|
|
55
|
-
var _useState1 = (0, _react.useState)(
|
|
55
|
+
var _useState1 = (0, _react.useState)(''),
|
|
56
|
+
_useState10 = _slicedToArray(_useState1, 2),
|
|
57
|
+
createFeedback = _useState10[0],
|
|
58
|
+
setCreateFeedback = _useState10[1];
|
|
59
|
+
var _useState11 = (0, _react.useState)({
|
|
56
60
|
formTitle: '',
|
|
57
61
|
formName: '',
|
|
58
62
|
formId: '',
|
|
59
63
|
fields: []
|
|
60
64
|
}),
|
|
61
|
-
_useState10 = _slicedToArray(_useState1, 2),
|
|
62
|
-
formDraft = _useState10[0],
|
|
63
|
-
setFormDraft = _useState10[1];
|
|
64
|
-
var _useState11 = (0, _react.useState)(null),
|
|
65
65
|
_useState12 = _slicedToArray(_useState11, 2),
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
var _useState13 = (0, _react.useState)(
|
|
66
|
+
formDraft = _useState12[0],
|
|
67
|
+
setFormDraft = _useState12[1];
|
|
68
|
+
var _useState13 = (0, _react.useState)(null),
|
|
69
69
|
_useState14 = _slicedToArray(_useState13, 2),
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
var _useState15 = (0, _react.useState)(
|
|
70
|
+
selectedForm = _useState14[0],
|
|
71
|
+
setSelectedForm = _useState14[1];
|
|
72
|
+
var _useState15 = (0, _react.useState)(false),
|
|
73
73
|
_useState16 = _slicedToArray(_useState15, 2),
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
var _useState17 = (0, _react.useState)(
|
|
74
|
+
showDetailModal = _useState16[0],
|
|
75
|
+
setShowDetailModal = _useState16[1];
|
|
76
|
+
var _useState17 = (0, _react.useState)('responses'),
|
|
77
77
|
_useState18 = _slicedToArray(_useState17, 2),
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
var _useState19 = (0, _react.useState)(
|
|
78
|
+
activeTab = _useState18[0],
|
|
79
|
+
setActiveTab = _useState18[1];
|
|
80
|
+
var _useState19 = (0, _react.useState)([]),
|
|
81
81
|
_useState20 = _slicedToArray(_useState19, 2),
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
var _useState21 = (0, _react.useState)(
|
|
82
|
+
formResponses = _useState20[0],
|
|
83
|
+
setFormResponses = _useState20[1];
|
|
84
|
+
var _useState21 = (0, _react.useState)(0),
|
|
85
85
|
_useState22 = _slicedToArray(_useState21, 2),
|
|
86
|
-
|
|
87
|
-
|
|
86
|
+
responseCount = _useState22[0],
|
|
87
|
+
setResponseCount = _useState22[1];
|
|
88
|
+
var _useState23 = (0, _react.useState)(false),
|
|
89
|
+
_useState24 = _slicedToArray(_useState23, 2),
|
|
90
|
+
loadingResponses = _useState24[0],
|
|
91
|
+
setLoadingResponses = _useState24[1];
|
|
88
92
|
var fetchForms = /*#__PURE__*/function () {
|
|
89
93
|
var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
|
|
90
94
|
var _yield$apiCall, data, ok, _t;
|
|
@@ -190,6 +194,12 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
|
|
|
190
194
|
return _ref3.apply(this, arguments);
|
|
191
195
|
};
|
|
192
196
|
}();
|
|
197
|
+
var notify = function notify(type, message) {
|
|
198
|
+
setCreateFeedback(message);
|
|
199
|
+
if (onFormAction) {
|
|
200
|
+
onFormAction(type, message);
|
|
201
|
+
}
|
|
202
|
+
};
|
|
193
203
|
var resetFormDraft = function resetFormDraft() {
|
|
194
204
|
setFormDraft({
|
|
195
205
|
formTitle: '',
|
|
@@ -201,13 +211,33 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
|
|
|
201
211
|
var slugify = function slugify(value) {
|
|
202
212
|
return value.toLowerCase().trim().replace(/[^a-z0-9]+/g, '').slice(0, 32);
|
|
203
213
|
};
|
|
214
|
+
var uniqueFieldName = function uniqueFieldName(label, index, fields) {
|
|
215
|
+
var taken = fields.map(function (field) {
|
|
216
|
+
return field.name;
|
|
217
|
+
}).filter(Boolean);
|
|
218
|
+
var base = slugify(label) || "field".concat(index + 1);
|
|
219
|
+
var candidate = base;
|
|
220
|
+
var suffix = 2;
|
|
221
|
+
while (taken.includes(candidate)) {
|
|
222
|
+
candidate = "".concat(base).concat(suffix);
|
|
223
|
+
suffix += 1;
|
|
224
|
+
}
|
|
225
|
+
return candidate;
|
|
226
|
+
};
|
|
204
227
|
var addField = function addField(type) {
|
|
205
|
-
var index = formDraft.fields.length + 1;
|
|
206
228
|
setFormDraft(function (prev) {
|
|
229
|
+
var index = prev.fields.length + 1;
|
|
230
|
+
var defaults = type === 'mobile' ? {
|
|
231
|
+
name: 'whatsapp',
|
|
232
|
+
label: 'Mobile Number'
|
|
233
|
+
} : {
|
|
234
|
+
name: "field".concat(index),
|
|
235
|
+
label: "Field ".concat(index)
|
|
236
|
+
};
|
|
207
237
|
return _objectSpread(_objectSpread({}, prev), {}, {
|
|
208
|
-
fields: [].concat(_toConsumableArray(prev.fields), [_objectSpread({
|
|
209
|
-
|
|
210
|
-
|
|
238
|
+
fields: [].concat(_toConsumableArray(prev.fields), [_objectSpread(_objectSpread({
|
|
239
|
+
id: "".concat(Date.now(), "-").concat(index)
|
|
240
|
+
}, defaults), {}, {
|
|
211
241
|
type: type,
|
|
212
242
|
required: false
|
|
213
243
|
}, type === 'radio' ? {
|
|
@@ -236,17 +266,16 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
|
|
|
236
266
|
};
|
|
237
267
|
var createForm = /*#__PURE__*/function () {
|
|
238
268
|
var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() {
|
|
239
|
-
var trimmedTitle, trimmedName, trimmedId, hasInvalidField, payload, _yield$apiCall3, result, ok, errorMessage, _t3;
|
|
269
|
+
var trimmedTitle, trimmedName, trimmedId, hasInvalidField, fieldNames, duplicateNames, usedNames, normalizedFields, payload, _yield$apiCall3, result, ok, errorMessage, _t3;
|
|
240
270
|
return _regenerator().w(function (_context3) {
|
|
241
271
|
while (1) switch (_context3.p = _context3.n) {
|
|
242
272
|
case 0:
|
|
273
|
+
setCreateFeedback('');
|
|
243
274
|
if (projectId) {
|
|
244
275
|
_context3.n = 1;
|
|
245
276
|
break;
|
|
246
277
|
}
|
|
247
|
-
|
|
248
|
-
onFormAction('error', 'Project ID is required');
|
|
249
|
-
}
|
|
278
|
+
notify('error', 'Project ID is required');
|
|
250
279
|
return _context3.a(2);
|
|
251
280
|
case 1:
|
|
252
281
|
trimmedTitle = formDraft.formTitle.trim();
|
|
@@ -256,18 +285,14 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
|
|
|
256
285
|
_context3.n = 2;
|
|
257
286
|
break;
|
|
258
287
|
}
|
|
259
|
-
|
|
260
|
-
onFormAction('error', 'Form title, name, and ID are required');
|
|
261
|
-
}
|
|
288
|
+
notify('error', 'Form title, name, and ID are required');
|
|
262
289
|
return _context3.a(2);
|
|
263
290
|
case 2:
|
|
264
291
|
if (!(formDraft.fields.length === 0)) {
|
|
265
292
|
_context3.n = 3;
|
|
266
293
|
break;
|
|
267
294
|
}
|
|
268
|
-
|
|
269
|
-
onFormAction('error', 'Add at least one field');
|
|
270
|
-
}
|
|
295
|
+
notify('error', 'Add at least one field');
|
|
271
296
|
return _context3.a(2);
|
|
272
297
|
case 3:
|
|
273
298
|
hasInvalidField = formDraft.fields.some(function (field) {
|
|
@@ -278,70 +303,92 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
|
|
|
278
303
|
_context3.n = 4;
|
|
279
304
|
break;
|
|
280
305
|
}
|
|
281
|
-
|
|
282
|
-
onFormAction('error', 'Each field needs a name and label');
|
|
283
|
-
}
|
|
306
|
+
notify('error', 'Each field needs a name and label');
|
|
284
307
|
return _context3.a(2);
|
|
285
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:
|
|
286
322
|
setIsSaving(true);
|
|
287
|
-
_context3.p =
|
|
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
|
+
});
|
|
288
347
|
payload = {
|
|
289
348
|
formTitle: trimmedTitle,
|
|
290
349
|
formName: trimmedName,
|
|
291
350
|
formId: trimmedId,
|
|
292
|
-
fields:
|
|
293
|
-
return _objectSpread({
|
|
294
|
-
name: field.name.trim(),
|
|
295
|
-
label: field.label.trim(),
|
|
296
|
-
type: field.type,
|
|
297
|
-
required: !!field.required
|
|
298
|
-
}, field.type === 'radio' ? {
|
|
299
|
-
options: field.options || []
|
|
300
|
-
} : {});
|
|
301
|
-
})
|
|
351
|
+
fields: normalizedFields
|
|
302
352
|
};
|
|
303
|
-
_context3.n =
|
|
353
|
+
_context3.n = 7;
|
|
304
354
|
return (0, _auth.apiCall)(apiUrl, "/forms/create-form", projectId, {
|
|
305
355
|
method: 'POST',
|
|
306
356
|
body: payload
|
|
307
357
|
});
|
|
308
|
-
case
|
|
358
|
+
case 7:
|
|
309
359
|
_yield$apiCall3 = _context3.v;
|
|
310
360
|
result = _yield$apiCall3.data;
|
|
311
361
|
ok = _yield$apiCall3.ok;
|
|
312
362
|
if (ok) {
|
|
313
|
-
_context3.n =
|
|
363
|
+
_context3.n = 8;
|
|
314
364
|
break;
|
|
315
365
|
}
|
|
316
366
|
throw new Error(result.message || 'Failed to create form');
|
|
317
|
-
case
|
|
318
|
-
|
|
319
|
-
onFormAction('success', result.message || 'Form created successfully!');
|
|
320
|
-
}
|
|
367
|
+
case 8:
|
|
368
|
+
notify('success', result.message || 'Form created successfully!');
|
|
321
369
|
resetFormDraft();
|
|
370
|
+
setCreateFeedback('');
|
|
322
371
|
setShowCreateModal(false);
|
|
323
372
|
fetchForms();
|
|
324
373
|
if (onRefresh) {
|
|
325
374
|
onRefresh();
|
|
326
375
|
}
|
|
327
|
-
_context3.n =
|
|
376
|
+
_context3.n = 10;
|
|
328
377
|
break;
|
|
329
|
-
case
|
|
330
|
-
_context3.p =
|
|
378
|
+
case 9:
|
|
379
|
+
_context3.p = 9;
|
|
331
380
|
_t3 = _context3.v;
|
|
332
381
|
console.error('Error creating form:', _t3);
|
|
333
382
|
errorMessage = _t3 instanceof Error ? _t3.message : 'Failed to create form';
|
|
334
|
-
|
|
335
|
-
onFormAction('error', errorMessage);
|
|
336
|
-
}
|
|
337
|
-
case 9:
|
|
338
|
-
_context3.p = 9;
|
|
339
|
-
setIsSaving(false);
|
|
340
|
-
return _context3.f(9);
|
|
383
|
+
notify('error', errorMessage);
|
|
341
384
|
case 10:
|
|
385
|
+
_context3.p = 10;
|
|
386
|
+
setIsSaving(false);
|
|
387
|
+
return _context3.f(10);
|
|
388
|
+
case 11:
|
|
342
389
|
return _context3.a(2);
|
|
343
390
|
}
|
|
344
|
-
}, _callee3, null, [[
|
|
391
|
+
}, _callee3, null, [[6, 9, 10, 11]]);
|
|
345
392
|
}));
|
|
346
393
|
return function createForm() {
|
|
347
394
|
return _ref4.apply(this, arguments);
|
|
@@ -379,6 +426,7 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
|
|
|
379
426
|
}, "Create and manage your dynamic forms")), /*#__PURE__*/_react["default"].createElement("button", {
|
|
380
427
|
onClick: function onClick() {
|
|
381
428
|
resetFormDraft();
|
|
429
|
+
setCreateFeedback('');
|
|
382
430
|
setShowCreateModal(true);
|
|
383
431
|
},
|
|
384
432
|
className: "bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-lg flex items-center gap-2"
|
|
@@ -442,7 +490,9 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
|
|
|
442
490
|
className: "bg-white rounded-2xl shadow-xl p-8 w-full max-w-3xl max-h-[90vh] overflow-y-auto"
|
|
443
491
|
}, /*#__PURE__*/_react["default"].createElement("h2", {
|
|
444
492
|
className: "text-xl font-bold text-gray-800 mb-6"
|
|
445
|
-
}, "Create New Form"), /*#__PURE__*/_react["default"].createElement("div", {
|
|
493
|
+
}, "Create New Form"), createFeedback && /*#__PURE__*/_react["default"].createElement("div", {
|
|
494
|
+
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", {
|
|
446
496
|
className: "space-y-6"
|
|
447
497
|
}, /*#__PURE__*/_react["default"].createElement("div", {
|
|
448
498
|
className: "grid grid-cols-1 md:grid-cols-2 gap-4"
|
|
@@ -506,7 +556,7 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
|
|
|
506
556
|
className: "text-sm font-semibold text-gray-900"
|
|
507
557
|
}, "Fields"), /*#__PURE__*/_react["default"].createElement("div", {
|
|
508
558
|
className: "flex flex-wrap gap-2"
|
|
509
|
-
}, ['text', 'email', 'textarea', 'radio', 'fileUploader'].map(function (type) {
|
|
559
|
+
}, ['text', 'email', 'mobile', 'textarea', 'radio', 'fileUploader'].map(function (type) {
|
|
510
560
|
return /*#__PURE__*/_react["default"].createElement("button", {
|
|
511
561
|
key: type,
|
|
512
562
|
type: "button",
|
|
@@ -521,7 +571,7 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
|
|
|
521
571
|
className: "space-y-4"
|
|
522
572
|
}, formDraft.fields.map(function (field, index) {
|
|
523
573
|
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
524
|
-
key:
|
|
574
|
+
key: field.id || index,
|
|
525
575
|
className: "rounded-lg border border-gray-200 p-4 space-y-3"
|
|
526
576
|
}, /*#__PURE__*/_react["default"].createElement("div", {
|
|
527
577
|
className: "flex items-center justify-between"
|
|
@@ -581,12 +631,15 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
|
|
|
581
631
|
})))), /*#__PURE__*/_react["default"].createElement("div", {
|
|
582
632
|
className: "flex justify-end gap-4 mt-6"
|
|
583
633
|
}, /*#__PURE__*/_react["default"].createElement("button", {
|
|
634
|
+
type: "button",
|
|
584
635
|
onClick: function onClick() {
|
|
585
636
|
resetFormDraft();
|
|
637
|
+
setCreateFeedback('');
|
|
586
638
|
setShowCreateModal(false);
|
|
587
639
|
},
|
|
588
640
|
className: "bg-gray-300 text-gray-700 hover:bg-gray-400 px-4 py-2 rounded-md"
|
|
589
641
|
}, "Cancel"), /*#__PURE__*/_react["default"].createElement("button", {
|
|
642
|
+
type: "button",
|
|
590
643
|
onClick: createForm,
|
|
591
644
|
disabled: isSaving,
|
|
592
645
|
className: "bg-blue-600 text-white hover:bg-blue-700 px-4 py-2 rounded-md disabled:opacity-50"
|
package/dist/forms/index.js
CHANGED
|
@@ -202,6 +202,26 @@ var PowrForm = function PowrForm(_ref) {
|
|
|
202
202
|
}), {
|
|
203
203
|
className: inputClass
|
|
204
204
|
})));
|
|
205
|
+
case "mobile":
|
|
206
|
+
return /*#__PURE__*/_react["default"].createElement(InputField, {
|
|
207
|
+
key: field.name,
|
|
208
|
+
label: field.label,
|
|
209
|
+
required: field.required,
|
|
210
|
+
error: errors[field.name],
|
|
211
|
+
theme: theme
|
|
212
|
+
}, /*#__PURE__*/_react["default"].createElement("input", _extends({
|
|
213
|
+
type: "tel",
|
|
214
|
+
inputMode: "tel",
|
|
215
|
+
autoComplete: "tel"
|
|
216
|
+
}, register(field.name, {
|
|
217
|
+
required: field.required,
|
|
218
|
+
pattern: {
|
|
219
|
+
value: /^[0-9+\-\s()]{8,15}$/,
|
|
220
|
+
message: "Invalid mobile number"
|
|
221
|
+
}
|
|
222
|
+
}), {
|
|
223
|
+
className: inputClass
|
|
224
|
+
})));
|
|
205
225
|
case "textarea":
|
|
206
226
|
return /*#__PURE__*/_react["default"].createElement(InputField, {
|
|
207
227
|
key: field.name,
|