@123usmanhaider321/ui 0.1.8 → 1.0.0

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 (545) hide show
  1. package/README.md +416 -31
  2. package/dist/images/icon/1LINK.svg +50 -0
  3. package/dist/images/icon/CreditCard.svg +83 -0
  4. package/dist/images/icon/Easypaisa.png +0 -0
  5. package/dist/images/icon/MobileWallet.png +0 -0
  6. package/dist/images/icon/Raast-Logo.png +0 -0
  7. package/dist/images/icon/VISA.png +0 -0
  8. package/dist/images/icon/add-circle-1.svg +5 -0
  9. package/dist/images/icon/check-circle-broken.svg +3 -0
  10. package/dist/images/icon/close-circle.svg +5 -0
  11. package/dist/images/icon/jazzcash.png +0 -0
  12. package/dist/images/icon/loading_icon.json +3347 -0
  13. package/dist/images/icon/mastercard-logo.webp +0 -0
  14. package/dist/images/icon/paymo.jpeg +0 -0
  15. package/dist/images/icon/preview-svgrepo-com.svg +36 -0
  16. package/dist/images/icon/trash.svg +7 -0
  17. package/dist/images/icon/unionpay-logo.svg +9 -0
  18. package/dist/index-87FQZHOs.js +11119 -0
  19. package/dist/index-87FQZHOs.js.map +1 -0
  20. package/dist/index-Tl9g213f.js +60475 -0
  21. package/dist/index-Tl9g213f.js.map +1 -0
  22. package/dist/index.d.ts +1 -10
  23. package/dist/index.es-CpgTaa1Y.js +16734 -0
  24. package/dist/index.es-CpgTaa1Y.js.map +1 -0
  25. package/dist/index.js +40 -12
  26. package/dist/index.js.map +1 -1
  27. package/dist/loading_icon-n5H5dQBl.js +3375 -0
  28. package/dist/loading_icon-n5H5dQBl.js.map +1 -0
  29. package/dist/src/components/Alert/ErrorAlert.d.ts +6 -0
  30. package/dist/src/components/Alert/SuccessAlert.d.ts +6 -0
  31. package/dist/{components → src/components}/FormBuilder/DiscountInput.d.ts +3 -6
  32. package/dist/{components → src/components}/FormBuilder/FormBuilder.d.ts +2 -11
  33. package/dist/{components → src/components}/FormBuilder/QuestionCard.d.ts +0 -5
  34. package/dist/{components → src/components}/FormBuilder/QuestionEditor.d.ts +0 -5
  35. package/dist/{components → src/components}/FormBuilder/SortableQuestionList.d.ts +0 -5
  36. package/dist/src/components/FormBuilder/questionIcons.d.ts +5 -0
  37. package/dist/{components/EventAddForm → src/components/NewAddEvent}/AddEventLayout.d.ts +2 -1
  38. package/dist/{components/EventAddForm → src/components/NewAddEvent}/AddEventStepper.d.ts +2 -2
  39. package/dist/{components/EventAddForm → src/components/NewAddEvent}/common/ConfirmationModal.d.ts +1 -1
  40. package/dist/src/components/NewAddEvent/components/EventSubmissionConfirmationModal.d.ts +14 -0
  41. package/dist/{components/EventAddForm → src/components/NewAddEvent}/components/StepTwo/TicketTierSection.d.ts +1 -1
  42. package/dist/{components/EventAddForm → src/components/NewAddEvent}/components/TicketTierForm.d.ts +1 -1
  43. package/dist/{components/EventAddForm → src/components/NewAddEvent}/hooks/useStepperForm.d.ts +22 -22
  44. package/dist/{components/EventAddForm → src/components/NewAddEvent}/hooks/useTicketTierForm.d.ts +63 -15
  45. package/dist/src/components/NewAddEvent/schemas/step1.d.ts +211 -0
  46. package/dist/src/components/NewAddEvent/schemas/step2.d.ts +411 -0
  47. package/dist/{components/EventAddForm → src/components/NewAddEvent}/schemas/utils.d.ts +8 -2
  48. package/dist/{components/EventAddForm → src/components/NewAddEvent}/steps/IndividualFormStep.d.ts +1 -1
  49. package/dist/{components/EventAddForm → src/components/NewAddEvent}/steps/SocialProfilesStep.d.ts +1 -1
  50. package/dist/{components/EventAddForm → src/components/NewAddEvent}/steps/TeamFormStep.d.ts +1 -1
  51. package/dist/src/components/Spinner/spinner.d.ts +4 -0
  52. package/dist/src/components/TicketlyUIProvider.d.ts +35 -0
  53. package/dist/src/components/common/Loader/index.d.ts +8 -0
  54. package/dist/src/components/common/Modals/ConfirmationModal.d.ts +7 -0
  55. package/dist/{components/FormInput → src/components/ui}/FormInput.d.ts +1 -1
  56. package/dist/src/components/ui/Loader.d.ts +4 -0
  57. package/dist/{components/Button/Button.d.ts → src/components/ui/button.d.ts} +1 -1
  58. package/dist/src/index.d.ts +10 -0
  59. package/dist/{lib → src/lib}/actions.d.ts +0 -126
  60. package/dist/src/lib/dom-utils.d.ts +2 -0
  61. package/dist/src/lib/storage-utils.d.ts +5 -0
  62. package/dist/src/lib/types.d.ts +258 -0
  63. package/dist/src/redux/baseQuery.d.ts +16 -0
  64. package/dist/{services → src/redux/features}/eventApi.d.ts +1053 -1745
  65. package/dist/src/redux/features/globalSlice.d.ts +17 -0
  66. package/dist/{services → src/redux/features/single-event}/single-event-api.d.ts +856 -1190
  67. package/dist/src/redux/types.d.ts +2 -0
  68. package/dist/src/services/library-services.d.ts +15 -0
  69. package/dist/src/services/remote-config.d.ts +27 -0
  70. package/dist/{services → src/services}/utils.d.ts +1 -1
  71. package/dist/src/theme/colors.d.ts +127 -0
  72. package/dist/src/theme/typography.d.ts +13 -0
  73. package/dist/src/types/api.d.ts +18 -0
  74. package/dist/style.css +2984 -0
  75. package/dist/styles.css +3758 -4012
  76. package/package.json +78 -68
  77. package/dist/_virtual/_commonjsHelpers.js +0 -9
  78. package/dist/_virtual/_commonjsHelpers.js.map +0 -1
  79. package/dist/_virtual/customParseFormat.js +0 -5
  80. package/dist/_virtual/customParseFormat.js.map +0 -1
  81. package/dist/_virtual/dayjs.min.js +0 -5
  82. package/dist/_virtual/dayjs.min.js.map +0 -1
  83. package/dist/_virtual/duration.js +0 -5
  84. package/dist/_virtual/duration.js.map +0 -1
  85. package/dist/_virtual/index.js +0 -5
  86. package/dist/_virtual/index.js.map +0 -1
  87. package/dist/_virtual/isBetween.js +0 -5
  88. package/dist/_virtual/isBetween.js.map +0 -1
  89. package/dist/_virtual/relativeTime.js +0 -5
  90. package/dist/_virtual/relativeTime.js.map +0 -1
  91. package/dist/_virtual/use-sync-external-store-shim.development.js +0 -5
  92. package/dist/_virtual/use-sync-external-store-shim.development.js.map +0 -1
  93. package/dist/_virtual/use-sync-external-store-shim.production.js +0 -5
  94. package/dist/_virtual/use-sync-external-store-shim.production.js.map +0 -1
  95. package/dist/_virtual/with-selector.development.js +0 -5
  96. package/dist/_virtual/with-selector.development.js.map +0 -1
  97. package/dist/_virtual/with-selector.js +0 -5
  98. package/dist/_virtual/with-selector.js.map +0 -1
  99. package/dist/_virtual/with-selector.production.js +0 -5
  100. package/dist/_virtual/with-selector.production.js.map +0 -1
  101. package/dist/components/Alert/Alert.js +0 -51
  102. package/dist/components/Alert/Alert.js.map +0 -1
  103. package/dist/components/Button/Button.js +0 -52
  104. package/dist/components/Button/Button.js.map +0 -1
  105. package/dist/components/Button/Button.test.d.ts +0 -1
  106. package/dist/components/Button/index.d.ts +0 -1
  107. package/dist/components/Checkbox/Checkbox.js +0 -50
  108. package/dist/components/Checkbox/Checkbox.js.map +0 -1
  109. package/dist/components/Checkbox/Checkbox.test.d.ts +0 -1
  110. package/dist/components/Checkbox/index.d.ts +0 -1
  111. package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +0 -25
  112. package/dist/components/CheckboxGroup/CheckboxGroup.js +0 -99
  113. package/dist/components/CheckboxGroup/CheckboxGroup.js.map +0 -1
  114. package/dist/components/ConfirmationModal/ConfirmationModal.d.ts +0 -15
  115. package/dist/components/ConfirmationModal/ConfirmationModal.js +0 -136
  116. package/dist/components/ConfirmationModal/ConfirmationModal.js.map +0 -1
  117. package/dist/components/ConfirmationModal/index.d.ts +0 -2
  118. package/dist/components/CustomSelect/CustomSelect.js +0 -259
  119. package/dist/components/CustomSelect/CustomSelect.js.map +0 -1
  120. package/dist/components/EventAddForm/AddEventLayout.js +0 -227
  121. package/dist/components/EventAddForm/AddEventLayout.js.map +0 -1
  122. package/dist/components/EventAddForm/AddEventStepper.js +0 -719
  123. package/dist/components/EventAddForm/AddEventStepper.js.map +0 -1
  124. package/dist/components/EventAddForm/common/ConfirmationModal.js +0 -136
  125. package/dist/components/EventAddForm/common/ConfirmationModal.js.map +0 -1
  126. package/dist/components/EventAddForm/common/DescriptionModal.js +0 -70
  127. package/dist/components/EventAddForm/common/DescriptionModal.js.map +0 -1
  128. package/dist/components/EventAddForm/components/AnimatedBackground.d.ts +0 -8
  129. package/dist/components/EventAddForm/components/ApprovalConfirmationModal.d.ts +0 -7
  130. package/dist/components/EventAddForm/components/CheckboxGroup.js +0 -92
  131. package/dist/components/EventAddForm/components/CheckboxGroup.js.map +0 -1
  132. package/dist/components/EventAddForm/components/CustomMeetingForm.js +0 -237
  133. package/dist/components/EventAddForm/components/CustomMeetingForm.js.map +0 -1
  134. package/dist/components/EventAddForm/components/DateTimeField.js +0 -173
  135. package/dist/components/EventAddForm/components/DateTimeField.js.map +0 -1
  136. package/dist/components/EventAddForm/components/EventSubmissionConfirmationModal.d.ts +0 -33
  137. package/dist/components/EventAddForm/components/EventSubmissionConfirmationModal.js +0 -366
  138. package/dist/components/EventAddForm/components/EventSubmissionConfirmationModal.js.map +0 -1
  139. package/dist/components/EventAddForm/components/FileUpload.js +0 -412
  140. package/dist/components/EventAddForm/components/FileUpload.js.map +0 -1
  141. package/dist/components/EventAddForm/components/FormBuilderProceedModal.js +0 -197
  142. package/dist/components/EventAddForm/components/FormBuilderProceedModal.js.map +0 -1
  143. package/dist/components/EventAddForm/components/GoogleMapsAutocompleteInput.js +0 -1179
  144. package/dist/components/EventAddForm/components/GoogleMapsAutocompleteInput.js.map +0 -1
  145. package/dist/components/EventAddForm/components/InputField.d.ts +0 -15
  146. package/dist/components/EventAddForm/components/RadioGroupButton.d.ts +0 -14
  147. package/dist/components/EventAddForm/components/SelectField.d.ts +0 -19
  148. package/dist/components/EventAddForm/components/SingleDateTimeInput.js +0 -102
  149. package/dist/components/EventAddForm/components/SingleDateTimeInput.js.map +0 -1
  150. package/dist/components/EventAddForm/components/StepTwo/CustomFormSection.js +0 -277
  151. package/dist/components/EventAddForm/components/StepTwo/CustomFormSection.js.map +0 -1
  152. package/dist/components/EventAddForm/components/StepTwo/TicketTierSection.js +0 -148
  153. package/dist/components/EventAddForm/components/StepTwo/TicketTierSection.js.map +0 -1
  154. package/dist/components/EventAddForm/components/TicketTierForm.js +0 -418
  155. package/dist/components/EventAddForm/components/TicketTierForm.js.map +0 -1
  156. package/dist/components/EventAddForm/components/TicketTypeSelection.js +0 -93
  157. package/dist/components/EventAddForm/components/TicketTypeSelection.js.map +0 -1
  158. package/dist/components/EventAddForm/hooks/useStepperForm.js +0 -371
  159. package/dist/components/EventAddForm/hooks/useStepperForm.js.map +0 -1
  160. package/dist/components/EventAddForm/hooks/useTicketTierForm.js +0 -237
  161. package/dist/components/EventAddForm/hooks/useTicketTierForm.js.map +0 -1
  162. package/dist/components/EventAddForm/index.d.ts +0 -3
  163. package/dist/components/EventAddForm/index.js +0 -41
  164. package/dist/components/EventAddForm/index.js.map +0 -1
  165. package/dist/components/EventAddForm/schemas/index.d.ts +0 -2
  166. package/dist/components/EventAddForm/schemas/step1.d.ts +0 -47
  167. package/dist/components/EventAddForm/schemas/step1.js +0 -135
  168. package/dist/components/EventAddForm/schemas/step1.js.map +0 -1
  169. package/dist/components/EventAddForm/schemas/step2.d.ts +0 -138
  170. package/dist/components/EventAddForm/schemas/step2.js +0 -94
  171. package/dist/components/EventAddForm/schemas/step2.js.map +0 -1
  172. package/dist/components/EventAddForm/schemas/utils.js +0 -28
  173. package/dist/components/EventAddForm/schemas/utils.js.map +0 -1
  174. package/dist/components/EventAddForm/steps/IndividualFormStep.js +0 -85
  175. package/dist/components/EventAddForm/steps/IndividualFormStep.js.map +0 -1
  176. package/dist/components/EventAddForm/steps/SocialProfilesStep.js +0 -123
  177. package/dist/components/EventAddForm/steps/SocialProfilesStep.js.map +0 -1
  178. package/dist/components/EventAddForm/steps/StepOne.js +0 -462
  179. package/dist/components/EventAddForm/steps/StepOne.js.map +0 -1
  180. package/dist/components/EventAddForm/steps/StepTwo.js +0 -173
  181. package/dist/components/EventAddForm/steps/StepTwo.js.map +0 -1
  182. package/dist/components/EventAddForm/steps/TeamFormStep.js +0 -13
  183. package/dist/components/EventAddForm/steps/TeamFormStep.js.map +0 -1
  184. package/dist/components/FormBuilder/CategoryList.js +0 -242
  185. package/dist/components/FormBuilder/CategoryList.js.map +0 -1
  186. package/dist/components/FormBuilder/DiscountInput.js +0 -366
  187. package/dist/components/FormBuilder/DiscountInput.js.map +0 -1
  188. package/dist/components/FormBuilder/FormBuilder.js +0 -918
  189. package/dist/components/FormBuilder/FormBuilder.js.map +0 -1
  190. package/dist/components/FormBuilder/OptionList.js +0 -120
  191. package/dist/components/FormBuilder/OptionList.js.map +0 -1
  192. package/dist/components/FormBuilder/PaymentPreview.d.ts +0 -12
  193. package/dist/components/FormBuilder/PaymentPreview.js +0 -70
  194. package/dist/components/FormBuilder/PaymentPreview.js.map +0 -1
  195. package/dist/components/FormBuilder/PreviewInput.d.ts +0 -10
  196. package/dist/components/FormBuilder/PreviewInput.js +0 -143
  197. package/dist/components/FormBuilder/PreviewInput.js.map +0 -1
  198. package/dist/components/FormBuilder/QuestionCard.js +0 -252
  199. package/dist/components/FormBuilder/QuestionCard.js.map +0 -1
  200. package/dist/components/FormBuilder/QuestionEditor.js +0 -166
  201. package/dist/components/FormBuilder/QuestionEditor.js.map +0 -1
  202. package/dist/components/FormBuilder/RequiredToggle.js +0 -43
  203. package/dist/components/FormBuilder/RequiredToggle.js.map +0 -1
  204. package/dist/components/FormBuilder/SortableQuestionList.js +0 -137
  205. package/dist/components/FormBuilder/SortableQuestionList.js.map +0 -1
  206. package/dist/components/FormBuilder/index.d.ts +0 -4
  207. package/dist/components/FormBuilder/utils.js +0 -229
  208. package/dist/components/FormBuilder/utils.js.map +0 -1
  209. package/dist/components/FormInput/FormInput.js +0 -126
  210. package/dist/components/FormInput/FormInput.js.map +0 -1
  211. package/dist/components/FormInput/FormInput.test.d.ts +0 -1
  212. package/dist/components/FormInput/index.d.ts +0 -2
  213. package/dist/components/ImageCropModal/index.js +0 -464
  214. package/dist/components/ImageCropModal/index.js.map +0 -1
  215. package/dist/components/InformationPopover/InformationPopover.d.ts +0 -7
  216. package/dist/components/InformationPopover/InformationPopover.js +0 -19
  217. package/dist/components/InformationPopover/InformationPopover.js.map +0 -1
  218. package/dist/components/InformationPopover.js +0 -19
  219. package/dist/components/InformationPopover.js.map +0 -1
  220. package/dist/components/InputErrorMessage/InputErrorMessage.js +0 -21
  221. package/dist/components/InputErrorMessage/InputErrorMessage.js.map +0 -1
  222. package/dist/components/Modal/Modal.d.ts +0 -15
  223. package/dist/components/Modal/Modal.js +0 -73
  224. package/dist/components/Modal/Modal.js.map +0 -1
  225. package/dist/components/Radio/Radio.js +0 -35
  226. package/dist/components/Radio/Radio.js.map +0 -1
  227. package/dist/components/Spinner/spinner.d.ts +0 -2
  228. package/dist/components/Spinner/spinner.js +0 -22
  229. package/dist/components/Spinner/spinner.js.map +0 -1
  230. package/dist/components/Toggle/Toggle.d.ts +0 -16
  231. package/dist/components/Toggle/index.d.ts +0 -2
  232. package/dist/components/Tooltip/Tooltip.d.ts +0 -12
  233. package/dist/components/Tooltip/Tooltip.js +0 -134
  234. package/dist/components/Tooltip/Tooltip.js.map +0 -1
  235. package/dist/components/common/FallbackImage.js +0 -47
  236. package/dist/components/common/FallbackImage.js.map +0 -1
  237. package/dist/components/ui/Calendar/calendar-utils.js +0 -51
  238. package/dist/components/ui/Calendar/calendar-utils.js.map +0 -1
  239. package/dist/components/ui/Calendar/index.js +0 -142
  240. package/dist/components/ui/Calendar/index.js.map +0 -1
  241. package/dist/components/ui/Checkbox.d.ts +0 -9
  242. package/dist/components/ui/Checkbox.js +0 -50
  243. package/dist/components/ui/Checkbox.js.map +0 -1
  244. package/dist/components/ui/DatePicker/index.js +0 -188
  245. package/dist/components/ui/DatePicker/index.js.map +0 -1
  246. package/dist/components/ui/FormInput.js +0 -129
  247. package/dist/components/ui/FormInput.js.map +0 -1
  248. package/dist/components/ui/InputErrorMessage.d.ts +0 -7
  249. package/dist/components/ui/InputErrorMessage.js +0 -21
  250. package/dist/components/ui/InputErrorMessage.js.map +0 -1
  251. package/dist/components/ui/Modal/index.js +0 -73
  252. package/dist/components/ui/Modal/index.js.map +0 -1
  253. package/dist/components/ui/Radio.d.ts +0 -6
  254. package/dist/components/ui/Radio.js +0 -35
  255. package/dist/components/ui/Radio.js.map +0 -1
  256. package/dist/components/ui/RichTextEditor.js +0 -242
  257. package/dist/components/ui/RichTextEditor.js.map +0 -1
  258. package/dist/components/ui/TimePicker/index.js +0 -215
  259. package/dist/components/ui/TimePicker/index.js.map +0 -1
  260. package/dist/components/ui/TimeSelector/index.js +0 -138
  261. package/dist/components/ui/TimeSelector/index.js.map +0 -1
  262. package/dist/components/ui/Tooltip.d.ts +0 -12
  263. package/dist/components/ui/Tooltip.js +0 -136
  264. package/dist/components/ui/Tooltip.js.map +0 -1
  265. package/dist/hooks/useDropdownPosition.d.ts +0 -11
  266. package/dist/hooks/useFirebaseAuthState.d.ts +0 -6
  267. package/dist/hooks/useFirebaseAuthState.js +0 -23
  268. package/dist/hooks/useFirebaseAuthState.js.map +0 -1
  269. package/dist/hooks/useTicketTierForm.d.ts +0 -61
  270. package/dist/lib/actions.js +0 -32
  271. package/dist/lib/actions.js.map +0 -1
  272. package/dist/lib/cropImage.js +0 -113
  273. package/dist/lib/cropImage.js.map +0 -1
  274. package/dist/lib/imageAnalysis.js +0 -58
  275. package/dist/lib/imageAnalysis.js.map +0 -1
  276. package/dist/lib/utils.js +0 -9
  277. package/dist/lib/utils.js.map +0 -1
  278. package/dist/node_modules/@dnd-kit/accessibility/dist/accessibility.esm.js +0 -60
  279. package/dist/node_modules/@dnd-kit/accessibility/dist/accessibility.esm.js.map +0 -1
  280. package/dist/node_modules/@dnd-kit/core/dist/core.esm.js +0 -3458
  281. package/dist/node_modules/@dnd-kit/core/dist/core.esm.js.map +0 -1
  282. package/dist/node_modules/@dnd-kit/sortable/dist/sortable.esm.js +0 -593
  283. package/dist/node_modules/@dnd-kit/sortable/dist/sortable.esm.js.map +0 -1
  284. package/dist/node_modules/@dnd-kit/utilities/dist/utilities.esm.js +0 -302
  285. package/dist/node_modules/@dnd-kit/utilities/dist/utilities.esm.js.map +0 -1
  286. package/dist/node_modules/@firebase/app/dist/esm/index.esm.js +0 -768
  287. package/dist/node_modules/@firebase/app/dist/esm/index.esm.js.map +0 -1
  288. package/dist/node_modules/@firebase/component/dist/esm/index.esm.js +0 -340
  289. package/dist/node_modules/@firebase/component/dist/esm/index.esm.js.map +0 -1
  290. package/dist/node_modules/@firebase/logger/dist/esm/index.esm.js +0 -123
  291. package/dist/node_modules/@firebase/logger/dist/esm/index.esm.js.map +0 -1
  292. package/dist/node_modules/@firebase/storage/dist/index.esm.js +0 -2623
  293. package/dist/node_modules/@firebase/storage/dist/index.esm.js.map +0 -1
  294. package/dist/node_modules/@firebase/util/dist/index.esm.js +0 -658
  295. package/dist/node_modules/@firebase/util/dist/index.esm.js.map +0 -1
  296. package/dist/node_modules/@firebase/util/dist/postinstall.js +0 -5
  297. package/dist/node_modules/@firebase/util/dist/postinstall.js.map +0 -1
  298. package/dist/node_modules/@fortawesome/fontawesome-svg-core/index.js +0 -3179
  299. package/dist/node_modules/@fortawesome/fontawesome-svg-core/index.js.map +0 -1
  300. package/dist/node_modules/@fortawesome/free-solid-svg-icons/index.js +0 -60
  301. package/dist/node_modules/@fortawesome/free-solid-svg-icons/index.js.map +0 -1
  302. package/dist/node_modules/@fortawesome/react-fontawesome/dist/index.js +0 -400
  303. package/dist/node_modules/@fortawesome/react-fontawesome/dist/index.js.map +0 -1
  304. package/dist/node_modules/@heroicons/react/20/solid/esm/CheckIcon.js +0 -27
  305. package/dist/node_modules/@heroicons/react/20/solid/esm/CheckIcon.js.map +0 -1
  306. package/dist/node_modules/@heroicons/react/20/solid/esm/ChevronDownIcon.js +0 -27
  307. package/dist/node_modules/@heroicons/react/20/solid/esm/ChevronDownIcon.js.map +0 -1
  308. package/dist/node_modules/@heroicons/react/24/outline/esm/ArrowRightIcon.js +0 -29
  309. package/dist/node_modules/@heroicons/react/24/outline/esm/ArrowRightIcon.js.map +0 -1
  310. package/dist/node_modules/@heroicons/react/24/outline/esm/ClockIcon.js +0 -29
  311. package/dist/node_modules/@heroicons/react/24/outline/esm/ClockIcon.js.map +0 -1
  312. package/dist/node_modules/@heroicons/react/24/outline/esm/DocumentDuplicateIcon.js +0 -29
  313. package/dist/node_modules/@heroicons/react/24/outline/esm/DocumentDuplicateIcon.js.map +0 -1
  314. package/dist/node_modules/@heroicons/react/24/outline/esm/InformationCircleIcon.js +0 -29
  315. package/dist/node_modules/@heroicons/react/24/outline/esm/InformationCircleIcon.js.map +0 -1
  316. package/dist/node_modules/@heroicons/react/24/outline/esm/LinkIcon.js +0 -29
  317. package/dist/node_modules/@heroicons/react/24/outline/esm/LinkIcon.js.map +0 -1
  318. package/dist/node_modules/@heroicons/react/24/outline/esm/MagnifyingGlassIcon.js +0 -29
  319. package/dist/node_modules/@heroicons/react/24/outline/esm/MagnifyingGlassIcon.js.map +0 -1
  320. package/dist/node_modules/@heroicons/react/24/outline/esm/MapPinIcon.js +0 -33
  321. package/dist/node_modules/@heroicons/react/24/outline/esm/MapPinIcon.js.map +0 -1
  322. package/dist/node_modules/@heroicons/react/24/outline/esm/VideoCameraIcon.js +0 -29
  323. package/dist/node_modules/@heroicons/react/24/outline/esm/VideoCameraIcon.js.map +0 -1
  324. package/dist/node_modules/@heroicons/react/24/outline/esm/XMarkIcon.js +0 -29
  325. package/dist/node_modules/@heroicons/react/24/outline/esm/XMarkIcon.js.map +0 -1
  326. package/dist/node_modules/@tiptap/core/dist/index.js +0 -5446
  327. package/dist/node_modules/@tiptap/core/dist/index.js.map +0 -1
  328. package/dist/node_modules/@tiptap/core/dist/jsx-runtime/jsx-runtime.js +0 -21
  329. package/dist/node_modules/@tiptap/core/dist/jsx-runtime/jsx-runtime.js.map +0 -1
  330. package/dist/node_modules/@tiptap/extension-blockquote/dist/index.js +0 -78
  331. package/dist/node_modules/@tiptap/extension-blockquote/dist/index.js.map +0 -1
  332. package/dist/node_modules/@tiptap/extension-bold/dist/index.js +0 -100
  333. package/dist/node_modules/@tiptap/extension-bold/dist/index.js.map +0 -1
  334. package/dist/node_modules/@tiptap/extension-code/dist/index.js +0 -70
  335. package/dist/node_modules/@tiptap/extension-code/dist/index.js.map +0 -1
  336. package/dist/node_modules/@tiptap/extension-code-block/dist/index.js +0 -317
  337. package/dist/node_modules/@tiptap/extension-code-block/dist/index.js.map +0 -1
  338. package/dist/node_modules/@tiptap/extension-document/dist/index.js +0 -16
  339. package/dist/node_modules/@tiptap/extension-document/dist/index.js.map +0 -1
  340. package/dist/node_modules/@tiptap/extension-hard-break/dist/index.js +0 -66
  341. package/dist/node_modules/@tiptap/extension-hard-break/dist/index.js.map +0 -1
  342. package/dist/node_modules/@tiptap/extension-heading/dist/index.js +0 -86
  343. package/dist/node_modules/@tiptap/extension-heading/dist/index.js.map +0 -1
  344. package/dist/node_modules/@tiptap/extension-horizontal-rule/dist/index.js +0 -80
  345. package/dist/node_modules/@tiptap/extension-horizontal-rule/dist/index.js.map +0 -1
  346. package/dist/node_modules/@tiptap/extension-italic/dist/index.js +0 -98
  347. package/dist/node_modules/@tiptap/extension-italic/dist/index.js.map +0 -1
  348. package/dist/node_modules/@tiptap/extension-link/dist/index.js +0 -423
  349. package/dist/node_modules/@tiptap/extension-link/dist/index.js.map +0 -1
  350. package/dist/node_modules/@tiptap/extension-list/dist/index.js +0 -1039
  351. package/dist/node_modules/@tiptap/extension-list/dist/index.js.map +0 -1
  352. package/dist/node_modules/@tiptap/extension-paragraph/dist/index.js +0 -61
  353. package/dist/node_modules/@tiptap/extension-paragraph/dist/index.js.map +0 -1
  354. package/dist/node_modules/@tiptap/extension-placeholder/dist/index.js +0 -7
  355. package/dist/node_modules/@tiptap/extension-placeholder/dist/index.js.map +0 -1
  356. package/dist/node_modules/@tiptap/extension-strike/dist/index.js +0 -79
  357. package/dist/node_modules/@tiptap/extension-strike/dist/index.js.map +0 -1
  358. package/dist/node_modules/@tiptap/extension-text/dist/index.js +0 -16
  359. package/dist/node_modules/@tiptap/extension-text/dist/index.js.map +0 -1
  360. package/dist/node_modules/@tiptap/extension-underline/dist/index.js +0 -76
  361. package/dist/node_modules/@tiptap/extension-underline/dist/index.js.map +0 -1
  362. package/dist/node_modules/@tiptap/extensions/dist/index.js +0 -376
  363. package/dist/node_modules/@tiptap/extensions/dist/index.js.map +0 -1
  364. package/dist/node_modules/@tiptap/react/dist/index.js +0 -650
  365. package/dist/node_modules/@tiptap/react/dist/index.js.map +0 -1
  366. package/dist/node_modules/@tiptap/starter-kit/dist/index.js +0 -97
  367. package/dist/node_modules/@tiptap/starter-kit/dist/index.js.map +0 -1
  368. package/dist/node_modules/dayjs/dayjs.min.js +0 -283
  369. package/dist/node_modules/dayjs/dayjs.min.js.map +0 -1
  370. package/dist/node_modules/dayjs/plugin/customParseFormat.js +0 -130
  371. package/dist/node_modules/dayjs/plugin/customParseFormat.js.map +0 -1
  372. package/dist/node_modules/dayjs/plugin/duration.js +0 -137
  373. package/dist/node_modules/dayjs/plugin/duration.js.map +0 -1
  374. package/dist/node_modules/dayjs/plugin/isBetween.js +0 -20
  375. package/dist/node_modules/dayjs/plugin/isBetween.js.map +0 -1
  376. package/dist/node_modules/dayjs/plugin/relativeTime.js +0 -49
  377. package/dist/node_modules/dayjs/plugin/relativeTime.js.map +0 -1
  378. package/dist/node_modules/fast-equals/dist/es/index.js +0 -442
  379. package/dist/node_modules/fast-equals/dist/es/index.js.map +0 -1
  380. package/dist/node_modules/idb/build/index.js +0 -70
  381. package/dist/node_modules/idb/build/index.js.map +0 -1
  382. package/dist/node_modules/idb/build/wrap-idb-value.js +0 -149
  383. package/dist/node_modules/idb/build/wrap-idb-value.js.map +0 -1
  384. package/dist/node_modules/linkifyjs/dist/linkify.js +0 -1159
  385. package/dist/node_modules/linkifyjs/dist/linkify.js.map +0 -1
  386. package/dist/node_modules/orderedmap/dist/index.js +0 -120
  387. package/dist/node_modules/orderedmap/dist/index.js.map +0 -1
  388. package/dist/node_modules/prosemirror-commands/dist/index.js +0 -527
  389. package/dist/node_modules/prosemirror-commands/dist/index.js.map +0 -1
  390. package/dist/node_modules/prosemirror-dropcursor/dist/index.js +0 -137
  391. package/dist/node_modules/prosemirror-dropcursor/dist/index.js.map +0 -1
  392. package/dist/node_modules/prosemirror-gapcursor/dist/index.js +0 -221
  393. package/dist/node_modules/prosemirror-gapcursor/dist/index.js.map +0 -1
  394. package/dist/node_modules/prosemirror-history/dist/index.js +0 -357
  395. package/dist/node_modules/prosemirror-history/dist/index.js.map +0 -1
  396. package/dist/node_modules/prosemirror-keymap/dist/index.js +0 -84
  397. package/dist/node_modules/prosemirror-keymap/dist/index.js.map +0 -1
  398. package/dist/node_modules/prosemirror-model/dist/index.js +0 -3209
  399. package/dist/node_modules/prosemirror-model/dist/index.js.map +0 -1
  400. package/dist/node_modules/prosemirror-schema-list/dist/index.js +0 -131
  401. package/dist/node_modules/prosemirror-schema-list/dist/index.js.map +0 -1
  402. package/dist/node_modules/prosemirror-state/dist/index.js +0 -936
  403. package/dist/node_modules/prosemirror-state/dist/index.js.map +0 -1
  404. package/dist/node_modules/prosemirror-transform/dist/index.js +0 -1881
  405. package/dist/node_modules/prosemirror-transform/dist/index.js.map +0 -1
  406. package/dist/node_modules/prosemirror-view/dist/index.js +0 -5232
  407. package/dist/node_modules/prosemirror-view/dist/index.js.map +0 -1
  408. package/dist/node_modules/rope-sequence/dist/index.js +0 -184
  409. package/dist/node_modules/rope-sequence/dist/index.js.map +0 -1
  410. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js +0 -82
  411. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js.map +0 -1
  412. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.js +0 -78
  413. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.js.map +0 -1
  414. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js +0 -78
  415. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js.map +0 -1
  416. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js +0 -63
  417. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js.map +0 -1
  418. package/dist/node_modules/use-sync-external-store/shim/index.js +0 -13
  419. package/dist/node_modules/use-sync-external-store/shim/index.js.map +0 -1
  420. package/dist/node_modules/use-sync-external-store/shim/with-selector.js +0 -13
  421. package/dist/node_modules/use-sync-external-store/shim/with-selector.js.map +0 -1
  422. package/dist/node_modules/w3c-keyname/index.js +0 -106
  423. package/dist/node_modules/w3c-keyname/index.js.map +0 -1
  424. package/dist/node_modules/zod/v4/classic/coerce.js +0 -10
  425. package/dist/node_modules/zod/v4/classic/coerce.js.map +0 -1
  426. package/dist/node_modules/zod/v4/classic/compat.js +0 -8
  427. package/dist/node_modules/zod/v4/classic/compat.js.map +0 -1
  428. package/dist/node_modules/zod/v4/classic/errors.js +0 -45
  429. package/dist/node_modules/zod/v4/classic/errors.js.map +0 -1
  430. package/dist/node_modules/zod/v4/classic/iso.js +0 -44
  431. package/dist/node_modules/zod/v4/classic/iso.js.map +0 -1
  432. package/dist/node_modules/zod/v4/classic/parse.js +0 -30
  433. package/dist/node_modules/zod/v4/classic/parse.js.map +0 -1
  434. package/dist/node_modules/zod/v4/classic/schemas.js +0 -711
  435. package/dist/node_modules/zod/v4/classic/schemas.js.map +0 -1
  436. package/dist/node_modules/zod/v4/core/api.js +0 -588
  437. package/dist/node_modules/zod/v4/core/api.js.map +0 -1
  438. package/dist/node_modules/zod/v4/core/checks.js +0 -411
  439. package/dist/node_modules/zod/v4/core/checks.js.map +0 -1
  440. package/dist/node_modules/zod/v4/core/core.js +0 -75
  441. package/dist/node_modules/zod/v4/core/core.js.map +0 -1
  442. package/dist/node_modules/zod/v4/core/doc.js +0 -38
  443. package/dist/node_modules/zod/v4/core/doc.js.map +0 -1
  444. package/dist/node_modules/zod/v4/core/errors.js +0 -73
  445. package/dist/node_modules/zod/v4/core/errors.js.map +0 -1
  446. package/dist/node_modules/zod/v4/core/json-schema-processors.js +0 -359
  447. package/dist/node_modules/zod/v4/core/json-schema-processors.js.map +0 -1
  448. package/dist/node_modules/zod/v4/core/parse.js +0 -96
  449. package/dist/node_modules/zod/v4/core/parse.js.map +0 -1
  450. package/dist/node_modules/zod/v4/core/regexes.js +0 -84
  451. package/dist/node_modules/zod/v4/core/regexes.js.map +0 -1
  452. package/dist/node_modules/zod/v4/core/registries.js +0 -52
  453. package/dist/node_modules/zod/v4/core/registries.js.map +0 -1
  454. package/dist/node_modules/zod/v4/core/schemas.js +0 -1391
  455. package/dist/node_modules/zod/v4/core/schemas.js.map +0 -1
  456. package/dist/node_modules/zod/v4/core/to-json-schema.js +0 -363
  457. package/dist/node_modules/zod/v4/core/to-json-schema.js.map +0 -1
  458. package/dist/node_modules/zod/v4/core/util.js +0 -431
  459. package/dist/node_modules/zod/v4/core/util.js.map +0 -1
  460. package/dist/node_modules/zod/v4/core/versions.js +0 -9
  461. package/dist/node_modules/zod/v4/core/versions.js.map +0 -1
  462. package/dist/redux/baseQuery.d.ts +0 -1
  463. package/dist/redux/baseQuery.js +0 -24
  464. package/dist/redux/baseQuery.js.map +0 -1
  465. package/dist/services/eventApi.js +0 -411
  466. package/dist/services/eventApi.js.map +0 -1
  467. package/dist/services/helpers.js +0 -115
  468. package/dist/services/helpers.js.map +0 -1
  469. package/dist/services/initialize-firebase.d.ts +0 -2
  470. package/dist/services/initialize-firebase.js +0 -20
  471. package/dist/services/initialize-firebase.js.map +0 -1
  472. package/dist/services/process-image-on-server.js +0 -30
  473. package/dist/services/process-image-on-server.js.map +0 -1
  474. package/dist/services/remote-config.d.ts +0 -5
  475. package/dist/services/remote-config.js +0 -9
  476. package/dist/services/remote-config.js.map +0 -1
  477. package/dist/services/single-event-api.js +0 -301
  478. package/dist/services/single-event-api.js.map +0 -1
  479. package/dist/services/utils.js +0 -107
  480. package/dist/services/utils.js.map +0 -1
  481. package/dist/setupTests.d.ts +0 -1
  482. package/dist/stories/Alert.stories.d.ts +0 -10
  483. package/dist/stories/Button.stories.d.ts +0 -13
  484. package/dist/types/redux-types.d.ts +0 -15
  485. package/dist/types/types.d.ts +0 -60
  486. package/dist/types/types.js +0 -10
  487. package/dist/types/types.js.map +0 -1
  488. package/dist/utils/cn.d.ts +0 -6
  489. package/dist/utils/cn.js +0 -9
  490. package/dist/utils/cn.js.map +0 -1
  491. package/dist/utils/date-range.d.ts +0 -4
  492. package/dist/utils/date-range.js +0 -13
  493. package/dist/utils/date-range.js.map +0 -1
  494. package/dist/utils/single-event-helpers.d.ts +0 -50
  495. package/dist/utils/single-event-helpers.js +0 -18
  496. package/dist/utils/single-event-helpers.js.map +0 -1
  497. package/dist/utils/social-validation.js +0 -42
  498. package/dist/utils/social-validation.js.map +0 -1
  499. package/dist/utils/utils.js +0 -20
  500. package/dist/utils/utils.js.map +0 -1
  501. /package/dist/{components/Alert/Alert.d.ts → src/components/Alert/index.d.ts} +0 -0
  502. /package/dist/{components → src/components}/FormBuilder/CategoryList.d.ts +0 -0
  503. /package/dist/{components → src/components}/FormBuilder/OptionList.d.ts +0 -0
  504. /package/dist/{components → src/components}/FormBuilder/RequiredToggle.d.ts +0 -0
  505. /package/dist/{components → src/components}/FormBuilder/types.d.ts +0 -0
  506. /package/dist/{components → src/components}/FormBuilder/utils.d.ts +0 -0
  507. /package/dist/{components → src/components}/ImageCropModal/index.d.ts +0 -0
  508. /package/dist/{components → src/components}/InformationPopover.d.ts +0 -0
  509. /package/dist/{components/EventAddForm → src/components/NewAddEvent}/common/DescriptionModal.d.ts +0 -0
  510. /package/dist/{components/ui/FormInput.d.ts → src/components/NewAddEvent/components/AddEventFormInput.d.ts} +0 -0
  511. /package/dist/{components/EventAddForm → src/components/NewAddEvent}/components/CheckboxGroup.d.ts +0 -0
  512. /package/dist/{components/EventAddForm → src/components/NewAddEvent}/components/CustomMeetingForm.d.ts +0 -0
  513. /package/dist/{components/EventAddForm → src/components/NewAddEvent}/components/DateTimeField.d.ts +0 -0
  514. /package/dist/{components/EventAddForm → src/components/NewAddEvent}/components/FileUpload.d.ts +0 -0
  515. /package/dist/{components/EventAddForm → src/components/NewAddEvent}/components/FormBuilderProceedModal.d.ts +0 -0
  516. /package/dist/{components/EventAddForm → src/components/NewAddEvent}/components/GoogleMapsAutocompleteInput.d.ts +0 -0
  517. /package/dist/{components/EventAddForm → src/components/NewAddEvent}/components/SingleDateTimeInput.d.ts +0 -0
  518. /package/dist/{components/EventAddForm → src/components/NewAddEvent}/components/StepTwo/CustomFormSection.d.ts +0 -0
  519. /package/dist/{components/EventAddForm → src/components/NewAddEvent}/components/TicketTypeSelection.d.ts +0 -0
  520. /package/dist/{components/EventAddForm → src/components/NewAddEvent}/steps/StepOne.d.ts +0 -0
  521. /package/dist/{components/EventAddForm → src/components/NewAddEvent}/steps/StepTwo.d.ts +0 -0
  522. /package/dist/{components/EventAddForm → src/components/NewAddEvent}/types.d.ts +0 -0
  523. /package/dist/{components → src/components}/common/FallbackImage.d.ts +0 -0
  524. /package/dist/{components → src/components}/ui/Calendar/calendar-utils.d.ts +0 -0
  525. /package/dist/{components → src/components}/ui/Calendar/index.d.ts +0 -0
  526. /package/dist/{components/Checkbox → src/components/ui}/Checkbox.d.ts +0 -0
  527. /package/dist/{components/CustomSelect → src/components/ui}/CustomSelect.d.ts +0 -0
  528. /package/dist/{components → src/components}/ui/DatePicker/index.d.ts +0 -0
  529. /package/dist/{components/InputErrorMessage → src/components/ui}/InputErrorMessage.d.ts +0 -0
  530. /package/dist/{components → src/components}/ui/Modal/index.d.ts +0 -0
  531. /package/dist/{components/Radio → src/components/ui}/Radio.d.ts +0 -0
  532. /package/dist/{components → src/components}/ui/RichTextEditor.d.ts +0 -0
  533. /package/dist/{components → src/components}/ui/TimePicker/index.d.ts +0 -0
  534. /package/dist/{components → src/components}/ui/TimeSelector/index.d.ts +0 -0
  535. /package/dist/{components → src/components}/ui/Tooltip/index.d.ts +0 -0
  536. /package/dist/{lib → src/lib}/constants.d.ts +0 -0
  537. /package/dist/{lib → src/lib}/cropImage.d.ts +0 -0
  538. /package/dist/{lib → src/lib}/imageAnalysis.d.ts +0 -0
  539. /package/dist/{utils → src/lib}/social-validation.d.ts +0 -0
  540. /package/dist/{lib/utils.d.ts → src/lib/tailwind-merge.d.ts} +0 -0
  541. /package/dist/{utils → src/lib}/utils.d.ts +0 -0
  542. /package/dist/{services → src/redux/features/single-event}/helpers.d.ts +0 -0
  543. /package/dist/{services → src/services}/process-image-on-server.d.ts +0 -0
  544. /package/dist/{types → src/types}/events.d.ts +0 -0
  545. /package/dist/{types → src/types}/question.d.ts +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"FormBuilder.js","sources":["../../../src/components/FormBuilder/FormBuilder.tsx"],"sourcesContent":["/* eslint-disable react-hooks/exhaustive-deps */\r\n\"use client\";\r\n\r\nimport { useState, useMemo, useEffect, useRef, useCallback, forwardRef, useImperativeHandle, memo } from 'react';\r\nimport {\r\n DndContext,\r\n closestCenter,\r\n KeyboardSensor,\r\n PointerSensor,\r\n useSensor,\r\n useSensors,\r\n DragEndEvent,\r\n DragStartEvent,\r\n DragOverlay,\r\n} from '@dnd-kit/core';\r\nimport {\r\n SortableContext,\r\n sortableKeyboardCoordinates,\r\n verticalListSortingStrategy,\r\n arrayMove,\r\n} from '@dnd-kit/sortable';\r\nimport { Plus, ChevronDown, ClipboardList } from 'lucide-react';\r\nimport { motion, AnimatePresence } from 'framer-motion';\r\nimport { InformationCircleIcon } from '@heroicons/react/24/outline';\r\n\r\nimport { QuestionDraft } from './types';\r\nimport { SortableQuestionList } from './SortableQuestionList';\r\nimport QuestionCard from './QuestionCard';\r\nimport { normalizeFormSchema, denormalizeFormSchema, getDiscountFilePath, validateQuestionError } from './utils';\r\nimport Alert from '../Alert/Alert';\r\nimport { Button } from '../Button';\r\nimport { Tooltip } from '../Tooltip/Tooltip';\r\nimport { cn } from '../../utils/cn';\r\n\r\nexport interface FormBuilderProps {\r\n eventId: string;\r\n initialFields: any[]; // Raw API fields\r\n participationType?: string;\r\n scope?: 'INDIVIDUAL' | 'TEAM';\r\n isSameQuestionTitleAllowed?: boolean;\r\n allowedDiscountQuestions?: number;\r\n onQuestionsChange?: (questions: any[]) => void;\r\n onBusyStateChange?: (isBusy: boolean) => void;\r\n onPolluted?: () => void;\r\n discountFilePath?: string;\r\n individualDiscountFilePath?: string;\r\n userUid?: string;\r\n\r\n // API Callbacks (Required for persistence)\r\n addQuestion?: (payload: any) => Promise<any>;\r\n editQuestion?: (payload: any) => Promise<any>;\r\n deleteQuestion?: (payload: any) => Promise<any>;\r\n updateOrder?: (payload: any) => Promise<any>;\r\n\r\n // Services\r\n storageService?: {\r\n uploadFile: (path: string, file: File) => Promise<void>;\r\n downloadFile: (path: string) => Promise<Blob>;\r\n };\r\n}\r\n\r\nexport interface FormBuilderRef {\r\n save: () => Promise<void>;\r\n validateNavigation: () => boolean;\r\n isSaving: () => boolean;\r\n isDirty: () => boolean;\r\n}\r\n\r\nconst EmptyState = ({ onAdd, isAddingNew }: { onAdd: () => void, isAddingNew: boolean }) => (\r\n <div className=\"flex flex-col items-center justify-center py-12 px-4 border-2 border-dashed border-grey-200 rounded-xl bg-grey-50/50 text-center\">\r\n <div className=\"bg-white p-3 rounded-full shadow-sm mb-4\">\r\n <ClipboardList className=\"w-6 h-6 text-purple-600\" />\r\n </div>\r\n <h3 className=\"text-lg font-semibold text-gray-900 mb-1\">No questions yet</h3>\r\n <p className=\"text-sm text-grey-500 mb-6 max-w-sm\">\r\n Start building your form by adding your first question.\r\n </p>\r\n <Button\r\n type=\"button\"\r\n onClick={(e) => { e.stopPropagation(); if (!isAddingNew) onAdd(); }}\r\n disabled={isAddingNew}\r\n className={cn(\"gap-2\", isAddingNew && \"opacity-50 cursor-not-allowed\")}\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n Add Question\r\n </Button>\r\n </div>\r\n);\r\n\r\nconst FormBuilder = forwardRef<FormBuilderRef, FormBuilderProps>(({\r\n eventId,\r\n initialFields,\r\n participationType,\r\n scope,\r\n isSameQuestionTitleAllowed = true,\r\n allowedDiscountQuestions = 1,\r\n onQuestionsChange,\r\n onBusyStateChange,\r\n onPolluted,\r\n discountFilePath,\r\n individualDiscountFilePath,\r\n userUid,\r\n addQuestion,\r\n editQuestion,\r\n deleteQuestion,\r\n updateOrder,\r\n storageService\r\n}, ref) => {\r\n\r\n // Local State\r\n const [questions, setQuestions] = useState<Record<string, QuestionDraft>>({});\r\n const [questionOrder, setQuestionOrder] = useState<string[]>([]);\r\n const [isLocked, setIsLocked] = useState(false);\r\n const [isLoaded, setIsLoaded] = useState(false);\r\n\r\n // Refs for Auto-Save\r\n const questionsRef = useRef(questions);\r\n const questionOrderRef = useRef(questionOrder);\r\n\r\n useEffect(() => {\r\n questionsRef.current = questions;\r\n }, [questions]);\r\n\r\n useEffect(() => {\r\n questionOrderRef.current = questionOrder;\r\n }, [questionOrder]);\r\n\r\n const dirtyQuestionsRef = useRef<Set<string>>(new Set());\r\n const newQuestionsRef = useRef<Set<string>>(new Set());\r\n const isOrderDirtyRef = useRef(false);\r\n const [isDirtyForUI, setIsDirtyForUI] = useState(false);\r\n\r\n const snapshotRef = useRef<QuestionDraft | null>(null);\r\n const isCurrentSessionNewRef = useRef(false);\r\n const isSavingRef = useRef(false);\r\n\r\n // UI State\r\n const [editingQuestionId, setEditingQuestionId] = useState<string | null>(null);\r\n const [showValidationErrors, setShowValidationErrors] = useState(false);\r\n const [activeId, setActiveId] = useState<string | null>(null);\r\n const [alertState, setAlertState] = useState<{ isVisible: boolean; message: string; type: 'success' | 'error' }>({\r\n isVisible: false, message: '', type: 'success'\r\n });\r\n\r\n const [isTeamOpen, setIsTeamOpen] = useState<boolean>(true);\r\n const [isIndividualOpen, setIsIndividualOpen] = useState<boolean>(true);\r\n const [isTeamMemberOpen, setIsTeamMemberOpen] = useState(true);\r\n\r\n const isBusy = (isSavingRef.current || isDirtyForUI);\r\n\r\n useEffect(() => {\r\n if (onBusyStateChange) {\r\n onBusyStateChange(isBusy);\r\n }\r\n }, [isBusy, onBusyStateChange]);\r\n\r\n const showAlert = useCallback((message: string, type: 'success' | 'error') => {\r\n setAlertState({ isVisible: true, message, type });\r\n setTimeout(() => setAlertState(prev => ({ ...prev, isVisible: false })), 3000);\r\n }, []);\r\n\r\n const formId = useMemo(() => `event-form-${eventId || 'new'}`, [eventId]);\r\n\r\n useEffect(() => {\r\n if (initialFields) {\r\n const hasUnsavedChanges = dirtyQuestionsRef.current.size > 0 || isOrderDirtyRef.current || newQuestionsRef.current.size > 0;\r\n\r\n if (!isLoaded || !hasUnsavedChanges) {\r\n const normalizedData = normalizeFormSchema(initialFields, discountFilePath, individualDiscountFilePath);\r\n setQuestions(normalizedData.questions || {});\r\n setQuestionOrder(normalizedData.questionOrder || []);\r\n setIsLocked(normalizedData.status === 'LOCKED' as any);\r\n\r\n if (!isLoaded) setIsLoaded(true);\r\n }\r\n }\r\n }, [initialFields, isLoaded]);\r\n\r\n const notifyParentOfChange = useCallback((newQuestions: Record<string, QuestionDraft>, newOrder: string[]) => {\r\n if (onQuestionsChange) {\r\n const arrayFormat = denormalizeFormSchema(newQuestions, newOrder);\r\n onQuestionsChange(arrayFormat);\r\n }\r\n }, [onQuestionsChange]);\r\n\r\n const isTeamEvent = participationType === '2' || participationType === 'TEAM';\r\n\r\n const discountQuestionsCount = useMemo(() => {\r\n return Object.values(questions).filter(q => {\r\n if (q.kind !== 'DISCOUNT') return false;\r\n if (scope) {\r\n if (scope === 'INDIVIDUAL') {\r\n const isBothParticipation = participationType === '3' || participationType === 'BOTH';\r\n return q.scope === 'INDIVIDUAL' || (isBothParticipation && q.scope === 'BOTH');\r\n } else if (scope === 'TEAM') {\r\n return q.scope === 'TEAM' || q.scope === 'BOTH';\r\n }\r\n }\r\n if (participationType === 'INDIVIDUAL') {\r\n return q.scope === 'INDIVIDUAL' || q.scope === 'BOTH';\r\n } else if (isTeamEvent) {\r\n return q.scope === 'TEAM' || q.scope === 'BOTH';\r\n }\r\n return true;\r\n }).length;\r\n }, [questions, scope, participationType, isTeamEvent]);\r\n\r\n const disableDiscountOption = discountQuestionsCount >= allowedDiscountQuestions;\r\n\r\n const { teamQuestionsOrder, teamMemberQuestionsOrder, individualQuestionsOrder } = useMemo(() => {\r\n const team: string[] = [];\r\n const teamMember: string[] = [];\r\n const individual: string[] = [];\r\n\r\n questionOrder.forEach(id => {\r\n const q = questions[id];\r\n if (!q) return;\r\n\r\n if (scope) {\r\n if (scope === 'INDIVIDUAL') {\r\n const isBothParticipation = participationType === '3' || participationType === 'BOTH';\r\n if (q.scope === 'INDIVIDUAL' || (isBothParticipation && q.scope === 'BOTH')) {\r\n individual.push(id);\r\n }\r\n }\r\n else if (scope === 'TEAM' && (q.scope === 'TEAM' || q.scope === 'BOTH')) {\r\n if (q.individual === false) team.push(id);\r\n else teamMember.push(id);\r\n }\r\n return;\r\n }\r\n\r\n if (participationType === 'INDIVIDUAL') {\r\n if (q.scope === 'INDIVIDUAL' || q.scope === 'BOTH') individual.push(id);\r\n } else if (isTeamEvent) {\r\n if (q.scope === 'TEAM' || q.scope === 'BOTH') {\r\n if (q.individual === false) team.push(id);\r\n else teamMember.push(id);\r\n }\r\n } else {\r\n if (q.individual === false) team.push(id);\r\n else individual.push(id);\r\n }\r\n });\r\n\r\n return {\r\n teamQuestionsOrder: team,\r\n teamMemberQuestionsOrder: teamMember,\r\n individualQuestionsOrder: individual\r\n };\r\n }, [questionOrder, questions, scope, participationType, isTeamEvent]);\r\n\r\n const autoSaveTimerRef = useRef<NodeJS.Timeout | null>(null);\r\n\r\n const markDirty = (desc: string, delay = 30000) => {\r\n setIsDirtyForUI(true);\r\n if (autoSaveTimerRef.current) clearTimeout(autoSaveTimerRef.current);\r\n autoSaveTimerRef.current = setTimeout(() => {\r\n saveRoutine();\r\n }, delay);\r\n };\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (autoSaveTimerRef.current) clearTimeout(autoSaveTimerRef.current);\r\n };\r\n }, []);\r\n\r\n const saveRoutine = async (retryCount = 0): Promise<void> => {\r\n if (isSavingRef.current) {\r\n return new Promise((resolve) => {\r\n const check = () => {\r\n if (!isSavingRef.current) resolve();\r\n else setTimeout(check, 100);\r\n };\r\n check();\r\n });\r\n }\r\n isSavingRef.current = true;\r\n autoSaveTimerRef.current = null;\r\n\r\n const dirtyIds = Array.from(dirtyQuestionsRef.current);\r\n const orderDirty = isOrderDirtyRef.current;\r\n\r\n if (dirtyIds.length === 0 && !orderDirty) {\r\n setIsDirtyForUI(false);\r\n isSavingRef.current = false;\r\n return;\r\n }\r\n\r\n const questionPromises = [];\r\n let hasSkippedQuestions = false;\r\n\r\n for (const id of dirtyIds) {\r\n const q = questionsRef.current[id];\r\n if (!q) {\r\n dirtyQuestionsRef.current.delete(id);\r\n continue;\r\n }\r\n\r\n const stateBeingSaved = JSON.stringify(q);\r\n const isNew = newQuestionsRef.current.has(id);\r\n const isChoice = ['MULTIPLE_CHOICE', 'CHECKBOX', 'DROPDOWN'].includes(q.kind);\r\n const isPayment = ['PAYMENT', 'PAYMENT_CHECKBOX'].includes(q.kind);\r\n const effectiveScope = scope || q.scope || (q.individual === false ? 'TEAM' : 'INDIVIDUAL');\r\n\r\n const path = `/data/${userUid}/events/discounts/${eventId}.csv`;\r\n const individualPath = `/data/${userUid}/events/discounts/${eventId}_individual.csv`;\r\n const discountPath = userUid ? path : q.discount_file_path;\r\n const individualDiscountPath = userUid ? individualPath : discountPath;\r\n\r\n if (q.kind === 'DISCOUNT' && q.file && userUid && storageService) {\r\n try {\r\n const targetUploadPath = getDiscountFilePath(eventId, userUid, participationType, scope, q);\r\n await storageService.uploadFile(targetUploadPath, q.file);\r\n } catch (err) {\r\n console.error(\"Failed to upload discount file\", err);\r\n showAlert(\"Failed to upload discount file\", \"error\");\r\n continue;\r\n }\r\n }\r\n\r\n const basePayload: any = {\r\n event_id: eventId,\r\n question_type: q.kind,\r\n placeholder: q.placeholder || \"\",\r\n validation: q.required,\r\n individual: q.individual !== false,\r\n scope: effectiveScope,\r\n conditions: {},\r\n options: isChoice ? (q.options?.map(o => ({ value: o.value || o.label })) || []) : [],\r\n Categories: isPayment ? (q.Categories?.map(c => ({ name: c.name, price: c.price })) || []) : [],\r\n additional_fee: isPayment,\r\n applies_on: q.kind === 'DISCOUNT' ? (q.applies_on || []) : [],\r\n discount_file_path: (effectiveScope === 'TEAM' || effectiveScope === 'BOTH' || effectiveScope === 'INDIVIDUAL') ? (discountPath || \"\") : \"\",\r\n individual_discount_file_path: (effectiveScope === 'INDIVIDUAL' || effectiveScope === 'BOTH') ? (individualDiscountPath || \"\") : \"\",\r\n };\r\n\r\n if (isNew) {\r\n if (addQuestion) {\r\n const apiPayload = { ...basePayload, question: q.label };\r\n\r\n if (!apiPayload.question ||\r\n (isChoice && apiPayload.options.length === 0) ||\r\n (isPayment && apiPayload.Categories.length === 0) ||\r\n (q.kind === 'DISCOUNT' && apiPayload.applies_on.length === 0) ||\r\n (q.kind === 'DISCOUNT' && effectiveScope === \"TEAM\" && !apiPayload.discount_file_path) ||\r\n (q.kind === 'DISCOUNT' && effectiveScope === \"INDIVIDUAL\" && !apiPayload.individual_discount_file_path)\r\n ) {\r\n hasSkippedQuestions = true;\r\n continue;\r\n }\r\n\r\n questionPromises.push(\r\n addQuestion(apiPayload).then(() => {\r\n const currentState = JSON.stringify(questionsRef.current[id]);\r\n newQuestionsRef.current.delete(id);\r\n setQuestions(prev => {\r\n if (!prev[id]) return prev;\r\n return { ...prev, [id]: { ...prev[id], originalLabel: q.label } };\r\n });\r\n if (currentState === stateBeingSaved) dirtyQuestionsRef.current.delete(id);\r\n if (onPolluted) onPolluted();\r\n })\r\n );\r\n }\r\n } else {\r\n if (editQuestion) {\r\n const apiPayload = {\r\n ...basePayload,\r\n question: q.originalLabel || q.label,\r\n new_question: q.label\r\n };\r\n\r\n if (!apiPayload.new_question ||\r\n (isChoice && apiPayload.options.length === 0) ||\r\n (isPayment && apiPayload.Categories.length === 0) ||\r\n (q.kind === 'DISCOUNT' && apiPayload.applies_on.length === 0)\r\n ) {\r\n hasSkippedQuestions = true;\r\n continue;\r\n }\r\n\r\n questionPromises.push(\r\n editQuestion(apiPayload).then(() => {\r\n const currentState = JSON.stringify(questionsRef.current[id]);\r\n setQuestions(prev => {\r\n if (!prev[id]) return prev;\r\n return { ...prev, [id]: { ...prev[id], originalLabel: q.label } };\r\n });\r\n if (currentState === stateBeingSaved) dirtyQuestionsRef.current.delete(id);\r\n if (onPolluted) onPolluted();\r\n })\r\n );\r\n }\r\n }\r\n }\r\n\r\n try {\r\n if (questionPromises.length > 0) await Promise.all(questionPromises);\r\n if (orderDirty && !hasSkippedQuestions && updateOrder) {\r\n const orderSnapshot = [...questionOrderRef.current];\r\n const orderPayload = {\r\n event_id: eventId,\r\n questions: orderSnapshot.map((id, index) => {\r\n const q = questionsRef.current[id];\r\n return q ? { question: q.label, order: 900 + index } : null;\r\n }).filter(Boolean)\r\n };\r\n\r\n await updateOrder(orderPayload).then(() => {\r\n const currentOrderJSON = JSON.stringify(questionOrderRef.current);\r\n const sentOrderJSON = JSON.stringify(orderSnapshot);\r\n if (currentOrderJSON === sentOrderJSON) isOrderDirtyRef.current = false;\r\n if (onPolluted) onPolluted();\r\n });\r\n }\r\n\r\n if (dirtyQuestionsRef.current.size === 0 && !isOrderDirtyRef.current) {\r\n setIsDirtyForUI(false);\r\n }\r\n } catch (e) {\r\n console.error(\"Auto-save failed\", e);\r\n if (!autoSaveTimerRef.current && retryCount < 3) {\r\n autoSaveTimerRef.current = setTimeout(() => {\r\n saveRoutine(retryCount + 1);\r\n }, 30000);\r\n setIsDirtyForUI(true);\r\n } else {\r\n showAlert(\"Failed to save changes. Please try again.\", \"error\");\r\n }\r\n } finally {\r\n isSavingRef.current = false;\r\n }\r\n };\r\n\r\n useImperativeHandle(ref, () => ({\r\n save: async () => {\r\n if (editingQuestionId) {\r\n handleCancel(editingQuestionId);\r\n setShowValidationErrors(false);\r\n }\r\n if (!isSameQuestionTitleAllowed) {\r\n const titles = new Set();\r\n const duplicates = new Set();\r\n Object.values(questions).forEach(q => {\r\n const normalized = q.label?.trim().toLowerCase();\r\n if (!normalized) return;\r\n if (titles.has(normalized)) duplicates.add(q.label);\r\n titles.add(normalized);\r\n });\r\n if (duplicates.size > 0) {\r\n const dupList = Array.from(duplicates).join(\", \");\r\n showAlert(`Duplicate titles: ${dupList}`, \"error\");\r\n throw new Error(`Duplicate titles: ${dupList}`);\r\n }\r\n }\r\n return await saveRoutine();\r\n },\r\n validateNavigation: () => {\r\n if (editingQuestionId) {\r\n handleCancel(editingQuestionId);\r\n setShowValidationErrors(false);\r\n }\r\n return true;\r\n },\r\n isSaving: () => isSavingRef.current || isBusy,\r\n isDirty: () => isDirtyForUI\r\n }));\r\n\r\n useEffect(() => {\r\n if (!isDirtyForUI) return;\r\n const handleBeforeUnload = (e: BeforeUnloadEvent) => {\r\n e.preventDefault();\r\n e.returnValue = '';\r\n saveRoutine();\r\n };\r\n window.addEventListener('beforeunload', handleBeforeUnload);\r\n return () => window.removeEventListener('beforeunload', handleBeforeUnload);\r\n }, [isDirtyForUI]);\r\n\r\n const updateQuestionLocal = (id: string, updates: Partial<QuestionDraft>) => {\r\n setQuestions(prev => {\r\n const current = prev[id];\r\n if (!current) return prev;\r\n const updated = { ...prev, [id]: { ...current, ...updates } };\r\n questionsRef.current = updated;\r\n\r\n if (updates.options || updates.Categories || updates.label !== undefined || updates.file !== undefined || updates.applies_on !== undefined) {\r\n setShowValidationErrors(false);\r\n }\r\n\r\n if (onQuestionsChange) {\r\n clearTimeout((window as any)._notifyTimer);\r\n (window as any)._notifyTimer = setTimeout(() => {\r\n notifyParentOfChange(updated, questionOrderRef.current);\r\n }, 500);\r\n }\r\n return updated;\r\n });\r\n dirtyQuestionsRef.current.add(id);\r\n markDirty(\"update\");\r\n };\r\n\r\n const addQuestionLocal = (question: QuestionDraft, indexToInsert?: number) => {\r\n const updatedQuestions = { ...questionsRef.current, [question.id]: question };\r\n setQuestions(updatedQuestions);\r\n questionsRef.current = updatedQuestions;\r\n\r\n setQuestionOrder(prev => {\r\n const newOrder = [...prev];\r\n if (typeof indexToInsert === 'number') newOrder.splice(indexToInsert, 0, question.id);\r\n else newOrder.push(question.id);\r\n questionOrderRef.current = newOrder;\r\n notifyParentOfChange(questionsRef.current, newOrder);\r\n return newOrder;\r\n });\r\n\r\n newQuestionsRef.current.add(question.id);\r\n dirtyQuestionsRef.current.add(question.id);\r\n isOrderDirtyRef.current = true;\r\n markDirty(\"add\");\r\n };\r\n\r\n const deleteQuestionLocal = async (id: string) => {\r\n const q = questions[id];\r\n if (!q) return;\r\n if (['TEAM_SIZE', 'NAME_ON_TICKET'].includes(q.kind)) {\r\n showAlert(\"System questions cannot be deleted\", \"error\");\r\n return;\r\n }\r\n\r\n const nextQuestions = { ...questionsRef.current };\r\n delete nextQuestions[id];\r\n setQuestions(nextQuestions);\r\n questionsRef.current = nextQuestions;\r\n\r\n const nextOrder = questionOrderRef.current.filter(qid => qid !== id);\r\n setQuestionOrder(nextOrder);\r\n questionOrderRef.current = nextOrder;\r\n notifyParentOfChange(nextQuestions, nextOrder);\r\n\r\n if (editingQuestionId === id) setEditingQuestionId(null);\r\n if (newQuestionsRef.current.has(id)) {\r\n dirtyQuestionsRef.current.delete(id);\r\n newQuestionsRef.current.delete(id);\r\n return;\r\n }\r\n\r\n if (deleteQuestion) {\r\n try {\r\n await deleteQuestion({ event_id: eventId, question: q.originalLabel || q.label });\r\n dirtyQuestionsRef.current.delete(id);\r\n newQuestionsRef.current.delete(id);\r\n if (onPolluted) onPolluted();\r\n } catch (e) {\r\n console.error(\"Delete failed\", e);\r\n }\r\n }\r\n };\r\n\r\n const startEditing = (id: string, questionOverride?: QuestionDraft) => {\r\n const q = questionOverride || questions[id];\r\n if (q) {\r\n snapshotRef.current = JSON.parse(JSON.stringify(q));\r\n isCurrentSessionNewRef.current = false;\r\n }\r\n setEditingQuestionId(id);\r\n };\r\n\r\n const handleCancel = (id: string) => {\r\n if (isCurrentSessionNewRef.current) {\r\n const nextQuestions = { ...questionsRef.current };\r\n delete nextQuestions[id];\r\n setQuestions(nextQuestions);\r\n questionsRef.current = nextQuestions;\r\n\r\n const nextOrder = questionOrderRef.current.filter(qid => qid !== id);\r\n setQuestionOrder(nextOrder);\r\n questionOrderRef.current = nextOrder;\r\n\r\n dirtyQuestionsRef.current.delete(id);\r\n newQuestionsRef.current.delete(id);\r\n setEditingQuestionId(null);\r\n setShowValidationErrors(false);\r\n return;\r\n }\r\n\r\n if (snapshotRef.current) {\r\n setQuestions(prev => {\r\n const updated = { ...prev, [id]: { ...snapshotRef.current!, file: undefined } };\r\n questionsRef.current = updated;\r\n return updated;\r\n });\r\n }\r\n dirtyQuestionsRef.current.delete(id);\r\n if (dirtyQuestionsRef.current.size === 0 && !isOrderDirtyRef.current) setIsDirtyForUI(false);\r\n setEditingQuestionId(null);\r\n setShowValidationErrors(false);\r\n };\r\n\r\n const triggerSave = () => {\r\n snapshotRef.current = null;\r\n isCurrentSessionNewRef.current = false;\r\n if (autoSaveTimerRef.current) clearTimeout(autoSaveTimerRef.current);\r\n autoSaveTimerRef.current = setTimeout(() => saveRoutine(), 100);\r\n };\r\n\r\n const handleSetActiveQuestion = (newId: string | null) => {\r\n if (newId === null) {\r\n if (editingQuestionId) handleCancel(editingQuestionId);\r\n return;\r\n }\r\n if (editingQuestionId && editingQuestionId !== newId) {\r\n const current = questions[editingQuestionId];\r\n if (!current) {\r\n startEditing(newId);\r\n setShowValidationErrors(false);\r\n return;\r\n }\r\n if (validateQuestionError(current, questions, participationType, isSameQuestionTitleAllowed) !== null) {\r\n setShowValidationErrors(true);\r\n showAlert(\"Please complete the current question to proceed.\", \"error\");\r\n return;\r\n } else {\r\n triggerSave();\r\n setShowValidationErrors(false);\r\n }\r\n }\r\n startEditing(newId);\r\n setShowValidationErrors(false);\r\n };\r\n\r\n const sensors = useSensors(\r\n useSensor(PointerSensor, { activationConstraint: { distance: 3 } }),\r\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates })\r\n );\r\n\r\n const handleDragStart = (event: DragStartEvent) => {\r\n setActiveId(event.active.id as string);\r\n if (editingQuestionId) setEditingQuestionId(null);\r\n };\r\n\r\n const handleDragEnd = (event: DragEndEvent) => {\r\n const { active, over } = event;\r\n setActiveId(null);\r\n if (!over || active.id === over.id) return;\r\n\r\n const oldIndex = questionOrder.indexOf(active.id as string);\r\n const newIndex = questionOrder.indexOf(over.id as string);\r\n const activeQ = questions[active.id];\r\n const overQ = questions[over.id];\r\n\r\n if (isTeamEvent && activeQ && overQ && activeQ.individual !== overQ.individual) return;\r\n if (['TEAM_SIZE', 'NAME_ON_TICKET'].includes(activeQ?.kind)) return;\r\n\r\n if (oldIndex !== -1 && newIndex !== -1) {\r\n const newOrder = arrayMove(questionOrder, oldIndex, newIndex);\r\n setQuestionOrder(newOrder);\r\n questionOrderRef.current = newOrder;\r\n isOrderDirtyRef.current = true;\r\n markDirty(\"reorder\");\r\n notifyParentOfChange(questions, newOrder);\r\n }\r\n };\r\n\r\n const handleAddClick = (isIndividual: boolean = true) => {\r\n if (editingQuestionId) {\r\n const q = questions[editingQuestionId];\r\n if (q && validateQuestionError(q, questions, participationType, isSameQuestionTitleAllowed) !== null) {\r\n setShowValidationErrors(true);\r\n showAlert(\"Please complete the current question to proceed.\", \"error\");\r\n return;\r\n }\r\n triggerSave();\r\n setShowValidationErrors(false);\r\n }\r\n\r\n const newId = crypto.randomUUID();\r\n let defaultScope: 'INDIVIDUAL' | 'TEAM' = scope || (isTeamEvent ? 'TEAM' : 'INDIVIDUAL');\r\n\r\n const newQuestion: QuestionDraft = {\r\n id: newId,\r\n kind: 'INPUT_STR',\r\n label: '',\r\n required: false,\r\n options: [],\r\n individual: isIndividual,\r\n scope: defaultScope,\r\n };\r\n\r\n addQuestionLocal(newQuestion);\r\n isCurrentSessionNewRef.current = true;\r\n snapshotRef.current = JSON.parse(JSON.stringify(newQuestion));\r\n setEditingQuestionId(newId);\r\n };\r\n\r\n const handleDuplicate = (id: string) => {\r\n const original = questions[id];\r\n if (!original) return;\r\n if (['TEAM_SIZE', 'NAME_ON_TICKET'].includes(original.kind)) {\r\n showAlert(\"System questions cannot be duplicated\", \"error\");\r\n return;\r\n }\r\n\r\n const newId = crypto.randomUUID();\r\n const baseName = (original.label || '').replace(/\\s+copy\\s+\\(\\d+\\)$/i, '').trim();\r\n let nextNumber = 1;\r\n const labels = Object.values(questions).map(q => q.label?.toLowerCase() || \"\");\r\n while (labels.includes(`${baseName} copy (${nextNumber})`.toLowerCase())) nextNumber++;\r\n\r\n const newQuestion: QuestionDraft = {\r\n ...original,\r\n id: newId,\r\n label: `${baseName} copy (${nextNumber})`,\r\n options: original.options?.map(o => ({ ...o, id: crypto.randomUUID() })) || [],\r\n Categories: original.Categories?.map(c => ({ ...c, id: crypto.randomUUID() })) || [],\r\n };\r\n\r\n const originalIndex = questionOrder.indexOf(id);\r\n const newOrder = [...questionOrder];\r\n newOrder.splice(originalIndex + 1, 0, newId);\r\n\r\n setQuestions(prev => {\r\n const updated = { ...prev, [newId]: newQuestion };\r\n questionsRef.current = updated;\r\n return updated;\r\n });\r\n setQuestionOrder(newOrder);\r\n questionOrderRef.current = newOrder;\r\n\r\n newQuestionsRef.current.add(newId);\r\n dirtyQuestionsRef.current.add(newId);\r\n isOrderDirtyRef.current = true;\r\n markDirty(\"duplicate\");\r\n isCurrentSessionNewRef.current = true;\r\n setEditingQuestionId(newId);\r\n };\r\n\r\n const handleManualSave = (id: string) => {\r\n const q = questions[id];\r\n if (!q) return;\r\n if (validateQuestionError(q, questions, participationType, isSameQuestionTitleAllowed) !== null) {\r\n setShowValidationErrors(true);\r\n return;\r\n }\r\n triggerSave();\r\n setShowValidationErrors(false);\r\n setEditingQuestionId(null);\r\n };\r\n\r\n const activeQuestionProps = (id: string) => {\r\n const q = questions[id];\r\n const err = validateQuestionError(q, questions, participationType, isSameQuestionTitleAllowed);\r\n return {\r\n isDirty: dirtyQuestionsRef.current.has(id),\r\n isSaving: isSavingRef.current,\r\n isNew: newQuestionsRef.current.has(id),\r\n isValid: err === null,\r\n errorMessage: showValidationErrors ? (err || undefined) : undefined\r\n };\r\n };\r\n\r\n const handleSectionToggle = (section: 'TEAM' | 'TEAM_MEMBER' | 'INDIVIDUAL') => {\r\n let currentIsOpen = false;\r\n let setOpen: (open: boolean) => void = () => { };\r\n let qOrder: string[] = [];\r\n\r\n if (section === 'TEAM') { currentIsOpen = isTeamOpen; setOpen = setIsTeamOpen; qOrder = teamQuestionsOrder; }\r\n else if (section === 'TEAM_MEMBER') { currentIsOpen = isTeamMemberOpen; setOpen = setIsTeamMemberOpen; qOrder = teamMemberQuestionsOrder; }\r\n else { currentIsOpen = isIndividualOpen; setOpen = setIsIndividualOpen; qOrder = individualQuestionsOrder; }\r\n\r\n if (currentIsOpen && editingQuestionId && qOrder.includes(editingQuestionId)) {\r\n handleSetActiveQuestion(null);\r\n }\r\n setOpen(!currentIsOpen);\r\n };\r\n\r\n if (!isLoaded && initialFields) return <div className=\"p-8 text-center text-gray-500\">Loading Form Builder...</div>;\r\n\r\n const isAddingNew = editingQuestionId ? newQuestionsRef.current.has(editingQuestionId) : false;\r\n\r\n return (\r\n <div className=\"flex flex-col gap-6 relative\">\r\n <Alert\r\n isVisible={alertState.isVisible}\r\n message={alertState.message}\r\n type={alertState.type}\r\n onClose={() => setAlertState(prev => ({ ...prev, isVisible: false }))}\r\n />\r\n\r\n <DndContext\r\n sensors={sensors}\r\n collisionDetection={closestCenter}\r\n onDragStart={handleDragStart}\r\n onDragEnd={handleDragEnd}\r\n >\r\n {(scope === 'TEAM' || (isTeamEvent && !scope)) && (\r\n <div className=\"space-y-8 overflow-y-hidden\">\r\n <div className=\"border border-gray-200 rounded-xl bg-white\">\r\n <div className=\"p-4 flex items-center space-x-2 cursor-pointer transition-colors\"\r\n onClick={() => handleSectionToggle('TEAM')}\r\n >\r\n <ChevronDown className={cn(\"w-5 h-5 text-gray-900 transition-transform duration-300\",\r\n isTeamOpen ? \"rotate-180\" : \"rotate-0\"\r\n )} />\r\n <div className=\"flex items-center gap-2\">\r\n <h3 className=\"text-xl font-semibold text-gray-800 flex items-center gap-2\">\r\n Team questions\r\n </h3>\r\n <Tooltip\r\n placement=\"bottom\"\r\n content=\"Questions that apply to the entire team and only need to be specified once\"\r\n >\r\n <InformationCircleIcon className=\"h-5 w-5 text-gray-400\" />\r\n </Tooltip>\r\n </div>\r\n </div>\r\n\r\n <AnimatePresence initial={false}>\r\n {isTeamOpen && (\r\n <motion.div\r\n initial={{ height: 0, opacity: 0 }}\r\n animate={{ height: \"auto\", opacity: 1 }}\r\n exit={{ height: 0, opacity: 0 }}\r\n transition={{ duration: 0.2 }}\r\n >\r\n <div className=\"p-6 pt-0\">\r\n {teamQuestionsOrder.length > 0 ? (\r\n <>\r\n <SortableContext items={teamQuestionsOrder} strategy={verticalListSortingStrategy}>\r\n <SortableQuestionList\r\n questions={questions}\r\n questionOrder={teamQuestionsOrder}\r\n formId={formId}\r\n eventId={eventId}\r\n userUid={userUid}\r\n storageService={storageService}\r\n isLocked={isLocked}\r\n activeQuestionId={editingQuestionId}\r\n onSetActiveQuestion={handleSetActiveQuestion}\r\n onDelete={deleteQuestionLocal}\r\n onDuplicate={handleDuplicate}\r\n onSave={handleManualSave}\r\n onUpdate={updateQuestionLocal}\r\n onCancel={handleCancel}\r\n activeQuestionProps={editingQuestionId ? activeQuestionProps(editingQuestionId) : undefined}\r\n disabled={isAddingNew}\r\n scope={scope}\r\n participationType={participationType}\r\n disableDiscountOption={disableDiscountOption}\r\n showValidationErrors={showValidationErrors}\r\n />\r\n </SortableContext>\r\n {!activeId && !isLocked && (\r\n <div className=\"flex justify-center mt-6\">\r\n <Button\r\n type=\"button\"\r\n variant='outline'\r\n onClick={(e) => { e.stopPropagation(); if (!isAddingNew) handleAddClick(false); }}\r\n size='lg'\r\n className={cn(\"gap-x-2 px-4 py-2.5 text-sm\", isAddingNew && \"opacity-50 cursor-not-allowed\")}\r\n disabled={isAddingNew}\r\n >\r\n <Plus className=\"font-bold w-5 h-5\" />\r\n Add New Question\r\n </Button>\r\n </div>\r\n )}\r\n </>\r\n ) : (\r\n <EmptyState onAdd={() => handleAddClick(false)} isAddingNew={isAddingNew} />\r\n )}\r\n </div>\r\n </motion.div>\r\n )}\r\n </AnimatePresence>\r\n </div>\r\n\r\n <div className=\"border border-gray-200 rounded-xl bg-white\">\r\n <div className=\"p-4 flex items-center space-x-2 cursor-pointer transition-colors\"\r\n onClick={() => handleSectionToggle('TEAM_MEMBER')}\r\n >\r\n <ChevronDown className={cn(\"w-5 h-5 text-gray-900 transition-transform duration-300\",\r\n isTeamMemberOpen ? \"rotate-180\" : \"rotate-0\"\r\n )} />\r\n <div className=\"flex items-center gap-2\">\r\n <h3 className=\"text-xl font-semibold text-gray-800 flex items-center gap-2\">\r\n Team Member Questions\r\n </h3>\r\n <Tooltip\r\n placement=\"bottom\"\r\n content=\"Questions that are specific to each individual team member and need to be asked separately for each person.\"\r\n >\r\n <InformationCircleIcon className=\"h-5 w-5 text-gray-400\" />\r\n </Tooltip>\r\n </div>\r\n </div>\r\n\r\n <AnimatePresence initial={false}>\r\n {isTeamMemberOpen && (\r\n <motion.div\r\n initial={{ height: 0, opacity: 0 }}\r\n animate={{ height: \"auto\", opacity: 1 }}\r\n exit={{ height: 0, opacity: 0 }}\r\n transition={{ duration: 0.2 }}\r\n >\r\n <div className=\"p-6 pt-0\">\r\n {teamMemberQuestionsOrder.length > 0 ? (\r\n <>\r\n <SortableContext items={teamMemberQuestionsOrder} strategy={verticalListSortingStrategy}>\r\n <SortableQuestionList\r\n questions={questions}\r\n questionOrder={teamMemberQuestionsOrder}\r\n formId={formId}\r\n eventId={eventId}\r\n userUid={userUid}\r\n storageService={storageService}\r\n isLocked={isLocked}\r\n activeQuestionId={editingQuestionId}\r\n onSetActiveQuestion={handleSetActiveQuestion}\r\n onDelete={deleteQuestionLocal}\r\n onDuplicate={handleDuplicate}\r\n onSave={handleManualSave}\r\n onUpdate={updateQuestionLocal}\r\n onCancel={handleCancel}\r\n activeQuestionProps={editingQuestionId ? activeQuestionProps(editingQuestionId) : undefined}\r\n disabled={isAddingNew}\r\n scope={scope}\r\n participationType={participationType}\r\n disableDiscountOption={disableDiscountOption}\r\n showValidationErrors={showValidationErrors}\r\n />\r\n </SortableContext>\r\n {!activeId && !isLocked && (\r\n <div className=\"flex justify-center mt-6\">\r\n <Button\r\n type=\"button\"\r\n variant='outline'\r\n onClick={(e) => { e.stopPropagation(); if (!isAddingNew) handleAddClick(true); }}\r\n size='lg'\r\n className={cn(\"gap-x-2 px-4 py-2.5 text-sm\", isAddingNew && \"opacity-50 cursor-not-allowed\")}\r\n disabled={isAddingNew}\r\n >\r\n <Plus className=\"font-bold w-5 h-5\" />\r\n Add New Question\r\n </Button>\r\n </div>\r\n )}\r\n </>\r\n ) : (\r\n <EmptyState onAdd={() => handleAddClick(true)} isAddingNew={isAddingNew} />\r\n )}\r\n </div>\r\n </motion.div>\r\n )}\r\n </AnimatePresence>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {(scope === 'INDIVIDUAL' || (!isTeamEvent && !scope)) && (\r\n <div className=\"border border-gray-200 rounded-xl bg-white overflow-y-hidden\">\r\n <div className=\"p-4 flex items-center space-x-2 cursor-pointer transition-colors\"\r\n onClick={() => handleSectionToggle('INDIVIDUAL')}\r\n >\r\n <ChevronDown className={cn(\"w-5 h-5 text-gray-900 transition-transform duration-300\",\r\n isIndividualOpen ? \"rotate-180\" : \"rotate-0\"\r\n )} />\r\n <h3 className=\"text-xl font-semibold text-gray-800 flex items-center gap-2\">\r\n Individual questions\r\n </h3>\r\n </div>\r\n\r\n <AnimatePresence initial={false}>\r\n {isIndividualOpen && (\r\n <motion.div\r\n initial={{ height: 0, opacity: 0 }}\r\n animate={{ height: \"auto\", opacity: 1 }}\r\n exit={{ height: 0, opacity: 0 }}\r\n transition={{ duration: 0.2 }}\r\n >\r\n <div className=\"p-6 pt-0\">\r\n {individualQuestionsOrder.length > 0 ? (\r\n <>\r\n <SortableContext items={individualQuestionsOrder} strategy={verticalListSortingStrategy}>\r\n <SortableQuestionList\r\n questions={questions}\r\n questionOrder={individualQuestionsOrder}\r\n formId={formId}\r\n eventId={eventId}\r\n userUid={userUid}\r\n storageService={storageService}\r\n isLocked={isLocked}\r\n activeQuestionId={editingQuestionId}\r\n onSetActiveQuestion={handleSetActiveQuestion}\r\n onDelete={deleteQuestionLocal}\r\n onDuplicate={handleDuplicate}\r\n onSave={handleManualSave}\r\n onUpdate={updateQuestionLocal}\r\n onCancel={handleCancel}\r\n activeQuestionProps={editingQuestionId ? activeQuestionProps(editingQuestionId) : undefined}\r\n disabled={isAddingNew}\r\n scope={scope}\r\n participationType={participationType}\r\n disableDiscountOption={disableDiscountOption}\r\n showValidationErrors={showValidationErrors}\r\n />\r\n </SortableContext>\r\n {!activeId && !isLocked && (\r\n <div className=\"flex justify-center mt-6\">\r\n <Button\r\n type=\"button\"\r\n onClick={() => !isAddingNew && handleAddClick(true)}\r\n variant='outline'\r\n size='lg'\r\n className={cn(\"gap-x-2 px-4 py-2.5 text-sm\", isAddingNew && \"opacity-50 cursor-not-allowed\")}\r\n disabled={isAddingNew}\r\n >\r\n <Plus className=\"font-bold w-5 h-5\" />\r\n Add New Question\r\n </Button>\r\n </div>\r\n )}\r\n </>\r\n ) : (\r\n <EmptyState onAdd={() => handleAddClick(true)} isAddingNew={isAddingNew} />\r\n )}\r\n </div>\r\n </motion.div>\r\n )}\r\n </AnimatePresence>\r\n </div>\r\n )}\r\n\r\n <DragOverlay>\r\n {activeId && questions[activeId] ? (\r\n <div className=\"opacity-80 rotate-2 cursor-grabbing\">\r\n <QuestionCard\r\n question={questions[activeId]}\r\n formId={formId}\r\n eventId={eventId}\r\n isLocked={isLocked}\r\n isOpen={false}\r\n onToggle={() => { }}\r\n onDelete={() => { }}\r\n onUpdate={() => { }}\r\n />\r\n </div>\r\n ) : null}\r\n </DragOverlay>\r\n </DndContext>\r\n </div>\r\n );\r\n});\r\n\r\nFormBuilder.displayName = \"FormBuilder\";\r\n\r\nexport default memo(FormBuilder);\r\n"],"names":["_a","InformationCircleIcon"],"mappings":"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"}
