powr-sdk-web 5.6.7 → 5.6.8

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.
Files changed (2) hide show
  1. package/dist/forms/admin.js +275 -61
  2. package/package.json +1 -1
@@ -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,14 +48,19 @@ 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)(null),
51
+ var _useState9 = (0, _react.useState)(false),
43
52
  _useState0 = _slicedToArray(_useState9, 2),
44
- selectedFile = _useState0[0],
45
- setSelectedFile = _useState0[1];
46
- var _useState1 = (0, _react.useState)(false),
53
+ isSaving = _useState0[0],
54
+ setIsSaving = _useState0[1];
55
+ var _useState1 = (0, _react.useState)({
56
+ formTitle: '',
57
+ formName: '',
58
+ formId: '',
59
+ fields: []
60
+ }),
47
61
  _useState10 = _slicedToArray(_useState1, 2),
48
- isUploading = _useState10[0],
49
- setIsUploading = _useState10[1];
62
+ formDraft = _useState10[0],
63
+ setFormDraft = _useState10[1];
50
64
  var _useState11 = (0, _react.useState)(null),
51
65
  _useState12 = _slicedToArray(_useState11, 2),
52
66
  selectedForm = _useState12[0],
@@ -176,86 +190,163 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
176
190
  return _ref3.apply(this, arguments);
177
191
  };
178
192
  }();
