powr-sdk-web 5.6.7 → 5.6.9
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 +337 -87
- package/package.json +1 -1
package/dist/forms/admin.js
CHANGED
|
@@ -8,6 +8,15 @@ exports["default"] = void 0;
|
|
|
8
8
|
var _react = _interopRequireWildcard(require("react"));
|
|
9
9
|
var _auth = require("../utils/auth");
|
|
10
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); }
|
|
11
|
+
function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
|
|
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
|
+
function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
|
|
14
|
+
function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
|
|
15
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
16
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
17
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
18
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
|
19
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
11
20
|
function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
|
|
12
21
|
function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
|
|
13
22
|
function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
|
|
@@ -39,38 +48,47 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
|
|
|
39
48
|
_useState8 = _slicedToArray(_useState7, 2),
|
|
40
49
|
showCreateModal = _useState8[0],
|
|
41
50
|
setShowCreateModal = _useState8[1];
|
|
42
|
-
var _useState9 = (0, _react.useState)(
|
|
51
|
+
var _useState9 = (0, _react.useState)(false),
|
|
43
52
|
_useState0 = _slicedToArray(_useState9, 2),
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
var _useState1 = (0, _react.useState)(
|
|
53
|
+
isSaving = _useState0[0],
|
|
54
|
+
setIsSaving = _useState0[1];
|
|
55
|
+
var _useState1 = (0, _react.useState)(''),
|
|
47
56
|
_useState10 = _slicedToArray(_useState1, 2),
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
var _useState11 = (0, _react.useState)(
|
|
57
|
+
createFeedback = _useState10[0],
|
|
58
|
+
setCreateFeedback = _useState10[1];
|
|
59
|
+
var _useState11 = (0, _react.useState)({
|
|
60
|
+
formTitle: '',
|
|
61
|
+
formName: '',
|
|
62
|
+
formId: '',
|
|
63
|
+
fields: []
|
|
64
|
+
}),
|
|
51
65
|
_useState12 = _slicedToArray(_useState11, 2),
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
var _useState13 = (0, _react.useState)(
|
|
66
|
+
formDraft = _useState12[0],
|
|
67
|
+
setFormDraft = _useState12[1];
|
|
68
|
+
var _useState13 = (0, _react.useState)(null),
|
|
55
69
|
_useState14 = _slicedToArray(_useState13, 2),
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
var _useState15 = (0, _react.useState)(
|
|
70
|
+
selectedForm = _useState14[0],
|
|
71
|
+
setSelectedForm = _useState14[1];
|
|
72
|
+
var _useState15 = (0, _react.useState)(false),
|
|
59
73
|
_useState16 = _slicedToArray(_useState15, 2),
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
var _useState17 = (0, _react.useState)(
|
|
74
|
+
showDetailModal = _useState16[0],
|
|
75
|
+
setShowDetailModal = _useState16[1];
|
|
76
|
+
var _useState17 = (0, _react.useState)('responses'),
|
|
63
77
|
_useState18 = _slicedToArray(_useState17, 2),
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
var _useState19 = (0, _react.useState)(
|
|
78
|
+
activeTab = _useState18[0],
|
|
79
|
+
setActiveTab = _useState18[1];
|
|
80
|
+
var _useState19 = (0, _react.useState)([]),
|
|
67
81
|
_useState20 = _slicedToArray(_useState19, 2),
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
var _useState21 = (0, _react.useState)(
|
|
82
|
+
formResponses = _useState20[0],
|
|
83
|
+
setFormResponses = _useState20[1];
|
|
84
|
+
var _useState21 = (0, _react.useState)(0),
|
|
71
85
|
_useState22 = _slicedToArray(_useState21, 2),
|
|
72
|
-
|
|
73
|
-
|
|
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];
|
|
74
92
|
var fetchForms = /*#__PURE__*/function () {
|
|
75
93
|
var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
|
|
76
94
|
var _yield$apiCall, data, ok, _t;
|
|
@@ -176,86 +194,185 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
|
|
|
176
194
|
return _ref3.apply(this, arguments);
|
|
177
195
|
};
|
|
178
196
|
}();
|
|
197
|
+
var notify = function notify(type, message) {
|
|
198
|
+
setCreateFeedback(message);
|
|
199
|
+
if (onFormAction) {
|
|
200
|
+
onFormAction(type, message);
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
var resetFormDraft = function resetFormDraft() {
|
|
204
|
+
setFormDraft({
|
|
205
|
+
formTitle: '',
|
|
206
|
+
formName: '',
|
|
207
|
+
formId: '',
|
|
208
|
+
fields: []
|
|
209
|
+
});
|
|
210
|
+
};
|
|
211
|
+
var slugify = function slugify(value) {
|
|
212
|
+
return value.toLowerCase().trim().replace(/[^a-z0-9]+/g, '').slice(0, 32);
|
|
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
|
+
};
|
|
227
|
+
var addField = function addField(type) {
|
|
228
|
+
var index = formDraft.fields.length + 1;
|
|
229
|
+
setFormDraft(function (prev) {
|
|
230
|
+
return _objectSpread(_objectSpread({}, prev), {}, {
|
|
231
|
+
fields: [].concat(_toConsumableArray(prev.fields), [_objectSpread({
|
|
232
|
+
name: "field".concat(index),
|
|
233
|
+
label: "Field ".concat(index),
|
|
234
|
+
type: type,
|
|
235
|
+
required: false
|
|
236
|
+
}, type === 'radio' ? {
|
|
237
|
+
options: ['Option 1', 'Option 2']
|
|
238
|
+
} : {})])
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
};
|
|
242
|
+
var updateField = function updateField(index, updates) {
|
|
243
|
+
setFormDraft(function (prev) {
|
|
244
|
+
return _objectSpread(_objectSpread({}, prev), {}, {
|
|
245
|
+
fields: prev.fields.map(function (field, i) {
|
|
246
|
+
return i === index ? _objectSpread(_objectSpread({}, field), updates) : field;
|
|
247
|
+
})
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
};
|
|
251
|
+
var removeField = function removeField(index) {
|
|
252
|
+
setFormDraft(function (prev) {
|
|
253
|
+
return _objectSpread(_objectSpread({}, prev), {}, {
|
|
254
|
+
fields: prev.fields.filter(function (_, i) {
|
|
255
|
+
return i !== index;
|
|
256
|
+
})
|
|
257
|
+
});
|
|
258
|
+
});
|
|
259
|
+
};
|
|
179
260
|
var createForm = /*#__PURE__*/function () {
|
|
180
261
|
var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() {
|
|
181
|
-
var
|
|
262
|
+
var trimmedTitle, trimmedName, trimmedId, hasInvalidField, fieldNames, duplicateNames, payload, _yield$apiCall3, result, ok, errorMessage, _t3;
|
|
182
263
|
return _regenerator().w(function (_context3) {
|
|
183
264
|
while (1) switch (_context3.p = _context3.n) {
|
|
184
265
|
case 0:
|
|
185
|
-
|
|
266
|
+
setCreateFeedback('');
|
|
267
|
+
if (projectId) {
|
|
186
268
|
_context3.n = 1;
|
|
187
269
|
break;
|
|
188
270
|
}
|
|
189
|
-
|
|
190
|
-
onFormAction('error', 'Please select a JSON file to upload');
|
|
191
|
-
}
|
|
271
|
+
notify('error', 'Project ID is required');
|
|
192
272
|
return _context3.a(2);
|
|
193
273
|
case 1:
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
274
|
+
trimmedTitle = formDraft.formTitle.trim();
|
|
275
|
+
trimmedName = formDraft.formName.trim();
|
|
276
|
+
trimmedId = formDraft.formId.trim();
|
|
277
|
+
if (!(!trimmedTitle || !trimmedName || !trimmedId)) {
|
|
278
|
+
_context3.n = 2;
|
|
279
|
+
break;
|
|
280
|
+
}
|
|
281
|
+
notify('error', 'Form title, name, and ID are required');
|
|
282
|
+
return _context3.a(2);
|
|
283
|
+
case 2:
|
|
284
|
+
if (!(formDraft.fields.length === 0)) {
|
|
285
|
+
_context3.n = 3;
|
|
286
|
+
break;
|
|
287
|
+
}
|
|
288
|
+
notify('error', 'Add at least one field');
|
|
289
|
+
return _context3.a(2);
|
|
290
|
+
case 3:
|
|
291
|
+
hasInvalidField = formDraft.fields.some(function (field) {
|
|
292
|
+
var _field$name, _field$label;
|
|
293
|
+
return !((_field$name = field.name) !== null && _field$name !== void 0 && _field$name.trim()) || !((_field$label = field.label) !== null && _field$label !== void 0 && _field$label.trim());
|
|
294
|
+
});
|
|
295
|
+
if (!hasInvalidField) {
|
|
296
|
+
_context3.n = 4;
|
|
297
|
+
break;
|
|
298
|
+
}
|
|
299
|
+
notify('error', 'Each field needs a name and label');
|
|
300
|
+
return _context3.a(2);
|
|
301
|
+
case 4:
|
|
302
|
+
fieldNames = formDraft.fields.map(function (field) {
|
|
303
|
+
return field.name.trim();
|
|
304
|
+
});
|
|
305
|
+
duplicateNames = fieldNames.filter(function (name, index) {
|
|
306
|
+
return fieldNames.indexOf(name) !== index;
|
|
307
|
+
});
|
|
308
|
+
if (!(duplicateNames.length > 0)) {
|
|
309
|
+
_context3.n = 5;
|
|
310
|
+
break;
|
|
311
|
+
}
|
|
312
|
+
notify('error', "Each field needs a unique name. Duplicate: ".concat(_toConsumableArray(new Set(duplicateNames)).join(', ')));
|
|
313
|
+
return _context3.a(2);
|
|
314
|
+
case 5:
|
|
315
|
+
setIsSaving(true);
|
|
316
|
+
_context3.p = 6;
|
|
317
|
+
payload = {
|
|
318
|
+
formTitle: trimmedTitle,
|
|
319
|
+
formName: trimmedName,
|
|
320
|
+
formId: trimmedId,
|
|
321
|
+
fields: formDraft.fields.map(function (field) {
|
|
322
|
+
return _objectSpread({
|
|
323
|
+
name: field.name.trim(),
|
|
324
|
+
label: field.label.trim(),
|
|
325
|
+
type: field.type,
|
|
326
|
+
required: !!field.required
|
|
327
|
+
}, field.type === 'radio' ? {
|
|
328
|
+
options: field.options || []
|
|
329
|
+
} : {});
|
|
330
|
+
})
|
|
331
|
+
};
|
|
332
|
+
_context3.n = 7;
|
|
199
333
|
return (0, _auth.apiCall)(apiUrl, "/forms/create-form", projectId, {
|
|
200
334
|
method: 'POST',
|
|
201
|
-
body:
|
|
335
|
+
body: payload
|
|
202
336
|
});
|
|
203
|
-
case
|
|
337
|
+
case 7:
|
|
204
338
|
_yield$apiCall3 = _context3.v;
|
|
205
339
|
result = _yield$apiCall3.data;
|
|
206
340
|
ok = _yield$apiCall3.ok;
|
|
207
341
|
if (ok) {
|
|
208
|
-
_context3.n =
|
|
342
|
+
_context3.n = 8;
|
|
209
343
|
break;
|
|
210
344
|
}
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
}
|
|
217
|
-
setSelectedFile(null);
|
|
345
|
+
throw new Error(result.message || 'Failed to create form');
|
|
346
|
+
case 8:
|
|
347
|
+
notify('success', result.message || 'Form created successfully!');
|
|
348
|
+
resetFormDraft();
|
|
349
|
+
setCreateFeedback('');
|
|
218
350
|
setShowCreateModal(false);
|
|
219
351
|
fetchForms();
|
|
220
352
|
if (onRefresh) {
|
|
221
353
|
onRefresh();
|
|
222
354
|
}
|
|
223
|
-
_context3.n =
|
|
355
|
+
_context3.n = 10;
|
|
224
356
|
break;
|
|
225
|
-
case
|
|
226
|
-
_context3.p =
|
|
357
|
+
case 9:
|
|
358
|
+
_context3.p = 9;
|
|
227
359
|
_t3 = _context3.v;
|
|
228
360
|
console.error('Error creating form:', _t3);
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
case
|
|
236
|
-
_context3.p = 6;
|
|
237
|
-
setIsUploading(false);
|
|
238
|
-
return _context3.f(6);
|
|
239
|
-
case 7:
|
|
361
|
+
errorMessage = _t3 instanceof Error ? _t3.message : 'Failed to create form';
|
|
362
|
+
notify('error', errorMessage);
|
|
363
|
+
case 10:
|
|
364
|
+
_context3.p = 10;
|
|
365
|
+
setIsSaving(false);
|
|
366
|
+
return _context3.f(10);
|
|
367
|
+
case 11:
|
|
240
368
|
return _context3.a(2);
|
|
241
369
|
}
|
|
242
|
-
}, _callee3, null, [[
|
|
370
|
+
}, _callee3, null, [[6, 9, 10, 11]]);
|
|
243
371
|
}));
|
|
244
372
|
return function createForm() {
|
|
245
373
|
return _ref4.apply(this, arguments);
|
|
246
374
|
};
|
|
247
375
|
}();
|
|
248
|
-
var handleFileChange = function handleFileChange(e) {
|
|
249
|
-
var _e$target$files;
|
|
250
|
-
var file = (_e$target$files = e.target.files) === null || _e$target$files === void 0 ? void 0 : _e$target$files[0];
|
|
251
|
-
if (file && file.type === 'application/json') {
|
|
252
|
-
setSelectedFile(file);
|
|
253
|
-
} else {
|
|
254
|
-
if (onFormAction) {
|
|
255
|
-
onFormAction('error', 'Please select a valid JSON file');
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
};
|
|
259
376
|
var handleViewForm = function handleViewForm(form) {
|
|
260
377
|
setSelectedForm(form);
|
|
261
378
|
setActiveTab('responses');
|
|
@@ -287,7 +404,9 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
|
|
|
287
404
|
className: "text-gray-600 mt-1"
|
|
288
405
|
}, "Create and manage your dynamic forms")), /*#__PURE__*/_react["default"].createElement("button", {
|
|
289
406
|
onClick: function onClick() {
|
|
290
|
-
|
|
407
|
+
resetFormDraft();
|
|
408
|
+
setCreateFeedback('');
|
|
409
|
+
setShowCreateModal(true);
|
|
291
410
|
},
|
|
292
411
|
className: "bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-lg flex items-center gap-2"
|
|
293
412
|
}, /*#__PURE__*/_react["default"].createElement("svg", {
|
|
@@ -345,38 +464,169 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
|
|
|
345
464
|
className: "text-sm text-gray-500"
|
|
346
465
|
}, ((_form$fields = form.fields) === null || _form$fields === void 0 ? void 0 : _form$fields.length) || 0, " fields"));
|
|
347
466
|
})))), showCreateModal && /*#__PURE__*/_react["default"].createElement("div", {
|
|
348
|
-
className: "fixed inset-0 flex items-center justify-center bg-black bg-opacity-50 z-50"
|
|
467
|
+
className: "fixed inset-0 flex items-center justify-center bg-black bg-opacity-50 z-50 p-4"
|
|
349
468
|
}, /*#__PURE__*/_react["default"].createElement("div", {
|
|
350
|
-
className: "bg-white rounded-2xl shadow-xl p-8 w-full max-w-
|
|
469
|
+
className: "bg-white rounded-2xl shadow-xl p-8 w-full max-w-3xl max-h-[90vh] overflow-y-auto"
|
|
351
470
|
}, /*#__PURE__*/_react["default"].createElement("h2", {
|
|
352
471
|
className: "text-xl font-bold text-gray-800 mb-6"
|
|
353
|
-
}, "Create New Form"), /*#__PURE__*/_react["default"].createElement("div", {
|
|
354
|
-
className: "
|
|
472
|
+
}, "Create New Form"), createFeedback && /*#__PURE__*/_react["default"].createElement("div", {
|
|
473
|
+
className: "mb-4 rounded-lg border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700"
|
|
474
|
+
}, createFeedback), /*#__PURE__*/_react["default"].createElement("div", {
|
|
475
|
+
className: "space-y-6"
|
|
476
|
+
}, /*#__PURE__*/_react["default"].createElement("div", {
|
|
477
|
+
className: "grid grid-cols-1 md:grid-cols-2 gap-4"
|
|
355
478
|
}, /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("label", {
|
|
356
|
-
htmlFor: "
|
|
479
|
+
htmlFor: "formTitle",
|
|
357
480
|
className: "block text-sm font-medium text-gray-700 mb-1"
|
|
358
|
-
}, "
|
|
359
|
-
id: "
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
481
|
+
}, "Form Title *"), /*#__PURE__*/_react["default"].createElement("input", {
|
|
482
|
+
id: "formTitle",
|
|
483
|
+
type: "text",
|
|
484
|
+
value: formDraft.formTitle,
|
|
485
|
+
onChange: function onChange(e) {
|
|
486
|
+
var formTitle = e.target.value;
|
|
487
|
+
setFormDraft(function (prev) {
|
|
488
|
+
return _objectSpread(_objectSpread({}, prev), {}, {
|
|
489
|
+
formTitle: formTitle,
|
|
490
|
+
formName: prev.formName || slugify(formTitle)
|
|
491
|
+
});
|
|
492
|
+
});
|
|
493
|
+
},
|
|
494
|
+
placeholder: "Genkit Workshop Registration",
|
|
495
|
+
className: "w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
|
|
496
|
+
})), /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("label", {
|
|
497
|
+
htmlFor: "formId",
|
|
498
|
+
className: "block text-sm font-medium text-gray-700 mb-1"
|
|
499
|
+
}, "Form ID *"), /*#__PURE__*/_react["default"].createElement("input", {
|
|
500
|
+
id: "formId",
|
|
501
|
+
type: "text",
|
|
502
|
+
value: formDraft.formId,
|
|
503
|
+
onChange: function onChange(e) {
|
|
504
|
+
return setFormDraft(function (prev) {
|
|
505
|
+
return _objectSpread(_objectSpread({}, prev), {}, {
|
|
506
|
+
formId: e.target.value.toUpperCase()
|
|
507
|
+
});
|
|
508
|
+
});
|
|
509
|
+
},
|
|
510
|
+
placeholder: "KHA2025A2",
|
|
511
|
+
className: "w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
|
|
512
|
+
})), /*#__PURE__*/_react["default"].createElement("div", {
|
|
513
|
+
className: "md:col-span-2"
|
|
514
|
+
}, /*#__PURE__*/_react["default"].createElement("label", {
|
|
515
|
+
htmlFor: "formName",
|
|
516
|
+
className: "block text-sm font-medium text-gray-700 mb-1"
|
|
517
|
+
}, "Form Name (URL slug) *"), /*#__PURE__*/_react["default"].createElement("input", {
|
|
518
|
+
id: "formName",
|
|
519
|
+
type: "text",
|
|
520
|
+
value: formDraft.formName,
|
|
521
|
+
onChange: function onChange(e) {
|
|
522
|
+
return setFormDraft(function (prev) {
|
|
523
|
+
return _objectSpread(_objectSpread({}, prev), {}, {
|
|
524
|
+
formName: slugify(e.target.value)
|
|
525
|
+
});
|
|
526
|
+
});
|
|
527
|
+
},
|
|
528
|
+
placeholder: "workshopform",
|
|
365
529
|
className: "w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
|
|
366
530
|
}), /*#__PURE__*/_react["default"].createElement("p", {
|
|
367
531
|
className: "text-xs text-gray-500 mt-1"
|
|
368
|
-
}, "
|
|
532
|
+
}, "Used in URLs like `/forms?id=workshopform`"))), /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("div", {
|
|
533
|
+
className: "flex items-center justify-between mb-3"
|
|
534
|
+
}, /*#__PURE__*/_react["default"].createElement("h3", {
|
|
535
|
+
className: "text-sm font-semibold text-gray-900"
|
|
536
|
+
}, "Fields"), /*#__PURE__*/_react["default"].createElement("div", {
|
|
537
|
+
className: "flex flex-wrap gap-2"
|
|
538
|
+
}, ['text', 'email', 'textarea', 'radio', 'fileUploader'].map(function (type) {
|
|
539
|
+
return /*#__PURE__*/_react["default"].createElement("button", {
|
|
540
|
+
key: type,
|
|
541
|
+
type: "button",
|
|
542
|
+
onClick: function onClick() {
|
|
543
|
+
return addField(type);
|
|
544
|
+
},
|
|
545
|
+
className: "px-3 py-1 text-xs rounded-full border border-gray-300 hover:bg-gray-50"
|
|
546
|
+
}, "+ ", type);
|
|
547
|
+
}))), formDraft.fields.length === 0 ? /*#__PURE__*/_react["default"].createElement("div", {
|
|
548
|
+
className: "rounded-lg border border-dashed border-gray-300 p-6 text-center text-sm text-gray-500"
|
|
549
|
+
}, "Add fields using the buttons above") : /*#__PURE__*/_react["default"].createElement("div", {
|
|
550
|
+
className: "space-y-4"
|
|
551
|
+
}, formDraft.fields.map(function (field, index) {
|
|
552
|
+
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
553
|
+
key: "".concat(field.name, "-").concat(index),
|
|
554
|
+
className: "rounded-lg border border-gray-200 p-4 space-y-3"
|
|
555
|
+
}, /*#__PURE__*/_react["default"].createElement("div", {
|
|
556
|
+
className: "flex items-center justify-between"
|
|
557
|
+
}, /*#__PURE__*/_react["default"].createElement("span", {
|
|
558
|
+
className: "text-sm font-medium text-gray-700 capitalize"
|
|
559
|
+
}, field.type, " field"), /*#__PURE__*/_react["default"].createElement("button", {
|
|
560
|
+
type: "button",
|
|
561
|
+
onClick: function onClick() {
|
|
562
|
+
return removeField(index);
|
|
563
|
+
},
|
|
564
|
+
className: "text-sm text-red-600 hover:text-red-700"
|
|
565
|
+
}, "Remove")), /*#__PURE__*/_react["default"].createElement("div", {
|
|
566
|
+
className: "grid grid-cols-1 md:grid-cols-2 gap-3"
|
|
567
|
+
}, /*#__PURE__*/_react["default"].createElement("input", {
|
|
568
|
+
type: "text",
|
|
569
|
+
value: field.label,
|
|
570
|
+
onChange: function onChange(e) {
|
|
571
|
+
var label = e.target.value;
|
|
572
|
+
updateField(index, {
|
|
573
|
+
label: label,
|
|
574
|
+
name: uniqueFieldName(label, index, formDraft.fields.filter(function (_, i) {
|
|
575
|
+
return i !== index;
|
|
576
|
+
}))
|
|
577
|
+
});
|
|
578
|
+
},
|
|
579
|
+
placeholder: "Label",
|
|
580
|
+
className: "w-full px-3 py-2 border border-gray-300 rounded-md"
|
|
581
|
+
}), /*#__PURE__*/_react["default"].createElement("input", {
|
|
582
|
+
type: "text",
|
|
583
|
+
value: field.name,
|
|
584
|
+
onChange: function onChange(e) {
|
|
585
|
+
return updateField(index, {
|
|
586
|
+
name: slugify(e.target.value)
|
|
587
|
+
});
|
|
588
|
+
},
|
|
589
|
+
placeholder: "name",
|
|
590
|
+
className: "w-full px-3 py-2 border border-gray-300 rounded-md"
|
|
591
|
+
})), /*#__PURE__*/_react["default"].createElement("label", {
|
|
592
|
+
className: "flex items-center gap-2 text-sm text-gray-700"
|
|
593
|
+
}, /*#__PURE__*/_react["default"].createElement("input", {
|
|
594
|
+
type: "checkbox",
|
|
595
|
+
checked: !!field.required,
|
|
596
|
+
onChange: function onChange(e) {
|
|
597
|
+
return updateField(index, {
|
|
598
|
+
required: e.target.checked
|
|
599
|
+
});
|
|
600
|
+
}
|
|
601
|
+
}), "Required"), field.type === 'radio' && /*#__PURE__*/_react["default"].createElement("textarea", {
|
|
602
|
+
value: (field.options || []).join('\n'),
|
|
603
|
+
onChange: function onChange(e) {
|
|
604
|
+
return updateField(index, {
|
|
605
|
+
options: e.target.value.split('\n').map(function (option) {
|
|
606
|
+
return option.trim();
|
|
607
|
+
}).filter(Boolean)
|
|
608
|
+
});
|
|
609
|
+
},
|
|
610
|
+
placeholder: "One option per line",
|
|
611
|
+
rows: 3,
|
|
612
|
+
className: "w-full px-3 py-2 border border-gray-300 rounded-md"
|
|
613
|
+
}));
|
|
614
|
+
})))), /*#__PURE__*/_react["default"].createElement("div", {
|
|
369
615
|
className: "flex justify-end gap-4 mt-6"
|
|
370
616
|
}, /*#__PURE__*/_react["default"].createElement("button", {
|
|
617
|
+
type: "button",
|
|
371
618
|
onClick: function onClick() {
|
|
372
|
-
|
|
619
|
+
resetFormDraft();
|
|
620
|
+
setCreateFeedback('');
|
|
621
|
+
setShowCreateModal(false);
|
|
373
622
|
},
|
|
374
623
|
className: "bg-gray-300 text-gray-700 hover:bg-gray-400 px-4 py-2 rounded-md"
|
|
375
624
|
}, "Cancel"), /*#__PURE__*/_react["default"].createElement("button", {
|
|
625
|
+
type: "button",
|
|
376
626
|
onClick: createForm,
|
|
377
|
-
disabled:
|
|
627
|
+
disabled: isSaving,
|
|
378
628
|
className: "bg-blue-600 text-white hover:bg-blue-700 px-4 py-2 rounded-md disabled:opacity-50"
|
|
379
|
-
},
|
|
629
|
+
}, isSaving ? /*#__PURE__*/_react["default"].createElement("div", {
|
|
380
630
|
className: "animate-spin h-5 w-5 mx-auto border-2 border-white border-t-transparent rounded-full"
|
|
381
631
|
}) : 'Create Form')))), showDetailModal && selectedForm && /*#__PURE__*/_react["default"].createElement("div", {
|
|
382
632
|
className: "fixed inset-0 flex items-center justify-center bg-black bg-opacity-50 z-50"
|