{"version":3,"file":"static/js/index.7e7db49a.js","sources":["webpack://@jotforminc/sheets/./src/assets/icons/maintenance.svg","webpack://@jotforminc/sheets/../../configs/tracking-config/src/index.js","webpack://@jotforminc/sheets/./src/actions/viewsActions.js","webpack://@jotforminc/sheets/./src/components/Modals/WhiteScreenTicketModal.js","webpack://@jotforminc/sheets/../../libs/apploaders/src/Tables/index.js","webpack://@jotforminc/sheets/./src/components/SimpleLoading.js","webpack://@jotforminc/sheets/./src/components/Modals/WhiteScreenModal.js","webpack://@jotforminc/sheets/./src/components/WhiteScreenErrorBoundary.js","webpack://@jotforminc/sheets/./src/components/common/Modal/ModalHeader.js","webpack://@jotforminc/sheets/./src/components/common/Modal/ModalHeaderContent.js","webpack://@jotforminc/sheets/./src/components/common/Modal/ModalHeaderIcon.js","webpack://@jotforminc/sheets/./src/components/common/Modal/ModalSubtitle.js","webpack://@jotforminc/sheets/./src/components/common/Modal/ModalTitle.js","webpack://@jotforminc/sheets/./src/components/common/Modal/Modal.js","webpack://@jotforminc/sheets/./src/components/common/Modal/ModalCloseButton.js","webpack://@jotforminc/sheets/./src/components/common/Modal/ModalBody.js","webpack://@jotforminc/sheets/./src/components/common/Modal/ModalFooter.js","webpack://@jotforminc/sheets/./src/constants/actionTypes.js","webpack://@jotforminc/sheets/./src/constants/collabration.js","webpack://@jotforminc/sheets/./src/constants/filter.js","webpack://@jotforminc/sheets/./src/constants/modals.js","webpack://@jotforminc/sheets/./src/constants/team.js","webpack://@jotforminc/sheets/../../libs/conversations/src/contexts/SubmissionEngineContext/instance.ts","webpack://@jotforminc/sheets/../../libs/conversations/src/assets/incomplete-submission.svg","webpack://@jotforminc/sheets/../../libs/router-bridge/src/init.js","webpack://@jotforminc/sheets/../../libs/sheets-core/src/redux/selectors/index.ts","webpack://@jotforminc/sheets/../../libs/sheets-core/src/utils/RequestHelper.ts","webpack://@jotforminc/sheets/../../libs/conversations/src/utils/api.ts","webpack://@jotforminc/sheets/../../libs/conversations/src/contexts/SubmissionEngineContext/context.ts","webpack://@jotforminc/sheets/../../libs/conversations/src/types/redux.ts","webpack://@jotforminc/sheets/../../libs/conversations/src/selectors/index.ts","webpack://@jotforminc/sheets/../../libs/conversations/src/contexts/SubmissionEngineContext/hooks.ts","webpack://@jotforminc/sheets/../../libs/conversations/src/utils/hasAnyAnswer.ts","webpack://@jotforminc/sheets/../../libs/conversations/src/components/ConversationView/index.tsx","webpack://@jotforminc/sheets/../../libs/conversations/src/slices/conversationsViewsUI.ts","webpack://@jotforminc/sheets/../../libs/conversations/src/components/ConversationList/ConversationItemSkeleton.tsx","webpack://@jotforminc/sheets/../../libs/conversations/src/utils/getFirstAnswer.ts","webpack://@jotforminc/sheets/../../libs/conversations/src/utils/formatDate.ts","webpack://@jotforminc/sheets/../../libs/conversations/src/components/ConversationList/ConversationDate.tsx","webpack://@jotforminc/sheets/../../libs/conversations/src/components/ConversationList/ConversationItem.tsx","webpack://@jotforminc/sheets/../../libs/conversations/src/hooks/useWindowEvent.ts","webpack://@jotforminc/sheets/../../libs/conversations/src/components/ConversationList/ConversationListHeader.tsx","webpack://@jotforminc/sheets/../../libs/conversations/src/components/ConversationList/ConversationList.tsx","webpack://@jotforminc/sheets/../../libs/header-components/src/components/PreviewToggle/index.js","webpack://@jotforminc/sheets/../../libs/sheets-core/src/utils/withClickOutside.tsx","webpack://@jotforminc/sheets/../../libs/conversations/src/components/Header/SearchBar.tsx","webpack://@jotforminc/sheets/../../libs/conversations/src/components/Header/HeaderActions.tsx","webpack://@jotforminc/sheets/../../libs/conversations/src/components/ConversationApp.tsx","webpack://@jotforminc/sheets/../../libs/conversations/src/utils/toJS.tsx","webpack://@jotforminc/sheets/../../libs/conversations/src/contexts/SubmissionEngineContext/contextProvider.tsx","webpack://@jotforminc/sheets/../../libs/conversations/src/containers/ConversationAppContainer.tsx","webpack://@jotforminc/sheets/../../libs/conversations/src/components/HeaderTitleRenderer.tsx","webpack://@jotforminc/sheets/../../libs/conversations/src/sagas/appSagas.ts","webpack://@jotforminc/sheets/../../libs/submission-engine/src/constants/query.ts","webpack://@jotforminc/sheets/../../libs/conversations/src/slices/conversationForms.ts","webpack://@jotforminc/sheets/../../libs/conversations/src/slices/conversationQuestions.ts","webpack://@jotforminc/sheets/../../libs/conversations/src/sagas/conversationsSagas.ts","webpack://@jotforminc/sheets/../../libs/conversations/src/sagas/index.ts","webpack://@jotforminc/sheets/../../libs/conversations/src/slices/index.ts","webpack://@jotforminc/sheets/../../libs/conversations/src/configs/modalsMap.ts","webpack://@jotforminc/sheets/../../libs/conversations/src/components/DummyModal.tsx","webpack://@jotforminc/sheets/../../libs/conversations/src/hooks/useTabMenuSchema.ts","webpack://@jotforminc/sheets/../../libs/conversations/src/hooks/useHelpMenuSchema.ts","webpack://@jotforminc/sheets/../../libs/conversations/src/configs/sheets.tsx","webpack://@jotforminc/sheets/./src/helpers/polyfills.js","webpack://@jotforminc/sheets/./src/routers/getActiveAppRouter.js","webpack://@jotforminc/sheets/./src/stores/makeStore.js","webpack://@jotforminc/sheets/./src/stores/getActiveAppStore.js","webpack://@jotforminc/sheets/./src/components/SimpleError.js","webpack://@jotforminc/sheets/./src/index.js","webpack://@jotforminc/sheets/./src/libs/api/apiUtils.js","webpack://@jotforminc/sheets/./src/libs/api/axios/axiosUtils.js","webpack://@jotforminc/sheets/../../libs/save-and-continue/src/api/index.js","webpack://@jotforminc/sheets/../../libs/save-and-continue/src/index.js","webpack://@jotforminc/sheets/./src/libs/api/axios/interceptors.js","webpack://@jotforminc/sheets/./src/libs/api/axios/index.js","webpack://@jotforminc/sheets/../../../../src/icons/alert-feedback/thumbs-up.svg","webpack://@jotforminc/sheets/../../../../src/icons/alert-feedback/thumbs-down.svg","webpack://@jotforminc/sheets/../../../../src/icons/media/camera-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/ellipsis-horizontal.svg","webpack://@jotforminc/sheets/../../../../src/icons/communication/annotation-info-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/arrows/angle-right-circle-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/communication/message-question-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/documents/document-doc-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/alert-feedback/notification-text-filled.svg","webpack://@jotforminc/sheets/../../libs/agent-utils/src/utils/shadow.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/components/MessageList.js","webpack://@jotforminc/sheets/../../libs/agent-utils/src/utils/text.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/components/Avatar.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/components/ChoiceButton.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/hooks/useStep.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/components/ChoiceList.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/components/questions/YesNo.js","webpack://@jotforminc/sheets/../../libs/constants/src/specialOptions/index.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/components/questions/MultipleChoice.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/components/questions/ImageChoice.js","webpack://@jotforminc/sheets/../../libs/agent-utils/src/utils/matrixUtils.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/components/questions/MatrixSlider.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/components/questions/MatrixYesNo.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/components/questions/Matrix.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/components/icons/StarIcon.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/constants/index.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/components/questions/StarRating.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/components/questions/ScaleRating.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/components/questions/Submit.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/components/icons/SignatureIcon.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/components/questions/Signature.js","webpack://@jotforminc/sheets/../../libs/agent-utils/src/utils/fileOperation.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/components/questions/Upload.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/components/questions/widgets/ImageUploadPreview.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/components/questions/widgets/PDFEmbedder.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/components/questions/widgets/TakePhoto.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/components/questions/widgets/TermsAndCondition.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/components/questions/Appointment.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/components/questions/Image.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/components/HTMLTyping.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/components/questions/Paragraph.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/components/questions/Review.js","webpack://@jotforminc/sheets/../../libs/agent-utils/src/utils/productListUtils.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/components/questions/ProductList.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/components/questions/Generic.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/components/ChatActionView.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/utils/index.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/components/GiveFeedback.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/hooks/index.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/utils/stepUtils.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/components/DefaultErrorBoundaryFallback.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/components/ErrorBoundary.js","webpack://@jotforminc/sheets/../../libs/agent-builder-components/src/assets/Icons.ts","webpack://@jotforminc/sheets/../../libs/agent-builder-components/src/components/Icon.tsx","webpack://@jotforminc/sheets/../../libs/agent-builder-components/src/app/actionsConstants.ts","webpack://@jotforminc/sheets/../../libs/agent-builder-components/src/utils/index.ts","webpack://@jotforminc/sheets/../../libs/agent-builder-components/src/components/actions/ActionListItem.tsx","webpack://@jotforminc/sheets/../../libs/agent-builder-components/src/app/constants.ts","webpack://@jotforminc/sheets/../../libs/agent-builder-components/src/context.tsx","webpack://@jotforminc/sheets/../../libs/agent-builder-components/src/components/LineLoader.tsx","webpack://@jotforminc/sheets/../../libs/agent-builder-components/src/components/materials/MaterialItemContextMenu.tsx","webpack://@jotforminc/sheets/../../libs/agent-builder-components/src/components/modals/MaterialSummaryModal.tsx","webpack://@jotforminc/sheets/../../libs/agent-builder-components/src/components/modals/MaterialConfirmationModal.tsx","webpack://@jotforminc/sheets/../../libs/agent-builder-components/src/components/materials/MaterialListItem.tsx","webpack://@jotforminc/sheets/../../libs/agent-components/src/components/OneOnOneProperty.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/components/MessageView.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/components/FormHeader.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/components/History.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/components/questions/Inline.js","webpack://@jotforminc/sheets/../../libs/agent-components/src/components/questions/Widget.js","webpack://@jotforminc/sheets/../../libs/agent-utils/src/utils/fieldValidation.js","webpack://@jotforminc/sheets/../../libs/agent-utils/src/utils/fitb.js","webpack://@jotforminc/sheets/../../libs/agent-utils/src/utils/index.js","webpack://@jotforminc/sheets/../../libs/agent-utils/src/utils/replaceTags.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/components/AssigneeLine/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/components/ViewWithAlignment/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/components/Label/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/components/LabelWithAlignment/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/components/Answer/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/components/AnswerWithAlignment/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/components/Baseline/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/components/CommaList/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/components/Hypertext/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/components/Image/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/components/Imageline/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/components/AssigneeItem/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/components/AssigneeList/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/components/ImageItem/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/components/ImageList/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/components/OrderedList/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/components/Checkbox/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/components/CheckboxList/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/components/UnorderedList/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/components/List/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/components/OptionItem/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/components/OptionList/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/components/Text/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/components/View/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/components/commonRenderers/getAnswerFieldComponent.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/components/commonRenderers/MissingField.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/components/commonRenderers/makeGetAnswerFieldComponent.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/constants/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/constants/schemas.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/editables/Widget/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Submission/Date/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Submission/ID/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Submission/SubmittedVia/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Textbox/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Workflow/Status/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Address/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Appointment/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/hocs/SubmissionWidget/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Assignee/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/components/Touchable/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Checkbox/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Datetime/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/constants/specials.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Dropdown/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Email/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Fileupload/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Fullname/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Image/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Imagechoice/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Inline/helpers/utils.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Inline/helpers/getHTMLAnswer.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/components/Line/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Inline/helpers/getListAnswer.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Inline/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/components/Emoji/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/components/Tableview/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/hocs/Matrix/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Matrix/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Mixed/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Number/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Phone/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Radio/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Rating/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Scale/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Sheetbox/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Spinner/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Text/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Textarea/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Time/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Yesno/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Autocomp/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Autoincrement/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Birthdate/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Calculation/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Grading/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Hidden/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Range/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Signature/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Slider/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Widget/MetaWidget/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Widget/utils.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Widget/CustomWidgets/5295b800485bd19f5d000005.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Widget/CustomWidgets/529467003477f3512000001f.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Widget/CustomWidgets/533946093c1ad0c45d000070.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Widget/CustomWidgets/529c8286a75dae5e7f000005.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Widget/CustomWidgets/5297188631357d390700000d.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Widget/CustomWidgets/55486915347ef1086c000017.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Widget/CustomWidgets/52961c97e3e5266570000004.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Widget/CustomWidgets/528ee7cf8d5a5fc76a000004.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Widget/CustomWidgets/5295f8da6396ecd66d00000e.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Widget/CustomWidgets/5290397c57a764425100000b.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Widget/CustomWidgets/573ae96be567f40178000011.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Widget/CustomWidgets/52934dbf3be147110a000030.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Widget/CustomWidgets/5343b614d5f416b42a000004.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Widget/CustomWidgets/5379f8c6d6aa823065000009.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Widget/CustomWidgets/5935688a725d1797050002e7.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Widget/CustomWidgets/5ce54324d21603df40000031.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Widget/CustomWidgets/302518f9f4744e3ae379dd71.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Widget/CustomWidgets/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Widget/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/components/ClickOutside/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Payments/StyledComponents.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Payments/PaymentView.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/components/HtmlRenderer/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Payments/Payment/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Paymentmethods/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Submission/IP/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Submission/Submitter/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Submission/Thread/ThreadActor.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Submission/Thread/ThreadAction.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Submission/Thread/ThreadDate.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/Submission/Thread/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/DocumentStatus/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/fields/UserInfo/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/utils/environment.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/utils/index.js","webpack://@jotforminc/sheets/../../libs/answer-fields/src/utils/styled.js","webpack://@jotforminc/sheets/../../libs/answer-utils/src/constants/index.js","webpack://@jotforminc/sheets/../../libs/answer-utils/src/utils/index.js","webpack://@jotforminc/sheets/../../libs/apploaders/src/Container/index.js","webpack://@jotforminc/sheets/../../libs/apploaders/src/Reports/index.js","webpack://@jotforminc/sheets/../../libs/constants/src/aiAgent/index.js","webpack://@jotforminc/sheets/../../libs/constants/src/countries/index.js","webpack://@jotforminc/sheets/../../libs/constants/src/days/index.js","webpack://@jotforminc/sheets/../../libs/constants/src/genders/index.js","webpack://@jotforminc/sheets/../../libs/constants/src/months/index.js","webpack://@jotforminc/sheets/../../libs/constants/src/questions/index.js","webpack://@jotforminc/sheets/../../libs/constants/src/states/index.js","webpack://@jotforminc/sheets/../../libs/constants/src/texts/index.js","webpack://@jotforminc/sheets/../../libs/constants/src/time/index.js","webpack://@jotforminc/sheets/../../libs/constants/src/widgets/index.js","webpack://@jotforminc/sheets/../../libs/drawer/src/components/MenuComponents/MenuItemShortcut.js","webpack://@jotforminc/sheets/../../libs/context-menu/src/components/ContextMenu.js","webpack://@jotforminc/sheets/../../libs/drawer/src/components/MenuComponents/MenuDivider.js","webpack://@jotforminc/sheets/../../libs/drawer/src/components/MenuComponents/MenuItem.js","webpack://@jotforminc/sheets/../../libs/drawer/src/components/MenuComponents/MenuItemBadge.js","webpack://@jotforminc/sheets/../../libs/drawer/src/components/MenuComponents/MenuItemButton.js","webpack://@jotforminc/sheets/../../libs/drawer/src/components/MenuComponents/MenuItemIcon.js","webpack://@jotforminc/sheets/../../libs/drawer/src/components/MenuComponents/MenuItemSubheader.js","webpack://@jotforminc/sheets/../../libs/drawer/src/components/MenuComponents/MenuItemTitle.js","webpack://@jotforminc/sheets/../../libs/drawer/src/components/MenuComponents/MenuList.js","webpack://@jotforminc/sheets/../../libs/drawer/src/utils/index.js","webpack://@jotforminc/sheets/../../libs/dropdown/src/GroupOptionRenderer.js","webpack://@jotforminc/sheets/../../libs/dropdown/src/index.js","webpack://@jotforminc/sheets/../../libs/enterprise-utils/src/helpers.js","webpack://@jotforminc/sheets/../../libs/form-common/src/constants.js","webpack://@jotforminc/sheets/../../libs/form-common/src/utils.js","webpack://@jotforminc/sheets/../../libs/form-common/src/appointment.js","webpack://@jotforminc/sheets/../../libs/form-common/src/components/FormLogo.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Range.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Rating.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Ratingv2.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Separator.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Slider.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Spinner.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Textarea.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Textbox.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Widget.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/helpers/BaseInput.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/helpers/QuestionProps.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/helpers/SubLabel.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/helpers/Utils.js","webpack://@jotforminc/sheets/../../../../src/icons/editor/list-check.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/circle-lg.svg","webpack://@jotforminc/sheets/../../../../src/logos/payment/afterpay-logomark-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/payment/afterpay-logomark-dark.svg","webpack://@jotforminc/sheets/../../../../src/logos/payment/square-ach-logomark-dark.svg","webpack://@jotforminc/sheets/../../../../src/logos/payment/cashapp-logomark-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/payment/applepay-logomark-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/payment/googlepay-logomark-color.svg","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Address.js","webpack://@jotforminc/sheets/../../libs/payment-constants/src/unsupportedDecimalCurrencies.ts","webpack://@jotforminc/sheets/../../libs/form-fields/src/helpers/FormatPrice.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/helpers/MakeProductText.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/helpers/PaymentUtils.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/helpers/ImageOverlay.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/helpers/MultiSelectDropdown.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/helpers/PaymentDropdown.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/helpers/Payment/WarningMessage.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/helpers/ProductContainer.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/helpers/PaymentAPMList.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/helpers/PaymentCreditCardAndAddress.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Authnet.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Autocomp.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Autoincrement.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Appointment.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Birthdate.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Bluepay.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Bluesnap.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Braintree.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/helpers/BaseButton.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Pagebreak.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Button.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Calculation.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/JotCaptcha.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/ReCaptcha.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/HCaptcha.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Captcha.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Cardconnect.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Chargify.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/helpers/OptionsBase.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Checkbox.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Clear.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Clickbank.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Collapse.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Timev2.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Datetime.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Dropdown.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Dwolla.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Email.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Echeck.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Eway.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Firstdata.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/PaypalInvoicing.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Payu.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/PayuMoney.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Pagseguro.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Moneris.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/helpers/MollieApmLists.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Mollie.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/FilepickerIO.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/helpers/IconSVG.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Fileuploadv2.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Fileupload.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Footer.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Fullname.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Geolocation.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Gocardless.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Googleco.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Grading.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Head.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Helper.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Hidden.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/helpers/Link.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/helpers/DivWrapper.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Image.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Inline.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Location.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Matrix.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Number.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Onebip.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Passwordbox.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Payjunction.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Payment.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Paymentwall.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Sensepass.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Paypal.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Paypalexpress.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/helpers/PaymentTypeContainer.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Paypalpro.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Paypalcomplete.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Cybersource.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/helpers/PaypalMessages.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/helpers/PaypalSPBButtons.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/PaypalSPB.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Paysafe.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Iyzico.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Phone.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Radio.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Scalev2.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Scale.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Screenshot.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Signature.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Sofort.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Skrill.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Square.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Stripe.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/StripeCheckout.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/StripeACH.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/StripeACHManual.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Payfast.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Text.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Time.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/2co.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Wepay.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Worldpay.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Worldpayus.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Divider.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Mixed.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Imagechoice.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/helpers/PaypalCommercePlatform.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/Paymentmethods.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/fields/PortalPayment.js","webpack://@jotforminc/sheets/../../libs/form-fields/src/index.js","webpack://@jotforminc/sheets/../../libs/hooks/src/useResize.js","webpack://@jotforminc/sheets/../../libs/hooks/src/index.js","webpack://@jotforminc/sheets/../../libs/emoji-mart/src/components/EmojiWithoutLazy.js","webpack://@jotforminc/sheets/../../libs/icon-selector/src/components/EmojiRenderer/EmojiRendererWithoutLazy.js","webpack://@jotforminc/sheets/../../libs/icon-selector/src/components/SVGIcon/index.js","webpack://@jotforminc/sheets/../../libs/preview/src/components/Image.js","webpack://@jotforminc/sheets/../../../../src/icons/general/magnifying-glass-minus.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/magnifying-glass-plus.svg","webpack://@jotforminc/sheets/../../libs/preview/src/components/PreviewZoomContainer.js","webpack://@jotforminc/sheets/../../libs/preview/src/components/Tiff.js","webpack://@jotforminc/sheets/../../libs/preview/src/components/Audio.js","webpack://@jotforminc/sheets/../../libs/preview/src/components/Video.js","webpack://@jotforminc/sheets/../../libs/utils/src/pdfjsworker.js","webpack://@jotforminc/sheets/../../libs/preview/src/components/PDF.js","webpack://@jotforminc/sheets/../../libs/preview/src/components/PreviewArea.js","webpack://@jotforminc/sheets/../../libs/preview/src/components/PreviewThumbnail.js","webpack://@jotforminc/sheets/../../libs/preview/src/components/PreviewFooter.js","webpack://@jotforminc/sheets/../../libs/preview/src/components/PreviewHeader.js","webpack://@jotforminc/sheets/../../libs/preview/src/components/Preview.js","webpack://@jotforminc/sheets/../../../../src/icons/documents/document-simple-filled.svg","webpack://@jotforminc/sheets/../../libs/preview/src/components/Unsupported.js","webpack://@jotforminc/sheets/../../../../src/icons/products/product-sign-filled.svg","webpack://@jotforminc/sheets/../../libs/preview/src/constants/index.js","webpack://@jotforminc/sheets/../../libs/preview/src/utils/index.js","webpack://@jotforminc/sheets/../../libs/router-bridge/src/jfrouter.js","webpack://@jotforminc/sheets/../../libs/save-and-continue/src/utils/index.js","webpack://@jotforminc/sheets/../../libs/search-filter/src/components/FilterButton.js","webpack://@jotforminc/sheets/../../libs/search-filter/src/components/constants.js","webpack://@jotforminc/sheets/../../libs/search-filter/src/components/FilterRowFields.js","webpack://@jotforminc/sheets/../../libs/search-filter/src/components/FilterRowOperators.js","webpack://@jotforminc/sheets/../../libs/search-filter/src/components/IconRenderer.js","webpack://@jotforminc/sheets/../../libs/search-filter/src/components/FilterRowValue.js","webpack://@jotforminc/sheets/../../libs/search-filter/src/components/FilterRow.js","webpack://@jotforminc/sheets/../../libs/search-filter/src/components/FilterTimeRange.js","webpack://@jotforminc/sheets/../../libs/search-filter/src/components/SearchInRow.js","webpack://@jotforminc/sheets/../../libs/search-filter/src/components/index.js","webpack://@jotforminc/sheets/../../libs/search-filter/src/utils/index.js","webpack://@jotforminc/sheets/../../libs/preview/src/hocs/index.js","webpack://@jotforminc/sheets/../../libs/preview/src/components/SVG.js","webpack://@jotforminc/sheets/../../libs/fileuploadfield/src/components/FileUploadField/index.js","webpack://@jotforminc/sheets/../../libs/fileuploadfield/src/index.js","webpack://@jotforminc/sheets/../../libs/singlesubmissionview/src/constants/index.js","webpack://@jotforminc/sheets/../../libs/singlesubmissionview/src/utils/index.js","webpack://@jotforminc/sheets/../../libs/singlesubmissionview/src/components/ViewItem.js","webpack://@jotforminc/sheets/../../libs/singlesubmissionview/src/components/ViewHeader.js","webpack://@jotforminc/sheets/../../libs/singlesubmissionview/src/components/SingleSubmissionView.js","webpack://@jotforminc/sheets/../../libs/storage-helper/src/constants.js","webpack://@jotforminc/sheets/../../libs/storage-helper/src/index.js","webpack://@jotforminc/sheets/../../../../src/icons/alert-feedback/bell-vertical-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/arrows/angle-down.svg","webpack://@jotforminc/sheets/../../../../src/icons/arrows/angle-left.svg","webpack://@jotforminc/sheets/../../../../src/icons/arrows/angle-right.svg","webpack://@jotforminc/sheets/../../../../src/icons/arrows/angle-up.svg","webpack://@jotforminc/sheets/../../../../src/icons/arrows/arrow-down-to-line.svg","webpack://@jotforminc/sheets/../../../../src/icons/arrows/arrow-down-to-square.svg","webpack://@jotforminc/sheets/../../../../src/icons/arrows/arrow-right.svg","webpack://@jotforminc/sheets/../../../../src/icons/arrows/arrow-rotate-right.svg","webpack://@jotforminc/sheets/../../../../src/icons/arrows/arrow-up-from-bracket.svg","webpack://@jotforminc/sheets/../../../../src/icons/arrows/arrow-up-right-from-square-sm.svg","webpack://@jotforminc/sheets/../../../../src/icons/arrows/arrow-up-right-from-square.svg","webpack://@jotforminc/sheets/../../../../src/icons/arrows/arrows-from-center.svg","webpack://@jotforminc/sheets/../../../../src/icons/arrows/arrows-rotate.svg","webpack://@jotforminc/sheets/../../../../src/icons/arrows/chevron-down.svg","webpack://@jotforminc/sheets/../../../../src/icons/arrows/chevron-left.svg","webpack://@jotforminc/sheets/../../../../src/icons/arrows/chevron-right.svg","webpack://@jotforminc/sheets/../../../../src/icons/communication/envelope-closed-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/communication/envelope-opened-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/communication/inbox-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/communication/message-ellipsis-pencil-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/communication/message-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/communication/message-plus-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/communication/messages-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/communication/paper-plane-diagonal-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/communication/phone-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/documents/document-list-bullet-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/documents/document-pdf-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/editor/align-text-justify.svg","webpack://@jotforminc/sheets/../../../../src/icons/editor/bold.svg","webpack://@jotforminc/sheets/../../../../src/icons/editor/droplet-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/editor/italic.svg","webpack://@jotforminc/sheets/../../../../src/icons/editor/list-bullet.svg","webpack://@jotforminc/sheets/../../../../src/icons/editor/list-number.svg","webpack://@jotforminc/sheets/../../../../src/icons/editor/pen-sign-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/editor/pencil-line-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/editor/printer-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/editor/text-color.svg","webpack://@jotforminc/sheets/../../../../src/icons/editor/type-square-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/editor/underline.svg","webpack://@jotforminc/sheets/../../../../src/icons/finance/tag-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/finance/tags-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/forms-files/folder-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/forms-files/paperclip-diagonal.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/at.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/box-archive-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/check-circle-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/check-circle.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/check-square-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/check-square.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/check.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/circle-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/cloud-arrow-up.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/conditional-branch-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/dropdown-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/ellipsis-vertical.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/exclamation-circle-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/exclamation-triangle-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/eye-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/flag-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/funnel-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/gear-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/grid-dots-vertical.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/info-circle-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/info-circle.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/input-text-short.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/link-diagonal.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/loading.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/location-pin-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/magnifying-glass.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/number-square-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/pencil-to-square.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/plus-circle-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/plus-square-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/plus.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/question-circle-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/rocket-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/shapes-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/single-selection-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/squares-arrow.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/star-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/star.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/text.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/trash-exclamation-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/trash-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/xmark-circle-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/xmark-sm.svg","webpack://@jotforminc/sheets/../../../../src/icons/general/xmark.svg","webpack://@jotforminc/sheets/../../../../src/icons/layout/box-plus-bottom.svg","webpack://@jotforminc/sheets/../../../../src/icons/layout/box-plus-left.svg","webpack://@jotforminc/sheets/../../../../src/icons/layout/box-plus-right.svg","webpack://@jotforminc/sheets/../../../../src/icons/layout/box-plus-top.svg","webpack://@jotforminc/sheets/../../../../src/icons/layout/kanban-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/media/triangle-circle-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/products/ai-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/products/product-form-builder-color-border.svg","webpack://@jotforminc/sheets/../../../../src/icons/products/product-form-builder-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/products/product-form-builder-mono.svg","webpack://@jotforminc/sheets/../../../../src/icons/security/lock-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/security/unlock-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/time-date/calendar-event.svg","webpack://@jotforminc/sheets/../../../../src/icons/time-date/calendar-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/time-date/clock-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/time-date/clock.svg","webpack://@jotforminc/sheets/../../../../src/icons/users/circle-user-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/users/user-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/users/users-filled.svg","webpack://@jotforminc/sheets/../../../../src/icons/users/users-plus-filled.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/salesforce-logomark-color.svg","webpack://@jotforminc/sheets/../../libs/translation/src/domHelper.js","webpack://@jotforminc/sheets/../../libs/translation/src/Translation.js","webpack://@jotforminc/sheets/../../libs/translation/src/constants/index.js","webpack://@jotforminc/sheets/../../libs/translation/src/utils.js","webpack://@jotforminc/sheets/../../libs/translation/src/hof.js","webpack://@jotforminc/sheets/../../libs/translation/src/global.js","webpack://@jotforminc/sheets/../../libs/translation/src/index.js","webpack://@jotforminc/sheets/../../libs/uikit/src/components/Button/index.js","webpack://@jotforminc/sheets/../../libs/uikit/src/components/Dropdown/index.js","webpack://@jotforminc/sheets/../../libs/uikit/src/components/Option/index.js","webpack://@jotforminc/sheets/../../libs/uikit/src/components/OptionGroup/index.js","webpack://@jotforminc/sheets/../../libs/uikit/src/components/Popover/index.js","webpack://@jotforminc/sheets/../../libs/uikit/src/components/Portal/index.js","webpack://@jotforminc/sheets/../../libs/uikit/src/components/TextInput/index.js","webpack://@jotforminc/sheets/../../libs/uikit/src/utils/constants.js","webpack://@jotforminc/sheets/../../libs/uikit/src/utils/hooks.js","webpack://@jotforminc/sheets/../../libs/uikit/src/utils/index.js","webpack://@jotforminc/sheets/../../libs/upload-fields/src/utils/index.js","webpack://@jotforminc/sheets/../../libs/upload-fields/src/index.js","webpack://@jotforminc/sheets/../../libs/utils/src/addressFields.js","webpack://@jotforminc/sheets/../../libs/utils/src/color.js","webpack://@jotforminc/sheets/../../libs/utils/src/data.js","webpack://@jotforminc/sheets/../../libs/utils/src/dom.js","webpack://@jotforminc/sheets/../../libs/utils/src/htmlTools.js","webpack://@jotforminc/sheets/../../libs/utils/src/misc.js","webpack://@jotforminc/sheets/../../libs/utils/src/moment.js","webpack://@jotforminc/sheets/../../libs/constants/src/platforms/index.js","webpack://@jotforminc/sheets/../../libs/feature-flag/src/components/FeatureFlag/FeatureFlag.js","webpack://@jotforminc/sheets/../../libs/utils/src/platform/platform.js","webpack://@jotforminc/sheets/../../libs/utils/src/questions.js","webpack://@jotforminc/sheets/../../libs/utils/src/strings.js","webpack://@jotforminc/sheets/../../libs/utils/src/time.js","webpack://@jotforminc/sheets/../../libs/warning-box/src/index.js","webpack://@jotforminc/sheets/../../libs/widgets-js-sdk/src/utils/getStyle.js","webpack://@jotforminc/sheets/../../libs/widgets-js-sdk/src/utils/postmessage.js","webpack://@jotforminc/sheets/../../libs/widgets-js-sdk/src/translations/index.js","webpack://@jotforminc/sheets/../../libs/widgets-js-sdk/src/utils/loadWidgetImageAsBase64.js","webpack://@jotforminc/sheets/../../libs/widgets-js-sdk/src/widgetsServer/builder.js","webpack://@jotforminc/sheets/../../libs/widgets-js-sdk/src/index.js","webpack://@jotforminc/sheets/../../libs/board/src/api/axiosUtils.ts","webpack://@jotforminc/sheets/../../libs/board/src/api/index.ts","webpack://@jotforminc/sheets/../../libs/board/src/components/CardDetails/CommentAndActivity/Comment/Mention/MentionItem.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/CardDetails/CommentAndActivity/Comment/Mention/MentionList.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/CardDetails/CommentAndActivity/Comment/CommentEdit.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/CardDetails/CommentAndActivity/Comment/CommentInput.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/FilterResultBar.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Kanban/Card/CardElements/Title.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Kanban/Card/CardElements/Tag.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Kanban/Card/CardElements/Cover.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Kanban/Card/CardElements/CardInteractionItems/AssigneeAvatarsBox.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Kanban/Card/CardElements/CardInteractionItems/PriorityBox.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Kanban/Card/CardElements/CardInteractionItems/DateBox.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Kanban/Card/CardElements/CardInteractionItems/CommentBox.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Kanban/Card/CardElements/CardInteractionItems/InteractionItems.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Kanban/Card/CardElements/CardInteractionItems/index.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Popover/Card/CardContextMenuPopover.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Kanban/Card/Card.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Panels/Contents/Archive.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Panels/Contents/Trash.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Panels/EmptyContent.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Panels/FilterBar.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Popover/ColorPopover.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Presets/ModalContents/Title.tsx","webpack://@jotforminc/sheets/../../../../src/icons/products/product-boards-color-border.svg","webpack://@jotforminc/sheets/../../libs/board/src/components/Presets/QuestionMapping/QuestionOption.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Presets/QuestionMapping/QuestionSelect.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Presets/QuestionMapping/MappingRow.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Presets/SubmissionDetails/RowItem.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Presets/SubmissionDetails/DescriptionItem.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Presets/SubmissionDetails/CommentWrapperItem.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Presets/SubmissionDetails/SubmissionDetails.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Presets/QuestionMapping/QuestionMapping.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Presets/QuestionMapping/index.ts","webpack://@jotforminc/sheets/../../libs/board/src/components/common/Editable.tsx","webpack://@jotforminc/sheets/../../libs/board/src/configs/actionTypes.ts","webpack://@jotforminc/sheets/../../libs/board/src/assets/product-boards-exclamation-triangle-filled.svg","webpack://@jotforminc/sheets/../../libs/board/src/utils/useFullstory.ts","webpack://@jotforminc/sheets/../../libs/board/src/components/Presets/Groups/SortableGroupItem.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Presets/Groups/GroupItem.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Presets/Groups/index.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Presets/ModalContents/Presets.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Presets/ModalContents/CreateQuestionMapping.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Presets/CreatorContext.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Presets/CreateBoardModal.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Presets/CreateFlow.tsx","webpack://@jotforminc/sheets/../../libs/board/src/containers/BoardAppContainer.tsx","webpack://@jotforminc/sheets/../../libs/board/src/utils/actionWatcher.tsx","webpack://@jotforminc/sheets/../../libs/board/src/configs/index.tsx","webpack://@jotforminc/sheets/../../libs/board/src/configs/sheetActions.ts","webpack://@jotforminc/sheets/../../libs/board/src/constants/actions.ts","webpack://@jotforminc/sheets/../../libs/board/src/constants/boardQuestions.ts","webpack://@jotforminc/sheets/../../libs/board/src/constants/colors.ts","webpack://@jotforminc/sheets/../../libs/board/src/constants/index.ts","webpack://@jotforminc/sheets/../../libs/board/src/constants/system.ts","webpack://@jotforminc/sheets/../../libs/board/src/components/Modal/index.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Dialog/index.tsx","webpack://@jotforminc/sheets/../../libs/sheets-kanban-view/src/utils/index.ts","webpack://@jotforminc/sheets/../../libs/sheets-kanban-view/src/contexts/KanbanContext.tsx","webpack://@jotforminc/sheets/../../libs/sheets-kanban-view/src/components/Defaults/Card.tsx","webpack://@jotforminc/sheets/../../libs/sheets-kanban-view/src/components/Defaults/GroupHeader.tsx","webpack://@jotforminc/sheets/../../libs/sheets-kanban-view/src/components/Defaults/GroupFooter.tsx","webpack://@jotforminc/sheets/../../libs/sheets-kanban-view/src/store.ts","webpack://@jotforminc/sheets/../../libs/sheets-kanban-view/src/types/index.ts","webpack://@jotforminc/sheets/../../libs/sheets-kanban-view/src/components/SortableCard.tsx","webpack://@jotforminc/sheets/../../libs/sheets-kanban-view/src/utils/hooks.ts","webpack://@jotforminc/sheets/../../libs/sheets-kanban-view/src/components/Group/Group.tsx","webpack://@jotforminc/sheets/../../libs/sheets-kanban-view/src/components/Group/SortableGroup.tsx","webpack://@jotforminc/sheets/../../libs/sheets-kanban-view/src/components/Group/GroupWrapper.tsx","webpack://@jotforminc/sheets/../../libs/sheets-kanban-view/src/utils/dnd.ts","webpack://@jotforminc/sheets/../../libs/sheets-kanban-view/src/components/DragOverlay.tsx","webpack://@jotforminc/sheets/../../libs/sheets-kanban-view/src/components/Groups.tsx","webpack://@jotforminc/sheets/../../libs/sheets-kanban-view/src/components/Container.tsx","webpack://@jotforminc/sheets/../../libs/sheets-kanban-view/src/index.ts","webpack://@jotforminc/sheets/../../libs/sheets-kanban-view/src/components/KanbanBoard.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Popover/Group/GroupColorPopover.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Popover/Group/GroupContextMenuPopover.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Kanban/Group/GroupHeader.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Kanban/Group/GroupFooter.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Kanban/KanbanView.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/BoardView.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/CardDetails/DetailsHeader.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/CardDetails/Submission.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/common/QuillEditor/QuillOptions.ts","webpack://@jotforminc/sheets/../../libs/board/src/components/common/QuillEditor/Toolbar.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/common/QuillEditor/QuillEditor.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/CardDetails/DetailsRows/DescriptionRow.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Fields/Status.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Fields/Assignee.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/common/MultiValueRemove.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/CustomSelect.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Fields/Priority.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/CardDetails/DetailsRows/AssigneeRow.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/CardDetails/DetailsRows/StatusRow.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Popover/Tag/TagSettingsPopover.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Fields/Tag/Tag.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Fields/Tag/TagPlaceholder.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Fields/Tag/TagList.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/CardDetails/DetailsRows/TagRow.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/CardDetails/DetailsRows/PriorityRow.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/CardDetails/DetailsRows/DateRow/TimePicker.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/CardDetails/DetailsRows/DateRow/DateRow.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/CardDetails/DetailsRows/RowRenderer.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/CardDetails/CommentAndActivity/ShowActivityCheckbox.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/CardDetails/CommentAndActivity/CommentAndActivityBar.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/CardDetails/CommentAndActivity/CommentAndActivity.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/CardDetails/DetailsRows/DetailsSectionTabs.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/CardDetails/EditSubmissionIframe.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/CardDetails/StatusHeader.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/CardDetails/CardDetails.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/SecondaryHeader/SearchBar.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Popover/HeaderMoreMenuPopover.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/SecondaryHeader/DefaultHeaderGroup.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Popover/MoveGroupMenuPopover.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/SecondaryHeader/SelectHeaderGroup.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/SecondaryHeader/SecondaryHeader.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Panels/Header.tsx","webpack://@jotforminc/sheets/../../libs/board/src/components/Panels/index.tsx","webpack://@jotforminc/sheets/../../libs/board/src/containers/BoardContainer.tsx","webpack://@jotforminc/sheets/../../libs/board/src/store/client/selectors.ts","webpack://@jotforminc/sheets/../../libs/board/src/store/client/slices/ui.ts","webpack://@jotforminc/sheets/../../libs/board/src/store/client/slices/list.ts","webpack://@jotforminc/sheets/../../libs/board/src/store/client/slices/config.ts","webpack://@jotforminc/sheets/../../libs/board/src/store/client/useStore.ts","webpack://@jotforminc/sheets/../../libs/board/src/store/server/boardQueries.ts","webpack://@jotforminc/sheets/../../libs/board/src/store/server/queryClient.ts","webpack://@jotforminc/sheets/../../libs/board/src/store/server/sourceQueries.ts","webpack://@jotforminc/sheets/../../libs/board/src/types/index.ts","webpack://@jotforminc/sheets/../../libs/board/src/utils/activityFormatter.ts","webpack://@jotforminc/sheets/../../libs/board/src/utils/boardCategories.ts","webpack://@jotforminc/sheets/../../libs/board/src/utils/dnd.ts","webpack://@jotforminc/sheets/../../libs/board/src/utils/hooks.ts","webpack://@jotforminc/sheets/../../libs/board/src/constants/timeConstants.ts","webpack://@jotforminc/sheets/../../libs/board/src/utils/index.ts","webpack://@jotforminc/sheets/../../libs/board/src/utils/registerJotformActions.ts","webpack://@jotforminc/sheets/../../libs/board/src/utils/submissionEngine/index.ts","webpack://@jotforminc/sheets/../../libs/board/src/utils/tempOperations.ts","webpack://@jotforminc/sheets/../../libs/board/src/utils/toJS.tsx","webpack://@jotforminc/sheets/../../libs/cors-worker/src/utils/UnavailableClass.ts","webpack://@jotforminc/sheets/../../libs/cors-worker/src/utils/CorsWorker.ts","webpack://@jotforminc/sheets/../../../../src/logos/integration/googledrive-logomark-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/box-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/onedrive-logomark-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/dropbox-logomark-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/egnyte-logomark-dark.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/quickbooks-logomark-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/airtable-logomark-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/monday-logomark-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/googlesheets-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/microsoftteams-logomark-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/webhooks-logomark-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/campaignmonitor-logomark-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/trello-logomark-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/slack-logomark-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/clickup-logomark-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/zoho-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/googlecalendar-logomark-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/zoom-logomark-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/hubspot-logomark-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/asana-logomark-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/mailerlite-logomark-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/constantcontact-logomark-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/mailchimp-logomark-dark.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/getresponse-logomark-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/activecampaign-logomark-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/aweber-logomark-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/keap-logomark-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/zendesk-logomark-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/pipedrive-logomark-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/sendgrid-logomark-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/ftp-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/icontact-logomark-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/madmimi-logomark-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/highrise-logomark-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/solve-logomark-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/insightly-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/callingly-logomark-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/verticalresponse-logomark-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/zapier-logomark-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/xzazu-logomark-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/paymo-logomark-color.svg","webpack://@jotforminc/sheets/../../../../src/logos/integration/boxsign-color.svg","webpack://@jotforminc/sheets/../../libs/integration-constants/src/icons.ts","webpack://@jotforminc/sheets/../../libs/integration-constants/src/types/index.ts","webpack://@jotforminc/sheets/../../libs/integration-constants/src/partnerDetails/GoogleDriveDetails.ts","webpack://@jotforminc/sheets/../../libs/integration-constants/src/partnerDetails/BoxDetails.ts","webpack://@jotforminc/sheets/../../libs/integration-constants/src/partnerDetails/DropboxDetails.ts","webpack://@jotforminc/sheets/../../libs/integration-constants/src/partnerDetails/OnedriveDetails.ts","webpack://@jotforminc/sheets/../../libs/integration-constants/src/partnerDetails/EgnyteDetails.ts","webpack://@jotforminc/sheets/../../libs/integration-constants/src/partnerDetails/AirtableDetails.ts","webpack://@jotforminc/sheets/../../libs/integration-constants/src/partnerDetails/QuickbooksDetails.ts","webpack://@jotforminc/sheets/../../libs/integration-constants/src/partnerDetails/MondayDetails.ts","webpack://@jotforminc/sheets/../../libs/integration-constants/src/partnerDetails/GoogleSheetsDetails.ts","webpack://@jotforminc/sheets/../../libs/integration-constants/src/partnerDetails/WebhooksV2Details.ts","webpack://@jotforminc/sheets/../../libs/integration-constants/src/partnerDetails/MicrosoftTeamsDetails.ts","webpack://@jotforminc/sheets/../../libs/integration-constants/src/partnerDetails/CampaignMonitorDetails.ts","webpack://@jotforminc/sheets/../../libs/integration-constants/src/partnerDetails/AsanaDetails.ts","webpack://@jotforminc/sheets/../../libs/integration-constants/src/partnerDetails/TrelloDetails.ts","webpack://@jotforminc/sheets/../../libs/integration-constants/src/partnerDetails/SlackDetails.ts","webpack://@jotforminc/sheets/../../libs/integration-constants/src/partnerDetails/ClickUpDetails.ts","webpack://@jotforminc/sheets/../../libs/integration-constants/src/partnerDetails/ZohoDetails.ts","webpack://@jotforminc/sheets/../../libs/integration-constants/src/partnerDetails/HubspotDetails.ts","webpack://@jotforminc/sheets/../../libs/integration-constants/src/partnerDetails/GoogleCalendarDetails.ts","webpack://@jotforminc/sheets/../../libs/integration-constants/src/partnerDetails/ZoomDetails.ts","webpack://@jotforminc/sheets/../../libs/integration-constants/src/partnerDetails/MailerliteDetails.ts","webpack://@jotforminc/sheets/../../libs/integration-constants/src/partnerDetails/ConstantContactDetails.ts","webpack://@jotforminc/sheets/../../libs/integration-constants/src/partnerDetails/GetResponseDetails.ts","webpack://@jotforminc/sheets/../../libs/integration-constants/src/partnerDetails/MailchimpDetails.ts","webpack://@jotforminc/sheets/../../libs/integration-constants/src/partnerDetails/ActiveCampaignDetails.ts","webpack://@jotforminc/sheets/../../libs/integration-constants/src/partnerDetails/AWeberDetails.ts","webpack://@jotforminc/sheets/../../libs/integration-constants/src/partnerDetails/KeapDetails.ts","webpack://@jotforminc/sheets/../../libs/integration-constants/src/partnerDetails/ZendeskDetails.ts","webpack://@jotforminc/sheets/../../libs/integration-constants/src/partnerDetails/PipedriveDetails.ts","webpack://@jotforminc/sheets/../../libs/integration-constants/src/partnerDetails/SendgridDetails.ts","webpack://@jotforminc/sheets/../../libs/integration-constants/src/partnerDetails/MailsoftlyDetails.ts","webpack://@jotforminc/sheets/../../libs/integration-constants/src/partnerDetails/NotionDetails.ts","webpack://@jotforminc/sheets/../../libs/integration-constants/src/partnerDetails/V1Details.ts","webpack://@jotforminc/sheets/../../libs/integration-constants/src/partnerDetails/index.ts","webpack://@jotforminc/sheets/../../libs/integration-constants/src/utils/index.tsx","webpack://@jotforminc/sheets/../../libs/integrations/src/actions/actionTypes.ts","webpack://@jotforminc/sheets/../../libs/integrations/src/context/initialState.ts","webpack://@jotforminc/sheets/../../libs/integrations/src/context/reducers/index.ts","webpack://@jotforminc/sheets/../../libs/integrations/src/context/index.tsx","webpack://@jotforminc/sheets/../../libs/integrations/src/types/enums.ts","webpack://@jotforminc/sheets/../../libs/integrations/src/utils/IntegrationHelper.ts","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Badge/badge.cva.ts","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Badge/badge.types.ts","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Badge/Badge.tsx","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Button/button.cva.ts","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Button/button.types.ts","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Button/ButtonContent.tsx","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Button/Button.tsx","webpack://@jotforminc/sheets/../../../../src/icons/general/minus.svg","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Checkbox/checkbox.cva.ts","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Checkbox/checkbox.types.ts","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Checkbox/Checkbox.tsx","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Dialog/Dialog.tsx","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Dialog/DialogActions.tsx","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Dialog/DialogBody.tsx","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Dialog/DialogCloseButton.tsx","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Dialog/DialogDescription.tsx","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Dialog/DialogIcon.tsx","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Dialog/DialogTitle.tsx","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Dialog/dialog.cva.ts","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Dialog/dialog.types.ts","webpack://@jotforminc/sheets/../../libs/magnet/src/components/FormControl/form-control.cva.ts","webpack://@jotforminc/sheets/../../libs/magnet/src/components/FormControl/FormControl.tsx","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Indicator/indicator.cva.ts","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Indicator/indicator.types.ts","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Indicator/Indicator.tsx","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Input/input.cva.ts","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Input/BaseInput.tsx","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Input/InputText.tsx","webpack://@jotforminc/sheets/../../libs/magnet/src/components/ColorPicker/color-picker.types.ts","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Input/input.types.ts","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Link/link.cva.ts","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Link/link.types.ts","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Link/Link.tsx","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Loader/loader.cva.ts","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Loader/loader.types.ts","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Loader/Loader.tsx","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Modal/Modal.tsx","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Modal/ModalActions.tsx","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Modal/ModalBody.tsx","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Modal/ModalHeader.tsx","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Modal/modal.cva.ts","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Modal/modal.types.ts","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Textarea/textarea.cva.ts","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Textarea/textarea.types.ts","webpack://@jotforminc/sheets/../../libs/magnet/src/components/Textarea/Textarea.tsx","webpack://@jotforminc/sheets/../../libs/magnet/src/constants/common.cva.ts","webpack://@jotforminc/sheets/../../libs/magnet/src/constants/common.values.ts","webpack://@jotforminc/sheets/../../libs/magnet/src/contexts/index.tsx","webpack://@jotforminc/sheets/../../libs/magnet/src/layouts/Flex/Flex.tsx","webpack://@jotforminc/sheets/../../libs/magnet/src/layouts/Flex/FlexItem.tsx","webpack://@jotforminc/sheets/../../libs/magnet/src/layouts/Flex/flex.cva.ts","webpack://@jotforminc/sheets/../../libs/magnet/src/shared/ChoiceLabel/choice-label.types.ts","webpack://@jotforminc/sheets/../../libs/magnet/src/shared/ChoiceLabel/choice-label.cva.ts","webpack://@jotforminc/sheets/../../libs/magnet/src/shared/ChoiceLabel/ChoiceLabel.tsx","webpack://@jotforminc/sheets/../../libs/magnet/src/tokens/colors/primary.ts","webpack://@jotforminc/sheets/../../libs/magnet/src/tokens/colors/secondary.ts","webpack://@jotforminc/sheets/../../libs/magnet/src/utils/index.ts","webpack://@jotforminc/sheets/../../libs/request-layer/src/request-cache/constants.ts","webpack://@jotforminc/sheets/../../libs/request-layer/src/request-cache/utils.ts","webpack://@jotforminc/sheets/../../libs/request-layer/src/request-cache/index.ts","webpack://@jotforminc/sheets/../../libs/request-layer/src/utils/argumentParser.ts","webpack://@jotforminc/sheets/../../libs/request-layer/src/utils/constructInterceptorConfig.ts","webpack://@jotforminc/sheets/../../libs/request-layer/src/layer/interceptors/index.ts","webpack://@jotforminc/sheets/../../libs/request-layer/src/layer/interceptors/defaultInterceptors/index.ts","webpack://@jotforminc/sheets/../../libs/request-layer/src/utils/setInterceptors.ts","webpack://@jotforminc/sheets/../../libs/request-layer/src/layer/engines/utils.ts","webpack://@jotforminc/sheets/../../libs/request-layer/src/layer/engines/AxiosEngine.ts","webpack://@jotforminc/sheets/../../libs/request-layer/src/layer/engines/constants.ts","webpack://@jotforminc/sheets/../../libs/request-layer/src/layer/utils.ts","webpack://@jotforminc/sheets/../../libs/request-layer/src/layer/index.ts","webpack://@jotforminc/sheets/../../libs/request-layer/src/layer/interceptors/customInterceptors/index.ts","webpack://@jotforminc/sheets/../../libs/request-layer/src/layer/interceptors/defaultInterceptors/utils.ts","webpack://@jotforminc/sheets/../../libs/request-layer/src/layer/interceptors/defaultInterceptors/platform/salesforceInterceptors.ts","webpack://@jotforminc/sheets/../../libs/request-layer/src/layer/interceptors/defaultInterceptors/defaultInterceptors.ts","webpack://@jotforminc/sheets/../../libs/request-layer/src/utils/managerUtils.ts","webpack://@jotforminc/sheets/../../libs/sheets-core/src/redux/actionCreators/appActionCreators.ts","webpack://@jotforminc/sheets/../../libs/sheets-core/src/redux/actionCreators/formActionCreators.ts","webpack://@jotforminc/sheets/../../libs/sheets-core/src/redux/actionCreators/genericAppActionCreators.ts","webpack://@jotforminc/sheets/../../libs/sheets-core/src/redux/actionCreators/shareActionCreators.ts","webpack://@jotforminc/sheets/../../libs/sheets-core/src/redux/actionCreators/submissionActionCreators.ts","webpack://@jotforminc/sheets/../../libs/sheets-core/src/redux/actionCreators/uiActionCreators.ts","webpack://@jotforminc/sheets/../../libs/sheets-core/src/redux/actionCreators/userActionCreators.ts","webpack://@jotforminc/sheets/../../libs/sheets-core/src/redux/actionCreators/viewsActionCreators.ts","webpack://@jotforminc/sheets/../../libs/sheets-core/src/redux/actionTypes.ts","webpack://@jotforminc/sheets/../../libs/sheets-core/src/utils/GenericAppManager.ts","webpack://@jotforminc/sheets/../../libs/sheets-core/src/utils/TickWatchman.ts","webpack://@jotforminc/sheets/../../../../src/icons/forms-files/file-magnifying-glass-filled.svg","webpack://@jotforminc/sheets/../../libs/sheets-core/src/redux/modalActionTypes.ts","webpack://@jotforminc/sheets/../../libs/sheets-core/src/utils/useHelpMenuSchema.tsx","webpack://@jotforminc/sheets/../../libs/submission-engine/src/utils/supports.ts","webpack://@jotforminc/sheets/../../libs/submission-engine/src/types/index.ts","webpack://@jotforminc/sheets/../../libs/submission-engine/src/utils/guards.ts","webpack://@jotforminc/sheets/../../libs/submission-engine/src/utils/stream.ts","webpack://@jotforminc/sheets/../../libs/submission-engine/src/engines/DedicatedWorkerSubmissionEngineDocument.ts","webpack://@jotforminc/sheets/../../libs/submission-engine/src/engines/SubmissionEngineEventHelper.ts","webpack://@jotforminc/sheets/../../libs/submission-engine/src/engines/DedicatedWorkerSubmissionEngine.ts","webpack://@jotforminc/sheets/../../libs/tracking/src/utils/FullStoryManager.ts","webpack://@jotforminc/sheets/../../libs/tracking/src/constants/index.ts","webpack://@jotforminc/sheets/../../libs/tracking/src/utils/SentryManager.ts","webpack://@jotforminc/sheets/../../libs/tracking/src/utils/TrackingManager.ts","webpack://@jotforminc/sheets/../../libs/tracking/src/index.ts"],"sourcesContent":["var _rect, _path, _path2, _rect2, _path3, _path4;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nconst SvgMaintenance = props => /*#__PURE__*/React.createElement(\"svg\", _extends({\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 52 20\"\n}, props), _rect || (_rect = /*#__PURE__*/React.createElement(\"rect\", {\n x: 42,\n y: 8,\n width: 10,\n height: 4,\n fill: \"#2B3245\"\n})), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M42 4C42 1.79086 40.2091 0 38 0H30V4V4C31.1046 4 32 4.89543 32 6V6.5V7C32 8.10457 31.1046 9 30 9V9V11V11C31.1046 11 32 11.8954 32 13V13.5V14C32 15.1046 31.1046 16 30 16V16V20H38C40.2091 20 42 18.2091 42 16V4Z\",\n fill: \"#2B3245\"\n})), _path2 || (_path2 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M22 4H26C27.1046 4 28 4.89543 28 6V7C28 8.10457 27.1046 9 26 9H22V4Z\",\n fill: \"#2B3245\"\n})), _rect2 || (_rect2 = /*#__PURE__*/React.createElement(\"rect\", {\n y: 8,\n width: 10,\n height: 4,\n fill: \"#2B3245\"\n})), _path3 || (_path3 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M10 4C10 1.79086 11.7909 0 14 0H22V20H14C11.7909 20 10 18.2091 10 16V4Z\",\n fill: \"#2B3245\"\n})), _path4 || (_path4 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M22 11H26C27.1046 11 28 11.8954 28 13V14C28 15.1046 27.1046 16 26 16H22V11Z\",\n fill: \"#2B3245\"\n})));\nexport default SvgMaintenance;","const { window } = global;\n\nconst getSheetsDSN = () => {\n if (window?.isReport) {\n return 'https://d69c7dc71f6243c19aa8f1466c32ab5c@o61806.ingest.sentry.io/5352078';\n }\n\n if (window?.isBoards) {\n return 'https://983ae60052ddc6cf8a60dca2bfaa3b8c@o61806.ingest.sentry.io/4507571577749504';\n }\n\n // Sheets\n return 'https://23de99eacf6c4a068ba11e1a39556e6a@o61806.ingest.sentry.io/1211430';\n};\n\nconst getFSEnabledForSignFiller = () => {\n try {\n return window?.parent?.fsEnabled;\n } catch (e) {\n return false;\n }\n};\n\nmodule.exports = {\n academy: {\n sentry: {\n enable: true,\n dsn: 'https://e21856d505644c643840103d8dbd250c@o61806.ingest.sentry.io/4506626385641472'\n // name: 'academy',\n }\n },\n checkout: {\n sentry: {\n enable: true,\n dsn: 'https://ca58c76e1157458f941020590eab787c@o61806.ingest.sentry.io/4505396476641280'\n },\n fullStory: {\n enable: true\n }\n },\n 'data-dashboards': {\n sentry: {\n enable: true,\n dsn: 'https://64a93c3dc440e48a9118dc2c169351ef@o61806.ingest.us.sentry.io/4507407451160576'\n }\n },\n 'email-builder': {\n sentry: {\n enable: true,\n dsn: 'https://6625f7b197c65a4d8e49bc8e7641c8c2@o61806.ingest.us.sentry.io/4507407576465408'\n }\n },\n 'email-details': {\n sentry: {\n enable: true,\n dsn: 'https://e0a74287bf15c46b981ddad77de5d7d7@o61806.ingest.sentry.io/4505822059823104'\n },\n fullStory: {\n enable: false\n }\n },\n 'form-builder': {\n sentry: {\n enable: true,\n dsn: 'https://7b39e767f39941dd89d9361cf50382dd@o61806.ingest.sentry.io/132624',\n name: 'jotform-40'\n }\n },\n inbox: {\n sentry: {\n enable: true,\n dsn: 'https://f5fc3cd88f0744df9e3c8a263cd00db1@o61806.ingest.sentry.io/1353659'\n // name: 'inbox'\n },\n fullStory: {\n enable: window?.isFullStoryEnabled\n }\n },\n 'interview-management': {\n sentry: {\n enable: true,\n dsn: 'https://f875f9d7646f4149a6bfff821534e23b@o61806.ingest.sentry.io/4504971807162368'\n }\n },\n listings: {\n sentry: {\n enable: true,\n dsn: 'https://2c715cb8ed4745c383ff6830ca885807@o61806.ingest.sentry.io/5975209',\n name: 'listings'\n },\n fullStory: {\n enable: window?.isFullStoryEnabled\n }\n },\n myaccount: {\n sentry: {\n enable: true,\n dsn: 'https://4048665e726d45eba296f250ad4d09bb@o61806.ingest.sentry.io/6396369'\n // name: 'myaccountv4'\n },\n fullStory: {\n enable: window?.fullstoryEnabled\n }\n },\n 'page-builder': {\n sentry: {\n enable: true,\n dsn: 'https://727c1f481e28485a97e8a4ddae1bdaab@o61806.ingest.sentry.io/6179928'\n // name: 'landing-builder'\n }\n },\n 'pdf-editor': {\n sentry: {\n enable: window?.location.href.indexOf('download') < 0,\n dsn: 'https://10dcd48960b74f9e84c93bee96ee2c9e@o61806.ingest.sentry.io/1234288'\n // name: 'pdf-designer'\n },\n fullStory: {\n enable: window?.isFullStoryEnabled\n }\n },\n portal: {\n sentry: {\n enable: true,\n dsn: 'https://36d29a013f8a4bd7adfe310f5fe4d75a@o61806.ingest.sentry.io/5223511',\n name: 'app-builder'\n },\n fullStory: {\n enable: window?.fullStoryActiveForPortal\n }\n },\n 'refund-request': {\n sentry: {\n enable: true,\n dsn: 'https://c2bf244d1db8d74e25fafaf1b8f70747@o61806.ingest.sentry.io/4505786346110976'\n },\n fullStory: {\n enable: true\n }\n },\n sheets: {\n sentry: {\n enable: true,\n dsn: getSheetsDSN()\n // name: ['reports', 'spreadsheets']\n }\n },\n sign: {\n sentry: {\n enable: true,\n dsn: 'https://9b0abbc9280c47c683b8a9067f61e88e@o61806.ingest.sentry.io/5680940'\n // name: 'sign'\n },\n fullStory: {\n enable: window?.fsEnabled\n }\n },\n 'sign-filler': {\n sentry: {\n enable: true,\n dsn: 'https://1e23807c9020c755e635a09392e97b22@o61806.ingest.us.sentry.io/4507339316985856'\n },\n fullStory: {\n enable: getFSEnabledForSignFiller()\n }\n },\n 'subscription-dashboard': {\n sentry: {\n enable: true,\n dsn: 'https://75f5c88aeffd4f54964275c0fba96d59@o61806.ingest.sentry.io/6190171'\n // name: 'subscription-dashboard'\n }\n },\n workflow: {\n sentry: {\n enable: true,\n dsn: 'https://15571fc5437e4368b4e2ed0e32c6d93f@o61806.ingest.sentry.io/5261296'\n // name: 'workflow'\n },\n fullStory: {\n enable: !window?.isTemplateMode\n }\n },\n 'ai-agent': {\n sentry: {\n enable: true,\n dsn: 'https://9595e22b6185cd8e2ff3ea2fc28cc68f@o61806.ingest.us.sentry.io/4507502561001472',\n name: 'ai-agent'\n }\n },\n 'ai-agent-builder': {\n sentry: {\n enable: true,\n dsn: 'https://59098a0cef7524a00cbc88db5b10e2f5@o61806.ingest.us.sentry.io/4507883422875648'\n },\n fullStory: {\n enable: window?.fsEnabled\n }\n }\n};\n","import { Actions } from '@jotforminc/sheets-core';\nimport {\n CREATE_NEW_VIEW_REQUEST, DELETE_VIEW_REQUEST,\n DIRECT_DOWNLOADABLE_UPLOADS_REQUEST, DUPLICATE_TAB_REQUEST,\n EDIT_VIEWS_ORDER_REQUEST, SHOW_HIDE_EMPTY_UPLOADS_REQUEST,\n SHOW_IMAGE_AS_BIGGER_OR_SMALLER, UPDATE_VIEW_TYPE, RESET_NEW_INCOMPLETE_SUBMISSION,\n ADD_VIEW_SUBMISSIONS, EDIT_VIEW_STORE, APPEND_VIEWS_REQUEST,\n ADD_NEW_RECORD, SET_GROUPING_PARAM, CREATE_REPORT_REQUEST, CREATE_FORM_REQUEST,\n UPDATE_VIEW_STATUS_REQUEST, CHECK_REPORT_IMPORT, DOWNLOAD_UPLOADS, DUPLICATE_REPORT_REQUEST,\n RESET_NEW_PENDING_PAYMENT_SUBMISSION, RESET_COLUMNS_REQUEST,\n EDIT_VIEW_STORE_NO_TRACKING, SET_COLUMN_DATA_EDITING_REQUEST, TOGGLE_WHITE_SCREEN, QUESTIONS_FETCH_SUCCESS, EDIT_COLUMNS_REQUEST, EDIT_COLUMNS_SUCCESS, EDIT_COLUMNS_FAILURE, RESET_VIEW_SUBMISSIONS,\n EDIT_COLUMNS_MANAGE_COLUMN_REQUEST,\n EDIT_COLUMNS_MANAGE_COLUMN_SUCCESS,\n EDIT_SHOW_HIDE_REQUEST\n} from '../constants/actionTypes';\n\nexport const { editView } = Actions;\n\nexport const createNewView = (viewConfig, history = null, isDuplicated = false) => {\n return {\n type: CREATE_NEW_VIEW_REQUEST,\n payload: {\n viewConfig, history, isDuplicated\n }\n };\n};\n\nexport const appendViews = (views) => {\n return {\n type: APPEND_VIEWS_REQUEST,\n payload: { views }\n };\n};\n\nexport const updateViewType = (formID, viewID, config) => {\n return {\n type: UPDATE_VIEW_TYPE,\n payload: { formID, viewID, config }\n };\n};\n\nexport const updateViewStatus = (viewID, status) => {\n return {\n type: UPDATE_VIEW_STATUS_REQUEST,\n payload: { viewID, status }\n };\n};\n\nexport const editViews = (transportInformation) => {\n return {\n type: EDIT_VIEWS_ORDER_REQUEST,\n payload: {\n transportInformation\n }\n };\n};\n\nexport const deleteView = (view, history, params = {}) => {\n return {\n type: DELETE_VIEW_REQUEST,\n payload: { view, history, params }\n };\n};\n\nexport const downloadUploads = () => {\n return {\n type: DOWNLOAD_UPLOADS\n };\n};\n\nexport const directDownloadableUploadsRequest = (formID, selections, sheetID) => {\n return {\n type: DIRECT_DOWNLOADABLE_UPLOADS_REQUEST,\n payload: {\n formID,\n sheetID,\n selections\n }\n };\n};\n\nexport const showHideEmptyUploads = (viewID) => {\n return {\n type: SHOW_HIDE_EMPTY_UPLOADS_REQUEST,\n payload: {\n viewID\n }\n };\n};\n\nexport const setImageAsBiggerOrSmaller = (viewID) => {\n return {\n type: SHOW_IMAGE_AS_BIGGER_OR_SMALLER,\n payload: {\n viewID\n }\n };\n};\n\nexport const setGroupingParam = ({ viewID, qid, save = true }) => {\n return {\n type: SET_GROUPING_PARAM,\n payload: {\n viewID,\n qid,\n save\n }\n };\n};\n\nexport const addViewSubmissions = (viewID, viewSubmissions) => {\n return {\n type: ADD_VIEW_SUBMISSIONS,\n payload: {\n viewID,\n viewSubmissions\n }\n };\n};\n\nexport const editColumnsRequest = (formID, viewID, config, previousConfig) => {\n return {\n type: EDIT_COLUMNS_REQUEST,\n payload: {\n formID,\n viewID,\n config,\n previousConfig\n }\n };\n};\n\nexport const editColumnsManageColumnsRequest = (formID, viewID, config, previousConfig) => {\n return {\n type: EDIT_COLUMNS_MANAGE_COLUMN_REQUEST,\n payload: {\n formID,\n viewID,\n config,\n previousConfig\n }\n };\n};\n\nexport const editColumnsManageColumnsSuccess = (formID, viewID, config, previousConfig) => {\n return {\n type: EDIT_COLUMNS_MANAGE_COLUMN_SUCCESS,\n payload: {\n formID,\n viewID,\n config,\n previousConfig\n }\n };\n};\n\nexport const editColumnsSuccess = (viewID) => {\n return {\n type: EDIT_COLUMNS_SUCCESS,\n payload: { viewID }\n };\n};\n\nexport const editColumnsFailure = (viewID, columns) => {\n return {\n type: EDIT_COLUMNS_FAILURE,\n payload: { viewID, columns }\n };\n};\n\nexport const editViewStore = (formID, viewID, config, merge = false) => {\n return {\n type: EDIT_VIEW_STORE,\n payload: {\n formID,\n viewID,\n config,\n merge,\n }\n };\n};\n\nexport const addNewRecord = () => {\n return {\n type: ADD_NEW_RECORD\n };\n};\n\nexport const createNewReport = (formID, viewConfig, history = null, isDuplicated = false) => {\n return {\n type: CREATE_REPORT_REQUEST,\n payload: {\n formID,\n viewConfig,\n history,\n isDuplicated\n }\n };\n};\n\nexport const createForm = (option, isFromNavigationMenu = false) => {\n return {\n type: CREATE_FORM_REQUEST,\n payload: {\n option,\n isFromNavigationMenu\n }\n };\n};\n\nexport const duplicateTab = (viewID, newView, cloneData) => {\n return {\n type: DUPLICATE_TAB_REQUEST,\n payload: {\n viewID,\n newView,\n cloneData\n }\n };\n};\n\nexport const resetColumns = (viewID) => {\n return {\n type: RESET_COLUMNS_REQUEST,\n payload: {\n viewID\n }\n };\n};\n\nexport const updateReportImportStatus = (tempSheetID, viewIDs) => {\n return {\n type: CHECK_REPORT_IMPORT,\n payload: {\n tempSheetID,\n viewIDs\n }\n };\n};\n\nexport const duplicateReport = ({\n history,\n newView,\n sheetID,\n viewID,\n}) => {\n return {\n type: DUPLICATE_REPORT_REQUEST,\n payload: {\n history,\n newView,\n sheetID,\n viewID,\n },\n };\n};\n\nexport const resetNewIncompleteSubmissions = formID => {\n return {\n type: RESET_NEW_INCOMPLETE_SUBMISSION,\n payload: {\n formID\n }\n };\n};\n\nexport const resetNewPendingPaymentSubmissions = formID => {\n return {\n type: RESET_NEW_PENDING_PAYMENT_SUBMISSION,\n payload: {\n formID\n }\n };\n};\n\nexport const editViewStoreNoTracking = (viewID, config) => {\n return {\n type: EDIT_VIEW_STORE_NO_TRACKING,\n payload: {\n viewID,\n config\n }\n };\n};\n\nexport const setColumnDataEditing = (payload) => {\n return {\n type: SET_COLUMN_DATA_EDITING_REQUEST,\n payload\n };\n};\n\nexport const toggleWhiteScreen = payload => {\n return {\n type: TOGGLE_WHITE_SCREEN,\n payload\n };\n};\n\nexport const questionFetchSuccess = (formID, questions) => {\n return {\n type: QUESTIONS_FETCH_SUCCESS,\n payload: {\n formID,\n questions\n }\n };\n};\n\nexport const resetViewSubmissions = payload => {\n return {\n type: RESET_VIEW_SUBMISSIONS,\n payload\n };\n};\n\nexport const editShowHideColumn = (formID, viewID, config, save = true) => {\n return {\n type: EDIT_SHOW_HIDE_REQUEST,\n payload: { formID, viewID, config, save }\n };\n};\n","import React, { useState } from 'react';\nimport { t, translationRenderer } from '@jotforminc/translation';\nimport { func, shape, string } from 'prop-types';\nimport { IconCheckCircle, IconExclamationTriangleFilled } from '@jotforminc/svg-icons';\nimport { isEnterprise } from '@jotforminc/enterprise-utils';\nimport axios from 'axios';\nimport { Flex } from '@jotforminc/magnet';\nimport { Modal, ModalBody, ModalCloseButton, ModalFooter } from '../common/Modal';\nimport tickWatchman from '../../helpers/TickWatchman';\nimport { WHITE_SCREEN_TICKET_MODAL } from '../../constants/modals';\nimport api from '../../libs/api/axios';\n// eslint-disable-next-line no-restricted-imports\nimport '@jotforminc/jotform.css/animation.css';\nimport { getResponseCode } from '../../libs/api/axios/axiosUtils';\n\n\nconst getTicketDetails = (error) => {\n try {\n if (error instanceof Error) {\n const lines = [];\n\n const message = error.message?.split?.('\\n')?.splice?.(0, 9);\n const sagaStack = error.sagaStack?.split?.('\\n')?.splice?.(0, 9);\n\n lines.push(`${message} (${error.name})`);\n\n if (axios.isAxiosError(error.cause)) {\n const { responseURL, status, statusText, response } = error?.cause?.request ?? {};\n\n lines.push(`Request URL: ${responseURL}`);\n lines.push(`Request Status: ${status} ${statusText}`);\n\n try {\n const { responseCode, message: responseMessage } = JSON.parse(response);\n lines.push(`Request Response: [${responseCode}] ${responseMessage}`);\n } catch (_) { /* noop */ }\n }\n\n if (sagaStack) {\n lines.push(`Saga Stack: ${sagaStack}`);\n }\n\n return lines.join('\\n');\n }\n\n return JSON.stringify(error);\n } catch (_) {\n return JSON.stringify({\n type: typeof error\n });\n }\n};\n\nconst WhiteScreenTicketModal = ({\n closeModalAndRedirect,\n handleTicketModal,\n error = 'ERROR...',\n errorInfo,\n sheetID = '',\n viewID = '',\n userInfo = {},\n errorType\n}) => {\n const [loading, setLoading] = useState(false);\n const [isSuccess, setIsSuccess] = useState(false);\n const [ticketText, setTicketText] = useState('');\n const [hasError, setHasError] = useState(false);\n\n const handleTicketTextChange = (e) => {\n setTicketText(e.target.value);\n };\n\n\n const handleSuccess = () => {\n setIsSuccess(true);\n setLoading(false);\n };\n\n const createTicket = async () => {\n setLoading(true);\n if (hasError) setHasError(false);\n const response = await api.createTicket({\n title: `An error occurred while opening this Table - ${sheetID}`,\n details: `

\n ${ticketText}\n

\n

\n Description: An error occurred. We will inform you when the problem is fixed.\n

`,\n assignee: 'builderTeam',\n priority: 'Important',\n category: '27',\n subCategory: '1409',\n pageUrl: window.location.href,\n // eslint-disable-next-line no-nested-ternary\n userType: isEnterprise()\n ? 'Enterprise'\n : (\n userInfo?.type === 'FORM_USER' || ['FREE', 'GUEST'].indexOf(userInfo?.credentials?.account_type?.name) > -1\n ? 'Free'\n : 'Paid'\n ),\n annotate: `SheetID: ${sheetID}\n ViewID: ${viewID}\n URL: ${window.location.href}\n

\n Error: ${getTicketDetails(error)}\n

\n ErrorInfo: ${errorInfo}`,\n sheetID,\n });\n\n if (getResponseCode(response) >= 400) {\n setHasError(true);\n return;\n }\n tickWatchman.tick({ action: 'ticketOpenedSuccessfully' });\n\n handleSuccess();\n };\n\n return (\n \n {!isSuccess ?\n <>\n \n \n

{t('Create Support Ticket')}

\n

\n {translationRenderer('Please let us know more about the issue in the text box below. We’ll notify you via email [1[email]] as soon as it’s fixed.')({\n renderer1: () => (\n {`(${userInfo?.credentials?.email})`}\n )\n })}\n

\n \n
\n {hasError &&\n \n \n {t('An error occurred. Please try again.')}\n \n }\n \n \n {t('Cancel')}\n \n \n {t('Create Ticket')}\n \n \n \n :\n <>\n \n {errorType === 'GRID_SCREEN' && }\n
\n \n

{t('Ticket Created')}

\n

\n {t('Thanks for your feedback!')}\n

\n

{t('We’ll email you once we’ve fixed the issue.')}

\n \n
\n
\n \n }\n \n );\n};\n\n\nWhiteScreenTicketModal.propTypes = {\n errorInfo: string.isRequired,\n errorType: string.isRequired,\n handleTicketModal: func.isRequired,\n closeModalAndRedirect: func.isRequired,\n error: string,\n sheetID: string,\n viewID: string,\n userInfo: shape({})\n};\n\nexport default WhiteScreenTicketModal;\n","/* eslint-disable react/prop-types */\nimport React from 'react';\nimport Styled from 'styled-components';\nimport Container from '../Container';\n\nexport const LoaderSvg = Styled.svg`\nwidth: 100%;\nheight: 100%;\n.mainRectangle {\n transform-origin: center;\n animation: scale2 1.5s 0s infinite normal cubic-bezier(0.2, 0.68, 0.18, 1.08);\n}\n.item {\n animation-direction: alternate;\n animation-fill-mode: backwards;\n}\nrect:nth-child(2), rect:nth-child(3), rect:nth-child(4) {\n animation: scalerects 1.5s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08);\n transform-origin: 18px 18px;\n}\nrect:nth-child(10), rect:nth-child(9), rect:nth-child(8) {\n animation: scalerects2 1.5s 0s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08);\n transform-origin: 68px 18px;\n}\nrect:nth-child(7), rect:nth-child(5), rect:nth-child(6) {\n transform-origin: 48px 48px;\n animation: scalerects3 1.5s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08);\n}\n@keyframes scalerects {\n 0% { transform: scale(0); }\n 20% { transform: scale(0); }\n 40% { transform: scale(1); }\n 100% {\n transform: scale(1);\n }\n}\n@keyframes scalerects2 {\n 0% { transform: scale(0); }\n 40% { transform: scale(0); }\n 60% {\n transform: scale(1);\n }\n 100% {\n transform: scale(1);\n }\n 100% {\n transform: scale(1);\n }\n}\n@keyframes scalerects3 {\n 0% { transform: scale(0); }\n 60% { transform: scale(0); }\n 80% {\n transform: scale(1);\n }\n 100% {\n transform: scale(1);\n }\n}\n@keyframes scale2 {\n 0% { transform: scale(1); }\n 30% { transform: scale(1); }\n 40% { transform: scale(1.1); }\n 50% { transform: scale(1); }\n 100% {\n transform: scale(1);\n }\n}\n`;\n\nconst Loader = () => {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default Loader;\n","import React from 'react';\nimport {\n TablesLoader,\n ReportsLoader,\n} from '@jotforminc/apploaders';\nimport { getAppPath } from '@jotforminc/router-bridge';\n\nconst loaderMap = {\n '/tables': ,\n '/reports': ,\n};\n\nfunction SimpleLoading() {\n return (\n \n {loaderMap[getAppPath()]}\n \n );\n}\n\nexport default SimpleLoading;\n","/* eslint-disable react-hooks/rules-of-hooks */\nimport React, { useEffect, useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport ReactModal from 'react-modal';\nimport { t, translationRenderer } from '@jotforminc/translation';\nimport { getUrlParameter, handleCustomNavigation } from '@jotforminc/utils';\nimport { Button } from '@jotforminc/magnet';\nimport api from '../../libs/api/axios';\nimport whiteScreen from '../../../public/images/whiteScreen.png';\nimport WhiteScreenTicketModal from './WhiteScreenTicketModal';\nimport tickWatchman from '../../helpers/TickWatchman';\nimport { toggleWhiteScreen } from '../../actions';\nimport genericAppManager from '../../containers/GenericApp/GenericAppManager';\n\nconst TABLES_WHITE_SCREEN_CONFIG = {\n listingPath: '/mytables',\n navigateButtonText: 'Go to My Tables',\n icon: whiteScreen\n};\n\nconst WhiteScreenModal = ({ error = 'ERROR...', errorInfo, sheetID = '', viewID = '', errorType }) => {\n const activeApp = genericAppManager.getActive();\n const WHITE_SCREEN_CONFIG = activeApp ? activeApp.whiteScreen : TABLES_WHITE_SCREEN_CONFIG;\n const [isModalOpened, setIsModalOpened] = useState(false);\n const [userInfo, setUserInfo] = useState({});\n\n const handleTicketModal = () => {\n if (isModalOpened) {\n setIsModalOpened(false);\n tickWatchman.tick({ action: 'ticketModalClosed' });\n } else {\n setIsModalOpened(true);\n tickWatchman.tick({ action: 'ticketModalOpened' });\n }\n };\n\n const renderWhiteScreenIcon = () => {\n // typeof string equality check for icon property type for component differences\n if (typeof WHITE_SCREEN_CONFIG.icon !== 'string') {\n const IconRenderer = WHITE_SCREEN_CONFIG.icon;\n return ;\n }\n return (\n \n );\n };\n\n /**\n * In case the saga occured an error,\n * We will not be able to dispatch any action.\n * But we need to ignore the dispatch error to not getting fatal error on Error Boundary.\n */\n try {\n const dispatch = useDispatch();\n dispatch(toggleWhiteScreen({ viewID: viewID || sheetID }));\n } catch {\n // noop\n }\n\n const closeModalAndRedirect = () => {\n setIsModalOpened(false);\n tickWatchman.tick({ action: 'ticketOpenSuccessfullyRedirectMyForms' });\n handleCustomNavigation(WHITE_SCREEN_CONFIG.listingPath, '_self');\n };\n\n useEffect(() => {\n (async () => {\n const { data: { content } } = await api.fetchCombinedInfo();\n setUserInfo(content);\n })();\n }, []);\n\n const enableTicketCreate = getUrlParameter('enableTicketCreate') === '1';\n\n return (\n \n
\n {renderWhiteScreenIcon()}\n
\n {t('An unexpected error occurred')}\n
\n \n {t(\"We're notified about the error and will fix the issue shortly.\")}\n \n \n {enableTicketCreate && translationRenderer('Please try again later or [1[create a support]] ticket to be notified as soon as it’s fixed.')({\n renderer1: text => (\n \n {text}\n \n )\n })}\n {t('Please try again later.')}\n \n {errorType !== 'GRID_SCREEN' && (\n { handleCustomNavigation(WHITE_SCREEN_CONFIG.listingPath, '_self'); }}\n >\n {t(WHITE_SCREEN_CONFIG.navigateButtonText)}\n \n )}\n
\n {isModalOpened &&\n \n }\n \n );\n};\n\nWhiteScreenModal.propTypes = {\n errorInfo: PropTypes.string.isRequired,\n errorType: PropTypes.string.isRequired,\n error: PropTypes.string,\n sheetID: PropTypes.string,\n viewID: PropTypes.string,\n};\n\nexport default WhiteScreenModal;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport Tracking from '@jotforminc/tracking';\nimport { getUrlParameter } from '@jotforminc/utils';\nimport axios from 'axios';\nimport WhiteScreenModal from './Modals/WhiteScreenModal';\nimport api from '../libs/api/axios';\n\nclass WhiteScreenErrorBoundary extends Component {\n constructor(props) {\n super(props);\n\n this.getSheetID = this.getSheetID.bind(this);\n this.state = {\n hasError: false,\n errorInfo: null\n };\n }\n\n static getDerivedStateFromError(error) {\n return { hasError: error };\n }\n\n getSheetID() {\n const paths = window.location.pathname.split('/');\n if (paths[1] !== 'tables') {\n return false;\n }\n\n const sheetID = paths[2] ?? null;\n const viewID = paths[3] ?? null;\n return { sheetID, viewID };\n }\n\n componentDidCatch(error, errorInfo) {\n const { componentStack } = errorInfo;\n\n if (error) {\n Tracking.captureException(error);\n\n const data = {\n type: this.props.errorType,\n error: {\n message: error.message,\n type: error?.constructor?.prototype?.name,\n stack: error?.stack?.split('\\n')?.slice(0, 15)?.filter(Boolean),\n sagaStack: error?.sagaStack?.split('\\n')?.slice(0, 15)?.filter(Boolean),\n componentStack: errorInfo?.componentStack?.split('\\n')?.slice(0, 15)?.filter(Boolean),\n },\n };\n\n if (axios.isAxiosError(error.cause) && error.cause.request instanceof window.XMLHttpRequest) {\n const { responseURL, status, statusText, response } = error.cause.request;\n\n data.error.axios = {\n responseURL,\n status,\n statusText,\n response,\n traceID: error.cause.request.getResponseHeader('JF-Trace-ID')\n };\n\n if (error.cause.config && typeof error.cause.config === 'object') {\n data.error.axios.config = {\n method: error.cause.config.method,\n url: error.cause.config.url,\n params: error.cause.config.params,\n };\n }\n }\n\n api.logWhiteScreen(data);\n }\n this.setState({ errorInfo: componentStack });\n }\n\n render() {\n const { children, as: Wrapper, wrapperProps, errorType } = this.props;\n const { hasError, errorInfo } = this.state;\n const { sheetID, viewID } = this.getSheetID();\n\n if (hasError && !getUrlParameter('passError')) {\n return (\n \n \n \n );\n }\n return children || null;\n }\n}\n\nWhiteScreenErrorBoundary.propTypes = {\n children: PropTypes.oneOfType([\n PropTypes.arrayOf(PropTypes.node),\n PropTypes.node\n ]).isRequired,\n as: PropTypes.elementType,\n wrapperProps: PropTypes.object,\n errorType: PropTypes.string,\n};\n\nWhiteScreenErrorBoundary.defaultProps = {\n as: React.Fragment,\n wrapperProps: {},\n errorType: 'WHITE_SCREEN',\n};\n\nexport default WhiteScreenErrorBoundary;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\n\nfunction ModalHeader({ children, className = '', ...props }) {\n const classes = classNames(\n 'jSheetModal-header',\n className\n );\n\n return (\n
{children}
\n );\n}\n\nModalHeader.propTypes = {\n children: PropTypes.node.isRequired,\n className: PropTypes.string\n};\n\nexport default ModalHeader;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\n\nfunction ModalHeaderContent({ children, className = '' }) {\n const classes = classNames(\n 'jSheetModal-headerContent flex',\n className,\n );\n\n return (\n
{children}
\n );\n}\n\nModalHeaderContent.propTypes = {\n children: PropTypes.node.isRequired,\n className: PropTypes.string\n};\n\nexport default ModalHeaderContent;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\n\nfunction ModalHeaderIcon({ children, stepIcon = '', ...props }) {\n const classes = classNames(\n 'jSheetColumn-itemIcon mr-3.5',\n stepIcon\n );\n\n return (\n
{children}
\n );\n}\n\nModalHeaderIcon.propTypes = {\n children: PropTypes.node.isRequired,\n className: PropTypes.string,\n stepIcon: PropTypes.string\n};\n\nexport default ModalHeaderIcon;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nfunction ModalSubtitle({ children, id = 'jSheetModalDescription' }) {\n return (\n

{children}

\n );\n}\n\nModalSubtitle.propTypes = {\n children: PropTypes.node.isRequired,\n id: PropTypes.string\n};\n\nexport default ModalSubtitle;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\n\nfunction ModalTitle({ children, id = 'jSheetModalTitle', className = '' }) {\n const classes = classNames(\n 'jSheetModal-title',\n className,\n );\n\n return (\n

{children}

\n );\n}\n\nModalTitle.propTypes = {\n children: PropTypes.node.isRequired,\n id: PropTypes.string,\n className: PropTypes.string\n};\n\nexport default ModalTitle;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ReactModal from 'react-modal';\nimport classNames from 'classnames';\n\nfunction Modal({\n key,\n className = '',\n overlayClassName = '',\n onRequestClose,\n children,\n shouldCloseOnOverlayClick = true,\n shouldCloseOnEsc = false,\n ariaLabelledBy = 'jSheetModalTitle',\n ariaDescribedBy = 'jSheetModalDescription'\n}) {\n const overlayClasses = classNames(\n 'jSheetModal-wrapper',\n overlayClassName\n );\n\n const classes = classNames(\n 'jSheetModal',\n className\n );\n\n return (\n \n {children}\n \n );\n}\n\nModal.propTypes = {\n key: PropTypes.string.isRequired,\n className: PropTypes.string,\n overlayClassName: PropTypes.string,\n onRequestClose: PropTypes.func.isRequired,\n children: PropTypes.node.isRequired,\n shouldCloseOnEsc: PropTypes.bool,\n shouldCloseOnOverlayClick: PropTypes.bool.isRequired,\n ariaLabelledBy: PropTypes.string,\n ariaDescribedBy: PropTypes.string\n};\n\nexport default Modal;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { t } from '@jotforminc/translation';\nimport { IconXmark } from '@jotforminc/svg-icons';\n\nfunction ModalCloseButton({ isPositionFixed = false, className = '', onClick, disabled = false }) {\n const classes = classNames(\n 'jSheetModal-closeModal',\n className,\n { isFixed: isPositionFixed }\n );\n\n return (\n \n \n \n );\n}\n\nModalCloseButton.propTypes = {\n isPositionFixed: PropTypes.bool,\n onClick: PropTypes.func.isRequired,\n className: PropTypes.string,\n disabled: PropTypes.bool\n};\n\nexport default ModalCloseButton;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\n\nfunction ModalBody({ children, className = '', ...props }) {\n const classes = classNames(\n 'jSheetModal-body',\n className\n );\n\n return (\n
{children}
\n );\n}\n\nModalBody.propTypes = {\n children: PropTypes.node.isRequired,\n className: PropTypes.string\n};\n\nexport default ModalBody;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\n\nfunction ModalFooter({ children, className = '', hasShadow = false, ...props }) {\n const classes = classNames(\n 'jSheetModal-footer',\n { hasShadow },\n className\n );\n\n return (\n
{children}
\n );\n}\n\nModalFooter.propTypes = {\n children: PropTypes.node.isRequired,\n className: PropTypes.string,\n hasShadow: PropTypes.bool,\n};\n\nexport default ModalFooter;\n","import { ActionTypes } from '@jotforminc/sheets-core';\n\nexport const {\n // App Actions\n SET_ACTIVE_VIEW,\n CHECK_USER_SESSION_ACTIVITY,\n SET_INACTIVITY_TAB_DATE,\n\n // Form Actions\n EDIT_FORM_PROPERTIES_REQUEST,\n EDIT_FORM_PROPERTIES_SUCCESS,\n EDIT_FORM_PROPERTIES_FAILURE,\n\n // Share Actions\n ADD_USERS_TO_SHARED_RESOURCE_REQUEST,\n ADD_USERS_TO_SHARED_RESOURCE_SUCCESS,\n ADD_USERS_TO_SHARED_RESOURCE_FAILURE,\n\n // Submission Actions\n SAVE_NEW_FILTERS,\n\n // UI Actions\n UI_TOGGLE_MODAL,\n UI_TOGGLE_DROPDOWN,\n UI_TOGGLE_NOTIFICATION,\n\n // User Actions\n UPDATE_USER_SETTING_REQUEST,\n UPDATE_USER_SETTING_SUCCESS,\n UPDATE_USER_SETTING_FAILURE,\n\n // View Actions\n VIEW_FETCH_REQUEST,\n VIEW_FETCH_FAILURE,\n VIEW_FETCH_SUCCESS,\n\n EDIT_VIEW_REQUEST,\n EDIT_VIEW_SUCCESS,\n EDIT_VIEW_FAILURE\n} = ActionTypes;\n\nexport const INITIALIZE_USER_REQUEST = 'INITIALIZE_USER_REQUEST';\nexport const INITIALIZE_USER_SUCCESS = 'INITIALIZE_USER_SUCCESS';\nexport const INITIALIZE_USER_FAILURE = 'INITIALIZE_USER_FAILURE';\nexport const INITIALIZE_FORM_REQUEST = 'INITIALIZE_FORM_REQUEST';\nexport const INITIALIZE_FORM_SUCCESS = 'INITIALIZE_FORM_SUCCESS';\nexport const INITIALIZE_FORM_FAILURE = 'INITIALIZE_FORM_FAILURE';\nexport const INITIALIZE_VIEW_REQUEST = 'INITIALIZE_VIEW_REQUEST';\nexport const INITIALIZE_VIEW_SUCCESS = 'INITIALIZE_VIEW_SUCCESS';\nexport const INITIALIZE_VIEW_FAILURE = 'INITIALIZE_VIEW_FAILURE';\n\nexport const INIT_NEW_SHEET_GENERATOR = 'INIT_NEW_SHEET_GENERATOR';\nexport const INIT_NEW_SHEET_GENERATOR_FAILURE = 'INIT_NEW_SHEET_GENERATOR_FAILURE';\n\nexport const INIT_SHEETS_APP_REQUEST = 'INIT_SHEETS_APP_REQUEST';\nexport const INIT_SHEETS_APP_SUCCESS = 'INIT_SHEETS_APP_SUCCESS';\n\nexport const INIT_SHEET = 'INIT_SHEET';\nexport const UPDATE_VIEW_TYPE = 'UPDATE_VIEW_TYPE';\nexport const UPDATE_VIEW_STATUS_REQUEST = 'UPDATE_VIEW_STATUS_REQUEST';\nexport const UPDATE_VIEW_STATUS_SUCCESS = 'UPDATE_VIEW_STATUS_SUCCESS';\nexport const UPDATE_VIEW_STATUS_FAILURE = 'UPDATE_VIEW_STATUS_FAILURE';\n\nexport const FORM_FETCH_REQUEST = 'FORM_FETCH_REQUEST';\nexport const FORM_FETCH_SUCCESS = 'FORM_FETCH_SUCCESS';\nexport const FORM_FETCH_FAILURE = 'FORM_FETCH_FAILURE';\n\nexport const RESET_APP = 'RESET_APP';\n\nexport const INIT_REPORTS_APP = 'INIT_REPORTS_APP';\nexport const INIT_REPORTS_APP_FAILURE = 'INIT_REPORTS_APP_FAILURE';\n\nexport const INIT_SIMPLE_REPORTS_APP = 'INIT_SIMPLE_REPORTS_APP';\nexport const INIT_SIMPLE_REPORTS_APP_FAILURE = 'INIT_SIMPLE_REPORTS_APP_FAILURE';\n\nexport const USER_FETCH_SUCCESS = 'USER_FETCH_SUCCESS';\n\nexport const USER_FORMS_FETCH_SUCCESS = 'USER_FORMS_FETCH_SUCCESS';\n\nexport const QUESTIONS_FETCH_SUCCESS = 'QUESTIONS_FETCH_SUCCESS';\n\nexport const VIEWS_FETCH_SUCCESS = 'VIEWS_FETCH_SUCCESS';\nexport const VIEW_DETAILS_FETCH_SUCCESS = 'VIEW_DETAILS_FETCH_SUCCESS';\nexport const CREATE_DEFAULT_VIEW_SUCCESS = 'CREATE_DEFAULT_VIEW_SUCCESS';\nexport const SET_ACTIVE_VIEW_UNTRACKED = 'SET_ACTIVE_VIEW_UNTRACKED';\nexport const CREATE_UNREAD_COLUMNS = 'CREATE_UNREAD_COLUMNS_REQUEST';\n\nexport const SORT_GRID = 'SORT_GRID';\n\nexport const SUBMISSIONS_FETCH_REQUEST = 'SUBMISSIONS_FETCH_REQUEST';\nexport const SUBMISSIONS_FETCH_SUCCESS = 'SUBMISSIONS_FETCH_SUCCESS';\nexport const SUBMISSIONS_FETCH_FAILURE = 'SUBMISSIONS_FETCH_FAILURE';\n\nexport const FETCH_SUBMISSIONS_ACCORDING_TO_PARAMS = 'FETCH_SUBMISSIONS_ACCORDING_TO_PARAMS';\nexport const ADD_FILTER_PARAMS = 'ADD_FILTER_PARAMS';\n\nexport const ALL_SUBMISSIONS_FETCH_REQUEST = 'ALL_SUBMISSIONS_FETCH_REQUEST';\nexport const ALL_SUBMISSIONS_FETCH_SUCCESS = 'ALL_SUBMISSIONS_FETCH_SUCCESS';\nexport const ALL_SUBMISSIONS_FETCH_FAILURE = 'ALL_SUBMISSIONS_FETCH_FAILURE';\n\nexport const FETCH_ALL_SUBMISSIONS_ACCORDING_TO_GROUP_REQUEST = 'FETCH_ALL_SUBMISSIONS_ACCORDING_TO_GROUP_REQUEST';\nexport const FETCH_ALL_SUBMISSIONS_ACCORDING_TO_GROUP_SUCCESS = 'FETCH_ALL_SUBMISSIONS_ACCORDING_TO_GROUP_SUCCESS';\nexport const FETCH_ALL_SUBMISSIONS_ACCORDING_TO_GROUP_FAILURE = 'FETCH_ALL_SUBMISSIONS_ACCORDING_TO_GROUP_FAILURE';\n\nexport const SUBMISSION_IDS_FETCH_REQUEST = 'SUBMISSION_IDS_FETCH_REQUEST';\nexport const SUBMISSION_IDS_FETCH_SUCCESS = 'SUBMISSION_IDS_FETCH_SUCCESS';\nexport const SUBMISSION_IDS_FETCH_FAILURE = 'SUBMISSION_IDS_FETCH_FAILURE';\n\nexport const SINGLE_SUBMISSION_FETCH_REQUEST = 'SINGLE_SUBMISSION_FETCH_REQUEST';\nexport const SINGLE_SUBMISSION_FETCH_SUCCESS = 'SINGLE_SUBMISSION_FETCH_SUCCESS';\nexport const SINGLE_SUBMISSION_FETCH_FAILURE = 'SINGLE_SUBMISSION_FETCH_FAILURE';\n\nexport const MULTIPLE_SUBMISSION_FETCH_REQUEST = 'MULTIPLE_SUBMISSION_FETCH_REQUEST';\nexport const MULTIPLE_SUBMISSION_FETCH_SUCCESS = 'MULTIPLE_SUBMISSION_FETCH_SUCCESS';\nexport const MULTIPLE_SUBMISSION_FETCH_FAILURE = 'MULTIPLE_SUBMISSION_FETCH_FAILURE';\n\nexport const FETCH_SUBMISSION_REQUEST = 'FETCH_SUBMISSION_REQUEST';\nexport const FETCH_SUBMISSION_SUCCESS = 'FETCH_SUBMISSION_SUCCESS';\nexport const FETCH_SUBMISSION_FAILURE = 'FETCH_SUBMISSION_FAILURE';\n\nexport const RESET_SUBMISSIONS_REQUEST = 'RESET_SUBMISSIONS_REQUEST';\nexport const RESET_SUBMISSIONS = 'RESET_SUBMISSIONS';\nexport const RESET_VIEW_SUBMISSIONS = 'RESET_VIEW_SUBMISSIONS';\n\nexport const UPDATE_VIEW_SUBMISSIONS_REDUCER = 'UPDATE_VIEW_SUBMISSIONS_REDUCER';\n\nexport const RESET_UI_PROPS = 'RESET_UI_PROPS';\n\nexport const UPDATE_VIEW_SUBMISSIONS = 'UPDATE_VIEW_SUBMISSIONS';\nexport const UPDATE_VIEW_SUBMISSIONS_LIST = 'UPDATE_VIEW_SUBMISSIONS_LIST';\nexport const ADD_VIEW_SUBMISSIONS = 'ADD_VIEW_SUBMISSIONS';\nexport const REPLACE_VIEW_SUBMISSIONS = 'REPLACE_VIEW_SUBMISSIONS';\n\nexport const UPDATE_FILTERED_SHEET_SUBMISSIONS = 'UPDATE_FILTERED_SHEET_SUBMISSIONS';\nexport const DELETE_FILTERED_SHEET_SUBMISSION = 'DELETE_FILTERED_SHEET_SUBMISSION';\n\nexport const SET_GROUPED_SHEET_SUBMISSIONS = 'SET_GROUPED_SHEET_SUBMISSIONS';\nexport const UPDATE_GROUPED_SHEET_SUBMISSIONS = 'UPDATE_GROUPED_SHEET_SUBMISSIONS';\nexport const SET_GROUPED_SUBMISSION_LIST = 'SET_GROUPED_SUBMISSION_LIST';\n\nexport const UPDATE_SUBMISSIONS_ANSWER = 'UPDATE_SUBMISSIONS_ANSWER';\nexport const UPDATE_SUBMISSION_ANSWERS_PRETTY_FORMAT = 'UPDATE_SUBMISSION_ANSWERS_PRETTY_FORMAT';\n\nexport const UI_SET_DROPDOWN_PROPS = 'UI_SET_DROPDOWN_PROPS';\nexport const UI_CLOSE_ALL_DROPDOWNS = 'UI_CLOSE_ALL_DROPDOWNS';\n\nexport const SET_FETCHED_SVGS_REQUEST = 'SET_FETCHED_SVGS_REQUEST';\nexport const SET_FETCHED_SVGS_SUCCESS = 'SET_FETCHED_SVGS_SUCCESS';\n\nexport const TOGGLE_ENCRYPTION_KEY_WIZARD = 'TOGGLE_ENCRYPTION_KEY_WIZARD';\n\nexport const SET_SELECTED_COLUMNS = 'SET_SELECTED_COLUMNS';\nexport const SET_SELECTED_COLUMNS_COPY_STATUS = 'SET_SELECTED_COLUMNS_COPY_STATUS';\nexport const SET_PIVOT_COLUMN = 'SET_PIVOT_COLUMN';\nexport const SET_PIVOT_ROW = 'SET_PIVOT_ROW';\n\nexport const SET_COLUMN_RESIZING_STATUS = 'SET_COLUMN_RESIZING_STATUS';\n\nexport const SET_GROUPING_PARAM = 'SET_GROUPING_PARAM';\nexport const SET_GROUPING_COLLAPSED_MAP = 'SET_GROUPING_COLLAPSED_MAP';\nexport const SET_GROUPING_MAP = 'SET_GROUPING_MAP';\nexport const TOGGLE_GROUPING_COLLAPSE = 'TOGGLE_GROUPING_COLLAPSE';\nexport const SET_GROUPING_LOADING_STATE = 'SET_GROUPING_LOADING_STATE';\nexport const UPDATE_GROUPING_LOADING_STATES = 'UPDATE_GROUPING_LOADING_STATES';\nexport const TOGGLE_ALL_GROUPS = 'TOGGLE_ALL_GROUPS';\n\nexport const SET_ROW_INDEX_FOR_SCROLLING = 'SET_ROW_INDEX_FOR_SCROLLING';\n\nexport const UI_OPEN_ONLY_ONE_DROPDOWN = 'UI_OPEN_ONLY_ONE_DROPDOWN';\n\nexport const CREATE_NEW_VIEW_REQUEST = 'CREATE_NEW_VIEW_REQUEST';\nexport const CREATE_NEW_VIEW_SUCCESS = 'CREATE_NEW_VIEW_SUCCESS';\nexport const CREATE_NEW_VIEW_FAILURE = 'CREATE_NEW_VIEW_FAILURE';\n\nexport const APPEND_VIEWS_REQUEST = 'APPEND_VIEWS_REQUEST';\nexport const APPEND_VIEWS_SUCCESS = 'APPEND_VIEWS_SUCCESS';\nexport const APPEND_VIEWS_FAILURE = 'APPEND_VIEWS_FAILURE';\n\nexport const EDIT_VIEW_REQUEST_NO_TRACKING = 'EDIT_VIEW_REQUEST_NO_TRACKING';\n\nexport const EDIT_SHOW_HIDE_REQUEST = 'EDIT_SHOW_HIDE_REQUEST';\nexport const EDIT_SHOW_HIDE_SUCCESS = 'EDIT_SHOW_HIDE_SUCCESS';\nexport const EDIT_SHOW_HIDE_FAILURE = 'EDIT_SHOW_HIDE_FAILURE';\n\nexport const EDIT_SHEET_PROPERTIES = 'EDIT_SHEET_PROPERTIES';\n\nexport const EDIT_VIEW_STORE = 'EDIT_VIEW_STORE';\nexport const EDIT_VIEW_STORE_NO_TRACKING = 'EDIT_VIEW_STORE_NO_TRACKING';\n\nexport const EDIT_VIEWS_ORDER_REQUEST = 'EDIT_VIEWS_ORDER_REQUEST';\nexport const EDIT_VIEWS_ORDER_SUCCESS = 'EDIT_VIEWS_ORDER_SUCCESS';\nexport const EDIT_VIEWS_ORDER_FAILURE = 'EDIT_VIEWS_ORDER_FAILURE';\n\nexport const UPDATE_VIEWS_ORDER = 'UPDATE_VIEWS_ORDER';\n\nexport const DELETE_VIEW_REQUEST = 'DELETE_VIEW_REQUEST';\nexport const DELETE_VIEW_SUCCESS = 'DELETE_VIEW_SUCCESS';\nexport const DELETE_VIEW_FAILURE = 'DELETE_VIEW_FAILURE';\n\nexport const SET_VIEW_TEMP_FILTERS = 'SET_VIEW_TEMP_FILTERS';\nexport const SET_ACTIVE_VIEW_FILTERS_FROM_URL = 'SET_ACTIVE_VIEW_FILTERS_FROM_URL';\nexport const SET_VIEW_CURRENT_FILTERS = 'SET_VIEW_CURRENT_FILTERS';\n\nexport const QUESTION_OPTIONS_REQUEST = 'QUESTION_OPTIONS_REQUEST';\nexport const QUESTION_OPTIONS_SUCCESS = 'QUESTION_OPTIONS_SUCCESS';\nexport const QUESTION_OPTIONS_FAILURE = 'QUESTION_OPTIONS_FAILURE';\n\nexport const EDIT_SUBMISSION_REQUEST = 'EDIT_SUBMISSION_REQUEST';\nexport const EDIT_SUBMISSION_SUCCESS = 'EDIT_SUBMISSION_SUCCESS';\nexport const EDIT_SUBMISSION_FAILURE = 'EDIT_SUBMISSION_FAILURE';\n\nexport const EDIT_SUBMISSIONS_INIT = 'EDIT_SUBMISSIONS_INIT';\nexport const EDIT_SUBMISSIONS_REQUEST = 'EDIT_SUBMISSIONS_REQUEST';\nexport const EDIT_SUBMISSIONS_SUCCESS = 'EDIT_SUBMISSIONS_SUCCESS';\n\nexport const EDIT_SUBMISSIONS_FAILURE = 'EDIT_SUBMISSIONS_FAILURE';\n\nexport const UI_AGENT_HISTORY_DOWNLOADING = 'UI_AGENT_HISTORY_DOWNLOADING';\nexport const DOWNLOAD_AGENT_SUBMISSION_HISTORY = 'DOWNLOAD_AGENT_SUBMISSION_HISTORY';\nexport const SET_AI_AGENT_HISTORY = 'SET_AI_AGENT_HISTORY';\n\nexport const UPDATE_SUBMISSION_SUCCESS = 'UPDATE_SUBMISSION_SUCCESS';\nexport const UPDATE_SUBMISSION_ANSWER = 'UPDATE_SUBMISSION_ANSWER';\nexport const UPDATE_SUBMISSION_ANSWER_PRETTY_FORMAT = 'UPDATE_SUBMISSION_ANSWER_PRETTY_FORMAT';\n\nexport const UI_SET_INFO_MESSAGE = 'UI_SET_INFO_MESSAGE';\n\nexport const INIT_ARCHIVE = 'INIT_ARCHIVE';\nexport const ARCHIVE_SCROLL_FETCH = 'ARCHIVE_SCROLL_FETCH';\n\nexport const ARCHIVE_SUBMISSIONS_REQUEST = 'ARCHIVE_SUBMISSIONS_REQUEST';\nexport const ARCHIVE_SUBMISSIONS_SUCCESS = 'ARCHIVE_SUBMISSIONS_SUCCESS';\nexport const ARCHIVE_SUBMISSIONS_FAILURE = 'ARCHIVE_SUBMISSIONS_FAILURE';\n\nexport const UNARCHIVE_SUBMISSIONS_REQUEST = 'UNARCHIVE_SUBMISSIONS_REQUEST';\nexport const UNARCHIVE_SUBMISSIONS_SUCCESS = 'UNARCHIVE_SUBMISSIONS_SUCCESS';\n\nexport const ARCHIVE_TRASH_SUBMISSIONS_REQUEST = 'ARCHIVE_TRASH_SUBMISSIONS_REQUEST';\nexport const ARCHIVE_TRASH_SUBMISSIONS_CONFIRM = 'ARCHIVE_TRASH_SUBMISSIONS_CONFIRM';\nexport const ARCHIVE_TRASH_SUBMISSIONS_SUCCESS = 'ARCHIVE_TRASH_SUBMISSIONS_SUCCESS';\nexport const ARCHIVE_RESTORE_TO_ARCHIVE_REQUEST = 'ARCHIVE_RESTORE_TO_ARCHIVE_REQUEST';\nexport const ARCHIVE_RESTORE_TO_ARCHIVE_SUCCESS = 'ARCHIVE_RESTORE_TO_ARCHIVE_SUCCESS';\n\nexport const FETCH_ARCHIVED_SUBMISSIONS_REQUEST = 'FETCH_ARCHIVED_SUBMISSIONS_REQUEST';\n\nexport const FETCH_ASSIGNEE_SUBMISSIONS_REQUEST = 'FETCH_ASSIGNEE_SUBMISSIONS_REQUEST';\n\nexport const UPDATE_ARCHIVE_SEARCH_TERM = 'UPDATE_ARCHIVE_SEARCH_TERM';\nexport const SEARCH_ARCHIVE = 'SEARCH_ARCHIVE';\n\nexport const DELETE_SUBMISSIONS_SUCCESS = 'DELETE_SUBMISSIONS_SUCCESS';\nexport const DELETE_SUBMISSIONS_FAILURE = 'DELETE_SUBMISSIONS_FAILURE';\n\nexport const DELETE_SUBMISSION_REQUEST = 'DELETE_SUBMISSION_REQUEST';\nexport const DELETE_SUBMISSION_SUCCESS = 'DELETE_SUBMISSION_SUCCESS';\nexport const DELETE_SUBMISSION_FAILURE = 'DELETE_SUBMISSION_FAILURE';\n\nexport const DELETE_SUBMISSION_CONFIRM_REQUEST = 'DELETE_SUBMISSION_CONFIRM_REQUEST';\nexport const DELETE_SUBMISSION_CONFIRM_SUCCESS = 'DELETE_SUBMISSION_CONFIRM_SUCCESS';\nexport const DELETE_SUBMISSION_CONFIRM_FAILURE = 'DELETE_SUBMISSION_CONFIRM_FAILURE';\n\nexport const FETCH_DELETED_SUBMISSIONS_REQUEST = 'FETCH_DELETED_SUBMISSIONS_REQUEST';\nexport const FETCH_DELETED_SUBMISSIONS_SUCCESS = 'FETCH_DELETED_SUBMISSIONS_SUCCESS';\nexport const FETCH_DELETED_SUBMISSIONS_FAILURE = 'FETCH_DELETED_SUBMISSIONS_FAILURE';\n\nexport const FETCH_RESTORED_SUBMISSION_REQUEST = 'FETCH_RESTORED_SUBMISSION_REQUEST';\n\nexport const PURGE_SUBMISSION_REQUEST = 'PURGE_SUBMISSION_REQUEST';\nexport const PURGE_SUBMISSION_SUCCESS = 'PURGE_SUBMISSION_SUCCESS';\nexport const PURGE_SUBMISSION_FAILURE = 'PURGE_SUBMISSION_FAILURE';\n\nexport const PURGE_SUBMISSION_CONFIRM_REQUEST = 'PURGE_SUBMISSION_CONFIRM_REQUEST';\nexport const PURGE_SUBMISSION_CONFIRM_SUCCESS = 'PURGE_SUBMISSION_CONFIRM_SUCCESS';\nexport const PURGE_SUBMISSION_CONFIRM_FAILURE = 'PURGE_SUBMISSION_CONFIRM_FAILURE';\n\nexport const RESTORE_SUBMISSIONS_REQUEST = 'RESTORE_SUBMISSIONS_REQUEST';\nexport const RESTORE_SUBMISSIONS_SUCCESS = 'RESTORE_SUBMISSIONS_SUCCESS';\nexport const RESTORE_SUBMISSIONS_FAILURE = 'RESTORE_SUBMISSIONS_FAILURE';\n\nexport const TRASH_SHOW_SINGLE = 'TRASH_SHOW_SINGLE';\nexport const TRASH_RESET = 'TRASH_RESET';\nexport const TRASH_EDIT_SEARCH_TERM = 'TRASH_EDIT_SEARCH_TERM';\n\nexport const SET_SCROLL_TO_CELL_PARAMS = 'SET_SCROLL_TO_CELL_PARAMS';\n\nexport const SUBMISSIONS_DECRYPT_REQUEST = 'SUBMISSIONS_DECRYPT_REQUEST';\nexport const SUBMISSIONS_DECRYPT_SUCCESS = 'SUBMISSIONS_DECRYPT_SUCCESS';\nexport const SUBMISSIONS_DECRYPT_FAILURE = 'SUBMISSIONS_DECRYPT_FAILURE';\n\nexport const ADD_COLUMN_REQUEST = 'ADD_COLUMN_REQUEST';\nexport const ADD_COLUMN_SUCCESS = 'ADD_COLUMN_SUCCESS';\nexport const ADD_COLUMN_FAILURE = 'ADD_COLUMN_FAILURE';\n\nexport const ADD_BULK_COLUMNS_REQUEST = 'ADD_BULK_COLUMNS_REQUEST';\nexport const ADD_BULK_COLUMN_SUCCESS = 'ADD_BULK_COLUMN_SUCCESS';\nexport const ADD_BULK_COLUMNS_FAILURE = 'ADD_BULK_COLUMNS_FAILURE';\n\nexport const DELETE_COLUMN_REQUEST = 'DELETE_COLUMN_REQUEST';\nexport const DELETE_COLUMN_DATA = 'DELETE_COLUMN_DATA';\nexport const DELETE_COLUMN_FAILURE = 'DELETE_COLUMN_FAILURE';\nexport const DELETE_COLUMN_SUCCESS = 'DELETE_COLUMN_SUCCESS';\n\nexport const EDIT_COLUMN_REQUEST = 'EDIT_COLUMN_REQUEST';\nexport const EDIT_COLUMN_SUCCESS = 'EDIT_COLUMN_SUCCESS';\nexport const EDIT_COLUMN_FAILURE = 'EDIT_COLUMN_FAILURE';\n\nexport const EDIT_COLUMNS_REQUEST = 'EDIT_COLUMNS_REQUEST';\nexport const EDIT_COLUMNS_SUCCESS = 'EDIT_COLUMNS_SUCCESS';\nexport const EDIT_COLUMNS_FAILURE = 'EDIT_COLUMNS_FAILURE';\n\nexport const EDIT_COLUMNS_MANAGE_COLUMN_REQUEST = 'EDIT_COLUMNS_MANAGE_COLUMN_REQUEST';\nexport const EDIT_COLUMNS_MANAGE_COLUMN_SUCCESS = 'EDIT_COLUMNS_MANAGE_COLUMN_SUCCESS';\nexport const EDIT_COLUMNS_MANAGE_COLUMN_FAILURE = 'EDIT_COLUMNS_MANAGE_COLUMN_FAILURE';\n\nexport const SET_FETCHING_MESSAGE = 'SET_FETCHING_MESSAGE';\nexport const REMOVE_FETCHING_MESSAGE = 'REMOVE_FETCHING_MESSAGE';\n\nexport const SET_SELECTED_ROWS = 'SET_SELECTED_ROWS';\nexport const UNSET_SELECTED_ROWS = 'UNSET_SELECTED_ROWS';\nexport const CLEAR_SELECTED_ROWS = 'CLEAR_SELECTED_ROWS';\n\nexport const SET_SELECTED_CELL = 'SET_SELECTED_CELL';\nexport const SET_SELECTED_CELL_SUCCESS = 'SET_SELECTED_CELL_SUCCESS';\nexport const SET_PREVIOUS_SELECTED_CELL_SUCCESS = 'SET_PREVIOUS_SELECTED_CELL_SUCCESS';\nexport const SET_SELECTED_CELL_RANGE = 'SET_SELECTED_CELL_RANGE';\nexport const CLEAR_SELECTED_CELL = 'CLEAR_SELECTED_CELL';\nexport const SET_SELECTED_MULTIPLE_CELLS = 'SET_SELECTED_MULTIPLE_CELLS';\nexport const SET_SELECTED_MULTIPLE_CELLS_SUCCESS = 'SET_SELECTED_MULTIPLE_CELLS_SUCCESS';\nexport const SET_SELECTED_MULTIPLE_CELLS_REAL = 'SET_SELECTED_MULTIPLE_CELLS_REAL';\nexport const COPY_VALUES_REQUEST = 'COPY_VALUES_REQUEST';\nexport const COPY_VALUES_FAILURE = 'COPY_VALUES_FAILURE';\nexport const PASTE_VALUES_REQUEST = 'PASTE_VALUES_REQUEST';\n\nexport const SELECT_ALL_ROWS = 'SELECT_ALL_ROWS';\nexport const DESELECT_ALL_ROWS = 'DESELECT_ALL_ROWS';\n\nexport const UPDATE_NEW_SUBMISSION_COUNT = 'UPDATE_NEW_SUBMISSION_COUNT';\nexport const UPDATE_TOTAL_SUBMISSION_COUNT = 'UPDATE_TOTAL_SUBMISSION_COUNT';\n\nexport const ORGINIZE_UNREAD_SUBMISSION_LIST = 'ORGINIZE_UNREAD_SUBMISSION_LIST';\n\nexport const SET_LOADING_DATA = 'SET_LOADING_DATA';\n\nexport const POST_MESSAGE_SUBMISSION_IDS = 'POST_MESSAGE_SUBMISSION_IDS';\n\nexport const INITIALIZE_ENCRYPTION_WORKERS = 'INITIALIZE_ENCRYPTION_WORKERS';\nexport const ENCRYPTED_FORMS_WIZARD_LOADED = 'ENCRYPTED_FORMS_WIZARD_LOADED';\nexport const PRIVATE_KEY_LOADED = 'PRIVATE_KEY_LOADED';\nexport const PRIVATE_KEY_REMOVED = 'PRIVATE_KEY_REMOVED';\nexport const FLUSH_ENCRYPTION_KEYS = 'FLUSH_ENCRYPTION_KEYS';\n\nexport const SET_SEARCH_BAR_LOADING = 'SET_SEARCH_BAR_LOADING';\n\nexport const CREATE_SHEET_REQUEST = 'CREATE_SHEET_REQUEST';\nexport const CREATE_SHEET_SUCCESS = 'CREATE_SHEET_SUCCESS';\nexport const CREATE_SHEET_FAILURE = 'CREATE_SHEET_FAILURE';\n\nexport const EDIT_SHEET_CONF_REQUEST = 'EDIT_SHEET_CONF_REQUEST';\nexport const EDIT_SHEET_CONF_SUCCESS = 'EDIT_SHEET_CONF_SUCCESS';\nexport const EDIT_SHEET_CONF_FAILURE = 'EDIT_SHEET_CONF_FAILURE';\n\nexport const UPDATE_SHEET_UPDATED_AT = 'UPDATE_SHEET_UPDATED_AT';\n\nexport const SHEET_CATEGORIES_FETCH_REQUEST = 'SHEET_CATEGORIES_FETCH_REQUEST';\nexport const SHEET_CATEGORIES_FETCH_SUCCESS = 'SHEET_CATEGORIES_FETCH_SUCCESS';\nexport const SHEET_CATEGORIES_FETCH_FAILURE = 'SHEET_CATEGORIES_FETCH_FAILURE';\n\nexport const SHEET_TEMPLATE_ADD_REQUEST = 'SHEET_TEMPLATE_ADD_REQUEST';\nexport const SHEET_TEMPLATE_ADD_SUCCESS = 'SHEET_TEMPLATE_ADD_SUCCESS';\nexport const SHEET_TEMPLATE_ADD_FAILURE = 'SHEET_TEMPLATE_ADD_FAILURE';\n\nexport const SHEET_TEMPLATE_UPDATE_REQUEST = 'SHEET_TEMPLATE_UPDATE_REQUEST';\nexport const SHEET_TEMPLATE_UPDATE_SUCCESS = 'SHEET_TEMPLATE_UPDATE_SUCCESS';\nexport const SHEET_TEMPLATE_UPDATE_FAILURE = 'SHEET_TEMPLATE_UPDATE_FAILURE';\n\nexport const SHEET_TEMPLATE_FETCH_REQUEST = 'SHEET_TEMPLATE_FETCH_REQUEST';\nexport const SHEET_TEMPLATE_FETCH_SUCCESS = 'SHEET_TEMPLATE_FETCH_SUCCESS';\nexport const SHEET_TEMPLATE_FETCH_FAILURE = 'SHEET_TEMPLATE_FETCH_FAILURE';\n\nexport const SWITCH_TO_OLD = 'SWITCH_TO_OLD';\nexport const DISABLE_DELETE_SUBMISSION_CONFIRMATION = 'DISABLE_DELETE_SUBMISSION_CONFIRMATION';\nexport const DISABLE_PURGE_SUBMISSION_CONFIRMATION = 'DISABLE_PURGE_SUBMISSION_CONFIRMATION';\nexport const DISABLE_DELETE_VIEW_CONFIRMATION = 'DISABLE_DELETE_VIEW_CONFIRMATION';\n\nexport const TOGGLE_EDIT_FRAME_LOAD_MESSAGE = 'TOGGLE_EDIT_FRAME_LOAD_MESSAGE';\n\nexport const SEND_FEEDBACK_REQUEST = 'SEND_FEEDBACK_REQUEST';\nexport const SEND_FEEDBACK_SUCCESS = 'SEND_FEEDBACK_SUCCESS';\nexport const SEND_FEEDBACK_FAILURE = 'SEND_FEEDBACK_FAILURE';\n\nexport const REQUEST_ACTION_BUTTON_REQUEST = 'REQUEST_ACTION_BUTTON_REQUEST';\nexport const REQUEST_ACTION_BUTTON_SUCCESS = 'REQUEST_ACTION_BUTTON_SUCCESS';\nexport const REQUEST_ACTION_BUTTON_FAILURE = 'REQUEST_ACTION_BUTTON_FAILURE';\n\nexport const FILL_FORM_ACTION_BUTTON_MODAL_REQUEST = 'FILL_FORM_ACTION_BUTTON_MODAL_REQUEST';\nexport const FILL_FORM_ACTION_BUTTON_MODAL_SUCCESS = 'FILL_FORM_ACTION_BUTTON_MODAL_SUCCESS';\nexport const FILL_FORM_ACTION_BUTTON_MODAL_FAILURE = 'FILL_FORM_ACTION_BUTTON_MODAL_FAILURE';\n\nexport const SINGLE_SELECT_ROW_AFTER_DELETE = 'SINGLE_SELECT_ROW_AFTER_DELETE';\n\nexport const EDIT_VIEW_NAME = 'EDIT_VIEW_NAME';\nexport const EDIT_COLUMN_NAME = 'EDIT_COLUMN_NAME';\n\nexport const SET_FORCE_EDIT_COLUMN_NAME = 'SET_FORCE_EDIT_COLUMN_NAME';\n\nexport const APPLY_ALL_ROWS = 'APPLY_ALL_ROWS';\nexport const SET_PDF_DESIGNS = 'SET_PDF_DESIGNS';\n\nexport const UI_TOGGLE_HEADER = 'UI_TOGGLE_HEADER';\n\nexport const FETCH_FORM_SUCCESS = 'FETCH_FORM_SUCCESS';\n\nexport const DOWNLOAD_DECRYPTED_SUBMISSIONS_REQUEST = 'DOWNLOAD_DECRYPTED_SUBMISSIONS_REQUEST';\nexport const SET_DECRYPTED_SUBMISSIONS_DOWNLOADING_STATUS = 'SET_DECRYPTED_SUBMISSIONS_DOWNLOADING_STATUS';\n\nexport const REQUEST_TABLE_ACCESS_SUCCESS_UI = 'REQUEST_TABLE_ACCESS_SUCCESS_UI';\nexport const REQUEST_TABLE_ACCESS_FAILURE_UI = 'REQUEST_TABLE_ACCESS_FAILURE_UI';\n\nexport const REQUEST_TABLE_ACCESS_POPUP_VIEW = 'REQUEST_TABLE_ACCESS_POPUP_VIEW';\n\n// Jingle Submission Actions\nexport const TOGGLE_INBOX = 'TOGGLE_INBOX';\nexport const OPEN_INBOX = 'OPEN_INBOX';\n\nexport const TOGGLE_SIDE_PANE = 'TOGGLE_SIDE_PANE';\nexport const CHANGE_SIDE_PANE_LISTING = 'CHANGE_SIDE_PANE_LISTING';\nexport const OPEN_RELATED_SUBMISSION_PANE = 'OPEN_RELATED_SUBMISSION_PANE';\n\nexport const SELECT_NEXT_SUBMISSION = 'SELECT_NEXT_SUBMISSION';\nexport const SELECT_PREV_SUBMISSION = 'SELECT_PREV_SUBMISSION';\n\nexport const SET_SELECTED_ROW = 'SET_SELECTED_ROW';\n\nexport const DOWNLOAD_UPLOADS = 'DOWNLOAD_UPLOADS';\nexport const DIRECT_DOWNLOADABLE_UPLOADS_REQUEST = 'DIRECT_DOWNLOADABLE_UPLOADS_REQUEST';\n\nexport const SET_PREVIEW_FILE_SIZES = 'SET_PREVIEW_FILE_SIZES';\nexport const FILE_SIZES_REQUEST = 'FILE_SIZES_REQUEST';\nexport const FILE_SIZES_SUCCESS = 'FILE_SIZES_SUCCESS';\nexport const FILE_SIZES_FAILURE = 'FILE_SIZES_FAILURE';\n\nexport const PREVIEW_MODAL_INIT = 'PREVIEW_MODAL_INIT';\nexport const PREVIEW_MODAL_CLOSE = 'PREVIEW_MODAL_CLOSE';\nexport const PREVIEW_CONTEXT_MENU_TOGGLE = 'PREVIEW_CONTEXT_MENU_TOGGLE';\n\nexport const ADD_SCREENSHOTS = 'ADD_SCREENSHOTS';\nexport const REMOVE_SCREENSHOT = 'REMOVE_SCREENSHOTS';\n\nexport const ADD_SUBMISSION_REQUEST = 'ADD_SUBMISSION_REQUEST';\nexport const ADD_SUBMISSION_SUCCESS = 'ADD_SUBMISSION_SUCCESS';\nexport const ADD_SUBMISSION_TO_FILTERED_REQUEST = 'ADD_SUBMISSION_TO_FILTERED_REQUEST';\nexport const ADD_SUBMISSION_TO_FILTERED_SUCCESS = 'ADD_SUBMISSION_TO_FILTERED_SUCCESS';\nexport const ADD_SUBMISSION_FAILURE = 'ADD_SUBMISSION_FAILURE';\n\nexport const SHOW_HIDE_EMPTY_UPLOADS_REQUEST = 'SHOW_HIDE_EMPTY_UPLOADS_REQUEST';\nexport const SET_EMPTY_UPLOAD_TO_FILLED = 'SET_EMPTY_UPLOAD_TO_FILLED';\nexport const SHOW_IMAGE_AS_BIGGER_OR_SMALLER = 'SHOW_IMAGE_AS_BIGGER_OR_SMALLER';\n\nexport const SET_FORCE_SHEET_RENAME = 'SET_FORCE_SHEET_RENAME';\n\n// File Upload Editor Actions\nexport const TOGGLE_FOLDER_UPLOAD_EDITOR = 'TOGGLE_FOLDER_UPLOAD_EDITOR';\nexport const INIT_SUBMISSION_FILE_UPLOAD = 'INIT_SUBMISSION_FILE_UPLOAD';\nexport const SET_UPLOAD_ANSWER_AND_FILES = 'SET_UPLOAD_ANSWER_AND_FILES';\nexport const SET_UPLOAD_ANSWER_AND_FILES_FOR_DELETE = 'SET_UPLOAD_ANSWER_AND_FILES_FOR_DELETE';\nexport const INIT_SUBMISSION_FILE_DELETE = 'INIT_SUBMISSION_FILE_DELETE';\nexport const DELETE_SUBMISSION_UPLOADS = 'DELETE_SUBMISSION_UPLOADS';\nexport const SUBMISSION_FILE_DELETE_FAIL = 'SUBMISSION_FILE_DELETE_FAIL';\nexport const SUBMISSION_FILE_UPLOAD_FAIL = 'SUBMISSION_FILE_UPLOAD_FAIL';\nexport const UPDATE_UPLOAD_FILE_PROGRESS = 'UPDATE_UPLOAD_FILE_PROGRESS';\nexport const UPDATE_PENDING_ANSWER = 'UPDATE_PENDING_ANSWER';\n\nexport const ADD_PENDING_UPLOAD = 'ADD_PENDING_UPLOAD';\nexport const REMOVE_PENDING_UPLOAD = 'REMOVE_PENDING_UPLOAD';\nexport const FILE_UPLOAD_SUCCESS = 'FILE_UPLOAD_SUCCESS';\n\n// Editor container actions\nexport const SET_EDIT_CELL = 'SET_EDIT_CELL';\nexport const CLEAR_EDIT_CELL = 'CLEAR_EDIT_CELL';\nexport const TOGGLE_EDIT_CELL_DROPDOWN = 'TOGGLE_EDIT_CELL_DROPDOWN';\nexport const CLEAR_EDIT_CELL_REQUEST = 'CLEAR_EDIT_CELL_REQUEST';\nexport const EDIT_QUESTION_ANSWER = 'EDIT_QUESTION_ANSWER';\nexport const UPDATE_EDITOR_CELL_ANSWER = 'UPDATE_EDITOR_CELL_ANSWER';\nexport const UPDATE_EDITOR_INITIAL_CELL_ANSWER = 'UPDATE_EDITOR_INITIAL_CELL_ANSWER';\nexport const SET_CARD_CELL_EDITOR_REQUEST = 'SET_CARD_CELL_EDITOR_REQUEST';\nexport const SET_CARD_CELL_EDITOR = 'SET_CARD_CELL_EDITOR';\nexport const CLEAR_CARD_CELL_EDITOR = 'CLEAR_CARD_CELL_EDITOR';\n\n// Socket actions\nexport const CONNECT_TO_FORM_SOCKET = 'CONNECT_TO_FORM_SOCKET';\nexport const INITIALIZE_SOCKET_CHANNELS = 'INITIALIZE_SOCKET_CHANNELS';\nexport const SHEET_SOCKET_CONNECT_REQUEST = 'SHEET_SOCKET_CONNECT_REQUEST';\nexport const SHEET_SOCKET_CONNECT_SUCCESS = 'SHEET_SOCKET_CONNECT_SUCCESS';\nexport const SHEET_SOCKET_CONNECT_FAILURE = 'SHEET_SOCKET_CONNECT_FAILURE';\nexport const SOCKET_COMMENT_MESSAGE_ARRIVED = 'SOCKET_COMMENT_MESSAGE_ARRIVED';\n\nexport const SOCKET_INITIAL_USERS = 'SOCKET_INITIAL_USERS';\nexport const USER_JOINED = 'USER_JOINED';\nexport const TABLEMOVE_ACTION = 'TABLEMOVE_ACTION';\nexport const USER_LEFT = 'USER_LEFT';\nexport const FETCH_COLLABORATOR_DETAILS_SUCCESS = 'FETCH_COLLABORATOR_DETAILS_SUCCESS';\nexport const FETCH_COLLABORATOR_DETAILS_FAILURE = 'FETCH_COLLABORATOR_DETAILS_FAILURE';\nexport const COLLABORATION_ACTION = 'COLLABORATION_ACTION';\nexport const COLLABORATION_SET_CLIENT_ID = 'COLLABORATION_SET_CLIENT_ID';\nexport const COLLABORATION_ADD_COLUMNS_REQUEST = 'COLLABORATION_ADD_COLUMNS_REQUEST';\nexport const COLLABORATION_ADD_COLUMNS_SUCCESS = 'COLLABORATION_ADD_COLUMNS_SUCCESS';\nexport const COLLABORATION_ADD_COLUMNS_FAILURE = 'COLLABORATION_ADD_COLUMNS_FAILURE';\nexport const COLLABORATION_DELETE_COLUMNS_REQUEST = 'COLLABORATION_DELETE_COLUMNS_REQUEST';\nexport const COLLABORATOR_UPDATED = 'COLLABORATOR_UPDATED';\nexport const SYNC_SHARE_RESOURCES_REQUEST = 'SYNC_SHARE_RESOURCES_REQUEST';\nexport const SYNC_SHARE_RESOURCES_SUCCESS = 'SYNC_SHARE_RESOURCES_SUCCESS';\nexport const SYNC_SHARE_RESOURCES_FAILURE = 'SYNC_SHARE_RESOURCES_FAILURE';\nexport const RELOAD_NEEDED = 'RELOAD_NEEDED';\nexport const VIEW_IS_READY = 'VIEW_IS_READY';\nexport const ADD_CALENDAR_QUESTION = 'ADD_CALENDAR_QUESTION';\n\n// Calendar actions\nexport const CHANGE_CURRENT_CALENDAR_DATE = 'CHANGE_CURRENT_CALENDAR_DATE';\nexport const CHANGE_CURRENT_CALENDAR_DATE_REQUEST = 'CHANGE_CURRENT_CALENDAR_DATE_REQUEST';\nexport const CHANGE_CURRENT_CALENDAR_VIEW = 'CHANGE_CURRENT_CALENDAR_VIEW';\nexport const CHANGE_EVENT_DATE_REQUEST = 'CHANGE_EVENT_DATE_REQUEST';\nexport const TOGGLE_CALENDAR_SETTINGS_PANE = 'TOGGLE_CALENDAR_SETTINGS_PANE';\nexport const TOGGLE_LEFT_PANE = 'TOGGLE_LEFT_PANE';\nexport const SELECT_FIRST_SUBMISSION = 'SELECT_FIRST_SUBMISSION';\nexport const TOGGLE_EVENT_POPUP = 'TOGGLE_EVENT_POPUP';\nexport const SET_EVENT_FILTER = 'SET_EVENT_FILTER';\nexport const SET_ACTIVE_TAB = 'SET_ACTIVE_TAB';\nexport const ADD_CALENDAR_FIELD = 'ADD_CALENDAR_FIELD';\n\n// Row Menu\nexport const TOGGLE_SUBMISSION_MENU = 'TOGGLE_SUBMISSION_MENU';\nexport const SET_MENU_POSITION = 'SET_MENU_POSITION';\nexport const TOGGLE_MULTIPLE_SELECTED_CELL_MENU = 'TOGGLE_MULTIPLE_SELECTED_CELL_MENU';\n\n// Side Pane\nexport const TOGGLE_SIDE_PANE_REQUEST = 'TOGGLE_SIDE_PANE_REQUEST';\nexport const CHANGE_SIDE_PANE_PROP = 'CHANGE_SIDE_PANE_PROP';\nexport const SET_SIDE_PANE_DATA = 'SET_SIDE_PANE_DATA';\nexport const SET_SIDE_PANE_SUBMISSIONS_STATUS = 'SET_SIDE_PANE_SUBMISSIONS_STATUS';\nexport const SET_SIDE_PANE_SUBMISSIONS_SELECT = 'SET_SIDE_PANE_SUBMISSIONS_SELECT';\nexport const SELECT_SIDE_PANE_SUBMISSION = 'SELECT_SIDE_PANE_SUBMISSION';\nexport const FETCH_SIDE_PANE_SUBMISSIONS_FAILURE = 'FETCH_SIDE_PANE_SUBMISSIONS_FAILURE';\nexport const FETCH_SIDE_PANE_SUBMISSIONS_REQUEST = 'FETCH_SIDE_PANE_SUBMISSIONS_REQUEST';\nexport const FETCH_SIDE_PANE_SUBMISSIONS_SUCCESS = 'FETCH_SIDE_PANE_SUBMISSIONS_SUCCESS';\nexport const RESET_SIDE_PANE = 'RESET_SIDE_PANE';\nexport const SET_SIDE_PANE_SUBMISSIONS_SEARCH_TERM = 'SET_SIDE_PANE_SUBMISSIONS_SEARCH_TERM';\nexport const REMOVE_SIDE_PANE_SUBMISSIONS = 'REMOVE_SIDE_PANE_SUBMISSIONS';\nexport const SET_SIDE_PANE_ERROR_MESSAGE = 'SET_SIDE_PANE_ERROR_MESSAGE';\n\nexport const SET_EMAIL_POPUP_STATUS = 'SET_EMAIL_POPUP_STATUS';\n\n// This works as add chart in charts view and as add submission on others\nexport const ADD_NEW_RECORD = 'ADD_NEW_RECORD';\n\nexport const DOWNLOAD_DATA = 'DOWNLOAD_DATA';\nexport const CHECK_DOWNLOAD_STATUS = 'CHECK_DOWNLOAD_STATUS';\nexport const UPDATE_DOWNLOAD_STATUS = 'UPDATE_DOWNLOAD_STATUS';\n\nexport const DOWNLOAD_PDF = 'DOWNLOAD_PDF';\n\nexport const FETCH_VIEW_COLUMNS_REQUEST = 'FETCH_VIEW_COLUMNS_REQUEST';\nexport const FETCH_VIEW_COLUMNS_SUCCESS = 'FETCH_VIEW_COLUMNS_SUCCESS';\nexport const FETCH_VIEW_COLUMNS_FAILURE = 'FETCH_VIEW_COLUMNS_FAILURE';\n\nexport const UNDO_REQUEST = 'UNDO_REQUEST';\nexport const REDO_REQUEST = 'REDO_REQUEST';\n\nexport const CHANGE_ACTIVE_VIEW_REQUEST = 'CHANGE_ACTIVE_VIEW_REQUEST';\nexport const CHANGE_ACTIVE_VIEW_SUCCESS = 'CHANGE_ACTIVE_VIEW_SUCCESS';\nexport const CHANGE_ACTIVE_VIEW_FAILURE = 'CHANGE_ACTIVE_VIEW_FAILURE';\n\nexport const ADD_REPORT_ITEM_REQUEST_NO_TRACKING = 'ADD_REPORT_ITEM_REQUEST_NO_TRACKING';\nexport const ADD_REPORT_ITEM_REQUEST = 'ADD_REPORT_ITEM_REQUEST';\nexport const ADD_REPORT_ITEM_SUCCESS = 'ADD_REPORT_ITEM_SUCCESS';\nexport const ADD_REPORT_ITEM_FAILURE = 'ADD_REPORT_ITEM_FAILURE';\nexport const ADD_REPORT_ITEMS_SUCCESS = 'ADD_REPORT_ITEMS_SUCCESS';\n\nexport const EDIT_REPORT_WITH_PAGES_REQUEST = 'EDIT_REPORT_WITH_PAGES_REQUEST';\nexport const EDIT_REPORT_WITH_PAGES_SUCCESS = 'EDIT_REPORT_WITH_PAGES_SUCCESS';\nexport const EDIT_REPORT_WITH_PAGES_FAILURE = 'EDIT_REPORT_WITH_PAGES_FAILURE';\n\nexport const EDIT_REPORT_ITEM_REQUEST = 'EDIT_REPORT_ITEM_REQUEST';\nexport const EDIT_REPORT_ITEM_HTTP_REQUEST = 'EDIT_REPORT_ITEM_HTTP_REQUEST';\nexport const EDIT_REPORT_ITEM_SUCCESS = 'EDIT_REPORT_ITEM_SUCCESS';\nexport const EDIT_REPORT_ITEM_FAILURE = 'EDIT_REPORT_ITEM_FAILURE';\n\nexport const EDIT_REPORT_ITEMS_REQUEST = 'EDIT_REPORT_ITEMS_REQUEST';\nexport const EDIT_REPORT_ITEMS_SUCCESS = 'EDIT_REPORT_ITEMS_SUCCESS';\nexport const EDIT_REPORT_ITEMS_FAILURE = 'EDIT_REPORT_ITEMS_FAILURE';\n\nexport const DELETE_REPORT_ITEM_REQUEST = 'DELETE_REPORT_ITEM_REQUEST';\nexport const DELETE_REPORT_ITEM_SUCCESS = 'DELETE_REPORT_ITEM_SUCCESS';\nexport const DELETE_REPORT_ITEM_FAILURE = 'DELETE_REPORT_ITEM_FAILURE';\n\nexport const DELETE_REPORT_REQUEST = 'DELETE_REPORT_REQUEST';\nexport const DELETE_REPORT_SUCCESS = 'DELETE_REPORT_SUCCESS';\nexport const DELETE_REPORT_FAILURE = 'DELETE_REPORT_FAILURE';\n\nexport const SET_REPORT_VIEW_MODE = 'SET_REPORT_VIEW_MODE';\n\nexport const ADD_REPORT_PAGE_REQUEST = 'ADD_REPORT_PAGE_REQUEST';\nexport const ADD_REPORT_PAGE_SUCCESS = 'ADD_REPORT_PAGE_SUCCESS';\nexport const ADD_REPORT_PAGE_FAILURE = 'ADD_REPORT_PAGE_FAILURE';\n\nexport const EDIT_AFFECTED_REPORT_PAGE_REQUEST = 'EDIT_AFFECTED_REPORT_PAGE_REQUEST';\nexport const EDIT_AFFECTED_REPORT_PAGE_SUCCESS = 'EDIT_AFFECTED_REPORT_PAGE_SUCCESS';\nexport const EDIT_AFFECTED_REPORT_PAGE_FAILURE = 'EDIT_AFFECTED_REPORT_PAGE_FAILURE';\nexport const EDIT_REPORT_PAGE_REQUEST = 'EDIT_REPORT_PAGE_REQUEST';\nexport const EDIT_REPORT_PAGE_SUCCESS = 'EDIT_REPORT_PAGE_SUCCESS';\nexport const ADD_ITEM_TO_REPORT_PAGE_SUCCESS = 'ADD_ITEM_TO_REPORT_PAGE_SUCCESS';\nexport const DELETE_ITEM_FROM_REPORT_PAGE_SUCCESS = 'DELETE_ITEM_FROM_REPORT_PAGE_SUCCESS';\nexport const EDIT_REPORT_PAGE_FAILURE = 'EDIT_REPORT_PAGE_FAILURE';\nexport const EDIT_REPORT_PAGES_REQUEST = 'EDIT_REPORT_PAGES_REQUEST';\nexport const EDIT_REPORT_PAGES_FAILURE = 'EDIT_REPORT_PAGES_FAILURE';\nexport const EDIT_REPORT_PAGES_REQUEST_NO_TRACKING = 'EDIT_REPORT_PAGES_REQUEST_NO_TRACKING';\n\nexport const DELETE_REPORT_PAGE_REQUEST = 'DELETE_REPORT_PAGE_REQUEST';\nexport const DELETE_REPORT_PAGE_SUCCESS = 'DELETE_REPORT_PAGE_SUCCESS';\nexport const DELETE_REPORT_PAGE_FAILURE = 'DELETE_REPORT_PAGE_FAILURE';\n\nexport const DUPLICATE_REPORT_PAGE_REQUEST = 'DUPLICATE_REPORT_PAGE_REQUEST';\nexport const DUPLICATE_REPORT_PAGE_SUCCESS = 'DUPLICATE_REPORT_PAGE_SUCCESS';\nexport const DUPLICATE_REPORT_PAGE_FAILURE = 'DUPLICATE_REPORT_PAGE_FAILURE';\n\nexport const EDIT_SETTING_AND_REPORT_ITEM_REQUEST = 'EDIT_SETTING_AND_REPORT_ITEM_REQUEST';\nexport const EDIT_SETTING_AND_REPORT_ITEM_SUCCESS = 'EDIT_SETTING_AND_REPORT_ITEM_SUCCESS';\nexport const EDIT_SETTING_AND_REPORT_ITEM_FAILURE = 'EDIT_SETTING_AND_REPORT_ITEM_FAILURE';\n\nexport const LOADING_REPORTS_DATA = 'LOADING_REPORTS_DATA';\nexport const FETCH_REPORTS_DATA = 'FETCH_REPORTS_DATA';\nexport const FETCH_REPORTS_DATA_FAILURE = 'FETCH_REPORTS_DATA_FAILURE';\nexport const SET_REPORTS_DATA = 'SET_REPORTS_DATA';\n\n// DONT USE!!! - this actionType is created for debugging\nexport const EDIT_REPORT_PAGES_SYNC = 'EDIT_REPORT_PAGES_SYNC';\n\nexport const REPORT_LOG_ACTION = 'REPORT_LOG_ACTION';\n\nexport const CREATE_DEMO_REPORT_REQUEST = 'CREATE_DEMO_REPORT_REQUEST';\nexport const CREATE_DEMO_REPORT_FAILURE = 'CREATE_DEMO_REPORT_FAILURE';\n\nexport const MARK_VIEWS_DIRTY = 'MARK_VIEWS_DIRTY';\nexport const MARK_RESTORED_SUBMISSIONS = 'MARK_RESTORED_SUBMISSIONS';\n\nexport const FETCH_USER_UPLOADS_REQUEST = 'FETCH_USER_UPLOADS_REQUEST';\nexport const FETCH_USER_UPLOADS_SUCCESS = 'FETCH_USER_UPLOADS_SUCCESS';\nexport const FETCH_USER_UPLOADS_FAILURE = 'FETCH_USER_UPLOADS_FAILURE';\n\nexport const DELETE_USER_UPLOAD_REQUEST = 'DELETE_USER_UPLOAD_REQUEST';\nexport const DELETE_USER_UPLOAD_SUCCESS = 'DELETE_USER_UPLOAD_SUCCESS';\nexport const DELETE_USER_UPLOAD_FAILURE = 'DELETE_USER_UPLOAD_FAILURE';\n\nexport const ADD_USER_UPLOAD = 'ADD_USER_UPLOAD';\n\nexport const CHANGE_MODE = 'CHANGE_MODE';\n\nexport const OPEN_REVISIONS_REQUEST = 'OPEN_REVISIONS_REQUEST';\nexport const CLOSE_REVISIONS_REQUEST = 'CLOSE_REVISIONS_REQUEST';\nexport const CLOSE_REVISIONS_SUCCESS = 'CLOSE_REVISIONS_SUCCESS';\n\nexport const INITIALIZE_REVISION_REQUEST = 'INITIALIZE_REVISION_REQUEST';\nexport const INITIALIZE_REVISION_SUCCESS = 'INITIALIZE_REVISION_SUCCESS';\nexport const INITIALIZE_REVISION_FAILURE = 'INITIALIZE_REVISION_FAILURE';\n\nexport const FETCH_REVISIONS_REQUEST = 'FETCH_REVISIONS_REQUEST';\nexport const FETCH_REVISIONS_SUCCESS = 'FETCH_REVISIONS_SUCCESS';\nexport const FETCH_REVISIONS_FAILURE = 'FETCH_REVISIONS_FAILURE';\n\nexport const UPDATE_REVISIONS_LOADING_STATUS = 'UPDATE_REVISIONS_LOADING_STATUS';\nexport const UPDATE_REVISION_PREVIEW_LOADING_STATUS = 'UPDATE_REVISION_PREVIEW_LOADING_STATUS';\n\nexport const FETCH_REVISIONS_DETAILS_REQUEST = 'FETCH_REVISIONS_DETAILS_REQUEST';\nexport const FETCH_REVISIONS_DETAILS_SUCCESS = 'FETCH_REVISIONS_DETAILS_SUCCESS';\nexport const FETCH_REVISIONS_DETAILS_FAILURE = 'FETCH_REVISIONS_DETAILS_FAILURE';\n\nexport const UPDATE_SELECTED_REVISIONS = 'UPDATE_SELECTED_REVISIONS';\nexport const INIT_REVISION_SHEET = 'INIT_REVISION_SHEET';\nexport const PREPARE_REVISION_SUBMISSION_IDS = 'PREPARE_REVISION_SUBMISSION_IDS';\nexport const UPDATE_REVISION_SUBMISSION_IDS = 'UPDATE_REVISION_SUBMISSION_IDS';\nexport const UPDATE_REVISION_SUBMISSIONS = 'UPDATE_REVISION_SUBMISSIONS';\n\nexport const RESTORE_TO_SELECTED_REVISION = 'RESTORE_TO_SELECTED_REVISION';\nexport const RESTORE_REVISION_FAILURE = 'RESTORE_REVISION_FAILURE';\nexport const RESTORE_REVISION_SUCCESS = 'RESTORE_REVISION_SUCCESS';\nexport const UPDATE_REVISION_SHEET = 'UPDATE_REVISION_SHEET';\nexport const UPDATE_REVISION_SHEET_PROPS = 'UPDATE_REVISION_SHEET_PROPS';\n\nexport const EDIT_REVISION_QUESTIONS = 'EDIT_REVISION_QUESTIONS';\nexport const REPLACE_SHEET_TO_ORIGINAL = 'REPLACE_SHEET_TO_ORIGINAL';\nexport const EDIT_REVISION_VIEWS = 'EDIT_REVISION_VIEWS';\nexport const EDIT_REVISION_SHEET_DESC = 'EDIT_REVISION_SHEET_DESC';\nexport const EDIT_REVISION_SHEET_NAME = 'EDIT_REVISION_SHEET_NAME';\n\nexport const PREPARE_SELECTED_REVISION_SHEET_CHANGES = 'PREPARE_SELECTED_REVISION_SHEET_CHANGES';\nexport const UPDATE_SELECTED_REVISION_SHEET_CHANGES = 'UPDATE_SELECTED_REVISION_SHEET_CHANGES';\n\nexport const DOWNLOAD_PRESENTATION_REQUEST = 'DOWNLOAD_PRESENTATION_REQUEST';\nexport const DOWNLOAD_PRESENTATION_FAILURE = 'DOWNLOAD_PRESENTATION_FAILURE';\nexport const DOWNLOAD_PRESENTATION_SUCCESS = 'DOWNLOAD_PRESENTATION_SUCCESS';\n\nexport const SEND_REPORT_FEEDBACK = 'SEND_REPORT_FEEDBACK';\nexport const CHANGE_REPORT_REQUEST = 'CHANGE_REPORT_REQUEST';\nexport const CREATE_REPORT_REQUEST = 'CREATE_REPORT_REQUEST';\n\nexport const FETCH_NEW_SUBMISSION_REQUEST = 'FETCH_NEW_SUBMISSION_REQUEST';\nexport const FETCH_NEW_SUBMISSION_SUCCESS = 'FETCH_NEW_SUBMISSION_SUCCESS';\nexport const FETCH_NEW_SUBMISSION_FAILURE = 'FETCH_NEW_SUBMISSION_FAILURE';\n\nexport const SET_VIEWS_NEW_SUBMISSIONS = 'SET_VIEWS_NEW_SUBMISSIONS';\nexport const RESET_VIEWS_NEW_SUBMISSIONS = 'RESET_VIEWS_NEW_SUBMISSIONS';\nexport const CHECK_VIEWS_NEW_SUBMISSION_NOTIFICATION = 'CHECK_VIEWS_NEW_SUBMISSION_NOTIFICATION';\nexport const SET_VIEWS_NEW_SUBMISSIONS_NOTIFICATION = 'SET_VIEWS_NEW_SUBMISSIONS_NOTIFICATION';\nexport const MARK_VIEW_NEW_SUBMISSIONS = 'MARK_VIEW_NEW_SUBMISSIONS';\nexport const MARK_NEW_SUBMISSION = 'MARK_NEW_SUBMISSION';\nexport const MARK_SUBMISSION_AS_READ = 'MARK_SUBMISSION_AS_READ';\nexport const TOGGLE_IMPORTED_SUBMISSIONS = 'TOGGLE_IMPORTED_SUBMISSIONS';\n\nexport const CREATE_FORM_REQUEST = 'CREATE_FORM_REQUEST';\nexport const CREATE_FORM_SUCCESS = 'CREATE_FORM_SUCCESS';\nexport const CREATE_FORM_FAILURE = 'CREATE_FORM_FAILURE';\n\n// SHARE ACTIONS\nexport const INIT_SHARE = 'INIT_SHARE';\n\nexport const REVOKE_USERS_FROM_SHARED_RESOURCE_REQUEST = 'REVOKE_USERS_FROM_SHARED_RESOURCE_REQUEST';\nexport const REVOKE_USERS_FROM_SHARED_RESOURCE_SUCCESS = 'REVOKE_USERS_FROM_SHARED_RESOURCE_SUCCESS';\nexport const REVOKE_USERS_FROM_SHARED_RESOURCE_FAILURE = 'REVOKE_USERS_FROM_SHARED_RESOURCE_FAILURE';\n\nexport const UPDATE_PERMISSIONS_FOR_SHARED_RESOURCE_REQUEST = 'UPDATE_PERMISSIONS_FOR_SHARED_RESOURCE_REQUEST';\nexport const UPDATE_PERMISSIONS_FOR_SHARED_RESOURCE_SUCCESS = 'UPDATE_PERMISSIONS_FOR_SHARED_RESOURCE_SUCCESS';\nexport const UPDATE_PERMISSIONS_FOR_SHARED_RESOURCE_FAILURE = 'UPDATE_PERMISSIONS_SHARED_RESOURCE_FAILURE';\n\nexport const GENERATE_NEW_SHARE_LINK_FOR_RESOURCE_REQUEST = 'GENERATE_NEW_SHARE_LINK_FOR_RESOURCE_REQUEST';\nexport const GENERATE_NEW_SHARE_LINK_FOR_RESOURCE_SUCCESS = 'GENERATE_NEW_SHARE_LINK_FOR_RESOURCE_SUCCESS';\nexport const GENERATE_NEW_SHARE_LINK_FOR_RESOURCE_FAILURE = 'GENERATE_NEW_SHARE_LINK_FOR_RESOURCE_FAILURE';\n\nexport const HIGHLIGHT_SHAREE_REQUEST = 'HIGHLIGHT_SHAREE_REQUEST';\nexport const HIGHLIGHT_SHAREE_SUCCESS = 'HIGHLIGHT_SHAREE_SUCCESS';\nexport const HIGHLIGHT_SHAREE_FAILURE = 'HIGHLIGHT_SHAREE_FAILURE';\n\nexport const UPDATE_SHARED_RESOURCE_PROPS_REQUEST = 'UPDATE_SHARED_RESOURCE_PROPS_REQUEST';\nexport const UPDATE_SHARED_RESOURCE_PROPS_SUCCESS = 'UPDATE_SHARED_RESOURCE_PROPS_SUCCESS';\nexport const UPDATE_SHARED_RESOURCE_PROPS_FAILURE = 'UPDATE_SHARED_RESOURCE_PROPS_FAILURE';\n\nexport const UPDATE_SHAREE_PERMISSIONS_REQUEST = 'UPDATE_SHAREE_PERMISSIONS_REQUEST';\nexport const UPDATE_SHAREE_PERMISSIONS_SUCCESS = 'UPDATE_SHAREE_PERMISSIONS_SUCCESS';\nexport const UPDATE_SHAREE_PERMISSIONS_FAILURE = 'UPDATE_SHAREE_PERMISSIONS_FAILURE';\n\nexport const INIT_PERMISSION_OPTIONS = 'INIT_PERMISSION_OPTIONS';\nexport const UPDATE_ACCESS_SETTINGS_TYPE = 'UPDATE_ACCESS_SETTINGS_TYPE';\n// SHARE ACTIONS\n\nexport const CHANGE_TEMP_TABLE_SETTING = 'CHANGE_TEMP_TABLE_SETTING';\nexport const GENERATE_HIPAA_ANSWERS_REQUEST = 'GENERATE_HIPAA_ANSWERS_REQUEST';\nexport const GENERATE_HIPAA_ANSWERS_SUCCESS = 'GENERATE_HIPAA_ANSWERS_SUCCESS';\nexport const GENERATE_HIPAA_ANSWERS_FAILURE = 'GENERATE_HIPAA_ANSWERS_FAILURE';\n\nexport const RESET_COLUMNS_REQUEST = 'RESET_COLUMNS_REQUEST';\nexport const RESET_COLUMNS_FAILURE = 'RESET_COLUMNS_FAILURE';\nexport const RESET_COLUMNS_SUCCESS = 'RESET_COLUMNS_SUCCESS';\n\nexport const DUPLICATE_TAB_REQUEST = 'DUPLICATE_TAB_REQUEST';\nexport const DUPLICATE_TAB_FAILURE = 'DUPLICATE_TAB_FAILURE';\nexport const DUPLICATE_TAB_SUCCESS = 'DUPLICATE_TAB_SUCCESS';\n\nexport const DELETE_INCOMPLETE_SUBMISSIONS_REQUEST = 'DELETE_INCOMPLETE_SUBMISSIONS_REQUEST';\nexport const DELETE_INCOMPLETE_SUBMISSIONS_SUCCESS = 'DELETE_INCOMPLETE_SUBMISSIONS_SUCCESS';\nexport const DELETE_INCOMPLETE_SUBMISSIONS_FAILURE = 'DELETE_INCOMPLETE_SUBMISSIONS_FAILURE';\n\nexport const NEW_INCOMPLETE_SUBMISSION_RECEIVED = 'NEW_INCOMPLETE_SUBMISSION_RECEIVED';\nexport const RESET_NEW_INCOMPLETE_SUBMISSION = 'RESET_NEW_INCOMPLETE_SUBMISSION';\n\nexport const NEW_PENDING_PAYMENT_SUBMISSION_RECEIVED = 'NEW_PENDING_PAYMENT_SUBMISSION_RECEIVED';\nexport const RESET_NEW_PENDING_PAYMENT_SUBMISSION = 'RESET_NEW_PENDING_PAYMENT_SUBMISSION';\n\nexport const CHECK_REPORT_IMPORT = 'CHECK_REPORT_IMPORT';\nexport const CHECK_REPORT_IMPORT_FAILURE = 'CHECK_REPORT_IMPORT_FAILURE';\nexport const UPDATE_REPORT_IMPORT_STATUS = 'UPDATE_REPORT_IMPORT_STATUS';\n\nexport const REQUEST_ACCESS_REQUEST = 'REQUEST_ACCESS_REQUEST';\nexport const REQUEST_ACCESS_SUCCESS = 'REQUEST_ACCESS_SUCCESS';\nexport const REQUEST_ACCESS_FAILURE = 'REQUEST_ACCESS_FAILURE';\n\nexport const DISMISS_ACCESS_REQUEST = 'DISMISS_ACCESS_REQUEST';\nexport const DISMISS_ACCESS_REQUEST_SUCCESS = 'DISMISS_ACCESS_REQUEST_SUCCESS';\nexport const DISMISS_ACCESS_REQUEST_FAILURE = 'DISMISS_ACCESS_REQUEST_FAILURE';\n\nexport const DUPLICATE_REPORT_REQUEST = 'DUPLICATE_REPORT_REQUEST';\nexport const DUPLICATE_REPORT_SUCCESS = 'DUPLICATE_REPORT_SUCCESS';\nexport const DUPLICATE_REPORT_FAILURE = 'DUPLICATE_REPORT_FAILURE';\n\nexport const BULK_UPDATE_SUBMISSION_ANSWER = 'BULK_UPDATE_SUBMISSION_ANSWER';\nexport const REOPEN_SOCKET_CONNECTION = 'REOPEN_SOCKET_CONNECTION';\n\nexport const SET_COLUMN_FUNCTIONS_DATA = 'SET_COLUMN_FUNCTIONS_DATA';\nexport const CALCULATE_COLUMN_FUNCTION_REQUEST = 'CALCULATE_COLUMN_FUNCTION_REQUEST';\nexport const SAVE_COLUMN_FUNCTION_REQUEST = 'SAVE_COLUMN_FUNCTION_REQUEST';\nexport const SAVE_COLUMN_FUNCTION_FAILURE = 'SAVE_COLUMN_FUNCTION_FAILURE';\nexport const SAVE_COLUMN_FUNCTION_SUCCESS = 'SAVE_COLUMN_FUNCTION_SUCCESS';\n\nexport const SET_VIEW_FORM_CALCULATIONS = 'SET_VIEW_FORM_CALCULATIONS';\nexport const SET_VIEW_FORM_PROPERTIES = 'SET_VIEW_FORM_PROPERTIES';\nexport const FETCH_ACTIVE_VIEW_FORM_PROPERTIES = 'FETCH_ACTIVE_VIEW_FORM_PROPERTIES';\n\nexport const EDIT_VIEW_FORM_PROPERTIES_REQUEST = 'EDIT_VIEW_FORM_PROPERTIES_REQUEST';\nexport const EDIT_VIEW_FORM_PROPERTIES_SUCCESS = 'EDIT_VIEW_FORM_PROPERTIES_SUCCESS';\nexport const EDIT_VIEW_FORM_PROPERTIES_FAILURE = 'EDIT_VIEW_FORM_PROPERTIES_FAILURE';\n\nexport const CLONE_TEMPLATE_REQUEST = 'CLONE_TEMPLATE_REQUEST';\nexport const CLONE_TEMPLATE_SUCCESS = 'CLONE_TEMPLATE_SUCCESS';\nexport const CLONE_TEMPLATE_FAILURE = 'CLONE_TEMPLATE_FAILURE';\n\nexport const ADD_SYNC_DOWNLOAD_REQUEST = 'ADD_SYNC_DOWNLOAD_REQUEST';\nexport const REMOVE_SYNC_DOWNLOAD_REQUEST = 'REMOVE_SYNC_DOWNLOAD_REQUEST';\n\nexport const SET_KANBAN_COLUMNS_REQUEST = 'SET_KANBAN_COLUMNS_REQUEST';\nexport const KANBAN_CARD_ADD = 'KANBAN_CARD_ADD';\nexport const KANBAN_CARD_DRAGGED = 'KANBAN_CARD_DRAGGED';\nexport const KANBAN_COLUMN_DRAGGED = 'KANBAN_COLUMN_DRAGGED';\nexport const KANBAN_UPDATE_COLLAPSED_COLUMNS = 'KANBAN_UPDATE_COLLAPSED_COLUMNS';\nexport const KANBAN_COLUMN_ADD = 'KANBAN_COLUMN_ADD';\nexport const KANBAN_COLUMN_COLOR_CHANGE = 'KANBAN_COLUMN_COLOR_CHANGE';\nexport const KANBAN_COLUMN_RENAME = 'KANBAN_COLUMN_RENAME';\nexport const KANBAN_UPDATE_HIDDEN_COLUMNS = 'KANBAN_UPDATE_HIDDEN_COLUMNS';\nexport const KANBAN_UPDATE_COLUMNS = 'KANBAN_UPDATE_COLUMNS';\nexport const KANBAN_UPDATE_COLUMNS_SUCCESS = 'KANBAN_UPDATE_COLUMNS_SUCCESS';\nexport const KANBAN_COLUMN_TITLE_UPDATE = 'KANBAN_COLUMN_TITLE_UPDATE';\nexport const KANBAN_COLUMN_TITLE_UPDATE_SUCCESS = 'KANBAN_COLUMN_TITLE_UPDATE_SUCCESS';\nexport const EDIT_KANBAN_CARD_SUCCESS = 'EDIT_KANBAN_CARD_SUCCESS';\nexport const KANBAN_CONFIG_UPDATE = 'KANBAN_CONFIG_UPDATE';\nexport const KANBAN_SET_EDIT_CELL_FOR_TITLE = 'KANBAN_SET_EDIT_CELL_FOR_TITLE';\nexport const KANBAN_OPEN_INBOX = 'KANBAN_OPEN_INBOX';\nexport const KANBAN_OPEN_CARD_MENU = 'KANBAN_OPEN_CARD_MENU';\nexport const KANBAN_CARD_FILE = 'KANBAN_CARD_FILE';\nexport const KANBAN_HANDLE_COLUMN_RESULTSETS = 'KANBAN_HANDLE_COLUMN_RESULTSETS';\nexport const KANBAN_UPDATE_COLUMNS_RESULTSETS = 'KANBAN_UPDATE_COLUMNS_RESULTSETS';\nexport const KANBAN_LAZY_LOAD_CARDS = 'KANBAN_LAZY_LOAD_CARDS';\nexport const KANBAN_SET_GROUPED_SUBMISSIONS = 'KANBAN_SET_GROUPED_SUBMISSIONS';\nexport const KANBAN_UPDATE_SUBMISSION_GROUPS = 'KANBAN_UPDATE_SUBMISSION_GROUPS';\nexport const KANBAN_FIELD_UPDATE_QUESTION = 'KANBAN_FIELD_UPDATE_QUESTION';\nexport const KANBAN_DOWNLOAD_CARDS = 'KANBAN_DOWNLOAD_CARDS';\nexport const KANBAN_DOWNLOAD_CARDS_PDF = 'KANBAN_DOWNLOAD_CARDS_PDF';\nexport const SET_KANBAN_BROKEN_CONFIG = 'SET_KANBAN_BROKEN_CONFIG';\n\nexport const CHECK_LIVECHAT_REQUEST = 'CHECK_LIVECHAT_REQUEST';\nexport const CHECK_LIVECHAT_SUCCESS = 'CHECK_LIVECHAT_SUCCESS';\nexport const CHECK_LIVECHAT_FAILURE = 'CHECK_LIVECHAT_FAILURE';\n\nexport const CHECK_FULLSTORY = 'CHECK_FULLSTORY';\n\nexport const FETCH_INTEGRATIONS_META_REQUEST = 'FETCH_INTEGRATIONS_META_REQUEST';\nexport const FETCH_INTEGRATIONS_META_SUCCESS = 'FETCH_INTEGRATIONS_META_SUCCESS';\nexport const FETCH_INTEGRATIONS_META_FAILURE = 'FETCH_INTEGRATIONS_META_FAILURE';\n\nexport const FETCH_TABLES_CUSTOMIZATIONS_REQUEST = 'FETCH_TABLES_CUSTOMIZATIONS_REQUEST';\nexport const FETCH_TABLES_CUSTOMIZATIONS_SUCCESS = 'FETCH_TABLES_CUSTOMIZATIONS_SUCCESS';\nexport const FETCH_TABLES_CUSTOMIZATIONS_FAILURE = 'FETCH_TABLES_CUSTOMIZATIONS_FAILURE';\n\nexport const COUNT_ACTIONS_FAILURE = 'COUNT_ACTIONS_FAILURE';\n\nexport const DELETE_EMAIL_REQUEST = 'DELETE_EMAIL_REQUEST';\nexport const DELETE_INTEGRATION_REQUEST = 'DELETE_INTEGRATION_REQUEST';\n\nexport const SET_FORCE_TO_DISABLE_HELP_SECTIONS = 'SET_FORCE_TO_DISABLE_HELP_SECTIONS';\n\nexport const RUN_SUBMISSION_ACTION_REQUEST = 'RUN_SUBMISSION_ACTION_REQUEST';\nexport const RUN_SUBMISSIONS_ACTION_REQUEST = 'RUN_SUBMISSIONS_ACTION_REQUEST';\nexport const SET_SUBMISSION_ACTION_STATUS = 'SET_SUBMISSION_ACTION_STATUS';\nexport const SET_OLD_SUBMISSION_ACTION_STATUS = 'SET_OLD_SUBMISSION_ACTION_STATUS';\n\nexport const DISABLE_FILTER_RESULT_BAR = 'DISABLE_FILTER_RESULT_BAR';\nexport const HANDLE_REMOVE_FILTER = 'HANDLE_REMOVE_FILTER';\n\nexport const SELECT_CONNECTED_SUBMISSION_FROM_LIST = 'SELECT_CONNECTED_SUBMISSION_FROM_LIST';\nexport const REMOVE_SUBMISSION_FROM_FILTERED = 'REMOVE_SUBMISSION_FROM_FILTERED';\nexport const REMOVE_SUBMISSION_FROM_FILTERED_SUCCESS = 'REMOVE_SUBMISSION_FROM_FILTERED_SUCCESS';\n\nexport const SET_ASSIGNEE_OPTIONS_ARRAY = 'SET_ASSIGNEE_OPTIONS_ARRAY';\nexport const SELECT_ASSIGNEE_FROM_LIST = 'SELECT_ASSIGNEE_FROM_LIST';\nexport const ASSIGNEE_SCROLL_FETCH = 'ASSIGNEE_SCROLL_FETCH';\nexport const INIT_ASSIGNEE = 'INIT_ASSIGNEE';\nexport const REMOVE_ASSIGNEE_FROM_LIST = 'REMOVE_ASSIGNEE_FROM_LIST';\nexport const REMOVE_ASSIGNEE_FROM_LIST_SUCCESS = 'REMOVE_ASSIGNEE_FROM_LIST_SUCCESS';\n\nexport const CHECK_INTRO_POPUPS = 'CHECK_INTRO_POPUPS';\nexport const CHECK_INTRO_POPUPS_ERROR = 'CHECK_INTRO_POPUPS_ERROR';\n\nexport const FETCH_COMMENTS_SUCCESS = 'FETCH_COMMENTS_SUCCESS';\nexport const FETCH_COMMENTS_FAILURE = 'FETCH_COMMENTS_FAILURE';\n\nexport const SINGLE_FETCH_COMMENT_REQUEST = 'SINGLE_FETCH_COMMENT_REQUEST';\nexport const SINGLE_FETCH_COMMENT_FAILURE = 'SINGLE_FETCH_COMMENT_FAILURE';\nexport const SINGLE_FETCH_COMMENT_SUCCESS = 'SINGLE_FETCH_COMMENT_SUCCESS';\n\nexport const CREATE_COMMENT_REQUEST = 'CREATE_COMMENT_REQUEST';\nexport const CREATE_COMMENT_SUCCESS = 'CREATE_COMMENT_SUCCESS';\nexport const CREATE_COMMENT_FAILURE = 'CREATE_COMMENT_FAILURE';\n\nexport const DELETE_COMMENT_REQUEST = 'DELETE_COMMENT_REQUEST';\nexport const DELETE_COMMENT_SUCCESS = 'DELETE_COMMENT_SUCCESS';\nexport const DELETE_COMMENT_FAILURE = 'DELETE_COMMENT_FAILURE';\n\nexport const UPDATE_COMMENT_REQUEST = 'UPDATE_COMMENT_REQUEST';\nexport const UPDATE_COMMENT_SUCCESS = 'UPDATE_COMMENT_SUCCESS';\nexport const UPDATE_COMMENT_FAILURE = 'UPDATE_COMMENT_FAILURE';\n\nexport const SET_COMMENT_LOADING = 'SET_COMMENT_LOADING';\n\nexport const SET_COMMENTS_MODAL_READONLY = 'SET_COMMENTS_MODAL_READONLY';\n\nexport const REQUEST_TABLE_ACCESS_REQUEST = 'REQUEST_TABLE_ACCESS_REQUEST';\nexport const REQUEST_TABLE_ACCESS_SUCCESS = 'REQUEST_TABLE_ACCESS_SUCCESS';\nexport const REQUEST_TABLE_ACCESS_FAILURE = 'REQUEST_TABLE_ACCESS_FAILURE';\n\nexport const SET_CCANDBCC_ENABLED = 'SET_CCANDBCC_ENABLED';\n\nexport const COMMENTER_OPTIONS_REQUEST = 'COMMENTER_OPTIONS_REQUEST';\nexport const COMMENTER_OPTIONS_SUCCESS = 'COMMENTER_OPTIONS_SUCCESS';\nexport const COMMENTER_OPTIONS_FAILURE = 'COMMENTER_OPTIONS_FAILURE';\n\nexport const SET_TEAM_ROLES = 'SET_TEAM_ROLES';\nexport const SET_TEAM_MEMBERS = 'SET_TEAM_MEMBERS';\nexport const SET_TEAM_PROPERTIES = 'SET_TEAM_PROPERTIES';\n\nexport const SET_COLUMN_DATA_EDITING_REQUEST = 'SET_COLUMN_DATA_EDITING_REQUEST';\n\nexport const SET_NAME_FOR_CREATED_AT = 'SET_NAME_FOR_CREATED_AT';\n\nexport const CANCEL_SIGN_REQUEST = 'CANCEL_SIGN_REQUEST';\nexport const CANCEL_SIGN_SUCCESS = 'CANCEL_SIGN_SUCCESS';\nexport const CANCEL_SIGN_FAILURE = 'CANCEL_SIGN_FAILURE';\n\nexport const REMINDER_SIGN_REQUEST = 'REMINDER_SIGN_REQUEST';\nexport const REMINDER_SIGN_SUCCESS = 'REMINDER_SIGN_SUCCESS';\nexport const REMINDER_SIGN_FAILURE = 'REMINDER_SIGN_FAILURE';\n\nexport const TOGGLE_WHITE_SCREEN = 'TOGGLE_WHITE_SCREEN';\n\nexport const CANCEL_WORKFLOW_REQUEST = 'CANCEL_WORKFLOW_REQUEST';\nexport const CANCEL_WORKFLOW_SUCCESS = 'CANCEL_WORKFLOW_SUCCESS';\nexport const CANCEL_WORKFLOW_FAILURE = 'CANCEL_WORKFLOW_FAILURE';\n\nexport const RESTART_WORKFLOW_REQUEST = 'RESTART_WORKFLOW_REQUEST';\nexport const RESTART_WORKFLOW_SUCCESS = 'RESTART_WORKFLOW_SUCCESS';\nexport const RESTART_WORKFLOW_FAILURE = 'RESTART_WORKFLOW_FAILURE';\n\nexport const SET_IS_MOBILE = 'SET_IS_MOBILE';\n\nexport const SET_SUBMISSION_ENCRYPTION_KEY = 'SET_SUBMISSION_ENCRYPTION_KEY';\n\nexport const REDECRYPT_SUBMISSIONS = 'REDECRYPT_SUBMISSIONS';\n\nexport const SET_URL_FILTERS_APPLIED = 'SET_URL_FILTERS_APPLIED';\n\nexport const SET_VIEW_PRIVATE_KEY_LOADED = 'SET_VIEW_PRIVATE_KEY_LOADED';\n\nexport const MERGE_QUESTIONS_WITH_SUBMISSIONS = 'MERGE_QUESTIONS_WITH_SUBMISSIONS';\n\nexport const SET_PENDING_REQUEST_EXISTENCE = 'SET_PENDING_REQUEST_EXISTENCE';\n\nexport const CHECK_AND_TOGGLE_FEEDBACK_MODAL = 'CHECK_AND_TOGGLE_FEEDBACK_MODAL';\n\n// Feature Release Actions\nexport const FEATURE_RELEASES_FETCH_SUCCESS = 'FEATURE_RELEASES_FETCH_SUCCESS';\n\nexport const FEATURE_RELEASE_OPT_IN_REQUEST = 'FEATURE_RELEASE_OPT_IN_REQUEST';\nexport const FEATURE_RELEASE_OPT_IN_SUCCESS = 'FEATURE_RELEASE_OPT_IN_SUCCESS';\nexport const FEATURE_RELEASE_OPT_IN_FAILURE = 'FEATURE_RELEASE_OPT_IN_FAILURE';\n\nexport const FEATURE_RELEASE_OPT_OUT_REQUEST = 'FEATURE_RELEASE_OPT_OUT_REQUEST';\nexport const FEATURE_RELEASE_OPT_OUT_SUCCESS = 'FEATURE_RELEASE_OPT_OUT_SUCCESS';\nexport const FEATURE_RELEASE_OPT_OUT_FAILURE = 'FEATURE_RELEASE_OPT_OUT_FAILURE';\n\n// Board Actions\nexport const OPEN_CARD_TASK_DETAILS = 'OPEN_CARD_TASK_DETAILS';\n","let _clientID = null;\n\nexport const getCollabrationClientID = () => _clientID;\n\nexport const setCollabrationClientID = (clientID) => {\n _clientID = clientID;\n};\n","export const operators = [\n { name: 'eq', text: 'equals' },\n { name: 'matches', text: 'includes' },\n { name: 'ne', text: 'not equal to' },\n { name: 'lt', text: 'less than' },\n { name: 'lte', text: 'less than or equals to' },\n { name: 'gt', text: 'greater than' },\n { name: 'gte', text: 'greater than or equals to' },\n // { name: 'emp', text: 'Is Empty' },\n // { name: 'nemp', text: 'Is Filled' }\n];\n\nexport const dateOperators = [\n { name: 'matches', text: 'includes' },\n { name: 'lt', text: 'less than' },\n { name: 'lte', text: 'less than or equals to' },\n { name: 'gt', text: 'greater than' },\n { name: 'gte', text: 'greater than or equals to' }\n];\n\nexport const genericTypesMap = {\n dropdown: ['control_dropdown', 'control_radio', 'control_checkbox'],\n numeric: ['control_number', 'control_spinner'],\n scale: ['control_rating', 'control_scale'],\n date: ['control_submissionDate', 'control_datetime'],\n text: ['control_fullname', 'control_email', 'control_address', 'control_phone', 'control_textbox', 'control_textarea'],\n bool: ['control_sheetbox']\n};\n\nexport const emptyValueOperators = ['emp', 'nemp'];\n\nexport const emptyValueOperatorsMap = {\n emp: 'eq',\n nemp: 'ne'\n};\n\nexport const UTILITY_FIELDS = ['created_at', 'updated_at', 'ip', 'id', 'submittedVia'];\nexport const UTILITY_FIELDS_WITH_Q = ['qcreated_at', 'qupdated_at', 'qip', 'qid'];\n\nexport const defaultFilter = {\n field: '',\n operator: 'eq',\n value: '',\n isFilled: false,\n isValueDisabled: false,\n id: 0,\n fieldType: ''\n};\n\nexport const filterGroups = [\n { value: 'all', text: 'All Submissions' },\n { value: 'unread', text: 'Unread' },\n { value: 'read', text: 'Read' },\n { value: 'flag', text: 'Starred' },\n { value: 'unflag', text: 'Unstarred' }\n];\n\nexport const utilsDefaultTexts = {\n id: 'Submission ID',\n ip: 'Submission IP',\n created_at: 'Submission Date',\n updated_at: 'Last Update Date'\n};\n","export const DELETE_COLUMN_DIALOG = 'DELETE_COLUMN_DIALOG';\nexport const DELETE_VIEW_DIALOG = 'DELETE_VIEW_DIALOG';\nexport const DELETE_SUBMISSION_DIALOG = 'DELETE_SUBMISSION_DIALOG';\nexport const DELETE_SUBMISSION_FROM_ARCHIVE_DIALOG = 'DELETE_SUBMISSION_FROM_ARCHIVE_DIALOG';\nexport const PURGE_SUBMISSION_DIALOG = 'PURGE_SUBMISSION_DIALOG';\nexport const QUESTION_LIST_MODAL = 'QUESTION_LIST_MODAL';\nexport const RESET_COLUMNS_MODAL = 'RESET_COLUMNS_MODAL';\nexport const DELETE_UPLOAD_DIALOG = 'DELETE_UPLOAD_DIALOG';\nexport const NEW_COLUMN_MODAL = 'NEW_COLUMN_MODAL';\nexport const REMOVE_CONNECTION_MODAL = 'REMOVE_CONNECTION_MODAL';\nexport const PENDING_PAYMENTS_MODAL = 'PENDING_PAYMENTS_MODAL';\nexport const DISCONNECT_VIEW_MODAL = 'DISCONNECT_VIEW_MODAL';\nexport const VIEW_DESCRIPTION_MODAL = 'VIEW_DESCRIPTION_MODAL';\nexport const COLUMN_DESCRIPTION_MODAL = 'COLUMN_DESCRIPTION_MODAL';\nexport const SHARE_TEMPLATE_MODAL = 'SHARE_TEMPLATE_MODAL';\nexport const CREATE_FILTERED_VIEW_MODAL = 'CREATE_FILTERED_VIEW_MODAL';\nexport const CONNECTED_CELL_MODAL = 'CONNECTED_CELL_MODAL';\nexport const MULTIPLE_UPLOADS_MODAL = 'MULTIPLE_UPLOADS_MODAL';\nexport const EDIT_SUBMISSION_MODAL = 'EDIT_SUBMISSION_MODAL';\nexport const EDIT_ANIMATION = 'EDIT_ANIMATION';\nexport const DELETE_REPORT_ITEM_DIALOG = 'DELETE_REPORT_ITEM_DIALOG';\nexport const DUPLICATE_TAB_MODAL = 'DUPLICATE_TAB_MODAL';\nexport const TOGGLE_COLUMN_PHI_DIALOG = 'TOGGLE_COLUMN_PHI_DIALOG';\nexport const DELETE_EMAIL_DIALOG = 'DELETE_EMAIL_DIALOG';\nexport const DELETE_INTEGRATION_DIALOG = 'DELETE_INTEGRATION_DIALOG';\nexport const NEW_VIEW = 'NEW_VIEW';\nexport const HIPAA_DECRYPTION_MODAL = 'HIPAA_DECRYPTION_MODAL';\nexport const CREATE_COLUMN_MODAL = 'CREATE_COLUMN_MODAL';\nexport const INCOMPLETE_SUBMISSIONS_INTRO = 'INCOMPLETE_SUBMISSIONS_INTRO';\nexport const VIRTUAL_FORMS_LIST_MODAL = 'VIRTUAL_FORMS_LIST_MODAL'; // This modal is not a real modal, real modal is in Common project. This is used for storing modal status.\nexport const REVISION_RESTORE_MODAL = 'REVISION_RESTORE_MODAL';\nexport const REPORT_FEEDBACK_MODAL = 'REPORT_FEEDBACK_MODAL';\nexport const REPORT_SELECT_MODAL = 'REPORT_SELECT_MODAL';\nexport const DELETE_REPORT_DIALOG = 'DELETE_REPORT_DIALOG';\nexport const NEW_REPORT_MODAL = 'NEW_REPORT_MODAL';\nexport const GUEST_LOGIN_MODAL = 'GUEST_LOGIN_MODAL';\nexport const ERROR_MESSAGE_MODAL = 'ERROR_MESSAGE_MODAL';\nexport const HELP_VIDEO_MODAL = 'HELP_VIDEO_MODAL';\nexport const SWITCH_TO_OLD_MODAL = 'SWITCH_TO_OLD_MODAL';\nexport const USER_FEEDBACK_MODAL = 'USER_FEEDBACK_MODAL';\nexport const SEND_ACTION_BUTTON_REQUEST_MODAL = 'SEND_ACTION_BUTTON_REQUEST_MODAL';\nexport const FILL_FORM_ACTION_BUTTON_MODAL = 'FILL_FORM_ACTION_BUTTON_MODAL';\nexport const CALENDAR_CONFIGURATION_MODAL = 'CALENDAR_CONFIGURATION_MODAL';\nexport const CALENDAR_CONFIGURATION_MISSING_MODAL = 'CALENDAR_CONFIGURATION_MISSING_MODAL';\nexport const KANBAN_COLUMN_MODAL = 'KANBAN_COLUMN_MODAL';\nexport const KANBAN_CONFIGURATION_MODAL = 'KANBAN_CONFIGURATION_MODAL';\nexport const NEW_KANBAN_CONFIGURATION_MODAL = 'NEW_KANBAN_CONFIGURATION_MODAL';\nexport const CHANGE_CARD_STICKY_FIELD = 'CHANGE_CARD_STICKY_FIELD';\nexport const CARD_CONFIGURATION_MODAL = 'CARD_CONFIGURATION_MODAL';\nexport const UPLOAD_CONFIGURATION_MODAL = 'UPLOAD_CONFIGURATION_MODAL';\nexport const CONFIRM_ACTION_DIALOG = 'CONFIRM_ACTION_DIALOG';\nexport const WHATS_NEW_MODAL = 'WHATS_NEW_MODAL';\nexport const AUTO_DELETE_INFORMATION_MODAL = 'AUTO_DELETE_INFORMATION_MODAL';\nexport const REQUEST_ACCESS_USER_TYPES = ['readOnly', 'commenter', 'collaborator'];\nexport const CANCEL_DOCUMENT_MODAL = 'CANCEL_DOCUMENT_MODAL';\nexport const SEND_REMINDER_EMAIL_MODAL = 'SEND_REMINDER_EMAIL_MODAL';\nexport const WHITE_SCREEN_TICKET_MODAL = 'WHITE_SCREEN_TICKET_MODAL';\nexport const APPROVAL_REQUEST_MODAL = 'APPROVAL_REQUEST_MODAL';\nexport const CUSTOMIZE_BUTTON_MODAL = 'CUSTOMIZE_BUTTON_MODAL';\nexport const SHOW_HIDE_COLUMNS_MODAL = 'SHOW_HIDE_COLUMNS_MODAL';\nexport const DECRYPT_ENTRIES_MODAL = 'DECRYPT_ENTRIES_MODAL';\nexport const REPORT_FATAL_ERROR_DIALOG = 'REPORT_FATAL_ERROR_DIALOG';\nexport const AI_CHAT_HISTORY_MODAL = 'AI_CHAT_HISTORY_MODAL';\nexport const GENERIC_APP_SHARE_PANEL = 'GENERIC_APP_SHARE_PANEL';\n","export const MINIMUM_SHEET_OWNER_TEAM_ROLE = 'team_admin';\nexport const { teamID: TEAM_ID, isTeamMember } = window;\n","import { DedicatedWorkerSubmissionEngine } from '@jotforminc/submission-engine';\n\nlet _submissionEngine: DedicatedWorkerSubmissionEngine|null;\n\nexport const getSubmissionEngine = (): DedicatedWorkerSubmissionEngine => {\n if (!_submissionEngine) {\n _submissionEngine = new DedicatedWorkerSubmissionEngine();\n }\n\n return _submissionEngine;\n};\n","var _path;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nconst SvgIncompleteSubmission = props => /*#__PURE__*/React.createElement(\"svg\", _extends({\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 10 10\"\n}, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fillRule: \"evenodd\",\n clipRule: \"evenodd\",\n d: \"M10 5C10 7.76142 7.76142 10 5 10C2.23858 10 0 7.76142 0 5C0 2.23858 2.23858 0 5 0C7.76142 0 10 2.23858 10 5ZM8 5H2C2 3.34315 3.34315 2 5 2C6.65685 2 8 3.34315 8 5Z\",\n fill: \"#343C6A\"\n})));\nexport default SvgIncompleteSubmission;","import { getAssetPath } from './index';\n\n// eslint-disable-next-line no-undef, camelcase\n__webpack_public_path__ = `${getAssetPath()}/`;\n","import type { User, Form } from '@jotforminc/types';\nimport { createSelector } from 'reselect';\nimport * as I from 'immutable';\n\nexport interface Store {\n app: Record,\n user: I.Map,\n form: I.Map,\n sheet: I.Map,\n views: I.Map,\n}\n\nexport const getUser = createSelector(\n [(state: Store) => state.user],\n user => user.toJS() as User\n);\n\nexport const getForm = createSelector(\n [(state: Store) => state.form],\n form => form.toJS() as Form\n);\n\nexport const getSheet = createSelector(\n [(state: Store) => state.sheet],\n sheet => sheet.toJS() as any\n);\n\nexport const getViews = createSelector(\n [(state: Store) => state.views],\n views => views.toJS() as any\n);\n\nexport const getApp = (state: Store): Store['app'] => state.app;\n\nexport const getFormID = createSelector([getForm], form => form.id || '');\n\nexport const getSheetResource = createSelector([getSheet], sheet => ({\n resourceType: sheet.resourceType as string,\n resourceID: sheet.resourceID as string\n}));\n\nexport const getActiveViewID = createSelector([getApp], app => app.activeViewID as string);\n\nexport const getActiveView = createSelector([getViews, getActiveViewID], (views, activeViewID) => views[activeViewID] as Record);\n\nexport const getActiveViewName = createSelector([getActiveView], view => (view.name || '') as string);\n\nexport const getViewByID = createSelector([getViews, (_state, viewID) => viewID], (views, viewID) => views[viewID] as Record);\n\nexport const getUsername = createSelector([getUser], user => {\n return user.username ?? '';\n});\n\nexport const getUserEmail = createSelector([getUser], user => {\n return user.email ?? '';\n});\n\nexport const getAccountType = createSelector([getUser], user => {\n return user.account_type?.name || '';\n});\n","import {\n RequestLayer,\n Interceptors,\n requestInterceptors as defaultRequestInterceptors,\n RequestInterceptor,\n ResponseResult\n} from '@jotforminc/request-layer';\n\nimport type { Form } from '@jotforminc/types';\n\nexport type * from '@jotforminc/request-layer';\n\nexport class RequestHelper {\n #requestLayer: RequestLayer;\n\n #sheetID: string|number = -1;\n\n #clientID?: string;\n\n constructor() {\n const requestInterceptor: RequestInterceptor = ctx => {\n if (ctx.url.startsWith('/API/')) {\n const prefix = `/API/sheets/${this.#sheetID}/`;\n\n ctx.url = ctx.url.replace('/API/', prefix);\n }\n\n if (this.#clientID) {\n if (!ctx.config.headers) {\n ctx.config.headers = {};\n }\n\n ctx.config.headers['jf-client-id'] = this.#clientID;\n }\n\n return ctx;\n };\n\n this.#requestLayer = new RequestLayer(undefined, {\n interceptorConfig: {\n customRequestInterceptors: [requestInterceptor, ...defaultRequestInterceptors],\n customResponseInterceptors: [Interceptors.requestManagerResponseNormalizer],\n teamID: window.teamID\n }\n });\n }\n\n set sheetID(sheetID: string|number) {\n this.#sheetID = sheetID;\n }\n\n get sheetID(): string|number {\n return this.#sheetID;\n }\n\n set clientID(clientID: string|undefined) {\n this.#clientID = clientID;\n }\n\n get clientID(): string|undefined {\n return this.#clientID;\n }\n\n get requestLayer(): RequestLayer {\n return this.#requestLayer;\n }\n\n /**\n * API Request Definitions\n */\n\n fetchForm = (formID: string|number, { next = 1 } = {}): Promise> => {\n return this.requestLayer.get
(`/API/form/${formID}`, { next });\n };\n}\n","import { RequestHelper, ResponseResult } from '@jotforminc/sheets-core';\nimport { Form, Question } from '@jotforminc/types';\n\nclass ConversationsRequestHelper extends RequestHelper {\n getAIAgentChatMessages = (formID: string|number, chatID: string): Promise> => {\n return this.requestLayer.get(`/API/ai-agent/${formID}/chat/${chatID}`);\n };\n\n getConversations = (resourceType: string, resourceID: string|number): Promise> => {\n return this.requestLayer.get(`/API/ai-agent/${resourceType}/${resourceID}/conversations?orderby=created_at,desc`);\n };\n\n getForm = (formId: Form['id']): Promise> => {\n return this.requestLayer.get(`/API/form/${formId}`);\n };\n\n getQuestions = (formId: Form['id']): Promise>> => {\n return this.requestLayer.get(`/API/form/${formId}/questions`);\n };\n}\n\nexport default new ConversationsRequestHelper();\n","import { createContext } from 'react';\nimport { DedicatedWorkerSubmissionEngine } from '@jotforminc/submission-engine';\nimport type { Submission } from '@jotforminc/types';\n\nexport type SubmissionEngineContextValue = {\n engine: DedicatedWorkerSubmissionEngine,\n getSubmissionByIDCached(formID: Submission['form_id'], submissionID: Submission['id']): Submission|undefined,\n cacheSubmissions(formID: Submission['form_id'], submissionIDs: Submission['id'][]): void,\n}\nexport const SubmissionEngineContext = createContext({} as unknown as SubmissionEngineContextValue);\n","import { Form, Question, Submission } from '@jotforminc/types';\n\nexport enum Status {\n INITIAL = 'INITIAL',\n LOADING = 'LOADING',\n LOADED = 'LOADED',\n ERROR = 'ERROR',\n}\n\nexport type ConversationsViewsUIState = {\n status: Status,\n showSubmission: boolean,\n views: Record\n};\n\nexport type ConversationsFormState = {\n status: Status;\n formID?: Form['id'];\n forms: Record | null;\n};\n\nexport type ConversationsQuestionsState = {\n status: Status;\n formID?: Form['id'];\n questions: Record> | null;\n};\n\nexport type ConversationsAppRootState = {\n conversationsViewsUI: ConversationsViewsUIState,\n conversationForms: ConversationsFormState,\n conversationQuestions: ConversationsQuestionsState\n}\n","import { createSelector } from 'reselect';\nimport { Selectors } from '@jotforminc/sheets-core';\nimport {\n Status,\n ConversationsAppRootState,\n ConversationsViewsUIState,\n ConversationsFormState,\n ConversationsQuestionsState\n} from '../types/redux';\n\nexport const getConversations = (state: ConversationsAppRootState): ConversationsViewsUIState => state.conversationsViewsUI;\n\nexport const _getConversationForms = (state: ConversationsAppRootState): ConversationsFormState => state.conversationForms;\nexport const _getConversationQuestions = (state: ConversationsAppRootState): ConversationsQuestionsState => state.conversationQuestions;\n\nexport const getConversationForms = (state: ConversationsAppRootState): ConversationsFormState['forms'] => state.conversationForms.forms;\nexport const getConversationQuestions = (state: ConversationsAppRootState): ConversationsQuestionsState['questions'] => state.conversationQuestions.questions;\n\nexport const getConversationsByViewID = createSelector(\n [\n getConversations,\n (_, viewID) => viewID\n ],\n (conversations, viewID) => {\n return conversations.views[viewID];\n }\n);\n\nexport const getConversationsStatus = createSelector(\n [\n getConversations\n ],\n conversations => {\n return conversations?.status;\n }\n);\n\nexport const getConversationsSubmissionsIDsByViewID = createSelector(\n [\n getConversationsByViewID\n ],\n conversations => {\n return conversations?.submissionIDs || [];\n }\n);\n\nexport const getConversationsFilteredSubmissionsIDsByViewID = createSelector(\n [\n getConversationsByViewID\n ],\n conversations => {\n return conversations?.filteredSubmissionIDs || [];\n }\n);\n\nexport const getConversationsSubmissionsCountByViewID = createSelector(\n [\n getConversationsSubmissionsIDsByViewID\n ],\n submissionIDs => {\n return submissionIDs.length;\n }\n);\n\nexport const getActiveViewSubmissionCount = createSelector(\n [\n Selectors.getActiveViewID,\n getConversations\n ],\n (activeViewID, conversations) => {\n return conversations.views[activeViewID]?.submissionIDs.length;\n }\n);\n\nexport const getActiveViewFilteredSubmissionCount = createSelector(\n [\n Selectors.getActiveViewID,\n getConversations\n ],\n (activeViewID, conversations) => {\n return conversations.views[activeViewID]?.filteredSubmissionIDs.length;\n }\n);\n\nexport const getActiveViewFilteredSubmissionIds = createSelector(\n [\n Selectors.getActiveViewID,\n getConversations\n ],\n (activeViewID, conversations) => {\n return conversations.views[activeViewID]?.filteredSubmissionIDs;\n }\n);\n\nexport const getActiveViewSubmissionStatus = createSelector(\n [\n Selectors.getActiveViewID,\n getConversations\n ],\n (activeViewID, conversations) => {\n return conversations.views[activeViewID]?.status || Status.INITIAL;\n }\n);\n\nexport const getConversationsShowSubmission = createSelector(\n [\n getConversations\n ],\n conversations => {\n return conversations?.showSubmission || false;\n }\n);\n\nexport const getActiveViewCurrentSubmissionIndexByViewID = createSelector(\n [\n getConversationsByViewID\n ],\n conversations => {\n return conversations?.currentSubmissionIndex;\n }\n);\n\nexport const getActiveViewCurrentSubmissionIndex = createSelector(\n [\n Selectors.getActiveViewID,\n getConversations\n ],\n (activeViewID, conversations) => {\n return conversations.views[activeViewID]?.currentSubmissionIndex;\n }\n);\n\nexport const getActiveViewSelectedConversations = createSelector(\n [\n Selectors.getActiveViewID,\n getConversations\n ],\n (activeViewId, conversations) => {\n return conversations.views[activeViewId]?.selectedConversations;\n }\n);\n\nexport const getActiveViewSelectedConversationsCount = createSelector(\n [\n Selectors.getActiveViewID,\n getConversations\n ],\n (activeViewId, conversations) => {\n return conversations.views[activeViewId]?.selectedConversations.length;\n }\n);\n\nexport const getIsConversationSelected = createSelector(\n [\n Selectors.getActiveViewID,\n getConversations,\n (_, conversation) => conversation\n ],\n (activeViewId, conversations, conversation) => {\n if (!conversation || !conversation.id) {\n return false;\n }\n return conversations.views[activeViewId]?.selectedConversations.includes(conversation.id);\n }\n);\n\nexport const getFormById = createSelector(\n [\n getConversationForms,\n (_, formId) => formId\n ],\n (forms, formId) => {\n if (!forms) {\n return null;\n }\n\n if (!forms[formId]) {\n return null;\n }\n\n return forms[formId];\n }\n);\n\nexport const getQuestionsById = createSelector(\n [\n getConversationQuestions,\n (_, formId) => formId\n ],\n (questions, formId) => {\n if (!questions) {\n return null;\n }\n\n if (formId === '0' || formId === 0) {\n return {};\n }\n\n if (!questions[formId]) {\n return null;\n }\n\n return questions[formId];\n }\n);\n","import {\n useContext, useEffect, useMemo, useState\n} from 'react';\nimport type { Submission } from '@jotforminc/types';\n\nimport { SubmissionEngineEvent } from '@jotforminc/submission-engine';\nimport { useSelector } from 'react-redux';\nimport { Selectors } from '@jotforminc/sheets-core';\nimport { SubmissionEngineContext } from './context';\nimport { getActiveViewCurrentSubmissionIndexByViewID, getConversationsFilteredSubmissionsIDsByViewID } from '../../selectors';\n\nconst DEFAULT_VALUE = null;\nconst BATCH_COUNT = 50;\n\nexport const useGetSubmissionByID = (formID: Submission['form_id'], submissionID: Submission['id'], defaultValue = DEFAULT_VALUE): Submission|typeof defaultValue => {\n const { engine, getSubmissionByIDCached } = useContext(SubmissionEngineContext);\n\n const [result, setResult] = useState(defaultValue);\n const [event, setEvent] = useState(null);\n\n useEffect(() => {\n if (engine && formID && submissionID) {\n engine.subscribe('submission-insert', formID, submissionID, setEvent);\n engine.subscribe('submission-update', formID, submissionID, setEvent);\n engine.subscribe('submission-delete', formID, submissionID, setEvent);\n }\n\n return () => {\n if (engine && formID && submissionID) {\n engine.unsubscribe('submission-insert', formID, submissionID, setEvent);\n engine.unsubscribe('submission-update', formID, submissionID, setEvent);\n engine.unsubscribe('submission-delete', formID, submissionID, setEvent);\n }\n };\n }, [engine, formID, submissionID]);\n\n useEffect(() => {\n if (!formID || !submissionID || !engine) {\n setResult(defaultValue);\n return;\n }\n\n const submission = getSubmissionByIDCached(formID, submissionID);\n\n if (!submission) {\n setResult(defaultValue);\n return;\n }\n\n setResult(submission);\n }, [engine, formID, submissionID, defaultValue, event, getSubmissionByIDCached]);\n\n return result;\n};\n\nexport const useGetSubmissionByIndex = (formID: Submission['form_id'], index: number, defaultValue = DEFAULT_VALUE): Submission|typeof defaultValue => {\n const { engine, cacheSubmissions } = useContext(SubmissionEngineContext);\n\n const activeViewID = useSelector(Selectors.getActiveViewID);\n const submissionIDs = useSelector(state => getConversationsFilteredSubmissionsIDsByViewID(state, activeViewID));\n const currentIndex = useSelector(state => getActiveViewCurrentSubmissionIndexByViewID(state, activeViewID));\n\n const rangeUnitNumber = Math.max(Math.round(index / BATCH_COUNT), 1);\n const rangeStart = (rangeUnitNumber - 1) * BATCH_COUNT;\n const rangeEnd = (rangeUnitNumber + 1) * BATCH_COUNT;\n\n const submissionID = submissionIDs[index];\n const currentSubmissionID = submissionIDs[currentIndex];\n\n const submissionIDsSlice = useMemo(() => {\n const next = submissionIDs.slice(rangeStart, rangeEnd);\n next.push(currentSubmissionID);\n return next;\n }, [submissionIDs, rangeStart, rangeEnd, currentSubmissionID]);\n\n useEffect(() => {\n if (!engine) {\n return;\n }\n\n cacheSubmissions(formID, submissionIDsSlice);\n }, [engine, cacheSubmissions, formID, submissionIDsSlice]);\n\n return useGetSubmissionByID(formID, submissionID, defaultValue);\n};\n","import { Question, Submission } from '@jotforminc/types';\n\nexport const hasAnyAnswer = (\n answers: Submission['answers'],\n questions: Record | null\n): boolean => {\n if (!answers || Object.keys(answers).length === 0) {\n return false;\n }\n\n const answerQIds = Object.keys(answers);\n const questionQIds = Object.keys(questions ?? {});\n\n return !!answerQIds.find(qid => questionQIds.includes(qid) && answers[qid].answer);\n};\n","import React, { useEffect, useState } from 'react';\nimport { SingleSubmissionView } from '@jotforminc/singlesubmissionview';\nimport { History } from '@jotforminc/agent-components';\nimport { prepareAgentHistory } from '@jotforminc/agent-utils';\nimport { Selectors, tickWatchman } from '@jotforminc/sheets-core';\nimport { useSelector } from 'react-redux';\nimport clsx from 'clsx';\nimport { Flex } from '@jotforminc/magnet';\nimport { IconMessagesFilled } from '@jotforminc/svg-icons';\nimport { t } from '@jotforminc/translation';\nimport api from '../../utils/api';\nimport { useGetSubmissionByIndex } from '../../contexts/SubmissionEngineContext/hooks';\nimport {\n getActiveViewCurrentSubmissionIndex,\n getActiveViewSubmissionCount,\n getConversationsShowSubmission,\n getQuestionsById\n} from '../../selectors';\nimport { hasAnyAnswer } from '../../utils/hasAnyAnswer';\n\nconst ConversationView: React.FC = () => {\n const formID = useSelector(Selectors.getFormID);\n const user = useSelector(Selectors.getUser);\n const showSubmission = useSelector(getConversationsShowSubmission);\n const currentIndex = useSelector(getActiveViewCurrentSubmissionIndex);\n const submissionCount = useSelector(getActiveViewSubmissionCount);\n const submission = useGetSubmissionByIndex(formID, currentIndex);\n const formQuestions = useSelector(state => getQuestionsById(state, submission?.form_id));\n const hasAnswer = hasAnyAnswer(submission?.answers, formQuestions);\n const [history, setHistory] = useState([]);\n\n const agentChatID = submission?.aiAgentChatID;\n\n const feedbackEventHandler = (action: string) => {\n tickWatchman.tick({ action, target: 'conversations' });\n };\n\n useEffect(() => {\n (async () => {\n if (!agentChatID || !formQuestions) {\n return;\n }\n const { chatHistory } = await api.getAIAgentChatMessages(formID, agentChatID);\n // TODO unfilteredQuestions\n setHistory(prepareAgentHistory({ chatHistory, questions: formQuestions }));\n })();\n }, [formID, agentChatID, formQuestions]);\n\n if (submissionCount === 0) {\n return (\n \n \n {t('YOU DON’T HAVE ANY CONVERSATIONS HERE')}\n {t('The conversations will be listed here.')}\n \n );\n }\n\n if (!submission) {\n return (\n \n
\n \n );\n }\n\n return (\n <>\n
\n {/* TODO: hasFeedbackPermission and shouldShowFeedback needs to change before the release */}\n \n
\n {showSubmission && formQuestions && hasAnswer && (\n \n )}\n \n );\n};\n\nexport default ConversationView;\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { Submission } from '@jotforminc/types';\nimport { Query } from '@jotforminc/submission-engine';\nimport { ConversationsViewsUIState, Status } from '../types/redux';\n\nexport type SetViewSubmissionIDsPayload = PayloadAction<{\n viewID: string|number,\n submissionIDs: Submission['id'][]\n}>;\n\nexport type SetViewCurrentSubmissionIndexPayload = PayloadAction<{\n viewID: string|number,\n index: number\n}>;\n\nexport type ToggleShowSubmissionPayloadPayload = PayloadAction<{\n value: boolean\n}>;\n\nexport type FilterSubmissionsRequestPayload = PayloadAction<{\n viewID: string|number,\n filter: Query['filter']\n}>;\n\nexport type SetViewFilteredSubmissionIDsPayload = PayloadAction<{\n viewID: string|number,\n filteredSubmissionIDs: Submission['id'][]\n}>;\n\nexport type SetViewsSelectedConversationsPayload = PayloadAction<{\n viewID: string|number,\n selectedConversations: Submission['id'][]\n}>;\n\nconst initialState: ConversationsViewsUIState = {\n status: Status.INITIAL,\n showSubmission: false,\n views: {}\n};\n\nconst slice = createSlice({\n name: '@conversations/viewsUI',\n initialState,\n reducers: {\n conversationsFetchRequest: state => {\n state.status = Status.LOADING;\n return state;\n },\n conversationsFetchSuccess: state => {\n state.status = Status.LOADED;\n return state;\n },\n conversationsFetchFailure: state => {\n state.status = Status.ERROR;\n return state;\n },\n setViewCurrentSubmissionIndex: (state, { payload: { viewID, index } }: SetViewCurrentSubmissionIndexPayload) => {\n if (state.views[viewID]) {\n state.views[viewID].currentSubmissionIndex = index;\n }\n\n return state;\n },\n setViewSubmissionIDs: (state, { payload: { viewID, submissionIDs } }: SetViewSubmissionIDsPayload) => {\n if (!state.views[viewID]) {\n state.views[viewID] = {\n status: Status.LOADED,\n currentSubmissionIndex: 0,\n submissionIDs,\n filteredSubmissionIDs: [],\n selectedConversations: []\n };\n }\n\n return state;\n },\n filterSubmissionsRequest: (state, { payload: { viewID } }: FilterSubmissionsRequestPayload) => {\n state.views[viewID].status = Status.LOADING;\n\n return state;\n },\n setViewFilteredSubmissionIDs: (state, { payload: { viewID, filteredSubmissionIDs } }: SetViewFilteredSubmissionIDsPayload) => {\n state.views[viewID].status = Status.LOADED;\n state.views[viewID].filteredSubmissionIDs = filteredSubmissionIDs;\n\n return state;\n },\n toggleShowSubmission: (state, { payload: { value } }: ToggleShowSubmissionPayloadPayload) => {\n state.showSubmission = value;\n return state;\n },\n setViewsSelectedConversations: (state, { payload: { viewID, selectedConversations } }: SetViewsSelectedConversationsPayload) => {\n if (state.views[viewID]) {\n state.views[viewID].selectedConversations = selectedConversations;\n }\n\n return state;\n }\n }\n});\n\nexport const {\n conversationsFetchRequest,\n conversationsFetchSuccess,\n conversationsFetchFailure,\n toggleShowSubmission,\n setViewSubmissionIDs,\n setViewCurrentSubmissionIndex,\n setViewFilteredSubmissionIDs,\n filterSubmissionsRequest,\n setViewsSelectedConversations\n} = slice.actions;\n\nexport default slice.reducer;\n","import React from 'react';\nimport { Flex } from '@jotforminc/magnet';\n\ntype ConversationItemSkeletonProps = {\n style: React.CSSProperties,\n};\n\nconst ConversationItemSkeleton: React.FC = ({\n style\n}) => {\n return (\n \n \n
\n
\n \n
\n );\n};\n\nexport default ConversationItemSkeleton;\n","import { Submission } from '@jotforminc/types';\n\n/**\n * Retrieves the first valid answer from the provided answer object.\n * If no valid answer is found, returns `false`.\n *\n * @param answerObj - An object containing answers from the submission.\n * @returns The first valid answer as a string, or `false` if none exists.\n */\nexport const getAnswerString = (answerObj: Submission['answers']): string | boolean => {\n if (!answerObj) {\n return false;\n }\n\n if (answerObj.prettyFormat) {\n return answerObj.prettyFormat;\n }\n\n if (typeof answerObj.answer === 'string') {\n return answerObj.answer;\n }\n\n if (answerObj.type === 'control_fullname') {\n return `${answerObj.answer.first} ${answerObj.answer.last}`;\n }\n\n if (answerObj.aiAgentChatFirstMessage) {\n return answerObj.aiAgentChatFirstMessage;\n }\n\n return false;\n};\n","import {\n format,\n differenceInMinutes,\n differenceInHours,\n differenceInDays\n} from 'date-fns';\n\nconst formatDate = (dateString: string, dateFormat: string): { date: string; fullDate: string } => {\n const dateObject = new Date(dateString);\n const currentDate = new Date();\n\n const diffInMinutes = differenceInMinutes(currentDate, dateObject);\n const diffInHours = differenceInHours(currentDate, dateObject);\n const diffInDays = differenceInDays(currentDate, dateObject);\n\n let formattedDate: string;\n\n if (diffInMinutes < 1) {\n formattedDate = 'Now';\n } else if (diffInMinutes < 60) {\n formattedDate = `${diffInMinutes}m`;\n } else if (diffInHours < 24) {\n formattedDate = `${diffInHours}h`;\n } else if (diffInDays < 7) {\n formattedDate = `${diffInDays}d`;\n } else if (currentDate.getFullYear() !== dateObject.getFullYear()) {\n formattedDate = format(dateObject, 'MMM d, yyyy');\n } else {\n formattedDate = format(dateObject, 'MMM d');\n }\n\n const fullDate = format(dateObject, dateFormat);\n\n return {\n date: formattedDate,\n fullDate: fullDate\n };\n};\n\nexport default formatDate;\n","import React from 'react';\nimport formatDate from '../../utils/formatDate';\n\ntype ConversationDateProps = {\n date: string,\n // eslint-disable-next-line react/require-default-props\n dateFormat?: string\n}\n\nconst ConversationDate: React.FC = ({ date, dateFormat = 'MMM d, yyyy h:mm a' }) => {\n const formattedDate = formatDate(date, dateFormat);\n if (!formattedDate || !formattedDate.date) {\n return null;\n }\n\n return (\n
\n {formattedDate.date}\n
\n {formattedDate.fullDate}\n
\n
\n );\n};\n\nexport default ConversationDate;\n","import type { Submission } from '@jotforminc/types';\nimport clsx from 'clsx';\nimport React from 'react';\nimport { Checkbox, Flex } from '@jotforminc/magnet';\nimport {\n IconProductFormBuilderColorBorder,\n IconStarFilled\n} from '@jotforminc/svg-icons';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { Selectors } from '@jotforminc/sheets-core';\nimport IncompleteSubmission from '../../assets/incomplete-submission.svg';\nimport { useGetSubmissionByIndex } from '../../contexts/SubmissionEngineContext/hooks';\nimport {\n getActiveViewCurrentSubmissionIndex,\n getActiveViewSelectedConversations,\n getFormById,\n getIsConversationSelected\n} from '../../selectors';\nimport { setViewCurrentSubmissionIndex, setViewsSelectedConversations } from '../../slices/conversationsViewsUI';\nimport ConversationItemSkeleton from './ConversationItemSkeleton';\nimport { getAnswerString } from '../../utils/getFirstAnswer';\nimport ConversationDate from './ConversationDate';\n\ntype ConversationItemProps = {\n index: number,\n style: React.CSSProperties,\n data: {\n formID: Submission['form_id']\n }\n};\n\nconst ConversationItem: React.FC = ({\n index,\n style,\n data: {\n formID\n }\n}) => {\n const dispatch = useDispatch();\n const viewID = useSelector(Selectors.getActiveViewID);\n const currentIndex = useSelector(getActiveViewCurrentSubmissionIndex);\n const submission = useGetSubmissionByIndex(formID, index);\n const form = useSelector(state => getFormById(state, submission?.form_id));\n const isSelectedConversation = useSelector(state => getIsConversationSelected(state, submission));\n const selectedConversations = useSelector(getActiveViewSelectedConversations);\n\n const isActive = currentIndex === index;\n\n if (!submission) {\n return (\n \n );\n }\n\n const handleToggleSubmissionSelection = (e: React.MouseEvent | React.ChangeEvent) => {\n e.stopPropagation();\n let preparedSelectedConversations = selectedConversations;\n if (isSelectedConversation) {\n preparedSelectedConversations = selectedConversations.filter(s => s !== submission.id);\n } else {\n preparedSelectedConversations = [...new Set([...selectedConversations, submission.id])];\n }\n\n dispatch(setViewsSelectedConversations({ viewID, selectedConversations: preparedSelectedConversations }));\n };\n\n const getPrimaryConversationTitle = () => {\n const { answers } = submission;\n const answerObj = Object.values(answers)?.find((a: Submission['answers']) => {\n const { answer = false } = a;\n if (!answer || answer?.length === 0) {\n return false;\n }\n\n return true;\n });\n\n let answer = getAnswerString(answerObj);\n\n if (!answer && submission?.aiAgentChatFirstMessage) {\n return submission?.aiAgentChatFirstMessage;\n }\n\n if (!answer) {\n answer = `Submission ${index}`;\n }\n\n return answer;\n };\n\n const getSecondaryConversationTitle = () => {\n const { answers } = submission;\n const answerObj = Object.values(answers)?.find((a: Submission['answers']) => {\n const { answer, type } = a;\n if (type === 'control_email' && typeof answer === 'string') {\n return true;\n }\n\n return false;\n });\n\n const answer = getAnswerString(answerObj);\n\n if (!answer) {\n return null;\n }\n\n return answer;\n };\n\n const title = getPrimaryConversationTitle();\n const subtitle = getSecondaryConversationTitle();\n const isDraftless = submission?.aiDraftlessSubmission;\n const isSubmission = !submission?.aiIncompleteSubmission;\n\n return (\n dispatch(setViewCurrentSubmissionIndex({ viewID, index }))}\n data-id={submission.id}\n >\n \n \n \n
\n \n \n {title}\n \n \n {subtitle}\n \n \n {!isDraftless && (\n isSubmission ? (\n \n \n {form?.title ?? 'Submission'}\n \n \n ) : (\n \n \n {form?.title ?? 'Submission'}\n \n \n )\n )}\n \n \n \n \n \n \n \n
\n );\n};\n\nexport default ConversationItem;\n","import { useState, useEffect } from 'react';\n\ntype UseWindowEvent = (\n eventType: T,\n handler: (event?: WindowEventMap[T]) => V,\n) => V;\n\nconst useWindowEvent: UseWindowEvent = (eventType, handler) => {\n const [result, setResult] = useState(handler);\n\n useEffect(() => {\n const onResize = (e: Parameters[0]) => {\n setResult(handler(e));\n };\n\n window.addEventListener(eventType, onResize);\n\n return () => {\n window.removeEventListener(eventType, onResize);\n };\n }, [eventType, handler]);\n\n return result;\n};\n\nexport default useWindowEvent;\n","import React, { useMemo } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { Checkbox, Flex } from '@jotforminc/magnet';\nimport { Selectors } from '@jotforminc/sheets-core';\nimport {\n getActiveViewCurrentSubmissionIndex,\n getActiveViewFilteredSubmissionCount,\n getActiveViewFilteredSubmissionIds,\n getActiveViewSelectedConversationsCount\n} from '../../selectors';\nimport { setViewsSelectedConversations } from '../../slices/conversationsViewsUI';\n\nconst ConversationListHeader: React.FC = () => {\n const dispatch = useDispatch();\n const viewID = useSelector(Selectors.getActiveViewID);\n const activeSubmissionIndex = useSelector(getActiveViewCurrentSubmissionIndex);\n const filteredSubmissionCount = useSelector(getActiveViewFilteredSubmissionCount);\n const filteredSubmissionIds = useSelector(getActiveViewFilteredSubmissionIds);\n const selectedConversationCount = useSelector(getActiveViewSelectedConversationsCount);\n const isAllSelected = filteredSubmissionCount === selectedConversationCount;\n\n const handleSelectAllConversations = () => {\n if (isAllSelected) {\n dispatch(setViewsSelectedConversations({ viewID, selectedConversations: [] }));\n } else {\n dispatch(setViewsSelectedConversations({ viewID, selectedConversations: filteredSubmissionIds }));\n }\n };\n\n const informationText = useMemo(() => {\n if (selectedConversationCount > 0) {\n return (\n <>\n {selectedConversationCount}\n {' '}\n of\n {' '}\n {filteredSubmissionCount}\n {' '}\n conversations\n {selectedConversationCount > 1 ? ' are ' : ' is '}\n selected\n \n );\n }\n\n return (\n <>\n {activeSubmissionIndex + 1}\n {' '}\n of\n {' '}\n {filteredSubmissionCount}\n {' '}\n conversations\n \n );\n }, [selectedConversationCount, activeSubmissionIndex, filteredSubmissionCount]);\n\n return (\n \n
\n 0 && selectedConversationCount < filteredSubmissionCount}\n role=\"checkbox\"\n />\n
\n
\n {informationText}\n
\n
\n );\n};\n\nexport default ConversationListHeader;\n","import React, { useMemo } from 'react';\nimport { FixedSizeList as List } from 'react-window';\nimport type { Submission } from '@jotforminc/types';\n\nimport { useSelector } from 'react-redux';\nimport { IconInfoCircleFilled } from '@jotforminc/svg-icons';\nimport { t } from '@jotforminc/translation';\nimport ConversationItem from './ConversationItem';\nimport useWindowEvent from '../../hooks/useWindowEvent';\nimport { getActiveViewFilteredSubmissionCount, getActiveViewSubmissionStatus, getConversationsStatus } from '../../selectors';\nimport { Status } from '../../types/redux';\nimport ConversationItemSkeleton from './ConversationItemSkeleton';\nimport ConversationListHeader from './ConversationListHeader';\n\nconst getListHeight = () => window.innerHeight - 70;\n\ntype ConversationListProps = {\n formID: Submission['form_id'],\n};\n\nconst ConversationList: React.FC = ({\n formID\n}) => {\n const itemCount = useSelector(getActiveViewFilteredSubmissionCount);\n const generalStatus = useSelector(getActiveViewSubmissionStatus); // TODO this might return calculated status\n const viewStatus = useSelector(getConversationsStatus);\n const listHeight = useWindowEvent('resize', getListHeight);\n\n const itemData = useMemo(\n () => ({ formID }),\n [formID]\n );\n\n if (generalStatus === Status.INITIAL || generalStatus === Status.LOADING || viewStatus === Status.LOADING || viewStatus === Status.INITIAL) {\n return (\n \n {ConversationItemSkeleton}\n \n );\n }\n\n if (generalStatus === Status.ERROR || viewStatus === Status.ERROR) {\n return (\n <>\n );\n }\n\n if (itemCount === 0) {\n return (\n
\n \n {t('The conversations will be listed here.')}\n
\n );\n }\n\n return (\n <>\n \n \n {ConversationItem}\n \n \n );\n};\n\nexport default ConversationList;\n","import React from 'react';\nimport {\n bool,\n string\n} from 'prop-types';\nimport { IconEyeFilled } from '@jotforminc/svg-icons';\nimport classNames from 'classnames';\nimport '../../styles/_previewToggle.scss';\n\nconst PreviewToggle = ({\n checked = false,\n colorStyle = 'green',\n disabled = false,\n hideOnMobile = false,\n label = 'Preview',\n loading = false,\n previewToggleId = 'previewSwitch',\n ...rest\n}) => {\n return (\n <>\n \n \n \n \n {label}\n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nPreviewToggle.propTypes = {\n checked: bool,\n colorStyle: string,\n disabled: bool,\n hideOnMobile: bool,\n label: string,\n loading: bool,\n previewToggleId: string\n};\n\nexport default PreviewToggle;\n","/* eslint-disable react/static-property-placement */\nimport React, { Component, ComponentType } from 'react';\n\nfunction getDisplayName

(WrappedComponent: ComponentType

) {\n return WrappedComponent.displayName || WrappedComponent.name || 'Component';\n}\n\nconst exceptions = [\n '.jSheetContextMenu',\n '.jSheetContextMenu-subContainer',\n '.editWrapper',\n '.tether-element',\n '.forPrintModal',\n '.jfSelect-wrapper',\n '.jSheetEditPortal',\n '.jSheetEditor-wrapper',\n '[data-uikit-modal-wrapper=true]',\n '.header-comment-button',\n '.jSheetABEditor',\n '.suggestion-list',\n '.drawer-wrapper',\n '.cardSettings',\n '.jSheetRowSettings',\n '.chartSettings',\n '.jfContextMenu',\n '[data-magnet-dialog]'\n];\n\ntype WithClickOutsideProps = {\n onClickOutside: (event: MouseEvent) => void,\n withClickOutsideWrapperClass?: string,\n WCOinitOnMount?: boolean,\n WCOisActive?: boolean,\n exceptionalClasses?: string|string[],\n childRef?: any\n};\n\nexport function withClickOutside

(WrappedComponent: ComponentType

): ComponentType

{\n class WithClickOutside extends Component

{\n wrapper: HTMLDivElement|null = null;\n\n static defaultProps = {\n WCOinitOnMount: true,\n WCOisActive: true,\n withClickOutsideWrapperClass: null,\n exceptionalClasses: null,\n childRef: null\n } as P & WithClickOutsideProps;\n\n static displayName = `inlineEdit(${getDisplayName(WrappedComponent)})`;\n\n constructor(props: P & WithClickOutsideProps) {\n super(props);\n\n this.handleClickOutside = this.handleClickOutside.bind(this);\n }\n\n componentDidMount() {\n const { WCOinitOnMount } = this.props;\n if (WCOinitOnMount) {\n window.addEventListener('mousedown', this.handleClickOutside, true);\n }\n }\n\n componentWillUnmount() {\n const { WCOinitOnMount, WCOisActive } = this.props;\n if (WCOinitOnMount || WCOisActive) {\n window.removeEventListener('mousedown', this.handleClickOutside, true);\n }\n }\n\n componentDidUpdate(prevProps: P & WithClickOutsideProps) {\n const { WCOinitOnMount, WCOisActive } = this.props;\n const { WCOisActive: prevIsActive } = prevProps;\n if (!WCOinitOnMount) {\n if (!prevIsActive && WCOisActive) {\n window.addEventListener('mousedown', this.handleClickOutside, true);\n }\n if (prevIsActive && !WCOisActive) {\n window.removeEventListener('mousedown', this.handleClickOutside, true);\n }\n }\n }\n\n handleClickOutside(event: MouseEvent) {\n const { exceptionalClasses, onClickOutside } = this.props;\n const target = event.target as HTMLElement;\n const { classList } = target;\n\n if (target && this.wrapper?.contains(target as Node)) {\n return;\n }\n\n if (\n exceptionalClasses\n && (\n classList.contains(exceptionalClasses as string)\n || [...classList].some(xClass => exceptionalClasses.includes(xClass))\n || (exceptionalClasses as string[]).some(item => target.closest(`.${item}`))\n )\n ) {\n return;\n }\n\n const exceptionFound = exceptions.some(value => {\n return !!target.closest(value);\n });\n if (exceptionFound) {\n return;\n }\n\n const openPreview = document.querySelector('#preview-content');\n if (openPreview && openPreview.childElementCount > 0) {\n return;\n }\n\n const datePicker = document.querySelector('.react-datepicker');\n if (datePicker) return;\n\n onClickOutside(event);\n }\n\n render() {\n const {\n onClickOutside: _onClickOutside,\n WCOinitOnMount: _WCOinitOnMount,\n WCOisActive: _WCOisActive,\n exceptionalClasses: _exceptionalClasses,\n withClickOutsideWrapperClass,\n childRef,\n ...props\n } = this.props;\n\n return (\n

{ this.wrapper = wrapper; }}>\n \n
\n );\n }\n }\n\n return WithClickOutside;\n}\n","import { IconLoading, IconMagnifyingGlass, IconXmark } from '@jotforminc/svg-icons';\nimport React, {\n useEffect, useMemo, useRef, useState\n} from 'react';\nimport { FilterButton, SearchFilter } from '@jotforminc/search-filter';\nimport { t } from '@jotforminc/translation';\nimport clsx from 'clsx';\nimport { useDispatch, useSelector } from 'react-redux';\nimport {\n Selectors,\n TickConfig,\n tickWatchman,\n withClickOutside\n} from '@jotforminc/sheets-core';\nimport { produce } from 'immer';\nimport { Query } from '@jotforminc/submission-engine';\nimport { Question } from '@jotforminc/types';\nimport { getActiveViewSubmissionStatus, getConversationsStatus } from '../../selectors';\nimport { Status } from '../../types/redux';\nimport { filterSubmissionsRequest } from '../../slices/conversationsViewsUI';\n\n// TODO handle questions properly\nconst QUESTIONS: Record = {\n created_at: {\n qid: 'created_at',\n name: 'Submission Date',\n text: 'Submission Date',\n type: 'control_submissionDate',\n order: '2'\n },\n updated_at: {\n qid: 'updated_at',\n name: 'Last Update Date',\n text: 'Last Update Date',\n type: 'control_submissionDate',\n order: '3'\n\n },\n id: {\n qid: 'id',\n name: 'Submission ID',\n text: 'Submission ID',\n type: 'control_submissionID',\n order: '4'\n }\n};\n\nconst SearchFilterClickOutside = withClickOutside(SearchFilter);\n\nconst SearchBar: React.FC = () => {\n const dispatch = useDispatch();\n\n const activeViewID = useSelector(Selectors.getActiveViewID);\n const generalStatus = useSelector(getConversationsStatus);\n const viewStatus = useSelector(getActiveViewSubmissionStatus);\n\n const [isFilterMenuOpened, setIsFilterMenuOpened] = useState(false);\n const [filters, setFilter] = useState>({});\n\n const searchInputRef = useRef(null);\n\n const isViewLoaded = generalStatus === Status.LOADED && viewStatus !== Status.INITIAL;\n const searchBarLoading = viewStatus === Status.LOADING;\n\n const filtersWithoutFulltext = useMemo(() => produce(filters, draft => {\n delete draft.fullText;\n }), [filters]);\n\n const handleFullTextChange: React.ChangeEventHandler = e => {\n e.persist();\n setFilter(produce(draft => {\n draft.fullText = e.target.value;\n if (!draft.fullText) {\n delete draft.fullText;\n }\n\n return draft;\n }));\n };\n\n const handleSearchKeyUp: React.KeyboardEventHandler = e => {\n const { key } = e;\n if (key === 'Enter') {\n searchInputRef.current?.blur();\n }\n };\n\n const handleClearSearchText = () => {\n setFilter(produce(draft => {\n delete draft.fullText;\n }));\n searchInputRef.current?.focus();\n };\n\n const handleFilterButtonClick = () => {\n if (!isViewLoaded) {\n return;\n }\n\n setIsFilterMenuOpened(true);\n };\n\n const handleDeleteFilter = (e: Event) => {\n e.stopPropagation();\n\n setFilter(prev => {\n if ('fullText' in prev) {\n return { fullText: prev.fullText };\n }\n\n return {} as typeof prev;\n });\n };\n\n const handleDeleteFilterSingle = (key: string) => {\n setFilter(produce(draft => {\n delete draft[key];\n\n if (draft.timeFilterText === 'All time' && Object.keys(draft).length === 1) {\n delete draft.timeFilterText;\n }\n }));\n };\n\n const handleCloseFilter = () => {\n setIsFilterMenuOpened(false);\n };\n\n const handleSaveFilter = ({ filters: newFilters }: { filters: NonNullable}) => {\n setFilter(prev => {\n if ('fullText' in prev) {\n return { ...newFilters, fullText: prev.fullText };\n }\n\n if (newFilters.timeFilterText === 'All time' && Object.keys(newFilters).length === 1) {\n return {};\n }\n\n return { ...newFilters } as typeof prev;\n });\n };\n\n const recordWatchmanEvent = (event: TickConfig) => {\n tickWatchman.tick(event);\n };\n\n // useEffect(() => {\n // setFilter({});\n // }, [activeViewID]);\n\n useEffect(() => {\n if (\n !activeViewID || !isViewLoaded\n ) {\n return;\n }\n\n dispatch(filterSubmissionsRequest({ viewID: activeViewID, filter: filters }));\n }, [filters, activeViewID, isViewLoaded, dispatch]);\n\n return (\n \n
\n
\n
\n
\n \n \n \n {searchBarLoading\n ? ()\n : ()}\n \n
\n \n
\n {isFilterMenuOpened && (\n
\n \n
\n )}\n
\n
\n \n );\n};\n\nexport default SearchBar;\n","import React from 'react';\nimport { PreviewToggle } from '@jotforminc/header-components';\nimport { Button, Flex } from '@jotforminc/magnet';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { IconEllipsisVertical } from '@jotforminc/svg-icons';\nimport { t } from '@jotforminc/translation';\nimport { Selectors, tickWatchman } from '@jotforminc/sheets-core';\nimport { getActiveViewCurrentSubmissionIndex, getConversationsShowSubmission, getQuestionsById } from '../../selectors';\nimport { toggleShowSubmission } from '../../slices/conversationsViewsUI';\nimport SearchBar from './SearchBar';\n\nimport { useGetSubmissionByIndex } from '../../contexts/SubmissionEngineContext/hooks';\nimport { hasAnyAnswer } from '../../utils/hasAnyAnswer';\n\nconst HeaderActions: React.FC = () => {\n const dispatch = useDispatch();\n const showSubmission = useSelector(getConversationsShowSubmission);\n const submissionIndex = useSelector(getActiveViewCurrentSubmissionIndex);\n const resourceId = useSelector(Selectors.getFormID);\n const submission = useGetSubmissionByIndex(resourceId, submissionIndex);\n const isSubmission = !submission?.aiDraftlessSubmission;\n const formQuestions = useSelector(state => getQuestionsById(state, submission?.form_id));\n const hasAnswer = hasAnyAnswer(submission?.answers, formQuestions);\n const isMoreMenuVisible = false;\n\n const handleViewSubmission = (e: React.MouseEvent) => {\n e.preventDefault();\n dispatch(toggleShowSubmission({\n value: !showSubmission\n }));\n tickWatchman.tick({ action: showSubmission ? 'viewSubmissionOff' : 'viewSubmissionOn' });\n };\n\n return (\n \n \n \n {hasAnswer && isSubmission && (\n \n \n \n )}\n {isMoreMenuVisible && (\n \n )}\n \n \n );\n};\n\nexport default HeaderActions;\n","import React, { useEffect } from 'react';\nimport { Flex, FlexItem } from '@jotforminc/magnet';\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport { Actions, Selectors } from '@jotforminc/sheets-core';\nimport ConversationView from './ConversationView';\nimport ConversationList from './ConversationList';\nimport HeaderActions from './Header/HeaderActions';\nimport api from '../utils/api';\nimport toJS from '../utils/toJS';\n\nconst ConversationAppContainer: React.FC = () => {\n const dispatch = useDispatch();\n const sheetID = useSelector(Selectors.getFormID);\n\n api.sheetID = sheetID;\n\n useEffect(() => {\n dispatch(Actions.initGenericApp());\n }, [dispatch]);\n\n return (\n <>\n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default toJS(ConversationAppContainer);\n","/* eslint-disable no-param-reassign */\n/* eslint-disable arrow-parens */\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n/* eslint-disable @typescript-eslint/ban-ts-comment */\n// @ts-nocheck\nimport React from 'react';\nimport { Iterable } from 'immutable';\n\nexport default (WrappedComponent) => (wrappedComponentProps): React.JSX.Element => {\n const KEY = 0;\n const VALUE = 1;\n const propsJS = Object.entries(wrappedComponentProps).reduce(\n (accum, wrappedComponentProp) => {\n accum[wrappedComponentProp[KEY]] = Iterable.isIterable(\n wrappedComponentProp[VALUE]\n )\n ? wrappedComponentProp[VALUE].toJS()\n : wrappedComponentProp[VALUE];\n return accum;\n },\n {}\n );\n return ;\n};\n","import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState\n} from 'react';\nimport type { Submission } from '@jotforminc/types';\n\nimport { getSubmissionEngine } from './instance';\nimport { SubmissionEngineContext, SubmissionEngineContextValue } from './context';\n\nconst SubmissionEngineContextProvider: React.FC = ({ children = null }) => {\n const engine = getSubmissionEngine();\n\n const [cache, setCache] = useState(new Map());\n const [triggerReload, setTriggerReload] = useState(0);\n const cachedSubmissionsList = useRef([]);\n\n const invalidateCache = useCallback(\n event => {\n cache.delete(`${event.detail.documentID}-${event.detail.recordID}`);\n },\n [cache]\n );\n\n useEffect(() => {\n // rootSagaTask.setContext({\n // SubmissionEngine: engine,\n // });\n\n if (engine) {\n engine.subscribe('submission-insert', '*', '*', invalidateCache);\n engine.subscribe('submission-update', '*', '*', invalidateCache);\n engine.subscribe('submission-delete', '*', '*', invalidateCache);\n }\n\n return () => {\n if (engine) {\n engine.unsubscribe('submission-insert', '*', '*', invalidateCache);\n engine.unsubscribe('submission-update', '*', '*', invalidateCache);\n engine.unsubscribe('submission-delete', '*', '*', invalidateCache);\n }\n };\n }, [engine, invalidateCache]);\n\n const getSubmissionByIDCached = useCallback((formID, submissionID) => {\n const cacheKey = `${formID}-${submissionID}`;\n\n return cache.get(cacheKey);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [cache, triggerReload]);\n\n const cacheSubmissions = useCallback(async (formID, submissionIDs) => {\n if (!engine) {\n return;\n }\n\n if (\n cachedSubmissionsList.current.length === submissionIDs.length\n && cachedSubmissionsList.current.every((v1, i1) => v1 === submissionIDs[i1])\n ) {\n return;\n }\n\n cachedSubmissionsList.current = submissionIDs;\n\n const doc = await engine.getDocument(formID);\n\n if (!doc) {\n return;\n }\n\n const queryResult = await doc.query({ filter: { 'id:in': submissionIDs }, orderby: 'created_at,desc', limit: -1 });\n if (queryResult.type === 'success') {\n const newCache = new Map();\n (queryResult.content.submissions as Submission[]).forEach(submission => {\n newCache.set(`${formID}-${submission.id}`, submission);\n });\n setCache(newCache);\n } else {\n console.log(queryResult);\n }\n\n setTriggerReload(x => x + 1);\n }, [engine, setCache]);\n\n const value: SubmissionEngineContextValue = useMemo(() => {\n return {\n engine,\n getSubmissionByIDCached,\n cacheSubmissions\n };\n }, [engine, getSubmissionByIDCached, cacheSubmissions]);\n\n return (\n \n {children}\n \n );\n};\n\nexport default SubmissionEngineContextProvider;\n","import React from 'react';\n\nimport ConversationApp from '../components/ConversationApp';\nimport SubmissionEngineContextProvider from '../contexts/SubmissionEngineContext/contextProvider';\nimport '../styles/_aiconversation.scss';\n\nconst ConversationAppContainer: React.FC = () => {\n return (\n \n \n \n );\n};\n\nexport default ConversationAppContainer;\n","import React from 'react';\n\nconst HeaderTitleRenderer: React.FC<{ title: string }> = ({ title }) => {\n return (\n
{title}
\n );\n};\n\nexport default HeaderTitleRenderer;\n","import {\n takeEvery, put, select, SagaReturnType\n} from 'redux-saga/effects';\nimport { ActionTypes, Selectors } from '@jotforminc/sheets-core';\nimport Tracking from '@jotforminc/tracking';\nimport { conversationsFetchRequest } from '../slices/conversationsViewsUI';\n\nfunction* setupFullStory() {\n const accountType: SagaReturnType = yield select(Selectors.getAccountType);\n\n if (accountType === 'ADMIN') {\n return;\n }\n\n const username: SagaReturnType = yield select(Selectors.getUsername);\n const fsVars = {\n conversationsApp_bool: true\n };\n\n if (username && !Tracking.FSisInitialized()) {\n Tracking.enableFS(fsVars);\n Tracking.identify(username || '', {\n displayName: username || '',\n ...fsVars\n });\n } else {\n Tracking.setUserVars(fsVars);\n }\n}\n\nfunction* initConversationsApp() {\n yield setupFullStory();\n yield put(conversationsFetchRequest());\n}\n\nexport default [\n takeEvery(ActionTypes.INIT_GENERIC_APP_SUCCESS, initConversationsApp)\n];\n","import { FullTextMetaColumns } from '../types';\n\nexport const DEFAULT_FULLTEXT_META_COLUMNS = ['id', 'ip', 'created_at', 'notes', 'updated_at'] as Readonly;\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { Form } from '@jotforminc/types';\nimport { ConversationsFormState, Status } from '../types/redux';\n\nexport type FormsFetchRequestPayload = PayloadAction<{\n formID: Form['id'];\n}>;\n\nexport type FormsFetchSuccessPayload = PayloadAction<{\n formID: Form['id'];\n forms: Record;\n}>;\n\nexport type FormsFetchFailurePayload = PayloadAction<{\n formID: Form['id'];\n}>;\n\nconst initialState: ConversationsFormState = {\n status: Status.INITIAL,\n forms: null,\n formID: undefined\n};\n\nconst slice = createSlice({\n name: '@conversations/forms',\n initialState,\n reducers: {\n fetchFormRequest: (state, { payload: { formID } }: FormsFetchRequestPayload) => {\n state = {\n status: Status.LOADING,\n formID,\n forms: null\n };\n\n return state;\n },\n fetchFormSuccess: (state, { payload: { forms } }: FormsFetchSuccessPayload) => {\n state = {\n status: Status.LOADED,\n forms\n };\n\n return state;\n },\n fetchFormFailure: (state, { payload: { formID } }: FormsFetchFailurePayload) => {\n state = {\n status: Status.ERROR,\n formID,\n forms: null\n };\n\n return state;\n }\n }\n});\n\nexport const {\n fetchFormRequest,\n fetchFormSuccess,\n fetchFormFailure\n} = slice.actions;\n\nexport default slice.reducer;\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { Form, Question } from '@jotforminc/types';\nimport { ConversationsQuestionsState, Status } from '../types/redux';\n\nexport type QuestionsFetchRequestPayload = PayloadAction<{\n formID: Form['id'];\n}>;\n\nexport type QuestionsFetchSuccessPayload = PayloadAction<{\n formID: Form['id'];\n questions: Record>;\n}>;\n\nexport type QuestionsFetchFailurePayload = PayloadAction<{\n formID: Form['id'];\n}>;\n\nconst initialState: ConversationsQuestionsState = {\n status: Status.INITIAL,\n questions: null,\n formID: undefined\n};\n\nconst slice = createSlice({\n name: '@conversations/questions',\n initialState,\n reducers: {\n fetchQuestionRequest: (state, { payload: { formID } }: QuestionsFetchRequestPayload) => {\n state = {\n status: Status.LOADING,\n formID,\n questions: null\n };\n\n return state;\n },\n fetchQuestionSuccess: (state, { payload: { questions } }: QuestionsFetchSuccessPayload) => {\n state = {\n status: Status.LOADED,\n questions\n };\n\n return state;\n },\n fetchQuestionFailure: (state, { payload: { formID } }: QuestionsFetchFailurePayload) => {\n state = {\n status: Status.ERROR,\n formID,\n questions: null\n };\n\n return state;\n }\n }\n});\n\nexport const {\n fetchQuestionRequest,\n fetchQuestionSuccess,\n fetchQuestionFailure\n} = slice.actions;\n\nexport default slice.reducer;\n","import {\n put,\n call,\n select,\n SagaReturnType,\n takeLatest,\n takeEvery,\n all,\n debounce\n} from 'redux-saga/effects';\nimport { Form, Question, Submission } from '@jotforminc/types';\nimport { Actions, Selectors, tickWatchman } from '@jotforminc/sheets-core';\nimport { Query, DEFAULT_FULLTEXT_META_COLUMNS } from '@jotforminc/submission-engine';\nimport { getUrlParameter } from '@jotforminc/utils';\nimport {\n conversationsFetchFailure,\n conversationsFetchSuccess,\n conversationsFetchRequest,\n setViewSubmissionIDs,\n filterSubmissionsRequest,\n FilterSubmissionsRequestPayload,\n setViewFilteredSubmissionIDs,\n setViewCurrentSubmissionIndex\n} from '../slices/conversationsViewsUI';\nimport {\n fetchFormFailure,\n fetchFormRequest,\n fetchFormSuccess,\n FormsFetchRequestPayload\n} from '../slices/conversationForms';\nimport {\n fetchQuestionFailure,\n fetchQuestionRequest,\n fetchQuestionSuccess,\n QuestionsFetchRequestPayload\n} from '../slices/conversationQuestions';\n\nimport api from '../utils/api';\nimport { getSubmissionEngine } from '../contexts/SubmissionEngineContext/instance';\nimport { getConversationsSubmissionsIDsByViewID } from '../selectors';\n\n// TODO check typed-redux-saga...\n\nfunction getFilterByView(view: Record): Query['filter'] {\n switch (view.subtype) {\n case 'inbox':\n return { 'status:ne': ['ARCHIVED', 'DELETED'] };\n case 'archive':\n return { 'status:eq': 'ARCHIVED' };\n case 'trash':\n return { 'status:eq': 'DELETED' };\n default:\n return {};\n }\n}\n\nfunction* setViewCurrentConversationByUrlParameter({ viewID }: { viewID: string }): Generator {\n try {\n if (!viewID) {\n return;\n }\n\n const conversationId = getUrlParameter('conversationID');\n if (!conversationId) {\n return;\n }\n\n const conversationIds = yield select(state => getConversationsSubmissionsIDsByViewID(state, viewID));\n let conversationIndex = 0;\n const conversation = conversationIds.find((id: Submission['id'], index: number) => {\n if (id === conversationId) {\n conversationIndex = index;\n return true;\n }\n return false;\n });\n\n if (!conversation) {\n return;\n }\n\n yield put(setViewCurrentSubmissionIndex({ viewID, index: conversationIndex }));\n } catch (error) {\n console.error(error);\n }\n}\n\nfunction* fetchConversations() {\n try {\n const formID: string = yield select(Selectors.getFormID);\n const { resourceID, resourceType }: SagaReturnType = yield select(Selectors.getSheetResource);\n\n const content: unknown = yield call(api.getConversations, resourceType.toLowerCase(), resourceID);\n if (!Array.isArray(content)) {\n throw content;\n }\n\n const engine = getSubmissionEngine();\n const doc: SagaReturnType = yield call(\n [engine, engine.createDocument],\n formID\n );\n const loadResult: SagaReturnType = yield call(\n [doc, doc.loadSubmissions],\n content as Submission[]\n );\n\n if (loadResult.type !== 'success') {\n throw loadResult;\n }\n\n yield put(conversationsFetchSuccess());\n yield put(fetchFormRequest({ formID }));\n yield put(fetchQuestionRequest({ formID }));\n } catch (e) {\n yield put(conversationsFetchFailure());\n console.log(e);\n }\n}\n\nfunction* getSubmissionIDs(filter: Query['filter']): Generator {\n const formID: SagaReturnType = yield select(Selectors.getFormID);\n const engine = getSubmissionEngine();\n\n const doc: SagaReturnType = yield call(\n [engine, engine.getDocument],\n formID\n );\n if (!doc) {\n throw new Error('doc not loaded!');\n }\n\n const submissionIDsResult: SagaReturnType = yield call(\n [doc, doc.query],\n {\n filter: { ...filter, onlyIDs: true },\n orderby: 'created_at,desc',\n limit: -1,\n options: {\n fullTextMetaColumns: [...DEFAULT_FULLTEXT_META_COLUMNS, 'aiAgentChatID']\n }\n }\n );\n if (submissionIDsResult.type !== 'success') {\n throw submissionIDsResult;\n }\n\n return submissionIDsResult.content.submissions as Submission['id'][];\n}\n\nfunction* loadSubmissionIDs() {\n try {\n const view: SagaReturnType = yield select(Selectors.getActiveView);\n const viewID = view.id as string;\n const filter = getFilterByView(view);\n\n const submissionIDs = yield* getSubmissionIDs(filter);\n yield put(setViewSubmissionIDs({ viewID, submissionIDs }));\n yield put(setViewFilteredSubmissionIDs({ viewID, filteredSubmissionIDs: submissionIDs }));\n yield call(setViewCurrentConversationByUrlParameter, { viewID });\n } catch (e) {\n console.log(e);\n }\n}\n\nfunction* loadForms({ payload }: FormsFetchRequestPayload) {\n const { formID } = payload;\n\n try {\n const engine = getSubmissionEngine();\n const doc: SagaReturnType = yield call(\n [engine, engine.getDocument],\n formID\n );\n\n if (!doc) {\n throw new Error('Unable to get document');\n }\n\n const loadResult: SagaReturnType = yield call(\n [doc, doc.values],\n 'form_id'\n );\n\n if (loadResult.type !== 'success') {\n throw loadResult;\n }\n\n const { content: formIds } = loadResult as { content: string[] };\n\n const formsById = Object.fromEntries(\n ((yield all(formIds.map((id: Form['id']) => call(function* () {\n try {\n if (id === '0' || id === 0) {\n throw new Error('draftless submission!');\n }\n const form: SagaReturnType = yield call(api.getForm, id);\n return [id, form];\n } catch (e) {\n return false;\n }\n })))) as [[Form['id'], Form] | false][]).filter(Boolean)\n );\n\n yield put(fetchFormSuccess({\n formID,\n forms: formsById\n }));\n } catch (e) {\n yield put(fetchFormFailure({ formID }));\n console.log(e);\n }\n}\n\nfunction* loadQuestions({ payload }: QuestionsFetchRequestPayload) {\n const { formID } = payload;\n\n try {\n const engine = getSubmissionEngine();\n const doc: SagaReturnType = yield call(\n [engine, engine.getDocument],\n formID\n );\n\n if (!doc) {\n throw new Error('Unable to get document');\n }\n\n const loadResult: SagaReturnType = yield call(\n [doc, doc.values],\n 'form_id' as string\n );\n\n if (loadResult.type !== 'success') {\n throw loadResult;\n }\n\n const { content: formIds } = loadResult as { content: string[] };\n\n const questionByFormId = Object.fromEntries(\n ((yield all(formIds.map((id: Form['id']) => call(function* () {\n try {\n if (id === '0') {\n throw new Error('draftless submission!');\n }\n const questions: SagaReturnType = yield call(api.getQuestions, id);\n return [id, questions];\n } catch (e) {\n return false;\n }\n })))) as [[Form['id'], Record] | false][]).filter(Boolean)\n );\n\n yield put(fetchQuestionSuccess({\n formID,\n questions: questionByFormId\n }));\n } catch (e) {\n yield put(fetchQuestionFailure({ formID }));\n console.log(e);\n }\n}\n\nfunction* filterSubmissions({ payload }: FilterSubmissionsRequestPayload) {\n try {\n const { viewID, filter } = payload;\n const view: SagaReturnType = yield select(Selectors.getViewByID, viewID);\n const viewFilter = getFilterByView(view);\n const combinedFilter = { ...viewFilter, ...filter };\n delete combinedFilter.timeFilterText;\n\n if ('fullText' in combinedFilter) {\n tickWatchman.tick({ action: 'fullTextSearch' });\n }\n\n const filteredSubmissionIDs = yield* getSubmissionIDs(combinedFilter);\n yield put(setViewFilteredSubmissionIDs({ viewID, filteredSubmissionIDs }));\n } catch (e) {\n console.log(e);\n }\n}\n\nexport default [\n takeLatest(conversationsFetchRequest.type, fetchConversations),\n takeLatest([Actions.setActiveViewID.type, conversationsFetchSuccess.type], loadSubmissionIDs),\n takeEvery(fetchFormRequest.type, loadForms),\n takeEvery(fetchQuestionRequest.type, loadQuestions),\n debounce(200, filterSubmissionsRequest.type, filterSubmissions)\n];\n","import { Effect, all } from 'redux-saga/effects';\n\nimport appSagas from './appSagas';\nimport conversationsSagas from './conversationsSagas';\n\nexport default function* rootSaga(): Generator {\n yield all([\n ...appSagas,\n ...conversationsSagas\n ]);\n}\n","import conversationsViewsUI from './conversationsViewsUI';\nimport conversationForms from './conversationForms';\nimport conversationQuestions from './conversationQuestions';\n\nexport default {\n conversationsViewsUI,\n conversationForms,\n conversationQuestions\n};\n","import DummyModal from '../components/DummyModal';\n\nconst modalsMap = {\n CONVERSATIONS_DUMMY_MODAL: DummyModal\n};\n\nexport default modalsMap;\n","import React from 'react';\nimport {\n Button,\n Modal,\n ModalActions,\n ModalBody,\n ModalHeader\n} from '@jotforminc/magnet';\nimport { useDispatch } from 'react-redux';\nimport { t } from '@jotforminc/translation';\n\nconst DummyModal = (): React.JSX.Element => {\n const dispatch = useDispatch();\n\n const onClose = () => {\n dispatch({\n type: 'UI_TOGGLE_MODAL',\n payload: {\n id: 'CONVERSATIONS_DUMMY_MODAL',\n value: false\n }\n });\n };\n\n return (\n \n \n \n CONVERSATIONS_DUMMY_MODAL\n \n \n \n {t('OK!')}\n \n \n \n );\n};\n\nexport default DummyModal;\n","import { Actions, Selectors } from '@jotforminc/sheets-core';\nimport { useMemo } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\n\ntype UseTabMenuSchema = () => Record; // TODO declare this type in context-menu/drawer libs\n\nconst useTabMenuSchema: UseTabMenuSchema = () => {\n const dispatch = useDispatch();\n const activeViewName = useSelector(Selectors.getActiveViewName);\n const activeViewID = useSelector(Selectors.getActiveViewID);\n\n return useMemo(() => {\n const closeTabMenu = () => {\n dispatch(Actions.toggleDropdown(`viewMenu_${activeViewID}`));\n };\n\n const onShowNotification = () => {\n dispatch(Actions.toggleNotification({\n isVisible: true,\n message: 'Hello from context menu!'\n }));\n closeTabMenu();\n };\n\n return {\n id: 'root',\n title: activeViewName,\n children: [\n {\n id: 'dummy',\n title: 'Show Notification',\n onClick: onShowNotification\n }\n ]\n };\n }, [activeViewName, activeViewID, dispatch]);\n};\n\nexport default useTabMenuSchema;\n","import { useMemo } from 'react';\nimport { produce } from 'immer';\nimport { useHelpMenuSchema as useGenericHelpMenuSchema } from '@jotforminc/sheets-core';\n\nconst useHelpMenuSchema: typeof useGenericHelpMenuSchema = ({ hasUnreadWhatsNew }) => {\n const defaultSchema = useGenericHelpMenuSchema({ hasUnreadWhatsNew });\n\n return useMemo(() => {\n return produce(defaultSchema, draft => {\n draft.children = (draft.children as {id: string}[]).filter(\n ({ id }) => ['whatsNew', 'giveFeedback', 'getProfessionalServices'].includes(id)\n );\n });\n }, [defaultSchema]);\n};\n\nexport default useHelpMenuSchema;\n","import React from 'react';\nimport { t } from '@jotforminc/translation';\nimport { IconAiFilled, IconBoxArchiveFilled, IconTrashFilled } from '@jotforminc/svg-icons';\n// eslint-disable-next-line no-restricted-imports\nimport colors from '@jotforminc/jotform.css/colors';\nimport { getUrlParameter } from '@jotforminc/utils';\n\nimport ConversationAppContainer from '../containers/ConversationAppContainer';\nimport HeaderTitleRenderer from '../components/HeaderTitleRenderer';\n\nimport rootSaga from '../sagas';\nimport reducers from '../slices';\nimport modalsMap from './modalsMap';\nimport useTabMenuSchema from '../hooks/useTabMenuSchema';\nimport useHelpMenuSchema from '../hooks/useHelpMenuSchema';\n\nexport const VIEW_TYPE = 'conversations';\n\nexport const VIEW_CONFIG = {\n id: VIEW_TYPE,\n icon: 'folder_view_style',\n title: 'Conversation View',\n titleIcon: 'folder_view_white',\n viewIcon: 'folder_view',\n text: 'Conversations',\n configuration: 'folder-configuration',\n color: '#569BFC',\n urlParam: 'newConversations',\n onlyViaUrl: true,\n isHiddenForChangeType: true\n};\n\nexport const APP_CONFIG = {\n name: 'conversations',\n path: '/conversations',\n container: ConversationAppContainer,\n listingPath: '/myagents',\n listingTitle: 'My Agents',\n requestAccessDescription: 'Send a request to the board owner to make changes',\n requestAccessInfo: (\n \n Request\n {' '}\n edit access\n {' '}\n from the agent owner to make changes.\n \n ),\n header: {\n appConfigKey: 'conversations',\n appName: 'conversations',\n TitleRenderer: HeaderTitleRenderer,\n helpMenu: {\n enabled: !!getUrlParameter('help-menu'),\n useHelpMenuSchema\n }\n },\n tabs: {\n enabled: true,\n rename: !!getUrlParameter('tabs-rename'),\n reorder: !!getUrlParameter('tabs-reorder'),\n menu: !!getUrlParameter('tabs-menu'),\n context: {\n enabled: !!getUrlParameter('tabs-context'),\n useTabMenuSchema\n },\n colorStyle: colors['blue-400'],\n iconRenderer: (tab: { subtype: string }): React.ElementType => {\n switch (tab.subtype) {\n case 'trash':\n return IconTrashFilled;\n case 'archive':\n return IconBoxArchiveFilled;\n default:\n return IconAiFilled;\n }\n }\n },\n sharePanel: {\n modalTitle: t('Share your conversations'),\n texts: {\n PRIVATE_ACCESS: 'Private Conversations',\n NO_ONE_ASSIGNED: 'These conversations are not shared with anyone'\n }\n },\n whiteScreen: {\n listingPath: '/myagents',\n navigateButtonText: 'Go to My Agents',\n icon: (): React.ReactFragment => <>\n },\n rootSaga,\n reducers,\n modalsMap,\n notificationSupport: true,\n feedbackTicketCategoryID: 63,\n feedbackFormID: 242883827985982,\n feedbackButtonSupport: true,\n adminWarningTextSupport: true\n};\n","/* global Element */\n/* eslint-disable func-names */\n\nimport smoothscroll from 'smoothscroll-polyfill'; // scrollTo polyfill for Edge\n\nsmoothscroll.polyfill();\n\nif (!Element.prototype.matches) {\n Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;\n}\n\nif (!Element.prototype.closest) {\n Element.prototype.closest = function (s) {\n let el = this;\n if (!document.documentElement.contains(el)) return null;\n do {\n if (el.matches(s)) return el;\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n return null;\n };\n}\n\nif (!window.crypto) {\n window.crypto = window.msCrypto;\n}\n","import { getAppPath } from '@jotforminc/router-bridge';\nimport { isPlatformEnv } from '@jotforminc/utils';\nimport genericAppManager from '../containers/GenericApp/GenericAppManager';\n\nexport const getActiveAppRouter = async () => {\n const appPath = getAppPath();\n const app = isPlatformEnv() ? appPath.substring(appPath.lastIndexOf('/')) : appPath;\n\n if (app.includes('/reports')) {\n return import('./ReportsRouter');\n }\n\n if (genericAppManager.isExistsCheck(appPath) !== false) {\n return import('../containers/GenericApp/GenericAppRouter');\n }\n\n return import('./TablesRouter');\n};\n","import {\n createStore,\n applyMiddleware,\n compose,\n} from 'redux';\n\nexport const makeStore = ({\n reducers = () => {},\n rootSaga = () => {},\n actionBlackList = [],\n middlewares = [],\n}, sagaMiddleware) => {\n const composeEnhancers =\n typeof window === 'object' &&\n window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ?\n window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({\n actionBlackList\n }) : compose;\n\n const store = createStore(\n reducers,\n composeEnhancers(\n applyMiddleware(\n ...middlewares,\n sagaMiddleware\n )\n )\n );\n\n return {\n store,\n rootSaga,\n };\n};\n","import { getAppPath } from '@jotforminc/router-bridge';\nimport { makeStore } from './makeStore';\n\nexport const getActiveAppStore = async (sagaMiddleware) => {\n const app = getAppPath();\n let storeConfig;\n\n switch (app) {\n case '/reports':\n const { reportsStoreConfig } = await import('./reportsStoreConfig');\n storeConfig = reportsStoreConfig;\n break;\n case '/tables':\n default: {\n const { tablesStoreConfig } = await import('./tablesStoreConfig');\n storeConfig = tablesStoreConfig;\n }\n }\n\n const { store, rootSaga } = makeStore(storeConfig, sagaMiddleware);\n\n return {\n store,\n rootSaga\n };\n};\n","import React from 'react';\nimport MaintenanceIcon from '../assets/icons/maintenance.svg';\n\nconst SimpleError = () => {\n return (\n \n \n \n Something went wrong, we are on it.\n \n \n );\n};\n\nexport default SimpleError;\n","import '@jotforminc/router-bridge/init';\nimport Tracking from '@jotforminc/tracking';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport createSagaMiddleware from 'redux-saga';\nimport { Provider } from 'react-redux';\n\nimport { getActiveAlias } from '@jotforminc/router-bridge';\nimport { initWidgetsBuilder } from '@jotforminc/widgets-js-sdk';\nimport { IntegrationProvider } from '@jotforminc/integrations';\nimport { getUrlParameter } from '@jotforminc/utils';\nimport { APP_CONFIG as BOARD_APP_CONFIG } from '@jotforminc/board';\nimport { APP_CONFIG as CONVERSATIONS_APP_CONFIG } from '@jotforminc/conversations';\n\nimport './helpers/polyfills';\n\nimport { getActiveAppRouter } from './routers/getActiveAppRouter';\nimport { getActiveAppStore } from './stores/getActiveAppStore';\nimport SimpleLoading from './components/SimpleLoading';\nimport SimpleError from './components/SimpleError';\nimport '@jotforminc/jotform.css/reset.css';\nimport '@jotforminc/jotform.css';\nimport WhiteScreenErrorBoundary from './components/WhiteScreenErrorBoundary';\nimport genericAppManager from './containers/GenericApp/GenericAppManager';\n\ninitWidgetsBuilder();\nTracking.enableErrorTracking('sheets', false, { sentry: { sampleRate: getActiveAlias() === 'boards' ? 0.5 : undefined } });\n\ngenericAppManager.register(BOARD_APP_CONFIG);\ngenericAppManager.register(CONVERSATIONS_APP_CONFIG);\n\n// A workaround for dirty state of back navigation\nif (global.performance) {\n if (global.performance.navigation.type === 2) {\n global.location.reload();\n }\n}\n\nconst root = document.getElementById('root');\nconst tempLoading = document.getElementById('temp-loading');\n\nclass SagaError extends Error {\n constructor(previousError, sagaStack) {\n super(previousError.message, { cause: previousError });\n this.stack = previousError.stack;\n this.sagaStack = sagaStack;\n }\n}\n\nconst ThrowerComponent = ({ error }) => {\n throw error;\n};\n\nconst sagaMiddleware = createSagaMiddleware({\n onError: (error, { sagaStack }) => {\n ReactDOM.render((\n \n \n \n ), root);\n }\n});\n\nReactDOM.render(, tempLoading);\n\ngetActiveAppRouter()\n .then(async ({ default: RouterComponent }) => {\n const { store, rootSaga } = await getActiveAppStore(sagaMiddleware);\n sagaMiddleware.run(rootSaga);\n\n ReactDOM.render(\n \n \n \n \n \n \n ,\n root\n );\n\n setTimeout(() => ReactDOM.unmountComponentAtNode(tempLoading));\n\n try {\n if (getUrlParameter('use-upload-cache') === '1' || ['teacheractive', 'globaloutreach'].includes(window.COMPANY_SLUG)) {\n await window.navigator.serviceWorker.register(`${window.location.origin}/tables/service-worker.js`);\n } else {\n const registration = await window.navigator.serviceWorker.ready;\n registration.unregister();\n\n const registrations = await window.navigator.serviceWorker.getRegistrations();\n /* eslint-disable no-restricted-syntax */\n for (const reg of registrations) {\n reg.unregister();\n }\n /* eslint-enable no-restricted-syntax */\n }\n } catch (error) {\n console.info('ServiceWorker registration error: ', error);\n }\n }).catch(error => {\n ReactDOM.unmountComponentAtNode(root);\n ReactDOM.render(, tempLoading);\n Tracking.captureException(error);\n // eslint-disable-next-line no-console\n console.error(error);\n });\n","import I from 'immutable';\nimport { emptyValueOperators, emptyValueOperatorsMap } from '../../constants/filter';\n\nconst checkSpelling = (key) => {\n if (key === 'filters') {\n // console.log('YOU SHOULD BE WRITE FILTER FOR API REQUEST');\n return 'filter';\n }\n return key;\n};\n\nexport const isValidQueryValue = (value) => {\n if (I.Map.isMap(value) && value.size === 0) return false;\n if (value === '') return false;\n return true;\n};\n\nconst organizeStringParamValue = (key, value) => {\n if (!I.Map.isMap(value)) return value;\n\n if (key === 'filter') {\n const newFilter = value.mapKeys((valKey) => {\n const [field, operator] = valKey.split(':');\n if (!operator) return valKey;\n if (emptyValueOperators.indexOf(operator) === -1) return valKey;\n return `${field}:${emptyValueOperatorsMap[operator]}`;\n });\n return JSON.stringify(newFilter);\n }\n return JSON.stringify(value);\n};\n\nexport const createQueryParamsString = (params) => {\n return params.reduce((query, value, key) => {\n if (!isValidQueryValue(value)) return query;\n const prefix = query === '' ? '?' : '&';\n const param = checkSpelling(key);\n const paramValue = organizeStringParamValue(key, value);\n\n return `${query}${prefix}${param}=${paramValue}`;\n }, '');\n};\n\nconst organizeObjectParamValue = (key, value) => {\n if (!I.Map.isMap(value)) return value;\n\n if (key === 'filter') {\n const newFilter = value.mapKeys((valKey) => {\n const [field, operator] = valKey.split(':');\n if (!operator) return valKey;\n if (emptyValueOperators.indexOf(operator) === -1) return valKey;\n return `${field}:${emptyValueOperatorsMap[operator]}`;\n });\n return newFilter;\n }\n return value;\n};\n\nexport const createQueryParamsObject = (params) => {\n return params.reduce((query, value, key) => {\n if (!isValidQueryValue(value)) return query;\n const param = checkSpelling(key);\n const paramValue = organizeObjectParamValue(key, value);\n\n if (key === 'tempTables' && !value) {\n return query;\n }\n\n return query.set(param, paramValue);\n }, I.Map()).toJS();\n};\n\nfunction delay(ms) {\n return new Promise((res) => {\n setTimeout(() => {\n res();\n }, ms);\n });\n}\n\nexport function requestWithRetry(\n endpoint,\n { maxRetry = 3, backoffFactor = 0, validation = null }\n) {\n return async (options = {}) => {\n let retry = 0;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n // eslint-disable-next-line no-await-in-loop\n await delay(retry * backoffFactor);\n retry++;\n // eslint-disable-next-line no-await-in-loop\n const result = await endpoint(options);\n let isValid = true;\n if (typeof validation === 'function') {\n // eslint-disable-next-line no-await-in-loop\n isValid = await validation(result);\n }\n\n if (isValid || retry >= maxRetry) {\n return result;\n }\n }\n };\n}\n","const FEATURE_MANAGER_QUERY_PARAM_NAME = 'jffm';\n\nexport const getData = (response) => {\n return response.data.content;\n};\n\nexport const getResponseCode = (response) => {\n return response.data.responseCode;\n};\n\nexport const getResultSet = (response) => {\n return response.data.resultSet;\n};\n\nconst buildParams = (prefix, obj, add) => {\n const rbracket = /\\[\\]$/;\n\n if (Array.isArray(obj)) {\n // Serialize array item.\n obj.forEach((v, i) => {\n if (rbracket.test(prefix)) {\n // Treat each array item as a scalar.\n add(prefix, v);\n } else {\n buildParams(`${prefix}[${(typeof v === 'object' ? i : '')}]`, v, add);\n }\n });\n } else if (obj && obj.toString() === '[object Object]') {\n // if it is an empty object, then send this param without any value to remove the answer\n if (Object.keys(obj).length === 0) {\n add(prefix, '');\n } else {\n // Serialize object item.\n Object.keys(obj).forEach(name => buildParams(`${prefix}[${name}]`, obj[name], add));\n }\n } else {\n // Serialize scalar item.\n add(prefix, obj);\n }\n};\n\nexport const toQueryString = (o) => {\n const s = [];\n // enc = encodeURIComponent,\n const add = (key, value) => {\n let addValue;\n // If value is a function, invoke it and return its value\n if (typeof value === 'function') {\n addValue = value();\n } else if (value == null) {\n addValue = '';\n } else {\n addValue = value;\n }\n s[s.length] = `${encodeURIComponent(key)}=${encodeURIComponent(addValue)}`;\n };\n // If an array was passed in, assume that it is an array of form elements.\n if (Array.isArray(o)) {\n o.forEach((arrItem) => {\n add(arrItem.name, arrItem.value);\n });\n } else {\n Object.keys(o).forEach(prefix => buildParams(prefix, o[prefix], add));\n }\n\n // spaces should be + according to spec\n return s.join('&').replace(/%20/g, '+');\n};\n\nexport const getFeatureManagerQueryParams = () => {\n try {\n return Object.fromEntries(\n Array.from(new URLSearchParams(window.location.search).entries())\n .filter(([k,]) => k.startsWith(FEATURE_MANAGER_QUERY_PARAM_NAME))\n );\n } catch (e) {\n console.error(e);\n return {};\n }\n};\n","import { RequestLayer, Interceptors } from '@jotforminc/request-layer';\nimport { getCurrentFormID, getAPILink } from '../utils';\n\nconst MAIL_ENDPOINT = 'sendSaveAndContinueEmail';\nconst SACL_FORM_ENDPOINT = `${getCurrentFormID()}/draft`;\n\nconst layer = new RequestLayer(`${getAPILink()}/sacl`, {\n interceptorConfig: {\n teamID: global.teamID,\n customResponseInterceptors: [Interceptors.requestManagerResponseNormalizer]\n }\n});\n\nconst layerPrivate = new RequestLayer(`${window.location.origin}/API/sacl/`, {\n interceptorConfig: {\n teamID: global.teamID,\n customResponseInterceptors: [Interceptors.requestManagerResponseNormalizer]\n }\n});\n\nconst CREATE = `${SACL_FORM_ENDPOINT}/create`;\nconst GET_SAVED_DATA = `${SACL_FORM_ENDPOINT}/#uuid`;\nconst UPDATE = `${SACL_FORM_ENDPOINT}/#uuid/update`;\nconst DELETE = '#formID/draft/#uuid';\nconst BULK_DELETE = '#formID/draft/bulkDeleteFromSheet';\nconst UPDATE_OWNER = `${SACL_FORM_ENDPOINT}/#uuid/updateOwner`;\nconst GET_DRAFT = `${SACL_FORM_ENDPOINT}/get`;\nconst IS_NEW_SACL = '#formID/isNewSaclAllowed';\n\nexport const isNewSACL = async formID => {\n return layer.get(IS_NEW_SACL.replace('#formID', formID));\n};\n\nexport const create = async data => {\n return layer.post(`${CREATE}`, { data });\n};\n\nexport const get = uuid => {\n return layer.get(`${GET_SAVED_DATA}`.replace('#uuid', uuid));\n};\n\nexport const getDraft = () => {\n return layer.get(`${GET_DRAFT}`);\n};\n\nexport const deleteDrafts = (formID, data) => {\n return layerPrivate.post(`${BULK_DELETE}`.replace('#formID', formID), data, { disableResponseNormalizer: true });\n};\n\nexport const update = async (data, uuid) => {\n return layer.post(`${UPDATE}`.replace('#uuid', uuid), { data });\n};\n\nexport const updateOwner = async uuid => {\n return layer.post(`${UPDATE_OWNER}`.replace('#uuid', uuid));\n};\n\nexport const remove = async (formID, uuid) => {\n return layerPrivate.delete(`${DELETE}`.replace('#uuid', uuid).replace('#formID', formID));\n};\n\nexport const sendMail = async ({ formID, shareLink, email }) => {\n return layer.post(`${getAPILink()}/${MAIL_ENDPOINT}`, { formID, shareLink, email });\n};\n","import {\n remove,\n create,\n update,\n deleteDrafts,\n getDraft,\n isNewSACL\n} from './api';\nimport SaveAndContinue from './main/SaveAndContinue.jsx';\n\nexport const SAC_API = {\n remove,\n create,\n update,\n deleteDrafts,\n getDraft,\n isNewSACL\n};\n\nexport { SC } from './constants';\n\nexport * from './utils';\n\nexport { default as UnauthorizedScreen } from './components/errorPages/UnauthorizedScreen.jsx';\nexport { default as NotFoundScreen } from './components/errorPages/NotFoundScreen.jsx';\n\nexport default SaveAndContinue;\n","import { getUrlParameter } from '@jotforminc/utils';\nimport { isTeamMember, TEAM_ID } from '../../../constants/team';\nimport { getCollabrationClientID } from '../../../constants/collabration';\n\nexport const makeRequestInterceptor = (sheetID) => _config => {\n const config = _config;\n\n if (config.url.startsWith('/API/')) {\n const prefix = `/API/sheets/${sheetID}/`;\n if (isTeamMember) {\n config.headers = { ...config.headers, 'jf-team-id': TEAM_ID };\n }\n const clientID = getCollabrationClientID();\n if (clientID) {\n config.headers['jf-client-id'] = clientID;\n }\n\n config.url = config.url.replace('/API/', prefix);\n }\n\n if (config.params?.tempTables) {\n if (getUrlParameter('tempTableSharding')) {\n config.params.tempTableSharding = '1';\n }\n }\n\n return config;\n};\n","/* eslint-disable max-lines */\nimport axios from 'axios';\nimport { serialize } from 'object-to-formdata';\nimport { getBaseURL } from '@jotforminc/router-bridge';\nimport { getUrlParameter } from '@jotforminc/utils';\nimport { SAC_API } from '@jotforminc/save-and-continue';\nimport { toQueryString, getData, getResponseCode, getResultSet, getFeatureManagerQueryParams } from './axiosUtils';\nimport { makeRequestInterceptor } from './interceptors';\nimport { createQueryParamsObject } from '../apiUtils';\n\nif (process.env.NODE_ENV !== 'test') axios.defaults.withCredentials = true;\n\nconst jfZones = {\n eu: 'https://eu.jotform.com',\n hippa: 'https://hipaa.jotform.com',\n us: 'https://www.jotform.com'\n};\n\nexport const changeZone = (zone) => {\n if (getUrlParameter('zone') !== '1') return;\n if (process.env.NODE_ENV !== 'production') return;\n axios.defaults.baseURL = jfZones[zone] || '';\n};\n\nlet _sheetID = -1;\nexport const setSheetID = (sheetID) => {\n _sheetID = sheetID;\n};\n\nif (axios.interceptors) {\n axios.interceptors.request.use(config => makeRequestInterceptor(_sheetID)(config));\n}\n\nconst fetchForm = (formID) => {\n return axios.get(`/API/form/${formID}?next=1`);\n};\n\nconst fetchFormProperties = (formID) => {\n return axios.get(`/API/form/${formID}/properties?parseJSON=1&includePDF=1&hasAnySignSubmission=1`);\n};\n\nconst fetchUser = () => {\n return axios.get('/API/user?loc=1');\n};\n\nconst fetchCombinedInfo = () => {\n return axios.get('/API/user/combinedinfo?loc=1&campaign=1');\n};\n\nconst fetchUserForms = () => {\n return axios.get('/API/user/forms?filter={\"status:eq\":\"ENABLED\"}&limit=10000&excludeViews=true');\n};\n\nconst fetchSubmissions = ({ formID, params }) => {\n const queryParams = createQueryParamsObject(params);\n const requestParams = {\n ...queryParams,\n next: '1',\n addSubmitter: getUrlParameter('addSubmitter') === '1' ? '1' : null\n };\n\n if (global.__enableNext3) {\n requestParams.next3 = '1';\n }\n\n if (global.__enableNext5) {\n requestParams.next5 = '1';\n }\n\n return axios.get(`/API/form/${formID}/submissions`, {\n params: requestParams\n });\n};\n\nconst fetchSubmission = (submissionID) => {\n return axios.get(`/API/submission/${submissionID}`);\n};\n\nconst fetchAIAgentSubmissionHistory = (formID, chatID) => {\n return axios.get(`/API/ai-agent/${formID}/chat/${chatID}`);\n};\n\nconst downloadAgentSubmissionHistory = (formID, chatID) => {\n return axios.get(`${getBaseURL()}/API/ai-agent/${formID}/chat/${chatID}/download`, { responseType: 'arraybuffer' });\n};\n\nconst fetchDeletedSubmissions = ({ formID, params }) => {\n const queryParams = createQueryParamsObject(params);\n\n return axios.get(`/API/form/${formID}/submissions/trash`, {\n params: {\n ...queryParams,\n next: '1',\n addSubmitter: getUrlParameter('addSubmitter') === '1' ? '1' : null\n }\n });\n};\n\nconst fetchArchivedSubmissions = ({ formID, params }) => {\n const queryParams = createQueryParamsObject(params);\n\n return axios.get(`/API/form/${formID}/submissions`, {\n params: {\n ...queryParams,\n next: '1',\n addSubmitter: getUrlParameter('addSubmitter') === '1' ? '1' : null\n }\n });\n};\n\nconst fetchAssigneeSubmissions = ({ formID, params }) => {\n const queryParams = createQueryParamsObject(params);\n\n return axios.get(`/API/form/${formID}/submissions`, {\n params: {\n ...queryParams,\n next: '1',\n addSubmitter: getUrlParameter('addSubmitter') === '1' ? '1' : null\n }\n });\n};\n\nconst fetchPendingSubmissions = ({ params }) => {\n const queryParams = createQueryParamsObject(params);\n\n return axios.get('/API/user/pendingpayments', {\n params: queryParams\n });\n};\n\nconst fetchSubmissionUploads = ({ formID, submissionID }) => {\n return axios.get(`/API/form/${formID}/files?filter={\"submission_id\":\"${submissionID}\"}`);\n};\n\nfunction fetchViews(id) {\n const params = {\n 'no-pre-sub': '1',\n 'with-status-details': '1',\n };\n\n if (global.__enableNext3) {\n params.next3 = '1';\n }\n\n if (global.__enableNext5) {\n params.next5 = '1';\n }\n\n return axios.get(`/API/sheet/${id}`, { params });\n}\n\nfunction fetchView(sheetID, viewID) {\n return axios.get(`/API/sheet/${sheetID}/view/${viewID}`);\n}\n\nfunction fetchViewDetails(sheetID, viewID, tempTables = false) {\n const params = {\n next5: '1',\n };\n\n if (tempTables) {\n params.tempTables = '1';\n }\n\n return axios.get(`/API/sheet/${sheetID}/view/${viewID}/details`, { params });\n}\n\nfunction fetchSheetProperties(id) {\n return axios.get(`/API/sheet/${id}/properties`);\n}\n\nfunction fetchSheetTemplateCategories() {\n return axios.get('/API/templates/sheets/categories');\n}\n\nfunction fetchSheetTemplate(filters = {}) {\n const data = toQueryString({ filters });\n\n return axios.get(`/API/templates/sheets?${data}`);\n}\n\nconst createView = (formID, config, isDuplicated, views, tempTables = false) => {\n return axios.post(`/API/sheet/${formID}/views`, toQueryString({\n config,\n isDuplicated,\n views,\n tempTables: tempTables ? '1' : '0'\n }));\n};\n\nconst editView = (formID, id, config, tempTables = false) => {\n const data = {\n sheets: { [id]: config },\n };\n\n if (tempTables) {\n data.tempTables = '1';\n }\n\n return axios.put(`/API/sheet/${formID}/views`, data);\n};\n\nconst editSheetConf = (viewID, config) => {\n return axios.post(`/API/sheet/${viewID}`, config);\n};\n\nconst createSheet = (name, teamID) => {\n return axios.post('/API/sheet', toQueryString({ name }), { headers: teamID ? { 'jf-team-id': teamID } : {} });\n};\n\nconst editViews = (viewID, views, tempTables = false, isBasicEdit = false) => {\n const normalized = Object.keys(views).reduce((acc, id) => {\n const sheet = views[id];\n acc[sheet.viewID] = { ...sheet.config };\n return acc;\n }, {});\n\n const data = { sheets: normalized };\n if (tempTables) {\n data.tempTables = '1';\n }\n\n if (isBasicEdit) {\n data.isBasicEdit = true;\n }\n\n return axios.put(`/API/sheet/${viewID}/views`, data);\n};\n\nconst editColumnRequest = (formID, viewID, config, tempTables = false) => {\n const { columns } = config;\n\n const data = { columns };\n if (tempTables) {\n data.tempTables = '1';\n }\n\n return axios.post(`/API/sheet/${formID}/view/${viewID}/columns/update`, data);\n};\n\nconst deleteView = (formID, viewID, removeConnection = false) => {\n return axios.delete(`/API/sheet/${formID}/view/${viewID}`, {\n data: { removeConnection }\n });\n};\n\nconst editSubmission = (submissionID, submission, replace = false, hasFormula = false, hasLookupColumn = false, hasAssigneeColumn = false) => {\n let editSubmissionURL = `/API/submission/${submissionID}?sheets=1`;\n if (hasFormula) editSubmissionURL = `${editSubmissionURL}&formula=1`;\n if (replace) editSubmissionURL = `${editSubmissionURL}&replace=1`;\n if (hasLookupColumn) editSubmissionURL = `${editSubmissionURL}&lookup=1`;\n if (hasAssigneeColumn !== false) editSubmissionURL = `${editSubmissionURL}&assigneeColumn=${hasAssigneeColumn}`;\n\n return axios.post(editSubmissionURL, toQueryString({\n submission\n }));\n};\n\nconst editSubmissions = (formID, conditions, prop, value, tempTables = false) => {\n const temp = {\n conditions: JSON.stringify(conditions),\n prop,\n value\n };\n const params = tempTables ? { ...temp, tempTables } : temp;\n return axios.post(`/API/form/${formID}/submissions/bulk_update`, toQueryString(params));\n};\n\nconst editFormProperties = (formID, config) => {\n return axios.post(`/API/form/${formID}/properties&parseJSON=1&sheets=1`, toQueryString({\n properties: JSON.stringify(config)\n }));\n};\n\nconst getEmailTemplate = (formID, type, isNewActionButtons) => {\n const newAutoResponderParams = { type, forceAutoresponder: true, newActionButtons: true };\n\n return axios.get(`/API/form/${formID}/defaults/email`, {\n params: isNewActionButtons ? { ...newAutoResponderParams } : { type }\n });\n};\n\nconst deleteSubmissions = (formID, conditions) => {\n return axios.post(`/API/form/${formID}/submissions/bulk_delete?sheets=1`, toQueryString({\n conditions: JSON.stringify(conditions)\n }));\n};\n\nconst addSubmission = (formID, submission) => {\n const url = `https://submit.jotformpro.com/submit/${formID}/`;\n\n const axiosInstance = axios.create({ withCredentials: false });\n return axiosInstance.post(url, toQueryString(submission));\n};\n\nconst uploadSubmissionFile = ({\n formID, submissionID, file, onUploadProgress, questionID\n}) => {\n const data = new global.FormData();\n data.append('uploadedFile[]', file.file, file.fileName);\n data.append('submissionID', submissionID);\n data.append('qid', questionID);\n\n return axios.post(\n `/API/form/${formID}/submission/${submissionID}/files?from=sheets`,\n data,\n {\n onUploadProgress,\n headers: { 'Content-Type': 'multipart/form-data' }\n }\n );\n};\n\nconst deleteSubmissionFile = ({\n userName, formID, submissionID, questionID, fileNames\n}) => {\n return axios.delete(\n `/API/form/${formID}/submission/${submissionID}/files?from=sheets`,\n {\n params: {\n username: userName,\n files: fileNames,\n qid: questionID\n }\n }\n );\n};\n\nconst addColumn = (sheetID, viewID, column, withData, dataSourceQid, { withSubmissionColumns } = {}) => {\n const body = {\n sheets: '1',\n v2: '1',\n column: { ...column, sheetField: 'Yes' },\n withData,\n dataSourceQid,\n };\n\n const params = {\n ...(withSubmissionColumns && { withSubmissionColumns: '1' }),\n ...(getUrlParameter('addSubmitter') === '1' && { withSubmitterColumn: '1' }),\n };\n\n return axios.post(`/API/sheet/${sheetID}/view/${viewID}/columns`, toQueryString(body), { params });\n};\n\nconst addCalendarField = (formID, column) => {\n return axios.post(`/API/sheet/${formID}/calendar-field?sheets=1&v2=1`, toQueryString({ column: { ...column, sheetField: 'Yes' } }));\n};\n\nconst addColumns = (formID, viewID, columns, { withSubmissionColumns } = {}) => {\n const body = {\n sheets: '1',\n v2: '1',\n isBulkAdd: '1',\n columns,\n };\n\n const params = {\n ...(withSubmissionColumns && { withSubmissionColumns: '1' }),\n ...(getUrlParameter('addSubmitter') === '1' && { withSubmitterColumn: '1' }),\n };\n\n return axios.post(`/API/sheet/${formID}/view/${viewID}/columns`, toQueryString(body), { params });\n};\n\nconst editColumn = (formID, viewID, columnID, column) => {\n return axios.post(\n `/API/sheet/${formID}/view/${viewID}/column/${columnID}?sheets=1`,\n toQueryString({\n column\n })\n );\n};\n\nconst deleteColumn = (sheetID, viewID, columns, removeConnection, { withSubmissionColumns } = {}) => {\n const body = {\n sheets: '1',\n v2: '1',\n columns,\n removeConnection,\n };\n\n const params = {\n ...(withSubmissionColumns && { withSubmissionColumns: '1' }),\n ...(getUrlParameter('addSubmitter') === '1' && { withSubmitterColumn: '1' }),\n };\n\n return axios.post(`/API/sheet/${sheetID}/view/${viewID}/columns/delete`, toQueryString(body), { params });\n};\n\nconst fetchColumnValues = ({ sheetID, viewID, columnID, distinct = true }) => {\n return axios.get(`/API/sheet/${sheetID}/view/${viewID}/column/${columnID}/values`, {\n params: {\n distinct: distinct ? 'true' : 'false',\n tempTables: '1',\n }\n });\n};\n\nconst updateUserSetting = (key, value) => {\n return axios.post('/API/user/settings', toQueryString({\n [key]: value\n }));\n};\n\nconst updateFormUserSetting = (key, value) => {\n return axios.post('/API/formuser/settings', toQueryString({\n [key]: value\n }));\n};\n\nconst downloadUploads = (formID, username, email, filter, sheetID, sheetViewID) => {\n const axiosInstance = axios.create({ withCredentials: true });\n return axiosInstance.post(\n '/server.php',\n toQueryString({\n action: 'exportData',\n type: 'ATTACHMENTS',\n project: 'sheets',\n formID,\n username,\n email,\n sheetID,\n sheetViewID,\n ...filter,\n }),\n {\n headers: window.teamID ? { 'jf-team-id': window.teamID } : {},\n }\n );\n};\n\nconst downloadAsPDF = (formID, username, data, pdfDesignID, filters, tempTables = false) => {\n const queryParams = {\n formID,\n username,\n submissionIDs: JSON.stringify(data),\n singlePDF: 1,\n filter: filters.toJS(),\n tempTables: tempTables ? '1' : '0',\n };\n if (global.__enableNext3) {\n queryParams.next3 = '1';\n }\n if (global.__enableNext5) {\n queryParams.next5 = '1';\n }\n\n if (getUrlParameter('combinePDF')) {\n queryParams.combinePDF = '1';\n }\n\n if (getUrlParameter('combinePDFCount')) {\n queryParams.combinePDFCount = getUrlParameter('combinePDFCount');\n }\n\n if (pdfDesignID) queryParams.pdfID = pdfDesignID;\n return axios.post('/API/generateMultiplePDFs', toQueryString(queryParams));\n};\n\nconst downloadSinglePDF = (formid, submissionid, reportid, sheetID) => {\n const isImport = reportid === 'import';\n\n // Normally PDF requests are sent to api-pdf machines instad of api machines\n // by Google Cloud Load Balancer. Since they only handle PDF requests,\n // they have timeout limit of 300 seconds instead of 60 seconds.\n // However it is not possible to write rule such as /API/sheets/*/generatePDF\n // in Google Cloud Load Balancer. So we need to use prefix /sheets instead\n // of /sheets/:sheetID, then we send sheetID as param and set it in router method.\n const requestURL = isImport\n ? `${getBaseURL()}/API/sheets/${sheetID}/pdf-converter/${formid}/fill-pdf`\n : `${getBaseURL()}/API/sheets/generatePDF`;\n const params = isImport ? { submissionID: submissionid } : {\n formid, submissionid, reportid, sheetID, forDownload: 1\n };\n /**\n * We are using `fetch` since the content type\n * can either be json or blob. Couldn't handle\n * it in axios.\n */\n return fetch(\n `${requestURL}?${toQueryString(params)}`,\n {\n credentials: 'same-origin',\n headers: window.teamID ? { 'jf-team-id': window.teamID } : {},\n },\n );\n};\n\nconst downloadConvertedPDFs = (formID, username, data, pdfDesignID, filters, tempTables = false) => {\n const queryParams = {};\n if (tempTables) {\n queryParams.tempTables = '1';\n }\n if (data) {\n queryParams.submissionIDs = JSON.stringify(data);\n }\n if (filters) {\n queryParams.filter = JSON.stringify(filters.toJS());\n }\n\n return axios.get(`/API/pdf-converter/${formID}/download-all`, { params: queryParams });\n};\n\nconst directDownloadUploads = (formID, email, selections, customName, sheetID) => {\n const axiosInstance = axios.create({ withCredentials: true });\n return axiosInstance.get('/server.php', {\n params: {\n action: 'directDownloadableUploads',\n formID: formID,\n sheetID: sheetID,\n type: 'ATTACHMENTS',\n project: 'sheets',\n email: email,\n customZipName: customName,\n selections: selections.length > 0 ? JSON.stringify(selections) : ''\n }\n });\n};\n\nconst createSubmission = (formID, viewID, submission = null, calculateRow = false) => {\n const data = {};\n if (submission) {\n data.submission = submission;\n }\n\n data.addWorkflowStatus = '1';\n\n return axios.post(\n `/API/sheet/${formID}/view/${viewID}/row?sheets=1${calculateRow ? '&calculateRow=1' : ''}`,\n toQueryString(data)\n );\n};\n\nconst fetchPDFDesigns = (sheetID) => {\n return axios.get(`/API/sheet/${sheetID}/pdfs?includeImported=1`);\n};\n\nconst getConnectedSubmission = (sheetID, activeViewID, qid, submissionID) => {\n return axios.get(`/API/sheet/${sheetID}/view/${activeViewID}/connect/${qid}/${submissionID}?sheets=1`);\n};\n\nconst fetchChartStats = (sheetID, formID, params, noCache = false, questionID = false, activeViewID = null, tempTablesSync = false) => {\n const queryParams = createQueryParamsObject(params);\n if (noCache) {\n queryParams.noCache = '1';\n }\n\n if (tempTablesSync) {\n queryParams.tempTables = 'sync';\n }\n\n if (questionID) {\n queryParams.questionID = questionID;\n }\n\n if (getUrlParameter('lookupFilter')) {\n queryParams.lookupFilter = 1;\n }\n\n if (activeViewID) {\n queryParams.activeViewID = activeViewID;\n }\n\n return axios.get(`/API/sheet/${sheetID}/form/${formID}/chart`, {\n params: { ...queryParams }\n });\n};\n\nconst addChart = (formID, viewID, config) => {\n return axios.post(`/API/sheet/${formID}/view/${viewID}/chart`, toQueryString({ config }));\n};\n\nconst editChart = (formID, viewID, chartID, config) => {\n return axios.post(`/API/sheet/${formID}/view/${viewID}/chart/${chartID}`, toQueryString({ config }));\n};\n\nconst deleteChart = (formID, viewID, chartID) => {\n return axios.delete(`/API/sheet/${formID}/view/${viewID}/chart/${chartID}`);\n};\n\nconst duplicateChart = (formID, viewID, chartID) => {\n return axios.post(`/API/sheet/${formID}/view/${viewID}/chart/${chartID}/duplicate`);\n};\n\nconst editCharts = (formID, viewID, config) => {\n return axios.post(`/API/sheet/${formID}/view/${viewID}/charts/edit`, toQueryString({ charts: { ...config } }));\n};\n\nconst fetchViewStatus = (sheetID, views = []) => {\n return axios.get(`/API/sheet/${sheetID}/views/status`, {\n params: {\n tempTables: '1',\n views: JSON.stringify(views)\n }\n });\n};\n\nconst createSheetTemplate = (conf) => {\n return axios.post('/API/templates/sheets', toQueryString(conf));\n};\n\nconst updateSheetTemplate = (id, conf) => {\n const data = serialize(conf);\n return axios.post(`/API/templates/sheets/${id}`, data);\n};\n\nconst downloadData = (sheetID, viewID, type, jobData, params = {}) => {\n const version = getUrlParameter('configVersion');\n const fetcher = getUrlParameter('configFetcher');\n\n const defaultParams = {\n sheets: '1'\n };\n\n const downloadParams = {\n ...defaultParams,\n ...params,\n };\n\n const data = {\n ...jobData,\n ...(version && { version }),\n ...(fetcher && { fetcher }),\n };\n\n return axios.post(\n `/API/sheet/${sheetID}/view/${viewID}/download`,\n toQueryString({ type, jobData: data }),\n { params: downloadParams }\n );\n};\n\nconst fetchDownloadDataConfig = (sheetID, viewID, version = '2') => {\n return axios.get(\n `/API/sheet/${sheetID}/view/${viewID}/download/config`,\n toQueryString({ version }),\n );\n};\n\nconst checkDownloadStatus = (formID, id) => {\n return axios.get(`/API/form/${formID}/submissions/export/status`, { params: { id } });\n};\n\nfunction fetchViewColumns(sheetID, viewID, { withSubmissionColumns, withCustomTitles = '1' } = {}) {\n const params = {\n sheets: '1',\n ...(getUrlParameter('addSubmitter') === '1' && { withSubmitterColumn: '1' }),\n ...(withSubmissionColumns && { withSubmissionColumns }),\n ...(withCustomTitles && { withCustomTitles }),\n tempTables: '1',\n };\n\n return axios.get(`/API/sheet/${sheetID}/view/${viewID}/columns`, { params });\n}\n\nfunction fetchFormQuestions(formID, isNewConnection = true) {\n return axios.get(`/API/form/${formID}/questions${isNewConnection ? '' : '?sheets=1'}`);\n}\n\nconst fetchFormQuestionValues = (formID, questionID, distinct = true) => {\n return axios.get(`/API/form/${formID}/question/${questionID}/values`, {\n params: {\n distinct: distinct ? 'true' : 'false',\n tempTables: '1',\n }\n });\n};\n\nfunction fetchFormPrefills(formID) {\n return axios.get(`/API/form/${formID}/prefills`);\n}\n\nconst addReportItem = (formID, viewID, config) => {\n return axios.post(`/API/sheet/${formID}/view/${viewID}/report`, toQueryString({ config }));\n};\n\nconst editReportItem = (formID, viewID, itemID, config) => {\n return axios.post(`/API/sheet/${formID}/view/${viewID}/report/${itemID}`, toQueryString({ config }));\n};\n\nconst deleteReportItem = (formID, viewID, itemID) => {\n return axios.delete(`/API/sheet/${formID}/view/${viewID}/report/${itemID}`);\n};\n\nconst editReportItems = (formID, viewID, config) => {\n return axios.post(`/API/sheet/${formID}/view/${viewID}/reports/edit`, toQueryString({ items: { ...config } }));\n};\n\nconst addReportPage = (formID, viewID, config) => {\n return axios.post(`/API/sheet/${formID}/view/${viewID}/reportPage`, toQueryString({ config }));\n};\n\nconst deleteReportPage = (formID, viewID, pageID) => {\n return axios.delete(`/API/sheet/${formID}/view/${viewID}/reportPage/${pageID}`);\n};\n\nconst editReportPages = (formID, viewID, config) => {\n return axios.post(`/API/sheet/${formID}/view/${viewID}/reportPages/edit`, toQueryString({ pages: { ...config } }));\n};\n\nconst editReportPage = (formID, viewID, pageID, config) => {\n return axios.post(\n `/API/sheet/${formID}/view/${viewID}/reportPage/${pageID}`,\n toQueryString({ config })\n );\n};\n\nconst duplicateReportPage = (formID, viewID, page, items) => {\n return axios.post(`/API/sheet/${formID}/view/${viewID}/reportPage/duplicate`, toQueryString({ page: { ...page }, items: { ...items } }));\n};\n\nconst getUserUploads = () => {\n const axiosInstance = axios.create({ withCredentials: true });\n return axiosInstance.get(\n '/server.php',\n {\n params: {\n action: 'getUploadedImages'\n }\n }\n );\n};\n\nconst deleteUserUpload = (files) => {\n const axiosInstance = axios.create({ withCredentials: true });\n return axiosInstance.post(\n '/server.php',\n toQueryString({\n action: 'deleteUserUpload',\n file: JSON.stringify(files)\n })\n );\n};\n\nconst fetchSheetRevisions = (sheetID) => {\n return axios.get(`/API/sheet/${sheetID}/revisions`);\n};\n\nconst fetchSheetRevisionDetails = ({ sheetID, oldestRevID, newestRevID }) => {\n return axios.get(`/API/sheet/${sheetID}/revisions/details`, { params: { oldestRevID, newestRevID } });\n};\n\nconst restoreToSelectedRevision = (sheetID, from, to) => {\n const params = {\n from,\n to,\n ...(getUrlParameter('revertOnBackground') && { background: '1' }),\n };\n return axios.post(`/API/sheet/${sheetID}/revisions/restore`, toQueryString(params));\n};\n\nconst getPresentation = (presentationID) => {\n return axios.get(`/API/presentation/${presentationID}`);\n};\n\nconst downloadPresentation = (presentationID, filters = false) => {\n const params = {\n responseType: 'blob',\n };\n\n if (filters) {\n const downloadFilters = createQueryParamsObject(filters);\n params.params = downloadFilters;\n }\n\n return axios.get(`/API/presentation/${presentationID}/download/pdf`, params);\n};\n\nconst fetchShareResources = (sheetID) => {\n return axios.get(`/API/sheet/${sheetID}/shareResources`);\n};\n\nconst fetchPermissions = (sheetID) => {\n return axios.get(`/API/sheet/${sheetID}/permissions`);\n};\n\nconst addUsersToSharedResource = (resourceType, resourceID, users, message, role, fromComments) => {\n const continueOnExistingEmails = !!fromComments;\n return axios.post(\n `/API/share/${resourceType}/${resourceID}/bulkShare`,\n toQueryString({ users, message, role, continueOnExistingEmails })\n );\n};\n\nconst revokeUsersFromSharedResource = (resourceShareIDs) => {\n return axios.post('/API/share/bulkDelete', toQueryString({\n resourceShareIDs\n }));\n};\n\nconst updateSharedResourcePermissions = (resourceShareID, config) => {\n // Only private resources can use this endpoint boi\n return axios.post(`/API/share/${resourceShareID}/update`, toQueryString({\n permissions: config\n }));\n};\n\nconst generateNewResourceShareLink = (resourceType, resourceID, config = {}) => {\n return axios.post(`/API/share/${resourceType}/${resourceID}/link`, toQueryString(config));\n};\n\nconst getSharedWithForResource = (resourceType, resourceID) => {\n return axios.get(`/API/share/${resourceType}/${resourceID}`);\n};\n\nconst updateSharedPresentationProps = (presentationID, properties) => {\n return axios.post(`/API/presentation/${presentationID}/properties`, toQueryString({ properties }));\n};\n\nconst resendShareInvitationEmail = (resourceShareID => {\n return axios.get(`/API/share/${resourceShareID}/resendInvitation`);\n});\n\nconst fetchCollaboratorDetails = (sheetID, users) => {\n return axios.get(`/API/sheet/${sheetID}/collaborators`, { params: { users } });\n};\n\nconst createForm = (sheetID, viewID) => {\n return axios.post(`/API/sheet/${sheetID}/view/${viewID}/exportform?sheets=1`);\n};\n\nconst generateHIPAAAnswers = (sheetID, viewID) => {\n return axios.post(`/API/sheet/${sheetID}/view/${viewID}/generateHIPAATempTables`, {\n tempTables: '1',\n });\n};\n\nconst updateViewStatus = (sheetID, taskID, status) => {\n return axios.post(`/API/sheet/${sheetID}/views/status`, toQueryString({ taskID, status }));\n};\n\nconst duplicateTab = (sheetID, viewID, newTabName, cloneData, views) => {\n return axios.post(`/API/sheet/${sheetID}/view/${viewID}/duplicate?sheets=1`, toQueryString({ newTabName, cloneData, views }));\n};\n\nconst resetColumns = (sheetID, viewID) => {\n return axios.post(`/API/sheet/${sheetID}/view/${viewID}/columns/reset?sheets=1`, null, { params: getUrlParameter('addSubmitter') === '1' ? { withSubmitterColumn: '1' } : {} });\n};\n\nconst deleteIncompleteSubmissions = (formID, conditions) => {\n return SAC_API.deleteDrafts(formID, toQueryString({ conditions: JSON.stringify(conditions) }));\n};\n\nconst deleteSheet = (sheetID, options) => {\n return axios.delete(`/API/sheet/${sheetID}`, { params: options });\n};\n\nconst importSheet = (file, views, sheetID = null, isReports = false, firstLineColumnHeaders = true, teamID = null) => {\n const data = new global.FormData();\n data.append('file', file);\n data.append('views', views);\n if (sheetID) {\n data.append('sheetID', sheetID);\n }\n if (isReports) {\n data.append('isReports', isReports);\n }\n if (firstLineColumnHeaders) {\n data.append('firstLineColumnHeaders', firstLineColumnHeaders);\n }\n\n return axios.post('/API/sheet/import', data, { headers: teamID ? { 'jf-team-id': teamID } : {} });\n};\n\nconst createImportRequest = (file, type, onUploadProgress) => {\n const data = new global.FormData();\n data.append('file', file);\n data.append('type', type);\n\n return axios.post('/API/sheet/pre-import', data, { onUploadProgress });\n};\n\nconst createDemoReport = (templateID) => {\n return axios.post('/API/presentation/clone-template', toQueryString({\n templateID: templateID\n }));\n};\n\nconst requestFormAccess = (id) => {\n return axios.post(`/API/form/${id}/request-access?forceSubuser=1`);\n};\n\nconst requestTableEditAccess = (id, message = '') => {\n return axios.post(\n `/API/share/request-access/sheets/${id}`,\n toQueryString({ message, accessType: 'collaborator' })\n );\n};\n\nconst duplicateReport = (sheetID, viewID, views) => {\n return axios.post(\n `/API/sheet/${sheetID}/view/${viewID}/duplicateReport?sheets=1`,\n toQueryString({ views })\n );\n};\n\nconst cloneTemplate = (templateID, teamID) => {\n return axios.post(\n `/API/templates/sheets/${templateID}/clone`,\n toQueryString({ templateID }),\n { headers: teamID ? { 'jf-team-id': teamID } : {} }\n );\n};\n\nconst fetchViewRows = ({ sheetID, viewID, params }) => {\n const queryParams = createQueryParamsObject(params);\n const requestParams = {\n ...queryParams,\n addSubmitter: getUrlParameter('addSubmitter') === '1' ? '1' : null,\n };\n\n if (global.__enableNext3) {\n requestParams.next3 = '1';\n }\n\n if (global.__enableNext5) {\n requestParams.next5 = '1';\n }\n\n if (getUrlParameter('template') === '1') {\n requestParams.template = '1';\n }\n\n requestParams.addWorkflowStatus = '1';\n requestParams.addAutomationRunHistory = '1';\n\n if (getUrlParameter('wfPerformance') === '1') {\n requestParams.wfPerformance = '1';\n }\n\n if (getUrlParameter('nxfts')) {\n requestParams.nxfts = getUrlParameter('nxfts');\n }\n\n if (getUrlParameter('no-qprops') === '1') {\n requestParams['no-qprops'] = '1';\n }\n\n const { filter: { fullText } = {} } = requestParams;\n if (typeof fullText !== 'undefined' && !fullText) {\n // Removing empty fullText filters\n delete requestParams.filter.fullText;\n }\n\n return axios.get(`/API/sheet/${sheetID}/view/${viewID}/rows`, {\n params: requestParams\n });\n};\n\nconst fetchViewForm = (sheetID, viewID) => {\n return axios.get(`/API/sheet/${sheetID}/view/${viewID}/form`);\n};\n\nconst collaborationFetchColumns = (sheetID, viewID, columns) => {\n return axios.get(`/API/sheet/${sheetID}/view/${viewID}/columns`, {\n params: {\n columns,\n collaboration: '1'\n }\n });\n};\n\nconst saveColumnFunction = (sheetID, viewID, config, queryParams = {}) => {\n return axios.post(`/API/sheet/${sheetID}/view/${viewID}/column-functions`, toQueryString({ config }), {\n params: {\n ...queryParams\n }\n });\n};\n\nconst runButtonAction = (formID, actionID, details) => {\n return axios.post(`/API/form/${formID}/automation/${actionID}/run`, toQueryString({ details }));\n};\n\nconst getFillFormPrefillURL = (sheetID, viewID, columnID, submissionID) => {\n return axios.get(`/API/sheet/${sheetID}/view/${viewID}/column/${columnID}/submission/${submissionID}/fill-form`);\n};\n\nconst getColumnFunctions = (sheetID, viewID, questionIDs = [], queryParams = {}) => {\n const params = { ...queryParams };\n if (getUrlParameter('nxfts')) {\n params.nxfts = getUrlParameter('nxfts');\n }\n\n return axios.get(`/API/sheet/${sheetID}/view/${viewID}/column-functions`, questionIDs.length > 0 ? {\n params: {\n ...params,\n questionIDs: questionIDs.join(',')\n }\n } : {\n params: {\n ...params\n }\n });\n};\n\nconst checkLiveChat = () => {\n return axios.post('/server/check-olark-chat-support', toQueryString({\n product: 'tables',\n }));\n};\n\nconst fetchTablesConfigurations = () => {\n return axios.get('/API/enterprise/customized-configs?productType=tables');\n};\n\nconst editQuestion = (formID, questionID, question) => {\n return axios.post(`/API/form/${formID}/question/${questionID}`, toQueryString({ question }));\n};\n\nconst testEmail = (email) => {\n return axios.post('/server.php', toQueryString({\n action: 'sendTestEmail',\n ...email\n }));\n};\n\nconst removeIntegration = (username, formID, partner) => {\n const axiosInstance = axios.create({ withCredentials: true });\n return axiosInstance.post(\n '/server.php',\n toQueryString({\n action: 'removeIntegration',\n type: partner,\n username,\n formID,\n })\n );\n};\n\nconst getSVG = (svgSource) => {\n return axios.get(svgSource);\n};\n\nconst createComment = (sheetID, viewID, submissionID, content, contentRaw, columnID = null, parentCommentID = null, mentions) => {\n const params = {\n submission_id: submissionID,\n content,\n content_raw: contentRaw,\n };\n\n if (columnID) {\n params.sheet_view_column_id = columnID;\n }\n\n if (parentCommentID) {\n params.parent_id = parentCommentID;\n }\n if (mentions) {\n params.mentions = mentions;\n }\n\n return axios.post(`/API/sheet/${sheetID}/view/${viewID}/comments`, toQueryString(params));\n};\n\nconst fetchAllComments = (sheetID, params = {}) => {\n return axios.get(`/API/sheet/${sheetID}/comments`, { params });\n};\n\nconst fetchSingleComment = (sheetID, viewID, commentID) => {\n return axios.get(`/API/sheet/${sheetID}/view/${viewID}/comments/${commentID}`);\n};\n\nconst deleteComment = (sheetID, viewID, commentID) => {\n return axios.delete(`/API/sheet/${sheetID}/view/${viewID}/comments/${commentID}`);\n};\n\nconst updateComment = (sheetID, viewID, commentID, content, contentRaw, mentions) => {\n const params = {\n content: content,\n content_raw: contentRaw,\n };\n\n if (mentions) {\n params.mentions = mentions;\n }\n\n return axios.put(`/API/sheet/${sheetID}/view/${viewID}/comments/${commentID}`, params);\n};\n\nconst fetchCommenterOptions = (sheetID, viewID) => {\n return axios.get(`/API/sheet/${sheetID}/view/${viewID}/commenteroptions`);\n};\n\nconst isValidFormulaSyntax = (formula) => {\n return axios.post('/API/sheet/check-formula-syntax', toQueryString({ formula }));\n};\n\nconst fetchIntegrationsMeta = (username = null) => {\n // Only the Production DB has the metadata of the integrations.\n const axiosInstance = axios.create({ withCredentials: false });\n // eslint-disable-next-line max-len\n return axiosInstance.get('https://eu-api.jotform.com/apw/list/apps', {\n params: {\n keyword: false,\n sortBy: 'stats.usageTotal',\n industry: false,\n limit: 100,\n offset: 0,\n winners: false,\n subPlatform: 'web-integration',\n username,\n category: false,\n status: '2,3',\n },\n });\n};\n\nconst fetchUserSheets = () => {\n return axios.get('/API/user/sheets');\n};\n\nconst fetchSheetViews = (selectedSheetID) => {\n return axios.get(`/API/sheet/${selectedSheetID}/views`);\n};\n\nconst dismissRequestAccess = (accessRequestID) => {\n return axios.delete(`/API/share/${accessRequestID}/request`);\n};\n\nconst fetchTeamIDFromResourceID = (sheetID) => {\n return axios.get(`/API/team/asset/${sheetID}/sheet`);\n};\n\nconst fetchTeamAssets = (teamID, type) => {\n return axios.get(`/API/team/${teamID}/assets/${type}`);\n};\n\nconst fetchUserTeamRoles = () => {\n return axios.get('/API/team/roles/me');\n};\n\nconst fetchTeamUsersByID = teamID => {\n return axios.get(`/API/team/${teamID}/members`);\n};\n\nconst fetchTeamProperties = teamID => {\n return axios.get(`/API/team/${teamID}/properties`);\n};\n\nconst cancelSignDocument = (documentId, reason) => {\n return axios.post(`/API/sign/${documentId}/cancel`, toQueryString({ reason }));\n};\n\nconst sendReminderToSignDocument = documentId => {\n return axios.post(`/API/sign/${documentId}/reminder`);\n};\n\nconst createNewForm = () => {\n return axios.get('/API/form/new');\n};\n\nconst fetchTeamGetIsResourceBusy = (resourceID, resourceType) => {\n return axios.get(`/API/team/asset/${resourceID}/${resourceType}/get-is-resource-busy`);\n};\n\nconst sendHistoryLog = ({ sheetID, viewID, presentationID, logType }) => {\n return axios.post(`/API/sheet/${sheetID}/view/${viewID}/history-log`, toQueryString({ presentationID, logType }));\n};\n\nconst fetchUsersMovingJobs = (space) => {\n return axios.get(`/API/team/move-jobs/${space}`);\n};\n\nconst createTicket = data => {\n return axios.post('/API/sheet/create/ticket', toQueryString(data));\n};\n\nconst logWhiteScreen = data => {\n return axios.post('/API/sheet/log/white-screen', toQueryString(data));\n};\n\nconst cancelApproval = instanceID => {\n return axios.post(`/API/workflow/instance/${instanceID}/cancel`);\n};\n\nconst restartApproval = instanceID => {\n return axios.post(`/API/workflow/instance/${instanceID}/restart`);\n};\n\nconst getFormPublicKey = formID => {\n return axios.get(`/API/form/${formID}/encryption/publicKey`);\n};\n\nconst setSubmissionEncryptionKey = (formID, submissionID, encryptionKey) => {\n return axios.post(`/API/form/${formID}/encryption/submission/${submissionID}/encryptionKey`, toQueryString({ encryptionKey }));\n};\n\nconst fetchIntegrations = (resource, resourceID, trigger) => {\n return axios.get(`/API/integrations/${resource}/${resourceID}?trigger=${trigger}&includeSettings=true`);\n};\n\nconst fetchSocketSecret = () => {\n return axios.get('/API/share/socketChannel/createSocketSecret');\n};\n\nconst featureReleaseOptIn = (productName, releaseName) => {\n const featureManagerParams = getFeatureManagerQueryParams();\n\n return axios.post(`/API/feature-manager/${productName}/${releaseName}`, null, {\n params: { ...featureManagerParams }\n });\n};\n\nconst featureReleaseOptOut = (productName, releaseName) => {\n const featureManagerParams = getFeatureManagerQueryParams();\n\n return axios.delete(`/API/feature-manager/${productName}/${releaseName}`, {\n params: { ...featureManagerParams }\n });\n};\n\nglobal.collaborationFetchColumns = collaborationFetchColumns;\n\nconst api = {\n fetchForm,\n fetchFormProperties,\n fetchUser,\n fetchCombinedInfo,\n fetchUserForms,\n fetchPendingSubmissions,\n fetchDeletedSubmissions,\n fetchColumnValues,\n fetchSubmissions,\n fetchAIAgentSubmissionHistory,\n fetchSubmissionUploads,\n fetchSheetTemplateCategories,\n fetchSheetTemplate,\n createSheetTemplate,\n updateSheetTemplate,\n fetchViews,\n fetchView,\n fetchViewDetails,\n createView,\n editView,\n editViews,\n editFormProperties,\n deleteView,\n fetchSheetProperties,\n editSubmission,\n addColumn,\n addColumns,\n editColumn,\n deleteColumn,\n addSubmission,\n deleteSubmissions,\n updateUserSetting,\n updateFormUserSetting,\n runButtonAction,\n getFillFormPrefillURL,\n utils: {\n getData,\n getResponseCode,\n getResultSet\n },\n downloadAgentSubmissionHistory,\n downloadAsPDF,\n downloadConvertedPDFs,\n directDownloadUploads,\n downloadUploads,\n editSubmissions,\n editSheetConf,\n createSheet,\n createSubmission,\n fetchPDFDesigns,\n uploadSubmissionFile,\n deleteSubmissionFile,\n getConnectedSubmission,\n fetchChartStats,\n addChart,\n editChart,\n deleteChart,\n duplicateChart,\n fetchViewStatus,\n editCharts,\n downloadData,\n checkDownloadStatus,\n fetchDownloadDataConfig,\n fetchViewColumns,\n fetchFormQuestions,\n fetchFormQuestionValues,\n fetchFormPrefills,\n addReportItem,\n editReportItem,\n deleteReportItem,\n editReportItems,\n addReportPage,\n deleteReportPage,\n editReportPages,\n editReportPage,\n duplicateReportPage,\n deleteUserUpload,\n getUserUploads,\n fetchSheetRevisions,\n fetchSheetRevisionDetails,\n restoreToSelectedRevision,\n getPresentation,\n downloadPresentation,\n updateSharedPresentationProps,\n getSharedWithForResource,\n generateNewResourceShareLink,\n revokeUsersFromSharedResource,\n updateSharedResourcePermissions,\n addUsersToSharedResource,\n fetchShareResources,\n fetchPermissions,\n resendShareInvitationEmail,\n fetchCollaboratorDetails,\n createForm,\n duplicateTab,\n resetColumns,\n generateHIPAAAnswers,\n deleteIncompleteSubmissions,\n updateViewStatus,\n deleteSheet,\n importSheet,\n createImportRequest,\n createDemoReport,\n requestFormAccess,\n requestTableEditAccess,\n duplicateReport,\n fetchViewRows,\n fetchViewForm,\n collaborationFetchColumns,\n saveColumnFunction,\n getColumnFunctions,\n cloneTemplate,\n downloadSinglePDF,\n addCalendarField,\n testEmail,\n checkLiveChat,\n getEmailTemplate,\n fetchTablesConfigurations,\n editQuestion,\n getSVG,\n fetchArchivedSubmissions,\n fetchAssigneeSubmissions,\n removeIntegration,\n fetchIntegrationsMeta,\n fetchUserSheets,\n fetchSheetViews,\n createComment,\n fetchAllComments,\n deleteComment,\n updateComment,\n fetchSingleComment,\n dismissRequestAccess,\n fetchCommenterOptions,\n fetchTeamIDFromResourceID,\n fetchUserTeamRoles,\n fetchTeamAssets,\n fetchTeamUsersByID,\n fetchTeamProperties,\n isValidFormulaSyntax,\n cancelSignDocument,\n sendReminderToSignDocument,\n createNewForm,\n fetchTeamGetIsResourceBusy,\n sendHistoryLog,\n fetchUsersMovingJobs,\n createTicket,\n logWhiteScreen,\n cancelApproval,\n restartApproval,\n editColumnRequest,\n fetchSubmission,\n getFormPublicKey,\n setSubmissionEncryptionKey,\n fetchIntegrations,\n fetchSocketSecret,\n featureReleaseOptIn,\n featureReleaseOptOut,\n};\n\nexport default api;\n","\n \n\n","\n \n\n","\n \n\n","\n \n\n","\n \n\n","\n \n\n","\n \n\n","\n \n\n","\n \n\n","/* eslint-disable no-param-reassign */\nexport class VerticalScrollShadow {\n constructor({\n target = null,\n shadowColor = 'red',\n shadowZIndex = 1,\n shadowHeight = { top: 32, bottom: 32 },\n shadowOffset = 10\n } = {}) {\n this.shadowColor = shadowColor;\n this.target = target;\n this.shadowZIndex = shadowZIndex;\n this.shadowHeight = shadowHeight;\n this.shadowOffset = shadowOffset;\n this.topShadowNode = null;\n this.bottomShadowNode = null;\n }\n\n shadowMarkup(dir, pTop, pRight, pBottom, pLeft) {\n const node = document.createElement('DIV');\n const topV = `top: ${dir === 'top' ? '0' : 'auto'};`;\n const bottom = `bottom: ${dir === 'bottom' ? '0' : 'auto'};`;\n const marginY = `margin-${dir === 'top' ? 'bottom' : 'top'}: -${\n this.shadowHeight[dir]\n }px;`;\n const transform = `transform: translateY(${\n // eslint-disable-next-line no-nested-ternary\n dir === 'top' ? (pTop > 0 ? pTop * -1 : 0) : pBottom\n }px);`;\n\n const width = `width: calc(100% + ${pLeft + pRight}px);`;\n const marginLeft = `margin-left: -${pLeft}px;`;\n const zIndex = `z-index:${this.shadowZIndex};`;\n const bg = `background: ${this.shadowColor};`;\n const defaultStyles = 'position:sticky;left:-24px;opacity:0;transition:.3s;flex-shrink: 0;pointer-events:none;';\n const height = `height:${this.shadowHeight[dir]}px;`;\n\n node.setAttribute('data-sd', dir);\n node.setAttribute(\n 'style',\n `${defaultStyles}${height}${zIndex}${topV}${bottom}${bg}${marginY}${transform}${width}${marginLeft}`\n );\n\n return node;\n }\n\n handleShadow() {\n const nodes = document.querySelectorAll(this.target);\n\n if (nodes && nodes.length > 0) {\n nodes.forEach(node => {\n const styles = window.getComputedStyle(node);\n const {\n paddingTop, paddingRight, paddingLeft, paddingBottom\n } = styles;\n this.topShadowNode = this.shadowMarkup(\n 'top',\n parseInt(paddingTop, 10),\n parseInt(paddingRight, 10),\n parseInt(paddingLeft, 10),\n parseInt(paddingBottom, 10)\n );\n this.bottomShadowNode = this.shadowMarkup(\n 'bottom',\n parseInt(paddingTop, 10),\n parseInt(paddingRight, 10),\n parseInt(paddingLeft, 10),\n parseInt(paddingBottom, 10)\n );\n\n node.prepend(this.topShadowNode);\n node.appendChild(this.bottomShadowNode);\n\n node.style.position = 'relative';\n this.showHideShadow(node, this.topShadowNode, this.bottomShadowNode);\n let top;\n let bottom = null;\n\n node.addEventListener('scroll', e => {\n if (!top && !bottom) {\n top = e.target.querySelector('[data-sd=\"top\"]');\n bottom = e.target.querySelector('[data-sd=\"bottom\"]');\n } else {\n this.showHideShadow(e.target, top, bottom);\n }\n });\n });\n }\n }\n\n showHideShadow(node, top, bottom) {\n top.style.opacity = `${node.scrollTop > this.shadowOffset ? '1' : '0'}`;\n bottom.style.opacity = `${\n node.scrollTop + node.offsetHeight + this.shadowOffset < node.scrollHeight\n ? '1'\n : '0'\n }`;\n }\n\n init() {\n this.handleShadow();\n }\n}\n","import React, { useEffect, useState } from 'react';\n\nconst MessageList = ({\n MessageComponent, messageList, viewMode, formID, isContinueChat,\n inputBackground, inputTextColor, agentBackgroundStart, agentBackgroundEnd,\n agentId, chatId, shouldShowFeedback, step, user, eventHandler, hasFeedbackPermission\n}) => {\n const [feedbacks, setFeedbacks] = useState(null);\n\n const fetchFeedbacks = async () => {\n try {\n if (!shouldShowFeedback) {\n return;\n }\n\n const filters = JSON.stringify({ 'status:ne': 'DELETED' });\n\n const res = await fetch(`/API/ai-agent/${agentId}/feedback?filter=${filters}`, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json'\n }\n });\n\n const data = await res.json();\n if (typeof data?.content !== 'string') {\n setFeedbacks(data?.content);\n }\n } catch (error) {\n console.error('Error fetching feedback:', error);\n }\n };\n\n useEffect(() => {\n fetchFeedbacks();\n }, [agentId]);\n\n const handleFeedbackSubmitted = () => {\n fetchFeedbacks();\n };\n\n return messageList.map(message => {\n const existingFeedback = feedbacks?.find(f => f.chat_message_id === message.id);\n let feedbackInfo = null;\n if (existingFeedback) {\n feedbackInfo = {\n feedbackText: existingFeedback.content,\n feedbackRate: existingFeedback.rating,\n feedbackCreatedAt: existingFeedback.created_at,\n feedbackId: existingFeedback.uuid\n };\n }\n\n return (\n \n );\n });\n};\n\nexport default MessageList;\n","import sanitize from 'sanitize-html';\n\nexport const sanitizeHtmlForParagraphField = html => {\n return sanitize(html, {\n allowedTags: sanitize.defaults.allowedTags.concat(['img', 'span', 'h1', 'h2', 'h3', 'h4', 'audio', 'source', 'iframe', 'small', 'colgroup', 'col', 'i', 'sup', 'sub', 'nav']),\n allowedAttributes: {\n '*': ['href', 'align', 'alt', 'center', 'bgcolor', 'style', 'class', 'width', 'height', 'start'],\n img: ['src'],\n audio: ['controls', 'src'],\n iframe: ['src', 'allowfullscreen'],\n source: ['src', 'type'],\n a: ['target', 'title', 'rel'],\n table: ['border', 'cellspacing', 'cellpadding'],\n td: ['colspan', 'rowspan', 'valign'],\n tr: ['valign'],\n div: ['id']\n },\n allowedSchemesByTag: {\n a: ['http', 'https', 'ftp', 'mailto', 'tel']\n },\n transformTags: { a: sanitize.simpleTransform('a', { rel: 'nofollow' }) },\n parseStyleAttributes: false\n });\n};\n\nexport const sanitizeMessage = message => sanitize(message);\n","import React from 'react';\nimport { bool, string } from 'prop-types';\nimport classNames from 'classnames';\nimport { Flex } from '@jotforminc/magnet';\nimport { isBase64Image } from '@jotforminc/agent-utils';\nimport { t } from '@jotforminc/translation';\n\nexport const Avatar = ({\n url = null, from = null, hasUserAvatar = false\n}) => {\n return (\n \n {t('avatar')}\n
\n );\n};\n\nAvatar.propTypes = {\n url: string,\n from: string,\n hasUserAvatar: bool\n};\n","import { Button, Checkbox } from '@jotforminc/magnet';\nimport classNames from 'classnames';\nimport {\n any, bool, func, string\n} from 'prop-types';\nimport React from 'react';\n\nconst ChoiceButton = ({\n text, image, Icon, isMultipleSelect = false, onSelect, isSelected, className = '', value, disabled, autoSelect = true\n}) => {\n return (\n \n {isMultipleSelect && (\n \n )}\n {image &&
{text}
}\n {text}\n \n );\n};\n\nChoiceButton.propTypes = {\n text: string.isRequired,\n value: any.isRequired,\n image: string,\n Icon: any,\n isMultipleSelect: bool,\n onSelect: func.isRequired,\n isSelected: bool.isRequired,\n className: string,\n disabled: bool,\n autoSelect: bool\n};\n\nexport default ChoiceButton;\n","import { useEffect, useState } from 'react';\nimport { getUrlParameter } from '@jotforminc/utils';\n\nconst useStep = (step = {}, answer) => {\n if (getUrlParameter('aiWidget') !== '1') return { stepState: {}, isDisabledForStep: false };\n const [stepState, setStepState] = useState({\n stepKey: step?.key,\n loopNo: step?.loop,\n lastAnswer: ''\n });\n\n useEffect(() => {\n if (Object.keys(step).length > 0 && answer && !stepState.lastAnswer && !step.currentAnswer[stepState.loopNo][stepState.stepKey]) {\n setStepState({\n ...stepState,\n lastAnswer: answer\n });\n }\n }, [answer]);\n\n return { stepState, isDisabledForStep: !!stepState.lastAnswer };\n};\n\nexport default useStep;\n","import React, { useEffect } from 'react';\nimport {\n bool, func, any, array, string, oneOfType, number, shape\n} from 'prop-types';\nimport { Flex } from '@jotforminc/magnet';\nimport { safeJSONParse } from '@jotforminc/utils';\nimport classNames from 'classnames';\nimport ChoiceButton from './ChoiceButton';\nimport useStep from '../hooks/useStep';\n\nconst ChoiceList = ({\n options, isMultipleSelect = false, isRequired, answer: _answer, setAnswer, isActive = false, inProgress, viewMode = false, defaultValue = '', enableNativeDropdown = false, visibleOptions = 1,\n step = {}\n}) => {\n const defaultSelectedOptions = options.map(o => o.text).filter(text => defaultValue.indexOf(text) > -1);\n\n const answer = typeof _answer === 'string' && isMultipleSelect ? safeJSONParse(_answer, []) : _answer;\n\n const { stepState, isDisabledForStep } = useStep(step, answer);\n\n useEffect(() => {\n if (!answer && defaultSelectedOptions.length > 0) {\n setAnswer(isMultipleSelect ? defaultSelectedOptions : defaultSelectedOptions[0]);\n }\n }, []);\n\n const handleSelection = value => () => {\n if (!isActive || viewMode || isDisabledForStep) return;\n if (isMultipleSelect) {\n const currentAnswer = answer && Array.isArray(answer) ? answer : [];\n if (currentAnswer.includes(value) && (!isRequired || currentAnswer.length > 1)) {\n setAnswer(currentAnswer.filter(o => o !== value));\n } else if (!currentAnswer.includes(value)) {\n setAnswer([...currentAnswer, value]);\n }\n } else {\n setAnswer(value);\n }\n };\n\n const isSelected = text => {\n return (answer && isMultipleSelect) ? (Array.isArray(answer) && answer.includes(text)) : answer === text;\n };\n\n return (\n \n {!viewMode && isMultipleSelect && options.length > 1 && (Select one or more)}\n {(options.length > 12 && enableNativeDropdown) ? (\n setAnswer(isMultipleSelect ? Array.from(selectedOptions).map(o => o.value) : selectedOptions[0].value)}\n >\n {!isMultipleSelect && }\n {options.map(({ text }) => (\n \n ))}\n \n ) : options.map(({ text, Icon }) => (\n \n ))}\n \n );\n};\n\nChoiceList.propTypes = {\n options: array.isRequired,\n isMultipleSelect: bool,\n isRequired: bool.isRequired,\n isActive: bool,\n inProgress: bool,\n setAnswer: func.isRequired,\n answer: any.isRequired,\n viewMode: bool,\n defaultValue: string,\n enableNativeDropdown: bool,\n visibleOptions: oneOfType([string, number]),\n step: shape({})\n};\n\nexport default ChoiceList;\n","import React from 'react';\nimport {\n bool, shape, func, any\n} from 'prop-types';\nimport { IconThumbsDown, IconThumbsUp } from '@jotforminc/svg-icons';\nimport ChoiceList from '../ChoiceList';\n\nconst Icons = { yes: IconThumbsUp, no: IconThumbsDown };\n\nconst YesNo = ({\n question = {}, answer, setAnswer, isActive = false, inProgress, viewMode = false\n}) => {\n const { options: _options = '', required, selected } = question;\n const options = _options.split('|').filter(o => o.trim()).map(option => ({ text: option, Icon: Icons[option.toLowerCase()] }));\n\n return (\n \n );\n};\n\nYesNo.propTypes = {\n question: shape({}),\n isActive: bool,\n inProgress: bool,\n setAnswer: func.isRequired,\n answer: any.isRequired,\n viewMode: bool\n};\n\nexport default YesNo;\n","/* eslint-disable max-len */\n\nimport { COUNTRIES } from '../countries';\nimport { GENDERS } from '../genders';\nimport { DAYS } from '../days';\nimport { MONTHS } from '../months';\n\nconst lastHundredYears = (() => {\n const date = new Date();\n // get current year\n const cyear = (date.getYear() < 1000) ? date.getYear() + 1900 : date.getYear();\n const years = [];\n for (let year = cyear; year >= (cyear - 100); year--) {\n years.push(`${year}`);\n }\n\n return years;\n})();\n\nexport const specialOptions = {\n None: {\n controls: 'dropdown,radio,checkbox,matrix'\n },\n 'US States': {\n controls: 'dropdown',\n value: ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorado', 'Connecticut', 'Delaware', 'District of Columbia', 'Florida', 'Georgia', 'Hawaii', 'Idaho', 'Illinois', 'Indiana', 'Iowa', 'Kansas', 'Kentucky', 'Louisiana', 'Maine', 'Maryland', 'Massachusetts', 'Michigan', 'Minnesota', 'Mississippi', 'Missouri', 'Montana', 'Nebraska', 'Nevada', 'New Hampshire', 'New Jersey', 'New Mexico', 'New York', 'North Carolina', 'North Dakota', 'Ohio', 'Oklahoma', 'Oregon', 'Pennsylvania', 'Rhode Island', 'South Carolina', 'South Dakota', 'Tennessee', 'Texas', 'Utah', 'Vermont', 'Virginia', 'Washington', 'West Virginia', 'Wisconsin', 'Wyoming']\n },\n 'US States Abbr': {\n controls: 'dropdown',\n value: ['AL', 'AK', 'AR', 'AZ', 'CA', 'CO', 'CT', 'DC', 'DE', 'FL', 'GA', 'HI', 'ID', 'IL', 'IN', 'IA', 'KS', 'KY', 'LA', 'ME', 'MD', 'MA', 'MI', 'MN', 'MS', 'MO', 'MT', 'NE', 'NV', 'NH', 'NJ', 'NM', 'NY', 'NC', 'ND', 'OH', 'OK', 'OR', 'PA', 'RI', 'SC', 'SD', 'TN', 'TX', 'UT', 'VT', 'VI', 'VA', 'WA', 'WV', 'WI', 'WY']\n },\n 'Canadian Provinces': {\n controls: 'dropdown',\n value: ['Alberta', 'British Columbia', 'Manitoba', 'New Brunswick', 'Newfoundland', 'Northwest Territories', 'Nova Scotia', 'Nunavut', 'Ontario', 'Prince Edward Island', 'Quebec', 'Saskatchewan', 'Yukon']\n },\n Countries: {\n controls: 'dropdown',\n value: COUNTRIES,\n localeValue: COUNTRIES.map(country => { return String.prototype.locale ? country.locale() : country; })\n },\n 'Last 100 Years': {\n controls: 'dropdown',\n value: lastHundredYears\n },\n Gender: {\n controls: 'dropdown,radio,checkbox',\n value: GENDERS,\n localeValue: GENDERS.map(gender => { return String.prototype.locale ? gender.locale() : gender; })\n },\n Days: {\n controls: 'dropdown,radio,checkbox',\n value: DAYS,\n localeValue: DAYS.map(day => { return String.prototype.locale ? day.locale() : day; })\n },\n Months: {\n controls: 'dropdown,radio,checkbox',\n value: MONTHS,\n localeValue: MONTHS.map(month => { return String.prototype.locale ? month.locale() : month; })\n },\n 'Time Zones': {\n controls: 'dropdown',\n value: ['[[Africa]]', 'Abidjan (GMT)', 'Accra (GMT)', 'Addis Ababa (GMT+03:00)', 'Algiers (GMT+01:00)', 'Asmara (GMT+03:00)', 'Bamako (GMT)', 'Bangui (GMT+01:00)', 'Banjul (GMT)', 'Bissau (GMT)', 'Blantyre (GMT+02:00)', 'Brazzaville (GMT+01:00)', 'Bujumbura (GMT+02:00)', 'Cairo (GMT+03:00)', 'Casablanca (GMT)', 'Ceuta (GMT+02:00)', 'Conakry (GMT)', 'Dakar (GMT)', 'Dar es Salaam (GMT+03:00)', 'Djibouti (GMT+03:00)', 'Douala (GMT+01:00)', 'El Aaiun (GMT)', 'Freetown (GMT)', 'Gaborone (GMT+02:00)', 'Harare (GMT+02:00)', 'Johannesburg (GMT+02:00)', 'Kampala (GMT+03:00)', 'Khartoum (GMT+03:00)', 'Kigali (GMT+02:00)', 'Kinshasa (GMT+01:00)', 'Lagos (GMT+01:00)', 'Libreville (GMT+01:00)', 'Lome (GMT)', 'Luanda (GMT+01:00)', 'Lubumbashi (GMT+02:00)', 'Lusaka (GMT+02:00)', 'Malabo (GMT+01:00)', 'Maputo (GMT+02:00)', 'Maseru (GMT+02:00)', 'Mbabane (GMT+02:00)', 'Mogadishu (GMT+03:00)', 'Monrovia (GMT)', 'Nairobi (GMT+03:00)', 'Ndjamena (GMT+01:00)', 'Niamey (GMT+01:00)', 'Nouakchott (GMT)', 'Ouagadougou (GMT)', 'Porto-Novo (GMT+01:00)', 'Sao Tome (GMT)', 'Tripoli (GMT+02:00)', 'Tunis (GMT+02:00)', 'Windhoek (GMT+01:00)', '[[America]]', 'Adak (GMT-09:00)', 'Anchorage (GMT-08:00)', 'Anguilla (GMT-04:00)', 'Antigua (GMT-04:00)', 'Araguaina (GMT-03:00)', 'Buenos Aires, Argentina (GMT-03:00)', 'Catamarca, Argentina (GMT-03:00)', 'Cordoba, Argentina (GMT-03:00)', 'Jujuy, Argentina (GMT-03:00)', 'La Rioja, Argentina (GMT-03:00)', 'Mendoza, Argentina (GMT-03:00)', 'Rio Gallegos, Argentina (GMT-03:00)', 'Salta, Argentina (GMT-03:00)', 'San Juan, Argentina (GMT-03:00)', 'San Luis, Argentina (GMT-04:00)', 'Tucuman, Argentina (GMT-03:00)', 'Ushuaia, Argentina (GMT-03:00)', 'Aruba (GMT-04:00)', 'Asuncion (GMT-04:00)', 'Atikokan (GMT-05:00)', 'Bahia (GMT-03:00)', 'Barbados (GMT-04:00)', 'Belem (GMT-03:00)', 'Belize (GMT-06:00)', 'Blanc-Sablon (GMT-04:00)', 'Boa Vista (GMT-04:00)', 'Bogota (GMT-05:00)', 'Boise (GMT-06:00)', 'Cambridge Bay (GMT-06:00)', 'Campo Grande (GMT-04:00)', 'Cancun (GMT-05:00)', 'Caracas (GMT-04:30)', 'Cayenne (GMT-03:00)', 'Cayman (GMT-05:00)', 'Chicago (GMT-05:00)', 'Chihuahua (GMT-06:00)', 'Costa Rica (GMT-06:00)', 'Cuiaba (GMT-04:00)', 'Curacao (GMT-04:00)', 'Danmarkshavn (GMT)', 'Dawson (GMT-07:00)', 'Dawson Creek (GMT-07:00)', 'Denver (GMT-06:00)', 'Detroit (GMT-04:00)', 'Dominica (GMT-04:00)', 'Edmonton (GMT-06:00)', 'Eirunepe (GMT-04:00)', 'El Salvador (GMT-06:00)', 'Fortaleza (GMT-03:00)', 'Glace Bay (GMT-03:00)', 'Godthab (GMT-02:00)', 'Goose Bay (GMT-03:00)', 'Grand Turk (GMT-04:00)', 'Grenada (GMT-04:00)', 'Guadeloupe (GMT-04:00)', 'Guatemala (GMT-06:00)', 'Guayaquil (GMT-05:00)', 'Guyana (GMT-04:00)', 'Halifax (GMT-03:00)', 'Havana (GMT-04:00)', 'Hermosillo (GMT-07:00)', 'Indianapolis, Indiana (GMT-04:00)', 'Knox, Indiana (GMT-05:00)', 'Marengo, Indiana (GMT-04:00)', 'Petersburg, Indiana (GMT-04:00)', 'Tell City, Indiana (GMT-05:00)', 'Vevay, Indiana (GMT-04:00)', 'Vincennes, Indiana (GMT-04:00)', 'Winamac, Indiana (GMT-04:00)', 'Inuvik (GMT-06:00)', 'Iqaluit (GMT-04:00)', 'Jamaica (GMT-05:00)', 'Juneau (GMT-08:00)', 'Louisville, Kentucky (GMT-04:00)', 'Monticello, Kentucky (GMT-04:00)', 'La Paz (GMT-04:00)', 'Lima (GMT-05:00)', 'Los Angeles (GMT-07:00)', 'Maceio (GMT-03:00)', 'Managua (GMT-06:00)', 'Manaus (GMT-04:00)', 'Marigot (GMT-04:00)', 'Martinique (GMT-04:00)', 'Mazatlan (GMT-06:00)', 'Menominee (GMT-05:00)', 'Merida (GMT-05:00)', 'Mexico City (GMT-05:00)', 'Miquelon (GMT-02:00)', 'Moncton (GMT-03:00)', 'Monterrey (GMT-05:00)', 'Montevideo (GMT-03:00)', 'Montreal (GMT-04:00)', 'Montserrat (GMT-04:00)', 'Nassau (GMT-04:00)', 'New York (GMT-04:00)', 'Nipigon (GMT-04:00)', 'Nome (GMT-08:00)', 'Noronha (GMT-02:00)', 'Center, North Dakota (GMT-05:00)', 'New Salem, North Dakota (GMT-05:00)', 'Panama (GMT-05:00)', 'Pangnirtung (GMT-04:00)', 'Paramaribo (GMT-03:00)', 'Phoenix (GMT-07:00)', 'Port-au-Prince (GMT-05:00)', 'Port of Spain (GMT-04:00)', 'Porto Velho (GMT-04:00)', 'Puerto Rico (GMT-04:00)', 'Rainy River (GMT-05:00)', 'Rankin Inlet (GMT-05:00)', 'Recife (GMT-03:00)', 'Regina (GMT-06:00)', 'Resolute (GMT-05:00)', 'Rio Branco (GMT-04:00)', 'Santarem (GMT-03:00)', 'Santiago (GMT-04:00)', 'Santo Domingo (GMT-04:00)', 'Sao Paulo (GMT-03:00)', 'Scoresbysund (GMT)', 'Shiprock (GMT-06:00)', 'St Barthelemy (GMT-04:00)', 'St Johns (GMT-02:30)', 'St Kitts (GMT-04:00)', 'St Lucia (GMT-04:00)', 'St Thomas (GMT-04:00)', 'St Vincent (GMT-04:00)', 'Swift Current (GMT-06:00)', 'Tegucigalpa (GMT-06:00)', 'Thule (GMT-03:00)', 'Thunder Bay (GMT-04:00)', 'Tijuana (GMT-07:00)', 'Toronto (GMT-04:00)', 'Tortola (GMT-04:00)', 'Vancouver (GMT-07:00)', 'Whitehorse (GMT-07:00)', 'Winnipeg (GMT-05:00)', 'Yakutat (GMT-08:00)', 'Yellowknife (GMT-06:00)', '[[Antarctica]]', 'Casey (GMT+11:00)', 'Davis (GMT+05:00)', 'DumontDUrville (GMT+10:00)', 'Mawson (GMT+05:00)', 'McMurdo (GMT+12:00)', 'Palmer (GMT-04:00)', 'Rothera (GMT-03:00)', 'South Pole (GMT+12:00)', 'Syowa (GMT+03:00)', 'Vostok (GMT+06:00)', '[[Arctic]]', 'Longyearbyen (GMT+02:00)', '[[Asia]]', 'Aden (GMT+03:00)', 'Almaty (GMT+06:00)', 'Amman (GMT+03:00)', 'Anadyr (GMT+13:00)', 'Aqtau (GMT+05:00)', 'Aqtobe (GMT+05:00)', 'Ashgabat (GMT+05:00)', 'Baghdad (GMT+03:00)', 'Bahrain (GMT+03:00)', 'Baku (GMT+05:00)', 'Bangkok (GMT+07:00)', 'Beirut (GMT+03:00)', 'Bishkek (GMT+06:00)', 'Brunei (GMT+08:00)', 'Choibalsan (GMT+08:00)', 'Chongqing (GMT+08:00)', 'Colombo (GMT+05:30)', 'Damascus (GMT+03:00)', 'Dhaka (GMT+07:00)', 'Dili (GMT+09:00)', 'Dubai (GMT+04:00)', 'Dushanbe (GMT+05:00)', 'Gaza (GMT+03:00)', 'Harbin (GMT+08:00)', 'Ho Chi Minh (GMT+07:00)', 'Hong Kong (GMT+08:00)', 'Hovd (GMT+07:00)', 'Irkutsk (GMT+09:00)', 'Jakarta (GMT+07:00)', 'Jayapura (GMT+09:00)', 'Jerusalem (GMT+03:00)', 'Kabul (GMT+04:30)', 'Kamchatka (GMT+13:00)', 'Karachi (GMT+06:00)', 'Kashgar (GMT+08:00)', 'Kathmandu (GMT+05:45)', 'Kolkata (GMT+05:30)', 'Krasnoyarsk (GMT+08:00)', 'Kuala Lumpur (GMT+08:00)', 'Kuching (GMT+08:00)', 'Kuwait (GMT+03:00)', 'Macau (GMT+08:00)', 'Magadan (GMT+12:00)', 'Makassar (GMT+08:00)', 'Manila (GMT+08:00)', 'Muscat (GMT+04:00)', 'Nicosia (GMT+03:00)', 'Novokuznetsk (GMT+07:00)', 'Novosibirsk (GMT+07:00)', 'Omsk (GMT+07:00)', 'Oral (GMT+05:00)', 'Phnom Penh (GMT+07:00)', 'Pontianak (GMT+07:00)', 'Pyongyang (GMT+09:00)', 'Qatar (GMT+03:00)', 'Qyzylorda (GMT+06:00)', 'Rangoon (GMT+06:30)', 'Riyadh (GMT+03:00)', 'Sakhalin (GMT+11:00)', 'Samarkand (GMT+05:00)', 'Seoul (GMT+09:00)', 'Shanghai (GMT+08:00)', 'Singapore (GMT+08:00)', 'Taipei (GMT+08:00)', 'Tashkent (GMT+05:00)', 'Tbilisi (GMT+04:00)', 'Tehran (GMT+04:30)', 'Thimphu (GMT+06:00)', 'Tokyo (GMT+09:00)', 'Ulaanbaatar (GMT+08:00)', 'Urumqi (GMT+08:00)', 'Vientiane (GMT+07:00)', 'Vladivostok (GMT+11:00)', 'Yakutsk (GMT+10:00)', 'Yekaterinburg (GMT+06:00)', 'Yerevan (GMT+05:00)', '[[Atlantic]]', 'Azores (GMT)', 'Bermuda (GMT-03:00)', 'Canary (GMT+01:00)', 'Cape Verde (GMT-01:00)', 'Faroe (GMT+01:00)', 'Madeira (GMT+01:00)', 'Reykjavik (GMT)', 'South Georgia (GMT-02:00)', 'St Helena (GMT)', 'Stanley (GMT-04:00)', '[[Australia]]', 'Adelaide (GMT+09:30)', 'Brisbane (GMT+10:00)', 'Broken Hill (GMT+09:30)', 'Currie (GMT+10:00)', 'Darwin (GMT+09:30)', 'Eucla (GMT+08:45)', 'Hobart (GMT+10:00)', 'Lindeman (GMT+10:00)', 'Lord Howe (GMT+10:30)', 'Melbourne (GMT+10:00)', 'Perth (GMT+08:00)', 'Sydney (GMT+10:00)', '[[Europe]]', 'Amsterdam (GMT+02:00)', 'Andorra (GMT+02:00)', 'Athens (GMT+03:00)', 'Belgrade (GMT+02:00)', 'Berlin (GMT+02:00)', 'Bratislava (GMT+02:00)', 'Brussels (GMT+02:00)', 'Bucharest (GMT+03:00)', 'Budapest (GMT+02:00)', 'Chisinau (GMT+03:00)', 'Copenhagen (GMT+02:00)', 'Dublin (GMT+01:00)', 'Gibraltar (GMT+02:00)', 'Guernsey (GMT+01:00)', 'Helsinki (GMT+03:00)', 'Isle of Man (GMT+01:00)', 'Istanbul (GMT+03:00)', 'Jersey (GMT+01:00)', 'Kaliningrad (GMT+03:00)', 'Kiev (GMT+03:00)', 'Lisbon (GMT+01:00)', 'Ljubljana (GMT+02:00)', 'London (GMT+01:00)', 'Luxembourg (GMT+02:00)', 'Madrid (GMT+02:00)', 'Malta (GMT+02:00)', 'Mariehamn (GMT+03:00)', 'Minsk (GMT+03:00)', 'Monaco (GMT+02:00)', 'Moscow (GMT+04:00)', 'Oslo (GMT+02:00)', 'Paris (GMT+02:00)', 'Podgorica (GMT+02:00)', 'Prague (GMT+02:00)', 'Riga (GMT+03:00)', 'Rome (GMT+02:00)', 'Samara (GMT+05:00)', 'San Marino (GMT+02:00)', 'Sarajevo (GMT+02:00)', 'Simferopol (GMT+03:00)', 'Skopje (GMT+02:00)', 'Sofia (GMT+03:00)', 'Stockholm (GMT+02:00)', 'Tallinn (GMT+03:00)', 'Tirane (GMT+02:00)', 'Uzhgorod (GMT+03:00)', 'Vaduz (GMT+02:00)', 'Vatican (GMT+02:00)', 'Vienna (GMT+02:00)', 'Vilnius (GMT+03:00)', 'Volgograd (GMT+04:00)', 'Warsaw (GMT+02:00)', 'Zagreb (GMT+02:00)', 'Zaporozhye (GMT+03:00)', 'Zurich (GMT+02:00)', '[[Indian]]', 'Antananarivo (GMT+03:00)', 'Chagos (GMT+06:00)', 'Christmas (GMT+07:00)', 'Cocos (GMT+06:30)', 'Comoro (GMT+03:00)', 'Kerguelen (GMT+05:00)', 'Mahe (GMT+04:00)', 'Maldives (GMT+05:00)', 'Mauritius (GMT+04:00)', 'Mayotte (GMT+03:00)', 'Reunion (GMT+04:00)', '[[Pacific]]', 'Apia (GMT-11:00)', 'Auckland (GMT+12:00)', 'Chatham (GMT+12:45)', 'Easter (GMT-06:00)', 'Efate (GMT+11:00)', 'Enderbury (GMT+13:00)', 'Fakaofo (GMT-10:00)', 'Fiji (GMT+12:00)', 'Funafuti (GMT+12:00)', 'Galapagos (GMT-06:00)', 'Gambier (GMT-09:00)', 'Guadalcanal (GMT+11:00)', 'Guam (GMT+10:00)', 'Honolulu (GMT-10:00)', 'Johnston (GMT-10:00)', 'Kiritimati (GMT+14:00)', 'Kosrae (GMT+11:00)', 'Kwajalein (GMT+12:00)', 'Majuro (GMT+12:00)', 'Marquesas (GMT-09:30)', 'Midway (GMT-11:00)', 'Nauru (GMT+12:00)', 'Niue (GMT-11:00)', 'Norfolk (GMT+11:30)', 'Noumea (GMT+11:00)', 'Pago Pago (GMT-11:00)', 'Palau (GMT+09:00)', 'Pitcairn (GMT-08:00)', 'Ponape (GMT+11:00)', 'Port Moresby (GMT+10:00)', 'Rarotonga (GMT-10:00)', 'Saipan (GMT+10:00)', 'Tahiti (GMT-10:00)', 'Tarawa (GMT+12:00)', 'Tongatapu (GMT+13:00)', 'Truk (GMT+10:00)', 'Wake (GMT+12:00)', 'Wallis (GMT+12:00)']\n }\n};\n","import React, { useEffect, useState } from 'react';\nimport {\n bool, shape, func, any\n} from 'prop-types';\nimport { STEPWISE_WIDGETS, specialOptions } from '@jotforminc/constants';\nimport { shuffleArray } from '@jotforminc/agent-utils';\nimport ChoiceList from '../ChoiceList';\n\nconst MultipleChoice = ({\n question = {}, answer, setAnswer, isActive = false, inProgress, viewMode = false, step = {}\n}) => {\n const [options, setOptions] = useState([]);\n\n useEffect(() => {\n if (STEPWISE_WIDGETS.includes(question?.selectedField)) {\n setOptions(step?.props?.options.map(option => ({ text: option })) || []);\n return;\n }\n let _options = [];\n if (question.special && question.special !== 'None') {\n _options = specialOptions[question.special]?.value || _options;\n } else if (question.options) {\n _options = question.options.split('|').filter(o => o.trim());\n }\n if (question.shuffle === 'Yes') {\n _options = shuffleArray(_options);\n }\n setOptions(_options.map(option => ({ text: option })));\n }, []);\n\n const isMultipleSelect = ['control_checkbox'].includes(question.type) || question.multipleSelections === 'Yes';\n\n return options.length > 0 ? (\n \n ) : '';\n};\n\nMultipleChoice.propTypes = {\n question: shape({}),\n isActive: bool,\n inProgress: bool,\n setAnswer: func.isRequired,\n answer: any.isRequired,\n viewMode: bool,\n step: shape({})\n};\n\nexport default MultipleChoice;\n","import React from 'react';\nimport {\n bool, shape, func, any\n} from 'prop-types';\nimport { Flex } from '@jotforminc/magnet';\nimport { safeJSONParse } from '@jotforminc/utils';\nimport ChoiceButton from '../ChoiceButton';\n\nconst ImageChoice = ({\n question = {}, answer, setAnswer, isActive = false, inProgress, viewMode = false\n}) => {\n const _answer = typeof answer === 'object' ? answer : safeJSONParse(answer, []);\n const options = typeof question.options === 'object' ? question.options : safeJSONParse(question.options, []);\n\n const isMultipleSelect = question.multipleSelection === 'Yes';\n\n const handleSelection = value => () => {\n if ((!isActive && !isMultipleSelect) || viewMode) {\n return;\n }\n if (isMultipleSelect) {\n const _choices = _answer.includes(value) ? _answer.filter(c => c !== value) : [..._answer, value];\n setAnswer(_choices);\n } else {\n setAnswer([value]);\n }\n };\n\n return (\n <>\n \n {!viewMode && isMultipleSelect && options.length > 1 && (Select one or more)}\n {options.map(({ text, link }) => {\n const value = `${text}|${link}`;\n const isOptionSelected = _answer?.includes(value);\n return (\n \n );\n })}\n \n \n );\n};\n\nImageChoice.propTypes = {\n question: shape({}),\n isActive: bool,\n inProgress: bool,\n setAnswer: func.isRequired,\n answer: any.isRequired,\n viewMode: bool\n};\n\nexport default ImageChoice;\n","export const MATRIX_COLUMN_TYPE = {\n RadioButton: 'Radio Button',\n CheckBox: 'Check Box',\n TextBox: 'Text Box',\n CurrencyBox: 'Currency Box',\n NumbericTextBox: 'Numeric Text Box',\n Dropdown: 'Drop Down',\n EmojiSlider: 'Emoji Slider',\n Slider: 'Slider',\n YesNo: 'Yes No'\n};\n\nexport const getColumnType = (inputType, dcolumns, columnIndex) => {\n if (inputType === 'Dynamic') {\n return dcolumns[columnIndex].type;\n }\n return inputType;\n};\n","/* eslint-disable no-param-reassign */\nimport React, { useMemo, useState } from 'react';\nimport { shape, func, bool } from 'prop-types';\nimport { safeJSONParse } from '@jotforminc/utils';\nimport { MATRIX_COLUMN_TYPE } from '@jotforminc/agent-utils';\n\nconst MatrixSlider = ({\n question,\n setAnswer,\n answer,\n viewMode\n}) => {\n const [emojiClasses, setEmojiClasses] = useState({});\n const [currentValues, setCurrentValues] = useState({});\n const dcolumns = useMemo(() => safeJSONParse(question.dcolumns, []), [question]);\n const drows = useMemo(() => safeJSONParse(question.drows, []), [question]);\n const rowTitles = useMemo(() => drows.map(r => r.text), [drows]);\n const columnTitles = useMemo(() => dcolumns.map(c => c.text), [dcolumns]);\n const isEmojiSlider = useMemo(() => question.inputType === MATRIX_COLUMN_TYPE.EmojiSlider, [question]);\n const columnCount = useMemo(() => {\n if (isEmojiSlider) {\n return (parseInt(question.emojiCount, 10) || 5);\n }\n return dcolumns.length;\n }, [question, dcolumns]);\n\n const getColumnIndexFromValue = value => {\n return dcolumns.findIndex(col => col.text === value);\n };\n\n const getColumnTitleFromValue = value => {\n return columnTitles[parseInt(value, 10) - 1];\n };\n\n const centerOfSlider = useMemo(() => {\n return (!isEmojiSlider ? Math.ceil((columnCount + 1) / 2) : Math.ceil((columnCount) / 2));\n });\n\n const isInitial = index => {\n return !(answer && (answer[index] || answer[index] === 0));\n };\n\n const getDefaultValue = index => {\n if (!isInitial(index)) {\n return isEmojiSlider ? answer[index] : getColumnIndexFromValue(answer[index]) + 1;\n }\n return centerOfSlider;\n };\n\n const updateAnswer = newSelectedRange => {\n const rowIds = [];\n const colIds = [];\n const result = {};\n if (!isEmojiSlider) {\n for (let i = 0; i < drows.length; i++) {\n const val = !newSelectedRange[i] && newSelectedRange[i] !== 0 ? centerOfSlider : newSelectedRange[i];\n result[i] = getColumnTitleFromValue(val);\n rowIds.push(drows[i].id);\n }\n dcolumns.forEach(col => {\n colIds.push(col.id);\n });\n } else if (isEmojiSlider) {\n for (let i = 0; i < drows.length; i++) {\n const val = !newSelectedRange[i] && newSelectedRange[i] !== 0 ? centerOfSlider : newSelectedRange[i];\n result[i] = parseInt(val, 10);\n rowIds.push(i);\n }\n }\n setAnswer({\n ...result,\n ...(rowIds.length > 0 ? { rowIds: JSON.stringify(rowIds) } : {}),\n ...(colIds.length > 0 ? { colIds: JSON.stringify(colIds) } : {})\n });\n };\n\n const onSliderReleased = () => {\n updateAnswer(currentValues);\n };\n\n const onSliderChanged = ({ target }) => {\n const { value } = target;\n const rowIndex = target.id.match(/rangeInput_(\\d+)/)[1];\n setCurrentValues({\n ...currentValues,\n [rowIndex]: parseInt(value, 10)\n });\n if (!isEmojiSlider) {\n return;\n }\n setEmojiClasses({\n ...emojiClasses,\n [rowIndex]: `slider-emoji slider-icon-${parseInt(value, 10) || centerOfSlider}`\n });\n };\n\n const rangePointSpans = useMemo(() => {\n const result = [];\n for (let i = 0; i < columnCount; i++) {\n const leftPercent = (100 / (columnCount - 1)) * (i);\n result.push();\n }\n return result;\n }, [columnCount, dcolumns]);\n\n return (\n
\n {drows.map((d, index) => {\n const inputProps = {\n type: 'range',\n min: 1,\n max: columnCount,\n id: `rangeInput_${index}`,\n ...(viewMode || isInitial(index) ? { value: getDefaultValue(index) } : null),\n className: `slider ${isEmojiSlider ? emojiClasses[index] || `slider-emoji slider-icon-${centerOfSlider}` : ''}`,\n onMouseUp: onSliderReleased,\n onTouchEnd: onSliderReleased,\n onChange: onSliderChanged,\n disabled: viewMode\n };\n return (\n <>\n
\n {!isEmojiSlider ? {getColumnTitleFromValue(currentValues[index] || centerOfSlider)} : null}\n
\n {rowTitles[index]}\n
\n
\n \n {rangePointSpans.filter((r, i) => i >= (currentValues[index] || centerOfSlider))}\n
\n
\n \n );\n })}\n
\n );\n};\n\nMatrixSlider.propTypes = {\n question: shape({}).isRequired,\n setAnswer: func.isRequired,\n answer: shape(),\n viewMode: bool\n};\n\nexport default MatrixSlider;\n","/* eslint-disable no-param-reassign */\nimport React, { useMemo } from 'react';\nimport { shape, func, bool } from 'prop-types';\nimport { safeJSONParse } from '@jotforminc/utils';\n\nconst matrixYesNo = ({\n question,\n setAnswer,\n answer,\n viewMode\n}) => {\n const drows = useMemo(() => safeJSONParse(question.drows, []), [question]);\n const rowTitles = useMemo(() => drows.map(r => r.text), [drows]);\n const toggleLabels = useMemo(() => question.toggleText.split('|'), [question]);\n\n const onChange = ({ target }) => {\n const match = target.name.match(/row_radio_(\\d+)/);\n const result = { ...answer };\n const rowIds = [];\n result[match[1]] = target.value;\n\n for (let i = 0; i < drows.length; i++) {\n rowIds.push(drows[i].id);\n }\n setAnswer({\n ...result,\n rowIds: JSON.stringify(rowIds)\n });\n };\n\n return (\n
\n {drows.map((r, rIndex) => {\n const yesInputID = `row_radio_${rIndex}_0`;\n const noInputID = `row_radio_${rIndex}_1`;\n return (\n <>\n
\n
\n
{rowTitles[rIndex]}
\n
\n
\n \n \n
\n
\n \n );\n })}\n
\n );\n};\n\nmatrixYesNo.propTypes = {\n question: shape({}).isRequired,\n setAnswer: func.isRequired,\n answer: shape(),\n viewMode: bool\n};\n\nexport default matrixYesNo;\n","import React, { useEffect, useMemo, useState } from 'react';\nimport {\n any, bool, func, shape\n} from 'prop-types';\nimport Fields from '@jotforminc/form-fields';\nimport { SKIP_MESSAGES } from '@jotforminc/constants';\nimport '../../styles/matrix.scss';\nimport { safeJSONParse } from '@jotforminc/utils';\nimport { getColumnType, MATRIX_COLUMN_TYPE } from '@jotforminc/agent-utils';\nimport MatrixSlider from './MatrixSlider';\nimport MatrixYesNo from './MatrixYesNo';\n\nconst Matrix = ({\n question,\n setAnswer,\n answer,\n viewMode\n}\n) => {\n const [customAnswer, setCustomAnswer] = useState();\n const dcolumns = useMemo(() => safeJSONParse(question.dcolumns, []), [question.dcolumns]);\n\n useEffect(() => {\n if (typeof answer === 'string') {\n if (SKIP_MESSAGES.includes(answer)) {\n return;\n }\n setCustomAnswer(safeJSONParse(answer, []));\n } else {\n setCustomAnswer(answer);\n }\n }, [answer]);\n\n const generateInitialResult = (rowCount, columnCount) => {\n const result = {};\n for (let r = 0; r < rowCount; r++) {\n result[Number(r)] = [];\n for (let c = 0; c < columnCount; c++) {\n result[Number(r)].push('');\n }\n }\n result.rowIds = [];\n for (let i = 0; i < rowCount; i++) {\n result.rowIds.push(i.toString());\n }\n result.colIds = [];\n for (let i = 0; i < columnCount; i++) {\n result.colIds.push(i.toString());\n }\n return result;\n };\n\n const generateInitialResultForOldMatrix = (rowCount, columnCount) => {\n const result = [];\n for (let r = 0; r < rowCount; r++) {\n const rowResult = [];\n for (let c = 0; c < columnCount; c++) {\n rowResult.push('');\n }\n result.push(rowResult);\n }\n return result;\n };\n\n const getRowAndColumnFromInputName = target => {\n const nameMatch = target.name.match(/q\\d+_.*\\[(\\d+)\\]\\[(\\d+)\\]/);\n const idMatch = target.id.match(/.*_\\d+_(\\d+)_(\\d+)/);\n return {\n rowIndex: nameMatch ? parseInt(nameMatch[1], 10) : parseInt(idMatch[1], 10),\n columnIndex: nameMatch ? parseInt(nameMatch[2], 10) : parseInt(idMatch[2], 10)\n };\n };\n\n const checkAllColumnSameType = () => {\n if (question.inputType !== 'Dynamic') {\n return true;\n }\n const typeArr = dcolumns.map(c => c.type);\n return typeArr.filter(i => i === typeArr[0]).length === typeArr.length;\n };\n\n const getTable = () => document.querySelector(`input[name*=q${question.qid}_], select[name*=q${question.qid}_]`)?.closest('table');\n\n const isNewMatrixVersion = () => question.featureSet && question.featureSet.includes('useDcols') && question.featureSet.includes('useIds');\n\n const getTableResult = () => {\n const rowCount = question.mrows.split('|').length;\n const columnCount = dcolumns.length;\n const result = (isNewMatrixVersion() ? generateInitialResult : generateInitialResultForOldMatrix)(rowCount, columnCount);\n const table = getTable();\n table.querySelectorAll('input, select').forEach(item => {\n const { rowIndex, columnIndex } = getRowAndColumnFromInputName(item);\n const columnType = getColumnType(question.inputType, dcolumns, columnIndex);\n switch (true) {\n case checkAllColumnSameType(dcolumns) && columnType === MATRIX_COLUMN_TYPE.RadioButton:\n result[rowIndex][columnIndex] = item.checked ? item.value : '';\n break;\n case [MATRIX_COLUMN_TYPE.RadioButton, MATRIX_COLUMN_TYPE.CheckBox].includes(columnType):\n result[rowIndex][columnIndex] = item.checked ? item.value : '';\n break;\n default:\n result[rowIndex][columnIndex] = item.value;\n break;\n }\n });\n return result;\n };\n\n const handleMultipleRadioColumn = target => {\n const radioColumns = dcolumns.filter(col => col.type === MATRIX_COLUMN_TYPE.RadioButton);\n if (target.type === 'radio' && radioColumns.length > 1) {\n Array.from(target?.closest('tr').querySelectorAll(`input[type=\"radio\"]:not([name=\"${target.name}\"])`))\n .filter(input => input !== target)\n .forEach(input => {\n // eslint-disable-next-line no-param-reassign\n input.checked = false;\n });\n }\n };\n\n const onInputChange = ({ target }) => {\n handleMultipleRadioColumn(target);\n const result = getTableResult();\n setAnswer(result);\n return true;\n };\n const handleEventListener = (remove = false) => {\n const table = getTable();\n table?.querySelectorAll('input, select').forEach(item => {\n if (remove) {\n item.removeEventListener('change', onInputChange);\n } else {\n item.addEventListener('change', onInputChange);\n }\n });\n };\n\n const showAnswerOnTable = () => {\n if (!(customAnswer instanceof Array || customAnswer instanceof Object)) {\n return;\n }\n const table = getTable();\n table?.querySelectorAll('tr:has(input) td input, tr:has(select) td select').forEach(i => {\n const { rowIndex, columnIndex } = getRowAndColumnFromInputName(i);\n const columnType = getColumnType(question.inputType, dcolumns, columnIndex);\n const value = customAnswer[rowIndex]?.[columnIndex];\n if ([MATRIX_COLUMN_TYPE.RadioButton, MATRIX_COLUMN_TYPE.CheckBox].includes(columnType)) {\n // eslint-disable-next-line no-param-reassign\n i.checked = !!value;\n } else {\n // eslint-disable-next-line no-param-reassign\n i.value = value || '';\n }\n });\n };\n\n useEffect(() => {\n if (customAnswer) {\n showAnswerOnTable();\n }\n handleEventListener();\n window.JotForm = {\n setMatrixLayout: f => f,\n handleSingleChoiceWithMultiTypeColumnsForCardForms: f => f\n };\n return () => handleEventListener(true);\n }, [customAnswer]);\n\n const props = {\n qid: {\n value: `input_${question.qid}`\n },\n qname: {\n value: `q${question.qid}_${question.name}`\n },\n subLabel: {\n value: question.subLabel\n },\n id: {\n value: question.qid\n },\n mcolumns: {\n value: question.mcolumns\n },\n dcolumns: {\n value: question.dcolumns\n },\n drows: {\n value: question.drows\n },\n mrows: {\n value: question.mrows\n },\n calcMatrixValues: {\n value: question.calcMatrixValues\n },\n matrixwidth: {\n value: question.matrixwidth\n },\n matrixcells: {\n value: question.matrixcells\n },\n inputType: {\n value: question.inputType\n },\n dropdown: {\n value: question.dropdown\n },\n featureSet: {\n value: question.featureSet\n },\n // manageMatrixOptions: PropTypes.elementType,\n type: {\n value: 'control_matrix'\n },\n required: {\n value: question.required\n },\n passive: !!viewMode,\n focusedPosition: { mrows: question.mrows, mcolumns: question.mcolumns }\n };\n\n switch (true) {\n case [MATRIX_COLUMN_TYPE.EmojiSlider, MATRIX_COLUMN_TYPE.Slider].includes(question.inputType):\n return (\n \n );\n case question.inputType === MATRIX_COLUMN_TYPE.YesNo:\n return (\n \n );\n default:\n return ;\n }\n};\n\nMatrix.propTypes = {\n question: shape({}),\n isActive: bool,\n setAnswer: func.isRequired,\n answer: any.isRequired,\n viewMode: bool\n};\n\nexport default Matrix;\n","/* eslint-disable max-len */\n/* eslint-disable react/no-array-index-key */\n/* eslint-disable no-nested-ternary */\n/* eslint-disable jsx-a11y/click-events-have-key-events */\nimport { string } from 'prop-types';\nimport React, { memo } from 'react';\n\nconst StarIcon = ({ fill, stroke, ...props }) => {\n return (\n \n \n \n );\n};\n\nexport default memo(StarIcon);\n\nStarIcon.propTypes = {\n fill: string.isRequired,\n stroke: string.isRequired\n};\n","import StarIcon from '../components/icons/StarIcon';\n\nexport const STAR_RATING_STYLES = {\n Stars: { // yellow\n hoverColor: '#FAE9AF',\n activeColor: '#FFD53E',\n Icon: StarIcon\n },\n 'Stars 2': { // blue\n hoverColor: '#B8CDFF',\n activeColor: '#2E69FF',\n Icon: StarIcon\n }\n};\n\nexport const TYPE_DURATION_PER_CHARACTER = 10;\n","/* eslint-disable react/no-array-index-key */\n/* eslint-disable no-nested-ternary */\n/* eslint-disable jsx-a11y/click-events-have-key-events */\nimport React, { useMemo, useState } from 'react';\nimport {\n func, shape, bool,\n any\n} from 'prop-types';\nimport classNames from 'classnames';\nimport { STAR_RATING_STYLES } from '../../constants';\n\nconst StarRating = ({\n setAnswer, question, isActive, viewMode, answer\n}) => {\n const [hoveredRating, setHoveredRating] = useState(null);\n const clickedRating = useMemo(() => (viewMode || answer ? parseInt(answer, 10) - 1 : null), [answer]);\n\n const starCount = parseInt(question.stars, 10) || 5;\n\n const { Icon, hoverColor, activeColor } = STAR_RATING_STYLES[question.starStyle] || STAR_RATING_STYLES.Stars;\n\n const handleStarClick = index => {\n if (!isActive || viewMode) return;\n setAnswer((index + 1));\n };\n const handleHover = index => {\n if (!isActive || viewMode) return;\n setHoveredRating(index);\n };\n\n return (\n <>\n
\n \n
\n {[...Array(starCount)].map((_, index) => (\n
\n = index ? activeColor : (hoveredRating !== null && hoveredRating >= index ? hoverColor : '#fff')}\n stroke={clickedRating !== null && clickedRating >= index ? activeColor : (hoveredRating !== null && hoveredRating >= index ? activeColor : '#979dc6')}\n key={index}\n className={classNames('star-icon', { 'cursor-pointer': isActive })}\n tabIndex=\"0\"\n aria-label={`${index + 1} out of ${starCount}`}\n role=\"radio\"\n aria-checked={index === clickedRating ? 'true' : 'false'}\n onMouseEnter={() => handleHover(index)}\n onMouseLeave={() => handleHover(null)}\n onClick={() => handleStarClick(index)}\n />\n
\n ))}\n
\n
\n
\n \n );\n};\n\nStarRating.propTypes = {\n setAnswer: func.isRequired,\n isActive: bool.isRequired,\n question: shape({}).isRequired,\n viewMode: bool.isRequired,\n answer: any.isRequired\n};\n\nexport default StarRating;\n","import {\n bool, func, number, oneOfType, shape, string\n} from 'prop-types';\nimport React from 'react';\n\nconst ScaleRating = ({\n isActive, question, setAnswer, answer\n}) => {\n const {\n qid, scaleAmount, scaleFrom = 1\n } = question;\n\n const min = parseInt(scaleFrom, 10);\n const max = parseInt(scaleAmount, 10) + 1;\n\n const ratings = [...Array(max - min)].map((_value, index) => min + index);\n\n return (\n <>\n
\n \n
\n {ratings.map(rating => (\n
\n isActive && setAnswer(rating)}\n />\n \n
\n ))}\n
\n
\n
\n \n );\n};\n\nScaleRating.propTypes = {\n isActive: bool.isRequired,\n question: shape({}).isRequired,\n setAnswer: func.isRequired,\n answer: oneOfType([string, number]).isRequired\n};\n\nexport default ScaleRating;\n","import React from 'react';\nimport { Button, Flex } from '@jotforminc/magnet';\nimport { bool, func } from 'prop-types';\nimport { t } from '@jotforminc/translation';\n\nconst Submit = ({\n setChatMode = f => f, logAction = f => f, logCommonAction = f => f, chatCompleted = false\n}) => {\n const handleSubmit = () => {\n logAction({ action: 'clicked', target: 'ReviewAndSubmit' });\n logCommonAction({ action: 'ReviewAndSubmit' });\n setChatMode('editsubmission');\n };\n\n return (\n <>\n \n \n {t('Review & Submit')}\n \n \n \n );\n};\n\nSubmit.propTypes = {\n setChatMode: func,\n logAction: func,\n logCommonAction: func,\n chatCompleted: bool\n};\n\nexport default Submit;\n","/* eslint-disable max-len */\nimport React, { memo } from 'react';\n\nfunction SignatureIcon() {\n return (\n \n \n \n );\n}\n\nexport default memo(SignatureIcon);\n","import React, { useEffect, useRef, useState } from 'react';\nimport { Button, Flex } from '@jotforminc/magnet';\nimport { IconTrashFilled } from '@jotforminc/svg-icons';\nimport { isBase64Image } from '@jotforminc/agent-utils';\nimport { any, bool, func } from 'prop-types';\nimport SignatureCanvas from 'react-signature-canvas';\nimport SignatureIcon from '../icons/SignatureIcon';\n\nconst Signature = ({\n setAnswer, viewMode = false, answer\n}) => {\n // const {\n // inprogress\n // } = useStore();\n const signRef = useRef();\n const [hideLabel, setHideLabel] = useState(false);\n\n useEffect(() => {\n if (answer && isBase64Image(answer)) {\n signRef.current.fromDataURL(answer);\n setHideLabel(true);\n }\n if (viewMode) {\n signRef.current.off();\n }\n }, [answer, viewMode]);\n\n const handleSignatureChange = async () => {\n const content = signRef.current?.toDataURL();\n setAnswer(content);\n };\n\n return (\n
\n \n {!hideLabel\n && (\n
\n \n \n Sign Here\n \n
\n )}\n setHideLabel(true)}\n onEnd={handleSignatureChange}\n canvasProps={{ className: 'h-full max-w-full w-56 md:w-60 radius-xl absolute inset-0 border-ai-soft' }}\n clearOnResize={false}\n />\n \n {(!viewMode && answer) && (\n {\n setAnswer('');\n signRef.current?.clear();\n setHideLabel(false);\n }}\n startIcon={IconTrashFilled}\n showTextOnly=\"md\"\n disabled={!signRef.current || signRef.current?.toDataURL()?.length <= 0}\n >\n Clear\n \n )}\n
\n );\n};\n\nSignature.propTypes = {\n setAnswer: func.isRequired,\n viewMode: bool,\n answer: any.isRequired\n};\n\nexport default Signature;\n","export const convertFileToBase64 = async file => {\n const toBase64 = fileObj => new Promise((resolve, reject) => {\n const reader = new window.FileReader();\n reader.readAsDataURL(fileObj);\n reader.onload = () => resolve(reader.result);\n reader.onerror = reject;\n });\n\n const base64Value = await toBase64(file);\n return base64Value;\n};\n\nexport const byteToSize = bytes => {\n if (bytes === 0) return '0 Byte';\n\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n const i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)), 10);\n\n return `${Math.round(bytes / 1024 ** i, 2)} ${sizes[i]}`;\n};\n","import React, { useMemo, useRef, useState } from 'react';\nimport {\n any, bool, func, shape\n} from 'prop-types';\nimport { Button, Flex } from '@jotforminc/magnet';\nimport WarningBox from '@jotforminc/warning-box';\nimport { IconCloudArrowUp, IconXmark, IconFolderFilled } from '@jotforminc/svg-icons';\nimport { formatBytes } from '@jotforminc/utils';\nimport { byteToSize, convertFileToBase64, isJsonString } from '@jotforminc/agent-utils';\n\nconst Upload = ({\n setAnswer, question, viewMode = false, answer\n}) => {\n const [warnings, setWarnings] = useState([]);\n\n const ref = useRef();\n const currentFiles = useMemo(() => {\n if (!Array.isArray(answer)) {\n return [];\n }\n if (viewMode && isJsonString(answer)) {\n const files = JSON.parse(answer);\n const mappedFiles = files.map(file => ({ name: file, size: '', type: '' }));\n return mappedFiles;\n }\n\n return answer;\n }, [answer]);\n\n const canUploadFiles = files => {\n setWarnings([]);\n let allowedFiles = files;\n const {\n fileLimit, extensions, limitFileSize, minFileSize, maxFileSize\n } = question;\n\n const fileLimitNumber = parseInt(fileLimit, 10);\n\n allowedFiles = allowedFiles.filter(file => {\n const extension = file.name.substring(file.name.lastIndexOf('.') + 1, file.name.length);\n const validExtension = question.extensions.includes(extension);\n if (!validExtension) {\n setWarnings(prev => [...prev, `${file.name} has invalid extension. Only ${extensions} are allowed.`]);\n }\n return validExtension;\n });\n\n if (limitFileSize === 'Yes') {\n allowedFiles = allowedFiles.filter(file => {\n const minFileSizeByte = parseInt(minFileSize, 10) * 1024;\n const maxFileSizeByte = parseInt(maxFileSize, 10) * 1024;\n const isFileTooSmall = file.size < minFileSizeByte;\n const isFileTooBig = file.size > maxFileSizeByte;\n if (isFileTooSmall || isFileTooBig) {\n const size = byteToSize(isFileTooSmall ? minFileSizeByte : maxFileSizeByte);\n const sizeWarning = `${file.name} is too ${isFileTooSmall ? 'small' : 'big'}, ${isFileTooSmall ? 'minimum' : 'maximum'} file size is ${size}.`;\n setWarnings(prev => [...prev, sizeWarning]);\n return false;\n }\n return true;\n });\n }\n\n if (allowedFiles.length > fileLimitNumber) {\n allowedFiles = allowedFiles.slice(0, fileLimitNumber);\n setWarnings(prev => [...prev, `Only ${fileLimitNumber} file uploads are allowed.`]);\n }\n\n return allowedFiles;\n };\n\n const handleUploadChange = async ({ target: { files } }) => {\n const allowedFiles = canUploadFiles(Array.from(files));\n if (allowedFiles.length === 0) return;\n const filesArray = await Promise.all(allowedFiles.map(async file => {\n const base64 = await convertFileToBase64(file);\n return {\n data: base64, name: file.name, size: file.size, type: file.type, rawFile: file\n };\n }));\n await setAnswer(currentFiles ? [...currentFiles, ...filesArray] : filesArray, true);\n };\n\n const handleDrop = event => {\n if (viewMode) return;\n event.preventDefault();\n const droppedFiles = event.dataTransfer.files;\n if (droppedFiles.length > 0) {\n handleUploadChange({ target: { files: droppedFiles } });\n }\n };\n\n const handleDeleteFile = async deletedFileName => {\n await setAnswer(currentFiles.filter(currFile => currFile.name !== deletedFileName), true);\n };\n\n const handleOnClickFileUpload = () => {\n if (viewMode) return;\n ref.current.click();\n };\n\n return (\n <>\n event.preventDefault()}\n >\n \n \n \n \n
\n Click to upload\n {' '}\n or drag & drop here\n
\n \n {currentFiles && (\n
\n {currentFiles.map(file => {\n return (\n \n \n
\n {file.type.includes('image') ? (\n \n ) : (\n \n )}\n
\n {file.name}\n
\n \n {file.size &&
{formatBytes(file.size)}
}\n {!viewMode && (\n handleDeleteFile(file.name)}\n />\n )}\n
\n \n );\n })}\n
\n )}\n {warnings.length > 0 && (\n warnings.map(warning => {\n return (\n \n {warning}\n \n );\n }\n )\n )}\n \n );\n};\n\nUpload.propTypes = {\n setAnswer: func.isRequired,\n question: shape.isRequired,\n viewMode: bool,\n answer: any.isRequired\n};\n\nexport default Upload;\n","import React, { useEffect, useState, useRef } from 'react';\nimport { safeJSONParse, formatBytes } from '@jotforminc/utils';\nimport {\n shape, bool, any, func\n} from 'prop-types';\nimport { IconCloudArrowUp, IconXmark } from '@jotforminc/svg-icons';\nimport { Button, Flex, Loader } from '@jotforminc/magnet';\nimport classNames from 'classnames';\nimport Widget from '../Widget';\n\nconst toDataURL = (url, callback) => {\n const xhr = new window.XMLHttpRequest();\n xhr.onload = () => {\n const reader = new window.FileReader();\n reader.onloadend = () => {\n callback(reader.result);\n };\n reader.readAsDataURL(xhr.response);\n };\n xhr.open('GET', url);\n xhr.responseType = 'blob';\n xhr.send();\n};\n\nconst ImageUploadPreview = props => {\n const {\n question, answer, setAnswer, viewMode = false\n } = props;\n const { qid } = question;\n const [widgetEl, setWidgetEl] = useState(null);\n const [img, setImg] = useState(null);\n const [loading, setLoading] = useState(false);\n const ref = useRef();\n const [file, setFile] = useState(null);\n\n useEffect(() => {\n if (answer) {\n const parsedAnswer = safeJSONParse(answer);\n const imgURL = parsedAnswer?.widget_metadata?.value[0]?.url;\n if (imgURL) {\n toDataURL(parsedAnswer?.widget_metadata?.value[0]?.url, base64 => {\n setFile({\n ...parsedAnswer?.widget_metadata?.value[0],\n base64\n });\n setImg(base64);\n setLoading(false);\n });\n } else {\n console.error('Image URL does not exists!');\n }\n }\n }, [answer]);\n\n useEffect(() => {\n const frameEl = document.querySelector(`#customFieldFrame_${qid}`);\n setWidgetEl(frameEl);\n }, []);\n\n const handleUploadChange = _e => {\n const firstFile = _e.target.files[0];\n const handleFile = e => {\n const content = e.target.result;\n // Send to widget\n setLoading(true);\n if (widgetEl) {\n widgetEl.contentWindow.postMessage(JSON.stringify({\n type: 'ai',\n data: content,\n name: firstFile.name\n }), '*');\n }\n };\n const fileData = new window.FileReader();\n fileData.onloadend = handleFile;\n fileData.readAsDataURL(firstFile);\n };\n const handleOnClickFileUpload = () => {\n if (viewMode) return;\n ref.current.click();\n };\n\n const handleDrop = event => {\n if (viewMode) return;\n event.preventDefault();\n const droppedFiles = event.dataTransfer.files;\n if (droppedFiles.length > 0) {\n handleUploadChange({ target: { files: droppedFiles } });\n }\n };\n\n const handleDeleteFile = async () => {\n await setAnswer(null);\n setImg(null);\n setFile(null);\n };\n\n return (\n <>\n
\n \n
\n {\n file ? (\n <>\n
\n \n
\n
\n \n \n
\n \n
\n {file.name}\n
\n \n
{formatBytes((file.base64.length * 6) / 8)}
\n {!viewMode && (\n handleDeleteFile(file.name)}\n />\n )}\n
\n \n
\n \n ) : (\n event.preventDefault()}\n >\n \n {\n loading ? (\n
\n \n
\n ) : (\n <>\n \n \n \n
\n Click to upload\n {' '}\n or drag & drop here\n
\n \n )\n }\n\n \n )\n }\n \n );\n};\n\nImageUploadPreview.propTypes = {\n setAnswer: func.isRequired,\n question: shape.isRequired,\n viewMode: bool,\n answer: any.isRequired\n};\n\nexport default ImageUploadPreview;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { safeJSONParse } from '@jotforminc/utils';\n\nconst isObject = data => {\n return data !== null && typeof data === 'object' && !Array.isArray(data);\n};\n\nconst constructUploadUrl = (url, owner, base) => {\n const sanitizedBase = decodeURIComponent(base)\n .replace(/&([a-zA-Z]+);/g, '&')\n .replace(/\\s/g, '%20');\n return `https://${url}/uploads/${owner}/form_files/${sanitizedBase}`;\n};\n\nconst PDFEmbedder = ({ question }) => {\n const parsedParams = safeJSONParse(question.link);\n let error;\n\n if (!parsedParams || !isObject(parsedParams)) {\n error = 'Invalid data format. Failed to load PDF.';\n return
{error}
;\n }\n\n let link = '';\n\n try {\n if (parsedParams.url) {\n if (parsedParams.base && parsedParams.owner) {\n link = constructUploadUrl(parsedParams.url, parsedParams.owner, parsedParams.base);\n } else {\n link = parsedParams.url;\n }\n } else {\n error = 'PDF link not available.';\n return
{error}
;\n }\n } catch (e) {\n error = 'There was an error loading the PDF.';\n return
{error}
;\n }\n\n const src = `${link}?serveInlineWithCache=1`;\n\n return (\n <>\n \n \n );\n};\n\n// PropTypes tanımları\nPDFEmbedder.propTypes = {\n question: PropTypes.shape({\n link: PropTypes.string.isRequired,\n text: PropTypes.string.isRequired\n }).isRequired\n};\n\nexport default PDFEmbedder;\n","import React, { useEffect, useState, useRef } from 'react';\nimport { Flex, Button } from '@jotforminc/magnet';\nimport {\n shape, any, func, bool\n} from 'prop-types';\nimport { IconCameraFilled, IconArrowsRotate } from '@jotforminc/svg-icons';\nimport WarningBox from '@jotforminc/warning-box';\nimport Webcam from 'react-webcam';\n// import classNames from 'classnames';\n\nconst TakePhoto = props => {\n const {\n question, answer, setAnswer, isActive\n } = props;\n\n const { cameraFacing } = question;\n const CAMERA_ACCESS_STATES = {\n GRANTED: 'granted',\n PROMPT: 'prompt',\n DENIED: 'denied'\n };\n const [imgSrc, setImgSrc] = useState(null);\n const [skipped, setSkipped] = useState(false);\n const [permission, setPermission] = useState(null);\n const webcamRef = useRef(null);\n\n const isAnswerExists = answer?.includes('base64');\n const isFirefox = window.navigator.userAgent.match(/firefox/i);\n\n const askForPermission = async () => {\n /*\n If the user closed the prompt pop up, re-prompt\n If the user denied camera permission, re-prompt for permission will not work, AI will ask, please allow camera permission\n */\n try {\n await window.navigator.mediaDevices.getUserMedia({ audio: false, video: true });\n setPermission(CAMERA_ACCESS_STATES.GRANTED);\n } catch (e) {\n if (e.name === 'NotAllowedError') {\n setPermission(CAMERA_ACCESS_STATES.DENIED);\n } else {\n setPermission(CAMERA_ACCESS_STATES.GRANTED);\n }\n console.log(e.name, 'ERROR!');\n }\n };\n\n const handleCameraPermissions = async () => {\n if (isFirefox) return;\n try {\n const result = await window.navigator.permissions.query({ name: 'camera' });\n setPermission(result.state);\n\n result.onchange = () => {\n setPermission(result.state);\n };\n\n if (result.state === CAMERA_ACCESS_STATES.PROMPT) {\n askForPermission();\n }\n } catch {\n setPermission(CAMERA_ACCESS_STATES.DENIED);\n }\n };\n\n useEffect(() => {\n if (isFirefox) {\n askForPermission();\n }\n handleCameraPermissions();\n }, []);\n\n useEffect(() => {\n if (!isActive && answer && !isAnswerExists) {\n setSkipped(true);\n }\n }, [isActive, answer]);\n\n const capture = () => {\n if (permission === CAMERA_ACCESS_STATES.DENIED) return;\n if (permission === CAMERA_ACCESS_STATES.PROMPT) {\n askForPermission();\n } else if (skipped) {\n setSkipped(false);\n setImgSrc(null);\n } else {\n const imageSrc = webcamRef?.current?.getScreenshot();\n setAnswer(imageSrc);\n setImgSrc(imageSrc);\n }\n };\n\n const retake = () => {\n setSkipped(false);\n setAnswer(null);\n setImgSrc(null);\n };\n\n const isPictureMode = !skipped && (isAnswerExists || imgSrc);\n const isWebcamMode = permission === CAMERA_ACCESS_STATES.GRANTED && !skipped && !(isAnswerExists || imgSrc);\n\n const buttonProps = {\n className: 'retake-photo-btn',\n size: 'medium',\n rounded: false,\n variant: 'filled',\n colorStyle: isPictureMode ? 'secondary' : 'teams',\n onClick: isPictureMode ? retake : capture,\n startIcon: isPictureMode ? IconArrowsRotate : IconCameraFilled,\n style: { 'margin-top': '16px', 'padding-left': '16px' },\n children: isPictureMode ? 'Retake Photo' : 'Take Photo'\n };\n\n const videoConstraints = {\n width: 1280,\n height: 720,\n facingMode: cameraFacing === 'Front' ? 'user' : { exact: 'environment' }\n };\n\n const webcamProps = {\n ref: webcamRef,\n audio: false,\n height: 720,\n width: 1280,\n style: { borderRadius: 10 },\n screenshotFormat: 'image/jpeg',\n videoConstraint: videoConstraints\n };\n\n const warningProps = {\n isLongText: true,\n size: 'medium',\n colorStyle: 'warning',\n showAnimate: true,\n children: 'You need to give permission to the camera to take photos'\n };\n\n const renderArray = [isWebcamMode ? : ];\n\n return (\n <>\n \n {\n !isPictureMode && !(skipped && permission === CAMERA_ACCESS_STATES.GRANTED) ? renderArray : []\n }\n {\n isPictureMode && (\n \n )\n }\n \n
\n
\n \n );\n};\n\nTakePhoto.propTypes = {\n question: shape.isRequired,\n answer: any.isRequired,\n setAnswer: func.isRequired,\n isActive: bool.isRequired\n};\n\nexport default TakePhoto;\n","import React, { useState } from 'react';\nimport {\n shape, any, func, bool\n} from 'prop-types';\nimport { WIDGETS } from '@jotforminc/constants';\nimport { sanitizeHtmlForParagraphField } from '@jotforminc/agent-utils';\n// eslint-disable-next-line import/extensions\nimport ChoiceButton from '../../ChoiceButton';\n\nconst TermsAndCondition = props => {\n const {\n question, answer, setAnswer, isActive = false, inProgress\n } = props;\n\n const {\n selectedField: widgetID\n } = question;\n\n const [accepted, setAccepted] = useState(false);\n const isShortScrollableTerms = widgetID === WIDGETS.ShortScrollableTerms;\n\n const TermsAndConditionParams = ['termsText', 'acceptedText', 'termsLink', 'theme'];\n const ShortScrollableTermsParams = ['termsText', 'content', 'sendTermsConditionals', 'isBottomRequired'];\n const params = {};\n (isShortScrollableTerms ? ShortScrollableTermsParams : TermsAndConditionParams).forEach(p => { params[p] = question[p]; });\n\n if (!isShortScrollableTerms && !/^(https|http):\\/\\//i.test(params.termsLink)) {\n params.termsLink = `https://${params.termsLink}`;\n }\n\n // eslint-disable-next-line max-len\n const termsAndConditionText = sanitizeHtmlForParagraphField((isShortScrollableTerms ? params.content : params.termsText).replaceAll('{', ``).replaceAll('}', ''));\n const defaultText = isShortScrollableTerms ? 'By clicking the button, I agree to terms & conditions.' : 'I agree to terms & conditions';\n\n const accept = () => {\n // eslint-disable-next-line no-nested-ternary\n const newAnswer = isShortScrollableTerms ? (params.sendTermsConditionals === 'Yes' ? params.content : 'Accepted') : (params.acceptedText || 'Accepted');\n\n setAccepted(true);\n setAnswer(newAnswer);\n };\n\n return (\n <>\n \n \n \n );\n};\n\nTermsAndCondition.propTypes = {\n question: shape.isRequired,\n answer: any.isRequired,\n setAnswer: func.isRequired,\n isActive: bool,\n inProgress: bool\n};\n\nexport default TermsAndCondition;\n","import {\n any, bool, func, number, oneOfType, shape,\n string\n} from 'prop-types';\nimport Fields from '@jotforminc/form-fields';\nimport React, { useEffect } from 'react';\nimport { safeJSONParse } from '@jotforminc/utils';\n\nimport '../../styles/appointment.scss';\n\nwindow.JotForm = window.JotForm || {\n runAllCalculations: f => f, corrected: f => f, runConditionForId: f => f, server: '/server.php'\n};\n\nwindow.Element.prototype.triggerEvent = function elemFn(eventName) {\n const evt = document.createEvent('HTMLEvents');\n evt.initEvent(eventName, true, true);\n this.dispatchEvent(evt);\n};\n\nconst Appointment = ({\n question, setAnswer, answer, viewMode, formID\n}) => {\n const _answer = typeof answer === 'object' ? answer : safeJSONParse(answer, {});\n const fieldProps = Object.fromEntries(Object.entries(question).map(([key, value]) => [key, { value: value }]));\n\n const qid = `input_${question.qid}`;\n const qname = `q${question.qid}_${question.name}`;\n\n const allProps = {\n ...fieldProps,\n qid: { value: qid },\n id: { value: question.qid },\n qname: { value: qname },\n cdnconfig: { CDN: 'https://cdn.jotfor.ms/' },\n passive: viewMode,\n timeFormat: { value: fieldProps?.timeFormat?.value || '24 Hour' }\n };\n\n useEffect(() => {\n Object.entries(_answer).forEach(([key, value]) => {\n const el = document.querySelector(`[name=\"${qname}[${key}]\"]`);\n if (el) el.value = value;\n });\n }, []);\n\n useEffect(() => {\n const onInput = () => {\n const values = Array.from(document.querySelectorAll('.jfQuestion-fields > input')).reduce((prev, curr) => {\n return { ...prev, [curr.name.match(/\\[(.*?)\\]/)[1]]: curr.value };\n }, {});\n setAnswer(values);\n };\n const dateEl = document.querySelector(`#${qid}_date`);\n dateEl?.addEventListener('input', onInput);\n return () => dateEl?.removeEventListener('input', onInput);\n });\n\n useEffect(() => {\n window.JotForm.editValueSet = viewMode;\n window.JotForm.isEditMode = () => viewMode;\n window.__formInfo = { id: formID };\n }, [viewMode]);\n\n return (\n <>\n \n \n );\n};\n\nAppointment.propTypes = {\n question: shape({}).isRequired,\n setAnswer: func.isRequired,\n answer: any.isRequired,\n viewMode: bool.isRequired,\n formID: oneOfType([string, number]).isRequired\n};\n\nexport default Appointment;\n","import React from 'react';\nimport { shape } from 'prop-types';\n\nconst Image = ({\n question: {\n link, src, width, height, alt = 'A form image.'\n }\n}) => {\n const imgElement = (\n \n );\n if (link) {\n return ;\n }\n return (\n
{imgElement}
\n );\n};\n\nImage.propTypes = {\n question: shape({}).isRequired\n};\n\nexport default Image;\n","import React, { useState, useEffect } from 'react';\nimport { string, func, bool } from 'prop-types';\nimport { TYPE_DURATION_PER_CHARACTER } from '../constants';\n\nconst HTMLTyping = ({ htmlString, onTypingEnd, useSpan }) => {\n const [displayedHtml, setDisplayedHtml] = useState('');\n\n const decodeHtmlEntities = str => {\n const textarea = document.createElement('textarea');\n textarea.innerHTML = str;\n return textarea.value;\n };\n useEffect(() => {\n let index = 0;\n const decodedHtml = decodeHtmlEntities(htmlString);\n let tagOpened = false;\n let lastTimeout = null;\n const type = () => {\n const newText = decodedHtml.slice(0, index + 1);\n setDisplayedHtml(newText);\n index++;\n if (index !== decodedHtml.length) {\n if (newText.charAt(newText.length - 1) === '<') {\n tagOpened = true;\n type();\n } else if (tagOpened && newText.charAt(newText.length - 1) !== '>') {\n type();\n } else if (tagOpened && newText.charAt(newText.length - 1) === '>') {\n tagOpened = false;\n type();\n } else {\n lastTimeout = setTimeout(type, TYPE_DURATION_PER_CHARACTER);\n }\n } else if (onTypingEnd) {\n onTypingEnd();\n }\n };\n type();\n return () => {\n if (lastTimeout) {\n clearTimeout(lastTimeout);\n }\n };\n }, []);\n\n const Element = useSpan ? 'span' : 'div';\n\n return (\n \n );\n};\nHTMLTyping.propTypes = {\n htmlString: string.isRequired,\n onTypingEnd: func,\n useSpan: bool\n};\nHTMLTyping.defaultProps = {\n useSpan: false\n};\n\nexport default HTMLTyping;\n","import React from 'react';\nimport { bool, func, shape } from 'prop-types';\nimport { sanitizeHtmlForParagraphField } from '@jotforminc/agent-utils';\nimport HTMLTyping from '../HTMLTyping';\n\nconst Paragraph = ({\n question, viewMode, onTypingEnd, isActive\n}) => {\n const htmlString = sanitizeHtmlForParagraphField(question.text);\n return (\n

\n {viewMode || !isActive\n ? \n : }\n

\n );\n};\n\nParagraph.propTypes = {\n question: shape({}).isRequired,\n viewMode: bool.isRequired,\n onTypingEnd: func,\n isActive: bool\n};\n\nexport default Paragraph;\n","import React from 'react';\nimport {\n shape, string, func, bool\n} from 'prop-types';\nimport { Fields } from '@jotforminc/answer-fields';\nimport {\n capitalizeFirstLetter\n} from '@jotforminc/utils';\nimport { Button, Flex } from '@jotforminc/magnet';\nimport { useEventListener } from '@jotforminc/hooks';\n\nexport const normalizeFieldName = questionType => {\n const fieldType = questionType.replace('control_', '');\n return capitalizeFirstLetter(fieldType);\n};\n\nexport const getAnswerField = (questionType = '') => {\n if (questionType === 'control_head') {\n return Fields[normalizeFieldName('control_text')];\n }\n\n const Types = { ...Fields };\n return questionType ? Types[normalizeFieldName(questionType)] : null;\n};\n\nconst Review = ({\n question, formURL, chatId, setChatMode, setSubmitInprogress,\n submitinprogress, setSubmitErrored, answerCurrentQuestion\n}) => {\n const [isSubmitDisabled, setIsSubmitDisabled] = React.useState(false);\n const [isFormLoaded, setIsFormLoaded] = React.useState(false);\n\n const handleChangeQuestin = async val => {\n await answerCurrentQuestion({ answer: `I want to change ${val.text}` });\n };\n\n const handleSubmit = () => {\n document.querySelector('iframe').contentWindow.postMessage('submitDraft', '*');\n };\n\n useEventListener('message', ({ data }) => {\n switch (data.action) {\n case 'submission-error':\n case 'submission-completed':\n if (window.JOTFORM_ENV === 'DEVELOPMENT' || window.user?.account_type?.name === 'ADMIN') {\n console.log('submitMessage', data);\n }\n setSubmitErrored(data.action === 'submission-error');\n setSubmitInprogress(false);\n setChatMode('submitresult');\n break;\n case 'validation-error':\n setSubmitInprogress(false);\n break;\n case 'submission-pending-captcha':\n setSubmitInprogress(false);\n setIsSubmitDisabled(true);\n break;\n case 'submission-pending-signature':\n setSubmitInprogress(false);\n break;\n default:\n break;\n }\n });\n return (\n
\n
\n {question.title}\n
\n
\n {\n question.answers.map(val => {\n const Field = getAnswerField(val.type);\n return (\n \n \n handleChangeQuestin(val)}\n >\n Change\n \n \n );\n })\n }\n
\n
\n Is everything correct?\n \n Yes, submit my answers\n \n
\n\n {\n setIsFormLoaded(true);\n }}\n id=\"ai-agent-manualfilling-formframe\"\n src={`${formURL}?&isAIAgentEmbed=1&chatID=${chatId}&nosubmit=1&no-form-toolbar=true&emailVerifiedInAgent=1&skipAutoSave=1`}\n title=\"ai-agent\"\n style={{ display: 'none' }}\n frameborder=\"0\"\n allow=\"geolocation; microphone; camera; fullscreen\"\n />\n
\n );\n};\n\nReview.propTypes = {\n question: shape({}).isRequired,\n formURL: string,\n chatId: string,\n setChatMode: func,\n setSubmitInprogress: func,\n isFormLoaded: bool,\n submitinprogress: bool,\n setSubmitErrored: func,\n answerCurrentQuestion: func\n};\n\nexport default Review;\n","export const getProductListValue = (question, values) => {\n const products = {};\n const donationField = document.querySelector(`input[id='input_${question.qid}_donation']`);\n if (donationField) {\n return { price: donationField.value };\n }\n values.forEach((val, key, copyValues) => {\n const { name, value } = val;\n if (name.includes('cc_')) return;\n const hasBrackets = /\\[\\]/.test(name);\n const { name: copyName } = copyValues[key + 1] || {};\n if (hasBrackets) {\n return;\n }\n\n const hasCopyBrackets = /\\[\\]/.test(copyName);\n\n const nameParts = name.match(/\\[(.*?)\\]/g);\n\n const hasExpandedOption = !!nameParts[0].split('_')[2];\n const pid = name.match(/special_(\\d+)/)?.[1];\n const id = hasExpandedOption ? nameParts[0] : pid;\n const container = document.querySelector(`span[pid=\"${pid}\"]`);\n const checkbox = container.querySelector('.form-checkbox.form-product-input');\n\n if (!checkbox?.checked) return;\n const specialId = nameParts[1].replace(/[[\\]]/g, '');\n const sort = parseInt(specialId.match(/\\d+/)[0], 10);\n const typeId = document.getElementsByName(name)[0].id;\n const type = typeId.split('_')[2] || 'custom';\n\n if (id && !products[id]) {\n const options = [];\n options[0] = {\n selected: value,\n type,\n expanded: hasCopyBrackets ? '1' : '',\n sort\n };\n products[id] = {\n options,\n hasExpandedOption,\n pid: pid\n };\n return;\n }\n products[id].options.push({\n selected: value, type, expanded: hasCopyBrackets ? '1' : '', sort\n });\n });\n\n Object.keys(products).forEach(key => {\n const { options } = products[key];\n options.sort((a, b) => {\n return a.sort - b.sort;\n });\n });\n\n return Object.values(products);\n};\n\nexport const populateProductList = (question, items) => {\n const subProducts = []; // init sub-products container\n const { qid } = question;\n if (items instanceof Array) {\n items.forEach(item => {\n if (item.hasExpandedOption) {\n subProducts.push(item);\n }\n const checkbox = document.querySelector(`#input_${qid}_${item.pid}`);\n if (checkbox) {\n checkbox.checked = true;\n checkbox.triggerEvent('click');\n if ('options' in item) {\n item.options.forEach((option, i) => {\n if (document.querySelector(`#input_${qid}_${option.type}_${item.pid}_${i}`)) {\n document.querySelector(`#input_${qid}_${option.type}_${item.pid}_${i}`).value = option.selected;\n }\n });\n }\n }\n });\n } else if (items instanceof Object) {\n Object.entries(items).forEach(([key, value]) => {\n if (key === 'price') {\n document.querySelector(`#input_${qid}_donation`).value = value;\n }\n });\n }\n // populate subproduct options\n if (subProducts.length > 0) {\n for (let i = 0; i < subProducts.length; i++) {\n let elem = null;\n let subPid = '';\n const { options } = subProducts[i];\n // get subproduct ID for this item\n for (let j = 0; j < options.length; j++) {\n const opt = options[j];\n if (opt.expanded && document.querySelector(`input[value=\"${opt.selected}\"][name*=\"${subProducts[i].pid}\"]`).length > 0) {\n elem = document.querySelector(`input[value=\"${opt.selected}\"][name*=\"${subProducts[i].pid}\"]`);\n if (elem) {\n [subPid] = elem.name.match(/([0-9]+_[0-9]+)/);\n }\n }\n }\n // fill option values for this item\n for (let z = 0; z < options.length; z++) {\n const opt = options[z];\n if (!opt.expanded && opt.selected) {\n if (document.querySelector(`#input_${qid}_${opt.type}_${subPid}_${z}`)) {\n document.querySelector(`#input_${qid}_${opt.type}_${subPid}_${z}`).value = opt.selected;\n }\n }\n }\n }\n }\n};\n\nexport const getLayoutClass = paymentListSettings => {\n if (paymentListSettings && paymentListSettings[0]) {\n switch (paymentListSettings[0].productListLayout) {\n case 'HR':\n return 'card-1col';\n case 'V2C':\n return ' card-2col';\n case 'V3C':\n return 'card-3col';\n default:\n break;\n }\n }\n return null;\n};\n","import {\n any, bool, func, number, oneOfType, shape, string\n} from 'prop-types';\nimport Fields from '@jotforminc/form-fields';\nimport React, { useEffect, useRef, useState } from 'react';\nimport cn from 'classnames';\nimport ReactDOMServer from 'react-dom/server';\nimport { safeJSONParse } from '@jotforminc/utils';\nimport '../../styles/productList.scss';\nimport { getLayoutClass, getProductListValue, populateProductList } from '@jotforminc/agent-utils';\n\nconst inputElements = ['select', 'input'];\n\nconst ProductList = ({\n question, answer, setAnswer, formID\n}) => {\n const [formProperties, setFormProperties] = useState(window.formProperties); // TODO: decouple window usage somehow\n const dummyForm = useRef(null);\n const _answer = typeof answer === 'object' ? answer : safeJSONParse(answer, {});\n const fieldProps = Object.fromEntries(Object.entries(question).map(([key, value]) => [key, { value: value }]));\n\n const hasFormProperties = formProperties !== undefined;\n\n const qid = `input_${question.qid}`;\n const qname = `q${question.qid}_${question.name}`;\n\n const { paymentType } = question;\n\n useEffect(() => {\n if (!hasFormProperties) return;\n populateProductList(question, _answer);\n }, [hasFormProperties]);\n\n useEffect(() => {\n if (formProperties) return;\n fetch(`/API/form/${formID}/properties`).then(res => res.json()).then(({ content }) => {\n setFormProperties({\n ...content,\n products: [\n ...content.products.map(p => {\n return { ...p, options: JSON.parse(p.options) };\n })\n ]\n });\n }).catch(error => console.error(error));\n }, []);\n\n const allProps = {\n ...fieldProps,\n qid: { value: qid },\n id: { value: question.qid },\n qname: { value: qname },\n passive: false,\n formProperties,\n cdnconfig: { CDN: 'https://cdn.jotfor.ms/' },\n themeVersion: 'v2',\n isPortalProductListElement: true\n };\n\n const handleProductClick = ({ target, currentTarget }) => {\n if (inputElements.includes(target.nodeName.toLowerCase())) return;\n const checkbox = currentTarget.querySelector('.form-product-input');\n currentTarget.classList.toggle('p_selected');\n checkbox.checked = !checkbox.checked;\n checkbox.triggerEvent('change');\n };\n\n const handleChange = () => {\n const formData = Array.from(new FormData(dummyForm.current))\n .map(([name, value]) => ({ name, value }))\n .filter(({ name }) => name.split('_')[0] === `q${question.qid}`);\n const data = getProductListValue(question, formData);\n setAnswer(data);\n };\n\n const eventHandlers = (listener = 'addEventListener') => {\n const wrapper = document.querySelector('.product-container-wrapper');\n if (!wrapper) return;\n wrapper.querySelectorAll(inputElements.join(', ')).forEach(inputEl => inputEl[listener]('change', handleChange));\n document.querySelectorAll('.form-product-item').forEach(productEl => productEl[listener]('click', handleProductClick));\n };\n\n useEffect(() => {\n if (!hasFormProperties) return;\n eventHandlers();\n return () => eventHandlers('removeEventListener');\n }, [setAnswer, hasFormProperties]);\n\n return formProperties ? (\n \n )\n }}\n />\n ) : '';\n};\n\nProductList.propTypes = {\n question: shape({}).isRequired,\n setAnswer: func.isRequired,\n answer: any.isRequired,\n viewMode: bool.isRequired,\n formID: oneOfType([string, number]).isRequired\n};\n\nexport default ProductList;\n","import React from 'react';\nimport { string, bool, func } from 'prop-types';\nimport { Flex } from '@jotforminc/magnet';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport Markdown from 'react-markdown';\nimport HTMLTyping from '../HTMLTyping';\n\nconst EmptyComponent = ({ children }) => children;\n\nconst Generic = ({\n message = '', viewMode, typing, from, isActive = true, isTypingDone = true, onTypingEnd = () => {}\n}) => {\n const parseMarkdown = () => {\n const notAllowedHTMLTags = [\n 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'em', 'img', 'blockquote', 'ul', 'ol', 'pre', 'code', 'hr', 'del', 'p'\n ];\n\n const a = ({ children, href }) => {children};\n\n return renderToStaticMarkup( [tag, EmptyComponent])) }}>{message});\n };\n const htmlMessage = from === 'user' ? message : parseMarkdown();\n\n return (\n \n

\n <>\n {message === '~' &&

}\n {message !== '~' && (viewMode || !typing || !isActive || isTypingDone) && (\n \n )}\n {message !== '~' && !viewMode && typing && isActive && !isTypingDone && }\n \n

\n \n );\n};\n\nGeneric.propTypes = {\n message: string,\n viewMode: bool.isRequired,\n typing: bool.isRequired,\n from: string.isRequired,\n isActive: bool,\n isTypingDone: bool,\n onTypingEnd: func\n};\n\nexport default Generic;\n","import { Button } from '@jotforminc/magnet';\nimport { func, node } from 'prop-types';\nimport React from 'react';\n\nconst ChatActionView = ({ onClick = f => f, children = null }) => {\n return (\n \n {children}\n \n );\n};\n\nChatActionView.propTypes = {\n children: node,\n onClick: func\n};\n\nexport default ChatActionView;\n","import { getUrlParameter } from '@jotforminc/utils';\n\nexport const formatDate = dateString => {\n const date = new Date(dateString);\n\n const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\n let hours = date.getHours();\n const minutes = date.getMinutes().toString().padStart(2, '0');\n const ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n hours = hours || 12;\n\n return `${months[date.getMonth()]} ${date.getDate()}, ${date.getFullYear()} ${hours}:${minutes} ${ampm}`;\n};\n\nexport const isTemplatePreview = () => getUrlParameter('isTemplatePreview') === '1';\nexport const isOneOone = () => getUrlParameter('oneOone') === '1';\nexport const isNewSize = getUrlParameter('isNewSize') === '1';\n","import React, { useState, useRef } from 'react';\nimport {\n Button, Flex, FlexItem, Textarea\n} from '@jotforminc/magnet';\nimport { EmojiRendererWithoutLazy } from '@jotforminc/icon-selector';\nimport PropTypes from 'prop-types';\nimport {\n IconCheck, IconEllipsisHorizontal, IconPencilLineFilled, IconTrashFilled\n} from '@jotforminc/svg-icons';\nimport { ContextMenu } from '@jotforminc/context-menu';\nimport { t } from '@jotforminc/translation';\nimport { formatDate } from '../utils';\n\nconst emojis = ['weary', 'white_frowning_face', 'neutral_face', 'slightly_smiling_face', 'smile'];\nconst ratings = ['Worst', 'Fair', 'Neutral', 'Good', 'Best'];\n\nconst GiveFeedback = ({\n onClose,\n messageId,\n feedbackInfo = {},\n user,\n onFeedbackSubmitted,\n eventHandler = () => {},\n hasFeedbackPermission\n}) => {\n const [feedbackText, setFeedbackText] = useState(feedbackInfo?.feedbackText ?? '');\n const [feedbackRate, setFeedbackRate] = useState(feedbackInfo?.feedbackRate ?? '0');\n const [feedbackId, setFeedbackId] = useState(feedbackInfo?.feedbackId ?? null);\n const [isSubmitted, setIsSubmitted] = useState(!!feedbackInfo);\n const [showContextMenu, setShowContextMenu] = useState();\n const contextMenuButtonRef = useRef();\n const [feedbackCreatedAt, setFeedbackCreatedAt] = useState(feedbackInfo?.feedbackCreatedAt);\n const [selectedRating, setSelectedRating] = useState(parseInt(feedbackInfo?.feedbackRate, 10) ?? null);\n\n const handleSubmit = async e => {\n try {\n e.preventDefault();\n if (feedbackId) {\n await fetch(`/API/ai-agent/feedback/${feedbackId}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({ rating: feedbackRate, content: feedbackText })\n });\n eventHandler('feedback-edited', {\n messageId,\n feedbackId\n });\n } else {\n const response = await fetch(`/API/ai-agent/messages/${messageId}/feedback`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({ rating: feedbackRate, content: feedbackText })\n });\n const data = await response.json();\n setFeedbackId(data.content.uuid);\n setFeedbackCreatedAt(new Date());\n eventHandler('feedback-created', {\n messageId,\n feedbackId: data.content.uuid\n });\n }\n setIsSubmitted(true);\n onFeedbackSubmitted();\n } catch (error) {\n console.error('Error submitting feedback:', error);\n }\n };\n\n const handleRateChange = e => {\n const rate = e.currentTarget.getAttribute('data-rate');\n setFeedbackRate(rate);\n };\n\n const resetStates = () => {\n setFeedbackText('');\n setFeedbackRate('0');\n setFeedbackId(null);\n setFeedbackCreatedAt(null);\n };\n\n const resetView = () => {\n setShowContextMenu(false);\n setIsSubmitted(false);\n };\n\n const handleFeedbackEdit = () => {\n resetView();\n };\n\n const handleFeedbackDelete = async () => {\n if (!feedbackId) {\n return;\n }\n\n await fetch(`/API/ai-agent/feedback/${feedbackId}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({ status: 'DELETED' })\n })\n .then(res => res.json())\n .then(res => {\n if (!res || !res.content) {\n return;\n }\n\n resetStates();\n resetView();\n onFeedbackSubmitted();\n eventHandler('feedback-deleted', {\n feedbackId,\n messageId\n });\n });\n };\n\n const getRatingText = (index, rate) => {\n if (!selectedRating) {\n if (index === 0) return 'Worst';\n if (index === emojis.length - 1) return 'Best';\n return '';\n }\n return selectedRating === rate ? ratings[index] : '';\n };\n\n const schemaOptions = {\n children: [\n {\n id: 'editFeedback',\n icon: IconPencilLineFilled,\n title: t('Edit Feedback'),\n onClick: handleFeedbackEdit\n },\n {\n id: 'deleteFeedback',\n icon: IconTrashFilled,\n title: t('Delete feedback'),\n onClick: handleFeedbackDelete,\n colorStyle: 'red'\n }\n ]\n };\n\n return (\n \n
\n \n \n {feedbackId ? (\n <>\n
\n \n
\n \n

{user?.name ?? user?.username ?? user?.email}

\n {feedbackCreatedAt && isSubmitted && {formatDate(feedbackCreatedAt)}}\n
\n \n ) : (\n
\n {t('Give feedback to train your agent')}\n
\n )}\n
\n {feedbackId && hasFeedbackPermission && (\n
\n setShowContextMenu(prevState => !prevState)}\n >\n \n \n {showContextMenu && (\n setShowContextMenu(false)}\n />\n )}\n
\n )}\n
\n \n {emojis.map((emoji, index) => {\n const rate = index + 1;\n const isRateChecked = Number(feedbackRate) === rate;\n return (\n \n {\n handleRateChange(e);\n setSelectedRating(rate);\n }}\n data-rate={rate.toString()}\n disabled={isSubmitted && !isRateChecked}\n startIcon={() => {\n return (\n \n \n \n );\n }}\n />\n {getRatingText(index, rate)}\n \n );\n })}\n \n {isSubmitted ? (\n {feedbackText}\n ) : (\n <>\n setFeedbackText(e.target.value)}\n />\n \n )}\n
\n {isSubmitted ? (\n
\n \n {t('Your feedback has been added.')}\n
\n ) : (\n \n \n \n \n )}\n \n );\n};\n\nGiveFeedback.propTypes = {\n onClose: PropTypes.func.isRequired,\n onFeedbackSubmitted: PropTypes.func.isRequired,\n messageId: PropTypes.string.isRequired,\n feedbackInfo: PropTypes.shape({\n feedbackText: PropTypes.string,\n feedbackRate: PropTypes.string,\n feedbackId: PropTypes.string\n }),\n user: PropTypes.shape({\n avatarUrl: PropTypes.string,\n name: PropTypes.string,\n username: PropTypes.string,\n email: PropTypes.string\n }),\n eventHandler: PropTypes.func,\n hasFeedbackPermission: PropTypes.bool\n};\n\nexport default GiveFeedback;\n","import { useRef, useEffect, useState } from 'react';\nimport { useDebounce } from '@jotforminc/hooks';\n\nexport const useOutsideClick = callback => {\n const ref = useRef(null);\n\n useEffect(() => {\n const handleClickOutside = event => {\n if (ref.current && !ref.current.contains(event.target)) {\n callback();\n }\n };\n\n document.addEventListener('mouseup', handleClickOutside);\n document.addEventListener('touchend', handleClickOutside);\n\n return () => {\n document.removeEventListener('mouseup', handleClickOutside);\n document.removeEventListener('touchend', handleClickOutside);\n };\n }, [callback]);\n\n return ref;\n};\n\nexport const useScrollIntoElement = () => {\n const element = useRef();\n\n const autoScrollCancelEvents = ['wheel', 'touchmove', 'mousedown'];\n\n const scrollIntoElement = () => {\n const container = document.querySelector('#chat-container');\n if (!element.current || !container) return;\n const containerTop = container.getBoundingClientRect().top;\n const elementTop = element.current.getBoundingClientRect().top;\n const top = elementTop - containerTop + container.scrollTop;\n\n container.scrollTo({ top, behavior: 'smooth' });\n };\n\n useEffect(() => {\n if (window.ResizeObserver) {\n const container = document.querySelector('#chat-container');\n const resizeObserver = new window.ResizeObserver(scrollIntoElement);\n resizeObserver.observe(element.current);\n const cancelObserver = () => element.current && resizeObserver.unobserve(element.current);\n autoScrollCancelEvents.map(event => container.addEventListener(event, cancelObserver));\n return () => {\n cancelObserver();\n autoScrollCancelEvents.map(event => container.removeEventListener(event, cancelObserver));\n };\n }\n scrollIntoElement();\n }, []);\n\n return element;\n};\n\nexport const useScrollDownButton = containerRef => {\n const SCROLL_THRESHOLD = 5;\n const [showScrollDownButton, setShowScrollDownButton] = useState();\n\n const handleScroll = useDebounce(e => {\n const container = e.target;\n setShowScrollDownButton(container.offsetHeight !== 0 && Math.abs(container.scrollHeight - container.offsetHeight - container.scrollTop) > SCROLL_THRESHOLD);\n }, 100);\n\n useEffect(() => {\n containerRef.current?.addEventListener('scroll', handleScroll);\n return () => containerRef.current?.removeEventListener('scroll', handleScroll);\n }, []);\n\n return showScrollDownButton;\n};\n\nexport const useViewTransition = state => {\n const [internalState, setInternalState] = useState(state);\n const isTransitioning = useRef(false);\n const resolveUpdate = useRef();\n\n if (\n document.startViewTransition\n && state !== internalState\n && !isTransitioning.current\n ) {\n isTransitioning.current = true;\n document.startViewTransition(() => {\n setInternalState(state);\n return new Promise(r => {\n resolveUpdate.current = r;\n });\n });\n }\n\n useEffect(() => {\n if (resolveUpdate.current) {\n resolveUpdate.current();\n resolveUpdate.current = undefined;\n isTransitioning.current = false;\n }\n }, [internalState]);\n\n return document.startViewTransition ? internalState : state;\n};\n","import { STEPWISE_WIDGETS } from '@jotforminc/constants';\nimport { getUrlParameter } from '@jotforminc/utils';\n\nexport const isStepQuestion = question => (getUrlParameter('aiWidget') === '1' && STEPWISE_WIDGETS.includes(question?.selectedField));\n\nexport const isStepMultipleChoice = (step = {}, question) => (isStepQuestion(question) && step?.nextComponent === 'MultipleChoice');\n","import React from 'react';\n\nconst DefaultErrorBoundaryFallback = () =>
An unexpected error has occurred.
;\n\nexport default DefaultErrorBoundaryFallback;\n","import React, { useCallback } from 'react';\nimport {\n func, oneOfType, arrayOf, node\n} from 'prop-types';\nimport { ErrorBoundary as ReactErrorBoundary } from 'react-error-boundary';\nimport Tracking from '@jotforminc/tracking';\nimport DefaultErrorBoundaryFallback from './DefaultErrorBoundaryFallback';\n\nconst ErrorBoundary = ({ fallback = DefaultErrorBoundaryFallback, children }) => {\n const handleError = useCallback((error, info) => {\n Tracking.captureException(error);\n console.log('error', error);\n console.log('error info', info);\n }, []);\n return (\n \n {children}\n \n );\n};\n\nErrorBoundary.propTypes = {\n fallback: func,\n children: oneOfType([arrayOf(node), node]).isRequired\n};\n\nexport default ErrorBoundary;\n","import { ElementType } from 'react';\nimport {\n // IconAiFilled as ai,\n IconXmarkSm as xmarksm,\n IconAngleDown as angle_down,\n IconAnnotationInfoFilled as annotation_info,\n IconLinkDiagonal as link_diagonal,\n IconAngleRightCircleFilled as angle_right_circle,\n IconArrowUpFromBracket as arrow_up_from_bracket,\n IconMessageQuestionFilled as message_question_filled,\n IconAngleLeft as angle_left,\n IconPlusSquareFilled as plus_square,\n IconTrashFilled as trash,\n IconPencilLineFilled as edit_icon,\n IconTrashExclamationFilled as trash_exclamation,\n IconCloudArrowUp as cloud_arrow_up,\n IconDocumentPdfFilled as document_pdf,\n IconDocumentDocFilled as document_doc,\n IconEllipsisVertical as ellipsis_vertical_icon,\n IconNotificationTextFilled as summary_icon,\n IconMagnifyingGlass as search_icon,\n IconArrowsFromCenter as arrows_from_center,\n IconMessagePlusFilled as message_plus,\n IconEyeFilled as eye_filled,\n IconExclamationCircleFilled as exclamation_circle_filled,\n IconGearFilled as gear_filled,\n IconPlusCircleFilled as plus_circle_filled,\n IconArrowUpRightFromSquareSm as link_new_tab,\n} from '@jotforminc/svg-icons';\n\nconst Icons: Record = {\n xmarksm,\n angle_down,\n annotation_info,\n link_diagonal,\n angle_right_circle,\n arrow_up_from_bracket,\n message_question_filled,\n angle_left,\n plus_square,\n trash,\n edit_icon,\n trash_exclamation,\n cloud_arrow_up,\n document_pdf,\n document_doc,\n ellipsis_vertical_icon,\n summary_icon,\n search_icon,\n arrows_from_center,\n message_plus,\n eye_filled,\n exclamation_circle_filled,\n gear_filled,\n plus_circle_filled,\n link_new_tab,\n};\n\nexport default Icons;\n","import React, { FC, CSSProperties } from 'react';\nimport Icons from '../assets/Icons';\n\ntype Props = {\n name: string,\n width?: string,\n height?: string,\n fill?: string,\n stroke?: string,\n className?: string,\n style?: CSSProperties\n};\n\nconst Icon: FC = ({\n name,\n width = '24',\n ...props\n}) => {\n if (Icons[name]) {\n const IconComp = Icons[name];\n return ;\n }\n\n // render empty svg on fallback\n return (\n \n \n \n );\n};\n\nexport default Icon;\n","import type { ActionComponentsType } from '../types';\n\nexport const ACTIONS_COMPONENTS: ActionComponentsType = {\n CAUSE: {\n selectLabel: 'WHEN',\n selectOptions: [\n { text: 'A condition', value: 'custom', disabled: true },\n { text: 'Conversation starts', value: 'conversation-start' },\n { text: 'User wants to', value: 'intention' },\n { text: 'User talks about', value: 'talks-about' },\n { text: 'User asks about', value: 'ask-about' },\n { text: 'User sentiment is', value: 'sentiment' },\n { text: 'User provides', value: 'provides' },\n { text: 'The sentence contains', value: 'sentence-contains' },\n ],\n components: {\n 'conversation-start': [],\n custom: [],\n intention: [\n { label: 'state', inputType: 'input', labelAs: 'User wants to' },\n ],\n sentiment: [\n { label: 'sentiment', inputType: 'input', labelAs: 'User sentiment is' },\n ],\n 'talks-about': [\n { label: 'about', inputType: 'input', labelAs: 'User talks about' },\n ],\n provides: [\n {\n label: 'provides',\n inputType: 'dropdown',\n options: [\n { text: 'a state', value: 'custom', disabled: true },\n { text: 'Their email', value: 'provides-email' },\n { text: 'Their full name', value: 'provides-full-name' },\n { text: 'Their phone', value: 'provides-phone' },\n ],\n labelAs: 'User provides',\n },\n ],\n 'ask-about': [\n { label: 'about', inputType: 'input', labelAs: 'User asks about' },\n ],\n 'sentence-contains': [\n { label: 'keyword', inputType: 'input', labelAs: 'The sentence contains' },\n ],\n '': [],\n },\n },\n TASK: {\n selectLabel: 'DO',\n selectOptions: [\n { text: 'An action', value: 'custom', disabled: true },\n { text: 'Fill form', value: 'fill-form' },\n { text: 'Show button', value: 'show-button' },\n { text: 'Say exact message', value: 'say-exact-message' },\n { text: 'Always include', value: 'always-include' },\n { text: 'Always talk about', value: 'always-talk-about' },\n { text: 'Talk about/mention', value: 'talk-about' },\n { text: \"Don't talk about/mention\", value: 'dont-talk-about' },\n ],\n components: {\n 'fill-form': [\n { label: 'form', inputType: 'form-picker', labelAs: 'FILL' },\n ],\n 'show-button': [\n {\n label: 'button',\n inputType: 'dropdown',\n options: [\n { text: 'Redirect to URL', value: 'redirect-url' },\n { text: 'Fill form', value: 'fill-form' },\n ],\n labelAs: 'SHOW BUTTON',\n },\n {\n label: 'multiple',\n inputType: 'multiple',\n inputs: {\n 'redirect-url': [\n { label: 'text', inputType: 'input', labelAs: 'SHOW BUTTON' },\n { label: 'url', inputType: 'input', labelAs: 'SHOW BUTTON' },\n ],\n 'fill-form': [\n { label: 'text', inputType: 'input', labelAs: 'SHOW BUTTON' },\n { label: 'form', inputType: 'form-picker', labelAs: 'SHOW BUTTON' },\n ],\n },\n labelAs: 'multiple',\n },\n ],\n 'say-exact-message': [\n { label: 'message', inputType: 'input', labelAs: 'SAY EXACTLY' },\n ],\n 'always-include': [\n { label: 'include', inputType: 'input', labelAs: 'INCLUDE' },\n ],\n 'always-talk-about': [\n { label: 'about', inputType: 'input', labelAs: 'ALWAYS MENTION' },\n ],\n 'talk-about': [\n { label: 'about', inputType: 'input', labelAs: 'MENTION' },\n ],\n 'dont-talk-about': [\n { label: 'about', inputType: 'input', labelAs: \"DON'T MENTION\" },\n ],\n custom: [],\n '': [],\n },\n },\n};\n","import { RequestLayer, ResponseInterceptor } from '@jotforminc/request-layer';\nimport { URL_REGEX } from '../app/constants';\nimport { Material } from '../types';\n\nconst getEmptyInputs = (input: string | object, type: string): string[] => {\n const emptyInputs: string[] = [];\n if (typeof input === 'string' && input.trim() === '') {\n emptyInputs.push(type.toLowerCase());\n }\n if (typeof input === 'object') {\n Object.entries(input).forEach(([key, element]) => {\n if (Object.values(element).length > 0 && element.value.trim() === '') {\n emptyInputs.push(key);\n }\n });\n }\n return emptyInputs;\n};\n\nexport const validateURL = (url: string): boolean => (URL_REGEX.test(url));\n\nexport const getNonValidInputs = (input: string | object, type = 'text'): string[] => {\n const nonValidInputs: string[] = [];\n if (type === 'url' && typeof input === 'string' && input.trim() !== '' && !validateURL(input)) {\n nonValidInputs.push('invalid-url');\n }\n nonValidInputs.push(...getEmptyInputs(input, type));\n return nonValidInputs;\n};\n\nexport const classNames = (arr: string[]): string => arr.flat().filter(Boolean).join(' ');\n\nexport const fuzzy = (pattern: string, text: string): number => {\n const m = pattern.length;\n const n = text.length;\n if (m === 1 && n === 1) return pattern === text ? 1 : 0;\n\n const arr = new Array(m);\n for (let i = 0; i <= m; i++) {\n arr[i] = new Array(n + 1).fill(0);\n arr[i][0] = i;\n }\n for (let j = 0; j <= n; j++) {\n arr[0][j] = j;\n }\n for (let i = 1; i < arr.length; i++) {\n for (let j = 1; j < arr[i].length; j++) {\n if (pattern.charAt(i - 1) === text.charAt(j - 1)) {\n arr[i][j] = arr[i - 1][j - 1];\n } else {\n arr[i][j] = 1 + Math.min(arr[i - 1][j - 1], arr[i][j - 1], arr[i - 1][j]);\n }\n }\n }\n\n return 1 - ((arr[m][n]) / Math.max(pattern.length, text.length));\n};\n\nexport const fuzzySearch = (pattern: string, text: string): number => {\n if (!pattern.length || !text) return 0;\n // Pre-processing\n const patternLowerCased = pattern.toLowerCase().trim();\n const textLowerCased = text.toLowerCase();\n const textWithoutPunctuations = textLowerCased.replace(/[!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~]/g, '');\n const tokens = textWithoutPunctuations.split(/\\s+/);\n const stopWords = [\n 'a', 'an', 'the', 'and', 'but', 'or', 'as', 'at', 'by', 'for', 'in', 'of',\n 'on', 'to', 'with', 'up', 'down', 'is', 'it', 'he', 'she', 'they', 'we',\n 'you', 'that', 'this', 'those', 'these', 'be', 'am', 'are', 'was', 'were',\n ];\n const filteredTokens = tokens.filter(token => !stopWords.includes(token));\n return filteredTokens.reduce((acc, token) => {\n /*\n Since Levenshtein Distance is used, we need to add more weight to substrs to prevent such cases:\n pattern: 'aa'\n text_1: 'bb' LD => 2\n text_2: 'aacc' LD => 2\n Even the LD values are the same, text_2 is more relevant.\n */\n let weight = 1;\n if (patternLowerCased.includes(patternLowerCased)) {\n weight = 2; // Can be fine-tuned\n }\n return acc + (weight * (fuzzy(patternLowerCased, token) / filteredTokens.length));\n }, 0);\n};\n\nconst safeHasOwnProperty = (obj: unknown, prop: string): boolean => (obj ? Object.prototype.hasOwnProperty.call(obj, prop) : false);\n\nconst responseNormalizer: ResponseInterceptor = ctx => {\n const { resp: { data = {} as any } = {} } = ctx || {};\n if (data.responseCode < 200 || data.responseCode > 299) {\n ctx.result = Promise.reject(data);\n return;\n }\n ctx.result = safeHasOwnProperty(data, 'content') ? data.content : data;\n};\n\nconst requestLayer = new RequestLayer('/API', {\n interceptorConfig: {\n customResponseInterceptors: [responseNormalizer],\n shouldCache: true,\n logCachePayload: {\n projectName: 'ai-agent-builder',\n },\n },\n});\n\nexport const getMaterialByID = (agentID: string, materialID: string): Promise => {\n return requestLayer.get(`ai-agent-builder/agents/${agentID}/materials/${materialID}`) as Promise;\n};\n\nexport const normalizeUrl = (url: string): string => {\n const regex = /^(http:\\/\\/|https:\\/\\/)/;\n return regex.test(url) ? url : `https://${url}`;\n};\n","import React, { FC, ReactElement } from 'react';\nimport { t } from '@jotforminc/translation';\nimport { Button } from '@jotforminc/magnet';\nimport { getBaseURL } from '@jotforminc/router-bridge';\nimport { classNames, handleCustomNavigation } from '@jotforminc/utils';\nimport get from 'lodash/get';\n\nimport type { Cause, Task } from '../../types';\n\nimport Icon from '../Icon';\n\nimport { ACTIONS_COMPONENTS } from '../../app/actionsConstants';\nimport { normalizeUrl } from '../../utils';\n\ntype Props = {\n causes: Cause[]\n tasks: Task[],\n link: string,\n useAppSelector?: any,\n selectResourceByResourceId?: any,\n ContextMenu?: () => ReactElement,\n isModalView?: boolean\n}\n\nconst LinkButton = ({ onClick, label }: { onClick: () => void, label: string }) => (\n }\n >\n {label}\n \n);\n\nconst normalizeCauseWording = (word: string, index: number) => (\n index > 0 ? word.replace('User', '').toLowerCase() : word\n);\n\nconst getConditionalCauses = (causes: Cause[], link: string) => {\n return (\n

\n {causes.map(({ type, value }, index) => (\n <>\n \n {' '}\n {t(index === 0 ? 'WHEN' : t(link === 'ANY' ? 'or' : 'and'))}\n \n {' '}\n {type === 'conversation-start'\n ? (normalizeCauseWording(t('Conversation starts'), index))\n : Object.entries(value).map(([, val]) => (\n `${normalizeCauseWording(t(get(ACTIONS_COMPONENTS.CAUSE.components[type][0], 'labelAs', '')), index)} ${val.toLowerCase()}`\n ))}\n \n ))}\n

\n );\n};\n\nconst ActionListItem: FC = ({\n causes,\n tasks,\n link,\n ContextMenu,\n useAppSelector,\n selectResourceByResourceId,\n isModalView = false,\n}) => {\n const FillFormValue = ({ formID }: { formID: string }): ReactElement => {\n const { title: formTitle } = (useAppSelector && selectResourceByResourceId)\n // eslint-disable-next-line react-hooks/rules-of-hooks\n ? useAppSelector(state => selectResourceByResourceId(state, formID) || { title: formID })\n : { title: formID };\n return (\n handleCustomNavigation(`${getBaseURL()}/${formID}`, '_blank', true)} label={formTitle} />\n );\n };\n\n const getValue = ({ type, value }: Task) => {\n if (type === 'show-button') {\n const url = value.button === 'fill-form' ? `${getBaseURL()}/${value.form}` : normalizeUrl(value.url);\n return handleCustomNavigation(url, '_blank', true)} label={value.text} />;\n }\n if (type === 'fill-form') {\n return ;\n }\n if (type === 'custom') {\n return value.custom;\n }\n\n // Show fallback value in case we delete a component from action constants.\n return Object.keys(ACTIONS_COMPONENTS.TASK.components).includes(type)\n ? get(value, get(ACTIONS_COMPONENTS, `TASK.components[${type}][0].label`), '')\n : Object.values(value).join(' - ');\n };\n\n const getTasks = () => {\n return (\n tasks.map(task => {\n // Show label as 'DO' in case we delete a component from action constants.\n const label = Object.keys(ACTIONS_COMPONENTS.TASK.components).includes(task.type)\n ? get(ACTIONS_COMPONENTS.TASK.components[task.type][0], 'labelAs', 'DO')\n : 'DO';\n\n return (\n

\n \n {t(label)}\n \n {' '}\n {getValue(task)}\n

\n );\n })\n );\n };\n\n return (\n
\n
\n
\n {getConditionalCauses(causes, link)}\n {getTasks()}\n
\n {ContextMenu && ()}\n
\n
\n );\n};\n\nexport default ActionListItem;\n","// TODO: color data can be merged into one\nexport const TRAIN_TYPES = {\n TEXT: {\n name: 'Knowledge',\n desc: 'Add information to train your AI.',\n icon: 'annotation_info',\n color: 'bg-green-500',\n borderColor: 'border-green-500',\n fillColor: 'fill-green-500',\n isPublic: true,\n iconClasName: 'p-1',\n },\n URL: {\n name: 'Link',\n desc: 'Enter a website URL or document link to train your agent.',\n icon: 'link_diagonal',\n color: 'bg-yellow-400',\n borderColor: 'border-yellow-400',\n fillColor: 'fill-yellow-400',\n isPublic: true,\n iconClasName: 'p-1',\n },\n DOCUMENT: {\n name: 'Document',\n desc: 'Upload your documents to train your agent.',\n icon: 'arrow_up_from_bracket',\n color: 'bg-blue-400',\n borderColor: 'border-blue-400',\n fillColor: 'fill-blue-400',\n isPublic: true,\n iconClasName: 'p-1',\n },\n QA: {\n name: 'Questions & Answer',\n desc: 'Enter questions that form fillers may ask and the answers.',\n icon: 'message_question_filled',\n color: 'bg-pdf-default',\n borderColor: 'border-pdf-default',\n fillColor: 'fill-pdf-default',\n isPublic: true,\n iconClasName: 'p-1',\n },\n};\n\nexport const FAILED_QUESTIONS_COUNT = [\n { name: 'For each question', value: 'EACH_QUESTION' },\n { name: 'Daily', value: 'DAILY' },\n { name: 'Weekly', value: 'WEEKLY' },\n { name: 'Monthly', value: 'MONTHLY' },\n];\n\nexport const MATERIAL_STATUS = {\n TEXT: {\n IN_PROGRESS: '...',\n PROCESSED: 'Agent trained',\n FAILED: 'Failed',\n ACTION_REQUIRED: 'Added',\n },\n QA: {\n IN_PROGRESS: '...',\n PROCESSED: 'Agent trained',\n FAILED: 'Failed',\n ACTION_REQUIRED: 'Added',\n },\n URL: {\n IN_PROGRESS: '...',\n STEP1: 'Agent is navigating through the URL...',\n STEP2: 'Agent is gathering insights from the URL...',\n STEP3: 'Agent is extracting content from the source...',\n PROCESSED: 'Agent trained',\n FAILED: 'Failed',\n ACTION_REQUIRED: 'Added',\n },\n DOCUMENT: {\n IN_PROGRESS: '...',\n STEP1: 'Agent is reading your document for details...',\n STEP2: 'Agent is extracting key information from the document...',\n STEP3: 'Agent is preparing the document for deeper understanding...\"',\n PROCESSED: 'Agent trained',\n FAILED: 'Failed',\n ACTION_REQUIRED: 'Added',\n },\n};\n\nexport const NORMALIZE_TIME_FORMATS: Record = {\n 'Y-m-d H:i:s': 'MMM D, YYYY',\n 'd-m-Y H:i:s': 'MMM D, YYYY',\n 'm-d-Y H:i:s': 'MMM D, YYYY',\n};\n\nexport const TASK_TIMEOUT_DURATION = '15';\n\nexport const URL_REGEX = /^(https?:\\/\\/)?([a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}(:[0-9]{1,5})?(\\/[^\\s]*)?$/i;\n\n/**\n * Because not everyone uses jotform.css, sometimes jotform.css classes won't have enough specificity to have an effect on the element\n *\n * In which case we need to write inline style\n */\nexport const JOTFORM_CSS_INLINE = {\n 'text-xs': {\n fontSize: '0.75rem',\n lineHeight: '1rem',\n },\n 'text-sm': {\n fontSize: '0.875rem',\n lineHeight: '1.125rem',\n },\n 'text-md': {\n fontSize: '1rem',\n lineHeight: '1.25rem',\n },\n};\n","import React, { createContext, FC, useContext } from 'react';\nimport {\n Material, MaterialStatus, materialTypes, setMaterialPayload,\n} from './types';\n\nexport type KnowledgeBaseContext = {\n materials: Material[]\n isLoadingMaterials?: boolean\n intialFilters?: {\n materialType: materialTypes\n materialStatus: MaterialStatus\n }\n timeOptions?: {\n timeZone?: string | null\n timeFormat?: string | null\n }\n classNames?: {\n infoBoxButtonClassName?: string\n }\n\n /** If you return a promise it will be used to handle the loading state */\n handleAdd?: (materialData: setMaterialPayload) => Promise | void\n /** If you return a promise it will be used to handle the loading state */\n handleEdit?: (materialID: string, updatedMaterialData: setMaterialPayload) => Promise | void\n handleBulkDelete?: (materialIDs: string[]) => Promise | void\n handleDelete?: (materialID: string) => Promise | void\n handleTrackEvent?: (params: { action: string, target: unknown }) => void\n}\n\nconst knowledgeBaseContext = createContext(undefined);\n\nexport const ContextProvider: FC = ({ children, ...rest }) => {\n return (\n \n {children}\n \n );\n};\n\nexport const useKnowledgeBaseContext = (): KnowledgeBaseContext => {\n const contextData = useContext(knowledgeBaseContext);\n\n if (!contextData) throw new Error('context is empty');\n\n return contextData;\n};\n","import React, { FC } from 'react';\n\ntype Props = {\n status: string\n}\n\nconst LineLoader: FC = ({\n status,\n}) => {\n const percentage: Record = {\n IN_PROGRESS: 'w-1/5',\n STEP1: 'w-2/5',\n STEP2: 'w-3/5',\n STEP3: 'w-4/5',\n PROCESSED: 'w-5/5',\n };\n\n return (\n
\n
\n
\n );\n};\n\nexport default LineLoader;\n","import React, { FC } from 'react';\nimport { Portal } from '@jotforminc/magnet';\nimport { ContextMenu } from '@jotforminc/context-menu';\nimport { t } from '@jotforminc/translation';\nimport Icon from '../Icon';\nimport '../../styles/contextMenu.scss';\n\ntype Props = {\n onOutsideClick: () => void,\n menuRef: React.MutableRefObject,\n showSummary: boolean,\n onActions: {\n onEdit: () => void,\n onDelete: () => void\n onSummary: () => void\n }\n}\n\nconst MaterialItemContextMenu: FC = ({\n onOutsideClick, menuRef, onActions: { onDelete, onSummary, onEdit }, showSummary,\n}) => {\n const schema = {\n children: [\n {\n id: 'edit',\n title: t('Edit'),\n icon: () => ,\n onClick: onEdit,\n },\n {\n id: 'summary',\n title: t('Summary'),\n icon: () => ,\n onClick: () => {\n onOutsideClick();\n onSummary();\n },\n isVisible: showSummary,\n },\n {\n id: 'delete',\n title: t('Delete'),\n icon: () => ,\n onClick: () => {\n onOutsideClick();\n onDelete();\n },\n },\n ],\n id: 'material context menu',\n };\n\n return (\n \n \n \n );\n};\n\nexport default MaterialItemContextMenu;\n","import React, { FC, useEffect } from 'react';\nimport {\n Button,\n Modal,\n ModalActions,\n ModalBody,\n ModalHeader,\n} from '@jotforminc/magnet';\nimport { t } from '@jotforminc/translation';\n\nimport { useSignal } from '@preact/signals-react';\nimport Icon from '../Icon';\nimport { Material } from '../../types';\nimport { getMaterialByID } from '../../utils';\n\nconst getTextBlock = (title: string, content: string, contentCustomClass: string): JSX.Element => (\n
\n

{t(title)}

\n
\n {content}\n
\n
\n);\n\nexport type MaterialSummaryProps = {\n isOpen: boolean\n onClose: () => void\n material: Material,\n icon: string,\n color: string,\n fillColor: string,\n materialTitle: string,\n materialURL: JSX.Element | null,\n materialContent: string\n}\n\nconst MaterialSummaryModal: FC = ({\n material,\n icon,\n color,\n fillColor,\n materialTitle,\n materialURL,\n materialContent,\n isOpen,\n onClose,\n}) => {\n const trainedData = useSignal('');\n\n const closeModal = () => {\n onClose();\n };\n\n useEffect(() => {\n if (!isOpen) return;\n getMaterialByID(material.agent_id, material.uuid)\n .then(materialWithTrainedData => { trainedData.value = materialWithTrainedData.trained_data; });\n }, [isOpen]);\n\n return (\n \n }\n onClose={closeModal}\n title={
{materialTitle}
}\n description={
{materialURL}
}\n />\n \n
\n {materialContent && getTextBlock('Summary', materialContent, 'max-h-16')}\n {getTextBlock('Content', trainedData.value || '', 'h-100 p-3 border border-navy-100 radius bg-navy-25')}\n
\n
\n \n
{/* Dummy div */}
\n \n
\n \n );\n};\n\nexport default MaterialSummaryModal;\n","import React, { FC } from 'react';\nimport {\n Button, Dialog, DialogActions, DialogBody, DialogCloseButton, DialogDescription, DialogIcon, DialogTitle,\n} from '@jotforminc/magnet';\nimport { t } from '@jotforminc/translation';\n\nimport Icon from '../Icon';\n\nexport type MaterialConfirmationProps = {\n onConfirm: () => void\n onClose: () => void\n isOpen: boolean\n}\n\nconst MaterialConfirmationModal: FC = ({ onConfirm, isOpen, onClose }) => {\n const closeModal = () => {\n onClose();\n };\n\n return (\n \n \n }\n />\n \n {t('Do you want to delete knowledge?')}\n \n \n {t('Once removed, the AI Agent will no longer have access to it.')}\n \n \n \n \n {t('No, Keep')}\n \n {\n onConfirm();\n closeModal();\n }}\n colorStyle=\"error\" variant=\"filled\"\n >\n {t('Yes, Delete')}\n \n \n \n \n );\n};\n\nexport default MaterialConfirmationModal;\n","/* eslint-disable complexity */\nimport React, { FC, useRef } from 'react';\nimport { Button } from '@jotforminc/magnet';\nimport get from 'lodash/get';\nimport { classNames, moment, safeJSONParse } from '@jotforminc/utils';\nimport { t, translationRenderer } from '@jotforminc/translation';\n\nimport { useSignal, useSignals } from '@preact/signals-react/runtime';\nimport { MATERIAL_STATUS, NORMALIZE_TIME_FORMATS, TRAIN_TYPES } from '../../app/constants';\nimport { useKnowledgeBaseContext } from '../../context';\n\nimport type { Material } from '../../types';\n\nimport Icon from '../Icon';\nimport LineLoader from '../LineLoader';\nimport MaterialItemContextMenu from './MaterialItemContextMenu';\nimport MaterialSummaryModal from '../modals/MaterialSummaryModal';\nimport MaterialConfirmationModal from '../modals/MaterialConfirmationModal';\n\ntype Props = {\n material: Material\n onEditClick?: (materialID: string) => void\n onDelete?: (materialID: string) => void,\n oneOnOneView?: boolean\n};\n\nconst getTitle = (props: Material): string => {\n const {\n type, title = '', data = '', name = '',\n } = props;\n\n if (type === 'QA') {\n return get(safeJSONParse(data), 'question', '');\n }\n\n return title || name;\n};\n\nconst getMaterialURL = (props: Material): JSX.Element | null => {\n const { type, meta } = props;\n const url = get(meta, type === 'URL' ? 'url' : 'filePath', '');\n\n return url\n ? (\n \n {meta?.fileName || url}\n \n )\n : null;\n};\n\nconst getMaterialContent = (material: Material): string => {\n const { type, data, meta } = material;\n if (['URL', 'DOCUMENT', 'TEXT'].includes(type)) {\n return get(meta, 'summary', data || '');\n }\n // QA\n return get(safeJSONParse(data), 'answer', '');\n};\n\nconst MaterialStatus = ({ status, materialStatus }: { status: string, materialStatus: string }) => (\n
\n \n
\n
\n {t(materialStatus)}\n
\n
\n);\n\nconst MaterialListItem: FC = ({\n material,\n onEditClick,\n onDelete,\n oneOnOneView = false,\n}) => {\n useSignals();\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const { timeOptions } = !oneOnOneView ? useKnowledgeBaseContext() : { timeOptions: { timeZone: 'America/New_York', timeFormat: 'Y-m-d' } };\n const isSummaryModalOpen = useSignal(false);\n const isMaterialConfirmationModalOpen = useSignal(false);\n const isContextMenuOpen = useSignal(false);\n const contextMenuBtnRef = useRef(null);\n const {\n uuid, type, status, created_at,\n } = material;\n\n const {\n color, fillColor, icon, name,\n } = get(TRAIN_TYPES, type, {\n color: 'bg-purple-400', icon: '', fillColor: 'fill-purple-400', name: '',\n });\n const convertedDate = moment.convertServerDateToUserTimezone(\n created_at || 'Invalid Date',\n timeOptions?.timeZone || 'America/New_York',\n get(NORMALIZE_TIME_FORMATS, timeOptions?.timeFormat || 'Y-m-d', 'lll'),\n );\n\n const materialStatus = MATERIAL_STATUS[type][status];\n const showSummary = !oneOnOneView && type !== 'QA' && status === 'PROCESSED';\n const materialURL = getMaterialURL(material);\n const materialTitle = getTitle({ ...material, name });\n const materialContent = getMaterialContent(material);\n\n const handleDeleteMaterialConfirm = () => {\n onDelete?.(uuid);\n };\n\n const handleEditMaterialClick = () => {\n onEditClick?.(uuid);\n };\n\n const openMaterialSummary = () => {\n isSummaryModalOpen.value = true;\n };\n const closeMaterialSummary = () => {\n isSummaryModalOpen.value = false;\n };\n\n const openMaterialDeleteConfirmation = () => {\n isMaterialConfirmationModalOpen.value = true;\n };\n const closeMaterialDeleteConfirmation = () => {\n isMaterialConfirmationModalOpen.value = false;\n };\n\n const openContextMenu = () => {\n isContextMenuOpen.value = true;\n };\n const closeContextMenu = () => {\n isContextMenuOpen.value = false;\n };\n\n return (\n \n \n \n
\n
\n
\n
\n \n
\n
\n
\n {materialTitle}\n
\n {(type === 'DOCUMENT' || type === 'URL') && (\n
\n {materialURL}\n
\n )}\n
\n
\n {showSummary && (\n }\n onClick={openMaterialSummary}\n />\n )}\n
\n {(status === 'ACTION_REQUIRED' || materialContent) && (\n \n {status === 'ACTION_REQUIRED'\n ? (\n
\n \n {t('Answer needed.')}\n
\n )\n : materialContent}\n
\n )}\n
\n {!oneOnOneView && ['PROCESSED', 'FAILED', 'ACTION_REQUIRED'].includes(status) ? (\n
\n
\n {translationRenderer(`${materialStatus ? `${materialStatus} on ` : ''}[1[${convertedDate}]]`)({\n renderer1: (str: string) => str,\n })}\n
\n
\n }\n onClick={openContextMenu}\n />\n {isContextMenuOpen.value && (\n \n )}\n
\n
\n ) : (\n !oneOnOneView && \n )}\n
\n );\n};\n\nexport default MaterialListItem;\n","import React from 'react';\nimport { string, shape } from 'prop-types';\nimport { ActionListItem, MaterialListItem } from '@jotforminc/agent-builder-components';\nimport { safeJSONParse } from '@jotforminc/utils';\nimport { IconCheckSquareFilled } from '@jotforminc/svg-icons';\nimport { translationRenderer } from '@jotforminc/translation';\n\nconst GetTaskMessage = ({ type, action }) => {\n if (['ACTION', 'KNOWLEDGE BASE', 'QA', 'URL'].includes(type) && ['add', 'edit'].includes(action)) {\n return (\n \n \n {action === 'edit'\n ? translationRenderer('[1[taskType]] updated')({\n renderer1: () => (type === 'ACTION' ? 'Action' : 'Knowledge')\n })\n : translationRenderer('New [1[taskType]] added')({\n renderer1: () => (type === 'ACTION' ? 'action' : 'knowledge')\n })}\n \n );\n }\n return null;\n};\n\nconst GetTaskContent = ({ type, action, data }) => {\n if (!['add', 'edit'].includes(action)) {\n return null;\n }\n if (type === 'ACTION' && data.causes && data.tasks) {\n return (\n \n );\n }\n if (['KNOWLEDGE BASE', 'QA', 'URL'].includes(type)) {\n return (\n null,\n onDelete: () => null,\n oneOnOneView: true\n }}\n />\n );\n }\n return null;\n};\n\nconst OneOnOneProperty = ({ type, action, data }) => {\n return (\n <>\n \n \n \n );\n};\n\nOneOnOneProperty.propTypes = {\n type: string.isRequired,\n action: string.isRequired,\n data: shape({}).isRequired\n};\n\nGetTaskMessage.propTypes = {\n type: string.isRequired,\n action: string.isRequired\n};\n\nGetTaskContent.propTypes = {\n type: string.isRequired,\n action: string.isRequired,\n data: shape({}).isRequired\n};\n\nexport default OneOnOneProperty;\n","/* eslint-disable complexity */\nimport React, { useMemo, useState, forwardRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Flex } from '@jotforminc/magnet';\nimport { getUrlParameter } from '@jotforminc/utils';\nimport {\n oneOf,\n string,\n any,\n shape,\n bool,\n func,\n number,\n oneOfType\n} from 'prop-types';\nimport classNames from 'classnames';\nimport { isAutoSkipQuestion, sanitizeMessage } from '@jotforminc/agent-utils';\nimport { WIDGETS, SUPPORTED_PAYMENT_FIELDS } from '@jotforminc/constants';\nimport { IconMessageFilled } from '@jotforminc/svg-icons';\nimport { usePopper } from 'react-popper';\nimport { t } from '@jotforminc/translation';\nimport { Avatar } from './Avatar';\nimport {\n Generic, Signature, Paragraph, ScaleRating, StarRating, Submit, Upload, Image, MultipleChoice, Appointment, Widget, Matrix, ImageChoice, YesNo,\n ImageUploadPreview, TakePhoto, ProductList, TermsAndCondition, PDFEmbedder, Review\n} from './questions';\nimport ChatActionView from './ChatActionView';\nimport Inline from './questions/Inline';\nimport GiveFeedback from './GiveFeedback';\nimport { useOutsideClick } from '../hooks';\nimport { formatDate, isOneOone } from '../utils';\nimport { isStepMultipleChoice, isStepQuestion } from '../utils/stepUtils';\nimport { TYPE_DURATION_PER_CHARACTER } from '../constants';\nimport ErrorBoundary from './ErrorBoundary';\nimport OneOnOneProperty from './OneOnOneProperty';\n\nconst MessageView = forwardRef(({\n avatarURL,\n answer,\n from = 'ai',\n message = null,\n question = {},\n viewMode = false,\n isQuickActionFirstMsg = false,\n isActive = false,\n inProgress = false,\n setAnswer = f => f,\n children = null,\n setChatMode = f => f,\n formID,\n action = {},\n messageID = '',\n logCommonAction = f => f,\n isContinueChat = false,\n typing,\n agentBackgroundStart,\n agentBackgroundEnd,\n onTypingEnd,\n chatId,\n agentId,\n shouldShowFeedback,\n user,\n feedbackInfo,\n step = {},\n createdAt,\n onFeedbackSubmitted,\n eventHandler,\n hasFeedbackPermission = false,\n formURL,\n setSubmitInprogress,\n submitinprogress,\n setSubmitErrored,\n chatCompleted,\n answerCurrentQuestion,\n oneOnOneProperty,\n isTypingDone\n}, ref) => {\n const sanitizedMessage = message && from !== 'ai' ? sanitizeMessage(message) : message;\n const [isPopoverOpen, setIsPopoverOpen] = useState(false);\n const [referenceElement, setReferenceElement] = useState(null);\n const [popperElement, setPopperElement] = useState(null);\n const { styles, attributes } = usePopper(referenceElement, popperElement, {\n placement: 'bottom-start'\n });\n\n const handlePopoverClose = () => {\n setIsPopoverOpen(false);\n eventHandler('feedback-closed', {\n messageId: messageID,\n chatId,\n agentId,\n formID\n });\n };\n\n const feedbackRef = useOutsideClick(handlePopoverClose);\n\n const handlePopoverOpen = () => {\n if (isPopoverOpen) {\n return;\n }\n\n setIsPopoverOpen(true);\n eventHandler('feedback-opened', {\n messageId: messageID,\n chatId,\n agentId,\n formID\n });\n };\n\n const feedbackComponent = useMemo(() => {\n return isPopoverOpen && createPortal(\n \n
\n \n
\n
, document.body);\n }, [isPopoverOpen, styles, attributes, messageID, agentId, chatId]);\n\n const QuestionComponent = useMemo(() => {\n switch (true) {\n case question.type === 'control_yesno':\n return YesNo;\n case question.type === 'control_checkbox':\n case question.type === 'control_radio':\n case question.type === 'control_dropdown':\n case isStepMultipleChoice(step, question):\n return MultipleChoice;\n case question.type === 'control_imagechoice':\n return ImageChoice;\n case question.type === 'control_matrix':\n return Matrix;\n case question.type === 'control_rating':\n return StarRating;\n case question.type === 'control_scale':\n return ScaleRating;\n case question.type === 'control_submit' && from === 'ai':\n return Submit;\n case question.type === 'control_signature' || question.selectedField === WIDGETS.SmoothSignature:\n return Signature;\n case question.type === 'control_fileupload':\n return Upload;\n case question.type === 'control_widget' && question.selectedField === WIDGETS.ImageUploadPreview:\n return ImageUploadPreview;\n case question.type === 'control_widget' && question.selectedField === WIDGETS.PDFEmbedder:\n return PDFEmbedder;\n case question.type === 'control_widget' && question.selectedField === WIDGETS.TakePhoto:\n return TakePhoto;\n case question.type === 'control_widget' && (question.selectedField === WIDGETS.TermsAndCondition || question.selectedField === WIDGETS.ShortScrollableTerms):\n return TermsAndCondition;\n case question.type === 'control_appointment' && !getUrlParameter('newAppointmentConversation'):\n return Appointment;\n case question.type === 'control_inline':\n return Inline;\n case question.type === 'control_widget' && !isStepQuestion(question):\n return Widget;\n case question.type === 'control_image':\n return Image;\n case question.type === 'control_text':\n return Paragraph;\n case question.type === 'control_review':\n return Review;\n case SUPPORTED_PAYMENT_FIELDS.includes(question.type):\n return ProductList;\n default:\n return null;\n }\n }, [question, from]);\n\n const typingDuration = useMemo(() => (sanitizedMessage ? ((sanitizedMessage.length * (TYPE_DURATION_PER_CHARACTER + 1)) / 1000) : (1 / 20)), [sanitizedMessage]);\n const showQuestionComponent = from === 'ai' && (isQuickActionFirstMsg || isAutoSkipQuestion(question)) && QuestionComponent;\n const showActionView = action && action.data;\n const showOneOnOneProperties = isOneOone() && oneOnOneProperty && Object.values(oneOnOneProperty).filter(a => a).length === 3;\n\n return (\n \n \n
\n {createdAt && message && formatDate(createdAt)}\n
\n {hasFeedbackPermission && shouldShowFeedback && from === 'ai' ? (\n \n {feedbackInfo ? (\n <>\n 1\n {t('Feedback')}\n \n ) : (\n <>\n \n {t('Give Feedback')}\n \n )}\n \n ) : (\n feedbackInfo && (\n \n 1\n {t('Feedback')}\n \n )\n )}\n {feedbackComponent}\n \n \n {from === 'ai' && (\n \n )}\n
\n {sanitizedMessage && (\n <>\n \n {showOneOnOneProperties && (\n <>\n
\n \n \n )}\n \n )}\n {(showQuestionComponent || showActionView) && (\n \n {(showQuestionComponent) && (\n \n \n \n )}\n {showActionView && (\n \n {action.data.text || ''}\n \n )}\n
\n )}\n {children}\n
\n
\n \n );\n});\n\nMessageView.propTypes = {\n from: oneOf(['ai', 'user']),\n question: shape({}),\n message: string,\n viewMode: bool,\n isQuickActionFirstMsg: bool,\n avatarURL: string.isRequired,\n isActive: bool,\n inProgress: bool,\n setAnswer: func,\n answer: any,\n children: any,\n setChatMode: func,\n formID: oneOfType([string, number]).isRequired,\n action: shape({}),\n messageID: string,\n logCommonAction: func,\n isContinueChat: bool,\n typing: bool,\n agentBackgroundStart: string,\n agentBackgroundEnd: string,\n chatId: string,\n agentId: string,\n onTypingEnd: func,\n shouldShowFeedback: bool,\n feedbackInfo: shape({}),\n user: shape({}),\n step: shape({}),\n createdAt: string,\n onFeedbackSubmitted: func,\n eventHandler: func,\n hasFeedbackPermission: bool,\n formURL: string,\n setSubmitInprogress: func,\n submitinprogress: bool,\n setSubmitErrored: func,\n chatCompleted: bool,\n answerCurrentQuestion: func,\n oneOnOneProperty: shape({}),\n isTypingDone: bool\n};\n\nexport default MessageView;\n","import React from 'react';\nimport { string } from 'prop-types';\n\nconst FormHeader = ({\n logoClass, titleClass = '', formLogo, formTitle = 'Form'\n}) => {\n return (\n <>\n {formLogo && \"logo\"}\n

{formTitle}

\n \n );\n};\n\nFormHeader.propTypes = {\n logoClass: string.isRequired,\n titleClass: string,\n formLogo: string.isRequired,\n formTitle: string\n};\n\nexport default FormHeader;\n","import React, { useRef, useEffect } from 'react';\nimport { Flex } from '@jotforminc/magnet';\nimport {\n bool, number, oneOfType, shape, string, func\n} from 'prop-types';\nimport { VerticalScrollShadow } from '@jotforminc/agent-utils';\nimport MessageList from './MessageList';\nimport MessageView from './MessageView';\nimport FormHeader from './FormHeader';\n\nconst History = ({\n messageList,\n formLogo,\n formTitle = 'Form',\n formID,\n disableVerticalScrollShadow = false,\n styles,\n chatId = null,\n agentId = null,\n shouldShowFeedback = false,\n user,\n hasFeedbackPermission = false,\n eventHandler = () => {}\n}) => {\n const messageContainerRef = useRef();\n if (!disableVerticalScrollShadow) {\n useEffect(() => {\n const content = new VerticalScrollShadow({\n target: '#chat-container',\n shadowColor: 'rgba(0,0,0,.08)',\n shadowHeight: 32\n });\n content.init();\n }, []);\n }\n const {\n pageBackgroundStart = '#DADEF3',\n pageBackgroundEnd = '#DADEF3',\n chatBackground = '#ffffff',\n inputBackground = '#F3F3FE',\n inputTextColor = '#0a1551',\n sendButtonBackground = '#0a1551',\n sendButtonIconColor = '#ffffff',\n agentBackgroundStart = '#C8CEED',\n agentBackgroundEnd = '#C8CEED',\n fontFamily = 'inter, sans-serif'\n } = styles || {};\n\n return (\n <>\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nHistory.propTypes = {\n messageList: shape.isRequired,\n formLogo: string.isRequired,\n formTitle: string,\n formID: oneOfType([string, number]).isRequired,\n disableVerticalScrollShadow: bool,\n styles: shape({}),\n chatId: string,\n agentId: string,\n shouldShowFeedback: bool,\n user: shape({}),\n eventHandler: func,\n hasFeedbackPermission: bool\n};\n\nexport default History;\n","/* eslint-disable no-param-reassign */\n/* eslint-disable no-eval */\n/* eslint-disable no-unused-vars */\nimport {\n any, bool, func, number, oneOfType, shape, string\n} from 'prop-types';\nimport Fields from '@jotforminc/form-fields';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { safeJSONParse } from '@jotforminc/utils';\nimport { useDebounce } from '@jotforminc/hooks';\nimport WarningBox from '@jotforminc/warning-box';\nimport {\n handleFITBFields, setCalendar, displayLocalTime, calendarClose, formatDate, getFITBValues, populateFITBValues, validateFITBInputs, runReplaceTags\n} from '@jotforminc/agent-utils';\nimport classnames from 'classnames';\nimport '../../styles/inline.scss';\n\nconst inputElements = ['select', 'input'];\n\nconst Inline = ({\n question: _question, setAnswer, answer, viewMode, isActive, inProgress\n}) => {\n const form = useRef();\n const [errorMessage, setErrorMessage] = useState(null);\n const _answer = typeof answer === 'object' ? answer : safeJSONParse(answer, {});\n const question = { ..._question, fields: safeJSONParse(_question.fields, {}, true) };\n const fieldProps = Object.fromEntries(Object.entries(question).map(([key, value]) => [key, { value: value }]));\n\n const qid = `input_${question.qid}`;\n const id = `id_${question.qid}`;\n const qname = `q${question.qid}_${question.name}`;\n\n const allProps = {\n ...fieldProps,\n qid: { value: qid },\n id: { value: question.qid },\n qname: { value: qname },\n passive: viewMode,\n // cdnconfig: { CDN: 'https://cdn.jotfor.ms/' },\n themeVersion: 'v2',\n handleBlotSelect: null,\n onTextEditorFocus: null\n };\n\n useEffect(() => {\n window.JotForm = window.JotForm || {\n runAllCalculations: f => f, corrected: f => f, runConditionForId: f => f, server: '/server.php'\n };\n\n window.JotForm.handleIFrameHeight = f => f;\n window.JotForm.errored = f => f;\n window.JotForm.setCalendar = setCalendar;\n window.JotForm.calendarClose = calendarClose;\n window.JotForm.displayLocalTime = displayLocalTime;\n window.JotForm.formatDate = formatDate;\n\n if (!viewMode) {\n runReplaceTags([question]);\n }\n }, []);\n\n useEffect(() => {\n if (!_answer?.data) return;\n populateFITBValues(question, _answer.data);\n }, []);\n\n const handleChange = useDebounce(() => {\n if (!viewMode) {\n runReplaceTags([question]);\n }\n const formData = Array.from(new FormData(form.current)).map(([name, value]) => ({ name, value }));\n const error = validateFITBInputs(form.current);\n setAnswer(!error ? getFITBValues(formData, question.qid) : null);\n setErrorMessage(error);\n });\n\n const eventHandlers = (listener = 'addEventListener') => {\n if (!form.current) return;\n form.current.querySelectorAll(inputElements.join(', ')).forEach(inputEl => inputEl[listener]('change', handleChange));\n };\n\n useEffect(() => {\n eventHandlers();\n return () => eventHandlers('removeEventListener');\n }, [setAnswer]);\n\n useEffect(() => {\n if (!viewMode) {\n eval(Fields.Inline.getScript(allProps));\n handleFITBFields();\n }\n }, [viewMode]);\n\n return (\n
\n
    \n
  • \n \n {errorMessage && (\n \n {errorMessage}\n \n )}\n
  • \n
\n
\n );\n};\n\nInline.propTypes = {\n question: shape({}).isRequired,\n setAnswer: func.isRequired,\n answer: any.isRequired,\n viewMode: bool.isRequired,\n formID: oneOfType([string, number]).isRequired,\n isActive: bool.isRequired,\n inProgress: bool.isRequired\n};\n\nexport default Inline;\n","/* eslint-disable no-eval */\nimport React, { useEffect, useRef } from 'react';\nimport { safeJSONParse } from '@jotforminc/utils';\nimport { isNextButtonEnabled } from '@jotforminc/agent-utils';\nimport Fields from '@jotforminc/form-fields';\nimport { initWidgetsBuilder } from '@jotforminc/widgets-js-sdk';\nimport {\n any, bool, func, number, oneOfType, shape, string\n} from 'prop-types';\nimport { useEventListener, useDebounce } from '@jotforminc/hooks';\n\ninitWidgetsBuilder();\n\nconst parseProps = {\n widgetTabs: []\n};\n\nconst defaultQuestionProps = {\n settingNamesCSS: '',\n widgetType: '',\n cfname: ''\n};\n\nconst ANSWER_RECIVE_THRESHOLD = 1500;\n\nconst Widget = ({\n question, viewMode, setAnswer, answer, formID\n}) => {\n const widgetLoadTime = useRef(0);\n const { qid } = question;\n const questionProps = Object.fromEntries(Object.entries({ ...defaultQuestionProps, ...question }).map(([key, value]) => {\n return [key, { value: parseProps[key] && typeof value === 'string' ? safeJSONParse(value, parseProps[key]) : value }];\n }));\n\n const allProps = {\n ...questionProps,\n defaultValue: { value: answer },\n qid: { value: `input_${qid}` },\n id: { value: qid },\n formID,\n qname: { value: `q${qid}_${question.name}` },\n cdnconfig: { CDN: 'https://cdn.jotfor.ms/' },\n passive: viewMode,\n agentWidget: true,\n themeVersion: 'v2'\n };\n\n useEffect(() => {\n if (!viewMode) {\n eval(Fields.Widget.getEmbeddedScript(allProps));\n }\n }, []);\n\n const getTime = () => (new Date()).getTime();\n\n useEffect(() => {\n const onWidgetLoad = () => {\n widgetLoadTime.current = getTime();\n };\n const widgetEl = document.querySelector(`#customFieldFrame_${qid}`);\n if (!widgetEl) return;\n widgetEl.addEventListener('load', onWidgetLoad);\n return () => {\n widgetEl.removeEventListener('load', onWidgetLoad);\n };\n }, []);\n\n const handleAnswerWithDebounce = useDebounce(_answer => {\n if (getTime() - widgetLoadTime.current < ANSWER_RECIVE_THRESHOLD) {\n return;\n }\n setAnswer(_answer);\n });\n\n useEventListener('message', ({ data }) => {\n const { type, value, qid: widgetQid } = safeJSONParse(data, {});\n if (qid !== widgetQid || !value) {\n return;\n }\n switch (type) {\n case 'data':\n if (isNextButtonEnabled(question)) {\n setAnswer(value);\n } else {\n handleAnswerWithDebounce(value);\n }\n break;\n default:\n break;\n }\n });\n\n return (\n
\n \n
\n );\n};\n\nWidget.propTypes = {\n question: shape({}).isRequired,\n viewMode: bool.isRequired,\n setAnswer: func,\n answer: any.isRequired,\n formID: oneOfType([string, number]).isRequired\n};\n\nWidget.defaultProps = {\n setAnswer: f => f\n};\n\nexport default Widget;\n","/* eslint-disable no-restricted-globals */\n/* eslint-disable no-useless-escape */\n/* eslint-disable no-control-regex */\n/* eslint-disable max-len */\n/* eslint-disable no-new */\n/* eslint-disable no-param-reassign */\n/* eslint-disable complexity */\n\nimport { FORM_TEXTS } from '@jotforminc/constants';\n\nexport const getInputValidations = input => {\n if (input) {\n return input.className.replace(/.*validate\\[(.*)\\].*/, '$1').split(/\\s*,\\s*/);\n }\n return [];\n};\n\nexport const isRadioOrCheckboxIsFilled = input => {\n const e = input;\n let baseName = e.name;\n const inputType = e.readAttribute('type');\n if (inputType === 'checkbox') {\n const fieldId = e.name.replace(/(^.*\\[|\\].*$)/g, '').split('-')[0];\n const TIMESTAMP_OF_2019 = 1546300000000;\n const isNewIDType = isNaN(fieldId) || Number(fieldId) < TIMESTAMP_OF_2019; // old: 1546312345678-firstname / new: firstname-12\n baseName = isNewIDType ? e.name.substr(e.name.indexOf('-')) : e.name.substr(0, e.name.indexOf('-'));\n }\n const groupedCheckboxes = e.parentNode.parentNode.querySelectorAll(`*[name*=\"${baseName}\"]`);\n let hasChecked = false;\n groupedCheckboxes.forEach(chk => {\n hasChecked = chk.checked || hasChecked;\n });\n return hasChecked;\n};\n\nexport const isDateInvalidFormat = input => {\n if (input.hasClassName('invalidDate')) {\n const format = input.readAttribute('placeholder');\n return FORM_TEXTS.dateInvalid.replace('{format}', format);\n }\n};\n\nexport const isEntryLimitsValid = input => {\n const minVal = parseInt(input.readAttribute('data-minlength'), 10);\n const maxVal = parseInt(input.readAttribute('maxlength'), 10) || Infinity;\n if (input.value.length < minVal) {\n return `${FORM_TEXTS.minCharactersError} ${minVal}`;\n }\n if (input.value.length > maxVal) {\n return `${FORM_TEXTS.maxCharactersError} ${maxVal}`;\n }\n};\n\nexport const validateInput = input => {\n const reg = {\n email: /^(?:[\\a-zA-Z0-9!#$%&'*+\\/=?^_`{|}~-]+(?:\\.[\\a-zA-Z0-9!#$%&'*+\\/=?^_`{|}~-]+)*|\"(?:[\\s\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\\.)+[a-zA-Z](?:[a-zA-Z0-9-]*[a-zA-Z0-9]){1,}|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-zA-Z0-9-]*[a-zA-Z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])$/,\n alphanumeric: /^[\\u00C0-\\u1FFF\\u2C00-\\uD7FFa-zA-Z0-9\\s]+$/,\n numeric: /^(-?\\d+[\\.\\,]?)+$/,\n numericDotStart: /^([\\.]\\d+)+$/, // accept numbers starting with dot\n currency: /^-?[\\$\\£\\€\\₺]?\\d*,?\\d*,?\\d*(\\.\\d\\d)?¥?$/,\n alphabetic: /^[\\u00C0-\\u1FFF\\u2C00-\\uD7FFa-zA-Z\\s]+$/,\n cyrillic: /^[абвгдеёжзийклмнопрстуфхцчшщьыъэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ\\s]*$/\n };\n const validations = getInputValidations(input);\n\n const isValueEmpty = !input.value || (input.tagName === 'SELECT' && input.value === 'Please Select') || (['checkbox', 'radio'].includes(input.type) && !isRadioOrCheckboxIsFilled(input));\n\n if (isValueEmpty && !validations.includes('required')) {\n return '';\n }\n\n switch (validations[0]) {\n case 'required':\n if (isValueEmpty) {\n return FORM_TEXTS.required;\n }\n break;\n case 'minCharLimit':\n const entryLimitErrStr = isEntryLimitsValid(input);\n if (entryLimitErrStr) {\n return entryLimitErrStr;\n }\n break;\n case 'validateLiteDate':\n const dateFormatErrStr = isDateInvalidFormat(input);\n if (dateFormatErrStr) {\n return dateFormatErrStr;\n }\n break;\n case 'Email':\n input.value = input.value.replace(/^\\s+|\\s+$/g, '');\n // before email validation convert IDN names into ASCII\n const { value } = input;\n if (!reg.email.test(value)) {\n return FORM_TEXTS.email;\n }\n break;\n case 'Alphabetic':\n if (!reg.alphabetic.test(input.value)) {\n return FORM_TEXTS.alphabetic;\n }\n break;\n case 'Numeric':\n if (!reg.numeric.test(input.value) && !reg.numericDotStart.test(input.value)) {\n return FORM_TEXTS.numeric;\n }\n break;\n case 'Alphanumeric':\n case 'AlphaNumeric':\n if (!reg.alphanumeric.test(input.value)) {\n return FORM_TEXTS.alphanumeric;\n }\n break;\n case 'Cyrillic':\n if (!reg.cyrillic.test(input.value)) {\n return FORM_TEXTS.cyrillic;\n }\n break;\n case 'Url':\n case 'URL': // We are using URL instead of Url on some components validation, I don't want to change directly Url to URL because it can be break somewhere.\n try {\n let checkUrlValue = input.value;\n if (input.value.startsWith('www.')) {\n checkUrlValue = `https://${input.value}`;\n }\n new URL(checkUrlValue);\n } catch (error) {\n return FORM_TEXTS.url;\n }\n break;\n case 'Currency':\n if (input.up('.form-matrix-table')) {\n if (input.up('.form-matrix-table').select('input').collect(inp => { return !reg.currency.test(inp.value); }).any()) {\n return FORM_TEXTS.currency;\n }\n\n return '';\n }\n if (!reg.currency.test(input.value)) {\n return FORM_TEXTS.currency;\n }\n\n break;\n case 'Fill Mask':\n if (input.dataset.masked === 'true' && !(input && input.inputmask && input.inputmask.isComplete())) {\n return FORM_TEXTS.fillMask;\n }\n break;\n\n default:\n // throw (\"This validation is not valid (\" + vals[0] + \")\");\n }\n return '';\n};\n\nexport const validateFITBInputs = formEl => {\n const validatedFitbInputs = formEl.querySelectorAll('input[class*=\"validate\"],select[class*=\"validate\"]');\n const error = Array.from(validatedFitbInputs).map(input => ({ input, validation: validateInput(input) })).find(({ validation }) => !!validation);\n validatedFitbInputs.forEach(input => input.classList.remove('form-validation-error'));\n if (error) {\n error.input.classList.add('form-validation-error');\n return error.validation;\n }\n return null;\n};\n","/* eslint-disable */\nexport const isInputVisible = element => {\n if (typeof element === 'string') {\n element = document.getElementById(element);\n }\n if (!element || !element.parentNode) {\n return false;\n }\n\n if (element.classList.contains('always-hidden')) {\n return false;\n }\n\n if (element && element.tagName === 'BODY') {\n return true;\n }\n\n // exception for rich text editor because element is never visible\n if (element.classList.contains('form-textarea') && element.parentNode.querySelector('.nicEdit-main')\n && (element.closest('.form-line') && isInputVisible(element.closest('.form-line')))) {\n return true;\n }\n\n if (element.style.display === 'none' || element.style.visibility === 'hidden' || element.classList.contains('js-non-displayed-page')) {\n return false;\n }\n\n return isInputVisible(element.parentNode);\n};\n\nexport const addZeros = (n, totalDigits) => {\n n = n.toString();\n var pd = '';\n if (totalDigits > n.length) {\n for (let i = 0; i < (totalDigits - n.length); i++) {\n pd += '0';\n }\n }\n return pd + n.toString();\n};\n\nexport const handleFITBFields = () => {\n function getInputWidth(fitbInput) {\n var width = 0;\n var textElement = document.createElement('span');\n var fitbFontSize = global.getComputedStyle(fitbInput, null).getPropertyValue('font-size') || '15' + 'px';\n var fitbFontFamily = global.getComputedStyle(fitbInput, null).getPropertyValue('font-family') || 'sans-serif';\n\n textElement.innerText = fitbInput.value || fitbInput.parentNode.querySelector('label').innerText;\n textElement.style.cssText = `position: absolute; text-wrap: nowrap; white-space: pre; font-size:${fitbFontSize}; font-family:${fitbFontFamily}; display: inline-block;`;\n fitbInput.parentNode.appendChild(textElement);\n width = textElement.offsetWidth;\n fitbInput.parentNode.removeChild(textElement);\n\n return width;\n }\n\n function getContWidth(fitbInput) {\n return fitbInput.parentNode.parentNode.offsetWidth;\n }\n\n // auto width calculation\n var visibleFitbInputs = Array.from(document.querySelectorAll('.FITB input:not([type=\"checkbox\"]):not([type=\"radio\"])')).filter(isInputVisible);\n if (visibleFitbInputs && visibleFitbInputs.length > 0) {\n Array.from(visibleFitbInputs).forEach(fitbInput => {\n var contWidth = getContWidth(fitbInput);\n var initWidth = getInputWidth(fitbInput) + 8;\n\n fitbInput.style.width = `${initWidth}px`;\n\n if (contWidth) {\n fitbInput.style.maxWidth = `${contWidth}px`;\n }\n\n fitbInput.addEventListener('input', () => {\n if (fitbInput.offsetWidth < getContWidth(fitbInput)) {\n fitbInput.style.width = `${Math.max(getInputWidth(fitbInput) + 4, initWidth)}px`;\n }\n\n if (!fitbInput.style.maxWidth) {\n fitbInput.style.maxWidth = `${getContWidth(fitbInput)}px`;\n }\n });\n });\n }\n // signatures\n var fitbSignatures = document.querySelectorAll('.FITB span[data-type=\"signaturebox\"]');\n if (fitbSignatures && fitbSignatures.length > 0) {\n Array.from(fitbSignatures).forEach(inputContainer => {\n var signatureImage = inputContainer.querySelector('.FITB-sign-image');\n var signatureInput = inputContainer.querySelector('input[type=\"hidden\"]');\n var signatureTrigger = inputContainer.querySelector('.FITB-sign-button');\n if (signatureImage && signatureInput && signatureTrigger && window.JFFormSignature) {\n var onUse = function (output) {\n signatureInput.value = output.value;\n signatureImage.setAttribute('src', output.value);\n signatureInput.setAttribute('data-mode', output.mode);\n signatureInput.setAttribute('data-font', output.font);\n signatureInput.setAttribute('data-color', output.color);\n signatureInput.setAttribute('data-text', output.text);\n if (signatureInput.validateInput) {\n signatureInput.validateInput();\n }\n signatureInput.triggerEvent('change');\n };\n var getInitialValue = function () {\n return {\n value: signatureInput.value,\n mode: signatureInput.dataset.mode,\n font: signatureInput.dataset.font,\n color: signatureInput.dataset.color,\n text: signatureInput.dataset.text\n };\n };\n signatureTrigger.addEventListener('keypress', e => {\n if (e.keyCode === 32 || e.keyCode === 13) {\n e.preventDefault();\n e.target.click();\n }\n });\n var isDisabled = function () {\n return signatureInput.hasClassName('conditionallyDisabled');\n };\n window.JFFormSignature({\n trigger: signatureTrigger, onUse: onUse, getInitialValue: getInitialValue, isDisabled: isDisabled\n });\n }\n });\n }\n // time inputs\n var timeInputs = document.querySelectorAll('.FITB span[data-type=\"timebox\"] input[id*=\"timeInput\"]');\n for (var i = 0; i < timeInputs.length; i++) {\n try {\n var imask = new global.Inputmask({\n alias: 'datetime',\n inputFormat: timeInputs[i].dataset.mask ? timeInputs[i].dataset.mask : 'hh:MM',\n jitMasking: true,\n oncomplete: function (e) {\n var values = e.target.value.split(':');\n var hh = e.target.parentElement.querySelector('input[id*=\"hourSelect\"]');\n var mm = e.target.parentElement.querySelector('input[id*=\"minuteSelect\"]');\n hh.value = values[0];\n mm.value = values[1];\n e.target.triggerEvent('change');\n },\n onincomplete: function (e) {\n var values = e.target.value.split(':');\n var hh = e.target.parentElement.querySelector('input[id*=\"hourSelect\"]');\n hh.value = values[0];\n if (values[1]) {\n var mm = e.target.parentElement.querySelector('input[id*=\"minuteSelect\"]');\n mm.value = values[1].length === 2 ? values[1] : `${values[1]}0`;\n }\n },\n oncleared: function (e) {\n var hh = e.target.parentElement.querySelector('input[id*=\"hourSelect\"]');\n var mm = e.target.parentElement.querySelector('input[id*=\"minuteSelect\"]');\n hh.value = '';\n mm.value = '';\n e.target.triggerEvent('change');\n }\n });\n imask.mask(timeInputs[i]);\n // fix for placeholder on mouse enter\n timeInputs[i].addEventListener('mouseenter', e => {\n e.target.placeholder = 'hh:MM';\n });\n } catch (e) {\n return;\n }\n }\n};\n\nexport const setCalendar = (id, startOnMonday, limits, parent) => {\n var triggerElement = `input_${id}_pick`;\n var dateLimits = {};\n dateLimits[id] = limits;\n var field = global.$(`id_${id}`);\n var calendar = global.Calendar.setup({\n triggerElement: triggerElement,\n dateField: `year_${id}`,\n parentElement: parent,\n closeHandler: function () {\n global.JotForm.calendarClose.apply(this, arguments);\n if (global.$(`lite_mode_${id}`)) {\n if (global.JotForm.newDefaultTheme && (global.$(`lite_mode_${id}`).hasClassName('calendar-opened'))) {\n global.$(`lite_mode_${id}`).removeClassName('calendar-opened');\n }\n if (id.indexOf('-') > -1) {\n // for control_inline date conditions\n global.$(`lite_mode_${id}`).triggerEvent('change');\n }\n global.$(`lite_mode_${id}`).triggerEvent('blur');\n }\n },\n selectHandler: function () {\n global.JotForm.formatDate.apply(this, arguments);\n },\n startOnMonday: startOnMonday,\n limits: limits,\n id: id\n });\n var calendarButton = document.querySelector(`#${triggerElement}`);\n calendarButton.observe('click', () => {\n var calendar = global.$(`calendar_${id}`);\n if (calendar.style && calendar.style.display !== 'none') {\n global.JotForm.handleIFrameHeight();\n }\n });\n field.observe('keyup', () => {\n field.fire('date:changed');\n });\n var clearDate = function () {\n global.$(`month_${id}`).value = global.$(`day_${id}`).value = global.$(`year_${id}`).value = '';\n };\n var invalidDate = function (invalidDate) {\n invalidDate.addClassName('invalidDate');\n clearDate();\n };\n if (global.$(`lite_mode_${id}`)) {\n global.$(`lite_mode_${id}`).dateChanged = function (e, calendar, doNotTriggerErrors) {\n var lite_mode = e.currentTarget;\n var seperator = lite_mode.readAttribute('seperator') || lite_mode.readAttribute('data-seperator');\n var format = (lite_mode.readAttribute('format') || lite_mode.readAttribute('data-format')).toLowerCase();\n\n lite_mode.removeClassName('invalidDate');\n lite_mode.removeClassName('invalidLimits');\n field.removeClassName('form-line-error');\n field.removeClassName('form-datetime-validation-error');\n if (lite_mode.value === '') {\n field.fire('date:changed');\n return clearDate();\n }\n // Trim input in NDT, since value is like '19-19-199Y'\n var inputLength = calendar.isNewTheme ? lite_mode.value.replace(new RegExp(`[^\\\\d${seperator}]`), '').length : lite_mode.value.length;\n if (inputLength == ((seperator.length * 2) + format.length)) {\n var _yIn = format.indexOf('yy');\n var _mIn = format.indexOf('mm');\n var _dIn = format.indexOf('dd');\n var _sorter = new Array(_yIn, _mIn, _dIn);\n _sorter = _sorter.sort();\n var _sortIndex = {\n year: _sorter.indexOf(_yIn),\n month: _sorter.indexOf(_mIn),\n day: _sorter.indexOf(_dIn)\n };\n\n var year = parseInt(lite_mode.value.split(seperator)[_sortIndex.year]);\n var month = parseInt(lite_mode.value.split(seperator)[_sortIndex.month]) - 1;\n var day = parseInt(lite_mode.value.split(seperator)[_sortIndex.day]);\n var _tempDate = new Date(year, month, day);\n\n if (!_tempDate || !_tempDate.getDate()) {\n if (!doNotTriggerErrors) invalidDate(lite_mode, calendar);\n } else {\n calendar.setDate(_tempDate);\n calendar.selectHandler(calendar);\n }\n } else if (!doNotTriggerErrors) invalidDate(lite_mode, calendar);\n\n if (lite_mode.hasClassName('invalidDate')) {\n global.JotForm.errored(lite_mode, 'Enter a valid date');\n field.addClassName('form-line-error');\n field.addClassName('form-datetime-validation-error');\n }\n };\n\n global.$(`lite_mode_${id}`).observe('blur', e => {\n e.stopPropagation();\n /* Dogus: set new date value and run handler */\n e.currentTarget.dateChanged(e, calendar);\n e.currentTarget.setAttribute('date-val', calendar.date.getTime());\n return false;\n });\n\n if (!global.JotForm.newDefaultTheme && !global.JotForm.extendsNewTheme && !calendar.isNewTheme) {\n global.$(`lite_mode_${id}`).observe('keydown', e => {\n var input = e.target.value;\n if (e.key === 'Backspace' && input[input.length - 1] === e.target.dataset.seperator) {\n input = input.substr(0, input.length - 1);\n }\n e.target.value = input.substr(0, 10);\n });\n\n global.$(`lite_mode_${id}`).observe('input', e => {\n var input = e.target.value;\n var values = input.split(e.target.dataset.seperator).map(v => {\n return v.replace(/\\D/g, '');\n });\n var output = [];\n if (e.target.dataset.format !== 'yyyymmdd') {\n output = values.map((v, i) => {\n return v.length == 2 && i < 2 ? v + e.target.dataset.seperator : v;\n });\n } else {\n output = values.map((v, i) => {\n return (v.length == 4 && i == 0) || (v.length == 2 && i == 1) ? v + e.target.dataset.seperator : v;\n });\n }\n e.target.value = output.join('').substr(0, 10);\n e.currentTarget.dateChanged(e, calendar, true); // the third argument for disabling the error handling for oninput event\n });\n }\n }\n\n if (!parent) { // if parent its embedded and show hide will be handled by the parent container\n var openCalendar = function () {\n var ele = this;\n setTimeout(() => {\n if (global.JotForm.newDefaultTheme) {\n handlePopupUI(calendar, { width: ele.parentNode.parentNode.offsetWidth });\n }\n calendar.showAtElement(ele);\n }, 50);\n };\n if (global.$(`input_${id}_pick`).hasClassName('showAutoCalendar') || global.JotForm.isSourceTeam) {\n var _selectors = [(`#day_${id}`), (`#month_${id}`), (`#year_${id}`), (`#lite_mode_${id}`)];\n $global.$(_selectors.join(',')).each(elem => {\n if (!elem.onclick) {\n elem.observe('focus', openCalendar);\n elem.observe('click', openCalendar);\n }\n });\n }\n global.$(`year_${id}`).observe('blur', () => {\n calendar.hide();\n });\n if (global.$(`lite_mode_${id}`)) {\n global.$(`lite_mode_${id}`).observe('blur', () => {\n calendar.hide();\n });\n }\n }\n};\n\nexport const displayLocalTime = (hh, ii, ampm, v2, fixCurrentAmPm) => {\n if (fixCurrentAmPm) return;\n const hhElement = document.querySelector(`#${hh}`);\n if (hhElement && !hhElement.classList.contains('noDefault')) {\n const date = new Date();\n let hour = date.getHours();\n\n let currentAmpm = '';\n let twentyFour = true;\n const ampmElement = document.querySelector(`#${ampm}`);\n if (ampmElement) {\n twentyFour = false;\n currentAmpm = (hour > 11) ? 'PM' : 'AM';\n hour = (hour > 12) ? hour - 12 : hour;\n hour = (hour == 0) ? 12 : hour;\n }\n let min = date.getMinutes();\n const iiElement = document.querySelector(`#${ii}`);\n if (!v2) {\n const step = Number(iiElement.options[2].value) - Number(iiElement.options[1].value);\n min = Math.round(min / step) * step;\n }\n min = addZeros(min, 2);\n if (min >= 60) { // ntw roll over to next hour/day\n min = '00';\n hour++;\n if (twentyFour) {\n if (hour == 24) hour = 0;\n } else if (currentAmpm == 'AM' && hour == 12) currentAmpm = 'PM';\n else if (currentAmpm == 'PM' && hour == 12) currentAmpm = 'AM';\n else if (hour == 13) hour = 1;\n }\n // prepend with zero\n if (hour < 10 && (!!v2 || hhElement.options[1].value.length > 1)) {\n hour = `0${hour}`;\n }\n\n if (ampmElement) {\n const ampmRangeEl = document.querySelector(`#${ampm}Range`);\n if (currentAmpm == 'PM') {\n if (ampmElement.querySelectorAll('option[value=\"PM\"]').length > 0) ampmElement.value = 'PM';\n if (ampmRangeEl && ampmRangeEl.querySelectorAll('option[value=\"PM\"]').length > 0) ampmRangeEl.value = 'PM';\n } else {\n if (ampmElement.querySelectorAll('option[value=\"AM\"]').length > 0) ampmElement.value = 'AM';\n if (ampmRangeEl && ampmRangeEl.querySelectorAll('option[value=\"AM\"]').length > 0) ampmRangeEl.value = 'AM';\n }\n }\n\n if (fixCurrentAmPm) return;\n\n hhElement.value = hour;\n iiElement.value = min;\n if (document.querySelector(`#${hh}Range`)) {\n document.querySelector(`#${hh}Range`).value = hour;\n document.querySelector(`#${ii}Range`).value = min;\n }\n\n if (document.querySelector(`#${v2}Range`)) {\n document.querySelector(`#${v2}Range`).value = `${hour}:${min}`;\n }\n if (v2) {\n document.querySelector(`#${v2}`).value = `${hour}:${min}`;\n }\n }\n};\n\nexport const calendarClose = calendar => {\n var calendar_id = !calendar.isNewTheme ? calendar.id : calendar.dateField.id[calendar.dateField.id.length - 1];\n var found = calendar.dateField.id.match(/_[a-z0-9]+/);\n var selector = Array.isArray(found) ? found[0] : '';\n var calendarFields = selector ? $$(`input[id*=\"${selector}\"]`) : [];\n var validations = calendar.dateField.className.replace(/.*validate\\[(.*)\\].*/, '$1').split(/\\s*,\\s*/);\n var incomplete = calendarFields.any(c => {\n return c.value.empty();\n });\n if ((validations.include('required') || validations.include('disallowPast'))\n && incomplete) {\n calendar.dateField.validateInput();\n }\n if (validations.include('required') && !incomplete) {\n JotForm.corrected($(`id_${calendar_id}`));\n }\n calendar.hide();\n};\n\nexport const formatDate = d => {\n var { date } = d;\n var month = addZeros(date.getMonth() + 1, 2);\n var day = addZeros(date.getDate(), 2);\n var year = date.getYear() < 1000 ? date.getYear() + 1900 : date.getYear();\n var id = d.dateField.id.replace(/\\w+\\_/gim, '');\n\n document.querySelector(`#month_${id}`).value = month;\n document.querySelector(`#day_${id}`).value = day;\n document.querySelector(`#year_${id}`).value = year;\n\n if (document.querySelector(`#lite_mode_${id}`)) {\n var lite_mode = document.querySelector(`#lite_mode_${id}`);\n var seperator = lite_mode.getAttribute('seperator') || lite_mode.getAttribute('data-seperator');\n var format = lite_mode.getAttribute('format') || lite_mode.getAttribute('data-format');\n\n var newValue = month + seperator + day + seperator + year;\n if (format == 'ddmmyyyy') {\n newValue = day + seperator + month + seperator + year;\n } else if (format == 'yyyymmdd') {\n newValue = year + seperator + month + seperator + day;\n }\n lite_mode.value = newValue;\n }\n\n if (document.querySelector(`#input_${id}`)) {\n var input = document.querySelector(`#input_${id}`);\n var newValue = `${year}-${month}-${day}`;\n input.value = newValue;\n }\n\n // It was the only working way to simulate prototype.js's fire function\n var dateChangedEvent = document.createEvent('HTMLEvents');\n dateChangedEvent.initEvent('dataavailable', true, true);\n dateChangedEvent.eventName = 'date:changed';\n document.querySelector(`#id_${id}`).dispatchEvent(dateChangedEvent);\n};\n\nexport function getSubstring(string, char1, char2) {\n const index1 = string.indexOf(char1);\n const index2 = string.indexOf(char2);\n if (index1 === -1 || index2 === -1) {\n return string;\n }\n return string.slice(index1 + 1, index2);\n}\n\nexport function keyGrapper(values) {\n const result = {};\n values.forEach(({ name, value }) => {\n const key = getSubstring(name, '[', ']');\n result[key] = value;\n });\n return result;\n}\n\nfunction dataParser(values) {\n const data = {\n ...keyGrapper(values)\n };\n\n const getValuesDateTime = _dt => {\n const u = _dt.map(_ => {\n const key = Object.keys(_)[0];\n return {\n name: key,\n value: _[key]\n };\n });\n const _vals = keyGrapper(u);\n return _vals;\n };\n\n const keys = Object.keys(keyGrapper(values));\n\n const filtered = keys.filter(key => ['date', 'time'].some(v => key.includes(v)));\n\n filtered.forEach(key => {\n const d = values.filter(v => v.name.includes(key));\n const y = d.map(_d => {\n const _name = _d.name;\n return {\n [_name.replace(`[${key}]`, '')]: _d.value\n };\n });\n data[key] = getValuesDateTime(y);\n });\n\n return data;\n}\n\nfunction infoExtractor(elements, qid, index) {\n if (!elements) return {};\n\n const { tagName } = elements[0];\n\n if (tagName === 'INPUT') {\n switch (elements[0].type) {\n case 'checkbox':\n case 'radio':\n const elem = elements[0];\n return {\n id: elem.id.split('-')[1],\n type: elem.type === 'radio' ? 'control_radio' : 'control_checkbox',\n label: elem.type === 'radio' ? 'Single Choice' : 'Multiple Choice',\n options: elements.map((el, i) => {\n return {\n type: elem.type === 'radio' ? 'radiobox' : 'checkbox',\n label: document.querySelector(`label[for=${el.id}]`)?.innerHTML || '',\n name: `option${i + 1}`,\n id: `option${i + 1}-${elem.id.split('-')[1]}`,\n qid\n };\n }),\n index\n };\n case 'tel':\n if (elements[0].id.includes('date')) {\n const id = elements[0].id.split('-')[elements[0].id.split('-').length - 1];\n const container = document.getElementById(`id_${qid}-date-${id}`);\n const label = container.querySelector('label')?.innerHTML || 'Date';\n const type = container?.dataset.type || 'datebox';\n const { format, seperator } = container?.dataset;\n return {\n id,\n type: 'control_datetime',\n label,\n options: [\n {\n type,\n label,\n name: 'Date',\n id: `date-${id}`,\n qid\n }\n ],\n format: format || 'mmddyyyy',\n dateSeparator: seperator || '-',\n index: '2'\n };\n }\n break;\n case 'text':\n if (elements[0].id.includes('time')) {\n return {\n timeFormat: 'AM/PM',\n showDayPeriods: 'both',\n defaultTime: 'none',\n step: '10',\n id: elements[0].id.split('-')[1],\n type: 'control_time',\n label: 'Time',\n options: [\n {\n type: 'timebox',\n label: 'Time',\n name: 'Time',\n id: `time-${elements[0].id.split('-')[1]}`,\n qid\n }\n ],\n index: '7'\n };\n }\n // short-text\n return {\n type: 'control_textbox',\n id: elements[0].id.split('-')[1],\n required: elements[0].required ? 'Yes' : 'No',\n validation: 'None',\n label: 'blanks',\n options: [\n {\n id: elements[0].id.split('-')[1],\n type: 'textbox',\n label: 'blanks',\n name: 'Short Text'\n }\n ],\n index: '8'\n };\n case 'number':\n const id = elements[0].id.split('-')[1];\n return {\n id,\n type: 'control_number',\n label: 'Number',\n options: [\n {\n type: 'textbox',\n label: '',\n name: 'Number',\n inputType: 'number',\n id: `number-${id}`,\n qid\n }\n ],\n index: '5'\n };\n case 'hidden':\n return {\n id: elements[0].id.split('-')[1],\n index: '5',\n label: 'Signature',\n options: [\n {\n id: `signature-${elements[0].id.split('-')[1]}`,\n label: 'Signature',\n name: 'Signature',\n qid,\n type: 'signaturebox'\n }\n ],\n type: 'control_signature'\n };\n default:\n // default\n }\n } else if (tagName === 'SELECT') {\n const elem = elements[0];\n return {\n id: elem.id.split('-')[1],\n type: 'control_dropdown',\n label: 'Please Select',\n options: Array.from(elem.options).slice(1).map((option, i) => {\n return {\n type: 'selectbox',\n label: option.innerHTML,\n name: `option${i + 1}`,\n qid,\n id: `option${i + 1}-${elem.id.split('-')[1]}`\n };\n }),\n index: '6'\n };\n }\n}\n\nconst putValue = (element, value) => {\n if (element.clearHint){\n element.clearHint();\n }\n element.value = value;\n return element;\n};\n\nexport const getFITBValues = (values, qid) => {\n const _index = 1;\n const fields = values.map(value => {\n const elements = document.getElementsByName(value.name);\n const info = infoExtractor(Array.from(elements), qid, _index);\n return info;\n }).filter(v => !!v);\n\n return {\n extraData: {\n inputType: null,\n fields\n },\n data: dataParser(values)\n };\n};\n\nexport const populateFITBValues = (question, items) => {\n const { qid } = question;\n Object.keys(items).forEach(fieldId => {\n var value = items[fieldId];\n function getInlineFieldId(id) {\n var TIMESTAMP_OF_2019 = 1546300000000;\n var parts = id.split('-');\n if (parts.length === 1) {\n return parts[0];\n }\n return Number(parts[0]) > TIMESTAMP_OF_2019 ? parts[0] : parts[1];\n }\n var fieldProps = Array.isArray(question.fields) ? question.fields.find(field => { return field.id === getInlineFieldId(fieldId); }) : {};\n switch (fieldProps && fieldProps.type) {\n case 'control_checkbox':\n var checkboxInput = document.getElementById(`id_${qid}`).querySelector(`input[id*=\"${fieldId}\"]`);\n if (checkboxInput) {\n checkboxInput.checked = true;\n }\n break;\n case 'control_datetime':\n if (typeof value === 'object' && value.year && value.month && value.day) {\n global.JotForm.formatDate({\n date: new Date(value.year, value.month - 1, value.day),\n dateField: global.$(`id_${qid}-${fieldId}`)\n });\n }\n break;\n case 'control_signature':\n var signatureImg = (value && (value.substring(0, 1) === '/' || value.substring(0, 10) === 'data:image')) ? value : `/${value}`;\n var sigInput = document.getElementById(`id_${qid}`).querySelector(`[id*=\"${qid}_input_${fieldId}\"]`);\n var sigImgEl = document.getElementById(`id_${qid}`).querySelector(`#id_${qid}_${fieldId} .FITB-sign-image`);\n if (sigInput && sigImgEl) {\n sigInput.value = signatureImg;\n sigImgEl.src = signatureImg;\n }\n break;\n case 'control_dropdown':\n var itemInput = document.getElementById(`id_${qid}`).querySelector(`[id*=\"input_${qid}_${fieldId}\"]`);\n if (itemInput) {\n putValue(itemInput, value);\n }\n break;\n case 'control_radio':\n var inputId = (Array.isArray(fieldProps.options) ? fieldProps.options.find(option => { return option.label === value; }) : {}).id;\n var radioInput = document.querySelector(`input[id^=\"q${qid}_${inputId}\"][value=\"${value}\"]`);\n if (radioInput) {\n radioInput.checked = true;\n }\n break;\n case 'control_time':\n if (typeof value !== 'object') {\n break;\n }\n Object.keys(value).forEach(o => {\n var input = document.getElementById(`id_${qid}`).querySelector(`[id*=\"${o}_${qid}_${fieldId}\"]`);\n if (input) {\n putValue(input, value[o]);\n }\n });\n break;\n default:\n var itemInput = document.getElementById(`id_${qid}`).querySelector(`input[id*=\"${fieldId}\"]`);\n if (itemInput) {\n putValue(itemInput, value);\n }\n break;\n }\n });\n};\n","import {\n QUICK_ACTION_QUESTIONS, QUICK_ACTION_WIDGETS, AUTO_SKIP_QUESTIONS, AUTO_SKIP_WIDGETS, ASSISTANT_GENDERS, NEXT_BUTTON_WIDGETS, NEXT_BUTTON_QUESTION\n} from '@jotforminc/constants';\n\nexport const isQuickAction = question => {\n return (QUICK_ACTION_QUESTIONS.includes(question.type) || QUICK_ACTION_WIDGETS.includes(question.selectedField)) && !window.location.search.includes('newAppointmentConversation');\n};\n\nexport const isNextButtonEnabled = question => NEXT_BUTTON_QUESTION.includes(question.type)\n|| NEXT_BUTTON_WIDGETS.includes(question.selectedField)\n|| (['control_yesno', 'control_checkbox', 'control_radio', 'control_dropdown'].includes(question.type) && question.selected)\n|| (['control_dropdown', 'control_imagechoice'].includes(question.type) && (question.multipleSelection === 'Yes' || question.multipleSelections === 'Yes'));\n\nexport const isAutoSkipQuestion = question => AUTO_SKIP_QUESTIONS.includes(question.type) || AUTO_SKIP_WIDGETS.includes(question.selectedField);\nconst isStaticAnswerMessage = message => isQuickAction(message.question) && message.from === 'user' && message.answerType === 'STATIC_ANSWER';\n\nexport const categorizeMessages = messages => {\n return messages.reduce((categories, message) => {\n const category = isStaticAnswerMessage(message) ? 'staticAnswerMessages' : 'filteredMessages';\n categories[category].push(message);\n return categories;\n }, { filteredMessages: [], staticAnswerMessages: [] });\n};\n\nexport const getAvatarGender = formProperties => {\n return (formProperties['ai-assistant-gender'] && formProperties['ai-assistant-gender'] !== 'genderless') ? formProperties['ai-assistant-gender'] : ASSISTANT_GENDERS.woman;\n};\n\nexport const getQuickActionMessagesWithAnswers = (messages, staticAnswerMessages) => {\n // Filtered messages reversed to get first quick action\n const quickActionMessages = messages\n .filter(msg => isQuickAction(msg.question) && msg.from === 'ai')\n .reverse();\n\n return quickActionMessages.reduce((result, message) => {\n const staticAnswer = staticAnswerMessages.findLast(answer => answer.qid === message.qid);\n // eslint-disable-next-line no-param-reassign\n result[message.qid] = { ...message, answer: staticAnswer ? staticAnswer.message : undefined };\n return result;\n }, {});\n};\n\n// This function filters static messages and puts answers to first quick action messages if there is a any answer\nexport const setAnswersToQuickActions = ({ messages }) => {\n const { filteredMessages, staticAnswerMessages } = categorizeMessages(messages);\n const quickActionMessages = getQuickActionMessagesWithAnswers(messages, staticAnswerMessages);\n\n return filteredMessages.map(filteredMsg => {\n const quickAction = Object.values(quickActionMessages).find(action => filteredMsg.id === action.id);\n\n if (quickAction) {\n return {\n ...filteredMsg,\n answer: quickAction.answer,\n isQuickActionFirstMsg: true\n };\n }\n\n return filteredMsg;\n });\n};\n\nexport const prepareAgentHistory = ({\n chatHistory,\n questions,\n agentProps = []\n}) => {\n const questionArray = (typeof questions === 'object' && !Array.isArray(questions)) ? Object.keys(questions).map(key => questions[key]) : (questions || []);\n const avatarIconLink = agentProps.filter(a => a.prop === 'avatarIconLink' && a.value)[0]?.value;\n const history = chatHistory?.reduce((prev, curr) => {\n const question = questionArray.find(q => q.qid === curr.question_id);\n if (question && isAutoSkipQuestion(question) && curr.type === 'USER') {\n return prev;\n }\n return [...prev, {\n id: curr.uuid,\n from: curr.type === 'ASSISTANT' ? 'ai' : 'user',\n question: question || {},\n message: (question && isAutoSkipQuestion(question)) ? null : curr.content,\n qid: curr.question_id,\n avatarURL: curr.avatar_url || avatarIconLink,\n answerType: curr.answer_type,\n action: curr.action,\n createdAt: curr.created_at\n }];\n }, []);\n\n return setAnswersToQuickActions({ messages: history });\n};\n\nexport const shuffleArray = arr => {\n if (arr.length === 1) { return arr; }\n const rand = Math.floor(Math.random() * arr.length);\n return [arr[rand], ...shuffleArray(arr.filter((_, i) => i !== rand))];\n};\n\nexport const isBase64Image = url => /^(?:data:image)/.test(url);\n\nexport const isMobileApp = () => typeof global.sendMessageToJFMobile === 'function';\n\nexport function isJsonString(str) {\n try {\n const o = JSON.parse(str);\n // Handle non-exception-throwing cases:\n // Neither JSON.parse(false) or JSON.parse(1234) throw errors, hence the type-checking,\n // but... JSON.parse(null) returns 'null', and typeof null === \"object\",\n // so we must check for that, too.\n if (o && typeof o === 'object' && o !== null) {\n return true;\n }\n // eslint-disable-next-line no-empty\n } catch (e) {}\n\n return false;\n}\n","/* eslint-disable prefer-destructuring */\n/* eslint-disable no-undef */\n/* eslint-disable no-useless-concat */\n/* eslint-disable no-unused-expressions */\n/* eslint-disable no-param-reassign */\n/* eslint-disable max-statements */\nconst getProps = (question, props) => props.map(prop => question[prop]).filter(val => !!val);\n\nconst getValues = question => {\n const { type } = question;\n switch (type) {\n case 'control_textbox':\n case 'control_calculation':\n return getProps(question, ['text', 'subLabel', 'description']);\n case 'control_image':\n return getProps(question, ['labelText']);\n case 'control_inline':\n return getProps(question, ['template']);\n default:\n return getProps(question, ['text', 'description']);\n }\n};\n\nconst getQuestionsCalculations = questions => {\n const regex = /\\{([^}]*)\\}/gim;\n const questionByName = questions.reduce((acc, question) => ({ ...acc, [question.name]: question }), {});\n\n const calculations = [];\n questions.forEach(question => {\n getValues(question).forEach(value => {\n const matched = [];\n let result;\n // eslint-disable-next-line no-cond-assign\n while ((result = regex.exec(value)) !== null) {\n matched.push(result[1]);\n }\n\n matched.forEach(questionName => {\n const seperator = questionName.indexOf(':') > -1 ? ':' : '['; // for multi-valued fields (address, fullname) when colon is used\n const name = questionName.split(seperator)[0];\n\n const qid = questionByName[name]?.qid;\n const type = questionByName[name]?.type;\n\n // there may be a multiline question field in the question_name:\n const multilineFieldRegex = /\\[(.*?)\\]/gi;\n const multilineFieldResult = multilineFieldRegex.exec(questionName);\n let multilineFieldEquation = multilineFieldResult ? `${qid}|${multilineFieldResult[1]}` : '';\n\n if (type === 'control_inline') {\n const inlineFieldRegex = /(:)(.*)/gi;\n const inlineFieldResult = inlineFieldRegex.exec(questionName);\n if (inlineFieldResult) {\n const subfield = inlineFieldResult[2];\n const subfieldSplit = subfield.split('-');\n const fieldId = Number(subfieldSplit[0]) ? subfieldSplit[0] : subfieldSplit[1];\n multilineFieldEquation = `${qid}|${fieldId}`;\n }\n }\n\n calculations.push({\n decimalPlaces: '2',\n defaultValue: '',\n equation: `{${(multilineFieldEquation || qid)}}`,\n ignoreHiddenFields: '',\n insertAsText: '1',\n isLabel: ['control_text', 'control_inline'].includes(question.type) ? '' : '1',\n newCalculationType: '1',\n operands: (multilineFieldEquation || qid),\n readOnly: '',\n replaceText: questionName,\n resultField: question.qid,\n showBeforeInput: '',\n tagReplacement: '1',\n useCommasForDecimals: ''\n });\n });\n });\n });\n return calculations;\n};\n\nconst getCombinedObjectForInline = data => {\n let qid = '';\n let fieldID = '';\n let combinedObject = {};\n if (data?.indexOf('|') > -1) {\n qid = data.split('|')[0];\n fieldID = data.split('|')[1];\n combinedObject = {};\n const TIMESTAMP_OF_2019 = 1546300000000;\n const selector = Number(fieldID) > TIMESTAMP_OF_2019 ? `#id_${qid} input[id*=${fieldID}-]` + `, select[id*=${fieldID}-]` : `#id_${qid} input[id$=-${fieldID}]` + `, select[id$=-${fieldID}]`;\n $$(selector).each(el => {\n const id = el.id.replace(Number(fieldID) > TIMESTAMP_OF_2019 ? /^[^-]*-/ : /-[^-]*$/, '');\n combinedObject[id] = el.value;\n });\n } else {\n qid = data;\n combinedObject = {};\n $$(`#id_${qid} input[type=\"text\"]`).each(el => {\n const id = el.id;\n combinedObject[id] = el.value;\n });\n $$(`#id_${qid} input[type=\"tel\"]`).each(el => {\n const id = el.id;\n combinedObject[id] = el.value;\n });\n $$(`#id_${qid} input[type=\"checkbox\"]`).each(chk => {\n const id = chk.id;\n combinedObject[id] = chk.checked ? chk.value : '';\n });\n }\n return combinedObject;\n};\n\nconst runReplaceTag = (calc, combinedObject, output, result, resultFieldType) => {\n try {\n if (!calc.replaceText) calc.replaceText = '';\n if (calc.replaceText.indexOf(':') > -1) {\n let subfield = calc.replaceText.substr(calc.replaceText.indexOf(':') + 1);\n if (calc.equation.indexOf('|') > -1) {\n const splitResult = calc.operands.split('|');\n const qid = splitResult[0];\n\n // Correct matching of inline field's subfield name with combinedObject's one\n subfield = `${qid}_${subfield.split('-')[0]}`;\n }\n if (subfield in combinedObject) {\n output = combinedObject[subfield];\n }\n }\n if (output.empty() && calc.defaultValue) {\n output = calc.defaultValue;\n }\n\n let className = `${result}_${calc.replaceText.replace(/\\[/g, '_field_').replace(/:/g, '_')}`;\n className = className.replace(']', '');\n const spans = Array.from(document.getElementsByClassName(className));\n\n let subLabel = [];\n if (window.FORM_MODE === 'cardform') {\n subLabel = $$('.' + 'jfField-sublabel').filter(el => { return el.htmlFor === `input_${result}`; });\n } else {\n subLabel = $$('.' + 'form-sub-label').filter(el => { return el.htmlFor === `input_${result}`; });\n }\n\n const replaceRegex = calc.replaceText.replace('[', '\\\\[');\n\n const re = new RegExp(`{${replaceRegex}}`, 'g');\n const def = calc.defaultValue || '';\n\n const links = $$(`a[href=\"{${replaceRegex}}\"]`);\n const replaceLinks = $$(`a[replace-link=\"${className}\"]`);\n const linkRegex = new RegExp(/([--:\\w?@%&+~#=]*\\.[a-z]{2,4}\\/{0,2})((?:[?&](?:\\w+)=(?:\\w+))+|[--:\\w?@%&+~#=\\s]+)?/);\n const matchLink = output.match(linkRegex);\n links.each(link => {\n link.setAttribute('replace-link', className);\n link.setAttribute('href', '');\n if (matchLink) {\n const url = matchLink[0].indexOf('//') === -1 ? `//${matchLink[0]}` : matchLink[0];\n link.setAttribute('href', url);\n }\n });\n replaceLinks.each(link => {\n if (matchLink) {\n const url = matchLink[0].indexOf('//') === -1 ? `//${matchLink[0]}` : matchLink[0];\n link.setAttribute('href', url);\n }\n });\n\n if (spans.length === 0) {\n if (resultFieldType === 'inline') {\n const fitbFormFields = $$(`#FITB_${result} .fitb-replace-tag`);\n const fieldRegex = new RegExp(`([^<>]*){${replaceRegex}}([^<>]*)`, 'g');\n fitbFormFields.forEach(el => {\n if (el.innerHTML) {\n el.innerHTML = el.innerHTML.replace(fieldRegex, `$1${output}$2`);\n }\n });\n } else {\n let contents = calc.isLabel ? $(`label_${result}`).innerHTML : $(`text_${result}`).innerHTML;\n if (calc.isLabel) {\n contents = contents.replace(re, `${output}`);\n } else {\n const localRe = new RegExp(`(>[^<>]*){${replaceRegex}}([^<>]*<)`, 'g');\n while (contents.match(localRe) && output.indexOf(`{${replaceRegex}}`) === -1) {\n contents = contents.replace(localRe, `$1${output}$2`);\n }\n }\n calc.isLabel ? $(`label_${result}`).update(contents) : $(`text_${result}`).update(contents);\n }\n } else {\n spans.each(span => {\n if (output != null) {\n if (window.DomPurify) {\n span.update(window.DomPurify.sanitize(output, { ADD_ATTR: ['target'] }));\n } else {\n span.update(output.stripScripts().stripEvents());\n }\n }\n });\n }\n\n subLabel.each(subl => {\n const content = subl.innerHTML.replace(re, `${output}`);\n subl.update(content);\n });\n\n const description = $(`id_${result}_description`);\n if (description) {\n let descriptionContent = description.innerHTML;\n if (descriptionContent.indexOf(calc.replaceText) > -1) {\n descriptionContent = descriptionContent.replace(re, `${output}`);\n description.update(descriptionContent);\n }\n }\n } catch (e) {\n console.log(e);\n }\n};\n\nexport const runReplaceTags = questions => {\n const calcs = getQuestionsCalculations(questions);\n calcs.forEach(calc => {\n const question = questions.find(q => q.qid === calc.resultField);\n const questionType = question.type.substr(question.type.indexOf('_') + 1, question.type.length - 1);\n let combinedObject = {};\n if (questionType === 'inline') {\n combinedObject = getCombinedObjectForInline(calc.operands ?? calc.resultField) ?? {};\n }\n runReplaceTag(calc, combinedObject, '', calc.resultField, question.type.substr(question.type.indexOf('_') + 1, question.type.length - 1));\n });\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Styled from 'styled-components';\nimport { EmojiRendererWithoutLazy } from '@jotforminc/icon-selector';\n\nimport View from '../View';\nimport Text from '../Text';\nimport Image from '../Image';\n// import Baseline from '../Baseline';\n\nconst StyledTextHolder = Styled(View)`\n display: flex;\n flex: 1;\n flex-direction: column;\n text-align: left;\n overflow: hidden;\n`;\n\nconst StyleSubText = Styled(Text)`\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n opacity: .6;\n`;\n\nconst StyledText = Styled(Text)`\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n`;\n\nconst StyledImageLine = Styled(View)`\n background-color: ${({ backgroundColor }) => backgroundColor};\n display: inline-flex !important;\n align-items: center;\n padding: 10px;\n border: 1px solid #C8CEED;\n border-radius: 90px;\n`;\n\nconst StyledImage = Styled(props => )`\n display: block;\n flex: 0;\n max-width: 36px;\n max-height: 36px;\n margin-right: 8px;\n border-radius: 50%;\n object-fit: cover;\n background-color: #b9bbd2;\n flex-shrink: 1;\n`;\n\nclass AssigneeLine extends React.Component {\n render() {\n const {\n label,\n subLabel,\n value,\n imageLabel,\n valueContainerProps,\n imageContainerProps,\n backgroundColor,\n optimizeImage,\n showSubLabel,\n teamAvatarID,\n ...props\n } = this.props;\n\n const imageSource = value || 'https://cdn.jotfor.ms/assets/img/v4/avatar/Podo-Guest.png';\n\n return (\n \n \n {teamAvatarID ? \n : }\n\n \n \n {imageLabel && {imageLabel}}\n {showSubLabel && subLabel && {subLabel}}\n \n \n );\n }\n}\n\nAssigneeLine.propTypes = {\n label: PropTypes.string,\n subLabel: PropTypes.string,\n value: PropTypes.string,\n imageLabel: PropTypes.string,\n backgroundColor: PropTypes.string,\n valueContainerProps: PropTypes.shape({}),\n imageContainerProps: PropTypes.shape({}),\n optimizeImage: PropTypes.bool,\n showSubLabel: PropTypes.bool\n};\n\nAssigneeLine.defaultProps = {\n label: '',\n subLabel: '',\n value: '',\n imageLabel: '',\n backgroundColor: null,\n valueContainerProps: {},\n imageContainerProps: {},\n optimizeImage: false,\n showSubLabel: true\n};\n\nexport default AssigneeLine;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Styled from 'styled-components';\n\nimport View from '../View';\n\nconst ViewWithAlignment = Styled(({ direction, ...props }) => )`\n display: flex;\n flex-direction: ${({ direction }) => direction};`;\n\nViewWithAlignment.propTypes = {\n direction: PropTypes.string\n};\n\nViewWithAlignment.defaultProps = {\n direction: 'column'\n};\n\nexport default ViewWithAlignment;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Styled from 'styled-components';\nimport isEqual from 'lodash/isEqual';\nimport View from '../View';\nimport Text from '../Text';\nimport { nl2br, stripHTML } from '../../utils';\nimport { isNative } from '../../utils/environment';\n\nconst LabelText = Styled(Text)`\n font-size: 20px;\n letter-spacing: .25px;\n font-weight: 600;\n`;\n\nclass Label extends React.Component {\n constructor(props) {\n super(props);\n\n const { textStyle } = this.props;\n\n // In order to prevent unnecessary re-renders caused by ref changes on WrappedLabelText caused by calling Styled(...) on each render.\n this.wrappedLabelText = Styled(styledProps => )`${textStyle}`;\n // If you are willing to change this logic, you may break inline-edit on PDF-Editor. Remember, everything is connected.\n }\n\n componentDidUpdate(prevProps) {\n if (!isEqual(prevProps.textStyle, this.props.textStyle)) {\n this.wrappedLabelText = Styled(props => )`${this.props.textStyle}`;\n }\n }\n\n render() {\n const {\n label,\n textProps,\n textStyle,\n allowHTML,\n childLabels, // array of additional components in the label\n ...props\n } = this.props;\n\n const WrappedLabelText = this.wrappedLabelText;\n const isValid = (label !== '') && (label.length > 0); // required for native\n\n const prettyLabel = isNative() ? stripHTML(label) : nl2br(stripHTML(label));\n return (\n \n {isValid && label && {allowHTML ? label : prettyLabel}}\n {childLabels && childLabels}\n \n );\n }\n}\n\nLabel.propTypes = {\n label: PropTypes.string,\n textProps: PropTypes.shape({}),\n allowHTML: PropTypes.bool,\n childLabels: PropTypes.arrayOf(PropTypes.shape({})),\n textStyle: PropTypes.string\n};\n\nLabel.defaultProps = {\n label: '',\n textProps: {},\n allowHTML: false,\n childLabels: [],\n textStyle: ''\n};\n\nexport default Label;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Styled from 'styled-components';\n\nimport Label from '../Label';\n\nconst LabelWithAlignment = Styled(({ direction, flexBasis, ...props }) =>