193
+ var resetFormDraft = function resetFormDraft() {
194
+ setFormDraft({
195
+ formTitle: '',
196
+ formName: '',
197
+ formId: '',
198
+ fields: []
199
+ });
200
+ };
201
+ var slugify = function slugify(value) {
202
+ return value.toLowerCase().trim().replace(/[^a-z0-9]+/g, '').slice(0, 32);
203
+ };
204
+ var addField = function addField(type) {
205
+ var index = formDraft.fields.length + 1;
206
+ setFormDraft(function (prev) {
207
+ return _objectSpread(_objectSpread({}, prev), {}, {
208
+ fields: [].concat(_toConsumableArray(prev.fields), [_objectSpread({
209
+ name: "field".concat(index),
210
+ label: "Field ".concat(index),
211
+ type: type,
212
+ required: false
213
+ }, type === 'radio' ? {
214
+ options: ['Option 1', 'Option 2']
215
+ } : {})])
216
+ });
217
+ });
218
+ };
219
+ var updateField = function updateField(index, updates) {
220
+ setFormDraft(function (prev) {
221
+ return _objectSpread(_objectSpread({}, prev), {}, {
222
+ fields: prev.fields.map(function (field, i) {
223
+ return i === index ? _objectSpread(_objectSpread({}, field), updates) : field;
224
+ })
225
+ });
226
+ });
227
+ };
228
+ var removeField = function removeField(index) {
229
+ setFormDraft(function (prev) {
230
+ return _objectSpread(_objectSpread({}, prev), {}, {
231
+ fields: prev.fields.filter(function (_, i) {
232
+ return i !== index;
233
+ })
234
+ });
235
+ });
236
+ };
179
237
  var createForm = /*#__PURE__*/function () {
180
238
  var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() {
181
- var formData, _yield$apiCall3, result, ok, errorMessage, _errorMessage, _t3;
239
+ var trimmedTitle, trimmedName, trimmedId, hasInvalidField, payload, _yield$apiCall3, result, ok, errorMessage, _t3;
182
240
  return _regenerator().w(function (_context3) {
183
241
  while (1) switch (_context3.p = _context3.n) {
184
242
  case 0:
185
- if (!(!projectId || !selectedFile)) {
243
+ if (projectId) {
186
244
  _context3.n = 1;
187
245
  break;
188
246
  }
189
247
  if (onFormAction) {
190
- onFormAction('error', 'Please select a JSON file to upload');
248
+ onFormAction('error', 'Project ID is required');
191
249
  }
192
250
  return _context3.a(2);
193
251
  case 1:
194
- setIsUploading(true);
195
- _context3.p = 2;
196
- formData = new FormData();
197
- formData.append('jsonFile', selectedFile);
198
- _context3.n = 3;
252
+ trimmedTitle = formDraft.formTitle.trim();
253
+ trimmedName = formDraft.formName.trim();
254
+ trimmedId = formDraft.formId.trim();
255
+ if (!(!trimmedTitle || !trimmedName || !trimmedId)) {
256
+ _context3.n = 2;
257
+ break;
258
+ }
259
+ if (onFormAction) {
260
+ onFormAction('error', 'Form title, name, and ID are required');
261
+ }
262
+ return _context3.a(2);
263
+ case 2:
264
+ if (!(formDraft.fields.length === 0)) {
265
+ _context3.n = 3;
266
+ break;
267
+ }
268
+ if (onFormAction) {
269
+ onFormAction('error', 'Add at least one field');
270
+ }
271
+ return _context3.a(2);
272
+ case 3:
273
+ hasInvalidField = formDraft.fields.some(function (field) {
274
+ var _field$name, _field$label;
275
+ 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());
276
+ });
277
+ if (!hasInvalidField) {
278
+ _context3.n = 4;
279
+ break;
280
+ }
281
+ if (onFormAction) {
282
+ onFormAction('error', 'Each field needs a name and label');
283
+ }
284
+ return _context3.a(2);
285
+ case 4:
286
+ setIsSaving(true);
287
+ _context3.p = 5;
288
+ payload = {
289
+ formTitle: trimmedTitle,
290
+ formName: trimmedName,
291
+ formId: trimmedId,
292
+ fields: formDraft.fields.map(function (field) {
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
+ })
302
+ };
303
+ _context3.n = 6;
199
304
  return (0, _auth.apiCall)(apiUrl, "/forms/create-form", projectId, {
200
305
  method: 'POST',
201
- body: formData
306
+ body: payload
202
307
  });
203
- case 3:
308
+ case 6:
204
309
  _yield$apiCall3 = _context3.v;
205
310
  result = _yield$apiCall3.data;
206
311
  ok = _yield$apiCall3.ok;
207
312
  if (ok) {
208
- _context3.n = 4;
313
+ _context3.n = 7;
209
314
  break;
210
315
  }
211
- errorMessage = result.message || 'Failed to create form';
212
- throw new Error(errorMessage);
213
- case 4:
316
+ throw new Error(result.message || 'Failed to create form');
317
+ case 7:
214
318
  if (onFormAction) {
215
319
  onFormAction('success', result.message || 'Form created successfully!');
216
320
  }
217
- setSelectedFile(null);
321
+ resetFormDraft();
218
322
  setShowCreateModal(false);
219
323
  fetchForms();
220
324
  if (onRefresh) {
221
325
  onRefresh();
222
326
  }
223
- _context3.n = 6;
327
+ _context3.n = 9;
224
328
  break;
225
- case 5:
226
- _context3.p = 5;
329
+ case 8:
330
+ _context3.p = 8;
227
331
  _t3 = _context3.v;
228
332
  console.error('Error creating form:', _t3);
229
- _errorMessage = _t3 instanceof Error ? _t3.message : 'Failed to create form';
333
+ errorMessage = _t3 instanceof Error ? _t3.message : 'Failed to create form';
230
334
  if (onFormAction) {
231
- onFormAction('error', _errorMessage);
335
+ onFormAction('error', errorMessage);
232
336
  }
233
- setSelectedFile(null);
234
- setShowCreateModal(false);
235
- case 6:
236
- _context3.p = 6;
237
- setIsUploading(false);
238
- return _context3.f(6);
239
- case 7:
337
+ case 9:
338
+ _context3.p = 9;
339
+ setIsSaving(false);
340
+ return _context3.f(9);
341
+ case 10:
240
342
  return _context3.a(2);
241
343
  }
242
- }, _callee3, null, [[2, 5, 6, 7]]);
344
+ }, _callee3, null, [[5, 8, 9, 10]]);
243
345
  }));
244
346
  return function createForm() {
245
347
  return _ref4.apply(this, arguments);
246
348
  };
247
349
  }();
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
350
  var handleViewForm = function handleViewForm(form) {
260
351
  setSelectedForm(form);
261
352
  setActiveTab('responses');
@@ -287,7 +378,8 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
287
378
  className: "text-gray-600 mt-1"
288
379
  }, "Create and manage your dynamic forms")), /*#__PURE__*/_react["default"].createElement("button", {
289
380
  onClick: function onClick() {
290
- return setShowCreateModal(true);
381
+ resetFormDraft();
382
+ setShowCreateModal(true);
291
383
  },
292
384
  className: "bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-lg flex items-center gap-2"
293
385
  }, /*#__PURE__*/_react["default"].createElement("svg", {
@@ -345,38 +437,160 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
345
437
  className: "text-sm text-gray-500"
346
438
  }, ((_form$fields = form.fields) === null || _form$fields === void 0 ? void 0 : _form$fields.length) || 0, " fields"));