@@ -1,120 +0,0 @@
1
- import { jsxs, jsx } from "react/jsx-runtime";
2
- import { useSensors, useSensor, PointerSensor, DndContext, closestCenter } from "../../node_modules/@dnd-kit/core/dist/core.esm.js";
3
- import { SortableContext, verticalListSortingStrategy, arrayMove, useSortable } from "../../node_modules/@dnd-kit/sortable/dist/sortable.esm.js";
4
- import { CSS } from "../../node_modules/@dnd-kit/utilities/dist/utilities.esm.js";
5
- import { cn } from "../../utils/cn.js";
6
- import { FontAwesomeIcon } from "../../node_modules/@fortawesome/react-fontawesome/dist/index.js";
7
- import { faPlus, faGripVertical, faTimes } from "../../node_modules/@fortawesome/free-solid-svg-icons/index.js";
8
- const OptionList = ({ question, onUpdate, showError }) => {
9
- const options = question.options || [];
10
- const sensors = useSensors(
11
- useSensor(PointerSensor, { activationConstraint: { distance: 3 } })
12
- );
13
- const handleDragEnd = (event) => {
14
- const { active, over } = event;
15
- if (active.id !== (over == null ? void 0 : over.id) && options) {
16
- const oldIndex = options.findIndex((o) => o.id === active.id);
17
- const newIndex = options.findIndex((o) => o.id === (over == null ? void 0 : over.id));
18
- if (oldIndex !== -1 && newIndex !== -1) {
19
- const newOptions = arrayMove(options, oldIndex, newIndex);
20
- onUpdate(question.id, { options: newOptions });
21
- }
22
- }
23
- };
24
- const handleAddOption = () => {
25
- if (options.length > 0) {
26
- const lastOption = options[options.length - 1];
27
- if (!lastOption.label.trim()) {
28
- return;
29
- }
30
- }
31
- const newOption = {
32
- id: crypto.randomUUID(),
33
- label: ``
34
- };
35
- const newOptions = [...options, newOption];
36
- onUpdate(question.id, { options: newOptions });
37
- };
38
- const updateOptionLabel = (optionId, label) => {
39
- const newOptions = options.map((o) => o.id === optionId ? { ...o, label } : o);
40
- onUpdate(question.id, { options: newOptions });
41
- };
42
- const deleteOption = (optionId) => {
43
- if (options.length <= 1) return;
44
- const newOptions = options.filter((o) => o.id !== optionId);
45
- onUpdate(question.id, { options: newOptions });
46
- };
47
- const isLastOptionEmpty = options.length > 0 && !options[options.length - 1].label.trim();
48
- return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
49
- /* @__PURE__ */ jsx(DndContext, { sensors, collisionDetection: closestCenter, onDragEnd: handleDragEnd, children: /* @__PURE__ */ jsx(SortableContext, { items: options.map((o) => o.id), strategy: verticalListSortingStrategy, children: options.map((option, index) => /* @__PURE__ */ jsx(
50
- SortableOptionItem,
51
- {
52
- option,
53
- index,
54
- kind: question.kind,
55
- onUpdateLabel: updateOptionLabel,
56
- onDelete: deleteOption,
57
- isDeletable: options.length > 1,
58
- isError: showError && !option.label.trim()
59
- },
60
- option.id
61
- )) }) }),
62
- /* @__PURE__ */ jsxs(
63
- "button",
64
- {
65
- onClick: handleAddOption,
66
- disabled: isLastOptionEmpty,
67
- className: `flex items-center gap-2 text-sm font-medium mt-1 pl-1 ${isLastOptionEmpty ? "text-gray-400 cursor-not-allowed" : "text-primaryx-600 hover:text-primaryx-700"}`,
68
- children: [
69
- /* @__PURE__ */ jsx(FontAwesomeIcon, { icon: faPlus, className: "text-xs" }),
70
- "Add Option"
71
- ]
72
- }
73
- )
74
- ] });
75
- };
76
- function SortableOptionItem({ option, index, kind, onUpdateLabel, onDelete, isDeletable, isError }) {
77
- const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id: option.id });
78
- const style = {
79
- transform: CSS.Transform.toString(transform),
80
- transition,
81
- opacity: isDragging ? 0.5 : 1
82
- };
83
- return /* @__PURE__ */ jsxs("div", { ref: setNodeRef, style, className: "flex items-center gap-2 group", children: [
84
- /* @__PURE__ */ jsx("div", { ...attributes, ...listeners, className: "sm:block hidden text-gray-300 cursor-move hover:text-gray-500 px-1 opacity-0 group-hover:opacity-100 transition-opacity", children: /* @__PURE__ */ jsx(FontAwesomeIcon, { icon: faGripVertical }) }),
85
- /* @__PURE__ */ jsxs("div", { className: "text-gray-400", children: [
86
- kind === "MULTIPLE_CHOICE" && /* @__PURE__ */ jsx("div", { className: "w-4 h-4 rounded-full border border-gray-300" }),
87
- kind === "CHECKBOX" && /* @__PURE__ */ jsx("div", { className: "w-4 h-4 rounded border border-gray-300" }),
88
- kind === "DROPDOWN" && /* @__PURE__ */ jsxs("span", { className: "text-xs font-mono", children: [
89
- index + 1,
90
- "."
91
- ] })
92
- ] }),
93
- /* @__PURE__ */ jsx(
94
- "input",
95
- {
96
- type: "text",
97
- value: option.label,
98
- placeholder: `Option ${index + 1}`,
99
- onChange: (e) => onUpdateLabel(option.id, e.target.value),
100
- className: cn(
101
- "text-sm flex-1 bg-transparent rounded-md border-b focus:border-primaryx-500 outline-none py-1 hover:border-primaryx-300 transition-colors",
102
- isError ? "border-red-500 text-red-600 placeholder:text-red-300" : "border-gray-200"
103
- )
104
- }
105
- ),
106
- /* @__PURE__ */ jsx(
107
- "button",
108
- {
109
- onClick: () => onDelete(option.id),
110
- disabled: !isDeletable,
111
- className: `px-2 transition-opacity ${isDeletable ? "text-gray-300 hover:text-red-500 opacity-0 group-hover:opacity-100" : "text-gray-200 cursor-not-allowed opacity-0"}`,
112
- children: /* @__PURE__ */ jsx(FontAwesomeIcon, { icon: faTimes })
113
- }
114
- )
115
- ] });
116
- }
117
- export {
118
- OptionList
119
- };
120
- //# sourceMappingURL=OptionList.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"OptionList.js","sources":["../../../src/components/FormBuilder/OptionList.tsx"],"sourcesContent":["import React from 'react';\r\nimport { DndContext, closestCenter, DragEndEvent, PointerSensor, useSensor, useSensors } from '@dnd-kit/core';\r\nimport { SortableContext, verticalListSortingStrategy, arrayMove, useSortable } from '@dnd-kit/sortable';\r\nimport { CSS } from '@dnd-kit/utilities';\r\nimport { cn } from '../../utils/cn';\r\nimport { QuestionDraft, OptionDraft } from './types';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { faGripVertical, faTimes, faPlus } from '@fortawesome/free-solid-svg-icons';\r\n\r\ninterface OptionListProps {\r\n question: QuestionDraft;\r\n onUpdate: (questionId: string, updates: Partial<QuestionDraft>) => void;\r\n showError?: boolean;\r\n}\r\n\r\nexport const OptionList: React.FC<OptionListProps> = ({ question, onUpdate, showError }) => {\r\n const options = question.options || [];\r\n\r\n const sensors = useSensors(\r\n useSensor(PointerSensor, { activationConstraint: { distance: 3 } })\r\n );\r\n\r\n const handleDragEnd = (event: DragEndEvent) => {\r\n const { active, over } = event;\r\n if (active.id !== over?.id && options) {\r\n const oldIndex = options.findIndex(o => o.id === active.id);\r\n const newIndex = options.findIndex(o => o.id === over?.id);\r\n if (oldIndex !== -1 && newIndex !== -1) {\r\n const newOptions = arrayMove(options, oldIndex, newIndex);\r\n onUpdate(question.id, { options: newOptions });\r\n }\r\n }\r\n };\r\n\r\n const handleAddOption = () => {\r\n if (options.length > 0) {\r\n const lastOption = options[options.length - 1];\r\n if (!lastOption.label.trim()) {\r\n return;\r\n }\r\n }\r\n\r\n const newOption: OptionDraft = {\r\n id: crypto.randomUUID(),\r\n label: ``\r\n };\r\n const newOptions = [...options, newOption];\r\n onUpdate(question.id, { options: newOptions });\r\n };\r\n\r\n const updateOptionLabel = (optionId: string, label: string) => {\r\n const newOptions = options.map(o => o.id === optionId ? { ...o, label } : o);\r\n onUpdate(question.id, { options: newOptions });\r\n };\r\n\r\n const deleteOption = (optionId: string) => {\r\n if (options.length <= 1) return;\r\n const newOptions = options.filter(o => o.id !== optionId);\r\n onUpdate(question.id, { options: newOptions });\r\n };\r\n\r\n const isLastOptionEmpty = options.length > 0 && !options[options.length - 1].label.trim();\r\n\r\n return (\r\n <div className=\"flex flex-col gap-2\">\r\n <DndContext sensors={sensors} collisionDetection={closestCenter} onDragEnd={handleDragEnd}>\r\n <SortableContext items={options.map(o => o.id)} strategy={verticalListSortingStrategy}>\r\n {options.map((option, index) => (\r\n <SortableOptionItem\r\n key={option.id}\r\n option={option}\r\n index={index}\r\n kind={question.kind}\r\n onUpdateLabel={updateOptionLabel}\r\n onDelete={deleteOption}\r\n isDeletable={options.length > 1}\r\n isError={showError && !option.label.trim()}\r\n />\r\n ))}\r\n </SortableContext>\r\n </DndContext>\r\n\r\n <button\r\n onClick={handleAddOption}\r\n disabled={isLastOptionEmpty}\r\n className={`flex items-center gap-2 text-sm font-medium mt-1 pl-1 ${isLastOptionEmpty ? 'text-gray-400 cursor-not-allowed' : 'text-primaryx-600 hover:text-primaryx-700'}`}\r\n >\r\n <FontAwesomeIcon icon={faPlus} className=\"text-xs\" />\r\n Add Option\r\n </button>\r\n </div>\r\n );\r\n};\r\n\r\ninterface SortableOptionItemProps {\r\n option: OptionDraft;\r\n index: number;\r\n kind: string;\r\n onUpdateLabel: (id: string, label: string) => void;\r\n onDelete: (id: string) => void;\r\n isDeletable: boolean;\r\n isError?: boolean;\r\n}\r\n\r\nfunction SortableOptionItem({ option, index, kind, onUpdateLabel, onDelete, isDeletable, isError }: SortableOptionItemProps) {\r\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id: option.id });\r\n\r\n const style = {\r\n transform: CSS.Transform.toString(transform),\r\n transition,\r\n opacity: isDragging ? 0.5 : 1,\r\n };\r\n\r\n return (\r\n <div ref={setNodeRef} style={style} className=\"flex items-center gap-2 group\">\r\n {/* Drag Handle */}\r\n <div {...attributes} {...listeners} className=\"sm:block hidden text-gray-300 cursor-move hover:text-gray-500 px-1 opacity-0 group-hover:opacity-100 transition-opacity\">\r\n <FontAwesomeIcon icon={faGripVertical} />\r\n </div>\r\n\r\n {/* Visual Indicator */}\r\n <div className=\"text-gray-400\">\r\n {kind === 'MULTIPLE_CHOICE' && <div className=\"w-4 h-4 rounded-full border border-gray-300\" />}\r\n {kind === 'CHECKBOX' && <div className=\"w-4 h-4 rounded border border-gray-300\" />}\r\n {kind === 'DROPDOWN' && <span className=\"text-xs font-mono\">{index + 1}.</span>}\r\n </div>\r\n\r\n {/* Input */}\r\n <input\r\n type=\"text\"\r\n value={option.label}\r\n placeholder={`Option ${index + 1}`}\r\n onChange={(e) => onUpdateLabel(option.id, e.target.value)}\r\n className={cn(\r\n \"text-sm flex-1 bg-transparent rounded-md border-b focus:border-primaryx-500 outline-none py-1 hover:border-primaryx-300 transition-colors\",\r\n isError ? \"border-red-500 text-red-600 placeholder:text-red-300\" : \"border-gray-200\"\r\n )}\r\n />\r\n\r\n {/* Delete */}\r\n <button\r\n onClick={() => onDelete(option.id)}\r\n disabled={!isDeletable}\r\n className={`px-2 transition-opacity ${isDeletable ? 'text-gray-300 hover:text-red-500 opacity-0 group-hover:opacity-100' : 'text-gray-200 cursor-not-allowed opacity-0'}`}\r\n >\r\n <FontAwesomeIcon icon={faTimes} />\r\n </button>\r\n </div>\r\n );\r\n}\r\n"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- import { default as React } from 'react';
2
-
3
- interface PaymentPreviewProps {
4
- categories: {
5
- id: string;
6
- name: string;
7
- price: number;
8
- }[];
9
- isCheckbox?: boolean;
10
- }
11
- declare const _default: React.MemoExoticComponent<({ categories, isCheckbox }: PaymentPreviewProps) => import("react/jsx-runtime").JSX.Element>;
12
- export default _default;
@@ -1,70 +0,0 @@
1
- import { jsxs, jsx } from "react/jsx-runtime";
2
- import { cn } from "../../utils/cn.js";
3
- import { memo } from "react";
4
- const PaymentCategoryCard = memo(function PaymentCategoryCard2({
5
- onClick,
6
- name,
7
- price,
8
- isCheckbox = false
9
- }) {
10
- return /* @__PURE__ */ jsx(
11
- "div",
12
- {
13
- onClick,
14
- className: "group cursor-pointer rounded-xl border flex-1 justify-between h-full transition-all duration-200 overflow-hidden border-gray-200 hover:border-gray-300 bg-white",
15
- children: /* @__PURE__ */ jsxs("div", { className: "flex-1 h-full flex flex-col", children: [
16
- /* @__PURE__ */ jsxs(
17
- "div",
18
- {
19
- className: cn(
20
- "flex justify-between items-center p-3 pb-0"
21
- ),
22
- children: [
23
- /* @__PURE__ */ jsx("div", { className: "flex items-center gap-2", children: /* @__PURE__ */ jsx("span", { className: "font-medium text-gray-900", children: name }) }),
24
- /* @__PURE__ */ jsx("div", { className: cn(
25
- "w-4 h-4 border flex items-center justify-center border-gray-300",
26
- isCheckbox ? "rounded" : "rounded-full"
27
- ), children: /* @__PURE__ */ jsx("div", { className: cn(
28
- "w-full h-full border border-gray-200",
29
- isCheckbox ? "rounded" : "rounded-full"
30
- ) }) })
31
- ]
32
- }
33
- ),
34
- /* @__PURE__ */ jsx(
35
- "div",
36
- {
37
- className: cn(
38
- "flex-1 p-3 pt-0 space-y-3 bg-white"
39
- ),
40
- children: /* @__PURE__ */ jsxs("span", { className: "text-md font-bold text-gray-900", children: [
41
- "PKR ",
42
- price.toLocaleString()
43
- ] })
44
- }
45
- )
46
- ] })
47
- }
48
- );
49
- });
50
- const PaymentPreview = ({ categories, isCheckbox }) => {
51
- return /* @__PURE__ */ jsxs("div", { className: `grid sm:grid-cols-2 gap-3`, children: [
52
- categories.map((category, index) => /* @__PURE__ */ jsx(
53
- PaymentCategoryCard,
54
- {
55
- onClick: () => {
56
- },
57
- name: category.name,
58
- price: category.price,
59
- isCheckbox
60
- },
61
- category.id || index
62
- )),
63
- categories.length === 0 && /* @__PURE__ */ jsx("div", { className: "col-span-2 text-center text-gray-400 py-8 border-2 border-dashed border-gray-200 rounded-lg", children: "No payment categories defined" })
64
- ] });
65
- };
66
- const PaymentPreview$1 = memo(PaymentPreview);
67
- export {
68
- PaymentPreview$1 as default
69
- };
70
- //# sourceMappingURL=PaymentPreview.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PaymentPreview.js","sources":["../../../src/components/FormBuilder/PaymentPreview.tsx"],"sourcesContent":["import { cn } from \"../../utils/cn\";\r\nimport React, { memo } from \"react\";\r\n\r\ninterface PaymentCategoryCardProps {\r\n onClick: () => void;\r\n name: string;\r\n price: number;\r\n isCheckbox?: boolean;\r\n}\r\n\r\nconst PaymentCategoryCard = memo(function PaymentCategoryCard({\r\n onClick,\r\n name,\r\n price,\r\n isCheckbox = false\r\n}: PaymentCategoryCardProps) {\r\n return (\r\n <div\r\n onClick={onClick}\r\n className=\"group cursor-pointer rounded-xl border flex-1 justify-between h-full transition-all duration-200 overflow-hidden border-gray-200 hover:border-gray-300 bg-white\"\r\n >\r\n <div className=\"flex-1 h-full flex flex-col\">\r\n <div\r\n className={cn(\r\n \"flex justify-between items-center p-3 pb-0\"\r\n )}\r\n >\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"font-medium text-gray-900\">{name}</span>\r\n </div>\r\n\r\n <div className={cn(\r\n \"w-4 h-4 border flex items-center justify-center border-gray-300\",\r\n isCheckbox ? \"rounded\" : \"rounded-full\"\r\n )}>\r\n <div className={cn(\r\n \"w-full h-full border border-gray-200\",\r\n isCheckbox ? \"rounded\" : \"rounded-full\"\r\n )} />\r\n </div>\r\n </div>\r\n\r\n <div\r\n className={cn(\r\n \"flex-1 p-3 pt-0 space-y-3 bg-white\"\r\n )}\r\n >\r\n <span className=\"text-md font-bold text-gray-900\">\r\n PKR {price.toLocaleString()}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n});\r\n\r\n\r\ninterface PaymentPreviewProps {\r\n categories: { id: string; name: string; price: number }[];\r\n isCheckbox?: boolean;\r\n}\r\n\r\nconst PaymentPreview = ({ categories, isCheckbox }: PaymentPreviewProps) => {\r\n return (\r\n <div className={`grid sm:grid-cols-2 gap-3`}>\r\n {categories.map((category, index) => (\r\n <PaymentCategoryCard\r\n key={category.id || index}\r\n onClick={() => { }}\r\n name={category.name}\r\n price={category.price}\r\n isCheckbox={isCheckbox}\r\n />\r\n ))}\r\n {categories.length === 0 && (\r\n <div className=\"col-span-2 text-center text-gray-400 py-8 border-2 border-dashed border-gray-200 rounded-lg\">\r\n No payment categories defined\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default memo(PaymentPreview);\r\n"],"names":["PaymentCategoryCard"],"mappings":";;;AAUA,MAAM,sBAAsB,KAAK,SAASA,qBAAoB;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AACjB,GAA6B;AACzB,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA,WAAU;AAAA,MAEV,UAAA,qBAAC,OAAA,EAAI,WAAU,+BACX,UAAA;AAAA,QAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,WAAW;AAAA,cACP;AAAA,YAAA;AAAA,YAGJ,UAAA;AAAA,cAAA,oBAAC,OAAA,EAAI,WAAU,2BACX,UAAA,oBAAC,UAAK,WAAU,6BAA6B,gBAAK,EAAA,CACtD;AAAA,cAEA,oBAAC,SAAI,WAAW;AAAA,gBACZ;AAAA,gBACA,aAAa,YAAY;AAAA,cAAA,GAEzB,UAAA,oBAAC,OAAA,EAAI,WAAW;AAAA,gBACZ;AAAA,gBACA,aAAa,YAAY;AAAA,cAAA,GAC1B,EAAA,CACP;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGJ;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,WAAW;AAAA,cACP;AAAA,YAAA;AAAA,YAGJ,UAAA,qBAAC,QAAA,EAAK,WAAU,mCAAkC,UAAA;AAAA,cAAA;AAAA,cACzC,MAAM,eAAA;AAAA,YAAe,EAAA,CAC9B;AAAA,UAAA;AAAA,QAAA;AAAA,MACJ,EAAA,CACJ;AAAA,IAAA;AAAA,EAAA;AAGZ,CAAC;AAQD,MAAM,iBAAiB,CAAC,EAAE,YAAY,iBAAsC;AACxE,SACI,qBAAC,OAAA,EAAI,WAAW,6BACX,UAAA;AAAA,IAAA,WAAW,IAAI,CAAC,UAAU,UACvB;AAAA,MAAC;AAAA,MAAA;AAAA,QAEG,SAAS,MAAM;AAAA,QAAE;AAAA,QACjB,MAAM,SAAS;AAAA,QACf,OAAO,SAAS;AAAA,QAChB;AAAA,MAAA;AAAA,MAJK,SAAS,MAAM;AAAA,IAAA,CAM3B;AAAA,IACA,WAAW,WAAW,yBAClB,OAAA,EAAI,WAAU,+FAA8F,UAAA,gCAAA,CAE7G;AAAA,EAAA,GAER;AAER;AAEA,MAAA,mBAAe,KAAK,cAAc;"}
@@ -1,10 +0,0 @@
1
- import { default as React } from 'react';
2
-
3
- interface PreviewInputProps {
4
- type: string;
5
- placeholder?: string;
6
- required?: boolean;
7
- showHelper?: boolean;
8
- }
9
- declare const _default: React.NamedExoticComponent<PreviewInputProps>;
10
- export default _default;
@@ -1,143 +0,0 @@
1
- import { jsxs, jsx } from "react/jsx-runtime";
2
- import { memo, useState } from "react";
3
- import { IMaskInput, IMask } from "react-imask";
4
- import dayjs from "../../node_modules/dayjs/dayjs.min.js";
5
- import customParseFormat from "../../node_modules/dayjs/plugin/customParseFormat.js";
6
- import { Calendar } from "lucide-react";
7
- import { AnimatePresence, motion } from "framer-motion";
8
- import { cn } from "../../utils/cn.js";
9
- dayjs.extend(customParseFormat);
10
- const PreviewInput = ({ type, placeholder, showHelper = true }) => {
11
- const [value, setValue] = useState("");
12
- const commonClasses = "w-full rounded-md border border-gray-300 py-2 px-3 text-sm outline-none bg-gray-50 text-gray-500 cursor-default focus:border-primaryx-500 focus:bg-white transition-colors duration-200";
13
- const getHelperText = () => {
14
- switch (type) {
15
- case "EMAIL":
16
- return "Format: example@example.com";
17
- case "PHONE":
18
- return "Format: 0300-1234567";
19
- case "CNIC":
20
- return "Format: 35202-1234567-1";
21
- case "DATE":
22
- return "Format: DD/MM/YYYY";
23
- default:
24
- return "";
25
- }
26
- };
27
- const getDefaultPlaceholder = () => {
28
- switch (type) {
29
- case "EMAIL":
30
- return "test@gmail.com";
31
- case "TEAM_SIZE":
32
- return "Team Size";
33
- case "NAME_ON_TICKET":
34
- return "Name on ticket";
35
- case "INPUT_INT":
36
- case "INPUT_FLOAT":
37
- case "INPUT_STR":
38
- return "";
39
- default:
40
- return "";
41
- }
42
- };
43
- const renderInput = () => {
44
- if (type === "PHONE") {
45
- return /* @__PURE__ */ jsx("div", { className: "relative", children: /* @__PURE__ */ jsx(
46
- IMaskInput,
47
- {
48
- mask: "0300-0000000",
49
- definitions: {
50
- "0": /[0-9]/
51
- },
52
- value,
53
- onAccept: (val) => setValue(val),
54
- placeholder: placeholder || "0300-1234567",
55
- className: cn("pointer-events-none", commonClasses),
56
- onWheel: (e) => e.preventDefault()
57
- }
58
- ) });
59
- }
60
- if (type === "CNIC") {
61
- return /* @__PURE__ */ jsx("div", { className: "relative", children: /* @__PURE__ */ jsx(
62
- IMaskInput,
63
- {
64
- mask: "00000-0000000-0",
65
- definitions: {
66
- "0": /[0-9]/
67
- },
68
- value,
69
- onAccept: (val) => setValue(val),
70
- placeholder: placeholder || "35202-1234567-1",
71
- className: cn("pointer-events-none", commonClasses),
72
- onWheel: (e) => e.preventDefault()
73
- }
74
- ) });
75
- }
76
- if (type === "DATE") {
77
- return /* @__PURE__ */ jsx("div", { className: "relative", children: /* @__PURE__ */ jsxs("div", { className: "relative w-full", children: [
78
- /* @__PURE__ */ jsx(
79
- IMaskInput,
80
- {
81
- mask: "d/m/Y",
82
- onWheel: (e) => e.preventDefault(),
83
- blocks: {
84
- d: {
85
- mask: IMask.MaskedRange,
86
- from: 1,
87
- to: 31,
88
- maxLength: 2
89
- },
90
- m: {
91
- mask: IMask.MaskedRange,
92
- from: 1,
93
- to: 12,
94
- maxLength: 2
95
- },
96
- Y: {
97
- mask: IMask.MaskedRange,
98
- from: 1900,
99
- to: 2999,
100
- maxLength: 4
101
- }
102
- },
103
- value,
104
- onAccept: (val) => setValue(val),
105
- placeholder: placeholder || "DD/MM/YYYY",
106
- className: `${commonClasses} pr-10 pointer-events-none`
107
- }
108
- ),
109
- /* @__PURE__ */ jsx("div", { className: "absolute right-3 top-1/2 -translate-y-1/2 text-gray-400", children: /* @__PURE__ */ jsx(Calendar, { size: 16 }) })
110
- ] }) });
111
- }
112
- return /* @__PURE__ */ jsx(
113
- "input",
114
- {
115
- type: type === "EMAIL" && "email" || (type === "INPUT_INT" || type === "INPUT_FLOAT" || type == "TEAM_SIZE" ? "number" : "text"),
116
- className: cn("pointer-events-none", commonClasses),
117
- placeholder: placeholder || getDefaultPlaceholder(),
118
- value,
119
- onChange: (e) => setValue(e.target.value),
120
- disabled: false,
121
- onWheel: (e) => e.preventDefault()
122
- }
123
- );
124
- };
125
- return /* @__PURE__ */ jsxs("div", { className: "w-full", children: [
126
- renderInput(),
127
- /* @__PURE__ */ jsx(AnimatePresence, { children: showHelper && /* @__PURE__ */ jsx(
128
- motion.div,
129
- {
130
- initial: { opacity: 0, y: -5 },
131
- animate: { opacity: 1, y: 0 },
132
- exit: { opacity: 0, y: -5 },
133
- className: "text-xs text-gray-500 mt-1 ml-1",
134
- children: getHelperText()
135
- }
136
- ) })
137
- ] });
138
- };
139
- const PreviewInput$1 = memo(PreviewInput);
140
- export {
141
- PreviewInput$1 as default
142
- };
143
- //# sourceMappingURL=PreviewInput.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PreviewInput.js","sources":["../../../src/components/FormBuilder/PreviewInput.tsx"],"sourcesContent":["import React, { memo, useState } from 'react';\r\nimport { IMaskInput, IMask } from 'react-imask';\r\nimport dayjs from \"dayjs\";\r\nimport customParseFormat from 'dayjs/plugin/customParseFormat';\r\nimport { Calendar as CalendarIcon } from \"lucide-react\";\r\nimport { motion, AnimatePresence } from 'framer-motion';\r\nimport { cn } from '../../utils/cn';\r\n\r\ndayjs.extend(customParseFormat);\r\n\r\ninterface PreviewInputProps {\r\n type: string;\r\n placeholder?: string;\r\n required?: boolean;\r\n showHelper?: boolean;\r\n}\r\n\r\nconst PreviewInput: React.FC<PreviewInputProps> = ({ type, placeholder, showHelper = true }) => {\r\n const [value, setValue] = useState(\"\");\r\n\r\n const commonClasses = \"w-full rounded-md border border-gray-300 py-2 px-3 text-sm outline-none bg-gray-50 text-gray-500 cursor-default focus:border-primaryx-500 focus:bg-white transition-colors duration-200\";\r\n\r\n const getHelperText = () => {\r\n switch (type) {\r\n case 'EMAIL':\r\n return \"Format: example@example.com\";\r\n case 'PHONE':\r\n return \"Format: 0300-1234567\";\r\n case 'CNIC':\r\n return \"Format: 35202-1234567-1\";\r\n case 'DATE':\r\n return \"Format: DD/MM/YYYY\";\r\n default:\r\n return \"\";\r\n }\r\n };\r\n\r\n const getDefaultPlaceholder = () => {\r\n switch (type) {\r\n case \"EMAIL\":\r\n return \"test@gmail.com\";\r\n case \"TEAM_SIZE\":\r\n return \"Team Size\";\r\n case \"NAME_ON_TICKET\":\r\n return \"Name on ticket\"\r\n case \"INPUT_INT\":\r\n case \"INPUT_FLOAT\":\r\n case \"INPUT_STR\":\r\n return \"\"\r\n default:\r\n return \"\"\r\n }\r\n }\r\n\r\n const renderInput = () => {\r\n if (type === 'PHONE') {\r\n return (\r\n <div className=\"relative\">\r\n <IMaskInput\r\n mask=\"0300-0000000\"\r\n definitions={{\r\n '0': /[0-9]/\r\n }}\r\n value={value}\r\n onAccept={(val: any) => setValue(val)}\r\n placeholder={placeholder || \"0300-1234567\"}\r\n className={cn(\"pointer-events-none\", commonClasses)}\r\n onWheel={(e) => e.preventDefault()}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n if (type === 'CNIC') {\r\n return (\r\n <div className=\"relative\">\r\n <IMaskInput\r\n mask=\"00000-0000000-0\"\r\n definitions={{\r\n '0': /[0-9]/\r\n }}\r\n value={value}\r\n onAccept={(val: any) => setValue(val)}\r\n placeholder={placeholder || \"35202-1234567-1\"}\r\n className={cn(\"pointer-events-none\", commonClasses)}\r\n onWheel={(e) => e.preventDefault()}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n if (type === 'DATE') {\r\n return (\r\n <div className=\"relative\">\r\n <div className=\"relative w-full\">\r\n <IMaskInput\r\n mask=\"d/m/Y\"\r\n onWheel={(e) => e.preventDefault()}\r\n blocks={{\r\n d: {\r\n mask: IMask.MaskedRange,\r\n from: 1,\r\n to: 31,\r\n maxLength: 2,\r\n },\r\n m: {\r\n mask: IMask.MaskedRange,\r\n from: 1,\r\n to: 12,\r\n maxLength: 2,\r\n },\r\n Y: {\r\n mask: IMask.MaskedRange,\r\n from: 1900,\r\n to: 2999,\r\n maxLength: 4,\r\n }\r\n }}\r\n value={value}\r\n onAccept={(val: any) => setValue(val)}\r\n placeholder={placeholder || \"DD/MM/YYYY\"}\r\n className={`${commonClasses} pr-10 pointer-events-none`}\r\n />\r\n <div className=\"absolute right-3 top-1/2 -translate-y-1/2 text-gray-400\">\r\n <CalendarIcon size={16} />\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n // Default for INPUT_STR, EMAIL, INPUT_INT, INPUT_FLOAT, etc.\r\n return (\r\n <input\r\n type={(type === \"EMAIL\" && \"email\") || (type === 'INPUT_INT' || type === 'INPUT_FLOAT' || type == \"TEAM_SIZE\" ? 'number' : 'text')}\r\n className={cn(\"pointer-events-none\", commonClasses)}\r\n placeholder={placeholder || getDefaultPlaceholder()}\r\n value={value}\r\n onChange={(e) => setValue(e.target.value)}\r\n disabled={false}\r\n onWheel={(e) => e.preventDefault()}\r\n />\r\n );\r\n };\r\n\r\n return (\r\n <div className=\"w-full\">\r\n {renderInput()}\r\n <AnimatePresence>\r\n {showHelper && (\r\n <motion.div\r\n initial={{ opacity: 0, y: -5 }}\r\n animate={{ opacity: 1, y: 0 }}\r\n exit={{ opacity: 0, y: -5 }}\r\n className=\"text-xs text-gray-500 mt-1 ml-1\"\r\n >\r\n {getHelperText()}\r\n </motion.div>\r\n )}\r\n </AnimatePresence>\r\n </div>\r\n );\r\n};\r\n\r\nexport default memo(PreviewInput);\r\n"],"names":["CalendarIcon"],"mappings":"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"}