347
439
  })))), showCreateModal && /*#__PURE__*/_react["default"].createElement("div", {
348
- className: "fixed inset-0 flex items-center justify-center bg-black bg-opacity-50 z-50"
440
+ className: "fixed inset-0 flex items-center justify-center bg-black bg-opacity-50 z-50 p-4"
349
441
  }, /*#__PURE__*/_react["default"].createElement("div", {
350
- className: "bg-white rounded-2xl shadow-xl p-8 w-full max-w-lg"
442
+ className: "bg-white rounded-2xl shadow-xl p-8 w-full max-w-3xl max-h-[90vh] overflow-y-auto"
351
443
  }, /*#__PURE__*/_react["default"].createElement("h2", {
352
444
  className: "text-xl font-bold text-gray-800 mb-6"
353
445
  }, "Create New Form"), /*#__PURE__*/_react["default"].createElement("div", {
354
- className: "space-y-4"
446
+ className: "space-y-6"
447
+ }, /*#__PURE__*/_react["default"].createElement("div", {
448
+ className: "grid grid-cols-1 md:grid-cols-2 gap-4"
355
449
  }, /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("label", {
356
- htmlFor: "jsonFile",
450
+ htmlFor: "formTitle",
451
+ className: "block text-sm font-medium text-gray-700 mb-1"
452
+ }, "Form Title *"), /*#__PURE__*/_react["default"].createElement("input", {
453
+ id: "formTitle",
454
+ type: "text",
455
+ value: formDraft.formTitle,
456
+ onChange: function onChange(e) {
457
+ var formTitle = e.target.value;
458
+ setFormDraft(function (prev) {
459
+ return _objectSpread(_objectSpread({}, prev), {}, {
460
+ formTitle: formTitle,
461
+ formName: prev.formName || slugify(formTitle)
462
+ });
463
+ });
464
+ },
465
+ placeholder: "Genkit Workshop Registration",
466
+ className: "w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
467
+ })), /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("label", {
468
+ htmlFor: "formId",
469
+ className: "block text-sm font-medium text-gray-700 mb-1"
470
+ }, "Form ID *"), /*#__PURE__*/_react["default"].createElement("input", {
471
+ id: "formId",
472
+ type: "text",
473
+ value: formDraft.formId,
474
+ onChange: function onChange(e) {
475
+ return setFormDraft(function (prev) {
476
+ return _objectSpread(_objectSpread({}, prev), {}, {
477
+ formId: e.target.value.toUpperCase()
478
+ });
479
+ });
480
+ },
481
+ placeholder: "KHA2025A2",
482
+ className: "w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
483
+ })), /*#__PURE__*/_react["default"].createElement("div", {
484
+ className: "md:col-span-2"
485
+ }, /*#__PURE__*/_react["default"].createElement("label", {
486
+ htmlFor: "formName",
357
487
  className: "block text-sm font-medium text-gray-700 mb-1"
358
- }, "JSON Form Schema *"), /*#__PURE__*/_react["default"].createElement("input", {
359
- id: "jsonFile",
360
- name: "jsonFile",
361
- type: "file",
362
- accept: ".json",
363
- onChange: handleFileChange,
364
- required: true,
488
+ }, "Form Name (URL slug) *"), /*#__PURE__*/_react["default"].createElement("input", {
489
+ id: "formName",
490
+ type: "text",
491
+ value: formDraft.formName,
492
+ onChange: function onChange(e) {
493
+ return setFormDraft(function (prev) {
494
+ return _objectSpread(_objectSpread({}, prev), {}, {
495
+ formName: slugify(e.target.value)
496
+ });
497
+ });
498
+ },
499
+ placeholder: "workshopform",
365
500
  className: "w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
366
501
  }), /*#__PURE__*/_react["default"].createElement("p", {
367
502
  className: "text-xs text-gray-500 mt-1"
368
- }, "Upload a JSON file containing your form schema"))), /*#__PURE__*/_react["default"].createElement("div", {
503
+ }, "Used in URLs like `/forms?id=workshopform`"))), /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("div", {
504
+ className: "flex items-center justify-between mb-3"
505
+ }, /*#__PURE__*/_react["default"].createElement("h3", {
506
+ className: "text-sm font-semibold text-gray-900"
507
+ }, "Fields"), /*#__PURE__*/_react["default"].createElement("div", {
508
+ className: "flex flex-wrap gap-2"
509
+ }, ['text', 'email', 'textarea', 'radio', 'fileUploader'].map(function (type) {
510
+ return /*#__PURE__*/_react["default"].createElement("button", {
511
+ key: type,
512
+ type: "button",
513
+ onClick: function onClick() {
514
+ return addField(type);
515
+ },
516
+ className: "px-3 py-1 text-xs rounded-full border border-gray-300 hover:bg-gray-50"
517
+ }, "+ ", type);
518
+ }))), formDraft.fields.length === 0 ? /*#__PURE__*/_react["default"].createElement("div", {
519
+ className: "rounded-lg border border-dashed border-gray-300 p-6 text-center text-sm text-gray-500"
520
+ }, "Add fields using the buttons above") : /*#__PURE__*/_react["default"].createElement("div", {
521
+ className: "space-y-4"
522
+ }, formDraft.fields.map(function (field, index) {
523
+ return /*#__PURE__*/_react["default"].createElement("div", {
524
+ key: "".concat(field.name, "-").concat(index),
525
+ className: "rounded-lg border border-gray-200 p-4 space-y-3"
526
+ }, /*#__PURE__*/_react["default"].createElement("div", {
527
+ className: "flex items-center justify-between"
528
+ }, /*#__PURE__*/_react["default"].createElement("span", {
529
+ className: "text-sm font-medium text-gray-700 capitalize"
530
+ }, field.type, " field"), /*#__PURE__*/_react["default"].createElement("button", {
531
+ type: "button",
532
+ onClick: function onClick() {
533
+ return removeField(index);
534
+ },
535
+ className: "text-sm text-red-600 hover:text-red-700"
536
+ }, "Remove")), /*#__PURE__*/_react["default"].createElement("div", {
537
+ className: "grid grid-cols-1 md:grid-cols-2 gap-3"
538
+ }, /*#__PURE__*/_react["default"].createElement("input", {
539
+ type: "text",
540
+ value: field.label,
541
+ onChange: function onChange(e) {
542
+ return updateField(index, {
543
+ label: e.target.value
544
+ });
545
+ },
546
+ placeholder: "Label",
547
+ className: "w-full px-3 py-2 border border-gray-300 rounded-md"
548
+ }), /*#__PURE__*/_react["default"].createElement("input", {
549
+ type: "text",
550
+ value: field.name,
551
+ onChange: function onChange(e) {
552
+ return updateField(index, {
553
+ name: slugify(e.target.value)
554
+ });
555
+ },
556
+ placeholder: "name",
557
+ className: "w-full px-3 py-2 border border-gray-300 rounded-md"
558
+ })), /*#__PURE__*/_react["default"].createElement("label", {
559
+ className: "flex items-center gap-2 text-sm text-gray-700"
560
+ }, /*#__PURE__*/_react["default"].createElement("input", {
561
+ type: "checkbox",
562
+ checked: !!field.required,
563
+ onChange: function onChange(e) {
564
+ return updateField(index, {
565
+ required: e.target.checked
566
+ });
567
+ }
568
+ }), "Required"), field.type === 'radio' && /*#__PURE__*/_react["default"].createElement("textarea", {
569
+ value: (field.options || []).join('\n'),
570
+ onChange: function onChange(e) {
571
+ return updateField(index, {
572
+ options: e.target.value.split('\n').map(function (option) {
573
+ return option.trim();
574
+ }).filter(Boolean)
575
+ });
576
+ },
577
+ placeholder: "One option per line",
578
+ rows: 3,
579
+ className: "w-full px-3 py-2 border border-gray-300 rounded-md"
580
+ }));
581
+ })))), /*#__PURE__*/_react["default"].createElement("div", {
369
582
  className: "flex justify-end gap-4 mt-6"
370
583
  }, /*#__PURE__*/_react["default"].createElement("button", {
371
584
  onClick: function onClick() {
372
- return setShowCreateModal(false);
585
+ resetFormDraft();
586
+ setShowCreateModal(false);
373
587
  },
374
588
  className: "bg-gray-300 text-gray-700 hover:bg-gray-400 px-4 py-2 rounded-md"
375
589
  }, "Cancel"), /*#__PURE__*/_react["default"].createElement("button", {
376
590
  onClick: createForm,
377
- disabled: isUploading || !selectedFile,
591
+ disabled: isSaving,
378
592
  className: "bg-blue-600 text-white hover:bg-blue-700 px-4 py-2 rounded-md disabled:opacity-50"
379
- }, isUploading ? /*#__PURE__*/_react["default"].createElement("div", {
593
+ }, isSaving ? /*#__PURE__*/_react["default"].createElement("div", {
380
594
  className: "animate-spin h-5 w-5 mx-auto border-2 border-white border-t-transparent rounded-full"
381
595
  }) : 'Create Form')))), showDetailModal && selectedForm && /*#__PURE__*/_react["default"].createElement("div", {
382
596
  className: "fixed inset-0 flex items-center justify-center bg-black bg-opacity-50 z-50"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "powr-sdk-web",
3
- "version": "5.6.7",
3
+ "version": "5.6.8",
4
4
  "main": "dist/index.js",
5
5
  "scripts": {
6
6
  "build": "babel src -d dist --copy-files",