{"version":3,"file":"static/js/index.70d45ed4.js","sources":["webpack://gvirantd/./src/common/casl/ability.js","webpack://gvirantd/./src/common/components/advanced-search/AdvancedSearchTitle.js","webpack://gvirantd/./src/common/components/advanced-search/ModalUploadAdvancedFile.js","webpack://gvirantd/./src/common/components/ag-grid/components/renderers/LinkRender.js","webpack://gvirantd/./src/common/components/ag-grid/components/renderers/DragRender.js","webpack://gvirantd/./src/common/components/ag-grid/components/renderers/CheckboxSelectionRender.js","webpack://gvirantd/./src/common/components/ag-grid/context/gridContext.js","webpack://gvirantd/./src/common/components/ag-grid/components/renderers/HeaderCheckboxRender.js","webpack://gvirantd/./src/common/components/ag-grid/components/renderers/HeaderNullRender.js","webpack://gvirantd/./src/common/components/ag-grid/components/renderers/CheckboxRender.js","webpack://gvirantd/./src/common/components/ag-grid/components/ApplyFilter.js","webpack://gvirantd/./src/common/components/ag-grid/hooks/getColumnDefsHook.js","webpack://gvirantd/./src/common/components/ag-grid/hooks/SelectionHook.js","webpack://gvirantd/./src/common/components/ag-grid/components/selection/SelectionLog.js","webpack://gvirantd/./src/common/components/ag-grid/AgGrid.js","webpack://gvirantd/./src/common/components/ag-grid/LicenseManagerAgGrid.js","webpack://gvirantd/./src/common/components/apl-grid/AplGrid.js","webpack://gvirantd/./src/common/components/button/ButtonLargeIcon.js","webpack://gvirantd/./src/common/components/button/ButtonSmallIcon.js","webpack://gvirantd/./src/common/components/button/ContainerButton.js","webpack://gvirantd/./src/common/components/button/FormSaveButton.js","webpack://gvirantd/./src/common/components/button/ItemButton.js","webpack://gvirantd/./src/common/components/button/RibbonButton.js","webpack://gvirantd/./src/common/components/button/ShowMoreOrLess.js","webpack://gvirantd/./src/common/components/button/expand-tab/ExpandTabButton.js","webpack://gvirantd/./src/common/components/contact-action/ActionsRibbonBar.js","webpack://gvirantd/./src/common/components/dialog-function/DialogFunction.js","webpack://gvirantd/./src/common/components/dialog-function/ErrorIcon.js","webpack://gvirantd/./src/common/components/dialog-function/InfoIcon.js","webpack://gvirantd/./src/common/components/dialog-function/SuccessIcon.js","webpack://gvirantd/./src/common/components/dialog-function/WarnIcon.js","webpack://gvirantd/./src/common/components/digital-right-icon/DigitalRightIcon.js","webpack://gvirantd/./src/common/components/drapDropWrap/drap-and-drop/DropWrap.js","webpack://gvirantd/./src/common/components/folder/FolderTree.js","webpack://gvirantd/./src/common/components/folder/hooks.js","webpack://gvirantd/./src/common/components/folder/FolderBreadcrumb.js","webpack://gvirantd/./src/common/components/folder/FolderItem.js","webpack://gvirantd/./src/common/components/folder/FolderList.js","webpack://gvirantd/./src/common/components/folder/FolderSelector.js","webpack://gvirantd/./src/common/components/folder/utils.js","webpack://gvirantd/./src/common/components/form/basic-form/BasicFormItem.js","webpack://gvirantd/./src/common/components/form/basic-form/BasicFormItemList.js","webpack://gvirantd/./src/common/components/grid-view/DisplayTotalItem.js","webpack://gvirantd/./src/common/components/grid-view/components/abandon-dialog/AbandonDialog.js","webpack://gvirantd/./src/common/components/grid-view/components/add-to-folder/AddToFolderActions.js","webpack://gvirantd/./src/common/components/grid-view/components/content-pane/ContentPane.js","webpack://gvirantd/./src/common/components/grid-view/components/content-pane/advancedFilter/PropertyAdvancedFilter.js","webpack://gvirantd/./src/common/components/grid-view/components/content-pane/advancedFilter/QueryConditions.js","webpack://gvirantd/./src/common/components/grid-view/components/content-pane/advancedFilter/utils.js","webpack://gvirantd/./src/common/components/grid-view/components/list-grid/ListGrid.js","webpack://gvirantd/./src/common/components/grid-view/components/tile-grid/TileGrid.js","webpack://gvirantd/./src/common/components/grid-view/components/add-to-folder/AddToFolder.js","webpack://gvirantd/./src/common/components/grid-view/components/search-categories/SearchCategories.js","webpack://gvirantd/./src/common/components/grid-view/controllers/actions.js","webpack://gvirantd/./src/common/components/grid-view/controllers/constants.js","webpack://gvirantd/./src/common/components/grid-view/controllers/reducer.js","webpack://gvirantd/./src/common/components/grid-view/controllers/saga.js","webpack://gvirantd/./src/common/components/grid-view/controllers/selectors.js","webpack://gvirantd/./src/common/components/grid-view/utils.js","webpack://gvirantd/./src/common/components/icon-list/IconItem.js","webpack://gvirantd/./src/common/components/icon-list/IconList.js","webpack://gvirantd/./src/assets/classifications/automotive_icon.svg","webpack://gvirantd/./src/assets/classifications/camping_icon.svg","webpack://gvirantd/./src/assets/classifications/crops_icon.svg","webpack://gvirantd/./src/assets/classifications/food_beverage_tobacco.svg","webpack://gvirantd/./src/assets/classifications/footwear_icon.svg","webpack://gvirantd/./src/assets/classifications/home_appliances.svg","webpack://gvirantd/./src/assets/classifications/horticulture_plants.svg","webpack://gvirantd/./src/assets/classifications/lawn_garden_supplies.svg","webpack://gvirantd/./src/assets/classifications/live_animals.svg","webpack://gvirantd/./src/assets/classifications/personal_accessories.svg","webpack://gvirantd/./src/assets/classifications/pet-food.svg","webpack://gvirantd/./src/assets/classifications/power_equipment.svg","webpack://gvirantd/./src/assets/classifications/services_icon.svg","webpack://gvirantd/./src/assets/classifications/workshop_aids.svg","webpack://gvirantd/./src/assets/classifications/toy_icon.svg","webpack://gvirantd/./src/common/components/icon-list/assets.js","webpack://gvirantd/./src/assets/classifications/arts_crafts_needlework.svg","webpack://gvirantd/./src/assets/classifications/audio_visual_photography.svg","webpack://gvirantd/./src/assets/classifications/beauty_personal_care_hygiene.svg","webpack://gvirantd/./src/assets/classifications/building_products.svg","webpack://gvirantd/./src/assets/classifications/cleaning_hygiene_products.svg","webpack://gvirantd/./src/assets/classifications/clothing_icon.svg","webpack://gvirantd/./src/assets/classifications/communication_icon.svg","webpack://gvirantd/./src/assets/classifications/computing_icon.svg","webpack://gvirantd/./src/assets/classifications/cross_segment.svg","webpack://gvirantd/./src/assets/classifications/electrical_supplies.svg","webpack://gvirantd/./src/assets/classifications/fuels_gases.svg","webpack://gvirantd/./src/assets/classifications/healthcare_icon.svg","webpack://gvirantd/./src/assets/classifications/household_office_furniture_furnishings.svg","webpack://gvirantd/./src/assets/classifications/kitchenware_and_tableware.svg","webpack://gvirantd/./src/assets/classifications/lubricant_icon.svg","webpack://gvirantd/./src/assets/classifications/monetary_assets.svg","webpack://gvirantd/./src/assets/classifications/music_icon.svg","webpack://gvirantd/./src/assets/classifications/heating_icon.svg","webpack://gvirantd/./src/assets/classifications/safety_protection.svg","webpack://gvirantd/./src/assets/classifications/safety_security.svg","webpack://gvirantd/./src/assets/classifications/sports_equipment.svg","webpack://gvirantd/./src/assets/classifications/office_machinery.svg","webpack://gvirantd/./src/assets/classifications/storage_icon.svg","webpack://gvirantd/./src/assets/classifications/textual_print_material.svg","webpack://gvirantd/./src/assets/classifications/hand_equipment.svg","webpack://gvirantd/./src/common/components/icon-renderer/GridItemIcons.js","webpack://gvirantd/./src/common/components/icon-renderer/IconRenderer.js","webpack://gvirantd/./src/common/components/icon-renderer/IconRendererMapping.js","webpack://gvirantd/./src/assets/locations/hq.svg","webpack://gvirantd/./src/assets/locations/billing.svg","webpack://gvirantd/./src/assets/locations/office.svg","webpack://gvirantd/./src/assets/locations/factory.svg","webpack://gvirantd/./src/assets/locations/store.svg","webpack://gvirantd/./src/assets/locations/shipping.svg","webpack://gvirantd/./src/assets/locations/warehouse.svg","webpack://gvirantd/./src/common/components/image/Image.js","webpack://gvirantd/./src/common/components/arrangeable-layout/ArrangeableLayout.js","webpack://gvirantd/./src/common/components/message/components/chat-thread/ChatThread.js","webpack://gvirantd/./src/common/components/message/components/chat-header/ChatSearchMessages.js","webpack://gvirantd/./src/common/components/mail/components/search/EmailSearchMessage.js","webpack://gvirantd/./src/common/components/mail/components/thread/EmailThreadInfo.js","webpack://gvirantd/./src/common/components/email-editor/index.js","webpack://gvirantd/./src/common/components/message/Chat.js","webpack://gvirantd/./src/common/components/mail/Email.js","webpack://gvirantd/./src/common/components/dropdown/SelectLocale.js","webpack://gvirantd/./src/common/components/layout/Footer.js","webpack://gvirantd/./src/common/components/layout/Header.js","webpack://gvirantd/./src/common/components/text/Counter.js","webpack://gvirantd/./src/common/components/empty-view/EmptyList.js","webpack://gvirantd/./src/common/components/wrapper/WithAbility.js","webpack://gvirantd/./src/common/components/wrapper/WithHelmet.js","webpack://gvirantd/./src/common/components/wrapper/WithAbsoluteContainer.js","webpack://gvirantd/./src/common/components/wrapper/WithReloadInternalData.js","webpack://gvirantd/./src/common/components/button/VerticalButton.js","webpack://gvirantd/./src/common/components/button/delete-button/DeleteButton.js","webpack://gvirantd/./src/common/components/button/FormAddButton.js","webpack://gvirantd/./src/common/components/button/FormEditButton.js","webpack://gvirantd/./src/common/components/button/FormCancelButton.js","webpack://gvirantd/./src/common/components/button/FormCreateButton.js","webpack://gvirantd/./src/common/components/button/FormDeleteButton.js","webpack://gvirantd/./src/common/components/button/FormButton.js","webpack://gvirantd/./src/common/components/button/EditButton.js","webpack://gvirantd/./src/common/components/button/SwitchButton.js","webpack://gvirantd/./src/common/components/button/CopyButton.js","webpack://gvirantd/./src/common/components/button/ReGenerateButton.js","webpack://gvirantd/./src/common/components/button/ShowHideButton.js","webpack://gvirantd/./src/common/components/button/BoldTextButton.js","webpack://gvirantd/./src/common/components/button/GeneralButton.js","webpack://gvirantd/./src/common/components/button/BorderButton.js","webpack://gvirantd/./src/hooks/useUploadModal.js","webpack://gvirantd/./src/common/components/uploadFile/UploadFileModal.js","webpack://gvirantd/./src/common/components/grid-view/mappers/mapToDragColumndef.js","webpack://gvirantd/./src/common/components/grid-view/components/content-pane/advancedFilter/RenderAdvancedFilter.js","webpack://gvirantd/./src/common/components/grid-view/components/content-pane/advancedFilter/AdvanceFilterPanel.js","webpack://gvirantd/./src/common/components/grid-view/GridView.js","webpack://gvirantd/./src/common/components/ag-grid/AgGridClient.js","webpack://gvirantd/./src/common/components/ag-grid/AgGridThumbnail.js","webpack://gvirantd/./src/common/components/ag-grid/components/AgGridIcons.js","webpack://gvirantd/./src/common/components/textarea/Textarea.js","webpack://gvirantd/./src/common/components/slickslider/text-slick-slider/TextSlickSlider.js","webpack://gvirantd/./src/common/components/ag-grid/components/WithAggridHeaderEdit.js","webpack://gvirantd/./src/i18n/messages/message-ag-grid.js","webpack://gvirantd/./src/common/components/ag-grid/components/AgGridDownloadOptions.js","webpack://gvirantd/./src/i18n/messages/logoAsset.js","webpack://gvirantd/./src/common/components/modal-edit-logo/LogoAssetGrid.js","webpack://gvirantd/./src/common/components/modal-edit-logo/EditLogoModal.js","webpack://gvirantd/./src/common/components/image/ProfileImage.js","webpack://gvirantd/./src/common/components/profile-address/ProfileAddress.js","webpack://gvirantd/./src/common/components/contact-action/ContactActions.js","webpack://gvirantd/./src/common/components/info-with-label/InfoWithLabel.js","webpack://gvirantd/./src/common/components/textarea-grid/TextAreaGrid.js","webpack://gvirantd/./src/common/components/tab-layout/TabLayout.js","webpack://gvirantd/./src/common/components/badge/Action.js","webpack://gvirantd/./src/common/components/badge/Chat.js","webpack://gvirantd/./src/common/components/badge/Task.js","webpack://gvirantd/./src/common/components/badge/constants.js","webpack://gvirantd/./src/common/components/badge/Email.js","webpack://gvirantd/./src/common/components/cropImage/CropImage.js","webpack://gvirantd/./src/common/components/history/HistorySection.js","webpack://gvirantd/./src/common/components/history/ProfileContactHistory.js","webpack://gvirantd/./src/common/components/tooltip/TooltipParagraph.js","webpack://gvirantd/./src/common/components/member-grid/MemberGlnList.js","webpack://gvirantd/./src/common/components/tooltip/GlnTooltip.js","webpack://gvirantd/./src/static/DownloadMethod.js","webpack://gvirantd/./src/common/components/type-picker/TypePicker.js","webpack://gvirantd/./src/common/components/service-type/ServiceTypeMapping.js","webpack://gvirantd/./src/common/components/service-type/ServiceType.js","webpack://gvirantd/./src/common/components/label-value-wrapper/LabelValueWrapper.js","webpack://gvirantd/./src/common/components/iframe-preview/IframePreview.js","webpack://gvirantd/./src/common/components/color-picker/ColorPicker.js","webpack://gvirantd/./src/common/components/dialog-function/DialogOkFunction.js","webpack://gvirantd/./src/common/components/dialog-function/DialogModal.js","webpack://gvirantd/./src/common/components/markdown/markdownRenderers/TextRender.js","webpack://gvirantd/./src/common/components/markdown/markdownRenderers/TableRender.js","webpack://gvirantd/./src/common/components/markdown/mdMedia/MdImage.js","webpack://gvirantd/./src/common/components/markdown/mdMedia/MdVideo.js","webpack://gvirantd/./src/common/components/markdown/mdMedia/MdYoutube.js","webpack://gvirantd/./src/common/components/markdown/markdownRenderers/ImageRender.js","webpack://gvirantd/./src/common/components/markdown/markdownRenderers/ParagraphRender.js","webpack://gvirantd/./src/common/components/markdown/markdownRenderers/HeadingRender.js","webpack://gvirantd/./src/common/components/markdown/EnhancedMarkdown.js","webpack://gvirantd/./src/services/templateMarkdown/index.js","webpack://gvirantd/./src/services/templateMarkdown/endpoints.js","webpack://gvirantd/./src/common/components/markdown/customToolbar/components/entity/MdEntityTool.js","webpack://gvirantd/./src/common/components/markdown/customToolbar/components/entity/MdEditInterEntity.js","webpack://gvirantd/./src/common/components/markdown/customToolbar/components/entity/MdInterEntityTool.js","webpack://gvirantd/./src/common/components/markdown/EnhancedMarkdownEditor.js","webpack://gvirantd/./src/common/components/markdown/uploadMedia/components/mdCustomMediaModal/MarkdownGroupInput.js","webpack://gvirantd/./src/common/components/markdown/uploadMedia/components/mdCustomMediaModal/MarkdownMediaCustomModal.js","webpack://gvirantd/./src/common/components/markdown/uploadMedia/components/mdUploadIMediaItem/MarkdownUploadItem.js","webpack://gvirantd/./src/common/components/markdown/customToolbar/components/text/MdTextFont.js","webpack://gvirantd/./src/common/components/markdown/customToolbar/components/text/MdToolTextColor.js","webpack://gvirantd/./src/common/components/markdown/uploadMedia/components/mdMediaCustomPreview/MarkdownAddParagraph.js","webpack://gvirantd/./src/common/components/markdown/uploadMedia/components/mdMediaCustomPreview/ParagraphConfigTag.js","webpack://gvirantd/./src/common/components/markdown/uploadMedia/components/mdMediaCustomPreview/MarkdownMediaCustomPreview.js","webpack://gvirantd/./src/common/components/markdown/uploadMedia/MarkdownUploadMedia.js","webpack://gvirantd/./src/common/components/markdown/customToolbar/components/text/MdTextSize.js","webpack://gvirantd/./src/common/components/markdown/customToolbar/components/text/MdToolTypeAndFont.js","webpack://gvirantd/./src/common/components/markdown/customToolbar/components/text/MdToolTextSampleSyntax.js","webpack://gvirantd/./src/common/components/markdown/customToolbar/components/text/MdToolTextGuideAndResult.js","webpack://gvirantd/./src/common/components/markdown/customToolbar/components/text/MdToolText.js","webpack://gvirantd/./src/common/components/markdown/customToolbar/components/table/MdTableEditToolbar.js","webpack://gvirantd/./src/utils/input.js","webpack://gvirantd/./src/common/components/markdown/customToolbar/components/table/MdTableEdit.js","webpack://gvirantd/./src/common/components/markdown/customToolbar/components/table/MdToolbarTable.js","webpack://gvirantd/./src/common/components/markdown/customToolbar/components/table/MdTableList.js","webpack://gvirantd/./src/common/components/markdown/customToolbar/components/table/MdToolTable.js","webpack://gvirantd/./src/common/components/markdown/customToolbar/components/shortcode/MdCCEula.js","webpack://gvirantd/./src/common/components/markdown/customToolbar/MdEditorCustomToolbar.js","webpack://gvirantd/./src/common/components/modal-add-to-folder/ModalAddToFolder.js","webpack://gvirantd/./src/common/components/modal-share/ShareModal.js","webpack://gvirantd/./src/common/components/modal-share/ShareMappingModal.js","webpack://gvirantd/./src/common/components/contact-card/ContactCardUserInfo.js","webpack://gvirantd/./src/common/components/contact-card/ContactCardContactItem.js","webpack://gvirantd/./src/common/components/contact-card/ContactCardContactInfo.js","webpack://gvirantd/./src/common/components/contact-card/ContactCard.js","webpack://gvirantd/./src/common/components/modal-contact-card/ContactCardModal.js","webpack://gvirantd/./src/common/components/anonymous-view/AnonLogin.js","webpack://gvirantd/./src/common/components/anonymous-view/AnonViewWrap.js","webpack://gvirantd/./src/common/components/notification/CustomNotification.js","webpack://gvirantd/./src/common/components/modal-logo-assets/LogoAssetModal.js","webpack://gvirantd/./src/common/components/email-selection/EmailSelection.js","webpack://gvirantd/./src/common/components/backgroundEdit/BackgroundImageEdit.js","webpack://gvirantd/./src/common/components/section-wrapper/SectionWrapper.js","webpack://gvirantd/./src/common/components/btn-save-cancel/EditButtonsSection.js","webpack://gvirantd/./src/common/components/form/Form.js","webpack://gvirantd/./src/common/components/form/FormSection.js","webpack://gvirantd/./src/common/components/form/tagInput/TagInput.js","webpack://gvirantd/./src/common/components/form/saveCancelGroup/SaveCancelGroup.js","webpack://gvirantd/./src/common/components/form/slider-number/SliderNumber.js","webpack://gvirantd/./src/common/components/form/avatar-tag-autocomplete/components/AvatarTagItem.js","webpack://gvirantd/./src/common/components/form/avatar-tag-autocomplete/components/InputAutoHintList.js","webpack://gvirantd/./src/common/components/form/avatar-tag-autocomplete/index.js","webpack://gvirantd/./src/common/components/form/step-form/index.js","webpack://gvirantd/./src/common/components/form/use-form/useFormHook.js","webpack://gvirantd/./src/common/components/form/form-input-html/FormInputHtml.js","webpack://gvirantd/./src/common/components/form/member-select-input/MemberSelectInput.js","webpack://gvirantd/./src/common/components/input/TargetMarketInput.js","webpack://gvirantd/./src/common/components/form/containers/vertical-split-form-row/index.js","webpack://gvirantd/./src/common/components/form/three-state-checkbox-field-input/ThreeStateCheckboxFieldInput.js","webpack://gvirantd/./src/common/components/form/flag-country-selection-field-input/FlagCountrySelectionFieldInput.js","webpack://gvirantd/./src/common/components/input/NumberTextInput.js","webpack://gvirantd/./src/common/components/form/NewPasswordFormItem.js","webpack://gvirantd/./src/common/components/tag/squareTag/SquareTag.js","webpack://gvirantd/./src/common/components/tag/helpCenterTag/HelpCenterTagItem.js","webpack://gvirantd/./src/common/components/tag/helpCenterTag/HelpCenterTag.js","webpack://gvirantd/./src/common/components/button/modal/CloseModalBtn.js","webpack://gvirantd/./src/common/components/drapDropWrap/drap-and-drop/DrapWrap.js","webpack://gvirantd/./src/common/components/drapDropWrap/drap-and-drop/utils/mapGridViewDataToDragData.js","webpack://gvirantd/./src/common/components/drapDropWrap/drag-drop-pos/context/DragContext.js","webpack://gvirantd/./src/common/components/drapDropWrap/drag-drop-pos/hooks/useDrapDropHooks.js","webpack://gvirantd/./src/common/components/drapDropWrap/drag-drop-pos/hooks/useClickOuterDrag.js","webpack://gvirantd/./src/common/components/drapDropWrap/drag-drop-pos/index.js","webpack://gvirantd/./src/common/components/message/components/searchInput/ChatSearchInput.js","webpack://gvirantd/./src/common/components/message/controller/selectors.js","webpack://gvirantd/./src/common/components/mail/controller/mapToReducerState/index.js","webpack://gvirantd/./src/common/components/mail/controller/reducer.js","webpack://gvirantd/./src/common/components/mail/controller/selectors.js","webpack://gvirantd/./src/common/components/message/components/fields/SwitchAccount.js","webpack://gvirantd/./src/hooks/useClickEntity.js","webpack://gvirantd/./src/services/email/index.js","webpack://gvirantd/./src/services/email/endpoints.js","webpack://gvirantd/./src/common/components/message/components/fields/utils.js","webpack://gvirantd/./src/common/components/message/components/fields/hooks.js","webpack://gvirantd/./src/common/components/message/mapper/mapInnerHtmlToText.js","webpack://gvirantd/./src/common/components/message/components/fields/ChatInputBar.js","webpack://gvirantd/./src/common/components/message/mapper/mapFileTypeToPreviewFile.js","webpack://gvirantd/./src/common/components/message/components/attachList/AttachFile.js","webpack://gvirantd/./src/common/components/message/components/attachList/AttachList.js","webpack://gvirantd/./src/hooks/useCheckSenderAccount.js","webpack://gvirantd/./src/common/components/contact-card/messages/ContactCardMessageItem.js","webpack://gvirantd/./src/common/components/contact-card/messages/ContactCardMessageInfo.js","webpack://gvirantd/./src/common/components/contact-card/messages/ContactCardMessageActions.js","webpack://gvirantd/./src/common/components/mail/mapper/mapEmailsWithAttachUrl.js","webpack://gvirantd/./src/common/components/mail/controller/saga.js","webpack://gvirantd/./src/hooks/useSendMessageOrEmail.js","webpack://gvirantd/./src/common/components/contact-card/messages/ContactCardMessages.js","webpack://gvirantd/./src/common/components/message/components/chat-thread/ChatImageFile.js","webpack://gvirantd/./src/common/components/message/components/chat-thread/ChatFile.js","webpack://gvirantd/./src/common/components/message/components/chat-thread/ChatMessage.js","webpack://gvirantd/./src/common/components/message/components/chat-thread/VideoMessage.js","webpack://gvirantd/./src/common/components/message/components/chat-thread/ChatSpeech.js","webpack://gvirantd/./src/common/components/message/components/chat-thread/ChatMail.js","webpack://gvirantd/./src/common/components/message/components/chat-thread/ChatTurnItem.js","webpack://gvirantd/./src/common/components/message/components/chat-thread/ChatTurnList.js","webpack://gvirantd/./src/common/components/message/components/chat-header/HeaderFilter.js","webpack://gvirantd/./src/i18n/messages/chat.js","webpack://gvirantd/./src/common/components/message/components/chat-header/UpdateAvatarModal.js","webpack://gvirantd/./src/common/components/message/components/chat-header/UpdateThreadNameForm.js","webpack://gvirantd/./src/common/components/message/components/chat-header/SearchResultItem.js","webpack://gvirantd/./src/common/components/message/components/button/SearchMessageButton.js","webpack://gvirantd/./src/common/components/message/ui/MaximizeChatView/GroupCompanyDelete.js","webpack://gvirantd/./src/common/components/message/ui/MaximizeChatView/GroupPeopleDelete.js","webpack://gvirantd/./src/common/components/message/components/modal/ThreadUserList.js","webpack://gvirantd/./src/common/components/message/components/modal/ThreadInfoModal.js","webpack://gvirantd/./src/common/components/message/components/chat-header/ChatHeader.js","webpack://gvirantd/./src/common/components/message/components/chat-minimized/ChatMinimizeItem.js","webpack://gvirantd/./src/common/components/message/components/chat-minimized/ChatMinimizeList.js","webpack://gvirantd/./src/common/components/message/components/newChatModal/NewChatSearchBar.js","webpack://gvirantd/./src/common/components/message/components/msg/NewMsgReceive.js","webpack://gvirantd/./src/common/components/message/components/chat-content-header/ChatContentHeader.js","webpack://gvirantd/./src/common/components/message/components/button/ScrollButton.js","webpack://gvirantd/./src/common/components/message/controller/hooks.js","webpack://gvirantd/./src/common/components/message/ui/communication/Thread.js","webpack://gvirantd/./src/common/components/message/ui/MaximizeChatView/GroupPeopleCreate.js","webpack://gvirantd/./src/common/components/message/ui/MaximizeChatView/GroupCompanyCreate.js","webpack://gvirantd/./src/common/components/message/ui/MaximizeChatView/CreateNewThreadModal.js","webpack://gvirantd/./src/common/components/message/ui/MaximizeChatView/CreateNewThreadPrivate.js","webpack://gvirantd/./src/common/components/message/ui/MaximizeChatView/AddRemoveThreadModal.js","webpack://gvirantd/./src/common/components/videoCall/loading/VideoLoading.js","webpack://gvirantd/./src/common/components/videoCall/jitsi-frame/JitsiFrame.js","webpack://gvirantd/./src/common/components/videoCall/jitsi-frame/DisableFrame.js","webpack://gvirantd/./src/common/components/videoCall/branding/VideoCallBranding.js","webpack://gvirantd/./src/common/components/videoCall/button/VideoToolBtnWrap.js","webpack://gvirantd/./src/common/components/icon/ShareScreen.svg","webpack://gvirantd/./src/common/components/videoCall/toolbox/VideoCallToolbox.js","webpack://gvirantd/./src/common/components/videoCall/dial/CallerRington.js","webpack://gvirantd/./src/common/components/videoCall/branding/VideoCallRecommend.js","webpack://gvirantd/./src/common/components/videoCall/chat-video/index.js","webpack://gvirantd/./src/services/ext-video-call/endpoints.js","webpack://gvirantd/./src/utils/common/jitsiScriptLoader.js","webpack://gvirantd/./src/common/components/message/hooks/useChatDesctruction.js","webpack://gvirantd/./src/common/components/videoCall/VideoCall.js","webpack://gvirantd/./src/common/components/videoCall/button/DialBtnWrap.js","webpack://gvirantd/./src/common/components/videoCall/dial/ReceiverRington.js","webpack://gvirantd/./src/common/components/mail/components/search/EmailSearch.js","webpack://gvirantd/./src/common/components/mail/components/search/SearchEmailResultItem.js","webpack://gvirantd/./src/common/components/mail/components/search/SearchEmailButton.js","webpack://gvirantd/./src/common/components/mail/components/header/EmailFilter.js","webpack://gvirantd/./src/common/components/mail/components/header/EmailHeader.js","webpack://gvirantd/./src/common/components/mail/components/thread/EmailFileList.js","webpack://gvirantd/./src/common/components/mail/components/thread/EmailMessage.js","webpack://gvirantd/./src/common/components/mail/components/thread/EmailTurnItem.js","webpack://gvirantd/./src/common/components/mail/components/thread/EmailTurnList.js","webpack://gvirantd/./src/common/components/mail/controller/hooks.js","webpack://gvirantd/./src/common/components/mail/components/thread/EmailThreadList.js","webpack://gvirantd/./src/common/components/mail/components/input/utils.js","webpack://gvirantd/./src/common/components/mail/mapper/mapInnerHtmlToText.js","webpack://gvirantd/./src/common/components/mail/components/input/EmailInputBar.js","webpack://gvirantd/./src/common/components/mail/components/button/EmailScrollButton.js","webpack://gvirantd/./src/common/components/email-editor/components/frame/EmailEditorInlineText.js","webpack://gvirantd/./src/common/components/email-editor/components/frame/EmailEditorContentElement.js","webpack://gvirantd/./src/common/components/email-editor/components/settings/EmailEditorSectionSetting.js","webpack://gvirantd/./src/common/components/email-editor/components/input/EmailEditorColorInput.js","webpack://gvirantd/./src/common/components/email-editor/components/settings/EmailEditorFontSetting.js","webpack://gvirantd/./src/common/components/email-editor/controllers/context.js","webpack://gvirantd/./src/i18n/messages/email-editor.js","webpack://gvirantd/./src/common/components/email-editor/components/settings/EmailEditorShowHideSettings.js","webpack://gvirantd/./src/common/components/email-editor/components/settings/EmailEditorSenderInfoSettings.js","webpack://gvirantd/./src/common/components/email-editor/components/settings/EmailEditorGreetingSettings.js","webpack://gvirantd/./src/common/components/email-editor/components/settings/EmailEditorContentSettings.js","webpack://gvirantd/./src/common/components/email-editor/components/settings/EmailEditorProductRequestSettings.js","webpack://gvirantd/./src/common/components/email-editor/components/settings/EmailEditorShippingInfoSettings.js","webpack://gvirantd/./src/common/components/email-editor/components/settings/EmailEditorSigningOffSettings.js","webpack://gvirantd/./src/common/components/email-editor/components/frame/EmailEditorProductRequested.js","webpack://gvirantd/./src/common/components/email-editor/components/frame/EmailEditorNoContentShowMessage.js","webpack://gvirantd/./src/common/components/email-editor/components/frame/EmailEditorSenderInfo.js","webpack://gvirantd/./src/common/components/email-editor/components/frame/EmailEditorPlaceholder.js","webpack://gvirantd/./src/common/components/email-editor/components/frame/EmailEditorTag.js","webpack://gvirantd/./src/common/components/email-editor/components/frame/EmailEditorShippingTo.js","webpack://gvirantd/./src/common/components/email-editor/components/frame/EmailEditorSigningOff.js","webpack://gvirantd/./src/common/components/email-editor/components/frame/EmailEditorAdditionalInfo.js","webpack://gvirantd/./src/common/components/email-editor/components/frame/EmailEditorContent.js","webpack://gvirantd/./src/common/components/email-editor/components/frame/EmailEditorSectionMenu.js","webpack://gvirantd/./src/common/components/email-editor/components/frame/EmailEditorSectionAction.js","webpack://gvirantd/./src/common/components/email-editor/components/frame/EmailEditorSection.js","webpack://gvirantd/./src/common/components/email-editor/components/frame/EmailEditorGreeting.js","webpack://gvirantd/./src/common/components/email-editor/components/frame/EmailEditorFrame.js","webpack://gvirantd/./src/common/components/email-editor/components/toolbar/EmailEditorToolbar.js","webpack://gvirantd/./src/common/components/email-editor/components/get-html/EmailEditorGetHtml.js","webpack://gvirantd/./src/common/components/favorite-star/FavoriteStarIconRender.js","webpack://gvirantd/./src/common/components/asset-type-edit/constants.js","webpack://gvirantd/./src/common/components/asset-type-edit/AssetTypeEdit.js","webpack://gvirantd/./src/common/components/video-preview/VideoPreview.js","webpack://gvirantd/./src/common/components/advanced-search/EntityDraggable.js","webpack://gvirantd/./src/common/components/advanced-search/EntitiesAndAttributes.js","webpack://gvirantd/./src/common/components/advanced-search/QueryDraggable.js","webpack://gvirantd/./src/common/components/advanced-search/QueryConditions.js","webpack://gvirantd/./src/common/components/advanced-search/AdvancedSearch.js","webpack://gvirantd/./src/common/components/space/FullWidthSpace.js","webpack://gvirantd/./src/common/components/text/TextTooltip.js","webpack://gvirantd/./src/common/components/workflow-maintain/CreateWorkFlowModal.js","webpack://gvirantd/./src/common/components/countdownTrack/index.js","webpack://gvirantd/./src/common/components/chart/gauge/GaugeChart.js","webpack://gvirantd/./src/common/components/signal-handler/meeting-view/index.js","webpack://gvirantd/./src/common/components/signal-handler/index.js","webpack://gvirantd/./src/common/components/page-editor/mappers/index.js","webpack://gvirantd/./src/common/components/page-editor/hooks/index.js","webpack://gvirantd/./src/common/components/page-editor/components/drag-text-component/PageEditorDragText.js","webpack://gvirantd/./src/common/components/page-editor/components/page-editor-tool/PageEditorToolHeader.js","webpack://gvirantd/./src/common/components/page-editor/components/page-editor-tool/PageEditorSectionHeader.js","webpack://gvirantd/./src/common/components/page-editor/components/page-editor-tool/PageEditorInput.js","webpack://gvirantd/./src/common/components/page-editor/components/page-editor-tool/PageEditorMedia.js","webpack://gvirantd/./src/common/components/page-editor/components/page-editor-tool__add-new/PageEditorAddNew.js","webpack://gvirantd/./src/common/components/page-editor/components/page-editor-tool__add-new/PageEditorToolAddNewImage.js","webpack://gvirantd/./src/common/components/page-editor/components/page-editor-tool__add-new/PageEditorToolAddNewText.js","webpack://gvirantd/./src/common/components/page-editor/components/page-editor-tool__add-new/PageEditorToolAddNewYoutube.js","webpack://gvirantd/./src/common/components/page-editor/components/page-editor-tool/PageEditorDragTextEdit.js","webpack://gvirantd/./src/common/components/page-editor/components/page-editor-tool/PageEditorDragImageEdit.js","webpack://gvirantd/./src/common/components/page-editor/components/page-editor-tool/PageEditorDragYoutubeEdit.js","webpack://gvirantd/./src/common/components/page-editor/components/page-editor-tool/KeyboardHint.js","webpack://gvirantd/./src/common/components/page-editor/components/page-editor-tool/PageEditorBackgroundEdit.js","webpack://gvirantd/./src/common/components/page-editor/components/page-editor-tool/PageEditorForm.js","webpack://gvirantd/./src/common/components/page-editor/components/page-editor-tool/pageEditorToolBtn.js","webpack://gvirantd/./src/common/components/page-editor/hooks/pageEditorToolHooks.js","webpack://gvirantd/./src/common/components/page-editor/components/page-editor-tool/PageEditorTool.js","webpack://gvirantd/./src/common/components/page-editor/components/page-editor-background/PageEditorBackground.js","webpack://gvirantd/./src/common/components/page-editor/components/drag-image-component/PageEditorDragImage.js","webpack://gvirantd/./src/common/components/page-editor/components/drag-youtube-component/PageEditorDragYoutube.js","webpack://gvirantd/./src/common/components/page-editor/components/page-editor-inner/index.js","webpack://gvirantd/./src/common/components/page-editor/hooks/pageEditorHooks.js","webpack://gvirantd/./src/common/components/page-editor/PageEditor.js","webpack://gvirantd/./src/common/components/page-editor/PageEditorPreview.js","webpack://gvirantd/./src/common/components/fieldset/Fieldset.js","webpack://gvirantd/./src/common/components/rivir-alert/Action.js","webpack://gvirantd/./src/common/components/rivir-alert/WorkflowAlertItem.js","webpack://gvirantd/./src/common/components/rivir-alert/CreditCardAlert.js","webpack://gvirantd/./src/services/rivirAlert/index.js","webpack://gvirantd/./src/services/rivirAlert/endpoints.js","webpack://gvirantd/./src/hooks/useRivirAlert.js","webpack://gvirantd/./src/common/components/rivir-alert/index.js","webpack://gvirantd/./src/common/components/validate-field-name/ValidateFieldName.js","webpack://gvirantd/./src/common/components/input-time-outlook/InputTimeOutLook.js","webpack://gvirantd/./src/common/components/custom-transfer/CustomTransfer.js","webpack://gvirantd/./src/common/components/ribbon/RibbonDivider.js","webpack://gvirantd/./src/utils/dom.js","webpack://gvirantd/./src/hooks/useShowMoreRibbonButtons.js","webpack://gvirantd/./src/common/components/ribbon/RibbonBar.js","webpack://gvirantd/./src/hooks/ribbonBarHooks.js","webpack://gvirantd/./src/common/components/ribbon/RibbonPortal.js","webpack://gvirantd/./src/common/components/preview-requirements/PreviewRequirementsModal.js","webpack://gvirantd/./src/common/components/ribbon/button/MinimumRequirementsValidate.js","webpack://gvirantd/./src/common/components/preview-requirements/MinimumRequirementPropertiesInput.js","webpack://gvirantd/./src/common/components/download-new-form-item/LockFormItemInput.js","webpack://gvirantd/./src/common/components/download-new-form-item/ToggleLockAllFormItemInput.js","webpack://gvirantd/./src/common/components/download-new-form-item/hooks.js","webpack://gvirantd/./src/common/components/download-new-form-item/ValueFormItemInput.js","webpack://gvirantd/./src/common/components/download-new-form-item/ManualFieldNoLoop.js","webpack://gvirantd/./src/common/components/download-new-form-item/ManualFieldFilling.js","webpack://gvirantd/./src/common/components/download-new-form-item/utils.js","webpack://gvirantd/./src/common/components/download-new-form-item/ModalFormItem.js","webpack://gvirantd/./src/common/components/download-new-form-item/DownloadFormItem.js","webpack://gvirantd/./src/common/components/product-nested-detail-grid/NestedGrid.js","webpack://gvirantd/./src/common/components/product-nested-detail-grid/NestedArrayTypeAttribute.js","webpack://gvirantd/./src/common/components/product-nested-detail-grid/NestedDetailCellRenderer.js","webpack://gvirantd/./src/common/components/product-nested-detail-grid/NestedDetailFramework.js","webpack://gvirantd/./src/common/components/section-header/SectionHeader.js","webpack://gvirantd/./src/common/components/product-category-tree/useProductCategoryTree.js","webpack://gvirantd/./src/common/components/product-category-tree/ProductCategoryTree.js","webpack://gvirantd/./src/common/components/product-subscription/ProductSubscriptionMappingModal.js","webpack://gvirantd/./src/common/components/tooltip/TooltipTitle.js","webpack://gvirantd/./src/common/components/form/form-item/FormItem.js","webpack://gvirantd/./src/common/components/carousel-section/index.js","webpack://gvirantd/./src/common/components/index.js","webpack://gvirantd/./src/common/components/indicator/Indicator.js","webpack://gvirantd/./src/common/components/indicator/SuspendIndicator.js","webpack://gvirantd/./src/common/components/input/CheckboxGroup.js","webpack://gvirantd/./src/common/components/layout/Content.js","webpack://gvirantd/./src/common/components/layout/GridStyleLayout.js","webpack://gvirantd/./src/common/components/list/DataDisplay.js","webpack://gvirantd/./src/common/components/list/EntityList.js","webpack://gvirantd/./src/common/components/mail/controller/actions.js","webpack://gvirantd/./src/common/components/mail/controller/constants.js","webpack://gvirantd/./src/common/components/mapping-properties/CustomizeGrid.js","webpack://gvirantd/./src/common/components/mapping-properties/MappingSourceProperties.js","webpack://gvirantd/./src/common/components/mapping-properties/hooks.js","webpack://gvirantd/./src/common/components/mapping-properties/utils.js","webpack://gvirantd/./src/common/components/member-preview/UserContactInfo.js","webpack://gvirantd/./src/common/components/member-preview/MemberTagLine.js","webpack://gvirantd/./src/common/components/member-preview/queries.js","webpack://gvirantd/./src/common/components/member-preview/MemberPanelGdsnList.js","webpack://gvirantd/./src/common/components/google-map-modal/ItemMap.js","webpack://gvirantd/./src/common/components/google-map-modal/InfoWindow.js","webpack://gvirantd/./src/common/components/google-map-modal/MarkerMap.js","webpack://gvirantd/./src/common/components/google-map-modal/GoogleMapViewModal.js","webpack://gvirantd/./src/common/components/member-preview/MemberPanel.js","webpack://gvirantd/./src/common/components/message/controller/actions.js","webpack://gvirantd/./src/common/components/message/controller/constants.js","webpack://gvirantd/./src/common/components/message/controller/mapToReducerState/index.js","webpack://gvirantd/./src/common/components/message/controller/reducer.js","webpack://gvirantd/./src/common/components/message/mapper/mapMesssagesWithAttachUrl.js","webpack://gvirantd/./src/common/components/minimum-requirements/MinimumRequirementsRow.js","webpack://gvirantd/./src/common/components/minimum-requirements/MinimumRequirementsText.js","webpack://gvirantd/./src/common/components/minimum-requirements/MinimumRequirementsTitle.js","webpack://gvirantd/./src/common/components/minimum-requirements/MinimumRequirementsWrapperContent.js","webpack://gvirantd/./src/common/components/modal-download-folder/DownloadFolderMetadata.js","webpack://gvirantd/./src/common/components/modal-download-folder/DownloadFolderLayout.js","webpack://gvirantd/./src/common/components/modal-download-folder/DownloadFolderStep.js","webpack://gvirantd/./src/common/components/modal-download-folder/DownloadFolderModalFooter.js","webpack://gvirantd/./src/common/components/modal-download-folder/settings/DownloadFolderBasicSetting.js","webpack://gvirantd/./src/common/components/modal-download-folder/settings/product/DownloadFolderProductMapping.js","webpack://gvirantd/./src/common/components/modal-download-folder/settings/product/DownloadFolderSettingCollapse.js","webpack://gvirantd/./src/common/components/modal-download-folder/settings/product/DownloadFolderHierarchySetting.js","webpack://gvirantd/./src/common/components/modal-download-folder/settings/product/DownloadFolderProductSetting.js","webpack://gvirantd/./src/common/components/modal-download-folder/settings/asset/DownloadFolderAssetSetting.js","webpack://gvirantd/./src/common/components/modal-download-folder/settings/member/DownloadFolderMemberSetting.js","webpack://gvirantd/./src/common/components/modal-download-folder/settings/query/DownloadFolderQuerySetting.js","webpack://gvirantd/./src/common/components/modal-download-folder/settings/reporting/DownloadFolderReportingSetting.js","webpack://gvirantd/./src/common/components/modal-download-folder/settings/DownloadFolderItemsSetting.js","webpack://gvirantd/./src/common/components/modal-download-folder/settings/DownloadFolderSettings.js","webpack://gvirantd/./src/common/components/modal-download-folder/schedule/DownloadFolderMonthSetting.js","webpack://gvirantd/./src/common/components/modal-download-folder/schedule/DownloadFolderWeekSetting.js","webpack://gvirantd/./src/common/components/modal-download-folder/schedule/DownloadFolderSchedule.js","webpack://gvirantd/./src/hooks/folders/useDownloadFolder.js","webpack://gvirantd/./src/common/components/modal-download-folder/DownloadFolderModal.js","webpack://gvirantd/./src/common/components/modal-download-folder/constants.js","webpack://gvirantd/./src/common/components/modal-share/utils.js","webpack://gvirantd/./src/common/components/modal/StyledModal.js","webpack://gvirantd/./src/common/components/modal/search-entity-modal/reassign-asset-to-member/SelectedMemberList.js","webpack://gvirantd/./src/common/components/modal/search-entity-modal/reassign-asset-to-member/FormMove.js","webpack://gvirantd/./src/common/components/modal/search-entity-modal/reassign-asset-to-member/SelectedAssetsList.js","webpack://gvirantd/./src/common/components/modal/search-entity-modal/mapper/mapToSearchParams.js","webpack://gvirantd/./src/common/components/modal/search-entity-modal/reassign-asset-to-member/index.js","webpack://gvirantd/./src/common/components/modal/search-entity-modal/reassign-product-to-member/SelectedMemberList.js","webpack://gvirantd/./src/common/components/modal/search-entity-modal/reassign-product-to-member/ProductFormMove.js","webpack://gvirantd/./src/common/components/modal/search-entity-modal/reassign-product-to-member/SelectedProductList.js","webpack://gvirantd/./src/common/components/modal/search-entity-modal/reassign-product-to-member/ModalMoveProductResult.js","webpack://gvirantd/./src/common/components/modal/search-entity-modal/reassign-product-to-member/index.js","webpack://gvirantd/./src/common/components/modal/search-entity-modal/reassign-gln-to-member/SelectedMemberList.js","webpack://gvirantd/./src/common/components/modal/search-entity-modal/reassign-gln-to-member/GLNFormMove.js","webpack://gvirantd/./src/common/components/modal/search-entity-modal/reassign-gln-to-member/index.js","webpack://gvirantd/./src/common/components/modal/search-entity-modal/move-user-to-member/SelectedMemberList.js","webpack://gvirantd/./src/common/components/modal/search-entity-modal/move-user-to-member/TargetMemberList.js","webpack://gvirantd/./src/common/components/modal/search-entity-modal/move-user-to-member/SelectedUserInfo.js","webpack://gvirantd/./src/common/components/modal/search-entity-modal/hooks.js","webpack://gvirantd/./src/common/components/modal/search-entity-modal/move-user-to-member/index.js","webpack://gvirantd/./src/common/components/modal/search-entity-modal/move-all-entities-to-member/MoveAllOptionsCheckboxs.js","webpack://gvirantd/./src/common/components/modal/search-entity-modal/move-all-entities-to-member/MemberMapping.js","webpack://gvirantd/./src/common/components/modal/search-entity-modal/move-all-entities-to-member/MoveResults.js","webpack://gvirantd/./src/common/components/modal/search-entity-modal/move-all-entities-to-member/queries.js","webpack://gvirantd/./src/common/components/modal/search-entity-modal/move-all-entities-to-member/index.js","webpack://gvirantd/./src/common/components/modal/search-entity-modal/create-or-retarget-product-overlay/OverlayOptions.js","webpack://gvirantd/./src/common/components/modal/search-entity-modal/create-or-retarget-product-overlay/MemberMapping.js","webpack://gvirantd/./src/common/components/modal/search-entity-modal/create-or-retarget-product-overlay/queries.js","webpack://gvirantd/./src/common/components/modal/search-entity-modal/create-or-retarget-product-overlay/index.js","webpack://gvirantd/./src/common/components/modal/search-entity-modal/parent-child-member-hierarchies/MemberMapping.js","webpack://gvirantd/./src/common/components/modal/search-entity-modal/parent-child-member-hierarchies/queries.js","webpack://gvirantd/./src/common/components/modal/search-entity-modal/parent-child-member-hierarchies/index.js","webpack://gvirantd/./src/hooks/useCheckDisableInitialWorkflowSpec.js","webpack://gvirantd/./src/common/components/modal/search-entity-modal/search-entity-all-type-modal/SearchGridItemModal.js","webpack://gvirantd/./src/common/components/modal/search-entity-modal/search-entity-all-type-modal/SearchEntityBtn.js","webpack://gvirantd/./src/common/components/modal/search-entity-modal/components/SearchGrid.js","webpack://gvirantd/./src/common/components/modal/search-entity-modal/components/SearchGridItemPagination.js","webpack://gvirantd/./src/common/components/modal/search-entity-modal/components/SearchItemSelectList.js","webpack://gvirantd/./src/common/components/modal/search-entity-modal/components/SearchGridItemButton.js","webpack://gvirantd/./src/common/components/modal/search-entity-modal/components/Container.js","webpack://gvirantd/./src/common/components/nested-advance-Search/hook/reducer.js","webpack://gvirantd/./src/common/components/nested-advance-Search/hook/hook.js","webpack://gvirantd/./src/common/components/nested-advance-Search/hook/utils.js","webpack://gvirantd/./src/common/components/openItem/OpenItemFullView.js","webpack://gvirantd/./src/common/components/openItem/OpenItemContentPane.js","webpack://gvirantd/./src/common/components/openItem/OpenItemAntdTab.js","webpack://gvirantd/./src/common/components/antd-otp/utils.js","webpack://gvirantd/./src/common/components/antd-otp/index.js","webpack://gvirantd/./src/common/components/otp/components/shared/PhoneSection.js","webpack://gvirantd/./src/common/components/otp/components/shared/EmailSection.js","webpack://gvirantd/./src/common/components/otp/constants/index.js","webpack://gvirantd/./src/common/components/otp/utils/utils.js","webpack://gvirantd/./src/common/components/otp/queries/index.js","webpack://gvirantd/./src/common/components/otp/hooks/useOtpCheck.js","webpack://gvirantd/./src/common/components/otp/components/otp-check/OtpCheck.js","webpack://gvirantd/./src/common/components/otp/components/shared/OtpHintImage.js","webpack://gvirantd/./src/common/components/otp/hooks/useOtpTrigger.js","webpack://gvirantd/./src/common/components/otp/components/otp-trigger/OtpTrigger.js","webpack://gvirantd/./src/common/components/otp/components/otp-verify-login/OtpVerifyLogin.js","webpack://gvirantd/./src/common/components/otp/components/shared/SessionEnded.js","webpack://gvirantd/./src/common/components/otp/components/otp-verify-change-mfa-phone/OtpVerifyChangeMfaPhone.js","webpack://gvirantd/./src/common/components/otp/components/otp-verify-unlock-account/OtpTriggerUnlockAccount.js","webpack://gvirantd/./src/common/components/otp/components/otp-verify-unlock-account/OtpCheckUnlockAccount.js","webpack://gvirantd/./src/common/components/otp/components/otp-verify-unlock-account/OtpVerifyUnlockAccount.js","webpack://gvirantd/./src/common/components/otp/hooks/useOtpVerify.js","webpack://gvirantd/./src/common/components/overlay/OriginValuePopover.js","webpack://gvirantd/./src/common/components/overlay/OverlayValueItem.js","webpack://gvirantd/./src/common/components/overlay/OverlayInputWrapper.js","webpack://gvirantd/./src/common/components/page-editor/constants/index.js","webpack://gvirantd/./src/common/components/preview-requirements/UpdateMinimumRequirementProductField.js","webpack://gvirantd/./src/utils/productGallery.js","webpack://gvirantd/./src/hooks/useProductGallery.js","webpack://gvirantd/./src/common/components/preview-requirements/UpdateMinimumRequirementProductGalleryModal.js","webpack://gvirantd/./src/common/components/preview-requirements/UpdateMinimumRequirementProductDocumentModal.js","webpack://gvirantd/./src/common/components/preview-requirements/OpenUpdateMinimumRequirementButton.js","webpack://gvirantd/./src/common/components/preview-requirements/constants.js","webpack://gvirantd/./src/common/components/previewable-modal/items/PreviewableModalHeader.js","webpack://gvirantd/./src/common/components/file-viewer/index.js","webpack://gvirantd/./src/common/components/previewable-modal/items/PreviewableModalBody.js","webpack://gvirantd/./src/common/components/previewable-modal/PreviewableModal.js","webpack://gvirantd/./src/common/components/product-add/ProductBrickCodeModal.js","webpack://gvirantd/./src/common/components/product-add/BrickCodeInput.js","webpack://gvirantd/./src/common/components/product-add/make-product-active/product-form/ChargeActiveProduct.js","webpack://gvirantd/./src/common/components/product-add/make-product-active/product-form/ResetFormStatus.js","webpack://gvirantd/./src/common/components/product-add/CreateProductForm.js","webpack://gvirantd/./src/common/components/product-add/CreateProductModalFooter.js","webpack://gvirantd/./src/common/components/product-add/CreateProductViaFormModal.js","webpack://gvirantd/./src/common/components/product-add/utils.js","webpack://gvirantd/./src/common/components/product-add/IXONECertificationWrapper.js","webpack://gvirantd/./src/common/components/product-add/IXONEConstants.js","webpack://gvirantd/./src/common/components/product-add/ProductCategory.js","webpack://gvirantd/./src/common/components/product-add/hooks.js","webpack://gvirantd/./src/common/components/product-add/make-product-active/AdditionalRequiredActiveProduct.js","webpack://gvirantd/./src/common/components/product-add/make-product-active/RequiredActiveProduct.js","webpack://gvirantd/./src/common/components/product-add/make-product-active/RequiredPropertyElement.js","webpack://gvirantd/./src/common/components/product-add/make-product-active/RequiredPropertyInput.js","webpack://gvirantd/./src/common/components/product-add/make-product-active/constants.js","webpack://gvirantd/./src/common/components/product-add/make-product-active/hooks.js","webpack://gvirantd/./src/common/components/product-add/make-product-active/utils.js","webpack://gvirantd/./src/common/components/product-add/useUpdateIXONEShield.js","webpack://gvirantd/./src/common/components/product-category-tree/utils.js","webpack://gvirantd/./src/common/components/product-header-image/ProductHeaderImage.js","webpack://gvirantd/./src/common/components/product-publication-setup/ErrorModal.js","webpack://gvirantd/./src/common/components/product-publication-setup/GDSNPublication.js","webpack://gvirantd/./src/common/components/product-publication-setup/PostToWalmart.js","webpack://gvirantd/./src/common/components/product-publication-setup/PublishProductComponent.js","webpack://gvirantd/./src/common/components/product-publication-setup/Recipient.js","webpack://gvirantd/./src/common/components/product-publication-setup/PartyItem.js","webpack://gvirantd/./src/common/components/product-publication-setup/PartyDataList.js","webpack://gvirantd/./src/i18n/messages/payment.js","webpack://gvirantd/./src/hooks/useCreditCardChargeWarning.js","webpack://gvirantd/./src/common/components/product-publication-setup/PublicationSetupModal.js","webpack://gvirantd/./src/common/components/product-publication-setup/utils.js","webpack://gvirantd/./src/common/components/product-subscription/ProductSubscriptionModal.js","webpack://gvirantd/./src/common/components/product-subscription/utils.js","webpack://gvirantd/./src/common/components/reporting/entity-and-attributes/hook.js","webpack://gvirantd/./src/common/components/reporting/entity-and-attributes/DropZone.js","webpack://gvirantd/./src/common/components/reporting/entity-and-attributes/ModuleDisplayName.js","webpack://gvirantd/./src/common/components/reporting/entity-and-attributes/EntityProperty.js","webpack://gvirantd/./src/common/components/reporting/entity-and-attributes/RowDragging.js","webpack://gvirantd/./src/common/components/reporting/entity-and-attributes/EntitiesAndAttributes.js","webpack://gvirantd/./src/pages/reporting/components/DataSwitchButton.js","webpack://gvirantd/./src/pages/reporting/components/SearchProperties.js","webpack://gvirantd/./src/common/components/reporting/entity-and-attributes/HeaderEntityAttributes.js","webpack://gvirantd/./src/common/components/reporting/entity-and-attributes/utils.js","webpack://gvirantd/./src/common/components/select/WrapperSelect.js","webpack://gvirantd/./src/common/components/select/index.js","webpack://gvirantd/./src/common/components/slot/Slot.js","webpack://gvirantd/./src/common/components/social-link/AddSocialLinkModal.js","webpack://gvirantd/./src/common/components/social-link/SocialIcon.js","webpack://gvirantd/./src/common/components/social-link/SocialLink.js","webpack://gvirantd/./src/common/components/tag/entity-status-tag/EntityStatusTag.js","webpack://gvirantd/./src/common/components/thumb/PreviewableThumb.js","webpack://gvirantd/./src/common/components/thumb/product/ProductThumbFooter.js","webpack://gvirantd/./src/common/components/thumb/ThumbnailItem.js","webpack://gvirantd/./src/common/components/thumb/product/EditableIcon.js","webpack://gvirantd/./src/common/components/thumb/product/GdsnShieldIcon.js","webpack://gvirantd/./src/assets/svg-icons/private-label.svg","webpack://gvirantd/./src/common/components/thumb/product/PrivateLabelcon.js","webpack://gvirantd/./src/common/components/thumb/product/ProductPackLevel.js","webpack://gvirantd/./src/common/components/thumb/product/ProductSubscription.js","webpack://gvirantd/./src/common/components/thumb/share/SharedIcon.js","webpack://gvirantd/./src/common/components/uploadFile/Constants.js","webpack://gvirantd/./src/common/components/uploadFile/UploadFile.js","webpack://gvirantd/./src/common/components/wrapper/WithIndicator.js","webpack://gvirantd/./src/common/components/wrapper/WithLoading.js","webpack://gvirantd/./src/common/components/wrapper/WrapperCalculatorSize.js","webpack://gvirantd/./src/common/components/wrapper/show-condition/isShowForSupplierMember.js","webpack://gvirantd/./src/common/components/wrapper/show-condition/isShowForSharedOnlyMember.js","webpack://gvirantd/./src/common/components/wrapper/show-condition/index.js","webpack://gvirantd/./src/common/queries/member-module.js","webpack://gvirantd/./src/common/queries/product-module.js","webpack://gvirantd/./src/config/assets.js","webpack://gvirantd/./src/config/axios.js","webpack://gvirantd/./src/common/components/page-editor/constants/mock.js","webpack://gvirantd/./src/config/FakeData.js","webpack://gvirantd/./src/utils/processReponse.js","webpack://gvirantd/./src/static/StatusCodes.js","webpack://gvirantd/./src/services/todoList/index.js","webpack://gvirantd/./src/services/todoList/endpoints.js","webpack://gvirantd/./src/redux/global/saga.js","webpack://gvirantd/./src/services/preload/index.js","webpack://gvirantd/./src/services/preload/endpoints.js","webpack://gvirantd/./src/redux/branding/saga.js","webpack://gvirantd/./src/redux/ribbon/saga.js","webpack://gvirantd/./src/redux/user/saga.js","webpack://gvirantd/./src/common/components/message/controller/saga.js","webpack://gvirantd/./src/pages/sso-product/controllers/saga.js","webpack://gvirantd/./src/configureStore.js","webpack://gvirantd/./src/context/Can.js","webpack://gvirantd/./src/context/Locale.js","webpack://gvirantd/./src/context/MemberFullContext.js","webpack://gvirantd/./src/context/Theme.js","webpack://gvirantd/./src/context/Timezone.js","webpack://gvirantd/./src/hooks/apl/useGetAPLGrid.js","webpack://gvirantd/./src/hooks/auth/queries.js","webpack://gvirantd/./src/hooks/configGridHooks.js","webpack://gvirantd/./src/hooks/createProductHooks.js","webpack://gvirantd/./src/hooks/documentAttachEventHook.js","webpack://gvirantd/./src/hooks/entityHooks.js","webpack://gvirantd/./src/hooks/folders/queries.js","webpack://gvirantd/./src/hooks/folders/useCancelScheduleDownload.js","webpack://gvirantd/./src/hooks/home/creditCardSlice.js","webpack://gvirantd/./src/pages/check-credit-card-info/hooks.js","webpack://gvirantd/./src/hooks/home/useCreditCardAlert.js","webpack://gvirantd/./src/hooks/impersonate/useBrokerHasInitiateBillingEvent.js","webpack://gvirantd/./src/hooks/useDeepCompareEffect.js","webpack://gvirantd/./src/hooks/useGetBasicUomEnum.js","webpack://gvirantd/./src/hooks/useCheckIsSuperUser.js","webpack://gvirantd/./src/hooks/useRibbon.js","webpack://gvirantd/./src/hooks/useImageLoaded.js","webpack://gvirantd/./src/hooks/useGetBranding.js","webpack://gvirantd/./src/hooks/useVisibleModal.js","webpack://gvirantd/./src/hooks/useCheckMemberType.js","webpack://gvirantd/./src/hooks/useProductSchema.js","webpack://gvirantd/./src/hooks/product/useQueryProductGrid.js","webpack://gvirantd/./src/hooks/asset/useQueryAssetGrid.js","webpack://gvirantd/./src/hooks/ticketing-system/useGetTicketTags.js","webpack://gvirantd/./src/hooks/ticketing-system/useGetTicketSupplier.js","webpack://gvirantd/./src/hooks/ticketing-system/useGetTicketProduct.js","webpack://gvirantd/./src/hooks/ticketing-system/useGetTicketAsset.js","webpack://gvirantd/./src/hooks/ticketing-system/useFollowTicket.js","webpack://gvirantd/./src/hooks/ticketing-system/useGetTicketChangeLog.js","webpack://gvirantd/./src/hooks/ticketing-system/useDeleteTicket.js","webpack://gvirantd/./src/hooks/ticketing-system/useTicketComment.js","webpack://gvirantd/./src/hooks/ticketing-system/useGetTicketGrid.js","webpack://gvirantd/./src/hooks/useFormatMessage.js","webpack://gvirantd/./src/hooks/useAllowRefetchQuery.js","webpack://gvirantd/./src/hooks/grid/useGridColumns.js","webpack://gvirantd/./src/hooks/member/useMemberLocation.js","webpack://gvirantd/./src/hooks/folders/useDownloadProductSetting.js","webpack://gvirantd/./src/hooks/qa-spec/useRefetchQaSpecData.js","webpack://gvirantd/./src/hooks/useCheckPermissionManageGroup.js","webpack://gvirantd/./src/hooks/permissions/useCheckDisableWithdrawPublicationModal.js","webpack://gvirantd/./src/hooks/ticketing-system/useTicketingSystem.js","webpack://gvirantd/./src/hooks/localStorage.js","webpack://gvirantd/./src/hooks/member/useCheckPaymentTermMonthAndMemberStatusCreditReview.js","webpack://gvirantd/./src/hooks/product-full/hooks.js","webpack://gvirantd/./src/hooks/product/overlay.js","webpack://gvirantd/./src/hooks/qas-require-field/dollarGeneralFields.js","webpack://gvirantd/./src/hooks/qas-require-field/useQasRequireField.js","webpack://gvirantd/./src/hooks/router/block-routing/event.js","webpack://gvirantd/./src/hooks/router/block-routing/utils.js","webpack://gvirantd/./src/hooks/router/block-routing/useHandleHistoryBlockEvent.js","webpack://gvirantd/./src/hooks/router/block-routing/useHandleCancelRouting.js","webpack://gvirantd/./src/hooks/router/block-routing/useRoutingConfirm.js","webpack://gvirantd/./src/hooks/router/block-routing/useHandleReloadPageKeyboardEvent.js","webpack://gvirantd/./src/hooks/router/block-routing/useBlockRouteChange.js","webpack://gvirantd/./src/hooks/ticketing-system/useGetTicketAssignTo.js","webpack://gvirantd/./src/hooks/ticketing-system/useTicketFullView.js","webpack://gvirantd/./src/common/components/grid-view/components/add-to-folder/AddToFolderConfirm.js","webpack://gvirantd/./src/hooks/useAddToFolder.js","webpack://gvirantd/./src/hooks/useAsync.js","webpack://gvirantd/./src/hooks/useCallbackRef.js","webpack://gvirantd/./src/hooks/useCheckAllowHooks.js","webpack://gvirantd/./src/hooks/useCheckCreditCardPermission.js","webpack://gvirantd/./src/hooks/useCheckFavoriteRoute.js","webpack://gvirantd/./src/hooks/useCheckIXOneCapture.js","webpack://gvirantd/./src/hooks/useCheckIsFolderOwner.js","webpack://gvirantd/./src/hooks/useCheckPermissionEditBrand.js","webpack://gvirantd/./src/hooks/useCheckPermissions.js","webpack://gvirantd/./src/hooks/useCheckPrivateMember.js","webpack://gvirantd/./src/hooks/useClearSearchText.js","webpack://gvirantd/./src/hooks/useClickOuter.js","webpack://gvirantd/./src/hooks/useClickOuterMultiple.js","webpack://gvirantd/./src/utils/closeDetail.js","webpack://gvirantd/./src/hooks/useCloseDetail.js","webpack://gvirantd/./src/hooks/useControllableState.js","webpack://gvirantd/./src/hooks/useCreditCardEula.js","webpack://gvirantd/./src/hooks/useCustomScroll.js","webpack://gvirantd/./src/hooks/useDisplayFilterButton.js","webpack://gvirantd/./src/hooks/useDoubleClick.js","webpack://gvirantd/./src/hooks/useExitDelay.js","webpack://gvirantd/./src/hooks/useExpandView.js","webpack://gvirantd/./src/hooks/useFavorite.js","webpack://gvirantd/./src/hooks/useFilterGrid.js","webpack://gvirantd/./src/hooks/useFolderByLevel.js","webpack://gvirantd/./src/hooks/useFullScreen.js","webpack://gvirantd/./src/hooks/useGetColumns.js","webpack://gvirantd/./src/hooks/useGetDataIdQuery.js","webpack://gvirantd/./src/hooks/useGetDataQueryConditions.js","webpack://gvirantd/./src/hooks/useGetMemberId.js","webpack://gvirantd/./src/hooks/useGetMemberInfo.js","webpack://gvirantd/./src/hooks/useGlobalModal.js","webpack://gvirantd/./src/hooks/useGridView.js","webpack://gvirantd/./src/hooks/useHubFilter.js","webpack://gvirantd/./src/hooks/useKeyDown.js","webpack://gvirantd/./src/hooks/useMdInstance.js","webpack://gvirantd/./src/hooks/useMutation.js","webpack://gvirantd/./src/pages/reporting/controllers/reducer.js","webpack://gvirantd/./src/pages/reporting/controllers/selectors.js","webpack://gvirantd/./src/hooks/useOpenReportingResult.js","webpack://gvirantd/./src/hooks/usePrevious.js","webpack://gvirantd/./src/hooks/useProductEnums.js","webpack://gvirantd/./src/hooks/useProductFullView.js","webpack://gvirantd/./src/hooks/useProductHierarchies.js","webpack://gvirantd/./src/hooks/useQuery.js","webpack://gvirantd/./src/pages/transition-page/controllers/saga.js","webpack://gvirantd/./src/hooks/useRedux.js","webpack://gvirantd/./src/pages/ticketing-system/controllers/saga.js","webpack://gvirantd/./src/hooks/useReloadDocumentCertificateTab.js","webpack://gvirantd/./src/hooks/useReloadPage.js","webpack://gvirantd/./src/hooks/useRemoveFolder.js","webpack://gvirantd/./src/hooks/useResize.js","webpack://gvirantd/./src/hooks/useSso.js","webpack://gvirantd/./src/hooks/useTabExpandProduct.js","webpack://gvirantd/./src/hooks/useUpdateContactCard.js","webpack://gvirantd/./src/hooks/useUpdateMemberAdditionalRequirements.js","webpack://gvirantd/./src/hooks/useGetMinimumRequirementFieldSchema.js","webpack://gvirantd/./src/hooks/useValidateMinimumRequirement.js","webpack://gvirantd/./src/hooks/useValidateStatusField.js","webpack://gvirantd/./src/hooks/useWindowUnload.js","webpack://gvirantd/./src/hooks/userInfoHook.js","webpack://gvirantd/./src/hooks/windowSize.js","webpack://gvirantd/./src/i18n/messages/apl.js","webpack://gvirantd/./src/i18n/messages/asset-full-view.js","webpack://gvirantd/./src/i18n/messages/assetDetail.js","webpack://gvirantd/./src/i18n/messages/assetPreview.js","webpack://gvirantd/./src/i18n/messages/brandedProduct.js","webpack://gvirantd/./src/i18n/messages/common.js","webpack://gvirantd/./src/i18n/messages/favorite.js","webpack://gvirantd/./src/i18n/messages/folder.js","webpack://gvirantd/./src/i18n/messages/gridView.js","webpack://gvirantd/./src/i18n/messages/home.js","webpack://gvirantd/./src/i18n/messages/login.js","webpack://gvirantd/./src/i18n/messages/maintenance.js","webpack://gvirantd/./src/i18n/messages/mapping.js","webpack://gvirantd/./src/i18n/messages/member-profile.js","webpack://gvirantd/./src/i18n/messages/message-my-company.js","webpack://gvirantd/./src/i18n/messages/messageAssetUpload.js","webpack://gvirantd/./src/i18n/messages/messages.js","webpack://gvirantd/./src/i18n/messages/minimum-requirement.js","webpack://gvirantd/./src/i18n/messages/product.js","webpack://gvirantd/./src/i18n/messages/qa-spec.js","webpack://gvirantd/./src/i18n/messages/share.js","webpack://gvirantd/./src/i18n/messages/ticket-system.js","webpack://gvirantd/./src/i18n/messages/timeout.js","webpack://gvirantd/./src/i18n/messages/user-profile.js","webpack://gvirantd/./src/i18n/messages/user.js","webpack://gvirantd/./src/i18n/messages/workflow.js","webpack://gvirantd/./src/i18n/index.js","webpack://gvirantd/./src/static/Localization.js","webpack://gvirantd/./src/common/provider/Language.js","webpack://gvirantd/./src/utils/common/checkEnviroment.js","webpack://gvirantd/./src/utils/common/init.js","webpack://gvirantd/./src/hooks/useInitApp.js","webpack://gvirantd/./src/routes/PrivateRoute.js","webpack://gvirantd/./src/routes/AnonymousRoute.js","webpack://gvirantd/./src/common/components/errorboundary/ErrorBoundary.js","webpack://gvirantd/./src/assets/svg-icons/error-svgrepo-com.svg","webpack://gvirantd/./src/assets/svg-icons/success-svgrepo-com.svg","webpack://gvirantd/./src/pages/interop-callback/ResultPage.js","webpack://gvirantd/./src/pages/interop-callback/InteropCallbackAuthentication.js","webpack://gvirantd/./src/routes/Routes.js","webpack://gvirantd/./src/App.js","webpack://gvirantd/./src/serviceWorker.js","webpack://gvirantd/./src/index.js","webpack://gvirantd/./src/config/env.js","webpack://gvirantd/./src/pages/articles/controllers/actions.js","webpack://gvirantd/./src/pages/articles/controllers/constants.js","webpack://gvirantd/./src/pages/articles/controllers/reducer.js","webpack://gvirantd/./src/pages/articles/controllers/selectors.js","webpack://gvirantd/./src/pages/asset-full-view/mapper/mapToAssetGs1EditOption.js","webpack://gvirantd/./src/pages/asset-full-view/components/add-link-product/AssetGS1Edit.js","webpack://gvirantd/./src/pages/asset-full-view/components/asset-preview/AssetPreviewDownloadBtn.js","webpack://gvirantd/./src/pages/asset-full-view/components/asset-preview/AssetPreviewTools.js","webpack://gvirantd/./src/pages/asset-full-view/components/asset-preview/AssetPreviewVideo.js","webpack://gvirantd/./src/hooks/asset/useAsset.js","webpack://gvirantd/./src/pages/asset-full-view/components/asset-preview/AssetPreview.js","webpack://gvirantd/./src/pages/asset-full-view/components/iframe-asset/IframeAsset.js","webpack://gvirantd/./src/pages/asset-full-view/components/form/asset-upload/shared/components.js","webpack://gvirantd/./src/pages/asset-full-view/components/form/asset-upload/shared/utils.js","webpack://gvirantd/./src/pages/asset-full-view/components/form/asset-upload/shared/hooks.js","webpack://gvirantd/./src/pages/asset-full-view/components/form/asset-upload/AssetUpload.js","webpack://gvirantd/./src/pages/asset-full-view/components/form/asset-upload/AssetUploadSelect.js","webpack://gvirantd/./src/pages/asset-full-view/components/form/asset-upload/AssetFtpList.js","webpack://gvirantd/./src/pages/asset-full-view/components/asset-edit/AssetEdit.js","webpack://gvirantd/./src/pages/asset-full-view/components/form/asset-upload/dropbox-upload/utils.js","webpack://gvirantd/./src/pages/asset-full-view/components/form/asset-upload/dropbox-upload/DropboxFiles.js","webpack://gvirantd/./src/pages/asset-full-view/components/form/asset-upload/dropbox-upload/DropboxActions.js","webpack://gvirantd/./src/pages/asset-full-view/components/form/asset-upload/dropbox-upload/hooks.js","webpack://gvirantd/./src/pages/asset-full-view/components/form/asset-upload/dropbox-upload/AssetDropboxUpload.js","webpack://gvirantd/./src/pages/asset-full-view/components/metadata-panel/AssociationIconRenderedBound.js","webpack://gvirantd/./src/pages/asset-full-view/components/metadata-panel/AssociationIconRendered.js","webpack://gvirantd/./src/pages/asset-full-view/components/confirmContent/ConfirmResult.js","webpack://gvirantd/./src/pages/asset-full-view/components/confirmContent/ConfirmContent.js","webpack://gvirantd/./src/pages/asset-full-view/components/confirmContent/ConfirmContentAsEdit.js","webpack://gvirantd/./src/pages/asset-full-view/components/form/asset-upload/asset-to-folder/AssetToFolderTool.js","webpack://gvirantd/./src/pages/asset-full-view/components/form/asset-upload/asset-to-folder/AssetToFolder.js","webpack://gvirantd/./src/pages/asset-full-view/components/metadata-panel/AssetAssociations.js","webpack://gvirantd/./src/pages/asset-full-view/components/metadata-panel/AssetCreator.js","webpack://gvirantd/./src/pages/asset-full-view/components/metadata-panel/AssetDownload.js","webpack://gvirantd/./src/common/components/asset-type-edit/AssetType.js","webpack://gvirantd/./src/common/components/asset-type-edit/AssetEdit.js","webpack://gvirantd/./src/common/components/asset-type-edit/index.js","webpack://gvirantd/./src/pages/asset-full-view/components/metadata-panel/MemberDefinedPropertiesPanel.js","webpack://gvirantd/./src/pages/asset-full-view/components/add-link-product/SearchProductForm.js","webpack://gvirantd/./src/pages/asset-full-view/components/add-link-product/LinkAssetToPimModal.js","webpack://gvirantd/./src/pages/asset-full-view/components/add-link-product/AssetGS1Preview.js","webpack://gvirantd/./src/pages/asset-full-view/components/metadata-panel/AddDRMForm.js","webpack://gvirantd/./src/static/Metadata.js","webpack://gvirantd/./src/pages/asset-full-view/components/metadata-panel/AssetOverview.js","webpack://gvirantd/./src/pages/asset-full-view/controllers/actions.js","webpack://gvirantd/./src/pages/asset-full-view/controllers/constants.js","webpack://gvirantd/./src/pages/asset-full-view/controllers/reducer.js","webpack://gvirantd/./src/pages/asset-full-view/controllers/saga.js","webpack://gvirantd/./src/pages/asset-full-view/controllers/selectors.js","webpack://gvirantd/./src/pages/branded-assets/components/view/AssetTileView.js","webpack://gvirantd/./src/pages/branded-assets/components/view/AssetThumbView.js","webpack://gvirantd/./src/pages/branded-assets/components/view/AssetDetailView.js","webpack://gvirantd/./src/pages/branded-assets/components/card/AssetThumbnailCard.js","webpack://gvirantd/./src/pages/branded-assets/components/card/AssetTileCard.js","webpack://gvirantd/./src/pages/branded-assets/components/card/AssetItemCard.js","webpack://gvirantd/./src/pages/branded-assets/components/card/AssetItemCardTop.js","webpack://gvirantd/./src/pages/branded-assets/components/card/AssetItemCardBottom.js","webpack://gvirantd/./src/pages/branded-assets/components/tile/AssetTileBody.js","webpack://gvirantd/./src/pages/branded-assets/components/tile/AssetTileHeader.js","webpack://gvirantd/./src/pages/branded-assets/components/tile/AssetTileFooter.js","webpack://gvirantd/./src/pages/branded-assets/components/tile/AssetTile.js","webpack://gvirantd/./src/pages/branded-assets/components/thumbnail/AssetThumbnail.js","webpack://gvirantd/./src/pages/branded-assets/components/panel/AssetPanel.js","webpack://gvirantd/./src/pages/branded-assets/components/panel/AssetPanelAssociation.js","webpack://gvirantd/./src/pages/branded-assets/components/panel/AssetPanelDownload.js","webpack://gvirantd/./src/pages/branded-assets/components/panel/AssetPanelThumbnailInfo.js","webpack://gvirantd/./src/i18n/messages/branded-assets-products.js","webpack://gvirantd/./src/pages/branded-assets/components/panel/link-assets/controller/selectors.js","webpack://gvirantd/./src/pages/branded-assets/components/panel/link-assets/GridLinkAssets.js","webpack://gvirantd/./src/pages/branded-assets/components/panel/link-assets/ItemLinkAsset.js","webpack://gvirantd/./src/pages/branded-assets/components/panel/link-assets/Helper.js","webpack://gvirantd/./src/pages/branded-assets/components/panel/link-assets/utils.js","webpack://gvirantd/./src/pages/branded-assets/components/panel/link-assets/LinkAssets.js","webpack://gvirantd/./src/pages/branded-assets/components/panel/link-assets/controller/actions.js","webpack://gvirantd/./src/pages/branded-assets/components/panel/link-assets/controller/constants.js","webpack://gvirantd/./src/pages/branded-assets/components/panel/link-assets/controller/reducers.js","webpack://gvirantd/./src/pages/branded-assets/components/panel/link-assets/controller/saga.js","webpack://gvirantd/./src/pages/branded-assets/controllers/actions.js","webpack://gvirantd/./src/pages/branded-assets/controllers/constants.js","webpack://gvirantd/./src/pages/branded-assets/controllers/reducer.js","webpack://gvirantd/./src/pages/branded-assets/controllers/saga.js","webpack://gvirantd/./src/pages/branded-assets/controllers/selectors.js","webpack://gvirantd/./src/pages/branded-members/components/card/MemberThumbnailCard.js","webpack://gvirantd/./src/common/components/thumb/member/MemberType.js","webpack://gvirantd/./src/pages/branded-members/components/tile-grid/items-new/MemberTileBody.js","webpack://gvirantd/./src/i18n/messages/branded-members.js","webpack://gvirantd/./src/pages/branded-members/components/tile-grid/items-new/MemberTileFooter.js","webpack://gvirantd/./src/pages/branded-members/components/tile-grid/items-new/MemberTileHeader.js","webpack://gvirantd/./src/pages/branded-members/components/tile-grid/MemberTileCard.js","webpack://gvirantd/./src/pages/branded-members/components/ban-list-modal/BanListModal.js","webpack://gvirantd/./src/pages/branded-members/components/member-logo/MemberLogo.js","webpack://gvirantd/./src/pages/branded-members/components/assets-for-member/hooks.js","webpack://gvirantd/./src/pages/branded-members/components/assets-for-member/utils.js","webpack://gvirantd/./src/pages/branded-members/components/assets-for-member/index.js","webpack://gvirantd/./src/pages/branded-members/components/products-for-member/hooks.js","webpack://gvirantd/./src/pages/branded-members/components/products-for-member/index.js","webpack://gvirantd/./src/pages/branded-members/controllers/actions.js","webpack://gvirantd/./src/pages/branded-members/controllers/constants.js","webpack://gvirantd/./src/pages/branded-members/controllers/reducer.js","webpack://gvirantd/./src/pages/branded-members/controllers/saga.js","webpack://gvirantd/./src/pages/branded-members/controllers/selectors.js","webpack://gvirantd/./src/pages/branded-products-apl/controllers/actions.js","webpack://gvirantd/./src/pages/branded-products-apl/controllers/constants.js","webpack://gvirantd/./src/pages/branded-products-apl/controllers/reducer.js","webpack://gvirantd/./src/pages/branded-products-apl/controllers/saga.js","webpack://gvirantd/./src/pages/branded-products-apl/controllers/selectors.js","webpack://gvirantd/./src/pages/branded-products/components/card/thumbnail/ProductThumbnail.js","webpack://gvirantd/./src/pages/branded-products/components/content-pane/SharedComponents.js","webpack://gvirantd/./src/pages/branded-products/components/content-pane/index.js","webpack://gvirantd/./src/pages/branded-products/components/custom-cell-components/customCellComponents.js","webpack://gvirantd/./src/pages/branded-products/components/card/tile/ProductTileHeader.js","webpack://gvirantd/./src/pages/branded-products/components/card/tile/ProductTileBody.js","webpack://gvirantd/./src/pages/branded-products/components/card/tile/ProductTileFooter.js","webpack://gvirantd/./src/pages/branded-products/components/card/tile/ProductTile.js","webpack://gvirantd/./src/pages/branded-products/components/detail/info/header/ProductCategory.js","webpack://gvirantd/./src/pages/branded-products/components/detail/info/header/ProductData.js","webpack://gvirantd/./src/pages/branded-products/components/detail/info/header/ProductDescription.js","webpack://gvirantd/./src/pages/branded-products/components/detail/info/header/ProductIdentification.js","webpack://gvirantd/./src/pages/branded-products/components/detail/info/header/ProductLogo.js","webpack://gvirantd/./src/pages/branded-products/components/detail/info/header/ProductRightData.js","webpack://gvirantd/./src/pages/branded-products/components/detail/info/ProductInfo.js","webpack://gvirantd/./src/pages/branded-products/components/detail/package-level/info/ProductPackageLevelInfo.js","webpack://gvirantd/./src/pages/branded-products/components/detail/package-level/ProductPackageLevel.js","webpack://gvirantd/./src/pages/branded-products/components/detail/product-ingredient/ProductIngredient.js","webpack://gvirantd/./src/common/components/slickslider/SlickSlider.js","webpack://gvirantd/./src/pages/branded-products/components/detail/assets/ProductAssets.js","webpack://gvirantd/./src/pages/branded-products/components/detail/ProductDetail.js","webpack://gvirantd/./src/pages/branded-products/components/brick-code/ProductBrickCode.js","webpack://gvirantd/./src/pages/branded-products/components/primarySizeUOM/PrimarySizeUOM.js","webpack://gvirantd/./src/pages/branded-products/components/publication-validation-error-check/hooks.js","webpack://gvirantd/./src/pages/branded-products/components/publication-validation-error-check/ProductItemSearchDrawer.js","webpack://gvirantd/./src/pages/branded-products/components/publication-validation-error-check/PublicationErrorProductDetail.js","webpack://gvirantd/./src/pages/branded-products/mapper/mapToPublishErrorAlert.js","webpack://gvirantd/./src/pages/branded-products/components/publication-validation-error-check/PublicationErrorDetailModal.js","webpack://gvirantd/./src/pages/branded-products/components/publication-validation-error-check/InstantFixForm.js","webpack://gvirantd/./src/common/components/product-add/ProductEditFormItem.js","webpack://gvirantd/./src/pages/branded-products/components/publication-validation-error-check/InstantFixFormRivirField.js","webpack://gvirantd/./src/pages/branded-products/components/publication-validation-error-check/PublicationErrorItem.js","webpack://gvirantd/./src/pages/branded-products/components/publication-validation-error-check/PubliccationCommonErrorList.js","webpack://gvirantd/./src/pages/branded-products/components/publication-validation-error-check/PackageItemInfo.js","webpack://gvirantd/./src/pages/branded-products/mapper/mapToFormValuePublicationInstantFix.js","webpack://gvirantd/./src/pages/branded-products/hooks/useFetchDataForErrorList.js","webpack://gvirantd/./src/pages/branded-products/components/publication-validation-error-check/PublicationErrorChecker.js","webpack://gvirantd/./src/pages/branded-products/components/publication-validation-error-check/index.js","webpack://gvirantd/./src/pages/branded-products/mapper/mapToPublishProductRequestParams.js","webpack://gvirantd/./src/pages/branded-products/components/publication-validation-view/PublicationValidationView.js","webpack://gvirantd/./src/pages/branded-products/utils/index.js","webpack://gvirantd/./src/pages/branded-products/controllers/actions.js","webpack://gvirantd/./src/pages/branded-products/controllers/constants.js","webpack://gvirantd/./src/pages/branded-products/controllers/reducer.js","webpack://gvirantd/./src/pages/branded-products/controllers/saga.js","webpack://gvirantd/./src/pages/branded-products/controllers/selectors.js","webpack://gvirantd/./src/pages/branded-products/hooks/useGetDefaultConfig.js","webpack://gvirantd/./src/pages/branded-reporting/components/thumbnail/ReportingThumbnail.js","webpack://gvirantd/./src/pages/branded-reporting/components/tile/ReportingTileBody.js","webpack://gvirantd/./src/pages/branded-reporting/components/tile/ReportingTileFooter.js","webpack://gvirantd/./src/pages/branded-reporting/components/tile/ReportingTileHeader.js","webpack://gvirantd/./src/pages/branded-reporting/components/tile/ReportingTile.js","webpack://gvirantd/./src/pages/branded-reporting/components/panel/ReportingPanel.js","webpack://gvirantd/./src/pages/check-credit-card-info/queries.js","webpack://gvirantd/./src/pages/communication-template/controllers/actions.js","webpack://gvirantd/./src/pages/communication-template/controllers/constants.js","webpack://gvirantd/./src/pages/communication-template/controllers/reducer.js","webpack://gvirantd/./src/pages/communication-template/controllers/selectors.js","webpack://gvirantd/./src/pages/company-profile/components/tabs/billing/MemberCardInformation.js","webpack://gvirantd/./src/pages/company-profile/components/tabs/billing/hooks.js","webpack://gvirantd/./src/pages/company-profile/components/tabs/billing/queries.js","webpack://gvirantd/./src/pages/company-profile/components/tabs/contacts/companyLocation/CompanyLocationForm.js","webpack://gvirantd/./src/pages/company-profile/components/tabs/overview/children-company/hooks.js","webpack://gvirantd/./src/pages/company-profile/components/tabs/overview/editDetailSchema.js","webpack://gvirantd/./src/pages/company-profile/components/tabs/system/category-management/components/ProductCategoryForm.js","webpack://gvirantd/./src/pages/company-profile/components/tabs/system/category-management/constant.js","webpack://gvirantd/./src/pages/company-profile/components/tabs/system/category-management/hooks/useProductCategoryManagement.js","webpack://gvirantd/./src/pages/company-profile/components/tabs/system/category-management/utils.js","webpack://gvirantd/./src/pages/company-profile/components/tabs/system/interoperability/hooks.js","webpack://gvirantd/./src/pages/company-profile/components/tabs/system/interoperability/utils.js","webpack://gvirantd/./src/pages/company-profile/controllers/actions.js","webpack://gvirantd/./src/pages/company-profile/controllers/constants.js","webpack://gvirantd/./src/pages/company-profile/controllers/reducers/memberProfileReducer.js","webpack://gvirantd/./src/pages/company-profile/controllers/reducers/memberOverviewReducer.js","webpack://gvirantd/./src/pages/company-profile/controllers/reducers/memberContactHistoryReducer.js","webpack://gvirantd/./src/pages/company-profile/controllers/reducers/memberColumnGridReducer.js","webpack://gvirantd/./src/pages/company-profile/controllers/reducers/memberTagLineReducer.js","webpack://gvirantd/./src/pages/company-profile/controllers/reducers/memberPreviewReducer.js","webpack://gvirantd/./src/pages/company-profile/controllers/reducer.js","webpack://gvirantd/./src/pages/company-profile/components/tabs/crm/activity/IconRenderer.js","webpack://gvirantd/./src/pages/company-profile/controllers/filterService.js","webpack://gvirantd/./src/pages/company-profile/controllers/saga.js","webpack://gvirantd/./src/pages/home/ribbon/member-full/controllers/constants.js","webpack://gvirantd/./src/pages/company-profile/controllers/selectors.js","webpack://gvirantd/./src/pages/company/controllers/constants.js","webpack://gvirantd/./src/pages/company/controllers/reducer.js","webpack://gvirantd/./src/pages/company/controllers/selectors.js","webpack://gvirantd/./src/pages/dashboard/controllers/actions.js","webpack://gvirantd/./src/pages/dashboard/controllers/constants.js","webpack://gvirantd/./src/pages/dashboard/controllers/reducer.js","webpack://gvirantd/./src/pages/dashboard/controllers/selectors.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/eula/BackToEula.js","webpack://gvirantd/./src/pages/eula-maintenance/components/form/EulaRibbon.js","webpack://gvirantd/./src/pages/eula-maintenance/controllers/actions.js","webpack://gvirantd/./src/pages/eula-maintenance/controllers/constants.js","webpack://gvirantd/./src/pages/eula-maintenance/controllers/reducer.js","webpack://gvirantd/./src/pages/eula-maintenance/controllers/selectors.js","webpack://gvirantd/./src/pages/favorite-queries/components/thumbnail/QueryThumbnail.js","webpack://gvirantd/./src/pages/favorite-queries/components/tile/QueryTileBody.js","webpack://gvirantd/./src/pages/favorite-queries/components/tile/QueryTileFooter.js","webpack://gvirantd/./src/pages/favorite-queries/components/tile/QueryTileHeader.js","webpack://gvirantd/./src/pages/favorite-queries/components/tile/QueryTile.js","webpack://gvirantd/./src/pages/favorite-queries/components/panel/QueryPanel.js","webpack://gvirantd/./src/pages/folders/components/custom-cell-components/index.js","webpack://gvirantd/./src/pages/folders/components/icons/FolderDownloadScheduledIcon.js","webpack://gvirantd/./src/pages/folders/components/thumbnail/FolderThumbnail.js","webpack://gvirantd/./src/pages/folders/components/tile/FolderTile.js","webpack://gvirantd/./src/pages/folders/components/tile/FolderTileHeader.js","webpack://gvirantd/./src/pages/folders/components/tile/FolderTileBody.js","webpack://gvirantd/./src/pages/folders/components/tile/FolderTileFooter.js","webpack://gvirantd/./src/pages/folders/components/panel-edit/FolderPanelEditContent.js","webpack://gvirantd/./src/pages/folders/components/panel-edit/FolderPanelEditHeader.js","webpack://gvirantd/./src/pages/folders/components/panel/FolderPanelContent.old.js","webpack://gvirantd/./src/pages/folders/components/panel-edit/FolderPanelEdit.js","webpack://gvirantd/./src/pages/folders/components/panel/utils.js","webpack://gvirantd/./src/pages/folders/components/panel/FolderPanelActions.js","webpack://gvirantd/./src/pages/folders/components/panel/FolderPanelContent.js","webpack://gvirantd/./src/pages/folders/components/panel/FolderPanelHeader.js","webpack://gvirantd/./src/pages/folders/components/panel/FolderPanel.js","webpack://gvirantd/./src/hooks/useMemberPublicContact.js","webpack://gvirantd/./src/pages/folders/components/FolderContentPane.js","webpack://gvirantd/./src/pages/folders/components/view/ModalAddFolderToAPL.js","webpack://gvirantd/./src/pages/folders/components/view/FolderGridView.js","webpack://gvirantd/./src/pages/folders/folder-details/FolderEditDetailContent.js","webpack://gvirantd/./src/pages/folders/components/modal/FolderEditModal.js","webpack://gvirantd/./src/pages/folders/components/utils.js","webpack://gvirantd/./src/pages/folders/controllers/actions.js","webpack://gvirantd/./src/pages/folders/controllers/constants.js","webpack://gvirantd/./src/pages/folders/controllers/reducer.js","webpack://gvirantd/./src/pages/folders/controllers/selectors.js","webpack://gvirantd/./src/hooks/useDownloadFolderSetting.js","webpack://gvirantd/./src/pages/folders/folder-details/utils.js","webpack://gvirantd/./src/pages/folders/hooks/useFolderContentPane.js","webpack://gvirantd/./src/pages/folders/hooks/useAgGridFolder.js","webpack://gvirantd/./src/pages/folders/shared/hooks.js","webpack://gvirantd/./src/pages/folders/shared/components.js","webpack://gvirantd/./src/pages/folders/shared/grid-detail/GridDetailView.js","webpack://gvirantd/./src/pages/folders/shared/utils.js","webpack://gvirantd/./src/pages/home/components/navigation/FilterIndicator.js","webpack://gvirantd/./src/pages/home/components/navigation/HomeNavActionGroup.js","webpack://gvirantd/./src/pages/home/components/navigation/HomeNavSubMenuTitle.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/folders/EditFolderDetail.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/folders/DeleteFolderDetail.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/folders/CreateFolderDetail.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/folder/FolderDetailSection.js","webpack://gvirantd/./src/pages/home/ribbon/FolderDetailRibbon.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/folders/CreateFolder.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/folders/pathname.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/folders/DeleteFolders.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/folders/EditFolder.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/folder/FolderSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/folders/OpenFolder.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/folders/DownloadFolder.js","webpack://gvirantd/./src/pages/home/ribbon/FoldersGridRibbon.js","webpack://gvirantd/./src/pages/home/ribbon/Home.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-full/Subscription.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/product-packaging/ProductPackagingModal.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-full/ProductPackaging.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-full/ProductClone.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-full/SyndicationHistorySection.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-full/MappingInitSyncSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-full/ProductFullAction.js","webpack://gvirantd/./src/pages/home/ribbon/ProductFullViewRibbon.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/advanced-search/RunQueryControl.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/advanced-search/QuerySection.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/advanced-search/LayoutSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/advanced-search/SaveQueryControl.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/advanced-search/CancelQueryControl.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/advanced-search/EditQueryControl.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/advanced-search/CloneQueryControl.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/advanced-search/SaveSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/advanced-search/OpenResultControl.js","webpack://gvirantd/./src/pages/home/ribbon/ReportingFullViewRibbon.js","webpack://gvirantd/./src/pages/home/ribbon/asset-full/controllers/actions.js","webpack://gvirantd/./src/pages/home/ribbon/asset-full/controllers/constants.js","webpack://gvirantd/./src/pages/home/ribbon/asset-full/controllers/reducer.js","webpack://gvirantd/./src/pages/home/ribbon/asset-full/controllers/selectors.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/Control.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/advanced-search/ClearColumnsControl.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/advanced-search/ClearQueryControl.js","webpack://gvirantd/./src/pages/reporting/hook/useScheduleDownload.js","webpack://gvirantd/./src/pages/reporting/components/DownloadSchedule/ReportingDownloadScheduleMonthSetting.js","webpack://gvirantd/./src/pages/reporting/components/DownloadSchedule/ReportingDownloadScheduleWeekSetting.js","webpack://gvirantd/./src/pages/reporting/components/DownloadSchedule/ReportingDownloadScheduleForm.js","webpack://gvirantd/./src/pages/reporting/components/DownloadSchedule/ReportingScheduleFooter.js","webpack://gvirantd/./src/pages/reporting/components/ReportingScheduleModal.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/advanced-search/OpenSchedule.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/asset/DeletePreview.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/asset/GeneratePreview.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/asset/OpenAsset.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/common/AddOpenItemBtn.js","webpack://gvirantd/./src/common/components/button/svg-icons/copy.svg","webpack://gvirantd/./src/pages/home/ribbon/components/controls/folders/CopyFolder.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/folders/CopyFolderModal.js","webpack://gvirantd/./src/common/components/modal-action/ModalAction.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/folders/CreateFolderModal.js","webpack://gvirantd/./src/common/components/modal-manage-schedule-download/ManageScheduleDownloadLayout.js","webpack://gvirantd/./src/hooks/folders/useDeleteScheduleDownload.js","webpack://gvirantd/./src/hooks/folders/useUpdateScheduleDownload.js","webpack://gvirantd/./src/common/components/modal-manage-schedule-download/ManageScheduleDownloadToolbar.js","webpack://gvirantd/./src/common/components/modal-manage-schedule-download/utils.js","webpack://gvirantd/./src/common/components/modal-manage-schedule-download/ManageScheduleDownloadGrid.js","webpack://gvirantd/./src/common/components/modal-manage-schedule-download/ManageScheduleDownloadModal.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/folders/ManageScheduleDownload.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/folders/MoveFolder.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/folders/MoveFolderModal.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/home/AddFolder.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/home/FavoriteControl.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/home/UnfavoriteControl.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/home/AddFolderToNewAPL.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/home/AddProductToNewApl.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/home/AddSearchProductToNewApl.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/home/Addition.js","webpack://gvirantd/./src/common/components/nested-advance-Search/OpenAdvanceFilter.js","webpack://gvirantd/./src/common/components/nested-advance-Search/NestedAdvanceSearch.js","webpack://gvirantd/./src/common/components/nested-advance-Search/NestedAdvanceFilter.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/home/AdvanceStack.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/home/Back.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/home/DeleteFolder.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/home/DetailView.js","webpack://gvirantd/./src/common/components/modal/grid-view-modal/components/GridItem.js","webpack://gvirantd/./src/common/components/modal/grid-view-modal/components/Grid.js","webpack://gvirantd/./src/common/components/modal/grid-view-modal/find-in-all-folder-modal/FindEntityInFolderResultToolbar.js","webpack://gvirantd/./src/common/components/modal/grid-view-modal/find-in-all-folder-modal/FindEntityInFolderResultFooter.js","webpack://gvirantd/./src/common/components/modal/grid-view-modal/find-in-all-folder-modal/FindInAllFolderModal.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/home/SearchFolder.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/home/grid-query/hooks.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/home/grid-query/utils.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/product-hierarchy/AddHierarchyModal.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-full/AddHierarchy.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-full/EditHierarchy.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-full/CopyHierarchy.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-full/DeleteHierarchy.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-full/HierarchyActions.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-full/ProductDetailView.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-full/ProductHierarchy.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-full/ProductSheets.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-full/hook.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product/SelectedProductList.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product/AssignCategoryToProductModal.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product/BulkEditProduct.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/withdraw-publication/constants.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/withdraw-publication/utils.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/withdraw-publication/PublicationTable.js","webpack://gvirantd/./src/hooks/useWithdrawPublication.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/withdraw-publication/WithdrawPublicationModal.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product/WithdrawPublicationButton.js","webpack://gvirantd/./src/common/components/button/svg-icons/ICO_10.13.svg","webpack://gvirantd/./src/pages/home/ribbon/components/controls/shared/EmailControl.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/shared/SendToFTP.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/shared/SendToMessage.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/home-grid/Favorite.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/home-grid/Folder.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/member-full/MemberAddOpenItemSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/home-grid/OtherLayout.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/home/InlineControl.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/home/QuickView.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/home/Search.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/home/AdvanceSearch.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/home/grid-query/GridColumns.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/home/grid-query/SaveGrid.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/home/grid-query/AddCuratedQueryConfig.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/home/grid-query/AddCuratedQuery.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/home/grid-query/SavedConfigurations.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/home/grid-query/ClearQuery.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/member-full/EditControl.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/member-full/SaveControl.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/member-full/CancelEdit.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/help/ToggleUploadMediaBtn.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/post-full/ToggleHelpUploadMediaSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/generate-preview/GeneratePreviewModal.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/generate-confirm/GenerateConfirmModal.js","webpack://gvirantd/./src/utils/browser.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/generate-preview/GeneratePreviewItem.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/manage-share/ManageShareModal.js","webpack://gvirantd/./src/hooks/useGetDataAdvanceFilter.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/home/AddProductFromMember.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/home/DownloadProductTemplateFromMember.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/home/UploadProductTemplateFromMember.js","webpack://gvirantd/./src/pages/home/ribbon/components/ribbbonSectionDivider/RibbonSectionDivider.js","webpack://gvirantd/./src/pages/home/ribbon/components/index.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/home/grid-query/ManageGridQuery.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/bulk-edit-product/CopyProductToolbar.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/bulk-edit-product/CopyProductResult.js","webpack://gvirantd/./src/hooks/copyProductPropertiesHooks.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/bulk-edit-product/CopyProductPropertiesModal.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/bulk-edit-product/ExportProductToolbar.js","webpack://gvirantd/./src/hooks/exportProductPropertiesHooks.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/bulk-edit-product/ExportProductPropertiesModal.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/bulk-edit-product/ExportPropertiesTree.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/bulk-edit-product/ImportProductBulkEditModal.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/bulk-edit-product/hook.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/product-hierarchy/HierarchyProductList.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/product-hierarchy/AddProductHierarchy.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/product-hierarchy/HierarchyLevelProductItem.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/product-hierarchy/HierarchyPackageLevel.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/product-hierarchy/HierarchyChangeProductMessage.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/product-hierarchy/HierarchyAddProductButton.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/product-hierarchy/HierarchyLevelList.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/asset/CreateAsset.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/asset/ReplaceAsset.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/asset/DeleteAssets.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/asset/EditMultipleAsset.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/asset/UpdateMultipleAsset.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/asset/MoveAssetsToMember.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/asset/hook.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/asset/AssetActionsSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/asset/grid/OpenAssetSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/asset/ReplacePreviewGrid.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/asset/grid/PreviewSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/asset/DownloadAsset.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/asset/DownloadSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/asset/LinkAssets.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/asset/LinkSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/asset/EditAsset.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/asset/SaveAsset.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/asset/CancelAsset.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/asset/ReplacePreview.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/asset/full/PreviewSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/asset/full/FilterSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/asset/VersionAsset.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/asset/VersionsSection.js","webpack://gvirantd/./src/common/components/mapping-properties/ShowGridConfig.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/customize-grid/hooks.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/customize-grid/GridConfiguration.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/customize-grid/ClearApplyGridConfig .js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/customize-grid/CustomizeGrid.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/customize-grid/index.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/customize-grid/utils.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/home-grid/AdditionSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/member-grid/CategoriesControl.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/home-grid/Categories.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/home-grid/DetailSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/home-grid/Execute.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/home/grid-query/MutationGridConfig.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/home/grid-query/CreateQueryModal.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/home/grid-query/ModalFormEdit.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/home/grid-query/GridQueryTable.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/home/grid-query/ShareQueryModal.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/home/grid-query/GridQueryAction.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/home/grid-query/ManageQueriesModal.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/home-grid/GridConfig.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/home-grid/ViewLayout.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/member-grid/DownloadInformation.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/member-grid/Download.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product-apl/constants.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product-apl/hooks.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/AssignCategoryToProduct.js","webpack://gvirantd/./src/services/nif/index.js","webpack://gvirantd/./src/services/nif/endpoints.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/components/download-nif-form-section/hooks.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/components/download-nif-form-section/SearchNifFormModal.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/DownloadNifFormSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/FilterPackageSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/ProductCategoryHierarchy.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/ProductBrickCodeHierarchy.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/FilterProductCategoryModal.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/FilterMyAplsModal.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/FilterMyAPLs.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/FilterProductSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product/HistoryControl.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/HistorySection.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/IXOneSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/MakeProductActive.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/OpenProduct.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product/MoveProductsToMember.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/ProductGridAction.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/SelectCategory.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/components/bulk-product-overlay-dropdown/ExportBulkProductOverlay.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/components/bulk-product-overlay-dropdown/ImportBulkProductOverlay.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/components/bulk-product-overlay-dropdown/BulkProductOverlay.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/components/bulk-product-overlay-dropdown/useCheckDisabledBulkProductOverlay.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/components/cod-payment/hooks.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/components/cod-payment/CODPayment.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/components/cod-payment/constants.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/components/cod-payment/PaymentChargeValidating.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/components/cod-payment/utils.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/components/ixone-credit-card/IXOneContext.js","webpack://gvirantd/./src/pages/product-full-view/components/product-hierarchy/IXOneHierarchyTree.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/components/ixone-credit-card/constants.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/components/ixone-credit-card/IXOneHierarchy.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/components/ixone-section/IXOneHierarchyModal.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/components/ixone-section/IXOneHierarchyAction.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/components/ixone-credit-card/hooks.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/components/ixone-credit-card/IXOneCreditCard.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/components/ixone-section/IXOneNewProductForm.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/components/ixone-section/IXOneCapture.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/components/ixone-section/hooks.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/components/ixone-section/utils.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/components/make-product-active/hooks.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/components/make-product-active/ProductsActiveValidating.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/components/make-product-active/MissingRequirementProduct.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/components/make-product-active/utils.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/components/make-product-active/ProductsActiveProcessing.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/components/make-product-active/ActiveProductCharge.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-full/ProductEdit.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/components/overlay-action-dropdown/EditProductOverlay.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/components/overlay-action-dropdown/queries.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/components/overlay-action-dropdown/CreateProductOverlay.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/components/overlay-action-dropdown/DeleteProductOverlay.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/components/overlay-action-dropdown/OverlayActionDropdown.js","webpack://gvirantd/./src/assets/shared-ribbon/ManageShared.svg","webpack://gvirantd/./src/pages/home/ribbon/components/controls/shared/ManageSharing.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/shared/ManageSharingSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/shared/MoveAllToMember.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/shared/utils.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/shared/ShareControl.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/shared/ShareSection.js","webpack://gvirantd/./src/pages/home/ribbon/form-manange/components/form-history-grid/HistoryEntity.js","webpack://gvirantd/./src/assets/security-request/create-request.svg","webpack://gvirantd/./src/pages/home/ribbon/security-request/NewRequest.js","webpack://gvirantd/./src/pages/home/ribbon/security-request/hooks.js","webpack://gvirantd/./src/pages/home/utils.js","webpack://gvirantd/./src/pages/login/introduction/index.js","webpack://gvirantd/./src/pages/maintenance-form/controllers/actions.js","webpack://gvirantd/./src/pages/maintenance-form/controllers/constants.js","webpack://gvirantd/./src/pages/maintenance-form/controllers/reducer.js","webpack://gvirantd/./src/pages/maintenance-form/controllers/selectors.js","webpack://gvirantd/./src/pages/maintenance-form/mappers/index.js","webpack://gvirantd/./src/pages/maintenance/components/help/category/HelpCategoryGridViewIcon.js","webpack://gvirantd/./src/pages/maintenance/components/help/category/HelpCategoryIconFilter.js","webpack://gvirantd/./src/pages/maintenance/controllers/actions.js","webpack://gvirantd/./src/pages/maintenance/controllers/constants.js","webpack://gvirantd/./src/pages/maintenance/controllers/reducer.js","webpack://gvirantd/./src/pages/maintenance/components/help/post/icon/PostTypeIcon.js","webpack://gvirantd/./src/pages/maintenance/controllers/saga.js","webpack://gvirantd/./src/utils/agGridUtils.js","webpack://gvirantd/./src/pages/maintenance/controllers/selectors.js","webpack://gvirantd/./src/pages/mapping/controllers/actions.js","webpack://gvirantd/./src/pages/mapping/controllers/constants.js","webpack://gvirantd/./src/pages/mapping/controllers/reducer.js","webpack://gvirantd/./src/pages/mapping/controllers/saga.js","webpack://gvirantd/./src/pages/mapping/controllers/selectors.js","webpack://gvirantd/./src/pages/markup-maintenance/controllers/actions.js","webpack://gvirantd/./src/pages/markup-maintenance/controllers/constants.js","webpack://gvirantd/./src/pages/markup-maintenance/controllers/reducer.js","webpack://gvirantd/./src/pages/markup-maintenance/controllers/saga.js","webpack://gvirantd/./src/pages/markup-maintenance/controllers/selectors.js","webpack://gvirantd/./src/pages/member-maintenance/components/user-form/constants.js","webpack://gvirantd/./src/pages/member-maintenance/controllers/actions.js","webpack://gvirantd/./src/pages/member-maintenance/controllers/constants.js","webpack://gvirantd/./src/pages/member-maintenance/controllers/reducer.js","webpack://gvirantd/./src/pages/member-maintenance/controllers/selectors.js","webpack://gvirantd/./src/pages/minimum-requirements/components/modal/utils.js","webpack://gvirantd/./src/pages/minimum-requirements/constants.js","webpack://gvirantd/./src/pages/new-main-page/controllers/actions.js","webpack://gvirantd/./src/pages/new-main-page/controllers/constants.js","webpack://gvirantd/./src/pages/product-apl-detail/controllers/actions.js","webpack://gvirantd/./src/pages/product-apl-detail/controllers/constants.js","webpack://gvirantd/./src/pages/product-apl-detail/controllers/reducer.js","webpack://gvirantd/./src/pages/product-apl-detail/controllers/selectors.js","webpack://gvirantd/./src/pages/product-full-view/components/product-primary-info/ProductOverviewSubscriptionShield.js","webpack://gvirantd/./src/pages/product-full-view/components/product-primary-info/ProductOverviewTitle.js","webpack://gvirantd/./src/pages/product-full-view/components/product-primary-info/ProductOverviewStatusInfo.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-full/GdsnShield.js","webpack://gvirantd/./src/pages/product-full-view/components/product-primary-info/ProductPrimaryInfo.js","webpack://gvirantd/./src/pages/product-full-view/components/product-overview/ProductOverviewBricCode.js","webpack://gvirantd/./src/pages/product-full-view/components/product-overview/ProductOverviewDimension.js","webpack://gvirantd/./src/pages/product-full-view/components/product-overview/ProductOverviewQuestionButton.js","webpack://gvirantd/./src/pages/product-full-view/components/certifications/CertificationImages.js","webpack://gvirantd/./src/pages/product-full-view/components/certifications/CertificationItem.js","webpack://gvirantd/./src/pages/product-full-view/components/certifications/CertificationModal.js","webpack://gvirantd/./src/static/ProductCertifications.js","webpack://gvirantd/./src/pages/product-full-view/components/certifications/ProductOverviewCertification.js","webpack://gvirantd/./src/pages/product-full-view/components/product-overview/Contants.js","webpack://gvirantd/./src/pages/product-full-view/components/product-overview/CalculatedPropertiesModal.js","webpack://gvirantd/./src/pages/product-full-view/components/product-overview/ProductOverviewMetadata.js","webpack://gvirantd/./src/pages/product-full-view/components/product-overview/ProductOverviewContent.js","webpack://gvirantd/./src/pages/product-full-view/components/product-overview/ProductOverview.js","webpack://gvirantd/./src/pages/product-full-view/components/package-level/PackageHeaderDrawer.js","webpack://gvirantd/./src/pages/product-full-view/components/package-level/ImageUnit.js","webpack://gvirantd/./src/pages/product-full-view/components/package-level/PackageContentDrawer.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/header-action/HeaderEditActions.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/header-component/ProductHeaderSocial.js","webpack://gvirantd/./src/common/queries/utils.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/header-component/queries.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/header-component/ProductHeaderContactInfoEditModal.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/header-component/ProductHeaderContactInfo.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/header-component/ProductHeaderProfileImage.js","webpack://gvirantd/./src/pages/product-full-view/mappers/mapToProductContact.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/ProductHeader.js","webpack://gvirantd/./src/pages/product-full-view/components/ProductImageSlider.js","webpack://gvirantd/./src/pages/product-full-view/components/ProductGallery.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/ProductDocument.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/ProductMarketingAll.js","webpack://gvirantd/./src/pages/product-full-view/components/preview-modal/MarketingPreviewArea.js","webpack://gvirantd/./src/pages/product-full-view/components/preview-modal/PreviewMarketingModal.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/ProductMarketingVideo.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/multiple-panel/tab-allergens/AllergenForm.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/multiple-panel/tab-allergens/AllergenElement.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/multiple-panel/tab-allergens/overlay/utils.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/multiple-panel/tab-allergens/overlay/AllergenOverlay.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/multiple-panel/tab-allergens/index.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/multiple-panel/tab-allergens/TabAllergens.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/multiple-panel/facts-panel/overlay/WrapperIngredient.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/multiple-panel/tab-ingredients/RenderIngredients.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/multiple-panel/tab-ingredients/IngredientsForm.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/multiple-panel/TabIngredients.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/multiple-panel/facts-panel/MultipleFactsPanel.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/multiple-panel/MultiplePanel.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/multiple-panel/index.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/ProductMediaContent.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/ProductMediaArea.js","webpack://gvirantd/./src/pages/product-full-view/components/product-hierarchy/ProductHierarchyDetail.js","webpack://gvirantd/./src/pages/product-full-view/components/product-hierarchy/ProductHierarchyEndpointInfo.js","webpack://gvirantd/./src/pages/product-full-view/components/product-syndication-history-panel/ProductSyndicationHistoryStatus.js","webpack://gvirantd/./src/pages/product-full-view/components/product-syndication-history-panel/ProductSyndicationHistoryMessage.js","webpack://gvirantd/./src/pages/product-full-view/components/product-syndication-history-panel/ProductSyndicationHistoryPanel.js","webpack://gvirantd/./src/pages/product-full-view/components/package-level/PackageContent.js","webpack://gvirantd/./src/pages/product-full-view/mappers/mapTypeToAssetSubType.js","webpack://gvirantd/./src/pages/product-full-view/components/modal/add-asset-pim-modal/UploadPimAsset.js","webpack://gvirantd/./src/pages/product-full-view/components/modal/add-asset-pim-modal/index.js","webpack://gvirantd/./src/pages/product-full-view/components/modal/link-to-asset-modal/LinkToAssetModal.js","webpack://gvirantd/./src/pages/product-full-view/components/preview-modal/DownloadModal.js","webpack://gvirantd/./src/pages/product-full-view/components/preview-modal/ImageArea.js","webpack://gvirantd/./src/pages/product-full-view/components/preview-modal/ImagePreviewArea.js","webpack://gvirantd/./src/pages/product-full-view/components/preview-modal/ImageDownloadOption.js","webpack://gvirantd/./src/pages/product-full-view/components/preview-modal/PreviewGalleryModal.js","webpack://gvirantd/./src/pages/product-full-view/components/preview-modal/linked-asset-edit/LinkedAssetEditModal.js","webpack://gvirantd/./src/pages/product-full-view/components/product-detail-view/FormContext.js","webpack://gvirantd/./src/pages/product-full-view/components/product-detail-view/ShareComponents.js","webpack://gvirantd/./src/pages/product-full-view/components/product-detail-view/utils.js","webpack://gvirantd/./src/pages/product-full-view/components/product-edit-brand/ProductBrandEditForm.js","webpack://gvirantd/./src/pages/product-full-view/components/product-edit-brand/ProductEditBrandModal.js","webpack://gvirantd/./src/pages/product-full-view/components/product-hierarchy/ProductHierarchyTree.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/drug-label/component/DrugFactHeading.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/drug-label/component/DrugFactSection.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/drug-label/component/DrugFactText.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/drug-label/component/DrugFactActiveIngredient.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/drug-label/component/DrugFactBullet.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/drug-label/component/DrugFactCase.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/drug-label/component/DrugFactDetailList.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/drug-label/component/DrugFactUses.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/drug-label/component/DrugFactWarningItem.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/drug-label/component/DrugFactWarnings.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/drug-label/component/DrugFactDirections.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/drug-label/component/DrugFactOtherInformation.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/drug-label/component/DrugFactInactiveIngredients.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/drug-label/index.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/drug-label/DrugStandardLabel.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/multiple-panel/Carousel.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/multiple-panel/facts-panel/useMutationDeleteFactsPanel.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/multiple-panel/TabFactPanels.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/multiple-panel/components/GroupLayoutProvider.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/multiple-panel/components/GroupPart.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/multiple-panel/components/hooks.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/multiple-panel/components/GroupActions.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/multiple-panel/components/GroupModification.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/multiple-panel/components/GroupAssign.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/multiple-panel/components/GroupPreview.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/multiple-panel/components/PanelContextContainer.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/multiple-panel/constants.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/multiple-panel/facts-panel/LinearLabel.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/multiple-panel/facts-panel/VerticalLabel.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/multiple-panel/facts-panel/VerticalLabelWithMicronutrient.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/multiple-panel/facts-panel/overlay/WrapperFactsPanelItem.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/multiple-panel/facts-panel/overlay/WrapperNutrient.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/multiple-panel/facts-panel/useQueryFactsPanel.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/components/utils/Constants.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/multiple-panel/facts-panel/utils.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/multiple-panel/hook.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/multiple-panel/tab-allergens/constants.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/multiple-panel/tab-allergens/queries.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/multiple-panel/tab-allergens/utils.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/multiple-panel/tab-ingredients/useProductIngredients.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/multiple-panel/tab-ingredients/utils.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/hook/useAddNutritionLabel.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/add-label/utils.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/add-label/NutrientForm.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/add-label/supplement-label/SupplementFormButton.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/add-label/NutrientList.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/add-label/AddNutritionLabel.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/add-label/supplement-label/SupplementForm.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/hook/useGetSupplementPartOf.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/add-label/supplement-label/SupplementNutrientForm.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/add-label/supplement-label/SupplementIngredientForm.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/add-label/supplement-label/SupplementNutrientItemView.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/add-label/supplement-label/SupplementDeleteConfirmation.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/add-label/supplement-label/SupplementNutrientItem.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/add-label/supplement-label/SupplementNutrientList.js","webpack://gvirantd/./src/hooks/useScrollTo.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/add-label/supplement-label/SupplementNutrient.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/hook/useAddSupplementLabel.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/add-label/supplement-label/AddSupplementLabel.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/add-label/drug-facts-label/components/DrugFactsButton.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/add-label/drug-facts-label/components/Directions.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/add-label/drug-facts-label/components/Uses.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/add-label/drug-facts-label/components/OtherInformation.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/add-label/drug-facts-label/components/ActiveIngredients.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/add-label/drug-facts-label/components/InactiveIngredients.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/add-label/drug-facts-label/components/Warning.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/add-label/drug-facts-label/hook.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/add-label/drug-facts-label/AddDrugFactsLabel.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/add-label/pet-nutrition-label/components/Nutrients.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/add-label/pet-nutrition-label/hook.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/add-label/pet-nutrition-label/PetNutritionLabel.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/add-label/index.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/add-label/pet-nutrition-label/PetNutritionFacts.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/add-label/pet-nutrition-label/constants.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/add-label/pet-nutrition-label/utils.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/components/LinearVitaminLabel.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/components/NutrientRowNew.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/components/NutrientSideBySide.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/components/SeparatorBar.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/constants/index.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/context/nutritionContext.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/nutrition-label/hook/useNutritionLabel.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/shared/GroupAssignParts.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/shared/GroupPreviewParts.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/shared/hooks.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/shared/utils.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/supplement-label/Calories.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/supplement-label/SupplementList.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/supplement-label/SupplementStandardLabel.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/supplement-label/index.js","webpack://gvirantd/./src/pages/product-full-view/components/product-media-area/supplement-label/utils.js","webpack://gvirantd/./src/pages/product-full-view/components/product-new-detail-view/ProductDetailContext.js","webpack://gvirantd/./src/pages/product-full-view/components/product-new-detail-view/FormMultipleNestedValue.js","webpack://gvirantd/./src/pages/product-full-view/components/product-new-detail-view/FormSingleNestedValue.js","webpack://gvirantd/./src/pages/product-full-view/components/product-new-detail-view/ProductDetailEdit.js","webpack://gvirantd/./src/pages/product-full-view/components/product-new-detail-view/QueryProperties.js","webpack://gvirantd/./src/pages/product-full-view/components/product-new-detail-view/allergenUtils.js","webpack://gvirantd/./src/pages/product-full-view/components/product-new-detail-view/filterModuleUtils.js","webpack://gvirantd/./src/pages/product-full-view/components/product-new-detail-view/hooks.js","webpack://gvirantd/./src/pages/product-full-view/components/product-new-detail-view/PackageContent.js","webpack://gvirantd/./src/pages/product-full-view/components/product-new-detail-view/ProductPropertyItem.js","webpack://gvirantd/./src/pages/product-full-view/components/product-new-detail-view/DisplayProductInfo.js","webpack://gvirantd/./src/pages/product-full-view/components/product-new-detail-view/ProductAdvancedModules.js","webpack://gvirantd/./src/pages/product-full-view/components/product-new-detail-view/ProductBaseModules.js","webpack://gvirantd/./src/pages/product-full-view/components/product-new-detail-view/overlay/SwitchableProductModulesWrapper.js","webpack://gvirantd/./src/pages/product-full-view/components/product-new-detail-view/overlay/ProductOverlayPrimitiveValue.js","webpack://gvirantd/./src/pages/product-full-view/components/product-new-detail-view/overlay/ProductOverlayPropertyItem.js","webpack://gvirantd/./src/pages/product-full-view/components/product-new-detail-view/overlay/overlayHooks.js","webpack://gvirantd/./src/pages/product-full-view/components/product-new-detail-view/overlay/DisplayProductInfoOverlay.js","webpack://gvirantd/./src/pages/product-full-view/components/product-new-detail-view/overlay/ProductBaseModulesOverlay.js","webpack://gvirantd/./src/pages/product-full-view/components/product-new-detail-view/overlay/ProductAdvancedModulesOverlay.js","webpack://gvirantd/./src/pages/product-full-view/components/product-new-detail-view/overlay/FormItemOverlayItem.js","webpack://gvirantd/./src/pages/product-full-view/components/product-new-detail-view/overlay/FormSingleNestedValueOverlay.js","webpack://gvirantd/./src/pages/product-full-view/components/product-new-detail-view/overlay/FormMultipleNestedValueOverlay.js","webpack://gvirantd/./src/pages/product-full-view/components/product-new-detail-view/overlay/ProductDetailOverlayEdit.js","webpack://gvirantd/./src/pages/product-full-view/components/product-new-detail-view/ShareComponents.js","webpack://gvirantd/./src/pages/product-full-view/components/product-new-detail-view/FormEditCustomProductProperties.js","webpack://gvirantd/./src/pages/product-full-view/components/product-new-detail-view/ProductCustomProperties.js","webpack://gvirantd/./src/pages/product-full-view/components/product-new-detail-view/layout/useStyleProductDetailContainer.js","webpack://gvirantd/./src/pages/product-full-view/components/product-new-detail-view/layout/ProductDetailGridItemContainer.js","webpack://gvirantd/./src/pages/product-full-view/components/product-new-detail-view/layout/WithProductDetailExpandBtn.js","webpack://gvirantd/./src/pages/product-full-view/components/product-new-detail-view/ProductDetailView.js","webpack://gvirantd/./src/pages/product-full-view/components/product-new-detail-view/overlay/utils.js","webpack://gvirantd/./src/pages/product-full-view/components/product-new-detail-view/queries.js","webpack://gvirantd/./src/pages/product-full-view/components/product-new-detail-view/utils.js","webpack://gvirantd/./src/pages/product-full-view/components/subscription/Subscription.js","webpack://gvirantd/./src/pages/product-full-view/constants.js","webpack://gvirantd/./src/pages/product-full-view/controllers/actions.js","webpack://gvirantd/./src/pages/product-full-view/controllers/constants.js","webpack://gvirantd/./src/pages/product-full-view/controllers/mapper/mapToReducerState/index.js","webpack://gvirantd/./src/pages/product-full-view/controllers/reducer.js","webpack://gvirantd/./src/pages/product-full-view/controllers/mapper/mapToGridColumn/index.js","webpack://gvirantd/./src/pages/product-full-view/controllers/saga.js","webpack://gvirantd/./src/pages/product-full-view/controllers/selectors.js","webpack://gvirantd/./src/pages/product-full-view/hooks/index.js","webpack://gvirantd/./src/pages/product-full-view/mappers/mapToEnums.js","webpack://gvirantd/./src/pages/product-full-view/queries/index.js","webpack://gvirantd/./src/pages/product-full-view/shared/components.js","webpack://gvirantd/./src/pages/product-full-view/shared/hooks.js","webpack://gvirantd/./src/pages/product-full-view/shared/utils.js","webpack://gvirantd/./src/pages/product-history/constant.js","webpack://gvirantd/./src/pages/product-history/hook.js","webpack://gvirantd/./src/pages/product-history/utils.js","webpack://gvirantd/./src/pages/publication/hooks.js","webpack://gvirantd/./src/services/qaSpecWorkflow/index.js","webpack://gvirantd/./src/services/qaSpecWorkflow/endpoints.js","webpack://gvirantd/./src/pages/qa-spec-workflow/hook.js","webpack://gvirantd/./src/pages/qa-spec/components/edit-tab-checker/EditTabCheckerContext.js","webpack://gvirantd/./src/pages/qa-spec/components/edit-tab-checker/EditTabSectionCheckerWrapper.js","webpack://gvirantd/./src/pages/qa-spec/components/edit-tab-checker/constants.js","webpack://gvirantd/./src/pages/qa-spec/components/edit-tab-checker/utils.js","webpack://gvirantd/./src/pages/qa-spec/components/edit-tab-checker/EditTabConfirmModal.js","webpack://gvirantd/./src/pages/qa-spec/components/group-data/hooks.js","webpack://gvirantd/./src/pages/qa-spec/components/group-data/utils.js","webpack://gvirantd/./src/pages/qa-spec/components/container/QaSpecDetailContainer.js","webpack://gvirantd/./src/hooks/useComponent.js","webpack://gvirantd/./src/pages/qa-spec/components/container/EditContainer.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-spec-tab/QaSpecTabHeader.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-spec-tab/ExpandTabButton.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-spec-tab/DownloadSpecButton.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-spec-tab/LoadTestResultButton.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-spec-header-form/RequiredFieldsError.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-spec-tab/QaSpecTab.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-ingredient/requiredFieldsQaIngredient.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-ingredient/utils.js","webpack://gvirantd/./src/pages/qa-spec/utils/ingredient/index.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-grid-cell/TextRender.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-grid-cell/SnapshotCellWrapper.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-grid-cell/TextRenderSnapshot.js","webpack://gvirantd/./src/pages/qa-spec/utils/gridColumnUtils.js","webpack://gvirantd/./src/pages/qa-spec/hooks/useIngredient.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-ingredient/QaIngredientGrid.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-ingredient/IngredientForm.js","webpack://gvirantd/./src/pages/qa-spec/components/group-data/QaGroupAddition.js","webpack://gvirantd/./src/pages/qa-spec/utils/allergen/index.js","webpack://gvirantd/./src/pages/qa-spec/hooks/useAllergen.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-allergen/QaAllergenGrid.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-allergen/QaAllergenRegional.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-allergen/CustomAllergenAddition.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-prod-spec/snapshot/RetailerSnapshot.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-allergen/AllergenGroup.js","webpack://gvirantd/./src/pages/qa-spec/components/group-data/QaGroupEdit.js","webpack://gvirantd/./src/pages/qa-spec/components/group-data/QaGroupAssign.js","webpack://gvirantd/./src/pages/qa-spec/components/group-data/QaGroupDeletion.js","webpack://gvirantd/./src/pages/qa-spec/components/group-data/QaGroupPreview.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-ingredient/QaSpecIngredient.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-allergen/AllergenGroupAdd.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-allergen/AllergenGroupEdit.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-allergen/QaAllergen.js","webpack://gvirantd/./src/pages/qa-spec/hooks/useFormula.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-formula/QaFormulaGrid.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-formula/QaFormulaActiveIngredientGrid.js","webpack://gvirantd/./src/pages/qa-spec/components/form/FormLabel.js","webpack://gvirantd/./src/pages/qa-spec/components/form/SnapshotWrapper.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-formula/QaFormulaDrugForm.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-formula/QaFormulaDrugModal.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-formula/QaFormulaDrug.js","webpack://gvirantd/./src/pages/qa-spec/components/form/hooks.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-formula/QaFormula.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-spec-detail/QaSpecDetail.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-spec-header/QaSpecHeader.js","webpack://gvirantd/./src/common/components/form/edit-input-country/EditInputCountry.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-spec-header-property/QaSpecHeaderProperty.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-grid-cell/CheckboxRender.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-grid-cell/StringTooltipRender.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-grid-cell/StatusRender.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-grid-cell/DefaultCellRender.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-grid-cell/CountryEditorRender.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-grid-cell/CountryEditorRenderSnapshot.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-grid-cell/FileUploadEditor.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-grid-cell/FileUploadRender.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-grid-cell/FileUploadRenderSnapshot.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-grid-cell/CheckboxRenderSnapshot.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-grid-cell/SelectionEditor.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-grid-cell/CountryEditor.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-grid-cell/NumericEditor.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-grid-cell/CheckboxEditor.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-grid-cell/FreeTextSelector.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-grid-cell/CountryEditorSingle.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-grid-cell/TextEditor.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-grid-cell/SelectionFreeText.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-grid-edit/QaGridEdit.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-contact/QaSpecContacts.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-doc-certificate/ModalUpdateDocsAndCertificates.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-doc-certificate/hooks.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-grid-cell/CellActionRenderSnapshotWrapper.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-doc-certificate/utils.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-doc-certificate/queries.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-doc-certificate/QaSpecDocsAndCertificates.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-prod-spec/DietaryCertificateUploadBtn.js","webpack://gvirantd/./src/pages/product-full-view/components/modal/add-document-msds/CreateMSDSDocumentForm.js","webpack://gvirantd/./src/pages/product-full-view/components/modal/add-document-msds/CreateMSDSDocumentModal.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-prod-spec/UploadCertificate.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-prod-spec/snapshot/hooks.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-prod-spec/QaSpecProductInfo.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-prod-spec/QaSpecCharacteristicGrid.js","webpack://gvirantd/./src/pages/qa-spec/hooks/useQaSpecGrid.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-prod-spec/constants.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-prod-spec/utils.js","webpack://gvirantd/./src/pages/qa-spec/hooks/useOrganoleptic.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-prod-spec/OrganolepticCharacteristic.js","webpack://gvirantd/./src/pages/qa-spec/hooks/usePhyChe.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-prod-spec/PhyCheCharacteristic.js","webpack://gvirantd/./src/pages/qa-spec/hooks/useContaminant.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-prod-spec/ContaminantCharacteristic.js","webpack://gvirantd/./src/pages/qa-spec/hooks/useMicrobiological.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-prod-spec/MicrobiologicalCharacteristic.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-prod-spec/QaSpecLinkProductSpecDocumentModal.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-grid-cell/DocumentActions.js","webpack://gvirantd/./src/pages/qa-spec/hooks/useProductSpecDocument.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-prod-spec/ModalUpdateProductDocument.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-prod-spec/QaSpecProductDocument.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-prod-spec/QaSpecProduct.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-manufacturing-process/utils.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-manufacturing-process/hooks.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-manufacturing-process/QaSpecProcessStage.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-manufacturing-process/QaSpecDocumentGrid.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-manufacturing-process/ModalUpdateDocument.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-manufacturing-process/QaSpecDocumentForm.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-manufacturing-process/QaSpecDocument.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-manufacturing-process/QaSpecFacilityGrid.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-manufacturing-process/QaSpecLinkFacilityModal.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-manufacturing-process/QaSpecManufacturingLocation.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-manufacturing-process/QaSpecManufacturingProcess.js","webpack://gvirantd/./src/pages/qa-spec/hooks/useQaSpecComponents.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-component/queries.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-component/QaSpecComponent.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-nutrition-data/WrapperNutrient.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-nutrition-data/constants.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-nutrition-data/NutrientRowNew.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-nutrition-data/qa-spec-fact-panel/VerticalLabel.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-nutrition-data/qa-spec-fact-panel/VerticalLabelWithMicronutrient.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-nutrition-data/qa-spec-fact-panel/LinearLabel.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-nutrition-data/qa-spec-fact-panel/SupplementStandardLabel.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-nutrition-data/qa-spec-fact-panel/component/DrugFactHeading.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-nutrition-data/qa-spec-fact-panel/component/DrugFactSection.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-nutrition-data/qa-spec-fact-panel/component/DrugFactText.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-nutrition-data/qa-spec-fact-panel/component/DrugFactActiveIngredient.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-nutrition-data/qa-spec-fact-panel/component/DrugFactBullet.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-nutrition-data/qa-spec-fact-panel/component/DrugFactCase.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-nutrition-data/qa-spec-fact-panel/component/DrugFactDetailList.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-nutrition-data/qa-spec-fact-panel/component/DrugFactUses.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-nutrition-data/qa-spec-fact-panel/component/DrugFactWarningItem.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-nutrition-data/qa-spec-fact-panel/component/DrugFactWarnings.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-nutrition-data/qa-spec-fact-panel/component/DrugFactDirections.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-nutrition-data/qa-spec-fact-panel/component/DrugFactOtherInformation.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-nutrition-data/qa-spec-fact-panel/component/DrugFactInactiveIngredients.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-nutrition-data/qa-spec-fact-panel/DrugStandardLabel.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-nutrition-data/qa-spec-fact-panel/PetNutritionFacts.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-nutrition-data/WrapperFactsPanelItem.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-nutrition-data/QaSpecNutritionData.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-fresh-seafood/hook.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-fresh-seafood/QaFreshSeafood.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-fresh-meat/hook.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-fresh-meat/QaFreshMeat.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-packaging/UploadFilePackaging.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-packaging/QaPackaging.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-claims/hooks.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-claims/QaClaims.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-fresh-produce/QaFreshProduce.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-fresh-deli/hooks.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-fresh-deli/QaFreshDeli.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-product-contain/hooks.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-product-contain/QaSpecProductContain.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-grid-edit/WithQaGridHeader.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-spec-pet-food/hooks.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-spec-pet-food/QaSpecPetFoodGeometries.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-spec-pet-food/QaPetFood.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-allergen/FormAllergen.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-allergen/constants.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-allergen/hooks.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-allergen/utils.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-claims/queries.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-contact/queries.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-formula/queries.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-fresh-meat/queries.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-fresh-produce/hooks.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-fresh-seafood/queries.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-grid-cell/LinkAssetToQaSpec.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-ingredient/hook.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-manufacturing-process/constants.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-nutrition-data/Constant.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-nutrition-data/hook.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-nutrition-data/utils.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-packaging/CertificateFormList.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-packaging/hooks.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-packaging/queries.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-packaging/utils.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-product-contain/queries.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-spec-header-form/utils.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-spec-header-form/hooks.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-spec-header-property/hook.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-spec-tab/SnapshotFormItem.js","webpack://gvirantd/./src/pages/qa-spec/constant/charactersLimit.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-prod-spec/upload-polyflour-supporting-document/queries.js","webpack://gvirantd/./src/pages/qa-spec/components/qa-prod-spec/upload-polyflour-supporting-document/index.js","webpack://gvirantd/./src/pages/qa-spec/constant/index.js","webpack://gvirantd/./src/pages/qa-spec/controllers/actions.js","webpack://gvirantd/./src/pages/qa-spec/controllers/constants.js","webpack://gvirantd/./src/pages/qa-spec/controllers/reducer.js","webpack://gvirantd/./src/pages/qa-spec/controllers/saga.js","webpack://gvirantd/./src/pages/qa-spec/controllers/selectors.js","webpack://gvirantd/./src/pages/qa-spec/hooks/index.js","webpack://gvirantd/./src/pages/qa-spec/hooks/useCheckAssignProductToSupplier.js","webpack://gvirantd/./src/pages/qa-spec/hooks/useCheckQaSpecLocked.js","webpack://gvirantd/./src/pages/qa-spec/hooks/useCheckSnapshotForRetailer.js","webpack://gvirantd/./src/pages/qa-spec/hooks/useGetQaSpecRequiredFields.js","webpack://gvirantd/./src/pages/qa-spec/hooks/useProductSpecInfo.js","webpack://gvirantd/./src/pages/qa-spec/query/useGetOrganolepticQuery.js","webpack://gvirantd/./src/pages/qa-spec/query/useContaminantCharacteristicsQuery.js","webpack://gvirantd/./src/pages/qa-spec/query/useGetMicrobiologicalCharacteristicsQuery.js","webpack://gvirantd/./src/pages/qa-spec/query/useGetPhysicalChemicalQuery.js","webpack://gvirantd/./src/pages/qa-spec/query/useGetQaSpecComponentQuery.js","webpack://gvirantd/./src/pages/qa-spec/query/useGetQaSpecDataHeader.js","webpack://gvirantd/./src/pages/qa-spec/utils/index.js","webpack://gvirantd/./src/pages/recipients-fields/controllers/actions.js","webpack://gvirantd/./src/pages/recipients-fields/controllers/constants.js","webpack://gvirantd/./src/pages/reporting/components/ColumnDraggable.js","webpack://gvirantd/./src/pages/reporting/components/DataColumns.js","webpack://gvirantd/./src/pages/reporting/components/EmptyAttribute.js","webpack://gvirantd/./src/pages/reporting/components/PropertiesItems.js","webpack://gvirantd/./src/pages/reporting/components/QueryConditions.js","webpack://gvirantd/./src/pages/reporting/components/RenderValue.js","webpack://gvirantd/./src/pages/reporting/components/RenderValueIn.js","webpack://gvirantd/./src/pages/reporting/components/RenderValueBetween.js","webpack://gvirantd/./src/pages/reporting/components/SwitchConjunction.js","webpack://gvirantd/./src/pages/reporting/components/SelectFieldsChanged.js","webpack://gvirantd/./src/pages/reporting/components/RenderBtnUploadFile.js","webpack://gvirantd/./src/pages/reporting/components/QueryDraggable.js","webpack://gvirantd/./src/pages/reporting/components/RenderRootTitle.js","webpack://gvirantd/./src/pages/reporting/components/TitleSection.js","webpack://gvirantd/./src/pages/reporting/controllers/actions.js","webpack://gvirantd/./src/pages/reporting/controllers/constants.js","webpack://gvirantd/./src/pages/reporting/hook/renderTree.js","webpack://gvirantd/./src/pages/reporting/hook/useGetFieldsChange.js","webpack://gvirantd/./src/pages/reporting/hook/useGetProperties.js","webpack://gvirantd/./src/pages/reporting/utils/constants.js","webpack://gvirantd/./src/pages/reporting/utils/index.js","webpack://gvirantd/./src/pages/role/components/role-list/index.js","webpack://gvirantd/./src/pages/role/components/section-wrapper/index.js","webpack://gvirantd/./src/assets/svg-icons/pencil.svg","webpack://gvirantd/./src/pages/role/components/section-wrapper/SectionHeader.js","webpack://gvirantd/./src/pages/role/components/role-description/index.js","webpack://gvirantd/./src/pages/role/components/empty-section/index.js","webpack://gvirantd/./src/pages/role/components/role-user-list/NewUserModal.js","webpack://gvirantd/./src/pages/role/components/role-user-list/index.js","webpack://gvirantd/./src/assets/svg-icons/style-checked.svg","webpack://gvirantd/./src/pages/role/components/role-permission-list/hooks.js","webpack://gvirantd/./src/pages/role/components/role-permission-list/PermissionButton.js","webpack://gvirantd/./src/pages/role/components/role-permission-list/PermissionTypeIcon.js","webpack://gvirantd/./src/assets/svg-icons/style-circle-left.svg","webpack://gvirantd/./src/assets/svg-icons/style-circle-right.svg","webpack://gvirantd/./src/pages/role/components/role-permission-list/PermissionGroupButton.js","webpack://gvirantd/./src/pages/role/components/role-permission-list/RolePermissionGroup.js","webpack://gvirantd/./src/pages/role/mappers/mapToCategoriesAndSearchPermisison.js","webpack://gvirantd/./src/pages/role/components/role-permission-list/index.js","webpack://gvirantd/./src/pages/role/components/edit-control/index.js","webpack://gvirantd/./src/pages/role/components/role-name/index.js","webpack://gvirantd/./src/pages/role/components/member-role-list/index.js","webpack://gvirantd/./src/pages/role/mappers/mapMemerRoleFormToSubmitValue.js","webpack://gvirantd/./src/pages/role/components/member-role-control/index.js","webpack://gvirantd/./src/pages/role-member/mappers/index.js","webpack://gvirantd/./src/pages/role/components/member-role-section-wrapper/index.js","webpack://gvirantd/./src/pages/role/components/member-role-description/MemberRoleDescriptionFormItem.js","webpack://gvirantd/./src/pages/role/components/member-role-description/index.js","webpack://gvirantd/./src/pages/role/components/member-role-permission-list/MemberRolePermissionGroup.js","webpack://gvirantd/./src/pages/role/mappers/mapToMemberPermissionList.js","webpack://gvirantd/./src/pages/role/components/member-role-permission-list/index.js","webpack://gvirantd/./src/pages/role/components/member-role-member-list/NewMemberModal.js","webpack://gvirantd/./src/pages/role/components/member-role-member-list/index.js","webpack://gvirantd/./src/pages/role/components/member-role-need-permission/index.js","webpack://gvirantd/./src/pages/role/components/role-permission-list/constants.js","webpack://gvirantd/./src/pages/role/controllers/actions.js","webpack://gvirantd/./src/pages/role/controllers/constants.js","webpack://gvirantd/./src/pages/role/controllers/mapper/mapToReducerState.js","webpack://gvirantd/./src/pages/role/controllers/reducer.js","webpack://gvirantd/./src/pages/role/controllers/selectors.js","webpack://gvirantd/./src/pages/role/mappers/validateRoleFormFields.js","webpack://gvirantd/./src/pages/sso-approval/controllers/constants.js","webpack://gvirantd/./src/pages/sso-product/controllers/actions.js","webpack://gvirantd/./src/pages/sso-product/controllers/constants.js","webpack://gvirantd/./src/pages/sso-product/controllers/reducer.js","webpack://gvirantd/./src/pages/sso-product/controllers/selectors.js","webpack://gvirantd/./src/pages/ticket-full-view/constants.js","webpack://gvirantd/./src/pages/ticketing-system/controllers/actions.js","webpack://gvirantd/./src/pages/ticketing-system/controllers/constants.js","webpack://gvirantd/./src/pages/ticketing-system/controllers/reducer.js","webpack://gvirantd/./src/pages/ticketing-system/controllers/selectors.js","webpack://gvirantd/./src/pages/transition-page/controllers/actions.js","webpack://gvirantd/./src/pages/transition-page/controllers/constants.js","webpack://gvirantd/./src/pages/transition-page/controllers/mapper/mapToReducerState.js","webpack://gvirantd/./src/pages/transition-page/controllers/reducer.js","webpack://gvirantd/./src/pages/transition-page/controllers/selectors.js","webpack://gvirantd/./src/pages/user-profile/components/hook/useFetchUserProfile.js","webpack://gvirantd/./src/pages/user-profile/components/bottom-content/UserBottomContent.js","webpack://gvirantd/./src/pages/user-profile/components/top-content/UserTopContent.js","webpack://gvirantd/./src/pages/user-profile/components/top-content/UserPrimaryInfo.js","webpack://gvirantd/./src/pages/user-profile/components/top-content/UserSocialLink.js","webpack://gvirantd/./src/pages/user-profile/components/top-content-edit/EditUserName.js","webpack://gvirantd/./src/pages/user-profile/components/top-content-edit/EditUserEmail.js","webpack://gvirantd/./src/pages/user-profile/components/top-content/UserName.js","webpack://gvirantd/./src/pages/user-profile/components/top-content/UserContactInfo.js","webpack://gvirantd/./src/pages/user-profile/components/top-content/UserContactHistory.js","webpack://gvirantd/./src/pages/user-profile/components/UserProfileError.js","webpack://gvirantd/./src/pages/user-profile/components/activity-log/UserActivityLogTab.js","webpack://gvirantd/./src/pages/user-profile/components/activity-log/UserActivitySummary.js","webpack://gvirantd/./src/pages/user-profile/components/activity-log/UserActivityDetailGrid.js","webpack://gvirantd/./src/pages/user-profile/components/activity-log/UserActivityIcon.js","webpack://gvirantd/./src/pages/user-profile/components/overview/UserProfileOverview.js","webpack://gvirantd/./src/pages/user-profile/components/bio/OverviewBio.js","webpack://gvirantd/./src/pages/user-profile/components/hook/useUpdateUserInfo.js","webpack://gvirantd/./src/pages/user-profile/components/form/utils.js","webpack://gvirantd/./src/pages/user-profile/components/form/AssetDownloadPreferencesForm.js","webpack://gvirantd/./src/pages/user-profile/components/overview/info/ViewOverviewInfo.js","webpack://gvirantd/./src/pages/user-profile/components/overview/info/EditOverviewInfo.js","webpack://gvirantd/./src/common/components/google-map-user-location/InfoWindow.js","webpack://gvirantd/./src/common/components/google-map-user-location/MarkerMap.js","webpack://gvirantd/./src/common/components/google-map-user-location/GoogleMapViewUserLocation.js","webpack://gvirantd/./src/pages/user-profile/components/overview/info/OverviewInfo.js","webpack://gvirantd/./src/pages/user-profile/components/overview/location/OverviewLocationsForm.js","webpack://gvirantd/./src/pages/user-profile/components/overview/location/OverviewLocations.js","webpack://gvirantd/./src/pages/user-profile/components/overview/location/OverviewLocationsIcon.js","webpack://gvirantd/./src/pages/user-profile/components/form/ChangePasswordForm.js","webpack://gvirantd/./src/pages/user-profile/components/bio/EditOverviewBio.js","webpack://gvirantd/./src/pages/user-profile/components/user-security/ChangePasswordModal.js","webpack://gvirantd/./src/pages/user-profile/components/user-security/SecurityLabel.js","webpack://gvirantd/./src/pages/user-profile/components/user-security/ChangePassword.js","webpack://gvirantd/./src/pages/user-profile/components/user-security/Multifactor.js","webpack://gvirantd/./src/hooks/user-profile/useEditOktaEmail.js","webpack://gvirantd/./src/pages/user-profile/components/user-security/OktaSsoModal.js","webpack://gvirantd/./src/pages/user-profile/components/user-security/OktaSso.js","webpack://gvirantd/./src/pages/user-profile/components/user-security/UserSecurityTab.js","webpack://gvirantd/./src/pages/workflow-template-full/controllers/actions.js","webpack://gvirantd/./src/pages/workflow-template-full/controllers/constants.js","webpack://gvirantd/./src/pages/workflow-template-full/controllers/reducer.js","webpack://gvirantd/./src/pages/workflow-template-full/controllers/selectors.js","webpack://gvirantd/./src/pages/workflow-template/controllers/actions.js","webpack://gvirantd/./src/pages/workflow-template/controllers/constants.js","webpack://gvirantd/./src/pages/workflow-template/controllers/reducer.js","webpack://gvirantd/./src/pages/workflow-template/controllers/selectors.js","webpack://gvirantd/./src/pages/workflow/controllers/actions.js","webpack://gvirantd/./src/pages/workflow/controllers/constants.js","webpack://gvirantd/./src/pages/workflow/controllers/mapToReducerState/index.js","webpack://gvirantd/./src/pages/workflow/controllers/reducer.js","webpack://gvirantd/./src/pages/workflow/controllers/selectors.js","webpack://gvirantd/./src/polyfills.js","webpack://gvirantd/./src/reducers.js","webpack://gvirantd/./src/redux/branding/actions.js","webpack://gvirantd/./src/redux/branding/constants.js","webpack://gvirantd/./src/redux/branding/reducer.js","webpack://gvirantd/./src/redux/branding/selectors.js","webpack://gvirantd/./src/redux/global/actions.js","webpack://gvirantd/./src/redux/global/constants.js","webpack://gvirantd/./src/utils/sesionStorage.js","webpack://gvirantd/./src/redux/global/reducer.js","webpack://gvirantd/./src/redux/global/selectors.js","webpack://gvirantd/./src/redux/ribbon/actions.js","webpack://gvirantd/./src/redux/ribbon/constants.js","webpack://gvirantd/./src/redux/ribbon/reducer.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/add-to-apl/AddProductToAPLModalFooter.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/add-to-apl/ExistedProductApl.js","webpack://gvirantd/./src/hooks/apl/useAddProductToApl.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/add-to-apl/AddProductToAPLModal.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/add-to-apl/AddToNewAPLModal.js","webpack://gvirantd/./src/pages/home/ribbon/Products.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/member-grid/OpenMember.js","webpack://gvirantd/./src/common/components/button/svg-icons/ICO_10.37.svg","webpack://gvirantd/./src/pages/home/ribbon/components/controls/member-grid/AddToBan.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/member-grid/ListBan.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/member-grid/BanMember.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/member-grid/FilterMemberSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/member-grid/SubscriptionControl.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/member-grid/SubscriptionMember.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/member-grid/MemAction.js","webpack://gvirantd/./src/pages/home/ribbon/MemberGrid.js","webpack://gvirantd/./src/pages/home/ribbon/AssetsGrid.js","webpack://gvirantd/./src/utils/ribbonRouter.js","webpack://gvirantd/./src/redux/ribbon/selectors.js","webpack://gvirantd/./src/redux/user/actions.js","webpack://gvirantd/./src/redux/user/constants.js","webpack://gvirantd/./src/redux/user/reducers.js","webpack://gvirantd/./src/redux/user/selectors.js","webpack://gvirantd/./src/services/aplDetail/endpoints.js","webpack://gvirantd/./src/services/aplDetail/index.js","webpack://gvirantd/./src/services/apl/endpoints.js","webpack://gvirantd/./src/services/apl/index.js","webpack://gvirantd/./src/services/assetProduct/endpoints.js","webpack://gvirantd/./src/services/assetProduct/index.js","webpack://gvirantd/./src/services/categoryManagement/endpoints.js","webpack://gvirantd/./src/services/categoryManagement/index.js","webpack://gvirantd/./src/services/chatServices/endpoints.js","webpack://gvirantd/./src/services/chatServices/index.js","webpack://gvirantd/./src/services/communicationTemplate/endpoints.js","webpack://gvirantd/./src/services/communicationTemplate/index.js","webpack://gvirantd/./src/services/creditCardEula/endpoints.js","webpack://gvirantd/./src/services/creditCardEula/index.js","webpack://gvirantd/./src/services/dashboard/index.js","webpack://gvirantd/./src/services/dashboard/endpoints.js","webpack://gvirantd/./src/services/digitalAsset/endpoints.js","webpack://gvirantd/./src/services/digitalAsset/index.js","webpack://gvirantd/./src/services/eulaMaintenance/endpoints.js","webpack://gvirantd/./src/services/eulaMaintenance/index.js","webpack://gvirantd/./src/services/ext-chat/index.js","webpack://gvirantd/./src/services/ext-chat/endpoints.js","webpack://gvirantd/./src/services/ext-meeting/index.js","webpack://gvirantd/./src/services/ext-meeting/endpoints.js","webpack://gvirantd/./src/services/favorite/index.js","webpack://gvirantd/./src/services/favorite/endpoints.js","webpack://gvirantd/./src/services/folder/endpoints.js","webpack://gvirantd/./src/services/folder/index.js","webpack://gvirantd/./src/services/grid/endpoints.js","webpack://gvirantd/./src/services/grid/index.js","webpack://gvirantd/./src/services/helpMaintenance/endpoints.js","webpack://gvirantd/./src/services/helpMaintenance/index.js","webpack://gvirantd/./src/services/help/index.js","webpack://gvirantd/./src/services/help/endpoints.js","webpack://gvirantd/./src/services/interoperability/index.js","webpack://gvirantd/./src/services/interoperability/endpoints.js","webpack://gvirantd/./src/services/login/index.js","webpack://gvirantd/./src/services/login/endpoints.js","webpack://gvirantd/./src/services/maintenanceForm/endpoints.js","webpack://gvirantd/./src/services/maintenanceForm/index.js","webpack://gvirantd/./src/services/manageSharing/endpoints.js","webpack://gvirantd/./src/services/manageSharing/index.js","webpack://gvirantd/./src/services/mapping/endpoints.js","webpack://gvirantd/./src/services/mapping/index.js","webpack://gvirantd/./src/services/markupMaintenance/endpoints.js","webpack://gvirantd/./src/services/markupMaintenance/index.js","webpack://gvirantd/./src/services/meetingNotification/index.js","webpack://gvirantd/./src/services/meetingNotification/endpoints.js","webpack://gvirantd/./src/services/memberMaintenance/endpoints.js","webpack://gvirantd/./src/services/memberMaintenance/index.js","webpack://gvirantd/./src/services/members/endpoints.js","webpack://gvirantd/./src/services/members/index.js","webpack://gvirantd/./src/services/minimumRequirements/endpoints.js","webpack://gvirantd/./src/services/minimumRequirements/index.js","webpack://gvirantd/./src/services/new-folder/index.js","webpack://gvirantd/./src/services/new-folder/endpoints.js","webpack://gvirantd/./src/services/overlay/endpoints.js","webpack://gvirantd/./src/services/overlay/index.js","webpack://gvirantd/./src/services/payment/endpoints.js","webpack://gvirantd/./src/services/payment/index.js","webpack://gvirantd/./src/services/product/endpoints.js","webpack://gvirantd/./src/services/product/index.js","webpack://gvirantd/./src/services/qaSpec/endpoints.js","webpack://gvirantd/./src/services/qaSpec/index.js","webpack://gvirantd/./src/services/qas-require-field/index.js","webpack://gvirantd/./src/services/qas-require-field/endpoints.js","webpack://gvirantd/./src/services/query/endpoints.js","webpack://gvirantd/./src/services/query/index.js","webpack://gvirantd/./src/services/recipients-fields/endpoints.js","webpack://gvirantd/./src/services/recipients-fields/index.js","webpack://gvirantd/./src/services/reporting/endpoints.js","webpack://gvirantd/./src/services/reporting/index.js","webpack://gvirantd/./src/services/request-grid/endpoints.js","webpack://gvirantd/./src/services/request-grid/index.js","webpack://gvirantd/./src/services/roles-security/endpoints.js","webpack://gvirantd/./src/services/roles-security/index.js","webpack://gvirantd/./src/services/sso-approval/endpoints.js","webpack://gvirantd/./src/services/sso-approval/index.js","webpack://gvirantd/./src/services/sso-product/index.js","webpack://gvirantd/./src/services/sso-product/endpoints.js","webpack://gvirantd/./src/services/subscription/endpoints.js","webpack://gvirantd/./src/services/subscription/index.js","webpack://gvirantd/./src/services/tag-restrictions/index.js","webpack://gvirantd/./src/services/tag-restrictions/endpoints.js","webpack://gvirantd/./src/services/ticketingSystem/index.js","webpack://gvirantd/./src/services/ticketingSystem/endpoints.js","webpack://gvirantd/./src/services/transition-page/endpoints.js","webpack://gvirantd/./src/services/transition-page/index.js","webpack://gvirantd/./src/services/user/endpoints.js","webpack://gvirantd/./src/services/user/index.js","webpack://gvirantd/./src/services/videoCallServices/index.js","webpack://gvirantd/./src/services/videoCallServices/endpoints.js","webpack://gvirantd/./src/services/wfTemplate/endpoints.js","webpack://gvirantd/./src/services/wfTemplate/index.js","webpack://gvirantd/./src/services/workflow/endpoints.js","webpack://gvirantd/./src/services/workflow/index.js","webpack://gvirantd/./src/static/AllergenConstants.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/product-apl/AplSampleRequestDynamicContentForm.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/product-apl/AplSampleRequestEmailForm.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/member-full/MemberLayout.js","webpack://gvirantd/./src/common/components/button/svg-icons/ICO_10.30.svg","webpack://gvirantd/./src/pages/home/ribbon/components/controls/member-grid/ShowProducts.js","webpack://gvirantd/./src/common/components/button/svg-icons/ICO_10.31.svg","webpack://gvirantd/./src/pages/home/ribbon/components/controls/member-grid/ShowAssets.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/member-grid/ShowOverview.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/member-grid/ShowDetails.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/member-full/OfficeFacility.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/member-grid/ShowAll.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/member-full/EditMember.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/member-full/MemberFullAction.js","webpack://gvirantd/./src/common/components/button/svg-icons/ICO_10.26.svg","webpack://gvirantd/./src/pages/home/ribbon/components/controls/user-full/DateRange.js","webpack://gvirantd/./src/common/components/button/svg-icons/ICO_10.54.svg","webpack://gvirantd/./src/pages/home/ribbon/components/controls/user-full/DownloadTransaction.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/user-full/Transactions.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/workflow-grid/FilterSection.js","webpack://gvirantd/./src/pages/home/ribbon/AssetFull.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/help/EditCategory.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/help/CreateCategory.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/help/DeleteCategory.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/help/EditPost.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/help/BackToPost.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/help/DeletePost.js","webpack://gvirantd/./src/pages/home/ribbon/HelpPostCreateView.js","webpack://gvirantd/./src/pages/home/ribbon/HelpPostFullView.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/help/EditPostGridView.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/help/CreatePost.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/help/DeletePosts.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/help/EditArticlesGridView.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/help/CreateArticle.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/help/DeleteArticles.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/help/Backup.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/help/Restore.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/help/DeleteArticle.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/help/BackToArticle.js","webpack://gvirantd/./src/pages/home/ribbon/HelpArticleFullView.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/eula/CloneEula.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/eula/CreateEula.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/eula/DeleteEulaGridView.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/eula/ViewAcceptance.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/reporting/OpenReporting.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/reporting/CreateReporting.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/reporting/CloneReportingModal.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/reporting/CloneReporting.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/reporting/grid/OpenSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/reporting/ConfirmDeleteReporting.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/reporting/DeleteReporting.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/reporting/grid/DeleteReportSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/communication/grid-view/EditCommunicationTemplate.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/communication/grid-view/CreateCommunicationTemplate.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/communication/grid-view/DeleteCommunicationTemplate.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/communication/fullview/EditView.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/communication/fullview/DeleteCommunicationTemplate.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/communication/fullview/BackToTemplate.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/member/Members.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/member/Users.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/member-maintenance-grid/MaintenanceInfoSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/member-maintenance-grid/MemberCommunicateSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/member-management/MemberManagementEditForm.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/member-management/MemberManagementEditModal.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/member/MemberManagementEdit.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/member-maintenance-grid/MemberEditSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/member/ExportButton.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/member-maintenance-grid/MemberExportSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/member/NewUserControl.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/member/DeleteUserControl.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/member/ResetPasswordControl.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/member/EditUserControl.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/user-maintenance-grid/UserActionsSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/member-maintenance-grid/MemberTemplateSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/member-maintenance-grid/OpenMemberSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/member-maintenance-grid/AddRoleToMemberModal.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/member-maintenance-grid/MemberEditRoleSecuritySection.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/member-maintenance-grid/member-action/MoveGlnToMember.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/member-maintenance-grid/member-action/CreateNewMember.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/member-management/MemberManagementCreateModal.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/shared/ParentChildMemberHierarchies.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/member-maintenance-grid/member-action/index.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/user/UserReactive.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/user-maintenance-grid/MoveUserToMember.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/user-maintenance-grid/UnlockUser.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/user-management/AddUserRoleAction.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/user-management/AddRoleToUserModal.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/user-management/RemoveUserRoleAction.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/user-management/RemoveRoleFromUserModal.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/user-maintenance-grid/UserEditRoleSecuritySection.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/user-maintenance-grid/FilterUsersSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/query/OpenQuery.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/query/grid/OpenSection.js","webpack://gvirantd/./src/pages/home/ribbon/Queries.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/ixoneSection/ToggleSplashScreenSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/workflow-maintain/OpenWorkflow.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/workflow-maintain/CreateWorkflow.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/workflow-maintain/DeleteWorkflow.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/workflow-maintain/CloneWorkflow.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/wf-template-full/NewStepControl.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/wf-template-full/NewStepSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/wf-template-full/NewTaskControl.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/wf-template-full/NewTaskSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/wf-template-full/CloneTaskControl.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/wf-template-full/CloneTaskSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/wf-template-full/CloneStepControl.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/wf-template-full/CloneStepSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product-apl/OpenAPL.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product-apl/CreateMasterAplRibbon.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product-apl/RollbackToPreviousMasterAplRibbon.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-apl/CreateApl.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product-apl/EditAPLRibbon.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-apl/DeleteAplControl.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-apl/DownloadAplTemplate.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product-apl/components/APLModalFooter.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product-apl/components/CreateEditAplModal.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product-apl/components/APLConfirmUpdatePopup.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product-apl/components/UploadTemplateAPLModal.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product-apl/UpdateMasterAPLRibbon.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product-apl/AplGridActions.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-apl/ExecuteMatchingGrid.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-apl/DownloadAPL.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/mapping/OpenMapping.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/mapping/OpenSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/mapping/ShareControl.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/mapping/ShareSection.js","webpack://gvirantd/./src/pages/mapping/components/mapping-details/SaveMappingConfigForm.js","webpack://gvirantd/./src/pages/mapping/components/mapping-details/SaveMappingConfig.js","webpack://gvirantd/./src/pages/mapping/components/mapping-details/CloneMappingConfigModal.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/mapping/CreateMapping.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/mapping/EditMapping.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/mapping/CloneMapping.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/mapping/DeleteMapping.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/mapping/FilterMapping.js","webpack://gvirantd/./src/pages/home/ribbon/ProductMapping.js","webpack://gvirantd/./src/pages/mapping/components/add-statement/utils.js","webpack://gvirantd/./src/pages/mapping/components/add-statement/hooks.js","webpack://gvirantd/./src/pages/mapping/components/add-statement/ShareComponents.js","webpack://gvirantd/./src/pages/mapping/components/add-statement/AddStatement.js","webpack://gvirantd/./src/pages/mapping/components/add-statement/MappingType.js","webpack://gvirantd/./src/pages/mapping/components/mapping-config/MappingConfig.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/mapping/config/CreateMappingConfig.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/mapping/config/EditMappingConfig.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/mapping/config/DeleteMappingConfig.js","webpack://gvirantd/./src/pages/mapping/components/mapping-config/CloneMappingConfigModal.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/mapping/config/CloneMappingConfig.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-apl/EditInfoMetadata.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-apl/ExecuteMatching.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-apl/MatchPercent.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-apl/send-invite/UpcProducts.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/dashboard/utils.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/dashboard/ModalCreateMeeting.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-apl/send-invite/Invite.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-apl/send-invite/SendMeetingInvite.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-apl/SendQuestions.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-apl/AddProductToApl.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-apl/DeleteProductApl.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/product-apl/AplSendSomethingProductList.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/product-apl/AplSendQuestion.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/product-apl/utils.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/product-apl/AplSendSomethingModal.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-apl/RequestSample.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-apl/SendAward.js","webpack://gvirantd/./src/pages/product-apl-detail/components/product-contact-modal/ProductContactModal.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-apl/EditProductContact.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/product-apl/Constants.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product-apl/utils.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/product-apl/AplContactEmail.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/product-apl/AplSendSampleRequestEditor.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/product-apl/AplSendSampleRequestTemplateList.js","webpack://gvirantd/./src/pages/home/ribbon/components/modal/product-apl/AplSendSampleRequestModal.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product-apl/AplDetailActions.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-apl/DownloadProductApl.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-apl/UploadProductApl.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product-apl/AplDetailTemplate.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/subscriiption/EditSubscription.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/subscriiption/Unsubscribe.js","webpack://gvirantd/./src/i18n/messages/subscription.js","webpack://gvirantd/./src/pages/subscription/components/new-gdsn-subscription/NewGdsnSubscriptionForm.js","webpack://gvirantd/./src/pages/subscription/components/new-gdsn-subscription/NewGdsnSubscriptionModal.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/subscriiption/NewGdsnSubscription.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-full/AcceptSubscription.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-full/RejectSubscription.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/product-full/RevokeSubscription.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/SubscriptionActionSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/markup/EditMarkupGridView.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/markup/CreateMarkup.js","webpack://gvirantd/./src/common/queries/new-main-page-module.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/markup/DeleteMarkupGridView.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/markup/BackToMarkup.js","webpack://gvirantd/./src/pages/home/ribbon/MaintenanceMarkupCreateView.js","webpack://gvirantd/./src/pages/home/ribbon/MaintenanceMarkupFullView.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/curated-query/CreateCuratedQuery.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/curated-query/EditCuratedQuery.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/maintenance/curated-query/RevokeCuratedQuery.js","webpack://gvirantd/./src/i18n/messages/recipients-fields.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/recipients-fields/FormFieldItem.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/recipients-fields/FormFields.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/recipients-fields/ShareComponent.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/recipients-fields/CreateField.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/recipients-fields/EditField.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/recipients-fields/DeleteFields.js","webpack://gvirantd/./src/assets/dashboard/day.svg","webpack://gvirantd/./src/i18n/messages/dashboard.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/dashboard/DayView.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/dashboard/WeekView.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/dashboard/MonthView.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/dashboard/ScheduleView.js","webpack://gvirantd/./src/assets/dashboard/work-schedule.svg","webpack://gvirantd/./src/pages/home/ribbon/components/controls/dashboard/NewMeeting.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/dashboard/MeetingNow.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/dashboard/DashboardLayout.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/dashboard/CancelMeeting.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/dashboard/EditMeeting.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/dashboard/ResetLayout.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/dashboard/LayoutSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/dashboard/ActionsMeeting.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/role-security-management/CreateNewRoleSection.js","webpack://gvirantd/./src/pages/home/ribbon/HomeBlank.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/publication/AcceptPublication.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/publication/utils.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/publication/RejectPublication.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/publication/ReviewPublication.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/product/PublicationSection.js","webpack://gvirantd/./src/assets/security-request/active-request.svg","webpack://gvirantd/./src/assets/security-request/created-by-me.svg","webpack://gvirantd/./src/assets/security-request/assign-to.svg","webpack://gvirantd/./src/pages/home/ribbon/security-request/FilterRequest.js","webpack://gvirantd/./src/pages/home/ribbon/transition-page/components/transition-page-grid/EditTransitionPageButton.js","webpack://gvirantd/./src/pages/home/ribbon/transition-page/components/transition-page-grid/CreateTransitionPageButton.js","webpack://gvirantd/./src/pages/home/ribbon/transition-page/components/transition-page-grid/ManipulateTransitionPageGridSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/transition-page/SaveEditTransitionPage.js","webpack://gvirantd/./src/pages/home/ribbon/form-manange/components/form-manange-grid/CloneFormBtn.js","webpack://gvirantd/./src/pages/home/ribbon/form-manange/components/form-manange-grid/DeleteFormBtn.js","webpack://gvirantd/./src/pages/home/ribbon/form-manange/components/form-manange-grid/UploadFormBtn.js","webpack://gvirantd/./src/pages/home/ribbon/form-manange/components/form-manange-grid/EditFormBtn.js","webpack://gvirantd/./src/pages/home/ribbon/form-manange/components/form-manange-grid/FormItemManipulationSection.js","webpack://gvirantd/./src/pages/home/ribbon/form-manange/components/form-manage-detail/DeleteFormBtn.js","webpack://gvirantd/./src/pages/home/ribbon/form-manange/components/form-manage-detail/ToggleFullScreenFormBtn.js","webpack://gvirantd/./src/pages/home/ribbon/form-manange/components/form-manage-detail/ToggleFloatModeFormBtn.js","webpack://gvirantd/./src/pages/home/ribbon/form-manange/components/form-manage-detail/SelectedDataPointInfo.js","webpack://gvirantd/./src/pages/home/ribbon/form-manange/components/form-manage-detail/FormDetailManipulationSection.js","webpack://gvirantd/./src/pages/home/ribbon/form-manange/components/form-excel/EditPreviewBtn.js","webpack://gvirantd/./src/pages/home/ribbon/form-manange/components/download-user-manual/SplashUserManual.js","webpack://gvirantd/./src/pages/home/ribbon/form-manange/components/download-user-manual/AcceptedFieldListing.js","webpack://gvirantd/./src/pages/home/ribbon/form-manange/components/form-history-grid/DownloadFormBtn.js","webpack://gvirantd/./src/pages/home/ribbon/form-manange/components/form-history-grid/FormHistoryDownloadSection.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/sso-approval/AcceptSsoApproval.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/sso-approval/RejectSsoApproval.js","webpack://gvirantd/./src/pages/home/ribbon/components/sections/sso-approval/SsoApprovalSection.js","webpack://gvirantd/./src/pages/sso-approval/button/FooterButton.js","webpack://gvirantd/./src/pages/sso-approval/modal/AssignMemberModal.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/sso-approval/AssignMemberSsoApproval.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/sso-approval/ToggleSsoApproval.js","webpack://gvirantd/./src/pages/sso-approval/modal/AssignUserModal.js","webpack://gvirantd/./src/pages/home/ribbon/components/controls/sso-approval/AssignUserSSoApproval.js","webpack://gvirantd/./src/pages/home/ribbon/ticketing-system/components/OpenTicketingSystem.js","webpack://gvirantd/./src/pages/home/ribbon/ticketing-system/components/CreateTicketModal.js","webpack://gvirantd/./src/pages/home/ribbon/ticketing-system/components/CreateTicketingSystem.js","webpack://gvirantd/./src/pages/home/ribbon/ticketing-system/components/DeleteTicketingSystem.js","webpack://gvirantd/./src/pages/home/ribbon/ticketing-system/components/FilterTicketingSystem.js","webpack://gvirantd/./src/pages/home/ribbon/ticketing-system/components/ExportTicketingSystem.js","webpack://gvirantd/./src/pages/home/ribbon/qas-require-field/components/ModalFormQasRequireField.js","webpack://gvirantd/./src/pages/home/ribbon/qas-require-field/components/CreateQasRequireField.js","webpack://gvirantd/./src/pages/home/ribbon/qas-require-field/components/DeleteQasRequireField.js","webpack://gvirantd/./src/pages/home/ribbon/qas-require-field/components/EditQasRequireField.js","webpack://gvirantd/./src/pages/home/ribbon/qas-require-field/components/ModalCopyQasRequireFields.js","webpack://gvirantd/./src/pages/home/ribbon/qas-require-field/components/CopyQasRequireFields.js","webpack://gvirantd/./src/pages/home/ribbon/qas-require-field/components/FormQasTargetMember.js","webpack://gvirantd/./src/pages/home/ribbon/qas-require-field/components/SectionQasRequireField.js","webpack://gvirantd/./src/pages/home/ribbon/qas-require-field/components/QasField.js","webpack://gvirantd/./src/pages/home/ribbon/qas-require-field/components/DraggableField.js","webpack://gvirantd/./src/pages/home/ribbon/qas-require-field/components/QasGroup.js","webpack://gvirantd/./src/pages/ticketing-group/hooks-query/useTicketingGroup.js","webpack://gvirantd/./src/pages/ticketing-group/controllers/actions.js","webpack://gvirantd/./src/pages/ticketing-group/controllers/constants.js","webpack://gvirantd/./src/pages/ticketing-group/controllers/reducer.js","webpack://gvirantd/./src/pages/ticketing-group/controllers/selectors.js","webpack://gvirantd/./src/pages/home/ribbon/ticketing-group/components/SaveTicketingGroupModal.js","webpack://gvirantd/./src/pages/home/ribbon/ticketing-group/components/CreateTicketingGroup.js","webpack://gvirantd/./src/pages/home/ribbon/ticketing-group/components/EditTicketingGroup.js","webpack://gvirantd/./src/pages/home/ribbon/ticketing-group/components/DeleteTicketingGroup.js","webpack://gvirantd/./src/static/Constants.js","webpack://gvirantd/./src/pages/home/ribbon/IxoneRibbon.js","webpack://gvirantd/./src/pages/home/ribbon/MemberFull.js","webpack://gvirantd/./src/pages/home/ribbon/MemberCompanyFull.js","webpack://gvirantd/./src/pages/home/ribbon/UserFull.js","webpack://gvirantd/./src/pages/home/ribbon/WorkflowGrid.js","webpack://gvirantd/./src/pages/home/ribbon/transition-page/TransitionPage.js","webpack://gvirantd/./src/pages/home/ribbon/transition-page/TransitionPageDetail.js","webpack://gvirantd/./src/pages/home/ribbon/form-manange/FornManage.js","webpack://gvirantd/./src/pages/home/ribbon/form-manange/FormHistory.js","webpack://gvirantd/./src/pages/home/ribbon/form-manange/FormHistoryEntity.js","webpack://gvirantd/./src/pages/home/ribbon/form-manange/FormUpload.js","webpack://gvirantd/./src/pages/home/ribbon/form-manange/FormExcel.js","webpack://gvirantd/./src/pages/home/ribbon/form-manange/FormManangeDetail.js","webpack://gvirantd/./src/pages/home/ribbon/security-request/RequestGrid.js","webpack://gvirantd/./src/pages/home/ribbon/WorkflowAdministrationGridView.js","webpack://gvirantd/./src/pages/home/ribbon/WorkflowDetailRibbon.js","webpack://gvirantd/./src/pages/home/ribbon/HelpMaintenanceCategory.js","webpack://gvirantd/./src/pages/home/ribbon/HelpPostGridView.js","webpack://gvirantd/./src/pages/home/ribbon/HelpArticlesGridView.js","webpack://gvirantd/./src/pages/home/ribbon/MaintenanceEulaGridView.js","webpack://gvirantd/./src/pages/home/ribbon/Reportings.js","webpack://gvirantd/./src/pages/home/ribbon/CommunicationTemplateGridView.js","webpack://gvirantd/./src/pages/home/ribbon/CommunicationTemplateFullView.js","webpack://gvirantd/./src/pages/home/ribbon/MemberMaintenanceGridView.js","webpack://gvirantd/./src/pages/home/ribbon/UsersMaintenanceGridView.js","webpack://gvirantd/./src/pages/home/ribbon/AssetForMember.js","webpack://gvirantd/./src/pages/home/ribbon/WorkflowMaintain.js","webpack://gvirantd/./src/pages/home/ribbon/WfTemplateFullView.js","webpack://gvirantd/./src/pages/home/ribbon/ProductForMemberRibbon.js","webpack://gvirantd/./src/pages/home/ribbon/ProductSubScription.js","webpack://gvirantd/./src/pages/home/ribbon/OnlyCloseRibbon.js","webpack://gvirantd/./src/pages/home/ribbon/ProductFullViewSheets.js","webpack://gvirantd/./src/pages/home/ribbon/ProductAPLGrid.js","webpack://gvirantd/./src/pages/home/ribbon/ProductMappingConfig.js","webpack://gvirantd/./src/pages/home/ribbon/ProductAPLDetail.js","webpack://gvirantd/./src/pages/home/ribbon/ProductSyndicationHistory.js","webpack://gvirantd/./src/pages/home/ribbon/MaintenanceMarkupGridView.js","webpack://gvirantd/./src/pages/home/ribbon/CuratedQueryGridView.js","webpack://gvirantd/./src/pages/home/ribbon/RecipientsFieldsGridView.js","webpack://gvirantd/./src/pages/home/ribbon/MySubscriptionGridView.js","webpack://gvirantd/./src/pages/home/ribbon/SubscriptionToGridView.js","webpack://gvirantd/./src/pages/home/ribbon/PublicationGridView.js","webpack://gvirantd/./src/pages/home/ribbon/RibbonRoleSecurityManage.js","webpack://gvirantd/./src/pages/home/ribbon/Dashboard.js","webpack://gvirantd/./src/pages/home/ribbon/sso-approval/SsoApprovalMemberRibbon.js","webpack://gvirantd/./src/pages/home/ribbon/sso-approval/SsoApprovalUserRibbon.js","webpack://gvirantd/./src/pages/home/ribbon/ticketing-system/TicketingSystemRibbon.js","webpack://gvirantd/./src/pages/home/ribbon/ticketing-group/TicketingGroupRibbon.js","webpack://gvirantd/./src/pages/home/ribbon/qas-require-field/QasRequireFieldRibbon.js","webpack://gvirantd/./src/static/CountryCode.js","webpack://gvirantd/./src/static/FileType.js","webpack://gvirantd/./src/static/HelpIcon.js","webpack://gvirantd/./src/assets/website.svg","webpack://gvirantd/./src/static/Icons.js","webpack://gvirantd/./src/assets/social-facebook.svg","webpack://gvirantd/./src/assets/twitter.svg","webpack://gvirantd/./src/assets/google.svg","webpack://gvirantd/./src/assets/LinkedIn.svg","webpack://gvirantd/./src/assets/instagram.svg","webpack://gvirantd/./src/static/MediaQuery.js","webpack://gvirantd/./src/static/Permission.js","webpack://gvirantd/./src/static/Theme.js","webpack://gvirantd/./src/static/TimeZones.js","webpack://gvirantd/./src/store/storeApp.js","webpack://gvirantd/./src/themes/index.js","webpack://gvirantd/./src/utils/SecureRoute.js","webpack://gvirantd/./src/utils/api.js","webpack://gvirantd/./src/utils/array.js","webpack://gvirantd/./src/utils/author.js","webpack://gvirantd/./src/utils/checkDeployEnv.js","webpack://gvirantd/./src/utils/checkIsOwner.js","webpack://gvirantd/./src/utils/checkShowPdfPreview.js","webpack://gvirantd/./src/utils/common/checkStore.js","webpack://gvirantd/./src/utils/common/history.js","webpack://gvirantd/./src/utils/common/constants.js","webpack://gvirantd/./src/utils/common/sagaInjectors.js","webpack://gvirantd/./src/utils/common/reducerInjectors.js","webpack://gvirantd/./src/utils/common/linkBuilder.js","webpack://gvirantd/./src/utils/common/route.js","webpack://gvirantd/./src/utils/common/session.js","webpack://gvirantd/./src/utils/contact.js","webpack://gvirantd/./src/utils/country.js","webpack://gvirantd/./src/utils/dataToMSoffice.js","webpack://gvirantd/./src/utils/delay.js","webpack://gvirantd/./src/utils/element.js","webpack://gvirantd/./src/utils/email-editor.js","webpack://gvirantd/./src/utils/entityTypeIcon.js","webpack://gvirantd/./src/utils/exportProductProperties.js","webpack://gvirantd/./src/utils/fileType.js","webpack://gvirantd/./src/utils/formatDate.js","webpack://gvirantd/./src/utils/formatSizeUnits.js","webpack://gvirantd/./src/utils/getGridName.js","webpack://gvirantd/./src/utils/image.js","webpack://gvirantd/./src/utils/index.js","webpack://gvirantd/./src/utils/ixone-capture.js","webpack://gvirantd/./src/utils/jsonChecker.js","webpack://gvirantd/./src/utils/mfa.js","webpack://gvirantd/./src/utils/cookies.js","webpack://gvirantd/./src/static/minimumRequirementFieldsSchema.js","webpack://gvirantd/./src/utils/minimumRequirementUtils.js","webpack://gvirantd/./src/utils/parser.js","webpack://gvirantd/./src/utils/productHierarchy.js","webpack://gvirantd/./src/utils/queryCondition.js","webpack://gvirantd/./src/utils/saveFile.js","webpack://gvirantd/./src/utils/sortByKey.js","webpack://gvirantd/./src/utils/storage.js","webpack://gvirantd/./src/utils/string.js","webpack://gvirantd/./src/utils/timezone.js","webpack://gvirantd/./src/assets/product/case.svg","webpack://gvirantd/./src/assets/product/innerpack.svg","webpack://gvirantd/./src/assets/product/master-case.svg","webpack://gvirantd/./src/assets/product/pallet.svg","webpack://gvirantd/./src/assets/product/unit.svg","webpack://gvirantd/./src/assets/shared-ribbon/Share.svg","webpack://gvirantd/./src/common/components/button/svg-icons/ICO_10.28.svg","webpack://gvirantd/./src/common/components/button/svg-icons/ICO_10.46.svg","webpack://gvirantd/./src/common/components/button/svg-icons/add-folder.svg","webpack://gvirantd/./src/common/components/button/svg-icons/delete-folder.svg"],"sourcesContent":["import { Ability, AbilityBuilder } from '@casl/ability';\r\nimport {\r\n PERMISSION,\r\n WORKFLOW_ROLES,\r\n ABILITY_ACTION,\r\n ABILITY_SUBJECT,\r\n} from 'static/Permission';\r\n\r\nimport * as _ from 'lodash';\r\n\r\nimport {\r\n checkIsSharedOnlyMemberUser,\r\n checkIsSuperAdmin,\r\n checkIsSupplierMemberUser,\r\n} from 'utils';\r\n\r\nexport function defineRulesFor(userInfo, navData) {\r\n const { permissions, isSuperMember, roles } = userInfo;\r\n const isSuperAdmin = checkIsSuperAdmin(roles);\r\n\r\n const { can, rules, cannot } = new AbilityBuilder();\r\n\r\n _.toArray(ABILITY_ACTION).forEach(\r\n (action) =>\r\n action !== ABILITY_ACTION.MANAGE && can(action, ABILITY_SUBJECT.ALL_AUTH)\r\n );\r\n\r\n getRuleFromPermissionList({\r\n navData,\r\n permissions,\r\n can,\r\n cannot,\r\n isSuperMember,\r\n isSuperAdmin,\r\n userInfo,\r\n });\r\n\r\n return rules;\r\n}\r\n\r\nexport function defineRulesForWorkflow(userInfo, workflowRoles, navData) {\r\n const { can, rules, cannot } = new AbilityBuilder();\r\n const { canAccessWorkflow } = navData;\r\n\r\n const isSupplierMemberUser = checkIsSupplierMemberUser(userInfo);\r\n const isSharedOnLyMemberUser = checkIsSharedOnlyMemberUser(userInfo);\r\n\r\n const { roles, isSuperMember } = userInfo;\r\n const isSuperAdmin = checkIsSuperAdmin(roles);\r\n\r\n workflowRoles &&\r\n workflowRoles.length > 0 &&\r\n workflowRoles.forEach((workflowRole) => {\r\n switch (workflowRole.roleName) {\r\n case WORKFLOW_ROLES.APPROVER:\r\n can(ABILITY_ACTION.APPROVE, ABILITY_SUBJECT.WORKFLOW_STEP);\r\n break;\r\n case WORKFLOW_ROLES.PARTICIPANT:\r\n // TODO: Change ABILITY_ACTION later\r\n break;\r\n case WORKFLOW_ROLES.INITIATOR:\r\n // TODO: Change ABILITY_ACTION later\r\n break;\r\n case WORKFLOW_ROLES.CREATOR:\r\n canAccessWorkflow &&\r\n can(ABILITY_ACTION.VIEW, ABILITY_SUBJECT.WORKFLOW_MAINTENANCE);\r\n canAccessWorkflow &&\r\n can(ABILITY_ACTION.MAINTAIN, ABILITY_SUBJECT.WORKFLOW_DEFINITION);\r\n break;\r\n case WORKFLOW_ROLES.ADMINISTRATOR:\r\n canAccessWorkflow &&\r\n can(ABILITY_ACTION.MAINTAIN, ABILITY_SUBJECT.WORKFLOW);\r\n canAccessWorkflow &&\r\n can(ABILITY_ACTION.VIEW, ABILITY_SUBJECT.WORKFLOW_MAINTENANCE);\r\n canAccessWorkflow &&\r\n can(\r\n ABILITY_ACTION.MAINTAIN,\r\n ABILITY_SUBJECT.WORKFLOW_ADMINISTRATION\r\n );\r\n canAccessWorkflow &&\r\n can(ABILITY_ACTION.MAINTAIN, ABILITY_SUBJECT.WORKFLOW_DEFINITION);\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n });\r\n\r\n if (\r\n (isSharedOnLyMemberUser && !isSuperMember && !isSuperAdmin) ||\r\n !canAccessWorkflow\r\n ) {\r\n cannot(ABILITY_ACTION.MAINTAIN, ABILITY_SUBJECT.WORKFLOW);\r\n cannot(ABILITY_ACTION.VIEW, ABILITY_SUBJECT.WORKFLOW_MAINTENANCE);\r\n cannot(ABILITY_ACTION.MAINTAIN, ABILITY_SUBJECT.WORKFLOW_ADMINISTRATION);\r\n cannot(ABILITY_ACTION.MAINTAIN, ABILITY_SUBJECT.WORKFLOW_DEFINITION);\r\n }\r\n\r\n if (isSuperAdmin) {\r\n can(ABILITY_ACTION.MAINTAIN, ABILITY_SUBJECT.WORKFLOW);\r\n can(ABILITY_ACTION.VIEW, ABILITY_SUBJECT.WORKFLOW_MAINTENANCE);\r\n can(ABILITY_ACTION.MAINTAIN, ABILITY_SUBJECT.WORKFLOW_ADMINISTRATION);\r\n can(ABILITY_ACTION.MAINTAIN, ABILITY_SUBJECT.WORKFLOW_DEFINITION);\r\n can(ABILITY_ACTION.ACCESS, ABILITY_SUBJECT.WORKFLOW);\r\n }\r\n\r\n return rules;\r\n}\r\n\r\n/**\r\n * ! get casl rule from permisison list\r\n * @param {*} navData\r\n * @param {*} permissions\r\n * @param {*} can\r\n * @param {*} isSuperMember\r\n * @param {*} userInfo\r\n */\r\nconst getRuleFromPermissionList = ({\r\n navData,\r\n permissions,\r\n can,\r\n cannot,\r\n isSuperMember,\r\n isSuperAdmin,\r\n userInfo,\r\n}) => {\r\n const {\r\n canAccessChat,\r\n canAccessDigitalAssets,\r\n canAccessFolders,\r\n canAccessMember,\r\n canAccessProducts,\r\n canAccessReporting,\r\n canManageHelpSystem,\r\n canAccessQaSpec,\r\n canAccessFTP,\r\n canAccessInterops,\r\n canAccessSyndication,\r\n canAccessGdsn,\r\n canAccessWorkflow,\r\n canAccessTicketSystem,\r\n // BP 11/19/2021: remove 3 options\r\n // 3 options do not have requirements\r\n /* canAccessThirdPartyAPI,\r\n canAccessVideoConf,\r\n canAccessVideoStreaming, */\r\n // end BP 11/19/2021: remove 3 options\r\n\r\n // canAccessWorkflowAdministration,\r\n // canAccessWorkflowDefinition,\r\n // canAccessWorkflowMaintenance,\r\n } = navData;\r\n\r\n const userMemberType = userInfo?.member?.memberType?.toLowerCase();\r\n\r\n //? default permission\r\n if (true) {\r\n can(ABILITY_ACTION.ACCESS, ABILITY_SUBJECT.SPLASH_DOWNLOAD_HISTORY);\r\n can(ABILITY_ACTION.ACCESS, ABILITY_SUBJECT.MY_QUERY);\r\n can(ABILITY_ACTION.ACCESS, ABILITY_SUBJECT.SHARED_QUERY);\r\n }\r\n\r\n const isSupplierMemberUser = checkIsSupplierMemberUser(userInfo);\r\n const isSharedOnLyMemberUser = checkIsSharedOnlyMemberUser(userInfo);\r\n\r\n permissions &&\r\n permissions.length > 0 &&\r\n permissions.forEach((permission) => {\r\n switch (permission) {\r\n case PERMISSION.VIEW_USERS:\r\n can(ABILITY_ACTION.VIEW, ABILITY_SUBJECT.USER);\r\n break;\r\n // DAM view\r\n case PERMISSION.VIEW_ASSETS:\r\n canAccessDigitalAssets &&\r\n can(ABILITY_ACTION.VIEW, ABILITY_SUBJECT.ASSET);\r\n break;\r\n case PERMISSION.CREATE_ASSETS:\r\n canAccessDigitalAssets &&\r\n can(ABILITY_ACTION.CREATE, ABILITY_SUBJECT.ASSET);\r\n break;\r\n\r\n case PERMISSION.EDIT_ASSET:\r\n if (canAccessDigitalAssets) {\r\n can(ABILITY_ACTION.EDIT, ABILITY_SUBJECT.ASSET);\r\n\r\n if (isSuperMember) {\r\n can(ABILITY_ACTION.EDIT, ABILITY_SUBJECT.SHARED_ASSET);\r\n }\r\n }\r\n break;\r\n\r\n case PERMISSION.DELETE_ASSETS:\r\n if (canAccessDigitalAssets) {\r\n can(ABILITY_ACTION.DELETE, ABILITY_SUBJECT.ASSET);\r\n\r\n if (isSuperMember) {\r\n can(ABILITY_ACTION.DELETE, ABILITY_SUBJECT.SHARED_ASSET);\r\n }\r\n }\r\n\r\n break;\r\n // end DAM view\r\n\r\n // PIM view\r\n case PERMISSION.VIEW_PRODUCTS:\r\n if (canAccessProducts) {\r\n can(ABILITY_ACTION.VIEW, ABILITY_SUBJECT.PRODUCT);\r\n if (!isSharedOnLyMemberUser) {\r\n can(ABILITY_ACTION.VIEW, ABILITY_SUBJECT.PRODUCT_APL);\r\n }\r\n }\r\n break;\r\n\r\n case PERMISSION.EDIT_PRODUCT:\r\n if (canAccessProducts) {\r\n can(ABILITY_ACTION.EDIT, ABILITY_SUBJECT.PRODUCT);\r\n\r\n if (isSuperMember) {\r\n can(ABILITY_ACTION.EDIT, ABILITY_SUBJECT.SHARED_PRODUCT);\r\n }\r\n\r\n if (isSupplierMemberUser) {\r\n can(\r\n ABILITY_ACTION.EDIT,\r\n ABILITY_SUBJECT.SUPPLIER_ASSIGNED_PRODUCT\r\n );\r\n }\r\n\r\n if (isSharedOnLyMemberUser) {\r\n can(\r\n ABILITY_ACTION.EDIT,\r\n ABILITY_SUBJECT.SHARED_ONLY_ASSIGNED_PRODUCT\r\n );\r\n }\r\n }\r\n break;\r\n\r\n case PERMISSION.CREATE_PRODUCT:\r\n canAccessProducts &&\r\n can(ABILITY_ACTION.CREATE, ABILITY_SUBJECT.PRODUCT);\r\n break;\r\n\r\n case PERMISSION.DELETE_PRODUCTS:\r\n if (canAccessProducts) {\r\n can(ABILITY_ACTION.DELETE, ABILITY_SUBJECT.PRODUCT);\r\n\r\n if (isSuperMember) {\r\n can(ABILITY_ACTION.DELETE, ABILITY_SUBJECT.SHARED_PRODUCT);\r\n }\r\n }\r\n break;\r\n // end PIM view\r\n\r\n // My company view\r\n case PERMISSION.VIEW_FULL_COMPANY_PROFILE:\r\n can(ABILITY_ACTION.VIEW, ABILITY_SUBJECT.COMPANY_PROFILE);\r\n break;\r\n // End my company view\r\n\r\n // Reporting view\r\n case PERMISSION.VIEW_REPORTING:\r\n canAccessReporting &&\r\n can(ABILITY_ACTION.VIEW, ABILITY_SUBJECT.REPORTING);\r\n break;\r\n case PERMISSION.CREATE_REPORTING:\r\n canAccessReporting &&\r\n can(ABILITY_ACTION.CREATE, ABILITY_SUBJECT.REPORTING);\r\n break;\r\n case PERMISSION.EDIT_REPORTING:\r\n canAccessReporting &&\r\n can(ABILITY_ACTION.EDIT, ABILITY_SUBJECT.REPORTING);\r\n break;\r\n case PERMISSION.DELETE_REPORTING:\r\n canAccessReporting &&\r\n can(ABILITY_ACTION.DELETE, ABILITY_SUBJECT.REPORTING);\r\n break;\r\n // end reporting view\r\n\r\n // Folder view\r\n case PERMISSION.VIEW_FOLDERS:\r\n canAccessFolders && can(ABILITY_ACTION.VIEW, ABILITY_SUBJECT.FOLDER);\r\n break;\r\n case PERMISSION.EDIT_FOLDER:\r\n canAccessFolders && can(ABILITY_ACTION.EDIT, ABILITY_SUBJECT.FOLDER);\r\n break;\r\n case PERMISSION.CREATE_FOLDER:\r\n canAccessFolders &&\r\n can(ABILITY_ACTION.CREATE, ABILITY_SUBJECT.FOLDER);\r\n canAccessFolders && can(ABILITY_ACTION.COPY, ABILITY_SUBJECT.FOLDER);\r\n break;\r\n case PERMISSION.DELETE_FOLDERS:\r\n canAccessFolders &&\r\n can(ABILITY_ACTION.DELETE, ABILITY_SUBJECT.FOLDER);\r\n break;\r\n // end folder view\r\n\r\n case PERMISSION.VIEW_SHARED_ENTITIES:\r\n can(ABILITY_ACTION.VIEW, ABILITY_SUBJECT.SHARED_ENTITY);\r\n break;\r\n case PERMISSION.MANAGE_SHARED_ENTITIES:\r\n can(ABILITY_ACTION.EDIT, ABILITY_SUBJECT.SHARED_ENTITY);\r\n break;\r\n\r\n // Help view\r\n case PERMISSION.VIEW_HELP_CATEGORIES:\r\n canManageHelpSystem &&\r\n can(ABILITY_ACTION.VIEW, ABILITY_SUBJECT.HELP_CATEGORY);\r\n break;\r\n case PERMISSION.MANAGE_HELP_CATEGORY:\r\n canManageHelpSystem &&\r\n can(ABILITY_ACTION.MAINTAIN, ABILITY_SUBJECT.HELP_CATEGORY);\r\n break;\r\n case PERMISSION.VIEW_HELP_POSTS:\r\n canManageHelpSystem &&\r\n can(ABILITY_ACTION.VIEW, ABILITY_SUBJECT.HELP_POST);\r\n break;\r\n case PERMISSION.MANAGE_HELP_POST:\r\n canManageHelpSystem &&\r\n can(ABILITY_ACTION.MAINTAIN, ABILITY_SUBJECT.HELP_POST);\r\n break;\r\n case PERMISSION.VIEW_ARTICLES:\r\n canManageHelpSystem &&\r\n can(ABILITY_ACTION.VIEW, ABILITY_SUBJECT.ARTICLE);\r\n break;\r\n case PERMISSION.MANAGE_ARTICLES:\r\n canManageHelpSystem &&\r\n can(ABILITY_ACTION.MAINTAIN, ABILITY_SUBJECT.ARTICLE);\r\n break;\r\n // end Help view\r\n\r\n case PERMISSION.VIEW_EULAS:\r\n can(ABILITY_ACTION.VIEW, ABILITY_SUBJECT.EULA);\r\n break;\r\n case PERMISSION.MANAGE_EULAS:\r\n can(ABILITY_ACTION.MAINTAIN, ABILITY_SUBJECT.EULA);\r\n break;\r\n case PERMISSION.VIEW_COMMUNICATION_TEMPLATE:\r\n can(ABILITY_ACTION.VIEW, ABILITY_SUBJECT.COMMUNICATION_TEMPLATE);\r\n break;\r\n case PERMISSION.MANAGE_COMMUNICATION_TEMPLATE:\r\n can(ABILITY_ACTION.MAINTAIN, ABILITY_SUBJECT.COMMUNICATION_TEMPLATE);\r\n break;\r\n\r\n case PERMISSION.EDIT_COMPANY_PROFILE:\r\n can(ABILITY_ACTION.EDIT, ABILITY_SUBJECT.COMPANY_PROFILE);\r\n break;\r\n case PERMISSION.VIEW_MEMBER_DEFINED_PROPERTIES:\r\n can(ABILITY_ACTION.VIEW, ABILITY_SUBJECT.MEMBER_DEFINED_PROPERTIES);\r\n break;\r\n case PERMISSION.EDIT_MEMBER_DEFINED_PROPERTIES:\r\n can(ABILITY_ACTION.EDIT, ABILITY_SUBJECT.MEMBER_DEFINED_PROPERTIES);\r\n break;\r\n case PERMISSION.EDIT_USERS_PERMISSIONS:\r\n can(ABILITY_ACTION.EDIT, ABILITY_SUBJECT.USER_PERMISSIONS);\r\n break;\r\n\r\n // Members view\r\n case PERMISSION.VIEW_MEMBERS:\r\n canAccessMember && can(ABILITY_ACTION.VIEW, ABILITY_SUBJECT.MEMBER);\r\n break;\r\n case PERMISSION.CREATE_MEMBER:\r\n can(ABILITY_ACTION.CREATE, ABILITY_SUBJECT.MEMBER);\r\n break;\r\n case PERMISSION.EDIT_MEMBER:\r\n can(ABILITY_ACTION.EDIT, ABILITY_SUBJECT.MEMBER);\r\n break;\r\n // end Members view\r\n\r\n case PERMISSION.EXECUTE_COMMUNICATION_TEMPLATE:\r\n can(ABILITY_ACTION.EXECUTE, ABILITY_SUBJECT.COMMUNICATION_TEMPLATE);\r\n break;\r\n case PERMISSION.CREATE_USER:\r\n can(ABILITY_ACTION.CREATE, ABILITY_SUBJECT.USER);\r\n break;\r\n case PERMISSION.EDIT_USER:\r\n can(ABILITY_ACTION.EDIT, ABILITY_SUBJECT.USER);\r\n break;\r\n case PERMISSION.DELETE_USERS:\r\n can(ABILITY_ACTION.DELETE, ABILITY_SUBJECT.USER);\r\n break;\r\n case PERMISSION.SUPER_ADMIN:\r\n can(ABILITY_ACTION.MANAGE, ABILITY_SUBJECT.ALL);\r\n break;\r\n case PERMISSION.VIEW_MANAGE_MEMBER:\r\n // bp 11/19/2021: comment VIEW MEMBER if user has VIEW_MANAGE_MEMBER\r\n // can(ABILITY_ACTION.VIEW, ABILITY_SUBJECT.MEMBER);\r\n // can(ABILITY_ACTION.VIEW, ABILITY_SUBJECT.COMPANY_PROFILE);\r\n can(ABILITY_ACTION.VIEW, ABILITY_SUBJECT.MANAGE_MEMBER);\r\n\r\n break;\r\n case PERMISSION.MANAGE_BAN_LIST:\r\n can(ABILITY_ACTION.MANAGE, ABILITY_SUBJECT.BAN_LIST);\r\n break;\r\n case PERMISSION.CHAT_CALL_VIDEO_VIA_COMPANY_ACCOUNT:\r\n if (userInfo?.receiveCompanyCommunications)\r\n canAccessChat &&\r\n can(ABILITY_ACTION.CHAT, ABILITY_SUBJECT.CHAT_COMPANY);\r\n break;\r\n case PERMISSION.CHAT_CALL_VIDEO_VIA_PERSONAL_ACCOUNT:\r\n canAccessChat &&\r\n can(ABILITY_ACTION.CHAT, ABILITY_SUBJECT.CHAT_PERSONAL);\r\n break;\r\n\r\n case PERMISSION.MANAGE_CURATED_QUERY:\r\n can(ABILITY_ACTION.MANAGE, ABILITY_SUBJECT.CURATED_QUERY);\r\n break;\r\n case PERMISSION.MANAGE_PIM_MAPPING:\r\n can(ABILITY_ACTION.MANAGE, ABILITY_SUBJECT.PIM_MAPPING);\r\n break;\r\n\r\n case PERMISSION.VIEW_NEW_ITEM_FORMS:\r\n can(ABILITY_ACTION.VIEW, ABILITY_SUBJECT.NEW_ITEM_FORMS);\r\n break;\r\n case PERMISSION.IMPERSONATE_USER:\r\n can(ABILITY_ACTION.IMPERSONATE, ABILITY_SUBJECT.USER);\r\n break;\r\n case PERMISSION.IMPERSONATE_MEMBER:\r\n can(ABILITY_ACTION.IMPERSONATE, ABILITY_SUBJECT.MEMBER);\r\n break;\r\n case PERMISSION.VIEW_QA_SPECIFICATION:\r\n canAccessQaSpec &&\r\n can(ABILITY_ACTION.VIEW, ABILITY_SUBJECT.QA_SPECIFICATION);\r\n break;\r\n case PERMISSION.EDIT_QA_SPECIFICATION:\r\n canAccessQaSpec &&\r\n can(ABILITY_ACTION.EDIT, ABILITY_SUBJECT.QA_SPECIFICATION);\r\n break;\r\n\r\n case PERMISSION.VIEW_EVALUATION_FORM:\r\n can(ABILITY_ACTION.VIEW, ABILITY_SUBJECT.EVALUATION_FORM);\r\n break;\r\n case PERMISSION.EDIT_EVALUATION_FORM:\r\n can(ABILITY_ACTION.EDIT, ABILITY_SUBJECT.EVALUATION_FORM);\r\n break;\r\n\r\n // New CREDIT CARD\r\n // case PERMISSION.MANAGE_MEMBER_CREDIT_CARD:\r\n // can(ABILITY_ACTION.MANAGE, ABILITY_SUBJECT.MEMBER_CREDIT_CARD);\r\n // break;\r\n // case PERMISSION.PAY_WITH_MEMBER_CREDIT_CARD:\r\n // can(ABILITY_ACTION.PAY, ABILITY_SUBJECT.MEMBER_CREDIT_CARD);\r\n // break;\r\n // END\r\n case PERMISSION.MANAGE_MEMBER_CREDIT_CARD:\r\n can(ABILITY_ACTION.MAINTAIN, ABILITY_SUBJECT.MEMBER_CREDIT_CARD);\r\n break;\r\n case PERMISSION.PAY_WITH_MEMBER_CREDIT_CARD:\r\n can(ABILITY_ACTION.PAY, ABILITY_SUBJECT.MEMBER_CREDIT_CARD);\r\n break;\r\n case PERMISSION.MANAGE_BILLABLE_TRACKING:\r\n can(ABILITY_ACTION.MAINTAIN, ABILITY_SUBJECT.BILLABLE_TRACKING);\r\n break;\r\n case PERMISSION.EDIT_BRAND:\r\n can(ABILITY_ACTION.EDIT, ABILITY_SUBJECT.BRAND);\r\n break;\r\n case PERMISSION.MANAGE_MEMBER_CATEGORIES:\r\n can(ABILITY_ACTION.MANAGE, ABILITY_SUBJECT.MEMBER_CATEGORIES);\r\n break;\r\n case PERMISSION.ASSIGN_PRODUCT_CATEGORY:\r\n can(ABILITY_ACTION.ASSIGN, ABILITY_SUBJECT.PRODUCT_CATEGORY);\r\n break;\r\n // TICKET SYSTEM\r\n case PERMISSION.VIEW_TICKET:\r\n can(ABILITY_ACTION.VIEW, ABILITY_SUBJECT.TICKET_SYSTEM);\r\n break;\r\n case PERMISSION.CREATE_TICKET:\r\n can(ABILITY_ACTION.CREATE, ABILITY_SUBJECT.TICKET_SYSTEM);\r\n break;\r\n case PERMISSION.EDIT_TICKET:\r\n can(ABILITY_ACTION.EDIT, ABILITY_SUBJECT.TICKET_SYSTEM);\r\n break;\r\n case PERMISSION.DELETE_TICKET:\r\n can(ABILITY_ACTION.DELETE, ABILITY_SUBJECT.TICKET_SYSTEM);\r\n break;\r\n case PERMISSION.MANAGE_TICKET_GROUP:\r\n can(ABILITY_ACTION.MANAGE, ABILITY_SUBJECT.TICKET_SYSTEM_GROUP);\r\n break;\r\n case PERMISSION.MANAGE_QA_SPEC_WORKFLOW:\r\n canAccessWorkflow &&\r\n can(ABILITY_ACTION.MANAGE, ABILITY_SUBJECT.QA_SPEC_WORKFLOW);\r\n break;\r\n case PERMISSION.MANAGE_SYNDICATION:\r\n can(ABILITY_ACTION.MAINTAIN, ABILITY_SUBJECT.SYNDICATION);\r\n break;\r\n case PERMISSION.MEMBER_BILLING_MANAGEMENT:\r\n can(\r\n ABILITY_ACTION.MAINTAIN,\r\n ABILITY_SUBJECT.MEMBER_BILLING_MANAGEMENT\r\n );\r\n break;\r\n case PERMISSION.MANAGE_MEMBER_ROLE:\r\n can(ABILITY_ACTION.MAINTAIN, ABILITY_SUBJECT.MEMBER_ROLE);\r\n break;\r\n case PERMISSION.MANAGE_MFA_VERIFICATION:\r\n can(ABILITY_ACTION.MAINTAIN, ABILITY_SUBJECT.MFA_VERIFICATION);\r\n break;\r\n case PERMISSION.MANAGE_TRANSITION_PAGE:\r\n can(ABILITY_ACTION.MAINTAIN, ABILITY_SUBJECT.TRANSITION_PAGE);\r\n break;\r\n case PERMISSION.MANAGE_FORM_MANAGEMENT:\r\n can(ABILITY_ACTION.MAINTAIN, ABILITY_SUBJECT.FORM_MANAGEMENT);\r\n break;\r\n case PERMISSION.MANAGE_MINIMUM_REQUIREMENTS:\r\n can(ABILITY_ACTION.MAINTAIN, ABILITY_SUBJECT.MINIMUM_REQUIREMENTS);\r\n break;\r\n case PERMISSION.MANAGE_SSO_USER_APPROVAL:\r\n can(ABILITY_ACTION.MAINTAIN, ABILITY_SUBJECT.SSO_USER_APPROVAL);\r\n break;\r\n case PERMISSION.MANAGE_SSO_MEMBER_APPROVAL:\r\n can(ABILITY_ACTION.MAINTAIN, ABILITY_SUBJECT.SSO_MEMBER_APPROVAL);\r\n break;\r\n case PERMISSION.MANAGE_MEMBER_MANAGEMENT:\r\n can(ABILITY_ACTION.MAINTAIN, ABILITY_SUBJECT.MEMBER_MANAGEMENT);\r\n break;\r\n case PERMISSION.MANAGE_USER_MANAGEMENT:\r\n can(ABILITY_ACTION.MAINTAIN, ABILITY_SUBJECT.USER_MANAGEMENT);\r\n break;\r\n case PERMISSION.MANAGE_MAIN_PAGE:\r\n can(ABILITY_ACTION.MAINTAIN, ABILITY_SUBJECT.MAIN_PAGE);\r\n break;\r\n case PERMISSION.OVERLAY_CREATE:\r\n can(ABILITY_ACTION.CREATE, ABILITY_SUBJECT.PRODUCT_OVERLAY);\r\n break;\r\n case PERMISSION.OVERLAY_EDIT:\r\n can(ABILITY_ACTION.EDIT, ABILITY_SUBJECT.PRODUCT_OVERLAY);\r\n break;\r\n case PERMISSION.OVERLAY_DELETE:\r\n can(ABILITY_ACTION.DELETE, ABILITY_SUBJECT.PRODUCT_OVERLAY);\r\n break;\r\n case PERMISSION.OVERLAY_PROVIDE_DATA:\r\n can(ABILITY_ACTION.VIEW, ABILITY_SUBJECT.OVERLAY_PROVIDE_DATA);\r\n break;\r\n case PERMISSION.INITIATE_BILLING_EVENT:\r\n can(\r\n ABILITY_ACTION.IMPERSONATE,\r\n ABILITY_SUBJECT.INITIATE_BILLING_EVENT\r\n );\r\n break;\r\n default:\r\n break;\r\n }\r\n });\r\n\r\n if (canAccessGdsn) {\r\n can(ABILITY_ACTION.ACCESS, ABILITY_SUBJECT.GDSN);\r\n can(ABILITY_ACTION.VIEW, ABILITY_SUBJECT.RECIPIENTS_FIELDS);\r\n }\r\n\r\n if (userMemberType === 'retailer' || userMemberType === 'distributor') {\r\n can(ABILITY_ACTION.ACCESS, ABILITY_SUBJECT.GDSN_RECEIVED_PRODUCT);\r\n can(ABILITY_ACTION.ACCESS, ABILITY_SUBJECT.MY_SUBSCRIPTIONS);\r\n }\r\n\r\n if (canAccessSyndication) {\r\n can(ABILITY_ACTION.ACCESS, ABILITY_SUBJECT.SYNDICATION);\r\n }\r\n\r\n if (canAccessWorkflow) {\r\n can(ABILITY_ACTION.MAINTAIN, ABILITY_SUBJECT.WORKFLOW);\r\n can(ABILITY_ACTION.ACCESS, ABILITY_SUBJECT.WORKFLOW);\r\n }\r\n\r\n if (!canAccessTicketSystem && !isSuperMember && !isSuperAdmin) {\r\n cannot(ABILITY_ACTION.VIEW, ABILITY_SUBJECT.TICKET_SYSTEM);\r\n cannot(ABILITY_ACTION.CREATE, ABILITY_SUBJECT.TICKET_SYSTEM);\r\n cannot(ABILITY_ACTION.EDIT, ABILITY_SUBJECT.TICKET_SYSTEM);\r\n cannot(ABILITY_ACTION.DELETE, ABILITY_SUBJECT.TICKET_SYSTEM);\r\n cannot(ABILITY_ACTION.MANAGE, ABILITY_SUBJECT.TICKET_SYSTEM_GROUP);\r\n }\r\n\r\n if (isSharedOnLyMemberUser && !isSuperMember && !isSuperAdmin) {\r\n cannot(ABILITY_ACTION.VIEW, ABILITY_SUBJECT.RECIPIENTS_FIELDS);\r\n cannot(ABILITY_ACTION.ACCESS, ABILITY_SUBJECT.SPLASH_DOWNLOAD_HISTORY);\r\n cannot(ABILITY_ACTION.ACCESS, ABILITY_SUBJECT.GDSN);\r\n cannot(ABILITY_ACTION.ACCESS, ABILITY_SUBJECT.MY_QUERY);\r\n cannot(ABILITY_ACTION.ACCESS, ABILITY_SUBJECT.SHARED_QUERY);\r\n //* disable all overlay permissions\r\n cannot(ABILITY_ACTION.CREATE, ABILITY_SUBJECT.PRODUCT_OVERLAY);\r\n cannot(ABILITY_ACTION.DELETE, ABILITY_SUBJECT.PRODUCT_OVERLAY);\r\n cannot(ABILITY_ACTION.EDIT, ABILITY_SUBJECT.PRODUCT_OVERLAY);\r\n cannot(ABILITY_ACTION.VIEW, ABILITY_SUBJECT.OVERLAY_PROVIDE_DATA);\r\n }\r\n\r\n // if (isSupplierMemberUser && !isSuperMember && !isSuperAdmin) {\r\n // // cannot(ABILITY_ACTION.VIEW, ABILITY_SUBJECT.RECIPIENTS_FIELDS);\r\n // // cannot(ABILITY_ACTION.ACCESS, ABILITY_SUBJECT.SPLASH_DOWNLOAD_HISTORY);\r\n // // cannot(ABILITY_ACTION.ACCESS, ABILITY_SUBJECT.GDSN);\r\n // // cannot(ABILITY_ACTION.ACCESS, ABILITY_SUBJECT.MY_QUERY);\r\n // // cannot(ABILITY_ACTION.ACCESS, ABILITY_SUBJECT.SHARED_QUERY);\r\n // }\r\n};\r\n\r\n/**\r\n * Defines how to detect object's type\r\n * @param {*} item\r\n */\r\nfunction subjectName(item) {\r\n if (!item || typeof item === 'string') {\r\n return item;\r\n }\r\n\r\n return item.__type;\r\n}\r\n\r\nconst ability = new Ability([], { subjectName });\r\n\r\nexport default ability;\r\n","import React from 'react';\r\nimport { Row, Typography } from 'antd';\r\nimport PropTypes from 'prop-types';\r\nimport './AdvancedSearchTitle.less';\r\n\r\nconst AdvancedSearchTitle = (props) => {\r\n const { title } = props;\r\n return (\r\n \r\n \r\n {title}\r\n \r\n \r\n );\r\n};\r\nAdvancedSearchTitle.propTypes = {\r\n title: PropTypes.string,\r\n};\r\nexport default React.memo(AdvancedSearchTitle);\r\n","import React, { useState, useEffect } from 'react';\r\n\r\nimport { Modal } from 'antd';\r\nimport { UploadFile } from 'common/components';\r\n\r\nimport ErrorModal from 'common/components/product-publication-setup/ErrorModal.js';\r\n\r\nimport * as services from 'services/reporting/endpoints';\r\n\r\nimport { UPLOAD_MAX_SIZE } from 'static/Constants';\r\n\r\nimport './ModalUploadAvancedFile.less';\r\n\r\nconst ModalUploadAdvancedFile = (props) => {\r\n const { visibleModal, setVisibleModal, handleUploadAdvancedFile } = props;\r\n\r\n const [errorList, setErrorList] = useState([]);\r\n\r\n useEffect(() => {\r\n if (visibleModal) setErrorList([]);\r\n }, [visibleModal]);\r\n\r\n const handleResponseUpload = (response) => {\r\n if (response?.data) {\r\n if (response?.data?.isSuccess) {\r\n setVisibleModal(false);\r\n handleUploadAdvancedFile(response?.data?.data);\r\n } else {\r\n if (response?.data?.errors) {\r\n setErrorList(response?.data?.errors);\r\n }\r\n }\r\n }\r\n };\r\n\r\n return (\r\n setVisibleModal(false)}\r\n closable={true}\r\n maskClosable={false}\r\n footer={null}\r\n destroyOnClose\r\n centered\r\n >\r\n
\r\n handleResponseUpload(response)}\r\n maxSize={UPLOAD_MAX_SIZE.GENERAL}\r\n supportTypes={['xlsx', 'xls', 'xlsm', 'txt']}\r\n />\r\n
\r\n
\r\n {errorList && errorList.length > 0 && (\r\n \r\n )}\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default ModalUploadAdvancedFile;\r\n","import React from 'react';\r\n\r\nimport { Link } from 'react-router-dom';\r\n\r\nconst CellRenderLink = (params) => {\r\n const { colDef, data, value } = params;\r\n\r\n const href = createHref(colDef.linkTo, data);\r\n\r\n return (\r\n \r\n {value}\r\n \r\n );\r\n};\r\n\r\nconst createHref = (linkTo, data) => {\r\n if (!linkTo) return linkTo;\r\n\r\n let href = linkTo;\r\n const regex = new RegExp(/(?:\\{)([^{}]+)(?:\\})/gs); // match every character in {}\r\n\r\n const params = linkTo.match(regex);\r\n params?.length &&\r\n params.forEach((match) => {\r\n let removeCurly = match.replace(/[{}]/g, '');\r\n href = href.replace(match, data?.[removeCurly]);\r\n });\r\n\r\n return href;\r\n};\r\n\r\nexport default CellRenderLink;\r\n","import React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { Provider } from 'react-redux';\r\n\r\nimport selectorsGridView from 'common/components/grid-view/controllers/selectors';\r\n\r\nimport { DragWrap, DragDropWrapUtils } from 'common/components';\r\n\r\nimport store from 'store/storeApp';\r\n\r\nconst DragRender = (props) => {\r\n const { data } = props;\r\n\r\n const detailCurrentItemsSelection = useSelector(\r\n selectorsGridView.makeSelectDetailCurrentITemsSelection()\r\n );\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default DragRender;\r\n","import React from 'react';\r\n\r\nimport { Checkbox } from 'antd';\r\n\r\nconst CheckboxSelectionRender = (props) => {\r\n const { value } = props;\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport default CheckboxSelectionRender;\r\n","import React from 'react';\r\n\r\nexport const GridContext = React.createContext({});\r\n","import React, { useContext } from 'react';\r\nimport { GridContext } from '../../context/gridContext';\r\n\r\nconst HeaderCheckboxRender = (props) => {\r\n const gridContext = useContext(GridContext);\r\n\r\n const { urlGrid } = props;\r\n\r\n const handleClick = (e) => {\r\n const { onHeaderCheckboxClick } = gridContext;\r\n\r\n const firstRow = props.api.getDisplayedRowAtIndex(0);\r\n if (firstRow?.data === undefined) return;\r\n\r\n onHeaderCheckboxClick(e, props);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default HeaderCheckboxRender;\r\n","import React from 'react';\r\n\r\nconst HeaderNullRender = () => {\r\n return ;\r\n};\r\n\r\nexport default HeaderNullRender;\r\n","import React from 'react';\r\n\r\nimport { Checkbox } from 'antd';\r\n\r\nconst CheckboxRenderer = (params) => {\r\n return ;\r\n};\r\n\r\nexport default CheckboxRenderer;\r\n","import React from 'react';\r\n\r\nimport { Row, Button, Space } from 'antd';\r\n\r\nexport default function ApplyFilter(event) {\r\n const handleApply = () => {\r\n const key = event?.colDef?.field;\r\n // Get a reference to the 'name' filter instance\r\n const filter = event?.api?.getFilterInstance(key);\r\n\r\n // Apply the model to ensure any changes in the UI or via API methods are recognised\r\n filter?.applyModel();\r\n\r\n // Tell grid to run filter operation again\r\n event?.api?.onFilterChanged();\r\n event?.api?.hidePopupMenu();\r\n };\r\n const handleReset = () => {\r\n const key = event?.colDef?.field;\r\n // Get a reference to the 'name' filter instance\r\n const filter = event?.api?.getFilterInstance(key);\r\n filter?.setModel(undefined);\r\n // Apply the model to ensure any changes in the UI or via API methods are recognised\r\n filter?.applyModel();\r\n\r\n // Tell grid to run filter operation again\r\n event?.api?.onFilterChanged();\r\n event?.api?.hidePopupMenu();\r\n };\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n","import { useMemo } from 'react';\r\n\r\nimport * as _ from 'lodash';\r\n\r\nimport ApplyFilter from '../components/ApplyFilter';\r\n\r\nimport {\r\n GET_FAVORITE_PRODUCT_DETAIL_CUSTOMIZED_GRID,\r\n GET_PRODUCT_DETAIL_CUSTOMIZED_GRID,\r\n} from 'services/product/endpoints';\r\n\r\nconst URL_LIST_TO_DISABLE_SORT_IS_OWNER = [\r\n GET_PRODUCT_DETAIL_CUSTOMIZED_GRID,\r\n GET_FAVORITE_PRODUCT_DETAIL_CUSTOMIZED_GRID,\r\n];\r\n\r\nconst useGetColumnDefs = ({\r\n urlGrid,\r\n columnDefs,\r\n notShowHeaderCheckbox,\r\n hideAgSetColumnFilter,\r\n}) => {\r\n const procColDef = useMemo(() => {\r\n if (!columnDefs) return [];\r\n let nextColDefs = [];\r\n\r\n columnDefs.forEach((colDef, index) => {\r\n if (colDef && colDef?.checkboxSelection) {\r\n nextColDefs.push({\r\n ...colDef,\r\n width: 60,\r\n field: 'checkboxSelection',\r\n filter: false,\r\n sortable: false,\r\n resizable: false,\r\n suppressMenu: true,\r\n cellRenderer: 'CheckboxSelectionRender',\r\n\r\n headerComponent: !notShowHeaderCheckbox\r\n ? 'HeaderCheckboxRender'\r\n : 'HeaderNullRender',\r\n headerComponentParams: {\r\n urlGrid,\r\n },\r\n checkboxSelection: false,\r\n header: true,\r\n });\r\n return;\r\n }\r\n\r\n if (colDef && colDef.field === 'dragColumn') {\r\n nextColDefs.push({\r\n ...colDef,\r\n width: 50,\r\n field: 'dragColumn',\r\n filter: false,\r\n sortable: false,\r\n resizable: false,\r\n suppressMenu: true,\r\n cellRenderer: 'DragRender',\r\n headerComponent: () => null,\r\n });\r\n return;\r\n }\r\n\r\n nextColDefs.push({\r\n headerName: colDef && colDef.headerName,\r\n headerClass: colDef && colDef.headerClass,\r\n field: (colDef && colDef.field) || colDef.fieldNameCamelCase,\r\n width: colDef && colDef.width,\r\n minWidth: colDef && colDef.minWidth,\r\n maxWidth: colDef && colDef.maxWidth,\r\n flex: colDef && colDef.flex,\r\n filter: getFilter(colDef),\r\n filterParams: getFilterParams(colDef, hideAgSetColumnFilter),\r\n\r\n filterFramework: colDef && colDef.filterFramework,\r\n hide: colDef && colDef.hide,\r\n pinned: colDef && colDef.pinned,\r\n lockPosition: colDef && colDef.lockPosition,\r\n lockVisible: colDef && colDef.lockVisible,\r\n lockPinned: colDef && colDef.lockPinned,\r\n sortable: getSortable(colDef),\r\n sort: colDef && colDef.sort,\r\n sortIndex: null,\r\n resizable: colDef && colDef.resizable,\r\n cellRendererFramework:\r\n colDef && colDef.dataType !== 'boolean'\r\n ? colDef.linkTo\r\n ? 'LinkRender'\r\n : colDef.cellRenderer\r\n : 'CheckboxRender',\r\n\r\n cellRenderer:\r\n colDef && colDef.dataType !== 'boolean'\r\n ? colDef.linkTo\r\n ? 'LinkRender'\r\n : colDef.cellRenderer\r\n : 'CheckboxRender',\r\n\r\n valueFormatter: colDef && colDef.valueFormatter,\r\n suppressMenu: colDef && colDef.suppressMenu,\r\n key: index,\r\n rowDrag: colDef && colDef.rowDrag,\r\n orgFieldName: colDef && colDef.orgFieldName,\r\n separateFieldName: colDef && colDef.separateFieldName,\r\n displayName: colDef && colDef.displayName,\r\n linkTo: colDef && colDef.linkTo,\r\n linkTarget: colDef && colDef.linkTarget,\r\n valueGetter: colDef && colDef.valueGetter,\r\n cellStyle: colDef && colDef.cellStyle,\r\n headerComponent: colDef?.headerComponent,\r\n });\r\n });\r\n\r\n nextColDefs = nextColDefs.map((colItem) => {\r\n if (URL_LIST_TO_DISABLE_SORT_IS_OWNER.includes(urlGrid)) {\r\n if (colItem?.field === 'isOwner') {\r\n return { ...colItem, sortable: false };\r\n }\r\n }\r\n\r\n return { ...colItem };\r\n });\r\n\r\n return nextColDefs;\r\n }, [columnDefs, hideAgSetColumnFilter, notShowHeaderCheckbox, urlGrid]);\r\n\r\n return procColDef;\r\n};\r\n\r\nconst getFilter = (colDef) => {\r\n const disabledFilterType = ['boolean', 'subscriptionshieldtype'];\r\n\r\n if (!colDef) return false;\r\n\r\n if (!colDef?.allowFilter) return false;\r\n\r\n if (colDef?.filter) return colDef.filter;\r\n\r\n if (colDef.isShowFilter === 'none') return false;\r\n\r\n if (disabledFilterType.indexOf(colDef.dataType) > -1) return false;\r\n\r\n return 'agMultiColumnFilter';\r\n};\r\n\r\nconst getSortable = (colDef) => {\r\n const disabledSortableType = ['boolean', 'subscriptionshieldtype'];\r\n\r\n if (!colDef) return false;\r\n\r\n if (disabledSortableType.indexOf(colDef?.dataType) > -1) return false;\r\n\r\n return colDef?.allowSort;\r\n};\r\n\r\nconst filterParamsButton = {\r\n buttons: ['apply', 'reset'],\r\n closeOnApply: true,\r\n};\r\n\r\nconst getFilterParams = (data, hideAgSetColumnFilter) => {\r\n let textFilter =\r\n data.dataType === 'string'\r\n ? 'agTextColumnFilter'\r\n : data.dataType === 'int' ||\r\n data.dataType === 'decimal' ||\r\n data.dataType === 'int32' ||\r\n data.dataType === 'int64'\r\n ? 'agNumberColumnFilter'\r\n : data.dataType === 'datetime'\r\n ? 'agDateColumnFilter'\r\n : true;\r\n let filter = !data.allowFilter ? false : textFilter;\r\n filter = data?.filter === 'agSetColumnFilter' ? data?.filter : filter;\r\n let filterParams = {};\r\n\r\n if (filter === 'agTextColumnFilter') {\r\n let isHideAgSetColumnFilter =\r\n typeof hideAgSetColumnFilter === 'string'\r\n ? data.fieldName === hideAgSetColumnFilter\r\n : _.isArray(hideAgSetColumnFilter)\r\n ? hideAgSetColumnFilter.includes(data.fieldName)\r\n : false;\r\n\r\n if (isHideAgSetColumnFilter) {\r\n filterParams = {\r\n filters: [\r\n {\r\n filter: 'agTextColumnFilter',\r\n filterParams: {\r\n filterOptions: [\r\n 'contains',\r\n 'equals',\r\n 'notEqual',\r\n 'blank',\r\n 'notBlank',\r\n ],\r\n suppressAndOrCondition: true,\r\n ...filterParamsButton,\r\n },\r\n },\r\n {\r\n filter: ApplyFilter,\r\n },\r\n ],\r\n };\r\n } else {\r\n filterParams = {\r\n filters: [\r\n {\r\n filter: 'agTextColumnFilter',\r\n filterParams: {\r\n filterOptions: [\r\n 'contains',\r\n 'equals',\r\n 'notEqual',\r\n 'blank',\r\n 'notBlank',\r\n ],\r\n suppressAndOrCondition: true,\r\n ...filterParamsButton,\r\n },\r\n },\r\n {\r\n filter: 'agSetColumnFilter',\r\n filterParams: {\r\n ...filterParamsButton,\r\n },\r\n },\r\n {\r\n filter: ApplyFilter,\r\n },\r\n ],\r\n };\r\n }\r\n }\r\n if (filter === 'agNumberColumnFilter') {\r\n filterParams = {\r\n filters: [\r\n {\r\n filter: 'agNumberColumnFilter',\r\n filterParams: {\r\n filterOptions: [\r\n 'equals',\r\n 'notEqual',\r\n 'lessThan',\r\n 'lessThanOrEqual',\r\n 'greaterThan',\r\n 'greaterThanOrEqual',\r\n ],\r\n ...filterParamsButton,\r\n suppressAndOrCondition: true,\r\n },\r\n },\r\n {\r\n filter: 'agSetColumnFilter',\r\n filterParams: {\r\n ...filterParamsButton,\r\n },\r\n },\r\n {\r\n filter: ApplyFilter,\r\n },\r\n ],\r\n };\r\n }\r\n if (filter === 'agDateColumnFilter') {\r\n filterParams = {\r\n filters: [\r\n {\r\n filter: 'agDateColumnFilter',\r\n filterParams: {\r\n filterOptions: [\r\n 'equals',\r\n 'lessThan',\r\n 'lessThanOrEqual',\r\n 'greaterThan',\r\n 'greaterThanOrEqual',\r\n ],\r\n ...filterParamsButton,\r\n suppressAndOrCondition: true,\r\n minValidYear: 0,\r\n maxValidYear: 9999,\r\n },\r\n },\r\n {\r\n filter: ApplyFilter,\r\n },\r\n // {\r\n // filter: 'agSetColumnFilter',\r\n // },\r\n ],\r\n };\r\n }\r\n\r\n if (filter === 'agSetColumnFilter') {\r\n filterParams = _.cloneDeep(data.filterParams) || {};\r\n filterParams = {\r\n filters: [\r\n {\r\n ...filterParams,\r\n ...filterParamsButton,\r\n },\r\n {\r\n filter: ApplyFilter,\r\n },\r\n // {\r\n // filter: 'agSetColumnFilter',\r\n // },\r\n ],\r\n };\r\n }\r\n\r\n if (data.dataType === 'boolean') {\r\n filterParams = {\r\n filters: [\r\n {\r\n filter: 'agSetColumnFilter',\r\n filterParams: {\r\n valueFormatter: (params) => {\r\n return params.value === true ||\r\n params.value?.toLowerCase() === 'true'\r\n ? 'True'\r\n : 'False';\r\n },\r\n ...filterParamsButton,\r\n },\r\n },\r\n {\r\n filter: ApplyFilter,\r\n },\r\n // {\r\n // filter: 'agSetColumnFilter',\r\n // },\r\n ],\r\n // filters:\r\n // filter: 'agSetColumnFilter',\r\n // filterParams: {\r\n // valueFormatter: (params) => {\r\n // return params.value === true || params.value?.toLowerCase() === 'true'\r\n // ? 'True'\r\n // : 'False';\r\n // },\r\n // ...filterParamsButton,\r\n // },\r\n\r\n // suppressAndOrCondition: true,\r\n };\r\n }\r\n\r\n Object.assign(filterParams, {\r\n values: (params) => {\r\n setTimeout(() => {\r\n params.success([]);\r\n }, 500);\r\n },\r\n });\r\n\r\n return filterParams;\r\n};\r\n\r\nexport { useGetColumnDefs };\r\n","import { useState, useEffect, useRef } from 'react';\r\n\r\nimport { useDispatch } from 'react-redux';\r\n\r\nimport * as actionsGridView from 'common/components/grid-view/controllers/actions';\r\n\r\nimport * as _ from 'lodash';\r\n\r\nexport const useAggridSelection = ({\r\n gridId,\r\n gridView,\r\n onCallbackSelectedRowFromOutside,\r\n}) => {\r\n const [itemsSelectionLog, setItemsSelectionLog] = useState([]);\r\n const [pageItemsSelectionLog, setPageItemsSelectionLog] = useState([]);\r\n const [itemsSelectionDetailLog, setItemsSelectionDetailLog] = useState([]);\r\n const [pageItemsSelectionDetailLog, setPageItemsSelectionDetailLog] =\r\n useState([]);\r\n\r\n const refLastSelectedRowData = useRef();\r\n\r\n const setRefLastSelectedRowData = (value) => {\r\n refLastSelectedRowData.current = value;\r\n };\r\n\r\n const dispatch = useDispatch();\r\n\r\n useEffect(() => {\r\n if (gridView) {\r\n dispatch(\r\n actionsGridView.updateDetailCurrentItemsSelection(\r\n _.cloneDeep(itemsSelectionDetailLog)\r\n )\r\n );\r\n dispatch(actionsGridView.updateActiveGrid(gridId));\r\n }\r\n\r\n onCallbackSelectedRowFromOutside(refLastSelectedRowData.current);\r\n }, [\r\n dispatch,\r\n itemsSelectionDetailLog,\r\n itemsSelectionDetailLog.length,\r\n gridId,\r\n ]);\r\n\r\n useEffect(() => {\r\n if (gridView) {\r\n dispatch(\r\n actionsGridView.updateItemsSelection(_.cloneDeep(itemsSelectionLog))\r\n );\r\n\r\n dispatch(\r\n actionsGridView.updateItemsSelection(_.clone(itemsSelectionLog))\r\n );\r\n }\r\n }, [dispatch, itemsSelectionLog, itemsSelectionLog.length, gridView]);\r\n\r\n return {\r\n itemsSelectionLog,\r\n pageItemsSelectionLog,\r\n itemsSelectionDetailLog,\r\n pageItemsSelectionDetailLog,\r\n setItemsSelectionLog,\r\n setPageItemsSelectionLog,\r\n setItemsSelectionDetailLog,\r\n setPageItemsSelectionDetailLog,\r\n setRefLastSelectedRowData,\r\n };\r\n};\r\n","import React, { forwardRef, useImperativeHandle } from 'react';\r\n\r\nimport { Typography, Col } from 'antd';\r\n\r\nimport { FormattedMessage } from 'react-intl';\r\nimport { useAggridSelection } from 'common/components/ag-grid/hooks/SelectionHook';\r\n\r\nimport { cloneDeep } from 'lodash';\r\n\r\nimport messages from 'i18n/messages/gridView';\r\n\r\nconst SelectionLog = (props, ref) => {\r\n const {\r\n gridView,\r\n isShowItemSelectionLog,\r\n gridId,\r\n onCallbackSelectedRowFromOutside,\r\n } = props;\r\n\r\n const {\r\n itemsSelectionLog,\r\n pageItemsSelectionLog,\r\n itemsSelectionDetailLog,\r\n pageItemsSelectionDetailLog,\r\n setItemsSelectionLog,\r\n setPageItemsSelectionLog,\r\n setItemsSelectionDetailLog,\r\n setPageItemsSelectionDetailLog,\r\n setRefLastSelectedRowData,\r\n } = useAggridSelection({\r\n gridView,\r\n gridId,\r\n onCallbackSelectedRowFromOutside,\r\n });\r\n\r\n useImperativeHandle(ref, () => ({\r\n setItemsSelectionLog: (value) => setItemsSelectionLog(cloneDeep(value)),\r\n setPageItemsSelectionLog: (value) =>\r\n setPageItemsSelectionLog(cloneDeep(value)),\r\n setItemsSelectionDetailLog: (value) =>\r\n setItemsSelectionDetailLog(cloneDeep(value)),\r\n setPageItemsSelectionDetailLog: (value) =>\r\n setPageItemsSelectionDetailLog(cloneDeep(value)),\r\n setRefLastSelectedRowData,\r\n getItemsSelectionLog: () => itemsSelectionLog,\r\n getPageItemsSelectionLog: () => pageItemsSelectionLog,\r\n getItemsSelectionDetailLog: () => itemsSelectionDetailLog,\r\n getPageItemsSelectionDetailLog: () => pageItemsSelectionDetailLog,\r\n }));\r\n\r\n return (\r\n <>\r\n {gridView && (\r\n \r\n {itemsSelectionLog &&\r\n isShowItemSelectionLog &&\r\n itemsSelectionLog.length > 0 &&\r\n pageItemsSelectionLog &&\r\n pageItemsSelectionLog.length === 1 && (\r\n \r\n {itemsSelectionLog.length}{' '}\r\n \r\n \r\n )}\r\n {isShowItemSelectionLog &&\r\n pageItemsSelectionLog &&\r\n pageItemsSelectionLog.length > 1 && (\r\n \r\n {itemsSelectionLog.length}{' '}\r\n \r\n \r\n )}\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default forwardRef(SelectionLog);\r\n","import React, { useState, useEffect, useCallback, useRef } from 'react';\r\nimport { useSelector, useDispatch } from 'react-redux';\r\n\r\nimport { useQueryClient } from '@tanstack/react-query';\r\n\r\nimport cloneDeep from 'lodash/cloneDeep';\r\nimport get from 'lodash/get';\r\n\r\nimport PropTypes from 'prop-types';\r\nimport classnames from 'classnames';\r\n\r\nimport { Pagination, Row, Typography, Col, Empty } from 'antd';\r\nimport 'ag-grid-enterprise/dist/styles/ag-grid.css';\r\nimport 'ag-grid-enterprise/dist/styles/ag-theme-alpine.css';\r\n\r\nimport 'ag-grid-enterprise';\r\nimport { LicenseManager } from 'ag-grid-enterprise';\r\n\r\nimport { AgGridReact } from 'ag-grid-react';\r\n\r\nimport * as api from 'config/axios';\r\nimport * as formatDate from 'utils/formatDate';\r\nimport { updateSizeCurrent } from 'common/components/grid-view/utils';\r\n\r\nimport { AbandonDialog } from 'common/components/grid-view/components/';\r\n\r\nimport * as actionsGridView from 'common/components/grid-view/controllers/actions';\r\nimport * as globalSelectors from '@redux/global/selectors';\r\n\r\nimport { DEFAULT_SORT } from 'static/Constants';\r\n\r\nimport LinkRender from './components/renderers/LinkRender';\r\nimport DragRender from './components/renderers/DragRender';\r\nimport CheckboxSelectionRender from './components/renderers/CheckboxSelectionRender';\r\nimport HeaderCheckboxRender from './components/renderers/HeaderCheckboxRender';\r\nimport HeaderNullRender from './components/renderers/HeaderNullRender';\r\nimport CheckboxRender from './components/renderers/CheckboxRender';\r\n\r\nimport usePrevious from 'hooks/usePrevious';\r\nimport * as _ from 'lodash';\r\nimport { useStatePrevious } from 'hooks/usePrevious';\r\n\r\nimport { useGetColumnDefs } from './hooks/getColumnDefsHook';\r\n\r\nimport DisplayTotalItem from '../grid-view/DisplayTotalItem';\r\n\r\nimport SelectionLog from './components/selection/SelectionLog';\r\nimport { GridContext } from './context/gridContext';\r\n\r\nimport './AgGrid.less';\r\n\r\nLicenseManager.setLicenseKey(\r\n 'Using_this_AG_Grid_Enterprise_key_( AG-040843 )_in_excess_of_the_licence_granted_is_not_permitted___Please_report_misuse_to_( legal@ag-grid.com )___For_help_with_changing_this_key_please_contact_( info@ag-grid.com )___( Global Vertical Innovations, LLC )_is_granted_a_( Multiple Applications )_Developer_License_for_( 1 ))_Front-End_JavaScript_developer___All_Front-End_JavaScript_developers_need_to_be_licensed_in_addition_to_the_ones_working_with_AG_Grid_Enterprise___This_key_has_not_been_granted_a_Deployment_License_Add-on___This_key_works_with_AG_Grid_Enterprise_versions_released_before_( 11 May 2024 )____[v2]_MTcxNTM4MjAwMDAwMA==d035e6c32ae72202e23beccd712ab105'\r\n);\r\n\r\nconst AgGrid = React.memo((props) => {\r\n const {\r\n styleGrid,\r\n columnDefs,\r\n urlGrid,\r\n urlGridDistinct,\r\n paramsGrid,\r\n gridView = false,\r\n distinctResponseParams,\r\n responseParams,\r\n requestParams,\r\n callbackDataListSelection,\r\n hidePagination,\r\n filterFromMainPage,\r\n hideAgSetColumnFilter,\r\n getGridApi,\r\n isPreview,\r\n isShowItemSelectionLog = true,\r\n isCacheEditMode = false,\r\n getDataFromGrid,\r\n pageNumberPagination,\r\n pageSizePagination,\r\n rowClassRules,\r\n frameworkComponents = {},\r\n gridId,\r\n isHiddenAbbandonDialog = false,\r\n onHandleSelectedRowCustom,\r\n urlDownload,\r\n triggerDownload,\r\n onDownloadGridHandler,\r\n downloadFileType,\r\n gridConfigProps = {},\r\n shouldReloadDetailGrid,\r\n onReloadGridCallback,\r\n isColumnsChanged = true,\r\n onGetLengthSize,\r\n isDownloadAllColumns,\r\n reloadGrid,\r\n notShowHeaderCheckbox,\r\n minimizePagination,\r\n initialPageSize,\r\n resizePagination,\r\n showCheckboxSelectionRender = true,\r\n handleChangePagination,\r\n mapId,\r\n nodeIdName,\r\n forceLoading,\r\n isSmallSizePagination = false,\r\n applyDefaultSort = true,\r\n showLessItem,\r\n sortAndFilterServerside = false,\r\n rowHeight,\r\n sortDataHandler, //? function\r\n onRowDoubleClicked,\r\n } = props;\r\n\r\n const refGrid = useRef();\r\n const refSelection = useRef();\r\n\r\n const queryClient = useQueryClient();\r\n\r\n const refItemSelection = useRef([]);\r\n const refItemsSelectionDetail = useRef([]);\r\n const refPageItemsSelection = useRef([]);\r\n const refPageItemsSelectionDetail = useRef([]);\r\n\r\n const refVirtualColumns = useRef([]);\r\n\r\n const dispatch = useDispatch();\r\n const currentRequestDataParams = useRef({});\r\n const filterFromMainPageRef = useRef([]);\r\n\r\n const [isGridReady, setIsGridReady] = useState(false);\r\n const [agGridPageSize, setAgGridPageSize, refAgGridPageSize] =\r\n useStatePrevious(initialPageSize || 20);\r\n const [\r\n agGridCurrentPagination,\r\n setAgGridCurrentPagination,\r\n refAgGridCurrentPagination,\r\n ] = useStatePrevious(1);\r\n\r\n const prevAgGridPageSize = usePrevious(agGridPageSize);\r\n const prevAgGridCurrentPagination = usePrevious(agGridCurrentPagination);\r\n\r\n const [\r\n agGridTotalPagination,\r\n setAgGridTotalPagination,\r\n refAgGridTotalPagination,\r\n ] = useStatePrevious(0);\r\n const [agGridNameColumnFilter, setAgGridNameColumnFilter] = useState(false);\r\n\r\n const [visibleSelection, setVisibleSelection] = useState(false);\r\n\r\n const [currentDefColumns, setCurrentDefColumns] = useState(null);\r\n\r\n const [isSwitchingPage, setIsSwitchingPage] = useState(false);\r\n const [gridFetched, setGridFetched, refGridFetched] = useStatePrevious(false);\r\n const [isFetching, setIsFetching] = useState(false);\r\n\r\n const isShowDetailOn = useSelector(globalSelectors.selectShowDetail());\r\n const showAddToFolder = useSelector(globalSelectors.selectShowAddToFolder());\r\n\r\n const resetSelection = useCallback(() => {\r\n refItemSelection.current = [];\r\n refPageItemsSelection.current = [];\r\n refItemsSelectionDetail.current = [];\r\n refPageItemsSelectionDetail.current = [];\r\n\r\n setItemsSelectionLog(refItemSelection.current);\r\n setPageItemsSelectionLog(refPageItemsSelection.current);\r\n setItemsSelectionDetailLog(refItemsSelectionDetail.current);\r\n setPageItemsSelectionDetailLog(refPageItemsSelectionDetail.current);\r\n }, []);\r\n\r\n const deselectAll = useCallback(() => {\r\n refGrid.current.api && refGrid.current.api.deselectAll();\r\n }, []);\r\n\r\n const refreshAggrid = useCallback(() => {\r\n resetSelection();\r\n deselectAll();\r\n setClassNameHeaderCheckbox(\r\n refAgGridCurrentPagination.current,\r\n refAgGridTotalPagination.current,\r\n refAgGridPageSize.current\r\n );\r\n }, []);\r\n\r\n const isItemIdEqualToNodeId = (item, nodeId) => {\r\n return _.toString(item.id) === nodeId;\r\n };\r\n\r\n const setItemsSelectionLog = (value) =>\r\n refSelection.current.setItemsSelectionLog(value);\r\n\r\n const setPageItemsSelectionLog = (value) =>\r\n refSelection.current.setPageItemsSelectionLog(value);\r\n\r\n const setItemsSelectionDetailLog = (value) =>\r\n refSelection.current.setItemsSelectionDetailLog(value);\r\n\r\n const setPageItemsSelectionDetailLog = (value) =>\r\n refSelection.current.setPageItemsSelectionDetailLog(value);\r\n\r\n const setClickedRow = (rowData) =>\r\n refSelection.current.setRefLastSelectedRowData(rowData);\r\n\r\n const cols = useGetColumnDefs({\r\n urlGrid,\r\n columnDefs,\r\n notShowHeaderCheckbox,\r\n hideAgSetColumnFilter,\r\n });\r\n\r\n useEffect(() => {\r\n //* set page size and page current from page info props\r\n const setPageInfoFromProps = () => {\r\n if (\r\n pageNumberPagination &&\r\n pageNumberPagination !== refAgGridCurrentPagination.current\r\n ) {\r\n setAgGridCurrentPagination(pageNumberPagination);\r\n }\r\n\r\n if (\r\n pageSizePagination &&\r\n pageSizePagination !== refAgGridPageSize.current\r\n ) {\r\n setAgGridPageSize(pageSizePagination);\r\n }\r\n };\r\n\r\n setPageInfoFromProps();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [pageNumberPagination, pageSizePagination]);\r\n\r\n useEffect(() => {\r\n const isPageSizeChange = () =>\r\n agGridPageSize && prevAgGridPageSize !== agGridPageSize;\r\n\r\n const isPageNumberChange = () =>\r\n agGridCurrentPagination &&\r\n prevAgGridCurrentPagination !== agGridCurrentPagination;\r\n\r\n const gridApi = refGrid.current.api;\r\n\r\n //* handle load page\r\n const goToNewPage = async (options) => {\r\n if (agGridPageSize && agGridCurrentPagination && gridApi) {\r\n gridApi.gridOptionsWrapper.setProperty(\r\n 'cacheBlockSize',\r\n agGridPageSize\r\n );\r\n\r\n let datasource = serverSideDataSource({\r\n page: agGridCurrentPagination,\r\n pageSize: agGridPageSize,\r\n });\r\n gridApi.setServerSideDatasource(datasource);\r\n }\r\n };\r\n\r\n //* handle refetch page when page info update\r\n const handleRefetchWhenPageInfoChange = async () => {\r\n const isPageSizeChanged = isPageSizeChange();\r\n const isPageNumberChanged = isPageNumberChange();\r\n\r\n if (!gridFetched) {\r\n goToNewPage();\r\n } else {\r\n //* if page info state change\r\n if (isPageNumberChanged || isPageSizeChanged) {\r\n goToNewPage();\r\n }\r\n }\r\n\r\n setIsSwitchingPage(false);\r\n };\r\n\r\n handleRefetchWhenPageInfoChange();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [\r\n agGridPageSize,\r\n agGridCurrentPagination,\r\n prevAgGridPageSize,\r\n prevAgGridCurrentPagination,\r\n gridFetched,\r\n isGridReady,\r\n ]);\r\n\r\n useEffect(() => {\r\n //* update page size and page current\r\n\r\n if (\r\n agGridPageSize !== prevAgGridPageSize ||\r\n agGridCurrentPagination !== prevAgGridCurrentPagination\r\n ) {\r\n if (isCacheEditMode) {\r\n //* this part is for page number and page size passed down by props\r\n dispatch(\r\n actionsGridView.updateGridViewPagination({\r\n gridId: gridId,\r\n pageNumber: agGridCurrentPagination,\r\n pageSize: agGridPageSize,\r\n })\r\n );\r\n } else {\r\n updateSizeCurrent(\r\n dispatch,\r\n agGridCurrentPagination,\r\n agGridPageSize,\r\n gridId || window.location.pathname\r\n );\r\n }\r\n }\r\n }, [\r\n agGridPageSize,\r\n agGridCurrentPagination,\r\n prevAgGridPageSize,\r\n prevAgGridCurrentPagination,\r\n gridId,\r\n dispatch,\r\n isCacheEditMode,\r\n ]);\r\n\r\n useEffect(() => {\r\n if (hidePagination) {\r\n setAgGridPageSize(10000);\r\n }\r\n }, []);\r\n\r\n // download grid data\r\n const callApiDownloadGrid = () => {\r\n const params = _.cloneDeep(currentRequestDataParams.current);\r\n\r\n // download all data of grid, not just 1 page\r\n params.pageIndex = 1;\r\n params.pageSize = 999999999;\r\n\r\n // add columns to download display columns only\r\n params.columns = isDownloadAllColumns ? null : getDownloadColumns();\r\n\r\n // add file type\r\n params.fileType = downloadFileType;\r\n\r\n // call api download\r\n onDownloadGridHandler &&\r\n onDownloadGridHandler(\r\n api\r\n .sendPost(urlDownload, params)\r\n .then((response) => {\r\n if (response?.isSuccess) {\r\n return api.sendDownload({ url: response?.data?.url });\r\n } else {\r\n return new Promise.reject({ message: response.message });\r\n }\r\n })\r\n .catch((err) => {\r\n return new Promise.reject(err);\r\n })\r\n );\r\n };\r\n\r\n const getDownloadColumns = () => {\r\n const agGridColumnApi = refGrid.current.columnApi;\r\n\r\n const displayColumns = agGridColumnApi.getAllDisplayedColumns();\r\n const columnsParams = displayColumns.reduce((accumulator, currentCol) => {\r\n const displayName = currentCol?.colDef?.displayName;\r\n\r\n //* check for orgFieldName first to get field name of hidden header title columns\r\n const orgFieldName = currentCol?.colDef?.orgFieldName;\r\n\r\n if (orgFieldName) {\r\n accumulator.push({\r\n fieldName: orgFieldName,\r\n displayName: orgFieldName,\r\n });\r\n return accumulator;\r\n }\r\n\r\n //* check for separateFieldName next to get field name of merge values columns\r\n const separateFieldName = currentCol?.colDef?.separateFieldName;\r\n if (separateFieldName && separateFieldName.length) {\r\n separateFieldName.length &&\r\n separateFieldName.forEach((field) => {\r\n accumulator.push({\r\n fieldName: field,\r\n displayName: field,\r\n });\r\n });\r\n\r\n return accumulator;\r\n }\r\n\r\n //* finally, when col def not contain orgFieldName and separateFieldName, check colDef field for normal columns\r\n const colField = currentCol?.colDef?.field;\r\n if (!colField) return accumulator;\r\n if (colField === 'checkboxSelection') return accumulator;\r\n\r\n accumulator.push({\r\n fieldName: colField,\r\n displayName: displayName || colField,\r\n });\r\n return accumulator;\r\n }, []);\r\n\r\n return columnsParams;\r\n };\r\n\r\n useEffect(() => {\r\n if (triggerDownload && urlDownload) callApiDownloadGrid();\r\n // eslint-disable-next-line\r\n }, [triggerDownload]);\r\n\r\n const searchTextRequest = requestParams?.search?.searchText;\r\n const advCriteria = requestParams?.advCriteria;\r\n const searchTextParams = paramsGrid?.search?.searchText;\r\n const paramsGridStringify = JSON.stringify(paramsGrid);\r\n const requestParamStringify = JSON.stringify(requestParams);\r\n\r\n const reloadData = ({ keepPageIndex } = {}) => {\r\n const agGridApi = refGrid.current.api;\r\n\r\n if (agGridApi) {\r\n //* set current pagination UI to page 1\r\n setAgGridCurrentPagination(1);\r\n\r\n let datasource = serverSideDataSource({\r\n page: 1,\r\n pageSize: refAgGridPageSize.current,\r\n });\r\n agGridApi && agGridApi.setServerSideDatasource(datasource);\r\n refreshAggrid();\r\n onReloadGridCallback && onReloadGridCallback();\r\n }\r\n };\r\n\r\n const onRequestServerSideDataSource = useCallback(() => {\r\n reloadData();\r\n //eslint-disable-next-line\r\n }, [\r\n searchTextRequest,\r\n searchTextParams,\r\n urlGrid,\r\n urlGridDistinct,\r\n paramsGridStringify,\r\n requestParamStringify,\r\n //* NOTE: filterFromAsset - empty array make it reloadData when no cahnge\r\n JSON.stringify(filterFromMainPage),\r\n // advCriteria,\r\n // columnDefs,\r\n ]);\r\n\r\n const onRequestServerSideDataSourceKeepPageIndex = useCallback(() => {\r\n if (shouldReloadDetailGrid) reloadData({ keepPageIndex: true });\r\n //eslint-disable-next-line\r\n }, [shouldReloadDetailGrid]);\r\n\r\n const onRequestServerSideDataSourceWithFlag = useCallback(() => {\r\n if (reloadGrid) {\r\n onPurgeServerSideCache();\r\n }\r\n //eslint-disable-next-line\r\n }, [reloadGrid]);\r\n\r\n // reload data and refresh grid when search\r\n useEffect(() => {\r\n onRequestServerSideDataSource();\r\n //eslint-disable-next-line\r\n }, [onRequestServerSideDataSource]);\r\n\r\n // reload data\r\n useEffect(() => {\r\n onRequestServerSideDataSourceWithFlag();\r\n //eslint-disable-next-line\r\n }, [onRequestServerSideDataSourceWithFlag]);\r\n\r\n useEffect(() => {\r\n setCurrentDefColumns([]);\r\n //eslint-disable-next-line\r\n }, [shouldReloadDetailGrid]);\r\n\r\n // reload data when shouldReloadDetailGrid and keep page index\r\n useEffect(() => {\r\n onRequestServerSideDataSourceKeepPageIndex();\r\n\r\n //eslint-disable-next-line\r\n }, [onRequestServerSideDataSourceKeepPageIndex]);\r\n\r\n // unmount\r\n useEffect(() => {\r\n return () => {\r\n refItemSelection.current = [];\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n filterFromMainPageRef.current = filterFromMainPage;\r\n }, [filterFromMainPage]);\r\n\r\n const serverSideDataSource = ({ page, pageSize } = {}) => {\r\n return {\r\n // called by the grid when more rows are required\r\n getRows: function (params) {\r\n setIsFetching(true);\r\n\r\n //* if page or pageSize undefined get default grid param from aggrid\r\n\r\n if (!page || !pageSize) {\r\n pageSize = params.api.paginationGetPageSize();\r\n page = params.api.paginationGetCurrentPage() + 1;\r\n }\r\n\r\n let paramsApi = {\r\n pageSize: pageSize,\r\n pageIndex: page,\r\n sort: [],\r\n filters: [],\r\n };\r\n\r\n // if there are more standard request params\r\n if (requestParams) {\r\n paramsApi = { ...paramsApi, ...requestParams };\r\n }\r\n if (params.request.sortModel.length > 0) {\r\n // Clone a new array, don't mutate the original, prevent stupid AgGrid's bugs\r\n let newSort = [];\r\n\r\n params.request.sortModel.forEach((val) => {\r\n newSort.push({\r\n fieldName: val.colId,\r\n isAscending: val.sort === 'asc' ? true : false,\r\n });\r\n });\r\n\r\n paramsApi.sort = newSort;\r\n } else {\r\n if (applyDefaultSort) {\r\n paramsApi.sort = DEFAULT_SORT;\r\n }\r\n }\r\n let keyFilter = Object.keys(params.request.filterModel);\r\n let filters = filterParams(keyFilter, params.request.filterModel);\r\n if (filterFromMainPage && filterFromMainPage.length > 0) {\r\n filters = filters.concat(filterFromMainPage);\r\n }\r\n if (requestParams?.filters?.length > 0) {\r\n filters = filters.concat(requestParams.filters);\r\n }\r\n\r\n if (requestParams?.sort?.length > 0) {\r\n paramsApi.sort = paramsApi.sort.concat(requestParams.sort);\r\n }\r\n\r\n paramsApi.filters = filters;\r\n\r\n Object.assign(paramsApi, paramsGrid);\r\n\r\n currentRequestDataParams.current = paramsApi;\r\n\r\n api\r\n .sendPost(urlGrid, paramsApi)\r\n .then((response) => {\r\n //* fetch data first time success => allow to fetch saved pagination config\r\n if (response) {\r\n !refGridFetched.current && setGridFetched(true);\r\n setIsFetching(false);\r\n }\r\n\r\n let data;\r\n if (responseParams) {\r\n data = get(response, responseParams, []);\r\n\r\n // !New\r\n // ?Hide loading progress when data = null\r\n if (data) {\r\n // callback response data\r\n getDataFromGrid &&\r\n getDataFromGrid(response.data.gridData || data);\r\n } else {\r\n const loadingElement =\r\n document?.getElementsByClassName('ag-row-loading');\r\n if (loadingElement?.length > 0) {\r\n loadingElement[0].style.display = 'none';\r\n }\r\n }\r\n } else {\r\n data = response;\r\n }\r\n\r\n if (\r\n data &&\r\n data.gridData &&\r\n data.gridData.length >= 0 &&\r\n data.paging &&\r\n data.paging.totalRecord >= 0\r\n ) {\r\n // supply rows for requested block to grid\r\n const gridData = data.gridData ? data.gridData : [];\r\n\r\n const gridDataMappedId = mapId ? gridData.map(mapId) : gridData;\r\n const sortedGridData = sortDataHandler\r\n ? cloneDeep(gridDataMappedId)?.sort(sortDataHandler)\r\n : gridDataMappedId;\r\n\r\n let nextTotalRecord;\r\n\r\n //todo\r\n const numberOfItemNotInLastPage =\r\n refAgGridCurrentPagination.current * refAgGridPageSize.current -\r\n data.paging.totalRecord;\r\n\r\n if (\r\n numberOfItemNotInLastPage > 0 &&\r\n data.paging.totalRecord !== 0\r\n ) {\r\n nextTotalRecord =\r\n refAgGridPageSize.current - numberOfItemNotInLastPage;\r\n } else {\r\n nextTotalRecord = data.paging.totalRecord;\r\n }\r\n\r\n params.successCallback(sortedGridData, nextTotalRecord);\r\n setAgGridTotalPagination(data.paging.totalRecord);\r\n onGetLengthSize && onGetLengthSize(data.paging.totalRecord);\r\n\r\n params.api.forEachNode((node) => {\r\n // return;\r\n if (refItemSelection.current.indexOf(node.id) > -1) {\r\n node.setSelected(true);\r\n\r\n if (showCheckboxSelectionRender) {\r\n node.setDataValue('checkboxSelection', true);\r\n }\r\n } else {\r\n node.setSelected(false);\r\n\r\n if (showCheckboxSelectionRender) {\r\n node.setDataValue('checkboxSelection', false);\r\n }\r\n }\r\n\r\n //Should update after demo\r\n if (isPreview) {\r\n if (node?.data?.showInMemberPreview) {\r\n node.setSelected(true);\r\n\r\n if (showCheckboxSelectionRender) {\r\n node.setDataValue('checkboxSelection', true);\r\n }\r\n refItemSelection.current.push(node.id);\r\n refItemsSelectionDetail.current.push(node?.data);\r\n\r\n refPageItemsSelection.current.push({\r\n page: agGridCurrentPagination,\r\n items: [node.id],\r\n });\r\n refPageItemsSelectionDetail.current.push({\r\n page: agGridCurrentPagination,\r\n items: [node?.data],\r\n });\r\n }\r\n }\r\n });\r\n //Should update after demo\r\n setClassNameHeaderCheckbox(\r\n page,\r\n data.paging.totalRecord,\r\n pageSize\r\n );\r\n\r\n window.rowDataServerSide = data.gridData;\r\n } else {\r\n //* show no data\r\n params.successCallback([], 0);\r\n }\r\n })\r\n .catch((error) => {\r\n // inform grid request failed\r\n params.failCallback();\r\n });\r\n },\r\n };\r\n };\r\n\r\n const onPurgeServerSideCache = () => {\r\n const agGridApi = refGrid.current?.api;\r\n\r\n if (!agGridApi) return;\r\n\r\n agGridApi && agGridApi.refreshServerSide({ purge: true });\r\n\r\n refreshAggrid();\r\n };\r\n\r\n const onGridReadyfunction = useCallback((params) => {\r\n setIsGridReady(true);\r\n\r\n params.api.rivirPurgeServerSideCache = onPurgeServerSideCache;\r\n\r\n getGridApi && getGridApi(params.api);\r\n }, []);\r\n\r\n const onChangePagination = (page, pageSize) => {\r\n const isPageSizeChanged = pageSize !== agGridPageSize;\r\n\r\n const nextPage = isPageSizeChanged ? 1 : page;\r\n\r\n setAgGridCurrentPagination(nextPage);\r\n setAgGridPageSize(pageSize);\r\n\r\n handleChangePagination && handleChangePagination(page);\r\n };\r\n\r\n const onShowSizeChange = (current, size) => {\r\n const agGridApi = refGrid.current.api;\r\n\r\n setAgGridPageSize(size);\r\n agGridApi.gridOptionsWrapper.setProperty('cacheBlockSize', size);\r\n\r\n resetSelection();\r\n };\r\n\r\n const onSelectionChanged = (params) => {\r\n // setClassNameHeaderCheckbox(params);\r\n props.onSelectionChanged && props.onSelectionChanged(params);\r\n };\r\n\r\n const onRowSelected = useCallback((params) => {\r\n if (showCheckboxSelectionRender) {\r\n params.node.setDataValue('checkboxSelection', params.node.selected);\r\n }\r\n }, []);\r\n\r\n const filterParams = (keyFilter, modelFilter, columnName) => {\r\n let filterParams = [];\r\n if (keyFilter.length > 0) {\r\n keyFilter &&\r\n keyFilter.length > 0 &&\r\n keyFilter.forEach((key) => {\r\n let filterModel = modelFilter[key];\r\n if (\r\n filterModel &&\r\n filterModel.filterType === 'multi' &&\r\n filterModel.filterModels &&\r\n filterModel.filterModels.length > 0\r\n ) {\r\n filterModel.filterModels.forEach((model) => {\r\n const item = getFilterParamsItem(model, key, columnName);\r\n item && filterParams.push(item);\r\n });\r\n } else {\r\n // when filter type is AgSetColumnFilter, filterModel is not an array, so we don't need to loop through\r\n const item = getFilterParamsItem(filterModel, key, columnName);\r\n item && filterParams.push(item);\r\n }\r\n });\r\n }\r\n return filterParams;\r\n };\r\n\r\n const getFilterParamsItem = (model, filterKey, columnName) => {\r\n if (!model) return;\r\n let filterType = 'Like';\r\n let value = model.filter;\r\n let otherValue = false;\r\n if (model.filterType === 'set') {\r\n if (filterKey === columnName) return;\r\n if (model.values && model.values.length === 0) return;\r\n filterType = 'In';\r\n if (\r\n (model.values &&\r\n model.values.length > 0 &&\r\n model.values[0] === 'True') ||\r\n model.values[0] === 'False'\r\n ) {\r\n filterType = 'Equal';\r\n value = model.values[0] === 'True' ? true : false;\r\n }\r\n }\r\n if (model.type === 'equals') {\r\n filterType = 'Equal';\r\n if (model.filterType === 'date') {\r\n filterType = 'Equal';\r\n value = formatDate.formatYMD(model.dateFrom, 'day');\r\n }\r\n }\r\n if (model.type === 'notEqual') {\r\n filterType = 'NotEqual';\r\n }\r\n if (model.type === 'contains') {\r\n filterType = 'Like';\r\n }\r\n if (model.type === 'lessThan') {\r\n filterType = 'LessThan';\r\n if (model.filterType === 'date') {\r\n value = formatDate.formatYMD(model.dateFrom, 'day');\r\n }\r\n }\r\n if (model.type === 'lessThanOrEqual') {\r\n filterType = 'LessThanOrEqual';\r\n if (model.filterType === 'date') {\r\n value = formatDate.formatYMD(model.dateFrom, 'day');\r\n }\r\n }\r\n if (model.type === 'greaterThan') {\r\n filterType = 'GreaterThan';\r\n if (model.filterType === 'date') {\r\n value = formatDate.formatYMD(model.dateFrom, 'day');\r\n }\r\n }\r\n if (model.type === 'greaterThanOrEqual') {\r\n filterType = 'GreaterThanOrEqual';\r\n if (model.filterType === 'date') {\r\n value = formatDate.formatYMD(model.dateFrom, 'day');\r\n }\r\n }\r\n if (model.type === 'blank') {\r\n filterType = 'IsNull';\r\n }\r\n if (model.type === 'notBlank') {\r\n filterType = 'IsNotNull';\r\n }\r\n let obj = {\r\n FieldName: filterKey,\r\n filterType: filterType,\r\n };\r\n if (filterType === 'In') {\r\n Object.assign(obj, { values: model.values });\r\n } else {\r\n Object.assign(obj, { value: value });\r\n }\r\n if (otherValue) {\r\n Object.assign(obj, { otherValue: otherValue });\r\n }\r\n\r\n return obj;\r\n };\r\n\r\n const handleGetDistinctQueries = async ({ distinctKeys, paramsApi }) => {\r\n let responseData = await queryClient.fetchQuery({\r\n queryKey: distinctKeys,\r\n queryFn: async () => {\r\n return await api.sendPost(urlGridDistinct, paramsApi);\r\n },\r\n staleTime: 0,\r\n });\r\n\r\n return { data: responseData };\r\n };\r\n\r\n const displaySetFilter = (instance, show) => {\r\n if (instance) {\r\n if (instance.getChildFilterInstance(0)?.filterNameKey === 'setFilter') {\r\n instance.getChildFilterInstance(0).setDisplayed(show);\r\n }\r\n if (instance.getChildFilterInstance(1)?.filterNameKey === 'setFilter') {\r\n instance.getChildFilterInstance(1).setDisplayed(show);\r\n }\r\n }\r\n };\r\n\r\n const onMenuClick = async (params) => {\r\n let columnId = params.column?.colId;\r\n const fieldName = columnId;\r\n\r\n if (columnId) {\r\n setAgGridNameColumnFilter(columnId);\r\n let modelFilterChanged = params.api.getFilterModel();\r\n\r\n let keyFilter = Object.keys(modelFilterChanged);\r\n let filters = filterParams(keyFilter, modelFilterChanged, columnId);\r\n if (filterFromMainPageRef.current?.length)\r\n filters = [...filters, ...filterFromMainPageRef.current];\r\n\r\n let paramsApi = { fieldName: columnId, filters: filters };\r\n\r\n paramsApi = {\r\n ...paramsApi,\r\n ...requestParams,\r\n ...paramsGrid,\r\n };\r\n const searchText = paramsGrid?.search?.searchText;\r\n const distinctKeys = ['ag-grid', fieldName, filters, searchText];\r\n\r\n try {\r\n const response = await handleGetDistinctQueries({\r\n distinctKeys,\r\n paramsApi,\r\n });\r\n\r\n let data;\r\n\r\n let _distinctResponseParams = distinctResponseParams || responseParams;\r\n if (_distinctResponseParams) {\r\n // data = response?.data?.[responseParams];\r\n data = get(response?.data, _distinctResponseParams);\r\n } else {\r\n data = response?.data;\r\n }\r\n\r\n let instance = params.api.getFilterInstance(columnId);\r\n\r\n if (data && data.length > 0 && data.length < 51) {\r\n if (instance.__proto__.hasOwnProperty('setFilterValues')) {\r\n // supply rows for requested block to grid\r\n instance.setFilterValues(data);\r\n displaySetFilter(instance, true);\r\n instance.applyModel();\r\n } else {\r\n displaySetFilter(instance, true);\r\n if (!instance.getChildFilterInstance(1)) return;\r\n instance.getChildFilterInstance(1).setFilterValues(data);\r\n instance.getChildFilterInstance(1).applyModel();\r\n }\r\n } else {\r\n if (instance.__proto__.hasOwnProperty('setFilterValues')) {\r\n // supply rows for requested block to grid\r\n instance.setFilterValues([]);\r\n displaySetFilter(instance, false);\r\n instance.applyModel();\r\n } else {\r\n displaySetFilter(instance, false);\r\n\r\n if (!instance.getChildFilterInstance(1)) return;\r\n instance.getChildFilterInstance(1).setFilterValues([]);\r\n instance.getChildFilterInstance(1).applyModel();\r\n }\r\n }\r\n } catch (error) {\r\n console.error('Error fetching filter data: ', error);\r\n }\r\n }\r\n };\r\n\r\n const onHandleSortChanged = (event) => {\r\n refreshAggrid();\r\n };\r\n\r\n const onHandleFilterChanged = async (event) => {\r\n let modelFilterChanged = event.api.getFilterModel();\r\n let keyFilter = Object.keys(modelFilterChanged);\r\n let filters = filterParams(\r\n keyFilter,\r\n modelFilterChanged,\r\n agGridNameColumnFilter\r\n );\r\n if (filterFromMainPageRef.current?.length)\r\n filters = [...filters, ...filterFromMainPageRef.current];\r\n let paramsApi = {\r\n fieldName: agGridNameColumnFilter,\r\n filters: filters,\r\n };\r\n\r\n const searchText = paramsGrid?.search?.searchText;\r\n\r\n paramsApi = {\r\n ...paramsApi,\r\n ...paramsGrid,\r\n ...requestParams,\r\n };\r\n\r\n const distinctKeys = [\r\n 'ag-grid',\r\n agGridNameColumnFilter,\r\n filters,\r\n searchText,\r\n ];\r\n\r\n try {\r\n const response = await handleGetDistinctQueries({\r\n distinctKeys,\r\n paramsApi,\r\n });\r\n if (agGridCurrentPagination !== 1) {\r\n setAgGridCurrentPagination(1);\r\n }\r\n let instance = event.api.getFilterInstance(agGridNameColumnFilter);\r\n if (\r\n modelFilterChanged[agGridNameColumnFilter] === undefined ||\r\n modelFilterChanged[agGridNameColumnFilter].filterModels[1] === null ||\r\n modelFilterChanged[agGridNameColumnFilter].filterModels[1].values\r\n .length === 0\r\n ) {\r\n let data;\r\n let _distinctResponseParams = distinctResponseParams || responseParams;\r\n if (_distinctResponseParams) {\r\n // data = response?.data?.[responseParams];\r\n data = get(response?.data, _distinctResponseParams);\r\n } else {\r\n data = response?.data;\r\n }\r\n if (data && data.length > 0 && data.length < 51) {\r\n // supply rows for requested block to grid\r\n instance.getChildFilterInstance(1).setFilterValues(data);\r\n displaySetFilter(instance, true);\r\n } else {\r\n displaySetFilter(instance, false);\r\n instance.getChildFilterInstance(1).setFilterValues([]);\r\n }\r\n instance.getChildFilterInstance(1).applyModel();\r\n }\r\n } catch (error) {\r\n console.log(error);\r\n } finally {\r\n resetSelection();\r\n deselectAll();\r\n setClassNameHeaderCheckbox(\r\n refAgGridCurrentPagination.current,\r\n refAgGridTotalPagination.current,\r\n refAgGridPageSize.current\r\n );\r\n }\r\n };\r\n\r\n const setClassNameHeaderCheckbox = (pageCurrent, totalPage, pageSize) => {\r\n let page = pageCurrent || agGridCurrentPagination;\r\n let total = totalPage || agGridTotalPagination;\r\n let size = pageSize || agGridPageSize;\r\n let pageItemsSelectionFilter =\r\n (refPageItemsSelection.current &&\r\n refPageItemsSelection.current.length > 0 &&\r\n refPageItemsSelection.current.filter(\r\n (pageItem) => pageItem.page === page\r\n )) ||\r\n [];\r\n\r\n let length =\r\n (pageItemsSelectionFilter &&\r\n pageItemsSelectionFilter.length > 0 &&\r\n pageItemsSelectionFilter[0].items &&\r\n pageItemsSelectionFilter[0].items.length) ||\r\n 0;\r\n let lastPage = Math.ceil(totalPage / size) === page ? true : false;\r\n let lastLength = totalPage - (page - 1) * size;\r\n if (\r\n length === size ||\r\n length === total ||\r\n (lastPage && length === lastLength)\r\n ) {\r\n let element = document.getElementsByClassName(urlGrid)[0];\r\n let classNameCheckbox =\r\n element && element.className.replace('ant-checkbox-indeterminate', '');\r\n if (classNameCheckbox) {\r\n classNameCheckbox = classNameCheckbox.replace(\r\n 'ant-checkbox-checked',\r\n ''\r\n );\r\n classNameCheckbox = classNameCheckbox.concat(' ant-checkbox-checked');\r\n }\r\n if (element) {\r\n element.className = classNameCheckbox;\r\n }\r\n } else if (length === 0) {\r\n let element = document.getElementsByClassName(urlGrid)[0];\r\n if (element) {\r\n let classNameCheckbox = element.className.replace(\r\n 'ant-checkbox-indeterminate',\r\n ''\r\n );\r\n classNameCheckbox = classNameCheckbox.replace(\r\n 'ant-checkbox-checked',\r\n ''\r\n );\r\n if (element) {\r\n element.className = classNameCheckbox;\r\n }\r\n }\r\n } else {\r\n let element = document.getElementsByClassName(urlGrid)[0];\r\n let classNameCheckbox =\r\n element &&\r\n element.className &&\r\n element.className.replace('ant-checkbox-indeterminate', '');\r\n if (classNameCheckbox) {\r\n classNameCheckbox = classNameCheckbox.replace(\r\n 'ant-checkbox-checked',\r\n ''\r\n );\r\n classNameCheckbox = classNameCheckbox.concat(\r\n ' ant-checkbox-indeterminate'\r\n );\r\n }\r\n if (element) {\r\n element.className = classNameCheckbox;\r\n }\r\n }\r\n };\r\n\r\n const onHandleCheckboxCellClick = (params) => {\r\n let pageItemsSelectionFilter =\r\n (refPageItemsSelection.current &&\r\n refPageItemsSelection.current.length > 0 &&\r\n refPageItemsSelection.current.filter(\r\n (pageItem) => pageItem.page === refAgGridCurrentPagination.current\r\n )) ||\r\n [];\r\n\r\n let pageItemsSelectionDetailFilter =\r\n (refPageItemsSelectionDetail.current &&\r\n refPageItemsSelectionDetail.current.length > 0 &&\r\n refPageItemsSelectionDetail.current.filter(\r\n (pageItem) => pageItem.page === refAgGridCurrentPagination.current\r\n )) ||\r\n [];\r\n\r\n let pageItemsSelectionFilterDiff =\r\n (refPageItemsSelection.current &&\r\n refPageItemsSelection.current.length > 0 &&\r\n refPageItemsSelection.current.filter(\r\n (pageItem) => pageItem.page !== refAgGridCurrentPagination.current\r\n )) ||\r\n [];\r\n\r\n let pageItemsSelectionDetailFilterDiff =\r\n (refPageItemsSelectionDetail.current &&\r\n refPageItemsSelectionDetail.current.length > 0 &&\r\n refPageItemsSelectionDetail.current.filter(\r\n (pageItem) => pageItem.page !== refAgGridCurrentPagination.current\r\n )) ||\r\n [];\r\n\r\n let nodeId = _.toString(params.data.id);\r\n let nodeData = params.data;\r\n\r\n if (refItemSelection.current.indexOf(nodeId) > -1) {\r\n refItemSelection.current = refItemSelection.current.filter(\r\n (item) => item !== nodeId\r\n );\r\n refItemsSelectionDetail.current = refItemsSelectionDetail.current.filter(\r\n (item) => !isItemIdEqualToNodeId(item, nodeId)\r\n );\r\n pageItemsSelectionFilter[0].items.splice(\r\n pageItemsSelectionFilter[0].items.indexOf(nodeId),\r\n 1\r\n );\r\n const findId = pageItemsSelectionDetailFilter[0].items.findIndex((item) =>\r\n isItemIdEqualToNodeId(item, nodeId)\r\n );\r\n pageItemsSelectionDetailFilter[0].items.splice(findId, 1);\r\n if (pageItemsSelectionFilter[0].items?.length === 0) {\r\n refPageItemsSelection.current = pageItemsSelectionFilterDiff;\r\n refPageItemsSelectionDetail.current =\r\n pageItemsSelectionDetailFilterDiff;\r\n } else {\r\n refPageItemsSelection.current = pageItemsSelectionFilterDiff.concat(\r\n pageItemsSelectionFilter\r\n );\r\n refPageItemsSelectionDetail.current =\r\n pageItemsSelectionDetailFilterDiff.concat(\r\n pageItemsSelectionDetailFilter\r\n );\r\n }\r\n } else {\r\n if (gridConfigProps?.rowSelection === 'single') {\r\n refItemSelection.current = [];\r\n refItemsSelectionDetail.current = [];\r\n refPageItemsSelection.current = [];\r\n refPageItemsSelectionDetail.current = [];\r\n pageItemsSelectionFilter = [];\r\n pageItemsSelectionDetailFilter = [];\r\n }\r\n\r\n refItemSelection.current = [...refItemSelection.current, nodeId];\r\n refItemsSelectionDetail.current = [\r\n ...refItemsSelectionDetail.current,\r\n nodeData,\r\n ];\r\n if (pageItemsSelectionFilter && pageItemsSelectionFilter.length > 0) {\r\n pageItemsSelectionFilter[0].items.push(nodeId);\r\n pageItemsSelectionDetailFilter[0].items.push(nodeData);\r\n\r\n refPageItemsSelection.current = pageItemsSelectionFilterDiff.concat(\r\n pageItemsSelectionFilter\r\n );\r\n refPageItemsSelectionDetail.current =\r\n pageItemsSelectionDetailFilterDiff.concat(\r\n pageItemsSelectionDetailFilter\r\n );\r\n } else {\r\n refPageItemsSelection.current = refPageItemsSelection.current.concat([\r\n {\r\n page: refAgGridCurrentPagination.current,\r\n items: [nodeId],\r\n },\r\n ]);\r\n refPageItemsSelectionDetail.current =\r\n refPageItemsSelectionDetail.current.concat([\r\n {\r\n page: refAgGridCurrentPagination.current,\r\n items: [nodeData],\r\n },\r\n ]);\r\n }\r\n }\r\n\r\n params.api.forEachNode((node) => {\r\n if (refItemSelection.current.indexOf(node.id) > -1) {\r\n node.setSelected(true);\r\n } else {\r\n node.setSelected(false);\r\n }\r\n });\r\n\r\n if (gridView && refItemSelection.current?.length === 1) {\r\n const currentItem = refItemsSelectionDetail.current?.[0];\r\n\r\n let data = Object.assign({}, params?.data);\r\n if (refItemSelection.current.indexOf(data?.id) > -1) {\r\n dispatch(actionsGridView.updateItemCurrentSelection(data));\r\n } else {\r\n dispatch(\r\n actionsGridView.updateItemCurrentSelection({\r\n ...currentItem,\r\n checkboxSelection: false,\r\n })\r\n );\r\n }\r\n }\r\n };\r\n\r\n const onHandleCellsRowClick = (params) => {\r\n let nodeSelections = params.api.getSelectedNodes();\r\n\r\n let itemsSelectionNew = [];\r\n let itemsSelectionDetailNew = [];\r\n let dataNode;\r\n\r\n if (refItemSelection.current.length === 0) {\r\n nodeSelections &&\r\n nodeSelections.length > 0 &&\r\n nodeSelections.forEach((node) => {\r\n itemsSelectionNew.push(node.id);\r\n itemsSelectionDetailNew.push(node.data);\r\n dataNode = node;\r\n });\r\n refItemSelection.current = itemsSelectionNew;\r\n refItemsSelectionDetail.current = itemsSelectionDetailNew;\r\n refPageItemsSelection.current = [\r\n {\r\n page: refAgGridCurrentPagination.current,\r\n items: [...refItemSelection.current],\r\n },\r\n ];\r\n refPageItemsSelectionDetail.current = [\r\n {\r\n page: refAgGridCurrentPagination.current,\r\n items: [...refItemsSelectionDetail.current],\r\n },\r\n ];\r\n if (gridView) {\r\n const data = Object.assign({}, dataNode?.data);\r\n\r\n dispatch(actionsGridView.updateItemCurrentSelection(data));\r\n isShowDetailOn && dispatch(actionsGridView.updateVisible(true));\r\n }\r\n } else {\r\n if (nodeSelections.length === 1) {\r\n let pageItemsSelectionFilter =\r\n (refPageItemsSelection.current &&\r\n refPageItemsSelection.current.length > 0 &&\r\n refPageItemsSelection.current.filter(\r\n (pageItems) =>\r\n pageItems.page !== refAgGridCurrentPagination.current\r\n )) ||\r\n [];\r\n if (pageItemsSelectionFilter && pageItemsSelectionFilter.length > 0) {\r\n if (!isHiddenAbbandonDialog) {\r\n if (gridConfigProps?.rowSelection === 'single') {\r\n handleModalAbandon();\r\n } else {\r\n setVisibleSelection(true);\r\n }\r\n }\r\n } else {\r\n nodeSelections &&\r\n nodeSelections.length > 0 &&\r\n nodeSelections.forEach((node) => {\r\n itemsSelectionNew.push(node.id);\r\n itemsSelectionDetailNew.push(node.data);\r\n dataNode = node;\r\n });\r\n refItemSelection.current = itemsSelectionNew;\r\n refItemsSelectionDetail.current = itemsSelectionDetailNew;\r\n refPageItemsSelection.current = [\r\n {\r\n page: refAgGridCurrentPagination.current,\r\n items: [...refItemSelection.current],\r\n },\r\n ];\r\n refPageItemsSelectionDetail.current = [\r\n {\r\n page: refAgGridCurrentPagination.current,\r\n items: [...refItemsSelectionDetail.current],\r\n },\r\n ];\r\n\r\n if (gridView) {\r\n const data = Object.assign({}, dataNode?.data);\r\n\r\n dispatch(actionsGridView.updateItemCurrentSelection(data));\r\n isShowDetailOn && dispatch(actionsGridView.updateVisible(true));\r\n }\r\n }\r\n } else {\r\n params.api.forEachNode((node) => {\r\n if (node.selected) {\r\n itemsSelectionNew.push(node.id);\r\n itemsSelectionDetailNew.push(node.data);\r\n } else {\r\n refItemSelection.current = refItemSelection.current.filter(\r\n (item) => item !== node.id\r\n );\r\n refItemsSelectionDetail.current =\r\n refItemsSelectionDetail.current.filter(\r\n (item) => !isItemIdEqualToNodeId(item, node.id)\r\n );\r\n }\r\n });\r\n refItemSelection.current = _.union(\r\n refItemSelection.current,\r\n itemsSelectionNew\r\n );\r\n refItemsSelectionDetail.current = _.uniqBy(\r\n [...refItemsSelectionDetail.current, ...itemsSelectionDetailNew],\r\n 'id'\r\n );\r\n let pageItemsSelectionFilter =\r\n refPageItemsSelection.current &&\r\n refPageItemsSelection.current.length > 0 &&\r\n refPageItemsSelection.current.filter(\r\n (pageItems) => pageItems.page !== refAgGridCurrentPagination.current\r\n );\r\n let pageItemsSelectionDetailFilter =\r\n refPageItemsSelectionDetail.current &&\r\n refPageItemsSelectionDetail.current.length > 0 &&\r\n refPageItemsSelectionDetail.current.filter(\r\n (pageItems) => pageItems.page !== refAgGridCurrentPagination.current\r\n );\r\n pageItemsSelectionFilter.push({\r\n page: refAgGridCurrentPagination.current,\r\n items: itemsSelectionNew,\r\n });\r\n pageItemsSelectionDetailFilter.push({\r\n page: refAgGridCurrentPagination.current,\r\n items: itemsSelectionDetailNew,\r\n });\r\n refPageItemsSelection.current = pageItemsSelectionFilter;\r\n refPageItemsSelectionDetail.current = pageItemsSelectionDetailFilter;\r\n }\r\n }\r\n };\r\n\r\n const onRowClicked = (params) => {\r\n if (\r\n params.event.target &&\r\n params.event.target.name &&\r\n params.event.target.name.indexOf('ag-grid-input-check-clicked') > -1\r\n ) {\r\n onHandleCheckboxCellClick(params);\r\n } else {\r\n onHandleCellsRowClick(params);\r\n }\r\n\r\n setClickedRow(params?.data);\r\n\r\n if (refPageItemsSelection.current) {\r\n let result = [];\r\n refPageItemsSelection.current.forEach((data) => {\r\n result = result.concat(data.items);\r\n });\r\n const getSelectionList =\r\n callbackDataListSelection?.func || callbackDataListSelection;\r\n if (typeof getSelectionList === 'function') {\r\n getSelectionList(result.map((stringId) => _.toNumber(stringId)));\r\n }\r\n }\r\n\r\n setItemsSelectionLog(refItemSelection.current);\r\n setItemsSelectionDetailLog(refItemsSelectionDetail.current);\r\n setPageItemsSelectionLog(refPageItemsSelection.current);\r\n setPageItemsSelectionDetailLog(refPageItemsSelectionDetail.current);\r\n\r\n setClassNameHeaderCheckbox(\r\n refAgGridCurrentPagination.current,\r\n refAgGridTotalPagination.current,\r\n refAgGridPageSize.current\r\n );\r\n };\r\n\r\n const handleModalAbandon = () => {\r\n const agGridApi = refGrid.current.api;\r\n\r\n let nodeSelections = agGridApi.getSelectedNodes();\r\n let itemsSelectionNew = [];\r\n let itemsSelectionDetailNew = [];\r\n let dataNode;\r\n nodeSelections &&\r\n nodeSelections.length > 0 &&\r\n nodeSelections.forEach((node) => {\r\n itemsSelectionNew.push(node.id);\r\n itemsSelectionDetailNew.push(node.data);\r\n dataNode = node;\r\n });\r\n refItemSelection.current = itemsSelectionNew;\r\n refItemsSelectionDetail.current = itemsSelectionDetailNew;\r\n refPageItemsSelection.current = [\r\n { page: agGridCurrentPagination, items: [...refItemSelection.current] },\r\n ];\r\n refPageItemsSelectionDetail.current = [\r\n {\r\n page: agGridCurrentPagination,\r\n items: [...refItemsSelectionDetail.current],\r\n },\r\n ];\r\n setItemsSelectionLog(refItemSelection.current);\r\n setItemsSelectionDetailLog(refItemsSelectionDetail.current);\r\n setPageItemsSelectionLog(refPageItemsSelection.current);\r\n setPageItemsSelectionDetailLog(refPageItemsSelectionDetail.current);\r\n setClassNameHeaderCheckbox();\r\n // setItemsSelection(itemsSelectionNew);\r\n setVisibleSelection(false);\r\n const data = Object.assign({}, dataNode?.data);\r\n dispatch(actionsGridView.updateItemCurrentSelection(data));\r\n isShowDetailOn && dispatch(actionsGridView.updateVisible(true));\r\n };\r\n const handleModalAppend = () => {\r\n const agGridApi = refGrid.current.api;\r\n\r\n let nodeSelections = agGridApi.getSelectedNodes();\r\n let itemsSelectionNew = [];\r\n let itemsSelectionDetailNew = [];\r\n\r\n nodeSelections &&\r\n nodeSelections.length > 0 &&\r\n nodeSelections.forEach((node) => {\r\n itemsSelectionNew.push(node.id);\r\n itemsSelectionDetailNew.push(node.data);\r\n });\r\n agGridApi.forEachNode((node) => {\r\n if (refItemSelection.current.indexOf(node.id) > -1) {\r\n node.setSelected(true);\r\n }\r\n });\r\n refItemSelection.current = _.union(\r\n refItemSelection.current,\r\n itemsSelectionNew\r\n );\r\n refItemsSelectionDetail.current = _.uniqBy(\r\n [...refItemsSelectionDetail.current, ...itemsSelectionDetailNew],\r\n 'id'\r\n );\r\n refPageItemsSelection.current.push({\r\n page: agGridCurrentPagination,\r\n items: itemsSelectionNew,\r\n });\r\n refPageItemsSelectionDetail.current.push({\r\n page: agGridCurrentPagination,\r\n items: itemsSelectionDetailNew,\r\n });\r\n\r\n setItemsSelectionLog(refItemSelection.current);\r\n setItemsSelectionDetailLog(refItemsSelectionDetail.current);\r\n setPageItemsSelectionLog(refPageItemsSelection.current);\r\n setPageItemsSelectionDetailLog(refPageItemsSelectionDetail.current);\r\n setClassNameHeaderCheckbox();\r\n setVisibleSelection(false);\r\n };\r\n\r\n const handleModalCancel = () => {\r\n const agGridApi = refGrid.current.api;\r\n\r\n let nodeSelections = agGridApi.getSelectedNodes();\r\n nodeSelections &&\r\n nodeSelections.length > 0 &&\r\n nodeSelections.forEach((node) => {\r\n node.setSelected(false);\r\n });\r\n\r\n agGridApi.forEachNode((node) => {\r\n if (refItemSelection.current.indexOf(node.id) > -1) {\r\n node.setSelected(true);\r\n }\r\n });\r\n setItemsSelectionLog(refItemSelection.current);\r\n setItemsSelectionDetailLog(refItemsSelectionDetail.current);\r\n setPageItemsSelectionLog(refPageItemsSelection.current);\r\n setPageItemsSelectionDetailLog(refPageItemsSelectionDetail.current);\r\n setClassNameHeaderCheckbox();\r\n setVisibleSelection(false);\r\n };\r\n\r\n const getRowNodeId = useCallback((data) => {\r\n return nodeIdName ? data?.[nodeIdName] : data.id;\r\n }, []);\r\n\r\n const onCallbackSelectedRowFromOutside = (rowData) => {\r\n if (typeof onHandleSelectedRowCustom === 'function') {\r\n const selectedItemsDetail =\r\n refSelection.current.getItemsSelectionDetailLog();\r\n\r\n onHandleSelectedRowCustom(selectedItemsDetail || [], rowData);\r\n }\r\n };\r\n\r\n const handleMovedColumn = () => {\r\n const agGridColumnApi = refGrid.current.columnApi;\r\n\r\n const result = agGridColumnApi\r\n .getAllGridColumns()\r\n .map((col) => col.colDef?.field);\r\n\r\n dispatch(actionsGridView.changePositionColumns(result));\r\n };\r\n\r\n // add isColumnsChanged props to fix bug when the modal grid show will make\r\n // columns in modal choose columns will uncheck\r\n const handleDisplayedColumnsChanged = () => {\r\n const agGridColumnApi = refGrid.current.columnApi;\r\n\r\n if (typeof agGridColumnApi === 'object') {\r\n const virtualColumns = agGridColumnApi.getAllDisplayedVirtualColumns();\r\n if (virtualColumns && isColumnsChanged) {\r\n const result = virtualColumns.map((col) => col.colDef?.field);\r\n if (!_.isEqual(result, refVirtualColumns.current)) {\r\n refVirtualColumns.current = result;\r\n dispatch(actionsGridView.changeDisplayedColumns(result));\r\n }\r\n }\r\n }\r\n };\r\n\r\n const onCellFocused = (e) => {\r\n if (e?.column?.colDef?.field === 'dragColumn') {\r\n e.api.gridOptionsWrapper.gridOptions.suppressRowClickSelection = true;\r\n } else {\r\n e.api.gridOptionsWrapper.gridOptions.suppressRowClickSelection = false;\r\n }\r\n };\r\n\r\n const onHeaderCheckboxClick = (e, params) => {\r\n let className = e.currentTarget.className;\r\n let itemsSelectionNew = [];\r\n let itemsSelectionDetailNew = [];\r\n\r\n if (className.indexOf('ant-checkbox-checked') > -1) {\r\n params.api.forEachNode((node) => {\r\n node.setSelected(false);\r\n refItemSelection.current = refItemSelection.current.filter(\r\n (item) => item !== node.id\r\n );\r\n refItemsSelectionDetail.current =\r\n refItemsSelectionDetail.current.filter(\r\n (item) => !isItemIdEqualToNodeId(item, node?.id)\r\n );\r\n });\r\n let pageItemsSelectionFilter =\r\n (refPageItemsSelection.current &&\r\n refPageItemsSelection.current.length > 0 &&\r\n refPageItemsSelection.current.filter(\r\n (pageItems) => pageItems.page !== refAgGridCurrentPagination.current\r\n )) ||\r\n [];\r\n let pageItemsSelectionDetailFilter =\r\n (refPageItemsSelectionDetail.current &&\r\n refPageItemsSelectionDetail.current.length > 0 &&\r\n refPageItemsSelectionDetail.current.filter(\r\n (pageItems) => pageItems.page !== refAgGridCurrentPagination.current\r\n )) ||\r\n [];\r\n refPageItemsSelection.current = pageItemsSelectionFilter;\r\n refPageItemsSelectionDetail.current = pageItemsSelectionDetailFilter;\r\n } else {\r\n params.api.forEachNode((node) => {\r\n node.setSelected(true);\r\n itemsSelectionNew.push(node.id);\r\n itemsSelectionDetailNew.push(node.data);\r\n });\r\n refItemSelection.current = _.union(\r\n refItemSelection.current,\r\n itemsSelectionNew\r\n );\r\n refItemSelection.current = _.union(\r\n refItemSelection.current,\r\n itemsSelectionNew\r\n );\r\n refItemsSelectionDetail.current = _.uniqBy(\r\n [...refItemsSelectionDetail.current, ...itemsSelectionDetailNew],\r\n 'id'\r\n );\r\n let pageItemsSelectionFilter =\r\n (refPageItemsSelection.current &&\r\n refPageItemsSelection.current.length > 0 &&\r\n refPageItemsSelection.current.filter(\r\n (pageItems) => pageItems.page !== refAgGridCurrentPagination.current\r\n )) ||\r\n [];\r\n let pageItemsSelectionDetailFilter =\r\n (refPageItemsSelectionDetail.current &&\r\n refPageItemsSelectionDetail.current.length > 0 &&\r\n refPageItemsSelectionDetail.current.filter(\r\n (pageItems) => pageItems.page !== refAgGridCurrentPagination.current\r\n )) ||\r\n [];\r\n pageItemsSelectionFilter.push({\r\n page: refAgGridCurrentPagination.current,\r\n items: itemsSelectionNew,\r\n });\r\n pageItemsSelectionDetailFilter.push({\r\n page: refAgGridCurrentPagination.current,\r\n items: itemsSelectionDetailNew,\r\n });\r\n refPageItemsSelection.current = pageItemsSelectionFilter;\r\n refPageItemsSelectionDetail.current = pageItemsSelectionDetailFilter;\r\n }\r\n setItemsSelectionLog(refItemSelection.current);\r\n setPageItemsSelectionLog(refPageItemsSelection.current);\r\n\r\n if (refPageItemsSelection.current) {\r\n let result = [];\r\n refPageItemsSelection.current.forEach((data) => {\r\n result = result.concat(data.items);\r\n });\r\n const getSelectionList =\r\n callbackDataListSelection?.func || callbackDataListSelection;\r\n if (typeof getSelectionList === 'function') {\r\n getSelectionList(result.map((stringId) => _.toNumber(stringId)));\r\n }\r\n }\r\n\r\n setItemsSelectionDetailLog(refItemsSelectionDetail.current);\r\n setPageItemsSelectionDetailLog(refPageItemsSelectionDetail.current);\r\n\r\n setClassNameHeaderCheckbox(\r\n refAgGridCurrentPagination.current,\r\n refAgGridTotalPagination.current,\r\n refAgGridPageSize.current\r\n );\r\n };\r\n\r\n const { notCheckTotalRecordAgGrid } = gridConfigProps ?? {};\r\n\r\n return (\r\n \r\n \r\n {forceLoading ? (\r\n
Reloading...
\r\n ) : (\r\n \r\n {\r\n // check callback is for menu\r\n if (params.type !== 'columnMenu') {\r\n return;\r\n }\r\n\r\n onMenuClick(params);\r\n }}\r\n // modules: AllModules,\r\n // EVENTS\r\n // Add event handlers\r\n onRowClicked={onRowClicked}\r\n onSelectionChanged={onSelectionChanged}\r\n onRowSelected={onRowSelected}\r\n // onColumnResized={(event) => {\r\n // console.log('A column was resized');\r\n // }}\r\n onGridReady={onGridReadyfunction}\r\n isScrollLag={(event) => {\r\n return false;\r\n }}\r\n // onPaginationChanged={(event) => {\r\n // console.log('pagi');\r\n // }}\r\n onSortChanged={onHandleSortChanged}\r\n onFilterChanged={onHandleFilterChanged}\r\n onFilterModified={() => {}} // a trick for the Apply button fire onHandleFilterChanged\r\n rowClassRules={rowClassRules && rowClassRules}\r\n onDragStopped={handleMovedColumn}\r\n onDisplayedColumnsChanged={handleDisplayedColumnsChanged}\r\n onCellFocused={onCellFocused}\r\n applyColumnDefOrder={true}\r\n rowMultiSelectWithClick={\r\n false\r\n } /* TODO: rowMultiSelectWithClick = true then pageSelectionItems will not clear, maybe fix after*/\r\n suppressFieldDotNotation={true}\r\n alwaysShowHorizontalScroll={true}\r\n alwaysShowVerticalScroll={true}\r\n onRowDoubleClicked={onRowDoubleClicked}\r\n {...gridConfigProps}\r\n >\r\n\r\n {notCheckTotalRecordAgGrid\r\n ? null\r\n : agGridTotalPagination <= 0 && (\r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n {!hidePagination && (\r\n <>\r\n \r\n {minimizePagination ||\r\n isShowDetailOn ||\r\n showAddToFolder ? null : (\r\n <>\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n )}\r\n \r\n\r\n \r\n \r\n\r\n {(gridView || !isHiddenAbbandonDialog) && (\r\n \r\n )}\r\n \r\n )}\r\n \r\n \r\n );\r\n});\r\n\r\nAgGrid.propTypes = {\r\n styleGrid: PropTypes.object,\r\n columnDefs: PropTypes.array,\r\n urlGrid: PropTypes.string,\r\n urlGridDistinct: PropTypes.string,\r\n paramsGrid: PropTypes.object,\r\n gridView: PropTypes.bool,\r\n tabView: PropTypes.string,\r\n pathname: PropTypes.string,\r\n requestParams: PropTypes.oneOfType([\r\n PropTypes.object,\r\n PropTypes.oneOf([null]),\r\n ]),\r\n callbackDataListSelection: PropTypes.func,\r\n hidePagination: PropTypes.bool,\r\n filterFromMainPage: PropTypes.array,\r\n rowClassRules: PropTypes.object,\r\n frameworkComponents: PropTypes.object,\r\n triggerDownload: PropTypes.bool,\r\n onDownloadGridHandler: PropTypes.func,\r\n downloadFileType: PropTypes.string,\r\n isDownloadAllColumns: PropTypes.bool,\r\n notShowHeaderCheckbox: PropTypes.bool,\r\n showCheckboxSelectionRender: PropTypes.bool,\r\n};\r\n\r\nexport default AgGrid;\r\n","import { LicenseManager } from 'ag-grid-enterprise';\r\nimport 'ag-grid-enterprise';\r\nimport 'ag-grid-community/dist/styles/ag-grid.css';\r\nimport 'ag-grid-community/dist/styles/ag-theme-alpine.css';\r\n\r\nLicenseManager.setLicenseKey(\r\n 'Using_this_AG_Grid_Enterprise_key_( AG-040843 )_in_excess_of_the_licence_granted_is_not_permitted___Please_report_misuse_to_( legal@ag-grid.com )___For_help_with_changing_this_key_please_contact_( info@ag-grid.com )___( Global Vertical Innovations, LLC )_is_granted_a_( Multiple Applications )_Developer_License_for_( 1 ))_Front-End_JavaScript_developer___All_Front-End_JavaScript_developers_need_to_be_licensed_in_addition_to_the_ones_working_with_AG_Grid_Enterprise___This_key_has_not_been_granted_a_Deployment_License_Add-on___This_key_works_with_AG_Grid_Enterprise_versions_released_before_( 11 May 2024 )____[v2]_MTcxNTM4MjAwMDAwMA==d035e6c32ae72202e23beccd712ab105'\r\n);\r\n","import React, { useState, useEffect } from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\n\r\nimport { Row, Col, Input } from 'antd';\r\n\r\nimport { AgGrid } from 'common/components';\r\n\r\nimport * as actions from 'pages/branded-products-apl/controllers/actions';\r\nimport * as selectors from 'pages/branded-products-apl/controllers/selectors';\r\n\r\nimport { REDUX_MODULE, useInjectRedux } from 'hooks/useRedux';\r\n\r\nimport { GRID_ID } from 'common/components/grid-view/utils';\r\n\r\nimport { MASTER_APL_NAME } from 'pages/home/ribbon/components/sections/product-apl/constants';\r\n\r\nimport * as endpoints from 'services/product/endpoints';\r\n\r\nconst { Search } = Input;\r\n\r\nconst AplGrid = (props) => {\r\n const dispatch = useDispatch();\r\n\r\n useInjectRedux(REDUX_MODULE.PRODUCT_APL);\r\n\r\n const { onSelectRow } = props;\r\n\r\n const [searchText, setSearchText] = useState(null);\r\n\r\n const columns = useSelector(selectors.selectProductAPLColumns());\r\n\r\n const onSearch = (value) => {\r\n setSearchText(value);\r\n };\r\n\r\n useEffect(() => {\r\n dispatch(\r\n actions.getAPLGridColumns({\r\n linkTarget: '_blank',\r\n })\r\n );\r\n }, [dispatch]);\r\n\r\n const rowClassRules = {\r\n 'active-row': ({ data }) => data?.aplName === MASTER_APL_NAME,\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default AplGrid;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Button, Typography } from 'antd';\r\nimport { injectIntl } from 'react-intl';\r\nimport classNames from 'classnames';\r\n\r\nimport './ButtonWithIcon.less';\r\n\r\nconst { Text } = Typography;\r\n\r\nconst ButtonLargeIcon = ({\r\n icon,\r\n label,\r\n toggle = false,\r\n className,\r\n intl,\r\n ...otherProps\r\n}) => {\r\n const mapToLabelContent = () => {\r\n let newLabel = '';\r\n try {\r\n newLabel = intl.formatMessage(label);\r\n } catch (e) {\r\n newLabel = label;\r\n }\r\n return newLabel;\r\n };\r\n\r\n //! COMPONENT DEPRECATED\r\n //! use RibbonButton instead\r\n return (\r\n \r\n
\r\n \r\n {mapToLabelContent()}\r\n \r\n \r\n );\r\n};\r\n\r\nButtonLargeIcon.prototype = {\r\n icon: PropTypes.element,\r\n label: PropTypes.object,\r\n onClick: PropTypes.func,\r\n toggle: PropTypes.bool,\r\n className: PropTypes.string,\r\n disabled: PropTypes.bool,\r\n};\r\n\r\nexport default injectIntl(ButtonLargeIcon);\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Button, Typography } from 'antd';\r\nimport { injectIntl } from 'react-intl';\r\nimport classNames from 'classnames';\r\n\r\nimport './ButtonWithIcon.less';\r\n\r\nconst { Text } = Typography;\r\n\r\nconst ButtonSmallIcon = ({\r\n icon,\r\n label,\r\n toggle = false,\r\n className = '',\r\n textDisplay,\r\n intl,\r\n ...otherProps\r\n}) => {\r\n const mapToLabelContent = () => {\r\n let newLabel = '';\r\n try {\r\n newLabel = intl.formatMessage(label);\r\n } catch (e) {\r\n newLabel = label;\r\n }\r\n return newLabel;\r\n };\r\n return (\r\n \r\n \r\n {textDisplay\r\n ? textDisplay\r\n : // \r\n mapToLabelContent()}\r\n \r\n \r\n );\r\n};\r\n\r\nButtonSmallIcon.prototype = {\r\n icon: PropTypes.element,\r\n label: PropTypes.object,\r\n // display text without translation\r\n textDisplay: PropTypes.string,\r\n onClick: PropTypes.func,\r\n toggle: PropTypes.bool,\r\n className: PropTypes.string,\r\n};\r\n\r\nexport default injectIntl(ButtonSmallIcon);\r\n","import React from 'react';\r\nimport { Row } from 'antd';\r\n\r\nconst ContainerButton = (props) => {\r\n const { alignCenter, style = {} } = props;\r\n\r\n const propsStyle = {\r\n alignItems: alignCenter ? 'center' : '',\r\n };\r\n\r\n return ;\r\n};\r\n\r\nexport default ContainerButton;\r\n","import React from 'react';\r\nimport { Button } from 'antd';\r\nimport { SaveOutlined } from '@ant-design/icons';\r\nimport { FormattedMessage } from 'react-intl';\r\nimport Messages from 'i18n/messages/common';\r\n\r\nconst FormSaveButton = (props) => {\r\n const { text, style, ...restProps } = props;\r\n return (\r\n }\r\n {...restProps}\r\n >\r\n {text || }\r\n \r\n );\r\n};\r\n\r\nexport default FormSaveButton;\r\n","import React, { useMemo } from 'react';\r\nimport { Col } from 'antd';\r\n\r\nconst ItemButton = (props) => {\r\n const { noneSpan, isVertical, style = {}, ...restProps } = props;\r\n\r\n const spanConfig = useMemo(() => {\r\n return noneSpan ? {} : { span: 12 };\r\n }, [noneSpan]);\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport default ItemButton;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport classNames from 'classnames';\r\nimport { Button, Typography } from 'antd';\r\nimport { LoadingOutlined } from '@ant-design/icons';\r\n\r\nimport { injectIntl } from 'react-intl';\r\n\r\nimport './RibbonButton.less';\r\n\r\nconst { Text } = Typography;\r\n\r\nconst RibbonButton = ({\r\n icon,\r\n label,\r\n toggle = false,\r\n className,\r\n intl,\r\n size,\r\n disabled,\r\n loading,\r\n ...otherProps\r\n}) => {\r\n const mapToLabelContent = () => {\r\n let newLabel = '';\r\n try {\r\n newLabel = intl.formatMessage(label);\r\n } catch (e) {\r\n newLabel = label;\r\n }\r\n return newLabel;\r\n };\r\n\r\n const buttonIcon = loading ? : icon;\r\n\r\n return (\r\n \r\n {buttonIcon ? (\r\n {buttonIcon}\r\n ) : null}\r\n \r\n {mapToLabelContent()}\r\n \r\n \r\n );\r\n};\r\n\r\nRibbonButton.prototype = {\r\n icon: PropTypes.element,\r\n label: PropTypes.object,\r\n onClick: PropTypes.func,\r\n toggle: PropTypes.bool,\r\n className: PropTypes.string,\r\n disabled: PropTypes.bool,\r\n};\r\n\r\nexport default injectIntl(RibbonButton);\r\n","import { Typography, Button } from 'antd';\r\nimport { CaretDownOutlined, CaretUpOutlined } from '@ant-design/icons';\r\n\r\nconst { Text } = Typography;\r\n\r\nconst ShowMoreOrLess = (props) => {\r\n const {\r\n fullList,\r\n showList,\r\n style = {},\r\n setShowList,\r\n maxShowLess = 6,\r\n } = props;\r\n\r\n const type =\r\n fullList?.length === showList?.length ? 'showing full' : 'showing less';\r\n\r\n const content = type === 'showing full' ? 'View less' : 'View more';\r\n const icon =\r\n type === 'showing full' ? : ;\r\n\r\n const onClickShowMoreOrLessButton = () => {\r\n if (type === 'showing full') {\r\n setShowList(fullList.slice(0, maxShowLess));\r\n return;\r\n }\r\n\r\n if (type === 'showing less') {\r\n setShowList(fullList);\r\n return;\r\n }\r\n };\r\n\r\n const {\r\n text: textStyle = {},\r\n wrapper: wrapperStyle = {},\r\n button: buttonStyle = {},\r\n } = style;\r\n\r\n if (!fullList || fullList?.length <= maxShowLess) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n {content}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default ShowMoreOrLess;\r\n","import React from 'react';\r\n\r\nimport { Button } from 'antd';\r\nimport { ExpandAltOutlined, ShrinkOutlined } from '@ant-design/icons';\r\n\r\nimport './ExpandTabButton.less';\r\n\r\nconst ExpandTabButton = (props) => {\r\n const { onClick, isTabExpanded } = props;\r\n\r\n return (\r\n : }\r\n onClick={onClick}\r\n >\r\n );\r\n};\r\nexport default ExpandTabButton;\r\n","import React from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\n\r\nimport {\r\n ContactsOutlined,\r\n MailOutlined,\r\n MessageOutlined,\r\n FileTextOutlined,\r\n} from '@ant-design/icons';\r\nimport { Menu, Dropdown, Tooltip } from 'antd';\r\nimport { FormattedMessage } from 'react-intl';\r\nimport Messages from 'i18n/messages/home';\r\n\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\n\r\nimport * as globalAtions from '@redux/global/actions';\r\nimport * as globalSelectors from '@redux/global/selectors';\r\n\r\nimport userSelectors from '@redux/user/selectors';\r\n\r\nimport * as chatActions from 'common/components/message/controller/actions';\r\nimport * as emailActions from 'common/components/mail/controller/actions';\r\n\r\nimport * as chatServices from 'services/chatServices';\r\nimport { CHATTYPE } from 'static/Constants';\r\n\r\nimport { SECURE_CONFIG } from 'utils/SecureRoute';\r\nimport { useCheckPermissionOR } from 'hooks/useCheckPermissions';\r\n\r\nconst ActionsRibbonBar = (props) => {\r\n const { view, selectedItemList } = props;\r\n\r\n const dispatch = useDispatch();\r\n\r\n const userInfo = useSelector(userSelectors.makeSelectUserInfo());\r\n\r\n const contactCardInfo = useSelector(\r\n userSelectors.makeSelectContactCardInfo()\r\n );\r\n\r\n const hubConnection = useSelector(globalSelectors.selectSignalRConnection());\r\n\r\n const isChatViewOpen = useSelector(globalSelectors.selectIsChatViewOpen());\r\n const isEmailViewOpen = useSelector(globalSelectors.selectIsEmailViewOpen());\r\n\r\n const checkPermission = useCheckPermissionOR();\r\n const canChat = checkPermission([SECURE_CONFIG.CHAT_PERSONAL.PASS]);\r\n\r\n const isUser = view === 'user';\r\n const viewedUserCompany = contactCardInfo?.memberId;\r\n const loggedUserCompany = userInfo?.member?.id;\r\n const isUserSameCompany = viewedUserCompany === loggedUserCompany;\r\n\r\n const shouldShowContactCard = isUser && isUserSameCompany;\r\n\r\n const getTooltipProps = () => {\r\n const tooltipProps = {\r\n title: ,\r\n mouseEnterDelay: 0,\r\n mouseLeaveDelay: 0,\r\n };\r\n\r\n if (!shouldShowContactCard) tooltipProps.visible = false;\r\n\r\n return tooltipProps;\r\n };\r\n\r\n const handleSendMessage = async (type, user) => {\r\n try {\r\n const paramsSubmit = {\r\n userChatType: CHATTYPE.USER,\r\n chatType: type === 'email' ? 'Email' : 'P2P',\r\n threadName:\r\n type === 'email'\r\n ? view === 'user'\r\n ? selectedItemList &&\r\n selectedItemList.length > 0 &&\r\n selectedItemList[0]?.fullName\r\n : selectedItemList &&\r\n selectedItemList.length > 0 &&\r\n selectedItemList[0]?.memberName\r\n : '',\r\n users:\r\n view === 'user'\r\n ? [\r\n selectedItemList &&\r\n selectedItemList.length > 0 &&\r\n selectedItemList[0]?.id,\r\n ]\r\n : [],\r\n companies:\r\n view === 'user'\r\n ? []\r\n : [\r\n selectedItemList &&\r\n selectedItemList.length > 0 &&\r\n selectedItemList[0]?.id,\r\n ],\r\n };\r\n if (!isChatViewOpen && type !== 'email') {\r\n dispatch(globalAtions.toggleChatView(true));\r\n }\r\n\r\n if (!isEmailViewOpen && type === 'email') {\r\n dispatch(globalAtions.toggleEmailView(true));\r\n }\r\n\r\n const response = await chatServices.initChatCommunication(paramsSubmit);\r\n if (response?.isSuccess) {\r\n if (hubConnection) {\r\n try {\r\n setTimeout(() => {\r\n if (type === 'email') {\r\n const params = {\r\n threadId: response?.data?.threadId,\r\n userId: `U-${userInfo?.id}`,\r\n };\r\n dispatch(emailActions.getEmailThreadInfo(params));\r\n dispatch(\r\n emailActions.getEmailThreadInfoContent(\r\n response?.data?.threadId\r\n )\r\n );\r\n } else {\r\n dispatch(chatActions.setChatView('threadMsg'));\r\n dispatch(\r\n chatActions.getThreadInfo(\r\n response?.data?.threadId,\r\n `U-${userInfo?.id}`\r\n )\r\n );\r\n dispatch(\r\n chatActions.getThreadMessages(response?.data?.threadId)\r\n );\r\n dispatch(\r\n globalAtions.updateListAfterSendMessage({\r\n threadId: response?.data?.threadId,\r\n creatorId: `U-${userInfo?.id}`,\r\n })\r\n );\r\n }\r\n }, 500);\r\n } catch (error) {}\r\n }\r\n }\r\n } catch (error) {}\r\n };\r\n\r\n //* render\r\n const disabledDropdown = !(\r\n (view === 'member' ||\r\n view === 'product-shared' ||\r\n (view === 'user' && contactCardInfo?.userId !== userInfo?.id)) &&\r\n selectedItemList?.length === 1\r\n );\r\n\r\n const menuOptions = (\r\n \r\n {/* \r\n }\r\n label={Messages.cardMemberFull}\r\n onClick={onButtonClickHandler}\r\n className='button-item-dropdown'\r\n />\r\n */}\r\n \r\n }\r\n label={Messages.messageMemberFull}\r\n onClick={() => handleSendMessage()}\r\n className='button-item-dropdown'\r\n disabled={!canChat}\r\n />\r\n \r\n\r\n \r\n }\r\n label={Messages.emailMemberFull}\r\n onClick={() => handleSendMessage('email')}\r\n className='button-item-dropdown'\r\n disabled={!canChat}\r\n />\r\n \r\n \r\n }\r\n label={Messages.sendText}\r\n // onClick={() => setShowText(true)}\r\n className='button-item-dropdown'\r\n disabled\r\n />\r\n \r\n\r\n {/* \r\n }\r\n label={Messages.cardMemberFull}\r\n onClick={() => setShowContact(true)}\r\n className='contact-config__dropdown--item'\r\n />\r\n */}\r\n \r\n );\r\n\r\n return (\r\n \r\n \r\n }\r\n label={Messages.contactControl}\r\n disabled={disabledDropdown || !canChat}\r\n />\r\n \r\n \r\n );\r\n};\r\n\r\nexport default ActionsRibbonBar;\r\n","import React from 'react';\r\nimport { Modal } from 'antd';\r\nimport './DialogFunction.less';\r\n\r\nimport { ErrorIcon, InfoIcon, SuccessIcon, WarnIcon } from './DialogIcon';\r\n\r\nimport classnames from 'classnames';\r\n\r\nfunction dialogFunction(props) {\r\n const { type, className } = props;\r\n\r\n return Modal.confirm({\r\n ...props,\r\n className: classnames('dialog-modal', className),\r\n icon:\r\n type === 'warn' ? (\r\n \r\n ) : type === 'error' ? (\r\n \r\n ) : type === 'success' ? (\r\n \r\n ) : (\r\n \r\n ),\r\n cancelButtonProps: {\r\n ...props.cancelButtonProps,\r\n className: 'dialog-cancel-button',\r\n },\r\n okButtonProps: { ...props.okButtonProps, className: 'dialog-ok-button' },\r\n });\r\n}\r\ndialogFunction.defaultProps = {\r\n okText: 'OK',\r\n cancelText: 'Cancel',\r\n type: 'info',\r\n};\r\n\r\nexport default dialogFunction;\r\n\r\nexport const customFooterDialogFunction = ({ ...props }) => {\r\n const modal = dialogFunction({\r\n ...props,\r\n className: 'custom-dialog-function',\r\n });\r\n\r\n return modal;\r\n};\r\n\r\nexport const dialogFunctionAsync = (config) => {\r\n const { onOk, onCancel, ...restConfig } = config;\r\n\r\n return new Promise((resolve) => {\r\n dialogFunction({\r\n ...restConfig,\r\n onOk: () => {\r\n resolve({ ok: true });\r\n },\r\n onCancel: () => {\r\n resolve({ ok: false });\r\n },\r\n });\r\n });\r\n};\r\n","import React from 'react';\r\nimport { CloseOutlined } from '@ant-design/icons';\r\nimport './Icon.less';\r\n\r\nconst InfoIcon = () => {\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default InfoIcon;\r\n","import React from 'react';\r\nimport { InfoOutlined } from '@ant-design/icons';\r\nimport './Icon.less';\r\n\r\nconst InfoIcon = () => {\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default InfoIcon;\r\n","import React from 'react';\r\nimport { CheckOutlined } from '@ant-design/icons';\r\nimport './Icon.less';\r\n\r\nconst InfoIcon = () => {\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default InfoIcon;\r\n","import React from 'react';\r\nimport { ExclamationOutlined } from '@ant-design/icons';\r\nimport './Icon.less';\r\n\r\nconst InfoIcon = () => {\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default InfoIcon;\r\n","import React from 'react';\r\nimport DigitalRight from 'assets/DRM.png';\r\nimport { Tooltip } from 'antd';\r\nimport { injectIntl } from 'react-intl';\r\n\r\nconst DigitalRightIcon = (props) => {\r\n const { height, width, size, intl, type, ...restProps } = props;\r\n const iconHeight =\r\n size === 'small'\r\n ? 20\r\n : size === 'normal'\r\n ? 30\r\n : size === 'large'\r\n ? 50\r\n : height;\r\n const iconWidth =\r\n size === 'small'\r\n ? 20\r\n : size === 'normal'\r\n ? 30\r\n : size === 'large'\r\n ? 50\r\n : width;\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n );\r\n};\r\nexport default injectIntl(DigitalRightIcon);\r\n","import React, { useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport classnames from 'classnames';\r\n\r\nconst DropWrap = (props) => {\r\n const {\r\n children,\r\n onDropData,\r\n dropClassName = '',\r\n className,\r\n ...rest\r\n } = props;\r\n const [isDraggingOver, setIsDraggingOver] = useState(false);\r\n\r\n const onDrop = (e) => {\r\n const dropData = JSON.parse(e.dataTransfer.getData('dragData'));\r\n setIsDraggingOver(false);\r\n onDropData && onDropData(dropData);\r\n };\r\n\r\n const onDragOver = (e) => {\r\n e.preventDefault();\r\n setIsDraggingOver(true);\r\n };\r\n\r\n const onDragLeave = (e) => {\r\n setIsDraggingOver(false);\r\n };\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n\r\nDropWrap.propTypes = {\r\n style: PropTypes.object,\r\n children: PropTypes.oneOfType([\r\n PropTypes.node,\r\n PropTypes.arrayOf(PropTypes.node),\r\n ]),\r\n handleDropData: PropTypes.func,\r\n dropClassName: PropTypes.string,\r\n};\r\n\r\nexport default DropWrap;\r\n","import React from 'react';\r\n\r\nimport { Image, Typography, Tree } from 'antd';\r\n\r\nimport { useControllableState } from 'hooks/useControllableState';\r\n\r\nimport './FolderTree.less';\r\n\r\nconst noop = () => {};\r\n\r\nexport const FolderTree = (props) => {\r\n const {\r\n treeData,\r\n expandedKeys: expandedKeysProp,\r\n onExpandedChange = noop,\r\n selectedItem: selectedItemProp,\r\n onSelectedChange = noop,\r\n onLoadData = () => new Promise((resolve) => resolve()),\r\n ...rest\r\n } = props;\r\n\r\n const [expandedKeys, setExpandedKeys] = useControllableState({\r\n defaultProp: [],\r\n prop: expandedKeysProp,\r\n onChange: onExpandedChange,\r\n });\r\n\r\n const [{ selectedKeys }, setSelectedItem] = useControllableState({\r\n defaultProp: {},\r\n prop: selectedItemProp,\r\n onChange: onSelectedChange,\r\n });\r\n\r\n const onExpandItem = (expandedKeys) => {\r\n setExpandedKeys(expandedKeys);\r\n };\r\n\r\n const onSelectItem = (selectedKeys, info) => {\r\n setSelectedItem({ selectedKeys, info });\r\n };\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport const TitleFolder = ({ title, style, ...rest }) => {\r\n return (\r\n \r\n {title}\r\n \r\n );\r\n};\r\n\r\nexport const IconAsset = ({ src, preview, ...rest }) => {\r\n return ;\r\n};\r\n\r\nexport const IconFileAsset = (props) => {\r\n return ;\r\n};\r\n\r\nexport const IconFolderAsset = (props) => {\r\n return ;\r\n};\r\n\r\nexport const TreeFiles = (props) => {\r\n return ;\r\n};\r\n\r\nexport const NodeTree = ({ title, children, style, id, ...rest }) => {\r\n return (\r\n \r\n \r\n {children}\r\n \r\n );\r\n};\r\n","import { useCallback, useEffect, useState } from 'react';\r\n\r\nimport { CustomNotification } from 'common/components';\r\n\r\nimport { useAsync, useCallbackRef, useControllableState } from 'hooks';\r\n\r\nimport { getFolderList, getItemsOfFolder } from 'services/new-folder';\r\nimport { getFolderOwnByUser, getFolderShortDetail } from 'services/folder';\r\n\r\nimport {\r\n buildHierarchyTreeFolder,\r\n getHierarchyExpandedKeys,\r\n getNodeTreeData,\r\n mappingFolderToTreeData,\r\n updateTreeData,\r\n findNodeTreeById,\r\n} from './utils';\r\n\r\nimport { sleep } from 'utils/delay';\r\nimport { toUniqueList } from 'utils';\r\nimport { sortFolderToTop } from 'pages/folders/shared/utils';\r\n\r\nexport const filterParams = {\r\n folder: [\r\n {\r\n fieldName: 'type',\r\n filterType: 'Equal',\r\n value: 'folder', //\r\n },\r\n ],\r\n all: [],\r\n};\r\n\r\nconst defaultFolderParam = {\r\n isAllowViewDetail: false,\r\n};\r\n\r\nconst defaultFileParam = {\r\n isAllowViewDetail: false,\r\n};\r\n\r\nexport const useGetFolderTreeData = (params) => {\r\n const {\r\n defaultTreeProp = [],\r\n defaultSelectedItem = {},\r\n defaultExpandedKeys = [],\r\n pageIndex = 1,\r\n pageSize = 20,\r\n filterType = 'all',\r\n folderParam = defaultFolderParam,\r\n fileParam = defaultFileParam,\r\n navigatedIdFolder,\r\n } = params;\r\n const { folderDetail } = useGetFolderDetail({\r\n folderId: navigatedIdFolder,\r\n isLoadContent: false,\r\n });\r\n\r\n const { hierarchy, level } = folderDetail;\r\n const isRoot = level === 1;\r\n\r\n const [statusGenerateTree, setStatusGenerateTree] = useState('idle');\r\n const [treeData, setTreeData] = useControllableState({\r\n defaultProp: defaultTreeProp,\r\n });\r\n const [expandedKeys, setExpandedKeys] = useControllableState({\r\n defaultProp: defaultExpandedKeys,\r\n });\r\n const [loadedKeys, setLoadedKeys] = useState([]);\r\n const [selectedItem, setSelectedItem] = useControllableState({\r\n defaultProp: defaultSelectedItem,\r\n });\r\n\r\n const handleUpdateTreeData = useCallback(\r\n (data) => setTreeData(data),\r\n [setTreeData]\r\n );\r\n\r\n const handleUpdateExpandedKeys = useCallback(\r\n (keys) => setExpandedKeys(keys),\r\n [setExpandedKeys]\r\n );\r\n\r\n const handleSelectNodeById = useCallbackRef((id) => {\r\n const foundNode = findNodeTreeById(treeData, id);\r\n\r\n if (!foundNode) return false; //* 4641: cannot found nested folder, so return result to rebuild tree\r\n\r\n setSelectedItem({\r\n selectedKeys: [foundNode.key],\r\n selectedFolder: foundNode.data,\r\n });\r\n setExpandedKeys(expandedKeys.concat([foundNode.key]));\r\n\r\n return foundNode;\r\n });\r\n\r\n const handleUpdateSelectedItem = useCallbackRef((item) => {\r\n const wasClickOnSameItem = selectedItem?.selectedKeys?.includes(\r\n item?.info?.node?.key\r\n );\r\n\r\n const isFolderType =\r\n item?.info?.node?.data?.type?.toLowerCase() === 'folder';\r\n\r\n if (wasClickOnSameItem) return;\r\n\r\n setSelectedItem({\r\n selectedKeys: item?.selectedKeys,\r\n selectedFolder: item?.info?.node?.data,\r\n });\r\n\r\n isFolderType &&\r\n setExpandedKeys(toUniqueList(expandedKeys.concat(item.selectedKeys)));\r\n });\r\n\r\n const handleUpdateLoadedKeys = useCallback(\r\n (keys) =>\r\n setLoadedKeys((prevVal) => {\r\n if (prevVal?.includes(keys)) {\r\n return prevVal;\r\n }\r\n return prevVal?.concat(keys);\r\n }),\r\n [setLoadedKeys]\r\n );\r\n\r\n const handleBuildRootTree = useCallbackRef(() => {\r\n const rootNode = getNodeTreeData({\r\n node: { ...folderDetail, type: 'folder' }, // folder doesn't have type value !!!\r\n folderParam,\r\n fileParam,\r\n });\r\n setExpandedKeys([rootNode.key]);\r\n setStatusGenerateTree('success');\r\n setSelectedItem({\r\n selectedKeys: [rootNode?.key],\r\n selectedFolder: rootNode?.data,\r\n });\r\n handleUpdateTreeData([rootNode]);\r\n });\r\n\r\n const handleBuildHierarchyTree = useCallbackRef(async (hierarchyId) => {\r\n const listIds = hierarchyId.split('/').filter(Boolean); //\r\n\r\n setStatusGenerateTree('loading');\r\n\r\n try {\r\n const hierarchyTreeData = await buildHierarchyTreeFolder({\r\n listIds,\r\n folderParam,\r\n fileParam,\r\n filterType,\r\n });\r\n const foundNode = findNodeTreeById(hierarchyTreeData, navigatedIdFolder);\r\n\r\n const expandedKeys = getHierarchyExpandedKeys(\r\n hierarchyTreeData,\r\n listIds.map((id) => parseInt(id))\r\n );\r\n\r\n setExpandedKeys(expandedKeys);\r\n setLoadedKeys(expandedKeys);\r\n setSelectedItem({\r\n selectedKeys: [foundNode?.key],\r\n selectedFolder: foundNode?.data,\r\n });\r\n setStatusGenerateTree('success');\r\n handleUpdateTreeData(hierarchyTreeData);\r\n\r\n return {\r\n foundNode,\r\n hierarchyTreeData,\r\n };\r\n } catch (error) {\r\n setStatusGenerateTree('error');\r\n handleUpdateTreeData([]);\r\n }\r\n });\r\n\r\n useEffect(() => {\r\n if (isRoot) {\r\n handleBuildRootTree();\r\n return;\r\n }\r\n\r\n //* build tree from subfolder\r\n if (hierarchy) {\r\n // hierarchy is parent path\r\n const fullHierarchyId = `${hierarchy}/${navigatedIdFolder}`;\r\n handleBuildHierarchyTree(fullHierarchyId);\r\n }\r\n }, [\r\n isRoot,\r\n hierarchy,\r\n handleBuildHierarchyTree,\r\n handleBuildRootTree,\r\n navigatedIdFolder,\r\n ]);\r\n\r\n // Need to catch error, this function is using pageSize, pageIndex as params. Wrap this function with useCallbackRef ???\r\n const handleLoadMoreFolder = async ({ key, children, data }) => {\r\n if (loadedKeys.includes(key)) return;\r\n\r\n const { id: folderId } = data;\r\n\r\n const params = {\r\n folderId,\r\n pageIndex, // change later\r\n pageSize, // change later\r\n filters: filterParams[filterType],\r\n sort: [\r\n {\r\n fieldName: 'id',\r\n isAscending: false,\r\n },\r\n ], // new first,\r\n };\r\n\r\n const response = await getItemsOfFolder(params);\r\n\r\n return new Promise(async (resolve) => {\r\n if (children || response === null) {\r\n resolve();\r\n return;\r\n }\r\n\r\n const sortedData = response?.data?.gridData?.sort(sortFolderToTop);\r\n\r\n const mappedTreeData = mappingFolderToTreeData(\r\n sortedData,\r\n folderParam,\r\n fileParam\r\n );\r\n\r\n await sleep(500); // sleep a little bit to update tree (get idea from antd :))\r\n setTreeData((prevTreeData) =>\r\n updateTreeData(prevTreeData, key, mappedTreeData)\r\n );\r\n resolve();\r\n });\r\n };\r\n\r\n const handleSetStatusTree = (status) => {\r\n setStatusGenerateTree(status);\r\n };\r\n\r\n const handleSelectDeepNestedFolder = (folder) => {\r\n const folderId = folder?.type?.toLowerCase() === 'folder' && folder?.id;\r\n\r\n if (!folderId) return;\r\n\r\n const foundTreeNode = handleSelectNodeById(folderId);\r\n\r\n if (!foundTreeNode) rebuildTreeToSelectFolder(folder);\r\n };\r\n\r\n const rebuildTreeToSelectFolder = async (selectedFolder) => {\r\n if (!selectedFolder) return;\r\n\r\n const buildingHierarchy = `${selectedFolder.hierarchy}/${selectedFolder.id}`;\r\n\r\n const { foundNode } = await handleBuildHierarchyTree(buildingHierarchy);\r\n\r\n if (!foundNode) return;\r\n\r\n //* if foundNode mean building succeed\r\n await sleep(1); //* make sure state updated\r\n handleSelectNodeById(selectedFolder.id);\r\n };\r\n\r\n return {\r\n isLoadingTree:\r\n statusGenerateTree === 'idle' || statusGenerateTree === 'loading',\r\n treeData,\r\n expandedKeys,\r\n loadedKeys,\r\n selectedItem,\r\n handleSelectNodeById,\r\n handleUpdateSelectedItem,\r\n handleUpdateTreeData,\r\n handleLoadMoreFolder,\r\n handleUpdateExpandedKeys,\r\n handleUpdateLoadedKeys,\r\n handleSetStatusTree,\r\n handleBuildHierarchyTree,\r\n handleSelectDeepNestedFolder,\r\n };\r\n};\r\n\r\nexport const useGetAllFolderGrid = ({ isEnabled, onResetParentId }) => {\r\n const { data: initialData, run, status, setData } = useAsync();\r\n\r\n const [fetchMoreFolderLoading, setFetchMoreFolderLoading] = useState(false);\r\n\r\n const handleCacheListFolder = (key, data) => {\r\n setData({\r\n ...initialData,\r\n [key]: data,\r\n });\r\n };\r\n\r\n const getGridFolder = () => {\r\n //? need to improve: use load on scroll for better performance\r\n const params = {\r\n folderId: null,\r\n pageIndex: 1,\r\n pageSize: 9999,\r\n filters: [\r\n {\r\n fieldName: 'isOwner',\r\n filterType: 'equal',\r\n value: true,\r\n },\r\n ],\r\n sort: [\r\n {\r\n fieldName: 'id',\r\n isAscending: false,\r\n },\r\n ],\r\n };\r\n\r\n run(getFolderList(params));\r\n };\r\n\r\n const handleSearchFolder = async (searchText) => {\r\n onResetParentId?.();\r\n handleCacheListFolder('home', []);\r\n\r\n if (!searchText) {\r\n getGridFolder();\r\n return;\r\n }\r\n\r\n try {\r\n const { data, isSuccess } = await getFolderOwnByUser({\r\n Search: searchText,\r\n });\r\n if (isSuccess) {\r\n handleCacheListFolder('home', data?.folderList);\r\n }\r\n } catch (error) {\r\n CustomNotification.error(error?.message ?? 'Folder is not found');\r\n }\r\n };\r\n\r\n const handleFetchMoreFolder = async (folderId) => {\r\n const params = {\r\n folderId,\r\n pageIndex: 1, // change later\r\n pageSize: 9999, // change later\r\n filters: [\r\n {\r\n fieldName: 'isOwner',\r\n filterType: 'equal',\r\n value: true,\r\n },\r\n {\r\n fieldName: 'type',\r\n filterType: 'equal',\r\n value: 'folder',\r\n },\r\n ],\r\n sort: [\r\n {\r\n fieldName: 'id',\r\n isAscending: false,\r\n },\r\n ],\r\n };\r\n try {\r\n setFetchMoreFolderLoading(true);\r\n const { isSuccess, data, message } =\r\n (await getItemsOfFolder(params)) ?? {};\r\n if (isSuccess) {\r\n handleCacheListFolder(folderId, data?.gridData);\r\n } else {\r\n CustomNotification.error(message ?? 'Folder is not found');\r\n }\r\n } catch (error) {\r\n CustomNotification.error(error?.message ?? 'Folder is not found');\r\n }\r\n\r\n setFetchMoreFolderLoading(false);\r\n };\r\n useEffect(() => {\r\n if (isEnabled) {\r\n getGridFolder();\r\n }\r\n }, [run, isEnabled]);\r\n\r\n useEffect(() => {\r\n if (!initialData?.['home'] && initialData?.gridData)\r\n setData({\r\n home: initialData?.gridData ?? [],\r\n });\r\n }, [JSON.stringify(initialData)]);\r\n\r\n return {\r\n isLoading: status === 'pending' || fetchMoreFolderLoading,\r\n folderData: initialData,\r\n getGridFolder,\r\n handleSearchFolder,\r\n handleFetchMoreFolder,\r\n };\r\n};\r\n\r\nexport const useGetFolderDetail = ({ folderId, isLoadContent = false }) => {\r\n const { data, run } = useAsync();\r\n\r\n useEffect(() => {\r\n if (folderId) {\r\n run(\r\n getFolderShortDetail({\r\n id: folderId,\r\n IsLoadContent: isLoadContent,\r\n })\r\n );\r\n }\r\n }, [folderId, run]);\r\n\r\n return {\r\n folderDetail: data ?? {},\r\n };\r\n};\r\n","import React from 'react';\r\n\r\nimport {\r\n Breadcrumb,\r\n Typography,\r\n Popover,\r\n Row,\r\n Col,\r\n Button,\r\n Tooltip,\r\n} from 'antd';\r\n\r\nimport { EllipsisOutlined, HomeTwoTone } from '@ant-design/icons';\r\n\r\nimport './FolderTree.less';\r\n\r\n/*\r\n Will support limit items based on container later\r\n*/\r\nexport const FolderBreadcrumb = (props) => {\r\n const { items, onClick: onClickBreadcrumb, maxItems, ...rest } = props;\r\n\r\n const isLimited = Boolean(maxItems) && items.length > maxItems;\r\n\r\n const onClick = (breadcrumb) => {\r\n onClickBreadcrumb && onClickBreadcrumb(breadcrumb?.id, items);\r\n };\r\n\r\n if (isLimited) {\r\n const { overflowBreadcrumbs, otherBreadcrumbs } = separateBreadcrumbs(\r\n items,\r\n maxItems\r\n );\r\n\r\n const content = () => (\r\n \r\n {overflowBreadcrumbs.map((breadcrumb) => (\r\n {\r\n onClick(breadcrumb);\r\n }}\r\n >\r\n {breadcrumb?.folderName}\r\n \r\n ))}\r\n \r\n );\r\n\r\n return (\r\n \r\n \r\n
\r\n \r\n }\r\n />\r\n \r\n / \r\n
\r\n \r\n \r\n \r\n {otherBreadcrumbs.map((breadcrumb) => (\r\n {\r\n onClick(breadcrumb);\r\n }}\r\n >\r\n \r\n {breadcrumb?.folderName}\r\n \r\n \r\n ))}\r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n return (\r\n \r\n {items.map((breadcrumb) => (\r\n {\r\n onClick(breadcrumb);\r\n }}\r\n >\r\n \r\n \r\n {breadcrumb?.id === 'home' ? (\r\n \r\n ) : (\r\n breadcrumb?.folderName\r\n )}\r\n \r\n \r\n \r\n ))}\r\n \r\n );\r\n};\r\n\r\nexport const FolderOverflowBreadcrumb = ({ children, ...rest }) => {\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n\r\nconst separateBreadcrumbs = (items, maxItems) => {\r\n const countOfItems = items.length;\r\n\r\n return {\r\n overflowBreadcrumbs: items.slice(0, countOfItems - maxItems),\r\n otherBreadcrumbs: items.slice(countOfItems - maxItems),\r\n };\r\n};\r\n\r\nexport default FolderBreadcrumb;\r\n","import React, { useRef, memo } from 'react';\r\n\r\nimport { Row, Avatar, Col, Typography, Divider } from 'antd';\r\nimport classnames from 'classnames';\r\n\r\nimport { RightOutlined } from '@ant-design/icons';\r\nimport EmptyFolder from 'assets/folder/empty-folder.png';\r\nimport hasItemsFolder from 'assets/folder/folder.png';\r\n\r\nimport DropWrap from '../drapDropWrap/drap-and-drop/DropWrap';\r\n\r\nimport useDoubleClick from 'hooks/useDoubleClick';\r\n\r\nimport { formatMDY } from 'utils/formatDate';\r\n\r\nexport const FolderItemContainer = (props) => {\r\n const ref = useRef();\r\n\r\n const { onClick, children, onDoubleClick, ...rest } = props;\r\n\r\n useDoubleClick({\r\n onSingleClick: (event) => {\r\n onClick?.(event);\r\n },\r\n onDoubleClick: () => onDoubleClick?.(),\r\n ref,\r\n latency: 200,\r\n });\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n\r\n// Edit component for complex info\r\nexport const FolderInfo = (props) => {\r\n const { title, style, dateCreated, children, ...rest } = props;\r\n return (\r\n \r\n \r\n \r\n {title}\r\n \r\n \r\n {children}\r\n
\r\n );\r\n};\r\n\r\nexport const FolderIcon = ({ src, style, ...rest }) => {\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport const FolderAction = (props) => {\r\n return (\r\n
\r\n \r\n
\r\n );\r\n};\r\n\r\nexport const FolderItem = memo((props) => {\r\n const {\r\n item,\r\n onExpand,\r\n onDrop,\r\n handleSelectFolder,\r\n selectedFolderId,\r\n disableItemHandler,\r\n } = props;\r\n const { id, subFolderCount, dateCreated, folderName, description } =\r\n item ?? {};\r\n\r\n const folderSrc = subFolderCount > 0 ? hasItemsFolder : EmptyFolder;\r\n const title = folderName ?? description ?? '';\r\n\r\n const disabled = disableItemHandler ? disableItemHandler(item) : false;\r\n\r\n return (\r\n {\r\n if (item?.subFolderCount) onExpand(item, title);\r\n }}\r\n onClick={() => handleSelectFolder(item)}\r\n >\r\n onDrop(dropData, item)}\r\n >\r\n \r\n \r\n \r\n \r\n Date created: {formatMDY(dateCreated)}\r\n \r\n \r\n \r\n \r\n {item?.subFolderCount ? (\r\n onExpand(item, title)} />\r\n ) : null}\r\n \r\n \r\n \r\n \r\n );\r\n});\r\n","import React from 'react';\r\n\r\nimport { FolderItem } from './FolderItem';\r\n\r\nexport const FolderList = (props) => {\r\n const {\r\n onExpand,\r\n folderData,\r\n handleDropItem,\r\n selectedFolderId,\r\n onSelectFolder,\r\n disableItemHandler,\r\n } = props;\r\n\r\n const handleSelectFolder = (currentFolder) => {\r\n onSelectFolder && onSelectFolder(currentFolder);\r\n };\r\n\r\n const onDrop = (dropData, folder) => {\r\n if (!dropData) return;\r\n\r\n handleDropItem && handleDropItem(dropData, folder);\r\n };\r\n\r\n return (\r\n
\r\n {folderData.map((item) => {\r\n const itemProps = {\r\n item,\r\n onExpand,\r\n onDrop,\r\n handleSelectFolder,\r\n selectedFolderId,\r\n disableItemHandler,\r\n };\r\n\r\n return ;\r\n })}\r\n
\r\n );\r\n};\r\n\r\nexport default FolderList;\r\n","import React, { useState, forwardRef, useImperativeHandle } from 'react';\r\nimport { Input, Spin, Divider } from 'antd';\r\n\r\nimport { FolderList } from './FolderList';\r\nimport { FolderBreadcrumb } from './FolderBreadcrumb';\r\nimport DropWrap from '../drapDropWrap/drap-and-drop/DropWrap';\r\n\r\nimport { useGetAllFolderGrid } from './hooks';\r\nimport './FolderSelector.less';\r\n\r\nconst DEFAULT_KEY_FOLDER = [{ id: 'home', folderName: 'Home' }];\r\n\r\nexport const FolderSelector = forwardRef((props, ref) => {\r\n const { onDrop, onExpandFolder, onBreadcrumbChange, disableItemHandler } =\r\n props;\r\n\r\n const [keyFolder, setKeyFolder] = useState(DEFAULT_KEY_FOLDER);\r\n const [currentFolderId, setCurrentFolderId] = useState();\r\n const [selectedFolder, setSelectedFolder] = useState();\r\n\r\n const {\r\n folderData,\r\n isLoading,\r\n getGridFolder,\r\n handleSearchFolder,\r\n handleFetchMoreFolder,\r\n } = useGetAllFolderGrid({\r\n isEnabled: true,\r\n onResetParentId: () => setCurrentFolderId(null),\r\n });\r\n\r\n useImperativeHandle(\r\n ref,\r\n () => {\r\n return {\r\n reloadList: (id) => {\r\n id ? handleFetchMoreFolder(id) : getGridFolder();\r\n },\r\n };\r\n },\r\n []\r\n );\r\n\r\n const onSearch = (searchText) => {\r\n setKeyFolder(DEFAULT_KEY_FOLDER);\r\n handleSearchFolder(searchText);\r\n };\r\n\r\n const onSelectFolder = (currentFolder) => {\r\n const breadcrumbSelected = keyFolder[keyFolder?.length - 1];\r\n\r\n const newSelectedFolder =\r\n selectedFolder?.id === currentFolder?.id\r\n ? breadcrumbSelected\r\n : currentFolder;\r\n\r\n setSelectedFolder(newSelectedFolder);\r\n props?.onSelectFolder?.(newSelectedFolder);\r\n };\r\n\r\n const handleBreadcrumb = (valueSelected, hierarchyList) => {\r\n const folderId = valueSelected !== 'home' ? valueSelected : null;\r\n\r\n setCurrentFolderId(folderId);\r\n setSelectedFolder(null);\r\n setKeyFolder((pre) => {\r\n const indexBreadcrumb = keyFolder\r\n .map((item) => item?.id)\r\n .indexOf(valueSelected);\r\n return pre.slice(0, indexBreadcrumb + 1);\r\n });\r\n\r\n const breadcrumbSelected = keyFolder?.filter(\r\n (item) => valueSelected === item?.id\r\n );\r\n\r\n onBreadcrumbChange &&\r\n onBreadcrumbChange(folderId, hierarchyList, breadcrumbSelected?.[0]);\r\n };\r\n\r\n const handleExpand = (folder, folderName) => {\r\n setCurrentFolderId(folder?.id);\r\n setSelectedFolder(null);\r\n handleFetchMoreFolder(folder?.id);\r\n setKeyFolder((pre) => [...pre, { id: folder?.id, folderName }]);\r\n\r\n onExpandFolder && onExpandFolder(folder);\r\n };\r\n\r\n const breadcrumbKey = currentFolderId ? currentFolderId : 'home';\r\n const breadcrumbData = folderData?.[breadcrumbKey] ?? [];\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n onDrop && onDrop(dropData, keyFolder[keyFolder.length - 1])\r\n }\r\n />\r\n \r\n \r\n );\r\n});\r\n\r\nexport default FolderSelector;\r\n","import { v4 as uuidv4 } from 'uuid';\r\n\r\nimport { IconFolderAsset, NodeTree } from './FolderTree';\r\n\r\nimport folderIcon from 'assets/folder/folder.png';\r\n\r\nimport { entityTypeIcon } from 'utils/entityTypeIcon';\r\nimport { sortFolderToTop } from 'pages/folders/shared/utils';\r\n\r\nimport { getItemsOfFolder } from 'services/new-folder';\r\nimport { getFolderShortDetail } from 'services/folder';\r\n\r\nexport const filterParams = {\r\n folder: [\r\n {\r\n fieldName: 'type',\r\n filterType: 'Equal',\r\n value: 'folder', //\r\n },\r\n ],\r\n all: [],\r\n};\r\n\r\nconst getUuidKey = () => uuidv4();\r\n\r\nexport const handleOpenDetailItem = (type, id) => {\r\n const openInNewTab = (url) => {\r\n window.open(url).focus();\r\n };\r\n\r\n switch (type.toLowerCase()) {\r\n case 'folder':\r\n return openInNewTab(`/folder/${id}`);\r\n\r\n case 'product':\r\n return openInNewTab(`/product/${id}`);\r\n\r\n case 'asset':\r\n return openInNewTab(`/asset/${id}`);\r\n\r\n case 'member':\r\n return openInNewTab(`/company/${id}`);\r\n\r\n case 'reporting':\r\n return openInNewTab(`/reporting/${id}`);\r\n\r\n case 'query':\r\n return openInNewTab(`/execute-query/${id}`);\r\n\r\n default:\r\n return null;\r\n }\r\n};\r\n\r\nexport const getNodeTreeData = ({ node, folderParam = {}, fileParam = {} }) => {\r\n if (node.type.toLowerCase() === 'folder') {\r\n const { renderFolder = () => {} } = folderParam;\r\n return {\r\n key: getUuidKey(),\r\n title: ,\r\n icon: ,\r\n data: node,\r\n selectable: true,\r\n checkable: false,\r\n ...renderFolder(node),\r\n };\r\n }\r\n\r\n const { renderFile = () => {} } = fileParam;\r\n return {\r\n key: getUuidKey(),\r\n title: ,\r\n icon: entityTypeIcon(node.type.toLowerCase()),\r\n data: node,\r\n selectable: true,\r\n checkable: false,\r\n isLeaf: true,\r\n ...renderFile(node),\r\n };\r\n};\r\n\r\nexport const updateTreeData = (list, key, children) => {\r\n return list.map((node) => {\r\n if (node.key === key) {\r\n return { ...node, children };\r\n }\r\n\r\n if (node.children) {\r\n return {\r\n ...node,\r\n children: updateTreeData(node.children, key, children),\r\n };\r\n }\r\n\r\n return node;\r\n });\r\n};\r\n\r\nexport const mappingFolderToTreeData = (folders, folderParam, fileParam) => {\r\n let treeData = [];\r\n\r\n folders.forEach((item) => {\r\n if (item.type.toLowerCase() === 'folder') {\r\n let node = getNodeTreeData({ node: item, folderParam, fileParam });\r\n treeData.push(node);\r\n } else {\r\n let node = getNodeTreeData({ node: item, folderParam, fileParam });\r\n treeData.push(node);\r\n }\r\n });\r\n\r\n return treeData;\r\n};\r\n\r\nexport const fetchChildNodeFolder = async (params) => {\r\n const response = await getItemsOfFolder(params);\r\n if (response?.isSuccess) {\r\n if (response?.data?.gridData) {\r\n return response?.data?.gridData;\r\n }\r\n }\r\n return null;\r\n};\r\n\r\nconst getExpandedNodeData = async ({\r\n folderId,\r\n folderParam,\r\n filterType = 'folder',\r\n}) => {\r\n const items = await fetchChildNodeFolder({\r\n folderId,\r\n pageIndex: 1, // change later\r\n pageSize: 9999, // change later\r\n filters: filterParams[filterType],\r\n sort: [\r\n {\r\n fieldName: 'id',\r\n isAscending: false,\r\n },\r\n ], // new first,\r\n });\r\n if (items) {\r\n const sortedItems = items.sort(sortFolderToTop);\r\n return mappingFolderToTreeData(sortedItems, folderParam);\r\n }\r\n\r\n return [];\r\n};\r\n\r\nexport const generateListChildNode = async ({\r\n childNode,\r\n childIds,\r\n folderParam,\r\n filterType,\r\n}) => {\r\n let result = [];\r\n\r\n for (const node of childNode) {\r\n const { id } = node.data;\r\n\r\n if (childIds.includes(parseInt(id))) {\r\n const respContent = await getExpandedNodeData({\r\n folderId: id,\r\n folderParam,\r\n filterType,\r\n });\r\n\r\n const newNode = {\r\n ...node,\r\n children: await generateListChildNode({\r\n childNode: respContent,\r\n childIds: childIds.slice(1),\r\n folderParam,\r\n filterType,\r\n }),\r\n };\r\n result.push(newNode);\r\n } else {\r\n result.push(node);\r\n }\r\n }\r\n\r\n return result;\r\n};\r\n\r\nexport const buildHierarchyTreeFolder = async ({\r\n listIds,\r\n folderParam,\r\n filterType,\r\n}) => {\r\n const [rootFolderId, ...childIds] = listIds;\r\n\r\n /* Need to check error in here, sometimes one of two responses is fail.\r\n Show error and back to grid folder??\r\n Use Promise.allSettle instead of using Promise.all to don't crash system\r\n */\r\n const [rootFolderDetailResp, rootContentFolderResp] = await Promise.all([\r\n getFolderShortDetail({\r\n id: rootFolderId,\r\n IsLoadContent: false,\r\n }),\r\n getExpandedNodeData({ folderId: rootFolderId, folderParam, filterType }),\r\n ]);\r\n\r\n const hierarchyNodes = await generateListChildNode({\r\n childNode: rootContentFolderResp,\r\n childIds: childIds.map((id) => parseInt(id)),\r\n folderParam,\r\n filterType,\r\n });\r\n\r\n let parentNode = {\r\n ...getNodeTreeData({\r\n node: { ...rootFolderDetailResp?.data, type: 'folder' }, // folder doesn't have type value !!!\r\n folderParam,\r\n }),\r\n children: hierarchyNodes,\r\n };\r\n\r\n return [parentNode];\r\n};\r\n\r\nexport const getHierarchyExpandedKeys = (children, listIds) => {\r\n let result = [];\r\n\r\n for (const child of children) {\r\n if (listIds.includes(parseInt(child.data.id))) {\r\n result.push(child.key);\r\n }\r\n if (child.children) {\r\n result = result.concat(getHierarchyExpandedKeys(child.children, listIds));\r\n }\r\n }\r\n\r\n return result;\r\n};\r\n\r\nexport const findNodeTreeById = (treeData = [], id) => {\r\n for (let i = 0; i < treeData.length; i++) {\r\n if (parseInt(treeData[i]?.data?.id) === parseInt(id)) {\r\n return treeData[i];\r\n }\r\n if (treeData[i]?.children) {\r\n const result = findNodeTreeById(treeData[i].children, id);\r\n if (result) {\r\n return result;\r\n }\r\n }\r\n }\r\n return null;\r\n};\r\n","import React, { useMemo } from 'react';\r\n\r\nimport { Input, Form, InputNumber, Select, Checkbox, Tooltip } from 'antd';\r\n\r\nimport classnames from 'classnames';\r\n\r\nimport './BasicFormItem.less';\r\n\r\nconst { TextArea } = Input;\r\nconst { Option } = Select;\r\n\r\nconst BasicFormItem = (props) => {\r\n const {\r\n name,\r\n label,\r\n rules = [],\r\n type,\r\n renderInput,\r\n selectProps = {\r\n options: [],\r\n inputProps: {},\r\n },\r\n inputProps = {},\r\n allowEdit = true,\r\n layout,\r\n showTooltip = false,\r\n ...restProps\r\n } = props;\r\n\r\n const newRuleItems = rules?.map((ruleItem = {}) => {\r\n let newRuleItem;\r\n\r\n const { type, message } = ruleItem;\r\n\r\n switch (type) {\r\n default:\r\n newRuleItem = ruleItem;\r\n }\r\n\r\n return newRuleItem;\r\n });\r\n\r\n const renderInputComponent = () => {\r\n if (renderInput) {\r\n return renderInput({ allowEdit, inputProps, name });\r\n }\r\n\r\n if (type === 'numeric') {\r\n return ;\r\n }\r\n\r\n if (type === 'textarea') {\r\n return \r\n );\r\n};\r\n\r\nTextarea.propTypes = {\r\n content: PropTypes.oneOfType([\r\n PropTypes.string,\r\n PropTypes.node,\r\n PropTypes.object,\r\n ]),\r\n minRows: PropTypes.number,\r\n maxRows: PropTypes.number,\r\n};\r\n\r\nTextarea.defaultProps = {\r\n minRows: 8,\r\n maxRows: 8,\r\n};\r\n\r\nexport default Textarea;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport Slider from 'react-slick';\r\nimport 'slick-carousel/slick/slick.css';\r\nimport 'slick-carousel/slick/slick-theme.css';\r\nimport './TextSlickSlider.less';\r\nimport { LeftOutlined, RightOutlined } from '@ant-design/icons';\r\n\r\nfunction SampleNextArrow(props) {\r\n const { className, onClick } = props;\r\n return (\r\n
\r\n \r\n
\r\n );\r\n}\r\n\r\nfunction SamplePrevArrow(props) {\r\n const { className, onClick } = props;\r\n return (\r\n
\r\n \r\n
\r\n );\r\n}\r\n\r\nexport default function SlickSlider(props) {\r\n const settings = {\r\n className: 'center',\r\n infinite: true,\r\n centerPadding: '0',\r\n slidesToShow: 2,\r\n speed: 500,\r\n dots: true,\r\n nextArrow: ,\r\n prevArrow: ,\r\n };\r\n const { children } = props;\r\n return (\r\n
\r\n {children}\r\n
\r\n );\r\n}\r\nSlickSlider.propTypes = {\r\n children: PropTypes.array.isRequired,\r\n};\r\n","import React, {\r\n useState,\r\n useCallback,\r\n useImperativeHandle,\r\n forwardRef,\r\n} from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { Typography, Button, Col, Row } from 'antd';\r\nimport { EditOutlined } from '@ant-design/icons';\r\nimport classnames from 'classnames';\r\nimport { FormCancelButton } from 'common/components';\r\n\r\nimport './WithAggridHeaderEdit.less';\r\n\r\nconst { Title } = Typography;\r\n\r\nconst WithAggridHeaderEdit = (props, ref) => {\r\n const {\r\n title,\r\n children,\r\n show = false,\r\n buttons,\r\n extraButtons,\r\n allowEdit = true,\r\n } = props;\r\n\r\n const [showEdit, setShowEdit] = useState(show);\r\n const [isEdit, setIsEdit] = useState(false);\r\n\r\n const onMouseEnter = () => {\r\n !show && setShowEdit(true);\r\n };\r\n\r\n const onMouseLeave = () => {\r\n !show && setShowEdit(false);\r\n };\r\n\r\n const toggleEditMode = useCallback(() => {\r\n setIsEdit((prev) => !prev);\r\n }, []);\r\n\r\n useImperativeHandle(ref, () => ({\r\n changeEditMode: (editMode) => {\r\n setIsEdit(editMode);\r\n },\r\n getEditMode: () => isEdit,\r\n }));\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n {title || 'Unknown'}\r\n \r\n \r\n \r\n {isEdit && (\r\n <>\r\n {buttons?.map((buttonItem, idx) => (\r\n {buttonItem}\r\n ))}\r\n \r\n )}\r\n \r\n {showEdit && !isEdit && allowEdit && (\r\n }\r\n onClick={toggleEditMode}\r\n />\r\n )}\r\n {isEdit && (\r\n \r\n )}\r\n \r\n {extraButtons?.map((buttonItem, idx) => (\r\n {buttonItem}\r\n ))}\r\n \r\n \r\n {children && children}\r\n \r\n
\r\n );\r\n};\r\n\r\nWithAggridHeaderEdit.propsTypes = {\r\n title: PropTypes.string,\r\n children: PropTypes.object,\r\n show: PropTypes.bool,\r\n buttons: PropTypes.arrayOf(PropTypes.object),\r\n extraButtons: PropTypes.arrayOf(PropTypes.object),\r\n allowEdit: PropTypes.bool,\r\n};\r\n\r\nexport default forwardRef(WithAggridHeaderEdit);\r\n","/*\r\n * Common Messages\r\n *\r\n * This contains all the text for the common component.\r\n */\r\nimport { defineMessages } from 'react-intl';\r\n\r\nexport const scope = 'Taco.common.components.ag-grid';\r\n\r\nexport default defineMessages({\r\n btnAdd: {\r\n id: `${scope}.components.agGridEditHeader.btn.add`,\r\n defaultMessage: 'Add',\r\n },\r\n btnEdit: {\r\n id: `${scope}.components.agGridEditHeader.btn.edit`,\r\n defaultMessage: 'Edit',\r\n },\r\n btnCancel: {\r\n id: `${scope}.components.agGridEditHeader.btn.cancel`,\r\n defaultMessage: 'Cancel',\r\n },\r\n btnDelete: {\r\n id: `${scope}.components.agGridEditHeader.btn.delete`,\r\n defaultMessage: 'Delete',\r\n },\r\n btnResetPassword: {\r\n id: `${scope}.components.agGridEditHeader.btn.resetPassword`,\r\n defaultMessage: ' Reset Password',\r\n },\r\n chooseDownloadFileType: {\r\n id: `${scope}.components.agGridEditHeader.btn.chooseDownloadOptions`,\r\n defaultMessage: ' Choose file type',\r\n },\r\n});\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { Menu } from 'antd';\r\n\r\nimport { WithLoading } from 'common/components';\r\n\r\nimport { useIntl } from 'react-intl';\r\nimport Messages from 'i18n/messages/message-ag-grid';\r\n\r\nimport './AgGridDownloadOptions.less';\r\n\r\nconst AgGridDownloadOptions = (props) => {\r\n const intl = useIntl();\r\n const { handleDownload, loading } = props;\r\n\r\n return (\r\n \r\n {\r\n //* send file type to parent component\r\n handleDownload && handleDownload(key);\r\n }}\r\n style={{ width: 180 }}\r\n >\r\n \r\n XLSX\r\n XLS\r\n CSV\r\n XML \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nAgGridDownloadOptions.defaultProps = {\r\n loading: false,\r\n};\r\n\r\nAgGridDownloadOptions.propType = {\r\n loading: PropTypes.bool,\r\n handleDownload: PropTypes.func,\r\n};\r\n\r\nexport default AgGridDownloadOptions;\r\n","import { defineMessages } from 'react-intl';\r\n\r\nexport const scope = 'Taco.logo-assets';\r\n\r\nexport default defineMessages({\r\n okBtn: {\r\n id: `${scope}.modal.okBtn`,\r\n defaultMessage: 'Select',\r\n },\r\n errorMessage: {\r\n id: `${scope}.list.errorMessage`,\r\n defaultMessage: 'Cannot get logo assets.',\r\n },\r\n emptyMessage: {\r\n id: `${scope}.list.emptyMessage`,\r\n defaultMessage: 'Cannot get logo assets.',\r\n },\r\n totalItems: {\r\n id: `${scope}.list.totalItems`,\r\n defaultMessage: 'items found',\r\n },\r\n});\r\n","import React, { useState, useEffect } from 'react';\r\n\r\nimport { Row, Col, Result, Empty, Pagination, Typography } from 'antd';\r\nimport { WithLoading, ThumbnailItem } from '../index';\r\n\r\nimport { useIntl, FormattedMessage } from 'react-intl';\r\nimport Messages from 'i18n/messages/logoAsset';\r\n\r\nimport './LogoAssetGrid.less';\r\n\r\nconst LogoAssetGrid = (props) => {\r\n const intl = useIntl();\r\n\r\n const { visible, getLogoAssetRequest, onSelectLogoAsset, responseParams } =\r\n props;\r\n\r\n //* state\r\n const [loading, setLoading] = useState(false);\r\n const [logoAssetList, setLogoAssetList] = useState(false);\r\n const [error, setError] = useState(false);\r\n const [selectedLogo, setSelectedLogo] = useState(false);\r\n const [pageIndex, setPageIndex] = useState(1);\r\n const [pageSize, setPageSize] = useState(8);\r\n const [total, setTotal] = useState(0);\r\n\r\n //* functions\r\n const getLogoAssetList = () => {\r\n setLoading(true);\r\n\r\n const params = {\r\n pageIndex,\r\n pageSize,\r\n };\r\n\r\n getLogoAssetRequest &&\r\n getLogoAssetRequest(params)\r\n .then((response) => {\r\n let data;\r\n if (responseParams) {\r\n data = response[responseParams];\r\n } else {\r\n data = response;\r\n }\r\n const {\r\n gridData,\r\n paging: { totalRecord },\r\n } = data;\r\n if (gridData) {\r\n setLogoAssetList(gridData);\r\n setTotal(totalRecord);\r\n } else {\r\n getLogoAssetErrorHandler();\r\n }\r\n })\r\n .catch(() => {\r\n getLogoAssetErrorHandler();\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n };\r\n\r\n const getLogoAssetErrorHandler = () => {\r\n setError(true);\r\n };\r\n\r\n const selectLogoAssetItem = (item) => {\r\n if (selectedLogo?.uniqueId !== item?.uniqueId) {\r\n setSelectedLogo(item);\r\n } else {\r\n setSelectedLogo(false);\r\n }\r\n };\r\n\r\n const resetLogoAssetList = () => {\r\n setLogoAssetList(false);\r\n setSelectedLogo(false);\r\n };\r\n\r\n const changePageSizeHandler = (page, pageSize) => {\r\n setPageIndex(page);\r\n setPageSize(pageSize);\r\n };\r\n\r\n //* did update\r\n useEffect(() => {\r\n visible ? getLogoAssetList() : resetLogoAssetList();\r\n }, [visible, pageIndex, pageSize]);\r\n\r\n useEffect(() => {\r\n onSelectLogoAsset &&\r\n onSelectLogoAsset(\r\n selectedLogo?.uniqueId,\r\n selectedLogo?.thumbnail300 ||\r\n selectedLogo?.thumbnail100 ||\r\n selectedLogo?.thumb100 ||\r\n selectedLogo?.url ||\r\n selectedLogo?.fileUrl,\r\n selectedLogo\r\n );\r\n }, [selectedLogo]);\r\n\r\n //* render\r\n const renderLogoAssetList = () => {\r\n const emptyMessage = intl.formatMessage(Messages.emptyMessage);\r\n\r\n if (logoAssetList?.length === 0)\r\n return ;\r\n\r\n return (\r\n logoAssetList &&\r\n logoAssetList.map((asset) => {\r\n const { uniqueId, url } = asset;\r\n const isSelected = selectedLogo.uniqueId === uniqueId;\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n })\r\n );\r\n };\r\n\r\n const errorMessage = intl.formatMessage(Messages.errorMessage);\r\n\r\n const showShowPagination = logoAssetList?.length > 0 && !error;\r\n\r\n return (\r\n \r\n \r\n {error ? (\r\n \r\n ) : (\r\n renderLogoAssetList()\r\n )}\r\n \r\n {showShowPagination ? (\r\n \r\n \r\n \r\n \r\n {total ? total : ''}  \r\n \r\n \r\n \r\n \r\n ) : null}\r\n \r\n );\r\n};\r\n\r\nexport default LogoAssetGrid;\r\n","import React, { useState, useEffect } from 'react';\r\n\r\nimport { Tabs } from 'antd';\r\nimport classnames from 'classnames';\r\n\r\nimport StyledModal from '../modal';\r\nimport UploadFile from '../uploadFile/UploadFile';\r\nimport LogoAssetGrid from './LogoAssetGrid';\r\n\r\nimport { getUploadImageUrl } from 'utils/image';\r\n\r\nimport Messages from 'i18n/messages/common';\r\nimport { useIntl } from 'react-intl';\r\n\r\nimport { UPLOAD_MAX_SIZE } from 'static/Constants';\r\n\r\nimport './EditLogoModal.less';\r\n\r\nconst { TabPane } = Tabs;\r\n\r\nconst SUPPORT_LOGO_TYPES = ['jpeg', 'png', 'jpg'];\r\n\r\nconst EditLogoModal = (props) => {\r\n const intl = useIntl();\r\n\r\n const {\r\n title,\r\n visible,\r\n setVisible,\r\n onSubmit,\r\n logoAssetsUniqueId,\r\n getLogoAssetsService,\r\n getLogoAssetResponseParams,\r\n } = props;\r\n\r\n const [file, setFile] = useState(null);\r\n const [logoAsset, setLogoAsset] = useState(null);\r\n const [activeTab, setActiveTab] = useState('1');\r\n\r\n const [submitDisabled, setSubmitDisabled] = useState(true);\r\n\r\n const onChangeTab = (activeKey) => {\r\n setActiveTab(activeKey);\r\n };\r\n\r\n const onFileChange = (fileResult) => {\r\n if (!fileResult?.file) return;\r\n\r\n setFile(fileResult?.file?.originFileObj);\r\n };\r\n\r\n const onOk = () => {\r\n if (activeTab === '1' && file) getUploadImageUrl(file, onSubmit);\r\n if (activeTab === '2' && logoAsset) uploadLogoFromLogoAsset();\r\n onCancel();\r\n };\r\n\r\n const onCancel = () => {\r\n setVisible(false);\r\n setFile(null);\r\n setLogoAsset(null);\r\n setSubmitDisabled(true);\r\n setActiveTab('1');\r\n };\r\n\r\n const onSelectLogoAsset = (selectedLogoId, logoImage, selectedLogo) => {\r\n const uniqueObject = {};\r\n uniqueObject[logoAssetsUniqueId] = selectedLogoId;\r\n uniqueObject.imageSrc = logoImage;\r\n uniqueObject.selectedLogo = selectedLogo;\r\n\r\n setLogoAsset(uniqueObject);\r\n };\r\n\r\n const uploadLogoFromLogoAsset = () => {\r\n onSubmit(logoAsset);\r\n };\r\n\r\n const checkSubmitDisable = () => {\r\n if (!visible) return;\r\n\r\n if (activeTab === '1' && file) {\r\n setSubmitDisabled(false);\r\n return;\r\n }\r\n\r\n if (activeTab === '2' && logoAsset?.selectedLogo) {\r\n setSubmitDisabled(false);\r\n return;\r\n }\r\n\r\n setSubmitDisabled(true);\r\n };\r\n\r\n useEffect(() => {\r\n checkSubmitDisable();\r\n }, [visible, activeTab, file, logoAsset]);\r\n\r\n const okBtnText =\r\n activeTab === '1'\r\n ? intl.formatMessage(Messages.useImage)\r\n : intl.formatMessage(Messages.submit);\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n {getLogoAssetsService ? (\r\n \r\n \r\n \r\n ) : null}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default EditLogoModal;\r\n","import React, { useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { Button } from 'antd';\r\nimport { CameraOutlined } from '@ant-design/icons';\r\nimport { ThumbnailItem } from 'common/components';\r\nimport EditLogoModal from '../modal-edit-logo/EditLogoModal';\r\nimport noImage from 'assets/product-no-image.jpg';\r\n\r\nimport './ProfileImage.less';\r\n\r\nconst ProfileImage = (props) => {\r\n const {\r\n src,\r\n title,\r\n responsive,\r\n enableCustom,\r\n className,\r\n isEditMode,\r\n loading,\r\n uploadBtnProps,\r\n style,\r\n isDefaultSrc = false,\r\n onSubmit,\r\n getLogoAssetsService,\r\n logoAssetsUniqueId,\r\n editLogoTitle,\r\n getLogoAssetResponseParams,\r\n } = props;\r\n\r\n const [editLogoModalVisible, setEditLogoModalVisible] = useState(false);\r\n\r\n const onClickUploadBtn = () => {\r\n showUploadModal();\r\n };\r\n\r\n const showUploadModal = () => {\r\n setEditLogoModalVisible(true);\r\n };\r\n\r\n //* render\r\n const isShowEditButton = isEditMode && !loading;\r\n const UploadBtn = Button;\r\n\r\n return (\r\n
\r\n \r\n {isShowEditButton ? (\r\n }\r\n size='small'\r\n onClick={onClickUploadBtn}\r\n {...uploadBtnProps}\r\n />\r\n ) : null}\r\n {onSubmit ? (\r\n \r\n ) : null}\r\n
\r\n );\r\n};\r\n\r\nProfileImage.propsTypes = {\r\n /**\r\n * Profile Image Source\r\n */\r\n src: PropTypes.string.isRequired,\r\n /**\r\n * Profile Image Alt\r\n */\r\n alt: PropTypes.string,\r\n /**\r\n * Size of Profile Image\r\n */\r\n size: PropTypes.number,\r\n /**\r\n * Edit mode\r\n */\r\n isEditMode: PropTypes.bool,\r\n /**\r\n * upload image handler\r\n */\r\n onUploadHandler: PropTypes.func,\r\n /**\r\n * upload image loading\r\n */\r\n loading: PropTypes.bool,\r\n};\r\n\r\nProfileImage.defaultProps = {\r\n size: 150,\r\n className: 'profile-image',\r\n alt: 'Profile Image',\r\n};\r\n\r\nexport default ProfileImage;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Space, Typography } from 'antd';\r\n\r\nconst { Text } = Typography;\r\n\r\nconst ProfileAddress = (props) => {\r\n const { address, className, style } = props;\r\n const clp = 'profile-address';\r\n const isAddressAvailabel =\r\n address &&\r\n typeof address === 'object' &&\r\n Object.values(address).filter((item) => item != null && item !== undefined)\r\n .length > 0;\r\n\r\n const renderAddresses = (address) => {\r\n return address ? (\r\n \r\n {address}\r\n \r\n ) : null;\r\n };\r\n\r\n const addressData = {\r\n primaryAddressCity: address?.primaryAddressCity,\r\n primaryAddressMainAddress: address?.primaryAddressMainAddress,\r\n address2: address?.address2,\r\n address3: address?.address3,\r\n primaryAddressState: address?.primaryAddressState,\r\n primaryAddressZipcode: address?.primaryAddressZipcode,\r\n primaryAddressCountry: address?.primaryAddressCountry,\r\n address1: address?.address1,\r\n city: address?.city,\r\n country: address?.country,\r\n state: address?.state,\r\n zipCode: address?.zipCode,\r\n };\r\n\r\n const mapAddressToAddress4 = () => {\r\n if (address) {\r\n const stateAddress =\r\n addressData?.primaryAddressState || addressData?.state\r\n ? ', ' + (addressData?.primaryAddressState || addressData?.state)\r\n : '';\r\n const countryAddress =\r\n (addressData?.country || addressData?.primaryAddressCountry) &&\r\n (addressData?.country || addressData?.primaryAddressCountry) !== 'USA'\r\n ? ', ' + (addressData?.country || addressData?.primaryAddressCountry)\r\n : '';\r\n return `${addressData?.primaryAddressCity || addressData?.city || ''}${\r\n stateAddress || ''\r\n }${countryAddress || ''}`;\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n {isAddressAvailabel && (\r\n \r\n {renderAddresses(\r\n addressData.primaryAddressMainAddress || addressData.address1\r\n )}\r\n {renderAddresses(addressData.address2)}\r\n {renderAddresses(addressData.address3)}\r\n {renderAddresses(mapAddressToAddress4())}\r\n {renderAddresses(\r\n addressData.primaryAddressZipcode || addressData.zipCode\r\n )}\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nProfileAddress.propTypes = {\r\n className: PropTypes.string,\r\n address: PropTypes.object,\r\n style: PropTypes.object,\r\n};\r\n\r\nexport default ProfileAddress;\r\n","import React, { useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport {\r\n ContactsOutlined,\r\n MailOutlined,\r\n MessageOutlined,\r\n} from '@ant-design/icons';\r\nimport { Space, Modal, Typography } from 'antd';\r\nimport './ContactActions.less';\r\n\r\nconst { Paragraph } = Typography;\r\nconst ContactActions = (props) => {\r\n // props\r\n const { title, alignment, className } = props;\r\n // state\r\n const [showContact, setShowContact] = useState(false);\r\n const [showEmail, setShowEmail] = useState(false);\r\n const [showMessage, setShowMessage] = useState(false);\r\n const sendContact = () => {\r\n setShowContact(true);\r\n };\r\n\r\n const sendEmail = () => {\r\n setShowEmail(true);\r\n };\r\n\r\n const sendMessage = () => {\r\n setShowMessage(true);\r\n };\r\n\r\n const handleCancelContact = (e) => {\r\n setShowContact(false);\r\n };\r\n const handleCancelEmail = (e) => {\r\n setShowEmail(false);\r\n };\r\n const handleCancelMessage = (e) => {\r\n setShowMessage(false);\r\n };\r\n\r\n return (\r\n \r\n {title && (\r\n {title}:\r\n )}\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n

contact action

\r\n \r\n \r\n

send mail

\r\n \r\n \r\n

send message

\r\n \r\n \r\n );\r\n};\r\n\r\nContactActions.propTypes = {\r\n title: PropTypes.oneOfType([\r\n PropTypes.string,\r\n PropTypes.node,\r\n PropTypes.object,\r\n ]),\r\n alignment: PropTypes.oneOf(['left', 'center', 'right']),\r\n};\r\n\r\nContactActions.defaultProps = {\r\n alignment: 'center',\r\n};\r\nexport default ContactActions;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { Row, Col, Typography, Checkbox } from 'antd';\r\nimport { isObject } from 'lodash';\r\n\r\nimport './InfoWithLabel.less';\r\nconst { Text } = Typography;\r\n\r\nconst InfoWithLabel = (props) => {\r\n const {\r\n label,\r\n info,\r\n className,\r\n labelColProps,\r\n infoColProps,\r\n boldInfo,\r\n labelAlign = 'left',\r\n infoTextStyle = {},\r\n labelTextStyle = {},\r\n align,\r\n infoAppend,\r\n gutter,\r\n showTooltip,\r\n editIconRender,\r\n style,\r\n log,\r\n } = props;\r\n const clp = 'info-with-label';\r\n const isBoolean = typeof info === 'boolean';\r\n\r\n const renderInfo = () => {\r\n if (info !== null) {\r\n if (isBoolean) return ;\r\n\r\n if (React.isValidElement(info)) return info;\r\n\r\n if (!isObject(info)) return info;\r\n }\r\n\r\n return null;\r\n };\r\n\r\n return label ? (\r\n \r\n \r\n \r\n {label}:\r\n \r\n \r\n \r\n \r\n {renderInfo()}\r\n {infoAppend ? infoAppend : null}\r\n \r\n \r\n {editIconRender ? {editIconRender} : null}\r\n \r\n ) : null;\r\n};\r\nInfoWithLabel.propTypes = {\r\n /**\r\n * className of container\r\n */\r\n className: PropTypes.string,\r\n /**\r\n * Props of label col - Ant Col Component props\r\n */\r\n labelColProps: PropTypes.object,\r\n /**\r\n * Props of info col - Ant Col Component props\r\n */\r\n infoColProps: PropTypes.object,\r\n /**\r\n * Make info text bolder\r\n */\r\n boldInfo: PropTypes.bool,\r\n /**\r\n * Text alignment of label\r\n */\r\n labelAlign: PropTypes.oneOf(['center', 'left', 'right']),\r\n /**\r\n * Text alignment of label\r\n */\r\n infoComponent: PropTypes.func,\r\n};\r\nexport default InfoWithLabel;\r\n","import React, { useState } from 'react';\r\nimport { Input, Row, Typography } from 'antd';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport './TextAreaGrid.less';\r\nconst { TextArea } = Input;\r\nconst { Text } = Typography;\r\n\r\nconst TextAreaGrid = (props) => {\r\n const [isMouseInside, setMouseInside] = useState(false);\r\n const { title, content, minRows, maxRows, underlineTitle } = props;\r\n\r\n return (\r\n setMouseInside(true)}\r\n onMouseLeave={() => setMouseInside(false)}\r\n style={{ width: '100%' }}\r\n >\r\n \r\n {title}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nTextAreaGrid.propTypes = {\r\n title: PropTypes.oneOfType([\r\n PropTypes.string,\r\n PropTypes.node,\r\n PropTypes.object,\r\n ]),\r\n content: PropTypes.oneOfType([\r\n PropTypes.string,\r\n PropTypes.node,\r\n PropTypes.object,\r\n ]),\r\n minRows: PropTypes.number,\r\n maxRows: PropTypes.number,\r\n underlineTitle: PropTypes.bool,\r\n};\r\n\r\nTextAreaGrid.defaultProps = {\r\n minRows: 4,\r\n maxRows: 4,\r\n underlineTitle: false,\r\n};\r\n\r\nexport default TextAreaGrid;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Tabs } from 'antd';\r\nimport classnames from 'classnames';\r\n\r\nimport './TabLayout.less';\r\n\r\nconst { TabPane } = Tabs;\r\n\r\nconst TabLayout = (props) => {\r\n const {\r\n options,\r\n defaultActiveTab,\r\n className,\r\n onChangeTab,\r\n containerHeight,\r\n onTabClick,\r\n activeKey,\r\n } = props;\r\n\r\n return (\r\n \r\n {options &&\r\n !!options.length &&\r\n options?.map((item) => {\r\n const { title, key, module, disabled = false } = item;\r\n\r\n return (\r\n \r\n {module}\r\n \r\n );\r\n })}\r\n \r\n );\r\n};\r\n\r\nTabLayout.propTypes = {\r\n /**\r\n * className of wrapper\r\n */\r\n className: PropTypes.string,\r\n /**\r\n * Tab item option array\r\n */\r\n option: PropTypes.arrayOf(\r\n PropTypes.shape({\r\n item: PropTypes.string,\r\n module: PropTypes.func,\r\n })\r\n ),\r\n /**\r\n * Function to set active tab\r\n */\r\n setTabKey: PropTypes.func,\r\n};\r\nTabLayout.defaultProps = {\r\n className: '',\r\n};\r\nexport default TabLayout;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Badge } from 'antd';\r\nimport './Action.less';\r\n\r\nconst Action = (props) => {\r\n const { count, offset, icon, iconStyle, onClick } = props;\r\n const Icon = icon;\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nAction.propTypes = {\r\n count: PropTypes.number,\r\n offset: PropTypes.array,\r\n icon: PropTypes.any,\r\n};\r\n\r\nexport default Action;\r\n","import React from 'react';\r\nimport Action from './Action';\r\nimport { MessageOutlined } from '@ant-design/icons';\r\n\r\nconst Chat = (props) => {\r\n const { count, offset, iconStyle, onClick } = props;\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport default Chat;\r\n","import React, { useState } from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\n\r\nimport Action from './Action';\r\nimport {\r\n List,\r\n Popover,\r\n Button,\r\n notification,\r\n Spin,\r\n Row,\r\n Col,\r\n Typography,\r\n Divider,\r\n} from 'antd';\r\nimport { BellOutlined } from '@ant-design/icons';\r\nimport { forwardTo } from 'utils/common/route';\r\nimport classnames from 'classnames';\r\n// import MeetingNotification from './MeetingNotification';\r\nimport gridViewSelectors from 'common/components/grid-view/controllers/selectors';\r\nimport * as workflowActions from 'pages/workflow/controllers/actions';\r\nimport * as api from 'config/axios';\r\n\r\n// import QaSpecWorkflowTodoList from './components/QaSpecWorkflowTodoList';\r\n\r\n// import { useGetQaSpecTodoList } from 'pages/qa-spec-workflow/hook';\r\n// import { updateSearchText } from 'pages/home/utils';\r\n// import { useCheckPermissions } from 'hooks';\r\n\r\n// import { PERMISSION_MANAGE_QA_SPEC_WORKFLOW } from 'static/Permission';\r\nimport {\r\n TO_DO_DISPLAY_BELL_COLUMN,\r\n TO_DO_NOT_DISPLAY_BELL_COLUMN,\r\n // SEE_MORE_DISPLAY_BELL_COLUMN,\r\n // SEE_MORE_NOT_DISPLAY_BELL_COLUMN,\r\n} from './constants';\r\n\r\nimport './Task.less';\r\n\r\nconst Task = (props) => {\r\n const {\r\n count,\r\n offset,\r\n iconStyle,\r\n workflowsNotification,\r\n updateTodoList,\r\n awaitingList,\r\n updateAwaitingList,\r\n isDisplayBell,\r\n } = props;\r\n const [loading, setLoading] = useState(false);\r\n const [visible, setVisible] = useState(false);\r\n const { Title } = Typography;\r\n\r\n const dispatch = useDispatch();\r\n\r\n const visibleContentPane = useSelector(gridViewSelectors.makeSelectVisible());\r\n const pathname = window.location.pathname;\r\n\r\n // const hasPermissionManageQaSpecWorkflow = useCheckPermissions(\r\n // PERMISSION_MANAGE_QA_SPEC_WORKFLOW\r\n // );\r\n\r\n // const { qaSpecWorkflowTodoList } = useGetQaSpecTodoList(\r\n // hasPermissionManageQaSpecWorkflow\r\n // );\r\n\r\n const updateIsAcceptStepGrid = () => {\r\n if (visibleContentPane && pathname === '/workflows') {\r\n dispatch(workflowActions.updateAcceptStepGrid(true));\r\n }\r\n };\r\n\r\n const updateIsApproveStepGrid = () => {\r\n if (visibleContentPane && pathname === '/workflows') {\r\n dispatch(workflowActions.updateApproveStepGrid(true));\r\n }\r\n };\r\n\r\n const onClickSeemore = () => {\r\n forwardTo('/workflows');\r\n setVisible(false);\r\n };\r\n\r\n const onClickViewItem = (item) => {\r\n forwardTo(\r\n `/workflow?workflowImplId=${item?.workflowImplementationId}&stepImplId=${item?.workflowImplementationStepId}`\r\n );\r\n setVisible(false);\r\n };\r\n\r\n const onRejectTodo = (event, id) => {\r\n setLoading(true);\r\n event.stopPropagation();\r\n const params = {\r\n id: id,\r\n isAccepted: false,\r\n };\r\n api\r\n .sendPost('/api/workflow/accept-or-reject-todo-list', params)\r\n .then((response) => {\r\n if (response?.isSuccess) {\r\n notification.success({ message: 'Reject Todo list success' });\r\n updateTodoList();\r\n updateIsAcceptStepGrid();\r\n } else {\r\n notification.error({ message: response?.message });\r\n }\r\n })\r\n .catch((error) => {})\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n };\r\n\r\n const onAcceptTodo = (event, id) => {\r\n setLoading(true);\r\n event.stopPropagation();\r\n const params = {\r\n id: id,\r\n isAccepted: true,\r\n };\r\n api\r\n .sendPost('/api/workflow/accept-or-reject-todo-list', params)\r\n .then((response) => {\r\n if (response.isSuccess) {\r\n notification.success({ message: 'Accept Todo list success' });\r\n updateTodoList();\r\n updateIsAcceptStepGrid();\r\n } else {\r\n notification.error({ message: response?.message });\r\n }\r\n })\r\n .catch((error) => {})\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n };\r\n\r\n const onRejectAwaiting = (event, id) => {\r\n setLoading(true);\r\n event.stopPropagation();\r\n const params = {\r\n wfImpStepId: id,\r\n isApprove: false,\r\n };\r\n api\r\n .sendPost('/api/workflow/accept-waiting-for-approve', params)\r\n .then((response) => {\r\n if (response?.isSuccess) {\r\n notification.success({ message: 'Awaiting workflow is rejected' });\r\n updateAwaitingList();\r\n updateIsApproveStepGrid();\r\n } else {\r\n notification.error({ message: response?.message });\r\n }\r\n })\r\n .catch((error) => {})\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n };\r\n\r\n const onAcceptAwaiting = (event, id) => {\r\n setLoading(true);\r\n event.stopPropagation();\r\n const params = {\r\n wfImpStepId: id,\r\n isApprove: true,\r\n };\r\n api\r\n .sendPost('/api/workflow/accept-waiting-for-approve', params)\r\n .then((response) => {\r\n if (response.isSuccess) {\r\n notification.success({ message: 'Awaiting workflow is accepted.' });\r\n updateAwaitingList();\r\n updateIsApproveStepGrid();\r\n } else {\r\n notification.error({ message: response?.message });\r\n }\r\n })\r\n .catch((error) => {})\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n };\r\n // const showMoreQaSpecWorkflowGrid = () => {\r\n // const qaSpecPath = '/qa-spec-workflows';\r\n // forwardTo(qaSpecPath);\r\n // setVisible(false);\r\n // updateSearchText(dispatch, '', qaSpecPath);\r\n // };\r\n\r\n const workflowList = () => {\r\n return (\r\n \r\n \r\n {isDisplayBell && (\r\n \r\n \r\n Awaiting List\r\n \r\n \r\n (\r\n \r\n {\r\n onAcceptAwaiting(event, item?.id);\r\n }}\r\n style={{ borderRadius: '4px' }}\r\n type='primary'\r\n className='header-task__popover-item--accept-button'\r\n >\r\n Accept\r\n \r\n {\r\n onRejectAwaiting(event, item?.id);\r\n }}\r\n danger\r\n >\r\n Reject\r\n \r\n \r\n }\r\n >\r\n \r\n \r\n )}\r\n />\r\n \r\n )}\r\n\r\n \r\n \r\n To do List\r\n \r\n \r\n (\r\n \r\n {\r\n onClickViewItem(item);\r\n }}\r\n type='primary'\r\n className='header-task__popover-item--view-button'\r\n >\r\n View\r\n \r\n \r\n ) : (\r\n
\r\n {\r\n onAcceptTodo(event, item?.id);\r\n }}\r\n style={{ borderRadius: '4px' }}\r\n type='primary'\r\n className='header-task__popover-item--accept-button'\r\n >\r\n Accept\r\n \r\n {\r\n onRejectTodo(event, item?.id);\r\n }}\r\n danger\r\n >\r\n Reject\r\n \r\n
\r\n )\r\n }\r\n >\r\n \r\n \r\n {item?.status}\r\n \r\n }\r\n />\r\n \r\n )}\r\n />\r\n \r\n {/* \r\n \r\n */}\r\n
\r\n \r\n \r\n onClickSeemore()}\r\n >\r\n
\r\n See More\r\n
\r\n \r\n \r\n\r\n <>\r\n {/* \r\n \r\n
\r\n See More\r\n
\r\n \r\n */}\r\n \r\n
\r\n
\r\n );\r\n };\r\n\r\n const handleVisibleChange = (visible) => {\r\n setVisible(visible);\r\n };\r\n\r\n const renderTotalCount = () => {\r\n // const workflowCount = qaSpecWorkflowTodoList?.length ?? 0;\r\n // return parseInt(count) + parseInt(workflowCount);\r\n return parseInt(count);\r\n };\r\n\r\n const totalCount = renderTotalCount();\r\n\r\n return (\r\n
\r\n \r\n setVisible(true)}\r\n count={totalCount}\r\n offset={offset}\r\n icon={BellOutlined}\r\n iconStyle={iconStyle}\r\n />\r\n \r\n
\r\n );\r\n};\r\n\r\nexport default Task;\r\n","export const TO_DO_DISPLAY_BELL_COLUMN = 12;\r\nexport const TO_DO_NOT_DISPLAY_BELL_COLUMN = 24;\r\nexport const SEE_MORE_DISPLAY_BELL_COLUMN = 15;\r\nexport const SEE_MORE_NOT_DISPLAY_BELL_COLUMN = 12;\r\n","import React from 'react';\r\nimport Action from './Action';\r\nimport { MailOutlined } from '@ant-design/icons';\r\n\r\nconst Email = (props) => {\r\n const { count, offset, iconStyle, onClick } = props;\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport default Email;\r\n","import React, { useState, useEffect, useCallback } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport Cropper from 'react-cropper';\r\nimport 'cropperjs/dist/cropper.css';\r\nimport './CropImage.less';\r\n\r\nexport const CropImage = (props) => {\r\n const {\r\n imgSrc,\r\n getRealTimeCropper,\r\n aspectRatio,\r\n wrapperStyle,\r\n cropperHeight,\r\n refCropper,\r\n ...restProps\r\n } = props;\r\n\r\n const [cropper, setCropper] = useState();\r\n\r\n const getCropDataCallback = useCallback(() => {\r\n if (!refCropper.current) return;\r\n\r\n const canvasData = refCropper.current.cropper.getCroppedCanvas();\r\n\r\n if (canvasData && getRealTimeCropper) {\r\n getRealTimeCropper(\r\n canvasData.toDataURL(),\r\n refCropper.current.cropper.getCropBoxData()\r\n );\r\n }\r\n }, []);\r\n\r\n const onCrop = (e) => {\r\n getCropDataCallback();\r\n };\r\n\r\n const onReady = (e) => {\r\n getCropDataCallback();\r\n };\r\n\r\n useEffect(() => {\r\n if (cropper) {\r\n getCropDataCallback();\r\n }\r\n }, [cropper, getCropDataCallback]);\r\n\r\n return (\r\n
\r\n {\r\n setCropper(instance);\r\n }}\r\n cropend={onCrop}\r\n ref={refCropper}\r\n ready={onReady}\r\n {...restProps}\r\n />\r\n
\r\n );\r\n};\r\n\r\nCropper.propTypes = {\r\n imgSrc: PropTypes.string,\r\n getCropperInstance: PropTypes.func,\r\n getRealTimeCropper: PropTypes.func,\r\n aspectRatio: PropTypes.number,\r\n};\r\n\r\nexport default CropImage;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { Space, Typography } from 'antd';\r\nimport './HistorySection.less';\r\nconst { Text } = Typography;\r\n\r\nconst HistorySection = (props) => {\r\n const { title, children, className } = props;\r\n return (\r\n \r\n {title && (\r\n \r\n {title}\r\n \r\n )}\r\n {children}\r\n \r\n );\r\n};\r\nHistorySection.propTypes = {\r\n /**\r\n * className of section\r\n */\r\n className: PropTypes.string,\r\n /**\r\n * className prefix/Block\r\n */\r\n clp: PropTypes.string,\r\n /**\r\n * Section Title\r\n */\r\n title: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\r\n};\r\nexport default HistorySection;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { Table } from 'antd';\r\nimport {\r\n ArrowDownOutlined,\r\n ArrowUpOutlined,\r\n PhoneOutlined,\r\n ContactsOutlined,\r\n MailOutlined,\r\n MessageOutlined,\r\n} from '@ant-design/icons';\r\n\r\nimport { concat, pick, get } from 'lodash';\r\n\r\nimport './ProfileContactHistory.less';\r\n\r\nconst ProfileContactHistory = (props) => {\r\n const { data, dataField, dataKey, typeField, arrowField, loading } = props;\r\n\r\n const iconSet = {\r\n Email: MailOutlined,\r\n Phone: PhoneOutlined,\r\n Message: MessageOutlined,\r\n Contact: ContactsOutlined,\r\n };\r\n\r\n // generate more columns\r\n const generateColumns = () => {\r\n return dataField && !!dataField.length\r\n ? dataField.map((field) => {\r\n const { key, options } = field;\r\n return {\r\n title: key,\r\n dataIndex: key,\r\n key: key,\r\n ...options,\r\n };\r\n })\r\n : [];\r\n };\r\n\r\n // generate data source from dataField, typeField and arrowField\r\n const generateDataSource = () => {\r\n const dataFieldKey =\r\n dataField &&\r\n !!dataField.length &&\r\n dataField.map((field) => {\r\n return field.key;\r\n });\r\n return data && !!data.length && true\r\n ? data.map((item) => {\r\n const modifiedItem = pick(item, dataFieldKey);\r\n modifiedItem.key = item[dataKey];\r\n modifiedItem.type = item[typeField];\r\n modifiedItem.arrow = item[arrowField];\r\n return modifiedItem;\r\n })\r\n : [];\r\n };\r\n\r\n // define the two first columns of contact history table\r\n const initColumns = [\r\n // the first column is in-out arrow icon\r\n {\r\n title: 'arrow',\r\n dataIndex: 'arrow',\r\n key: 'arrow',\r\n width: 30,\r\n render: (text) => {\r\n return text ? (\r\n \r\n ) : (\r\n \r\n );\r\n },\r\n },\r\n // the second column is type icon\r\n {\r\n title: 'Type',\r\n dataIndex: 'type',\r\n key: 'type',\r\n width: 30,\r\n render: (text) => {\r\n const TypeIcon = get(iconSet, text, ContactsOutlined);\r\n return ;\r\n },\r\n },\r\n ];\r\n // define more column\r\n const dataColumns = generateColumns();\r\n // merge initColumns with more columns\r\n const columns = concat(initColumns, dataColumns);\r\n // define data source\r\n const dataSource = generateDataSource();\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nProfileContactHistory.propTypes = {\r\n /**\r\n * Contact history data\r\n */\r\n data: PropTypes.arrayOf(PropTypes.object),\r\n /**\r\n * Array of fields will show in table\r\n */\r\n dataField: PropTypes.arrayOf(\r\n PropTypes.shape({\r\n /**\r\n * key name of field\r\n */\r\n key: PropTypes.string,\r\n /**\r\n * Column props of Ant Table use for this field\r\n */\r\n options: PropTypes.object,\r\n })\r\n ),\r\n /**\r\n * Key for each item of dataSource of Ant Table\r\n */\r\n dataKey: PropTypes.string,\r\n /**\r\n * Key for selecting value of Type Icon column\r\n */\r\n typeField: PropTypes.string,\r\n /**\r\n * Key for selecting value of Arrow Icon column\r\n */\r\n arrowField: PropTypes.string,\r\n};\r\n\r\nexport default ProfileContactHistory;\r\n","import React, { useState } from 'react';\r\nimport { Tooltip, Typography } from 'antd';\r\n\r\nconst { Paragraph } = Typography;\r\n\r\nconst TooltipParagraph = ({ children, ellipsis, tooltipProps, ...props }) => {\r\n const [truncated, setTruncated] = useState(false);\r\n\r\n return (\r\n \r\n \r\n <>{children}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default TooltipParagraph;\r\n","import React from 'react';\r\n\r\nimport { Space, Typography } from 'antd';\r\n\r\nconst { Text } = Typography;\r\n\r\nconst MemberGlnList = (props) => {\r\n const { glns, color } = props;\r\n\r\n return (\r\n \r\n {glns?.length\r\n ? glns.map((gln) => {\r\n return {gln};\r\n })\r\n : null}\r\n \r\n );\r\n};\r\n\r\nexport default MemberGlnList;\r\n","import React from 'react';\r\n\r\nimport { Tooltip, Typography } from 'antd';\r\n\r\nimport MemberGlnList from '../member-grid/MemberGlnList';\r\n\r\nconst { Text } = Typography;\r\n\r\nconst GlnTooltip = (props) => {\r\n const { glns } = props;\r\n\r\n const renderTitle = () => {\r\n return ;\r\n };\r\n\r\n const renderGlnText = () => {\r\n return glns?.length ? (\r\n \r\n {glns.join(', ')}\r\n \r\n ) : null;\r\n };\r\n\r\n return {renderGlnText()};\r\n};\r\n\r\nexport default GlnTooltip;\r\n","import http from 'assets/download-method/http.png';\r\nimport email from 'assets/download-method/email.png';\r\nimport interop from 'assets/download-method/interop.png';\r\n\r\n// Array of types digital asset map with images\r\nexport const DownloadMethodImage = [\r\n { fileType: 'direct', fileImg: http },\r\n { fileType: 'email', fileImg: email },\r\n { fileType: 'ftp', fileImg: interop },\r\n];\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { DigitalAssetTypeImage } from 'static/FileType';\r\nimport { DownloadMethodImage } from 'static/DownloadMethod';\r\nimport { LoadingOutlined } from '@ant-design/icons';\r\nimport unknownType from 'assets/file-formats/unknown.jpg';\r\n\r\nimport './TypePicker.less';\r\n\r\nconst TypePicker = (props) => {\r\n const { group, type, loading } = props;\r\n let optionList;\r\n if (group === 'file-type') {\r\n optionList = DigitalAssetTypeImage;\r\n } else if (group === 'download-method') {\r\n optionList = DownloadMethodImage;\r\n } else optionList = [];\r\n const image =\r\n optionList.filter((image) => image.fileType === type?.toLowerCase())[0]\r\n ?.fileImg || unknownType;\r\n\r\n return (\r\n <>\r\n {loading ? (\r\n \r\n ) : (\r\n {type}\r\n )}\r\n \r\n );\r\n};\r\n\r\nTypePicker.propsTypes = {\r\n group: PropTypes.string,\r\n type: PropTypes.string,\r\n loading: PropTypes.bool,\r\n};\r\n\r\nexport default TypePicker;\r\n","// Service Type List\r\nimport dropbox from 'assets/system/dropbox.png';\r\nimport ftp from 'assets/system/ftp.png';\r\nimport instacart from 'assets/system/instacart.png';\r\nimport salsify from 'assets/system/salsify.png';\r\nimport sftp from 'assets/system/sftp.png';\r\nimport sharepoint from 'assets/system/sharepoint.jpg';\r\nimport sagetree from 'assets/system/sagetree.png';\r\nimport gs1 from 'assets/gs1.png';\r\n\r\nconst serviceTypeList = [\r\n {\r\n value: 'dropbox',\r\n icon: dropbox,\r\n },\r\n {\r\n value: 'ftp',\r\n icon: ftp,\r\n },\r\n {\r\n value: 'instacart',\r\n icon: instacart,\r\n },\r\n {\r\n value: 'salsify',\r\n icon: salsify,\r\n },\r\n {\r\n value: 'sftp',\r\n icon: sftp,\r\n },\r\n {\r\n value: 'sharepoint',\r\n icon: sharepoint,\r\n },\r\n {\r\n value: 'sagetree',\r\n icon: sagetree,\r\n },\r\n {\r\n value: 'gs1',\r\n icon: gs1,\r\n },\r\n];\r\n\r\nexport default serviceTypeList;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Typography } from 'antd';\r\nimport serviceTypeList from './ServiceTypeMapping';\r\nimport classNames from 'classnames';\r\nimport { Images } from 'config/assets';\r\n\r\nimport './ServiceType.less';\r\n\r\nconst { Text } = Typography;\r\n\r\nconst ServiceType = (props) => {\r\n const { className, type, hideTitle } = props;\r\n const service = serviceTypeList.filter(\r\n (icon) => icon.value === type?.toLowerCase()\r\n )[0]?.icon;\r\n return (\r\n
\r\n \r\n {!hideTitle && {type || 'UNKNOWN SERVICE'}}\r\n
\r\n );\r\n};\r\n\r\nServiceType.propsTypes = {\r\n type: PropTypes.string,\r\n className: PropTypes.string,\r\n hideTitle: PropTypes.bool,\r\n};\r\n\r\nexport default ServiceType;\r\n","import React from 'react';\r\nimport PropTypes, { oneOfType } from 'prop-types';\r\nimport { Row, Col } from 'antd';\r\nimport { injectIntl } from 'react-intl';\r\nimport classnames from 'classnames';\r\nimport './LabelValueWrapper.less';\r\n\r\nconst LabelValueWrapper = (props) => {\r\n const { object, parentScoop, colspan, labelSuffix, intl, valueStyle } = props;\r\n let initialCol = colspan || 8;\r\n\r\n const modifyData = (data) => {\r\n if (typeof data === 'boolean') {\r\n switch (data) {\r\n case true:\r\n return 'Yes';\r\n case false:\r\n return 'No';\r\n }\r\n } else return data;\r\n };\r\n\r\n return (\r\n <>\r\n {object &&\r\n Object.entries(object).map(([key, value]) => {\r\n return (\r\n \r\n \r\n {intl.formatMessage({\r\n id: `Taco.${parentScoop}.${key}`,\r\n })}\r\n {labelSuffix}\r\n \r\n \r\n {modifyData(value)}\r\n \r\n \r\n );\r\n })}\r\n \r\n );\r\n};\r\n\r\nLabelValueWrapper.propsTypes = {\r\n object: oneOfType([PropTypes.array, PropTypes.object]),\r\n parentScoop: PropTypes.string,\r\n colspan: PropTypes.number,\r\n labelSuffix: PropTypes.string,\r\n};\r\n\r\nexport default injectIntl(LabelValueWrapper);\r\n","import React from 'react';\r\nimport PropTypes, { oneOfType } from 'prop-types';\r\nimport { Modal } from 'antd';\r\nimport './IframePreview.less';\r\n\r\nconst IframePreview = (props) => {\r\n const { title, height, width, url, visible, onClose, ...otherProps } = props;\r\n\r\n const iframe = ``;\r\n const Iframe = ({ iframe }) => {\r\n return (\r\n \r\n );\r\n };\r\n\r\n return (\r\n onClose()}\r\n width='100%'\r\n bodyStyle={{\r\n height: 'calc(100vh - 36px)',\r\n display: ' flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n }}\r\n footer={null}\r\n {...otherProps}\r\n >\r\n `;\r\n return (\r\n \r\n );\r\n };\r\n\r\n const isRenderUnsupportedFileViewer = () => {\r\n return (\r\n UNPREVIEWABLE_FILE_TYPES.indexOf(fileType) > -1 || !link || isEmptyFile\r\n );\r\n };\r\n\r\n return (\r\n <>\r\n {fileType && fileType?.toLowerCase() === 'iframe' ? (\r\n `;\r\n return (\r\n \r\n );\r\n };\r\n\r\n return (\r\n
\r\n {isCreateAsset && (\r\n \r\n )}\r\n \r\n \r\n \r\n onInputChange(form.getFieldValue('iFrameLink'))}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n {link ? (\r\n iFramePreviewRender(link)\r\n ) : loading ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n onPreview()}\r\n // size='large'\r\n disabled={btnDisabled}\r\n >\r\n Preview\r\n \r\n \r\n Submit\r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nIframeAsset.propTypes = {\r\n onSuccess: PropTypes.func,\r\n assetData: oneOfType([PropTypes.array, PropTypes.object]),\r\n setUploadType: PropTypes.func,\r\n};\r\n\r\nexport default React.memo(IframeAsset);\r\n","import React from 'react';\r\nimport { Image, Typography, Tree, Button, Tag } from 'antd';\r\n\r\nimport { CloseOutlined } from '@ant-design/icons';\r\n\r\nimport folderIcon from 'assets/folder/folder.png';\r\nimport fileIcon from 'assets/file-formats/file-icon.webp';\r\n\r\nimport '../dropbox-upload/AssetDropboxUpload.less';\r\n\r\nexport const TitleFolderAsset = ({ title, style, ...rest }) => {\r\n return (\r\n \r\n {title}\r\n \r\n );\r\n};\r\n\r\nexport const TitleFileAsset = ({ title, style, ...rest }) => {\r\n return (\r\n \r\n {title}\r\n \r\n );\r\n};\r\n\r\nexport const IconAsset = ({ src, preview, ...rest }) => {\r\n return ;\r\n};\r\n\r\nexport const IconFileAsset = (props) => {\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport const IconFolderAsset = (props) => {\r\n return ;\r\n};\r\n\r\nconst { DirectoryTree } = Tree;\r\n\r\nexport const TreeFiles = (props) => {\r\n return ;\r\n};\r\n\r\nexport const SelectedFile = ({ name, itemId, type, onDeleteItem }) => {\r\n return (\r\n \r\n ) : (\r\n \r\n )\r\n }\r\n color='success'\r\n className='dropbox-asset__result-tag'\r\n >\r\n \r\n {name}\r\n \r\n }\r\n style={{\r\n marginLeft: 4,\r\n border: 'none',\r\n }}\r\n onClick={() => onDeleteItem(itemId)}\r\n />\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\nimport {\r\n TitleFolderAsset,\r\n IconFolderAsset,\r\n TitleFileAsset,\r\n IconFileAsset,\r\n} from '../shared/components';\r\n\r\nimport { getInteropListItems } from 'services/interoperability';\r\n\r\nimport { ASSET_VIRTUAL_SCROLL_HEIGHT } from 'static/Constants';\r\nimport { getFolderShortDetail } from 'services/folder';\r\nimport { formatRangeDateTime } from 'utils/formatDate';\r\n\r\nconst getUuidKey = () => uuidv4();\r\n\r\nconst getNodeTreeData = (interop, multipleImport) => {\r\n if (interop.type === 'folder') {\r\n return {\r\n key: getUuidKey(),\r\n title: ,\r\n icon: ,\r\n data: interop,\r\n selectable: false,\r\n checkable: multipleImport ? true : false,\r\n };\r\n }\r\n return {\r\n key: getUuidKey(),\r\n title: ,\r\n icon: ,\r\n data: interop,\r\n selectable: multipleImport ? false : true,\r\n isLeaf: true,\r\n };\r\n};\r\n\r\n/**\r\n *\r\n * @param {*} list\r\n * @param {*} key\r\n * @param {*} children\r\n * @param {*} folderId - //! folder id can be used to check instead of key\r\n * @returns\r\n */\r\nexport const updateTreeData = (list, key, children, folderId) => {\r\n return list.map((node) => {\r\n const { data, key: nodeKey } = node;\r\n const { id } = data || {};\r\n\r\n if (id === folderId && folderId) {\r\n return { ...node, children };\r\n }\r\n\r\n if (nodeKey === key) {\r\n return { ...node, children };\r\n }\r\n\r\n if (node.children) {\r\n return {\r\n ...node,\r\n children: updateTreeData(node.children, key, children, folderId),\r\n };\r\n }\r\n\r\n return node;\r\n });\r\n};\r\n\r\nexport const mappingInteropItemsToTreeData = (\r\n interopItems = [],\r\n multipleImport = false\r\n) => {\r\n let treeData = [];\r\n\r\n if (interopItems) {\r\n interopItems.forEach((interop) => {\r\n if (interop.type === 'folder') {\r\n let node = getNodeTreeData(interop, multipleImport);\r\n treeData.push(node);\r\n } else {\r\n let node = getNodeTreeData(interop, multipleImport);\r\n treeData.push(node);\r\n }\r\n });\r\n }\r\n\r\n return treeData;\r\n};\r\n\r\nexport const getExpandedData = async (params) => {\r\n const response = await getInteropListItems(params);\r\n if (response?.isSuccess) {\r\n if (response?.data?.interopItems) {\r\n return response?.data?.interopItems;\r\n }\r\n }\r\n return null;\r\n};\r\n\r\nexport const getFormDataParams = (params = {}) => {\r\n let formData = new FormData();\r\n\r\n Object.entries(params).forEach(([key, value]) => {\r\n if (Array.isArray(value)) {\r\n value.forEach((item) => {\r\n formData.append(key, item);\r\n });\r\n } else {\r\n formData.append(key, value);\r\n }\r\n });\r\n\r\n return formData;\r\n};\r\n\r\nexport const filterFoldersAndFilesInSelectedItems = (selectedItems = []) => {\r\n let folders = [];\r\n let files = [];\r\n\r\n selectedItems.forEach((item) => {\r\n const { data } = item;\r\n\r\n if (data.type === 'file') {\r\n files.push(item);\r\n } else if (data.type === 'folder') {\r\n if (Array.isArray(item.children) && item.children.length > 0) {\r\n folders.push(item);\r\n filterFoldersAndFilesInSelectedItems(item.children);\r\n } else {\r\n folders.push(item);\r\n }\r\n }\r\n });\r\n\r\n return {\r\n folders,\r\n files,\r\n };\r\n};\r\n\r\nconst findFileExistInAnyFolders = (folders, file) => {\r\n return folders.some((item) => {\r\n if (item.key === file.key) {\r\n return true;\r\n } else if (item.children) {\r\n return findFileExistInAnyFolders(item.children, file);\r\n }\r\n return false;\r\n });\r\n};\r\n\r\n// A file will be sent to the server when folder that contains the file does not check\r\nexport const getFilesPath = (folders, files) => {\r\n let result = [];\r\n\r\n files.forEach((file) => {\r\n const isExist = findFileExistInAnyFolders(folders, file);\r\n\r\n if (!isExist) {\r\n result.push(file.data.path);\r\n }\r\n });\r\n\r\n return result;\r\n};\r\n\r\nconst findFolderExistInAnyFolders = (folders, findFolder) => {\r\n return folders.some((folder) => {\r\n if (folder.key === findFolder.key) {\r\n return true;\r\n } else if (folder.children) {\r\n return findFolderExistInAnyFolders(folder.children, findFolder);\r\n }\r\n return false;\r\n });\r\n};\r\n\r\n// A folder will be sent to the server when folder that contains the file does not check\r\nexport const getFoldersPath = (folders) => {\r\n let result = [];\r\n\r\n folders.forEach((folder) => {\r\n const filteredFolders = folders.filter((f) => f.key !== folder.key);\r\n\r\n const isExist = findFolderExistInAnyFolders(filteredFolders, folder);\r\n\r\n if (!isExist) {\r\n result.push(folder.data.path);\r\n }\r\n });\r\n\r\n return result;\r\n};\r\n\r\nlet foundNode = null;\r\nexport const findNodeTree = (treeData, itemId) => {\r\n for (let index = 0; index < treeData.length; index++) {\r\n const node = treeData[index];\r\n if (node.data.itemId === itemId) {\r\n foundNode = node;\r\n break;\r\n }\r\n\r\n if (node?.children) {\r\n findNodeTree(node.children, itemId);\r\n }\r\n }\r\n return foundNode;\r\n};\r\n\r\nexport const getChildNodesInFolder = (treeData) => {\r\n let children = [];\r\n const flattenMembers = treeData.map((m) => {\r\n if (m.children && m.children.length) {\r\n children = [...children, ...m.children];\r\n }\r\n return m;\r\n });\r\n\r\n return flattenMembers.concat(\r\n children.length ? getChildNodesInFolder(children) : children\r\n );\r\n};\r\n\r\nexport const filterArrayInAnotherArray = (arr1, arr2) => {\r\n return arr1.filter((item) => !arr2.includes(item));\r\n};\r\n\r\nexport const findAncestorsOfChildNode = (treeData, childNode) => {\r\n if (Array.isArray(treeData) && treeData.length > 0) {\r\n for (let i = 0; i < treeData.length; i++) {\r\n if (treeData[i].key === childNode.key) return [];\r\n\r\n let result = findAncestorsOfChildNode(treeData[i].children, childNode);\r\n if (result !== null) {\r\n result = result.concat(treeData[i]);\r\n return result;\r\n }\r\n }\r\n }\r\n return null;\r\n};\r\n\r\nexport const filterArrayObjectInAnotherArrayObject = (\r\n array1 = [],\r\n array2 = []\r\n) => {\r\n let result = [];\r\n\r\n array1.forEach((item1) => {\r\n const foundItem = array2.find((item2) => item1.key === item2.key);\r\n\r\n if (!foundItem) {\r\n result.push(item1);\r\n }\r\n });\r\n\r\n return result;\r\n};\r\n\r\nexport const getOnlySelectedParentItems = (treeData, items, keys) => {\r\n let result = [];\r\n items.forEach((item) => {\r\n const ancestorNodes = findAncestorsOfChildNode(treeData, item);\r\n const ancestorKeys = ancestorNodes.map((node) => node.key);\r\n const isParentSelected = findSelectedKeyInAnotherKeys(keys, ancestorKeys);\r\n\r\n if (!isParentSelected) {\r\n result.push(item);\r\n }\r\n });\r\n return result;\r\n};\r\n\r\nexport const findSelectedKeyInAnotherKeys = (keys, selectedKeys) => {\r\n return selectedKeys.find((key) => {\r\n return keys.includes(key);\r\n });\r\n};\r\n\r\nexport const getOnlyFilesInTree = (treeData = []) => {\r\n let result = [];\r\n\r\n treeData.forEach((treeNode) => {\r\n // file\r\n if (treeNode.isLeaf) {\r\n result.push(treeNode);\r\n } else {\r\n if (treeNode?.children?.length > 0) {\r\n const allChild = getChildNodesInFolder(treeNode.children);\r\n const files = allChild.filter((child) => child.data.type === 'file');\r\n result = result.concat(files);\r\n }\r\n }\r\n });\r\n\r\n return result;\r\n};\r\n\r\nexport const findListNodeInTree = (treeData, folders) => {\r\n let result = [];\r\n\r\n folders.forEach((folder) => {\r\n const node = findNodeTree(treeData, folder.data.itemId);\r\n if (node) {\r\n result.push(node);\r\n }\r\n });\r\n\r\n return result;\r\n};\r\n\r\nexport const getAllFilesInFolders = (folders = []) => {\r\n let result = [];\r\n\r\n folders.forEach((folder) => {\r\n if (folder?.children?.length > 0) {\r\n const nodes = getChildNodesInFolder(folder.children);\r\n result = result.concat(nodes);\r\n }\r\n });\r\n\r\n return result.filter((item) => item.data.type === 'file');\r\n};\r\n\r\nexport const getFormValues = (form) => {\r\n const {\r\n effectivePeriod,\r\n defaultStatus,\r\n isCreateThumbs,\r\n autoApplyOrReplaceOnProducts,\r\n } = form.getFieldsValue();\r\n\r\n const startTime = formatRangeDateTime(effectivePeriod?.[0]);\r\n const endTime = formatRangeDateTime(effectivePeriod?.[1]);\r\n\r\n const formValues = {\r\n EffectedDate: startTime ? startTime.toISOString() : null,\r\n ExpirationDate: endTime ? endTime.toISOString() : null,\r\n defaultStatus,\r\n isCreateThumbs,\r\n autoApplyOrReplaceOnProducts,\r\n };\r\n\r\n return formValues;\r\n};\r\n\r\nexport const getVirtualScrollHeight = (largeScreen, multipleImport) => {\r\n return largeScreen\r\n ? multipleImport\r\n ? ASSET_VIRTUAL_SCROLL_HEIGHT.multiImport\r\n : ASSET_VIRTUAL_SCROLL_HEIGHT.singleImport\r\n : ASSET_VIRTUAL_SCROLL_HEIGHT.xlHeight;\r\n};\r\n\r\nconst getExpandedNodeData = async ({\r\n pathInfo,\r\n id,\r\n storageServiceType,\r\n multipleImport,\r\n}) => {\r\n const items = await getExpandedData({ id, pathInfo, storageServiceType });\r\n if (items) {\r\n return mappingInteropItemsToTreeData(items, multipleImport);\r\n }\r\n\r\n return [];\r\n};\r\n\r\nconst getNodesAfterExpandingAll = async ({\r\n folderNodes,\r\n id,\r\n storageServiceType,\r\n multipleImport,\r\n}) => {\r\n let result = [];\r\n\r\n for (const node of folderNodes) {\r\n if (node.data.type === 'folder') {\r\n const expandedNodes = await getExpandedNodeData({\r\n pathInfo: node.data.path,\r\n id,\r\n storageServiceType,\r\n multipleImport,\r\n });\r\n\r\n result.push({\r\n ...node,\r\n children: await getNodesAfterExpandingAll({\r\n folderNodes: expandedNodes,\r\n id,\r\n storageServiceType,\r\n multipleImport,\r\n }),\r\n selectable: false,\r\n checkable: multipleImport ? true : false,\r\n });\r\n } else {\r\n result.push(node);\r\n }\r\n }\r\n\r\n return result;\r\n};\r\n\r\nexport const getTreeDataAfterExpandingAll = async ({\r\n treeData,\r\n id,\r\n storageServiceType,\r\n multipleImport,\r\n}) => {\r\n const folderNodes = treeData.filter(\r\n (folder) => folder.data.type === 'folder'\r\n );\r\n const fileNodes = treeData.filter((folder) => folder.data.type === 'file');\r\n\r\n const expandedNodes = await getNodesAfterExpandingAll({\r\n folderNodes,\r\n id,\r\n storageServiceType,\r\n multipleImport,\r\n });\r\n\r\n return expandedNodes.concat(fileNodes);\r\n};\r\n\r\nexport const getAllFoldersInTreeData = (treeData) => {\r\n let childNodes = [];\r\n const folders = treeData.filter((folder) => folder.data.type === 'folder');\r\n\r\n folders.forEach((folder) => {\r\n if (folder?.children?.length > 0) {\r\n const nodes = getChildNodesInFolder(folder.children);\r\n childNodes = childNodes.concat(nodes);\r\n }\r\n });\r\n\r\n const childFolders = childNodes.filter((item) => item.data.type === 'folder');\r\n\r\n return folders.concat(childFolders);\r\n};\r\n\r\nexport const getAllExpandedKeys = (treeData) => {\r\n return getAllFoldersInTreeData(treeData).map((folder) => folder.key);\r\n};\r\n\r\nexport const getFilesAfterExpandingAll = async ({\r\n folderNodes,\r\n id,\r\n storageServiceType,\r\n multipleImport,\r\n}) => {\r\n const expandedNodes = await getNodesAfterExpandingAll({\r\n folderNodes,\r\n id,\r\n storageServiceType,\r\n multipleImport,\r\n });\r\n\r\n return getAllFilesInFolders(expandedNodes);\r\n};\r\n\r\nexport const generateDestinationFolderPath = async (fullPathIds) => {\r\n let result = '';\r\n\r\n const promises = fullPathIds.map((id) =>\r\n getFolderShortDetail({\r\n id,\r\n IsLoadContent: false,\r\n })\r\n );\r\n\r\n const detailFolderResponses = await Promise.all(promises);\r\n\r\n detailFolderResponses.forEach((resp) => {\r\n const path = resp?.data?.folderName ?? resp?.data?.description;\r\n result = result + `/${path}`;\r\n });\r\n\r\n return result;\r\n};\r\n\r\nexport const getDestinationFolderParams = async (selectedFolder = {}) => {\r\n if (selectedFolder) {\r\n const {\r\n hierarchy,\r\n id: selectedId,\r\n folderName,\r\n description,\r\n } = selectedFolder;\r\n const isRootFolder = hierarchy === '/';\r\n\r\n if (isRootFolder)\r\n return {\r\n destinationPath: `/${folderName ?? description}`,\r\n destinationFolderId: selectedId,\r\n };\r\n\r\n const parentIds = hierarchy\r\n ? hierarchy\r\n .split('/')\r\n .filter(Boolean)\r\n .map((id) => parseInt(id))\r\n : [];\r\n const fullPathIds = parentIds.concat(selectedId);\r\n\r\n const destinationPath = await generateDestinationFolderPath(fullPathIds);\r\n\r\n return {\r\n destinationPath,\r\n destinationFolderId: selectedId,\r\n };\r\n }\r\n\r\n return {};\r\n};\r\n","import { useState, useEffect } from 'react';\r\nimport { useSelector } from 'react-redux';\r\n\r\nimport { CustomNotification } from 'common/components';\r\nimport { NodeTree } from 'common/components/folder/FolderTree';\r\nimport { IconFolderAsset } from '../shared/components';\r\n\r\nimport * as selectorNav from '@redux/branding/selectors';\r\n\r\nimport {\r\n getDestinationFolderParams,\r\n mappingInteropItemsToTreeData,\r\n} from './utils';\r\nimport {\r\n mappingFolderToTreeData,\r\n filterParams,\r\n} from 'common/components/folder/utils';\r\nimport { updateTreeData } from '../shared/utils';\r\nimport { sleep } from 'utils/delay';\r\n\r\nimport { useCheckPermissions, useUserInfo } from 'hooks';\r\n\r\nimport { getInteropListItems } from 'services/interoperability';\r\nimport { getFolderList, getItemsOfFolder } from 'services/new-folder';\r\nimport { getFolderShortDetail } from 'services/folder';\r\n\r\nimport emptyFolderIcon from 'assets/folder/empty-folder.png';\r\nimport folderIcon from 'assets/folder/folder.png';\r\n\r\nimport { ABILITY_ACTION, ABILITY_SUBJECT } from 'static/Permission';\r\n\r\nconst fileParam = {\r\n renderFile: () => {\r\n return {\r\n checkable: true,\r\n selectable: false,\r\n };\r\n },\r\n};\r\n\r\nconst folderParam = {\r\n renderFolder: (node) => {\r\n const { subFolderCount } = node ?? {};\r\n\r\n const isEmptyContents = subFolderCount === 0;\r\n\r\n if (isEmptyContents) {\r\n return {\r\n title: (\r\n \r\n {node.folderName ?? node.description ?? ''}\r\n \r\n }\r\n />\r\n ),\r\n icon: ,\r\n isLeaf: true,\r\n selectable: true,\r\n };\r\n }\r\n return {\r\n title: (\r\n \r\n {node.folderName ?? node.description ?? ''}\r\n \r\n }\r\n />\r\n ),\r\n icon: ,\r\n selectable: true,\r\n };\r\n },\r\n};\r\n\r\nexport const useGetTreeData = ({ multipleImport, storageServiceType }) => {\r\n const [treeData, setTreeData] = useState([]);\r\n const [status, setStatus] = useState('idle');\r\n\r\n useEffect(() => {\r\n setStatus('loading');\r\n getInteropListItems({\r\n pathInfo: null,\r\n storageServiceType,\r\n })\r\n .then((res) => {\r\n if (res.isSuccess) {\r\n setStatus('success');\r\n\r\n const mappedTreeData = mappingInteropItemsToTreeData(\r\n sortInteropData(res?.data?.interopItems),\r\n multipleImport\r\n );\r\n setTreeData(mappedTreeData);\r\n } else {\r\n setStatus('error');\r\n }\r\n })\r\n .catch((err) => {\r\n setStatus('error');\r\n CustomNotification.error(err?.message ?? 'Something went wrong');\r\n });\r\n }, [multipleImport, storageServiceType]);\r\n\r\n const handleSetTreeData = (treeData) => setTreeData(treeData);\r\n\r\n return {\r\n treeData,\r\n handleSetTreeData,\r\n isExpanding: status === 'loading',\r\n };\r\n};\r\n\r\nexport const useImportToFolder = ({ isEnabled: isEnabledProp, searchText }) => {\r\n const { userInfo } = useUserInfo();\r\n\r\n const [folder, setFolder] = useState({\r\n data: [],\r\n status: 'idle',\r\n });\r\n\r\n const [importFolder, setImportFolder] = useState({\r\n isEnabled: false,\r\n selectedFolder: null,\r\n importedFolderParams: {},\r\n });\r\n\r\n const [isCreateSubfolder, setIsCreateSubfolder] = useState(true);\r\n\r\n const removeSelectedFolder = () => {\r\n setImportFolder((prevVal) => ({\r\n ...prevVal,\r\n selectedFolder: null,\r\n importedFolderParams: {},\r\n }));\r\n };\r\n\r\n useEffect(() => {\r\n if (isEnabledProp && importFolder?.isEnabled) {\r\n setFolder((prevVal) => ({\r\n ...prevVal,\r\n status: 'loading',\r\n }));\r\n\r\n const params = {\r\n pageIndex: 1,\r\n pageSize: 9999,\r\n sort: [{ fieldName: 'id', isAscending: false }],\r\n search: { searchText },\r\n filters: searchText\r\n ? [\r\n {\r\n fieldName: 'ownerId',\r\n filterType: 'Equal',\r\n value: userInfo?.companyId,\r\n },\r\n ]\r\n : [\r\n {\r\n fieldName: 'ownerId',\r\n filterType: 'Equal',\r\n value: userInfo?.companyId,\r\n },\r\n {\r\n fieldName: 'level',\r\n filterType: 'Equal',\r\n value: '1',\r\n },\r\n ],\r\n };\r\n\r\n getFolderList(params)\r\n .then((res) => {\r\n if (res.isSuccess) {\r\n const mappedTreeData = mappingFolderToTreeData(\r\n res?.data?.gridData,\r\n folderParam,\r\n fileParam\r\n );\r\n setFolder((prevVal) => ({\r\n ...prevVal,\r\n status: 'success',\r\n data: mappedTreeData,\r\n }));\r\n } else {\r\n setFolder((prevVal) => ({\r\n ...prevVal,\r\n status: 'error',\r\n data: [],\r\n }));\r\n CustomNotification.error(res.message ?? 'Something went wrong');\r\n }\r\n })\r\n .catch((err) => {\r\n setFolder((prevVal) => ({\r\n ...prevVal,\r\n status: 'error',\r\n data: [],\r\n }));\r\n CustomNotification.error(err.message ?? 'Something went wrong');\r\n });\r\n }\r\n }, [isEnabledProp, searchText, userInfo?.companyId, importFolder?.isEnabled]);\r\n\r\n const handleUpdateFolder = async (_, info) => {\r\n if (!info?.selected) {\r\n setImportFolder((prevVal) => ({\r\n ...prevVal,\r\n selectedFolder: null,\r\n importedFolderParams: {},\r\n }));\r\n } else {\r\n const importedFolderParams = await getDestinationFolderParams(\r\n info?.node?.data\r\n );\r\n setImportFolder((prevVal) => ({\r\n ...prevVal,\r\n selectedFolder: info?.node?.data,\r\n importedFolderParams,\r\n }));\r\n }\r\n };\r\n\r\n const handleToggleImportFolder = (value) => {\r\n if (!value) {\r\n setImportFolder((prevVal) => ({\r\n ...prevVal,\r\n isEnabled: value,\r\n selectedFolder: null,\r\n importedFolderParams: {},\r\n }));\r\n } else {\r\n setImportFolder((prevVal) => ({\r\n ...prevVal,\r\n isEnabled: value,\r\n }));\r\n }\r\n };\r\n\r\n const handleLoadMoreItem = async ({ key, children, data }) => {\r\n // if (loadedKeys.includes(key)) return;\r\n\r\n const { id: folderId } = data;\r\n\r\n const params = {\r\n folderId,\r\n pageIndex: 1, // change later\r\n pageSize: 9999,\r\n filters: filterParams['folder'],\r\n sort: [\r\n {\r\n fieldName: 'id',\r\n isAscending: false,\r\n },\r\n ], // new first,\r\n };\r\n\r\n const response = await getItemsOfFolder(params);\r\n\r\n return new Promise(async (resolve) => {\r\n if (children || response === null) {\r\n resolve();\r\n return;\r\n }\r\n\r\n const mappedTreeData = mappingFolderToTreeData(\r\n response?.data?.gridData,\r\n folderParam,\r\n fileParam\r\n );\r\n const newData = updateTreeData(folder?.data, key, mappedTreeData);\r\n await sleep(500); // sleep a little bit to update tree (get idea from antd :))\r\n\r\n setFolder((prevVal) => ({\r\n ...prevVal,\r\n data: newData,\r\n }));\r\n\r\n resolve();\r\n });\r\n };\r\n\r\n const handleToggleCreateSubfolder = (value) => setIsCreateSubfolder(value);\r\n\r\n /**\r\n *\r\n * @param {} nodeId\r\n * @param {*} currentTree\r\n * @param {*} modData\r\n * @returns //! return new tree after modify one node\r\n */\r\n const modifyNodeOnTree = (nodeId, currentTree, modData) => {\r\n const { data, children, isLeaf } = modData || {};\r\n\r\n return currentTree.map((currentNode) => {\r\n const {\r\n data: currentData,\r\n children: currentChildren,\r\n isLeaf: currentIsLeaf,\r\n } = currentNode;\r\n\r\n const { id: currentId } = currentData || {};\r\n\r\n if (currentId === nodeId) {\r\n return {\r\n ...currentNode,\r\n data: data ? data(currentData) : currentData,\r\n children: children ? children(currentChildren) : currentChildren,\r\n isLeaf: isLeaf ? isLeaf(currentIsLeaf) : currentIsLeaf,\r\n icon: ,\r\n };\r\n } else if (currentChildren && currentChildren.length > 0) {\r\n return {\r\n ...currentNode,\r\n children: modifyNodeOnTree(nodeId, currentChildren, modData),\r\n };\r\n }\r\n return currentNode;\r\n });\r\n };\r\n\r\n const onLoadingCreateFolder = async (ms) => {\r\n setFolder((prevVal) => ({\r\n ...prevVal,\r\n status: 'loading',\r\n }));\r\n\r\n await sleep(ms);\r\n };\r\n\r\n const onCreateNewFolderSuccess = async (nodeData) => {\r\n await onLoadingCreateFolder(3000);\r\n\r\n const { id: folderId } = nodeData || {};\r\n\r\n let params = {};\r\n let itemList = [];\r\n let shortDetailFolder = [];\r\n let newTree;\r\n\r\n if (folderId) {\r\n params = {\r\n folderId,\r\n pageIndex: 1, // change later\r\n pageSize: 9999,\r\n filters: filterParams['folder'],\r\n sort: [\r\n {\r\n fieldName: 'id',\r\n isAscending: false,\r\n },\r\n ], // new first,\r\n };\r\n } else {\r\n params = {\r\n pageIndex: 1,\r\n pageSize: 9999,\r\n sort: [{ fieldName: 'id', isAscending: false }],\r\n search: { searchText },\r\n filters: searchText\r\n ? []\r\n : [\r\n {\r\n fieldName: 'level',\r\n filterType: 'Equal',\r\n value: '1',\r\n },\r\n ],\r\n };\r\n }\r\n\r\n itemList = await getFolderList(params);\r\n if (folderId) {\r\n shortDetailFolder = await getFolderShortDetail({\r\n id: folderId,\r\n IsLoadContent: false,\r\n });\r\n }\r\n\r\n const mappedListItemToTreeFormat = mappingFolderToTreeData(\r\n itemList?.data?.gridData,\r\n folderParam,\r\n fileParam\r\n );\r\n\r\n if (!folderId) {\r\n const rootListHaveChildren = folder?.data.filter(\r\n (dataItem) => dataItem?.children\r\n );\r\n\r\n if (rootListHaveChildren?.length > 0) {\r\n newTree = mappedListItemToTreeFormat.map((dataItem) => {\r\n let newDataItem = dataItem;\r\n\r\n for (const rootListItem in rootListHaveChildren) {\r\n if (\r\n dataItem?.data?.id &&\r\n rootListItem?.data?.id === dataItem?.data?.id\r\n ) {\r\n newDataItem = rootListItem;\r\n break;\r\n }\r\n }\r\n return newDataItem;\r\n });\r\n } else {\r\n newTree = mappedListItemToTreeFormat;\r\n }\r\n\r\n setFolder((prevVal) => ({\r\n ...prevVal,\r\n data: newTree,\r\n status: 'success',\r\n }));\r\n } else {\r\n newTree = modifyNodeOnTree(folderId, folder?.data, {\r\n data: (nodeData) => ({\r\n ...nodeData,\r\n subFolderCount: shortDetailFolder?.data?.subFolderCount,\r\n }),\r\n children: () => mappedListItemToTreeFormat,\r\n isLeaf: () => false,\r\n });\r\n await sleep(500); // sleep a little bit to update tree (get idea from antd :))\r\n\r\n setFolder((prevVal) => ({\r\n ...prevVal,\r\n data: newTree,\r\n status: 'success',\r\n }));\r\n }\r\n };\r\n\r\n return {\r\n folderData: folder?.data ?? [],\r\n isEnabledImportFolder: Boolean(importFolder?.isEnabled),\r\n importedFolderParams: {\r\n ...importFolder.importedFolderParams,\r\n },\r\n isCreateSubfolder,\r\n selectedFolder: importFolder?.selectedFolder,\r\n isLoading: folder?.status === 'idle' || folder?.status === 'loading',\r\n handleLoadMoreItem,\r\n handleUpdateFolder,\r\n handleToggleCreateSubfolder,\r\n handleToggleImportFolder,\r\n onCreateNewFolderSuccess,\r\n removeSelectedFolder,\r\n };\r\n};\r\n\r\nexport const useCheckAllowImportToFolder = () => {\r\n const PERMISSION_VIEW_FOLDER = [\r\n {\r\n action: ABILITY_ACTION.VIEW,\r\n subject: ABILITY_SUBJECT.FOLDER,\r\n },\r\n ];\r\n\r\n const hasPermissionViewFolder = useCheckPermissions(PERMISSION_VIEW_FOLDER);\r\n\r\n const { canAccessFolders } = useSelector(selectorNav.getBranding()) ?? {};\r\n\r\n return hasPermissionViewFolder && canAccessFolders;\r\n};\r\n\r\nexport const useCheckAllowCreateFolder = () => {\r\n const PERMISSION_CREATE_FOLDER = [\r\n {\r\n action: ABILITY_ACTION.CREATE,\r\n subject: ABILITY_SUBJECT.FOLDER,\r\n },\r\n ];\r\n\r\n const hasPermissionCreateFolder = useCheckPermissions(\r\n PERMISSION_CREATE_FOLDER\r\n );\r\n\r\n const { canAccessFolders } = useSelector(selectorNav.getBranding()) ?? {};\r\n\r\n return hasPermissionCreateFolder && canAccessFolders;\r\n};\r\n\r\n// move folders to top\r\nconst sortInteropData = (data = []) => {\r\n const folders = data.filter((item) => item.type === 'folder');\r\n const files = data.filter((item) => item.type === 'file');\r\n return folders.concat(files);\r\n};\r\n","import React, { useState, useEffect, useCallback } from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\n\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { Row, Typography, Col, Switch } from 'antd';\r\n\r\nimport * as _ from 'lodash';\r\nimport classnames from 'classnames';\r\n\r\n//* SAGA\r\nimport * as assetActions from 'pages/asset-full-view/controllers/actions';\r\nimport * as assetSelectors from 'pages/asset-full-view/controllers/selectors';\r\nimport * as homeActions from 'pages/home/ribbon/asset-full/controllers/actions';\r\n\r\n//* COMPONENTS\r\nimport UploadFile from 'common/components/uploadFile/UploadFile';\r\nimport {\r\n AssetFtpList,\r\n IframeAsset,\r\n AssetDropboxUpload,\r\n AssetUploadSelect,\r\n AssetToFolder,\r\n ConfirmContent,\r\n} from 'pages/asset-full-view/components';\r\n\r\n//* UTILS\r\nimport { forwardTo } from 'utils/common/route';\r\n\r\n//* DEFINDE\r\nimport {\r\n ASSET_UPLOAD_TYPE,\r\n ASSET_UPLOAD_METHOD_DEFINE,\r\n} from 'static/Constants';\r\n\r\n//* STYLING\r\nimport './AssetUpload.less';\r\nimport { useCheckAllowImportToFolder, useImportToFolder } from './shared/hooks';\r\n\r\nimport { TYPE_VIEW_ASSET } from 'static/Constants';\r\n\r\nconst { Title } = Typography;\r\n\r\nfunction AssetUpload(props) {\r\n const {\r\n isBase64,\r\n apiUrl,\r\n ftpApiUrl,\r\n getLocalFileResponse,\r\n getFtpFileResponse,\r\n onlyAcceptImage,\r\n manualUpload,\r\n showMultiple,\r\n multiple = false,\r\n base64UploadKey,\r\n multipleImport,\r\n callbackDataList,\r\n customRequestFtp,\r\n maxSize,\r\n getFileChange,\r\n showList,\r\n additionalBodyPayload,\r\n showUploadSuccessMsg,\r\n showXlsTemplate,\r\n templateUrl,\r\n confirmBeforeUpload,\r\n methodList = ASSET_UPLOAD_METHOD_DEFINE.DEFAULT,\r\n isShowCancelButton,\r\n handleCancel = () => {},\r\n showServerMessage,\r\n formInstance,\r\n uploadType,\r\n setUploadType,\r\n idSelectionDropbox,\r\n setIdSelectionDropbox,\r\n typeViewAsset,\r\n } = props;\r\n\r\n const isCreateAssetView = typeViewAsset === TYPE_VIEW_ASSET.CREATE_ASSET;\r\n\r\n const [searchText, setSearchText] = useState('');\r\n\r\n const {\r\n isEnabledImportFolder,\r\n importedFolderParams,\r\n folderData,\r\n isLoading,\r\n selectedFolder,\r\n isCreateSubfolder,\r\n handleLoadMoreItem,\r\n handleUpdateFolder,\r\n handleToggleCreateSubfolder,\r\n handleToggleImportFolder,\r\n onCreateNewFolderSuccess,\r\n removeSelectedFolder,\r\n } = useImportToFolder({\r\n isEnabled: Boolean(isCreateAssetView),\r\n searchText,\r\n });\r\n\r\n const isAllowImportToFolder = useCheckAllowImportToFolder();\r\n\r\n const dispatch = useDispatch();\r\n const ftpList = useSelector(assetSelectors.makeSelectFtpFileList());\r\n\r\n const getFtpListIfNeed = useCallback((uploadType) => {\r\n if (\r\n uploadType !== ASSET_UPLOAD_TYPE.UPLOAD_LOCAL_FILE.name &&\r\n ASSET_UPLOAD_TYPE[uploadType].params\r\n ) {\r\n dispatch(\r\n assetActions.getFtpFileList(ASSET_UPLOAD_TYPE[uploadType].params)\r\n );\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n getFtpListIfNeed(uploadType);\r\n }, [uploadType, dispatch, getFtpListIfNeed]);\r\n\r\n const onCreateIframeSuccess = (id, metaData) => {\r\n dispatch(assetActions.cancelUpdateSuccess());\r\n dispatch(assetActions.createDigitalAssetFullSuccess(metaData));\r\n dispatch(homeActions.editAsset());\r\n dispatch(homeActions.creatingAsset());\r\n forwardTo(`/asset/${id}`);\r\n };\r\n\r\n const destinationFolder = {\r\n destinationFolder: selectedFolder,\r\n isCreateSubfolder,\r\n };\r\n\r\n const {\r\n isUploadFromLocal,\r\n isUploadFromFtp,\r\n isUploadFromUrl,\r\n isUploadFromDropbox,\r\n } = getTypeUpload(uploadType);\r\n\r\n const UploadTypeToArray = _.toArray(ASSET_UPLOAD_TYPE);\r\n\r\n const includeSubFolders =\r\n isEnabledImportFolder && (isUploadFromFtp || isUploadFromDropbox)\r\n ? { includeSubFolders: isCreateSubfolder }\r\n : null;\r\n\r\n const AdditionalBodyPayloadFolder = {\r\n ...additionalBodyPayload,\r\n ...importedFolderParams,\r\n ...includeSubFolders,\r\n };\r\n\r\n const importToFolderParams = {\r\n ...importedFolderParams,\r\n ...includeSubFolders,\r\n };\r\n\r\n const uploadInLocalParams = {\r\n ...AdditionalBodyPayloadFolder,\r\n StorageServiceType: 'local',\r\n };\r\n\r\n if (isUploadFromUrl)\r\n return (\r\n \r\n );\r\n\r\n return (\r\n
\r\n
\r\n \r\n \r\n {!multipleImport\r\n ? UploadTypeToArray.map((uploadOption) => (\r\n <React.Fragment key={'upload-titlle-' + uploadOption.name}>\r\n {uploadType === uploadOption.name &&\r\n uploadOption.title &&\r\n uploadOption.title}\r\n </React.Fragment>\r\n ))\r\n : 'Choose Files To Import'}\r\n \r\n\r\n {isCreateAssetView && isAllowImportToFolder && (\r\n handleToggleImportFolder(check)}\r\n checked={isEnabledImportFolder}\r\n />\r\n )}\r\n\r\n \r\n
\r\n\r\n
\r\n
\r\n {isUploadFromLocal && (\r\n {\r\n getLocalFileResponse && getLocalFileResponse(result);\r\n }}\r\n manualUpload={manualUpload}\r\n multiple={multiple}\r\n onlyAcceptImage={onlyAcceptImage}\r\n showMultiple={showMultiple}\r\n base64UploadKey={base64UploadKey}\r\n multipleImport={multipleImport}\r\n callbackDataList={callbackDataList}\r\n maxSize={maxSize}\r\n getFileChange={getFileChange}\r\n showList={showList}\r\n additionalBodyPayload={uploadInLocalParams}\r\n showUploadSuccessMsg={showUploadSuccessMsg}\r\n showXlsTemplate={showXlsTemplate}\r\n templateUrl={templateUrl}\r\n confirmBeforeUpload={\r\n \r\n }\r\n isShowCancelButton={isShowCancelButton}\r\n handleCancel={handleCancel}\r\n showServerMessage={showServerMessage}\r\n />\r\n }\r\n destinationFolder={\r\n {\r\n removeSelectedFolder();\r\n setSearchText(searchText);\r\n }}\r\n onUpdateFolder={handleUpdateFolder}\r\n loadData={handleLoadMoreItem}\r\n onToggleCreateSubfolder={handleToggleCreateSubfolder}\r\n subFolderParams={{\r\n isShow: isUploadFromFtp || isUploadFromDropbox,\r\n isCreateSubfolder,\r\n }}\r\n selectedItem={selectedFolder}\r\n onCreateNewFolderSuccess={onCreateNewFolderSuccess}\r\n />\r\n }\r\n />\r\n )}\r\n {isUploadFromFtp && (\r\n {\r\n getFtpFileResponse && getFtpFileResponse(result);\r\n }}\r\n showUploadSuccessMsg={showUploadSuccessMsg}\r\n showXlsTemplate={showXlsTemplate}\r\n templateUrl={templateUrl}\r\n // confirmBeforeUpload={\r\n // \r\n // }\r\n destinationFolder={destinationFolder}\r\n formInstance={formInstance}\r\n handleCloseModal={handleCancel}\r\n typeViewAsset={typeViewAsset}\r\n multiImportFormValue={additionalBodyPayload}\r\n importedFolderParams={AdditionalBodyPayloadFolder}\r\n isEnabledImportFolder={isEnabledImportFolder}\r\n />\r\n }\r\n destinationFolder={\r\n setSearchText(searchText)}\r\n onUpdateFolder={handleUpdateFolder}\r\n loadData={handleLoadMoreItem}\r\n onToggleCreateSubfolder={handleToggleCreateSubfolder}\r\n subFolderParams={{\r\n isShow: isUploadFromFtp || isUploadFromDropbox,\r\n isCreateSubfolder,\r\n }}\r\n selectedItem={selectedFolder}\r\n onCreateNewFolderSuccess={onCreateNewFolderSuccess}\r\n />\r\n }\r\n />\r\n )}\r\n\r\n {isUploadFromDropbox && (\r\n \r\n }\r\n destinationFolder={\r\n setSearchText(searchText)}\r\n onUpdateFolder={handleUpdateFolder}\r\n loadData={handleLoadMoreItem}\r\n onToggleCreateSubfolder={handleToggleCreateSubfolder}\r\n subFolderParams={{\r\n isShow: isUploadFromFtp || isUploadFromDropbox,\r\n isCreateSubfolder,\r\n }}\r\n selectedItem={selectedFolder}\r\n onCreateNewFolderSuccess={onCreateNewFolderSuccess}\r\n />\r\n }\r\n />\r\n )}\r\n
\r\n
\r\n
\r\n \r\n );\r\n}\r\n\r\nconst ImportAssetSection = ({\r\n isEnabledImportFolder,\r\n assetUpload,\r\n destinationFolder,\r\n ...rest\r\n}) => {\r\n return (\r\n <>\r\n \r\n {assetUpload}\r\n {isEnabledImportFolder ? (\r\n {destinationFolder}\r\n ) : null}\r\n \r\n \r\n );\r\n};\r\n\r\nconst getTypeUpload = (uploadType) => {\r\n const isUploadFromDropbox =\r\n uploadType === ASSET_UPLOAD_TYPE.UPLOAD_DROP_BOX_FILE.name;\r\n const isUploadFromFtp =\r\n uploadType === ASSET_UPLOAD_TYPE.UPLOAD_ADV_FTP_FILE.name;\r\n const isUploadFromLocal =\r\n uploadType === ASSET_UPLOAD_TYPE.UPLOAD_LOCAL_FILE.name;\r\n const isUploadFromUrl = uploadType === ASSET_UPLOAD_TYPE.UPLOAD_URL.name;\r\n\r\n return {\r\n isUploadFromDropbox,\r\n isUploadFromFtp,\r\n isUploadFromLocal,\r\n isUploadFromUrl,\r\n };\r\n};\r\n\r\nAssetUpload.propTypes = {\r\n //? isBase64 - base64 upload for local file upload\r\n isBase64: PropTypes.bool,\r\n //? apiUrl - api to upload file\r\n apiUrl: PropTypes.string,\r\n //? ftpApiUrl - api to upload ftp file\r\n ftpApiUrl: PropTypes.string,\r\n //? getLocalFileResponse - get reponse to handle\r\n getLocalFileResponse: PropTypes.func,\r\n //? getFtpFileResponse - get reponse to handle\r\n getFtpFileResponse: PropTypes.func,\r\n //? onlyAccepImage - only accept raster image that allow Preview\r\n onlyAcceptImage: PropTypes.bool,\r\n //? manualUpload - upload by click upload button instead of auto upload\r\n manualUpload: PropTypes.bool,\r\n //todo - showMultiple - show multiple file or signle file - in development\r\n showMultiple: PropTypes.bool,\r\n //? multiple: accept multiple files or not\r\n multiple: PropTypes.bool,\r\n //? ftpList - ftp files returned from server\r\n ftpList: PropTypes.object,\r\n //todo - base64 upload key - pass key as id of thumbnail\r\n base64UploadKey: PropTypes.string,\r\n //? customRequestFtp - get selected files and custom request of ftp upload\r\n customRequestFtp: PropTypes.func,\r\n //? maxSize: max file size\r\n maxSize: PropTypes.number,\r\n multipleImport: PropTypes.bool,\r\n callbackDataList: PropTypes.func,\r\n};\r\n\r\nexport default AssetUpload;\r\n","import React, { useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Select } from 'antd';\r\nimport * as _ from 'lodash';\r\nimport { useSelector, useDispatch } from 'react-redux';\r\n\r\nimport gridSelector from 'common/components/grid-view/controllers/selectors';\r\nimport * as selectors from 'pages/company-profile/controllers/selectors';\r\nimport * as memberActions from 'pages/company-profile/controllers/actions';\r\nimport userSelectors from '@redux/user/selectors';\r\n\r\nimport { WrapperSelect } from 'common/components';\r\n\r\nimport { ASSET_UPLOAD_TYPE, TYPE_VIEW_ASSET } from 'static/Constants';\r\n\r\nimport { useCheckIsSuperAdmin } from 'hooks';\r\n\r\nconst { Option } = Select;\r\n\r\nconst AssetUploadOption = (props) => {\r\n const {\r\n setUploadType,\r\n uploadType,\r\n methodList = [],\r\n isMultipleImport = false,\r\n typeViewAsset,\r\n } = props;\r\n\r\n const dispatch = useDispatch();\r\n const isSuperAdmin = useCheckIsSuperAdmin();\r\n\r\n const memberInfo = useSelector(selectors.selectMemberProfile());\r\n\r\n const userInfo = useSelector(userSelectors.makeSelectUserInfo());\r\n\r\n const itemCurrentSelection = useSelector(\r\n gridSelector.makeSelectItemCurrentSelection()\r\n );\r\n useEffect(() => {\r\n if (_.isEmpty(memberInfo)) {\r\n dispatch(memberActions.getMemberProfileHeader(userInfo?.member?.id));\r\n }\r\n }, [dispatch, userInfo?.member?.id]);\r\n\r\n const disabledBtnUpload = ({\r\n itemCurrentSelection,\r\n isMultipleImport,\r\n uploadOption,\r\n memberInfo,\r\n methodList,\r\n typeViewAsset,\r\n }) => {\r\n if (!methodList.includes(uploadOption.name)) return true;\r\n\r\n if (\r\n uploadOption.name === 'UPLOAD_URL' &&\r\n (typeViewAsset === TYPE_VIEW_ASSET.REPLACE_ASSET ||\r\n typeViewAsset === TYPE_VIEW_ASSET.REPLACE_THUMBNAIL) &&\r\n (isMultipleImport || !itemCurrentSelection?.isIFrame)\r\n )\r\n return true;\r\n\r\n if (uploadOption.disabled) return true;\r\n\r\n if (\r\n uploadOption.name === 'UPLOAD_ADV_FTP_FILE' &&\r\n !memberInfo?.ftpEnabled &&\r\n !isSuperAdmin\r\n )\r\n return true;\r\n\r\n if (\r\n uploadOption.name === 'UPLOAD_DROP_BOX_FILE' &&\r\n !memberInfo?.canAccessInterops &&\r\n !isSuperAdmin\r\n )\r\n return true;\r\n\r\n return false;\r\n };\r\n\r\n return (\r\n {\r\n setUploadType(value);\r\n }}\r\n value={uploadType}\r\n allowClear={false}\r\n >\r\n {_.toArray(ASSET_UPLOAD_TYPE).map((uploadOption) => {\r\n return (\r\n \r\n {uploadOption.optionName}\r\n \r\n );\r\n })}\r\n \r\n );\r\n};\r\n\r\nAssetUploadOption.propTypes = {\r\n setUploadType: PropTypes.func,\r\n uploadType: PropTypes.string,\r\n disableOptions: PropTypes.arrayOf(PropTypes.string),\r\n};\r\n\r\nexport default AssetUploadOption;\r\n","import React, { useState, useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport {\r\n SendOutlined,\r\n FileExcelOutlined,\r\n LinkOutlined,\r\n CloseOutlined,\r\n LoadingOutlined,\r\n} from '@ant-design/icons';\r\nimport {\r\n Typography,\r\n Button,\r\n Skeleton,\r\n Empty,\r\n Row,\r\n Col,\r\n Tooltip,\r\n Image,\r\n Result,\r\n} from 'antd';\r\nimport Messages from 'i18n/messages/messageAssetUpload';\r\nimport { FormattedMessage } from 'react-intl';\r\nimport classnames from 'classnames';\r\nimport * as _ from 'lodash';\r\nimport { useMedia } from 'react-media';\r\n\r\n//* COMPONENT\r\nimport { CustomNotification, dialogFunction } from 'common/components';\r\nimport { SelectedFile, TreeFiles } from './shared/components';\r\nimport { ConfirmContent } from 'pages/asset-full-view/components';\r\nimport xls from 'assets/file-formats/xls.png';\r\n\r\n//* UTILS\r\nimport * as api from 'config/axios';\r\nimport { DataToMsOffice } from 'utils/dataToMSoffice';\r\nimport * as globalActions from '@redux/global/actions';\r\n\r\nimport {\r\n mappingInteropItemsToTreeData,\r\n getExpandedData,\r\n updateTreeData,\r\n findNodeTree,\r\n getChildNodesInFolder,\r\n filterArrayInAnotherArray,\r\n filterArrayObjectInAnotherArrayObject,\r\n findAncestorsOfChildNode,\r\n getOnlySelectedParentItems,\r\n getFormDataParams,\r\n filterFoldersAndFilesInSelectedItems,\r\n getFormValues,\r\n getFilesPath,\r\n getFoldersPath,\r\n findListNodeInTree,\r\n getAllFilesInFolders,\r\n getFilesAfterExpandingAll,\r\n} from './shared/utils';\r\n\r\nimport { useCheckAllowCreateFolder, useGetTreeData } from './shared/hooks';\r\nimport { useDispatchReloadPage } from 'hooks/useReloadPage';\r\n\r\n//* MAPPERS\r\n// import mapFtpListToAntTree from './mappers/mapFtpListToAntTree';\r\n// import mapFtpListFile from './mappers/mapFtpListFile';\r\n\r\nimport {\r\n createReplacedAsset,\r\n importAssetsFromInterop,\r\n} from 'services/interoperability';\r\n\r\nimport * as homeActions from 'pages/home/ribbon/asset-full/controllers/actions';\r\nimport * as assetActions from 'pages/asset-full-view/controllers/actions';\r\nimport gridSelector from 'common/components/grid-view/controllers/selectors';\r\nimport * as ribbonSelector from '@redux/ribbon/selectors';\r\nimport * as brandingActions from '@redux/branding/actions';\r\nimport * as assetSelectors from 'pages/asset-full-view/controllers/selectors';\r\n\r\nimport CreateFolderModal from 'pages/home/ribbon/components/controls/folders/CreateFolderModal';\r\n\r\nimport { forwardTo, navigateToRouteAsset } from 'utils/common/route';\r\nimport { sleep } from 'utils/delay';\r\nimport { isImageType } from 'utils/fileType';\r\nimport { getVirtualScrollHeight } from './shared/utils';\r\n\r\nimport { GLOBAL_MEDIA_QUERIES } from 'static/MediaQuery';\r\nimport { RIBBON_VIEW, ROUTE } from 'static/Constants';\r\n\r\n//* STYLING\r\n\r\nimport * as damServices from 'services/digitalAsset';\r\n\r\nimport './AssetFtpList.less';\r\n\r\nconst { Title, Text } = Typography;\r\n\r\nfunction AssetFtpList(props) {\r\n const {\r\n ftpListFile,\r\n multiple,\r\n multipleImport = false,\r\n callbackDataList,\r\n templateUrl,\r\n formInstance,\r\n typeViewAsset,\r\n handleCloseModal,\r\n confirmBeforeUpload,\r\n importedFolderParams = {},\r\n isEnabledImportFolder,\r\n destinationFolder,\r\n multiImportFormValue,\r\n } = props;\r\n\r\n const reloadPage = useDispatchReloadPage();\r\n\r\n const [selectedFile, setSelectedFile] = useState(null);\r\n const [xlsList, setXlsList] = useState(undefined);\r\n const [statusLoading, setStatusLoading] = useState('idle');\r\n const [visibleModal, setVisibleModal] = useState(false);\r\n\r\n const isHasDestinationFolder = Boolean(\r\n importedFolderParams?.destinationFolderId\r\n );\r\n\r\n const dispatch = useDispatch();\r\n\r\n const replacedGridAsset = useSelector(\r\n gridSelector.makeSelectItemCurrentSelection()\r\n );\r\n\r\n const replacedFullView = useSelector(assetSelectors.assetDataLoading());\r\n\r\n const isAllowCreateFolder = useCheckAllowCreateFolder();\r\n\r\n const isAssetFullView =\r\n useSelector(ribbonSelector.selectRibbon()) ===\r\n RIBBON_VIEW.ASSET_FULL_VIEW.NAME;\r\n\r\n const assetId = isAssetFullView\r\n ? replacedFullView?.id\r\n : replacedGridAsset?.id;\r\n\r\n const matches = useMedia({ queries: GLOBAL_MEDIA_QUERIES });\r\n\r\n const largeScreen = matches.lg || matches.md || matches.xl;\r\n\r\n const updateProgressBar = (selectedItems = [], status, percent) => {\r\n if (status === 'error' || status === 'done' || status === 'uploading') {\r\n selectedItems.forEach((fileItem) => {\r\n dispatch(\r\n globalActions.updateProgressBar({\r\n type: 'upload',\r\n name: fileItem.data.path,\r\n percent,\r\n status,\r\n uid: fileItem.data.itemId,\r\n })\r\n );\r\n });\r\n }\r\n };\r\n\r\n const virtualScrollHeight = getVirtualScrollHeight(\r\n largeScreen,\r\n multipleImport\r\n );\r\n\r\n const handleReplaceSingleAsset = async () => {\r\n const singleItem = selectedItems[0];\r\n const params = {\r\n storageServiceType: 'ftp',\r\n filePath: [singleItem.data.path],\r\n };\r\n\r\n const formData = getFormDataParams(params);\r\n\r\n updateProgressBar(selectedItems, 'uploading', 0);\r\n\r\n try {\r\n const response = await createReplacedAsset(formData, assetId);\r\n\r\n if (response?.isSuccess) {\r\n const metaData = response.data;\r\n\r\n handleCreateSingleAssetSuccess(metaData);\r\n updateProgressBar(selectedItems, 'done', 100);\r\n } else {\r\n updateProgressBar(selectedItems, 'error', 0);\r\n }\r\n } catch (error) {\r\n updateProgressBar(selectedItems, 'error', 0);\r\n }\r\n };\r\n\r\n const handleCreateSingleAsset = async () => {\r\n const singleItem = selectedItems[0];\r\n\r\n const params = {\r\n storageServiceType: 'ftp', // I don't know why BE does not use 'advFTP'. I cried so much in here, good luck to me\r\n filePaths: [singleItem.data.path],\r\n isCreateThumbs: true,\r\n };\r\n const formData = getFormDataParams(params);\r\n\r\n updateProgressBar(selectedItems, 'uploading', 0);\r\n\r\n try {\r\n const response = await importAssetsFromInterop(formData);\r\n\r\n if (response.isSuccess) {\r\n const metaData = response.data;\r\n handleCreateSingleAssetSuccess(metaData);\r\n updateProgressBar(selectedItems, 'done', 100);\r\n } else {\r\n CustomNotification.error(response?.message ?? 'Something went wrong');\r\n updateProgressBar(selectedItems, 'error', 0);\r\n }\r\n } catch (error) {\r\n CustomNotification.error(error?.message ?? 'Something went wrong');\r\n updateProgressBar(selectedItems, 'error', 0);\r\n }\r\n };\r\n\r\n const handleCreateSingleAssetSuccess = (metaData) => {\r\n const id = metaData.id;\r\n\r\n handleCloseModal();\r\n dispatch(assetActions.cancelUpdateSuccess());\r\n dispatch(assetActions.createDigitalAssetFullSuccess(metaData));\r\n dispatch(homeActions.editAsset());\r\n dispatch(homeActions.creatingAsset());\r\n dispatch(brandingActions.getBrandingNoLoading());\r\n\r\n navigateToRouteAsset({\r\n typeViewAsset,\r\n id,\r\n isMultipleImport: multipleImport,\r\n });\r\n };\r\n\r\n const handleCreateMultipleAssets = async (otherParams = {}) => {\r\n const formValues = getFormValues(formInstance);\r\n const { folders, files } =\r\n filterFoldersAndFilesInSelectedItems(selectedItems);\r\n const filePaths = getFilesPath(folders, files);\r\n const folderPaths = getFoldersPath(folders);\r\n const params = {\r\n id: null,\r\n storageServiceType: 'ftp',\r\n filePaths,\r\n folderPaths,\r\n templateFile: xlsList,\r\n ...importedFolderParams,\r\n ...formValues,\r\n ...otherParams,\r\n };\r\n let formData = getFormDataParams(params);\r\n updateProgressBar(selectedItems, 'uploading', 0);\r\n try {\r\n const response = await importAssetsFromInterop(formData);\r\n if (response?.isSuccess) {\r\n handleCloseModal();\r\n navigateToRouteAsset({\r\n isMultipleImport: multipleImport,\r\n });\r\n dispatch(brandingActions.getBrandingNoLoading());\r\n updateProgressBar(selectedItems, 'done', 100);\r\n CustomNotification.success('Create successfully');\r\n } else {\r\n CustomNotification.error(response?.message ?? 'Something went wrong');\r\n }\r\n } catch (error) {\r\n CustomNotification.error(error?.message ?? 'Something went wrong');\r\n updateProgressBar(selectedItems, 'error', 0);\r\n }\r\n };\r\n\r\n const handleAttachTemplate = () => {\r\n const $input = document.createElement('input');\r\n $input.setAttribute('type', 'file');\r\n const handleSelectFile = (event) => {\r\n let file = event.target.files[0];\r\n if (file) {\r\n if (\r\n file.type ===\r\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'\r\n ) {\r\n setXlsList(file);\r\n CustomNotification.success('The file is attached successfully');\r\n } else {\r\n CustomNotification.error('Only accept xls file');\r\n setXlsList(undefined);\r\n }\r\n }\r\n };\r\n $input.onchange = handleSelectFile;\r\n $input.click();\r\n };\r\n\r\n const handleDownloadTemplate = () => {\r\n api.sendDownload({\r\n url: templateUrl || '/unknown',\r\n });\r\n };\r\n\r\n const handleCopyFileNameToExcel = async () => {\r\n setStatusCopy('loading');\r\n\r\n let copyItems = [];\r\n\r\n const selectedFiles = selectedItems.filter(\r\n (item) => item.data.type === 'file'\r\n );\r\n const selectedFolders = selectedItems.filter(\r\n (item) => item.data.type === 'folder'\r\n );\r\n\r\n if (expandAll.status === 'success') {\r\n const folderNodes = findListNodeInTree(treeData, selectedFolders);\r\n const filesInFolder = getAllFilesInFolders(folderNodes);\r\n\r\n copyItems = selectedFiles.concat(filesInFolder);\r\n } else {\r\n const expandedFiles = await getFilesAfterExpandingAll({\r\n folderNodes: selectedFolders,\r\n id: null,\r\n storageServiceType: 'advFTP',\r\n multipleImport,\r\n });\r\n\r\n copyItems = selectedFiles.concat(expandedFiles);\r\n }\r\n\r\n DataToMsOffice().copy2DArrayClipboardToExcel(\r\n copyItems.map((fileItem) => [fileItem.data.name])\r\n );\r\n\r\n setStatusCopy('success');\r\n };\r\n\r\n const replaceThumbnail = async () => {\r\n const singleItem = selectedItems[0];\r\n const isImgType = isImageType(singleItem?.data?.path);\r\n if (!isImgType) {\r\n CustomNotification.error('Only support image type');\r\n return;\r\n }\r\n const params = {\r\n assetId,\r\n storageServiceType: 'ftp',\r\n filePath: singleItem?.data?.path,\r\n };\r\n const formData = getFormDataParams(params);\r\n setStatusLoading('loading');\r\n try {\r\n const response = await damServices.replaceDigitalAssetsThumbnails(\r\n formData\r\n );\r\n if (response?.isSuccess) {\r\n setStatusLoading('success');\r\n handleCloseModal();\r\n reloadPage({ clearSelection: true });\r\n CustomNotification.success('Replace Preview successfully');\r\n } else {\r\n CustomNotification.error(response?.message ?? 'Something went wrong');\r\n setStatusLoading('error');\r\n }\r\n } catch (error) {\r\n CustomNotification.error(error?.message ?? 'Something went wrong');\r\n setStatusLoading('error');\r\n }\r\n };\r\n\r\n const modalConfirmImportAsset = (otherParams = {}) => {\r\n const newDestinationFolder = otherParams?.destinationFolderId\r\n ? { ...destinationFolder, destinationFolder: { ...otherParams } }\r\n : destinationFolder;\r\n\r\n dialogFunction({\r\n type: 'warn',\r\n content: (\r\n \r\n ),\r\n onOk: async () => {\r\n await sleep(1000);\r\n CustomNotification.warning(\r\n 'Please wait while the import process is being completed. This may require additional time, especially for larger datasets. We appreciate your understanding and patience during this process',\r\n 30\r\n );\r\n handleCreateMultipleAssets(otherParams);\r\n forwardTo(ROUTE.DIGITAL_MEDIA);\r\n },\r\n okText: 'Upload',\r\n width: 450,\r\n });\r\n };\r\n\r\n const handleClickSend = () => {\r\n // If user doesn't have create folder permission, we won't show modal for creating destination folder\r\n const isIgnoreShowModalCreate = !isAllowCreateFolder;\r\n\r\n if (multipleImport) {\r\n if (isIgnoreShowModalCreate) {\r\n modalConfirmImportAsset();\r\n } else if (isEnabledImportFolder && !isHasDestinationFolder) {\r\n setVisibleModal(true);\r\n } else {\r\n modalConfirmImportAsset();\r\n }\r\n return;\r\n } else {\r\n if (typeViewAsset === 'replace-asset') {\r\n handleReplaceSingleAsset();\r\n } else if (typeViewAsset === 'create-asset') {\r\n handleCreateSingleAsset();\r\n } else {\r\n replaceThumbnail();\r\n return;\r\n }\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n setSelectedFile(null);\r\n if (typeof callbackDataList === 'function') callbackDataList([], true);\r\n }, [ftpListFile, callbackDataList]);\r\n\r\n const { treeData, handleSetTreeData } = useGetTreeData({\r\n multipleImport,\r\n storageServiceType: 'advFTP',\r\n });\r\n\r\n const [{ selectedItems, selectedKeys, expandedKeys }, setSelectedFtp] =\r\n useState({\r\n selectedItems: [],\r\n selectedKeys: [],\r\n expandedKeys: [],\r\n });\r\n\r\n /*\r\n status === 'loading': treeData is loading data inside\r\n status === 'success': treeData is already loaded data\r\n */\r\n const [expandAll, setExpandAll] = useState({\r\n value: false,\r\n status: 'idle',\r\n });\r\n\r\n const [statusCopy, setStatusCopy] = useState('idle');\r\n\r\n const handleLoadData = async ({ key, children, data }) => {\r\n if (expandAll.status === 'success') return;\r\n\r\n const { path } = data;\r\n const expandedData = await getExpandedData({\r\n pathInfo: path,\r\n storageServiceType: 'advFTP',\r\n });\r\n\r\n return new Promise((resolve) => {\r\n if (children) {\r\n resolve();\r\n return;\r\n }\r\n const mappedTreeData = mappingInteropItemsToTreeData(\r\n expandedData,\r\n multipleImport\r\n );\r\n const newData = updateTreeData(treeData, key, mappedTreeData);\r\n\r\n handleSetTreeData(newData);\r\n resolve();\r\n });\r\n };\r\n\r\n const handleSelectItems = (keys, { selectedNodes: items }) => {\r\n if (multipleImport) {\r\n const parentSelectedItems = getOnlySelectedParentItems(\r\n treeData,\r\n items,\r\n keys\r\n );\r\n\r\n setSelectedFtp((prevItems) => ({\r\n ...prevItems,\r\n selectedItems: parentSelectedItems,\r\n selectedKeys: keys,\r\n }));\r\n } else {\r\n setSelectedFtp((prevItems) => ({\r\n ...prevItems,\r\n selectedItems: items,\r\n selectedKeys: keys,\r\n }));\r\n }\r\n };\r\n\r\n const handleCheckItems = (keys, { checkedNodes: items }) => {\r\n if (multipleImport) {\r\n const parentSelectedItems = getOnlySelectedParentItems(\r\n treeData,\r\n items,\r\n keys\r\n );\r\n\r\n setSelectedFtp((prevItems) => ({\r\n ...prevItems,\r\n selectedItems: parentSelectedItems,\r\n selectedKeys: keys,\r\n }));\r\n } else {\r\n setSelectedFtp((prevItems) => ({\r\n ...prevItems,\r\n selectedItems: items,\r\n selectedKeys: keys,\r\n }));\r\n }\r\n };\r\n\r\n const handleDeleteItem = (itemId) => {\r\n if (!multipleImport) {\r\n setSelectedFtp((prevItems) => ({\r\n ...prevItems,\r\n selectedItems: [],\r\n selectedKeys: [],\r\n }));\r\n } else {\r\n const foundNode = findNodeTree(treeData, itemId);\r\n const isHaveChildren = foundNode?.children?.length > 0;\r\n\r\n const ancestorNodes = findAncestorsOfChildNode(treeData, foundNode);\r\n const ancestorKeys = ancestorNodes.map((node) => node.key);\r\n\r\n if (isHaveChildren) {\r\n const childNodes = getChildNodesInFolder(foundNode.children);\r\n const childKeys = childNodes.map((node) => node.key);\r\n\r\n const allKeys = [foundNode.key].concat(ancestorKeys).concat(childKeys); // include select key and ancestor keys\r\n const allNodes = [foundNode].concat(ancestorNodes).concat(childNodes);\r\n\r\n const filteredSelectedKeys = filterArrayInAnotherArray(\r\n selectedKeys,\r\n allKeys\r\n );\r\n const filteredSelectedItems = filterArrayObjectInAnotherArrayObject(\r\n selectedItems,\r\n allNodes\r\n );\r\n\r\n setSelectedFtp((prevItems) => ({\r\n ...prevItems,\r\n selectedItems: filteredSelectedItems,\r\n selectedKeys: filteredSelectedKeys,\r\n }));\r\n } else {\r\n const allKeys = [foundNode.key].concat(ancestorKeys); // include select key and ancestor keys\r\n const allNodes = [foundNode].concat(ancestorNodes);\r\n\r\n const filteredSelectedKeys = filterArrayInAnotherArray(\r\n selectedKeys,\r\n allKeys\r\n );\r\n const filteredSelectedItems = filterArrayObjectInAnotherArrayObject(\r\n selectedItems,\r\n allNodes\r\n );\r\n\r\n setSelectedFtp((prevItems) => ({\r\n ...prevItems,\r\n selectedItems: filteredSelectedItems,\r\n selectedKeys: filteredSelectedKeys,\r\n }));\r\n }\r\n }\r\n };\r\n // after 30 days if the function is not restored please delete this code, thanks\r\n\r\n // const handleExpandAllFiles = async (event) => {\r\n // const checked = event.target.checked;\r\n\r\n // if (checked) {\r\n // setExpandAll((prevVal) => ({ ...prevVal, value: checked }));\r\n\r\n // // If treeData loaded data, then does not need to call api again.\r\n // if (expandAll.status !== 'success') {\r\n // setExpandAll((prevVal) => ({ ...prevVal, status: 'loading' }));\r\n\r\n // const newTreeData = await getTreeDataAfterExpandingAll({\r\n // treeData,\r\n // id: null,\r\n // storageServiceType: 'advFTP',\r\n // multipleImport,\r\n // });\r\n\r\n // const expandedKeys = getAllExpandedKeys(newTreeData);\r\n\r\n // setSelectedFtp((prevItems) => ({\r\n // ...prevItems,\r\n // expandedKeys,\r\n // }));\r\n\r\n // handleSetTreeData(newTreeData);\r\n // setExpandAll((prevVal) => ({ ...prevVal, status: 'success' }));\r\n // } else {\r\n // const expandedKeys = getAllExpandedKeys(treeData);\r\n\r\n // setSelectedFtp((prevItems) => ({\r\n // ...prevItems,\r\n // expandedKeys,\r\n // }));\r\n // }\r\n // } else {\r\n // setExpandAll((prevVal) => ({ ...prevVal, value: checked }));\r\n // setSelectedFtp((prevItems) => ({\r\n // ...prevItems,\r\n // expandedKeys: [],\r\n // }));\r\n // }\r\n // };\r\n\r\n const handleExpandItems = (expandedKeys) => {\r\n setSelectedFtp((prevItems) => ({\r\n ...prevItems,\r\n expandedKeys,\r\n }));\r\n };\r\n\r\n const ftpListError = _.get(ftpListFile, 'error');\r\n\r\n const disabledBtn = selectedItems.length === 0;\r\n\r\n return (\r\n <>\r\n \r\n
\r\n
\r\n
\r\n \r\n <FormattedMessage {...Messages.ftpHeader} />\r\n \r\n {/* \r\n Expand All\r\n */}\r\n
\r\n\r\n \r\n {ftpListError ? (\r\n \r\n ) : treeData?.length ? (\r\n \r\n ) : (\r\n \r\n )}\r\n
\r\n
\r\n \r\n \r\n Selected Items\r\n {xlsList && multipleImport && (\r\n <Row className='asset-ftp__sub-title-xls'>\r\n <Col>\r\n <Tooltip title={xlsList.name}>\r\n <Image\r\n className='asset-ftp__sub-title-xls-img'\r\n height={28}\r\n width={23}\r\n src={xls}\r\n placeholder={\r\n <LoadingOutlined\r\n style={{ fontSize: 27, backgroundColor: 'white' }}\r\n />\r\n }\r\n preview={false}\r\n />\r\n </Tooltip>\r\n </Col>\r\n <Col\r\n className='asset-ftp__sub-title-xls-delete'\r\n style={{ paddingLeft: 4 }}\r\n >\r\n <CloseOutlined onClick={() => setXlsList(undefined)} />\r\n </Col>\r\n </Row>\r\n )}\r\n \r\n\r\n \r\n \r\n \r\n {selectedItems.map((item) => (\r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n \r\n {multipleImport && (\r\n \r\n }\r\n onClick={handleDownloadTemplate}\r\n disabled\r\n >\r\n Download xls Template\r\n \r\n\r\n }\r\n onClick={handleCopyFileNameToExcel}\r\n disabled\r\n >\r\n Copy All Selected Items\r\n \r\n\r\n }\r\n onClick={handleAttachTemplate}\r\n disabled\r\n >\r\n Attach file (.xls)\r\n \r\n \r\n )}\r\n }\r\n loading={statusLoading === 'loading'}\r\n disabled={disabledBtn}\r\n onClick={() => handleClickSend()}\r\n >\r\n Send\r\n {multipleImport &&\r\n selectedFile &&\r\n selectedFile?.length > 0 && (\r\n \r\n {selectedFile.length}\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n\r\n {isAllowCreateFolder && (\r\n {\r\n modalConfirmImportAsset({\r\n destinationFolderId: responseData?.id,\r\n });\r\n }}\r\n additionalButton={() => {\r\n return (\r\n \r\n modalConfirmImportAsset()}\r\n >\r\n Continue without destination folder\r\n \r\n \r\n );\r\n }}\r\n />\r\n )}\r\n \r\n );\r\n}\r\n\r\nAssetFtpList.propTypes = {\r\n //? ftpListFile - ftp files list\r\n ftpListFile: PropTypes.object,\r\n //? apiUrl - to post Ftp File\r\n apiUrl: PropTypes.string,\r\n //? getResponse - send response to prarent to process\r\n getResponse: PropTypes.func,\r\n //? onlyAccpetImage - only show image ftp file\r\n onlyAccpetImage: PropTypes.bool,\r\n //? customRequestFtp - custom request of ftp method\r\n customRequestFtp: PropTypes.func,\r\n multipleImport: PropTypes.bool,\r\n callbackDataList: PropTypes.func,\r\n};\r\n\r\nexport default AssetFtpList;\r\n","import React, { useState, useEffect, useCallback } from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useHistory } from 'react-router-dom';\r\n\r\nimport {\r\n Input,\r\n Checkbox,\r\n Select,\r\n Tabs,\r\n Col,\r\n Row,\r\n Tag,\r\n InputNumber,\r\n DatePicker,\r\n} from 'antd';\r\nimport classnames from 'classnames';\r\n\r\nimport {\r\n Form,\r\n dialogFunction,\r\n WrapperSelect,\r\n AssetTypeEdit,\r\n} from 'common/components';\r\nimport AssetCreator from '../metadata-panel/AssetCreator';\r\nimport iconList from 'common/components/icon-list/assets';\r\nimport { ConfirmContentAsEdit } from 'pages/asset-full-view/components';\r\n\r\nimport * as globalSelectors from '@redux/global/selectors';\r\nimport * as actionsGlobal from '@redux/global/actions';\r\nimport userSelectors from '@redux/user/selectors';\r\nimport * as actionsRibbon from 'pages/home/ribbon/asset-full/controllers/actions';\r\nimport * as companySelectors from 'pages/company-profile/controllers/selectors';\r\nimport memberReducer from 'pages/company-profile/controllers/reducer';\r\nimport saga from 'pages/company-profile/controllers/saga';\r\nimport * as memberActions from 'pages/company-profile/controllers/actions';\r\n\r\nimport assetSelectors from 'pages/home/ribbon/asset-full/controllers/selectors';\r\nimport * as actions from '../../controllers/actions';\r\nimport * as selectors from '../../controllers/selectors';\r\n\r\nimport * as constants from 'static/Constants';\r\n\r\nimport { FormattedMessage, injectIntl } from 'react-intl';\r\nimport Messages from 'i18n/messages/asset-full-view.js';\r\nimport messages from 'i18n/messages/assetDetail';\r\n\r\nimport sortByKey from 'utils/sortByKey';\r\nimport {\r\n exportFormDateWithoutTime,\r\n formatRangeDateTime,\r\n} from 'utils/formatDate';\r\nimport { getDateFormat } from 'utils/formatDate';\r\nimport { formatSizeUnits } from 'utils/formatSizeUnits';\r\nimport { getParameterFromQuery } from 'utils/common/route';\r\n\r\nimport { useInjectSaga } from 'utils/common/injectSaga';\r\nimport { useInjectReducer } from 'utils/common/injectedReducers';\r\nimport { useValidateStatusField } from 'hooks/useValidateStatusField';\r\nimport { useGetMemberHeaderFromMemberId } from 'common/queries/member-module';\r\n\r\nimport './AssetEdit.less';\r\n\r\nconst { RangePicker } = DatePicker;\r\n\r\nconst formItemOverView = {\r\n labelCol: { span: 12 },\r\n wrapperCol: { span: 12 },\r\n};\r\n\r\nconst AssetEdit = (props) => {\r\n const history = useHistory();\r\n const dispatch = useDispatch();\r\n\r\n useInjectReducer({ key: 'member', reducer: memberReducer });\r\n useInjectSaga({ key: 'member', saga });\r\n\r\n const [form] = Form.useForm();\r\n\r\n const { assetData, openItemFormData, intl } = props;\r\n const [typeData, setTypeData] = useState({\r\n assetType: assetData?.assetType,\r\n assetSubType: assetData?.assetSubType,\r\n packageLevel: assetData?.metadata?.packageLevel || assetData?.packageLevel,\r\n packagingDisposition:\r\n assetData?.metadata?.packagingDisposition ||\r\n assetData?.packagingDisposition,\r\n angle: assetData?.metadata?.angle || assetData?.angle,\r\n facing: assetData?.metadata?.facing || assetData?.facing,\r\n language: assetData?.metadata?.language || assetData?.language,\r\n panelType: assetData?.metadata?.panelType || assetData?.panelType,\r\n logoType: assetData?.metadata?.logoType || assetData?.logoType,\r\n certificateType:\r\n assetData?.metadata?.certificateType || assetData?.certificateType,\r\n documentType: assetData?.metadata?.documentType || assetData?.documentType,\r\n });\r\n const [tagsMode, setTagsMode] = useState('tags');\r\n const [tags, setTags] = useState([]);\r\n\r\n const saving = useSelector(assetSelectors.selectAssetSaving());\r\n const requiredFields = useSelector(selectors.selectRequiredFields());\r\n const authorizedTagsInfo = useSelector(selectors.selectAuthorizedTags());\r\n const isEdit = useSelector(assetSelectors.selectAssetEdit);\r\n const isAddingOpenItemFormData = useSelector(\r\n globalSelectors.selectIsAddingOpenItemFormData()\r\n );\r\n const userInfo = useSelector(userSelectors.makeSelectUserInfo());\r\n const memberInfo = useSelector(companySelectors.selectMemberProfile());\r\n\r\n const isCreating = Boolean(getParameterFromQuery('draft'));\r\n\r\n const { enforceTagRestrictions, authorizedTags } = authorizedTagsInfo;\r\n\r\n const { statusValidateProps } = useValidateStatusField({\r\n form,\r\n entityType: 'Asset',\r\n entityId: assetData?.id,\r\n placement: 'bottomRight',\r\n });\r\n\r\n const { data: memberHeaderOfAssetOwner } = useGetMemberHeaderFromMemberId({\r\n memberId: assetData?.ownerId,\r\n enabled: Boolean(assetData && assetData?.ownerId),\r\n });\r\n\r\n const isPrivateVisibilityAsset =\r\n memberHeaderOfAssetOwner?.digitalAssets?.toLowerCase() === 'private';\r\n\r\n useEffect(() => {\r\n dispatch(memberActions.getMemberProfileHeader(userInfo?.member?.id));\r\n }, [dispatch, userInfo?.member?.id]);\r\n\r\n useEffect(() => {\r\n let classifications = [];\r\n assetData?.classifications?.length > 0 &&\r\n assetData.classifications.forEach((val) => {\r\n let segmentFilter = iconList.filter(\r\n (item) => item.segmentId === val.segmentId\r\n );\r\n if (segmentFilter?.length > 0 && segmentFilter[0]?.segmentDescription) {\r\n classifications.push(segmentFilter[0].segmentDescription);\r\n }\r\n });\r\n let additionalSearchTags = assetData?.additionalSearchTags\r\n ? assetData?.additionalSearchTags\r\n .toString()\r\n .split(',')\r\n .filter((tag) => tag !== '')\r\n : [];\r\n let exifData = assetData?.metadata?.exifData === 'Yes' ? true : false;\r\n\r\n !openItemFormData &&\r\n form.setFieldsValue({\r\n assetName: assetData?.assetName,\r\n //TODO: DATETIME\r\n effectiveTime: [\r\n getDateFormat(assetData?.effectedDate),\r\n getDateFormat(assetData?.expirationDate),\r\n ],\r\n ...typeData,\r\n assetDescription: assetData?.assetDescription,\r\n additionalSearchTags: additionalSearchTags,\r\n status: assetData?.status,\r\n classifications: classifications,\r\n channelOutput:\r\n assetData?.metadata?.channelOutput || assetData?.channelOutput,\r\n clippingPath:\r\n assetData?.metadata?.clippingPath || assetData?.clippingPath,\r\n colorDepth: assetData?.metadata?.colorDepth || assetData?.colorDepth,\r\n colorModel: assetData?.metadata?.colorModel || assetData?.colorModel,\r\n cropRange: assetData?.metadata?.cropRange || assetData?.cropRange,\r\n duration: assetData?.metadata?.duration || assetData?.duration,\r\n exifData: assetData?.metadata?.exifData || assetData?.exifData,\r\n fileName: assetData?.metadata?.fileName || assetData?.fileName,\r\n fileSize: formatSizeUnits(\r\n assetData?.metadata?.fileSize || assetData?.fileSize\r\n ),\r\n fileType: assetData?.metadata?.fileType || assetData?.fileExtension,\r\n fps: assetData?.metadata?.fps || assetData?.fps,\r\n bitRate: assetData?.metadata?.bitRate || assetData?.bitRate,\r\n frameRate: assetData?.metadata?.frameRate || assetData?.frameRate,\r\n frameSize: assetData?.metadata?.frameSize || assetData?.frameSize,\r\n sampleRate: assetData?.metadata?.sampleRate || assetData?.sampleRate,\r\n chanelOutput:\r\n assetData?.metadata?.chanelOutput || assetData?.chanelOutput,\r\n height: assetData?.metadata?.height || assetData?.height,\r\n lastModified:\r\n assetData?.metadata?.lastModified || assetData?.lastModified,\r\n loadedDate: assetData?.metadata?.loadedDate || assetData?.loadedDate,\r\n mediaFormat: assetData?.metadata?.mediaFormat || assetData?.mediaFormat,\r\n owner: assetData?.metadata?.owner || assetData?.owner,\r\n pageCount: assetData?.metadata?.pageCount || assetData?.pageCount,\r\n resolution: assetData?.metadata?.resolution || assetData?.resolution,\r\n width: assetData?.metadata?.width || assetData?.width,\r\n isShowcase: assetData?.isShowcase,\r\n visibility: assetData?.visibility || constants.ASSET_VISIBILITY[2],\r\n });\r\n openItemFormData && form.setFieldsValue(openItemFormData);\r\n }, [assetData, openItemFormData]);\r\n\r\n const handleSubmitForm = useCallback(\r\n (formInstance) => {\r\n const formData = formInstance.getFieldsValue();\r\n const effDate = formatRangeDateTime(formData?.effectiveTime?.[0]);\r\n const expDate = formatRangeDateTime(formData?.effectiveTime?.[1]);\r\n\r\n if (effDate > new Date()) {\r\n dialogFunction({\r\n type: 'warn',\r\n content: ,\r\n onOk: () => {\r\n formInstance.submit();\r\n },\r\n onCancel: () => {\r\n dispatch(actionsRibbon.cancelSavingAsset());\r\n },\r\n okText: 'Ok',\r\n width: 465,\r\n });\r\n } else {\r\n formInstance.submit();\r\n }\r\n },\r\n [dispatch]\r\n );\r\n\r\n useEffect(() => {\r\n if (saving) {\r\n handleSubmitForm(form);\r\n }\r\n }, [saving, form, handleSubmitForm, dispatch]);\r\n\r\n const getFormData = (form) => {\r\n dispatch(actionsGlobal.updateOpenItemForm(form.getFieldsValue()));\r\n };\r\n\r\n useEffect(() => {\r\n if (isAddingOpenItemFormData) getFormData(form);\r\n }, [isAddingOpenItemFormData]);\r\n\r\n useEffect(() => {\r\n if (assetData?.ownerId) {\r\n dispatch(actions.getAuthorizedTags(assetData?.ownerId));\r\n }\r\n }, [assetData?.ownerId, dispatch]);\r\n\r\n useEffect(() => {\r\n if (enforceTagRestrictions) {\r\n setTagsMode('multiple');\r\n }\r\n }, [enforceTagRestrictions]);\r\n\r\n useEffect(() => {\r\n if (enforceTagRestrictions) {\r\n setTags(onSetFilterTags());\r\n } else {\r\n setTags([]);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [\r\n enforceTagRestrictions,\r\n authorizedTagsInfo,\r\n typeData?.assetType,\r\n typeData?.assetSubType,\r\n ]);\r\n\r\n const onSetFilterTags = () => {\r\n return (\r\n authorizedTags &&\r\n authorizedTags.filter((tag) => {\r\n if (tag?.assetType) {\r\n if (tag?.assetSubType) {\r\n return (\r\n tag.assetType === typeData?.assetType &&\r\n tag.assetSubType === typeData?.assetSubType\r\n );\r\n } else {\r\n return tag.assetType === typeData?.assetType;\r\n }\r\n } else {\r\n return tag;\r\n }\r\n })\r\n );\r\n };\r\n\r\n const onFinishFailed = (errorInfo) => {\r\n dispatch(actionsRibbon.cancelSavingAsset());\r\n };\r\n\r\n const onFinish = (values) => {\r\n // update additionalSearchTags from string to list string\r\n\r\n let classifications = [];\r\n values?.classifications?.length > 0 &&\r\n values.classifications.forEach((val) => {\r\n let segmentId = iconList.filter(\r\n (item) => item.segmentDescription === val\r\n );\r\n if (segmentId?.length > 0 && segmentId[0]?.segmentId) {\r\n classifications.push({ segmentId: segmentId[0].segmentId });\r\n }\r\n });\r\n let params = Object.assign(values, {\r\n id: assetData.id,\r\n draftAssetId: assetData?.pendingAssetId, // After deleting draft status, draftAssetId is got from pendingAssetId\r\n assetType: assetData.assetType,\r\n ...typeData,\r\n });\r\n params.classifications = classifications;\r\n //? set effective date\r\n if (params.effectiveTime) {\r\n const startTime = formatRangeDateTime(params.effectiveTime?.[0]);\r\n const endTime = formatRangeDateTime(params.effectiveTime?.[1]);\r\n // params.effectedDate = startTime ? startTime.toISOString() : null;\r\n // params.expirationDate = endTime ? endTime.toISOString() : null;\r\n params.effectedDate = startTime\r\n ? exportFormDateWithoutTime(startTime)\r\n : null;\r\n params.expirationDate = endTime\r\n ? exportFormDateWithoutTime(endTime)\r\n : null;\r\n }\r\n delete params.effectiveTime;\r\n if (assetData?.metadata?.fileSize || assetData?.fileSize) {\r\n params.fileSize = assetData?.metadata?.fileSize || assetData?.fileSize;\r\n }\r\n if (assetData?.isIFrame) params.isIFrame = true;\r\n if (history.location.search.indexOf('?replace-asset') > -1) {\r\n dispatch(actions.updateDigitalReplaceAsset(params));\r\n } else {\r\n dispatch(actions.updateDigitalAsset(params));\r\n }\r\n };\r\n useEffect(() => {\r\n if (requiredFields?.length) {\r\n const isReplaceAsset =\r\n history.location.search.indexOf('?replace-asset') > -1;\r\n const status = isReplaceAsset\r\n ? 'Replace'\r\n : isCreating\r\n ? 'Create'\r\n : 'Edit';\r\n validateStatusField();\r\n dispatch(actions.updateRequiredField([]));\r\n }\r\n }, [requiredFields, dispatch]);\r\n\r\n const validateStatusField = () => {\r\n const event = new CustomEvent(constants.EVENT.VALIDATE_STATUS_FIELD);\r\n document.dispatchEvent(event);\r\n };\r\n\r\n const assetStatus = isCreating\r\n ? constants.ASSET_CREATE_STATUS_OPTIONS\r\n : constants.ASSET_STATUS_OPTIONS;\r\n\r\n const assetOverview = (data) => {\r\n let assetFieldOverview;\r\n let type = data?.fileType || data?.fileExtension;\r\n if (type === 'zip' || type === 'rar' || type === '7z') {\r\n assetFieldOverview = constants.ASSET_FIELD_ZIP;\r\n } else if (\r\n type === 'mkv' ||\r\n type === 'mp4' ||\r\n type === 'avi' ||\r\n type === 'mov' ||\r\n type === 'flv' ||\r\n type === 'wav'\r\n ) {\r\n assetFieldOverview = constants.ASSET_FIELD_VIDEO;\r\n } else if (type === 'mp3' || type === 'ogg') {\r\n assetFieldOverview = constants.ASSET_FIELD_AUDIO;\r\n } else if (\r\n type === 'jpg' ||\r\n type === 'jpeg' ||\r\n type === 'png' ||\r\n type === 'gif' ||\r\n type === 'tiff' ||\r\n type === 'psd' ||\r\n type === 'bmp' ||\r\n type === 'ico' ||\r\n type === 'tga'\r\n ) {\r\n assetFieldOverview = constants.ASSET_FIELD_IMAGE;\r\n } else {\r\n assetFieldOverview = constants.ASSET_FIELD_DOCUMENT;\r\n }\r\n\r\n return (\r\n <>\r\n {assetFieldOverview?.length > 0 &&\r\n assetFieldOverview.map((val, i) => {\r\n if (val.element === 'text') {\r\n if (val.type === 'checkbox') {\r\n return (\r\n \r\n }\r\n valuePropName='checked'\r\n >\r\n \r\n \r\n \r\n );\r\n } else {\r\n return (\r\n \r\n }\r\n >\r\n \r\n \r\n \r\n );\r\n }\r\n }\r\n if (val.element === 'input' && val.type === 'string') {\r\n if (val.field === 'fileName') {\r\n return (\r\n \r\n }\r\n rules={[\r\n {\r\n required: true,\r\n message: 'Please input file name',\r\n },\r\n ]}\r\n >\r\n \r\n \r\n \r\n );\r\n } else {\r\n return (\r\n \r\n }\r\n >\r\n \r\n \r\n \r\n );\r\n }\r\n }\r\n if (val.element === 'input' && val.type === 'checkbox') {\r\n return (\r\n \r\n }\r\n valuePropName='checked'\r\n >\r\n \r\n \r\n \r\n );\r\n }\r\n if (val.element === 'input' && val.type === 'number') {\r\n return (\r\n \r\n }\r\n >\r\n \r\n \r\n \r\n );\r\n }\r\n if (val.element === 'textarea') {\r\n return (\r\n \r\n }\r\n >\r\n \r\n \r\n \r\n );\r\n }\r\n })}\r\n \r\n );\r\n };\r\n\r\n const tagRender = (props) => {\r\n const { label, value, closable, onClose } = props;\r\n const src = iconList.filter((val) => val.segmentDescription === value);\r\n return (\r\n \r\n \r\n \r\n );\r\n };\r\n\r\n // bp 12/13/2020 - fix data subtype is required but is not validated\r\n const onValuesChange = (changedValues, allValues) => {\r\n setTypeData(allValues);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n }\r\n rules={[\r\n {\r\n required: true,\r\n message: intl.formatMessage(\r\n messages.assetNameRequiredMessage\r\n ),\r\n },\r\n {\r\n whitespace: true,\r\n message: intl.formatMessage(\r\n messages.assetNameWhiteSpaceMessage\r\n ),\r\n },\r\n ]}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n {...statusValidateProps}\r\n >\r\n document.getElementById('asset-edit')}\r\n allowClear={false}\r\n >\r\n {assetStatus\r\n ?.slice()\r\n .sort()\r\n .map((status, index) => {\r\n return (\r\n \r\n {status}\r\n \r\n );\r\n })}\r\n \r\n \r\n\r\n }\r\n labelCol={{ span: 5 }}\r\n wrapperCol={{ span: 19 }}\r\n >\r\n \r\n \r\n }\r\n >\r\n document.getElementById('asset-edit')}\r\n >\r\n {tags &&\r\n tags.length > 0 &&\r\n sortByKey(tags, 'tagName')?.map((tag, index) => {\r\n return (\r\n \r\n {tag?.tagName}\r\n \r\n );\r\n })}\r\n \r\n \r\n\r\n \r\n \r\n \r\n
\r\n \r\n onValuesChange(changedValues, allValues)\r\n }\r\n />\r\n
\r\n {!assetData?.isIFrame && assetOverview(assetData)}\r\n \r\n }\r\n >\r\n \r\n document.getElementById('asset-edit')\r\n }\r\n >\r\n {isPrivateVisibilityAsset\r\n ? constants.PRIVATE_VISIBILITY_ASSET?.slice()\r\n .sort()\r\n .map((item, index) => {\r\n let visibilityValue = item === 'None' ? null : item;\r\n return (\r\n \r\n {item}\r\n \r\n );\r\n })\r\n : constants.ASSET_VISIBILITY?.slice()\r\n .sort()\r\n .map((item, index) => {\r\n let visibilityValue = item === 'None' ? null : item;\r\n return (\r\n \r\n {item}\r\n \r\n );\r\n })}\r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n document.getElementById('asset-edit')}\r\n >\r\n {sortByKey(iconList, 'segmentDescription')?.map((val) => {\r\n return (\r\n \r\n \r\n {val.segmentDescription}\r\n \r\n );\r\n })}\r\n \r\n \r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default injectIntl(AssetEdit);\r\n","import React from 'react';\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\nimport {\r\n TitleFolderAsset,\r\n IconFolderAsset,\r\n TitleFileAsset,\r\n IconFileAsset,\r\n} from '../shared/components';\r\n\r\nimport { getInteropListItems } from 'services/interoperability';\r\nimport { formatRangeDateTime } from 'utils/formatDate';\r\n\r\nconst getUuidKey = () => uuidv4();\r\n\r\nconst getNodeTreeData = (interop, multipleImport) => {\r\n if (interop.type === 'folder') {\r\n return {\r\n key: getUuidKey(),\r\n title: ,\r\n icon: ,\r\n data: interop,\r\n selectable: false,\r\n checkable: multipleImport ? true : false,\r\n };\r\n }\r\n return {\r\n key: getUuidKey(),\r\n title: ,\r\n icon: ,\r\n data: interop,\r\n selectable: multipleImport ? false : true,\r\n isLeaf: true,\r\n };\r\n};\r\n\r\nexport const updateTreeData = (list, key, children) => {\r\n return list.map((node) => {\r\n if (node.key === key) {\r\n return { ...node, children };\r\n }\r\n\r\n if (node.children) {\r\n return {\r\n ...node,\r\n children: updateTreeData(node.children, key, children),\r\n };\r\n }\r\n\r\n return node;\r\n });\r\n};\r\n\r\nexport const mappingInteropItemsToTreeData = (\r\n interopItems = [],\r\n multipleImport = false\r\n) => {\r\n let treeData = [];\r\n\r\n interopItems.forEach((interop) => {\r\n if (interop.type === 'folder') {\r\n let node = getNodeTreeData(interop, multipleImport);\r\n treeData.push(node);\r\n } else {\r\n let node = getNodeTreeData(interop, multipleImport);\r\n treeData.push(node);\r\n }\r\n });\r\n\r\n return treeData;\r\n};\r\n\r\nexport const getExpandedData = async (params) => {\r\n const response = await getInteropListItems(params);\r\n if (response?.isSuccess) {\r\n if (response?.data?.interopItems) {\r\n return response?.data?.interopItems;\r\n }\r\n }\r\n return null;\r\n};\r\n\r\nexport const getFormDataParams = (params = {}) => {\r\n let formData = new FormData();\r\n\r\n Object.entries(params).forEach(([key, value]) => {\r\n if (Array.isArray(value)) {\r\n value.forEach((item) => {\r\n formData.append(key, item);\r\n });\r\n } else {\r\n formData.append(key, value);\r\n }\r\n });\r\n\r\n return formData;\r\n};\r\n\r\nexport const filterFoldersAndFilesInSelectedItems = (selectedItems = []) => {\r\n let folders = [];\r\n let files = [];\r\n\r\n selectedItems.forEach((item) => {\r\n const { data } = item;\r\n\r\n if (data.type === 'file') {\r\n files.push(item);\r\n } else if (data.type === 'folder') {\r\n if (Array.isArray(item.children) && item.children.length > 0) {\r\n folders.push(item);\r\n filterFoldersAndFilesInSelectedItems(item.children);\r\n } else {\r\n folders.push(item);\r\n }\r\n }\r\n });\r\n\r\n return {\r\n folders,\r\n files,\r\n };\r\n};\r\n\r\nconst findFileExistInAnyFolders = (folders, file) => {\r\n return folders.some((item) => {\r\n if (item.key === file.key) {\r\n return true;\r\n } else if (item.children) {\r\n return findFileExistInAnyFolders(item.children, file);\r\n }\r\n return false;\r\n });\r\n};\r\n\r\n// A file will be sent to the server when folder that contains the file does not check\r\nexport const getFilesPath = (folders, files) => {\r\n let result = [];\r\n\r\n files.forEach((file) => {\r\n const isExist = findFileExistInAnyFolders(folders, file);\r\n\r\n if (!isExist) {\r\n result.push(file.data.path);\r\n }\r\n });\r\n\r\n return result;\r\n};\r\n\r\nconst findFolderExistInAnyFolders = (folders, findFolder) => {\r\n return folders.some((folder) => {\r\n if (folder.key === findFolder.key) {\r\n return true;\r\n } else if (folder.children) {\r\n return findFolderExistInAnyFolders(folder.children, findFolder);\r\n }\r\n return false;\r\n });\r\n};\r\n\r\n// A folder will be sent to the server when folder that contains the file does not check\r\nexport const getFoldersPath = (folders) => {\r\n let result = [];\r\n\r\n folders.forEach((folder) => {\r\n const filteredFolders = folders.filter((f) => f.key !== folder.key);\r\n\r\n const isExist = findFolderExistInAnyFolders(filteredFolders, folder);\r\n\r\n if (!isExist) {\r\n result.push(folder.data.path);\r\n }\r\n });\r\n\r\n return result;\r\n};\r\n\r\nlet foundNode = null;\r\nexport const findNodeTree = (treeData, itemId) => {\r\n for (let index = 0; index < treeData.length; index++) {\r\n const node = treeData[index];\r\n if (node.data.itemId === itemId) {\r\n foundNode = node;\r\n break;\r\n }\r\n\r\n if (node?.children) {\r\n findNodeTree(node.children, itemId);\r\n }\r\n }\r\n return foundNode;\r\n};\r\n\r\nexport const getChildNodesInFolder = (treeData) => {\r\n let children = [];\r\n const flattenMembers = treeData.map((m) => {\r\n if (m.children && m.children.length) {\r\n children = [...children, ...m.children];\r\n }\r\n return m;\r\n });\r\n\r\n return flattenMembers.concat(\r\n children.length ? getChildNodesInFolder(children) : children\r\n );\r\n};\r\n\r\nexport const filterArrayInAnotherArray = (arr1, arr2) => {\r\n return arr1.filter((item) => !arr2.includes(item));\r\n};\r\n\r\nexport const findAncestorsOfChildNode = (treeData, childNode) => {\r\n if (Array.isArray(treeData) && treeData.length > 0) {\r\n for (let i = 0; i < treeData.length; i++) {\r\n if (treeData[i].key === childNode.key) return [];\r\n\r\n let result = findAncestorsOfChildNode(treeData[i].children, childNode);\r\n if (result !== null) {\r\n result = result.concat(treeData[i]);\r\n return result;\r\n }\r\n }\r\n }\r\n return null;\r\n};\r\n\r\nexport const filterArrayObjectInAnotherArrayObject = (\r\n array1 = [],\r\n array2 = []\r\n) => {\r\n let result = [];\r\n\r\n array1.forEach((item1) => {\r\n const foundItem = array2.find((item2) => item1.key === item2.key);\r\n\r\n if (!foundItem) {\r\n result.push(item1);\r\n }\r\n });\r\n\r\n return result;\r\n};\r\n\r\nexport const getOnlySelectedParentItems = (treeData, items, keys) => {\r\n let result = [];\r\n items.forEach((item) => {\r\n const ancestorNodes = findAncestorsOfChildNode(treeData, item);\r\n const ancestorKeys = ancestorNodes.map((node) => node.key);\r\n const isParentSelected = findSelectedKeyInAnotherKeys(keys, ancestorKeys);\r\n\r\n if (!isParentSelected) {\r\n result.push(item);\r\n }\r\n });\r\n return result;\r\n};\r\n\r\nexport const findSelectedKeyInAnotherKeys = (keys, selectedKeys) => {\r\n return selectedKeys.find((key) => {\r\n return keys.includes(key);\r\n });\r\n};\r\n\r\nexport const getFormValues = (form) => {\r\n const {\r\n effectivePeriod,\r\n defaultStatus,\r\n isCreateThumbs,\r\n autoApplyOrReplaceOnProducts,\r\n } = form.getFieldsValue();\r\n\r\n const startTime = formatRangeDateTime(effectivePeriod?.[0]);\r\n const endTime = formatRangeDateTime(effectivePeriod?.[1]);\r\n\r\n const formValues = {\r\n EffectedDate: startTime ? startTime.toISOString() : null,\r\n ExpirationDate: endTime ? endTime.toISOString() : null,\r\n defaultStatus,\r\n isCreateThumbs,\r\n autoApplyOrReplaceOnProducts,\r\n };\r\n\r\n return formValues;\r\n};\r\n","import React from 'react';\r\n\r\nimport { Typography, Select, Empty } from 'antd';\r\n\r\nimport classnames from 'classnames';\r\n\r\nimport { WithLoading } from 'common/components';\r\nimport { TreeFiles } from '../shared/components';\r\n\r\nimport {\r\n getExpandedData,\r\n mappingInteropItemsToTreeData,\r\n updateTreeData,\r\n} from './utils';\r\nimport { sleep } from 'utils/delay';\r\n\r\nimport { GLOBAL_MEDIA_QUERIES } from 'static/MediaQuery';\r\nimport { getVirtualScrollHeight } from '../shared/utils';\r\n\r\nimport { useMedia } from 'react-media';\r\n\r\nexport const DropboxFiles = (props) => {\r\n const {\r\n idConnection,\r\n multipleImport,\r\n treeData,\r\n isExpanding,\r\n expandAll,\r\n selectedDropbox,\r\n onSetTreeData,\r\n onSelectItems,\r\n onExpandItems,\r\n } = props;\r\n\r\n const matches = useMedia({ queries: GLOBAL_MEDIA_QUERIES });\r\n const largeScreen = matches.lg || matches.md || matches.xl;\r\n\r\n const { selectedKeys, expandedKeys } = selectedDropbox;\r\n\r\n const virtualScrollHeight = getVirtualScrollHeight(\r\n largeScreen,\r\n multipleImport\r\n );\r\n\r\n const handleSelectItems = (key, info) => {\r\n onSelectItems(key, info.selectedNodes);\r\n };\r\n\r\n const handleCheckItems = (key, { checkedNodes }) => {\r\n onSelectItems(key, checkedNodes);\r\n };\r\n\r\n const handleLoadData = async ({ key, children, data }) => {\r\n // Tree data is already loaded data inside.\r\n if (expandAll.status === 'success') return;\r\n\r\n const { path } = data;\r\n\r\n const expandedData = await getExpandedData({\r\n id: idConnection,\r\n pathInfo: path,\r\n getFile: true,\r\n getFolder: true,\r\n storageServiceType: 'dropbox',\r\n });\r\n\r\n return new Promise(async (resolve) => {\r\n if (children || expandedData === null) {\r\n resolve();\r\n return;\r\n }\r\n\r\n const mappedTreeData = mappingInteropItemsToTreeData(\r\n expandedData,\r\n multipleImport\r\n );\r\n\r\n await sleep(500);\r\n\r\n onSetTreeData((prevData) =>\r\n updateTreeData(prevData, key, mappedTreeData)\r\n );\r\n resolve();\r\n });\r\n };\r\n\r\n const isLoading = isExpanding || expandAll.status === 'loading';\r\n\r\n return (\r\n \r\n \r\n {treeData?.length > 0 ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n\r\nexport const DropboxSelection = ({\r\n valueIdSelection,\r\n checked,\r\n interoperabilities,\r\n onChangeIdConnection,\r\n // onChangeExpandAll,\r\n}) => {\r\n return (\r\n \r\n \r\n Connection:\r\n \r\n \r\n {interoperabilities.map((interop) => (\r\n \r\n {interop.storageServiceName}\r\n \r\n ))}\r\n \r\n\r\n {/* \r\n Expand All\r\n
*/}\r\n \r\n );\r\n};\r\n","import React, { useState } from 'react';\r\n\r\nimport { useDispatch, useSelector } from 'react-redux';\r\n\r\nimport classnames from 'classnames';\r\n\r\nimport { Typography, Tag, Button, Upload, Image, Tooltip, Col } from 'antd';\r\nimport {\r\n SendOutlined,\r\n FileExcelOutlined,\r\n LinkOutlined,\r\n CloseOutlined,\r\n LoadingOutlined,\r\n} from '@ant-design/icons';\r\n\r\nimport {\r\n CustomNotification,\r\n dialogFunction,\r\n FormButton,\r\n} from 'common/components';\r\nimport { ConfirmContent } from 'pages/asset-full-view/components';\r\nimport { IconFileAsset, IconFolderAsset } from '../shared/components';\r\nimport CreateFolderModal from 'pages/home/ribbon/components/controls/folders/CreateFolderModal';\r\n\r\nimport * as homeActions from 'pages/home/ribbon/asset-full/controllers/actions';\r\nimport * as assetActions from 'pages/asset-full-view/controllers/actions';\r\nimport * as assetSelectors from 'pages/asset-full-view/controllers/selectors';\r\nimport gridSelector from 'common/components/grid-view/controllers/selectors';\r\nimport * as ribbonSelector from '@redux/ribbon/selectors';\r\nimport * as brandingActions from '@redux/branding/actions';\r\nimport * as globalActions from '@redux/global/actions';\r\n\r\nimport { forwardTo, navigateToRouteAsset } from 'utils/common/route';\r\nimport {\r\n getFormDataParams,\r\n filterFoldersAndFilesInSelectedItems,\r\n getFilesPath,\r\n getFoldersPath,\r\n getFormValues,\r\n} from '../shared/utils.js';\r\nimport { sleep } from 'utils/delay';\r\n\r\nimport { isImageType } from 'utils/fileType';\r\nimport { useDispatchReloadPage } from 'hooks/useReloadPage';\r\nimport { useCheckAllowCreateFolder } from '../shared/hooks';\r\n\r\nimport {\r\n importAssetsFromInterop,\r\n createReplacedAsset,\r\n} from 'services/interoperability';\r\n\r\nimport xlsFile from 'assets/file-formats/xls.png';\r\n\r\nimport { RIBBON_VIEW, ROUTE } from 'static/Constants';\r\n\r\nimport * as endpointAsset from 'services/digitalAsset/endpoints';\r\nimport * as damServices from 'services/digitalAsset';\r\n\r\nimport * as api from 'config/axios';\r\n\r\nimport './DropboxActions.less';\r\n\r\nconst typeExcel =\r\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';\r\n\r\nconst DropboxActions = (props) => {\r\n const {\r\n idConnection,\r\n formInstance,\r\n selectedItems,\r\n multipleImport,\r\n typeViewAsset,\r\n // statusCopy,\r\n importedFolderParams,\r\n onDeleteItem,\r\n handleCloseModal,\r\n onCopyFileNameExcel,\r\n destinationFolder,\r\n isEnabledImportFolder,\r\n } = props;\r\n\r\n const dispatch = useDispatch();\r\n\r\n const [status, setStatus] = useState('idle');\r\n const [file, setFile] = useState(null);\r\n const [visibleModal, setVisibleModal] = useState(false);\r\n\r\n const replacedGridAsset = useSelector(\r\n gridSelector.makeSelectItemCurrentSelection()\r\n );\r\n\r\n const replacedFullView = useSelector(assetSelectors.assetDataLoading());\r\n\r\n const isAssetFullView =\r\n useSelector(ribbonSelector.selectRibbon()) ===\r\n RIBBON_VIEW.ASSET_FULL_VIEW.NAME;\r\n\r\n const isAllowCreateFolder = useCheckAllowCreateFolder();\r\n\r\n const assetId = isAssetFullView\r\n ? replacedFullView?.id\r\n : replacedGridAsset?.id;\r\n\r\n const reloadPage = useDispatchReloadPage();\r\n\r\n const isHasDestinationFolder = Boolean(\r\n importedFolderParams?.destinationFolderId\r\n );\r\n\r\n const handleReplaceSingleAsset = async () => {\r\n const singleItem = selectedItems[0];\r\n const params = {\r\n id: idConnection,\r\n storageServiceType: 'dropbox',\r\n filePath: [singleItem.data.path],\r\n };\r\n\r\n const formData = getFormDataParams(params);\r\n\r\n setStatus('loading');\r\n updateProgressBar(selectedItems, 'uploading', 0);\r\n\r\n try {\r\n const response = await createReplacedAsset(formData, assetId);\r\n\r\n if (response?.isSuccess) {\r\n const metaData = response.data;\r\n\r\n setStatus('success');\r\n handleCreateSingleAssetSuccess(metaData);\r\n updateProgressBar(selectedItems, 'done', 100);\r\n } else {\r\n setStatus('error');\r\n updateProgressBar(selectedItems, 'error', 0);\r\n }\r\n } catch (error) {\r\n setStatus('error');\r\n updateProgressBar(selectedItems, 'error', 0);\r\n }\r\n };\r\n\r\n const handleCreateSingleAsset = async () => {\r\n const singleItem = selectedItems[0];\r\n const params = {\r\n id: idConnection,\r\n storageServiceType: 'dropbox',\r\n filePaths: [singleItem.data.path],\r\n isCreateThumbs: true,\r\n };\r\n const formData = getFormDataParams(params);\r\n\r\n setStatus('loading');\r\n updateProgressBar(selectedItems, 'uploading', 0);\r\n\r\n try {\r\n const response = await importAssetsFromInterop(formData);\r\n if (response.isSuccess) {\r\n const metaData = response.data;\r\n setStatus('success');\r\n handleCreateSingleAssetSuccess(metaData);\r\n updateProgressBar(selectedItems, 'done', 100);\r\n } else {\r\n setStatus('error');\r\n updateProgressBar(selectedItems, 'error', 0);\r\n }\r\n } catch (error) {\r\n setStatus('error');\r\n updateProgressBar(selectedItems, 'error', 0);\r\n }\r\n };\r\n\r\n const handleCreateSingleAssetSuccess = (metaData) => {\r\n const id = metaData.id;\r\n\r\n handleCloseModal();\r\n dispatch(assetActions.cancelUpdateSuccess());\r\n dispatch(assetActions.createDigitalAssetFullSuccess(metaData));\r\n dispatch(homeActions.editAsset());\r\n dispatch(homeActions.creatingAsset());\r\n dispatch(brandingActions.getBrandingNoLoading());\r\n\r\n navigateToRouteAsset({\r\n typeViewAsset,\r\n id,\r\n isMultipleImport: multipleImport,\r\n });\r\n };\r\n\r\n const handleCloseCreateFolder = () => setVisibleModal(false);\r\n\r\n const handleCreateMultipleAssets = async (otherParams = {}) => {\r\n const formValues = getFormValues(formInstance);\r\n\r\n const { folders, files } =\r\n filterFoldersAndFilesInSelectedItems(selectedItems);\r\n\r\n const filePaths = getFilesPath(folders, files);\r\n const folderPaths = getFoldersPath(folders);\r\n\r\n const params = {\r\n id: idConnection,\r\n storageServiceType: 'dropbox',\r\n filePaths,\r\n folderPaths,\r\n templateFile: file,\r\n ...importedFolderParams,\r\n ...formValues,\r\n ...otherParams,\r\n };\r\n\r\n let formData = getFormDataParams(params);\r\n\r\n setStatus('loading');\r\n updateProgressBar(selectedItems, 'uploading', 0);\r\n\r\n try {\r\n await sleep(1000);\r\n const response = await importAssetsFromInterop(formData);\r\n\r\n if (response?.isSuccess) {\r\n setStatus('success');\r\n handleCloseModal();\r\n handleCloseCreateFolder();\r\n\r\n dispatch(brandingActions.getBrandingNoLoading());\r\n\r\n updateProgressBar(selectedItems, 'done', 100);\r\n\r\n CustomNotification.success('Create asset successfully');\r\n } else {\r\n CustomNotification.error(response?.message ?? 'Something went wrong');\r\n setStatus('error');\r\n }\r\n } catch (error) {\r\n CustomNotification.error(error?.message ?? 'Something went wrong');\r\n setStatus('error');\r\n updateProgressBar(selectedItems, 'error', 0);\r\n }\r\n };\r\n\r\n const handleReplaceThumbnail = async () => {\r\n const singleItem = selectedItems[0];\r\n const isImage = isImageType(singleItem?.data?.path);\r\n if (!isImage) {\r\n CustomNotification.error('Only support image type');\r\n return;\r\n }\r\n const params = {\r\n assetId,\r\n id: idConnection,\r\n storageServiceType: 'dropbox',\r\n filePath: singleItem?.data?.path,\r\n };\r\n const formData = getFormDataParams(params);\r\n setStatus('loading');\r\n try {\r\n const response = await damServices.replaceDigitalAssetsThumbnails(\r\n formData\r\n );\r\n if (response?.isSuccess) {\r\n setStatus('success');\r\n handleCloseModal();\r\n reloadPage({ clearSelection: true });\r\n CustomNotification.success('Replace Preview successfully');\r\n } else {\r\n CustomNotification.error(response?.message ?? 'Something went wrong');\r\n setStatus('error');\r\n }\r\n } catch (error) {\r\n CustomNotification.error(error?.message ?? 'Something went wrong');\r\n setStatus('error');\r\n }\r\n };\r\n\r\n const modalConfirmImportAsset = (otherParams = {}) => {\r\n const multiImportFormValue = getFormValues(formInstance);\r\n\r\n const newDestinationFolder = otherParams?.destinationFolderId\r\n ? { ...destinationFolder, destinationFolder: { ...otherParams } }\r\n : destinationFolder;\r\n\r\n dialogFunction({\r\n type: 'warn',\r\n content: (\r\n \r\n ),\r\n onOk: async () => {\r\n CustomNotification.warning(\r\n 'Please wait while the import process is being completed. This may require additional time, especially for larger datasets. We appreciate your understanding and patience during this process',\r\n 30\r\n );\r\n handleCreateMultipleAssets(otherParams);\r\n forwardTo(ROUTE.DIGITAL_MEDIA);\r\n },\r\n okText: 'Upload',\r\n width: 450,\r\n });\r\n };\r\n\r\n const handleCreateAssetFromInterop = () => {\r\n // If user doesn't have create folder permission, we won't show modal for creating destination folder\r\n const isIgnoreShowModalCreate = !isAllowCreateFolder;\r\n\r\n if (multipleImport) {\r\n if (isIgnoreShowModalCreate) {\r\n modalConfirmImportAsset();\r\n } else if (isEnabledImportFolder && !isHasDestinationFolder) {\r\n setVisibleModal(true);\r\n } else {\r\n modalConfirmImportAsset();\r\n }\r\n } else {\r\n if (typeViewAsset === 'replace-asset') {\r\n handleReplaceSingleAsset();\r\n } else if (typeViewAsset === 'create-asset') {\r\n handleCreateSingleAsset();\r\n } else {\r\n handleReplaceThumbnail();\r\n return;\r\n }\r\n }\r\n };\r\n\r\n const handleUploadFile = (file) => {\r\n if (file?.type === typeExcel) {\r\n CustomNotification.success('The file is attached successfully');\r\n setFile(file);\r\n } else {\r\n CustomNotification.error('Only accept xls file');\r\n setFile(null);\r\n }\r\n return false;\r\n };\r\n\r\n const updateProgressBar = (selectedItems = [], status, percent) => {\r\n if (status === 'error' || status === 'done' || status === 'uploading') {\r\n selectedItems.forEach((fileItem) => {\r\n dispatch(\r\n globalActions.updateProgressBar({\r\n type: 'upload',\r\n name: fileItem.data.path,\r\n percent,\r\n status,\r\n uid: fileItem.data.itemId,\r\n })\r\n );\r\n });\r\n }\r\n };\r\n\r\n const disabledBtn = selectedItems.length === 0;\r\n\r\n return (\r\n \r\n
\r\n Selected Items\r\n\r\n {file && (\r\n
\r\n \r\n \r\n }\r\n />\r\n \r\n }\r\n style={{\r\n marginLeft: 4,\r\n border: 'none',\r\n }}\r\n onClick={() => setFile(null)}\r\n />\r\n
\r\n )}\r\n
\r\n\r\n \r\n \r\n {selectedItems.map((item) => (\r\n \r\n ))}\r\n \r\n \r\n {multipleImport && (\r\n <>\r\n }\r\n onClick={() => {\r\n api.sendDownload({\r\n url: endpointAsset.GET_IMPORT_ASSET_TEMPLATE || '/unknown',\r\n });\r\n }}\r\n type='default '\r\n text='Download xls Template'\r\n disabled\r\n />\r\n }\r\n type='default'\r\n text='Copy All Selected Items'\r\n onClick={onCopyFileNameExcel}\r\n disabled\r\n />\r\n \r\n }\r\n type='default'\r\n text='Attach file (.xls)'\r\n disabled\r\n />\r\n \r\n \r\n )}\r\n }\r\n text='Send'\r\n // loading={status === 'loading'}\r\n onClick={handleCreateAssetFromInterop}\r\n style={{ width: '100%' }}\r\n disabled={disabledBtn}\r\n />\r\n \r\n \r\n\r\n {isAllowCreateFolder && (\r\n {\r\n modalConfirmImportAsset({\r\n destinationFolderId: responseData?.id,\r\n });\r\n }}\r\n additionalButton={() => {\r\n return (\r\n \r\n modalConfirmImportAsset()}\r\n >\r\n Continue without destination folder\r\n \r\n \r\n );\r\n }}\r\n />\r\n )}\r\n \r\n );\r\n};\r\n\r\nconst SelectedFile = ({ name, itemId, type, onDeleteItem }) => {\r\n return (\r\n \r\n ) : (\r\n \r\n )\r\n }\r\n color='success'\r\n className='dropbox-asset__result-tag'\r\n >\r\n \r\n {name}\r\n \r\n }\r\n style={{\r\n marginLeft: 4,\r\n border: 'none',\r\n }}\r\n onClick={() => onDeleteItem(itemId)}\r\n />\r\n \r\n );\r\n};\r\n\r\nexport default DropboxActions;\r\n","import { CustomNotification } from 'common/components';\r\nimport { useState, useEffect } from 'react';\r\n\r\nimport { getInteropListItems } from 'services/interoperability';\r\n\r\nimport { mappingInteropItemsToTreeData } from './utils';\r\n\r\nexport const useGetTreeData = ({ id, multipleImport, storageServiceType }) => {\r\n const [treeData, setTreeData] = useState([]);\r\n const [status, setStatus] = useState('idle');\r\n\r\n useEffect(() => {\r\n if (id) {\r\n setStatus('loading');\r\n\r\n getInteropListItems({\r\n id,\r\n pathInfo: null,\r\n storageServiceType,\r\n getFile: true,\r\n getFolder: true,\r\n })\r\n .then((res) => {\r\n if (res.isSuccess) {\r\n setStatus('success');\r\n\r\n const mappedTreeData = mappingInteropItemsToTreeData(\r\n res?.data?.interopItems,\r\n multipleImport\r\n );\r\n setTreeData(mappedTreeData);\r\n } else {\r\n setStatus('error');\r\n setTreeData([]);\r\n CustomNotification.error(res.message ?? 'Something went wrong');\r\n }\r\n })\r\n .catch((err) => {\r\n setStatus('error');\r\n setTreeData([]);\r\n CustomNotification.error(err.message ?? 'Something went wrong');\r\n });\r\n }\r\n }, [id, multipleImport, storageServiceType]);\r\n\r\n const handleSetTreeData = (treeData) => setTreeData(treeData);\r\n\r\n return {\r\n treeData,\r\n handleSetTreeData,\r\n setTreeData,\r\n isExpanding: status === 'loading',\r\n };\r\n};\r\n","import React, { useState, useMemo } from 'react';\r\n\r\nimport { DropboxFiles, DropboxSelection } from './DropboxFiles';\r\nimport DropboxActions from './DropboxActions';\r\n\r\nimport { useGetTreeData } from './hooks';\r\nimport { useGetListConnections } from 'pages/company-profile/components/tabs/system/interoperability/hooks';\r\n\r\nimport {\r\n findNodeTree,\r\n getChildNodesInFolder,\r\n filterArrayInAnotherArray,\r\n filterArrayObjectInAnotherArrayObject,\r\n findAncestorsOfChildNode,\r\n getOnlySelectedParentItems,\r\n} from './utils';\r\n\r\nimport {\r\n findListNodeInTree,\r\n getAllFilesInFolders,\r\n getFilesAfterExpandingAll,\r\n} from '../shared/utils';\r\n\r\nimport { DataToMsOffice } from 'utils/dataToMSoffice';\r\n\r\nimport './AssetDropboxUpload.less';\r\n\r\nconst AssetDropboxUpload = (props) => {\r\n const {\r\n isEnabledImportFolder,\r\n multipleImport,\r\n formInstance,\r\n handleCloseModal,\r\n idSelectionDropbox,\r\n setIdSelectionDropbox,\r\n typeViewAsset,\r\n importedFolderParams,\r\n destinationFolder,\r\n } = props;\r\n\r\n const { interoperabilities } = useGetListConnections({\r\n storageServiceType: 'dropbox',\r\n });\r\n\r\n // Default connection is first connection. I can't find any better name. Naming is so hard.\r\n const valueIdSelection = useMemo(() => {\r\n if (idSelectionDropbox) return idSelectionDropbox;\r\n\r\n if (interoperabilities.length > 0) return interoperabilities[0].id;\r\n\r\n return null;\r\n }, [idSelectionDropbox, interoperabilities]);\r\n\r\n const { treeData, isExpanding, setTreeData } = useGetTreeData({\r\n id: valueIdSelection,\r\n multipleImport,\r\n storageServiceType: 'dropbox',\r\n });\r\n\r\n const [selectedDropbox, setSelectedDropbox] = useState({\r\n selectedItems: [],\r\n selectedKeys: [],\r\n expandedKeys: [],\r\n });\r\n\r\n /* \r\n status === 'loading': treeData is loading data inside\r\n status === 'success': treeData is already loaded data\r\n */\r\n const [expandAll, setExpandAll] = useState({\r\n value: false,\r\n status: 'idle',\r\n });\r\n\r\n const [statusCopy, setStatusCopy] = useState('idle');\r\n\r\n const handleSelectItems = (keys, items) => {\r\n if (multipleImport) {\r\n const parentSelectedItems = getOnlySelectedParentItems(\r\n treeData,\r\n items,\r\n keys\r\n );\r\n\r\n setSelectedDropbox((prevItems) => ({\r\n ...prevItems,\r\n selectedItems: parentSelectedItems,\r\n selectedKeys: keys,\r\n }));\r\n } else {\r\n setSelectedDropbox((prevItems) => ({\r\n ...prevItems,\r\n selectedItems: items,\r\n selectedKeys: keys,\r\n }));\r\n }\r\n };\r\n\r\n const handleDeleteItem = (itemId) => {\r\n if (!multipleImport) {\r\n setSelectedDropbox((prevItems) => ({\r\n ...prevItems,\r\n selectedItems: [],\r\n selectedKeys: [],\r\n }));\r\n } else {\r\n const { selectedItems, selectedKeys } = selectedDropbox;\r\n\r\n const foundNode = findNodeTree(treeData, itemId);\r\n const isHaveChildren = foundNode?.children?.length > 0;\r\n\r\n const ancestorNodes = findAncestorsOfChildNode(treeData, foundNode);\r\n const ancestorKeys = ancestorNodes.map((node) => node.key);\r\n\r\n if (isHaveChildren) {\r\n const childNodes = getChildNodesInFolder(foundNode.children);\r\n const childKeys = childNodes.map((node) => node.key);\r\n\r\n const allKeys = [foundNode.key].concat(ancestorKeys).concat(childKeys); // include select key and ancestor keys\r\n const allNodes = [foundNode].concat(ancestorNodes).concat(childNodes);\r\n\r\n const filteredSelectedKeys = filterArrayInAnotherArray(\r\n selectedKeys,\r\n allKeys\r\n );\r\n const filteredSelectedItems = filterArrayObjectInAnotherArrayObject(\r\n selectedItems,\r\n allNodes\r\n );\r\n\r\n setSelectedDropbox((prevItems) => ({\r\n ...prevItems,\r\n selectedItems: filteredSelectedItems,\r\n selectedKeys: filteredSelectedKeys,\r\n }));\r\n } else {\r\n const allKeys = [foundNode.key].concat(ancestorKeys); // include select key and ancestor keys\r\n const allNodes = [foundNode].concat(ancestorNodes);\r\n\r\n const filteredSelectedKeys = filterArrayInAnotherArray(\r\n selectedKeys,\r\n allKeys\r\n );\r\n const filteredSelectedItems = filterArrayObjectInAnotherArrayObject(\r\n selectedItems,\r\n allNodes\r\n );\r\n\r\n setSelectedDropbox((prevItems) => ({\r\n ...prevItems,\r\n selectedItems: filteredSelectedItems,\r\n selectedKeys: filteredSelectedKeys,\r\n }));\r\n }\r\n }\r\n };\r\n\r\n const handleCopyFileNameToExcel = async () => {\r\n setStatusCopy('loading');\r\n\r\n let copyItems = [];\r\n\r\n const { selectedItems } = selectedDropbox;\r\n\r\n const selectedFiles = selectedItems.filter(\r\n (item) => item.data.type === 'file'\r\n );\r\n const selectedFolders = selectedItems.filter(\r\n (item) => item.data.type === 'folder'\r\n );\r\n\r\n if (expandAll.status === 'success') {\r\n const folderNodes = findListNodeInTree(treeData, selectedFolders);\r\n const filesInFolder = getAllFilesInFolders(folderNodes);\r\n\r\n copyItems = selectedFiles.concat(filesInFolder);\r\n } else {\r\n const expandedFiles = await getFilesAfterExpandingAll({\r\n folderNodes: selectedFolders,\r\n id: idSelectionDropbox,\r\n storageServiceType: 'dropbox',\r\n multipleImport,\r\n });\r\n\r\n copyItems = selectedFiles.concat(expandedFiles);\r\n }\r\n\r\n DataToMsOffice().copy2DArrayClipboardToExcel(\r\n copyItems.map((fileItem) => [fileItem.data.name])\r\n );\r\n\r\n setStatusCopy('success');\r\n };\r\n\r\n // after 30 days if the function is not restored please delete this code, thanks\r\n\r\n // const handleExpandAllFiles = async (event) => {\r\n // const checked = event.target.checked;\r\n\r\n // if (checked) {\r\n // setExpandAll((prevVal) => ({ ...prevVal, value: checked }));\r\n\r\n // // If treeData loaded data, then does not need to call api again.\r\n // if (expandAll.status !== 'success') {\r\n // setExpandAll((prevVal) => ({ ...prevVal, status: 'loading' }));\r\n\r\n // const newTreeData = await getTreeDataAfterExpandingAll({\r\n // treeData,\r\n // id: valueIdSelection,\r\n // storageServiceType: 'dropbox',\r\n // multipleImport,\r\n // });\r\n // const expandedKeys = getAllExpandedKeys(newTreeData);\r\n\r\n // setSelectedDropbox((prevItems) => ({\r\n // ...prevItems,\r\n // expandedKeys,\r\n // }));\r\n\r\n // handleSetTreeData(newTreeData);\r\n // setExpandAll((prevVal) => ({ ...prevVal, status: 'success' }));\r\n // } else {\r\n // const expandedKeys = getAllExpandedKeys(treeData);\r\n\r\n // setSelectedDropbox((prevItems) => ({\r\n // ...prevItems,\r\n // expandedKeys,\r\n // }));\r\n // }\r\n // } else {\r\n // setExpandAll((prevVal) => ({ ...prevVal, value: checked }));\r\n // setSelectedDropbox((prevItems) => ({\r\n // ...prevItems,\r\n // expandedKeys: [],\r\n // }));\r\n // }\r\n // };\r\n\r\n const handleExpandItems = (expandedKeys) => {\r\n setSelectedDropbox((prevItems) => ({\r\n ...prevItems,\r\n expandedKeys,\r\n }));\r\n };\r\n\r\n return (\r\n
\r\n {\r\n setIdSelectionDropbox(id);\r\n setExpandAll(false);\r\n setSelectedDropbox((prevItems) => ({\r\n ...prevItems,\r\n selectedItems: [],\r\n selectedKeys: [],\r\n expandedKeys: [],\r\n }));\r\n setExpandAll((prevVal) => ({ ...prevVal, status: 'idle' }));\r\n }}\r\n // onChangeExpandAll={handleExpandAllFiles}\r\n checked={expandAll.value}\r\n />\r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nexport default AssetDropboxUpload;\r\n","import React from 'react';\r\nimport { Space } from 'antd';\r\nimport { ArrowDownOutlined, ArrowUpOutlined } from '@ant-design/icons';\r\n\r\nconst AssociationIconRenderer = (props) => {\r\n const { item } = props;\r\n return (\r\n \r\n {item &&\r\n item.data &&\r\n (item.data.isInBound ? (\r\n \r\n ) : (\r\n \r\n ))}\r\n \r\n );\r\n};\r\nexport default AssociationIconRenderer;\r\n","import React from 'react';\r\nimport { Space } from 'antd';\r\nimport {\r\n CodeSandboxOutlined,\r\n FileImageOutlined,\r\n FileUnknownOutlined,\r\n FolderOpenOutlined,\r\n} from '@ant-design/icons';\r\n\r\nconst AssociationIconRenderer = (props) => {\r\n const { item } = props;\r\n return (\r\n \r\n {item &&\r\n item.data &&\r\n (item.data.type === 'DigitalAssets' ? (\r\n \r\n ) : item.data.type === 'Folder' ? (\r\n \r\n ) : item.data.type === 'Product' ? (\r\n \r\n ) : (\r\n \r\n ))}\r\n \r\n );\r\n};\r\nexport default AssociationIconRenderer;\r\n","import React from 'react';\r\nimport { Row, Col } from 'antd';\r\nimport classnames from 'classnames';\r\n\r\nimport './ConfirmResult.less';\r\n\r\nconst AssetUploadConfirmResult = ({\r\n value,\r\n iconsRender,\r\n isDateRender,\r\n placeholderValue,\r\n}) => {\r\n if (!isDateRender) {\r\n return iconsRender.map((item) => {\r\n const isRender = item?.conditionCheck(value);\r\n const Icon = item.icon;\r\n return (\r\n <>\r\n {isRender && (\r\n \r\n \r\n \r\n {item.text}\r\n \r\n \r\n )}\r\n \r\n );\r\n });\r\n }\r\n\r\n let ActiveIcon = iconsRender?.[0]?.icon ? iconsRender[0].icon :
;\r\n let InActiveIcon = iconsRender?.[1]?.icon ? iconsRender[1].icon :
;\r\n\r\n return (\r\n \r\n \r\n {value ? (\r\n \r\n ) : (\r\n \r\n )}\r\n {value || placeholderValue}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default AssetUploadConfirmResult;\r\n","import React from 'react';\r\nimport { Row, Col, Typography } from 'antd';\r\nimport {\r\n CheckCircleOutlined,\r\n ExclamationCircleOutlined,\r\n CheckSquareOutlined,\r\n CloseSquareOutlined,\r\n ScheduleOutlined,\r\n WarningOutlined,\r\n} from '@ant-design/icons';\r\nimport ConfirmResult from './ConfirmResult';\r\nimport { cloneDeep } from 'lodash';\r\nimport { formatMDY } from 'utils/formatDate';\r\n\r\nconst { Text } = Typography;\r\n\r\nconst ConfirmContent = (props) => {\r\n const {\r\n multiImportFormValue,\r\n destinationFolder,\r\n isUploadFromLocal,\r\n isEnabledImportFolder,\r\n } = props;\r\n\r\n const { destinationFolder: folder, isCreateSubfolder } =\r\n destinationFolder ?? {};\r\n\r\n const importConfirmContent = [\r\n {\r\n label: 'Default status',\r\n rerult: (\r\n value.toLowerCase() === 'active',\r\n },\r\n {\r\n status: 'inactive',\r\n icon: WarningOutlined,\r\n text: 'Inactive',\r\n conditionCheck: (value) => value.toLowerCase() === 'inactive',\r\n },\r\n {\r\n status: 'pending',\r\n icon: ExclamationCircleOutlined,\r\n text: 'Pending',\r\n conditionCheck: (value) => value.toLowerCase() === 'pending',\r\n },\r\n ]}\r\n />\r\n ),\r\n },\r\n {\r\n label: 'Create thumbs',\r\n rerult: (\r\n value === true,\r\n },\r\n {\r\n status: 'inactive',\r\n icon: CloseSquareOutlined,\r\n text: 'No',\r\n conditionCheck: (value) => value === false,\r\n },\r\n ]}\r\n />\r\n ),\r\n },\r\n {\r\n label: 'Auto apply/replace on product',\r\n rerult: (\r\n value === true,\r\n },\r\n {\r\n status: 'inactive',\r\n icon: CloseSquareOutlined,\r\n text: 'No',\r\n conditionCheck: (value) => value === false,\r\n },\r\n ]}\r\n />\r\n ),\r\n },\r\n {\r\n label: 'Effective Date',\r\n rerult: (\r\n \r\n ),\r\n },\r\n {\r\n label: 'Expiration Date',\r\n rerult: (\r\n \r\n ),\r\n },\r\n ];\r\n\r\n const showCreateSubFolder = {\r\n label: 'Create subfolder',\r\n rerult: (\r\n value === true,\r\n },\r\n {\r\n status: 'inactive',\r\n icon: CloseSquareOutlined,\r\n text: 'No',\r\n conditionCheck: (value) => value === false,\r\n },\r\n ]}\r\n />\r\n ),\r\n };\r\n\r\n const folderName = folder?.folderName || folder?.description;\r\n\r\n const showDestinationFolder = {\r\n label: 'Destination folder',\r\n rerult: (\r\n value === true,\r\n },\r\n {\r\n status: 'inactive',\r\n icon: CloseSquareOutlined,\r\n text: 'No',\r\n conditionCheck: (value) => value === false,\r\n },\r\n ]}\r\n />\r\n ),\r\n };\r\n\r\n const addEntityToConfirmModal = ((content) => {\r\n const showList = cloneDeep(content);\r\n if (!isEnabledImportFolder) return showList;\r\n\r\n showList.splice(2, 0, showDestinationFolder);\r\n if (!isUploadFromLocal) showList.splice(2, 0, showCreateSubFolder);\r\n\r\n return showList;\r\n })(importConfirmContent);\r\n\r\n return (\r\n
\r\n
\r\n \r\n Please confirm your setting before uploading\r\n \r\n
\r\n {addEntityToConfirmModal.map((rowItem, idx) => {\r\n return (\r\n \r\n \r\n {rowItem.label}:\r\n \r\n {rowItem.rerult}\r\n \r\n );\r\n })}\r\n
\r\n );\r\n};\r\n\r\nexport default ConfirmContent;\r\n","import React, { useMemo } from 'react';\r\nimport { Row, Col, Typography } from 'antd';\r\nimport { ScheduleOutlined } from '@ant-design/icons';\r\nimport ConfirmResult from './ConfirmResult';\r\nimport { DATE_FORMAT } from 'static/Constants';\r\nimport moment from 'moment';\r\n\r\nconst { Text } = Typography;\r\n\r\nconst ConfirmContent = (props) => {\r\n const { effDate, expDate } = props;\r\n\r\n const dateFormat = useMemo(() => DATE_FORMAT.SYSTEM_FORMAT, []);\r\n\r\n const convertEffDate = useMemo(\r\n () => (effDate ? moment(effDate).format(dateFormat) : null),\r\n [effDate, dateFormat]\r\n );\r\n const convertExpDate = useMemo(\r\n () => (expDate ? moment(expDate).format(dateFormat) : null),\r\n [expDate, dateFormat]\r\n );\r\n\r\n const importConfirmContent = useMemo(\r\n () => [\r\n {\r\n label: 'Effective Date',\r\n rerult: (\r\n \r\n ),\r\n },\r\n {\r\n label: 'Expiration Date',\r\n rerult: (\r\n \r\n ),\r\n },\r\n ],\r\n [convertExpDate, convertEffDate]\r\n );\r\n\r\n return (\r\n
\r\n
\r\n \r\n Do you want to set effective date as a future date?\r\n \r\n
\r\n {importConfirmContent.map((rowItem) => {\r\n return (\r\n \r\n \r\n {rowItem.label}:\r\n \r\n {rowItem.rerult}\r\n \r\n );\r\n })}\r\n
\r\n );\r\n};\r\n\r\nexport default ConfirmContent;\r\n","import React, { useState } from 'react';\r\nimport { useIntl } from 'react-intl';\r\n\r\nimport { FormAddButton, CustomNotification } from 'common/components';\r\n\r\nimport CreateFolderModal from 'pages/home/ribbon/components/controls/folders/CreateFolderModal';\r\nimport Messages from 'i18n/messages/folder';\r\n\r\nimport { useCheckAllowCreateFolder } from '../shared/hooks';\r\n\r\nconst AssetToFolderTool = (props) => {\r\n const { selectedItem, onCreateNewFolderSuccess } = props;\r\n\r\n const intl = useIntl();\r\n\r\n const createFolderModalVisibleHook = useState(false);\r\n\r\n const isAllowCreateFolder = useCheckAllowCreateFolder();\r\n\r\n const [, setCreateNewFolderModalVisible] = createFolderModalVisibleHook;\r\n\r\n const toggleCreateNewFolderModal = () => {\r\n setCreateNewFolderModalVisible((prev) => !prev);\r\n };\r\n\r\n const onReloadWhenSaveSuccess = () => {\r\n CustomNotification.success(\r\n intl.formatMessage(Messages.createFolderSuccess)\r\n );\r\n onCreateNewFolderSuccess(selectedItem);\r\n };\r\n\r\n return (\r\n
\r\n \r\n\r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nexport default AssetToFolderTool;\r\n","import React from 'react';\r\n\r\nimport { Typography, Input, Tree, Checkbox, Row, Col } from 'antd';\r\n\r\nimport classnames from 'classnames';\r\n\r\nimport { WithLoading } from 'common/components';\r\nimport AssetToFolderTool from './AssetToFolderTool';\r\n\r\nimport './AssetToFolder.less';\r\n\r\nconst AssetToFolder = (props) => {\r\n const {\r\n loadingTree,\r\n subFolderParams = {},\r\n treeData,\r\n onSearch,\r\n onUpdateFolder,\r\n onToggleCreateSubfolder,\r\n selectedItem,\r\n onCreateNewFolderSuccess,\r\n ...rest\r\n } = props;\r\n\r\n const { isShow, isCreateSubfolder } = subFolderParams;\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n Destination Folder:\r\n \r\n \r\n \r\n \r\n \r\n\r\n {isShow && (\r\n \r\n {\r\n onToggleCreateSubfolder(event.target.checked);\r\n }}\r\n checked={isCreateSubfolder}\r\n >\r\n Create subfolders\r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n );\r\n};\r\n\r\nexport default AssetToFolder;\r\n","import React from 'react';\r\nimport { Row } from 'antd';\r\nimport './AssetAssociations.less';\r\nimport AgGrid from 'common/components/ag-grid/AgGrid';\r\nimport * as endpoints from 'services/digitalAsset/endpoints';\r\n\r\nconst AssetAssociations = (props) => {\r\n const { associationColumn, assetData } = props;\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nAssetAssociations.propTypes = {};\r\n\r\nexport default AssetAssociations;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Row, Col, Checkbox } from 'antd';\r\nimport { formatMDY } from 'utils/formatDate';\r\nimport { injectIntl } from 'react-intl';\r\nimport './AssetCreator.less';\r\n\r\nconst AssetHeaderInformation = (props) => {\r\n const { loaded, modified, isShowcase, intl } = props;\r\n return (\r\n \r\n \r\n {intl.formatMessage({\r\n id: `Taco.digitalAsset.headerInformation.loaded`,\r\n })}\r\n \r\n \r\n {loaded && formatMDY(loaded)}\r\n \r\n \r\n {intl.formatMessage({\r\n id: `Taco.digitalAsset.headerInformation.modified`,\r\n })}\r\n \r\n \r\n {modified && formatMDY(modified)}\r\n \r\n {isShowcase && (\r\n <>\r\n \r\n {intl.formatMessage({\r\n id: `Taco.digitalAsset.headerInformation.showcased`,\r\n })}\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nAssetHeaderInformation.propTypes = {\r\n loaded: PropTypes.string,\r\n modified: PropTypes.string,\r\n isShowcase: PropTypes.bool,\r\n};\r\n\r\nexport default injectIntl(AssetHeaderInformation);\r\n","import React, { useEffect, useState } from 'react';\r\nimport { useSelector, useDispatch } from 'react-redux';\r\nimport PropTypes, { oneOfType } from 'prop-types';\r\nimport {\r\n Row,\r\n Col,\r\n Radio,\r\n Select,\r\n Button,\r\n notification,\r\n Tooltip,\r\n Typography,\r\n Divider,\r\n InputNumber,\r\n Checkbox,\r\n} from 'antd';\r\nimport { Form, TypePicker, ColorPicker } from 'common/components';\r\nimport { PlusOutlined } from '@ant-design/icons';\r\nimport {\r\n RESOLUTION_OPTIONS,\r\n CROP_SIZE_OPTIONS,\r\n IMAGE_SIZE_OPTIONS,\r\n BACKGROUND_OPTIONS,\r\n IMAGE_SIZE_OPTIONS_SINGLE_DIGIT,\r\n} from 'static/Constants';\r\nimport {\r\n downloadDigitalAsset,\r\n downloadDigitalAssetByEmail,\r\n} from 'services/digitalAsset';\r\nimport { dialogFunction, WrapperSelect } from 'common/components';\r\nimport DigitalRight from 'assets/DRM.png';\r\nimport { DIGITAL_ASSET_DOWNLOAD } from 'services/digitalAsset/endpoints';\r\nimport { setAssetType } from 'utils/fileType';\r\nimport { injectIntl } from 'react-intl';\r\nimport * as api from 'config/axios';\r\nimport { EmailSelection } from 'common/components';\r\nimport userSelectors from '@redux/user/selectors';\r\nimport * as companySelectors from 'pages/company-profile/controllers/selectors';\r\nimport * as memberActions from 'pages/company-profile/controllers/actions';\r\n\r\nimport * as _ from 'lodash';\r\n\r\nimport './AssetDownload.less';\r\n\r\nconst { Option } = Select;\r\nconst { Title } = Typography;\r\n\r\nconst formItemFormatLayout = { labelCol: { span: 24 } };\r\n\r\nconst formItemConfigLayout = {\r\n labelCol: { xxl: { span: 8 }, xl: { span: 9 } },\r\n wrapperCol: { xxl: { span: 15 }, xl: { span: 13 } },\r\n};\r\n\r\nconst addButtonStyle = {\r\n flex: 'none',\r\n padding: '8px',\r\n display: 'block',\r\n cursor: 'pointer',\r\n};\r\n\r\nconst customSetupStyle = {\r\n display: 'flex',\r\n alignItems: 'center',\r\n flexWrap: 'nowrap',\r\n padding: 8,\r\n};\r\n\r\nconst AssetDownload = (props) => {\r\n const {\r\n assetId,\r\n metadata,\r\n downloadFormats: listFormatType,\r\n intl,\r\n drm,\r\n } = props;\r\n\r\n const dispatch = useDispatch();\r\n\r\n const alternativeEmail = useSelector(\r\n userSelectors.makeSelectUserAlternativeEmail()\r\n );\r\n\r\n const assetDownloadPreference = useSelector(\r\n userSelectors.makeSelectAssetDownloadPreference()\r\n );\r\n\r\n const primaryEmail = useSelector(userSelectors.makeSelectUserEmail());\r\n const [form] = Form.useForm();\r\n const [downloadType, setDownloadType] = useState('');\r\n const [visibleEmailSelection, setVisibleEmailSelection] = useState(false);\r\n const [resolutionOptions, setResolution] = useState(RESOLUTION_OPTIONS);\r\n const [cropSizeOptions, setCropSize] = useState(CROP_SIZE_OPTIONS);\r\n const [imageSizeOptions, setImageSize] = useState(IMAGE_SIZE_OPTIONS);\r\n const [backgroundOptions, setBackground] = useState(BACKGROUND_OPTIONS);\r\n const [customResolution, setCustomResolution] = useState('');\r\n const [customCropSize, setCustomCropSize] = useState('');\r\n const [customImageSize, setCustomImageSize] = useState('');\r\n const [allowAdding, setAllowAdding] = useState(true);\r\n const [downloadFormat, setDownloadFormat] = useState('');\r\n\r\n const downloadFormats = [\r\n ...new Set([...(listFormatType ?? []), metadata?.fileType?.toUpperCase()]),\r\n ].sort();\r\n\r\n const memberInfo = useSelector(companySelectors.selectMemberProfile());\r\n\r\n const userInfo = useSelector(userSelectors.makeSelectUserInfo());\r\n\r\n useEffect(() => {\r\n if (_.isEmpty(memberInfo)) {\r\n dispatch(memberActions.getMemberProfileHeader(userInfo?.member?.id));\r\n }\r\n }, [dispatch, userInfo?.member?.id]);\r\n\r\n const onOptionChange = (type, value) => {\r\n switch (type) {\r\n case 'resolution':\r\n setCustomResolution(value);\r\n\r\n break;\r\n case 'cropSize':\r\n setCustomCropSize(value);\r\n break;\r\n case 'imageSize':\r\n setCustomImageSize(value);\r\n break;\r\n default:\r\n break;\r\n }\r\n };\r\n\r\n const addResolutionItem = () => {\r\n if (!customResolution)\r\n openNotification(\r\n 'error',\r\n intl.formatMessage({\r\n id: 'Taco.digitalAsset.assetDownload.resolution.customize',\r\n }),\r\n intl.formatMessage({\r\n id: 'Taco.digitalAsset.assetDownload.resolution.missing',\r\n })\r\n );\r\n else if (resolutionOptions.includes(customResolution))\r\n openNotification(\r\n 'error',\r\n intl.formatMessage({\r\n id: 'Taco.digitalAsset.assetDownload.resolution.customize',\r\n }),\r\n intl.formatMessage({\r\n id: 'Taco.digitalAsset.assetDownload.resolution.duplicated',\r\n })\r\n );\r\n else setResolution([...resolutionOptions, customResolution]);\r\n };\r\n\r\n const addCropSizeItem = () => {\r\n if (!customCropSize)\r\n openNotification(\r\n 'error',\r\n intl.formatMessage({\r\n id: 'Taco.digitalAsset.assetDownload.cropSize.customize',\r\n }),\r\n intl.formatMessage({\r\n id: 'Taco.digitalAsset.assetDownload.cropSize.missing',\r\n })\r\n );\r\n else if (cropSizeOptions.includes(customCropSize))\r\n openNotification(\r\n 'error',\r\n intl.formatMessage({\r\n id: 'Taco.digitalAsset.assetDownload.cropSize.customize',\r\n }),\r\n intl.formatMessage({\r\n id: 'Taco.digitalAsset.assetDownload.cropSize.duplicated',\r\n })\r\n );\r\n else setCropSize([...cropSizeOptions, customCropSize]);\r\n };\r\n\r\n const confirmRender = (key) => {\r\n return (\r\n
\r\n {intl.formatMessage({\r\n id: 'Taco.digitalAsset.assetDownload.imageSize.pixilation',\r\n })}\r\n
\r\n {\r\n notification.close(key);\r\n setImageSize([...imageSizeOptions, key]);\r\n setAllowAdding(true);\r\n }}\r\n >\r\n Continue\r\n \r\n {\r\n notification.close(key);\r\n setAllowAdding(true);\r\n }}\r\n >\r\n Cancel\r\n \r\n
\r\n
\r\n );\r\n };\r\n\r\n const addImageSizeItem = () => {\r\n if (!customImageSize)\r\n openNotification(\r\n 'error',\r\n intl.formatMessage({\r\n id: 'Taco.digitalAsset.assetDownload.imageSize.customize',\r\n }),\r\n intl.formatMessage({\r\n id: 'Taco.digitalAsset.assetDownload.imageSize.missing',\r\n })\r\n );\r\n else if (\r\n imageSizeOptions.includes(customImageSize) ||\r\n IMAGE_SIZE_OPTIONS_SINGLE_DIGIT.includes(customImageSize)\r\n )\r\n openNotification(\r\n 'error',\r\n intl.formatMessage({\r\n id: 'Taco.digitalAsset.assetDownload.imageSize.customize',\r\n }),\r\n intl.formatMessage({\r\n id: 'Taco.digitalAsset.assetDownload.imageSize.duplicated',\r\n })\r\n );\r\n else if (\r\n metadata?.width < customImageSize ||\r\n metadata?.height < customImageSize\r\n ) {\r\n openNotification(\r\n 'warning',\r\n intl.formatMessage({\r\n id: 'Taco.digitalAsset.assetDownload.imageSize.customize.warning',\r\n }),\r\n confirmRender(customImageSize),\r\n customImageSize,\r\n () => setAllowAdding(true)\r\n );\r\n setAllowAdding(false);\r\n } else setImageSize([...imageSizeOptions, customImageSize]);\r\n };\r\n\r\n const addBackgroundItem = (color) => {\r\n if (!backgroundOptions.includes(color)) {\r\n setBackground([...backgroundOptions, color]);\r\n } else {\r\n openNotification(\r\n 'error',\r\n intl.formatMessage({\r\n id: 'Taco.digitalAsset.assetDownload.background.customize',\r\n }),\r\n intl.formatMessage({\r\n id: 'Taco.digitalAsset.assetDownload.background.duplicated',\r\n })\r\n );\r\n }\r\n };\r\n\r\n const openNotification = (result, message, description, key, close) => {\r\n let type;\r\n switch (result) {\r\n case true:\r\n type = 'success';\r\n break;\r\n case false:\r\n type = 'error';\r\n break;\r\n default:\r\n type = result;\r\n break;\r\n }\r\n type\r\n ? notification[type]({\r\n message: message,\r\n description: description,\r\n duration: type === 'warning' ? 0 : 4.5,\r\n key: key,\r\n onClose: close,\r\n })\r\n : notification.error({\r\n message: intl.formatMessage({\r\n id: 'Taco.digitalAsset.assetDownload.notification.oops',\r\n }),\r\n description: intl.formatMessage({\r\n id: 'Taco.digitalAsset.assetDownload.notification.fail',\r\n }),\r\n duration: type === 'warning' ? 0 : 4.5,\r\n });\r\n };\r\n\r\n async function onAssetDownload(type) {\r\n setDownloadType(type);\r\n const paramsConfig = onConfigParams(type);\r\n if (type === 'direct') {\r\n await onAssetDownloadDirect(paramsConfig);\r\n } else if (type === 'ftp') {\r\n await onAssetDownloadFTP(paramsConfig);\r\n } else {\r\n await onAssetDownloadEmail(paramsConfig, primaryEmail);\r\n }\r\n setDownloadType('');\r\n }\r\n\r\n const onConfigParams = (type) => {\r\n const formData = form.getFieldsValue();\r\n return {\r\n AssetId: assetId,\r\n Resolution: formData.resolution,\r\n ImageSize: formData.imageSize,\r\n CropSize: formData.cropSize,\r\n Background: formData.background,\r\n DownloadFormat: formData.format,\r\n DownloadMethod: type,\r\n square: formData.square,\r\n };\r\n };\r\n\r\n const onAssetDownloadDirect = async (params) => {\r\n await api\r\n .requestToDownload({\r\n method: 'POST',\r\n apiEndpoint: DIGITAL_ASSET_DOWNLOAD,\r\n payload: params,\r\n })\r\n .then((response) => {\r\n openNotification(\r\n response?.isSuccess,\r\n 'Direct Download',\r\n response?.message || 'Something went wrong! Please try again'\r\n );\r\n });\r\n };\r\n\r\n function handleDownload(type) {\r\n dialogFunction({\r\n type: 'warn',\r\n content: (\r\n
\r\n \r\n {intl.formatMessage({\r\n id: `Taco.home.ribbon.dialogDeleteDRMsingle`,\r\n })}\r\n
\r\n ),\r\n\r\n okText: 'Cancel',\r\n onCancel: () => {\r\n if (type === 'direct') {\r\n onAssetDownload('direct');\r\n } else if (type === 'email') {\r\n setFuncForSendEmail();\r\n } else onAssetDownload('ftp');\r\n },\r\n cancelText: 'Download',\r\n });\r\n }\r\n\r\n const onAssetDownloadFTP = async (params) => {\r\n await downloadDigitalAsset(params).then((response) => {\r\n openNotification(response?.isSuccess, 'FTP Download', response?.message);\r\n });\r\n };\r\n\r\n const onAssetDownloadEmail = async (params, emails) => {\r\n let submitEmails = Array.isArray(emails) ? emails : [emails];\r\n await downloadDigitalAssetByEmail({ ...params, Emails: submitEmails }).then(\r\n (response) => {\r\n openNotification(\r\n response?.isSuccess,\r\n 'Email Download',\r\n response?.message\r\n );\r\n }\r\n );\r\n };\r\n\r\n const onSendMultiEmail = async (emails) => {\r\n setDownloadType('email');\r\n const paramsConfig = onConfigParams('email');\r\n setVisibleEmailSelection(false);\r\n await onAssetDownloadEmail(paramsConfig, emails);\r\n setDownloadType('');\r\n };\r\n\r\n const setFuncForSendEmail = () => {\r\n if (alternativeEmail && alternativeEmail.length > 0) {\r\n setVisibleEmailSelection(true);\r\n } else {\r\n onAssetDownload('email'); // default sending for primary email if alter email is empty\r\n }\r\n };\r\n\r\n const setDefaultValuesDownloadForm = () => {\r\n let background = null;\r\n let cropSize = null;\r\n const defaultDownloadFormat = assetDownloadPreference?.downloadFormat;\r\n\r\n const format = downloadFormats?.includes(\r\n defaultDownloadFormat?.toUpperCase()\r\n )\r\n ? defaultDownloadFormat\r\n : metadata?.fileType?.toLowerCase();\r\n\r\n if (metadata?.clippingPath) {\r\n background = assetDownloadPreference?.background\r\n ? assetDownloadPreference?.background\r\n : 'Original';\r\n cropSize = assetDownloadPreference?.cropSize;\r\n } else {\r\n background = 'Original';\r\n }\r\n\r\n const mappingAssetDownloadPreference = {\r\n ...assetDownloadPreference,\r\n format,\r\n background,\r\n cropSize,\r\n resolution: assetDownloadPreference?.resolution ?? null,\r\n };\r\n form.setFieldsValue(mappingAssetDownloadPreference);\r\n };\r\n\r\n useEffect(() => {\r\n setDefaultValuesDownloadForm();\r\n setDownloadFormat(metadata?.fileType);\r\n }, [metadata]);\r\n\r\n const imageSizeCustomRender = (value) => {\r\n if (IMAGE_SIZE_OPTIONS.includes(value)) return value;\r\n else return `${value}x${value}`;\r\n };\r\n\r\n const checkDisableImageSize = (value) => {\r\n // If value == Full-size\r\n if (value === IMAGE_SIZE_OPTIONS[IMAGE_SIZE_OPTIONS.length - 1])\r\n return false;\r\n\r\n const size = typeof value === 'string' ? value?.split('x')[0] : value;\r\n\r\n if (+size > +metadata?.width && +size > +metadata?.height) {\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n const renderResolutionNameByNumber = (number) => {\r\n switch (number) {\r\n case 72:\r\n return 'DPI - Low Resolution';\r\n\r\n case 300:\r\n return 'DPI - High Resolution';\r\n\r\n default:\r\n break;\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {intl.formatMessage({\r\n id: `Taco.digitalAsset.assetDownload.step1`,\r\n })}\r\n \r\n \r\n \r\n \r\n \r\n {downloadFormats?.length > 0 &&\r\n [...downloadFormats]?.map((option) => {\r\n return (\r\n \r\n {\r\n setDownloadFormat(e?.target?.value);\r\n }}\r\n >\r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n \r\n \r\n \r\n\r\n {setAssetType(metadata?.fileType) === 'Image' && (\r\n \r\n \r\n \r\n {intl.formatMessage({\r\n id: `Taco.digitalAsset.assetDownload.step2`,\r\n })}\r\n \r\n \r\n \r\n \r\n document.getElementById('form-id')}\r\n >\r\n {resolutionOptions.map((option, index) => {\r\n return (\r\n \r\n );\r\n })}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {/* crop size input */}\r\n document.getElementById('form-id')}\r\n disabled={!metadata?.clippingPath}\r\n >\r\n {cropSizeOptions.map((option, index) => {\r\n return (\r\n \r\n );\r\n })}\r\n \r\n \r\n \r\n \r\n \r\n \r\n document.getElementById('form-id')}\r\n dropdownRender={(menu) => (\r\n
\r\n {menu}\r\n \r\n
\r\n
\r\n onOptionChange('imageSize', e)}\r\n />\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n )}\r\n >\r\n {imageSizeOptions.map((option, index) => {\r\n return (\r\n \r\n {imageSizeCustomRender(option)}\r\n \r\n );\r\n })}\r\n \r\n \r\n \r\n \r\n \r\n \r\n document.getElementById('form-id')}\r\n dropdownRender={(menu) => (\r\n
\r\n {menu}\r\n \r\n
\r\n \r\n
\r\n
\r\n )}\r\n disabled={!metadata?.clippingPath}\r\n >\r\n {backgroundOptions.map((option, index) => {\r\n return (\r\n \r\n {option}\r\n \r\n );\r\n })}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n )}\r\n \r\n \r\n {setAssetType(metadata?.fileType) === 'Image' ? (\r\n \r\n {intl.formatMessage({\r\n id: `Taco.digitalAsset.assetDownload.step3`,\r\n })}\r\n \r\n ) : (\r\n \r\n {intl.formatMessage({\r\n id: `Taco.digitalAsset.assetDownload.step2method`,\r\n })}\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n document.getElementById('download-method')\r\n }\r\n title={intl.formatMessage({\r\n id: `Taco.digitalAsset.assetDownload.downloadMethod.direct`,\r\n })}\r\n >\r\n
\r\n \r\n drm ? handleDownload('direct') : onAssetDownload('direct')\r\n }\r\n disabled={['email', 'ftp'].includes(downloadType)}\r\n value='direct'\r\n >\r\n \r\n \r\n
\r\n \r\n \r\n document.getElementById('download-method')\r\n }\r\n title={intl.formatMessage({\r\n id: `Taco.digitalAsset.assetDownload.downloadMethod.email`,\r\n })}\r\n >\r\n
\r\n \r\n drm ? handleDownload('email') : setFuncForSendEmail()\r\n }\r\n value='email'\r\n >\r\n \r\n \r\n setVisibleEmailSelection(false)}\r\n visible={visibleEmailSelection}\r\n onSendEmail={onSendMultiEmail}\r\n primaryEmail={primaryEmail}\r\n alternativeEmail={alternativeEmail}\r\n >\r\n
\r\n \r\n {memberInfo?.ftpEnabled && (\r\n \r\n document.getElementById('download-method')\r\n }\r\n title={intl.formatMessage({\r\n id: `Taco.digitalAsset.assetDownload.downloadMethod.ftp`,\r\n })}\r\n >\r\n
\r\n \r\n drm ? handleDownload('ftp') : onAssetDownload('ftp')\r\n }\r\n disabled={['direct', 'email'].includes(downloadType)}\r\n value='ftp'\r\n >\r\n \r\n \r\n
\r\n \r\n )}\r\n
\r\n
\r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nAssetDownload.propTypes = {\r\n assetId: oneOfType([PropTypes.number, PropTypes.string]),\r\n metadata: PropTypes.object,\r\n downloadFormats: oneOfType([PropTypes.array, PropTypes.object]),\r\n};\r\n\r\nexport default injectIntl(AssetDownload);\r\n","import React from 'react';\r\nimport { LabelValueWrapper } from 'common/components';\r\nimport { Row, Col } from 'antd';\r\n\r\nimport { FACING, ANGLE, PACKAGING_DISPOSITION } from 'static/Constants';\r\n\r\nconst AssetType = (props) => {\r\n const {\r\n assetType,\r\n assetSubType,\r\n packageLevel,\r\n packagingDisposition,\r\n angle,\r\n facing,\r\n language,\r\n panelType,\r\n logoType,\r\n certificateType,\r\n documentType,\r\n } = props;\r\n\r\n let objectData = { assetType, assetSubType };\r\n\r\n const getFieldLabel = ({ constant, value }) => {\r\n return constant.find((constItem) => {\r\n return constItem.value?.toLowerCase() === value?.toLowerCase();\r\n })?.label;\r\n };\r\n\r\n if (assetSubType === 'Planogram') {\r\n objectData = {\r\n ...objectData,\r\n packageLevel,\r\n packagingDisposition: getFieldLabel({\r\n constant: PACKAGING_DISPOSITION,\r\n value: packagingDisposition,\r\n }),\r\n angle: getFieldLabel({ constant: ANGLE, value: angle }),\r\n facing: getFieldLabel({ constant: FACING, value: facing }),\r\n language,\r\n };\r\n } else if (assetSubType === 'Panel') {\r\n objectData = {\r\n ...objectData,\r\n panelType,\r\n };\r\n } else if (assetSubType === 'Logo') {\r\n objectData = {\r\n ...objectData,\r\n logoType,\r\n };\r\n } else if (assetSubType === 'Certificate') {\r\n objectData = {\r\n ...objectData,\r\n certificateType,\r\n };\r\n } else if (assetSubType === 'Company') {\r\n objectData = {\r\n ...objectData,\r\n documentType,\r\n };\r\n }\r\n\r\n return (\r\n <>\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default AssetType;\r\n","import React, { useState, useEffect } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { Select, Row } from 'antd';\r\nimport * as Const from 'static/Constants';\r\nimport { FormattedMessage, injectIntl } from 'react-intl';\r\nimport messages from 'i18n/messages/assetDetail';\r\nimport {\r\n Form,\r\n FormSaveButton,\r\n FormCancelButton,\r\n WrapperSelect,\r\n FlagCountrySelectionFieldInput,\r\n} from 'common/components';\r\nimport { DownOutlined } from '@ant-design/icons';\r\nimport './style.less';\r\nimport * as assetSelectors from 'pages/branded-assets/controllers/selectors';\r\n\r\nconst AssetEdit = (props) => {\r\n const { onSubmit, onCancel, typeData } = props;\r\n const [form] = Form.useForm();\r\n const [type, setType] = useState(typeData?.assetType);\r\n const [subType, setSubType] = useState(typeData?.assetSubType);\r\n const { Option } = Select;\r\n const initialForm = {\r\n assetType: null,\r\n assetSubType: null,\r\n packageLevel: null,\r\n packagingDisposition: null,\r\n angle: null,\r\n facing: null,\r\n language: null,\r\n panelType: null,\r\n logoType: null,\r\n certificateType: null,\r\n documentType: null,\r\n };\r\n\r\n const assetLoading = useSelector(assetSelectors.selectEditTypeLoading());\r\n\r\n const getCodeByCountry = (values) => {\r\n return Object.keys(customLabels).find(\r\n (key) => customLabels[key] === values\r\n );\r\n };\r\n const enableCountry = [\r\n 'US',\r\n 'FR',\r\n 'ES',\r\n 'PT',\r\n 'DE',\r\n 'IN',\r\n 'IT',\r\n 'RU',\r\n 'IR',\r\n 'CN',\r\n ];\r\n const customLabels = {\r\n US: 'English',\r\n FR: 'French',\r\n ES: 'Spanish',\r\n PT: 'Portuguese',\r\n DE: 'German',\r\n IN: 'Hindil',\r\n IT: 'Italian',\r\n RU: 'Russian',\r\n IR: 'Persian',\r\n CN: 'Chinese',\r\n };\r\n\r\n useEffect(() => {\r\n form.setFieldsValue(typeData);\r\n setType(typeData?.assetType);\r\n setSubType(typeData?.assetSubType);\r\n }, [typeData]);\r\n\r\n return (\r\n <>\r\n onSubmit(value)}\r\n >\r\n
\r\n \r\n form.submit()}\r\n />\r\n {\r\n form.setFieldsValue(initialForm);\r\n setType(null);\r\n setSubType(null);\r\n onCancel();\r\n }}\r\n />\r\n \r\n
\r\n \r\n {\r\n setType(value);\r\n setSubType(null);\r\n form.setFieldsValue({ ...initialForm, assetType: value });\r\n }}\r\n >\r\n {Const.ASSET_TYPE?.slice()\r\n .sort()\r\n .map((item, index) => {\r\n return (\r\n \r\n );\r\n })}\r\n \r\n \r\n {type && (\r\n \r\n {\r\n setSubType(value);\r\n form.setFieldsValue({\r\n ...initialForm,\r\n assetSubType: value,\r\n assetType: type,\r\n });\r\n }}\r\n >\r\n {type === 'Asset'\r\n ? Const.ASSET_SUBTYPE?.slice()\r\n .sort()\r\n .map((item, index) => {\r\n return (\r\n \r\n );\r\n })\r\n : type === 'Company'\r\n ? Const.COMPANY_SUBTYPE.sort().map((item, index) => {\r\n return (\r\n \r\n );\r\n })\r\n : type === 'Document'\r\n ? Const.DOCUMENT_SUBTYPE.sort().map((item, index) => {\r\n return (\r\n \r\n );\r\n })\r\n : type === 'Multimedia'\r\n ? Const.MULTIMEDIA_SUBTYPE.sort().map((item, index) => {\r\n return (\r\n \r\n );\r\n })\r\n : type === 'Product'\r\n ? Const.PRODUCT_SUBTYPE.sort().map((item, index) => {\r\n return (\r\n \r\n );\r\n })\r\n : null}\r\n \r\n \r\n )}\r\n\r\n {subType === 'Planogram' ? (\r\n <>\r\n }\r\n >\r\n \r\n document.getElementById('asset-type-form')\r\n }\r\n >\r\n {Const.PACKAGE_LEVEL?.map((item, index) => {\r\n return (\r\n \r\n {item}\r\n \r\n );\r\n })}\r\n \r\n \r\n }\r\n >\r\n \r\n document.getElementById('asset-type-form')\r\n }\r\n >\r\n {Const.PACKAGING_DISPOSITION?.slice()\r\n .sort()\r\n .map((item, index) => {\r\n return (\r\n \r\n {item}\r\n \r\n );\r\n })}\r\n \r\n \r\n }\r\n >\r\n \r\n document.getElementById('asset-type-form')\r\n }\r\n >\r\n {Const.ANGLE?.slice()\r\n .sort()\r\n .map((item, index) => {\r\n return (\r\n \r\n {item}\r\n \r\n );\r\n })}\r\n \r\n \r\n }\r\n >\r\n \r\n document.getElementById('asset-type-form')\r\n }\r\n >\r\n {Const.FACING?.slice()\r\n .sort()\r\n .map((item, index) => {\r\n return (\r\n \r\n {item}\r\n \r\n );\r\n })}\r\n \r\n \r\n }\r\n >\r\n {/* \r\n document.getElementById('asset-type-form')\r\n }>\r\n {Const.LANGUAGE_LIST.map((item, index) => {\r\n return (\r\n \r\n {item}\r\n \r\n );\r\n })}\r\n */}\r\n\r\n {\r\n form.setFieldsValue({\r\n ...form.getFieldValue(),\r\n language: customLabels[value],\r\n });\r\n }}\r\n />\r\n \r\n \r\n \r\n ) : subType === 'Panel' ? (\r\n <>\r\n \r\n \r\n document.getElementById('asset-type-form')\r\n }\r\n >\r\n {Const.ASSET_PANEL_FIELD?.slice()\r\n .sort()\r\n .map((item, index) => {\r\n return (\r\n \r\n {item}\r\n \r\n );\r\n })}\r\n \r\n \r\n \r\n ) : subType === 'Logo' ? (\r\n \r\n \r\n document.getElementById('asset-type-form')\r\n }\r\n >\r\n {Const.COMPANY_LOGO_FIELD?.slice()\r\n .sort()\r\n .map((item, index) => {\r\n return (\r\n \r\n {item}\r\n \r\n );\r\n })}\r\n \r\n \r\n ) : subType === 'Certificate' ? (\r\n \r\n \r\n document.getElementById('asset-type-form')\r\n }\r\n >\r\n {Const.DOCUMENT_CERTIFICATE_FIELD?.slice()\r\n .sort()\r\n .map((item, index) => {\r\n return (\r\n \r\n {item}\r\n \r\n );\r\n })}\r\n \r\n \r\n ) : subType === 'Company' ? (\r\n \r\n \r\n document.getElementById('asset-type-form')\r\n }\r\n >\r\n {Const.DOCUMENT_COMPANY_FIELD?.slice()\r\n .sort()\r\n .map((item, index) => {\r\n return (\r\n \r\n {item}\r\n \r\n );\r\n })}\r\n \r\n \r\n ) : null}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default injectIntl(AssetEdit);\r\n","import React, { useState } from 'react';\r\nimport { Tooltip, Button } from 'antd';\r\nimport { EditOutlined } from '@ant-design/icons';\r\nimport { injectIntl } from 'react-intl';\r\nimport './style.less';\r\nimport AssetType from './AssetType';\r\nimport AssetEdit from './AssetEdit';\r\n\r\nconst AssetTypeEdit = (props) => {\r\n const { onSubmit, typeData, canEdit } = props;\r\n const [isEdit, setIsEdit] = useState(false);\r\n\r\n return (\r\n <>\r\n
\r\n {isEdit ? (\r\n setIsEdit(false)}\r\n typeData={typeData}\r\n />\r\n ) : (\r\n <>\r\n {canEdit && (\r\n \r\n }\r\n type='link'\r\n onClick={() => setIsEdit(true)}\r\n />\r\n \r\n )}\r\n\r\n \r\n \r\n )}\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default injectIntl(AssetTypeEdit);\r\n","import React, { useState } from 'react';\r\nimport { useSelector } from 'react-redux';\r\n\r\nimport {\r\n Space,\r\n Collapse,\r\n Row,\r\n Col,\r\n Input,\r\n InputNumber,\r\n Checkbox,\r\n DatePicker,\r\n Tooltip,\r\n} from 'antd';\r\nimport { InfoCircleOutlined } from '@ant-design/icons';\r\n\r\nimport {\r\n Form,\r\n InfoWithLabel,\r\n FormSaveButton,\r\n FormCancelButton,\r\n EditButton,\r\n TextTooltip,\r\n} from 'common/components';\r\n\r\nimport userSelectors from '@redux/user/selectors';\r\n\r\nimport * as digitalAssetServices from 'services/digitalAsset';\r\nimport {\r\n parseToString,\r\n parseToNumber,\r\n parseToBoolean,\r\n parseToDate,\r\n parseToDateObject,\r\n} from 'utils/parser';\r\nimport { apiHandler } from 'utils/api';\r\nimport { useDispatchReloadPage } from 'hooks/useReloadPage';\r\n\r\nimport { useIntl } from 'react-intl';\r\nimport Messages from 'i18n/messages/asset-full-view';\r\n\r\nimport { ABILITY_ACTION, ABILITY_SUBJECT } from 'static/Permission';\r\n\r\nimport { OPEN_ITEM_CLASS } from 'static/Constants';\r\n\r\nimport {\r\n useCheckPermissions,\r\n useCheckAllowEditAssets,\r\n useCheckIsSuperAdmin,\r\n} from 'hooks';\r\n\r\nimport classnames from 'classnames';\r\nimport './MemberDefinedPropertiesPanel.less';\r\n\r\nconst { Panel } = Collapse;\r\n\r\nconst MemberDefinedPropertiesPanel = (props) => {\r\n const {\r\n assetId,\r\n memberDefinedProperties,\r\n isEditable,\r\n isActive,\r\n isOwner,\r\n isHiddenEditSection = false,\r\n } = props;\r\n\r\n const [form] = Form.useForm();\r\n const intl = useIntl();\r\n const reloadPage = useDispatchReloadPage();\r\n\r\n const configData = useSelector(\r\n userSelectors.makeSelectUserDefinedProperties()\r\n );\r\n\r\n const { isSuperMember } = useSelector(userSelectors.makeSelectUserInfo());\r\n const isSuperAdmin = useCheckIsSuperAdmin();\r\n\r\n const [isNoRenderData, setNoRenderData] = useState(false);\r\n const [isEditMode, setEditMode] = useState(false);\r\n const [btnLoading, setBtnLoading] = useState(false);\r\n\r\n const valueData = memberDefinedProperties;\r\n const hasMemberDefinedProperties = Boolean(valueData?.length);\r\n\r\n const hiddenMemberDefinedProperties =\r\n (isSuperMember && !isOwner && !hasMemberDefinedProperties) ||\r\n (isSuperAdmin && !isOwner && !hasMemberDefinedProperties) ||\r\n (!isOwner && !hasMemberDefinedProperties);\r\n\r\n const hasPermissionMemberDefinedProperties = useCheckPermissions([\r\n { action: ABILITY_ACTION.EDIT, subject: ABILITY_SUBJECT.ASSET },\r\n { action: ABILITY_ACTION.DELETE, subject: ABILITY_SUBJECT.ASSET },\r\n ]);\r\n\r\n const { checkAllowEditAssetFull } = useCheckAllowEditAssets();\r\n const isAllowEdit = checkAllowEditAssetFull();\r\n\r\n const allowEditMemberDefinedProperties =\r\n hasPermissionMemberDefinedProperties || isAllowEdit;\r\n\r\n const mapValueWithConfig = () => {\r\n if (isSuperAdmin && !isOwner) {\r\n return (\r\n !!valueData?.length &&\r\n valueData.map((propertyValue) => {\r\n return {\r\n ...propertyValue,\r\n fieldType: propertyValue?.fieldType,\r\n };\r\n })\r\n );\r\n }\r\n\r\n return (\r\n !!valueData?.length &&\r\n valueData.map((propertyValue) => {\r\n const matchedPropertyConfig = configData.find(\r\n (propertyConfig) =>\r\n propertyConfig.fieldName === propertyValue.fieldName\r\n );\r\n\r\n return {\r\n ...propertyValue,\r\n fieldType: matchedPropertyConfig?.fieldType,\r\n };\r\n })\r\n );\r\n };\r\n\r\n const mapConfigWithValue = () => {\r\n if (isSuperAdmin && !isOwner) {\r\n return (\r\n !!valueData?.length &&\r\n valueData.map((propertyValue) => {\r\n return {\r\n ...propertyValue,\r\n value: propertyValue?.value,\r\n };\r\n })\r\n );\r\n }\r\n\r\n return (\r\n !!configData?.length &&\r\n configData.map((propertyConfig) => {\r\n const matchedPropertyValue = valueData.find(\r\n (propertyValue) =>\r\n propertyConfig.fieldName === propertyValue.fieldName\r\n );\r\n\r\n return {\r\n ...propertyConfig,\r\n value: matchedPropertyValue?.value,\r\n };\r\n })\r\n );\r\n };\r\n\r\n const mapConfigWithFormValue = (value) => {\r\n const formKeyArray = Object.keys(value);\r\n\r\n if (isSuperAdmin && !isOwner) {\r\n return formKeyArray.map((propertyKey) => {\r\n const matchedPropertyConfig = valueData.find(\r\n (propertyConfig) => propertyConfig.fieldName === propertyKey\r\n );\r\n\r\n return {\r\n ...matchedPropertyConfig,\r\n value: value[propertyKey],\r\n };\r\n });\r\n }\r\n\r\n return formKeyArray.map((propertyKey) => {\r\n const matchedPropertyConfig = configData.find(\r\n (propertyConfig) => propertyConfig.fieldName === propertyKey\r\n );\r\n\r\n return {\r\n ...matchedPropertyConfig,\r\n value: value[propertyKey],\r\n };\r\n });\r\n };\r\n\r\n const generateRenderProperties = () => {\r\n const mappedProperties = mapValueWithConfig();\r\n\r\n return (\r\n !!mappedProperties?.length &&\r\n mappedProperties?.reduce((renderProperties, property) => {\r\n const wrongFieldTypeNotice = renderWrongFiledTypeNotice(property);\r\n const { fieldType, value } = property;\r\n //* if fieldType === undefined ==> this property has been removed\r\n if (fieldType && value) {\r\n renderProperties.push({\r\n label: property.fieldName,\r\n info: parseValue({ property }),\r\n infoAppend: wrongFieldTypeNotice,\r\n });\r\n }\r\n return renderProperties;\r\n }, [])\r\n );\r\n };\r\n\r\n const parseValue = ({ property, toDateObject }) => {\r\n const { value, fieldType } = property;\r\n\r\n const parser = {\r\n string: parseToString,\r\n numeric: parseToNumber,\r\n boolean: parseToBoolean,\r\n date: toDateObject ? parseToDateObject : parseToDate,\r\n };\r\n\r\n return parser[fieldType] ? parser[fieldType](value) : value;\r\n };\r\n\r\n const onEditClick = () => {\r\n setEditMode(true);\r\n };\r\n\r\n const onCancelClick = () => {\r\n setEditMode(false);\r\n };\r\n\r\n const onSaveClick = () => {\r\n form.validateFields().then((value) => {\r\n callApiEditMemberDefinedProperties(value);\r\n });\r\n };\r\n\r\n const callApiEditMemberDefinedProperties = (value) => {\r\n setBtnLoading(true);\r\n\r\n const memberDefinedProperties = mapConfigWithFormValue(value);\r\n\r\n const params = {\r\n digitalAssetId: assetId,\r\n memberDefinedProperties,\r\n };\r\n const successMessage = intl.formatMessage(\r\n Messages.editMemberDefinedPropertiesValueSuccess\r\n );\r\n const errorMessage = intl.formatMessage(\r\n Messages.editMemberDefinedPropertiesValueError\r\n );\r\n\r\n apiHandler({\r\n service: digitalAssetServices.editMemberDefinedPropertiesValue,\r\n params,\r\n successMessage,\r\n errorMessage,\r\n successCallback: editSuccessCallback,\r\n onFinally: hideBtnLoading,\r\n });\r\n };\r\n\r\n const editSuccessCallback = () => {\r\n reloadPage();\r\n };\r\n\r\n const hideBtnLoading = () => {\r\n setBtnLoading(false);\r\n };\r\n\r\n const setFormInitialValue = () => {\r\n const mappedProperties = mapConfigWithValue();\r\n\r\n const formValue =\r\n mappedProperties &&\r\n mappedProperties?.reduce((accumulator, propertyConfig) => {\r\n //* get field value from memberDefinedProperties\r\n accumulator[propertyConfig.fieldName] = propertyConfig.value\r\n ? parseValue({\r\n property: propertyConfig,\r\n toDateObject: true,\r\n })\r\n : null;\r\n\r\n return accumulator;\r\n }, {});\r\n\r\n return formValue;\r\n };\r\n\r\n //* render\r\n const renderViewMode = () => {\r\n const renderData = generateRenderProperties();\r\n\r\n if (!renderData?.length && !isNoRenderData) {\r\n setNoRenderData(true);\r\n return;\r\n }\r\n\r\n return (\r\n !!renderData &&\r\n renderData.map((item, index) => {\r\n return (\r\n item.info !== null && (\r\n \r\n )\r\n );\r\n })\r\n );\r\n };\r\n\r\n const renderEditMode = () => {\r\n const layout = { labelCol: { span: 8 }, wrapperCol: { span: 12 } };\r\n\r\n let newConfigData =\r\n isSuperAdmin && !isOwner ? memberDefinedProperties : configData;\r\n\r\n // TODO: Maybe bad data fieldName is null\r\n // newConfigData = newConfigData.filter((config) => Boolean(config.fieldName));\r\n\r\n return (\r\n \r\n {newConfigData?.map((property) => {\r\n return renderFormField(property);\r\n })}\r\n \r\n );\r\n };\r\n\r\n const renderFormField = (property) => {\r\n const { fieldType, fieldName } = property;\r\n const isCheckBox = fieldType === 'boolean';\r\n const inputs = {\r\n string: Input,\r\n numeric: InputNumber,\r\n boolean: Checkbox,\r\n date: DatePicker,\r\n };\r\n const FieldComponent = inputs[fieldType] ?? null;\r\n\r\n const formItemProps = {\r\n label: ,\r\n name: fieldName,\r\n key: fieldName,\r\n };\r\n\r\n if (isCheckBox) formItemProps.valuePropName = 'checked';\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n };\r\n\r\n const renderMemberDefinedPropertiesActions = () => {\r\n return isEditMode ? (\r\n \r\n \r\n \r\n \r\n \r\n \r\n ) : (\r\n allowEditMemberDefinedProperties && (\r\n \r\n )\r\n );\r\n };\r\n\r\n const renderWrongFiledTypeNotice = (property) => {\r\n const { fieldType, value } = property;\r\n\r\n const isBooleanType = fieldType === 'boolean';\r\n const isBooleanValue = value === 'true' || value === 'false';\r\n const shouldShow = isBooleanType && !isBooleanValue;\r\n\r\n const noticeText = intl.formatMessage(\r\n Messages.memberDefinedPropertiesWrongFiledTypeNoticeText,\r\n { value }\r\n );\r\n\r\n return (\r\n shouldShow && (\r\n \r\n \r\n \r\n )\r\n );\r\n };\r\n\r\n const viewable = !!valueData && !isNoRenderData && isActive;\r\n const isOwnerEditable = isEditable && isAllowEdit;\r\n\r\n const shouldShowCollapse =\r\n !hiddenMemberDefinedProperties && (viewable || isOwnerEditable);\r\n\r\n return shouldShowCollapse ? (\r\n \r\n \r\n {!isHiddenEditSection && renderMemberDefinedPropertiesActions()}\r\n \r\n \r\n {isEditMode ? renderEditMode() : renderViewMode()}\r\n \r\n \r\n \r\n \r\n ) : null;\r\n};\r\n\r\nexport default MemberDefinedPropertiesPanel;\r\n","import React from 'react';\r\n\r\nimport { Row, Col, Form, Typography, Empty } from 'antd';\r\n\r\nimport { SearchEntityBtn, FormCancelButton } from 'common/components';\r\n\r\nimport {\r\n ArrowRightOutlined,\r\n CloseOutlined,\r\n CloseCircleFilled,\r\n} from '@ant-design/icons';\r\n\r\nimport * as productEndpoints from 'services/product/endpoints';\r\n\r\nimport ThumbnailItem from 'common/components/thumb/ThumbnailItem';\r\n\r\nimport './SearchProductForm.less';\r\n\r\nconst { Text } = Typography;\r\n\r\nconst tagTextStyle = { maxWidth: '100%', display: 'block', color: 'white' };\r\n\r\nconst SearchProductForm = (props) => {\r\n const {\r\n assetId,\r\n getSelectedProduct,\r\n selectedProduct,\r\n refSelectGridItem,\r\n setSelectedProduct,\r\n handleMoveToLinkAsset,\r\n isMultipleSelection,\r\n } = props;\r\n\r\n const defaultProductParams = {\r\n digitalAssetId: assetId,\r\n filters: [],\r\n pageIndex: 1,\r\n pageSize: 20,\r\n search: { searchText: '' },\r\n sort: [{ fieldName: 'id', isAscending: false }],\r\n };\r\n\r\n const handleRemoveTag = (itemData) => {\r\n refSelectGridItem?.current?.removeItem(itemData);\r\n };\r\n\r\n const handleRemoveProduct = (itemData) => {\r\n setSelectedProduct((prev) => {\r\n return prev?.filter((product) => product?.id !== itemData?.id);\r\n });\r\n\r\n handleRemoveTag(itemData);\r\n };\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n {\r\n return (\r\n
\r\n handleRemoveTag(itemData)}\r\n >\r\n \r\n
\r\n
\r\n
\r\n \r\n Product Name: {itemData?.productName}\r\n \r\n \r\n GTIN: {itemData?.gtin || 'N/A'}\r\n \r\n \r\n UPC12: {itemData?.upc12 || 'N/A'}\r\n \r\n
\r\n
\r\n
\r\n );\r\n }}\r\n onOk={getSelectedProduct}\r\n onCancel={getSelectedProduct}\r\n savedSelected\r\n isMultiple={isMultipleSelection}\r\n mapSearch={(searchText) => ({ search: { searchText } })}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n {selectedProduct?.length > 0 ? (\r\n
\r\n {selectedProduct.map((item) => (\r\n \r\n {\r\n e.stopPropagation();\r\n handleRemoveProduct(item);\r\n }}\r\n >\r\n \r\n
\r\n
\r\n \r\n
\r\n \r\n ))}\r\n
\r\n ) : (\r\n
\r\n \r\n
\r\n )}\r\n \r\n \r\n \r\n \r\n \r\n }\r\n text='Move to link step'\r\n disabled={selectedProduct?.length <= 0}\r\n onClick={handleMoveToLinkAsset}\r\n />\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default SearchProductForm;\r\n","import React, { useState, useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useParams } from 'react-router-dom';\r\n\r\n//? COMPONENT\r\nimport { Row, Col, Steps } from 'antd';\r\nimport { StyledModal, StepForm } from 'common/components';\r\nimport AssetGS1Edit from 'pages/asset-full-view/components/add-link-product/AssetGS1Edit';\r\nimport SearchProductForm from './SearchProductForm';\r\n\r\n//? REDUX\r\n// import * as productFullViewSelectors from 'pages/product-full-view/controllers/selectors';\r\n\r\n//? UTILS\r\nimport { PIM_ASSET_TYPE_DEFINE } from 'static/Constants';\r\n\r\nimport classnames from 'classnames';\r\n\r\nimport './LinkAssetToPimModal.less';\r\n\r\nconst currentStepDefine = [0, 1];\r\nconst stepDefault = currentStepDefine[0];\r\n\r\nconst { Step } = Steps;\r\n\r\nconst LinkAssetToPimModal = (props) => {\r\n const {\r\n gs1ImageData,\r\n addType,\r\n onCloseModal,\r\n assetId,\r\n isAssetImport,\r\n isAssetImportEdit,\r\n assetData,\r\n selectedEditLink,\r\n onReloadPage,\r\n } = props;\r\n\r\n const [currentStep, setCurrentStep] = useState(stepDefault);\r\n const [selectedProduct, setSelectedProduct] = useState([]);\r\n\r\n const [PLANO] = PIM_ASSET_TYPE_DEFINE;\r\n\r\n const refSelectGridItem = useRef();\r\n\r\n const { id } = useParams();\r\n\r\n const handleBackToCreateAsset = () => setCurrentStep(0);\r\n\r\n const handleMoveToLinkAsset = () => setCurrentStep(1);\r\n\r\n const getSelectedProduct = (itemList) => {\r\n refSelectGridItem.current.closeModal();\r\n setSelectedProduct(itemList);\r\n };\r\n\r\n /**\r\n * ? Duy Nguyen - 12/22/2021\r\n * * we will need to convert this into an array when support link multiple product\r\n */\r\n const selectedProductInfo = selectedProduct?.[0];\r\n\r\n //!- RENDER\r\n const stepDefine = !isAssetImportEdit\r\n ? [\r\n {\r\n step: 0,\r\n component: (\r\n \r\n ),\r\n },\r\n {\r\n step: 1,\r\n component: (\r\n
\r\n {\r\n onReloadPage && onReloadPage();\r\n onCloseModal && onCloseModal();\r\n }}\r\n isLinkMultiple\r\n selectedProduct={selectedProduct}\r\n />\r\n
\r\n ),\r\n },\r\n ]\r\n : [\r\n {\r\n step: 0,\r\n component: (\r\n
\r\n {\r\n onReloadPage && onReloadPage();\r\n onCloseModal && onCloseModal();\r\n }}\r\n addType='unknown'\r\n assetData={assetData}\r\n isAssetImportEdit={isAssetImportEdit}\r\n isAssetImport={isAssetImport}\r\n linkInfo={selectedEditLink}\r\n associationTypeDisabledOnEdit\r\n />\r\n
\r\n ),\r\n },\r\n ];\r\n\r\n const onlyShowAssetGs1Edit = isAssetImportEdit;\r\n\r\n return (\r\n setCurrentStep((prev) => prev + 1)}\r\n maskClosable={false}\r\n footer={null}\r\n centered\r\n visible\r\n destroyOnClose\r\n width='540px'\r\n bodyStyle={{ height: 460 }}\r\n >\r\n {!onlyShowAssetGs1Edit && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nLinkAssetToPimModal.propTypes = {\r\n addType: PropTypes.string,\r\n onCloseModal: PropTypes.func,\r\n getImagery: PropTypes.func,\r\n};\r\n\r\nexport default LinkAssetToPimModal;\r\n","import React, { useState } from 'react';\r\n\r\nimport {\r\n Row,\r\n Col,\r\n Collapse,\r\n notification,\r\n Typography,\r\n Button,\r\n Space,\r\n} from 'antd';\r\n\r\nimport {\r\n LabelValueWrapper,\r\n dialogFunction,\r\n WithAbsoluteContainer,\r\n FormAddButton,\r\n} from 'common/components';\r\n\r\nimport LinkAssetToPimModal from './LinkAssetToPimModal';\r\n\r\nimport { EditOutlined, CloseOutlined } from '@ant-design/icons';\r\n\r\nimport { injectIntl } from 'react-intl';\r\n\r\nimport * as constants from 'static/Constants';\r\nimport { unlinkAssetToPIM } from 'services/digitalAsset';\r\n\r\nimport './AssetGS1Preview.less';\r\nimport { sleep } from 'utils/delay';\r\n\r\nconst { Panel } = Collapse;\r\n\r\nconst { Text } = Typography;\r\n\r\nconst AssetGS1Preview = (props) => {\r\n const { activeGS1, canEdit, gs1ImageData, assetId, onReloadPage, assetData } =\r\n props;\r\n\r\n const isShowCreateLink = canEdit && !assetData?.forMemberDocument; // because member document will not link to product\r\n\r\n const [selectedEditLink, setSelectedEditLink] = useState(null);\r\n\r\n const openNotification = (result, message) => {\r\n notification[result ? result : 'error']({ message: message });\r\n };\r\n\r\n const gs1Header = (obj) => {\r\n return (\r\n
\r\n \r\n \r\n {obj?.packageLevel}\r\n \r\n \r\n GTIN - {obj?.gtin || 'N/A'}\r\n \r\n \r\n {obj?.associateType || 'N/A'}\r\n \r\n \r\n {obj?.compliantFileName && (\r\n \r\n \r\n {obj?.compliantFileName}\r\n \r\n \r\n )}\r\n
\r\n );\r\n };\r\n\r\n const gs1Filter = (obj) => {\r\n const newObj = Object.create(Object.getPrototypeOf(obj));\r\n\r\n newObj.associationType = obj?.associateType;\r\n newObj.packageLevel = obj?.packageLevel;\r\n\r\n if (newObj.associationType === constants.ASSOCIATION_TYPE.DOCUMENT) {\r\n newObj.subtype = obj?.subtype;\r\n }\r\n\r\n //* if association type is PLANOGRAM or MARKETING image type field will be shown\r\n if (\r\n newObj.associationType === constants.ASSOCIATION_TYPE.PLANOGRAM &&\r\n newObj.associationType === constants.ASSOCIATION_TYPE.MARKETING\r\n ) {\r\n newObj.imageType = constants.IMAGE_TYPE.filter(\r\n (item) => item.value === obj?.imageType\r\n )[0]?.label;\r\n }\r\n\r\n //* if association type is PLANOGRAM, we should include these fields in preview\r\n if (newObj.associationType === constants.ASSOCIATION_TYPE.PLANOGRAM) {\r\n newObj.compliantFileName = obj?.compliantFileName;\r\n\r\n newObj.packagingDisposition = constants.PACKAGING_DISPOSITION.filter(\r\n (item) => item.value === obj?.packagingDisposition\r\n )[0]?.label;\r\n newObj.angle = constants.ANGLE.filter(\r\n (item) => item.value === obj?.angle\r\n )[0]?.label;\r\n newObj.facing = constants.FACING.filter(\r\n (item) => item.value === obj?.facing\r\n )[0]?.label;\r\n }\r\n newObj.gtin = obj?.gtin;\r\n\r\n return newObj;\r\n };\r\n\r\n const removeGS1 = async (item) => {\r\n const associationType = item?.associateType;\r\n const params =\r\n associationType === 'DOCUMENT'\r\n ? {\r\n linkId: item.id,\r\n }\r\n : {\r\n productImageLinkId: item.id,\r\n };\r\n\r\n const response = await unlinkAssetToPIM(params, associationType);\r\n\r\n //* BE dose not update link data instantly\r\n await sleep(1000);\r\n\r\n if (response.isSuccess) {\r\n openNotification('success', 'Remove link data successfully!');\r\n onReloadPage && onReloadPage();\r\n } else openNotification('error', 'Remove link data failed!');\r\n };\r\n\r\n const handleClickEditLink = (item) => {\r\n setSelectedEditLink(item);\r\n };\r\n\r\n const handleClickAddNewLink = () => setSelectedEditLink('new');\r\n\r\n const handleClickUnlink = (item) => {\r\n dialogFunction({\r\n type: 'warn',\r\n content: 'Do you want to remove this item?',\r\n okText: 'Ok',\r\n cancelText: 'Cancel',\r\n onOk: async () => {\r\n await removeGS1(item);\r\n },\r\n });\r\n };\r\n\r\n const handleCloseLinkAssetModal = () => {\r\n setSelectedEditLink(null);\r\n };\r\n\r\n if (!activeGS1) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n 1\r\n ? []\r\n : activeGS1?.length !== 0 && activeGS1[0]?.id\r\n }\r\n >\r\n {activeGS1?.map((item) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n {canEdit && (\r\n \r\n \r\n }\r\n type='primary'\r\n style={{ borderRadius: 4 }}\r\n onClick={() => handleClickEditLink(item)}\r\n />\r\n }\r\n type='primary'\r\n danger\r\n style={{ borderRadius: 4 }}\r\n onClick={() => handleClickUnlink(item)}\r\n />\r\n \r\n \r\n )}\r\n \r\n \r\n );\r\n })}\r\n \r\n \r\n \r\n {selectedEditLink && (\r\n \r\n )}\r\n\r\n {isShowCreateLink && (\r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default injectIntl(AssetGS1Preview);\r\n","import React from 'react';\r\nimport { Input, DatePicker, Spin } from 'antd';\r\n\r\nimport { Form } from 'common/components';\r\nimport { OPEN_ITEM_CLASS } from 'static/Constants';\r\n\r\nimport * as constants from 'static/Constants';\r\n\r\nimport classnames from 'classnames';\r\n\r\nconst { RangePicker } = DatePicker;\r\n\r\nconst AddDRMForm = (props) => {\r\n const { form, handleAddDRM, loading } = props;\r\n return (\r\n <>\r\n \r\n handleAddDRM(value)}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default AddDRMForm;\r\n","export const DOCUMENT_METADATA = {\r\n filetypes: ['txt', 'pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'log'],\r\n metaParams: ['fileName', 'owner', 'fileSize', 'fileType', 'pageCount'],\r\n};\r\n\r\nexport const ZIPRAR_METADATA = {\r\n filetypes: ['zip', 'rar'],\r\n metaParams: ['fileName', 'owner', 'fileSize', 'fileType'],\r\n};\r\n\r\nexport const EMAIL_METADATA = {\r\n filetypes: ['pst', 'ost'],\r\n metaParams: ['fileName', 'owner', 'fileSize', 'fileType'],\r\n};\r\n\r\nexport const VIDEO_METADATA = {\r\n filetypes: ['mp4', 'mov', 'avi'],\r\n metaParams: [\r\n 'fileName',\r\n 'owner',\r\n 'fileSize',\r\n 'fileType',\r\n 'bitRate',\r\n 'frameRate',\r\n 'frameSize',\r\n 'colorModel',\r\n 'fps',\r\n 'mediaFormat',\r\n 'duration',\r\n ],\r\n};\r\n\r\nexport const AUDIO_METADATA = {\r\n filetypes: ['mp3'],\r\n metaParams: [\r\n 'fileName',\r\n 'owner',\r\n 'fileSize',\r\n 'fileType',\r\n 'bitRate',\r\n 'sampleRate',\r\n 'channelOutput',\r\n 'mediaFormat',\r\n 'duration',\r\n ],\r\n};\r\n\r\nexport const IMAGE_METADATA = {\r\n filetypes: ['jpeg', 'png', 'gif', 'tiff', 'jpg'],\r\n metaParams: [\r\n 'fileName',\r\n 'owner',\r\n 'fileSize',\r\n 'fileType',\r\n 'width',\r\n 'height',\r\n 'clippingPath',\r\n 'colorDepth',\r\n 'resolution',\r\n 'exifData',\r\n ],\r\n};\r\n\r\nexport const OTHER_METADATA = {\r\n metaParams: ['fileName', 'owner'],\r\n};\r\n\r\nexport const TYPEGROUP = [\r\n 'DOCUMENT_METADATA',\r\n 'ZIPRAR_METADATA',\r\n 'EMAIL_METADATA',\r\n 'VIDEO_METADATA',\r\n 'AUDIO_METADATA',\r\n 'IMAGE_METADATA',\r\n];\r\n","import React, { useState, useEffect } from 'react';\r\nimport PropTypes, { oneOfType } from 'prop-types';\r\nimport { Row, Col, Modal, notification, Collapse, Form, Spin } from 'antd';\r\nimport IconList from 'common/components/icon-list/IconList';\r\n\r\nimport {\r\n LabelValueWrapper,\r\n EditButton,\r\n FormAddButton,\r\n FormDeleteButton,\r\n FormCancelButton,\r\n} from 'common/components';\r\nimport { dialogFunction } from 'common/components';\r\nimport {\r\n CameraOutlined,\r\n CheckCircleOutlined,\r\n ExclamationCircleOutlined,\r\n} from '@ant-design/icons';\r\n\r\nimport DigitalRightIcon from 'common/components/digital-right-icon/DigitalRightIcon';\r\nimport AssetTypeEdit from 'common/components/asset-type-edit';\r\nimport MemberDefinedPropertiesPanel from './MemberDefinedPropertiesPanel';\r\n// import AssetGS1Edit from './AssetGS1Edit';\r\n\r\nimport AssetGS1Edit from '../add-link-product/AssetGS1Edit';\r\nimport AssetGS1Preview from '../add-link-product/AssetGS1Preview';\r\n\r\nimport { FormattedMessage, injectIntl } from 'react-intl';\r\nimport AddDRMForm from './AddDRMForm';\r\nimport messages from 'i18n/messages/asset-full-view';\r\nimport { formatMDY } from 'utils/formatDate';\r\nimport { formatSizeUnits } from 'utils/formatSizeUnits';\r\nimport {\r\n ADD_DRM_ASSET,\r\n DELETE_DRM_ASSET,\r\n} from 'services/digitalAsset/endpoints';\r\nimport * as metadataTypesConstant from 'static/Metadata';\r\nimport * as api from 'config/axios';\r\n\r\nimport './AssetOverview.less';\r\nimport _ from 'lodash';\r\n\r\nimport { useCheckAllowEditAssets } from 'hooks';\r\n\r\nimport { useDeepCompareEffect } from 'common/components/mapping-properties/hooks';\r\n\r\nconst { Panel } = Collapse;\r\n\r\nconst AssetOverview = (props) => {\r\n const {\r\n isFullView,\r\n assetData,\r\n classifications,\r\n gs1ImageData = [],\r\n assetId,\r\n typeData,\r\n submitAssetType,\r\n canEdit,\r\n setReloadData,\r\n intl,\r\n onReloadPage,\r\n memberDefinedPropertiesEditable,\r\n isHiddenEditSection = false,\r\n drm,\r\n } = props;\r\n\r\n const [leftCol, setLeftCol] = useState([]);\r\n const [isEditDRM, setIsEditDRM] = useState(false);\r\n const [rightCol, setRightCol] = useState([]);\r\n const [exifDataShow, setExifDataShow] = useState(false);\r\n const [loading, setLoading] = useState(false);\r\n const [activeGS1, setActiveGS1] = useState([]);\r\n const [metadataParams, setMetadataParams] = useState([]);\r\n const [editGS1, setEditGS1] = useState(false);\r\n const [isAddDRM, setIsAddDRM] = useState(false);\r\n const [activeCollapseKey, setActiveCollapseKey] = useState([]);\r\n const [form] = Form.useForm();\r\n\r\n useEffect(() => {\r\n form.resetFields();\r\n }, [isAddDRM, form]);\r\n\r\n useDeepCompareEffect(() => {\r\n setActiveGS1(gs1ImageData);\r\n }, [gs1ImageData]);\r\n\r\n const memberDefinedProperties = assetData?.memberDefinedProperties;\r\n\r\n const { checkAllowEditAssetFull } = useCheckAllowEditAssets();\r\n const isAllowEdit = checkAllowEditAssetFull();\r\n\r\n const allowModifyDRM = isAllowEdit;\r\n\r\n // EXIF Data Modal Relates Functions\r\n const showModal = () => {\r\n setExifDataShow(true);\r\n };\r\n\r\n const handleCancel = (e) => {\r\n setExifDataShow(false);\r\n };\r\n\r\n // Exif DATA Modify\r\n const exifDataModify = (value) => {\r\n if (value)\r\n return (\r\n \r\n );\r\n else return 'No';\r\n };\r\n\r\n // Modify Data\r\n const modifyData = (key, value) => {\r\n if (typeof value === 'boolean') {\r\n switch (value) {\r\n case true:\r\n return 'Yes';\r\n case false:\r\n return 'No';\r\n default:\r\n return value;\r\n }\r\n } else {\r\n switch (key) {\r\n case 'lastModified':\r\n case 'loadedDate':\r\n return formatMDY(value);\r\n case 'resolution':\r\n return value ? value + ' DPI' : '';\r\n case 'colorDepth':\r\n return value ? value + ' Bit' : '';\r\n case 'cropRange':\r\n case 'height':\r\n case 'width':\r\n return value ? value + 'px' : '';\r\n case 'fileSize':\r\n return formatSizeUnits(value);\r\n case 'exifData':\r\n return exifDataModify(value);\r\n default:\r\n return value;\r\n }\r\n }\r\n };\r\n\r\n // Filter Object By Value\r\n const filterObjectByValue = (obj, filter, direction) => {\r\n let newObj = Object.entries(obj)\r\n .map(([key, value]) => {\r\n return [\r\n key,\r\n value && typeof value === 'object'\r\n ? filterObjectByValue(value, filter)\r\n : value,\r\n ];\r\n })\r\n .reduce((newObj, [key, value]) => {\r\n if (!filter.includes(value)) {\r\n newObj[key] = value;\r\n }\r\n return newObj;\r\n }, {});\r\n\r\n let objectLength = Object.keys(newObj).length;\r\n\r\n return Object.entries(newObj).reduce((newObj, [key, value], index) => {\r\n if (direction === 'left-col' && index < Math.ceil(objectLength / 2)) {\r\n newObj[key] = modifyData(key, value);\r\n }\r\n if (direction === 'right-col' && index >= Math.ceil(objectLength / 2)) {\r\n newObj[key] = modifyData(key, value);\r\n }\r\n return newObj;\r\n }, {});\r\n };\r\n\r\n // Filter Object By Key\r\n const filterObjectByKey = (obj, filter) => {\r\n return Object.entries(obj)\r\n .map(([key, value]) => {\r\n return [\r\n key,\r\n value && typeof value === 'object'\r\n ? filterObjectByValue(value, filter)\r\n : value,\r\n ];\r\n })\r\n .reduce((newObj, [key, value]) => {\r\n if (!filter.includes(key)) {\r\n newObj[key] = modifyData(key, value);\r\n }\r\n return newObj;\r\n }, {});\r\n };\r\n\r\n useEffect(() => {\r\n setMetadataParams(onSetMetadataType(assetData?.fileType));\r\n }, [assetData]);\r\n\r\n // Remove all undefined values\r\n useEffect(() => {\r\n if (assetData?.metadata) {\r\n let metadateNew = assetData?.isIFrame\r\n ? _.pick(assetData?.metadata, ['loadedDate', 'lastModified', 'owner'])\r\n : assetData?.metadata;\r\n\r\n setLeftCol(filterObjectByMetadataOfType(metadateNew, 'left-col'));\r\n setRightCol(filterObjectByMetadataOfType(metadateNew, 'right-col'));\r\n\r\n filterObjectByMetadataOfType(metadateNew, [], 'left-col');\r\n }\r\n }, [assetData, metadataParams]);\r\n\r\n const exifData = `

${\r\n assetData && assetData.metadata && assetData.metadata.exifData\r\n ? assetData?.metadata?.exifData?.replace(/;/g, '
')\r\n : ''\r\n }

`;\r\n\r\n useEffect(() => {\r\n if (gs1ImageData?.length) {\r\n let filter = gs1ImageData?.filter(\r\n (item) => item.status?.toLowerCase() !== 'deleted'\r\n );\r\n setActiveGS1(filter);\r\n }\r\n }, [gs1ImageData, editGS1]);\r\n\r\n useEffect(() => {\r\n if (activeGS1?.length >= 1) {\r\n setActiveCollapseKey(['1']);\r\n }\r\n }, [activeGS1]);\r\n\r\n const onSetMetadataType = (type) => {\r\n let params = [];\r\n metadataTypesConstant.TYPEGROUP.forEach((group) => {\r\n if (metadataTypesConstant[group].filetypes.indexOf(type) > -1) {\r\n params = metadataTypesConstant[group].metaParams;\r\n }\r\n });\r\n if (params?.length === 0) {\r\n params = metadataTypesConstant.OTHER_METADATA.metaParams;\r\n }\r\n return params;\r\n };\r\n\r\n const filterObjectByMetadataOfType = (object, direction) => {\r\n let paramsFilter = onFilterParamsByType(object);\r\n let objectLength = Object.keys(paramsFilter).length;\r\n\r\n const resultParams = Object.entries(paramsFilter).reduce(\r\n (newObj, [key, value], index) => {\r\n if (direction === 'left-col' && index < Math.ceil(objectLength / 2)) {\r\n newObj[key] = modifyData(key, value);\r\n }\r\n if (direction === 'right-col' && index >= Math.ceil(objectLength / 2)) {\r\n newObj[key] = modifyData(key, value);\r\n }\r\n return newObj;\r\n },\r\n {}\r\n );\r\n\r\n return resultParams;\r\n };\r\n\r\n const onFilterParamsByType = (object) => {\r\n let paramsFilter = Object.entries(object)\r\n .map(([key, value]) => {\r\n return [key, value];\r\n })\r\n .reduce((newObj, [key, value]) => {\r\n if (metadataParams.includes(key)) {\r\n newObj[key] = value;\r\n }\r\n return newObj;\r\n }, {});\r\n return paramsFilter;\r\n };\r\n\r\n const typeDataRender = () => {\r\n return (\r\n
\r\n submitAssetType(value)}\r\n typeData={typeData}\r\n canEdit={false}\r\n />\r\n
\r\n );\r\n };\r\n\r\n const isEditDrmAsset = isAllowEdit && !isHiddenEditSection;\r\n\r\n const drmAssetRender = () => {\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n {assetData?.digitalRightsType?.toLowerCase() ===\r\n 'ActiveDigitalRights'.toLowerCase() ? (\r\n \r\n ) : assetData?.digitalRightsType?.toLowerCase() ===\r\n 'ExpiredDigitalRights'.toLowerCase() ? (\r\n \r\n ) : (\r\n \r\n )}\r\n
\r\n \r\n }\r\n key='1'\r\n >\r\n {isEditDrmAsset && assetEditDRMRender()}\r\n\r\n {assetData?.digitalRightsType?.toLowerCase() !==\r\n 'NoDigitalRights'.toLowerCase() && (\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n \r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n )}\r\n\r\n {assetData?.digitalRights?.map((item, index) => {\r\n return (\r\n \r\n \r\n {item.status === 'Active' ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n {item.digitalRightsName}\r\n {formatMDY(item.expirationDate)}\r\n \r\n {isEditDRM && (\r\n {\r\n dialogDeleteDRM(item.id);\r\n }}\r\n disabled={!allowModifyDRM}\r\n />\r\n )}\r\n \r\n \r\n );\r\n })}\r\n \r\n \r\n
\r\n
\r\n );\r\n };\r\n\r\n const digitalAssetRender = () => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n {leftCol && (\r\n \r\n )}\r\n \r\n \r\n {rightCol && (\r\n \r\n )}\r\n \r\n \r\n {classifications?.length > 0 && classificationRender()}\r\n \r\n \r\n \r\n );\r\n };\r\n\r\n const addDRMModal = () => {\r\n return (\r\n setIsAddDRM(false)}\r\n onOk={() => form.submit()}\r\n className='add-drm-modal'\r\n >\r\n \r\n \r\n );\r\n };\r\n\r\n async function handleAddDRM(data) {\r\n setLoading(true);\r\n const submitData = {\r\n DigitalAssetId: assetId,\r\n DigitalRightsName: data?.digitalRightsName,\r\n EffectiveDate: data?.dateEffective[0].toISOString(),\r\n ExpirationDate: data?.dateEffective[1]?.toISOString(),\r\n };\r\n await api\r\n .sendPost(ADD_DRM_ASSET, submitData)\r\n .then((response) => {\r\n if (response.isSuccess) {\r\n notification.success({ message: 'Add new DRM successful!' });\r\n onReloadPage();\r\n setIsAddDRM(false);\r\n } else notification.error({ message: 'Add new DRM error' });\r\n })\r\n .catch((error) => {\r\n notification.error({ message: 'Add new DRM error' });\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n }\r\n const dialogDeleteDRM = (data) => {\r\n dialogFunction({\r\n type: 'warn',\r\n content: intl.formatMessage(messages.deleteDRM),\r\n onOk: () => handleDeleteDRM(data),\r\n });\r\n };\r\n\r\n async function handleDeleteDRM(data) {\r\n setLoading(true);\r\n const submitData = {\r\n DigitalAssetId: assetId,\r\n DigitalRightsId: data,\r\n };\r\n await api.sendPost(DELETE_DRM_ASSET, submitData).then((response) => {\r\n if (response.isSuccess) {\r\n notification.success({ message: 'Remove DRM successful!' });\r\n onReloadPage();\r\n } else notification.error({ message: 'Remove DRM error' });\r\n });\r\n setLoading(false);\r\n }\r\n\r\n const assetEditDRMRender = () => {\r\n return (\r\n <>\r\n \r\n {isEditDRM ? (\r\n
\r\n setIsAddDRM(true)}\r\n className='asset-overview__edit-button'\r\n disabled={!allowModifyDRM}\r\n />\r\n {\r\n setIsEditDRM(false);\r\n }}\r\n className='asset-overview__edit-button'\r\n />\r\n
\r\n ) : (\r\n allowModifyDRM && (\r\n
\r\n {\r\n setIsEditDRM(true);\r\n }}\r\n />\r\n
\r\n )\r\n )}\r\n
\r\n {addDRMModal()}\r\n \r\n );\r\n };\r\n\r\n const classificationRender = () => {\r\n return (\r\n \r\n \r\n \r\n {intl.formatMessage({\r\n id: `Taco.digitalAsset.overview.classifications`,\r\n })}\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n };\r\n\r\n const exifDataRender = () => {\r\n return (\r\n \r\n \r\n \r\n );\r\n };\r\n\r\n const memberDefinedRender = () => {\r\n return (\r\n \r\n );\r\n };\r\n\r\n const gs1Render = () => {\r\n return (\r\n setActiveCollapseKey(key)}\r\n >\r\n \r\n {editGS1 && !assetData?.isIFrame ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n );\r\n };\r\n\r\n return (\r\n \r\n {typeDataRender()}\r\n {!assetData?.isIFrame && memberDefinedRender()}\r\n {!assetData?.isIFrame && digitalAssetRender()}\r\n {isFullView\r\n ? !assetData?.isIFrame\r\n ? gs1Render()\r\n : null\r\n : gs1ImageData?.length > 0\r\n ? gs1Render()\r\n : null}\r\n {!assetData?.isIFrame && exifDataShow && exifDataRender()}\r\n {isFullView && drmAssetRender()}\r\n \r\n );\r\n};\r\n\r\nAssetOverview.propTypes = {\r\n assetData: oneOfType([PropTypes.array, PropTypes.object]),\r\n classifications: oneOfType([PropTypes.array, PropTypes.object]),\r\n gs1ImageData: oneOfType([PropTypes.array, PropTypes.object]),\r\n assetId: oneOfType([PropTypes.string, PropTypes.number]),\r\n canEdit: PropTypes.bool,\r\n setReloadData: PropTypes.func,\r\n isHiddenEditSection: PropTypes.bool,\r\n};\r\n\r\nexport default injectIntl(AssetOverview);\r\n","import * as types from './constants';\r\n\r\n// Asset Data Actions\r\nexport function getAssetData(assetId) {\r\n return {\r\n type: types.GET_ASSET_DATA,\r\n assetId,\r\n };\r\n}\r\n\r\nexport function getAssetDataSuccess(data) {\r\n return {\r\n type: types.GET_ASSET_DATA_SUCCESS,\r\n data,\r\n };\r\n}\r\n\r\nexport function getAssetDataError(error) {\r\n return {\r\n type: types.GET_ASSET_DATA_ERROR,\r\n error,\r\n };\r\n}\r\n\r\nexport function updateIsActive(payload) {\r\n return {\r\n type: types.UPDATE_IS_ACTIVE,\r\n payload,\r\n };\r\n}\r\n\r\n//* get ftp file list\r\nexport function getFtpFileList(payload) {\r\n return {\r\n type: types.GET_FTP_FILE_LIST,\r\n payload,\r\n };\r\n}\r\n\r\nexport function getFtpFileListSuccess(payload) {\r\n return {\r\n type: types.GET_FTP_FILE_LIST_SUCCESS,\r\n payload,\r\n };\r\n}\r\n\r\nexport function getFtpFileListError(error) {\r\n return {\r\n type: types.GET_FTP_FILE_LIST_ERROR,\r\n error,\r\n };\r\n}\r\n\r\n//* create digital asset\r\nexport function createDigitalAssetFull(digitalAsset) {\r\n return {\r\n type: types.CREATE_DIGITAL_ASSET_FULL,\r\n digitalAsset,\r\n };\r\n}\r\n\r\nexport function createDigitalAssetFullSuccess(metaData) {\r\n return {\r\n type: types.CREATE_DIGITAL_ASSET_FULL_SUCCESS,\r\n metaData,\r\n };\r\n}\r\n\r\nexport function createDigitalAssetFullError(error) {\r\n return {\r\n type: types.CREATE_DIGITAL_ASSET_FULL_ERROR,\r\n error,\r\n };\r\n}\r\n\r\n//* update digital asset\r\nexport function updateDigitalAsset(params) {\r\n return {\r\n type: types.UPDATE_DIGITAL_ASSET,\r\n params,\r\n };\r\n}\r\nexport function updateDigitalReplaceAsset(params) {\r\n return {\r\n type: types.UPDATE_DIGITAL_REPLACE_ASSET,\r\n params,\r\n };\r\n}\r\nexport function updateDigitalAssetSuccess() {\r\n return {\r\n type: types.UPDATE_DIGITAL_ASSET_SUCCESS,\r\n };\r\n}\r\n\r\nexport function updateRequiredField(params) {\r\n return {\r\n type: types.UPDATE_REQUIRED_FIELDS,\r\n params,\r\n };\r\n}\r\n\r\nexport function updateDigitalAssetError(error) {\r\n return {\r\n type: types.UPDATE_DIGITAL_ASSET_ERROR,\r\n error,\r\n };\r\n}\r\nexport function gridColumnAssetAssociation(gridName) {\r\n return {\r\n type: types.GET_ASSET_ASSOCIATION_GRID_COLUMN,\r\n gridName,\r\n };\r\n}\r\n\r\nexport function gridColumnAssetAssociationSuccess(columns) {\r\n return {\r\n type: types.GET_ASSET_ASSOCIATION_GRID_COLUMN_SUCCESS,\r\n columns,\r\n };\r\n}\r\n\r\nexport function gridColumnAssetAssociationError(error) {\r\n return {\r\n type: types.GET_ASSET_ASSOCIATION_GRID_COLUMN_ERROR,\r\n error,\r\n };\r\n}\r\n\r\nexport function cancelUpdateSuccess() {\r\n return {\r\n type: types.CANCEL_UPDATE_SUCCESS,\r\n };\r\n}\r\n\r\nexport function updateAssetType(params) {\r\n return {\r\n type: types.UPDATE_ASSET_TYPE,\r\n params,\r\n };\r\n}\r\n\r\nexport function updateAssetTypeSuccess() {\r\n return {\r\n type: types.UPDATE_ASSET_TYPE_SUCCESS,\r\n };\r\n}\r\n\r\nexport function updateAssetTypeError(error) {\r\n return {\r\n type: types.UPDATE_ASSET_TYPE_ERROR,\r\n error,\r\n };\r\n}\r\n\r\nexport const getAuthorizedTags = (memberId) => ({\r\n type: types.GET_AUTHORIZED_TAGS,\r\n memberId,\r\n});\r\n\r\nexport const getAuthorizedTagsSuccess = (data) => ({\r\n type: types.GET_AUTHORIZED_TAGS_SUCCESS,\r\n data,\r\n});\r\n\r\nexport const getAuthorizedTagsError = (error) => ({\r\n type: types.GET_AUTHORIZED_TAGS_ERROR,\r\n error,\r\n});\r\n","// Asset Data Action Types\r\nexport const GET_ASSET_DATA = 'GET_ASSET_DATA';\r\nexport const GET_ASSET_DATA_SUCCESS = 'GET_ASSET_DATA_SUCCESS';\r\nexport const GET_ASSET_DATA_ERROR = 'GET_ASSET_DATA_ERROR';\r\n//* get ftp file list\r\nexport const GET_FTP_FILE_LIST = 'GET_FTP_FILE_LIST';\r\nexport const GET_FTP_FILE_LIST_SUCCESS = 'GET_FTP_FILE_LIST_SUCCESS';\r\nexport const GET_FTP_FILE_LIST_ERROR = 'GET_FTP_FILE_LIST_ERROR';\r\n//* create digital asset\r\nexport const CREATE_DIGITAL_ASSET_FULL = 'CREATE_DIGITAL_ASSET_FULL';\r\nexport const CREATE_DIGITAL_ASSET_FULL_SUCCESS =\r\n 'CREATE_DIGITAL_ASSET_FULL_SUCCESS';\r\nexport const CREATE_DIGITAL_ASSET_FULL_ERROR =\r\n 'CREATE_DIGITAL_ASSET_FULL_ERROR';\r\n//* edit digital asset\r\nexport const UPDATE_DIGITAL_ASSET = 'UPDATE_DIGITAL_ASSET';\r\nexport const UPDATE_DIGITAL_REPLACE_ASSET = 'UPDATE_DIGITAL_REPLACE_ASSET';\r\nexport const UPDATE_DIGITAL_ASSET_SUCCESS = 'UPDATE_DIGITAL_ASSET_SUCCESS';\r\nexport const UPDATE_REQUIRED_FIELDS = 'UPDATE_REQUIRED_FIELD';\r\nexport const UPDATE_DIGITAL_ASSET_ERROR = 'UPDATE_DIGITAL_ASSET_ERROR';\r\nexport const UPDATE_IS_ACTIVE = 'UPDATE_IS_ACTIVE';\r\nexport const GET_ASSET_ASSOCIATION_GRID_COLUMN =\r\n 'GET_ASSET_ASSOCIATION_GRID_COLUMN';\r\nexport const GET_ASSET_ASSOCIATION_GRID_COLUMN_SUCCESS =\r\n 'GET_ASSET_ASSOCIATION_GRID_COLUMN_SUCCESS';\r\nexport const GET_ASSET_ASSOCIATION_GRID_COLUMN_ERROR =\r\n 'GET_ASSET_ASSOCIATION_GRID_COLUMN_ERROR';\r\nexport const CANCEL_UPDATE_SUCCESS = 'CANCEL_UPDATE_SUCCESS';\r\nexport const RELOAD_FULL_VIEW = 'RELOAD_FULL_VIEW';\r\nexport const UPDATE_ASSET_TYPE = 'UPDATE_ASSET_TYPE';\r\nexport const UPDATE_ASSET_TYPE_SUCCESS = 'UPDATE_ASSET_TYPE_SUCCESS';\r\nexport const UPDATE_ASSET_TYPE_ERROR = 'UPDATE_ASSET_TYPE_ERROR';\r\n\r\nexport const GET_AUTHORIZED_TAGS = 'GET_AUTHORIZED_TAGS';\r\nexport const GET_AUTHORIZED_TAGS_SUCCESS = 'GET_AUTHORIZED_TAGS_SUCCESS';\r\nexport const GET_AUTHORIZED_TAGS_ERROR = 'GET_AUTHORIZED_TAGS_ERROR';\r\n","import produce from 'immer';\r\nimport * as types from './constants';\r\n\r\nexport const initialState = {\r\n loading: false,\r\n assetData: null,\r\n digitalAsset: null,\r\n requiredFields: [],\r\n isActive: false,\r\n metaData: null,\r\n error: null,\r\n columns: [],\r\n gridName: '',\r\n ftpFileList: {\r\n data: null,\r\n loading: false,\r\n error: null,\r\n },\r\n postFtpFile: {\r\n status: null,\r\n loading: false,\r\n error: null,\r\n },\r\n editSuccess: false,\r\n editError: false,\r\n authorizedTagsLoading: false,\r\n authorizedTags: {\r\n enforceTagRestrictions: false,\r\n authorizedTags: [],\r\n },\r\n authorizedTagsError: null,\r\n};\r\n\r\n/* eslint-disable default-case, no-param-reassign */\r\nconst assetDataReducer = (state = initialState, action) =>\r\n produce(state, (draft) => {\r\n switch (action.type) {\r\n case types.GET_ASSET_DATA:\r\n draft.loading = true;\r\n draft.error = null;\r\n // draft.assetData = null;\r\n break;\r\n case types.GET_ASSET_DATA_SUCCESS:\r\n draft.loading = false;\r\n draft.editSuccess = false;\r\n draft.assetData = action.data;\r\n draft.error = null;\r\n break;\r\n case types.GET_ASSET_DATA_ERROR:\r\n draft.loading = false;\r\n draft.editSuccess = false;\r\n draft.error = action.error;\r\n draft.assetData = null;\r\n break;\r\n //* get ftp file list\r\n case types.GET_FTP_FILE_LIST:\r\n draft.ftpFileList.loading = true;\r\n draft.ftpFileList.error = null;\r\n break;\r\n case types.GET_FTP_FILE_LIST_SUCCESS:\r\n draft.ftpFileList.loading = false;\r\n draft.ftpFileList.data = action.payload;\r\n draft.ftpFileList.error = null;\r\n break;\r\n case types.GET_FTP_FILE_LIST_ERROR:\r\n draft.ftpFileList.loading = false;\r\n draft.ftpFileList.error = action.error;\r\n draft.ftpFileList.data = null;\r\n break;\r\n //*create asset\r\n case types.CREATE_DIGITAL_ASSET_FULL:\r\n draft.loading = true;\r\n break;\r\n case types.CREATE_DIGITAL_ASSET_FULL_SUCCESS:\r\n draft.loading = false;\r\n draft.metaData = { ...action.metaData, isOwner: true };\r\n break;\r\n case types.CREATE_DIGITAL_ASSET_FULL_ERROR:\r\n draft.loading = false;\r\n break;\r\n case types.UPDATE_DIGITAL_ASSET:\r\n draft.loading = true;\r\n break;\r\n case types.UPDATE_IS_ACTIVE:\r\n draft.isActive = action.payload;\r\n break;\r\n case types.UPDATE_DIGITAL_REPLACE_ASSET:\r\n draft.loading = true;\r\n draft.editError = false;\r\n break;\r\n case types.UPDATE_DIGITAL_ASSET_SUCCESS:\r\n draft.loading = false;\r\n draft.editSuccess = true;\r\n break;\r\n case types.UPDATE_REQUIRED_FIELDS:\r\n draft.requiredFields = action.params;\r\n break;\r\n case types.UPDATE_DIGITAL_ASSET_ERROR:\r\n draft.loading = false;\r\n draft.editError = action.error;\r\n draft.editSuccess = false;\r\n break;\r\n case types.GET_ASSET_ASSOCIATION_GRID_COLUMN:\r\n draft.loading = true;\r\n draft.error = false;\r\n draft.gridName = action.gridName;\r\n break;\r\n case types.GET_ASSET_ASSOCIATION_GRID_COLUMN_SUCCESS:\r\n draft.loading = false;\r\n draft.columns = action.columns;\r\n break;\r\n case types.GET_ASSET_ASSOCIATION_GRID_COLUMN_ERROR:\r\n // draft.loading = false;\r\n break;\r\n case types.CANCEL_UPDATE_SUCCESS:\r\n draft.editSuccess = false;\r\n break;\r\n case types.GET_AUTHORIZED_TAGS:\r\n draft.authorizedTagsLoading = true;\r\n break;\r\n case types.GET_AUTHORIZED_TAGS_SUCCESS:\r\n draft.authorizedTagsLoading = false;\r\n draft.authorizedTags = action.data;\r\n break;\r\n case types.GET_AUTHORIZED_TAGS_ERROR:\r\n draft.authorizedTagsLoading = false;\r\n draft.authorizedTagsError = action.error;\r\n break;\r\n default:\r\n break;\r\n }\r\n });\r\n\r\nexport default assetDataReducer;\r\n","import { put, call, takeLatest, all } from 'redux-saga/effects';\r\nimport React from 'react';\r\n\r\nimport * as types from './constants';\r\nimport * as actions from './actions';\r\nimport * as actionsBranding from '@redux/branding/actions';\r\nimport * as actionsRibbon from 'pages/home/ribbon/asset-full/controllers/actions';\r\n\r\nimport * as servicesGrid from 'services/grid';\r\nimport { formatMDYWithParam } from 'utils/formatDate';\r\nimport {\r\n AssociationIconRendered,\r\n AssociationIconRenderedBound,\r\n} from '../components/index';\r\nimport { notification } from 'antd';\r\n\r\nimport {\r\n getAssetData,\r\n serviceToGetFtpFileList,\r\n updateDigitalAssetService,\r\n updateDigitalReplaceAssetService,\r\n editIFrame,\r\n updateAssetType,\r\n} from 'services/digitalAsset';\r\n\r\nimport * as tagRestrictionsServices from 'services/tag-restrictions';\r\n\r\nexport function* getAssetDataSaga(payload) {\r\n try {\r\n const response = yield call(getAssetData, payload.assetId);\r\n if (response.isSuccess) {\r\n yield put(actions.getAssetDataSuccess(response.data));\r\n } else {\r\n yield put(actions.getAssetDataError(response.message));\r\n }\r\n } catch (error) {\r\n yield put(actions.getAssetDataError(error));\r\n }\r\n}\r\n\r\n//* GET FTP FILE LIST SAGA\r\nexport function* getFtpFileListSaga(action) {\r\n try {\r\n const options = {\r\n params: {\r\n ServiceType: action.payload,\r\n },\r\n };\r\n const response = yield call(serviceToGetFtpFileList, options);\r\n if (response.isSuccess) {\r\n yield put(actions.getFtpFileListSuccess(response.data.assetsModels));\r\n } else {\r\n yield put(actions.getFtpFileListError(response.message));\r\n }\r\n } catch (error) {\r\n yield put(actions.getFtpFileListError(error));\r\n }\r\n}\r\n\r\nexport function* updateDigitalAsset(payload) {\r\n try {\r\n let response;\r\n if (payload.params?.isIFrame)\r\n response = yield call(editIFrame, payload.params);\r\n else response = yield call(updateDigitalAssetService, payload.params);\r\n if (response?.isSuccess) {\r\n yield put(actions.updateRequiredField(response?.data?.requiredFields));\r\n yield put(actions.updateDigitalAssetSuccess(response.data));\r\n yield put(actionsBranding.getBrandingNoLoading());\r\n\r\n if (response.data?.requiredFields?.length) {\r\n yield put(actionsRibbon.editAsset());\r\n } else {\r\n yield put(actions.getAssetData(payload.params.id));\r\n yield put(actionsRibbon.cancelEditAsset());\r\n yield put(actions.updateIsActive(true));\r\n }\r\n } else {\r\n yield put(actions.updateDigitalAssetError(response?.message));\r\n yield put(actionsRibbon.cancelSavingAsset());\r\n }\r\n } catch (error) {\r\n yield put(actions.updateDigitalAssetError(error));\r\n yield put(actionsRibbon.cancelSavingAsset());\r\n }\r\n}\r\nexport function* updateDigitalReplaceAsset(payload) {\r\n try {\r\n const response = yield call(\r\n updateDigitalReplaceAssetService,\r\n payload.params\r\n );\r\n if (response?.isSuccess) {\r\n yield put(actions.updateRequiredField(response?.data?.requiredFields));\r\n yield put(actionsBranding.getBrandingNoLoading());\r\n if (response.data?.requiredFields?.length) {\r\n yield put(actionsRibbon.editAsset());\r\n } else {\r\n yield put(actions.updateIsActive(true));\r\n }\r\n yield put(actions.updateDigitalAssetSuccess(response.data));\r\n }\r\n } catch (error) {\r\n yield put(actions.updateDigitalAssetError(error));\r\n }\r\n}\r\n\r\nexport function* updateAssetData(payload) {\r\n try {\r\n const response = yield call(updateAssetType, payload.params);\r\n if (response.isSuccess) {\r\n notification.success({\r\n message: 'Update Asset Type Success',\r\n });\r\n yield put(actions.getAssetData(payload.params.id));\r\n }\r\n } catch (error) {\r\n yield put(actions.updateAssetTypeError(error));\r\n }\r\n}\r\nconst renderIconType = (params) => {\r\n return ;\r\n};\r\n\r\nconst renderIconBound = (params) => {\r\n return ;\r\n};\r\n\r\nconst renderFileType = (params) => {\r\n return params.value?.toUpperCase() ?? null;\r\n};\r\n\r\nexport function* gridDigitalAssetColumnInfo(payload) {\r\n try {\r\n const response = yield call(servicesGrid.gridColumnInfo, payload.gridName);\r\n\r\n let columns = [\r\n {\r\n field: '',\r\n width: 30,\r\n checkboxSelection: true,\r\n filter: false,\r\n suppressMenu: true,\r\n },\r\n ];\r\n\r\n if (response?.columns?.length > 0) {\r\n response.columns.forEach((val) => {\r\n if (!['id', 'otherAssetId'].includes(val.fieldNameCamelCase)) {\r\n if (val.fieldNameCamelCase === 'created') {\r\n val = {\r\n ...val,\r\n width: 100,\r\n suppressMenu: true,\r\n cellRenderer: formatMDYWithParam,\r\n };\r\n } else if (val.fieldNameCamelCase === 'isInBound') {\r\n val = {\r\n ...val,\r\n headerName: '',\r\n dataType: 'string',\r\n width: 100,\r\n suppressMenu: true,\r\n cellRenderer: renderIconBound,\r\n };\r\n } else if (val.fieldNameCamelCase === 'type') {\r\n val = {\r\n ...val,\r\n headerName: '',\r\n width: 100,\r\n suppressMenu: true,\r\n cellRenderer: renderIconType,\r\n };\r\n } else if (val.fieldNameCamelCase === 'assetName') {\r\n val = { ...val, flex: 1, minWidth: 130, suppressMenu: true };\r\n } else if (val.fieldNameCamelCase === 'fileType') {\r\n val = {\r\n ...val,\r\n width: 100,\r\n suppressMenu: true,\r\n // cellRenderer: renderFileType,\r\n };\r\n }\r\n columns.push(val);\r\n }\r\n });\r\n }\r\n\r\n yield put(actions.gridColumnAssetAssociationSuccess(columns));\r\n } catch (error) {\r\n yield put(actions.gridColumnAssetAssociationError(error));\r\n }\r\n}\r\n\r\nexport function* getAuthorizedTagsSaga(payload) {\r\n try {\r\n const response = yield call(\r\n tagRestrictionsServices.getAuthorizedTags,\r\n payload.memberId\r\n );\r\n if (response.isSuccess) {\r\n yield put(actions.getAuthorizedTagsSuccess(response.data));\r\n } else {\r\n yield put(actions.getAuthorizedTagsError(response.message));\r\n }\r\n } catch (error) {\r\n yield put(actions.getAuthorizedTagsError(error));\r\n }\r\n}\r\n\r\nfunction* watchAll() {\r\n yield all([\r\n takeLatest(types.GET_ASSET_DATA, getAssetDataSaga),\r\n takeLatest(types.GET_FTP_FILE_LIST, getFtpFileListSaga),\r\n takeLatest(types.UPDATE_DIGITAL_ASSET, updateDigitalAsset),\r\n takeLatest(types.UPDATE_DIGITAL_REPLACE_ASSET, updateDigitalReplaceAsset),\r\n takeLatest(\r\n types.GET_ASSET_ASSOCIATION_GRID_COLUMN,\r\n gridDigitalAssetColumnInfo\r\n ),\r\n takeLatest(types.UPDATE_ASSET_TYPE, updateAssetData),\r\n takeLatest(types.GET_AUTHORIZED_TAGS, getAuthorizedTagsSaga),\r\n ]);\r\n}\r\n\r\nexport default watchAll;\r\n","import { createSelector } from 'reselect';\r\nimport { initialState } from './reducer';\r\n\r\n/**\r\n * take digital asset full state from redux\r\n * @param {object} state\r\n */\r\nconst selectAssetData = (state) => state?.digitalAsset || initialState;\r\n\r\nconst selectDigitalAsset = () =>\r\n createSelector(selectAssetData, (state) => state.digitalAsset);\r\n\r\nconst selectDigitalAssetMetaData = () =>\r\n createSelector(selectAssetData, (state) => state.metaData);\r\n\r\nconst selectDigitalAssetLoading = () =>\r\n createSelector(selectAssetData, (state) => state.loading);\r\n\r\nconst selectDigitalAssetError = () =>\r\n createSelector(selectAssetData, (state) => state.error);\r\n\r\nconst selectIsActive = () =>\r\n createSelector(selectAssetData, (state) => state.isActive);\r\n\r\nconst assetDataLoading = () =>\r\n createSelector(selectAssetData, (state) => state.assetData);\r\n\r\nconst selectRequiredFields = () =>\r\n createSelector(selectAssetData, (state) => state.requiredFields);\r\n\r\nconst assetDataColumnInfo = () =>\r\n createSelector(selectAssetData, (state) => state.columns);\r\n\r\nconst selectEditSuccess = () =>\r\n createSelector(selectAssetData, (state) => state.editSuccess);\r\n\r\nconst selectDigitalAssetEditError = () =>\r\n createSelector(selectAssetData, (state) => state.editError);\r\n\r\nconst selectEditTypeLoading = () =>\r\n createSelector(selectAssetData, (state) => state.editTypeLoading);\r\n\r\n//* ftp list selector\r\nconst makeSelectFtpFileList = () =>\r\n createSelector(selectAssetData, (subState) => subState.ftpFileList);\r\n\r\nconst makeSelectAssetData = () =>\r\n createSelector(selectAssetData, (subState) => subState.assetData);\r\n\r\nconst selectAuthorizedTagsLoading = () =>\r\n createSelector(selectAssetData, (subState) => subState.authorizedTagsLoading);\r\n\r\nconst selectAuthorizedTags = () =>\r\n createSelector(selectAssetData, (subState) => subState.authorizedTags);\r\n\r\nconst selectAuthorizedTagsError = () =>\r\n createSelector(selectAssetData, (subState) => subState.authorizedTagsError);\r\n\r\nexport {\r\n selectIsActive,\r\n selectDigitalAsset,\r\n selectDigitalAssetLoading,\r\n selectDigitalAssetMetaData,\r\n selectRequiredFields,\r\n selectAssetData,\r\n assetDataLoading,\r\n makeSelectFtpFileList,\r\n selectDigitalAssetError,\r\n assetDataColumnInfo,\r\n selectEditSuccess,\r\n selectDigitalAssetEditError,\r\n makeSelectAssetData,\r\n selectEditTypeLoading,\r\n selectAuthorizedTagsLoading,\r\n selectAuthorizedTags,\r\n selectAuthorizedTagsError,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { List } from 'antd';\r\nimport * as _ from 'lodash';\r\nimport { AssetTileCard } from 'pages/branded-assets/components';\r\n\r\nfunction AssetTileView(props) {\r\n const { tileData, handleToggleAssetContext } = props;\r\n return (\r\n \r\n {!!tileData && (\r\n (\r\n \r\n \r\n \r\n )}\r\n />\r\n )}\r\n \r\n );\r\n}\r\n\r\nAssetTileView.propTypes = {\r\n // ? tileData -> data of tile table\r\n tileData: PropTypes.array,\r\n};\r\n\r\nexport default React.memo(AssetTileView);\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { List } from 'antd';\r\nimport * as _ from 'lodash';\r\nimport { AssetThumbnailCard } from 'pages/branded-assets/components';\r\n\r\nfunction AssetThumbView(props) {\r\n const { thumbData, handleToggleAssetContext } = props;\r\n return (\r\n \r\n {!!thumbData && (\r\n (\r\n \r\n \r\n \r\n )}\r\n />\r\n )}\r\n \r\n );\r\n}\r\n\r\nAssetThumbView.propTypes = {\r\n // ? thumbData -> data of thumb table\r\n thumbData: PropTypes.array,\r\n};\r\n\r\nexport default React.memo(AssetThumbView);\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { List } from 'antd';\r\nimport * as _ from 'lodash';\r\nimport { AssetItemCard } from 'pages/branded-assets/components';\r\n\r\nfunction AssetDetailView(props) {\r\n const { detailData, handleToggleAssetContext } = props;\r\n return (\r\n \r\n {!!detailData && (\r\n (\r\n \r\n \r\n \r\n )}\r\n />\r\n )}\r\n \r\n );\r\n}\r\n\r\nAssetDetailView.propTypes = {\r\n // ? tileData -> data of tile table\r\n detailData: PropTypes.array,\r\n // ? handleToggleAssetContext\r\n handleToggleAssetContext: PropTypes.func,\r\n};\r\n\r\nexport default React.memo(AssetDetailView);\r\n","import React, { useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Card, Checkbox } from 'antd';\r\nimport classnames from 'classnames';\r\nimport './AssetThumbnailCard.less';\r\n\r\nconst AssetThumbnailCard = ({ alt, src, id, handleToggleAssetContext }) => {\r\n const [isChecked, setCheckedStatus] = useState(false);\r\n\r\n const onCheckHandler = (e) => {\r\n setCheckedStatus(e.target.checked);\r\n };\r\n\r\n return (\r\n \r\n \r\n handleToggleAssetContext(id)}\r\n />\r\n \r\n );\r\n};\r\n\r\nAssetThumbnailCard.propTypes = {\r\n // ? src\r\n src: PropTypes.string,\r\n // ? atl\r\n alt: PropTypes.string,\r\n // ? id\r\n id: PropTypes.string,\r\n //? handleToggleAssetContext\r\n handleToggleAssetContext: PropTypes.func,\r\n};\r\n\r\nexport default AssetThumbnailCard;\r\n","import React, { useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Checkbox, Card, Typography } from 'antd';\r\nimport './AssetTileCard.less';\r\n\r\nconst { Text } = Typography;\r\n\r\nconst AssetListItemCard = (props) => {\r\n const { alt, src, widget, upc12, id, handleToggleAssetContext } = props;\r\n const [isChecked, setCheckedStatus] = useState(false);\r\n\r\n const onCheckHandler = (e) => {\r\n setCheckedStatus(e.target.checked);\r\n };\r\n console.log(src);\r\n return (\r\n \r\n \r\n
handleToggleAssetContext(id)}>\r\n {alt}\r\n {`${upc12} - ${widget}`}\r\n
\r\n \r\n );\r\n};\r\n\r\nAssetListItemCard.propTypes = {\r\n // ? src - img source\r\n src: PropTypes.string,\r\n // ? alt - alternative for image source\r\n alt: PropTypes.string,\r\n // ? widget - unknown\r\n widget: PropTypes.string,\r\n // ? upc12 - unknown\r\n upc12: PropTypes.string,\r\n // ? id\r\n id: PropTypes.string,\r\n // ? handleToggleAssetContext\r\n handleToggleAssetContext: PropTypes.func,\r\n};\r\n\r\nexport default AssetListItemCard;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Card } from 'antd';\r\nimport * as _ from 'lodash';\r\nimport {\r\n AssetItemCardTop,\r\n AssetItemCardBottom,\r\n} from 'pages/branded-assets/components';\r\n\r\nimport './AssetItemCard.less';\r\n\r\nconst AssetItemCard = (props) => {\r\n const { detailItemData, handleToggleAssetContext } = props;\r\n\r\n return (\r\n \r\n handleToggleAssetContext(_.get(detailItemData, 'id'))\r\n }\r\n >\r\n \r\n \r\n \r\n );\r\n};\r\n\r\n// define propTypes with type\r\nAssetItemCard.propTypes = {\r\n // ? detailItemData\r\n detailItemData: PropTypes.object,\r\n // ? handleToggleAssetContext\r\n handleToggleAssetContext: PropTypes.func,\r\n};\r\n\r\nexport default AssetItemCard;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Row, Col, Typography, List } from 'antd';\r\nimport {\r\n CodeSandboxOutlined,\r\n PictureOutlined,\r\n RedoOutlined,\r\n} from '@ant-design/icons';\r\nimport './AssetItemCardTop.less';\r\n\r\nconst { Text } = Typography;\r\n\r\nconst AssetItemCardTop = (props) => {\r\n const {\r\n upc12,\r\n brand,\r\n name,\r\n packageLevels,\r\n snl,\r\n assetImgUrl,\r\n publishImgUrl,\r\n } = props;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n product\r\n \r\n \r\n \r\n \r\n {upc12}\r\n \r\n \r\n {brand}\r\n \r\n \r\n {name}\r\n \r\n \r\n \r\n (\r\n \r\n {packageItem}\r\n {idx !== packageLevels.length - 1 && /}\r\n \r\n )}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n publish\r\n \r\n \r\n {snl}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nAssetItemCardTop.propTypes = {\r\n // ? upc12\r\n upc12: PropTypes.string,\r\n // ? brand\r\n brand: PropTypes.string,\r\n // ? name\r\n name: PropTypes.string,\r\n // ? packageLevels\r\n packageLevels: PropTypes.arrayOf(PropTypes.string),\r\n // ? snl\r\n snl: PropTypes.string,\r\n // ? assetImgUrl\r\n assetImgUrl: PropTypes.string,\r\n //? publish\r\n publishImgUrl: PropTypes.string,\r\n};\r\n\r\nexport default React.memo(AssetItemCardTop);\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Row, Col, Typography } from 'antd';\r\nimport moment from 'moment';\r\n\r\nconst { Text } = Typography;\r\n\r\nconst AssetItemCardBottom = (props) => {\r\n const { imageUpdateDate, lastUpdateDate } = props;\r\n\r\n return (\r\n \r\n \r\n \r\n Last Updated: \r\n\r\n \r\n {\r\n //TODO: DATETIME\r\n moment(lastUpdateDate).format('MM/DD/YYYY')\r\n }\r\n \r\n \r\n \r\n \r\n image Updated: \r\n \r\n {\r\n //TODO: DATETIME\r\n moment(imageUpdateDate).format('MM/DD/YYYY')\r\n }\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nAssetItemCardBottom.propTypes = {\r\n //? imageUpdateDate - iso date\r\n imageUpdateDate: PropTypes.string,\r\n //? lastUpdateDate - iso date\r\n lastUpdateDate: PropTypes.string,\r\n};\r\n\r\nexport default React.memo(AssetItemCardBottom);\r\n","import React, { useState } from 'react';\r\nimport { Typography, Space, Row, Col, Button, Tooltip, Modal } from 'antd';\r\nimport { get } from 'lodash';\r\nimport IconList from 'common/components/icon-list/IconList';\r\nimport EntityStatusTag from 'common/components/tag/entity-status-tag/EntityStatusTag';\r\nimport PropTypes from 'prop-types';\r\nimport { formatSizeUnits } from 'utils/formatSizeUnits';\r\nimport * as getLink from 'utils/common/linkBuilder';\r\n\r\nconst { Paragraph, Title, Link } = Typography;\r\n\r\nconst AssetTileBody = (props) => {\r\n const { dataDetail } = props;\r\n\r\n const [visible, setVisible] = useState(false);\r\n\r\n const status = get(dataDetail, 'status', '');\r\n const assetName = get(dataDetail, 'assetName', '');\r\n const id = get(dataDetail, 'id', '');\r\n const assetType = get(dataDetail, 'assetType', '');\r\n const fileType = get(dataDetail, 'fileType', '');\r\n const fileName = get(dataDetail, 'fileName', '');\r\n const fileSize = get(dataDetail, 'fileSize', 0);\r\n const additionalSearchTags = get(dataDetail, 'additionalSearchTags', '');\r\n const dataAssetSegments = get(dataDetail, 'dataAssetSegments', '');\r\n const description = get(dataDetail, 'description', '');\r\n const tagList = additionalSearchTags ? additionalSearchTags.split(',') : [];\r\n const aLink = getLink.assetLink(id, assetName);\r\n\r\n const renderDescriptionTooltip = (description) => {\r\n return (\r\n <>\r\n \r\n {description}\r\n \r\n setVisible(true)}>\r\n More\r\n \r\n \r\n );\r\n };\r\n\r\n const renderDescriptionInfo = (description) => {\r\n return (\r\n setVisible(false)}\r\n footer={[\r\n ,\r\n ]}\r\n >\r\n \r\n {description}\r\n \r\n \r\n );\r\n };\r\n\r\n return (\r\n
\r\n \r\n \r\n {aLink}\r\n \r\n {assetType}\r\n \r\n \r\n {fileName}\r\n \r\n \r\n {fileType || 'file-type'} / {formatSizeUnits(fileSize)}\r\n \r\n {description && (\r\n \r\n \r\n \r\n {description}\r\n \r\n \r\n \r\n )}\r\n {description && renderDescriptionInfo(description)}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nAssetTileBody.propTypes = {\r\n dataDetail: PropTypes.object,\r\n};\r\n\r\nexport default AssetTileBody;\r\n","/* eslint-disable jsx-a11y/alt-text */\r\n// eslint-disable-next-line jsx-a11y/alt-text\r\n\r\nimport React from 'react';\r\n\r\nimport classnames from 'classnames';\r\n\r\nimport { Row, Avatar } from 'antd';\r\nimport PropTypes from 'prop-types';\r\nimport iframe from 'assets/iframe.png';\r\n\r\nimport { useImageLoaded } from 'hooks';\r\n\r\nimport { Images } from 'config/assets';\r\n\r\nconst AssetTileHeader = (props) => {\r\n const { dataDetail } = props;\r\n\r\n // Viet - get image with version suffix to prevent cache image\r\n const imageThumbnail = dataDetail?.thumbSize300;\r\n const image = dataDetail?.isIFrame ? iframe : dataDetail && imageThumbnail;\r\n\r\n const [ref, loaded, onLoad] = useImageLoaded();\r\n\r\n return (\r\n \r\n
\r\n\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nAssetTileHeader.propTypes = {\r\n dataDetail: PropTypes.object,\r\n};\r\n\r\nexport default AssetTileHeader;\r\n","import React from 'react';\r\nimport { Row, Col } from 'antd';\r\n\r\nimport { formatMDY } from 'utils/formatDate';\r\nimport { get } from 'lodash';\r\nimport { injectIntl } from 'react-intl';\r\nimport PropTypes from 'prop-types';\r\n\r\nconst AssetTileFooter = (props) => {\r\n const { intl, dataDetail } = props;\r\n\r\n const loadedDate = get(dataDetail, 'loadedDate', '');\r\n const lastUpdated = get(dataDetail, 'lastUpdated', '');\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {intl.formatMessage({\r\n id: 'Taco.common.components.assetList.lastUpdated',\r\n })}{' '}\r\n \r\n {lastUpdated && formatMDY(lastUpdated)} \r\n \r\n \r\n \r\n {intl.formatMessage({\r\n id: 'Taco.common.components.assetList.imageDate',\r\n })}{' '}\r\n \r\n {loadedDate && formatMDY(loadedDate)}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nAssetTileFooter.propTypes = {\r\n loadedDate: PropTypes.string,\r\n lastUpdate: PropTypes.string,\r\n};\r\n\r\nexport default injectIntl(AssetTileFooter);\r\n","import React from 'react';\r\nimport { AssetTileBody, AssetTileFooter, AssetTileHeader } from '../index';\r\nimport './AssetTile.less';\r\nimport { get } from 'lodash';\r\nimport useDoubleClick from 'hooks/useDoubleClick';\r\n\r\nconst AssetTile = (props) => {\r\n const { dataDetail } = props;\r\n const { onClickItemGrid, onDoubleClick } = props.clickEvents;\r\n const assetName = get(dataDetail, 'assetName', '');\r\n\r\n const divRef = React.useRef();\r\n useDoubleClick({\r\n onSingleClick: (e) => {\r\n if (onClickItemGrid) onClickItemGrid(dataDetail, e);\r\n },\r\n onDoubleClick: (e) => {\r\n if (onDoubleClick) onDoubleClick(dataDetail);\r\n },\r\n ref: divRef,\r\n latency: 250,\r\n });\r\n\r\n return (\r\n
\r\n {/*Placeholder for click events*/}\r\n \r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nexport default AssetTile;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { forwardTo } from 'utils/common/route';\r\nimport { ThumbnailItem } from 'common/components';\r\nimport iframe from 'assets/iframe.png';\r\nimport * as getLink from 'utils/common/linkBuilder';\r\n/**\r\n * Asset thumbnail is inherit from thumbnail item\r\n * @param {object} props\r\n */\r\nconst AssetThumbnailCard = (props) => {\r\n const {\r\n dataDetail,\r\n selected,\r\n onClickItemGrid,\r\n onClickCheckboxItem,\r\n pathname,\r\n linkTarget,\r\n style,\r\n isShareBtn = true,\r\n hideCheckbox = false,\r\n } = props;\r\n\r\n const onDoubleClick = (item) => {\r\n if (props.onDoubleClick) {\r\n return props.onDoubleClick(item);\r\n }\r\n\r\n if (!pathname) return;\r\n const { id } = item;\r\n forwardTo(`${pathname}/${id}`);\r\n };\r\n\r\n // Viet - get image with version suffix to prevent cache image\r\n const imageThumbnail = dataDetail?.thumbSize300;\r\n const image = dataDetail?.isIFrame ? iframe : dataDetail && imageThumbnail;\r\n // Bp - add link to asset thumbnail\r\n const alink = getLink.assetLink(\r\n dataDetail?.id,\r\n dataDetail?.assetName,\r\n linkTarget\r\n );\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nAssetThumbnailCard.propTypes = {\r\n dataDetail: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default React.memo(AssetThumbnailCard);\r\n","import React from 'react';\r\nimport { Spin, Divider } from 'antd';\r\nimport { useSelector } from 'react-redux';\r\nimport assetsRibbonSelector from 'pages/home/ribbon/asset-full/controllers/selectors';\r\nimport { AssetPanelAssociation, AssetPanelThumbnailInfo } from '../index';\r\nimport LinkAssets from './link-assets/LinkAssets';\r\nimport AssetOverview from 'pages/asset-full-view/components/metadata-panel/AssetOverview';\r\nimport './AssetPanel.less';\r\nimport AssetDownload from 'pages/asset-full-view/components/metadata-panel/AssetDownload';\r\n\r\nconst AssetPanel = (props) => {\r\n const { assetData, loadingDetail, style } = props;\r\n const modeLinkAssets = useSelector(\r\n assetsRibbonSelector.selectModeLinkAssets()\r\n );\r\n\r\n const typeData = {\r\n assetType: assetData?.assetType,\r\n assetSubType: assetData?.assetSubType,\r\n packageLevel: assetData?.metadata?.packageLevel,\r\n packagingDisposition: assetData?.metadata?.packagingDisposition,\r\n angle: assetData?.metadata?.angle,\r\n facing: assetData?.metadata?.facing,\r\n language: assetData?.metadata?.language,\r\n panelType: assetData?.metadata?.panelType,\r\n logoType: assetData?.metadata?.logoType,\r\n certificateType: assetData?.metadata?.certificateType,\r\n documentType: assetData?.metadata?.documentType,\r\n };\r\n\r\n return (\r\n
\r\n {loadingDetail ? (\r\n
\r\n \r\n
\r\n ) : (\r\n assetData && (\r\n
\r\n \r\n \r\n
\r\n \r\n
\r\n {modeLinkAssets ? null : (\r\n \r\n )}\r\n {modeLinkAssets ? : null}\r\n {!assetData?.isIFrame && (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n )\r\n )}\r\n
\r\n );\r\n};\r\nexport default AssetPanel;\r\n","import React, { useEffect } from 'react';\r\nimport { useSelector, useDispatch } from 'react-redux';\r\nimport { useParams } from 'react-router-dom';\r\nimport AssetAssociations from '../../../asset-full-view/components/metadata-panel/AssetAssociations';\r\nimport * as selectors from '../../../asset-full-view/controllers/selectors';\r\nimport * as assetActions from '../../../asset-full-view/controllers/actions';\r\n\r\nconst AssetPanelAssociation = (props) => {\r\n const { assetData } = props;\r\n const { id } = useParams();\r\n const dispatch = useDispatch();\r\n const associationColumn = useSelector(selectors.assetDataColumnInfo());\r\n useEffect(() => {\r\n dispatch(assetActions.gridColumnAssetAssociation('asset-association-grid'));\r\n }, [dispatch]);\r\n\r\n return (\r\n
\r\n
Associations:
\r\n
\r\n 0 ? associationColumn : [{}]\r\n }\r\n assetData={assetData}\r\n />\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default AssetPanelAssociation;\r\n","import React from 'react';\r\nimport { message, Dropdown, Menu, Typography } from 'antd';\r\nimport { DownloadOutlined } from '@ant-design/icons';\r\nimport { dialogFunction } from 'common/components';\r\nimport { injectIntl } from 'react-intl';\r\n\r\nimport { getLinkDownloadAsset } from 'services/digitalAsset';\r\nimport * as api from 'config/axios';\r\nimport DigitalRight from 'assets/DRM.png';\r\n\r\nconst { Text } = Typography;\r\n\r\nconst defaultAsset = 'Original';\r\n\r\nconst AssetPanelDownload = ({ assetData, intl }) => {\r\n const { id, fileUrl, fileType, downloadFormats } = assetData;\r\n\r\n const downloadOriginalFormat = async () => {\r\n const params = `${fileUrl}?dl=1`;\r\n try {\r\n await api.sendDownload({\r\n url: params,\r\n });\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n };\r\n const downloadAnotherFormat = async (key) => {\r\n try {\r\n const response = await getLinkDownloadAsset(id, key);\r\n if (response.isSuccess) {\r\n api.sendDownload({\r\n url: response.data.url,\r\n });\r\n } else {\r\n message.error(response.message);\r\n }\r\n } catch (error) {\r\n message.error(error);\r\n }\r\n };\r\n\r\n const addMissingFileType = () => {\r\n if (!fileType) return;\r\n const upCaseFileType = fileType.toUpperCase();\r\n return Array.from(new Set([...downloadFormats, upCaseFileType]?.sort()));\r\n };\r\n\r\n const listTypeDownload = addMissingFileType() ?? [];\r\n\r\n const triggerDownload = (key) => {\r\n if (key === 'Original' && fileUrl) {\r\n downloadOriginalFormat();\r\n } else {\r\n downloadAnotherFormat(key.toLowerCase());\r\n }\r\n };\r\n\r\n const menu = (\r\n {\r\n assetData?.drm ? handlePreDownload(key) : triggerDownload(key);\r\n }}\r\n >\r\n {listTypeDownload.map((format) => (\r\n \r\n {format}\r\n \r\n ))}\r\n \r\n );\r\n\r\n function handlePreDownload(data) {\r\n dialogFunction({\r\n type: 'warn',\r\n content: (\r\n
\r\n \r\n {intl.formatMessage({\r\n id: 'Taco.home.ribbon.dialogDeleteDRMsingle',\r\n })}\r\n
\r\n ),\r\n\r\n okText: 'Cancel',\r\n onCancel: () => triggerDownload(data),\r\n cancelText: 'Download',\r\n });\r\n }\r\n\r\n return (\r\n trigger.parentElement}\r\n >\r\n {\r\n assetData?.drm\r\n ? handlePreDownload(defaultAsset)\r\n : triggerDownload(defaultAsset);\r\n }}\r\n />\r\n \r\n );\r\n};\r\n\r\nconst disableDownloadButton = (assetData) => {\r\n if (assetData?.isIFrame) return true;\r\n return false;\r\n};\r\n\r\nexport default injectIntl(AssetPanelDownload);\r\n","import React, { useRef } from 'react';\r\nimport Image from 'common/components/image/Image';\r\nimport { FavoriteStarIconRender } from 'common/components';\r\nimport { get } from 'lodash';\r\nimport { Row, Col, Typography, Tooltip } from 'antd';\r\nimport { EyeOutlined } from '@ant-design/icons';\r\nimport { AssetPanelDownload } from '../index';\r\nimport { forwardTo } from 'utils/common/route';\r\nimport iframe from 'assets/iframe.png';\r\nimport { Images } from 'config/assets';\r\nimport useDoubleClick from 'hooks/useDoubleClick';\r\n\r\nconst { Title } = Typography;\r\n\r\nconst AssetPanelThumbnailInfo = (props) => {\r\n const { assetData } = props;\r\n const thumbUrl = get(assetData, 'thumbnail', '');\r\n const fileName = get(assetData, 'assetName', '');\r\n const isFavorited = get(assetData, 'isFavorited', false);\r\n const divRef = useRef();\r\n\r\n useDoubleClick({\r\n onDoubleClick: (e) => {\r\n forwardTo(`/asset/${assetData?.id}`);\r\n },\r\n ref: divRef,\r\n latency: 250,\r\n });\r\n\r\n return (\r\n
\r\n \r\n \r\n trigger.parentElement}\r\n >\r\n {\r\n forwardTo(`/asset/${assetData?.id}`);\r\n }}\r\n />\r\n \r\n \r\n \r\n {!assetData?.isIFrame && }\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n \r\n <FavoriteStarIconRender\r\n isFavorited={isFavorited}\r\n style={{ marginRight: 8 }}\r\n />\r\n {fileName}\r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nexport default AssetPanelThumbnailInfo;\r\n","/*\r\n * Login Messages\r\n *\r\n * This contains all the text for the login component.\r\n */\r\nimport { defineMessages } from 'react-intl';\r\n\r\nexport const scope = 'Taco.branded-assets-products';\r\n\r\nexport default defineMessages({\r\n gridTitle: {\r\n id: `${scope}.constants.assetGridView.gridTitle`,\r\n defaultMessage: 'PRODUCT ASSET',\r\n },\r\n ucp12: {\r\n id: `${scope}.constants.assetGridView.upc12`,\r\n defaultMessage: 'UPC12',\r\n },\r\n manufacturer: {\r\n id: `${scope}.constants.assetGridView.manufacturer`,\r\n defaultMessage: 'MANUFACTURER',\r\n },\r\n brand: {\r\n id: `${scope}.constants.assetGridView.brand`,\r\n defaultMessage: 'BRAND',\r\n },\r\n description: {\r\n id: `${scope}.constants.assetGridView.description`,\r\n defaultMessage: 'DESCRIPTION',\r\n },\r\n size: {\r\n id: `${scope}.constants.assetGridView.size`,\r\n defaultMessage: 'SIZE',\r\n },\r\n status: {\r\n id: `${scope}.constants.assetGridView.status`,\r\n defaultMessage: 'STATUS',\r\n },\r\n lastModified: {\r\n id: `${scope}.constants.assetGridView.lastModified`,\r\n defaultMessage: 'LAST MODIFIED',\r\n },\r\n editedBy: {\r\n id: `${scope}.constants.assetGridView.editedBy`,\r\n defaultMessage: 'EDITED BY',\r\n },\r\n ixoneId: {\r\n id: `${scope}.constants.assetGridView.ixoneId`,\r\n defaultMessage: 'IXONE ID',\r\n },\r\n ixoneCertifiateDate: {\r\n id: `${scope}.constants.assetGridView.ixoneCertifiateDate`,\r\n defaultMessage: 'IXONE CERTIFICATION DATE',\r\n },\r\n syncReady: {\r\n id: `${scope}.constants.assetGridView.syncReady`,\r\n defaultMessage: 'SYNC READY',\r\n },\r\n viewDetail: {\r\n id: `${scope}.constants.assetGridView.viewDetail`,\r\n defaultMessage: 'VIEW DETAIL',\r\n },\r\n hintGridAsset: {\r\n id: `${scope}.constants.assetGridView.hintGridAsset`,\r\n defaultMessage:\r\n 'You can drag-drop items in the grid after you search successfully.',\r\n },\r\n});\r\n","import { createSelector } from 'reselect';\r\nimport { initialState } from './reducers';\r\n\r\n/**\r\n * take digital asset full state from redux\r\n * @param {object} state\r\n */\r\n\r\nconst selectLinkAssetsData = (state) => state?.linkAssets || initialState;\r\n\r\nconst makeSelectLinkAssets = () =>\r\n createSelector(\r\n selectLinkAssetsData,\r\n ({ linkAssetsState }) => linkAssetsState\r\n );\r\n\r\nconst makeSelectGridAssets = () =>\r\n createSelector(selectLinkAssetsData, ({ assetsGrid }) => assetsGrid);\r\n\r\nexport { makeSelectLinkAssets, makeSelectGridAssets };\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { AgGridReact, AgGridColumn } from 'ag-grid-react';\r\nimport { LicenseManager } from 'ag-grid-enterprise';\r\nimport 'ag-grid-enterprise';\r\nimport 'ag-grid-community/dist/styles/ag-grid.css';\r\nimport 'ag-grid-community/dist/styles/ag-theme-alpine.css';\r\n\r\nLicenseManager.setLicenseKey(\r\n 'Using_this_AG_Grid_Enterprise_key_( AG-040843 )_in_excess_of_the_licence_granted_is_not_permitted___Please_report_misuse_to_( legal@ag-grid.com )___For_help_with_changing_this_key_please_contact_( info@ag-grid.com )___( Global Vertical Innovations, LLC )_is_granted_a_( Multiple Applications )_Developer_License_for_( 1 ))_Front-End_JavaScript_developer___All_Front-End_JavaScript_developers_need_to_be_licensed_in_addition_to_the_ones_working_with_AG_Grid_Enterprise___This_key_has_not_been_granted_a_Deployment_License_Add-on___This_key_works_with_AG_Grid_Enterprise_versions_released_before_( 11 May 2024 )____[v2]_MTcxNTM4MjAwMDAwMA==d035e6c32ae72202e23beccd712ab105'\r\n);\r\n\r\nconst getAgGridProps = (rowData = []) => {\r\n return {\r\n defaultColDef: {\r\n enableRowGroup: false,\r\n enablePivot: false,\r\n enableValue: false,\r\n width: 100,\r\n sortable: false,\r\n resizable: false,\r\n filter: false,\r\n },\r\n headerHeight: 32,\r\n rowHeight: 32,\r\n // rowSelection: 'multiple',\r\n // suppressRowClickSelection: true,\r\n rowData,\r\n pivotPanelShow: 'never',\r\n\r\n // onRowSelected: (row) => console.log(row),\r\n\r\n // style color row\r\n rowClassRules: {\r\n 'new-row': ({ data }) => data?.state === 'Added',\r\n 'old-row': ({ data }) => !data?.state !== 'Added',\r\n },\r\n };\r\n};\r\n\r\nconst GridLinkAssets = ({ columns, rowData, dragOver = false }) => {\r\n return (\r\n
\r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nGridLinkAssets.prototype = {\r\n columns: PropTypes.array,\r\n rowData: PropTypes.array,\r\n dragOver: PropTypes.bool,\r\n};\r\n\r\nexport default GridLinkAssets;\r\n","import React from 'react';\r\nimport { Card, Avatar, Row, Typography, Col, Tooltip } from 'antd';\r\nimport { ShareAltOutlined } from '@ant-design/icons';\r\n\r\nimport { Draggable } from 'react-beautiful-dnd';\r\n\r\nconst ItemLinkAsset = ({ item }) => {\r\n return (\r\n \r\n {(provided, snapshot) => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {item?.assetName?.substring(0, 11)}\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default ItemLinkAsset;\r\n","import React from 'react';\r\n\r\nimport { message, Spin, Typography } from 'antd';\r\nimport { CloseCircleOutlined, InfoCircleOutlined } from '@ant-design/icons';\r\n\r\nexport const messageAddSameAsset = (setStatusDragDrop, content) => {\r\n message.info({\r\n content: content,\r\n duration: 1.5,\r\n style: {\r\n fontSize: 16,\r\n },\r\n });\r\n setStatusDragDrop({ isExistAsset: false });\r\n};\r\n\r\nexport const messageSelfAsset = (setStatusDragDrop, content) => {\r\n message.info({\r\n content: content,\r\n duration: 1.5,\r\n style: {\r\n fontSize: 16,\r\n },\r\n });\r\n setStatusDragDrop({ isSelfAsset: false });\r\n};\r\n\r\nexport const messageSuccessUpdate = (content) => {\r\n message.success(content);\r\n};\r\n\r\nexport const DeleteAssetGrid = ({ data, handleDeleteAssetGrid, nameGrid }) => {\r\n return (\r\n handleDeleteAssetGrid(data, nameGrid)}\r\n />\r\n );\r\n};\r\n\r\nexport const Loading = ({ className, size = 'default' }) => {\r\n return (\r\n
\r\n \r\n
\r\n );\r\n};\r\n\r\nexport const NotFound = () => {\r\n return (\r\n
\r\n
\r\n \r\n
\r\n \r\n Not Found\r\n \r\n
\r\n );\r\n};\r\n","import moment from 'moment';\r\nimport * as typesAsset from './controller/constants';\r\n\r\nimport * as actionsLinkAssets from './controller/actions';\r\n\r\nfunction dateFormatter(params) {\r\n return moment(params.value).format('MM/DD/YYYY');\r\n}\r\n\r\nconst columnFields = [\r\n {\r\n key: '0',\r\n field: 'assetName',\r\n width: 160,\r\n // checkboxSelection: true,\r\n // headerCheckboxSelection: true,\r\n menuTabs: [],\r\n },\r\n { key: '1', field: 'fileType', width: 110, menuTabs: [] },\r\n {\r\n key: '2',\r\n field: 'dateAssigned',\r\n cellRendererFramework: dateFormatter,\r\n width: 140,\r\n menuTabs: [],\r\n },\r\n];\r\n\r\n// Order item after dragdrop\r\nconst reorder = (assets, source, destination) => {\r\n const startIndex = assets.findIndex((item) => item.id === source.index);\r\n const endIndex = assets.findIndex((item) => item.id === destination.index);\r\n\r\n const result = Array.from(assets);\r\n const [removedAsset] = result.splice(startIndex, 1);\r\n result.splice(endIndex, 0, removedAsset);\r\n\r\n return result;\r\n};\r\n\r\nconst handleDragEnd = ({\r\n dispatch,\r\n setStatusDragDrop,\r\n assetsSearch,\r\n idAsset,\r\n assetsGridState,\r\n ...props\r\n}) => {\r\n const { destination, source } = props;\r\n\r\n // parentGridAssets: This is a grid assets contain the selected asset\r\n // childGridAssets: This is a grid assets inside the selected asset\r\n const { parentGridAssets, childGridAssets } = assetsGridState;\r\n\r\n if (!destination) return;\r\n\r\n if (destination.index === source.index) return;\r\n\r\n // Dragdrop same line\r\n if (destination.droppableId === source.droppableId) {\r\n const assetsAfterDrop = reorder(assetsSearch, source, destination);\r\n\r\n dispatch({\r\n type: typesAsset.DRAG_DROP_ASSETS,\r\n payload: {\r\n assets: assetsAfterDrop,\r\n },\r\n });\r\n }\r\n\r\n // Dragdrop asset to two grids\r\n else {\r\n // Table grid parent\r\n if (destination.droppableId === 'droppable-grid-parent') {\r\n const existingAssetIndex = parentGridAssets.findIndex(\r\n (asset) => asset.assetId === source.index\r\n );\r\n\r\n if (idAsset === source.index) {\r\n setStatusDragDrop({ isSelfAsset: true });\r\n return;\r\n }\r\n\r\n if (existingAssetIndex !== -1) {\r\n setStatusDragDrop({ isExistAsset: true });\r\n return;\r\n }\r\n\r\n const { assetName, id, assetType } = assetsSearch.find(\r\n (asset) => asset.id === source.index\r\n );\r\n\r\n // Append fileType to commit with field in AgGrid for rendering.\r\n const movedAsset = {\r\n id: 0, // 0: addition\r\n assetId: id,\r\n assetName: assetName,\r\n fileType: assetType,\r\n associationType: 1, // 1: Parent grid\r\n state: 'Added',\r\n };\r\n\r\n const params = {\r\n id: idAsset,\r\n assetAssociation: [movedAsset],\r\n };\r\n\r\n dispatch(actionsLinkAssets.updateLinkAsset(params));\r\n\r\n dispatch({\r\n type: typesAsset.MOVE_TO_PARENT_GRID,\r\n payload: { movedAsset },\r\n });\r\n }\r\n\r\n // Table grid child\r\n if (destination.droppableId === 'droppable-grid-child') {\r\n const existingAssetIndex = childGridAssets.findIndex(\r\n (asset) => asset.assetId === source.index\r\n );\r\n\r\n if (idAsset === source.index) {\r\n setStatusDragDrop({ isSelfAsset: true });\r\n return;\r\n }\r\n\r\n if (existingAssetIndex !== -1) {\r\n setStatusDragDrop({ isExistAsset: true });\r\n return;\r\n }\r\n\r\n const { assetName, id, assetType } = assetsSearch.find(\r\n (asset) => asset.id === source.index\r\n );\r\n\r\n // Append fileType to commit with field in AgGrid for rendering.\r\n const movedAsset = {\r\n id: 0, // 0: addition\r\n assetId: id,\r\n assetName: assetName,\r\n fileType: assetType,\r\n associationType: 2, // 2: Child grid\r\n state: 'Added',\r\n };\r\n\r\n const params = {\r\n id: idAsset,\r\n assetAssociation: [movedAsset],\r\n };\r\n\r\n dispatch(actionsLinkAssets.updateLinkAsset(params));\r\n\r\n dispatch({\r\n type: typesAsset.MOVE_TO_CHILD_GRID,\r\n payload: { movedAsset },\r\n });\r\n }\r\n }\r\n};\r\n\r\nexport { dateFormatter, reorder, handleDragEnd, columnFields };\r\n","import React, { useState, useEffect, useReducer, useMemo } from 'react';\r\nimport { Row, Input, Typography, Pagination, Button, Col, Tooltip } from 'antd';\r\nimport { DragDropContext, Droppable } from 'react-beautiful-dnd';\r\nimport { QuestionCircleTwoTone, ArrowLeftOutlined } from '@ant-design/icons';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\n\r\nimport { injectIntl, FormattedMessage } from 'react-intl';\r\nimport Messages from 'i18n/messages/branded-assets-products';\r\n\r\nimport { RIBBON_VIEW } from 'static/Constants';\r\nimport * as ribbonSelector from '@redux/ribbon/selectors';\r\nimport * as actionsLinkAssets from './controller/actions';\r\nimport * as selectorsLinkAssets from './controller/selectors';\r\nimport gridSelector from 'common/components/grid-view/controllers/selectors';\r\nimport * as assetFullViewSelector from 'pages/asset-full-view/controllers/selectors';\r\nimport * as actionsAsset from 'pages/home/ribbon/asset-full/controllers/actions';\r\n\r\nimport { dialogFunction } from 'common/components/index';\r\nimport GridLinkAssets from './GridLinkAssets';\r\nimport ItemLinkAsset from './ItemLinkAsset';\r\nimport {\r\n messageAddSameAsset,\r\n messageSuccessUpdate,\r\n messageSelfAsset,\r\n DeleteAssetGrid,\r\n Loading,\r\n NotFound,\r\n} from './Helper';\r\nimport { handleDragEnd, columnFields } from './utils';\r\n\r\nimport './LinkAssets.less';\r\n\r\nconst { Search } = Input;\r\nconst { Text, Title } = Typography;\r\n\r\nconst LinkAssets = ({ intl }) => {\r\n const dispatch = useDispatch();\r\n\r\n const { status, assetsSearch, pageNumber, pageSize, totalItems, error } =\r\n useSelector(selectorsLinkAssets.makeSelectLinkAssets());\r\n\r\n const i18nMessage = useMemo(\r\n () => [\r\n {\r\n message: intl.formatMessage({\r\n id: 'Taco.asset.linkAsset.messageSameAsset',\r\n }),\r\n },\r\n {\r\n message: intl.formatMessage({\r\n id: 'Taco.asset.linkAsset.messageSelfAsset',\r\n }),\r\n },\r\n {\r\n message: intl.formatMessage({\r\n id: 'Taco.asset.linkAsset.messageDeleteAssetGrid',\r\n }),\r\n },\r\n {\r\n message: intl.formatMessage({\r\n id: 'Taco.asset.linkAsset.updateMessage',\r\n }),\r\n },\r\n ],\r\n [intl]\r\n );\r\n\r\n const assetsGridState = useSelector(\r\n selectorsLinkAssets.makeSelectGridAssets()\r\n );\r\n const {\r\n status: statusGrid,\r\n error: errorGrid,\r\n statusUpdate,\r\n parentGridAssets,\r\n childGridAssets,\r\n additionParentAssets,\r\n additionChildAssets,\r\n deletedParentAssets,\r\n deletedChildAssets,\r\n } = assetsGridState;\r\n\r\n const selectedAsset = useSelector(\r\n gridSelector.makeSelectItemCurrentSelection()\r\n );\r\n const view = useSelector(ribbonSelector.selectRibbon());\r\n const digitalAsset = useSelector(assetFullViewSelector.assetDataLoading());\r\n\r\n const idAsset =\r\n view === RIBBON_VIEW.ASSET_FULL_VIEW.NAME\r\n ? digitalAsset?.id\r\n : selectedAsset?.id;\r\n\r\n const [valueSearch, setValueSearch] = useState('');\r\n const [statusDragDrop, setStatusDragDrop] = useReducer(\r\n (state, action) => ({ ...state, ...action }),\r\n { isExistAsset: false, isSelfAsset: false }\r\n );\r\n const { isExistAsset, isSelfAsset } = statusDragDrop;\r\n\r\n useEffect(() => {\r\n if (isExistAsset) {\r\n messageAddSameAsset(setStatusDragDrop, i18nMessage[0].message);\r\n }\r\n\r\n if (isSelfAsset) {\r\n messageSelfAsset(setStatusDragDrop, i18nMessage[1].message);\r\n }\r\n\r\n return;\r\n }, [i18nMessage, isExistAsset, isSelfAsset]);\r\n\r\n useEffect(() => {\r\n if (statusUpdate === 'success') {\r\n messageSuccessUpdate(i18nMessage[3].message);\r\n dispatch(actionsLinkAssets.fetchAssetsGrid(idAsset));\r\n }\r\n\r\n return;\r\n }, [dispatch, i18nMessage, idAsset, statusUpdate]);\r\n\r\n useEffect(() => {\r\n if (!idAsset) return;\r\n\r\n dispatch(actionsLinkAssets.fetchAssetsGrid(idAsset));\r\n }, [dispatch, idAsset]);\r\n\r\n const handleDeleteAssetGrid = (data, nameGrid) => {\r\n const associationType = nameGrid === 'parent' ? 1 : 2;\r\n\r\n const params = {\r\n id: idAsset,\r\n assetAssociation: [{ ...data, associationType, state: 'Deleted' }],\r\n };\r\n\r\n dialogFunction({\r\n type: 'warn',\r\n content: i18nMessage[2].message,\r\n onOk: () => {\r\n dispatch(actionsLinkAssets.updateLinkAsset(params));\r\n },\r\n });\r\n };\r\n\r\n // Add col in parent grid for deleting assets\r\n const colDeleteGridParent = {\r\n key: 3,\r\n field: '',\r\n flex: 1,\r\n menuTabs: [],\r\n\r\n cellRendererFramework: ({ data }) => (\r\n \r\n ),\r\n };\r\n\r\n // Add col in child grid for deleting assets\r\n const colDeleteGridChild = {\r\n key: 3,\r\n field: '',\r\n flex: 1,\r\n menuTabs: [],\r\n cellRendererFramework: ({ data }) => (\r\n \r\n ),\r\n };\r\n\r\n const handleSearchAssets = (_, event) => {\r\n if (!valueSearch) {\r\n event.preventDefault();\r\n } else {\r\n dispatch(\r\n actionsLinkAssets.searchItemsLinkAsset(\r\n pageSize,\r\n pageNumber,\r\n valueSearch\r\n )\r\n );\r\n }\r\n };\r\n\r\n const handleChangePagination = (page, _) => {\r\n dispatch(\r\n actionsLinkAssets.searchItemsLinkAsset(pageSize, page, valueSearch)\r\n );\r\n };\r\n\r\n return (\r\n {\r\n handleDragEnd({\r\n assetsSearch: assetsSearch,\r\n idAsset,\r\n assetsGridState: assetsGridState,\r\n dispatch,\r\n setStatusDragDrop,\r\n ...propsDragDrop,\r\n });\r\n }}\r\n >\r\n \r\n
\r\n }\r\n onClick={() => dispatch(actionsAsset.disableModeLinkAsset())}\r\n >\r\n Back to\r\n \r\n
\r\n
\r\n Search assets\r\n }\r\n color='#2db7f5'\r\n >\r\n \r\n \r\n
\r\n setValueSearch(event.target.value)}\r\n onSearch={handleSearchAssets}\r\n defaultValue={valueSearch}\r\n />\r\n
\r\n {status === 'idle' ? null : status === 'loading' ? (\r\n \r\n ) : status === 'success' ? (\r\n <>\r\n \r\n {(dropProvided) => (\r\n <>\r\n \r\n {assetsSearch.length === 0 ? (\r\n \r\n ) : (\r\n assetsSearch?.map((item) => (\r\n \r\n ))\r\n )}\r\n \r\n {assetsSearch?.length !== 0 ? (\r\n \r\n ) : null}\r\n \r\n )}\r\n \r\n \r\n ) : (\r\n {error} \r\n )}\r\n {statusGrid === 'idle' ? null : statusGrid === 'loading' ? (\r\n \r\n ) : statusGrid === 'success' ? (\r\n <>\r\n \r\n Contains\r\n \r\n \r\n {(dropProvided, snapshot) => (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n Total Rows: {parentGridAssets.length}\r\n \r\n \r\n \r\n Added Rows: {additionParentAssets.length}\r\n \r\n \r\n \r\n \r\n Deleted Rows: {deletedParentAssets.length}\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n Included In\r\n \r\n \r\n {(dropProvided, snapshot) => (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n Total Rows: {childGridAssets.length}\r\n \r\n \r\n Added Rows: {additionChildAssets.length}\r\n \r\n \r\n \r\n Deleted Rows: {deletedChildAssets.length}\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n ) : (\r\n {errorGrid} \r\n )}\r\n\r\n {statusUpdate === 'loading' ? (\r\n \r\n ) : null}\r\n \r\n );\r\n};\r\n\r\nexport default injectIntl(LinkAssets);\r\n","import * as types from './constants';\r\n\r\nexport function searchItemsLinkAsset(pageSize, pageNumber, searchText) {\r\n return {\r\n type: types.SEARCH_ITEMS_LINK_ASSETS,\r\n pageSize: pageSize,\r\n pageIndex: pageNumber,\r\n search: {\r\n searchText,\r\n },\r\n };\r\n}\r\n\r\nexport function searchItemsLinkAssetSuccess(assets, total) {\r\n return {\r\n type: types.SEARCH_ITEMS_LINK_ASSETS_SUCCESS,\r\n assets,\r\n total,\r\n };\r\n}\r\n\r\nexport function searchItemsLinkAssetFail(error) {\r\n return {\r\n type: types.SEARCH_ITEMS_LINK_ASSETS_FAIL,\r\n error,\r\n };\r\n}\r\n\r\nexport function fetchAssetsChangePagination(pageSize, pageNumber, search) {\r\n return {\r\n type: types.FETCH_ASSETS_CHANGE_PAGINATION,\r\n pageSize: pageSize,\r\n pageIndex: pageNumber,\r\n 'Search.SearchText': search,\r\n };\r\n}\r\n\r\nexport function fetchAssetsChangePaginationSuccess(assets, total) {\r\n return {\r\n type: types.FETCH_ASSETS_CHANGE_PAGINATION_SUCCESS,\r\n assets,\r\n total,\r\n };\r\n}\r\n\r\nexport function fetchAssetsChangePaginationFail(error) {\r\n return {\r\n type: types.SEARCH_ITEMS_LINK_ASSETS_FAIL,\r\n error,\r\n };\r\n}\r\n\r\nexport function fetchAssetsGrid(id) {\r\n return { type: types.FETCH_ASSETS_GRID, id };\r\n}\r\n\r\nexport function fetchAssetsGridSuccess(payload) {\r\n return { type: types.FETCH_ASSETS_GRID_SUCCESS, payload };\r\n}\r\n\r\nexport function fetchAssetsGridFail(error) {\r\n return { type: types.FETCH_ASSETS_GRID_ERROR, error };\r\n}\r\n\r\nexport function updateLinkAsset(params) {\r\n return { type: types.UPDATE_LINK_ASSET, payload: { params } };\r\n}\r\n\r\nexport function updateLinkAssetSuccess() {\r\n return { type: types.UPDATE_LINK_ASSET_SUCCESS };\r\n}\r\n\r\nexport function updateLinkAssetFail(error) {\r\n return { type: types.UPDATE_LINK_ASSET_FAIL, error };\r\n}\r\n\r\nexport function resetLinkAsset() {\r\n return { type: types.RESET_LINK_ASSET };\r\n}\r\n","export const SEARCH_ITEMS_LINK_ASSETS = 'SEARCH_ITEMS_LINK_ASSETS';\r\nexport const SEARCH_ITEMS_LINK_ASSETS_SUCCESS =\r\n 'SEARCH_ITEMS_LINK_ASSETS_SUCCESS';\r\nexport const SEARCH_ITEMS_LINK_ASSETS_FAIL = 'SEARCH_ITEMS_LINK_ASSETS_FAIL';\r\n\r\nexport const FETCH_ASSETS_CHANGE_PAGINATION = 'FETCH_ASSETS_CHANGE_PAGINATION';\r\nexport const FETCH_ASSETS_CHANGE_PAGINATION_SUCCESS =\r\n 'FETCH_ASSETS_CHANGE_PAGINATION_SUCCESS';\r\nexport const FETCH_ASSETS_CHANGE_PAGINATION_FAIL =\r\n 'FETCH_ASSETS_CHANGE_PAGINATION_FAIL';\r\n\r\nexport const FETCH_ASSETS_GRID = 'FETCH_ASSETS_GRID';\r\nexport const FETCH_ASSETS_GRID_SUCCESS = 'FETCH_ASSETS_GRID_SUCCESS';\r\nexport const FETCH_ASSETS_GRID_ERROR = 'FETCH_ASSETS_GRID_ERROR';\r\n\r\nexport const DRAG_DROP_ASSETS = 'DRAG_DROP_ASSETS';\r\nexport const MOVE_TO_PARENT_GRID = 'MOVE_TO_PARENT_GRID';\r\nexport const MOVE_TO_CHILD_GRID = 'MOVE_TO_CHILD_GRID';\r\nexport const DELETE_ASSET_IN_PARENT = 'DELETE_ASSET_IN_PARENT';\r\nexport const DELETE_ASSET_IN_CHILD = 'DELETE_ASSET_IN_CHILD';\r\n\r\nexport const UPDATE_LINK_ASSET = 'UPDATE_LINK_ASSET';\r\nexport const UPDATE_LINK_ASSET_SUCCESS = 'UPDATE_LINK_ASSET_SUCCESS';\r\nexport const UPDATE_LINK_ASSET_FAIL = 'UPDATE_LINK_ASSET_FAIL';\r\n\r\nexport const RESET_LINK_ASSET = 'RESET_LINK_ASSET';\r\n","import produce from 'immer';\r\nimport * as types from './constants';\r\n\r\nexport const initialState = {\r\n linkAssetsState: {\r\n status: 'idle',\r\n pageNumber: 1,\r\n pageSize: 4,\r\n assetsSearch: [],\r\n totalItems: 0,\r\n error: null,\r\n },\r\n assetsGrid: {\r\n status: 'idle',\r\n error: null,\r\n parentGridAssets: [],\r\n childGridAssets: [],\r\n statusUpdate: 'idle',\r\n errorUpdate: null,\r\n /*\r\n * This is the container hold assets that delete and addition in initial grid asset.\r\n * To know what asset in initial grid asset is change.\r\n */\r\n additionParentAssets: [],\r\n additionChildAssets: [],\r\n deletedParentAssets: [],\r\n deletedChildAssets: [],\r\n },\r\n};\r\n\r\n/* eslint-disable default-case, no-param-reassign */\r\nconst assetReducer = (state = initialState, action) =>\r\n produce(state, (draft) => {\r\n switch (action.type) {\r\n case types.SEARCH_ITEMS_LINK_ASSETS:\r\n case types.FETCH_ASSETS_CHANGE_PAGINATION:\r\n draft['linkAssetsState'].status = 'loading';\r\n draft['linkAssetsState'].pageNumber = action.pageIndex;\r\n draft['linkAssetsState'].pageSize = action.pageSize;\r\n draft['linkAssetsState'].assetsSearch = [];\r\n draft['assetsGrid'].statusUpdate = 'idle';\r\n break;\r\n\r\n case types.SEARCH_ITEMS_LINK_ASSETS_SUCCESS:\r\n case types.FETCH_ASSETS_CHANGE_PAGINATION_SUCCESS:\r\n draft['linkAssetsState'].status = 'success';\r\n draft['linkAssetsState'].assetsSearch = action.assets;\r\n draft['linkAssetsState'].totalItems = action.total;\r\n draft['linkAssetsState'].error = null;\r\n draft['assetsGrid'].statusUpdate = 'idle';\r\n break;\r\n\r\n case types.SEARCH_ITEMS_LINK_ASSETS_FAIL:\r\n case types.FETCH_ASSETS_CHANGE_PAGINATION_FAIL:\r\n draft['assetsGrid'].status = 'loading';\r\n draft['linkAssetsState'].status = 'error';\r\n draft['linkAssetsState'].error = action.error;\r\n draft['assetsGrid'].statusUpdate = 'idle';\r\n\r\n break;\r\n\r\n case types.FETCH_ASSETS_GRID:\r\n draft['assetsGrid'].statusUpdate = 'idle';\r\n break;\r\n\r\n case types.FETCH_ASSETS_GRID_SUCCESS:\r\n draft['assetsGrid'].status = 'success';\r\n draft['assetsGrid'].statusUpdate = 'idle';\r\n draft['assetsGrid'].parentGridAssets = action.payload.containViewModel;\r\n draft['assetsGrid'].childGridAssets =\r\n action.payload.includedInViewModel;\r\n draft['assetsGrid'].additionParentAssets = [];\r\n draft['assetsGrid'].additionChildAssets = [];\r\n draft['assetsGrid'].deletedParentAssets = [];\r\n draft['assetsGrid'].deletedChildAssets = [];\r\n\r\n break;\r\n\r\n case types.FETCH_ASSETS_GRID_ERROR:\r\n draft['assetsGrid'].status = 'error';\r\n draft['assetsGrid'].error = action.error;\r\n draft['assetsGrid'].additionParentAssets = [];\r\n draft['assetsGrid'].additionChildAssets = [];\r\n draft['assetsGrid'].deletedParentAssets = [];\r\n draft['assetsGrid'].deletedChildAssets = [];\r\n break;\r\n\r\n case types.DRAG_DROP_ASSETS:\r\n draft['linkAssetsState'].assetsSearch = action.payload.assets;\r\n break;\r\n\r\n case types.MOVE_TO_PARENT_GRID:\r\n draft['assetsGrid'].parentGridAssets.push(action.payload.movedAsset);\r\n draft['assetsGrid'].additionParentAssets.push(\r\n action.payload.movedAsset\r\n );\r\n break;\r\n\r\n case types.MOVE_TO_CHILD_GRID:\r\n draft['assetsGrid'].childGridAssets.push(action.payload.movedAsset);\r\n draft['assetsGrid'].additionChildAssets.push(action.payload.movedAsset);\r\n break;\r\n\r\n case types.DELETE_ASSET_IN_PARENT: {\r\n const index = draft['assetsGrid'].parentGridAssets.findIndex(\r\n (asset) => asset.assetId === action.payload.id\r\n );\r\n const indexAddition = draft[\r\n 'assetsGrid'\r\n ].additionParentAssets.findIndex(\r\n (asset) => asset.assetId === action.payload.id\r\n );\r\n let asset = draft['assetsGrid'].parentGridAssets.find(\r\n (asset) => asset.assetId === action.payload.id\r\n );\r\n asset = { ...asset, associationType: 1, state: 'Deleted' };\r\n\r\n // not find asset in additionAsset\r\n if (indexAddition === -1) {\r\n draft['assetsGrid'].deletedParentAssets.push(asset);\r\n }\r\n\r\n if (indexAddition !== -1) {\r\n draft['assetsGrid'].additionParentAssets.splice(indexAddition, 1);\r\n }\r\n\r\n draft['assetsGrid'].parentGridAssets.splice(index, 1);\r\n break;\r\n }\r\n\r\n case types.DELETE_ASSET_IN_CHILD: {\r\n const index = draft['assetsGrid'].childGridAssets.findIndex(\r\n (asset) => asset.assetId === action.payload.id\r\n );\r\n const indexAddition = draft['assetsGrid'].additionChildAssets.findIndex(\r\n (asset) => asset.assetId === action.payload.id\r\n );\r\n let asset = draft['assetsGrid'].childGridAssets.find(\r\n (asset) => asset.assetId === action.payload.id\r\n );\r\n asset = { ...asset, associationType: 2, state: 'Deleted' };\r\n\r\n if (indexAddition === -1) {\r\n draft['assetsGrid'].deletedChildAssets.push(asset);\r\n }\r\n\r\n if (indexAddition !== -1) {\r\n draft['assetsGrid'].additionChildAssets.splice(indexAddition, 1);\r\n }\r\n\r\n draft['assetsGrid'].childGridAssets.splice(index, 1);\r\n break;\r\n }\r\n\r\n case types.UPDATE_LINK_ASSET:\r\n // draft['linkAssetsState'].status = 'success';\r\n draft['assetsGrid'].statusUpdate = 'loading';\r\n break;\r\n\r\n case types.UPDATE_LINK_ASSET_SUCCESS:\r\n draft['assetsGrid'].statusUpdate = 'success';\r\n draft['assetsGrid'].additionParentAssets = [];\r\n draft['assetsGrid'].additionChildAssets = [];\r\n draft['assetsGrid'].deletedParentAssets = [];\r\n draft['assetsGrid'].deletedChildAssets = [];\r\n break;\r\n\r\n case types.UPDATE_LINK_ASSET_FAIL:\r\n draft['assetsGrid'].statusUpdate = 'error';\r\n draft['assetsGrid'].errorUpdate = action.error;\r\n draft['assetsGrid'].additionParentAssets = [];\r\n draft['assetsGrid'].additionChildAssets = [];\r\n draft['assetsGrid'].deletedParentAssets = [];\r\n draft['assetsGrid'].deletedChildAssets = [];\r\n break;\r\n\r\n case types.RESET_LINK_ASSET:\r\n draft['linkAssetsState'].assetsSearch = [];\r\n draft['linkAssetsState'].status = 'idle';\r\n draft['assetsGrid'].statusUpdate = 'idle';\r\n draft['assetsGrid'].additionParentAssets = [];\r\n draft['assetsGrid'].additionChildAssets = [];\r\n draft['assetsGrid'].deletedParentAssets = [];\r\n draft['assetsGrid'].deletedChildAssets = [];\r\n break;\r\n }\r\n });\r\n\r\nexport default assetReducer;\r\n","import { put, call, takeLatest, all } from 'redux-saga/effects';\r\n\r\nimport * as types from './constants';\r\nimport * as actions from './actions';\r\n\r\nimport * as services from 'services/assetProduct';\r\n\r\nexport function* searchItemsLinkAssets(payload) {\r\n try {\r\n const params = {\r\n type: payload.type,\r\n PageSize: payload.pageSize,\r\n PageIndex: payload.pageIndex,\r\n search: payload.search,\r\n };\r\n\r\n const response = yield call(services.getAssetList, params);\r\n yield put(\r\n actions.searchItemsLinkAssetSuccess(\r\n response.data.gridData,\r\n response.data.paging.totalRecord\r\n )\r\n );\r\n } catch (error) {\r\n yield put(actions.searchItemsLinkAssetFail(error));\r\n }\r\n}\r\n\r\nexport function* fetchAssetsGrid(payload) {\r\n try {\r\n const response = yield call(services.getAssetAssociation, payload.id);\r\n if (response.isSuccess) {\r\n yield put(actions.fetchAssetsGridSuccess(response.data));\r\n } else {\r\n yield put(actions.fetchAssetsGridFail(response.message));\r\n }\r\n } catch (error) {\r\n yield put(actions.fetchAssetsGridFail(error));\r\n }\r\n}\r\n\r\nexport function* updateLinkAsset(action) {\r\n try {\r\n const response = yield call(\r\n services.updateLinkAsset,\r\n action.payload.params\r\n );\r\n if (response.isSuccess) {\r\n yield put(actions.updateLinkAssetSuccess());\r\n } else {\r\n yield put(actions.updateLinkAssetFail(response.message));\r\n }\r\n } catch (error) {\r\n yield put(actions.updateLinkAssetFail(error));\r\n }\r\n}\r\n\r\nfunction* watchAll() {\r\n yield all([\r\n takeLatest(types.SEARCH_ITEMS_LINK_ASSETS, searchItemsLinkAssets),\r\n takeLatest(types.FETCH_ASSETS_GRID, fetchAssetsGrid),\r\n takeLatest(types.UPDATE_LINK_ASSET, updateLinkAsset),\r\n ]);\r\n}\r\n\r\nexport default watchAll;\r\n","import * as types from './constants';\r\n\r\nexport const showLoading = () => {\r\n return {\r\n type: types.SHOW_LOADING,\r\n };\r\n};\r\n\r\nexport function getDigitalAssetList(\r\n pageSize,\r\n pageNumber,\r\n search,\r\n primaryFieldsOnly,\r\n filters,\r\n mediaType,\r\n isFavoriteRoute,\r\n advancedSearchContainer,\r\n searchCategory,\r\n fromDate\r\n) {\r\n return {\r\n type: types.GET_DIGITAL_ASSET_LIST,\r\n pageSize: pageSize,\r\n pageIndex: pageNumber,\r\n search,\r\n primaryFieldsOnly,\r\n filters,\r\n mediaType,\r\n isFavoriteRoute,\r\n advancedSearchContainer,\r\n searchCategory,\r\n fromDate,\r\n };\r\n}\r\n\r\nexport function getDigitalAssetForMemberList({\r\n pageSize,\r\n pageNumber,\r\n search,\r\n primaryFieldsOnly,\r\n filters,\r\n mediaType,\r\n isFavoriteRoute,\r\n advancedSearchContainer,\r\n searchCategory,\r\n fromDate,\r\n}) {\r\n return {\r\n type: types.GET_DIGITAL_ASSET_LIST,\r\n pageSize: pageSize,\r\n pageIndex: pageNumber,\r\n search,\r\n primaryFieldsOnly,\r\n filters,\r\n mediaType,\r\n isFavoriteRoute,\r\n advancedSearchContainer,\r\n searchCategory,\r\n fromDate,\r\n };\r\n}\r\n\r\nexport function getDigitalAssetListSuccess(assets, total) {\r\n return {\r\n type: types.GET_DIGITAL_ASSET_LIST_SUCCESS,\r\n assets,\r\n total,\r\n };\r\n}\r\n\r\nexport function getDigitalAssetListError(error) {\r\n return {\r\n type: types.GET_DIGITAL_ASSET_LIST_ERROR,\r\n error,\r\n };\r\n}\r\n\r\nexport function gridDigitalAssetColumnInfo(gridName) {\r\n return {\r\n type: types.DIGITAL_ASSET_GRID_COLUMN_INFO,\r\n gridName,\r\n };\r\n}\r\n\r\nexport function gridDigitalAssetColumnInfoSuccess(columns) {\r\n return {\r\n type: types.DIGITAL_ASSET_GRID_COLUMN_INFO_SUCCESS,\r\n columns,\r\n };\r\n}\r\n\r\nexport function gridDigitalAssetColumnInfoError(error) {\r\n return {\r\n type: types.DIGITAL_ASSET_GRID_COLUMN_INFO_ERROR,\r\n };\r\n}\r\n\r\nexport function getDigitalAssetShortDetail(id) {\r\n return {\r\n type: types.GET_DIGITAL_ASSET_SHORT_DETAIL,\r\n id,\r\n };\r\n}\r\n\r\nexport function getDigitalAssetShortDetailSuccess(data) {\r\n return {\r\n type: types.GET_DIGITAL_ASSET_SHORT_DETAIL_SUCCESS,\r\n data,\r\n };\r\n}\r\n\r\nexport function getDigitalAssetShortDetailError(error) {\r\n return {\r\n type: types.GET_DIGITAL_ASSET_SHORT_DETAIL_ERROR,\r\n error,\r\n };\r\n}\r\n\r\nexport const updateCacheImage = (newCache) => {\r\n return {\r\n type: types.UPDATE_CACHE_IMAGE,\r\n payload: newCache,\r\n };\r\n};\r\n\r\nexport const deleteAssets = (assetIds) => {\r\n return {\r\n type: types.DELETE_ASSETS,\r\n payload: {\r\n assetIds,\r\n },\r\n };\r\n};\r\n\r\nexport const deleteAssetsSuccess = () => {\r\n return {\r\n type: types.DELETED_ASSETS_SUCCESS,\r\n };\r\n};\r\n\r\nexport const deleteAssetsError = (message) => {\r\n return {\r\n type: types.DELETED_ASSETS_ERROR,\r\n payload: {\r\n error: message,\r\n },\r\n };\r\n};\r\n\r\nexport const resetDeleteAssets = () => {\r\n return { type: types.RESET_DELETE_ASSETS };\r\n};\r\n\r\nexport function updateAssetTypePane(params) {\r\n return {\r\n type: types.UPDATE_ASSET_TYPE_PANE,\r\n params,\r\n };\r\n}\r\n\r\nexport function updateAssetTypePaneSuccess() {\r\n return {\r\n type: types.UPDATE_ASSET_TYPE_PANE_SUCCESS,\r\n };\r\n}\r\n\r\nexport function updateAssetTypePaneError(error) {\r\n return {\r\n type: types.UPDATE_ASSET_TYPE_PANE_ERROR,\r\n error,\r\n };\r\n}\r\n\r\n// Assets for member\r\nexport function getAssetsForMember(params) {\r\n return {\r\n type: types.GET_ASSETS_FOR_MEMBER,\r\n params,\r\n };\r\n}\r\n\r\nexport function getAssetsForMemberSuccess(data) {\r\n return {\r\n type: types.GET_ASSETS_FOR_MEMBER_SUCCESS,\r\n data,\r\n };\r\n}\r\n\r\nexport function getAssetsForMemberError(error) {\r\n return {\r\n type: types.GET_ASSETS_FOR_MEMBER_ERROR,\r\n error,\r\n };\r\n}\r\n\r\nexport function getColumnsAssetsForMember(gridName) {\r\n return {\r\n type: types.GET_COLUMNS_ASSETS_FOR_MEMBER,\r\n gridName,\r\n };\r\n}\r\n\r\nexport function getColumnsAssetsForMemberSuccess(columns) {\r\n return {\r\n type: types.GET_COLUMNS_ASSETS_FOR_MEMBER_SUCCESS,\r\n columns,\r\n };\r\n}\r\n\r\nexport function getColumnsAssetsForMemberError(error) {\r\n return {\r\n type: types.GET_COLUMNS_ASSETS_FOR_MEMBER_ERROR,\r\n error,\r\n };\r\n}\r\n\r\nexport function saveIdMember(id) {\r\n return {\r\n type: types.SAVE_ID_MEMBER,\r\n id,\r\n };\r\n}\r\n\r\nexport const toggleAssetNew = (status) => ({\r\n type: types.TOGGLE_ASSET_NEW,\r\n isDisplayAssetNew: status,\r\n});\r\n\r\nexport const cacheFromDate = (fromDate) => ({\r\n type: types.CACHE_ASSET_FROM_DATE,\r\n fromDate,\r\n});\r\n\r\nexport const updateLatestGetNewAsset = () => ({\r\n type: types.UPDATE_LATEST_GET_NEW_ASSET,\r\n});\r\n\r\nexport const updateLatestGetUnmatchAsset = () => ({\r\n type: types.UPDATE_LATEST_GET_UNMATCH_ASSET,\r\n});\r\n\r\nexport const toggleAssetUnmatch = (status) => ({\r\n type: types.TOGGLE_ASSET_UNMATCH,\r\n isDisplayAssetNew: status,\r\n});\r\n","export const SHOW_LOADING = 'SHOW_LOADING';\r\nexport const GET_DIGITAL_ASSET_LIST = 'GET_DIGITAL_ASSET_LIST';\r\nexport const GET_DIGITAL_ASSET_FOR_MEMBER_LIST =\r\n 'GET_DIGITAL_ASSET_FOR_MEMBER_LIST';\r\nexport const GET_DIGITAL_ASSET_LIST_SUCCESS = 'GET_DIGITAL_ASSET_LIST_SUCCESS';\r\nexport const GET_DIGITAL_ASSET_LIST_ERROR = 'GET_DIGITAL_ASSET_LIST_ERROR';\r\n\r\nexport const DIGITAL_ASSET_GRID_COLUMN_INFO = 'DIGITAL_ASSET_GRID_COLUMN_INFO';\r\nexport const DIGITAL_ASSET_GRID_COLUMN_INFO_SUCCESS =\r\n 'DIGITAL_ASSET_GRID_COLUMN_INFO_SUCCESS';\r\nexport const DIGITAL_ASSET_GRID_COLUMN_INFO_ERROR =\r\n 'DIGITAL_ASSET_GRID_COLUMN_INFO_ERROR';\r\nexport const GET_DIGITAL_ASSET_SHORT_DETAIL = 'GET_DIGITAL_ASSET_SHORT_DETAIL';\r\nexport const GET_DIGITAL_ASSET_SHORT_DETAIL_SUCCESS =\r\n 'GET_DIGITAL_ASSET_SHORT_DETAIL_SUCCESS';\r\nexport const GET_DIGITAL_ASSET_SHORT_DETAIL_ERROR =\r\n 'GET_DIGITAL_ASSET_SHORT_DETAIL_ERROR';\r\n\r\nexport const RELOAD_PAGE = 'RELOAD_PAGE';\r\nexport const UPDATE_CACHE_IMAGE = 'UPDATE_CACHE_IMAGE';\r\n\r\nexport const DELETE_ASSETS = 'DELETE_ASSETS';\r\nexport const DELETED_ASSETS_SUCCESS = 'DELETED_ASSETS_SUCCESS';\r\nexport const DELETED_ASSETS_ERROR = 'DELETED_ASSETS_ERROR';\r\nexport const RESET_DELETE_ASSETS = 'RESET_DELETE_ASSETS';\r\nexport const UPDATE_ASSET_TYPE_PANE = 'UPDATE_ASSET_TYPE_PANE';\r\nexport const UPDATE_ASSET_TYPE_PANE_SUCCESS = 'UPDATE_ASSET_TYPE_PANE_SUCCESS';\r\nexport const UPDATE_ASSET_TYPE_PANE_ERROR = 'UPDATE_ASSET_TYPE_PANE_ERROR';\r\n\r\n// Assets for members\r\nexport const GET_ASSETS_FOR_MEMBER = 'GET_ASSETS_FOR_MEMBER';\r\nexport const GET_ASSETS_FOR_MEMBER_SUCCESS = 'GET_ASSETS_FOR_MEMBER_SUCCESS';\r\nexport const GET_ASSETS_FOR_MEMBER_ERROR = 'GET_ASSETS_FOR_MEMBER_ERROR';\r\n\r\nexport const GET_COLUMNS_ASSETS_FOR_MEMBER = 'GET_COLUMNS_ASSETS_FOR_MEMBER';\r\nexport const GET_COLUMNS_ASSETS_FOR_MEMBER_SUCCESS =\r\n 'GET_COLUMNS_ASSETS_FOR_MEMBER_SUCCESS';\r\nexport const GET_COLUMNS_ASSETS_FOR_MEMBER_ERROR =\r\n 'GET_COLUMNS_ASSETS_FOR_MEMBER_ERROR';\r\n\r\nexport const SAVE_ID_MEMBER = 'SAVE_ID_MEMBER';\r\nexport const TOGGLE_ASSET_NEW = 'TOGGLE_ASSET_NEW';\r\nexport const CACHE_ASSET_FROM_DATE = 'CACHE_ASSET_FROM_DATE';\r\nexport const UPDATE_LATEST_GET_NEW_ASSET = 'UPDATE_LATEST_GET_NEW_ASSET';\r\nexport const UPDATE_LATEST_GET_UNMATCH_ASSET =\r\n 'UPDATE_LATEST_GET_UNMATCH_ASSET';\r\nexport const TOGGLE_ASSET_UNMATCH = 'TOGGLE_ASSET_UNMATCH';\r\n","import produce from 'immer';\r\nimport * as types from './constants';\r\n\r\n// initial state\r\nexport const initialState = {\r\n loading: false,\r\n error: false,\r\n assets: [],\r\n total: 0,\r\n pageSize: 20,\r\n pageNumber: 1,\r\n search: '',\r\n columns: [],\r\n gridName: '',\r\n assetData: null,\r\n loadingDetail: false,\r\n statusDelete: 'idle',\r\n cachedImagesVersion: {},\r\n\r\n assetsForMember: {\r\n loading: false,\r\n pageIndex: 1,\r\n pageSize: 20,\r\n totalItems: 0,\r\n data: [],\r\n columns: [],\r\n memberId: null,\r\n },\r\n editTypeLoading: false,\r\n isDisplayAssetNew: false,\r\n cachedFromDate: null,\r\n};\r\n\r\n/* eslint-disable default-case, no-param-reassign */\r\nconst assetReducer = (state = initialState, action) =>\r\n produce(state, (draft) => {\r\n switch (action.type) {\r\n case types.SHOW_LOADING:\r\n draft.loading = true;\r\n break;\r\n case types.GET_DIGITAL_ASSET_LIST:\r\n draft.loading = true;\r\n draft.error = false;\r\n draft.pageSize = action.pageSize;\r\n draft.pageNumber = action.pageIndex;\r\n draft.search = action.search;\r\n break;\r\n case types.GET_DIGITAL_ASSET_LIST_SUCCESS:\r\n draft.loading = false;\r\n draft.assets = action.assets;\r\n draft.total = action.total;\r\n draft.statusDelete = 'idle';\r\n break;\r\n case types.GET_DIGITAL_ASSET_LIST_ERROR:\r\n draft.loading = false;\r\n draft.total = 0;\r\n draft.assets = [];\r\n draft.error = action.error;\r\n draft.statusDelete = 'idle';\r\n break;\r\n case types.DIGITAL_ASSET_GRID_COLUMN_INFO:\r\n draft.loading = true;\r\n draft.error = false;\r\n draft.gridName = action.gridName;\r\n break;\r\n case types.DIGITAL_ASSET_GRID_COLUMN_INFO_SUCCESS:\r\n draft.loading = false;\r\n draft.columns = action.columns;\r\n break;\r\n case types.DIGITAL_ASSET_GRID_COLUMN_INFO_ERROR:\r\n draft.loading = false;\r\n break;\r\n case types.GET_DIGITAL_ASSET_SHORT_DETAIL:\r\n draft.loadingDetail = true;\r\n draft.error = false;\r\n break;\r\n case types.GET_DIGITAL_ASSET_SHORT_DETAIL_SUCCESS:\r\n draft.loadingDetail = false;\r\n draft.assetData = action.data;\r\n break;\r\n case types.GET_DIGITAL_ASSET_SHORT_DETAIL_ERROR:\r\n draft.loadingDetail = false;\r\n draft.error = action.error;\r\n break;\r\n case types.UPDATE_CACHE_IMAGE:\r\n draft.cachedImagesVersion = action.payload;\r\n break;\r\n case types.DELETE_ASSETS:\r\n draft.statusDelete = 'loading';\r\n break;\r\n case types.DELETED_ASSETS_SUCCESS:\r\n draft.statusDelete = 'success';\r\n draft.assetData = null;\r\n break;\r\n case types.DELETED_ASSETS_ERROR:\r\n draft.statusDelete = 'error';\r\n break;\r\n case types.RESET_DELETE_ASSETS:\r\n draft.statusDelete = 'idle';\r\n break;\r\n\r\n case types.GET_ASSETS_FOR_MEMBER:\r\n draft.assetsForMember['loading'] = true;\r\n break;\r\n\r\n case types.GET_ASSETS_FOR_MEMBER_SUCCESS:\r\n draft.assetsForMember['loading'] = false;\r\n draft.assetsForMember['data'] = action.data.gridData;\r\n draft.assetsForMember['pageIndex'] =\r\n action.data.paging.currentPageIndex;\r\n draft.assetsForMember['pageSize'] = action.data.paging.currentPageSize;\r\n draft.assetsForMember['totalItems'] = action.data.paging.totalRecord;\r\n break;\r\n\r\n case types.GET_COLUMNS_ASSETS_FOR_MEMBER_SUCCESS:\r\n draft.assetsForMember['columns'] = action.columns;\r\n break;\r\n\r\n case types.SAVE_ID_MEMBER:\r\n draft.assetsForMember['memberId'] = action.id;\r\n break;\r\n case types.UPDATE_ASSET_TYPE_PANE:\r\n draft.editTypeLoading = true;\r\n break;\r\n case types.UPDATE_ASSET_TYPE_PANE_SUCCESS:\r\n draft.editTypeLoading = false;\r\n break;\r\n case types.UPDATE_ASSET_TYPE_PANE_ERROR:\r\n draft.editTypeLoading = false;\r\n break;\r\n case types.TOGGLE_ASSET_NEW:\r\n draft.isDisplayAssetNew = action.isDisplayAssetNew;\r\n break;\r\n case types.CACHE_ASSET_FROM_DATE:\r\n draft.cachedFromDate = action.fromDate;\r\n break;\r\n }\r\n });\r\n\r\nexport default assetReducer;\r\n","import React from 'react';\r\nimport { put, call, takeLatest, all, delay } from 'redux-saga/effects';\r\n\r\nimport * as types from './constants';\r\nimport * as actions from './actions';\r\nimport * as services from 'services/assetProduct';\r\nimport * as servicesGrid from 'services/grid';\r\nimport * as servicesMember from 'services/members';\r\n\r\nimport { AgGridThumbnail, AgGridIcons } from 'common/components';\r\n\r\nimport { formatMDYWithParam } from 'utils/formatDate';\r\nimport { formatSizeUnitByParam } from 'utils/formatSizeUnits';\r\nimport { notification } from 'antd';\r\nimport { FavoriteStarIconRender } from 'common/components';\r\nimport { DEFAULT_SORT } from 'static/Constants';\r\nimport * as actionsBranding from '@redux/branding/actions';\r\nimport { Images } from 'config/assets';\r\n\r\nexport function* getDigitalAssetList(payload) {\r\n try {\r\n let params = {\r\n type: payload.type,\r\n PageSize: payload.pageSize,\r\n PageIndex: payload.pageIndex,\r\n search: {\r\n searchText: payload?.search,\r\n primaryFieldsOnly: payload?.primaryFieldsOnly,\r\n },\r\n Filters: payload.filters,\r\n isFavoriteRoute: payload.isFavoriteRoute,\r\n ...(payload?.search ? null : { sort: DEFAULT_SORT }),\r\n advancedSearchContainer: payload.advancedSearchContainer,\r\n searchCategory: payload.searchCategory,\r\n fromDate: payload.fromDate,\r\n };\r\n \r\n if (payload.mediaType) params.DigitalMediaType = payload.mediaType;\r\n const response = yield call(services.getAssetList, params);\r\n yield put(\r\n actions.getDigitalAssetListSuccess(\r\n response.data.gridData,\r\n response.data.paging.totalRecord\r\n )\r\n );\r\n } catch (error) {\r\n yield put(actions.getDigitalAssetListError(error));\r\n }\r\n}\r\n\r\nexport function* getDigitalAssetForMemmberListSaga(payload) {\r\n try {\r\n let params = {\r\n type: payload.type,\r\n PageSize: payload.pageSize,\r\n PageIndex: payload.pageIndex,\r\n search: { searchText: payload.search },\r\n Filters: payload.filters,\r\n isFavoriteRoute: payload.isFavoriteRoute,\r\n ...(payload?.search ? null : { sort: DEFAULT_SORT }),\r\n advancedSearchContainer: payload.advancedSearchContainer,\r\n searchCategory: payload.searchCategory,\r\n fromDate: payload.fromDate,\r\n };\r\n if (payload.mediaType) params.DigitalMediaType = payload.mediaType;\r\n const response = yield call(services.getAssetList, params);\r\n yield put(\r\n actions.getDigitalAssetListSuccess(\r\n response.data.gridData,\r\n response.data.paging.totalRecord\r\n )\r\n );\r\n } catch (error) {\r\n yield put(actions.getDigitalAssetListError(error));\r\n }\r\n}\r\n\r\nexport function* getDigitalAssetShortDetail(payload) {\r\n try {\r\n const response = yield call(services.getDigitalAssetShortDetail, {\r\n Id: payload.id,\r\n });\r\n yield put(actions.getDigitalAssetShortDetailSuccess(response.data));\r\n } catch (error) {\r\n yield put(actions.getDigitalAssetShortDetailError(error));\r\n }\r\n}\r\n\r\nconst onFavoriteStarIconRender = (param) => {\r\n return ;\r\n};\r\n\r\nconst renderFavSharePackIcons = (params) => {\r\n const data = params?.data;\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst renderThumbnail = (params) => {\r\n const thumbnail =\r\n params?.data?.thumbSize100 ||\r\n params?.data?.thumbSize300 ||\r\n Images.RIVIR_LOGO_DEFAULT;\r\n\r\n return ;\r\n};\r\n\r\nconst formatAssetDetailColumns = (response) => {\r\n let columns = [\r\n { field: '', checkboxSelection: true, filter: false, suppressMenu: true },\r\n {\r\n field: 'stateIcons',\r\n headerName: 'States',\r\n width: 85,\r\n cellRenderer: renderFavSharePackIcons,\r\n filter: false,\r\n resizable: false,\r\n headerClass: 'header-text-hide',\r\n },\r\n // {\r\n // field: '',\r\n // width: 70,\r\n // cellRenderer: renderThumbnail,\r\n // filter: false,\r\n // suppressMenu: true,\r\n // },\r\n ];\r\n\r\n if (response?.columns?.length > 0) {\r\n let hiddenCol = [\r\n 'id',\r\n 'uniqueId',\r\n 'canEdit',\r\n 'isOwner',\r\n 'type',\r\n 'fileName',\r\n ];\r\n response.columns.forEach((val) => {\r\n if (hiddenCol.indexOf(val.fieldNameCamelCase) === -1) {\r\n // eslint-disable-next-line no-lone-blocks\r\n {\r\n if (val.fieldNameCamelCase === 'sharedByName') {\r\n val = { ...val, flex: 1, minWidth: 180, resizable: true };\r\n } else if (val.fieldNameCamelCase === 'originalFileName') {\r\n val = {\r\n ...val,\r\n minWidth: 180,\r\n resizable: true,\r\n headerName: 'File Name',\r\n };\r\n } else if (val.fieldNameCamelCase === 'additionalSearchTags') {\r\n val = { ...val, minWidth: 200, resizable: true };\r\n } else if (val.dataType === 'datetime') {\r\n val = {\r\n ...val,\r\n minWidth: 150,\r\n cellRenderer: formatMDYWithParam,\r\n resizable: true,\r\n };\r\n } else if (\r\n val.fieldNameCamelCase === 'assetName' ||\r\n val.fieldNameCamelCase === 'ownerName'\r\n ) {\r\n val = { ...val, minWidth: 140, resizable: true };\r\n } else if (val.fieldNameCamelCase === 'assetType') {\r\n val = { ...val, minWidth: 120, resizable: true };\r\n } else if (val.fieldNameCamelCase === 'fileSize') {\r\n val = {\r\n ...val,\r\n minWidth: 120,\r\n resizable: true,\r\n cellRenderer: formatSizeUnitByParam,\r\n };\r\n } else {\r\n val = { ...val, minWidth: 150, resizable: true };\r\n }\r\n\r\n if (val.fieldNameCamelCase === 'assetName')\r\n val = { ...val, linkTo: '/asset/{id}', minWidth: 300 };\r\n\r\n columns.push(val);\r\n }\r\n }\r\n });\r\n }\r\n\r\n return columns;\r\n};\r\n\r\nexport function* gridDigitalAssetColumnInfo(payload) {\r\n try {\r\n const { response } = yield call(getColumnsFilter, payload);\r\n\r\n const columns = formatAssetDetailColumns(response);\r\n\r\n yield put(actions.gridDigitalAssetColumnInfoSuccess(columns));\r\n } catch (error) {\r\n yield put(actions.gridDigitalAssetColumnInfoError(error));\r\n }\r\n}\r\n\r\nexport function* getColumnsFilter(payload) {\r\n const response = yield call(servicesGrid.gridColumnInfo, payload.gridName);\r\n return { response };\r\n}\r\n\r\nexport function* deleteAssets(action) {\r\n try {\r\n const { assetIds } = action.payload;\r\n yield delay(1000);\r\n const response = yield call(services.deleteAssets, {\r\n listAssets: assetIds,\r\n });\r\n if (response.isSuccess) {\r\n yield put(actions.deleteAssetsSuccess(types.DELETED_ASSETS_SUCCESS));\r\n } else {\r\n yield put(actions.deleteAssetsError(types.DELETED_ASSETS_ERROR));\r\n }\r\n } catch (error) {\r\n yield put(actions.deleteAssetsError(error));\r\n }\r\n}\r\n\r\nexport function* updateAssetData(payload) {\r\n try {\r\n const response = yield call(services.updateAssetType, payload.params);\r\n if (response.isSuccess) {\r\n yield put(actions.updateAssetTypePaneSuccess());\r\n notification.success({\r\n message: 'Update Asset Type Success',\r\n });\r\n yield put(actions.getDigitalAssetShortDetail(payload.params.id));\r\n }\r\n } catch (error) {\r\n yield put(actions.updateAssetTypePaneError(error));\r\n }\r\n}\r\n\r\nexport function* getAssetsForMemberSaga(action) {\r\n try {\r\n const { isSuccess, data } = yield call(\r\n servicesMember.getAssetsForMember,\r\n action.params\r\n );\r\n if (isSuccess) {\r\n yield put(actions.getAssetsForMemberSuccess(data));\r\n }\r\n } catch (error) {\r\n yield put(actions.getAssetsForMemberError(error));\r\n }\r\n}\r\n\r\nexport function* getColumnsAssetsForMembersSaga(action) {\r\n try {\r\n const { response } = yield call(getColumnsFilter, action);\r\n\r\n const columns = formatAssetDetailColumns(response);\r\n\r\n yield put(actions.getColumnsAssetsForMemberSuccess(columns));\r\n } catch (error) {\r\n yield put(actions.getColumnsAssetsForMemberError(error));\r\n }\r\n}\r\n\r\nfunction* updateLatestGetNewAsset() {\r\n const updateLastGetNewDamResponse = yield call(services.updateLastGetNewDam);\r\n if (updateLastGetNewDamResponse.isSuccess)\r\n yield put(actionsBranding.getBrandingNoLoading());\r\n}\r\n\r\nfunction* watchAll() {\r\n yield all([\r\n takeLatest(\r\n types.GET_DIGITAL_ASSET_SHORT_DETAIL,\r\n getDigitalAssetShortDetail\r\n ),\r\n takeLatest(types.GET_DIGITAL_ASSET_LIST, getDigitalAssetList),\r\n takeLatest(\r\n types.DIGITAL_ASSET_GRID_COLUMN_INFO,\r\n gridDigitalAssetColumnInfo\r\n ),\r\n takeLatest(types.DELETE_ASSETS, deleteAssets),\r\n takeLatest(types.UPDATE_ASSET_TYPE_PANE, updateAssetData),\r\n takeLatest(types.GET_ASSETS_FOR_MEMBER, getAssetsForMemberSaga),\r\n takeLatest(\r\n types.GET_COLUMNS_ASSETS_FOR_MEMBER,\r\n getColumnsAssetsForMembersSaga\r\n ),\r\n takeLatest(types.UPDATE_LATEST_GET_NEW_ASSET, updateLatestGetNewAsset),\r\n takeLatest(\r\n types.GET_DIGITAL_ASSET_FOR_MEMBER_LIST,\r\n getDigitalAssetForMemmberListSaga\r\n ),\r\n ]);\r\n}\r\n\r\nexport default watchAll;\r\n","import { createSelector } from 'reselect';\r\nimport { initialState } from './reducer';\r\n\r\nconst selectAssetList = (state) => state.assetList || initialState;\r\n\r\nconst makeSelectLoading = () =>\r\n createSelector(selectAssetList, (assetState) => assetState.loading);\r\nconst makeSelectAssetList = () =>\r\n createSelector(selectAssetList, (assetState) => assetState.assets);\r\nconst makeSelectTotal = () =>\r\n createSelector(selectAssetList, (assetState) => assetState.total);\r\nconst makeSelectPageSize = () =>\r\n createSelector(selectAssetList, (assetState) => assetState.pageSize);\r\nconst makeSelectPageNumber = () =>\r\n createSelector(selectAssetList, (assetState) => assetState.pageNumber);\r\nconst makeSelectSearch = () =>\r\n createSelector(selectAssetList, (assetState) => assetState.search);\r\nconst makeSelectColumns = () =>\r\n createSelector(selectAssetList, (assetState) => assetState.columns);\r\nconst makeSelectLoadingDetail = () =>\r\n createSelector(selectAssetList, (assetState) => assetState.loadingDetail);\r\nconst makeSelectAssetData = () =>\r\n createSelector(selectAssetList, (assetState) => assetState.assetData);\r\n\r\nconst makeSelectStatusDelete = () =>\r\n createSelector(selectAssetList, (assetState) => assetState.statusDelete);\r\n\r\nconst makeSelectCachedImages = () =>\r\n createSelector(\r\n selectAssetList,\r\n (assetState) => assetState.cachedImagesVersion\r\n );\r\n\r\nconst makeSelectAssetsForMember = () =>\r\n createSelector(selectAssetList, (assetState) => assetState.assetsForMember);\r\n\r\nconst selectEditTypeLoading = () =>\r\n createSelector(selectAssetList, (assetState) => assetState.editTypeLoading);\r\n\r\nconst makeSelectIsDisplayAssetNew = () =>\r\n createSelector(selectAssetList, (assetState) => assetState.isDisplayAssetNew);\r\n\r\nconst makeSelectCachedFromDate = () =>\r\n createSelector(selectAssetList, (assetState) => assetState.cachedFromDate);\r\n\r\nexport {\r\n selectAssetList,\r\n makeSelectLoading,\r\n makeSelectAssetList,\r\n makeSelectTotal,\r\n makeSelectPageSize,\r\n makeSelectPageNumber,\r\n makeSelectSearch,\r\n makeSelectColumns,\r\n makeSelectLoadingDetail,\r\n makeSelectAssetData,\r\n makeSelectStatusDelete,\r\n makeSelectCachedImages,\r\n makeSelectAssetsForMember,\r\n selectEditTypeLoading,\r\n makeSelectIsDisplayAssetNew,\r\n makeSelectCachedFromDate,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { forwardTo } from 'utils/common/route';\r\nimport { ThumbnailItem } from 'common/components';\r\nimport { Images } from 'config/assets';\r\nimport * as getLink from 'utils/common/linkBuilder';\r\n\r\n/**\r\n * Member thumbnail is inherit from thumbnail item\r\n * @param {object} props\r\n */\r\nconst MemberThumbnailCard = (props) => {\r\n const {\r\n dataDetail,\r\n selected,\r\n onClickItemGrid,\r\n onClickCheckboxItem,\r\n hideCheckbox,\r\n linkTarget,\r\n isShareBtn = true,\r\n style,\r\n } = props;\r\n\r\n const onDoubleClick = (item) => {\r\n const { id } = item;\r\n forwardTo(`/company/${id}`);\r\n };\r\n\r\n const alink = getLink.memberLink(\r\n dataDetail?.id,\r\n dataDetail.memberName,\r\n linkTarget\r\n );\r\n return (\r\n \r\n );\r\n};\r\n\r\nMemberThumbnailCard.propTypes = {\r\n dataDetail: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default React.memo(MemberThumbnailCard);\r\n","import React from 'react';\r\n\r\nimport {\r\n Col,\r\n Button,\r\n Image,\r\n Dropdown,\r\n Menu,\r\n Space,\r\n Typography,\r\n Result,\r\n Tag,\r\n Tooltip,\r\n} from 'antd';\r\n\r\nimport { QuestionCircleOutlined } from '@ant-design/icons';\r\n\r\nimport brokerSrc from 'assets/member/broker.png';\r\nimport distributorSrc from 'assets/member/distributor.png';\r\nimport manufacturerSrc from 'assets/member/manufacturer.png';\r\nimport retailerSrc from 'assets/member/retailer.png';\r\n\r\nimport './MemberType.less';\r\n\r\nconst MemberType = ({ memberType = '' }) => {\r\n const dropdownContentRender = () => {\r\n return (\r\n \r\n \r\n
\r\n {memberType ? (\r\n \r\n \r\n Member Type:\r\n \r\n\r\n \r\n {memberType ? memberType.toUpperCase() : ''}\r\n \r\n \r\n ) : (\r\n \r\n )}\r\n
\r\n
\r\n
\r\n );\r\n };\r\n\r\n const memberTypeImage = getImageMemberType(memberType);\r\n\r\n return (\r\n \r\n {memberTypeImage.imageSrc ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n {memberTypeImage.icon}\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport const MemberTypeTile = ({ memberType, ...otherProps }) => {\r\n const memberTypeImage = getImageMemberType(memberType);\r\n\r\n return (\r\n \r\n {memberTypeImage.imageSrc ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n {memberTypeImage.icon}\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nconst TooltipMemberType = ({ memberType, children }) => {\r\n return (\r\n (\r\n \r\n Member Type: {memberType}\r\n \r\n )}\r\n >\r\n {children}\r\n \r\n );\r\n};\r\n\r\nconst getImageMemberType = (memberType = '') => {\r\n const lcMemberType = memberType?.toLowerCase();\r\n\r\n if (lcMemberType === 'broker') {\r\n return {\r\n imageSrc: brokerSrc,\r\n };\r\n }\r\n\r\n if (lcMemberType === 'distributor')\r\n return {\r\n imageSrc: distributorSrc,\r\n };\r\n\r\n if (lcMemberType === 'manufacturer') {\r\n return {\r\n imageSrc: manufacturerSrc,\r\n };\r\n }\r\n\r\n if (lcMemberType === 'retailer')\r\n return {\r\n imageSrc: retailerSrc,\r\n };\r\n\r\n return {\r\n icon: ,\r\n };\r\n};\r\n\r\nexport default MemberType;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { Typography, Space, Row } from 'antd';\r\nimport { SafetyCertificateFilled } from '@ant-design/icons';\r\nimport { get } from 'lodash';\r\n\r\nimport { StarFilled } from '@ant-design/icons';\r\nimport IconList from 'common/components/icon-list/IconList';\r\nimport ProductSubscription from 'common/components/thumb/product/ProductSubscription';\r\nimport EntityStatusTag from 'common/components/tag/entity-status-tag/EntityStatusTag';\r\nimport { MemberTypeTile } from 'common/components/thumb/member/MemberType';\r\n\r\nconst { Paragraph, Title, Button } = Typography;\r\n\r\nconst AssetTileBody = (props) => {\r\n const { dataDetail } = props;\r\n const renderTitle = (value, key) => {\r\n return (\r\n \r\n {dataDetail?.memberName}\r\n \r\n );\r\n };\r\n\r\n const renderText = (value, key) => {\r\n return (\r\n <>\r\n {value && (\r\n \r\n {value}\r\n \r\n )}\r\n \r\n );\r\n };\r\n\r\n const memberName = get(dataDetail, 'memberName', '');\r\n const mainAddress = get(\r\n dataDetail,\r\n 'primaryAddress.primaryAddressMainAddress',\r\n ''\r\n );\r\n\r\n const country = get(dataDetail, 'primaryAddress.primaryAddressCountry', '');\r\n const city = get(dataDetail, 'primaryAddress.primaryAddressCity', '');\r\n const state = get(dataDetail, 'primaryAddress.primaryAddressState', '');\r\n const countryAddress = `${city} ${city && ','} ${state}${\r\n country === 'USA' ? '' : `${state && ', '}` + country\r\n }`;\r\n\r\n const zipcode = get(dataDetail, 'primaryAddress.primaryAddressZipcode', '');\r\n const segments = get(dataDetail, 'segments', []).map((segmentIcon) => ({\r\n ...segmentIcon,\r\n wrapperStyle: {\r\n marginRight: 4,\r\n },\r\n }));\r\n const haveProductsCertificated = get(\r\n dataDetail,\r\n 'haveProductsCertificated',\r\n false\r\n );\r\n\r\n const infoText = [\r\n {\r\n field: 'memberName',\r\n value: memberName,\r\n render: renderTitle,\r\n },\r\n {\r\n field: 'mainAddress',\r\n value: mainAddress,\r\n render: renderText,\r\n },\r\n {\r\n field: 'country',\r\n value: countryAddress,\r\n render: renderText,\r\n },\r\n {\r\n field: 'zipcode',\r\n value: zipcode,\r\n render: renderText,\r\n },\r\n ];\r\n\r\n return (\r\n
\r\n \r\n \r\n {infoText &&\r\n infoText.map((textItem) => {\r\n const { value, field, render } = textItem;\r\n return render ? render(value, field) : value;\r\n })}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {haveProductsCertificated ? (\r\n \r\n ) : null}\r\n {dataDetail?.isFavorited && (\r\n \r\n )}\r\n\r\n {dataDetail?.memberType && (\r\n \r\n )}\r\n {dataDetail?.subscription && (\r\n \r\n )}\r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nAssetTileBody.propTypes = {\r\n dataDetail: PropTypes.object,\r\n};\r\n\r\nexport default AssetTileBody;\r\n","/**\r\n * Branded members Messages\r\n *\r\n * This contains all the text for the member grid component.\r\n */\r\nimport { defineMessages } from 'react-intl';\r\n\r\nexport const scope = 'Taco.branded-members';\r\n\r\nexport default defineMessages({\r\n memberSince: {\r\n id: `${scope}.components.memberSince.`,\r\n defaultMessage: 'Since',\r\n },\r\n lastUpdated: {\r\n id: `${scope}.components.lastUpdated.`,\r\n defaultMessage: 'Last Updated',\r\n },\r\n});\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { Row, Col } from 'antd';\r\nimport { get } from 'lodash';\r\n\r\nimport { injectIntl } from 'react-intl';\r\nimport Messages from 'i18n/messages/branded-members';\r\n\r\nimport { formatMDY } from 'utils/formatDate';\r\n\r\nconst AssetTileFooter = (props) => {\r\n const { intl, dataDetail } = props;\r\n\r\n const loadedDate = get(dataDetail, 'memberSince', '');\r\n const lastUpdatedDate = get(dataDetail, 'lastUpdatedDate', '');\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {intl.formatMessage(Messages.lastUpdated)}\r\n {': '}\r\n \r\n {lastUpdatedDate && formatMDY(lastUpdatedDate)} \r\n \r\n \r\n \r\n {intl.formatMessage(Messages.memberSince)}\r\n {': '}\r\n \r\n {loadedDate && formatMDY(loadedDate)}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nAssetTileFooter.propTypes = {\r\n loadedDate: PropTypes.string,\r\n lastUpdate: PropTypes.string,\r\n};\r\n\r\nexport default injectIntl(AssetTileFooter);\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { Row, Avatar } from 'antd';\r\nimport { Images } from 'config/assets';\r\n\r\nconst AssetTileHeader = (props) => {\r\n const { dataDetail } = props;\r\n\r\n return (\r\n \r\n
\r\n\r\n
\r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nAssetTileHeader.propTypes = {\r\n dataDetail: PropTypes.object,\r\n};\r\n\r\nexport default AssetTileHeader;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { Tooltip } from 'antd';\r\nimport { get } from 'lodash';\r\n\r\nimport MemberTileBody from './items-new/MemberTileBody';\r\nimport MemberTileFooter from './items-new/MemberTileFooter';\r\nimport MemberTileHeader from './items-new/MemberTileHeader';\r\n\r\nimport './MemberTileCard.less';\r\n\r\nimport useDoubleClick from 'hooks/useDoubleClick';\r\n\r\n/**\r\n * A component displays member information under card layout\r\n * @param {object} props\r\n */\r\nconst MemberTileCard = (props) => {\r\n // variables\r\n const { dataDetail } = props;\r\n const { onClickItemGrid, onDoubleClick } = props.clickEvents;\r\n\r\n const memberName = get(props.dataDetail, 'memberName', '');\r\n\r\n const divRef = React.useRef();\r\n useDoubleClick({\r\n onSingleClick: (e) => {\r\n if (onClickItemGrid) onClickItemGrid(dataDetail, e);\r\n },\r\n onDoubleClick: (e) => {\r\n if (onDoubleClick) onDoubleClick(dataDetail);\r\n },\r\n ref: divRef,\r\n latency: 250,\r\n });\r\n return (\r\n \r\n \r\n\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nMemberTileCard.propTypes = {\r\n dataDetail: PropTypes.object,\r\n selected: PropTypes.bool,\r\n onClickItemGrid: PropTypes.func,\r\n onClickCheckboxItem: PropTypes.func,\r\n};\r\n\r\nexport default MemberTileCard;\r\n","import React, { useState } from 'react';\r\nimport { Row, Col, Button, notification } from 'antd';\r\nimport AgGrid from 'common/components/ag-grid/AgGrid';\r\nimport * as endpoints from 'services/members/endpoints';\r\nimport './BanListModal.less';\r\nimport { WithLoading } from 'common/components';\r\nimport classnames from 'classnames';\r\nimport * as services from 'services/members';\r\nimport dialogFunction from 'common/components/dialog-function/DialogFunction';\r\nimport { EditOutlined, DeleteOutlined, StopOutlined } from '@ant-design/icons';\r\nimport Message from 'i18n/messages/member-profile';\r\nimport { useIntl } from 'react-intl';\r\n\r\nconst BanListModal = (props) => {\r\n const intl = useIntl();\r\n const { columns, removeBanList, changeBanList } = props;\r\n const [gridApi, setGridApi] = useState(null);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [isEdit, setIsEdit] = useState(false);\r\n const [rowsSelected, setRowSelected] = useState([]);\r\n\r\n const onSetSelectedRows = (selectedNodesDetail) => {\r\n const bannedMemmberIdList = selectedNodesDetail.map(\r\n (nodeDetail) => nodeDetail?.bannedMemberId\r\n );\r\n setRowSelected(bannedMemmberIdList);\r\n };\r\n\r\n async function toggleRemoveBanList() {\r\n if (rowsSelected.length > 0) {\r\n setIsLoading(true);\r\n const res = await services.removeToBanList({ memberIds: rowsSelected });\r\n setIsLoading(false);\r\n if (res?.isSuccess) {\r\n notification.success({\r\n message: 'Remove items from ban list successfully!',\r\n top: 50,\r\n });\r\n refreshGrid();\r\n changeBanList();\r\n setRowSelected([]);\r\n } else {\r\n notification.error({\r\n message: 'Failed to remove items from ban list!',\r\n top: 50,\r\n });\r\n }\r\n } else {\r\n notification.error({\r\n message: 'Should choose item to remove!',\r\n top: 50,\r\n });\r\n }\r\n }\r\n\r\n function refreshGrid() {\r\n if (gridApi) gridApi.rivirPurgeServerSideCache();\r\n }\r\n\r\n const confirmDelete = () => {\r\n dialogFunction({\r\n type: 'warn',\r\n content: intl.formatMessage(Message.deleteItemsFromBanList),\r\n okText: 'OK',\r\n cancelText: 'Cancel',\r\n onOk: toggleRemoveBanList,\r\n });\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n {!isEdit && (\r\n }\r\n onClick={() => {\r\n setIsEdit(!isEdit);\r\n }}\r\n />\r\n )}\r\n {isEdit && (\r\n {\r\n confirmDelete();\r\n }}\r\n >\r\n \r\n Delete\r\n \r\n )}\r\n {isEdit && (\r\n }\r\n onClick={() => setIsEdit(false)}\r\n >\r\n Cancel\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n {\r\n setGridApi(gridApi);\r\n }}\r\n onHandleSelectedRowCustom={onSetSelectedRows}\r\n // requestParams={requestParams}\r\n />\r\n \r\n \r\n refreshGrid()}\r\n >\r\n setIsEdit(false)}\r\n >\r\n \r\n );\r\n};\r\n\r\nexport default BanListModal;\r\n","import React from 'react';\r\nimport { Avatar } from 'antd';\r\nimport { Images } from 'config/assets';\r\n\r\nconst MemberLogo = (props) => {\r\n const logoSrc = props?.thumb300 || props?.thumb || Images.RIVIR_LOGO_DEFAULT;\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport default MemberLogo;\r\n","import { useEffect, useRef } from 'react';\r\n\r\nimport * as constant from 'static/Constants';\r\nimport * as actionsAsset from 'pages/branded-assets/controllers/actions';\r\nimport * as actionsGlobal from '@redux/global/actions';\r\n\r\nimport { useGetQuery } from 'hooks/useQuery';\r\n\r\nconst useColumnsGrid = (dispatch, typeView) => {\r\n useEffect(() => {\r\n if (typeView === constant.RIBBON_TYPES.DETAILSVIEW)\r\n dispatch(actionsAsset.getColumnsAssetsForMember('assets-for-member'));\r\n }, [dispatch, typeView]);\r\n};\r\n\r\nconst useAssetsForMember = (\r\n dispatch,\r\n pageIndex,\r\n pageSize,\r\n memberId,\r\n searchText\r\n) => {\r\n useEffect(() => {\r\n const params = {\r\n pageIndex,\r\n pageSize,\r\n memberId,\r\n search: { searchText },\r\n };\r\n\r\n dispatch(actionsAsset.getAssetsForMember(params));\r\n }, [dispatch, memberId, pageIndex, pageSize, searchText]);\r\n};\r\n\r\nconst useSaveIdMember = (dispatch, memberId) => {\r\n useEffect(() => {\r\n dispatch(actionsAsset.saveIdMember(memberId));\r\n }, [dispatch, memberId]);\r\n};\r\n\r\nconst useToggleAssetsForMember = (dispatch) => {\r\n useEffect(() => {\r\n dispatch(actionsGlobal.toggleAssetsToMember());\r\n }, [dispatch]);\r\n};\r\n\r\nconst useGetMemberId = () => {\r\n const refMemberId = useRef();\r\n const query = useGetQuery();\r\n const memberId = query.get('memberId');\r\n\r\n useEffect(() => {\r\n refMemberId.current = memberId;\r\n }, [memberId]);\r\n\r\n return { memberId, refMemberId };\r\n};\r\n\r\nexport {\r\n useColumnsGrid,\r\n useAssetsForMember,\r\n useSaveIdMember,\r\n useToggleAssetsForMember,\r\n useGetMemberId,\r\n};\r\n","const getAssetTypeFilter = (filters, filterAssets) => {\r\n let filterAssetType = {\r\n fieldName: 'assetType',\r\n filterType: 'In',\r\n values: [],\r\n };\r\n if (filterAssets.includes('asset')) {\r\n filterAssetType.values.push('asset');\r\n }\r\n if (filterAssets.includes('document')) {\r\n filterAssetType.values.push('document');\r\n }\r\n if (filterAssets.includes('multimedia')) {\r\n filterAssetType.values.push('multimedia');\r\n }\r\n if (filterAssetType.values.length > 0) {\r\n filters.push(filterAssetType);\r\n }\r\n};\r\n\r\nexport const filterAsset = (refMemberId, filterAssets) => {\r\n const defaultFilter = [\r\n {\r\n fieldName: 'ownerId',\r\n value: parseInt(refMemberId.current),\r\n filterType: 'Equal',\r\n },\r\n ];\r\n let filters = defaultFilter;\r\n\r\n if (filterAssets.indexOf('owner') > -1) {\r\n filters.push({\r\n fieldName: 'isOwner',\r\n value: true,\r\n filterType: 'Equal',\r\n });\r\n }\r\n if (\r\n filterAssets.indexOf('active') > -1 &&\r\n filterAssets.indexOf('pending') > -1\r\n ) {\r\n filters.push({\r\n fieldName: 'status',\r\n values: ['Active', 'Pending'],\r\n filterType: 'In',\r\n });\r\n } else {\r\n if (filterAssets.indexOf('active') > -1) {\r\n filters.push({\r\n fieldName: 'status',\r\n value: 'Active',\r\n filterType: 'Equal',\r\n });\r\n }\r\n if (filterAssets.indexOf('pending') > -1) {\r\n filters.push({\r\n fieldName: 'status',\r\n value: 'Pending',\r\n filterType: 'Equal',\r\n });\r\n }\r\n getAssetTypeFilter(filters, filterAssets);\r\n }\r\n if (filterAssets.indexOf('unmatched') > -1) {\r\n filters.push({\r\n fieldName: 'meetMinRequirement',\r\n value: false,\r\n filterType: 'Equal',\r\n });\r\n filters.push({\r\n fieldName: 'status',\r\n value: 'Active',\r\n filterType: 'Equal',\r\n });\r\n }\r\n\r\n return filters;\r\n};\r\n","import React, { useEffect, useCallback, useState, useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\n\r\nimport { Skeleton, Row, Col, Spin } from 'antd';\r\n\r\nimport {\r\n AssetTile,\r\n AssetThumbnail,\r\n AssetPanel,\r\n} from 'pages/branded-assets/components';\r\nimport { GridView } from 'common/components/';\r\nimport { OpenItemContentPane } from 'common/components/openItem';\r\n\r\nimport { selectRibbonType } from '@redux/ribbon/selectors';\r\nimport * as actions from '@redux/global/actions';\r\nimport * as actionsGlobal from '@redux/global/actions';\r\nimport * as selectorsGlobal from '@redux/global/selectors';\r\nimport * as brandingSelectors from '@redux/branding/selectors';\r\nimport * as actionsGridView from 'common/components/grid-view/controllers/actions';\r\n\r\nimport reducer from 'pages/branded-assets/controllers/reducer';\r\nimport saga from 'pages/branded-assets/controllers/saga';\r\nimport * as actionsAsset from 'pages/branded-assets/controllers/actions';\r\nimport * as selectorAsset from 'pages/branded-assets/controllers/selectors';\r\nimport reducerLinkAssets from 'pages/branded-assets/components/panel/link-assets/controller/reducers';\r\nimport sagaLinkAssets from 'pages/branded-assets/components/panel/link-assets/controller/saga';\r\n\r\nimport * as selectorsAssets from 'pages/branded-assets/controllers/selectors';\r\nimport selectorsGridView from 'common/components/grid-view/controllers/selectors';\r\n\r\nimport * as actionsAssetFull from 'pages/home/ribbon/asset-full/controllers/actions';\r\nimport * as actionsLinkAssets from 'pages/branded-assets/components/panel/link-assets/controller/actions';\r\n\r\nimport assetReducer from 'pages/asset-full-view/controllers/reducer';\r\nimport sagaDigitalAsset from 'pages/asset-full-view/controllers/saga';\r\n\r\nimport { useInjectReducer } from 'utils/common/injectedReducers';\r\nimport { useInjectSaga } from 'utils/common/injectSaga';\r\nimport { getGridName } from 'utils/getGridName';\r\nimport { updateSizeCurrent } from 'common/components/grid-view/utils';\r\nimport { clearQueryCondition } from 'utils/queryCondition';\r\n\r\nimport { useWindowSize } from 'hooks/windowSize';\r\nimport useCheckFavoriteRoute from 'hooks/useCheckFavoriteRoute';\r\nimport {\r\n useSaveConfigColumns,\r\n useFilterDefaultColumns,\r\n useSaveAllColumns,\r\n useSaveChosenColumns,\r\n} from 'hooks/configGridHooks';\r\nimport {\r\n useListenReloadPage,\r\n useUpdateSelectedData,\r\n} from 'hooks/useReloadPage';\r\nimport { useClearSearchText } from 'hooks/useClearSearchText';\r\nimport { useFilterGrid } from 'hooks/useFilterGrid';\r\n\r\nimport { useGetMemberId } from './hooks';\r\n\r\nimport { SEARCH_CRITERIA, RIBBON_OPTIONS, OPEN_ITEM } from 'static/Constants';\r\nimport * as constant from 'static/Constants';\r\n\r\nimport * as endpointsAsset from 'services/assetProduct/endpoints';\r\nimport { handleCreateSearchContainer } from 'pages/reporting/utils';\r\nimport { filterAsset } from './utils';\r\n\r\nconst key = 'assetList';\r\nconst keyLinkAssets = 'linkAssets';\r\nconst keyDigitalAsset = 'digitalAsset';\r\n\r\nconst Assets = (props) => {\r\n const option = RIBBON_OPTIONS.ASSET_FOR_MEMBER;\r\n const searchCriteria = SEARCH_CRITERIA.ASSET;\r\n useInjectReducer({ key, reducer });\r\n useInjectSaga({ key, saga });\r\n useInjectReducer({ key: keyLinkAssets, reducer: reducerLinkAssets });\r\n useInjectSaga({ key: keyLinkAssets, saga: sagaLinkAssets });\r\n useInjectReducer({ key: keyDigitalAsset, reducer: assetReducer });\r\n useInjectSaga({ key: keyDigitalAsset, saga: sagaDigitalAsset });\r\n\r\n const { mediaType } = props;\r\n const dispatch = useDispatch();\r\n const isFavoriteRoute = useCheckFavoriteRoute();\r\n const { refMemberId } = useGetMemberId();\r\n const pathname = window.location.pathname;\r\n\r\n const fetchAssetForMember = useCallback((params) => {\r\n if (!refMemberId.current) return;\r\n dispatch(\r\n actionsAsset.getDigitalAssetForMemberList({\r\n ...params,\r\n })\r\n );\r\n }, []);\r\n\r\n const columns = useSelector(selectorAsset.makeSelectColumns());\r\n const searchCategoriesEffected = useSelector(\r\n selectorsGridView.makeSelectSearchCategoriesList()\r\n );\r\n\r\n const [requestParams, setRequestParams] = useState({\r\n DigitalMediaType: mediaType,\r\n searchCategory: searchCategoriesEffected || [],\r\n });\r\n const [filterFromAssets, setFilterFromAssets] = useState([]);\r\n const asset = useSelector(selectorAsset.makeSelectAssetList());\r\n const totalPagination = useSelector(selectorAsset.makeSelectTotal());\r\n\r\n const detailCurrentItemsSelection = useSelector(\r\n selectorsGridView.makeSelectDetailCurrentITemsSelection()\r\n );\r\n\r\n const selectAsset = detailCurrentItemsSelection?.[0];\r\n\r\n const {\r\n assetForMemberPage: [currentPageNumber, currentPageSize],\r\n } = useSelector(selectorsGridView.makeSelectPageCurrent());\r\n\r\n const visibleContentPane = useSelector(selectorsGridView.makeSelectVisible());\r\n\r\n const loading = useSelector(selectorAsset.makeSelectLoading());\r\n\r\n const { assetForMemberText, assetForMemberPrimaryFieldsOnly } = useSelector(\r\n selectorsGlobal.selectSelectSearchText()\r\n );\r\n\r\n const typeView = useSelector(selectRibbonType());\r\n const assetData = useSelector(selectorAsset.makeSelectAssetData());\r\n const loadingDetail = useSelector(selectorAsset.makeSelectLoadingDetail());\r\n const statusDelete = useSelector(selectorsAssets.makeSelectStatusDelete());\r\n\r\n const {\r\n allColumns,\r\n defaultColumns: defaultColumnsState,\r\n isRefreshGrid,\r\n } = useSelector(selectorsGridView.makeSelectGridConfig());\r\n\r\n const showAdvanceFilter = useSelector(\r\n selectorsGlobal.selectShowAdvanceFilter()\r\n );\r\n\r\n const isNewAssetFilter = useSelector(selectorsGlobal.selectDisplayAssetNew());\r\n const brandingData = useSelector(brandingSelectors.getBranding());\r\n\r\n const fromDate = isNewAssetFilter ? brandingData?.lastGetNewDamsTime : null;\r\n const cachedFromDate = useSelector(selectorAsset.makeSelectCachedFromDate());\r\n\r\n const [width] = useWindowSize();\r\n const gridName = getGridName(pathname);\r\n\r\n const stringSearchCategories = JSON.stringify(searchCategoriesEffected);\r\n\r\n const queryConditions = useSelector(\r\n selectorsGridView.makeSelectAssetsForMemberQuery()\r\n );\r\n const prevPathnameQuery = useSelector(\r\n selectorsGridView.makeSelectPrevPathnameQuery()\r\n );\r\n clearQueryCondition(dispatch, pathname, prevPathnameQuery);\r\n const checkQueryCondition = useSelector(\r\n selectorsGridView.makeSelectCheckQueryCondition()\r\n );\r\n const myQueryDoubleClick = useSelector(\r\n selectorsGridView.makeSelectMyQueryDoubleClick()\r\n );\r\n\r\n useSaveConfigColumns(gridName);\r\n useSaveAllColumns(columns);\r\n const defaultColumns = useFilterDefaultColumns(columns);\r\n useSaveChosenColumns(columns);\r\n\r\n const { gridFilters: filterAssets, updateGridFilter } = useFilterGrid({\r\n entityType: 'asset',\r\n clearOtherFilter: true,\r\n });\r\n\r\n const searchText = useMemo(() => {\r\n return {\r\n searchText: assetForMemberText,\r\n primaryFieldsOnly: assetForMemberPrimaryFieldsOnly,\r\n };\r\n }, [assetForMemberText, assetForMemberPrimaryFieldsOnly]);\r\n\r\n const saveFromDateValue = () => {\r\n if (isNewAssetFilter && fromDate && !cachedFromDate) {\r\n dispatch(actionsAsset.cacheFromDate(fromDate));\r\n }\r\n };\r\n\r\n const updateRibbonCallback = useCallback(() => {\r\n dispatch(actions.changeRibbonActions(option));\r\n }, [dispatch]);\r\n const updateSearchCriteriaCallback = useCallback(() => {\r\n dispatch(actions.updateSearchCriteria(searchCriteria));\r\n }, [dispatch]);\r\n\r\n useEffect(() => {\r\n updateRibbonCallback();\r\n }, [updateRibbonCallback]);\r\n\r\n useEffect(() => {\r\n updateSearchCriteriaCallback();\r\n }, [updateSearchCriteriaCallback]);\r\n\r\n useEffect(() => {\r\n // the first time come branded-asset will remove assetData on content pane\r\n dispatch(actionsAsset.getDigitalAssetShortDetailSuccess(null));\r\n // reset member id of asset\r\n dispatch(actionsAsset.saveIdMember(null));\r\n }, [dispatch]);\r\n\r\n useEffect(() => {\r\n if (visibleContentPane && selectAsset) {\r\n dispatch(actionsAsset.getDigitalAssetShortDetail(selectAsset.id));\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [selectAsset, visibleContentPane]);\r\n\r\n useEffect(() => {\r\n setRequestParams({\r\n ...requestParams,\r\n searchCategory: searchCategoriesEffected,\r\n fromDate: cachedFromDate,\r\n });\r\n }, [JSON.stringify(searchCategoriesEffected), cachedFromDate]);\r\n\r\n useEffect(() => {\r\n if (stringSearchCategories === 'null') return;\r\n\r\n const filters = filterAsset(refMemberId, filterAssets);\r\n\r\n setFilterFromAssets(filters);\r\n saveFromDateValue();\r\n if (\r\n //!warning = this condtion might be wrong since the querycondition should be applied for all view type\r\n // typeView !== constant.RIBBON_TYPES.DETAILSVIEW &&\r\n !checkQueryCondition &&\r\n !myQueryDoubleClick\r\n ) {\r\n const advancedSearchContainer =\r\n handleCreateSearchContainer(queryConditions);\r\n requestParams.advancedSearchContainer = advancedSearchContainer;\r\n requestParams.searchCategory = searchCategoriesEffected;\r\n\r\n setRequestParams(requestParams);\r\n\r\n //* prevent call api when filtering new asset but fromDate not loaded yet\r\n // if ((isNewAssetFilter && !fromDate) || (!isNewAssetFilter && fromDate)) return;\r\n\r\n if (typeView !== constant.RIBBON_TYPES.DETAILSVIEW) {\r\n isNewAssetFilter &&\r\n fromDate &&\r\n filters.length === 0 &&\r\n fetchAssetForMember({\r\n pageSize: currentPageSize,\r\n pageNumber: currentPageNumber,\r\n search: searchText?.searchText,\r\n primaryFieldsOnly: searchText?.primaryFieldsOnly,\r\n filters,\r\n mediaType,\r\n isFavoriteRoute,\r\n advancedSearchContainer,\r\n searchCategory: searchCategoriesEffected,\r\n fromDate: cachedFromDate || fromDate || null,\r\n });\r\n\r\n !isNewAssetFilter &&\r\n !fromDate &&\r\n fetchAssetForMember({\r\n pageSize: currentPageSize,\r\n pageNumber: currentPageNumber,\r\n search: searchText?.searchText,\r\n primaryFieldsOnly: searchText?.primaryFieldsOnly,\r\n filters,\r\n mediaType,\r\n isFavoriteRoute,\r\n advancedSearchContainer,\r\n searchCategory: searchCategoriesEffected,\r\n });\r\n }\r\n }\r\n\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [\r\n dispatch,\r\n searchText,\r\n filterAssets,\r\n mediaType,\r\n isFavoriteRoute,\r\n typeView,\r\n stringSearchCategories,\r\n isNewAssetFilter,\r\n currentPageSize,\r\n currentPageNumber,\r\n // JSON.stringify(searchCategoriesEffected),\r\n ]);\r\n\r\n useEffect(() => {\r\n return () => {\r\n dispatch(actionsGridView.deleteItemsSelection());\r\n dispatch(actionsGridView.updatePagesSelection([]));\r\n dispatch(actionsGridView.updateItemPageSelection([]));\r\n };\r\n }, [\r\n dispatch,\r\n searchText,\r\n filterAssets,\r\n JSON.stringify(searchCategoriesEffected),\r\n ]);\r\n\r\n useEffect(() => {\r\n if (typeView === constant.RIBBON_TYPES.DETAILSVIEW) {\r\n dispatch(\r\n actionsAsset.gridDigitalAssetColumnInfo('digital-asset-detail-grid')\r\n );\r\n }\r\n }, [dispatch, typeView, pathname, isNewAssetFilter]);\r\n\r\n useEffect(() => {\r\n if (isNewAssetFilter) {\r\n filterAssets?.length > 0 && updateGridFilter([]);\r\n dispatch(actionsAsset.updateLatestGetNewAsset());\r\n }\r\n }, [dispatch, isNewAssetFilter]);\r\n\r\n useEffect(() => {\r\n if (checkQueryCondition && myQueryDoubleClick) {\r\n updateSizeCurrent(dispatch, 1, currentPageSize, pathname);\r\n\r\n const advancedSearchContainer =\r\n handleCreateSearchContainer(queryConditions);\r\n requestParams.advancedSearchContainer = advancedSearchContainer;\r\n requestParams.searchCategory = searchCategoriesEffected;\r\n\r\n setRequestParams(requestParams);\r\n\r\n dispatch(actionsGridView.deleteItemsSelection());\r\n\r\n if (typeView === constant.RIBBON_TYPES.DETAILSVIEW) {\r\n dispatch(actionsGridView.updateIsRefreshGrid());\r\n } else {\r\n fetchAssetForMember({\r\n pageSize: currentPageSize,\r\n pageNumber: 1,\r\n search: searchText?.searchText,\r\n primaryFieldsOnly: searchText?.primaryFieldsOnly,\r\n filters: filterFromAssets,\r\n mediaType,\r\n isFavoriteRoute,\r\n advancedSearchContainer,\r\n searchCategory: searchCategoriesEffected,\r\n fromDate: cachedFromDate,\r\n });\r\n }\r\n dispatch(actionsGridView.checkQueryCondition(false));\r\n dispatch(actionsGridView.myQueryDoubleClick(false));\r\n }\r\n }, [\r\n dispatch,\r\n checkQueryCondition,\r\n //* add currentPageSize help keep page size when clear adv filter\r\n currentPageSize,\r\n ]);\r\n\r\n useEffect(() => {\r\n dispatch(actionsAssetFull.disableModeLinkAsset());\r\n dispatch(actionsLinkAssets.resetLinkAsset());\r\n dispatch(actionsGridView.resetPageCurrentMember());\r\n dispatch(actionsGlobal.updateSearchTextProduct(''));\r\n }, [dispatch]);\r\n\r\n useEffect(() => {\r\n dispatch(actionsAsset.showLoading());\r\n }, []);\r\n\r\n useEffect(() => {\r\n return () => {\r\n clearNewAssetFilter();\r\n };\r\n }, []);\r\n\r\n // re-call api when page need to reload\r\n const isReloadPage = useListenReloadPage(() => {\r\n const advancedSearchContainer =\r\n handleCreateSearchContainer(queryConditions);\r\n\r\n fetchAssetForMember({\r\n pageSize: currentPageSize,\r\n pageNumber: currentPageNumber,\r\n search: searchText?.searchText,\r\n primaryFieldsOnly: searchText?.primaryFieldsOnly,\r\n filters: filterFromAssets,\r\n mediaType,\r\n isFavoriteRoute,\r\n advancedSearchContainer,\r\n searchCategory: searchCategoriesEffected,\r\n fromDate: cachedFromDate,\r\n });\r\n });\r\n\r\n useUpdateSelectedData(asset);\r\n useClearSearchText(dispatch, 'assetForMember', pathname);\r\n\r\n const AssetGridThumbnail = (configProps) => {\r\n return ;\r\n };\r\n\r\n const AssetGridTile = (configProps) => {\r\n return ;\r\n };\r\n\r\n function updateAssetTypePane(value) {\r\n const submitForm = {\r\n id: selectAsset?.id,\r\n ...value,\r\n };\r\n dispatch(actionsAsset.updateAssetTypePane(submitForm));\r\n }\r\n\r\n const clearNewAssetFilter = () => {\r\n dispatch(actionsAsset.toggleAssetNew(false));\r\n dispatch(actionsAsset.toggleAssetUnmatch(false));\r\n dispatch(actionsAsset.cacheFromDate(null));\r\n };\r\n\r\n const urlGrid = endpointsAsset.DIGITAL_ASSET_DETAIL_GRID;\r\n const urlGridDistinct = endpointsAsset.DIGITAL_ASSET_DETAIL_GRID_DISTINCT;\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n {statusDelete === 'loading' ? (\r\n \r\n \r\n \r\n ) : null}\r\n\r\n \r\n console.log('todo-save-folder')}\r\n onSubmit={(value) => updateAssetTypePane(value)}\r\n />\r\n \r\n }\r\n filterFromMainPage={filterFromAssets}\r\n requestParams={requestParams}\r\n shouldReloadDetailGrid={isRefreshGrid}\r\n showAdvanceFilter={showAdvanceFilter}\r\n queryConditions={queryConditions}\r\n enableDragToFolder\r\n isDisplaySearchCategories\r\n isToggle={isNewAssetFilter}\r\n onClickToSeeAll={clearNewAssetFilter}\r\n applyDefaultSort={searchText ? false : true}\r\n />\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nAssets.propTypes = { mediaType: PropTypes.string };\r\n\r\nexport default Assets;\r\n","import { useEffect, useRef } from 'react';\r\n\r\nimport * as constant from 'static/Constants';\r\nimport * as actionsMember from '../../controllers/actions';\r\nimport * as actionsGlobal from '@redux/global/actions';\r\nimport { useGetQuery } from 'hooks/useQuery';\r\n\r\n// TODOS: Khang - 09/12/2020 - This file will be changed after the Product View implement\r\n\r\nconst useColumnsGrid = (dispatch, typeView) => {\r\n useEffect(() => {\r\n if (typeView === constant.RIBBON_TYPES.DETAILSVIEW)\r\n dispatch(\r\n actionsMember.getColumnsProductsForMember('products-for-member')\r\n );\r\n }, [dispatch, typeView]);\r\n};\r\n\r\nconst useProductsForMember = (\r\n dispatch,\r\n pageIndex,\r\n pageSize,\r\n memberId,\r\n searchText\r\n) => {\r\n useEffect(() => {\r\n const params = {\r\n pageIndex,\r\n pageSize,\r\n memberId,\r\n search: { searchText },\r\n sort: [{ isAscending: false, fieldName: 'id' }],\r\n };\r\n\r\n dispatch(actionsMember.getProductsForMember(params));\r\n }, [dispatch, memberId, searchText]);\r\n\r\n useEffect(() => {\r\n return () => {\r\n dispatch(actionsMember.resetProductsForMemberState());\r\n };\r\n }, []);\r\n};\r\n\r\nconst useSaveIdMember = (dispatch, memberId) => {\r\n useEffect(() => {\r\n dispatch(actionsMember.saveIdMember(memberId));\r\n }, [dispatch, memberId]);\r\n};\r\n\r\nconst useToggleProdForMember = (dispatch) => {\r\n useEffect(() => {\r\n dispatch(actionsGlobal.toggleProdToMember());\r\n }, [dispatch]);\r\n};\r\n\r\nconst useGetMemberId = () => {\r\n const refMemberId = useRef();\r\n const query = useGetQuery();\r\n const memberId = query.get('memberId');\r\n\r\n useEffect(() => {\r\n refMemberId.current = memberId;\r\n }, [memberId]);\r\n\r\n return { memberId, refMemberId };\r\n};\r\n\r\nexport {\r\n useColumnsGrid,\r\n useProductsForMember,\r\n useSaveIdMember,\r\n useToggleProdForMember,\r\n useGetMemberId,\r\n};\r\n","import React, { useCallback, useEffect, useState, useMemo } from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\n\r\nimport { useLocation } from 'react-router-dom';\r\n\r\n// redux\r\nimport { useInjectReducer } from 'utils/common/injectedReducers';\r\nimport { useInjectSaga } from 'utils/common/injectSaga';\r\nimport reducer from 'pages/branded-products/controllers/reducer';\r\nimport saga from 'pages/branded-products/controllers/saga';\r\n\r\nimport { useWindowSize } from 'hooks/windowSize';\r\nimport { Skeleton } from 'antd';\r\nimport _ from 'lodash';\r\n\r\nimport * as actionsProduct from 'pages/branded-products/controllers/actions';\r\nimport * as selectorProduct from 'pages/branded-products/controllers/selectors';\r\n\r\nimport * as actionsGlobal from '@redux/global/actions';\r\nimport * as selectorsGlobal from '@redux/global/selectors';\r\nimport * as ribbonSelector from '@redux/ribbon/selectors';\r\n\r\nimport { GridView } from 'common/components/';\r\nimport { OpenItemContentPane } from 'common/components/openItem';\r\n\r\nimport {\r\n ProductTile,\r\n ProductContentPanel,\r\n} from 'pages/branded-products/components/index';\r\n\r\nimport * as constant from 'static/Constants';\r\nimport useCheckFavoriteRoute from 'hooks/useCheckFavoriteRoute';\r\nimport ProductThumbnail from 'pages/branded-products/components/card/thumbnail/ProductThumbnail';\r\nimport { clearQueryCondition } from 'utils/queryCondition';\r\n\r\nimport * as actionsGridView from 'common/components/grid-view/controllers/actions';\r\nimport selectorsGridView from 'common/components/grid-view/controllers/selectors';\r\nimport * as brandingSelectors from '@redux/branding/selectors';\r\nimport * as endpointsProduct from 'services/product/endpoints';\r\nimport * as brandingActions from '@redux/branding/actions';\r\n\r\nimport { getGridName } from 'utils/getGridName';\r\nimport { updateSizeCurrent } from 'common/components/grid-view/utils';\r\nimport {\r\n useSaveConfigColumns,\r\n useSaveAllColumns,\r\n useSaveChosenColumns,\r\n} from 'hooks/configGridHooks';\r\nimport {\r\n useListenReloadPage,\r\n useUpdateSelectedData,\r\n} from 'hooks/useReloadPage';\r\n\r\nimport { useClearSearchText } from 'hooks/useClearSearchText';\r\nimport { useFilterGrid } from 'hooks/useFilterGrid';\r\n\r\nimport { useGetMemberId } from './hooks';\r\n\r\nimport useGetDefaultConfig from 'pages/branded-products/hooks/useGetDefaultConfig';\r\n\r\nimport { handleCreateSearchContainer } from 'pages/reporting/utils';\r\nimport { getParamsFromUrl } from 'utils/common/route';\r\n\r\nconst key = 'product';\r\n\r\nconst ProductForMemberGrid = (props) => {\r\n const option = constant.RIBBON_OPTIONS.PRODUCT_FOR_MEMBER;\r\n const searchCriteria = constant.SEARCH_CRITERIA.PRODUCT;\r\n\r\n const location = useLocation();\r\n const { brandId } = getParamsFromUrl(location) ?? {};\r\n\r\n useInjectReducer({ key, reducer });\r\n useInjectSaga({ key, saga });\r\n\r\n const dispatch = useDispatch();\r\n const isFavoriteRoute = useCheckFavoriteRoute();\r\n\r\n const [width] = useWindowSize();\r\n\r\n const { refMemberId } = useGetMemberId();\r\n\r\n const fetchProductForMember = useCallback((params) => {\r\n if (!refMemberId.current) return;\r\n\r\n dispatch(\r\n actionsProduct.getMemberProductList({\r\n ...params,\r\n })\r\n );\r\n }, []);\r\n\r\n // const searchAllItems = useSelector(selectorsGlobal.selectSearchAllItems());\r\n\r\n const searchCategoriesEffected = useSelector(\r\n selectorsGridView.makeSelectSearchCategoriesList()\r\n );\r\n const [requestParams, setRequestParams] = useState({\r\n searchCategory: searchCategoriesEffected || [],\r\n });\r\n const [filterFromAssets, setFilterFromAssets] = useState([]);\r\n const [packageLevels, setPackageLevels] = useState([]);\r\n const [packageArray, setPackageArray] = useState([]);\r\n const [currentDate, setCurrentDate] = useState(null);\r\n const [aplId, setAplId] = useState();\r\n\r\n const { allColumns, isRefreshGrid } = useSelector(\r\n selectorsGridView.makeSelectGridConfig()\r\n );\r\n\r\n const reloadGrid = useSelector(selectorProduct.makeSelectReloadGrid());\r\n const typeView = useSelector(ribbonSelector.selectRibbonType());\r\n\r\n const {\r\n allConfigFieldsName,\r\n selectedColumns,\r\n defaultColumnsGrid: customGridColumns,\r\n isConfigEmpty,\r\n } = useSelector(selectorProduct.makeSelectGridConfig());\r\n\r\n const applyGridConfig = useSelector(\r\n selectorProduct.makeSelectApplyGridConfig()\r\n );\r\n\r\n const isDetailView = typeView === constant.RIBBON_TYPES.DETAILSVIEW;\r\n\r\n useGetDefaultConfig({\r\n isEnabled: Boolean(isDetailView),\r\n applyGridConfig,\r\n });\r\n\r\n const { gridFilters } = useFilterGrid({\r\n entityType: 'memberProduct',\r\n clearOtherFilter: true,\r\n });\r\n\r\n // add 2 default cols to configColumns\r\n\r\n // ribbon button change\r\n const updateRibbonCallback = useCallback(() => {\r\n dispatch(actionsGlobal.changeRibbonActions(option));\r\n }, [dispatch]);\r\n\r\n // change search criteriaProduct\r\n const updateSearchCriteriaCallback = useCallback(() => {\r\n dispatch(actionsGlobal.updateSearchCriteria(searchCriteria));\r\n }, [dispatch]);\r\n\r\n const products = useSelector(selectorProduct.makeSelectProducts());\r\n const totalPagination = useSelector(selectorProduct.makeSelectTotal());\r\n\r\n const loading = useSelector(selectorProduct.makeSelectLoading());\r\n\r\n const {\r\n productForMemberPage: [productPageNumber, productPageSize],\r\n } = useSelector(selectorsGridView.makeSelectPageCurrent());\r\n\r\n const detailCurrentItemsSelection = useSelector(\r\n selectorsGridView.makeSelectDetailCurrentITemsSelection()\r\n );\r\n\r\n const { productForMemberText, productForMemberPrimaryFieldsOnly } =\r\n useSelector(selectorsGlobal.selectSelectSearchText());\r\n\r\n const searchText = useMemo(() => {\r\n return {\r\n searchText: productForMemberText,\r\n primaryFieldsOnly: productForMemberPrimaryFieldsOnly,\r\n };\r\n }, [productForMemberText, productForMemberPrimaryFieldsOnly]);\r\n\r\n const columns = useSelector(selectorProduct.makeSelectColumns());\r\n\r\n const isDisplayProductNew = useSelector(\r\n selectorsGlobal.selectDisplayProductNew()\r\n );\r\n const brandingData = useSelector(brandingSelectors.getBranding());\r\n const stringSearchCategories = JSON.stringify(searchCategoriesEffected);\r\n const queryConditions = useSelector(\r\n selectorsGridView.makeSelectProductsForMemberQuery()\r\n );\r\n const prevPathnameQuery = useSelector(\r\n selectorsGridView.makeSelectPrevPathnameQuery()\r\n );\r\n clearQueryCondition(dispatch, window.location.pathname, prevPathnameQuery);\r\n const checkQueryCondition = useSelector(\r\n selectorsGridView.makeSelectCheckQueryCondition()\r\n );\r\n const myQueryDoubleClick = useSelector(\r\n selectorsGridView.makeSelectMyQueryDoubleClick()\r\n );\r\n const gridName = getGridName(window.location.pathname);\r\n\r\n useSaveConfigColumns(gridName);\r\n useSaveAllColumns(columns);\r\n useSaveChosenColumns(columns);\r\n\r\n const pageSize = productPageSize;\r\n const pageNumber = productPageNumber;\r\n\r\n useClearSearchText(dispatch, 'productForMember', window.location.pathname);\r\n\r\n const getRequestColumns = (columns) => {\r\n //* merge 2 default columns with columns to make sure no fields missed\r\n const mergedColumns = columns.concat(constant.PRODUCT_DEFAULT_GRID_COLUMN);\r\n\r\n //* remove duplicated column\r\n const requestColumns = _.unionBy(mergedColumns, 'fieldName');\r\n\r\n return requestColumns;\r\n };\r\n\r\n useEffect(() => {\r\n updateRibbonCallback();\r\n updateSearchCriteriaCallback();\r\n }, [updateRibbonCallback, updateSearchCriteriaCallback]);\r\n\r\n useEffect(() => {\r\n return () => {\r\n hideNewProductView();\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (Boolean(selectedColumns) && isDetailView) {\r\n requestParams.searchCategory = searchCategoriesEffected;\r\n requestParams.fromDate = currentDate;\r\n requestParams.columns = getRequestColumns(allConfigFieldsName);\r\n setRequestParams(requestParams);\r\n } else {\r\n setRequestParams({\r\n ...requestParams,\r\n searchCategory: searchCategoriesEffected,\r\n fromDate: currentDate,\r\n columns: getRequestColumns([]),\r\n });\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n JSON.stringify(searchCategoriesEffected),\r\n currentDate,\r\n selectedColumns,\r\n isDetailView,\r\n ]);\r\n\r\n //* Dispatch get Product Columns\r\n useEffect(() => {\r\n if (typeView === constant.RIBBON_TYPES.DETAILSVIEW) {\r\n // columns?.length === 0 &&\r\n dispatch(actionsProduct.gridColumnInfo('product-detail-grid'));\r\n }\r\n }, [dispatch, typeView, window.location.pathname, isDisplayProductNew]);\r\n\r\n useEffect(() => {\r\n if (checkQueryCondition && myQueryDoubleClick) {\r\n updateSizeCurrent(dispatch, 1, pageSize, window.location.pathname);\r\n\r\n const advancedSearchContainer =\r\n handleCreateSearchContainer(queryConditions);\r\n requestParams.advancedSearchContainer = advancedSearchContainer;\r\n setRequestParams(requestParams);\r\n dispatch(actionsGridView.deleteItemsSelection());\r\n if (typeView === constant.RIBBON_TYPES.DETAILSVIEW) {\r\n dispatch(actionsGridView.updateIsRefreshGrid());\r\n } else {\r\n fetchProductForMember({\r\n pageSize, // pageSizePagination,\r\n pageIndex: 1,\r\n search: searchText,\r\n filters: filterFromAssets,\r\n advancedSearchContainer,\r\n searchCategory: searchCategoriesEffected,\r\n packageLevels,\r\n isFavoriteRoute,\r\n fromDate: currentDate,\r\n });\r\n }\r\n dispatch(actionsGridView.checkQueryCondition(false));\r\n dispatch(actionsGridView.myQueryDoubleClick(false));\r\n }\r\n }, [\r\n dispatch,\r\n checkQueryCondition,\r\n pageSize,\r\n // filterFromAssets,\r\n // queryConditions,\r\n // searchCategoriesEffected\r\n ]);\r\n\r\n useEffect(() => {\r\n if (stringSearchCategories === 'null') return;\r\n\r\n const categoryParams = window?.productCategory;\r\n const brickCodeParams = window?.brickCodeHierarchy;\r\n const defaultFilter = [\r\n {\r\n fieldName: 'ownerId',\r\n value: parseInt(refMemberId.current),\r\n filterType: 'Equal',\r\n },\r\n ];\r\n\r\n let filters = defaultFilter;\r\n let arrValue = [];\r\n if (gridFilters.indexOf('subscription') > -1) {\r\n filters.push({\r\n fieldName: 'subscription',\r\n value: true,\r\n filterType: 'Equal',\r\n });\r\n }\r\n if (gridFilters.indexOf('syndication') > -1) {\r\n filters.push({\r\n fieldName: 'syndication',\r\n value: true,\r\n filterType: 'Equal',\r\n });\r\n }\r\n if (gridFilters.indexOf('owner') > -1) {\r\n filters.push({\r\n fieldName: 'isOwner',\r\n value: true,\r\n filterType: 'Equal',\r\n });\r\n }\r\n\r\n if (gridFilters.indexOf('pending') > -1) {\r\n filters.push({\r\n fieldName: 'status',\r\n value: 'Pending',\r\n filterType: 'Equal',\r\n });\r\n }\r\n\r\n if (gridFilters.indexOf('active') > -1) {\r\n filters.push({\r\n fieldName: 'status',\r\n value: 'Active',\r\n filterType: 'Equal',\r\n });\r\n }\r\n if (gridFilters.indexOf('productCategory') > -1) {\r\n filters.push(...categoryParams);\r\n }\r\n if (gridFilters.indexOf('brickCodeHierarchy') > -1) {\r\n filters.push(...brickCodeParams);\r\n }\r\n if (gridFilters.indexOf('unmatched') > -1) {\r\n filters.push({\r\n fieldName: 'meetMinRequirement',\r\n value: false,\r\n filterType: 'Equal',\r\n });\r\n filters.push({\r\n fieldName: 'status',\r\n value: 'Active',\r\n filterType: 'Equal',\r\n });\r\n }\r\n\r\n if (brandId) {\r\n filters.push({\r\n fieldName: 'brandId',\r\n value: brandId,\r\n filterType: 'Equal',\r\n });\r\n }\r\n\r\n if (gridFilters.indexOf('privateLabel') > -1) {\r\n filters.push({\r\n fieldName: 'isPrivateLabel',\r\n value: true,\r\n filterType: 'Equal',\r\n });\r\n }\r\n\r\n if (\r\n gridFilters.indexOf('Pallet') > -1 ||\r\n gridFilters.indexOf('Master Case') > -1 ||\r\n gridFilters.indexOf('Case') > -1 ||\r\n gridFilters.indexOf('Inner Pack') > -1 ||\r\n gridFilters.indexOf('Unit') > -1 ||\r\n gridFilters.indexOf('Display Shipper') > -1\r\n ) {\r\n if (gridFilters.indexOf('Pallet') > -1) {\r\n arrValue.push('Pallet');\r\n }\r\n if (gridFilters.indexOf('Master Case') > -1) {\r\n arrValue.push('Master Case');\r\n }\r\n if (gridFilters.indexOf('Case') > -1) {\r\n arrValue.push('Case');\r\n }\r\n if (gridFilters.indexOf('Inner Pack') > -1) {\r\n arrValue.push('Inner Pack');\r\n }\r\n if (gridFilters.indexOf('Unit') > -1) {\r\n arrValue.push('Unit');\r\n }\r\n if (gridFilters.indexOf('Display Shipper') > -1) {\r\n arrValue.push('Display Shipper');\r\n }\r\n }\r\n const aplFilter =\r\n _.isArray(gridFilters) &&\r\n gridFilters.find((val) => val?.filter === 'apl')?.value?.id;\r\n\r\n requestParams.packageLevels = arrValue;\r\n requestParams.searchCategory = searchCategoriesEffected;\r\n requestParams.columns = getRequestColumns(\r\n Boolean(selectedColumns) ? allConfigFieldsName : []\r\n );\r\n requestParams.aplId = aplFilter;\r\n\r\n setPackageLevels(arrValue);\r\n setRequestParams(requestParams);\r\n setFilterFromAssets(filters);\r\n setAplId(aplFilter);\r\n if (\r\n //!warning = this condtion might be wrong since the querycondition should be applied for all view type\r\n // typeView !== constant.RIBBON_TYPES.DETAILSVIEW &&\r\n !checkQueryCondition &&\r\n !myQueryDoubleClick\r\n ) {\r\n const advancedSearchContainer =\r\n handleCreateSearchContainer(queryConditions);\r\n requestParams.advancedSearchContainer = advancedSearchContainer;\r\n requestParams.searchCategory = searchCategoriesEffected;\r\n requestParams.fromDate = currentDate;\r\n\r\n setRequestParams(requestParams);\r\n setPackageArray(arrValue);\r\n\r\n //* this line makes bug occur in grid view selection when change type view (sprint 34 - ticket 1305)\r\n\r\n if (typeView !== constant.RIBBON_TYPES.DETAILSVIEW) {\r\n //* when view type !== detail view\r\n\r\n currentDate &&\r\n isDisplayProductNew &&\r\n fetchProductForMember({\r\n pageSize,\r\n pageIndex: pageNumber,\r\n search: searchText,\r\n filters,\r\n advancedSearchContainer,\r\n searchCategory: searchCategoriesEffected,\r\n packageLevels: arrValue,\r\n isFavoriteRoute,\r\n fromDate: currentDate,\r\n aplId: aplFilter,\r\n });\r\n\r\n !currentDate &&\r\n !isDisplayProductNew &&\r\n fetchProductForMember({\r\n pageSize,\r\n pageIndex: pageNumber,\r\n search: searchText,\r\n filters,\r\n advancedSearchContainer,\r\n searchCategory: searchCategoriesEffected,\r\n packageLevels: arrValue,\r\n isFavoriteRoute,\r\n aplId: aplFilter,\r\n });\r\n }\r\n }\r\n }, [\r\n dispatch,\r\n searchText,\r\n typeView,\r\n isFavoriteRoute,\r\n gridFilters,\r\n stringSearchCategories,\r\n currentDate,\r\n pageSize,\r\n pageNumber,\r\n brandId,\r\n ]);\r\n\r\n useEffect(() => {\r\n if (reloadGrid && typeView !== constant.RIBBON_TYPES.DETAILSVIEW) {\r\n const advancedSearchContainer =\r\n handleCreateSearchContainer(queryConditions);\r\n fetchProductForMember({\r\n pageSize, // pageSizePagination,\r\n pageIndex: pageNumber, // pageIndexPagination,\r\n search: searchText,\r\n filters: filterFromAssets,\r\n advancedSearchContainer,\r\n searchCategory: searchCategoriesEffected,\r\n packageArray,\r\n isFavoriteRoute,\r\n fromDate: currentDate,\r\n });\r\n }\r\n }, [dispatch, typeView, reloadGrid, pageSize, pageNumber]);\r\n\r\n useEffect(() => {\r\n return () => {\r\n dispatch(actionsGridView.deleteItemsSelection());\r\n dispatch(actionsGridView.updatePagesSelection([]));\r\n dispatch(actionsGridView.updateItemPageSelection([]));\r\n };\r\n }, [\r\n dispatch,\r\n searchText,\r\n gridFilters,\r\n JSON.stringify(searchCategoriesEffected),\r\n ]);\r\n\r\n useEffect(() => {\r\n updateCurrentDate();\r\n }, [isDisplayProductNew, isFavoriteRoute]);\r\n\r\n //update here when api release\r\n useEffect(() => {\r\n if (isDisplayProductNew && currentDate) {\r\n updateLatestGetNew();\r\n }\r\n }, [isDisplayProductNew, currentDate]);\r\n\r\n // re-call api when page need to reload\r\n useListenReloadPage(() => {\r\n const advancedSearchContainer =\r\n handleCreateSearchContainer(queryConditions);\r\n\r\n fetchProductForMember({\r\n pageSize,\r\n pageIndex: pageNumber,\r\n search: searchText,\r\n filters: filterFromAssets,\r\n advancedSearchContainer,\r\n searchCategory: searchCategoriesEffected,\r\n packageLevels,\r\n isFavoriteRoute,\r\n fromDate: currentDate,\r\n aplId: aplId,\r\n });\r\n });\r\n\r\n useUpdateSelectedData(products);\r\n\r\n const ProductTileRender = (configProps) => {\r\n return ;\r\n };\r\n\r\n const ProductThumbnailRender = (configProps) => {\r\n return ;\r\n };\r\n\r\n const onClickToSeeAll = () => {\r\n //todo - fix reset page current later - 1/26/2022\r\n // dispatch(actionsGridView.resetPageCurrentProduct());\r\n hideNewProductView();\r\n };\r\n\r\n const hideNewProductView = () => {\r\n dispatch(actionsProduct.toggleProductNew(false));\r\n setCurrentDate(null);\r\n setFilterFromAssets([]);\r\n };\r\n\r\n const updateCurrentDate = () => {\r\n if (isFavoriteRoute) {\r\n hideNewProductView();\r\n return;\r\n }\r\n if (isDisplayProductNew) {\r\n dispatch(actionsGlobal.updateFilterProducts([]));\r\n setCurrentDate(brandingData?.lastGetNewProductsTime);\r\n } else {\r\n setCurrentDate(null);\r\n }\r\n };\r\n\r\n const updateLatestGetNew = () => {\r\n dispatch(brandingActions.updateLastGetNewProduct());\r\n };\r\n\r\n const urlGrid = endpointsProduct.GET_PRODUCT_DETAIL_CUSTOMIZED_GRID;\r\n const urlGridDistinct =\r\n endpointsProduct.GET_PRODUCT_DETAIL_CUSTOMIZED_GRID_DISTINCT;\r\n\r\n const productInfo = detailCurrentItemsSelection?.[0];\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n }\r\n isToggle={isDisplayProductNew}\r\n onClickToSeeAll={onClickToSeeAll}\r\n applyDefaultSort={searchText ? false : true}\r\n />\r\n \r\n );\r\n};\r\n\r\nexport default ProductForMemberGrid;\r\n","import * as types from './constants';\r\n\r\nexport const showLoading = () => {\r\n return {\r\n type: types.SHOW_LOADING,\r\n };\r\n};\r\n\r\nexport function getMemberList(\r\n pageSize,\r\n pageNumber,\r\n search,\r\n primaryFieldsOnly,\r\n atTime,\r\n advancedSearchContainer,\r\n searchCategory,\r\n filters,\r\n isFavoriteRoute\r\n) {\r\n if (atTime)\r\n return {\r\n type: types.GET_MEMBER_LIST,\r\n fromDate: atTime,\r\n pageSize,\r\n pageNumber,\r\n 'Search.SearchText': search,\r\n searchText: search,\r\n primaryFieldsOnly,\r\n advancedSearchContainer,\r\n searchCategory,\r\n filters,\r\n isFavoriteRoute,\r\n };\r\n else\r\n return {\r\n type: types.GET_MEMBER_LIST,\r\n pageSize,\r\n pageNumber,\r\n 'Search.SearchText': search,\r\n searchText: search,\r\n primaryFieldsOnly,\r\n advancedSearchContainer,\r\n searchCategory,\r\n filters,\r\n isFavoriteRoute,\r\n };\r\n}\r\n\r\nexport function getMemberListSuccess(members, total) {\r\n return {\r\n type: types.GET_MEMBER_LIST_SUCCESS,\r\n members,\r\n total,\r\n };\r\n}\r\n\r\nexport function getMemberListError(error) {\r\n return {\r\n type: types.GET_MEMBER_LIST_ERROR,\r\n error,\r\n };\r\n}\r\n\r\nexport function gridMemberColumnInfo(gridName) {\r\n return {\r\n type: types.MEMBER_GRID_COLUMN_INFO,\r\n gridName,\r\n };\r\n}\r\n\r\nexport function gridMemberColumnInfoSuccess(columns) {\r\n return {\r\n type: types.MEMBER_GRID_COLUMN_INFO_SUCCESS,\r\n columns,\r\n };\r\n}\r\n\r\nexport function gridMemberColumnInfoError(error) {\r\n return {\r\n type: types.MEMBER_GRID_COLUMN_INFO_ERROR,\r\n };\r\n}\r\n\r\nexport function banListColumnInfo(gridName, userId) {\r\n return {\r\n type: types.BAN_LIST_GRID_COLUMN_INFO,\r\n gridName,\r\n };\r\n}\r\n\r\nexport function banListColumnInfoSuccess(columns) {\r\n return {\r\n type: types.BAN_LIST_GRID_COLUMN_INFO_SUCCESS,\r\n columns,\r\n };\r\n}\r\n\r\nexport function banListColumnInfoError(error) {\r\n return {\r\n type: types.BAN_LIST_GRID_COLUMN_INFO_ERROR,\r\n };\r\n}\r\n\r\nexport function getMemberShortDetail(id) {\r\n return {\r\n type: types.GET_MEMBER_SHORT_DETAIL,\r\n id,\r\n };\r\n}\r\n\r\nexport function getMemberShortDetailSuccess(data) {\r\n return {\r\n type: types.GET_MEMBER_SHORT_DETAIL_SUCCESS,\r\n data,\r\n };\r\n}\r\n\r\nexport function getMemberShortDetailError(error) {\r\n return {\r\n type: types.GET_MEMBER_SHORT_DETAIL_ERROR,\r\n error,\r\n };\r\n}\r\n\r\n// Products for member\r\nexport function getProductsForMember(params) {\r\n return {\r\n type: types.GET_PRODUCTS_FOR_MEMBER,\r\n params,\r\n };\r\n}\r\n\r\nexport function getProductsForMemberSuccess(data) {\r\n return {\r\n type: types.GET_PRODUCTS_FOR_MEMBER_SUCCESS,\r\n data,\r\n };\r\n}\r\n\r\nexport function getProductsForMemberError(error) {\r\n return {\r\n type: types.GET_PRODUCTS_FOR_MEMBER_ERROR,\r\n error,\r\n };\r\n}\r\n\r\nexport function resetProductsForMemberState() {\r\n return {\r\n type: types.RESET_PRODUCT_FOR_MEMBER_STATE,\r\n };\r\n}\r\n\r\nexport function getColumnsProductsForMember(gridName) {\r\n return {\r\n type: types.GET_COLUMNS_PRODUCTS_FOR_MEMBER,\r\n gridName,\r\n };\r\n}\r\n\r\nexport function getColumnsProductsForMemberSuccess(columns) {\r\n return {\r\n type: types.GET_COLUMNS_PRODUCTS_FOR_MEMBER_SUCCESS,\r\n columns,\r\n };\r\n}\r\n\r\nexport function getColumnsProductsForMemberError(error) {\r\n return {\r\n type: types.GET_COLUMNS_PRODUCTS_FOR_MEMBER_ERROR,\r\n error,\r\n };\r\n}\r\n\r\nexport function saveIdMember(id) {\r\n return {\r\n type: types.SAVE_ID_MEMBER,\r\n id,\r\n };\r\n}\r\n\r\nexport function getPublicContact(memberId) {\r\n return {\r\n type: types.GET_PUBLIC_CONTACT_MEMBER,\r\n memberId,\r\n };\r\n}\r\n\r\nexport function getPublicContactSuccess(data) {\r\n return {\r\n type: types.GET_PUBLIC_CONTACT_MEMBER_SUCCESS,\r\n data,\r\n };\r\n}\r\n\r\nexport function getPublicContactError(error) {\r\n return {\r\n type: types.GET_PUBLIC_CONTACT_MEMBER_ERROR,\r\n error,\r\n };\r\n}\r\n\r\nexport function removeBanList(data) {\r\n return {\r\n type: types.REMOVE_BAN_LIST,\r\n data,\r\n };\r\n}\r\n\r\nexport function removeBanListSuccess(data) {\r\n return {\r\n type: types.REMOVE_BAN_LIST_SUCCESS,\r\n data,\r\n };\r\n}\r\n\r\nexport function removeBanListError(error) {\r\n return {\r\n type: types.REMOVE_BAN_LIST_ERROR,\r\n error,\r\n };\r\n}\r\n","// Action Types\r\nexport const SHOW_LOADING = 'SHOW_LOADING';\r\n\r\nexport const GET_MEMBER_LIST = 'GET_MEMBER_LIST';\r\nexport const GET_MEMBER_LIST_SUCCESS = 'GET_MEMBER_LIST_SUCCESS';\r\nexport const GET_MEMBER_LIST_ERROR = 'GET_MEMBER_LIST_ERROR';\r\n\r\nexport const MEMBER_GRID_COLUMN_INFO = 'MEMBER_GRID_COLUMN_INFO';\r\nexport const MEMBER_GRID_COLUMN_INFO_SUCCESS =\r\n 'MEMBER_GRID_COLUMN_INFO_SUCCESS';\r\nexport const MEMBER_GRID_COLUMN_INFO_ERROR = 'MEMBER_GRID_COLUMN_INFO_ERROR';\r\nexport const GET_MEMBER_SHORT_DETAIL = 'GET_MEMBER_SHORT_DETAIL';\r\nexport const GET_MEMBER_SHORT_DETAIL_SUCCESS =\r\n 'GET_MEMBER_SHORT_DETAIL_SUCCESS';\r\nexport const GET_MEMBER_SHORT_DETAIL_ERROR = 'GET_MEMBER_SHORT_DETAIL_ERROR';\r\n\r\n// Products for members\r\nexport const GET_PRODUCTS_FOR_MEMBER = 'GET_PRODUCTS_FOR_MEMBER';\r\nexport const GET_PRODUCTS_FOR_MEMBER_SUCCESS =\r\n 'GET_PRODUCTS_FOR_MEMBER_SUCCESS';\r\nexport const GET_PRODUCTS_FOR_MEMBER_ERROR = 'GET_PRODUCTS_FOR_MEMBER_ERROR';\r\nexport const RESET_PRODUCT_FOR_MEMBER_STATE = 'RESET_PRODUCT_FOR_MEMBER_STATE';\r\n\r\nexport const GET_COLUMNS_PRODUCTS_FOR_MEMBER =\r\n 'GET_COLUMNS_PRODUCTS_FOR_MEMBER';\r\nexport const GET_COLUMNS_PRODUCTS_FOR_MEMBER_SUCCESS =\r\n 'GET_COLUMNS_PRODUCTS_FOR_MEMBER_SUCCESS';\r\nexport const GET_COLUMNS_PRODUCTS_FOR_MEMBER_ERROR =\r\n 'GET_COLUMNS_PRODUCTS_FOR_MEMBER_ERROR';\r\n\r\nexport const SAVE_ID_MEMBER = 'SAVE_ID_MEMBER';\r\n\r\nexport const GET_PUBLIC_CONTACT_MEMBER = 'GET_PUBLIC_CONTACT_MEMBER';\r\nexport const GET_PUBLIC_CONTACT_MEMBER_SUCCESS =\r\n 'GET_PUBLIC_CONTACT_MEMBER_SUCCESS';\r\nexport const GET_PUBLIC_CONTACT_MEMBER_ERROR = 'GET_PUBLIC_CONTACT_ERROR';\r\nexport const BAN_LIST_GRID_COLUMN_INFO = 'BAN_LIST_GRID_COLUMN_INFO';\r\nexport const BAN_LIST_GRID_COLUMN_INFO_SUCCESS =\r\n 'BAN_LIST_GRID_COLUMN_INFO_SUCCESS';\r\nexport const BAN_LIST_GRID_COLUMN_INFO_ERROR =\r\n 'BAN_LIST_GRID_COLUMN_INFO_ERROR';\r\nexport const REMOVE_BAN_LIST = 'REMOVE_BAN_LIST';\r\nexport const REMOVE_BAN_LIST_SUCCESS = 'REMOVE_BAN_LIST_SUCCESS';\r\nexport const REMOVE_BAN_LIST_ERROR = 'REMOVE_BAN_LIST_ERROR';\r\n\r\n","import produce from 'immer';\r\nimport * as types from './constants';\r\n\r\n// initial state\r\nexport const initialState = {\r\n loading: false,\r\n error: false,\r\n members: [],\r\n total: 0,\r\n pageSize: 20,\r\n pageNumber: 1,\r\n search: '',\r\n columns: [],\r\n gridName: '',\r\n memberData: null,\r\n loadingDetail: false,\r\n publicContactList: null,\r\n banListColumns: [],\r\n\r\n productsForMember: {\r\n loading: false,\r\n pageIndex: 1,\r\n pageSize: 20,\r\n totalItems: 0,\r\n data: [],\r\n columns: [],\r\n memberId: null,\r\n },\r\n};\r\n\r\n/* eslint-disable default-case, no-param-reassign */\r\nconst productReducer = (state = initialState, action) =>\r\n produce(state, (draft) => {\r\n switch (action.type) {\r\n case types.SHOW_LOADING:\r\n draft.loading = true;\r\n break;\r\n case types.GET_MEMBER_LIST:\r\n draft.loading = true;\r\n draft.error = false;\r\n draft.pageSize = action.pageSize;\r\n draft.pageNumber = action.pageNumber;\r\n draft.search = action.search;\r\n break;\r\n case types.GET_MEMBER_LIST_SUCCESS:\r\n draft.loading = false;\r\n draft.members = action.members;\r\n draft.total = action.total;\r\n break;\r\n case types.GET_MEMBER_LIST_ERROR:\r\n draft.loading = false;\r\n draft.total = 0;\r\n draft.members = [];\r\n draft.error = action.error;\r\n break;\r\n case types.MEMBER_GRID_COLUMN_INFO:\r\n draft.error = false;\r\n draft.gridName = action.gridName;\r\n break;\r\n case types.MEMBER_GRID_COLUMN_INFO_SUCCESS:\r\n draft.loading = false;\r\n draft.columns = action.columns;\r\n break;\r\n case types.MEMBER_GRID_COLUMN_INFO_ERROR:\r\n draft.loading = false;\r\n break;\r\n case types.BAN_LIST_GRID_COLUMN_INFO:\r\n // draft.error = false;\r\n break;\r\n case types.BAN_LIST_GRID_COLUMN_INFO_SUCCESS:\r\n draft.banListColumns = action.columns;\r\n break;\r\n case types.BAN_LIST_GRID_COLUMN_INFO_ERROR:\r\n break;\r\n case types.GET_MEMBER_SHORT_DETAIL:\r\n draft.loadingDetail = true;\r\n draft.error = false;\r\n break;\r\n case types.GET_MEMBER_SHORT_DETAIL_SUCCESS:\r\n draft.loadingDetail = false;\r\n draft.memberData = action.data;\r\n break;\r\n case types.GET_MEMBER_SHORT_DETAIL_ERROR:\r\n draft.loadingDetail = false;\r\n draft.error = action.error;\r\n break;\r\n\r\n case types.GET_PRODUCTS_FOR_MEMBER:\r\n draft.productsForMember['loading'] = true;\r\n break;\r\n\r\n case types.GET_PRODUCTS_FOR_MEMBER_SUCCESS:\r\n draft.productsForMember['loading'] = false;\r\n draft.productsForMember['data'] = action.data.gridData;\r\n draft.productsForMember['pageIndex'] =\r\n action.data.paging.currentPageIndex;\r\n draft.productsForMember['pageSize'] =\r\n action.data.paging.currentPageSize;\r\n draft.productsForMember['totalItems'] = action.data.paging.totalRecord;\r\n break;\r\n\r\n case types.RESET_PRODUCT_FOR_MEMBER_STATE:\r\n draft.productsForMember['loading'] = false;\r\n draft.productsForMember['data'] = [];\r\n draft.productsForMember['pageIndex'] = 1;\r\n draft.productsForMember['pageSize'] = 20;\r\n draft.productsForMember['totalItems'] = 0;\r\n break;\r\n\r\n case types.GET_COLUMNS_PRODUCTS_FOR_MEMBER_SUCCESS:\r\n draft.productsForMember['columns'] = action.columns;\r\n break;\r\n\r\n case types.SAVE_ID_MEMBER:\r\n draft.productsForMember['memberId'] = action.id;\r\n break;\r\n\r\n case types.GET_PUBLIC_CONTACT_MEMBER:\r\n draft.loadingDetail = true;\r\n draft.error = null;\r\n break;\r\n case types.GET_PUBLIC_CONTACT_MEMBER_SUCCESS:\r\n draft.loadingDetail = false;\r\n draft.publicContactList = action.data;\r\n draft.error = null;\r\n break;\r\n case types.GET_PUBLIC_CONTACT_MEMBER_ERROR:\r\n draft.loadingDetail = false;\r\n draft.publicContactList = null;\r\n draft.error = action.error;\r\n break;\r\n\r\n }\r\n });\r\n\r\nexport default productReducer;\r\n","import React from 'react';\r\nimport { put, call, takeLatest, all } from 'redux-saga/effects';\r\n\r\nimport * as types from './constants';\r\nimport * as actions from './actions';\r\nimport * as services from 'services/members';\r\nimport * as servicesGrid from 'services/grid';\r\nimport * as ribbonType from '@redux/ribbon/constants';\r\nimport { AgGridIcons, GlnTooltip, AgGridThumbnail } from 'common/components';\r\nimport { DEFAULT_SORT } from 'static/Constants';\r\nimport { notification } from 'antd';\r\nimport CheckboxGrid from '../components/checkbox-grid/CheckboxGrid';\r\nimport { MemberLogo } from '../components';\r\n\r\nimport { formatProductDetailColumns } from 'pages/branded-products/controllers/saga';\r\n\r\nconst renderIcons = (params) => {\r\n const data = params?.data;\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst onMemberLogoRender = (param) => {\r\n return ;\r\n};\r\n\r\nconst renderGlns = (params) => {\r\n return ;\r\n};\r\n\r\nexport function* getMemberList(payload) {\r\n const { searchText, primaryFieldsOnly } = payload;\r\n\r\n const params = {\r\n ...payload,\r\n ...(searchText ? null : { sort: DEFAULT_SORT }),\r\n search: { searchText: searchText, primaryFieldsOnly: primaryFieldsOnly },\r\n };\r\n\r\n try {\r\n const response = yield call(services.getMemberList, params);\r\n\r\n const data = response?.data?.gridData || response?.gridData;\r\n const paging = response?.data?.paging || response?.paging;\r\n yield put(actions.getMemberListSuccess(data, paging?.totalRecord));\r\n } catch (error) {\r\n yield put(actions.getMemberListError(error));\r\n }\r\n}\r\n\r\nexport function* getMemberShortDetail(payload) {\r\n try {\r\n const response = yield call(services.getMemberShortDetail, {\r\n Id: payload.id,\r\n });\r\n const { isSuccess, data, message } = response;\r\n if (isSuccess) {\r\n yield put(actions.getMemberShortDetailSuccess(data));\r\n } else {\r\n yield put(actions.getMemberShortDetailError(message));\r\n }\r\n } catch (error) {\r\n yield put(actions.getMemberShortDetailError(error));\r\n }\r\n}\r\n\r\nexport function* gridMemberColumnInfo(payload) {\r\n try {\r\n const { response } = yield call(getColumnsFilter, payload);\r\n\r\n let columns = [\r\n {\r\n field: '',\r\n checkboxSelection: true,\r\n filter: false,\r\n suppressMenu: true,\r\n },\r\n {\r\n field: 'memberLogo',\r\n headerName: 'Member Logo',\r\n cellRenderer: onMemberLogoRender,\r\n filter: false,\r\n width: 70,\r\n resizable: false,\r\n allowSort: false,\r\n headerClass: 'header-text-hide',\r\n },\r\n {\r\n field: 'stateIcons',\r\n headerName: 'States',\r\n minWidth: 150,\r\n cellRenderer: renderIcons,\r\n filter: false,\r\n resizable: true,\r\n allowSort: false,\r\n headerClass: 'header-text-hide',\r\n },\r\n ];\r\n\r\n if (response && response.columns && response.columns.length > 0) {\r\n response.columns.forEach((val, index) => {\r\n if (\r\n val.fieldName !== 'Id' &&\r\n val.fieldName !== 'Type' &&\r\n val.fieldName !== 'ParentCompanyId' &&\r\n val.fieldName !== 'Thumb300' &&\r\n val.fieldName !== 'Thumb'\r\n ) {\r\n // let obj = Object.assign(val, { filterValues: filter[index] });\r\n const col = { ...val, resizable: true };\r\n if (val.fieldName === 'MemberName') {\r\n col.linkTo = `/company/{id}`;\r\n col.minWidth = 300;\r\n }\r\n\r\n if (val.fieldName === 'Glns') {\r\n col.filter = false;\r\n col.allowFilter = false;\r\n col.suppressMenu = true;\r\n col.allowSort = false;\r\n col.cellRenderer = renderGlns;\r\n }\r\n\r\n columns.push(col);\r\n }\r\n });\r\n }\r\n\r\n yield put(actions.gridMemberColumnInfoSuccess(columns));\r\n } catch (error) {\r\n yield put(actions.gridMemberColumnInfoError(error));\r\n }\r\n}\r\n\r\nexport function* getColumnsFilter(payload) {\r\n const response = yield call(servicesGrid.gridColumnInfo, payload.gridName);\r\n // const filter = yield call(getFilter, response);\r\n return { response };\r\n}\r\n\r\nexport function* getFilter(response) {\r\n const filter = yield all(\r\n response.columns &&\r\n response.columns.length > 0 &&\r\n response.columns.map((val) =>\r\n call(services.getMemberDetailGridDistinct, {\r\n fieldName: val.fieldName,\r\n })\r\n )\r\n );\r\n return filter;\r\n}\r\n\r\nexport function* getColumnsProductsForMembersSaga(payload) {\r\n try {\r\n const { response } = yield call(getColumnsFilter, payload);\r\n\r\n const columns = formatProductDetailColumns(response);\r\n\r\n yield put(actions.getColumnsProductsForMemberSuccess(columns));\r\n } catch (error) {\r\n yield put(actions.getColumnsProductsForMemberError(error));\r\n }\r\n}\r\n\r\nconst renderIconOwner = (params) => {\r\n return ;\r\n};\r\n\r\nexport function* getColumnForBanList(action) {\r\n try {\r\n const { response } = yield call(getColumnsFilter, action);\r\n\r\n const checkboxColumn = [\r\n {\r\n field: '',\r\n checkboxSelection: true,\r\n filter: false,\r\n suppressMenu: true,\r\n resizable: true,\r\n },\r\n ];\r\n\r\n let result = [];\r\n\r\n if (response && response.columns && response.columns.length > 0) {\r\n response.columns.forEach((val, index) => {\r\n if (val.fieldNameCamelCase === 'banByMemberName') {\r\n result.push({ ...val, resizable: true, width: 240 });\r\n } else if (val.fieldNameCamelCase === 'bannedMemberName') {\r\n result.push({ ...val, resizable: true, flex: 1 });\r\n }\r\n });\r\n }\r\n yield put(actions.banListColumnInfoSuccess([...checkboxColumn, ...result]));\r\n } catch (error) {\r\n yield put(actions.banListColumnInfoError(error));\r\n }\r\n}\r\n\r\nexport function* fetchPublicContact(payload) {\r\n if (payload.memberId) {\r\n try {\r\n const response = yield call(services.getPublicContact, {\r\n memberId: Number(payload.memberId),\r\n pageIndex: 1,\r\n pageSize: 100,\r\n });\r\n yield put({\r\n type: types.GET_PUBLIC_CONTACT_MEMBER_SUCCESS,\r\n data: response?.data?.gridData,\r\n });\r\n } catch (error) {\r\n yield put({\r\n type: types.GET_PUBLIC_CONTACT_MEMBER_ERROR,\r\n error,\r\n });\r\n }\r\n }\r\n}\r\n\r\nexport function* addToBanList(payload) {\r\n if (payload) {\r\n try {\r\n const response = yield call(services.addToBanList, {\r\n memberIds: payload.data,\r\n });\r\n if (response.isSuccess) {\r\n notification.success({ message: 'Add to ban list success' });\r\n yield put({\r\n type: types.GET_MEMBER_LIST,\r\n isFavoriteRoute: payload.isFavoriteRoute,\r\n pageSize: payload.page[1] !== 0 ? payload.page[1] : 20,\r\n pageNumber: 1,\r\n });\r\n }\r\n } catch (error) {}\r\n }\r\n}\r\n\r\nexport function* removeToBanList(payload) {\r\n if (payload) {\r\n try {\r\n const response = yield call(services.removeToBanList, {\r\n memberIds: payload.data,\r\n });\r\n if (response.isSuccess) {\r\n notification.success({ message: 'Remove from ban list success' });\r\n }\r\n } catch (error) {}\r\n }\r\n}\r\n\r\nfunction* watchAll() {\r\n yield all([\r\n takeLatest(types.GET_MEMBER_SHORT_DETAIL, getMemberShortDetail),\r\n takeLatest(types.GET_MEMBER_LIST, getMemberList),\r\n takeLatest(types.MEMBER_GRID_COLUMN_INFO, gridMemberColumnInfo),\r\n takeLatest(\r\n types.GET_COLUMNS_PRODUCTS_FOR_MEMBER,\r\n getColumnsProductsForMembersSaga\r\n ),\r\n takeLatest(types.GET_PUBLIC_CONTACT_MEMBER, fetchPublicContact),\r\n takeLatest(ribbonType.ADD_TO_BAN_LIST, addToBanList),\r\n takeLatest(types.BAN_LIST_GRID_COLUMN_INFO, getColumnForBanList),\r\n takeLatest(types.REMOVE_BAN_LIST, removeToBanList),\r\n ]);\r\n}\r\n\r\nexport default watchAll;\r\n","import { createSelector } from 'reselect';\r\nimport { initialState } from './reducer';\r\n\r\nconst selectMemberList = (state) => state.memberList || initialState;\r\n\r\nconst makeSelectLoading = () =>\r\n createSelector(selectMemberList, (memberState) => memberState.loading);\r\nconst makeSelectMemberList = () =>\r\n createSelector(selectMemberList, (memberState) => memberState.members);\r\nconst makeSelectTotal = () =>\r\n createSelector(selectMemberList, (memberState) => memberState.total);\r\nconst makeSelectPageSize = () =>\r\n createSelector(selectMemberList, (memberState) => memberState.pageSize);\r\nconst makeSelectPageNumber = () =>\r\n createSelector(selectMemberList, (memberState) => memberState.pageNumber);\r\nconst makeSelectSearch = () =>\r\n createSelector(selectMemberList, (memberState) => memberState.search);\r\nconst makeSelectColumns = () =>\r\n createSelector(selectMemberList, (memberState) => memberState.columns);\r\nconst makeSelectBanListColumns = () =>\r\n createSelector(selectMemberList, (memberState) => memberState.banListColumns);\r\nconst makeSelectLoadingDetail = () =>\r\n createSelector(selectMemberList, (memberState) => memberState.loadingDetail);\r\nconst makeSelectMemberData = () =>\r\n createSelector(selectMemberList, (memberState) => memberState.memberData);\r\nconst makeSelectPublicContactList = () =>\r\n createSelector(\r\n selectMemberList,\r\n (memberState) => memberState.publicContactList\r\n );\r\n\r\nconst makeSelectProductsForMember = () =>\r\n createSelector(\r\n selectMemberList,\r\n (memberState) => memberState.productsForMember\r\n );\r\n\r\nconst makeSelectIsDisplayMemberNew = () =>\r\n createSelector(\r\n selectMemberList,\r\n (memberState) => memberState.isDisplayMemberNew\r\n );\r\n\r\nexport {\r\n selectMemberList,\r\n makeSelectLoading,\r\n makeSelectMemberList,\r\n makeSelectTotal,\r\n makeSelectPageSize,\r\n makeSelectPageNumber,\r\n makeSelectSearch,\r\n makeSelectColumns,\r\n makeSelectLoadingDetail,\r\n makeSelectMemberData,\r\n makeSelectProductsForMember,\r\n makeSelectPublicContactList,\r\n makeSelectBanListColumns,\r\n makeSelectIsDisplayMemberNew,\r\n};\r\n","import * as types from './constants';\r\n\r\nexport const getAPLGridColumns = (gridName) => ({\r\n type: types.GET_PRODUCT_APL_GRID_COLUMN,\r\n payload: gridName,\r\n});\r\n\r\nexport const getAPLGridColumnsSuccess = (columns) => {\r\n return {\r\n type: types.GET_PRODUCT_APL_GRID_COLUMN_SUCCESS,\r\n payload: columns,\r\n };\r\n};\r\n\r\nexport const getAPLGridColumnsError = (error) => ({\r\n type: types.GET_PRODUCT_APL_GRID_COLUMN_ERROR,\r\n payload: error,\r\n});\r\n\r\nexport function setSelectedDate(payload) {\r\n return {\r\n type: types.SET_APL_SCHEDULE_SELECTED_DATE,\r\n payload,\r\n };\r\n}\r\n\r\nexport function setScheduleEvents(payload) {\r\n return {\r\n type: types.SET_APL_SCHEDULE_EVENTS,\r\n payload,\r\n };\r\n}\r\n\r\nexport function setScheduleIsDragStart(status) {\r\n return {\r\n type: types.SET_APL_SCHEDULE_IS_DRAG_START,\r\n status,\r\n };\r\n}\r\n\r\nexport function toggleScheduleModal(payload) {\r\n return {\r\n type: types.TOGGLE_APL_SCHEDULE_MODAL,\r\n payload,\r\n };\r\n}\r\n\r\nexport function toggleReloadGridApl() {\r\n return {\r\n type: types.TOGGLE_RELOAD_GRID_APL,\r\n };\r\n}\r\n\r\nexport function resetReloadGridApl() {\r\n return {\r\n type: types.RESET_RELOAD_GRID_APL,\r\n };\r\n}\r\n","export const GET_PRODUCT_APL_GRID_COLUMN = 'GET_PRODUCT_APL_GRID_COLUMN';\r\nexport const GET_PRODUCT_APL_GRID_COLUMN_SUCCESS =\r\n 'GET_PRODUCT_APL_GRID_COLUMN_SUCCESS';\r\nexport const GET_PRODUCT_APL_GRID_COLUMN_ERROR =\r\n 'GET_PRODUCT_APL_GRID_COLUMN_ERROR';\r\n\r\nexport const SET_APL_SCHEDULE_SELECTED_DATE = 'SET_APL_SCHEDULE_SELECTED_DATE';\r\nexport const SET_APL_SCHEDULE_EVENTS = 'SET_APL_SCHEDULE_EVENTS';\r\nexport const SET_APL_SCHEDULE_IS_DRAG_START = 'SET_APL_SCHEDULE_IS_DRAG_START';\r\nexport const TOGGLE_APL_SCHEDULE_MODAL = 'TOGGLE_APL_SCHEDULE_MODAL';\r\n\r\nexport const TOGGLE_RELOAD_GRID_APL = 'TOGGLE_RELOAD_GRID_APL';\r\nexport const RESET_RELOAD_GRID_APL = 'RESET_RELOAD_GRID_APL';\r\n","import produce from 'immer';\r\nimport * as types from './constants';\r\n\r\n// initial state\r\n\r\nexport const initialState = {\r\n loading: false,\r\n productAplColumns: [],\r\n error: null,\r\n reloadGrid: false,\r\n};\r\n\r\nconst productAPLReducer = (state = initialState, action) =>\r\n produce(state, (draft) => {\r\n switch (action.type) {\r\n case types.GET_PRODUCT_APL_GRID_COLUMN:\r\n draft.loading = true;\r\n draft.productAplColumns = [];\r\n break;\r\n case types.GET_PRODUCT_APL_GRID_COLUMN_SUCCESS:\r\n draft.loading = false;\r\n draft.productAplColumns = action.payload;\r\n break;\r\n case types.GET_PRODUCT_APL_GRID_COLUMN_ERROR:\r\n draft.loading = false;\r\n draft.productAplColumns = [];\r\n draft.error = action.payload;\r\n break;\r\n\r\n case types.TOGGLE_RELOAD_GRID_APL:\r\n draft.reloadGrid = true;\r\n break;\r\n case types.RESET_RELOAD_GRID_APL:\r\n draft.reloadGrid = false;\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n });\r\n\r\nexport default productAPLReducer;\r\n","import { put, call, takeLatest, all } from 'redux-saga/effects';\r\nimport * as servicesGrid from 'services/grid';\r\nimport * as types from './constants';\r\nimport * as actions from './actions';\r\n\r\nimport { formatMDYWithParam } from 'utils/formatDate';\r\nimport { calculateToPercentByParam } from 'utils/formatSizeUnits';\r\n\r\nexport function* getProductAplColumns(action) {\r\n const { linkTarget } = action.payload || {};\r\n try {\r\n const response = yield call(servicesGrid.gridColumnInfo, 'apl-grid');\r\n let columns = [\r\n {\r\n field: '',\r\n checkboxSelection: true,\r\n filter: false,\r\n suppressMenu: true,\r\n sortable: false,\r\n },\r\n ];\r\n if (response?.columns?.length > 0) {\r\n let hiddenCol = [\r\n 'id',\r\n 'ownerCompanyId',\r\n 'createdBy', // createById\r\n 'shareable',\r\n 'type',\r\n ];\r\n const dateList = ['created', 'lastModified'];\r\n response.columns.forEach((val, index) => {\r\n if (hiddenCol.indexOf(val.fieldNameCamelCase) === -1) {\r\n // eslint-disable-next-line no-lone-blocks\r\n {\r\n if (val.fieldNameCamelCase === 'aplDescription') {\r\n val = { ...val, flex: 1, minWidth: 200, resizable: true };\r\n } else if (dateList.includes(val.fieldNameCamelCase)) {\r\n val = {\r\n ...val,\r\n width: 140,\r\n cellRenderer: formatMDYWithParam,\r\n resizable: true,\r\n };\r\n } else if (val.fieldNameCamelCase === 'matchedRate') {\r\n val = {\r\n ...val,\r\n width: 120,\r\n cellRenderer: calculateToPercentByParam,\r\n resizable: true,\r\n };\r\n } else {\r\n val = { ...val, width: 160, resizable: true };\r\n }\r\n\r\n if (val.fieldNameCamelCase === 'aplName')\r\n val = {\r\n ...val,\r\n linkTo: '/products/apl/{id}',\r\n minWidth: 300,\r\n linkTarget,\r\n };\r\n\r\n columns.push(val);\r\n }\r\n }\r\n });\r\n }\r\n\r\n yield put(actions.getAPLGridColumnsSuccess(columns));\r\n } catch (error) {\r\n yield put(actions.getAPLGridColumnsError(error));\r\n }\r\n}\r\n\r\nfunction* watchAll() {\r\n yield all([\r\n takeLatest(types.GET_PRODUCT_APL_GRID_COLUMN, getProductAplColumns),\r\n ]);\r\n}\r\n\r\nexport default watchAll;\r\n","import { createSelector } from 'reselect';\r\nimport { initialState } from './reducer';\r\n\r\nconst selectProductAPL = (state) => state.productAPL || initialState;\r\n\r\nconst selectProductAPLColumns = () =>\r\n createSelector(selectProductAPL, (aplState) => aplState.productAplColumns);\r\n\r\nconst makeSelectReloadGridApl = () =>\r\n createSelector(selectProductAPL, (aplState) => aplState.reloadGrid);\r\n\r\nexport { selectProductAPLColumns, makeSelectReloadGridApl };\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { ThumbnailItem } from 'common/components';\r\nimport { useCheckAllowEditProducts } from 'hooks';\r\n\r\nconst ProductThumbnail = (props) => {\r\n const {\r\n dataDetail,\r\n selected,\r\n onClickItemGrid,\r\n onClickCheckboxItem,\r\n onDoubleClick,\r\n labelThumbnail,\r\n imageThumbnail,\r\n ...rest\r\n } = props;\r\n\r\n const { checkAllowEditProductFull } = useCheckAllowEditProducts();\r\n\r\n const isAllowEditProduct = checkAllowEditProductFull(dataDetail);\r\n\r\n return (\r\n \r\n );\r\n};\r\nProductThumbnail.propTypes = {\r\n dataDetail: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default ProductThumbnail;\r\n","import React from 'react';\r\n\r\nimport { Row, Col, Typography, Spin } from 'antd';\r\nimport { LoadingOutlined } from '@ant-design/icons';\r\nimport { TooltipParagraph } from 'common/components';\r\nimport { findDimensionEnumDisplay } from '../../../product-full-view/mappers/mapToEnums';\r\n\r\nconst Loading = () => {\r\n const loadingIcon = ;\r\n\r\n return (\r\n
\r\n \r\n
\r\n );\r\n};\r\n\r\nconst InformationLabel = ({ children, ...otherProps }) => {\r\n return (\r\n \r\n \r\n {children}:\r\n \r\n \r\n );\r\n};\r\n\r\nconst InformationData = ({ data, children, ...otherProps }) => {\r\n return (\r\n \r\n {children}\r\n {data && {data}}\r\n \r\n );\r\n};\r\n\r\nconst ListDimensionInfo = ({\r\n listNameDimension,\r\n listImperialValue,\r\n imperialUnit,\r\n listMetricValue,\r\n metricUnit,\r\n productEnums,\r\n}) => {\r\n return (\r\n <>\r\n {listImperialValue.map((imperialValue, index) => (\r\n \r\n ))}\r\n \r\n );\r\n};\r\n\r\nconst DimensionInfo = ({\r\n name,\r\n\r\n imperialValue,\r\n imperialUnit,\r\n metricValue,\r\n metricUnit,\r\n productEnums,\r\n}) => {\r\n return (\r\n \r\n \r\n {name}: \r\n \r\n {isNaN(parseFloat(imperialValue)) ? (\r\n 'N/A'\r\n ) : (\r\n <>\r\n {Math.round(parseFloat(imperialValue) * 100) / 100}{' '}\r\n {findDimensionEnumDisplay(imperialUnit, productEnums)}\r\n \r\n )}\r\n \r\n \r\n \r\n {name}: \r\n \r\n {isNaN(parseFloat(metricValue)) ? (\r\n 'N/A'\r\n ) : (\r\n <>\r\n {Math.round(parseFloat(metricValue) * 100) / 100}{' '}\r\n {findDimensionEnumDisplay(metricUnit, productEnums)}\r\n \r\n )}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport {\r\n InformationLabel,\r\n InformationData,\r\n ListDimensionInfo,\r\n DimensionInfo,\r\n Loading,\r\n};\r\n","import React, { useRef, useEffect, useState } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { useIntl } from 'react-intl';\r\n\r\nimport { Row, Col, Tooltip, Typography, Divider } from 'antd';\r\nimport { EyeOutlined } from '@ant-design/icons';\r\nimport { isEmpty } from 'lodash';\r\n\r\nimport Messages from 'i18n/messages/product';\r\n\r\nimport { FavoriteStarIconRender, Img } from 'common/components';\r\nimport {\r\n InformationLabel,\r\n InformationData,\r\n ListDimensionInfo,\r\n DimensionInfo,\r\n Loading,\r\n} from './SharedComponents';\r\n\r\nimport { Images } from 'config/assets';\r\n\r\nimport useDoubleClick from 'hooks/useDoubleClick';\r\nimport { forwardTo } from 'utils/common/route';\r\n\r\nimport { getProductShortDetail } from 'services/product';\r\nimport selectorsGridView from 'common/components/grid-view/controllers/selectors';\r\n\r\nimport { useGetProductEnums } from 'hooks';\r\n\r\nimport './style.less';\r\n\r\n/**\r\n * Use for Content Pane\r\n * Use for Right section of Product History\r\n */\r\nconst ProductContentPanel = (props) => {\r\n const {\r\n historyPage = false,\r\n productShortDetailHistory,\r\n historyProductId,\r\n productId,\r\n forceVisible = false,\r\n getProductDetail,\r\n } = props;\r\n\r\n const detailCurrentItemsSelection = useSelector(\r\n selectorsGridView.makeSelectDetailCurrentITemsSelection()\r\n );\r\n\r\n const idProduct = detailCurrentItemsSelection[0]?.id || productId;\r\n\r\n const visibleContentPanel = useSelector(\r\n selectorsGridView.makeSelectVisible()\r\n );\r\n\r\n const [product, setProduct] = useState(null);\r\n\r\n useEffect(() => {\r\n if (!productId) setProduct(null);\r\n\r\n if (\r\n historyPage ||\r\n (forceVisible === false && visibleContentPanel === false) ||\r\n !idProduct\r\n )\r\n return;\r\n\r\n getProductShortDetail({ id: idProduct }).then((resp) => {\r\n if (resp?.isSuccess) {\r\n setProduct(resp.data);\r\n }\r\n });\r\n }, [historyPage, idProduct, visibleContentPanel]);\r\n\r\n useEffect(() => {\r\n if (historyPage && !isEmpty(productShortDetailHistory)) {\r\n setProduct(productShortDetailHistory);\r\n }\r\n }, [JSON.stringify(productShortDetailHistory)]);\r\n\r\n useEffect(() => {\r\n if (product && getProductDetail) {\r\n getProductDetail(product);\r\n }\r\n }, [product, getProductDetail]);\r\n\r\n return (\r\n <>\r\n {product ? (\r\n \r\n \r\n \r\n \r\n \r\n ) : (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport const ProductContent = ({ children }) => {\r\n return {children};\r\n};\r\n\r\nexport const ProductActions = ({ id }) => {\r\n return (\r\n \r\n \r\n \r\n forwardTo(`/product/${id}`)}\r\n />\r\n \r\n \r\n {/* \r\n \r\n console.log('Download API does not has yet')}\r\n />\r\n \r\n */}\r\n \r\n );\r\n};\r\n\r\nexport const ProductLogoThumbnail = ({ id, logo }) => {\r\n const logoRef = useRef();\r\n\r\n useDoubleClick({\r\n onDoubleClick: () => {\r\n forwardTo(`/product/${id}`);\r\n },\r\n ref: logoRef,\r\n latency: 250,\r\n });\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport const ProductInformation = ({ product, historyPage = false }) => {\r\n const {\r\n productName,\r\n productDescription,\r\n rivirId,\r\n brandName = 'N/A',\r\n brickCode = 'N/A',\r\n brickCodeName = 'N/A',\r\n productType,\r\n gtin,\r\n imperialHeight,\r\n height: metricHeight,\r\n imperialWidth,\r\n width: metricWidth,\r\n imperialDepth,\r\n depth: metricDepth,\r\n imperialWeight,\r\n weight: metricWeight,\r\n imperialDimensionUOM,\r\n dimensionUOM: metricDimensionUOM,\r\n imperialWeightUOM,\r\n weightUOM: metricWeightUOM,\r\n isFavorited,\r\n } = product;\r\n\r\n const intl = useIntl();\r\n\r\n // H: Height, W: Width, D: Depth\r\n const listNameDimension = ['H', 'W', 'D'];\r\n\r\n const listImperialValue = [imperialHeight, imperialWidth, imperialDepth];\r\n const listMetricValue = [metricHeight, metricWidth, metricDepth];\r\n const { productEnums } = useGetProductEnums();\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {productName}\r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n {intl.formatMessage(Messages.description)}\r\n \r\n \r\n \r\n\r\n \r\n \r\n {intl.formatMessage(Messages.rivirID)}\r\n \r\n \r\n\r\n \r\n {intl.formatMessage(Messages.brandName)}\r\n \r\n \r\n\r\n \r\n {intl.formatMessage(Messages.barcode)}\r\n \r\n \r\n\r\n \r\n {intl.formatMessage(Messages.bricCode)}\r\n \r\n \r\n {/* TODOS: Applied after*/}\r\n \r\n\r\n \r\n {intl.formatMessage(Messages.dimensions)}\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default ProductContentPanel;\r\n","import { AgGridIcons, AgGridThumbnail } from 'common/components';\r\nimport { Link } from 'react-router-dom';\r\n\r\nimport { PrimarySizeUOM } from '../';\r\n\r\nconst renderIcons = (params) => {\r\n const data = params?.data;\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst renderThumbnail = (params) => {\r\n const thumbnail300 = params?.data?.thumbnail;\r\n const thumbnail500 = params?.data?.thumb500;\r\n const thumbnail1000 = params?.data?.thumb1000;\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst renderOverlayThumbnail = (params) => {\r\n const thumbnail300 = params?.data?.thumbnail;\r\n const thumbnail500 = params?.data?.thumb500;\r\n const thumbnail1000 = params?.data?.thumb1000;\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst renderPrimarySizeUOM = (params) => {\r\n return ;\r\n};\r\n\r\nconst customCellComponents = {\r\n renderThumbnail,\r\n renderIcons,\r\n renderPrimarySizeUOM,\r\n renderOverlayThumbnail,\r\n};\r\n\r\nexport default customCellComponents;\r\n","/* eslint-disable jsx-a11y/alt-text */\r\nimport React from 'react';\r\n\r\nimport classnames from 'classnames';\r\n\r\nimport { Row } from 'antd';\r\nimport { Images } from 'config/assets';\r\n\r\nimport { useImageLoaded } from 'hooks';\r\n\r\nconst ProductTileHeader = (props) => {\r\n const { productName, thumbnail } = props;\r\n\r\n const [ref, loaded, onLoad] = useImageLoaded();\r\n\r\n console.log('loaded', { loaded });\r\n\r\n return (\r\n \r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n \r\n
\r\n );\r\n};\r\n\r\nexport default ProductTileHeader;\r\n","import React, { useMemo } from 'react';\r\nimport { Typography, Space, Row, Col, Tooltip } from 'antd';\r\nimport classnames from 'classnames';\r\n\r\nimport { StarFilled, SafetyOutlined } from '@ant-design/icons';\r\nimport IconList from 'common/components/icon-list/IconList';\r\nimport { packageLevelIcons } from 'common/components/icon-list/assets';\r\nimport ProductSubscription from 'common/components/thumb/product/ProductSubscription';\r\nimport EntityStatusTag from 'common/components/tag/entity-status-tag/EntityStatusTag';\r\nimport PrivateLabelIcon from 'common/components/thumb/product/PrivateLabelcon';\r\n\r\nimport * as getLink from 'utils/common/linkBuilder';\r\n\r\nconst ProductTileBody = (props) => {\r\n const {\r\n productName,\r\n productDescription,\r\n brandName,\r\n isFavorited,\r\n subscription,\r\n packageLevel,\r\n categories,\r\n weight,\r\n weightUOM,\r\n imperialWeight,\r\n imperialWeightUOM,\r\n primarySize,\r\n primarySizeUOM,\r\n subscriptionShield,\r\n gdsnShield,\r\n id,\r\n status,\r\n isPrivateLabel,\r\n } = props;\r\n const { Paragraph, Title } = Typography;\r\n\r\n const categoryIcon = useMemo(() => {\r\n const defaultCategory = categories || [];\r\n let nextCategoryList = [...defaultCategory];\r\n\r\n if (packageLevel) {\r\n const foundPackageIcon = packageLevelIcons.find(\r\n (packItem) => packItem?.name === packageLevel.toLowerCase()\r\n );\r\n\r\n if (foundPackageIcon) {\r\n nextCategoryList = [foundPackageIcon, ...nextCategoryList];\r\n }\r\n }\r\n\r\n if (true) {\r\n nextCategoryList = [\r\n // {\r\n // ...productSubscriptionIcon,\r\n // style: {\r\n // fontSize: 19,\r\n // color: subscriptionShield,\r\n // top: 3,\r\n // position: 'relative',\r\n // },\r\n // },\r\n ...nextCategoryList,\r\n ];\r\n }\r\n\r\n return nextCategoryList;\r\n }, [subscription, packageLevel, categories]);\r\n\r\n const aLink = getLink.productLink(id, productName);\r\n return (\r\n
\r\n \r\n \r\n \r\n {aLink}\r\n \r\n \r\n {productDescription}\r\n \r\n\r\n \r\n {brandName}\r\n \r\n {!!weight && (\r\n \r\n {weight} {weightUOM}\r\n \r\n )}\r\n {!!imperialWeight && (\r\n \r\n {imperialWeight} {imperialWeightUOM}\r\n \r\n )}\r\n {!!primarySize && (\r\n \r\n {primarySize} {primarySizeUOM}\r\n \r\n )}\r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {isPrivateLabel && }\r\n {gdsnShield && (\r\n \r\n \r\n \r\n )}\r\n {isFavorited && }\r\n {subscription && }\r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nconst styles = {\r\n favoriteIcon: {\r\n fontSize: '18px',\r\n color: '#fec810',\r\n },\r\n};\r\n\r\nexport default ProductTileBody;\r\n","import React from 'react';\r\nimport { Typography, Row, Col } from 'antd';\r\n\r\nimport classnames from 'classnames';\r\n\r\nconst ProductTileFooter = (props) => {\r\n const { upc12, rivirId, gtin } = props;\r\n const { Text } = Typography;\r\n\r\n return (\r\n
\r\n {upc12 || gtin ? (\r\n <>\r\n \r\n \r\n \r\n GTIN:\r\n \r\n \r\n {gtin || 'N/A'}\r\n \r\n \r\n \r\n \r\n UPC12:\r\n \r\n \r\n {upc12 || 'N/A'}\r\n \r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n RIVIR ID:\r\n \r\n \r\n {rivirId || 'N/A'}\r\n \r\n \r\n \r\n )}\r\n
\r\n );\r\n};\r\n\r\nexport default ProductTileFooter;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n// import { forwardTo } from 'utils/common/route';\r\nimport { useHistory } from 'react-router';\r\nimport ProductTileHeader from './ProductTileHeader';\r\nimport ProductTileBody from './ProductTileBody';\r\nimport ProductTileFooter from './ProductTileFooter';\r\nimport useDoubleClick from 'hooks/useDoubleClick';\r\n\r\nimport './ProductTile.less';\r\n\r\n/**\r\n * A component displays product information under card layout\r\n * @param {object} props\r\n */\r\nconst ProductTile = (props) => {\r\n const { dataDetail } = props;\r\n const { onClickItemGrid, onDoubleClick } = props.clickEvents;\r\n const history = useHistory();\r\n\r\n const divRef = React.useRef();\r\n\r\n useDoubleClick({\r\n onSingleClick: (e) => {\r\n if (onClickItemGrid) onClickItemGrid(dataDetail, e);\r\n },\r\n onDoubleClick: (e) => {\r\n if (onDoubleClick) {\r\n history.push(`/product/${dataDetail?.id}`);\r\n // forwardTo(`${pathname}/${dataDetail?.id}`);\r\n }\r\n },\r\n ref: divRef,\r\n latency: 250,\r\n });\r\n\r\n return (\r\n
\r\n {/*Placeholder for click events*/}\r\n \r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nProductTile.propTypes = {\r\n /**\r\n * product data detail\r\n */\r\n dataDetail: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default ProductTile;\r\n","import React, { Fragment } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Row, Col, Typography } from 'antd';\r\n\r\nconst { Text } = Typography;\r\n\r\nconst ProductCategory = (props) => {\r\n const { dataDetail } = props;\r\n\r\n return (\r\n \r\n \r\n \r\n Category: \r\n \r\n {dataDetail && dataDetail.categoryName}\r\n \r\n Classification: \r\n \r\n {dataDetail && dataDetail.classificationName}\r\n \r\n \r\n \r\n Sub-Category: \r\n \r\n {dataDetail && dataDetail.subCategoryName}\r\n \r\n Sub-classi: \r\n \r\n {dataDetail && dataDetail.subClassificationName}\r\n \r\n \r\n );\r\n};\r\n\r\nProductCategory.propTypes = {\r\n dataDetail: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default ProductCategory;\r\n","import React, { Fragment } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Typography } from 'antd';\r\n\r\nconst { Paragraph } = Typography;\r\n\r\nconst ProductData = (props) => {\r\n const { dataDetail } = props;\r\n\r\n return (\r\n \r\n \r\n {dataDetail && dataDetail.productName}\r\n \r\n \r\n {dataDetail && dataDetail.brandName}\r\n \r\n \r\n {dataDetail &&\r\n dataDetail.packageLevelInformation &&\r\n dataDetail.packageLevelInformation.length > 0 &&\r\n dataDetail.packageLevelInformation[0].gtin}\r\n \r\n \r\n {dataDetail && dataDetail.memberName}\r\n \r\n \r\n {dataDetail && dataDetail.primarySize} \r\n {dataDetail && dataDetail.primarySizeUom}\r\n \r\n \r\n );\r\n};\r\n\r\nProductData.propTypes = {\r\n dataDetail: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default ProductData;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Row, Col, Typography } from 'antd';\r\n\r\nconst { Text } = Typography;\r\n\r\nconst ProductDescription = (props) => {\r\n const { dataDetail } = props;\r\n\r\n return (\r\n \r\n \r\n Extended Description:\r\n \r\n \r\n {dataDetail && dataDetail.productDescription}\r\n \r\n \r\n );\r\n};\r\n\r\nProductDescription.propTypes = {\r\n dataDetail: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default ProductDescription;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Row, Space, Avatar } from 'antd';\r\nimport { Images } from 'config/assets';\r\nconst ProductIdentification = (props) => {\r\n const { dataDetail } = props;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nProductIdentification.propTypes = {\r\n dataDetail: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default ProductIdentification;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Avatar } from 'antd';\r\nimport { Images } from 'config/assets';\r\n\r\nconst ProductLogo = (props) => {\r\n const { dataDetail } = props;\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nProductLogo.propTypes = {\r\n dataDetail: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default ProductLogo;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Row, Col, Typography } from 'antd';\r\n\r\nconst { Paragraph } = Typography;\r\n\r\nconst ProductRightData = (props) => {\r\n const { dataDetail } = props;\r\n\r\n return (\r\n \r\n \r\n Last Modified:\r\n \r\n {\r\n //TODO: DATETIME\r\n dataDetail && dataDetail.lastModifiedDate\r\n }\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nProductRightData.propTypes = {\r\n dataDetail: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default ProductRightData;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Row, Col, Divider } from 'antd';\r\nimport * as ProductHeader from './header/index';\r\nimport './ProductInfo.less';\r\n\r\nconst ProductInfo = (props) => {\r\n const { dataDetail } = props;\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nProductInfo.propTypes = {\r\n dataDetail: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default ProductInfo;\r\n","import React from 'react';\r\nimport { Input, Select, Row, Col, Typography } from 'antd';\r\nimport { CodeSandboxOutlined } from '@ant-design/icons';\r\n\r\nimport { WrapperSelect } from 'common/components';\r\n\r\nconst { Paragraph } = Typography;\r\nconst { Option } = Select;\r\nconst options = [1, 2, 3, 4, 5];\r\n\r\nconst ProductPackageLevelInfo = (props) => {\r\n const {\r\n gtin,\r\n upc12,\r\n height,\r\n width,\r\n depth,\r\n weight,\r\n cube,\r\n pack,\r\n packageLevel,\r\n } = props.packageLevelInformation;\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {options &&\r\n options.map((item, index) => {\r\n return (\r\n \r\n );\r\n })}\r\n \r\n \r\n {gtin} \r\n {upc12} \r\n {height} \r\n {width} \r\n {depth} \r\n {weight} \r\n {cube} \r\n {pack} \r\n \r\n \r\n );\r\n};\r\n\r\nexport default ProductPackageLevelInfo;\r\n","import React, { useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Row, Col, Typography } from 'antd';\r\nimport { LeftOutlined, RightOutlined } from '@ant-design/icons';\r\nimport { FormattedMessage } from 'react-intl';\r\nimport Messages from 'i18n/messages/brandedProduct.js';\r\nimport ProductPackageLevelInfo from './info/ProductPackageLevelInfo';\r\nimport 'slick-carousel/slick/slick.css';\r\nimport 'slick-carousel/slick/slick-theme.css';\r\nimport './ProductPackageLevel.less';\r\n\r\nconst { Paragraph } = Typography;\r\n\r\nconst compare = (a, b) => {\r\n if (a.packageLevel < b.packageLevel) {\r\n return -1;\r\n }\r\n if (a.packageLevel > b.packageLevel) {\r\n return 1;\r\n }\r\n return 0;\r\n};\r\n\r\nconst ProductPackageLevel = (props) => {\r\n const [currentSlide, setCurrentSlide] = useState(0);\r\n const [transformPixel, setTransformPixel] = useState(0);\r\n const { dataDetail } = props;\r\n const slides =\r\n dataDetail &&\r\n dataDetail.packageLevelInformation &&\r\n dataDetail.packageLevelInformation.length > 0\r\n ? [...dataDetail.packageLevelInformation].sort(compare)\r\n : [];\r\n\r\n const selectSilde = (index) => {\r\n if (currentSlide === index) return;\r\n setCurrentSlide(index);\r\n if (slides.length < 2) return;\r\n setTransformPixel(\r\n transformPixel - ((index - currentSlide) * 100) / slides.length\r\n );\r\n };\r\n\r\n const onClickLeftSlider = () => {\r\n if (currentSlide === 0) return;\r\n const current = currentSlide - 1;\r\n setTransformPixel(transformPixel + 100 / slides.length);\r\n setCurrentSlide(current);\r\n };\r\n\r\n const onClickRightSlider = () => {\r\n if (currentSlide >= slides.length - 3) return;\r\n const current = currentSlide + 1;\r\n setTransformPixel(transformPixel - 100 / slides.length);\r\n setCurrentSlide(current);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n  \r\n \r\n \r\n :\r\n \r\n \r\n :\r\n \r\n \r\n :\r\n \r\n \r\n :\r\n \r\n \r\n :\r\n \r\n \r\n :\r\n \r\n \r\n :\r\n \r\n \r\n :\r\n \r\n \r\n :\r\n \r\n \r\n \r\n \r\n onClickLeftSlider()}\r\n style={{\r\n fontSize: '20px',\r\n color: 'black',\r\n position: 'absolute',\r\n zIndex: 10,\r\n cursor: 'pointer',\r\n left: '0',\r\n }}\r\n />\r\n = slides.length - 3 ? 'arrow-disabled' : ''\r\n }\r\n disabled={true}\r\n onClick={() => onClickRightSlider()}\r\n style={{\r\n fontSize: '20px',\r\n color: 'black',\r\n position: 'absolute',\r\n right: '0',\r\n zIndex: 10,\r\n cursor: 'pointer',\r\n }}\r\n />\r\n \r\n \r\n {slides &&\r\n slides.length &&\r\n slides.map((item, index) => {\r\n let cssSlider = 'slick-slide';\r\n if (index >= currentSlide && index <= currentSlide + 2) {\r\n cssSlider += ' slick-active';\r\n }\r\n if (index === currentSlide) {\r\n cssSlider += ' slick-current';\r\n }\r\n return (\r\n selectSilde(index)}\r\n style={{\r\n outline: 'none',\r\n width: `${100 / slides.length}%`,\r\n }}\r\n className={cssSlider}\r\n >\r\n \r\n \r\n );\r\n })}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nProductPackageLevel.propTypes = {\r\n dataDetail: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default ProductPackageLevel;\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport {\r\n QuestionCircleOutlined,\r\n CheckCircleOutlined,\r\n PieChartOutlined,\r\n} from \"@ant-design/icons\";\r\nimport { Space, Row, Col, Avatar, Typography } from \"antd\";\r\n\r\nimport { get } from \"lodash\";\r\n\r\nimport { FormattedMessage } from \"react-intl\";\r\nimport Messages from \"i18n/messages/brandedProduct\";\r\n\r\nimport \"./ProductIngredient.less\";\r\n/**\r\n * TODO: remove this static image\r\n */\r\nimport ingredientIcon from \"assets/ingredient.png\";\r\nconst { Text, Paragraph } = Typography;\r\n\r\n/**\r\n * This function just render static UI\r\n * TODO: apply detail data later\r\n */\r\nconst renderStaticIconList = () => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst renderIngredientItem = (item, key) => {\r\n const { label, render, extra } = item;\r\n return (\r\n \r\n \r\n {label ? (\r\n \r\n :\r\n \r\n ) : null}\r\n \r\n \r\n {render && render}\r\n \r\n {extra && (\r\n \r\n {extra}\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nconst ProductIngredient = (props) => {\r\n const { dataDetail } = props;\r\n const ingredientContent = get(dataDetail, \"ingredient\", false);\r\n\r\n const ingredientIconComp = (\r\n \r\n );\r\n\r\n const ingredientExtraContent = ingredientContent ? (\r\n {ingredientContent}\r\n ) : null;\r\n\r\n const renderData = [\r\n // Ingredient\r\n {\r\n label: Messages.ingredientLabel,\r\n render: ingredientIconComp,\r\n extra: ingredientExtraContent,\r\n },\r\n // allergens\r\n {\r\n label: Messages.allergensLabel,\r\n render: renderStaticIconList(),\r\n },\r\n // Certification\r\n {\r\n label: Messages.certificationsLabel,\r\n render: renderStaticIconList(),\r\n },\r\n ];\r\n\r\n return (\r\n \r\n {renderData &&\r\n renderData.length > 0 &&\r\n renderData.map((data, index) => renderIngredientItem(data, index))}\r\n \r\n );\r\n};\r\n\r\nProductIngredient.propTypes = {\r\n dataDetail: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default ProductIngredient;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport Slider from 'react-slick';\r\nimport 'slick-carousel/slick/slick.css';\r\nimport 'slick-carousel/slick/slick-theme.css';\r\nimport './SlickSlider.less';\r\nimport { LeftOutlined, RightOutlined } from '@ant-design/icons';\r\n\r\nfunction SampleNextArrow(props) {\r\n const { className, onClick } = props;\r\n return (\r\n
\r\n \r\n
\r\n );\r\n}\r\n\r\nfunction SamplePrevArrow(props) {\r\n const { className, onClick } = props;\r\n return (\r\n
\r\n \r\n
\r\n );\r\n}\r\n\r\nexport default function SlickSlider(props) {\r\n const { isSmallSlides } = props;\r\n const settings = {\r\n className: 'center',\r\n centerMode: true,\r\n infinite: true,\r\n centerPadding: '0',\r\n slidesToShow: isSmallSlides ? 1 : 3,\r\n speed: 1000,\r\n dots: true,\r\n nextArrow: ,\r\n prevArrow: ,\r\n dotsClass: 'slick-dots-new',\r\n };\r\n const { children } = props;\r\n return (\r\n
\r\n {children}\r\n
\r\n );\r\n}\r\nSlickSlider.propTypes = {\r\n children: PropTypes.array.isRequired,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport SlickSlider from 'common/components/slickslider/SlickSlider';\r\nimport Image from 'common/components/image/Image';\r\nexport const ProductAssets = (props) => {\r\n const { dataDetail } = props;\r\n return (\r\n \r\n {dataDetail &&\r\n dataDetail.assetImage &&\r\n dataDetail.assetImage.length > 0 &&\r\n dataDetail.assetImage.map((item, index) => {\r\n return (\r\n
\r\n {item.alt\r\n
\r\n );\r\n })}\r\n
\r\n );\r\n};\r\nProductAssets.propTypes = {\r\n dataDetail: PropTypes.object.isRequired,\r\n};\r\nexport default ProductAssets;\r\n","import React, { Fragment } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport * as ProductComponent from '../../components/index';\r\n\r\nconst ProductDetail = (props) => {\r\n const { dataDetail } = props;\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nProductDetail.propTypes = {\r\n dataDetail: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default ProductDetail;\r\n","import React, { useState, useEffect, useMemo, useCallback } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { Row, Col, Select, Tree, Button, Space } from 'antd';\r\nimport { Form, StyledModal, WrapperSelect } from 'common/components';\r\n\r\nimport * as globalSelectors from '@redux/global/selectors';\r\nimport debounce from 'lodash.debounce';\r\n\r\nfunction ProductBrickCode({\r\n visible,\r\n handleCancel,\r\n handleBrickCode,\r\n initialBrickCode,\r\n}) {\r\n const productBrickCodeModules = useSelector(\r\n globalSelectors.selectBrickCodeModules()\r\n );\r\n\r\n // Segments -> Family -> Class -> Brick\r\n const [segments, setSegments] = useState(null);\r\n const [family, setFamily] = useState([]);\r\n const [classBrick, setClassBrick] = useState([]);\r\n const [brick, setBrick] = useState([]);\r\n const [isExpand, setIsExpand] = useState(false);\r\n const [expandedKeys, setExpandedKeys] = useState([]);\r\n const [hightLightKey, setHightLightKey] = useState([]);\r\n\r\n const handleOk = () => {\r\n handleBrickCode(brick);\r\n handleReset();\r\n };\r\n\r\n const handleCancelModal = () => {\r\n handleCancel();\r\n handleReset();\r\n };\r\n\r\n const modalProps = {\r\n title: 'Product Brick Code',\r\n visible: visible,\r\n closable: true,\r\n maskClosable: false,\r\n onCancel: handleCancelModal,\r\n wrapClassName: 'brick-modal',\r\n width: '75%',\r\n onOk: handleOk,\r\n bodyStyle: { maxHeight: '55vh', overflow: 'hidden' },\r\n };\r\n\r\n useEffect(() => {\r\n if (initialBrickCode && visible) {\r\n handleSelectTree(initialBrickCode);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [visible]);\r\n\r\n const handleSelectTree = useCallback((expandedKeys) => {\r\n const treeModal = { children: editTreeView };\r\n\r\n const pathValues = getPath(treeModal, expandedKeys);\r\n\r\n if (pathValues) {\r\n const [, segmentKey, familyKey, classesKey, brickKey] = pathValues;\r\n\r\n const segmentModule = productBrickCodeModules?.find(\r\n (segment) => segment?.SegmentCode === segmentKey?.key\r\n );\r\n setSegments(segmentModule);\r\n const familyModule = segmentModule?.Families?.find(\r\n (family) => family?.FamilyCode === familyKey?.key\r\n );\r\n setFamily(familyModule);\r\n const classModule = familyModule?.Classes?.find(\r\n (family) => family?.ClassCode === classesKey?.key\r\n );\r\n setClassBrick(classModule);\r\n const brick = classModule?.Bricks?.find(\r\n (brick) => brick?.BrickCode === brickKey?.key\r\n );\r\n setBrick(brick);\r\n handleExpand([\r\n segmentKey?.key,\r\n familyKey?.key,\r\n classesKey?.key,\r\n brickKey?.key,\r\n ]);\r\n setHightLightKey([brickKey?.key]);\r\n }\r\n }, []);\r\n\r\n const editTreeView = useMemo(() => {\r\n const mappingTreeView = productBrickCodeModules?.map((segment) => {\r\n return {\r\n title: `Segment: ${segment?.SegmentCode} - ${segment?.SegmentDescription}`,\r\n key: segment?.SegmentCode,\r\n children: segment?.Families?.map((family) => ({\r\n title: `Family: ${family?.FamilyCode} - ${family?.FamilyDescription}`,\r\n key: family?.FamilyCode,\r\n children: family?.Classes?.map((classes) => ({\r\n title: `Class: ${classes?.ClassCode} - ${classes?.ClassDescription}`,\r\n key: classes?.ClassCode,\r\n children: classes?.Bricks?.map((brick) => ({\r\n title: `Brick: ${brick?.BrickCode} - ${brick?.BrickDescription}`,\r\n key: brick?.BrickCode,\r\n })),\r\n })),\r\n })),\r\n };\r\n });\r\n return mappingTreeView;\r\n }, []);\r\n\r\n function getPath(model, key) {\r\n let path,\r\n item = { key: model.key };\r\n\r\n if (!model || typeof model !== 'object') return;\r\n\r\n if (model.key === key) return [item];\r\n (model.children || []).some((child) => (path = getPath(child, key)));\r\n\r\n return path && [item, ...path];\r\n }\r\n\r\n const { Option } = Select;\r\n\r\n const handleReset = () => {\r\n setSegments(null);\r\n setFamily([]);\r\n setClassBrick([]);\r\n setBrick([]);\r\n handleExpand([]);\r\n setExpandedKeys([]);\r\n setHightLightKey([]);\r\n };\r\n\r\n const handleSegment = (code) => {\r\n const segmentModule = productBrickCodeModules?.find(\r\n (segments) => segments?.SegmentCode === code\r\n );\r\n setSegments(segmentModule);\r\n setFamily([]);\r\n setClassBrick([]);\r\n setBrick([]);\r\n handleExpand([code]);\r\n };\r\n\r\n const handleFamily = (code) => {\r\n const familyModule = segments?.Families?.find(\r\n (family) => family?.FamilyCode === code\r\n );\r\n setFamily(familyModule);\r\n handleExpand([...expandedKeys, code]);\r\n setClassBrick([]);\r\n setBrick([]);\r\n setHightLightKey([]);\r\n };\r\n\r\n const handleClass = (code) => {\r\n const classModule = family?.Classes?.find(\r\n (family) => family?.ClassCode === code\r\n );\r\n setClassBrick(classModule);\r\n handleExpand([...expandedKeys, code]);\r\n setBrick([]);\r\n setHightLightKey([]);\r\n };\r\n\r\n const handleBrick = (code) => {\r\n const brick = classBrick?.Bricks?.find(\r\n (brick) => brick?.BrickCode === code\r\n );\r\n setBrick(brick);\r\n setHightLightKey([code]);\r\n };\r\n\r\n const handleExpand = (expandedKeys, info) => {\r\n setExpandedKeys(expandedKeys);\r\n setIsExpand(false);\r\n };\r\n\r\n const expandMethod = (arr) => {\r\n const expandedKeys = [];\r\n arr.forEach((data) => {\r\n expandedKeys.push(data.key);\r\n if (data.children) {\r\n expandMethod(data.children);\r\n }\r\n });\r\n return expandedKeys;\r\n };\r\n\r\n const handleExpandAll = () => {\r\n const newKeys = expandMethod(editTreeView);\r\n setExpandedKeys(newKeys);\r\n };\r\n\r\n const handleCollapseAll = () => {\r\n setExpandedKeys([]);\r\n };\r\n\r\n const handleSelect = (expandedKeys) => {\r\n handleSelectTree(expandedKeys?.[0]);\r\n };\r\n const handleDebounceSelect = debounce(handleSelect, 300);\r\n\r\n const handleFilter = (input, option) => {\r\n return (\r\n option?.props?.children\r\n ?.split('-')[1]\r\n ?.toLowerCase()\r\n ?.indexOf(input.toLowerCase()) >= 0 ||\r\n option?.props?.value.toLowerCase()?.indexOf(input.toLowerCase()) >= 0\r\n );\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n handleFilter(input, option)}\r\n >\r\n {productBrickCodeModules?.map((segments) => (\r\n \r\n {`${segments?.SegmentCode} - ${segments?.SegmentDescription}`}\r\n \r\n ))}\r\n {' '}\r\n \r\n \r\n handleFilter(input, option)}\r\n >\r\n {segments?.Families?.map((family) => (\r\n \r\n ))}\r\n {' '}\r\n \r\n \r\n handleFilter(input, option)}\r\n >\r\n {family?.Classes?.map((classes) => (\r\n \r\n ))}\r\n \r\n \r\n \r\n handleFilter(input, option)}\r\n >\r\n {classBrick?.Bricks?.map((brick) => (\r\n \r\n ))}\r\n {' '}\r\n \r\n \r\n \r\n \r\n {/* {segments && ( */}\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {/* )} */}\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default React.memo(ProductBrickCode);\r\n","import React from 'react';\r\n\r\nimport { useGetProductEnums } from 'hooks';\r\nimport { findDimensionEnumDisplay } from 'pages/product-full-view/mappers/mapToEnums';\r\n\r\nimport * as _ from 'lodash';\r\n\r\nconst PrimarySizeUOM = (props) => {\r\n const { params } = props;\r\n\r\n const { productEnums } = useGetProductEnums();\r\n if (_.isEmpty(productEnums)) {\r\n return
;\r\n }\r\n\r\n const enumDisplay =\r\n findDimensionEnumDisplay(params?.data?.primarySizeUOM, productEnums) ||\r\n params?.data?.primarySizeUOM ||\r\n '';\r\n return
{enumDisplay}
;\r\n};\r\n\r\nexport default PrimarySizeUOM;\r\n","import { useEffect } from 'react';\r\nimport { useAsync } from 'hooks';\r\n\r\nimport { getProductFullView } from 'services/product';\r\n\r\nexport const useGetPublishingProduct = ({ productId, isEnabled }) => {\r\n const { data, run } = useAsync();\r\n\r\n useEffect(() => {\r\n if (isEnabled) {\r\n run(\r\n getProductFullView({\r\n productItemId: productId,\r\n })\r\n );\r\n }\r\n }, [productId, run, isEnabled]);\r\n\r\n return {\r\n publishingProduct: data ?? {},\r\n };\r\n};\r\n","import React, { useState } from 'react';\r\n\r\nimport { Row, Drawer, Col, Typography } from 'antd';\r\n\r\nimport {\r\n ProductHierarchyDetail,\r\n ProductHierarchyEndpointInfo,\r\n} from 'pages/product-full-view/components';\r\n\r\nimport * as productService from 'services/product';\r\n\r\nconst { Text } = Typography;\r\n\r\nconst ProductItemSearchDrawer = (props) => {\r\n const {\r\n toggleIsDrawerOpen,\r\n isDrawerVisible,\r\n productDetail,\r\n setEditProductId,\r\n hierarchyItems,\r\n } = props;\r\n\r\n const [hierarchyLoading, setHierarchyLoading] = useState(false);\r\n const [hierarchyData, setHierarchyData] = useState([]);\r\n\r\n const getHierarchyData = () => {\r\n setHierarchyLoading(true);\r\n\r\n const params = {\r\n productId: productDetail?.productId,\r\n };\r\n\r\n productService\r\n .getProductHierarchy(params)\r\n .then((response) => {\r\n const { isSuccess, data } = response;\r\n\r\n if (isSuccess && data?.productHierarchies) {\r\n setHierarchyData(data.productHierarchies);\r\n }\r\n })\r\n .finally(() => {\r\n setHierarchyLoading(false);\r\n });\r\n };\r\n\r\n return (\r\n \r\n Select product item from hierarchy view\r\n \r\n }\r\n placement='right'\r\n onClose={toggleIsDrawerOpen}\r\n visible={isDrawerVisible}\r\n width={630}\r\n className='fix-publication-invalid-modal__hierarchy-drawer'\r\n zIndex={1200}\r\n >\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default ProductItemSearchDrawer;\r\n","import React, { useEffect, useMemo } from 'react';\r\n\r\nimport { ProductDetailView } from 'pages/product-full-view/components/product-new-detail-view';\r\n\r\nimport {\r\n useProductDetail,\r\n useProductDetailDispatch,\r\n productDetailActionTypes,\r\n} from 'pages/product-full-view/components/product-new-detail-view/ProductDetailContext';\r\n\r\nimport {\r\n filterModuleProductSchema,\r\n uppercaseFirstLetter,\r\n} from 'pages/product-full-view/shared/utils';\r\n\r\nconst PublicationErrorProductDetail = ({\r\n productDetail,\r\n productSchema,\r\n currentError = {},\r\n onResolveErrorPublicationSuccess,\r\n}) => {\r\n const { fieldName: fieldFullPath } = currentError;\r\n const moduleNameError = fieldFullPath.split('.')[0];\r\n\r\n const dispatch = useProductDetailDispatch();\r\n\r\n const { formInstance } = useProductDetail();\r\n\r\n const { baseProductSchema, advancedProductSchema } = useMemo(\r\n () => filterModuleProductSchema(productSchema),\r\n [productSchema]\r\n );\r\n\r\n const baseProductModuleNames = baseProductSchema.map((schemaProd) =>\r\n schemaProd.moduleName.toLowerCase()\r\n );\r\n\r\n const isBaseProductSchema = Boolean(\r\n baseProductModuleNames.includes(moduleNameError.toLowerCase())\r\n );\r\n\r\n const advancedProductModuleNames = advancedProductSchema.map((schemaProd) =>\r\n schemaProd.moduleName.toLowerCase()\r\n );\r\n\r\n const isAdvancedProductSchema = Boolean(\r\n advancedProductModuleNames.includes(moduleNameError.toLowerCase())\r\n );\r\n\r\n useEffect(() => {\r\n if (isBaseProductSchema) {\r\n dispatch({\r\n type: productDetailActionTypes.ACTIVE_MODULES,\r\n payload: {\r\n value: [uppercaseFirstLetter(moduleNameError)], // header -> Header,... Elastic changed format data\r\n moduleView: 'base',\r\n },\r\n });\r\n dispatch({\r\n type: productDetailActionTypes.SET_ERROR_FIELD_FULL_PATH,\r\n payload: {\r\n fieldFullPath,\r\n },\r\n });\r\n }\r\n }, [dispatch, fieldFullPath, isBaseProductSchema, moduleNameError]);\r\n\r\n useEffect(() => {\r\n if (isAdvancedProductSchema) {\r\n dispatch({\r\n type: productDetailActionTypes.ACTIVE_MODULES,\r\n payload: {\r\n value: [uppercaseFirstLetter(moduleNameError)], // header -> Header,... Elastic changed format data\r\n moduleView: 'advanced',\r\n },\r\n });\r\n dispatch({\r\n type: productDetailActionTypes.SET_ERROR_FIELD_FULL_PATH,\r\n payload: {\r\n fieldFullPath,\r\n },\r\n });\r\n\r\n dispatch({\r\n type: productDetailActionTypes.SEARCH_PROPERTIES,\r\n payload: {\r\n searchText: fieldFullPath,\r\n moduleSchema: advancedProductSchema,\r\n modeView: 'view',\r\n formInstance,\r\n },\r\n });\r\n }\r\n }, [\r\n advancedProductSchema,\r\n dispatch,\r\n fieldFullPath,\r\n formInstance,\r\n isAdvancedProductSchema,\r\n moduleNameError,\r\n ]);\r\n\r\n return (\r\n
\r\n \r\n
\r\n );\r\n};\r\n\r\nexport default PublicationErrorProductDetail;\r\n","import React from 'react';\r\n\r\nimport { Typography } from 'antd';\r\nimport { SearchOutlined } from '@ant-design/icons';\r\nimport { FormAddButton } from 'common/components';\r\n\r\nconst { Text } = Typography;\r\n\r\nconst WarningMessage = ({ toggleProductSearchDrawer }) => (\r\n
\r\n \r\n Product Id was not given please search for product item and fix its error\r\n to pass your publication,\r\n \r\n }\r\n onClick={toggleProductSearchDrawer && toggleProductSearchDrawer}\r\n />\r\n
\r\n);\r\n\r\nexport const mapToPublishErrorAlert = (error, toggleProductSearchDrawer) => {\r\n return error && error?.errorProductId\r\n ? {\r\n message: 'Please fix error in the product item to pass your publication',\r\n status: 'error',\r\n }\r\n : {\r\n message: (\r\n \r\n ),\r\n status: 'warning',\r\n };\r\n};\r\n","import React from 'react';\r\n\r\nimport { Row, Col, Alert } from 'antd';\r\nimport { StyledModal } from 'common/components';\r\n\r\nimport { ProductDetailProvider } from 'pages/product-full-view/components/product-new-detail-view';\r\n\r\nimport PublicationErrorProductDetail from './PublicationErrorProductDetail';\r\n\r\nimport { mapToPublishErrorAlert } from 'pages/branded-products/mapper/mapToPublishErrorAlert';\r\n\r\nimport { useGetProductSchema } from 'hooks';\r\n\r\nimport { sleep } from 'utils/delay';\r\n\r\nconst PublicationErrorDetailModal = (props) => {\r\n const {\r\n isErrModalVisible,\r\n publishingProduct,\r\n toggleCheckErrorModal,\r\n currentError,\r\n toggleIsDrawerOpen,\r\n getPublishCheckList,\r\n setReloadOneError,\r\n setErrModalVisible,\r\n } = props;\r\n const { productSchema } = useGetProductSchema();\r\n\r\n const onCancel = () => {\r\n toggleCheckErrorModal && toggleCheckErrorModal();\r\n };\r\n\r\n const alertConfig = mapToPublishErrorAlert(currentError, toggleIsDrawerOpen);\r\n\r\n const onResolveErrorPublicationSuccess = async () => {\r\n if (currentError) {\r\n getPublishCheckList &&\r\n typeof getPublishCheckList === 'function' &&\r\n getPublishCheckList();\r\n\r\n setErrModalVisible(false);\r\n if (setReloadOneError) {\r\n setReloadOneError(true);\r\n\r\n await sleep(1000);\r\n setReloadOneError(false);\r\n }\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n {isErrModalVisible && (\r\n \r\n \r\n \r\n {currentError && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default PublicationErrorDetailModal;\r\n","import React, { useMemo, useEffect } from 'react';\r\n\r\nimport { Form } from 'common/components';\r\n\r\nimport {\r\n findProductModule,\r\n findDataProperties,\r\n formatObjectToCheckValueDatetime,\r\n RenderNewFormItem,\r\n RenderFormItem,\r\n isLeftModule,\r\n NewFormItemContainer,\r\n} from 'pages/branded-products/components';\r\n\r\nimport { FormContextProvider } from 'pages/product-full-view/components/product-detail-view/FormContext';\r\n\r\nimport { pickBy, identity } from 'lodash';\r\n\r\nimport './InstantFixForm.less';\r\n\r\nconst layoutForm = {\r\n labelCol: { span: 11 },\r\n wrapperCol: { span: 11 },\r\n};\r\n//todo - add product brick code if needed\r\nconst InstantFixInput = (props) => {\r\n const {\r\n productSchema,\r\n productEnums,\r\n errorInfo,\r\n productId,\r\n // productBrickCode,\r\n productItemModules,\r\n formName,\r\n } = props;\r\n\r\n const editableModuleName = errorInfo?.moduleName;\r\n\r\n const [formInstance] = Form.useForm();\r\n\r\n const { nonGroupModule } = useMemo(() => {\r\n return findProductModule(editableModuleName, productSchema);\r\n }, [editableModuleName, productSchema]);\r\n\r\n const isPrivateProperties = isLeftModule(nonGroupModule?.moduleName);\r\n\r\n const foundInputFromModule = (\r\n nonGroupModule?.moduleProperties?.length > 0\r\n ? nonGroupModule?.moduleProperties\r\n : []\r\n ).find((property) => property?.propertyName === errorInfo?.fieldName);\r\n\r\n const foundInputFromGroupModule = useMemo(() => {\r\n if (!isPrivateProperties) return null;\r\n\r\n let result;\r\n\r\n // eslint-disable-next-line no-unused-expressions\r\n Object.entries(nonGroupModule?.moduleProperties)?.find(\r\n ([title, modPropers]) =>\r\n modPropers.find((property) => {\r\n if (property?.propertyName === errorInfo?.fieldName) {\r\n result = { title, property: property || {} };\r\n return true;\r\n }\r\n })\r\n );\r\n\r\n return result;\r\n }, [isPrivateProperties, errorInfo, nonGroupModule]);\r\n\r\n const foundDataProperties = useMemo(() => {\r\n if (!productItemModules) return [];\r\n\r\n return findDataProperties(editableModuleName, productItemModules);\r\n }, [editableModuleName, productItemModules]);\r\n\r\n useEffect(() => {\r\n if (editableModuleName) {\r\n const newFormatData =\r\n formatObjectToCheckValueDatetime(foundDataProperties) || {};\r\n\r\n let formData = pickBy(newFormatData, identity);\r\n\r\n const customFormData = {\r\n ...formData,\r\n productId: productId,\r\n fieldName: errorInfo?.fieldName,\r\n moduleName: errorInfo?.moduleName,\r\n };\r\n\r\n formInstance.setFieldsValue(customFormData);\r\n }\r\n }, [\r\n editableModuleName,\r\n formInstance,\r\n foundDataProperties,\r\n productId,\r\n errorInfo,\r\n ]);\r\n\r\n const isModuleFound = nonGroupModule?.moduleProperties?.length > 0;\r\n\r\n return (\r\n \r\n \r\n {isModuleFound && (\r\n <>\r\n {isPrivateProperties ? (\r\n <>\r\n \r\n \r\n \r\n \r\n ) : (\r\n \r\n )}\r\n \r\n )}\r\n\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default InstantFixInput;\r\n","import React, { useState, useEffect } from 'react';\r\nimport { Form, Input, Select, InputNumber, Row, Col } from 'antd';\r\nimport { ProductBrickCode } from 'pages/branded-products/components';\r\nimport { FormEditButton, WrapperSelect } from 'common/components';\r\nimport { sortByKeyCallback } from 'utils/sortByKey';\r\n\r\nconst { Option } = Select;\r\n\r\nconst MAX_NUMBER_INPUT_UPC = 9999999999999999999;\r\n\r\nconst handleNumberInput = (event) => {\r\n if (!/[0-9]/.test(event.key)) {\r\n event.preventDefault();\r\n }\r\n};\r\n\r\nexport const PACKAGE_LEVELS = [\r\n 'Unit',\r\n 'Inner Pack',\r\n 'Case',\r\n 'Master Case',\r\n 'Pallet',\r\n];\r\n\r\nexport const textAreaEnums = [{ name: 'productDescription' }];\r\n\r\nexport const inputNumberEnums = [\r\n { name: 'primarySize', min: 0, max: 999999 },\r\n { name: 'width', min: 0, max: MAX_NUMBER_INPUT_UPC },\r\n { name: 'height', min: 0, max: MAX_NUMBER_INPUT_UPC },\r\n { name: 'depth', min: 0, max: MAX_NUMBER_INPUT_UPC },\r\n { name: 'weight', min: 0, max: MAX_NUMBER_INPUT_UPC },\r\n];\r\n\r\nexport const selectEnums = [\r\n {\r\n name: 'productType',\r\n options: (productTypeEnums) => {\r\n return productTypeEnums?.[0]?.enumProperties\r\n ?.sort(sortByKeyCallback('enumDisplayName'))\r\n .map((type, index) => (\r\n \r\n ));\r\n },\r\n },\r\n {\r\n name: 'packageLevel',\r\n options: PACKAGE_LEVELS,\r\n },\r\n {\r\n name: 'visibility',\r\n options: ['Only If Shared', 'Public', 'Private'],\r\n },\r\n {\r\n name: 'status',\r\n options: ['Active', 'Pending'],\r\n },\r\n {\r\n name: 'primarySizeUOM',\r\n options: ({ productBasicUOM }) => {\r\n return (\r\n <>\r\n {productBasicUOM?.[0]?.enumProperties\r\n ?.filter((type) => type.enumGroup === 'Mass')\r\n .sort(sortByKeyCallback('enumDisplayName'))\r\n .map((item, index) => (\r\n \r\n ))}\r\n \r\n );\r\n },\r\n },\r\n {\r\n name: 'weightUOM',\r\n options: ({ productBasicUOM }) => {\r\n return (\r\n <>\r\n {productBasicUOM?.[0]?.enumProperties\r\n ?.filter((type) => type.enumGroup === 'Mass')\r\n .sort(sortByKeyCallback('enumDisplayName'))\r\n .map((item, index) => (\r\n \r\n ))}\r\n \r\n );\r\n },\r\n },\r\n {\r\n name: 'dimensionUOM',\r\n options: ({ productBasicUOM }) => {\r\n return (\r\n <>\r\n {productBasicUOM?.[0]?.enumProperties\r\n ?.filter((type) => type.enumGroup === 'Dimensions')\r\n .sort(sortByKeyCallback('enumDisplayName'))\r\n .map((item, index) => (\r\n \r\n ))}\r\n \r\n );\r\n },\r\n },\r\n];\r\n\r\nexport const inputTextEnums = [\r\n { name: 'ixOneId', maxLength: 30 },\r\n { name: 'productName', maxLength: 70 },\r\n {\r\n name: 'gtin',\r\n maxLength: MAX_NUMBER_INPUT_UPC,\r\n onKeyPress: handleNumberInput,\r\n },\r\n {\r\n name: 'upc12',\r\n maxLength: MAX_NUMBER_INPUT_UPC,\r\n onKeyPress: handleNumberInput,\r\n },\r\n {\r\n name: 'upc8',\r\n maxLength: MAX_NUMBER_INPUT_UPC,\r\n onKeyPress: handleNumberInput,\r\n },\r\n {\r\n name: 'upc10',\r\n maxLength: MAX_NUMBER_INPUT_UPC,\r\n onKeyPress: handleNumberInput,\r\n },\r\n {\r\n name: 'upc11',\r\n maxLength: MAX_NUMBER_INPUT_UPC,\r\n onKeyPress: handleNumberInput,\r\n },\r\n {\r\n name: 'upc13',\r\n maxLength: MAX_NUMBER_INPUT_UPC,\r\n onKeyPress: handleNumberInput,\r\n },\r\n];\r\n\r\nexport const brickCodeEnums = [{ name: 'brickCode' }];\r\n\r\nconst BrickCodeInput = (props) => {\r\n const { onChange, brickCode, brickCodeName } = props;\r\n\r\n const [brickModalVisible, setBrickModalVisible] = useState(false);\r\n const [brick, setBrick] = useState();\r\n\r\n const handleBrickCode = (brick) => {\r\n setBrick({\r\n brickCode: brick?.BrickCode,\r\n brickCodeName: brick?.BrickDescription,\r\n });\r\n setBrickModalVisible(false);\r\n };\r\n\r\n const toggleBrickModal = () => {\r\n setBrickModalVisible((prev) => !prev);\r\n };\r\n\r\n useEffect(() => {\r\n setBrick({\r\n brickCode: brickCode,\r\n brickCodeName: brickCodeName,\r\n });\r\n }, [brickCode, brickCodeName]);\r\n\r\n useEffect(() => {\r\n onChange && onChange(brick);\r\n }, [brick, onChange]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n <>\r\n setBrickModalVisible(false)}\r\n handleBrickCode={handleBrickCode}\r\n initialBrickCode={brick?.brickCode}\r\n />\r\n \r\n \r\n );\r\n};\r\n\r\nexport const FormBrickCodeInput = (props) => {\r\n const { brickCode, brickCodeName, ...restProps } = props;\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport const FormTextAreaInput = (props) => {\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport const FormTextInput = (props) => {\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport const FormSelectInput = (props) => {\r\n const { options, optionParams = {}, ...restProps } = props;\r\n return (\r\n \r\n \r\n {typeof options === 'function'\r\n ? options && options(optionParams)\r\n : options\r\n ?.sort(sortByKeyCallback(null))\r\n .map((option, index) => \r\n \r\n );\r\n};\r\n\r\nexport const FormNumberInput = (props) => {\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n","import React, { useEffect } from 'react';\r\n\r\nimport { Form } from 'common/components';\r\n\r\nimport {\r\n FormTextInput,\r\n FormTextAreaInput,\r\n FormSelectInput,\r\n FormNumberInput,\r\n FormBrickCodeInput,\r\n textAreaEnums,\r\n inputNumberEnums,\r\n selectEnums,\r\n inputTextEnums,\r\n brickCodeEnums,\r\n} from 'common/components/product-add/ProductEditFormItem';\r\n\r\nimport { startCase } from 'lodash';\r\n\r\nimport './InstantFixFormRivirField.less';\r\n\r\nconst layoutForm = {\r\n labelCol: { span: 11 },\r\n wrapperCol: { span: 11 },\r\n};\r\n\r\nconst InstantFixFormRivirField = (props) => {\r\n const { productEnums, errorInfo, productId, formName, productDetail } = props;\r\n\r\n const fieldName = errorInfo?.fieldName;\r\n\r\n const [formInstance] = Form.useForm();\r\n\r\n const productTypeEnums = productEnums?.filter(\r\n (type) => type.enumName === 'ProductTypeEnum'\r\n );\r\n\r\n const productBasicUOM = productEnums?.filter(\r\n (type) => type.enumName === 'BasicUomEnum'\r\n );\r\n\r\n useEffect(() => {\r\n const initFormValue = () => {\r\n const fieldName = errorInfo?.fieldName;\r\n const allProductFields = Object.keys(productDetail);\r\n\r\n const foundField = allProductFields.find(\r\n (field) => field.toLowerCase() === (fieldName || '').toLowerCase()\r\n );\r\n\r\n const customFormData = {\r\n productId: productId,\r\n fieldName: errorInfo?.fieldName,\r\n moduleName: '',\r\n [fieldName]: productDetail?.[foundField],\r\n };\r\n formInstance.setFieldsValue(customFormData);\r\n };\r\n\r\n if (productDetail) {\r\n initFormValue();\r\n }\r\n }, [productDetail, errorInfo, formInstance, productId]);\r\n\r\n const renderInput = () => {\r\n const findCallback = (enumItem) => {\r\n return enumItem?.name.toLowerCase() === (fieldName || '').toLowerCase();\r\n };\r\n\r\n let foundItem;\r\n\r\n foundItem = textAreaEnums.find(findCallback);\r\n if (foundItem) {\r\n return (\r\n \r\n );\r\n }\r\n\r\n foundItem = inputTextEnums.find(findCallback);\r\n if (foundItem) {\r\n return (\r\n \r\n );\r\n }\r\n\r\n foundItem = selectEnums.find(findCallback);\r\n if (foundItem) {\r\n return (\r\n \r\n );\r\n }\r\n\r\n foundItem = inputNumberEnums.find(findCallback);\r\n if (foundItem) {\r\n return (\r\n \r\n );\r\n }\r\n\r\n foundItem = brickCodeEnums.find(findCallback);\r\n if (foundItem) {\r\n return (\r\n \r\n );\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n \r\n {renderInput()}\r\n\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default InstantFixFormRivirField;\r\n","import React, { useMemo } from 'react';\r\n\r\nimport { Row, Col, Typography, Tooltip } from 'antd';\r\nimport {\r\n CloseCircleOutlined,\r\n WarningOutlined,\r\n CaretRightOutlined,\r\n LoadingOutlined,\r\n} from '@ant-design/icons';\r\n\r\nimport { Form, FormDeleteButton } from 'common/components';\r\n\r\nimport InstantFixForm from './InstantFixForm';\r\nimport InstantFixFormRivirField from './InstantFixFormRivirField';\r\n\r\nimport classnames from 'classnames';\r\nimport { startCase } from 'lodash';\r\nimport { ROUTE } from 'static/Constants';\r\n\r\nconst { Title } = Typography;\r\n\r\n/**\r\n * ? COMPONENT - error item for validation rule\r\n * @param {*} props\r\n * @returns\r\n */\r\nexport const PublicationErrorItemValidationRule = (props) => {\r\n const { productItemId } = props;\r\n\r\n const [formInstance] = Form.useForm();\r\n\r\n const handleOpenProductNewTab = () => {\r\n if (productItemId) {\r\n const url = window.location.origin + ROUTE.PRODUCT + `/${productItemId}`;\r\n productItemId && window.open(url);\r\n }\r\n };\r\n return (\r\n
\r\n \r\n \r\n
\r\n \r\n
\r\n \r\n \r\n \r\n Failed GS1 validation\r\n \r\n \r\n\r\n \r\n \r\n }\r\n onClick={handleOpenProductNewTab}\r\n style={{ marginRight: 5 }}\r\n />\r\n \r\n \r\n \r\n );\r\n};\r\n\r\n/**\r\n * ? COMPONENT - error item for system required and additional required\r\n * @param {*} props\r\n * @returns\r\n */\r\n\r\nconst getNestedFieldName = (fieldNames = []) => {\r\n let result = '';\r\n\r\n fieldNames.forEach((name, index) => {\r\n console.log(startCase(name), index);\r\n if (index === 0) {\r\n result = startCase(name);\r\n } else {\r\n result = result + ' / ' + startCase(name);\r\n }\r\n });\r\n\r\n return result;\r\n};\r\n\r\nexport const PublicationCommonErrorItem = (props) => {\r\n const {\r\n errorItem,\r\n isErrorItem,\r\n isRivirField,\r\n status,\r\n setErrorIndex,\r\n setProductId,\r\n toggleCheckErrorModal,\r\n productEnums,\r\n productSchema,\r\n errorInfo,\r\n groupIdx,\r\n itemIdx,\r\n productDetailList,\r\n productModuleList,\r\n } = props;\r\n\r\n const productDetail = useMemo(() => {\r\n return (\r\n productDetailList &&\r\n productDetailList.find(\r\n (detail) => detail?.productId === errorItem?.productId\r\n )\r\n );\r\n }, [productDetailList, errorItem?.productId]);\r\n\r\n const errorTitle = useMemo(() => {\r\n const productIdText = productDetail?.gtin\r\n ? `Product GTIN - ${productDetail?.gtin}`\r\n : productDetail?.upc12\r\n ? `Product UPC12 - ${productDetail?.upc12}`\r\n : `Product ID - ${errorItem?.productId}`;\r\n\r\n const productIdPart = (\r\n \r\n {productIdText}\r\n \r\n );\r\n\r\n const rivirFieldText = 'RIVIR Field';\r\n const fieldNameText = startCase(errorItem?.fieldName || '');\r\n\r\n if (isRivirField) {\r\n return {\r\n renderTitle: (\r\n <>\r\n {productIdPart}  /  {rivirFieldText} / {' '}\r\n {fieldNameText}\r\n \r\n ),\r\n };\r\n } else {\r\n const [moduleName, ...fieldName] = errorItem.fieldName.split('.');\r\n const nestedFieldNameText = getNestedFieldName(fieldName);\r\n\r\n return {\r\n renderTitle: (\r\n <>\r\n {productIdPart}  /  {startCase(moduleName)}  / {' '}\r\n {nestedFieldNameText}\r\n \r\n ),\r\n };\r\n }\r\n }, [productDetail, errorItem, isRivirField]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {isErrorItem ? : }\r\n
\r\n \r\n \r\n \r\n \r\n {errorTitle?.renderTitle}\r\n \r\n \r\n \r\n \r\n {status === 'loading' && (\r\n \r\n )}\r\n \r\n \r\n\r\n \r\n }\r\n onClick={() => {\r\n const activeProductId = errorItem?.productId;\r\n setErrorIndex(errorInfo?.errorProductId);\r\n setProductId(activeProductId);\r\n toggleCheckErrorModal(activeProductId, errorInfo);\r\n }}\r\n disabled={isRivirField}\r\n style={{ marginRight: 5 }}\r\n />\r\n \r\n
\r\n \r\n \r\n {isErrorItem && !isRivirField && (\r\n modules?.productId === errorItem?.productId\r\n )\r\n }\r\n // formName={`form-${groupIdx}-${itemIdx}`}\r\n />\r\n )}\r\n {isErrorItem && isRivirField && (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\n\r\nimport { PublicationCommonErrorItem } from './PublicationErrorItem';\r\n\r\nconst PublicationCommonErrorList = (props) => {\r\n const {\r\n errorGroup,\r\n groupIdx,\r\n status,\r\n setErrorIndex,\r\n setProductId,\r\n toggleCheckErrorModal,\r\n productEnums,\r\n productSchema,\r\n productDetailList,\r\n productModuleList,\r\n } = props;\r\n return (\r\n <>\r\n {errorGroup?.errorFields.map((errorItem, itemIdx) => {\r\n const isErrorItem = !!errorItem?.productId;\r\n\r\n const errorInfo = {\r\n errorProductId: errorItem?.productId,\r\n errorType: errorGroup?.errorType,\r\n errorMessage: errorGroup?.errorMessage,\r\n moduleName: errorItem?.moduleName,\r\n fieldName: errorItem?.fieldName,\r\n };\r\n\r\n const itemErrorKey = `${groupIdx}-${itemIdx}`;\r\n\r\n const isRivirField = errorItem.fieldName.split('.').length === 1; // fieldName = 'ModuleName.propertyName'\r\n\r\n return (\r\n \r\n );\r\n })}\r\n \r\n );\r\n};\r\n\r\nexport default PublicationCommonErrorList;\r\n","import React from 'react';\r\nimport { Row, Col, Avatar, Typography } from 'antd';\r\nimport { FormDeleteButton } from 'common/components';\r\n\r\nimport { CaretRightOutlined } from '@ant-design/icons';\r\n\r\nimport { Images } from 'config/assets';\r\n\r\nimport { ROUTE } from 'static/Constants';\r\n\r\nimport './PackageItemInfo.less';\r\n\r\nconst { Text, Title } = Typography;\r\n\r\nconst PackageItemInfo = (props) => {\r\n const { packageLevelItem } = props;\r\n\r\n const handleOpenProductNewTab = () => {\r\n const productId = packageLevelItem?.productId;\r\n if (productId) {\r\n const url = window.location.origin + ROUTE.PRODUCT + `/${productId}`;\r\n productId && window.open(url);\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n {packageLevelItem?.productName}\r\n
\r\n \r\n {packageLevelItem?.productPackageLevel}\r\n \r\n
\r\n
\r\n \r\n {isNaN(packageLevelItem?.productSize)\r\n ? 'Unknown product size'\r\n : Math.round(packageLevelItem?.productSize * 100) / 100 ||\r\n 'Unknown product size'}\r\n  (\r\n {packageLevelItem?.productSizeUOM || 'Unknown measurement unit'})\r\n \r\n
\r\n \r\n \r\n }\r\n text='Open product'\r\n onClick={handleOpenProductNewTab}\r\n style={{ margin: 5 }}\r\n />\r\n \r\n
\r\n );\r\n};\r\n\r\nexport default PackageItemInfo;\r\n","import { deleteObjectField } from 'utils';\r\n/**\r\n * @param {*} multipleFormValues\r\n * @returns //? proccessed value for /api/syndication/save-product-data-for-publishing\r\n */\r\nexport const mapToFormValuePublicationInstantFix = (multipleFormValues) => {\r\n let submitValue = (multipleFormValues || []).map((formValue) => {\r\n if (!formValue) return {};\r\n\r\n let nextFormValue = {\r\n ...formValue,\r\n value: formValue[formValue?.fieldName],\r\n };\r\n\r\n deleteObjectField(nextFormValue, [formValue?.fieldName]);\r\n return nextFormValue;\r\n });\r\n\r\n if (submitValue.find((formValue) => !formValue?.productId)) {\r\n return false;\r\n }\r\n\r\n if (submitValue?.length <= 0) return [];\r\n\r\n //* filter all empty brickcode\r\n submitValue = submitValue.filter(\r\n (submitItem) =>\r\n (submitItem.fieldName || '').toLowerCase() !== 'brickcode' ||\r\n ((submitItem.fieldName || '').toLowerCase() === 'brickcode' &&\r\n submitItem?.value?.brickCodeName)\r\n );\r\n\r\n //* create two submit items for each brick code form\r\n let nextSubmitValue = [...submitValue];\r\n\r\n let brickCodeSubmitList = [];\r\n\r\n nextSubmitValue.forEach((itemValue, idx) => {\r\n if ((itemValue.fieldName || '').toLowerCase() === 'brickcode') {\r\n brickCodeSubmitList.push(idx);\r\n }\r\n });\r\n\r\n //* add brickcode value form\r\n brickCodeSubmitList.forEach((brickcodeSubmitIdx) => {\r\n const brickCodeData = nextSubmitValue[brickcodeSubmitIdx];\r\n\r\n const code = brickCodeData?.value?.brickCode;\r\n const brickCodeName = brickCodeData?.value?.brickCodeName;\r\n\r\n const defaultBrickCodeValue = {\r\n productId: brickCodeData?.productId,\r\n moduleName: '',\r\n };\r\n\r\n nextSubmitValue = [\r\n ...nextSubmitValue,\r\n {\r\n ...defaultBrickCodeValue,\r\n fieldName: 'BrickCode',\r\n value: code,\r\n },\r\n {\r\n ...defaultBrickCodeValue,\r\n fieldName: 'BrickCodeName',\r\n value: brickCodeName,\r\n },\r\n ];\r\n });\r\n\r\n //* remove all original brickcode form\r\n nextSubmitValue = nextSubmitValue.filter(\r\n (submitValueItem, idx) => !brickCodeSubmitList.includes(idx)\r\n );\r\n\r\n return nextSubmitValue;\r\n};\r\n","import { useState, useRef, useEffect, useCallback } from 'react';\r\n\r\nimport { toUniqueList } from 'utils';\r\n\r\nimport { isEqual } from 'lodash';\r\nimport usePrevious from 'hooks/usePrevious';\r\n\r\nimport * as productServices from 'services/product';\r\n\r\nconst useFetchDataForErrorList = (errorList, reloadOneError, errorIndex) => {\r\n const [productDetailList, setProductDetailList] = useState([]);\r\n const [productModuleList, setProductModuleList] = useState([]);\r\n\r\n const refProductDetailIdList = useRef([]);\r\n const refProductModuleIdList = useRef([]);\r\n\r\n const prevReloadOneError = usePrevious(reloadOneError);\r\n\r\n const getUniqueListCallback = useCallback(({ errorList }) => {\r\n let productDetailIdList = [];\r\n let productModuleIdList = [];\r\n errorList.forEach((errorGroup) => {\r\n errorGroup.errorFields.forEach((errorItem) => {\r\n const isRivirField = !errorItem?.moduleName;\r\n\r\n if (!isRivirField) {\r\n productModuleIdList.push(errorItem?.productId);\r\n }\r\n\r\n //* get all product's detail\r\n productDetailIdList.push(errorItem?.productId);\r\n });\r\n });\r\n\r\n return {\r\n productDetailIdList: toUniqueList(productDetailIdList),\r\n productModuleIdList: toUniqueList(productModuleIdList),\r\n };\r\n }, []);\r\n\r\n const fetchProductDataCallback = useCallback(\r\n async ({ uniqueList }, isRefetch) => {\r\n const { productDetailIdList, productModuleIdList } = uniqueList;\r\n\r\n if (\r\n !isEqual(productDetailIdList, refProductDetailIdList.current) ||\r\n isRefetch\r\n ) {\r\n refProductDetailIdList.current = productDetailIdList;\r\n const productDetailServiceList = productDetailIdList.map(\r\n (productId) => {\r\n const params = { productItemId: productId };\r\n return productServices.getProductFullView(params);\r\n }\r\n );\r\n\r\n await Promise.all(productDetailServiceList).then(async (response) => {\r\n const isSuccess =\r\n response.length && response.every((res) => res.isSuccess === true);\r\n\r\n if (isSuccess) {\r\n setProductDetailList(response.map((res) => res?.data));\r\n }\r\n });\r\n }\r\n\r\n if (\r\n !isEqual(productModuleIdList, refProductModuleIdList.current) ||\r\n isRefetch\r\n ) {\r\n refProductModuleIdList.current = productModuleIdList;\r\n const productModuleServiceList = productModuleIdList.map(\r\n (productId) => {\r\n const params = { productId };\r\n return productServices.getProductItemModules(params);\r\n }\r\n );\r\n\r\n await Promise.all(productModuleServiceList).then(async (response) => {\r\n const isSuccess =\r\n response.length && response.every((res) => res.isSuccess === true);\r\n\r\n if (isSuccess) {\r\n setProductModuleList(response.map((res) => res?.data));\r\n }\r\n });\r\n }\r\n },\r\n []\r\n );\r\n\r\n const refetchProductData = async () => {\r\n try {\r\n const uniqueList = getUniqueListCallback({ errorList });\r\n await fetchProductDataCallback({ uniqueList }, true);\r\n\r\n return true;\r\n } catch (err) {\r\n return false;\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n if (errorList) {\r\n const uniqueList = getUniqueListCallback({ errorList });\r\n fetchProductDataCallback({ uniqueList });\r\n }\r\n }, [errorList, fetchProductDataCallback, getUniqueListCallback]);\r\n\r\n useEffect(() => {\r\n const reFetchOneError = async () => {\r\n const uniqueList = getUniqueListCallback({ errorList });\r\n const { productDetailIdList, productModuleIdList } = uniqueList;\r\n\r\n const productId = errorIndex;\r\n\r\n const foundIndexDetail = productDetailIdList.findIndex(\r\n (idItem) => idItem === productId\r\n );\r\n\r\n if (foundIndexDetail) {\r\n const params = { productId };\r\n const res = await productServices.getProductFullView(params);\r\n if (res?.isSuccess) {\r\n setProductDetailList((prev) => {\r\n let nextValue = [...prev];\r\n nextValue[foundIndexDetail] = res?.data;\r\n return nextValue;\r\n });\r\n }\r\n }\r\n\r\n const foundIndexModule = productModuleIdList.findIndex(\r\n (idItem) => idItem === productId\r\n );\r\n\r\n if (foundIndexModule) {\r\n const params = { productId: productId };\r\n const res = await productServices.getProductItemModules(params);\r\n if (res?.isSuccess) {\r\n setProductModuleList((prev) => {\r\n let nextValue = [...prev];\r\n nextValue[foundIndexDetail] = res?.data;\r\n return nextValue;\r\n });\r\n }\r\n }\r\n };\r\n\r\n if (reloadOneError && prevReloadOneError !== reloadOneError) {\r\n reFetchOneError();\r\n }\r\n }, [\r\n reloadOneError,\r\n prevReloadOneError,\r\n errorIndex,\r\n errorList,\r\n getUniqueListCallback,\r\n ]);\r\n\r\n return {\r\n data: {\r\n productDetailList,\r\n productModuleList,\r\n },\r\n refetchProductData,\r\n };\r\n};\r\n\r\nexport default useFetchDataForErrorList;\r\n","import React, { useState, useEffect } from 'react';\r\n\r\nimport { useIntl } from 'react-intl';\r\n\r\nimport { Form, Button, Skeleton, Row, Col } from 'antd';\r\n\r\nimport {\r\n StyledModal,\r\n CustomNotification,\r\n WithLoading,\r\n} from 'common/components';\r\n\r\nimport { PublicationErrorItemValidationRule } from './PublicationErrorItem';\r\n\r\nimport PublicationCommonErrorList from './PubliccationCommonErrorList';\r\nimport PackageItemInfo from './PackageItemInfo';\r\n\r\nimport { useGetProductEnums } from 'hooks';\r\n\r\nimport { saveQuickPublicationFixForm } from 'services/product';\r\n\r\nimport { mapToFormValuePublicationInstantFix } from 'pages/branded-products/mapper/mapToFormValuePublicationInstantFix';\r\nimport { apiHandler } from 'utils/api';\r\nimport classnames from 'classnames';\r\nimport { startCase, range } from 'lodash';\r\nimport { sleep } from 'utils/delay';\r\n\r\nimport useFetchDataForErrorList from 'pages/branded-products/hooks/useFetchDataForErrorList';\r\nimport { useGetProductSchema } from 'hooks';\r\n\r\nimport messages from 'i18n/messages/brandedProduct';\r\n\r\nimport './PublicationErrorChecker.less';\r\n\r\nconst PublicationErrorChecker = (props) => {\r\n const {\r\n isErrorListModalOpen,\r\n errorList,\r\n setProductId,\r\n toggleCheckErrorModal,\r\n toggleErrorListModal,\r\n selectedErrorIndexHook,\r\n reloadOneError,\r\n getPublishCheckList,\r\n publishCheckLoading,\r\n packageLevelItem,\r\n } = props;\r\n\r\n const intl = useIntl();\r\n\r\n const productItemId = packageLevelItem?.productId;\r\n\r\n const [submitLoading, setSubmitLoading] = useState(false);\r\n const [reloadAfterSubmit, setReloadAfterSubmit] = useState(false);\r\n const [errorIndex, setErrorIndex] = selectedErrorIndexHook;\r\n\r\n const { productEnums } = useGetProductEnums();\r\n\r\n const { productSchema, isLoading } = useGetProductSchema();\r\n\r\n const {\r\n data: { productDetailList, productModuleList },\r\n refetchProductData,\r\n } = useFetchDataForErrorList(errorList, reloadOneError, errorIndex);\r\n\r\n const handleReloadValueAfterSubmit = async () => {\r\n const isGetCheckListEnd = await getPublishCheckList();\r\n if (isGetCheckListEnd) {\r\n setReloadAfterSubmit(true);\r\n await sleep(1500); // wait for error list to be update\r\n\r\n const isLoadProductDataEnd = await refetchProductData();\r\n\r\n if (!isLoadProductDataEnd) {\r\n CustomNotification.error(`Failed to product's data`);\r\n }\r\n setReloadAfterSubmit(false);\r\n }\r\n };\r\n\r\n const handleSubmitForm = async (name, { values, forms }) => {\r\n if (!forms) return;\r\n let originalFormValues = [];\r\n\r\n await Promise.all(\r\n Object.keys(forms).map(async (formName) => {\r\n const values = await forms[formName].getFieldsValue();\r\n originalFormValues.push(values);\r\n })\r\n );\r\n\r\n const submitValue = mapToFormValuePublicationInstantFix(originalFormValues);\r\n\r\n if (submitValue === false) {\r\n return CustomNotification.info(\r\n 'Please try again, we are preparing form data'\r\n );\r\n }\r\n\r\n const params = { data: submitValue };\r\n\r\n setSubmitLoading(true);\r\n await apiHandler({\r\n service: saveQuickPublicationFixForm,\r\n params,\r\n successMessage: intl.formatMessage(messages.savePublicSuccessMessage),\r\n errorMessage: intl.formatMessage(messages.savePublicErrorMessage),\r\n successCallback: () => {\r\n handleReloadValueAfterSubmit();\r\n },\r\n onFinally: async () => {\r\n setSubmitLoading(false);\r\n },\r\n });\r\n };\r\n\r\n useEffect(() => {\r\n if (errorList?.length === 0 && isErrorListModalOpen) {\r\n CustomNotification.success('All errors resolved!');\r\n toggleErrorListModal();\r\n }\r\n }, [errorList, isErrorListModalOpen]);\r\n\r\n const modalFooter = [\r\n ,\r\n \r\n Submit\r\n ,\r\n ];\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {reloadAfterSubmit ? (\r\n range(3).map(() => )\r\n ) : (\r\n \r\n {errorList.map((errorGroup, groupIdx) => {\r\n const isEmptyFields = errorGroup?.errorFields?.length <= 0;\r\n return (\r\n \r\n
\r\n Error type: {startCase(errorGroup?.errorType || '')}\r\n
\r\n
Error message: {errorGroup?.errorMessage}
\r\n\r\n {isEmptyFields ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n );\r\n })}\r\n
\r\n )}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default PublicationErrorChecker;\r\n","import React, { useState } from 'react';\r\n\r\nimport { WithAbsoluteContainer } from 'common/components/';\r\n\r\nimport { useInjectReducer } from 'utils/common/injectedReducers';\r\nimport { useInjectSaga } from 'utils/common/injectSaga';\r\n\r\nimport { useGetPublishingProduct } from './hooks';\r\n\r\nimport ProdductItemSearchDrawer from './ProductItemSearchDrawer';\r\nimport PublicationErrorDetailModal from './PublicationErrorDetailModal';\r\nimport PublicationErrorChecker from './PublicationErrorChecker';\r\n\r\nimport productFullViewSaga from 'pages/product-full-view/controllers/saga';\r\nimport productFullViewReducer from 'pages/product-full-view/controllers/reducer';\r\n\r\nimport './styles.less';\r\n\r\nconst key = 'productFullView';\r\n\r\nconst PublicationValidationErrorCheck = (props) => {\r\n const {\r\n validationResult,\r\n isErrorListModalOpen,\r\n toggleErrorListModal,\r\n getPublishCheckList,\r\n publishCheckLoading,\r\n } = props;\r\n\r\n const errorList = validationResult?.errors || [];\r\n const packageLevelItem = validationResult;\r\n const hierarchyItems = [validationResult];\r\n\r\n const productItemId = packageLevelItem?.productId;\r\n\r\n useInjectReducer({ key, reducer: productFullViewReducer });\r\n useInjectSaga({ key, saga: productFullViewSaga });\r\n\r\n const [isErrModalVisible, setErrModalVisible] = useState(false);\r\n\r\n const [isDrawerVisible, setIsDrawerVisible] = useState(false);\r\n const [currentError, setCurrentError] = useState(null);\r\n const [productId, setProductId] = useState(null);\r\n const selectedErrorIndexHook = useState(null);\r\n const [reloadOneError, setReloadOneError] = useState(false);\r\n\r\n const { publishingProduct } = useGetPublishingProduct({\r\n productId,\r\n isEnabled: Boolean(productId),\r\n });\r\n\r\n const toggleCheckErrorModal = (productId, errorInfo) => {\r\n setErrModalVisible((prev) => {\r\n if (!prev) {\r\n setProductId(productId);\r\n setCurrentError(errorInfo);\r\n } else {\r\n setCurrentError(null);\r\n setProductId(null);\r\n }\r\n return !prev;\r\n });\r\n };\r\n\r\n const toggleIsDrawerOpen = () => setIsDrawerVisible((prev) => !prev);\r\n\r\n const setEditProductId = (productId) => {\r\n setProductId(productId);\r\n };\r\n\r\n return (\r\n \r\n \r\n\r\n {isErrModalVisible && (\r\n \r\n )}\r\n\r\n \r\n \r\n );\r\n};\r\n\r\nexport default PublicationValidationErrorCheck;\r\n","import { PUBLISH_TYPES } from 'static/Constants';\r\n\r\nconst mapToPublishProductRequestParams = ({\r\n publishChecklist,\r\n requestParams,\r\n}) => {\r\n let params;\r\n\r\n let greenData =\r\n publishChecklist &&\r\n publishChecklist.length > 0 &&\r\n publishChecklist.filter((val) => val.status === 'Green');\r\n\r\n let publishInfo = [];\r\n\r\n greenData &&\r\n greenData.length > 0 &&\r\n greenData.map((val) => {\r\n publishInfo.push({\r\n productId: val?.productId,\r\n recipientGLN: val?.recipientGLN,\r\n });\r\n });\r\n\r\n let publishType = requestParams?.publishType;\r\n\r\n const publishTypeParam =\r\n publishType === PUBLISH_TYPES.REPUBLISH.value\r\n ? { IsNewLoad: false, IsInitialLoad: false }\r\n : publishType === PUBLISH_TYPES.NEW.value\r\n ? { IsNewLoad: true, IsInitialLoad: false }\r\n : publishType === PUBLISH_TYPES.INITIAL.value\r\n ? { IsNewLoad: false, IsInitialLoad: true }\r\n : {};\r\n\r\n params = {\r\n sourceGLN: requestParams.sourceGLN,\r\n customImageFormat: requestParams.customImageFormat,\r\n publishInfo: publishInfo,\r\n ...publishTypeParam,\r\n };\r\n\r\n return params;\r\n};\r\n\r\nexport default mapToPublishProductRequestParams;\r\n","import {\r\n Button,\r\n Checkbox,\r\n Col,\r\n Modal,\r\n Row,\r\n Spin,\r\n Tooltip,\r\n Typography,\r\n} from 'antd';\r\nimport React, { useEffect, useState } from 'react';\r\n\r\nimport { ArrowDownOutlined } from '@ant-design/icons';\r\nimport { CustomNotification } from 'common/components';\r\nimport PublicationValidationErrorCheck from '../publication-validation-error-check';\r\n\r\nimport { Images } from 'config/assets';\r\n\r\nimport * as endpointsProduct from 'services/product/endpoints';\r\nimport { getPublishChecklist } from 'services/product';\r\n\r\nimport { AgGridColumn, AgGridReact } from 'ag-grid-react';\r\nimport classnames from 'classnames';\r\n\r\nimport { dialogFunction } from 'common/components/index';\r\nimport ErrorModal from 'common/components/product-publication-setup/ErrorModal.js';\r\nimport * as api from 'config/axios';\r\nimport { formatMDY } from 'utils/formatDate';\r\n\r\nimport mapToPublishProductRequestParams from 'pages/branded-products/mapper/mapToPublishProductRequestParams';\r\n\r\nimport { useGetProductFullView, useGlobalModal } from 'hooks';\r\n\r\nimport 'ag-grid-enterprise/dist/styles/ag-grid.css';\r\nimport 'ag-grid-enterprise/dist/styles/ag-theme-alpine.css';\r\nimport './PublicationValidationView.less';\r\n\r\nconst color = [\r\n 'beige',\r\n 'bisque',\r\n 'burlywood',\r\n 'chocolate',\r\n 'coral',\r\n 'darkseagreen',\r\n 'lightblue',\r\n 'lightcyan',\r\n 'mistyrose,',\r\n 'pink',\r\n 'skyblue',\r\n 'wheat',\r\n 'yellowgreen',\r\n 'teal',\r\n];\r\n\r\nconst PublicationValidationView = ({\r\n requestParams,\r\n isFullView,\r\n productId,\r\n}) => {\r\n const [loading, setLoading] = useState(false);\r\n const [loadingPublish, setLoadingPublish] = useState(false);\r\n const [publishChecklist, setPublishChecklist] = useState([]);\r\n const [hieararchySelect, setHieararchySelect] = useState(-1);\r\n const [publishSelect, setPublishSelect] = useState(-1);\r\n\r\n const [visibleHieararchy, setVisibleHieararchy] = useState(false);\r\n const [rowDataHieararchy, setRowDataHieararchy] = useState([]);\r\n const [isErrorListModalOpen, setIsErrorListModalOpen] = useState(false);\r\n const [errorList, setErrorList] = useState([]);\r\n\r\n const { handleRefetchProductFullView } = useGetProductFullView({\r\n productId,\r\n });\r\n\r\n const { checkModalVisible, MODAL_NAMES, closeAllModal } = useGlobalModal();\r\n\r\n const visible = checkModalVisible(\r\n MODAL_NAMES.PUBLICATION_VALIDATE_VIEW_MODAL\r\n );\r\n\r\n const clearState = () => {\r\n setPublishChecklist([]);\r\n setPublishSelect(-1);\r\n setHieararchySelect(-1);\r\n };\r\n\r\n const toggleErrorListModal = () => {\r\n setIsErrorListModalOpen((prev) => {\r\n prev && setPublishSelect(-1);\r\n\r\n return !prev;\r\n });\r\n };\r\n\r\n const handleClickErrorStatus = (rowIndex) => {\r\n setPublishSelect(rowIndex);\r\n toggleErrorListModal();\r\n };\r\n\r\n useEffect(() => {\r\n if (!requestParams) return;\r\n setErrorList([]);\r\n handleGetPublishCheckList(requestParams);\r\n }, [requestParams]);\r\n\r\n const handleGetPublishCheckList = async (params) => {\r\n setLoading(true);\r\n await getPublishChecklist(params)\r\n .then((response) => {\r\n const { message, isSuccess, data, status } = response || {};\r\n if (isSuccess) {\r\n let data;\r\n data = response?.data?.publishChecklist;\r\n setPublishChecklist(data);\r\n } else {\r\n const notificationMessage = message\r\n ? message\r\n : status === 500 && data?.title\r\n ? data?.title\r\n : 'Server Error';\r\n\r\n CustomNotification.error(notificationMessage);\r\n }\r\n })\r\n .catch((error) => {})\r\n .finally(() => setLoading(false));\r\n };\r\n\r\n const renderErrorField = (params, text) => {\r\n let array = params.data?.errors || [];\r\n let check = {};\r\n let result = array.filter((o) => {\r\n var key = ['errorMessage', 'errorType'].map((k) => o[k]).join('|');\r\n if (!check[key]) {\r\n check[key] = true;\r\n return true;\r\n }\r\n });\r\n return (\r\n \r\n \r\n \r\n {text}:\r\n \r\n \r\n {result &&\r\n result.length > 0 > 0 &&\r\n result.map((val) => {\r\n return (\r\n \r\n \r\n - {val?.errorType}: {val?.errorMessage}\r\n \r\n {val?.errorFields &&\r\n val?.errorFields.length > 0 &&\r\n val?.errorFields.map((err) => {\r\n return (\r\n \r\n \r\n + ({err.packageLevel}) {err.fieldName}\r\n \r\n \r\n );\r\n })}\r\n \r\n );\r\n })}\r\n \r\n );\r\n };\r\n const statusRender = (params) => {\r\n if (params.value === 'Yellow')\r\n return (\r\n \r\n {\r\n handleClickErrorStatus(params?.rowIndex);\r\n }}\r\n style={{\r\n width: '100%',\r\n height: '100%',\r\n color: 'transparent',\r\n }}\r\n >\r\n error list\r\n \r\n \r\n );\r\n if (params.value === 'Red')\r\n return (\r\n \r\n {\r\n handleClickErrorStatus(params?.rowIndex);\r\n }}\r\n style={{\r\n width: '100%',\r\n height: '100%',\r\n color: 'transparent',\r\n }}\r\n >\r\n error list\r\n \r\n \r\n );\r\n if (params.value === 'Green')\r\n return (\r\n \r\n }\r\n onClick={() => {}}\r\n style={{ color: '#fff', width: '100%', height: '100%' }}\r\n >\r\n {' '}\r\n \r\n \r\n );\r\n return
;\r\n };\r\n\r\n const statusCellClass = (params) => {\r\n if (params.value === 'Green') {\r\n return 'rag-green';\r\n }\r\n if (params.value === 'Yellow') {\r\n return 'rag-amber';\r\n }\r\n if (params.value === 'Red') {\r\n return 'rag-red';\r\n }\r\n };\r\n\r\n const imgRender = (params) => {\r\n return (\r\n // \r\n \r\n // \r\n );\r\n };\r\n\r\n const countSizeArrowRender = (params) => {\r\n return (\r\n \r\n \r\n \r\n {isNaN(parseFloat(params?.data?.productPackCount)) &&\r\n isNaN(parseFloat(params?.data?.productSize))\r\n ? ''\r\n : isNaN(parseFloat(params?.data?.productPackCount))\r\n ? Math.round(parseFloat(params?.data?.productSize) * 100) / 100 +\r\n ' ' +\r\n (params?.data?.productSizeUOM || 'unknown measurement unit')\r\n : isNaN(parseFloat(params?.data?.productSize))\r\n ? params?.data?.productPackCount +\r\n (params?.data?.productSizeUOM || 'unknown measurement unit')\r\n : params?.data?.productPackCount +\r\n '/' +\r\n Math.round(parseFloat(params?.data?.productSize) * 100) / 100 +\r\n ' ' +\r\n (params?.data?.productSizeUOM || 'unknown measurement unit')}\r\n \r\n \r\n \r\n }\r\n onClick={() => {\r\n setPublishSelect(params?.rowIndex);\r\n let hierarchyItems = params?.data?.hierarchyItems || [];\r\n hierarchyItems.sort(comparePackageLevel);\r\n hierarchyItems.sort(\r\n (firstItem, secondItem) =>\r\n firstItem?.hierarchyId - secondItem?.hierarchyId\r\n );\r\n setRowDataHieararchy(hierarchyItems);\r\n setVisibleHieararchy(true);\r\n }}\r\n >\r\n \r\n \r\n );\r\n };\r\n\r\n const comparePackageLevel = (a, b) => {\r\n if (a?.productPackageLevel === 'Pallet') {\r\n if (b?.productPackageLevel === 'Pallet') {\r\n return 0;\r\n } else {\r\n return -1;\r\n }\r\n }\r\n if (a?.productPackageLevel === 'Master Case') {\r\n if (b?.productPackageLevel === 'Master Case') {\r\n return 0;\r\n } else if (b?.productPackageLevel === 'Pallet') {\r\n return 1;\r\n } else {\r\n return -1;\r\n }\r\n }\r\n if (a?.productPackageLevel === 'Case') {\r\n if (b?.productPackageLevel === 'Case') {\r\n return 0;\r\n } else if (\r\n b?.productPackageLevel === 'Pallet' ||\r\n b?.productPackageLevel === 'Master Case'\r\n ) {\r\n return 1;\r\n } else {\r\n return -1;\r\n }\r\n }\r\n if (a?.productPackageLevel === 'Inner Pack') {\r\n if (b?.productPackageLevel === 'Inner Pack') {\r\n return 0;\r\n } else if (\r\n b?.productPackageLevel === 'Pallet' ||\r\n b?.productPackageLevel === 'Master Case' ||\r\n b?.productPackageLevel === 'Case'\r\n ) {\r\n return 1;\r\n } else {\r\n return -1;\r\n }\r\n }\r\n if (a?.productPackageLevel === 'Unit') {\r\n if (b?.productPackageLevel === 'Unit') {\r\n return 0;\r\n } else {\r\n return 1;\r\n }\r\n }\r\n return 0;\r\n };\r\n\r\n const renderSize = (params) => {\r\n return isNaN(parseFloat(params?.value))\r\n ? ''\r\n : Math.round(parseFloat(params?.value) * 100) / 100;\r\n };\r\n\r\n const columnDefs = [\r\n {\r\n fieldNameCamelCase: 'status',\r\n displayName: '',\r\n width: 50,\r\n cellClass: statusCellClass,\r\n cellRenderer: statusRender,\r\n },\r\n {\r\n fieldNameCamelCase: 'productImageThumb',\r\n displayName: '',\r\n width: 50,\r\n cellRenderer: imgRender,\r\n },\r\n {\r\n dataType: 'string',\r\n displayName: 'Recipient',\r\n fieldName: 'RecipientName',\r\n fieldNameCamelCase: 'recipientName',\r\n },\r\n {\r\n dataType: 'string',\r\n displayName: 'Recipient GLN',\r\n fieldName: 'RecipientGLN',\r\n fieldNameCamelCase: 'recipientGLN',\r\n },\r\n {\r\n dataType: 'string',\r\n displayName: 'Product Name',\r\n fieldName: 'ProductName',\r\n fieldNameCamelCase: 'productName',\r\n },\r\n {\r\n dataType: 'string',\r\n displayName: 'Product GTIN',\r\n fieldName: 'ProductGTIN',\r\n fieldNameCamelCase: 'productGTIN',\r\n },\r\n {\r\n dataType: 'string',\r\n displayName: 'Package Level',\r\n fieldName: 'productPackageLevel',\r\n fieldNameCamelCase: 'productPackageLevel',\r\n },\r\n {\r\n dataType: 'string',\r\n displayName: 'Count/Size',\r\n cellRenderer: countSizeArrowRender,\r\n },\r\n {\r\n dataType: 'string',\r\n displayName: 'Brand Name',\r\n fieldName: 'ProductBrandName',\r\n fieldNameCamelCase: 'productBrandName',\r\n },\r\n {\r\n dataType: 'string',\r\n displayName: 'RIVIR ID',\r\n fieldName: 'ProductRivirId',\r\n fieldNameCamelCase: 'productRivirId',\r\n },\r\n {\r\n dataType: 'string',\r\n displayName: 'Primary Size',\r\n fieldName: 'ProductSize',\r\n fieldNameCamelCase: 'productSize',\r\n cellRenderer: renderSize,\r\n },\r\n {\r\n dataType: 'string',\r\n displayName: 'Primary Unit of Measure',\r\n fieldName: 'ProductSizeUOM',\r\n fieldNameCamelCase: 'productSizeUOM',\r\n },\r\n ];\r\n\r\n const handleModalPublish = () => {\r\n setErrorList([]);\r\n\r\n const params = mapToPublishProductRequestParams({\r\n publishChecklist,\r\n requestParams,\r\n });\r\n\r\n setLoadingPublish(true);\r\n api\r\n .sendPost(endpointsProduct.EXECUTE_PUBLISH_PRODUCTS, params)\r\n .then((response) => {\r\n const { isSuccess, data } = response;\r\n\r\n if (isSuccess) {\r\n CustomNotification.success('Publish successfully');\r\n clearState();\r\n closeAllModal();\r\n } else {\r\n const errorMessages = data?.messages?.map(\r\n (mess) => mess?.messageContent\r\n );\r\n\r\n setErrorList(errorMessages);\r\n }\r\n })\r\n .catch((error) => {})\r\n .finally(() => {\r\n setLoadingPublish(false);\r\n });\r\n };\r\n const handleModalCancel = () => {\r\n clearState();\r\n setLoading(false);\r\n closeAllModal();\r\n //\r\n if (isFullView && productId) {\r\n handleRefetchProductFullView();\r\n }\r\n };\r\n\r\n const handleModalCancelHieararchy = () => {\r\n setVisibleHieararchy(false);\r\n setHieararchySelect(-1);\r\n };\r\n const handleModalSelect = () => {\r\n dialogFunction({\r\n type: 'warn',\r\n content:\r\n 'Validation process will re-execute. Are you sure you want to select new package level for publication?',\r\n okText: 'OK',\r\n cancelText: 'Cancel',\r\n onOk: handleConfirm,\r\n zIndex: 100000,\r\n });\r\n };\r\n\r\n const handleConfirm = async () => {\r\n let dataSelect = rowDataHieararchy[hieararchySelect];\r\n let dataTemp = [...publishChecklist];\r\n\r\n let params = {\r\n productIds: [dataSelect?.productId],\r\n recipientGLNs: [dataTemp[publishSelect]?.recipientGLN],\r\n sourceGLN: requestParams.sourceGLN,\r\n };\r\n\r\n setHieararchySelect(-1);\r\n setVisibleHieararchy(false);\r\n setLoading(true);\r\n\r\n await getPublishChecklist(params)\r\n .then((response) => {\r\n const { isSuccess, message, data, status } = response || {};\r\n\r\n if (isSuccess) {\r\n let data;\r\n data = response?.data?.publishChecklist;\r\n dataTemp[publishSelect] = (data && data.length > 0 && data[0]) || [];\r\n setPublishChecklist(dataTemp);\r\n } else {\r\n const notificationMessage = message\r\n ? message\r\n : status === 500 && data?.title\r\n ? data?.title\r\n : 'Server Error';\r\n\r\n CustomNotification.error(notificationMessage);\r\n }\r\n })\r\n .catch((error) => {})\r\n .finally(() => setLoading(false));\r\n };\r\n\r\n const regetPublishErrorAfterSubmitErrorChecker = async () => {\r\n let dataSelect = publishChecklist[publishSelect];\r\n\r\n let dataTemp = [...publishChecklist];\r\n\r\n const recipientListToRecheck = publishChecklist\r\n .filter(\r\n (publishCheck) => publishCheck?.productId === dataSelect?.productId\r\n )\r\n .map((publishCheck) => publishCheck?.recipientGLN);\r\n\r\n let params = {\r\n productIds: [dataSelect?.productId],\r\n recipientGLNs: recipientListToRecheck,\r\n\r\n sourceGLN: requestParams.sourceGLN,\r\n };\r\n\r\n setLoading(true);\r\n await getPublishChecklist(params)\r\n .then((response) => {\r\n const { isSuccess, status, data, message } = response || {};\r\n if (isSuccess) {\r\n let data;\r\n data = response?.data?.publishChecklist;\r\n\r\n data &&\r\n data?.length >= 0 &&\r\n data.forEach((resPublishCheck) => {\r\n const foundCheckListIdx = dataTemp.findIndex(\r\n (publishCheck) =>\r\n publishCheck?.productId === resPublishCheck.productId &&\r\n publishCheck?.recipientGLN === resPublishCheck.recipientGLN\r\n );\r\n if (foundCheckListIdx !== -1) {\r\n dataTemp[foundCheckListIdx] = resPublishCheck;\r\n }\r\n });\r\n\r\n setPublishChecklist(dataTemp);\r\n } else {\r\n const notificationMessage = message\r\n ? message\r\n : status === 500 && data?.title\r\n ? data?.title\r\n : 'Server Error';\r\n\r\n CustomNotification.error(notificationMessage);\r\n }\r\n })\r\n .catch((error) => {})\r\n .finally(() => setLoading(false));\r\n\r\n return true;\r\n };\r\n\r\n const columnGrid = (val, index) => {\r\n return (\r\n \r\n );\r\n };\r\n const formatDate = (params) => {\r\n return formatMDY(params.value);\r\n };\r\n const checkboxRender = (params) => {\r\n return (\r\n {\r\n // params.data[params.colDef.field] = e.targetchecked;\r\n // params.api.refreshCells();\r\n // }}\r\n >
\r\n );\r\n };\r\n\r\n const setColor = (selectPackageLevel, packageLevel) => {\r\n if (selectPackageLevel === 'Pallet') {\r\n if (packageLevel === 'Pallet') {\r\n return 'grey';\r\n } else {\r\n return 'grey';\r\n }\r\n }\r\n if (selectPackageLevel === 'Master Case') {\r\n if (packageLevel === 'Master Case') {\r\n return 'grey';\r\n } else if (packageLevel === 'Pallet') {\r\n return 'green';\r\n } else {\r\n return 'grey';\r\n }\r\n }\r\n if (selectPackageLevel === 'Case') {\r\n if (packageLevel === 'Case') {\r\n return 'grey';\r\n } else if (packageLevel === 'Pallet' || packageLevel === 'Master Case') {\r\n return 'green';\r\n } else {\r\n return 'grey';\r\n }\r\n }\r\n if (selectPackageLevel === 'Inner Pack') {\r\n if (packageLevel === 'Inner Pack') {\r\n return 'grey';\r\n } else if (\r\n packageLevel === 'Pallet' ||\r\n packageLevel === 'Master Case' ||\r\n packageLevel === 'Case'\r\n ) {\r\n return 'green';\r\n } else {\r\n return 'grey';\r\n }\r\n }\r\n if (selectPackageLevel === 'Unit') {\r\n if (packageLevel === 'Unit') {\r\n return 'grey';\r\n } else {\r\n return 'green';\r\n }\r\n }\r\n return '';\r\n };\r\n\r\n return (\r\n <>\r\n \r\n Cancel\r\n ,\r\n {\r\n handleModalPublish();\r\n }}\r\n loading={loading || loadingPublish}\r\n disabled={\r\n (publishChecklist &&\r\n publishChecklist.length > 0 &&\r\n publishChecklist.filter((val) => val.status === 'Green')\r\n ?.length === 0) ||\r\n !publishChecklist\r\n }\r\n >\r\n Publish\r\n ,\r\n ]}\r\n // zIndex={9999}\r\n >\r\n {loading || loadingPublish ? (\r\n \r\n ) : (\r\n \r\n {columnDefs && columnDefs.length > 0 && (\r\n <>\r\n \r\n \r\n {columnDefs.map((val, index) => {\r\n return columnGrid(val, index);\r\n })}\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n )}\r\n \r\n\r\n \r\n Cancel\r\n ,\r\n {\r\n handleModalSelect();\r\n }}\r\n loading={loading}\r\n disabled={hieararchySelect < 0}\r\n >\r\n Select\r\n ,\r\n ]}\r\n zIndex={99999}\r\n >\r\n \r\n {rowDataHieararchy &&\r\n rowDataHieararchy.length > 0 &&\r\n rowDataHieararchy.map((val, index) => {\r\n return (\r\n setHieararchySelect(index)}\r\n className={\r\n hieararchySelect === index ||\r\n (hieararchySelect === -1 &&\r\n publishChecklist[publishSelect]?.productId ===\r\n val?.productId &&\r\n publishChecklist[publishSelect]?.productPackageLevel ===\r\n val?.productPackageLevel)\r\n ? 'item-hieararchy item-hieararchy--selected'\r\n : 'item-hieararchy'\r\n }\r\n style={{ background: color[val?.hierarchyId % 10] }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n {val?.productGTIN} - {val?.productName}\r\n \r\n \r\n \r\n \r\n {val?.productBrandName}\r\n \r\n \r\n \r\n \r\n {val?.productPackageLevel}\r\n \r\n \r\n \r\n \r\n \r\n Package Count\r\n \r\n \r\n \r\n \r\n {val?.productPackCount}\r\n \r\n \r\n \r\n \r\n \r\n \r\n Size\r\n \r\n \r\n \r\n \r\n {isNaN(parseFloat(val?.productSize))\r\n ? ''\r\n : Math.round(parseFloat(val?.productSize) * 100) /\r\n 100}{' '}\r\n {val?.productSizeUOM}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n \r\n <>\r\n {toggleErrorListModal && (\r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default PublicationValidationView;\r\n","import customCellComponents from '../components/custom-cell-components/customCellComponents';\r\n\r\nimport { formatMDYWithParam } from 'utils/formatDate';\r\n\r\nconst formatFieldsName = (jsonConfig) => {\r\n let fieldsName = [];\r\n\r\n if (jsonConfig) {\r\n const config = JSON.parse(jsonConfig);\r\n\r\n config.columns.forEach((column) => {\r\n fieldsName.push({\r\n fieldName: column.fieldFullPath,\r\n });\r\n });\r\n }\r\n\r\n return fieldsName;\r\n};\r\n\r\nconst formatColumns = (jsonConfig) => {\r\n let cols = [\r\n {\r\n filter: false,\r\n suppressMenu: true,\r\n resizable: true,\r\n checkboxSelection: true,\r\n },\r\n ];\r\n\r\n if (jsonConfig) {\r\n const config = JSON.parse(jsonConfig);\r\n\r\n config.columns.forEach((column) => {\r\n const { fieldFullPath, dataType, displayName, minWidth, width, field } =\r\n column || {};\r\n\r\n if (fieldFullPath === 'productName') {\r\n cols.push({\r\n allowFilter: true,\r\n allowSort: true,\r\n resizable: true,\r\n dataType: dataType?.toLowerCase(),\r\n field: fieldFullPath,\r\n headerName: displayName,\r\n linkTo: '/product/{id}',\r\n minWidth: minWidth,\r\n width: width,\r\n });\r\n } else if (dataType?.toLowerCase() === 'datetime') {\r\n cols.push({\r\n field: fieldFullPath,\r\n headerName: displayName,\r\n minWidth: minWidth,\r\n width: width,\r\n cellRenderer: formatMDYWithParam,\r\n });\r\n } else if (field === 'stateIcons') {\r\n cols.push({\r\n ...column,\r\n field: fieldFullPath,\r\n headerName: 'States',\r\n minWidth: minWidth,\r\n width: width,\r\n cellRenderer: customCellComponents.renderIcons,\r\n });\r\n } else if (field === 'productThumbnail') {\r\n cols.push({\r\n ...column,\r\n dataType: dataType?.toLowerCase(),\r\n field: fieldFullPath,\r\n headerName: displayName,\r\n minWidth: minWidth,\r\n width: width,\r\n cellRenderer: customCellComponents.renderThumbnail,\r\n });\r\n } else {\r\n cols.push({\r\n allowFilter: true,\r\n allowSort: true,\r\n resizable: true,\r\n dataType: dataType?.toLowerCase(),\r\n field: fieldFullPath,\r\n headerName: displayName,\r\n minWidth: minWidth,\r\n width: width,\r\n });\r\n }\r\n });\r\n }\r\n\r\n return cols;\r\n};\r\n\r\nexport { formatColumns, formatFieldsName };\r\n","import * as types from './constants';\r\n\r\nimport { formatColumns, formatFieldsName } from '../utils';\r\nimport { isUndefined, isBoolean, pickBy } from 'lodash';\r\n\r\nexport function getProductList(\r\n pageSize,\r\n pageIndex,\r\n search,\r\n primaryFieldsOnly,\r\n filters,\r\n advancedSearchContainer,\r\n searchCategory,\r\n isFavoriteRoute,\r\n packageLevels,\r\n fromDate = null,\r\n aplId\r\n) {\r\n return {\r\n type: types.GET_PRODUCT_LIST,\r\n pageSize,\r\n pageIndex,\r\n search,\r\n primaryFieldsOnly,\r\n filters,\r\n advancedSearchContainer,\r\n searchCategory,\r\n isFavoriteRoute,\r\n packageLevels,\r\n fromDate,\r\n aplId,\r\n };\r\n}\r\n\r\nexport function getMemberProductList({\r\n pageSize,\r\n pageIndex,\r\n search,\r\n filters,\r\n advancedSearchContainer,\r\n searchCategory,\r\n packageLevels,\r\n isFavoriteRoute,\r\n fromDate = null,\r\n memberId,\r\n aplId,\r\n}) {\r\n return {\r\n type: types.GET_MEMBER_PRODUCT_LIST,\r\n pageSize,\r\n pageIndex,\r\n search,\r\n filters,\r\n advancedSearchContainer,\r\n searchCategory,\r\n packageLevels,\r\n isFavoriteRoute,\r\n fromDate,\r\n memberId,\r\n aplId,\r\n };\r\n}\r\n\r\nexport function getProductListSuccess(products, total) {\r\n return {\r\n type: types.GET_PRODUCT_LIST_SUCCESS,\r\n products,\r\n total,\r\n };\r\n}\r\n\r\nexport function getProductListError(error) {\r\n return {\r\n type: types.GET_PRODUCT_LIST_ERROR,\r\n error,\r\n };\r\n}\r\n\r\nexport function gridColumnInfo(gridName) {\r\n return {\r\n type: types.PRODUCT_GRID_COLUMN_INFO,\r\n gridName,\r\n };\r\n}\r\n\r\nexport function gridColumnInfoSuccess(columns) {\r\n return {\r\n type: types.PRODUCT_GRID_COLUMN_INFO_SUCCESS,\r\n columns,\r\n };\r\n}\r\n\r\nexport function gridColumnInfoError(error) {\r\n return {\r\n type: types.PRODUCT_GRID_COLUMN_INFO_ERROR,\r\n error,\r\n };\r\n}\r\n\r\nexport function toggleReloadGridProduct(value = true) {\r\n return {\r\n type: types.TOGGLE_RELOAD_GRID_PRODUCT,\r\n payload: value,\r\n };\r\n}\r\n\r\nexport function saveGridConfig(payload) {\r\n const { selectedColumns, jsonConfig, isHaveDefaultConfig } = payload;\r\n\r\n let nextPayload = {\r\n selectedColumns: isUndefined(selectedColumns) ? undefined : selectedColumns,\r\n allConfigFieldsName: isUndefined(jsonConfig)\r\n ? undefined\r\n : formatFieldsName(jsonConfig),\r\n defaultColumnsGrid: isUndefined(jsonConfig)\r\n ? undefined\r\n : formatColumns(jsonConfig),\r\n isConfigEmpty: isUndefined(selectedColumns)\r\n ? undefined\r\n : selectedColumns === null\r\n ? true\r\n : false,\r\n isHaveDefaultConfig: isBoolean(isHaveDefaultConfig)\r\n ? isHaveDefaultConfig\r\n : undefined,\r\n };\r\n\r\n nextPayload = pickBy(nextPayload, (value) => value !== undefined);\r\n\r\n return {\r\n type: types.SAVE_GRID_CONFIG,\r\n payload: nextPayload,\r\n };\r\n}\r\nexport function applyGridConfig(data) {\r\n return {\r\n type: types.APPLY_GRID_CONFIG,\r\n payload: data,\r\n };\r\n}\r\n// Add Product\r\nexport function addProduct(params) {\r\n return {\r\n type: types.ADD_PRODUCT,\r\n params,\r\n };\r\n}\r\n\r\nexport function addProductSuccess(data) {\r\n return {\r\n type: types.ADD_PRODUCT_SUCCESS,\r\n data,\r\n };\r\n}\r\n\r\nexport function addProductError(params) {\r\n return {\r\n type: types.ADD_PRODUCT_ERROR,\r\n params,\r\n };\r\n}\r\n\r\nexport const getProductBrandImageOnAdd = (payload) => {\r\n return {\r\n type: types.GET_PRODUCT_BRAND_ON_ADD,\r\n payload,\r\n };\r\n};\r\nexport const getProductBrandImageOnAddSuccess = (payload) => {\r\n return {\r\n type: types.GET_PRODUCT_BRAND_ON_ADD_SUCCESS,\r\n payload,\r\n };\r\n};\r\nexport const getProductBrandImageOnAddError = (payload) => ({\r\n type: types.GET_PRODUCT_BRAND_ON_ADD_ERROR,\r\n payload,\r\n});\r\n\r\nexport const toggleProductNew = (status) => ({\r\n type: types.TOGGLE_PRODUCT_NEW,\r\n payload: status,\r\n});\r\n\r\nexport function getGDSNPartyList(gridName) {\r\n return {\r\n type: types.GET_GDSN_PARTY_LIST,\r\n gridName,\r\n };\r\n}\r\n\r\nexport function getGDSNPartyListSuccess(columns) {\r\n return {\r\n type: types.GET_GDSN_PARTY_LIST_SUCCESS,\r\n columns,\r\n };\r\n}\r\n\r\nexport function getGDSNPartyListFailure(error) {\r\n return {\r\n type: types.GET_GDSN_PARTY_LIST_FAILURE,\r\n error,\r\n };\r\n}\r\n\r\nexport const toggleProductUnmatch = (status) => ({\r\n type: types.TOGGLE_PRODUCT_UNMATCH,\r\n payload: status,\r\n});\r\n","// Action Types\r\nexport const GET_PRODUCT_LIST = 'GET_PRODUCT_LIST';\r\nexport const GET_MEMBER_PRODUCT_LIST = 'GET_MEMBER_PRODUCT_LIST';\r\nexport const GET_PRODUCT_LIST_SUCCESS = 'GET_PRODUCT_LIST_SUCCESS';\r\nexport const GET_PRODUCT_LIST_ERROR = 'GET_PRODUCT_LIST_ERROR';\r\nexport const PRODUCT_GRID_COLUMN_INFO = 'PRODUCT_GRID_COLUMN_INFO';\r\nexport const PRODUCT_GRID_COLUMN_INFO_SUCCESS =\r\n 'PRODUCT_GRID_COLUMN_INFO_SUCCESS';\r\nexport const PRODUCT_GRID_COLUMN_INFO_ERROR = 'PRODUCT_GRID_COLUMN_INFO_ERROR';\r\n\r\nexport const TOGGLE_RELOAD_GRID_PRODUCT = 'TOGGLE_RELOAD_GRID_PRODUCT';\r\nexport const SAVE_GRID_CONFIG = 'SAVE_GRID_CONFIG';\r\nexport const APPLY_GRID_CONFIG = 'APPLY_GRID_CONFIG';\r\n// Add Product via Form\r\nexport const ADD_PRODUCT = 'ADD_PRODUCT';\r\nexport const ADD_PRODUCT_SUCCESS = 'ADD_PRODUCT_SUCCESS';\r\nexport const ADD_PRODUCT_ERROR = 'ADD_PRODUCT_ERROR';\r\n\r\n// Get Brand Image on Add\r\nexport const GET_PRODUCT_BRAND_ON_ADD = 'GET_PRODUCT_BRAND_ON_ADD';\r\nexport const GET_PRODUCT_BRAND_ON_ADD_SUCCESS =\r\n 'GET_PRODUCT_BRAND_ON_ADD_SUCCESS';\r\nexport const GET_PRODUCT_BRAND_ON_ADD_ERROR = 'GET_PRODUCT_BRAND_ON_ADD_ERROR';\r\nexport const TOGGLE_PRODUCT_NEW = 'TOGGLE_PRODUCT_NEW';\r\n\r\n// GDSN Party List\r\nexport const GET_GDSN_PARTY_LIST = 'GET_GDSN_PARTY_LIST';\r\nexport const GET_GDSN_PARTY_LIST_SUCCESS = 'GET_GDSN_PARTY_LIST_SUCCESS';\r\nexport const GET_GDSN_PARTY_LIST_FAILURE = 'GET_GDSN_PARTY_LIST_FAILURE';\r\nexport const TOGGLE_PRODUCT_UNMATCH = 'TOGGLE_PRODUCT_UNMATCH';\r\n","import produce from 'immer';\r\nimport * as types from './constants';\r\n\r\n// initial state\r\nexport const initialState = {\r\n loading: false,\r\n error: false,\r\n products: [],\r\n total: 0,\r\n pageSize: 20,\r\n pageIndex: 1,\r\n search: '',\r\n columns: [],\r\n gridName: '',\r\n reloadGrid: false,\r\n gridConfig: {\r\n allConfigFieldsName: null,\r\n selectedColumns: null,\r\n defaultColumnsGrid: [],\r\n isConfigEmpty: true,\r\n isHaveDefaultConfig: false,\r\n },\r\n applyGridConfig: {\r\n configId: null,\r\n configName: null,\r\n id: null,\r\n isDefault: null,\r\n jsonConfig: null,\r\n lastModified: null,\r\n selectedColumns: null,\r\n isApply: false,\r\n },\r\n // ENUM\r\n enums: null,\r\n //\r\n addProductStatus: false,\r\n addProductError: false,\r\n\r\n brandImageOnAdd: {\r\n loading: false,\r\n error: false,\r\n data: [],\r\n totalItems: 0,\r\n pageSize: 20,\r\n pageIndex: 1,\r\n },\r\n isDisplayProductNew: false,\r\n\r\n GDSNPartyList: {\r\n loading: false,\r\n error: false,\r\n data: [],\r\n },\r\n};\r\n\r\nconst formatFieldsName = (jsonConfig) => {\r\n let fieldsName = [];\r\n\r\n if (jsonConfig) {\r\n const config = JSON.parse(jsonConfig);\r\n\r\n config.columns.forEach((column) => {\r\n fieldsName.push({\r\n fieldName: column.fieldFullPath,\r\n });\r\n });\r\n }\r\n\r\n return fieldsName;\r\n};\r\n\r\n/* eslint-disable default-case, no-param-reassign */\r\nconst productReducer = (state = initialState, action) =>\r\n produce(state, (draft) => {\r\n switch (action.type) {\r\n case types.GET_PRODUCT_LIST:\r\n draft.loading = true;\r\n draft.error = false;\r\n draft.pageSize = action.pageSize;\r\n draft.pageIndex = action.pageIndex;\r\n draft.search = action.search;\r\n break;\r\n case types.GET_MEMBER_PRODUCT_LIST:\r\n draft.loading = true;\r\n draft.error = false;\r\n break;\r\n case types.GET_PRODUCT_LIST_SUCCESS:\r\n draft.loading = false;\r\n draft.products = action.products;\r\n draft.total = action.total;\r\n draft.reloadGrid = false;\r\n break;\r\n case types.GET_PRODUCT_LIST_ERROR:\r\n draft.loading = false;\r\n draft.total = 0;\r\n draft.products = [];\r\n draft.error = action.error;\r\n break;\r\n case types.PRODUCT_GRID_COLUMN_INFO:\r\n draft.loading = true;\r\n draft.error = false;\r\n draft.gridName = action.gridName;\r\n break;\r\n case types.PRODUCT_GRID_COLUMN_INFO_SUCCESS:\r\n draft.loading = false;\r\n draft.columns = action.columns;\r\n break;\r\n case types.PRODUCT_GRID_COLUMN_INFO_ERROR:\r\n draft.loading = false;\r\n draft.error = action.error;\r\n break;\r\n\r\n case types.TOGGLE_RELOAD_GRID_PRODUCT:\r\n draft.reloadGrid = action.payload;\r\n break;\r\n\r\n case types.SAVE_GRID_CONFIG:\r\n draft.gridConfig = {\r\n ...draft.gridConfig,\r\n ...action.payload,\r\n };\r\n break;\r\n\r\n case types.APPLY_GRID_CONFIG:\r\n draft.applyGridConfig = action.payload;\r\n break;\r\n\r\n case types.ADD_PRODUCT:\r\n draft.addProductStatus = true;\r\n draft.addProductError = false;\r\n break;\r\n case types.ADD_PRODUCT_SUCCESS:\r\n draft.addProductStatus = false;\r\n break;\r\n case types.ADD_PRODUCT_ERROR:\r\n draft.addProductStatus = false;\r\n draft.addProductError = true;\r\n break;\r\n\r\n case types.GET_PRODUCT_BRAND_ON_ADD:\r\n draft.brandImageOnAdd['loading'] = true;\r\n break;\r\n case types.GET_PRODUCT_BRAND_ON_ADD_SUCCESS:\r\n draft.brandImageOnAdd['loading'] = false;\r\n draft.brandImageOnAdd['data'] = action?.payload?.gridData || [];\r\n draft.brandImageOnAdd['pageIndex'] =\r\n action?.payload?.paging?.currentPageIndex ||\r\n initialState.brandImageOnAdd.pageIndex;\r\n draft.brandImageOnAdd['pageSize'] =\r\n action?.payload?.paging?.currentPageSize ||\r\n initialState.brandImageOnAdd.pageSize;\r\n draft.brandImageOnAdd['totalItems'] =\r\n action?.payload?.paging?.totalRecord ||\r\n initialState.brandImageOnAdd.totalItems;\r\n break;\r\n case types.GET_PRODUCT_BRAND_ON_ADD_ERROR:\r\n draft.brandImageOnAdd['loading'] = false;\r\n break;\r\n case types.TOGGLE_PRODUCT_NEW:\r\n draft.isDisplayProductNew = action.payload;\r\n break;\r\n\r\n case types.GET_GDSN_PARTY_LIST:\r\n draft.GDSNPartyList['loading'] = true;\r\n break;\r\n case types.GET_GDSN_PARTY_LIST_SUCCESS:\r\n draft.GDSNPartyList['loading'] = false;\r\n draft.GDSNPartyList['data'] = action?.columns || [];\r\n\r\n break;\r\n case types.GET_GDSN_PARTY_LIST_FAILURE:\r\n draft.GDSNPartyList['loading'] = false;\r\n break;\r\n }\r\n });\r\n\r\nexport default productReducer;\r\n","import { put, call, all } from 'redux-saga/effects';\r\nimport { takeLatest } from 'redux-saga/effects';\r\n\r\nimport * as types from './constants';\r\nimport * as actions from './actions';\r\nimport * as services from 'services/product';\r\nimport * as servicesGrid from 'services/grid';\r\nimport * as servicesMembers from 'services/members';\r\n\r\nimport { formatMDYWithParam } from 'utils/formatDate';\r\n\r\nimport { DEFAULT_SORT, DEFAULT_PRODUCT_COLUMNS } from 'static/Constants';\r\n\r\nimport customCellComponents from '../components/custom-cell-components/customCellComponents';\r\n\r\nexport function* getProductList(payload) {\r\n const {\r\n pageIndex,\r\n pageSize,\r\n search,\r\n primaryFieldsOnly,\r\n filters,\r\n advancedSearchContainer,\r\n searchCategory,\r\n isFavoriteRoute,\r\n packageLevels,\r\n fromDate,\r\n aplId,\r\n } = payload;\r\n\r\n try {\r\n const params = {\r\n filters: filters || [],\r\n pageIndex: pageIndex,\r\n pageSize: pageSize,\r\n search: { searchText: search, primaryFieldsOnly: primaryFieldsOnly },\r\n advancedSearchContainer: advancedSearchContainer ?? {},\r\n packageLevels: packageLevels,\r\n searchCategory: searchCategory,\r\n isFavoriteRoute: isFavoriteRoute,\r\n ...(search ? null : { sort: DEFAULT_SORT }),\r\n fromDate: fromDate ? fromDate : null,\r\n aplId,\r\n };\r\n\r\n const response = yield call(services.getProductListService, params);\r\n\r\n if (response?.isSuccess) {\r\n const products = response?.data?.gridData;\r\n const count = response?.data?.paging?.totalRecord;\r\n yield put(actions.getProductListSuccess(products, count));\r\n }\r\n } catch (error) {\r\n yield put(actions.getProductListError(error));\r\n }\r\n}\r\n\r\nexport function* getMemberProductListSaga(payload) {\r\n const {\r\n pageIndex,\r\n pageSize,\r\n search,\r\n filters,\r\n advancedSearchContainer,\r\n searchCategory,\r\n packageLevels,\r\n isFavoriteRoute,\r\n fromDate,\r\n memberId,\r\n aplId,\r\n } = payload;\r\n\r\n try {\r\n const params = {\r\n filters: filters || [],\r\n pageIndex: pageIndex,\r\n pageSize: pageSize,\r\n search: {\r\n searchText: search?.searchText,\r\n primaryFieldsOnly: search?.primaryFieldsOnly,\r\n },\r\n advancedSearchContainer: advancedSearchContainer,\r\n packageLevels: packageLevels,\r\n isFavoriteRoute: isFavoriteRoute,\r\n searchCategory: searchCategory,\r\n ...(search ? null : { sort: DEFAULT_SORT }),\r\n fromDate,\r\n memberId,\r\n aplId,\r\n };\r\n\r\n const response = yield call(services.getProductListService, params);\r\n\r\n if (response?.isSuccess) {\r\n const products = response?.data?.gridData;\r\n const count = response?.data?.paging?.totalRecord;\r\n yield put(actions.getProductListSuccess(products, count));\r\n }\r\n } catch (error) {\r\n yield put(actions.getProductListError(error));\r\n }\r\n}\r\n\r\nexport const formatProductDetailColumns = (response) => {\r\n let columns = [\r\n { field: '', checkboxSelection: true, filter: false, suppressMenu: true },\r\n // {\r\n // field: '',\r\n // cellRenderer: onFavoriteStarIconRender,\r\n // filter: false,\r\n // suppressMenu: true,\r\n // width: 50,\r\n // resizable: true,\r\n // },\r\n\r\n {\r\n field: 'productThumbnail',\r\n fieldNameCamelCase: 'productThumbnail',\r\n width: 70,\r\n cellRenderer: customCellComponents.renderThumbnail,\r\n filter: false,\r\n resizable: false,\r\n allowSort: false,\r\n headerClass: 'header-text-hide',\r\n },\r\n {\r\n field: 'stateIcons',\r\n fieldNameCamelCase: 'stateIcons',\r\n headerName: 'States',\r\n minWidth: 150,\r\n cellRenderer: customCellComponents.renderIcons,\r\n filter: false,\r\n resizable: true,\r\n allowSort: false,\r\n headerClass: 'header-text-hide',\r\n },\r\n ];\r\n\r\n if (response?.columns?.length > 0) {\r\n response.columns.forEach((val) => {\r\n if (!DEFAULT_PRODUCT_COLUMNS.includes(val.fieldNameCamelCase)) {\r\n return;\r\n }\r\n\r\n const { dataType, fieldNameCamelCase } = val || {};\r\n\r\n if (dataType === 'datetime') {\r\n val = {\r\n ...val,\r\n minWidth: 150,\r\n cellRenderer: formatMDYWithParam,\r\n resizable: true,\r\n };\r\n } else {\r\n val = {\r\n ...val,\r\n minWidth: 150,\r\n resizable: true,\r\n };\r\n }\r\n\r\n if (fieldNameCamelCase === 'productName') {\r\n columns.splice(3, 0, {\r\n ...val,\r\n linkTo: '/product/{id}',\r\n minWidth: 300,\r\n });\r\n\r\n return;\r\n }\r\n\r\n // if (fieldNameCamelCase === 'sharedSupplierNames') {\r\n // val = {\r\n // ...val,\r\n // displayName: 'Supplier Name',\r\n // };\r\n // }\r\n\r\n if (fieldNameCamelCase === 'rivirId') {\r\n val = {\r\n ...val,\r\n displayName: 'RIVIR ID',\r\n };\r\n }\r\n\r\n if (fieldNameCamelCase === 'primarySizeUOM') {\r\n val = {\r\n ...val,\r\n minWidth: 150,\r\n cellRenderer: customCellComponents.renderPrimarySizeUOM,\r\n resizable: true,\r\n };\r\n }\r\n\r\n columns.push(val);\r\n });\r\n }\r\n\r\n return columns;\r\n};\r\n\r\nexport function* gridColumnInfo(payload) {\r\n try {\r\n const { response } = yield call(getColumnsFilter, payload);\r\n\r\n const columns = formatProductDetailColumns(response);\r\n\r\n yield put(actions.gridColumnInfoSuccess(columns));\r\n } catch (error) {\r\n yield put(actions.gridColumnInfoError(error));\r\n }\r\n}\r\n\r\nexport function* getColumnsFilter(payload) {\r\n const response = yield call(servicesGrid.gridColumnInfo, payload.gridName);\r\n // const filter = yield call(getFilter, response);\r\n return { response };\r\n}\r\n\r\nexport function* getFilter(response) {\r\n const filter = yield all(\r\n response.columns &&\r\n response.columns.length > 0 &&\r\n response.columns.map((val) => {\r\n return call(servicesMembers.getMemberContactDistinct, {\r\n memberId: 11,\r\n fieldName: val.fieldName,\r\n });\r\n })\r\n );\r\n return filter;\r\n}\r\n\r\nexport function* addProductSage(action) {\r\n try {\r\n const response = yield call(services.addProduct, action.params);\r\n\r\n if (response?.isSuccess) {\r\n yield put(actions.addProductSuccess(response?.data));\r\n } else {\r\n yield put(actions.addProductError(response?.message));\r\n }\r\n } catch (error) {\r\n yield put(actions.addProductError(error));\r\n }\r\n}\r\n\r\n// Get brand image on add product\r\nexport function* getProductBrandImageOnAddSaga(action) {\r\n try {\r\n const response = yield call(services.getProductBrandOnAdd, action.payload);\r\n const { isSuccess, data, message } = response;\r\n if (isSuccess) {\r\n yield put(actions.getProductBrandImageOnAddSuccess(data));\r\n } else {\r\n yield put(actions.getProductBrandImageOnAddError(message));\r\n }\r\n } catch (error) {\r\n yield put(actions.getProductBrandImageOnAddError('error'));\r\n }\r\n}\r\n\r\n// Get GDSN Party List\r\nexport function* getGDSNPartyListSaga(payload) {\r\n try {\r\n const { response } = yield call(getColumnsFilter, payload);\r\n let columns = [\r\n {\r\n filter: false,\r\n suppressMenu: true,\r\n resizable: true,\r\n checkboxSelection: true,\r\n },\r\n ];\r\n\r\n if (response?.columns?.length > 0) {\r\n let hiddenCol = ['partyCountryCode'];\r\n response.columns.forEach((val) => {\r\n if (hiddenCol.indexOf(val.fieldNameCamelCase) === -1) {\r\n // eslint-disable-next-line no-lone-blocks\r\n\r\n if (val.fieldNameCamelCase === 'PartyGln') {\r\n val = {\r\n ...val,\r\n width: 150,\r\n resizable: true,\r\n };\r\n } else {\r\n val = { ...val, width: 150, resizable: true };\r\n }\r\n if (val.fieldNameCamelCase === 'partyName') {\r\n val = {\r\n ...val,\r\n width: 150,\r\n resizable: true,\r\n };\r\n }\r\n if (val.fieldNameCamelCase === 'partyCountryName') {\r\n val = {\r\n ...val,\r\n minWidth: 150,\r\n flex: 1,\r\n resizable: true,\r\n };\r\n }\r\n\r\n columns.push(val);\r\n }\r\n });\r\n }\r\n\r\n yield put(actions.getGDSNPartyListSuccess(columns));\r\n } catch (error) {\r\n yield put(actions.getGDSNPartyListFailure(error));\r\n }\r\n}\r\n\r\n/**\r\n * Root saga manages watcher lifecycle\r\n */\r\nexport default function* watchProduct() {\r\n yield takeLatest(types.GET_PRODUCT_LIST, getProductList);\r\n yield takeLatest(types.GET_MEMBER_PRODUCT_LIST, getMemberProductListSaga);\r\n yield takeLatest(types.PRODUCT_GRID_COLUMN_INFO, gridColumnInfo);\r\n yield takeLatest(types.ADD_PRODUCT, addProductSage);\r\n yield takeLatest(\r\n types.GET_PRODUCT_BRAND_ON_ADD,\r\n getProductBrandImageOnAddSaga\r\n );\r\n yield takeLatest(types.GET_GDSN_PARTY_LIST, getGDSNPartyListSaga);\r\n}\r\n","import { createSelector } from 'reselect';\r\nimport { initialState } from './reducer';\r\n\r\nconst selectProduct = (state) => state.product || initialState;\r\n\r\nconst makeSelectLoading = () =>\r\n createSelector(selectProduct, (productState) => productState.loading);\r\nconst makeSelectProducts = () =>\r\n createSelector(selectProduct, (productState) => productState.products);\r\nconst makeSelectTotal = () =>\r\n createSelector(selectProduct, (productState) => productState.total);\r\nconst makeSelectPageSize = () =>\r\n createSelector(selectProduct, (productState) => productState.pageSize);\r\nconst makeSelectPageIndex = () =>\r\n createSelector(selectProduct, (productState) => productState.pageIndex);\r\nconst makeSelectSearch = () =>\r\n createSelector(selectProduct, (productState) => productState.search);\r\nconst makeSelectColumns = () =>\r\n createSelector(selectProduct, (productState) => productState.columns);\r\nconst makeSelectReloadGrid = () =>\r\n createSelector(selectProduct, (productState) => productState.reloadGrid);\r\n\r\nconst makeSelectGridConfig = () =>\r\n createSelector(selectProduct, (productState) => productState.gridConfig);\r\nconst makeSelectApplyGridConfig = () =>\r\n createSelector(selectProduct, (productState) => productState.applyGridConfig);\r\n\r\nconst makeSelectAddProductStatus = () =>\r\n createSelector(\r\n selectProduct,\r\n (productState) => productState.addProductStatus\r\n );\r\nconst makeSelectAddProductError = () =>\r\n createSelector(selectProduct, (productState) => productState.addProductError);\r\nconst makeSelectBrandImageOnAdd = () =>\r\n createSelector(selectProduct, (productState) => productState.brandImageOnAdd);\r\nconst makeSelectIsDisplayProductNew = () =>\r\n createSelector(\r\n selectProduct,\r\n (productState) => productState.isDisplayProductNew\r\n );\r\n\r\nconst makeSelectGDSNPartyList = () =>\r\n createSelector(selectProduct, (productState) => productState.GDSNPartyList);\r\n\r\nexport {\r\n selectProduct,\r\n makeSelectLoading,\r\n makeSelectProducts,\r\n makeSelectTotal,\r\n makeSelectPageSize,\r\n makeSelectPageIndex,\r\n makeSelectSearch,\r\n makeSelectColumns,\r\n makeSelectReloadGrid,\r\n makeSelectAddProductStatus,\r\n makeSelectAddProductError,\r\n makeSelectBrandImageOnAdd,\r\n makeSelectIsDisplayProductNew,\r\n makeSelectGDSNPartyList,\r\n makeSelectGridConfig,\r\n makeSelectApplyGridConfig,\r\n};\r\n","import { useEffect } from 'react';\r\n\r\nimport { useDispatch } from 'react-redux';\r\n\r\nimport { getDefaultGridConfig } from 'services/grid';\r\n\r\nimport { useAsync } from 'hooks';\r\n\r\nimport { saveGridConfig } from 'pages/branded-products/controllers/actions';\r\n\r\nimport { useApplyPreviewGridConfig } from 'pages/home/ribbon/components/sections/customize-grid';\r\n\r\nconst useGetDefaultGridConfig = ({ isEnabled }) => {\r\n const { data, run } = useAsync();\r\n const dispatch = useDispatch();\r\n\r\n const { isPreviewGridConfigAcive, applyGridConfig } =\r\n useApplyPreviewGridConfig();\r\n\r\n useEffect(() => {\r\n if (isEnabled) {\r\n run(getDefaultGridConfig('product-detail-grid'));\r\n }\r\n }, [isEnabled, run]);\r\n\r\n useEffect(() => {\r\n if (!isEnabled) return;\r\n\r\n if (!isPreviewGridConfigAcive) {\r\n if (data) {\r\n dispatch(\r\n saveGridConfig({\r\n jsonConfig: data.jsonConfig,\r\n selectedColumns: data.selectedColumns,\r\n isHaveDefaultConfig: true,\r\n })\r\n );\r\n }\r\n } else {\r\n dispatch(\r\n saveGridConfig({\r\n jsonConfig: applyGridConfig?.jsonConfig,\r\n selectedColumns: applyGridConfig?.selectedColumns,\r\n })\r\n );\r\n }\r\n }, [data, dispatch, isEnabled, applyGridConfig, isPreviewGridConfigAcive]);\r\n};\r\n\r\nexport default useGetDefaultGridConfig;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { forwardTo } from 'utils/common/route';\r\nimport { ThumbnailItem } from 'common/components';\r\n\r\nimport * as getLink from 'utils/common/linkBuilder';\r\n\r\nimport AssetReport from 'assets/reporting/AssetReport.png';\r\nimport ProductReport from 'assets/reporting/ProductReport.png';\r\nimport MemberReport from 'assets/reporting/MemberReport.png';\r\n\r\nimport FolderDownloadScheduledIcon from 'pages/folders/components/icons/FolderDownloadScheduledIcon';\r\n\r\nconst ReportingThumbnail = (props) => {\r\n const {\r\n dataDetail,\r\n selected,\r\n onClickItemGrid,\r\n onClickCheckboxItem,\r\n pathname,\r\n } = props;\r\n\r\n const onDoubleClick = (item) => {\r\n const { id } = item;\r\n forwardTo(`${pathname}/${id}`);\r\n };\r\n\r\n const image =\r\n (dataDetail?.advType === 'DigitalMedia' && AssetReport) ||\r\n (dataDetail?.advType === 'Member' && MemberReport) ||\r\n (dataDetail?.advType === 'ProductItem' && ProductReport);\r\n\r\n const aLink = getLink.reportingLink(dataDetail?.id, dataDetail?.name);\r\n\r\n const status = dataDetail?.isBasicMode ? 'Basic Report' : null;\r\n\r\n const DownloadSchedule = FolderDownloadScheduledIcon;\r\n return (\r\n ]}\r\n />\r\n );\r\n};\r\n\r\nReportingThumbnail.propTypes = {\r\n dataDetail: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default React.memo(ReportingThumbnail);\r\n","import React from 'react';\r\nimport { Typography, Space, Row } from 'antd';\r\nimport { get } from 'lodash';\r\nimport PropTypes from 'prop-types';\r\nimport { FormattedMessage } from 'react-intl';\r\nimport EntityStatusTag from 'common/components/tag/entity-status-tag/EntityStatusTag';\r\nimport Messages from 'i18n/messages/folder';\r\nimport { formatSizeUnits } from 'utils/formatSizeUnits';\r\n// import { aDetailsLink } from 'utils/common/linkBuilder';\r\n\r\nconst { Paragraph, Title, Text } = Typography;\r\n\r\nconst ReportingTileBody = (props) => {\r\n const { dataDetail } = props;\r\n\r\n const name = get(dataDetail, 'name', '');\r\n const ownerName = get(dataDetail, 'ownerFullName', '');\r\n\r\n const infoText = [\r\n {\r\n field: 'name',\r\n value: name,\r\n },\r\n {\r\n field: 'ownerName',\r\n value: ownerName,\r\n },\r\n ];\r\n // const detailLink = aDetailsLink(\r\n // 'reporting',\r\n // dataDetail?.id,\r\n // dataDetail?.name\r\n // );\r\n const renderReportingBodyInfo = (infoText) => {\r\n return infoText.map(({ field, value }, index) => {\r\n if (field === 'name') {\r\n return (\r\n \r\n {dataDetail?.name}\r\n \r\n );\r\n } else if (field === 'folderSize') {\r\n return (\r\n \r\n {formatSizeUnits(value)}\r\n \r\n );\r\n } else if (field === 'productCount' || field === 'assetCount') {\r\n let text;\r\n if (field === 'productCount') {\r\n text =\r\n value > 0 ? (\r\n \r\n ) : (\r\n \r\n );\r\n } else {\r\n text =\r\n value > 0 ? (\r\n \r\n ) : (\r\n \r\n );\r\n }\r\n return value > 0 ? (\r\n \r\n {value} {text}\r\n \r\n ) : null;\r\n } else {\r\n return (\r\n value && (\r\n \r\n {value}\r\n \r\n )\r\n );\r\n }\r\n });\r\n };\r\n\r\n return (\r\n
\r\n \r\n \r\n {renderReportingBodyInfo(infoText)}\r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nReportingTileBody.propTypes = {\r\n dataDetail: PropTypes.object,\r\n};\r\n\r\nexport default ReportingTileBody;\r\n","import React from 'react';\r\nimport { Row, Col } from 'antd';\r\n\r\nimport { formatMDY } from 'utils/formatDate';\r\nimport { get } from 'lodash';\r\nimport PropTypes from 'prop-types';\r\nimport { FormattedMessage } from 'react-intl';\r\nimport Messages from 'i18n/messages/folder';\r\n\r\nconst ReportingTileFooter = (props) => {\r\n const { dataDetail } = props;\r\n\r\n const dateCreated = get(dataDetail, 'created', '');\r\n const lastUpdated = get(dataDetail, 'lastModified', '');\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {dateCreated && formatMDY(dateCreated)}\r\n \r\n \r\n \r\n \r\n \r\n {lastUpdated && formatMDY(lastUpdated)}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nReportingTileFooter.propTypes = {\r\n size: PropTypes.string,\r\n lastUpdate: PropTypes.string,\r\n};\r\n\r\nexport default ReportingTileFooter;\r\n","import React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { Row, Avatar } from 'antd';\r\nimport PropTypes from 'prop-types';\r\nimport userSelectors from '@redux/user/selectors';\r\n\r\nimport AssetReport from 'assets/reporting/AssetReport.png';\r\nimport ProductReport from 'assets/reporting/ProductReport.png';\r\nimport MemberReport from 'assets/reporting/MemberReport.png';\r\n\r\nconst ReportingTileHeader = (props) => {\r\n const { dataDetail } = props;\r\n const userId = useSelector(userSelectors.makeSelectUserId());\r\n const image =\r\n (dataDetail?.advType === 'DigitalMedia' && AssetReport) ||\r\n (dataDetail?.advType === 'Member' && MemberReport) ||\r\n (dataDetail?.advType === 'ProductItem' && ProductReport);\r\n\r\n return (\r\n \r\n
\r\n\r\n
\r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nReportingTileHeader.propTypes = {\r\n dataDetail: PropTypes.object,\r\n};\r\n\r\nexport default ReportingTileHeader;\r\n","import React from 'react';\r\nimport { Tooltip } from 'antd';\r\nimport {\r\n ReportingTileBody,\r\n ReportingTileFooter,\r\n ReportingTileHeader,\r\n} from '../index';\r\nimport { get } from 'lodash';\r\nimport useDoubleClick from 'hooks/useDoubleClick';\r\nimport './ReportingTile.less';\r\n\r\nconst ReportingTile = (props) => {\r\n const { dataDetail, disableEvent } = props;\r\n const { onClickItemGrid, onDoubleClick } = props.clickEvents;\r\n const name = get(dataDetail, 'name', '');\r\n\r\n const divRef = React.useRef();\r\n useDoubleClick({\r\n onSingleClick: (e) => {\r\n if (onClickItemGrid) onClickItemGrid(dataDetail, e);\r\n },\r\n onDoubleClick: (e) => {\r\n if (onDoubleClick) onDoubleClick(dataDetail);\r\n },\r\n ref: divRef,\r\n latency: 250,\r\n });\r\n\r\n return (\r\n \r\n
\r\n {/*Placeholder for click events*/}\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default ReportingTile;\r\n","import React, { useEffect, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Row, Col, Image, Typography } from 'antd';\r\n\r\nimport AssetReport from 'assets/reporting/AssetReport.png';\r\nimport MemberReport from 'assets/reporting/MemberReport.png';\r\nimport ProductReport from 'assets/reporting/ProductReport.png';\r\n\r\nimport { InfoWithLabel } from 'common/components';\r\nimport { formatMDY } from 'utils/formatDate';\r\n\r\nimport AdvancedSearchTitle from 'common/components/advanced-search/AdvancedSearchTitle';\r\nimport { DragDropContext } from 'react-beautiful-dnd';\r\n\r\nimport PropertyAdvancedFilter from 'common/components/grid-view/components/content-pane/advancedFilter/PropertyAdvancedFilter';\r\nimport QueryConditions from 'common/components/grid-view/components/content-pane/advancedFilter/QueryConditions';\r\nimport DataColumns from 'pages/reporting/components/DataColumns';\r\nimport {\r\n changeValueDataType,\r\n mappingPrimaryToFieldsName,\r\n} from 'pages/reporting/utils';\r\nimport { useAdvanceFilter } from 'common/components/nested-advance-Search/hook/hook';\r\nimport { isJson } from 'utils/string';\r\n\r\nimport './ReportingPanel.less';\r\n\r\nconst infoColProps = {\r\n infoColProps: {\r\n flex: 'auto',\r\n },\r\n labelColProps: {\r\n flex: '130px',\r\n },\r\n boldInfo: true,\r\n labelAlign: 'right',\r\n};\r\n\r\nconst ReportingPanel = ({ dataDetail }) => {\r\n const image =\r\n (dataDetail?.advType === 'DigitalMedia' && AssetReport) ||\r\n (dataDetail?.advType === 'Member' && MemberReport) ||\r\n (dataDetail?.advType === 'ProductItem' && ProductReport);\r\n\r\n const [propertiesData, setPropertiesData] = useState();\r\n const { fetchEntityAttribute } = useAdvanceFilter({});\r\n\r\n const decodeJson = isJson(dataDetail?.query)\r\n ? JSON.parse(dataDetail?.query)\r\n : {};\r\n\r\n const query = mappingPrimaryToFieldsName(decodeJson);\r\n\r\n const entityType = changeValueDataType(dataDetail?.advType);\r\n\r\n const handleGetEntity = async () => {\r\n try {\r\n const data = await fetchEntityAttribute(entityType);\r\n if (data) {\r\n setPropertiesData(data);\r\n }\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n if (!propertiesData) handleGetEntity();\r\n }, [entityType, propertiesData]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {/* */}\r\n {dataDetail?.name}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nReportingPanel.propTypes = {\r\n dataDetail: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default ReportingPanel;\r\n","import { useQuery, useQueryClient } from '@tanstack/react-query';\r\nimport { getLinkIframeCard } from 'services/payment';\r\nimport { CustomNotification } from 'common/components';\r\nimport { useCheckCreditCardPermission } from 'hooks/useCheckCreditCardPermission';\r\n\r\nconst keys = {\r\n addCreditCardIframeUrl: ['payment', 'add-card'],\r\n getBillingProperties: (memberId) => [\r\n 'payment',\r\n 'get-member-billing-properties',\r\n { params: { memberId: parseInt(memberId) } },\r\n ],\r\n};\r\n\r\n/**\r\n *? GET\r\n *? /api/payment/add-card\r\n */\r\nconst useQueryAddCreditCardIframeUrl = ({ memberId, ...options }) => {\r\n return useQuery({\r\n queryKey: keys.addCreditCardIframeUrl,\r\n queryFn: async () => {\r\n const res = await getLinkIframeCard({\r\n memberId,\r\n paymentEndpointType: null,\r\n });\r\n\r\n const { isSuccess, message, data } = res || {};\r\n\r\n if (!isSuccess) {\r\n CustomNotification.error(message || 'Server Error');\r\n }\r\n\r\n return data;\r\n },\r\n ...options,\r\n });\r\n};\r\n\r\n/**\r\n *? GET\r\n *? /api/payment/get-member-billing-properties\r\n */\r\nconst useQueryBillingProperties = ({ memberId, ...options }) => {\r\n const queryClient = useQueryClient();\r\n\r\n const { canAccessBilling } = useCheckCreditCardPermission();\r\n\r\n const query = useQuery({\r\n queryKey: keys.getBillingProperties(memberId),\r\n enabled: Boolean(memberId) && canAccessBilling,\r\n retry: 0,\r\n ...options,\r\n });\r\n\r\n const invalidateBillingProperties = () => {\r\n queryClient.invalidateQueries({\r\n queryKey: keys.getBillingProperties(memberId),\r\n });\r\n };\r\n\r\n return {\r\n billingProperties: query?.data ?? {},\r\n invalidateBillingProperties,\r\n ...query,\r\n };\r\n};\r\n\r\nexport { useQueryAddCreditCardIframeUrl, useQueryBillingProperties };\r\n","import * as types from './constants';\r\n\r\nexport const getCommunicationTemplates = (pageSize, pageNumber, search) => {\r\n return {\r\n type: types.GET_COMMUNICATION_TEMPLATES,\r\n pageSize: pageSize,\r\n pageIndex: pageNumber,\r\n 'Search.SearchText': search,\r\n };\r\n};\r\n\r\nexport const getCommunicationTemplatesSuccess = (templates, paging) => {\r\n return {\r\n type: types.GET_COMMUNICATION_TEMPLATES_SUCCESS,\r\n templates,\r\n paging,\r\n };\r\n};\r\n\r\nexport const getCommunicationTemplatesError = (error) => {\r\n return {\r\n type: types.GET_COMMUNICATION_TEMPLATES_ERROR,\r\n error,\r\n };\r\n};\r\n\r\nexport const getCommunicationTemplatesGridColumns = (gridName) => ({\r\n type: types.GET_COMMUNICATION_TEMPLATES_COLUMNS,\r\n gridName,\r\n});\r\n\r\nexport const getCommunicationTemplatesGridColumnsSuccess = (columns) => ({\r\n type: types.GET_COMMUNICATION_TEMPLATES_COLUMNS_SUCCESS,\r\n columns,\r\n});\r\n\r\nexport const getCommunicationTemplatesGridColumnsError = (error) => ({\r\n type: types.GET_COMMUNICATION_TEMPLATES_COLUMNS_ERROR,\r\n error,\r\n});\r\n\r\nexport const enableCreateMode = () => {\r\n return {\r\n type: types.ENABLE_CREATE_TEMPLATE,\r\n };\r\n};\r\n\r\nexport const enableEditMode = () => {\r\n return {\r\n type: types.ENABLE_EDIT_TEMPLATE,\r\n };\r\n};\r\n\r\nexport const resetTemplate = () => {\r\n return {\r\n type: types.RESET_TEMPLATE,\r\n };\r\n};\r\n\r\nexport const saveIdTemplate = (id) => {\r\n return {\r\n type: types.SAVE_ID_TEMPLATE,\r\n id,\r\n };\r\n};\r\n\r\nexport const enableSaveTemplate = () => {\r\n return {\r\n type: types.ENABLE_SAVE_TEMPLATE,\r\n };\r\n};\r\n\r\nexport const unableSaveTemplate = () => {\r\n return {\r\n type: types.UNABLE_SAVE_TEMPLATE,\r\n };\r\n};\r\n\r\nexport const disableUploadMedia = (status) => {\r\n return {\r\n type: types.DISABLE_UPLOAD_MEDIA,\r\n status,\r\n };\r\n};\r\n","export const GET_COMMUNICATION_TEMPLATES = 'GET_COMMUNICATION_TEMPLATES';\r\nexport const GET_COMMUNICATION_TEMPLATES_SUCCESS =\r\n 'GET_COMMUNICATION_TEMPLATES_SUCCESS';\r\nexport const GET_COMMUNICATION_TEMPLATES_ERROR =\r\n 'GET_COMMUNICATION_TEMPLATES_ERROR';\r\n\r\nexport const GET_COMMUNICATION_TEMPLATES_COLUMNS =\r\n 'GET_COMMUNICATION_TEMPLATES_COLUMNS';\r\nexport const GET_COMMUNICATION_TEMPLATES_COLUMNS_SUCCESS =\r\n 'GET_COMMUNICATION_TEMPLATES_COLUMNS_SUCCESS';\r\nexport const GET_COMMUNICATION_TEMPLATES_COLUMNS_ERROR =\r\n 'GET_COMMUNICATION_TEMPLATES_COLUMNS_ERROR';\r\n\r\nexport const ENABLE_CREATE_TEMPLATE = 'ENABLE_CREATE_TEMPLATE';\r\nexport const ENABLE_EDIT_TEMPLATE = 'ENABLE_EDIT_TEMPLATE';\r\nexport const RESET_TEMPLATE = 'RESET_TEMPLATE';\r\nexport const SAVE_ID_TEMPLATE = 'SAVE_ID_TEMPLATE';\r\nexport const ENABLE_SAVE_TEMPLATE = 'ENABLE_SAVE_TEMPLATE';\r\nexport const UNABLE_SAVE_TEMPLATE = 'UNABLE_SAVE_TEMPLATE';\r\nexport const DISABLE_UPLOAD_MEDIA = 'DISABLE_UPLOAD_MEDIA';\r\n","import produce from 'immer';\r\nimport * as types from './constants';\r\n\r\nexport const initialState = {\r\n loading: false,\r\n paging: {\r\n pageSize: 20,\r\n pageNumber: 1,\r\n total: 0,\r\n },\r\n columns: [],\r\n communications: [],\r\n mode: {\r\n isCreate: false,\r\n isEdit: false,\r\n },\r\n idTemplate: null,\r\n isToggleSave: false,\r\n disableUploadMedia: false,\r\n error: null,\r\n};\r\n\r\nconst communicationsReducer = (state = initialState, action) =>\r\n produce(state, (draft) => {\r\n switch (action.type) {\r\n case types.GET_COMMUNICATION_TEMPLATES_COLUMNS:\r\n draft.loading = true;\r\n break;\r\n\r\n case types.GET_COMMUNICATION_TEMPLATES_COLUMNS_SUCCESS:\r\n draft.loading = false;\r\n draft.columns = action.columns;\r\n break;\r\n\r\n case types.GET_COMMUNICATION_TEMPLATES_COLUMNS_ERROR:\r\n draft.loading = false;\r\n draft.columns = [];\r\n draft.error = action.error;\r\n break;\r\n\r\n case types.GET_COMMUNICATION_TEMPLATES:\r\n draft.loading = true;\r\n draft.error = false;\r\n break;\r\n\r\n case types.GET_COMMUNICATION_TEMPLATES_SUCCESS:\r\n draft.loading = false;\r\n draft.communications = action.communications;\r\n draft['paging'].pageSize = action.paging.currentPageSize;\r\n draft['paging'].pageNumber = action.paging.currentPageIndex;\r\n draft['paging'].total = action.paging.totalRecord;\r\n break;\r\n\r\n case types.GET_COMMUNICATION_TEMPLATES_ERROR:\r\n draft.loading = false;\r\n draft['paging'].total = 0;\r\n draft.communications = [];\r\n draft.error = action.error;\r\n break;\r\n\r\n case types.ENABLE_CREATE_TEMPLATE:\r\n draft['mode'].isCreate = true;\r\n draft['mode'].isEdit = false;\r\n break;\r\n\r\n case types.ENABLE_EDIT_TEMPLATE:\r\n draft['mode'].isEdit = true;\r\n draft['mode'].isCreate = false;\r\n break;\r\n\r\n case types.RESET_TEMPLATE:\r\n draft['mode'].isEdit = false;\r\n draft['mode'].isCreate = false;\r\n draft.idTemplate = null;\r\n draft.isToggleSave = false;\r\n break;\r\n\r\n case types.SAVE_ID_TEMPLATE:\r\n draft.idTemplate = action.id;\r\n break;\r\n\r\n case types.ENABLE_SAVE_TEMPLATE:\r\n draft.isToggleSave = true;\r\n break;\r\n\r\n case types.UNABLE_SAVE_TEMPLATE:\r\n draft.isToggleSave = false;\r\n break;\r\n\r\n case types.DISABLE_UPLOAD_MEDIA:\r\n draft.disableUploadMedia = action.status;\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n });\r\n\r\nexport default communicationsReducer;\r\n","import { createSelector } from 'reselect';\r\nimport { initialState } from './reducer';\r\n\r\nconst selectCommunications = (state) => state.communications || initialState;\r\n\r\nconst selectLoading = () =>\r\n createSelector(\r\n selectCommunications,\r\n (communicationsState) => communicationsState.loading\r\n );\r\n\r\nconst selectColumns = () =>\r\n createSelector(\r\n selectCommunications,\r\n (communicationsState) => communicationsState.columns\r\n );\r\n\r\nconst selectPaging = () =>\r\n createSelector(\r\n selectCommunications,\r\n (communicationsState) => communicationsState.paging\r\n );\r\n\r\nconst selectCommunicationList = () =>\r\n createSelector(\r\n selectCommunications,\r\n (communicationsState) => communicationsState.communications\r\n );\r\n\r\nconst selectCommunicationMode = () =>\r\n createSelector(\r\n selectCommunications,\r\n (communicationsState) => communicationsState.mode\r\n );\r\n\r\nconst selectToggleSaveTemplate = () =>\r\n createSelector(\r\n selectCommunications,\r\n (communicationsState) => communicationsState.isToggleSave\r\n );\r\n\r\nconst selectIdTemplate = () =>\r\n createSelector(\r\n selectCommunications,\r\n (communicationsState) => communicationsState.idTemplate\r\n );\r\n\r\nconst selectDisableUploadMedia = () =>\r\n createSelector(\r\n selectCommunications,\r\n (communicationsState) => communicationsState.disableUploadMedia\r\n );\r\n\r\nexport {\r\n selectLoading,\r\n selectColumns,\r\n selectPaging,\r\n selectCommunicationList,\r\n selectCommunicationMode,\r\n selectToggleSaveTemplate,\r\n selectIdTemplate,\r\n selectDisableUploadMedia,\r\n};\r\n","import React, { useState } from 'react';\r\n\r\nimport { Typography, Image, Divider, Alert } from 'antd';\r\nimport { EditOutlined, DeleteOutlined } from '@ant-design/icons';\r\n\r\nimport {\r\n FormAddButton,\r\n FormDeleteButton,\r\n FormEditButton,\r\n StyledModal,\r\n WithLoading,\r\n EditButtonsSection,\r\n} from 'common/components';\r\nimport Marquee from 'react-fast-marquee';\r\n\r\nimport {\r\n useListenerMessageSaveCard,\r\n useVisibleModal,\r\n useMemberPaymentActions,\r\n} from './hooks';\r\n\r\nimport { useCreditCardEula } from 'hooks/useCreditCardEula';\r\nimport useDocumentAttachEvent from 'hooks/documentAttachEventHook';\r\nimport { useCheckCreditCardPermission } from 'hooks/useCheckCreditCardPermission';\r\n\r\nimport { EVENT } from 'static/Constants';\r\n\r\nimport CreditCardImage from 'assets/credit-card.png';\r\nimport authorizeNet from 'assets/credit-card/anetlogo.png';\r\nimport { useGetSavedMemberCard } from './hooks';\r\nimport { useCheckInvoicedPayment } from 'hooks/home/useCreditCardAlert';\r\n\r\nconst MemberCardInformation = () => {\r\n const [visible, { onModal, offModal }] = useVisibleModal();\r\n const [isEdit, setEdit] = useState(false);\r\n\r\n const [modeAction, setModeAction] = useState(null);\r\n\r\n const { savedMemberCard, isFetchingSavedCard, fetchSavedMemberCard } =\r\n useGetSavedMemberCard({\r\n modeAction,\r\n });\r\n\r\n useListenerMessageSaveCard({\r\n offModal,\r\n fetchSavedMemberCard,\r\n modeAction,\r\n });\r\n\r\n const { iframeUrl, loadingIframe, handleSaveCard, handleRemoveSavedCard } =\r\n useMemberPaymentActions({\r\n memberPaymentProfileId: savedMemberCard?.memberPaymentProfileId,\r\n fetchSavedMemberCard,\r\n offModal,\r\n });\r\n\r\n const { showCardEulaModal } = useCreditCardEula({\r\n context: 'billing',\r\n });\r\n\r\n const { canActionCard } = useCheckCreditCardPermission();\r\n\r\n const { isInvoicedTerm } = useCheckInvoicedPayment();\r\n\r\n const hasSavedMemberCard = Boolean(savedMemberCard?.memberPaymentProfileId);\r\n\r\n const onEditCard = () => {\r\n showCardEulaModal({ when: 'edit-card' });\r\n };\r\n\r\n const onAddCard = () => {\r\n showCardEulaModal({ when: 'add-card' });\r\n };\r\n\r\n const startEditCard = () => {\r\n setModeAction('edit');\r\n onModal();\r\n handleSaveCard({ modeAction: 'edit' });\r\n };\r\n\r\n const startAddCard = () => {\r\n setModeAction('add');\r\n onModal();\r\n handleSaveCard({ modeAction: 'add' });\r\n };\r\n\r\n const onAcceptCreditCardEula = (e) => {\r\n const when = e?.detail?.when;\r\n\r\n const actionCollection = {\r\n 'add-card': startAddCard,\r\n 'edit-card': startEditCard,\r\n };\r\n\r\n actionCollection[when]?.();\r\n };\r\n\r\n useDocumentAttachEvent({\r\n name: EVENT.ACCEPT_CARD_EULA,\r\n handler: onAcceptCreditCardEula,\r\n dependencies: [savedMemberCard?.memberPaymentProfileId],\r\n });\r\n\r\n return (\r\n <>\r\n
\r\n \r\n
\r\n \r\n Credit Card Information\r\n \r\n {canActionCard && (\r\n setEdit(true)}\r\n onCancel={() => {\r\n setEdit(false);\r\n }}\r\n buttons={['cancel', canActionCard ? 'edit' : '']}\r\n />\r\n )}\r\n
\r\n
\r\n \r\n <>\r\n {hasSavedMemberCard ? (\r\n <>\r\n \r\n {savedMemberCard?.nameAlias ?? 'xxxx card'}\r\n \r\n\r\n {isEdit ? (\r\n
\r\n }\r\n onClick={onEditCard}\r\n size='small'\r\n text={null}\r\n />\r\n {/* }\r\n size='small'\r\n text={null}\r\n onClick={handleRemoveSavedCard}\r\n /> */}\r\n
\r\n ) : null}\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n
\r\n
\r\n
\r\n\r\n {visible && (\r\n {\r\n offModal();\r\n setModeAction(null);\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport const CreditCardIframeModal = (props) => {\r\n const { children, ...rest } = props;\r\n\r\n return (\r\n }\r\n maskClosable={false}\r\n {...rest}\r\n >\r\n \r\n {children}\r\n \r\n );\r\n};\r\n\r\nexport const CreditCardIframe = ({ iframeUrl, ...rest }) => {\r\n return (\r\n
\r\n \r\n
\r\n );\r\n};\r\n\r\nconst EmptyCardRender = ({ isEdit, onAddCard, isInvoicedTerm }) => {\r\n if (isEdit) {\r\n return ;\r\n }\r\n\r\n return (\r\n
\r\n \r\n
\r\n );\r\n};\r\n\r\nexport const AlertEmptyCard = ({ isInvoicedTerm = false }) => {\r\n let message = isInvoicedTerm\r\n ? 'With an invoiced term, no credit card is needed.'\r\n : 'To continue accessing all our service features, please add a credit card to your account.';\r\n\r\n return (\r\n \r\n
{message}
\r\n \r\n }\r\n />\r\n );\r\n};\r\n\r\nconst CreditCardHeader = () => {\r\n return (\r\n
\r\n \r\n
\r\n );\r\n};\r\n\r\nconst CreditCardFooter = () => {\r\n return (\r\n <>\r\n
\r\n
\r\n \r\n RIVIR has partnered with\r\n \r\n \r\n \r\n to store your payment methods securely\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default MemberCardInformation;\r\n","import { useState, useMemo, useEffect } from 'react';\r\n\r\nimport isEmpty from 'lodash/isEmpty';\r\n\r\nimport { CustomNotification, dialogFunction } from 'common/components';\r\n\r\nimport { useGetMemberId } from 'hooks/useGetMemberId';\r\nimport { useUserInfo } from 'hooks/userInfoHook';\r\nimport { useCallbackRef, useCheckPermissions } from 'hooks';\r\nimport {\r\n useCheckInvoicedPayment,\r\n useShowWarningWhenNoCreditCard,\r\n} from 'hooks/home/useCreditCardAlert';\r\n\r\nimport selectorUser from '@redux/user/selectors';\r\n\r\nimport * as paymentServices from 'services/payment';\r\n\r\nimport { parseJSON } from 'utils';\r\nimport { sleep } from 'utils/delay';\r\nimport {\r\n useQuerySavedMemberCard,\r\n useRefetchAllMemberBillingStatement,\r\n} from './queries';\r\nimport { useSelector } from 'react-redux';\r\nimport {\r\n EDIT_MEMBER_PERMISSION,\r\n PERMISSION_EDIT_COMPANY_PROFILE,\r\n} from 'static/Permission';\r\n\r\nexport const useListenerMessageSaveCard = ({\r\n offModal,\r\n fetchSavedMemberCard,\r\n modeAction,\r\n}) => {\r\n const { memberId } = useGetMemberId();\r\n\r\n const { updateUserInfo } = useUserInfo();\r\n\r\n const { closeCreditCardMissingCard } = useShowWarningWhenNoCreditCard();\r\n const refetchAllMemberBillingStatement =\r\n useRefetchAllMemberBillingStatement();\r\n\r\n const handleListenerMessage = useCallbackRef(async (eventMessage) => {\r\n const { isSuccess } = parseJSON(eventMessage.data);\r\n\r\n if (isSuccess) {\r\n try {\r\n const params = {\r\n memberId,\r\n paymentEndpointType: null,\r\n };\r\n\r\n const responseSync = await paymentServices.syncSavedMemberCard(params);\r\n\r\n if (responseSync?.isSuccess) {\r\n const fetchCardResponse = await fetchSavedMemberCard();\r\n const { memberSaveCards } = fetchCardResponse || {};\r\n\r\n if (memberSaveCards) {\r\n modeAction === 'add'\r\n ? CustomNotification.success('Add credit card successfully!')\r\n : CustomNotification.success('Edit credit card successfully!');\r\n\r\n //* update user info\r\n updateUserInfo();\r\n closeCreditCardMissingCard();\r\n refetchAllMemberBillingStatement();\r\n } else {\r\n modeAction === 'add'\r\n ? CustomNotification.error('Failed to add credit card!')\r\n : CustomNotification.error('Failed to edit credit card!');\r\n }\r\n\r\n offModal();\r\n }\r\n } catch (error) {\r\n CustomNotification.error(error?.message ?? 'Something went wrong!');\r\n }\r\n }\r\n });\r\n\r\n useEffect(() => {\r\n window.addEventListener('message', handleListenerMessage);\r\n\r\n return () => {\r\n window.removeEventListener('message', handleListenerMessage);\r\n };\r\n }, [handleListenerMessage]);\r\n};\r\n\r\nexport const useGetSavedMemberCard = () => {\r\n const { memberId } = useGetMemberId();\r\n\r\n const {\r\n data: savedMemberCardData,\r\n isLoading,\r\n fetchSavedMemberCard,\r\n } = useQuerySavedMemberCard({\r\n memberId,\r\n });\r\n\r\n const savedMemberCard = savedMemberCardData\r\n ? savedMemberCardData.memberSaveCards?.[0]\r\n : {};\r\n\r\n return {\r\n savedMemberCard,\r\n isFetchingSavedCard: isLoading,\r\n fetchSavedMemberCard,\r\n hasCreditCard: !isEmpty(savedMemberCard),\r\n };\r\n};\r\n\r\nexport const useMemberPaymentActions = ({\r\n memberPaymentProfileId,\r\n fetchSavedMemberCard,\r\n offModal,\r\n}) => {\r\n const [iframeResponse, setIframeResponse] = useState({\r\n value: null,\r\n status: 'idle',\r\n });\r\n\r\n const { memberId } = useGetMemberId();\r\n const { updateUserInfo, userInfo } = useUserInfo();\r\n\r\n const { showWarningWhenNoCreditCard, closeCreditCardMissingCard } =\r\n useShowWarningWhenNoCreditCard();\r\n\r\n const { isInvoicedTerm, isLoading } = useCheckInvoicedPayment();\r\n\r\n const isCurrentUserBelongToMember = memberId === userInfo?.companyId;\r\n\r\n const handleSaveCard = async ({ modeAction }) => {\r\n setIframeResponse((prevVal) => ({\r\n ...prevVal,\r\n status: 'loading',\r\n }));\r\n\r\n try {\r\n const paramsAddCard = {\r\n memberId,\r\n paymentEndpointType: null,\r\n };\r\n\r\n const paramsEditCard = {\r\n memberId,\r\n memberPaymentProfileId,\r\n };\r\n\r\n const responseIframe =\r\n modeAction === 'add'\r\n ? await paymentServices.getLinkIframeCard(paramsAddCard)\r\n : await paymentServices.getLinkIframeEditedCard(paramsEditCard);\r\n\r\n if (responseIframe?.isSuccess) {\r\n setIframeResponse((prevVal) => ({\r\n ...prevVal,\r\n value: responseIframe?.data?.iframeUrl,\r\n }));\r\n\r\n await sleep(3000);\r\n setIframeResponse((prevVal) => ({\r\n ...prevVal,\r\n status: 'success',\r\n }));\r\n\r\n updateUserInfo();\r\n } else {\r\n CustomNotification.error(\r\n responseIframe?.message ?? 'Something went wrong!'\r\n );\r\n setIframeResponse((prevVal) => ({\r\n ...prevVal,\r\n value: null,\r\n status: 'error',\r\n }));\r\n offModal();\r\n }\r\n } catch (error) {\r\n CustomNotification.error('Fail to get credit card, please try again!');\r\n setIframeResponse((prevVal) => ({\r\n ...prevVal,\r\n value: null,\r\n status: 'error',\r\n }));\r\n offModal();\r\n }\r\n };\r\n\r\n const checkShowWarningMissingCard = () => {\r\n if (!isLoading) {\r\n if (isInvoicedTerm || !isCurrentUserBelongToMember) {\r\n closeCreditCardMissingCard();\r\n } else {\r\n showWarningWhenNoCreditCard();\r\n }\r\n }\r\n };\r\n\r\n const handleRemoveSavedCard = async () => {\r\n dialogFunction({\r\n type: 'warn',\r\n content: 'Are you sure you want to delete the credit card?',\r\n okText: 'Delete',\r\n okButtonProps: {\r\n type: 'danger',\r\n },\r\n cancelText: 'Cancel',\r\n onOk: async () => {\r\n try {\r\n const params = {\r\n memberId,\r\n memberPaymentProfileId,\r\n paymentEndpointType: null,\r\n };\r\n const response = await paymentServices.removeSavedMemberCard(params);\r\n\r\n if (response?.isSuccess) {\r\n const fetchCardResponse = await fetchSavedMemberCard(\r\n fetchSavedMemberCard\r\n );\r\n\r\n const { memberSaveCards } = fetchCardResponse || {};\r\n\r\n if (memberSaveCards) {\r\n CustomNotification.success('Delete credit card successfully!');\r\n updateUserInfo();\r\n checkShowWarningMissingCard();\r\n } else {\r\n CustomNotification.error('Something went wrong!');\r\n }\r\n } else {\r\n CustomNotification.error(\r\n response?.message || 'Something went wrong!'\r\n );\r\n }\r\n } catch (error) {\r\n CustomNotification.error(error?.message ?? 'Something went wrong!');\r\n }\r\n },\r\n });\r\n };\r\n\r\n return {\r\n iframeUrl: iframeResponse.value,\r\n loadingIframe:\r\n iframeResponse.status === 'idle' || iframeResponse.status === 'loading',\r\n handleSaveCard,\r\n handleRemoveSavedCard,\r\n };\r\n};\r\n\r\nexport const useVisibleModal = () => {\r\n const [visible, setVisible] = useState(false);\r\n\r\n const handler = useMemo(\r\n () => ({\r\n onModal: () => setVisible(true),\r\n offModal: () => setVisible(false),\r\n toggle: () => setVisible((modal) => !modal),\r\n }),\r\n []\r\n );\r\n\r\n return [visible, handler];\r\n};\r\n\r\nexport const useCheckEditMemberCreditCardPermission = () => {\r\n const userInfo = useSelector(selectorUser.makeSelectUserInfo());\r\n\r\n const { memberId } = useGetMemberId();\r\n\r\n const isEditCompanyProfile = useCheckPermissions(\r\n PERMISSION_EDIT_COMPANY_PROFILE\r\n );\r\n\r\n const isEditMember = useCheckPermissions(EDIT_MEMBER_PERMISSION);\r\n\r\n const checkEditMemberPermission = () => {\r\n const isUserMemberOfCompany = memberId === userInfo?.companyId;\r\n\r\n if (isUserMemberOfCompany) {\r\n return isEditCompanyProfile || isEditMember;\r\n } else return isEditMember;\r\n };\r\n\r\n return checkEditMemberPermission();\r\n};\r\n","import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\r\nimport { CustomNotification, dialogFunction } from 'common/components';\r\n\r\nimport {\r\n getMemberBillingStatements,\r\n saveMemberBillingProperties,\r\n addCharge,\r\n downloadBillingStatement,\r\n editMemberPaymentSetting,\r\n getAuthorizedCardUsers,\r\n saveAuthorizedCardUser,\r\n removeAuthorizedCardUsers,\r\n exportBillingStatement,\r\n downloadBillingReceipt,\r\n addBillingNote,\r\n getBillingNote,\r\n getMemberDiscountProperties,\r\n saveMemberDiscountProperties,\r\n} from 'services/payment';\r\n\r\nimport { useCheckCreditCardPermission } from 'hooks/useCheckCreditCardPermission';\r\n\r\nconst keys = {\r\n //* api/payment/get-member-payment-setting\r\n allMemberBillingStatement: () => ['payment', 'get-member-billing-statements'],\r\n memberBillingStatements: (memberId, billingPeriod) => [\r\n 'payment',\r\n 'get-member-billing-statements',\r\n parseInt(memberId),\r\n billingPeriod,\r\n ],\r\n downloadBillingStatements: ['payment', 'download-member-billing-charges'],\r\n getSavedMemberCard: (memberId) => [\r\n 'payment',\r\n 'get-member-saved-cards',\r\n { params: { memberId: parseInt(memberId), paymentEndpointType: null } },\r\n ],\r\n //* /api/payment/get-member-payment-setting\r\n getMemberPaymentSetting: (memberId) => [\r\n 'payment',\r\n 'get-member-payment-setting',\r\n { params: { memberId: parseInt(memberId) } },\r\n ],\r\n getAuthorizedCardUsers: ({ memberId, memberPaymentProfileId }) => [\r\n 'payment',\r\n 'get-authorized-card-users',\r\n parseInt(memberId),\r\n parseInt(memberPaymentProfileId),\r\n ],\r\n downloadBillingReceipt: ['payment', 'download-invoice-summary'],\r\n getBillingNote: (memberId) => [\r\n 'payment',\r\n 'get-billing-note-grid',\r\n parseInt(memberId),\r\n ],\r\n getMemberDiscountProperties: (memberId) => [\r\n 'payment',\r\n 'get-member-discount-properties',\r\n parseInt(memberId),\r\n ],\r\n};\r\n\r\n/**\r\n *? POST\r\n *? /api/payment/get-member-billing-statements\r\n */\r\nconst useQueryMemberBillingStatements = ({ memberId, billingPeriod }) => {\r\n const queryClient = useQueryClient();\r\n\r\n const params = {\r\n memberId,\r\n ...billingPeriod,\r\n pageIndex: 1,\r\n pageSize: 999999999,\r\n };\r\n\r\n const key = keys.memberBillingStatements(memberId, billingPeriod);\r\n\r\n const query = useQuery({\r\n queryKey: key,\r\n queryFn: async () => {\r\n const res = await getMemberBillingStatements(params);\r\n\r\n const { isSuccess, data, message } = res || {};\r\n\r\n if (isSuccess) {\r\n return Promise.resolve(data);\r\n }\r\n const err = message || 'Server Error';\r\n CustomNotification.error(err);\r\n return Promise.reject(err);\r\n },\r\n });\r\n\r\n const invalidateMemberBillingStatement = () => {\r\n queryClient.invalidateQueries({ queryKey: key });\r\n };\r\n\r\n return { ...query, invalidateMemberBillingStatement };\r\n};\r\n\r\n/**\r\n *? POST\r\n *? /api/payment/save-member-billing-properties\r\n */\r\nconst useMutateBillingProperty = (options) => {\r\n return useMutation({\r\n mutationFn: async (params) => {\r\n const res = await saveMemberBillingProperties(params);\r\n const { isSuccess, message } = res || {};\r\n\r\n if (isSuccess) {\r\n CustomNotification.success('Change payment term successfully!');\r\n return Promise.resolve(true);\r\n } else {\r\n const errorMsg = message || 'Server Error';\r\n CustomNotification.error(errorMsg);\r\n }\r\n },\r\n ...options,\r\n });\r\n};\r\n\r\n/**\r\n *? POST\r\n *? /api/payment/add-billing-charge\r\n */\r\nconst useMutateAddBillingCharge = (options) => {\r\n const refetchAllMemberBillingStatement =\r\n useRefetchAllMemberBillingStatement();\r\n\r\n return useMutation({\r\n mutationFn: async (params) => {\r\n const res = await addCharge(params);\r\n const { isSuccess, message } = res || {};\r\n\r\n if (isSuccess) {\r\n CustomNotification.success('Add Charge Successfully!');\r\n return Promise.resolve(true);\r\n } else {\r\n const errorMsg = message || 'Server Error';\r\n dialogFunction({\r\n type: 'warn',\r\n content: errorMsg,\r\n okText: 'OK',\r\n cancelButtonProps: { style: { display: 'none' } },\r\n });\r\n }\r\n refetchAllMemberBillingStatement();\r\n },\r\n ...options,\r\n });\r\n};\r\n\r\n/**\r\n *? POST\r\n *? /api/payment/add-billing-charge\r\n */\r\nconst useQueryDownloadBillingStatement = ({ memberId, chargeIds }) => {\r\n return useQuery({\r\n queryKey: keys.downloadBillingStatements,\r\n queryFn: async () => {\r\n const params = { memberId, idsCharges: chargeIds };\r\n const res = await downloadBillingStatement(params);\r\n const { isSuccess, message } = res || {};\r\n\r\n if (isSuccess) {\r\n return Promise.resolve(true);\r\n } else {\r\n const errorMsg = message || 'Server Error';\r\n CustomNotification.error(errorMsg);\r\n }\r\n },\r\n enabled: false,\r\n retry: false,\r\n });\r\n};\r\n/**\r\n *? POST\r\n *? /api/payment/download-invoice-summary\r\n */\r\nconst useExportBillingStatement = ({ memberId, chargeIds }) => {\r\n return useQuery({\r\n queryKey: keys.downloadBillingStatements,\r\n queryFn: async () => {\r\n const params = { memberId, billingStatementIds: chargeIds };\r\n const res = await exportBillingStatement(params);\r\n const { isSuccess, message } = res || {};\r\n\r\n if (isSuccess) {\r\n return Promise.resolve(true);\r\n } else {\r\n const errorMsg = message || 'Server Error';\r\n CustomNotification.error(errorMsg);\r\n }\r\n },\r\n enabled: false,\r\n retry: false,\r\n });\r\n};\r\nconst useQuerySavedMemberCard = ({ memberId, ...options }) => {\r\n const { canViewSavedCard } = useCheckCreditCardPermission();\r\n const queryClient = useQueryClient();\r\n\r\n const queryObject = useQuery({\r\n queryKey: keys.getSavedMemberCard(memberId),\r\n enabled: Boolean(memberId && canViewSavedCard),\r\n ...options,\r\n });\r\n\r\n const invalidateSavedMemberCard = (_memberId) => {\r\n queryClient.invalidateQueries({\r\n queryKey: keys.getSavedMemberCard(_memberId || memberId),\r\n });\r\n };\r\n\r\n const fetchSavedMemberCard = async () => {\r\n await queryClient.resetQueries({\r\n queryKey: keys.getSavedMemberCard(memberId),\r\n exact: true,\r\n });\r\n\r\n return queryClient.fetchQuery({\r\n queryKey: keys.getSavedMemberCard(memberId),\r\n });\r\n };\r\n\r\n return { ...queryObject, invalidateSavedMemberCard, fetchSavedMemberCard };\r\n};\r\n\r\n/**\r\n *? GET\r\n *? /api/payment/get-member-payment-setting\r\n */\r\nconst useQueryMemberPaymentSetting = ({ memberId }) => {\r\n const queryClient = useQueryClient();\r\n const key = keys.getMemberPaymentSetting(memberId);\r\n\r\n const queryObject = useQuery({\r\n queryKey: key,\r\n enabled: Boolean(memberId),\r\n });\r\n\r\n const invalidateMemberPaymentSetting = () => {\r\n queryClient.invalidateQueries({ queryKey: key });\r\n };\r\n\r\n return {\r\n ...queryObject,\r\n invalidateMemberPaymentSetting,\r\n };\r\n};\r\n\r\n/**\r\n *? POST\r\n *? /api/payment/edit/edit-payment-setting\r\n */\r\nconst useMutateMemberPaymentSetting = () => {\r\n return useMutation({\r\n mutationFn: async (params) => {\r\n const res = await editMemberPaymentSetting(params);\r\n const { isSuccess, message } = res || {};\r\n\r\n if (isSuccess) {\r\n CustomNotification.success(\r\n 'Member fees have been updated successfully'\r\n );\r\n return Promise.resolve(true);\r\n } else {\r\n const errMsg = message || 'Failed to update member fees';\r\n CustomNotification.error(errMsg);\r\n return Promise.reject(errMsg);\r\n }\r\n },\r\n });\r\n};\r\n\r\nconst useQueryGetAuthorizedCardUsers = ({\r\n memberId,\r\n memberPaymentProfileId,\r\n}) => {\r\n return useQuery({\r\n queryKey: keys.getAuthorizedCardUsers({\r\n memberId,\r\n memberPaymentProfileId,\r\n }),\r\n queryFn: async () => {\r\n const params = { memberId, memberPaymentProfileId };\r\n const res = await getAuthorizedCardUsers(params);\r\n const { isSuccess, message, data } = res || {};\r\n\r\n if (isSuccess) {\r\n return data?.authorizedUsers || [];\r\n } else {\r\n const errorMsg = message || 'Server Error';\r\n CustomNotification.error(errorMsg);\r\n }\r\n },\r\n });\r\n};\r\n\r\nconst useMutateSaveAuthorizedCardUser = () => {\r\n return useMutation({\r\n mutationFn: saveAuthorizedCardUser,\r\n });\r\n};\r\n\r\nconst useMutateRemoveAuthorizedCardUser = () => {\r\n return useMutation({\r\n mutationFn: removeAuthorizedCardUsers,\r\n });\r\n};\r\n\r\nconst useRefetchAllMemberBillingStatement = () => {\r\n const queryClient = useQueryClient();\r\n\r\n const refetchAllMemberBillingStatement = () => {\r\n queryClient.invalidateQueries({\r\n queryKey: keys.allMemberBillingStatement(),\r\n });\r\n };\r\n return refetchAllMemberBillingStatement;\r\n};\r\n\r\nconst useQueryDownloadBillingReceipt = ({ billingStatementIds }) => {\r\n return useQuery({\r\n queryKey: keys.downloadBillingReceipt,\r\n queryFn: async () => {\r\n try {\r\n const params = { billingStatementIds };\r\n const res = await downloadBillingReceipt(params);\r\n const { isSuccess, message } = res || {};\r\n\r\n if (isSuccess) {\r\n return Promise.resolve(true);\r\n } else {\r\n const errorMsg = message || 'Server Error';\r\n CustomNotification.error(errorMsg);\r\n }\r\n } catch (error) {\r\n CustomNotification.error('Server Error');\r\n }\r\n },\r\n enabled: false,\r\n retry: false,\r\n });\r\n};\r\n\r\nconst useQueryBillingNote = ({ memberId, ...restProps }) => {\r\n const queryClient = useQueryClient();\r\n\r\n const params = {\r\n memberId,\r\n pageIndex: 1,\r\n pageSize: 999999999,\r\n };\r\n\r\n const key = keys.getBillingNote(memberId);\r\n\r\n const query = useQuery({\r\n queryKey: key,\r\n queryFn: async () => {\r\n const res = await getBillingNote(params);\r\n\r\n const { isSuccess, data, message } = res || {};\r\n\r\n if (isSuccess) {\r\n return Promise.resolve(data?.gridData);\r\n }\r\n const err = message || 'Something went wrong!';\r\n CustomNotification.error(err);\r\n return Promise.reject(err);\r\n },\r\n staleTime: 0,\r\n ...restProps,\r\n });\r\n\r\n const invalidateBillingNote = () => {\r\n queryClient.invalidateQueries({ queryKey: key });\r\n };\r\n\r\n return { ...query, invalidateBillingNote };\r\n};\r\n\r\nconst useMutateAddBillingNote = () => {\r\n return useMutation({\r\n mutationFn: addBillingNote,\r\n });\r\n};\r\n\r\nconst useQueryMemberDiscountProperties = ({ memberId, ...restProps }) => {\r\n const queryClient = useQueryClient();\r\n const key = keys.getMemberDiscountProperties(memberId);\r\n const query = useQuery({\r\n queryKey: key,\r\n queryFn: async () => {\r\n const res = await getMemberDiscountProperties({ memberId });\r\n\r\n const { isSuccess, data, message } = res || {};\r\n\r\n if (isSuccess) {\r\n return Promise.resolve(data);\r\n }\r\n const err = message || 'Something went wrong!';\r\n CustomNotification.error(err);\r\n return Promise.reject(err);\r\n },\r\n ...restProps,\r\n });\r\n\r\n const invalidateMemberDiscountProperties = () => {\r\n queryClient.invalidateQueries({ queryKey: key });\r\n };\r\n\r\n return {\r\n ...query,\r\n invalidateMemberDiscountProperties,\r\n };\r\n};\r\n\r\nconst useMutateSaveMemberDiscountProperties = () => {\r\n return useMutation({\r\n mutationFn: saveMemberDiscountProperties,\r\n });\r\n};\r\n\r\nexport {\r\n keys,\r\n useQueryMemberBillingStatements,\r\n useMutateBillingProperty,\r\n useMutateAddBillingCharge,\r\n useQueryDownloadBillingStatement,\r\n useQuerySavedMemberCard,\r\n useQueryMemberPaymentSetting,\r\n useMutateMemberPaymentSetting,\r\n useQueryGetAuthorizedCardUsers,\r\n useMutateSaveAuthorizedCardUser,\r\n useMutateRemoveAuthorizedCardUser,\r\n useRefetchAllMemberBillingStatement,\r\n useExportBillingStatement,\r\n useQueryDownloadBillingReceipt,\r\n useQueryBillingNote,\r\n useMutateAddBillingNote,\r\n useQueryMemberDiscountProperties,\r\n useMutateSaveMemberDiscountProperties,\r\n};\r\n","import React, { useEffect, useState, useRef } from 'react';\r\nimport { useDispatch } from 'react-redux';\r\nimport PropTypes from 'prop-types';\r\nimport { useParams } from 'react-router-dom';\r\nimport { Input, Select, Typography } from 'antd';\r\nimport { LoadingOutlined } from '@ant-design/icons';\r\n\r\nimport { FormattedMessage, injectIntl } from 'react-intl';\r\nimport classnames from 'classnames';\r\n\r\n//* COMPONENTS\r\nimport { locationTypeIcon } from 'common/components/icon-renderer/IconRendererMapping';\r\nimport {\r\n Form,\r\n CustomNotification,\r\n StyledModal,\r\n WrapperSelect,\r\n FlagCountrySelectionFieldInput,\r\n} from 'common/components';\r\n\r\n//* SERVICES\r\nimport * as memberServices from 'services/members';\r\nimport * as companyActions from 'pages/company-profile/controllers/actions';\r\nimport Messages from 'i18n/messages/message-my-company';\r\n\r\n//* UTILS\r\nimport { searchCountryCode } from 'utils/country';\r\nimport CountryCode from 'static/CountryCode';\r\n\r\nimport './CompanyLocationForm.less';\r\nimport { checkIsDollarProduct } from 'pages/qa-spec/views/qa-spec-detail/utils';\r\nimport { useGetProductFullView } from 'hooks';\r\nimport { useCheckQaSpecTypeFood } from 'pages/qa-spec/components/qa-spec-header-property/hook';\r\n\r\nconst { Option } = Select;\r\nconst { Text } = Typography;\r\nconst { TextArea } = Input;\r\n\r\nconst CompanyLocationForm = (props) => {\r\n const {\r\n isOpen,\r\n isAddNew,\r\n setIsOpen,\r\n itemData,\r\n intl,\r\n gridApi,\r\n memberId,\r\n type,\r\n onSubmit,\r\n } = props;\r\n\r\n const [formInstance] = Form.useForm();\r\n const [isLoading, setIsLoading] = useState(false);\r\n\r\n const dispatch = useDispatch();\r\n\r\n const refCountry = useRef(null);\r\n\r\n const handleSubmitForm = async () => {\r\n try {\r\n const formValue = await formInstance.validateFields();\r\n\r\n if (onSubmit) {\r\n return onSubmit({ formValue, setIsLoading });\r\n }\r\n\r\n setIsLoading(true);\r\n\r\n const response = isAddNew\r\n ? await memberServices.addMyCompanyLocation({\r\n memberId,\r\n ...formValue,\r\n })\r\n : await memberServices.updateMyCompanyLocation({\r\n id: itemData?.id,\r\n memberId,\r\n ...formValue,\r\n });\r\n\r\n setIsLoading(false);\r\n\r\n if (response?.isSuccess) {\r\n CustomNotification.success(\r\n intl.formatMessage(\r\n isAddNew\r\n ? Messages.msgLocationCreateSuccess\r\n : Messages.msgLocationUpdateSuccess\r\n )\r\n );\r\n gridApi?.rivirPurgeServerSideCache();\r\n dispatch(companyActions.getMemberProfileHeader(memberId));\r\n setIsOpen(false);\r\n } else {\r\n CustomNotification.error(\r\n response?.message ||\r\n intl.formatMessage(Messages.msgLocationUpdateFail)\r\n );\r\n }\r\n } catch (error) {\r\n setIsLoading(false);\r\n\r\n if (error?.errorFields) {\r\n formInstance.scrollToField(error?.errorFields[0].name[0]);\r\n CustomNotification.error(intl.formatMessage(Messages.msgInvalidFields));\r\n } else {\r\n CustomNotification.error(intl.formatMessage(Messages.msgExcepEdit));\r\n }\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n //* set form Data to edit\r\n const setInitFormDataForEdit = async () => {\r\n if (isOpen && itemData?.id && !isAddNew) {\r\n setIsLoading(true);\r\n const response = await memberServices.getCompanyLocationDetail(\r\n itemData?.id\r\n );\r\n setIsLoading(false);\r\n\r\n if (response?.isSuccess) {\r\n formInstance.setFieldsValue(response?.data);\r\n refCountry &&\r\n refCountry.current &&\r\n refCountry.current.updateSelected(\r\n searchCountryCode(response.data?.country)\r\n );\r\n } else {\r\n CustomNotification.error('Failed to get contact detail info');\r\n }\r\n }\r\n };\r\n\r\n setInitFormDataForEdit();\r\n }, [isOpen, itemData, isAddNew]);\r\n\r\n return (\r\n \r\n \r\n ) : (\r\n \r\n )\r\n }\r\n visible={isOpen || isAddNew}\r\n onOk={handleSubmitForm}\r\n onCancel={() => setIsOpen(false)}\r\n okText={\r\n isLoading ? (\r\n \r\n \r\n \r\n \r\n \r\n \r\n ) : (\r\n \r\n )\r\n }\r\n cancelText={}\r\n maskClosable={false}\r\n destroyOnClose\r\n >\r\n \r\n \r\n \r\n );\r\n};\r\n\r\n/**\r\n * ! SUB COMPONENT - company location form content\r\n * @param {*} props\r\n * @returns\r\n */\r\nconst CompanyLocationFormBody = injectIntl((props) => {\r\n const { formInstance, intl, isLoading, refCountry, type } = props;\r\n\r\n useEffect(() => {\r\n return () => {\r\n formInstance.resetFields();\r\n formInstance.setFieldsValue({\r\n addressType: type ? type : null,\r\n country: CountryCode['US'],\r\n });\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n formInstance.setFieldsValue({\r\n addressType: type ? type : null,\r\n });\r\n }, [type]);\r\n\r\n return (\r\n \r\n }\r\n rules={[\r\n {\r\n required: true,\r\n message: 'Type is required',\r\n },\r\n ]}\r\n >\r\n \r\n document.getElementById('company-location-edit-form')\r\n }\r\n placeholder={intl.formatMessage(Messages.placeHolderLocationType)}\r\n disabled={!!type}\r\n >\r\n {locationTypeIcon.map((locationIconItem) => (\r\n \r\n \r\n {locationIconItem.label}\r\n \r\n ))}\r\n \r\n \r\n }\r\n rules={[\r\n {\r\n required: true,\r\n message: 'Address is required',\r\n },\r\n ]}\r\n >\r\n \r\n \r\n }\r\n rules={[\r\n {\r\n required: true,\r\n message: 'City is required',\r\n },\r\n ]}\r\n >\r\n \r\n \r\n }\r\n >\r\n \r\n \r\n }\r\n >\r\n {\r\n formInstance.setFieldsValue({\r\n ...formInstance.getFieldsValue(),\r\n country: CountryCode[value],\r\n });\r\n }}\r\n ref={refCountry}\r\n defaultCountry='US'\r\n />\r\n \r\n ({\r\n validator(rule, value) {\r\n const regex = /^\\d{5}[-\\s]?(?:\\d{4})?$/gm;\r\n if (regex.exec(value) || !value) {\r\n return Promise.resolve();\r\n } else {\r\n return Promise.reject('Invalid Zipcode');\r\n }\r\n },\r\n }),\r\n ]}\r\n >\r\n \r\n \r\n }\r\n rules={[\r\n {\r\n required: true,\r\n message: 'Location Name is required',\r\n },\r\n ]}\r\n >\r\n \r\n \r\n }\r\n >\r\n \r\n \r\n \r\n \r\n \r\n }\r\n >\r\n \r\n \r\n \r\n \r\n \r\n }\r\n >\r\n \r\n \r\n }\r\n >\r\n \r\n \r\n }\r\n rules={[{ type: 'email', message: 'Invalid Email' }]}\r\n >\r\n \r\n \r\n\r\n {/* BP 12/28/2020 - remove latitude and longitude fields\r\n {isAddNew && (\r\n <>\r\n ({\r\n validator(rule, value) {\r\n const regex = /^(\\+|-)?(?:90(?:(?:\\.0{1,6})?)|(?:[0-9]|[1-8][0-9])(?:(?:\\.[0-9]{1,6})?))$/;\r\n if (regex.exec(value)) {\r\n return Promise.resolve();\r\n } else {\r\n return Promise.reject('Invalid Latitude');\r\n }\r\n },\r\n }),\r\n ]}\r\n >\r\n }\r\n placeholder={intl.formatMessage(\r\n Messages.placeHolderLatitude\r\n )}\r\n />\r\n \r\n }\r\n rules={[\r\n () => ({\r\n validator(rule, value) {\r\n const regex = /^(\\+|-)?(?:180(?:(?:\\.0{1,6})?)|(?:[0-9]|[1-9][0-9]|1[0-7][0-9])(?:(?:\\.[0-9]{1,6})?))$/;\r\n if (regex.exec(value)) {\r\n return Promise.resolve();\r\n } else {\r\n return Promise.reject('Invalid Longitude');\r\n }\r\n },\r\n }),\r\n ]}\r\n >\r\n \r\n \r\n \r\n )} */}\r\n \r\n );\r\n});\r\n\r\nCompanyLocationForm.propTypes = {\r\n isOpen: PropTypes.bool,\r\n isAddNew: PropTypes.bool,\r\n setIsOpen: PropTypes.func,\r\n itemData: PropTypes.object,\r\n};\r\n\r\nexport default injectIntl(CompanyLocationForm);\r\n","import { useQuery, useQueryClient } from '@tanstack/react-query';\r\n\r\nimport * as memberServices from 'services/members';\r\n\r\nconst getChildrenCompanyParamsKey = (params) => {\r\n return ['get-children-company', params];\r\n};\r\n\r\nconst getChildrenCompanyAllKey = () => {\r\n return ['get-children-company'];\r\n};\r\n\r\nexport const useGetChildrenCompany = ({\r\n memberId,\r\n pagination,\r\n ...otherOptions\r\n} = {}) => {\r\n const queryClient = useQueryClient();\r\n\r\n const queries = useQuery({\r\n queryKey: getChildrenCompanyParamsKey({\r\n memberId: Number(memberId),\r\n ...pagination,\r\n }),\r\n queryFn: async () => {\r\n const response = await memberServices.getChildrenCompany({\r\n memberId,\r\n pageIndex: pagination.pageIndex,\r\n pageSize: pagination.pageSize,\r\n });\r\n\r\n if (response?.isSuccess) {\r\n return response?.data;\r\n }\r\n },\r\n enabled: Boolean(memberId),\r\n retry: 1,\r\n ...otherOptions,\r\n });\r\n\r\n const invalidateChildrenCompany = () => {\r\n queryClient.invalidateQueries({\r\n queryKey: memberId\r\n ? getChildrenCompanyParamsKey({\r\n memberId: Number(memberId),\r\n ...pagination,\r\n })\r\n : getChildrenCompanyAllKey(),\r\n });\r\n };\r\n\r\n const { data, isLoading } = queries || {};\r\n\r\n return {\r\n childrenCompanyList: data?.data?.gridData ?? [],\r\n ...data?.data?.paging,\r\n isLoading,\r\n invalidateChildrenCompany,\r\n };\r\n};\r\n","import React from 'react';\r\nimport { Tag, Tooltip } from 'antd';\r\nimport * as IconListArray from 'common/components/icon-list/assets';\r\nimport {\r\n languageCode,\r\n currencyData,\r\n legalEntityType,\r\n targetMarketCountryCode,\r\n ownershipType,\r\n statusType,\r\n} from 'static/CountryCode';\r\n\r\nexport const fiscalYearStartDateFormat = 'MM/DD';\r\n\r\nconst IconListName = IconListArray.default;\r\n\r\nconst tagRender = (props) => {\r\n const { value, closable, onClose } = props;\r\n const src = IconListName.filter((val) => val.segmentId === value);\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst getClassificationsOptions = () => {\r\n return IconListName.map((val) => {\r\n return {\r\n label: val.segmentDescription,\r\n value: val.segmentId,\r\n icon: val.segmentIcon,\r\n };\r\n });\r\n};\r\n\r\nconst getCountryOptions = () => {\r\n return Object.values(targetMarketCountryCode)\r\n ?.slice()\r\n .sort()\r\n .map((country) => {\r\n return {\r\n label: country,\r\n value: country,\r\n };\r\n });\r\n};\r\n\r\nconst getLanguageOptions = () => {\r\n return languageCode\r\n ?.slice()\r\n .sort()\r\n .map((language) => {\r\n return {\r\n label: language,\r\n value: language,\r\n };\r\n });\r\n};\r\n\r\nconst getCurrencyOptions = () => {\r\n return Object.keys(currencyData).map((currencyCode) => {\r\n return {\r\n label: `(${currencyCode}) ${currencyData[currencyCode]}`,\r\n value: currencyCode,\r\n };\r\n });\r\n};\r\n\r\nconst getLegalEntityTypesOptions = () => {\r\n return legalEntityType.map((type) => ({\r\n label: type,\r\n value: type,\r\n }));\r\n};\r\n\r\nconst getOwnershipTypeOptions = () => {\r\n return ownershipType.map((type) => ({\r\n label: type,\r\n value: type,\r\n }));\r\n};\r\n\r\nexport const getStatusTypesOptions = () => {\r\n return statusType.map((type) => ({\r\n label: type,\r\n value: type,\r\n }));\r\n};\r\n\r\nconst editFormSchema = [\r\n {\r\n name: 'dba',\r\n label: 'dbaLabel',\r\n type: 'text',\r\n },\r\n {\r\n name: 'legalEntityType',\r\n label: 'legalEntityTypeLabel',\r\n type: 'select',\r\n options: getLegalEntityTypesOptions(),\r\n },\r\n {\r\n name: 'status',\r\n label: 'statusLabel',\r\n type: 'select',\r\n options: getStatusTypesOptions(),\r\n },\r\n {\r\n name: 'headquartersCountry',\r\n label: 'headquartersCountryLabel',\r\n type: 'selectEnum',\r\n showSearch: true,\r\n options: getCountryOptions(),\r\n enumName: 'CountryCode3166Enum',\r\n },\r\n {\r\n name: 'stateOfIncorporation',\r\n label: 'incorporationStateLabel',\r\n type: 'custom',\r\n },\r\n {\r\n name: 'currency',\r\n label: 'currencyLabel',\r\n type: 'selectEnum',\r\n showSearch: true,\r\n options: getCurrencyOptions(),\r\n enumName: 'CurrencyCodeISO4217Enum',\r\n },\r\n {\r\n name: 'primaryLanguage',\r\n label: 'languageLabel',\r\n type: 'selectEnum',\r\n showSearch: true,\r\n options: getLanguageOptions(),\r\n enumName: 'LanguageCodeISO639_1Enum',\r\n },\r\n // {\r\n // name: 'gln',\r\n // label: 'glnLabel',\r\n // type: 'text',\r\n // },\r\n {\r\n name: 'duns',\r\n label: 'dunsLabel',\r\n type: 'text',\r\n },\r\n {\r\n name: 'stockSymbol',\r\n label: 'stockSymbolLabel',\r\n type: 'text',\r\n },\r\n {\r\n name: 'sicCode',\r\n label: 'sicCodeLabel',\r\n type: 'text',\r\n },\r\n {\r\n name: 'naicsCode',\r\n label: 'naicsLabel',\r\n type: 'text',\r\n },\r\n {\r\n name: 'annualRevenue',\r\n label: 'annualRevenueLabel',\r\n type: 'text',\r\n },\r\n {\r\n name: 'representedSales',\r\n label: 'representedSalesLabel',\r\n type: 'text',\r\n },\r\n {\r\n name: 'minorityOwnedType',\r\n label: 'minorityOwnedTypeLabel',\r\n type: 'select',\r\n mode: 'multiple',\r\n options: [\r\n {\r\n label: 'Minority Owned Business Certifications',\r\n value: 'Minority Owned Business Certifications',\r\n },\r\n {\r\n label: '8(a) Business Development Program',\r\n value: '8(a) Business Development Program',\r\n },\r\n {\r\n label: 'Asian-Indian',\r\n value: 'Asian-Indian',\r\n },\r\n {\r\n label: 'Certified B Corp',\r\n value: 'Certified B Corp',\r\n },\r\n {\r\n label: 'Non Profit',\r\n value: 'Non Profit',\r\n },\r\n {\r\n label: 'Asian-Pacific American',\r\n value: 'Asian-Pacific American',\r\n },\r\n {\r\n label: 'Not for Profit',\r\n value: 'Not for Profit',\r\n },\r\n {\r\n label: 'DOBE (Disability-Owned Business Enterprise)',\r\n value: 'DOBE (Disability-Owned Business Enterprise)',\r\n },\r\n {\r\n label: 'African American',\r\n value: 'African American',\r\n },\r\n {\r\n label: 'LGBTBE (LGBT-Owned Business Enterprise)',\r\n value: 'LGBTBE (LGBT-Owned Business Enterprise)',\r\n },\r\n {\r\n label: 'Small Business (SBA / SBE)',\r\n value: 'Small Business (SBA / SBE)',\r\n },\r\n {\r\n label: 'DBE (Disadvantaged Business Enterprise)',\r\n value: 'DBE (Disadvantaged Business Enterprise)',\r\n },\r\n {\r\n label: 'WOSB (Women Owned Small Business)',\r\n value: 'WOSB (Women Owned Small Business)',\r\n },\r\n {\r\n label: 'NMSDC Certified (Ethnic Minority Owned)',\r\n value: 'NMSDC Certified (Ethnic Minority Owned)',\r\n },\r\n {\r\n label: 'Hispanic American',\r\n value: 'Hispanic American',\r\n },\r\n {\r\n label: 'Women Owned',\r\n value: 'Women Owned',\r\n },\r\n {\r\n label: 'Military Veteran-Owned',\r\n value: 'Military Veteran-Owned',\r\n },\r\n {\r\n label: 'State Certified Minority Owned',\r\n value: 'State Certified Minority Owned',\r\n },\r\n {\r\n label: 'VOSB (Veteran Owned Small Business)',\r\n value: 'VOSB (Veteran Owned Small Business)',\r\n },\r\n {\r\n label: 'Historically Underutilized Business (HUB)',\r\n value: 'Historically Underutilized Business (HUB)',\r\n },\r\n {\r\n label: 'Latin American',\r\n value: 'Latin American',\r\n },\r\n {\r\n label: 'MBE (Minority Business Enterprise)',\r\n value: 'MBE (Minority Business Enterprise)',\r\n },\r\n {\r\n label: 'Native American',\r\n value: 'Native American',\r\n },\r\n {\r\n label: 'NOD Leading Disability Employer',\r\n value: 'NOD Leading Disability Employer',\r\n },\r\n {\r\n label: 'Small & Disadvantaged Business',\r\n value: 'Small & Disadvantaged Business',\r\n },\r\n {\r\n label: 'Other Diversity Based Certification',\r\n value: 'Other Diversity Based Certification',\r\n },\r\n {\r\n label: 'GEEIS (Gender Equality European & International Standard)',\r\n value: 'GEEIS (Gender Equality European & International Standard)',\r\n },\r\n {\r\n label: 'SDVOSB (Service-Disabled Veteran-Owned Small Business)',\r\n value: 'SDVOSB (Service-Disabled Veteran-Owned Small Business)',\r\n },\r\n {\r\n label: 'EDWOSB (Economically Disadvantaged Woman-Owned Small Business)',\r\n value: 'EDWOSB (Economically Disadvantaged Woman-Owned Small Business)',\r\n },\r\n {\r\n label: 'WBENC (Womans Business Enterprise National Council)',\r\n value: 'WBENC (Womans Business Enterprise National Council)',\r\n },\r\n {\r\n label: 'NaVOBA (National Veteran-Owned Business Association)',\r\n value: 'NaVOBA (National Veteran-Owned Business Association)',\r\n },\r\n ],\r\n },\r\n {\r\n name: 'ownershipType',\r\n label: 'ownershipTypeLabel',\r\n type: 'select',\r\n options: getOwnershipTypeOptions(),\r\n },\r\n {\r\n name: 'contractPackaging',\r\n label: 'contractPackagingLabel',\r\n type: 'checkbox',\r\n },\r\n {\r\n name: 'minorityOwned',\r\n label: 'minorityOwnedLabel',\r\n type: 'checkbox',\r\n },\r\n {\r\n name: 'bCorp',\r\n label: 'bCorpLabel',\r\n type: 'checkbox',\r\n },\r\n {\r\n name: 'coOp',\r\n label: 'coOpLabel',\r\n type: 'checkbox',\r\n },\r\n {\r\n name: 'coOp50',\r\n label: 'coOp50Label',\r\n type: 'checkbox',\r\n },\r\n {\r\n name: 'coPacker',\r\n label: 'coPackerLabel',\r\n type: 'checkbox',\r\n },\r\n {\r\n name: 'fiscalYearStartDate',\r\n label: 'fiscalYearStartDateLabel',\r\n type: 'datePicker',\r\n dateFormat: fiscalYearStartDateFormat,\r\n },\r\n {\r\n name: 'numberOfEmployees',\r\n label: 'numberOfEmployeesLabel',\r\n type: 'number',\r\n min: 0,\r\n },\r\n {\r\n name: 'numberOfCustomers',\r\n label: 'numberOfCustomersLabel',\r\n type: 'number',\r\n min: 0,\r\n },\r\n {\r\n name: 'customers',\r\n label: 'customersLabel',\r\n type: 'select',\r\n mode: 'tags',\r\n },\r\n {\r\n name: 'classifications',\r\n label: 'majorIndustryClassificationsLabel',\r\n type: 'select',\r\n mode: 'multiple',\r\n tagRender: tagRender,\r\n options: getClassificationsOptions(),\r\n fullWidth: true,\r\n },\r\n {\r\n name: 'productCapabilities',\r\n label: 'productCapabilitiesLabel',\r\n type: 'text',\r\n },\r\n {\r\n name: 'productionCapabilities',\r\n label: 'productionCapabilitiesLabel',\r\n type: 'text',\r\n },\r\n {\r\n name: 'marketRegions',\r\n label: 'marketRegionsLabel',\r\n type: 'select',\r\n mode: 'tags',\r\n },\r\n {\r\n name: 'produceNationalBrands',\r\n label: 'produceNationalBrandsLabel',\r\n type: 'checkbox',\r\n },\r\n {\r\n name: 'exportRegions',\r\n label: 'exportRegionsLabel',\r\n type: 'select',\r\n mode: 'tags',\r\n },\r\n {\r\n name: 'exportPercentage',\r\n label: 'exportPercentageLabel',\r\n type: 'number',\r\n min: 0,\r\n format: '%',\r\n },\r\n {\r\n name: 'exportCountries',\r\n label: 'exportCountriesLabel',\r\n type: 'select',\r\n mode: 'multiple',\r\n options: getCountryOptions(),\r\n placement: 'topLeft',\r\n },\r\n {\r\n name: 'certifications',\r\n label: 'certificationsLabel',\r\n type: 'custom',\r\n },\r\n {\r\n name: 'privateLabel',\r\n label: 'privateLabelLabel',\r\n type: 'checkbox',\r\n },\r\n {\r\n name: 'privateLabelBusinessPercentage',\r\n label: 'privateLabelBusinessPercentageLabel',\r\n type: 'number',\r\n format: '%',\r\n min: 0,\r\n },\r\n {\r\n name: 'privateLabelClassifications',\r\n label: 'privateLabelClassificationsLabel',\r\n type: 'select',\r\n mode: 'multiple',\r\n tagRender: tagRender,\r\n options: getClassificationsOptions(),\r\n fullWidth: true,\r\n placement: 'topLeft',\r\n filterOption: (input, option) => {\r\n return (option?.label?.toLowerCase() ?? '').includes(\r\n input?.toLowerCase()\r\n );\r\n },\r\n },\r\n {\r\n name: 'autoSendAcceptCic',\r\n label: 'autoSendAcceptCicLabel',\r\n type: 'checkbox',\r\n },\r\n // {\r\n // name: 'fiscalYearStartDate',\r\n // label: 'fiscalYearStartDateLabel',\r\n // type: 'datePicker',\r\n // dateFormat: fiscalYearStartDateFormat,\r\n // },\r\n // {\r\n // name: 'fiscalYearStartDate',\r\n // label: 'fiscalYearStartDateLabel',\r\n // type: 'datePicker',\r\n // dateFormat: fiscalYearStartDateFormat,\r\n // },\r\n];\r\n\r\nexport default editFormSchema;\r\n","import React from 'react';\r\nimport { Form, Input, Typography } from 'antd';\r\nimport {\r\n CATEGORY_FORM_ITEM_INPUT,\r\n CATEGORY_LEVEL_1,\r\n CATEGORY_LEVEL_2,\r\n CATEGORY_LEVEL_3,\r\n CATEGORY_LEVEL_4,\r\n} from 'pages/company-profile/components/tabs/system/category-management/constant';\r\nimport {\r\n checkEmptyChildCategoryInAddMode,\r\n resetFieldError,\r\n} from 'pages/company-profile/components/tabs/system/category-management/utils';\r\n\r\nimport './ProductCategoryForm.less';\r\n\r\nconst { Text } = Typography;\r\n\r\nconst ProductCategoryForm = ({\r\n mode,\r\n formName,\r\n getMap,\r\n nodeSelected,\r\n disableForm,\r\n}) => {\r\n const form = Form.useFormInstance();\r\n const isModeNullOrBulkReassignMode = !mode || mode === 'bulkReassignProducts';\r\n\r\n const checkDisabled = (level, node, mode) => {\r\n if (disableForm) return true;\r\n if (level !== node?.level && mode === 'edit') return true;\r\n\r\n if (mode === 'add') {\r\n let levelList = [];\r\n for (let i = 1; i <= node?.level; i++) {\r\n levelList.push(i);\r\n }\r\n return levelList.includes(level);\r\n }\r\n return false;\r\n };\r\n\r\n const handleSetRefForEachCategoryInput = (input, formItem) => {\r\n const map = getMap ? getMap() : null;\r\n if (!map) return;\r\n input ? map?.set(formItem.level, input) : map?.delete(formItem.level);\r\n };\r\n\r\n const handleChangeValueForm = (e, mode, level) => {\r\n const errorMessage = 'Category Name is required';\r\n\r\n if (mode === 'edit') {\r\n const errors = e.target.value === '' ? [errorMessage] : [];\r\n form.setFields([{ name: `category${level}`, errors }]);\r\n }\r\n\r\n if (mode === 'add') {\r\n const emptyChildLevel = checkEmptyChildCategoryInAddMode(\r\n form.getFieldsValue()\r\n );\r\n if (!emptyChildLevel) {\r\n resetFieldError(form);\r\n return;\r\n }\r\n const validFields = [];\r\n const errorFields = [];\r\n\r\n [\r\n CATEGORY_LEVEL_1,\r\n CATEGORY_LEVEL_2,\r\n CATEGORY_LEVEL_3,\r\n CATEGORY_LEVEL_4,\r\n ].forEach((level) => {\r\n const fieldName = `category${level}`;\r\n const errorsExist = emptyChildLevel.includes(level);\r\n\r\n if (errorsExist) {\r\n errorFields.push({ name: fieldName, errors: [errorMessage] });\r\n } else {\r\n validFields.push({ name: fieldName, errors: [] });\r\n }\r\n });\r\n\r\n form.setFields([...validFields, ...errorFields]);\r\n return;\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n {CATEGORY_FORM_ITEM_INPUT.map((formItem) => {\r\n return (\r\n \r\n {formItem.label}\r\n \r\n }\r\n name={\r\n mode === 'bulkReassignProducts'\r\n ? [[formName], `${formItem.name}`]\r\n : `${formItem.name}`\r\n }\r\n >\r\n handleSetRefForEachCategoryInput(input, formItem)}\r\n onChange={(e) => handleChangeValueForm(e, mode, formItem.level)}\r\n />\r\n \r\n );\r\n })}\r\n \r\n );\r\n};\r\n\r\nexport default ProductCategoryForm;\r\n","import Messages from 'i18n/messages/member-profile';\r\nimport * as categoryManagement from 'services/categoryManagement';\r\n\r\nexport const CATEGORY_LEVEL_1 = 1;\r\nexport const CATEGORY_LEVEL_2 = 2;\r\nexport const CATEGORY_LEVEL_3 = 3;\r\nexport const CATEGORY_LEVEL_4 = 4;\r\n\r\nexport const BULK_REASSIGN_PRODUCTS = {\r\n from: {\r\n key: 'from',\r\n title: 'Source',\r\n },\r\n to: {\r\n key: 'to',\r\n title: 'Destination',\r\n },\r\n};\r\n\r\nexport const PRODUCT_CATEGORY_LEVEL = {\r\n 1: 'I',\r\n 2: 'II',\r\n 3: 'III',\r\n 4: 'IV',\r\n};\r\n\r\nexport const CATEGORY_FORM_ITEM_INPUT = [\r\n {\r\n label: 'Category I',\r\n name: 'category1',\r\n level: CATEGORY_LEVEL_1,\r\n },\r\n {\r\n label: 'Category II',\r\n name: 'category2',\r\n level: CATEGORY_LEVEL_2,\r\n },\r\n {\r\n label: 'Category III',\r\n name: 'category3',\r\n level: CATEGORY_LEVEL_3,\r\n },\r\n {\r\n label: 'Category IV',\r\n name: 'category4',\r\n level: CATEGORY_LEVEL_4,\r\n },\r\n];\r\n\r\nexport const MODE_SAVE_PRODUCT_CATEGORY_FORM = {\r\n add: {\r\n successMessage: Messages.addCategorySuccess,\r\n errorMessage: Messages.addCategoryFailed,\r\n apiService: categoryManagement.createCategory,\r\n },\r\n edit: {\r\n successMessage: Messages.editCategorySuccess,\r\n errorMessage: Messages.editCategoryFailed,\r\n apiService: categoryManagement.editCategory,\r\n },\r\n};\r\n\r\nexport const LOADING_TYPE = {\r\n add: 'add',\r\n edit: 'edit',\r\n delete: 'delete',\r\n download: 'download',\r\n 'bulk-reassign': 'bulk-reassign',\r\n};\r\n","import { useEffect, useState } from 'react';\r\n\r\nimport { getCategoryTreeView } from 'services/categoryManagement';\r\nimport { sortCategories } from 'common/components/product-category-tree/utils';\r\nimport { mapDataToTree } from '../utils';\r\n\r\nexport const useGetProductCategoryTreeView = (\r\n memberId,\r\n visible,\r\n isPrefetching,\r\n setIsPrefetching\r\n) => {\r\n const [nestedCategory, setNestedCategory] = useState([]);\r\n const [status, setStatus] = useState('idle');\r\n\r\n useEffect(() => {\r\n if (!isPrefetching) return;\r\n\r\n if (memberId && visible) {\r\n setStatus('loading');\r\n\r\n getCategoryTreeView({ memberId })\r\n .then((res) => {\r\n if (res.isSuccess) {\r\n setStatus('success');\r\n\r\n const sortedTreeData = sortCategories(res.data.categories);\r\n setNestedCategory(\r\n sortedTreeData.map((categoryItem) =>\r\n mapDataToTree(categoryItem, null, null)\r\n )\r\n );\r\n setIsPrefetching && setIsPrefetching(false);\r\n } else {\r\n setStatus('error');\r\n setNestedCategory([]);\r\n }\r\n })\r\n .catch((err) => {\r\n setStatus('error');\r\n setNestedCategory([]);\r\n setIsPrefetching && setIsPrefetching(false);\r\n });\r\n }\r\n }, [memberId, visible, setIsPrefetching, isPrefetching]);\r\n\r\n return {\r\n nestedCategory,\r\n isLoading: status === 'loading',\r\n setNestedCategory,\r\n };\r\n};\r\n","import { getTargetNodesById } from 'common/components/product-category-tree/utils';\r\nimport {\r\n CATEGORY_LEVEL_4,\r\n CATEGORY_LEVEL_1,\r\n CATEGORY_LEVEL_2,\r\n CATEGORY_LEVEL_3,\r\n} from './constant';\r\n\r\nexport const isNotSupportMaximumLevel = (mode, nodeSelected) => {\r\n return mode === 'add' && nodeSelected?.categoryLevel === CATEGORY_LEVEL_4;\r\n};\r\n\r\nexport const allowResetModeWhenSelect = (info, mode) => {\r\n if (isNotSupportMaximumLevel(mode, info)) {\r\n return true;\r\n }\r\n\r\n if (!info && mode === 'edit') {\r\n return true;\r\n }\r\n\r\n return false;\r\n};\r\n\r\nexport const findCategoryNodeById = (id, tree) => {\r\n let categoryItem = null;\r\n\r\n for (let i = 0; i < tree.length; i++) {\r\n if (tree[i].id === id) {\r\n categoryItem = tree[i];\r\n break;\r\n } else if (tree[i]?.children?.length > 0) {\r\n categoryItem = findCategoryNodeById(id, tree[i]?.children);\r\n }\r\n\r\n if (categoryItem) {\r\n return categoryItem;\r\n }\r\n }\r\n return categoryItem;\r\n};\r\n\r\nexport const getParentKey = (key, tree) => {\r\n let parentKey;\r\n for (let i = 0; i < tree.length; i++) {\r\n const node = tree[i];\r\n if (node.children.length) {\r\n if (node.children.some((item) => item.key === key)) {\r\n parentKey = node.key;\r\n } else if (getParentKey(key, node.children)) {\r\n parentKey = getParentKey(key, node.children);\r\n }\r\n }\r\n }\r\n return parentKey;\r\n};\r\n\r\nexport const getParentNode = (key, tree) => {\r\n let parentNode;\r\n for (let i = 0; i < tree.length; i++) {\r\n const node = tree[i];\r\n if (node.children.length) {\r\n if (node.children.some((item) => item.key === key)) {\r\n parentNode = node;\r\n } else if (getParentKey(key, node.children)) {\r\n parentNode = getParentNode(key, node.children);\r\n }\r\n }\r\n }\r\n return parentNode;\r\n};\r\n\r\nexport const getKeyExpanded = (treeData) => {\r\n const keyExpanded = [];\r\n const traverseTree = (tree) => {\r\n for (let i = 0; i < tree.length; i++) {\r\n const node = tree[i];\r\n if (!node.isLeaf) {\r\n keyExpanded.push(node.key);\r\n }\r\n if (node.children) {\r\n traverseTree(node.children);\r\n }\r\n }\r\n };\r\n traverseTree(treeData);\r\n return keyExpanded;\r\n};\r\n\r\nexport const getListKeySearch = (keySearch, searchText, tree) => {\r\n for (let i = 0; i < tree.length; i++) {\r\n if (tree[i].key.toLowerCase().includes(searchText.toLowerCase())) {\r\n keySearch.push(tree[i].key);\r\n }\r\n if (tree[i].children) {\r\n getListKeySearch(keySearch, searchText, tree[i].children);\r\n }\r\n }\r\n};\r\n\r\nconst convertParentPath = (parent, current) => {\r\n if (parent === null) return current.toString();\r\n return `${parent}-${current}`;\r\n};\r\n\r\nexport const mapDataToTree = (data, parent_path_id, parent_path_name) => {\r\n if (!data.children.length) {\r\n return {\r\n ...data,\r\n title: data.categoryName,\r\n titleValue: data.categoryName,\r\n namePath: convertParentPath(parent_path_name, data.categoryName),\r\n key: convertParentPath(parent_path_id, data.id),\r\n categoryLevel: convertParentPath(parent_path_id, data.id)\r\n .toString()\r\n .split('-').length,\r\n isLeaf: !data.children.length,\r\n children: data.children,\r\n };\r\n }\r\n if (Array.isArray(data.children)) {\r\n const key = convertParentPath(parent_path_id, data.id);\r\n const namePath = convertParentPath(parent_path_name, data.categoryName);\r\n const children = data.children.map((d) => mapDataToTree(d, key, namePath));\r\n return {\r\n ...data,\r\n title: data.categoryName,\r\n titleValue: data.categoryName,\r\n key,\r\n namePath,\r\n categoryLevel: key.toString().split('-').length,\r\n isLeaf: false,\r\n children,\r\n };\r\n }\r\n};\r\n\r\nexport const generateIdsBySelectedKey = (key) => {\r\n if (key) return key.split('-').map((item) => Number(item));\r\n return [];\r\n};\r\n\r\nexport const getCategoryObjectWhenSelectNode = (nestedCategory, nodeFound) => {\r\n const { key, categoryLevel } = nodeFound || {};\r\n const idList = generateIdsBySelectedKey(key);\r\n\r\n let nodeList = getTargetNodesById(nestedCategory, idList);\r\n\r\n const fieldsValues = {\r\n category1: nodeList?.[0]?.categoryName,\r\n category2: categoryLevel >= 2 ? nodeList?.[1].categoryName : undefined,\r\n category3: categoryLevel >= 3 ? nodeList?.[2].categoryName : undefined,\r\n category4: categoryLevel === 4 ? nodeList?.[3].categoryName : undefined,\r\n };\r\n return fieldsValues;\r\n};\r\n\r\nconst checkFormValueSelectedNodeEqualFormUserInputWhenEdit = (\r\n formUserInput,\r\n nestedCategory,\r\n nodeFound\r\n) => {\r\n const fieldValuesOfNodeSelected = getCategoryObjectWhenSelectNode(\r\n nestedCategory,\r\n nodeFound\r\n );\r\n\r\n return (\r\n JSON.stringify(formUserInput) === JSON.stringify(fieldValuesOfNodeSelected)\r\n );\r\n};\r\n\r\nexport const getCategoryLevelByKey = (categoryFormInput, categoryKey) => {\r\n const categoryFormItem = categoryFormInput.find(\r\n (item) => item.name === categoryKey\r\n );\r\n return categoryFormItem?.level;\r\n};\r\n\r\nexport const mapObjectFormValueToArrayFormValue = (\r\n categoryFormInput,\r\n valueForm\r\n) => {\r\n return Object.entries(valueForm)\r\n .filter(([_, value]) => {\r\n return value?.trim();\r\n })\r\n .map(([key, value]) => {\r\n const level = getCategoryLevelByKey(categoryFormInput, key.toString());\r\n\r\n return { categoryName: value.trim(), level };\r\n });\r\n};\r\n\r\nexport const getCategoryItemByLevel = (categoryFormInput, valueForm, level) => {\r\n const arrValueMappingForm = mapObjectFormValueToArrayFormValue(\r\n categoryFormInput,\r\n valueForm\r\n );\r\n return arrValueMappingForm.find((item) => item.level === level);\r\n};\r\n\r\nexport const checkExistNamePathInCategory = (path, tree) => {\r\n if (!path) return null;\r\n\r\n let categoryItem = null;\r\n\r\n for (let i = 0; i < tree.length; i++) {\r\n if (tree[i].namePath === path) {\r\n return true;\r\n } else if (tree[i]?.children?.length > 0) {\r\n categoryItem = checkExistNamePathInCategory(path, tree[i]?.children);\r\n }\r\n\r\n if (categoryItem) return true;\r\n }\r\n return categoryItem;\r\n};\r\n\r\nexport const checkIsMissingCategoryParent = (formValue) => {\r\n const formValueList = Object.values(formValue);\r\n\r\n for (let i = formValueList.length - 1; i >= 1; i--) {\r\n if (formValueList[i] && !formValueList[i - 1]) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n};\r\n\r\nconst checkNameAlreadyExistInSignleTree = (nodeSelected, valueEdited) => {\r\n for (let i = 0; i < nodeSelected.length; i++) {\r\n if (nodeSelected[i].categoryName === valueEdited) {\r\n return true;\r\n }\r\n\r\n if (nodeSelected[i].children.length) {\r\n const isExistName = checkNameAlreadyExistInSignleTree(\r\n nodeSelected[i].children,\r\n valueEdited\r\n );\r\n\r\n if (isExistName) return isExistName;\r\n }\r\n }\r\n};\r\n\r\nexport const checkIsDuplicateValue = (nodeSelected, formValue) => {\r\n const formValueList = Object.values(formValue).filter((item) => item);\r\n const isDuplicateValueForm =\r\n new Set(formValueList).size !== formValueList.length;\r\n\r\n const valueEdited = formValueList[formValueList.length - 1]?.trim();\r\n\r\n if (!nodeSelected) {\r\n return isDuplicateValueForm;\r\n }\r\n\r\n const isNameAlreadyExist = checkNameAlreadyExistInSignleTree(\r\n [nodeSelected],\r\n valueEdited\r\n );\r\n\r\n return isDuplicateValueForm || isNameAlreadyExist;\r\n};\r\n\r\nexport const autoFocusInput = (mode, nodeSelected, getMap) => {\r\n const isNotSupportLevel = isNotSupportMaximumLevel(mode, nodeSelected);\r\n const isCancelAutoFocus =\r\n isNotSupportLevel || !mode || (!nodeSelected && mode === 'edit');\r\n\r\n if (isCancelAutoFocus) {\r\n return;\r\n }\r\n\r\n const map = getMap();\r\n\r\n if (!nodeSelected) {\r\n map.get(CATEGORY_LEVEL_1).focus();\r\n return;\r\n }\r\n\r\n const level =\r\n mode === 'edit'\r\n ? nodeSelected.categoryLevel\r\n : nodeSelected.categoryLevel + 1;\r\n\r\n const node = map.get(level);\r\n\r\n node.focus();\r\n};\r\n\r\nexport const checkIsShowMessageInValidCategory = (\r\n pathName,\r\n nestedCategory,\r\n valueForm,\r\n nodeSelected,\r\n categoryValue,\r\n mode\r\n) => {\r\n const isExistCategory = checkExistNamePathInCategory(\r\n pathName,\r\n nestedCategory\r\n );\r\n const isValueOfNodeSelectedEqualFormUserInput = checkFormValueSelectedNodeEqualFormUserInputWhenEdit(\r\n valueForm,\r\n nestedCategory,\r\n nodeSelected\r\n );\r\n\r\n if (isValueOfNodeSelectedEqualFormUserInput) return false;\r\n\r\n const isMissingParentCategory = checkIsMissingCategoryParent(valueForm);\r\n const isDuplicateValue = checkIsDuplicateValue(nodeSelected, valueForm);\r\n if (isMissingParentCategory) {\r\n return 'missingParentCategoryLevelMessage';\r\n }\r\n if (mode === 'edit' && !categoryValue) {\r\n return 'valueBlankMessage';\r\n }\r\n if (isExistCategory) {\r\n return 'existCategoryNameMessage';\r\n }\r\n if (isDuplicateValue) {\r\n return 'duplicateCategoryMessage';\r\n }\r\n\r\n return false;\r\n};\r\n\r\nexport const getPathByFormValue = (formValue) => {\r\n if (!formValue) return;\r\n return Object.values(formValue)\r\n .filter((item) => item)\r\n .join('-');\r\n};\r\n\r\nexport const findCategoryNodeByPathName = (path, tree) => {\r\n if (!path) return null;\r\n\r\n let categoryItem = null;\r\n\r\n for (let i = 0; i < tree.length; i++) {\r\n if (tree[i].namePath === path) {\r\n categoryItem = tree[i];\r\n break;\r\n } else if (tree[i]?.children?.length > 0) {\r\n categoryItem = findCategoryNodeByPathName(path, tree[i]?.children);\r\n }\r\n\r\n if (categoryItem) {\r\n return categoryItem;\r\n }\r\n }\r\n return categoryItem;\r\n};\r\n\r\nexport const generateCategoryIdForm = (idList) => {\r\n if (!idList) return null;\r\n let params = {};\r\n\r\n for (let i = 0; i < idList.length; i++) {\r\n params[`category${i + 1}Id`] = Number(idList[i]);\r\n }\r\n return params;\r\n};\r\n\r\nexport const generateCategoryIdByKey = (key) => {\r\n return key.split('-').map((item) => Number(item));\r\n};\r\n\r\nexport const getCategoryPath = (node) => {\r\n if (node.children.length === 0) {\r\n return node.categoryName;\r\n }\r\n const childCategoryPath = getCategoryPath(node.children[0]);\r\n return `${node.categoryName}-${childCategoryPath}`;\r\n};\r\n\r\nexport const checkEmptyChildCategoryInAddMode = (formValue) => {\r\n const formValueList = Object.values(formValue);\r\n\r\n let levelError = [];\r\n let maxLevelHasValue = null;\r\n for (let i = formValueList.length - 1; i >= 0; i--) {\r\n if (formValueList[i] && !formValueList[i - 1]) {\r\n maxLevelHasValue = i;\r\n break;\r\n }\r\n }\r\n if (!maxLevelHasValue) return null;\r\n for (let k = maxLevelHasValue; k >= 0; k--) {\r\n if (!formValueList[k]) {\r\n const level = k + 1;\r\n levelError.push(level);\r\n }\r\n }\r\n return levelError;\r\n};\r\n\r\nexport const resetFieldError = (form) => {\r\n const fieldEmptyErrorMapping = [\r\n CATEGORY_LEVEL_1,\r\n CATEGORY_LEVEL_2,\r\n CATEGORY_LEVEL_3,\r\n CATEGORY_LEVEL_4,\r\n ].map((item) => ({\r\n name: `category${item}`,\r\n errors: [],\r\n }));\r\n form.setFields(fieldEmptyErrorMapping);\r\n};\r\n","import { useState, useEffect, useMemo, useCallback } from 'react';\r\n\r\nimport { useAsync, useFetch } from 'hooks';\r\n\r\nimport {\r\n getInteropConnections,\r\n getDropboxCallbackService,\r\n testInteropConnection,\r\n getListConnections,\r\n} from 'services/interoperability';\r\n\r\nimport {\r\n getListStatusInterop,\r\n saveAuthDataIntoLocalStorage,\r\n removeInteropLocalStorage,\r\n AUTH_DATA_KEY,\r\n} from './utils';\r\n\r\nimport { CustomNotification } from 'common/components';\r\nimport { useGetMemberId } from 'hooks/useGetMemberId';\r\n\r\nexport const useVisibleModal = () => {\r\n const [visible, setVisible] = useState(false);\r\n\r\n const handler = useMemo(\r\n () => ({\r\n onModal: () => setVisible(true),\r\n offModal: () => setVisible(false),\r\n toggle: () => setVisible((modal) => !modal),\r\n }),\r\n []\r\n );\r\n\r\n return [visible, handler];\r\n};\r\n\r\nconst PAGE_SIZE = 9999;\r\nconst PAGE_INDEX = 1;\r\n\r\nexport const useGetInteropConnections = () => {\r\n const { data, run } = useAsync();\r\n\r\n const { memberId } = useGetMemberId();\r\n\r\n useEffect(() => {\r\n run(\r\n getInteropConnections({\r\n pageSize: PAGE_SIZE,\r\n pageIndex: PAGE_INDEX,\r\n memberId,\r\n })\r\n );\r\n }, [memberId, run]);\r\n\r\n const refetchDropboxConnections = useCallback(() => {\r\n run(\r\n getInteropConnections({\r\n pageSize: PAGE_SIZE,\r\n pageIndex: PAGE_INDEX,\r\n memberId,\r\n })\r\n );\r\n }, [memberId, run]);\r\n\r\n return {\r\n interoperabilities: data?.gridData ?? [],\r\n refetchDropboxConnections,\r\n };\r\n};\r\n\r\nexport const useGetListConnections = ({ storageServiceType }) => {\r\n const { data, run } = useAsync();\r\n\r\n const { memberId } = useGetMemberId();\r\n\r\n useEffect(() => {\r\n run(\r\n getListConnections({\r\n pageSize: PAGE_SIZE,\r\n pageIndex: PAGE_INDEX,\r\n storageServiceType,\r\n })\r\n );\r\n }, [memberId, run, storageServiceType]);\r\n\r\n return {\r\n interoperabilities: data?.gridData ?? [],\r\n };\r\n};\r\n\r\nexport const useGetInteropParams = ({\r\n isEnabled,\r\n code,\r\n stateInterop,\r\n formInstance,\r\n forceRender,\r\n}) => {\r\n const { data, status, resetData, run } = useAsync();\r\n const isAuthenticated = status === 'resolved';\r\n\r\n useEffect(() => {\r\n if (data?.authData && data?.state && isEnabled) {\r\n const { AccessToken: accessToken } = JSON.parse(data.authData);\r\n formInstance.setFieldsValue({\r\n accessToken,\r\n status: 'Connected',\r\n });\r\n forceRender();\r\n saveAuthDataIntoLocalStorage(data.authData, data.state);\r\n }\r\n }, [data, forceRender, formInstance, isEnabled]);\r\n\r\n useEffect(() => {\r\n if (!isEnabled) return;\r\n\r\n // Prevent calling multiple times api when switching other tabs\r\n if (isAuthenticated) return;\r\n\r\n const fetchDropboxParamsCb = async () => {\r\n return await getDropboxCallbackService({\r\n code,\r\n state: stateInterop,\r\n });\r\n };\r\n\r\n run(fetchDropboxParamsCb());\r\n }, [code, isAuthenticated, isEnabled, run, stateInterop]);\r\n\r\n return {\r\n isAuthenticating: status === 'pending',\r\n isAuthenticated,\r\n authData: data?.authData ?? null,\r\n state: data?.state,\r\n status: data?.status,\r\n resetStateAuthentication: () => resetData(),\r\n };\r\n};\r\n\r\n// Track active state when switching between tab. Use for the authentication\r\nexport const useTabActive = () => {\r\n const [visibilityState, setVisibilityState] = useState(true);\r\n\r\n const handleVisibilityChange = useCallback(() => {\r\n setVisibilityState(document.visibilityState === 'visible');\r\n }, []);\r\n\r\n useEffect(() => {\r\n document.addEventListener('visibilitychange', handleVisibilityChange);\r\n return () => {\r\n document.removeEventListener('visibilitychange', handleVisibilityChange);\r\n };\r\n }, [handleVisibilityChange]);\r\n\r\n return visibilityState;\r\n};\r\n\r\nexport const useFocusPage = () => {\r\n const [tabHasFocus, setTabHasFocus] = useState(true);\r\n\r\n useEffect(() => {\r\n const handleFocus = () => {\r\n setTabHasFocus(true);\r\n };\r\n\r\n const handleBlur = () => {\r\n setTabHasFocus(false);\r\n };\r\n\r\n window.addEventListener('focus', handleFocus);\r\n window.addEventListener('blur', handleBlur);\r\n\r\n return () => {\r\n window.removeEventListener('focus', handleFocus);\r\n window.removeEventListener('blur', handleBlur);\r\n };\r\n }, []);\r\n\r\n return tabHasFocus;\r\n};\r\n\r\n// Check status of list connection\r\nexport const useCheckStatusConnections = (interop) => {\r\n const { data, status: statusFetching, run } = useFetch();\r\n\r\n useEffect(() => {\r\n const getStatusInteropCb = () => {\r\n return getListStatusInterop(interop);\r\n };\r\n run(getStatusInteropCb());\r\n }, [interop, run]);\r\n\r\n return {\r\n statusConnections:\r\n data?.map((result) => ({\r\n statusResponse: result.status,\r\n statusConnection: result.value.message,\r\n id: result?.value.data?.id,\r\n })) ?? [],\r\n\r\n isAuthenticating: statusFetching === 'pending',\r\n };\r\n};\r\n\r\n// Only check on edit mode\r\nexport const useCheckStatusConnection = ({\r\n isEnabled,\r\n selectedInterop,\r\n formInstance,\r\n forceRender,\r\n}) => {\r\n const { data, status, resetData, run } = useFetch();\r\n const isError =\r\n status === 'rejected' ||\r\n data?.isSuccess === false ||\r\n data?.message?.toLowerCase() === 'disconnected';\r\n\r\n const isConnected =\r\n status === 'resolved' &&\r\n data?.isSuccess &&\r\n data?.message?.toLowerCase() === 'connected';\r\n\r\n useEffect(() => {\r\n if (isEnabled) {\r\n const params = {\r\n id: selectedInterop.id,\r\n storageServiceType: selectedInterop.storageServiceType,\r\n authData: selectedInterop.authData,\r\n };\r\n run(testInteropConnection(params));\r\n }\r\n }, [selectedInterop, run, isEnabled]);\r\n\r\n // Save authData into localStorage for editing and testing the interop\r\n useEffect(() => {\r\n if (isEnabled && isConnected) {\r\n const { authData } = selectedInterop;\r\n const parseAuthData = JSON.parse(authData);\r\n\r\n formInstance.setFieldsValue({\r\n ...formInstance.getFieldsValue(),\r\n status: 'Connected',\r\n });\r\n\r\n localStorage.setItem(\r\n AUTH_DATA_KEY,\r\n JSON.stringify({ authData: parseAuthData, state: null })\r\n );\r\n }\r\n }, [isConnected, isEnabled, selectedInterop]);\r\n\r\n // reset data form when authentication is error\r\n useEffect(() => {\r\n if (isEnabled && isError) {\r\n formInstance.setFieldsValue({\r\n accessToken: null,\r\n status: null,\r\n });\r\n CustomNotification.error(\r\n 'The connection has been disconnected. Please authorize your account to connect!'\r\n );\r\n forceRender();\r\n removeInteropLocalStorage();\r\n }\r\n }, [forceRender, formInstance, isEnabled, isError]);\r\n\r\n return {\r\n isCheckingStatus: status === 'pending',\r\n isError,\r\n isConnected,\r\n resetStatusConnection: () => resetData(),\r\n };\r\n};\r\n","import React from 'react';\r\nimport dropbox from 'assets/system/dropbox.png';\r\n\r\nimport {\r\n CloudSyncOutlined,\r\n CheckCircleOutlined,\r\n WarningOutlined,\r\n LoadingOutlined,\r\n} from '@ant-design/icons';\r\n\r\nimport * as interoperabilityServices from 'services/interoperability';\r\n\r\nexport const filterImage = (type) => {\r\n switch (type?.toLowerCase()) {\r\n case 'dropbox':\r\n return dropbox;\r\n default:\r\n return '';\r\n }\r\n};\r\n\r\n// export const openNewTabUrl = (url) => window.open(url, '_blank');\r\nexport const openNewTabUrl = (url) =>\r\n window.open(\r\n url,\r\n 'popUpWindow',\r\n 'height=700,width=700,left=50,top=50,resizable=yes,scrollbars=yes,toolbar=yes,menubar=no,location=yes,directories=no,status=yes'\r\n );\r\n\r\nexport const AUTH_DATA_KEY = 'interop_auth_data';\r\n\r\nexport const saveAuthDataIntoLocalStorage = (authDatStringify, state) => {\r\n const parseAuthData = JSON.parse(authDatStringify);\r\n\r\n localStorage.setItem(\r\n AUTH_DATA_KEY,\r\n JSON.stringify({ authData: parseAuthData, state })\r\n );\r\n};\r\n\r\nexport const getInteropAuthDataFromLocalStorage = () => {\r\n const stringifyAuthData = localStorage.getItem(AUTH_DATA_KEY);\r\n\r\n if (!stringifyAuthData) {\r\n return {\r\n authData: null,\r\n state: null,\r\n };\r\n }\r\n return JSON.parse(stringifyAuthData);\r\n};\r\n\r\nexport const removeInteropLocalStorage = () => {\r\n localStorage.removeItem(AUTH_DATA_KEY);\r\n localStorage.removeItem(INTEROP_KEY);\r\n};\r\n\r\nexport const getParamsDropboxCallback = async (code, state) => {\r\n try {\r\n const response = await interoperabilityServices.getDropboxCallbackService({\r\n code,\r\n state,\r\n });\r\n\r\n if (response?.isSuccess && response?.data) {\r\n return await response.data;\r\n } else {\r\n return null;\r\n }\r\n } catch (error) {\r\n return null;\r\n }\r\n};\r\n\r\nexport const INTEROP_KEY = 'interop_key';\r\n\r\nexport const getParamsDropboxCallbackFromLocalStorage = () => {\r\n const stringifyInteropParams = localStorage.getItem(INTEROP_KEY);\r\n\r\n if (!stringifyInteropParams) return {};\r\n\r\n const { code, state, status } = JSON.parse(stringifyInteropParams) ?? {};\r\n\r\n return {\r\n code,\r\n stateInterop: state,\r\n status,\r\n };\r\n};\r\n\r\nconst getAuthInfo = async (id) => {\r\n return await interoperabilityServices.getDetailInteropConnection({ id });\r\n};\r\n\r\nconst checkStatusConnection = async (params) => {\r\n return await interoperabilityServices.testInteropConnection(params);\r\n};\r\n\r\nconst getListPromiseStatusConnection = (data) => {\r\n let promises = [];\r\n\r\n data.forEach((authInfo) => {\r\n promises.push(\r\n checkStatusConnection({\r\n id: authInfo.id,\r\n storageServiceType: authInfo.storageServiceType,\r\n authData: authInfo.authData,\r\n })\r\n );\r\n });\r\n\r\n return promises;\r\n};\r\n\r\nconst getListPromiseAuthInfo = (authInfoList) => {\r\n let promises = [];\r\n\r\n authInfoList.forEach((id) => {\r\n promises.push(getAuthInfo(id));\r\n });\r\n\r\n return promises;\r\n};\r\n\r\nexport const getListAuthInfoInterop = async (ids) => {\r\n const promisesAuthInfo = getListPromiseAuthInfo(ids);\r\n\r\n return await Promise.allSettled(promisesAuthInfo);\r\n};\r\n\r\nexport const getListStatusInterop = async (interop) => {\r\n const ids = interop.map((item) => item.id);\r\n\r\n const response = await getListAuthInfoInterop(ids);\r\n\r\n const authInfoList = response?.map((result) => result.value.data);\r\n\r\n const promisesStatusInterop = getListPromiseStatusConnection(authInfoList);\r\n\r\n return await Promise.allSettled(promisesStatusInterop);\r\n};\r\n\r\nexport const getIconTestConnection = (status) => {\r\n if (status === 'loading') return ;\r\n if (status === 'connected') return ;\r\n if (status === 'disconnected') return ;\r\n return ;\r\n};\r\n\r\nexport const getTextTestConnection = (status) => {\r\n if (status === 'loading') return 'Loading...';\r\n if (status === 'disconnected') return 'Fail connection';\r\n if (status === 'connected') return 'Connected';\r\n return 'Test Connection';\r\n};\r\n\r\nexport const getInitFormValues = ({\r\n isEditMode,\r\n selectedInterop,\r\n authData,\r\n}) => {\r\n if (isEditMode && selectedInterop) {\r\n const {\r\n status,\r\n storageServiceName: connectionName,\r\n storageServiceType: connectionType,\r\n } = selectedInterop;\r\n\r\n const { AccessToken: accessToken } =\r\n JSON.parse(selectedInterop?.authData) ?? {};\r\n\r\n return {\r\n connectionName,\r\n connectionType,\r\n accessToken,\r\n status,\r\n };\r\n } else {\r\n // Not authenticated\r\n if (!authData) return {};\r\n\r\n const { AccessToken: accessToken } = JSON.parse(authData);\r\n return {\r\n accessToken,\r\n status: 'Connected',\r\n };\r\n }\r\n};\r\n","import * as types from './constants';\r\n\r\n/**\r\n * Get member profile data\r\n *\r\n * @param {object} data member profile\r\n */\r\nexport function getMemberProfileHeader(MemberId) {\r\n return {\r\n type: types.GET_MEMBER_PENDING,\r\n MemberId,\r\n };\r\n}\r\n\r\nexport function getMemberProfileNoPermission(payload) {\r\n return {\r\n type: types.MEMBER_PROFILE_NO_PERMISSION,\r\n payload,\r\n };\r\n}\r\n\r\n/**\r\n * Loading member profile data to store\r\n *\r\n * @param {object} data member profile\r\n *\r\n */\r\nexport function loadMemberProfile(data) {\r\n return {\r\n type: types.GET_MEMBER_SUCCESS,\r\n data,\r\n };\r\n}\r\n\r\n/**\r\n * Set member profile data error\r\n *\r\n * @param {object} data member profile\r\n *\r\n */\r\nexport function errorMemberProfile(error) {\r\n return {\r\n type: types.GET_MEMBER_ERROR,\r\n error,\r\n };\r\n}\r\n\r\n/**\r\n * Get member contact history data\r\n *\r\n * @param {object} data member contact history\r\n */\r\nexport function getMemberContactHistory(payload) {\r\n return {\r\n type: types.GET_MEMBER_CONTACT_HISTORY,\r\n payload,\r\n };\r\n}\r\n\r\n/**\r\n * Loading member contact history data to store\r\n *\r\n * @param {object} data member contact history success\r\n *\r\n */\r\nexport function getMemberContactHistorySuccess(data) {\r\n return {\r\n type: types.GET_MEMBER_CONTACT_HISTORY_SUCCESS,\r\n data,\r\n };\r\n}\r\n\r\n/**\r\n * Set member contact history data error\r\n *\r\n * @param {object} data member contact history error\r\n *\r\n */\r\nexport function getMemberContactHistoryError(error) {\r\n return {\r\n type: types.GET_MEMBER_CONTACT_HISTORY_ERROR,\r\n error,\r\n };\r\n}\r\n\r\nexport function fetchMemberDocument(payload) {\r\n return {\r\n type: types.FETCH_MEMBER_OVERVIEW_DOCUMENT,\r\n payload,\r\n };\r\n}\r\n\r\nexport function fetchMemberDocumentSuccess(data) {\r\n return {\r\n type: types.FETCH_MEMBER_OVERVIEW_DOCUMENT_SUCCESS,\r\n data,\r\n };\r\n}\r\n\r\nexport function fetchMemberDocumentError(error) {\r\n return {\r\n type: types.FETCH_MEMBER_OVERVIEW_DOCUMENT_ERROR,\r\n error,\r\n };\r\n}\r\n\r\n/******************************************************************** */\r\n/* ******************* Grid Columns Actions ************************ */\r\n/******************************************************************** */\r\nexport function gridColumnMemberContact(gridName, MemberId) {\r\n return {\r\n type: types.GET_MEMBER_CONTACT_GRID,\r\n gridName,\r\n MemberId,\r\n };\r\n}\r\n\r\nexport function gridColumnMemberContactSuccess(columns) {\r\n return {\r\n type: types.GET_MEMBER_CONTACT_GRID_SUCCESS,\r\n columns,\r\n };\r\n}\r\n\r\nexport function gridColumnMemberContactError(error) {\r\n return {\r\n type: types.GET_MEMBER_CONTACT_GRID_ERROR,\r\n error,\r\n };\r\n}\r\n\r\nexport function gridColumnContactLocation(gridName, MemberId) {\r\n return {\r\n type: types.GET_CONTACT_LOCATION_GRID,\r\n gridName,\r\n MemberId,\r\n };\r\n}\r\n\r\nexport function gridColumnContactLocationSuccess(columns) {\r\n return {\r\n type: types.GET_CONTACT_LOCATION_GRID_SUCCESS,\r\n columns,\r\n };\r\n}\r\n\r\nexport function gridColumnContactLocationError(error) {\r\n return {\r\n type: types.GET_CONTACT_LOCATION_GRID_ERROR,\r\n error,\r\n };\r\n}\r\n\r\nexport function gridColumnMemberBilling(gridName, MemberId) {\r\n return {\r\n type: types.GET_MEMBER_BILLING_GRID,\r\n gridName,\r\n MemberId,\r\n };\r\n}\r\n\r\nexport function gridColumnMemberBillingSuccess(columns) {\r\n return {\r\n type: types.GET_MEMBER_BILLING_GRID_SUCCESS,\r\n columns,\r\n };\r\n}\r\n\r\nexport function gridColumnMemberBillingError(error) {\r\n return {\r\n type: types.GET_MEMBER_BILLING_GRID_ERROR,\r\n error,\r\n };\r\n}\r\n\r\nexport function gridColumnActivityLog(gridName, MemberId) {\r\n return {\r\n type: types.GET_MEMBER_ACTIVITY_LOG_GRID,\r\n gridName,\r\n MemberId,\r\n };\r\n}\r\n\r\nexport function gridColumnActivityLogSuccess(columns) {\r\n return {\r\n type: types.GET_MEMBER_ACTIVITY_LOG_GRID_SUCCESS,\r\n columns,\r\n };\r\n}\r\n\r\nexport function gridColumnActivityLogError(error) {\r\n return {\r\n type: types.GET_MEMBER_ACTIVITY_LOG_GRID_ERROR,\r\n error,\r\n };\r\n}\r\n\r\nexport function gridColumnMemberContactHistory(gridName) {\r\n return {\r\n type: types.GET_MEMBER_CONTACT_HISTORY_GRID,\r\n gridName,\r\n };\r\n}\r\n\r\nexport function gridColumnMemberContactHistorySuccess(columns) {\r\n return {\r\n type: types.GET_MEMBER_CONTACT_HISTORY_GRID_SUCCESS,\r\n columns,\r\n };\r\n}\r\n\r\nexport function gridColumnMemberContactHistoryError(error) {\r\n return {\r\n type: types.GET_MEMBER_CONTACT_HISTORY_GRID_ERROR,\r\n error,\r\n };\r\n}\r\n\r\n//* toggle upload media box\r\nexport function toggleUploadTagLineMedia(status) {\r\n return {\r\n type: types.TOGGLE_TAG_LINE_UPLOAD_MEDIA,\r\n status,\r\n };\r\n}\r\n\r\n//* toggle upload media box PREVIEW\r\nexport function togglePreviewUploadTagLineMedia(status) {\r\n return {\r\n type: types.TOGGLE_PREVIEW_TAG_LINE_UPLOAD_MEDIA,\r\n status,\r\n };\r\n}\r\n//* show upload media box\r\nexport function showUploadTagLineMedia(status) {\r\n return {\r\n type: types.IS_SHOW_LINE_UPLOAD_MEDIA,\r\n status,\r\n };\r\n}\r\n\r\nexport function getMemberShortDetailPreview(id) {\r\n return {\r\n type: types.GET_MEMBER_SHORT_DETAIL_PREVIEW,\r\n id,\r\n };\r\n}\r\n\r\nexport function getMemberShortDetailPreviewSuccess(data) {\r\n return {\r\n type: types.GET_MEMBER_SHORT_DETAIL_PREVIEW_SUCCESS,\r\n data,\r\n };\r\n}\r\n\r\nexport function getMemberShortDetailPreviewError(error) {\r\n return {\r\n type: types.GET_MEMBER_SHORT_DETAIL_PREVIEW_ERROR,\r\n error,\r\n };\r\n}\r\n\r\nexport function gridColumnPublicContact(gridName) {\r\n return {\r\n type: types.GET_PUBLIC_CONTACT_COLUMN,\r\n gridName,\r\n };\r\n}\r\n\r\nexport function gridColumnPublicContactSuccess(columns) {\r\n return {\r\n type: types.GET_PUBLIC_CONTACT_COLUMN_SUCCESS,\r\n columns,\r\n };\r\n}\r\n\r\nexport function gridColumnPublicContactError(error) {\r\n return {\r\n type: types.GET_PUBLIC_CONTACT_COLUMN_ERROR,\r\n error,\r\n };\r\n}\r\n\r\nexport function getPublicContact(memberId) {\r\n return {\r\n type: types.GET_PUBLIC_CONTACT,\r\n memberId,\r\n };\r\n}\r\n\r\nexport function getPublicContactSuccess(data) {\r\n return {\r\n type: types.GET_PUBLIC_CONTACT_SUCCESS,\r\n data,\r\n };\r\n}\r\n\r\nexport function getPublicContactError(error) {\r\n return {\r\n type: types.GET_PUBLIC_CONTACT_ERROR,\r\n error,\r\n };\r\n}\r\n\r\nexport function updatePublicContact(data) {\r\n return {\r\n type: types.UPDATE_PUBLIC_CONTACT,\r\n data,\r\n };\r\n}\r\n\r\nexport function getMemberContacts(params) {\r\n return {\r\n type: types.GET_MEMBER_CONTACTS,\r\n params,\r\n };\r\n}\r\n\r\nexport function getMemberContactsSuccess(data) {\r\n return {\r\n type: types.GET_MEMBER_CONTACTS_SUCCESS,\r\n data,\r\n };\r\n}\r\n\r\nexport function getMemberContactsError(error) {\r\n return {\r\n type: types.GET_MEMBER_CONTACTS_ERROR,\r\n error,\r\n };\r\n}\r\n\r\n// get member brands\r\n\r\nexport function getMemberBrands(params) {\r\n return {\r\n type: types.GET_MEMBER_OVERVIEW_BRANDS,\r\n params,\r\n };\r\n}\r\n\r\nexport function getMemberBrandsSuccess(data) {\r\n return {\r\n type: types.GET_MEMBER_OVERVIEW_BRANDS_SUCCESS,\r\n data,\r\n };\r\n}\r\n\r\nexport function getMemberBrandsError(error) {\r\n return {\r\n type: types.GET_MEMBER_OVERVIEW_BRANDS_ERROR,\r\n error,\r\n };\r\n}\r\n\r\n// get information sheet\r\nexport function getMemberInformationSheet(params) {\r\n return {\r\n type: types.GET_MEMBER_INFORMATION_SHEET,\r\n params,\r\n };\r\n}\r\n\r\nexport function getMemberInformationSheetSuccess(data) {\r\n return {\r\n type: types.GET_MEMBER_INFORMATION_SHEET_SUCCESS,\r\n data,\r\n };\r\n}\r\n\r\nexport function getMemberInformationSheetError(error) {\r\n return {\r\n type: types.GET_MEMBER_INFORMATION_SHEET_ERROR,\r\n error,\r\n };\r\n}\r\n\r\nexport function documentDetailColumnInfo(gridName) {\r\n return {\r\n type: types.DOCUMENT_DETAIL_COLUMN_INFO,\r\n gridName,\r\n };\r\n}\r\n\r\nexport function documentDetailColumnInfoSuccess(columns) {\r\n return {\r\n type: types.DOCUMENT_DETAIL_COLUMN_INFO_SUCCESS,\r\n columns,\r\n };\r\n}\r\n\r\nexport function documentDetailColumnInfoError(error) {\r\n return {\r\n type: types.DOCUMENT_DETAIL_COLUMN_INFO_ERROR,\r\n };\r\n}\r\n\r\nexport function getDocumentDetail(dataParams) {\r\n return {\r\n type: types.GET_DOCUMENT_DETAIL,\r\n dataParams,\r\n };\r\n}\r\n\r\nexport function getDocumentDetailSuccess(data) {\r\n return {\r\n type: types.GET_DOCUMENT_DETAIL_SUCCESS,\r\n data,\r\n };\r\n}\r\n\r\nexport function getDocumentDetailError(error) {\r\n return {\r\n type: types.GET_DOCUMENT_DETAIL_ERROR,\r\n };\r\n}\r\n\r\nexport function deleteDocumentDetail(dataParams) {\r\n return {\r\n type: types.DELETE_DOCUMENT_DETAIL,\r\n dataParams,\r\n };\r\n}\r\n\r\nexport function deleteDocumentDetailError(error) {\r\n return {\r\n type: types.DELETE_DOCUMENT_DETAIL_ERROR,\r\n };\r\n}\r\n","// Action Types\r\nexport const GET_MEMBER_PENDING = 'GET_MEMBER_PENDING';\r\nexport const MEMBER_PROFILE_NO_PERMISSION = 'MEMBER_PROFILE_NO_PERMISSION';\r\nexport const GET_MEMBER_SUCCESS = 'GET_MEMBER_SUCCESS';\r\nexport const GET_MEMBER_ERROR = 'GET_MEMBER_ERROR';\r\n\r\nexport const FETCH_MEMBER_OVERVIEW_DOCUMENT = 'FETCH_MEMBER_OVERVIEW_DOCUMENT';\r\nexport const FETCH_MEMBER_OVERVIEW_DOCUMENT_SUCCESS =\r\n 'FETCH_MEMBER_OVERVIEW_DOCUMENT_SUCCESS';\r\nexport const FETCH_MEMBER_OVERVIEW_DOCUMENT_ERROR =\r\n 'FETCH_MEMBER_OVERVIEW_DOCUMENT_ERROR';\r\nexport const GET_MEMBER_CONTACT_HISTORY = 'GET_MEMBER_CONTACT_HISTORY';\r\nexport const GET_MEMBER_CONTACT_HISTORY_SUCCESS =\r\n 'GET_MEMBER_CONTACT_HISTORY_SUCCESS';\r\nexport const GET_MEMBER_CONTACT_HISTORY_ERROR =\r\n 'GET_MEMBER_CONTACT_HISTORY_ERROR';\r\n\r\n/**********************************************************************/\r\n/********************** Grid MEMBER COLUMN CONSTANTS ******************/\r\n/**********************************************************************/\r\nexport const GET_MEMBER_CONTACT_GRID = 'GET_MEMBER_CONTACT_GRID';\r\nexport const GET_MEMBER_CONTACT_GRID_SUCCESS =\r\n 'GET_MEMBER_CONTACT_GRID_SUCCESS';\r\nexport const GET_MEMBER_CONTACT_GRID_ERROR = 'GET_MEMBER_CONTACT_GRID_ERROR';\r\nexport const GET_CONTACT_LOCATION_GRID = 'GET_CONTACT_LOCATION_GRID';\r\nexport const GET_CONTACT_LOCATION_GRID_SUCCESS =\r\n 'GET_CONTACT_LOCATION_GRID_SUCCESS';\r\nexport const GET_CONTACT_LOCATION_GRID_ERROR =\r\n 'GET_CONTACT_LOCATION_GRID_ERROR';\r\nexport const GET_MEMBER_BILLING_GRID = 'GET_MEMBER_BILLING_GRID';\r\nexport const GET_MEMBER_BILLING_GRID_SUCCESS =\r\n 'GET_MEMBER_BILLING_GRID_SUCCESS';\r\nexport const GET_MEMBER_BILLING_GRID_ERROR = 'GET_MEMBER_BILLING_GRID_ERROR';\r\nexport const GET_MEMBER_ACTIVITY_LOG_GRID = 'GET_MEMBER_ACTIVITY_LOG_GRID';\r\nexport const GET_MEMBER_ACTIVITY_LOG_GRID_SUCCESS =\r\n 'GET_MEMBER_ACTIVITY_LOG_GRID_SUCCESS';\r\nexport const GET_MEMBER_ACTIVITY_LOG_GRID_ERROR =\r\n 'GET_MEMBER_ACTIVITY_LOG_GRID_ERROR';\r\nexport const GET_MEMBER_CONTACT_HISTORY_GRID =\r\n 'GET_MEMBER_CONTACT_HISTORY_GRID';\r\nexport const GET_MEMBER_CONTACT_HISTORY_GRID_SUCCESS =\r\n 'GET_MEMBER_CONTACT_HISTORY_GRID_SUCCESS';\r\nexport const GET_MEMBER_CONTACT_HISTORY_GRID_ERROR =\r\n 'GET_MEMBER_CONTACT_HISTORY_GRID_ERROR';\r\n\r\n// tag line upload media\r\nexport const TOGGLE_TAG_LINE_UPLOAD_MEDIA = 'TOGGLE_TAG_LINE_UPLOAD_MEDIA';\r\nexport const TOGGLE_PREVIEW_TAG_LINE_UPLOAD_MEDIA =\r\n 'TOGGLE_PREVIEW_TAG_LINE_UPLOAD_MEDIA';\r\nexport const IS_SHOW_LINE_UPLOAD_MEDIA = 'IS_SHOW_LINE_UPLOAD_MEDIA';\r\nexport const GET_MEMBER_SHORT_DETAIL_PREVIEW =\r\n 'GET_MEMBER_SHORT_DETAIL_PREVIEW';\r\nexport const GET_MEMBER_SHORT_DETAIL_PREVIEW_SUCCESS =\r\n 'GET_MEMBER_SHORT_DETAIL_PREVIEW_SUCCESS';\r\nexport const GET_MEMBER_SHORT_DETAIL_PREVIEW_ERROR =\r\n 'GET_MEMBER_SHORT_DETAIL_PREVIEW_ERROR';\r\nexport const GET_PUBLIC_CONTACT_COLUMN = 'GET_PUBLIC_CONTACT_COLUMN';\r\nexport const GET_PUBLIC_CONTACT_COLUMN_SUCCESS =\r\n 'GET_PUBLIC_CONTACT_COLUMN_SUCCESS';\r\nexport const GET_PUBLIC_CONTACT_COLUMN_ERROR =\r\n 'GET_MEMBER_SHORT_DETAIL_PREVIEW_ERROR';\r\nexport const GET_PUBLIC_CONTACT = 'GET_PUBLIC_CONTACT';\r\nexport const GET_PUBLIC_CONTACT_SUCCESS = 'GET_PUBLIC_CONTACT_SUCCESS';\r\nexport const GET_PUBLIC_CONTACT_ERROR = 'GET_PUBLIC_CONTACT_ERROR';\r\nexport const UPDATE_PUBLIC_CONTACT = 'UPDATE_PUBLIC_CONTACT';\r\n\r\n// get contacts by memberId\r\nexport const GET_MEMBER_CONTACTS = 'GET_MEMBER_CONTACTS';\r\nexport const GET_MEMBER_CONTACTS_SUCCESS = 'GET_MEMBER_CONTACTS_SUCCESS';\r\nexport const GET_MEMBER_CONTACTS_ERROR = 'GET_MEMBER_CONTACTS_ERROR';\r\n\r\n// get member brands\r\nexport const GET_MEMBER_OVERVIEW_BRANDS = 'GET_MEMBER_OVERVIEW_BRANDS';\r\nexport const GET_MEMBER_OVERVIEW_BRANDS_SUCCESS =\r\n 'GET_MEMBER_OVERVIEW_BRANDS_SUCCESS';\r\nexport const GET_MEMBER_OVERVIEW_BRANDS_ERROR =\r\n 'GET_MEMBER_OVERVIEW_BRANDS_ERROR';\r\n\r\nexport const DOCUMENT_DETAIL_COLUMN_INFO = 'DOCUMENT_DETAIL_COLUMN_INFO';\r\nexport const DOCUMENT_DETAIL_COLUMN_INFO_SUCCESS =\r\n 'DOCUMENT_DETAIL_COLUMN_INFO_SUCCESS';\r\nexport const DOCUMENT_DETAIL_COLUMN_INFO_ERROR =\r\n 'DOCUMENT_DETAIL_COLUMN_INFO_ERROR';\r\nexport const GET_DOCUMENT_DETAIL = 'GET_DOCUMENT_DETAIL';\r\nexport const GET_DOCUMENT_DETAIL_SUCCESS = 'GET_DOCUMENT_DETAIL_SUCCESS';\r\nexport const GET_DOCUMENT_DETAIL_ERROR = 'GET_DOCUMENT_DETAIL_ERROR';\r\nexport const DELETE_DOCUMENT_DETAIL = 'DELETE_DOCUMENT_DETAIL';\r\nexport const DELETE_DOCUMENT_DETAIL_ERROR = 'DELETE_DOCUMENT_DETAIL_ERROR';\r\n// Information sheet\r\nexport const GET_MEMBER_INFORMATION_SHEET = 'GET_MEMBER_INFORMATION_SHEET';\r\nexport const GET_MEMBER_INFORMATION_SHEET_SUCCESS =\r\n 'GET_MEMBER_INFORMATION_SHEET_SUCCESS';\r\nexport const GET_MEMBER_INFORMATION_SHEET_ERROR =\r\n 'GET_MEMBER_INFORMATION_SHEET_ERROR';\r\n","import produce from 'immer';\r\nimport * as types from '../constants';\r\n\r\nexport const initialState = {\r\n loading: false,\r\n memberInfo: null,\r\n error: null,\r\n};\r\n\r\n/* eslint-disable default-case, no-param-reassign */\r\nconst memberProfileReducer = (state = initialState, action) =>\r\n produce(state, (draft) => {\r\n switch (action.type) {\r\n case types.GET_MEMBER_PENDING:\r\n draft.loading = true;\r\n draft.error = null;\r\n break;\r\n case types.GET_MEMBER_SUCCESS:\r\n draft.loading = false;\r\n draft.memberInfo = action.data;\r\n draft.error = null;\r\n break;\r\n case types.GET_MEMBER_ERROR:\r\n draft.loading = false;\r\n draft.error = action.error;\r\n draft.memberInfo = null;\r\n break;\r\n }\r\n });\r\n\r\nexport default memberProfileReducer;\r\n","import produce from 'immer';\r\nimport * as types from '../constants';\r\n\r\nexport const initialState = {\r\n loading: false,\r\n brand: null,\r\n document: null,\r\n asset: null,\r\n error: null,\r\n documentDetail: null,\r\n loadingDocumentGrid: false,\r\n loadingGetDocument: false,\r\n memberContact: {\r\n loading: false,\r\n pageIndex: 1,\r\n pageSize: 10000,\r\n totalItems: 0,\r\n data: [],\r\n columns: [],\r\n memberId: null,\r\n },\r\n brands: {\r\n loading: false,\r\n pageIndex: 1,\r\n pageSize: 20,\r\n totalItems: 0,\r\n brandsList: [],\r\n columns: [],\r\n memberId: null,\r\n },\r\n informationSheet: {\r\n loading: false,\r\n pageIndex: 1,\r\n pageSize: 20,\r\n totalItems: 0,\r\n informationSheetList: [],\r\n memberId: null,\r\n },\r\n};\r\n\r\n/* eslint-disable default-case, no-param-reassign */\r\nconst memberOverviewReducer = (state = initialState, action) =>\r\n produce(state, (draft) => {\r\n switch (action.type) {\r\n case types.FETCH_MEMBER_OVERVIEW_DOCUMENT:\r\n draft.loading = true;\r\n draft.error = null;\r\n break;\r\n case types.FETCH_MEMBER_OVERVIEW_DOCUMENT_SUCCESS:\r\n draft.loading = false;\r\n draft.error = null;\r\n draft.document = action.data;\r\n break;\r\n case types.FETCH_MEMBER_OVERVIEW_DOCUMENT_ERROR:\r\n draft.loading = false;\r\n draft.error = action.error;\r\n break;\r\n case types.GET_DOCUMENT_DETAIL:\r\n draft.loadingGetDocument = true;\r\n draft.loadingDocumentGrid = false;\r\n draft.error = null;\r\n\r\n break;\r\n case types.GET_DOCUMENT_DETAIL_SUCCESS:\r\n draft.loadingGetDocument = false;\r\n draft.error = null;\r\n draft.documentDetail = action.data;\r\n break;\r\n case types.DELETE_DOCUMENT_DETAIL:\r\n draft.loadingDocumentGrid = true;\r\n draft.error = null;\r\n break;\r\n case types.DELETE_DOCUMENT_DETAIL_ERROR:\r\n draft.loadingDocumentGrid = false;\r\n draft.error = action.data;\r\n break;\r\n case types.GET_DOCUMENT_DETAIL_ERROR:\r\n draft.loading = false;\r\n draft.error = action.error;\r\n break;\r\n case types.GET_MEMBER_CONTACTS:\r\n draft.memberContact['loading'] = true;\r\n break;\r\n case types.GET_MEMBER_CONTACTS_SUCCESS:\r\n draft.memberContact['loading'] = false;\r\n draft.memberContact['data'] = action.data.gridData;\r\n draft.memberContact['pageIndex'] = action.data.paging.currentPageIndex;\r\n draft.memberContact['pageSize'] = action.data.paging.currentPageSize;\r\n draft.memberContact['totalItems'] = action.data.paging.totalRecord;\r\n break;\r\n case types.GET_MEMBER_CONTACTS_ERROR:\r\n draft.memberContact['loading'] = false;\r\n break;\r\n case types.GET_MEMBER_OVERVIEW_BRANDS:\r\n draft.brands['loading'] = true;\r\n break;\r\n case types.GET_MEMBER_OVERVIEW_BRANDS_SUCCESS:\r\n draft.brands['loading'] = false;\r\n draft.brands['brandsList'] = action?.data?.gridData || [];\r\n draft.brands['pageIndex'] =\r\n action?.data?.paging?.currentPageIndex ||\r\n initialState.brands.pageIndex;\r\n draft.brands['pageSize'] =\r\n action?.data?.paging?.currentPageSize || initialState.brands.pageSize;\r\n draft.brands['totalItems'] =\r\n action?.data?.paging?.totalRecord || initialState.brands.totalItems;\r\n break;\r\n case types.GET_MEMBER_OVERVIEW_BRANDS_ERROR:\r\n draft.brands['loading'] = false;\r\n break;\r\n case types.GET_MEMBER_INFORMATION_SHEET:\r\n draft.informationSheet['loading'] = true;\r\n break;\r\n case types.GET_MEMBER_INFORMATION_SHEET_SUCCESS:\r\n draft.informationSheet['loading'] = false;\r\n draft.informationSheet['informationSheetList'] =\r\n action?.data?.gridData || [];\r\n draft.informationSheet['pageIndex'] =\r\n action?.data?.paging?.currentPageIndex ||\r\n initialState.brands.pageIndex;\r\n draft.informationSheet['pageSize'] =\r\n action?.data?.paging?.currentPageSize ||\r\n initialState.informationSheet.pageSize;\r\n draft.informationSheet['totalItems'] =\r\n action?.data?.paging?.totalRecord ||\r\n initialState.informationSheet.totalItems;\r\n break;\r\n case types.GET_MEMBER_INFORMATION_SHEET_ERROR:\r\n draft.informationSheet['loading'] = false;\r\n break;\r\n }\r\n });\r\n\r\nexport default memberOverviewReducer;\r\n","import produce from 'immer';\r\nimport * as types from '../constants';\r\n\r\nexport const initialState = {\r\n loading: false,\r\n memberContactHistory: null,\r\n error: null,\r\n};\r\n\r\n/* eslint-disable default-case, no-param-reassign */\r\nconst memberContactHistoryReducer = (state = initialState, action) =>\r\n produce(state, (draft) => {\r\n switch (action.type) {\r\n case types.GET_MEMBER_CONTACT_HISTORY:\r\n draft.loading = true;\r\n draft.error = null;\r\n break;\r\n case types.GET_MEMBER_CONTACT_HISTORY_SUCCESS:\r\n draft.loading = false;\r\n draft.memberContactHistory = action.data;\r\n draft.error = null;\r\n break;\r\n case types.GET_MEMBER_CONTACT_HISTORY_ERROR:\r\n draft.loading = false;\r\n draft.error = action.error;\r\n draft.memberContactHistory = null;\r\n break;\r\n }\r\n });\r\n\r\nexport default memberContactHistoryReducer;\r\n","import produce from 'immer';\r\nimport * as types from '../constants';\r\n\r\nexport const initialState = {\r\n loading: false,\r\n memberContact: null,\r\n contactLocation: null,\r\n memberBilling: null,\r\n activityLog: null,\r\n contactHistory: null,\r\n error: null,\r\n};\r\n\r\n/* eslint-disable default-case, no-param-reassign */\r\nconst memberColumnGridReducer = (state = initialState, action) =>\r\n produce(state, (draft) => {\r\n switch (action.type) {\r\n case types.GET_MEMBER_CONTACT_GRID:\r\n draft.loading = true;\r\n draft.error = null;\r\n break;\r\n case types.GET_MEMBER_CONTACT_GRID_SUCCESS:\r\n draft.loading = false;\r\n draft.memberContact = action.columns;\r\n draft.error = null;\r\n break;\r\n case types.GET_MEMBER_CONTACT_GRID_ERROR:\r\n draft.loading = false;\r\n draft.memberContact = null;\r\n draft.error = action.error;\r\n break;\r\n case types.GET_CONTACT_LOCATION_GRID:\r\n draft.loading = true;\r\n draft.error = null;\r\n break;\r\n case types.GET_CONTACT_LOCATION_GRID_SUCCESS:\r\n draft.loading = false;\r\n draft.contactLocation = action.columns;\r\n draft.error = null;\r\n break;\r\n case types.GET_CONTACT_LOCATION_GRID_ERROR:\r\n draft.loading = false;\r\n draft.contactLocation = null;\r\n draft.error = action.error;\r\n break;\r\n case types.GET_MEMBER_BILLING_GRID:\r\n draft.loading = true;\r\n draft.error = null;\r\n break;\r\n case types.GET_MEMBER_BILLING_GRID_SUCCESS:\r\n draft.loading = false;\r\n draft.memberBilling = action.columns;\r\n draft.error = null;\r\n break;\r\n case types.GET_MEMBER_BILLING_GRID_ERROR:\r\n draft.loading = false;\r\n draft.memberBilling = null;\r\n draft.error = action.error;\r\n break;\r\n case types.GET_MEMBER_ACTIVITY_LOG_GRID:\r\n draft.loading = true;\r\n draft.error = null;\r\n break;\r\n case types.GET_MEMBER_ACTIVITY_LOG_GRID_SUCCESS:\r\n draft.loading = false;\r\n draft.activityLog = action.columns;\r\n draft.error = null;\r\n break;\r\n case types.GET_MEMBER_ACTIVITY_LOG_GRID_ERROR:\r\n draft.loading = false;\r\n draft.activityLog = null;\r\n draft.error = action.error;\r\n break;\r\n case types.GET_MEMBER_CONTACT_HISTORY_GRID:\r\n draft.loading = true;\r\n draft.error = null;\r\n break;\r\n case types.GET_MEMBER_CONTACT_HISTORY_GRID_SUCCESS:\r\n draft.loading = false;\r\n draft.contactHistory = action.columns;\r\n draft.error = null;\r\n break;\r\n case types.GET_MEMBER_CONTACT_HISTORY_GRID_ERROR:\r\n draft.loading = false;\r\n draft.contactHistory = null;\r\n draft.error = action.error;\r\n break;\r\n }\r\n });\r\n\r\nexport default memberColumnGridReducer;\r\n","import produce from 'immer';\r\nimport * as types from '../constants';\r\n\r\nexport const initialState = {\r\n isUploadTagLineMediaOpen: false,\r\n isShowUploadTagLineMedia: false,\r\n isShowPreviewUploadTagLineMedia: false,\r\n};\r\n\r\n/* eslint-disable default-case, no-param-reassign */\r\nconst memberTagLineReducer = (state = initialState, action) =>\r\n produce(state, (draft) => {\r\n switch (action.type) {\r\n case types.TOGGLE_TAG_LINE_UPLOAD_MEDIA:\r\n draft.isUploadTagLineMediaOpen = action.status;\r\n break;\r\n case types.TOGGLE_PREVIEW_TAG_LINE_UPLOAD_MEDIA:\r\n draft.isShowPreviewUploadTagLineMedia = action.status;\r\n break;\r\n case types.IS_SHOW_LINE_UPLOAD_MEDIA:\r\n draft.isShowUploadTagLineMedia = action.status;\r\n break;\r\n }\r\n });\r\n\r\nexport default memberTagLineReducer;\r\n","import produce from 'immer';\r\nimport * as types from '../constants';\r\n\r\nexport const initialState = {\r\n loading: false,\r\n memberShortDetail: null,\r\n error: null,\r\n initialPublicContact: null,\r\n publicContact: null,\r\n publicContactList: null,\r\n};\r\n/* eslint-disable default-case, no-param-reassign */\r\nconst memberPreviewReducer = (state = initialState, action) =>\r\n produce(state, (draft) => {\r\n switch (action.type) {\r\n case types.GET_MEMBER_SHORT_DETAIL_PREVIEW:\r\n draft.loading = true;\r\n draft.error = null;\r\n break;\r\n case types.GET_MEMBER_SHORT_DETAIL_PREVIEW_SUCCESS:\r\n draft.loading = false;\r\n draft.memberShortDetail = action.data;\r\n break;\r\n case types.GET_MEMBER_SHORT_DETAIL_PREVIEW_ERROR:\r\n draft.loading = false;\r\n draft.error = action.error;\r\n break;\r\n case types.GET_PUBLIC_CONTACT_COLUMN:\r\n draft.loading = true;\r\n draft.error = null;\r\n break;\r\n case types.GET_PUBLIC_CONTACT_COLUMN_SUCCESS:\r\n draft.loading = false;\r\n draft.publicContact = action.columns;\r\n draft.error = null;\r\n break;\r\n case types.GET_PUBLIC_CONTACT_COLUMN_ERROR:\r\n draft.loading = false;\r\n draft.publicContact = null;\r\n draft.error = action.error;\r\n break;\r\n case types.GET_PUBLIC_CONTACT:\r\n draft.loading = true;\r\n draft.error = null;\r\n break;\r\n case types.GET_PUBLIC_CONTACT_SUCCESS:\r\n draft.loading = false;\r\n draft.publicContactList = action.data;\r\n draft.initialPublicContact = action.data;\r\n draft.error = null;\r\n break;\r\n case types.GET_PUBLIC_CONTACT_ERROR:\r\n draft.loading = false;\r\n draft.publicContactList = null;\r\n draft.error = action.error;\r\n break;\r\n case types.UPDATE_PUBLIC_CONTACT:\r\n draft.publicContactList = action.data;\r\n break;\r\n }\r\n });\r\nexport default memberPreviewReducer;\r\n","import { combineReducers } from 'redux';\r\nimport memberProfileReducer, {\r\n initialState as initialStateProfile,\r\n} from './reducers/memberProfileReducer';\r\nimport memberOverviewReducer, {\r\n initialState as initialStateOverview,\r\n} from './reducers/memberOverviewReducer';\r\nimport memberContactHistoryReducer, {\r\n initialState as initialContactHistory,\r\n} from './reducers/memberContactHistoryReducer';\r\nimport memberColumnGridReducer, {\r\n initialState as initialStateMemberColumnGridReducer,\r\n} from './reducers/memberColumnGridReducer';\r\nimport memberTagLineReducer, {\r\n initialState as initialStateTagLineReducer,\r\n} from './reducers/memberTagLineReducer';\r\nimport memberPreviewReducer, {\r\n initialState as initialStatePreviewReducer,\r\n} from './reducers/memberPreviewReducer';\r\n\r\nconst initialStateMember = {\r\n profile: null,\r\n contactHistory: {},\r\n overview: {},\r\n gridColumn: null,\r\n tagLine: {},\r\n};\r\n\r\nexport {\r\n initialStateMember,\r\n initialStateProfile,\r\n initialStateOverview,\r\n initialContactHistory,\r\n initialStateMemberColumnGridReducer,\r\n initialStateTagLineReducer,\r\n initialStatePreviewReducer,\r\n};\r\n\r\nexport default combineReducers({\r\n profile: memberProfileReducer,\r\n contactHistory: memberContactHistoryReducer,\r\n overview: memberOverviewReducer,\r\n gridColumn: memberColumnGridReducer,\r\n tagLine: memberTagLineReducer,\r\n preview: memberPreviewReducer,\r\n});\r\n","import React from 'react';\r\nimport { Space } from 'antd';\r\nimport {\r\n ArrowDownOutlined,\r\n ArrowUpOutlined,\r\n FileExclamationOutlined,\r\n MailOutlined,\r\n MessageOutlined,\r\n FileImageOutlined,\r\n IdcardOutlined,\r\n} from '@ant-design/icons';\r\n\r\nconst IconRenderer = (props) => {\r\n const { item } = props;\r\n return (\r\n \r\n {item &&\r\n item.data &&\r\n (item.data.isInBound ? (\r\n \r\n ) : (\r\n \r\n ))}\r\n {item &&\r\n item.data &&\r\n (item.data.type === 'DAM' ? (\r\n \r\n ) : item.data.type === 'Email' ? (\r\n \r\n ) : item.data.type === 'Request' ? (\r\n \r\n ) : item.data.type === 'Registration' ? (\r\n \r\n ) : (\r\n \r\n ))}\r\n \r\n );\r\n};\r\nexport default IconRenderer;\r\n","import { call } from 'redux-saga/effects';\r\n\r\nexport function* getColumnAndFilterGridTable(gridColInfoApiService, param) {\r\n const response = yield call(gridColInfoApiService, param.gridName);\r\n\r\n return response;\r\n}\r\n","import React from 'react';\r\nimport { put, call, takeLatest, all, select } from 'redux-saga/effects';\r\nimport * as types from './constants';\r\nimport * as actions from './actions';\r\nimport { DEFAULT_SORT } from 'static/Constants';\r\n\r\nimport {\r\n getMemberProfileHeader,\r\n getMemberOverviewDocument,\r\n getMemberContactHistory,\r\n getMemberShortDetail,\r\n getPublicContact,\r\n getMemberDocument,\r\n deleteMemberDocument,\r\n} from 'services/members';\r\nimport * as services from 'services/members';\r\nimport * as servicesGrid from 'services/grid';\r\nimport * as memberFulltypes from 'pages/home/ribbon/member-full/controllers/constants';\r\nimport moment from 'moment';\r\nimport IconRenderer from '../components/tabs/crm/activity/IconRenderer';\r\nimport {\r\n MemberBillingIconRenderer,\r\n MemberContactIconRenderer,\r\n MemberLocationIconRenderer,\r\n} from 'common/components/icon-renderer/IconRenderer';\r\nimport * as filterService from './filterService';\r\nimport { formatMDYWithParam } from 'utils/formatDate';\r\n\r\nimport selectorUser from '@redux/user/selectors';\r\nimport { PERMISSION } from 'static/Permission';\r\n\r\nexport function* memberProfileHeaderSaga(action) {\r\n const userInfo = yield select(selectorUser.makeSelectUserInfo());\r\n const { permissions } = userInfo;\r\n\r\n const hasViewCompanyPermission = permissions.some((permission) => {\r\n return (\r\n permission === PERMISSION.VIEW_FULL_COMPANY_PROFILE ||\r\n permission === PERMISSION.VIEW_MEMBERS\r\n );\r\n });\r\n\r\n if (hasViewCompanyPermission) {\r\n try {\r\n const response = yield call(getMemberProfileHeader, {\r\n MemberId: action.MemberId,\r\n });\r\n\r\n if (response.isSuccess && response.data) {\r\n yield put(actions.loadMemberProfile(response.data));\r\n return;\r\n }\r\n\r\n yield put({ type: types.GET_MEMBER_ERROR, error: 'no-data' });\r\n } catch (error) {\r\n yield put({ type: types.GET_MEMBER_ERROR, error });\r\n }\r\n } else yield put(actions.getMemberProfileNoPermission());\r\n}\r\n\r\n// BP 08/31/2020: TODO need to review more carefully\r\nexport function* memberContactHistorySaga(payload) {\r\n try {\r\n const response = yield call(getMemberContactHistory, { ...payload });\r\n yield put(actions.getMemberContactHistorySuccess(response));\r\n } catch (error) {\r\n yield put({ type: types.GET_MEMBER_CONTACT_HISTORY_ERROR, error });\r\n }\r\n}\r\n\r\nexport function* fetchMemberDocument(payload) {\r\n try {\r\n const props = payload.payload;\r\n const response = yield call(getMemberOverviewDocument, {\r\n MemberId: props.memberId,\r\n PageIndex: props.currentPage,\r\n PageSize: props.pageSize,\r\n });\r\n yield put({\r\n type: types.FETCH_MEMBER_OVERVIEW_DOCUMENT_SUCCESS,\r\n data: response,\r\n });\r\n } catch (error) {\r\n yield put({\r\n type: types.FETCH_MEMBER_OVERVIEW_DOCUMENT_ERROR,\r\n error,\r\n });\r\n }\r\n}\r\n\r\nexport function* fetchPublicContact(payload) {\r\n try {\r\n const response = yield call(getPublicContact, {\r\n memberId: Number(payload.memberId),\r\n pageIndex: 1,\r\n pageSize: 10,\r\n });\r\n yield put({\r\n type: types.GET_PUBLIC_CONTACT_SUCCESS,\r\n data: response?.data?.gridData,\r\n });\r\n } catch (error) {\r\n yield put({\r\n type: types.GET_PUBLIC_CONTACT_ERROR,\r\n error,\r\n });\r\n }\r\n}\r\n\r\n// get contacts by memberId\r\nexport function* getContactMemberSaga(payload) {\r\n try {\r\n const response = yield call(services.getMemberContact, {\r\n ...payload.params,\r\n memberId: Number(payload.params.memberId),\r\n });\r\n yield put(actions.getMemberContactsSuccess(response.data));\r\n } catch (error) {\r\n yield put(actions.getMemberContactsError(error));\r\n }\r\n}\r\n\r\nexport function* getMemberBrandsSaga(payload) {\r\n try {\r\n const response = yield call(services.getMemberOverviewBrands, {\r\n ...payload.params,\r\n memberId: Number(payload.params.memberId),\r\n sort: DEFAULT_SORT,\r\n });\r\n const { isSuccess, data, message } = response;\r\n if (isSuccess) {\r\n yield put(actions.getMemberBrandsSuccess(data));\r\n } else {\r\n yield put(actions.getMemberBrandsError(message));\r\n }\r\n } catch (error) {\r\n yield put(actions.getMemberBrandsError(error));\r\n }\r\n}\r\n\r\nexport function* getMemberInformationSheetSaga(payload) {\r\n try {\r\n const response = yield call(services.getMemberInformationSheetGrid, {\r\n ...payload.params,\r\n memberId: Number(payload.params.memberId),\r\n sort: DEFAULT_SORT,\r\n });\r\n const { isSuccess, data, message } = response;\r\n if (isSuccess) {\r\n yield put(actions.getMemberInformationSheetSuccess(data));\r\n } else {\r\n yield put(actions.getMemberInformationSheetError(message));\r\n }\r\n } catch (error) {\r\n yield put(actions.getMemberInformationSheetError(error));\r\n }\r\n}\r\n\r\n// Date Formatter\r\nfunction dateFormatter(params) {\r\n return moment(params.value).format('MM/DD/YYYY');\r\n}\r\n\r\n// GET MEMBER BILLING GRID\r\nconst renderIconBilling = (params) => {\r\n return ;\r\n};\r\n\r\nexport function* gridColumnMemberBilling(payload) {\r\n try {\r\n const response = yield call(\r\n filterService.getColumnAndFilterGridTable,\r\n servicesGrid.gridColumnInfo,\r\n payload\r\n );\r\n\r\n let columns = [\r\n {\r\n field: '',\r\n checkboxSelection: true,\r\n filter: false,\r\n suppressMenu: true,\r\n width: 50,\r\n resizable: true,\r\n },\r\n ];\r\n\r\n if (response?.columns?.length > 0) {\r\n response.columns.forEach((col) => {\r\n if (col.fieldNameCamelCase === 'id') {\r\n col = { ...col, width: 120 };\r\n } else if (col.dataType === 'datetime') {\r\n col = {\r\n ...col,\r\n flex: 1,\r\n cellRenderer: dateFormatter,\r\n sort: col.displayName === 'TransactionDate' ? 'desc' : '',\r\n minWidth: col.displayName === 'TransactionDate' && 200,\r\n };\r\n } else if (col.fieldNameCamelCase === 'type') {\r\n col = {\r\n ...col,\r\n headerName: '',\r\n cellRenderer: renderIconBilling,\r\n width: 100,\r\n };\r\n } else if (col.fieldNameCamelCase === 'balance') {\r\n col = { ...col, width: 150 };\r\n } else {\r\n col = { ...col, flex: 1 };\r\n }\r\n columns.push({ ...col, resizable: true });\r\n });\r\n\r\n [columns[1], columns[2]] = [columns[2], columns[1]];\r\n }\r\n yield put(actions.gridColumnMemberBillingSuccess(columns));\r\n } catch (error) {\r\n yield put(actions.gridColumnMemberBillingError(error));\r\n }\r\n}\r\n\r\nexport function* getColumnDocumentDetailList(payload) {\r\n try {\r\n const { response } = yield call(\r\n servicesGrid.gridColumnInfo,\r\n payload.gridName\r\n );\r\n\r\n const checkboxColumn = [\r\n {\r\n field: '',\r\n checkboxSelection: true,\r\n filter: false,\r\n suppressMenu: true,\r\n resizable: true,\r\n },\r\n ];\r\n\r\n let result = [];\r\n\r\n if (response && response.columns && response.columns.length > 0) {\r\n response.columns.forEach((val, index) => {\r\n if (\r\n val.fieldNameCamelCase === 'banByMemberName' ||\r\n val.fieldNameCamelCase === 'bannedMemberName'\r\n ) {\r\n result.push({ ...val, resizable: true, width: 240 });\r\n } else if (val.fieldNameCamelCase === 'banByUserId') {\r\n result.push({\r\n ...val,\r\n resizable: true,\r\n width: 100,\r\n headerName: 'Owner',\r\n });\r\n }\r\n });\r\n }\r\n yield put(\r\n actions.documentDetailColumnInfoSuccess([...checkboxColumn, ...result])\r\n );\r\n } catch (error) {\r\n yield put(actions.documentDetailColumnInfoError(error));\r\n }\r\n}\r\n\r\n// GET MEMBER CONTACT GRID\r\nconst renderIconContact = (params) => {\r\n return ;\r\n};\r\n\r\nconst renderCityState = (params) => {\r\n if (params?.data?.city || params?.data?.state)\r\n return (\r\n <>\r\n {params.data.city}, {params.data.state}\r\n \r\n );\r\n else return <>;\r\n};\r\n\r\nexport function* gridColumnMemberContact(payload) {\r\n try {\r\n const response = yield call(\r\n filterService.getColumnAndFilterGridTable,\r\n servicesGrid.gridColumnInfo,\r\n payload\r\n );\r\n let columns = [\r\n {\r\n field: '',\r\n checkboxSelection: true,\r\n filter: false,\r\n suppressMenu: true,\r\n width: 50,\r\n resizable: true,\r\n },\r\n {\r\n field: '',\r\n separateFieldName: ['status', 'isPrimaryContact'],\r\n isShowFilter: 'none',\r\n width: 100,\r\n cellRenderer: renderIconContact,\r\n resizable: true,\r\n },\r\n ];\r\n if (response?.columns?.length > 0) {\r\n const hiddenCol = ['id', 'isPublic', 'status', 'isPrimaryContact'];\r\n response.columns.forEach((col, index) => {\r\n if (!hiddenCol.includes(col.fieldNameCamelCase)) {\r\n if ('accountExpires' === col?.fieldNameCamelCase)\r\n col = { ...col, minWidth: 250, cellRenderer: formatMDYWithParam };\r\n columns.push({ ...col, flex: 1, resizable: true });\r\n }\r\n });\r\n }\r\n [columns[2], columns[3], columns[4], columns[5], columns[6], columns[7]] = [\r\n columns[2],\r\n columns[3],\r\n columns[4],\r\n columns[6],\r\n columns[7],\r\n columns[5],\r\n ];\r\n yield put(actions.gridColumnMemberContactSuccess(columns));\r\n } catch (error) {\r\n yield put(actions.gridColumnMemberContactError(error));\r\n }\r\n}\r\n\r\n// GET MEMBER LOCATION GRID\r\nconst renderIconLocation = (params) => {\r\n return ;\r\n};\r\n\r\nexport function* gridColumnMemberCompanyLocation(payload) {\r\n try {\r\n const response = yield call(\r\n filterService.getColumnAndFilterGridTable,\r\n servicesGrid.gridColumnInfo,\r\n payload\r\n );\r\n\r\n let columns = [\r\n {\r\n field: '',\r\n checkboxSelection: true,\r\n filter: false,\r\n suppressMenu: true,\r\n width: 50,\r\n resizable: true,\r\n },\r\n {\r\n field: '',\r\n width: 120,\r\n isShowFilter: 'none',\r\n separateFieldName: ['isPrimaryAddress', 'status', 'addressType'],\r\n cellRenderer: renderIconLocation,\r\n resizable: true,\r\n },\r\n ];\r\n\r\n if (response?.columns?.length > 0) {\r\n // BP 12/28/2020 - add latitude, longitude into removed columns\r\n let hiddenCol = [\r\n 'id',\r\n 'isPrimaryAddress',\r\n 'status',\r\n 'addressType',\r\n 'latitude',\r\n 'longitude',\r\n ];\r\n response.columns.forEach((col, index) => {\r\n if (hiddenCol.indexOf(col.fieldNameCamelCase) === -1) {\r\n col = { ...col, flex: 1, resizable: true };\r\n columns.push(col);\r\n }\r\n });\r\n }\r\n\r\n yield put(actions.gridColumnContactLocationSuccess(columns));\r\n } catch (error) {\r\n yield put(actions.gridColumnContactLocationError(error));\r\n }\r\n}\r\n\r\n// GET MEMBER ACTIVITY LOG GRID\r\nconst renderIcon = (params) => {\r\n return ;\r\n};\r\n\r\nexport function* gridColumnMemberActivityLog(payload) {\r\n try {\r\n const response = yield call(\r\n filterService.getColumnAndFilterGridTable,\r\n servicesGrid.gridColumnInfo,\r\n payload\r\n );\r\n let columns = [\r\n {\r\n field: '',\r\n checkboxSelection: true,\r\n filter: false,\r\n suppressMenu: true,\r\n width: 50,\r\n resizable: true,\r\n },\r\n {\r\n field: '',\r\n cellRenderer: renderIcon,\r\n width: 100,\r\n resizable: true,\r\n },\r\n ];\r\n\r\n if (response && response.columns && response.columns.length > 0) {\r\n response.columns.forEach((val, index) => {\r\n if (\r\n val.fieldNameCamelCase !== 'id' &&\r\n val.fieldNameCamelCase !== 'isInBound' &&\r\n val.fieldNameCamelCase !== 'originatorUserId' &&\r\n val.fieldNameCamelCase !== 'mostRecentUserId'\r\n ) {\r\n if (\r\n val.fieldNameCamelCase === 'messageDate' ||\r\n val.fieldNameCamelCase === 'lastActivity'\r\n ) {\r\n if (val.fieldNameCamelCase === 'messageDate') {\r\n val = { ...val, fieldNameCamelCase: 'date' };\r\n }\r\n val = { ...val, cellRenderer: dateFormatter, width: 130 };\r\n } else if (val.fieldNameCamelCase === 'description') {\r\n val = { ...val };\r\n } else if (val.fieldNameCamelCase === 'member') {\r\n val = { ...val, headerName: 'Company', minWidth: 150, flex: 1 };\r\n } else if (val.fieldNameCamelCase === 'originatorUser') {\r\n val = { ...val, headerName: 'Originator' };\r\n } else if (val.fieldNameCamelCase === 'mostRecentUser') {\r\n val = { ...val, headerName: 'Most Recent' };\r\n } else if (val.fieldName === 'Type') {\r\n val = { ...val, width: 100 };\r\n }\r\n columns.push({ ...val, resizable: true });\r\n }\r\n });\r\n [columns[2], columns[3], columns[4]] = [\r\n columns[3],\r\n columns[4],\r\n columns[2],\r\n ];\r\n }\r\n yield put(actions.gridColumnActivityLogSuccess(columns));\r\n } catch (error) {\r\n yield put(actions.gridColumnActivityLogError(error));\r\n }\r\n}\r\n\r\n// GET MEMBER CONTACT HISTORY\r\nexport function* gridColumnMemberContactHistory(payload) {\r\n try {\r\n const response = yield call(servicesGrid.gridColumnInfo, payload.gridName);\r\n let columns = [];\r\n\r\n if (response.columns && response.columns.length > 0) {\r\n let columns = [];\r\n response.columns.forEach((val) => {\r\n columns.push({ fieldName: val.fieldName });\r\n });\r\n }\r\n yield put(actions.gridColumnMemberContactHistorySuccess(columns));\r\n } catch (error) {\r\n yield put(actions.gridColumnMemberContactHistoryError(error));\r\n }\r\n}\r\n\r\nexport function* gridColumnPublicContact(payload) {\r\n try {\r\n const response = yield call(servicesGrid.gridColumnInfo, payload.gridName);\r\n let columns = [\r\n {\r\n field: '',\r\n checkboxSelection: true,\r\n filter: false,\r\n suppressMenu: true,\r\n width: 50,\r\n resizable: true,\r\n },\r\n ];\r\n if (response.columns && response.columns.length > 0) {\r\n response.columns.forEach((val) => {\r\n if (\r\n val.fieldNameCamelCase !== 'visibility' &&\r\n val.fieldNameCamelCase !== 'showInMemberPreview' &&\r\n val.fieldNameCamelCase !== 'id' &&\r\n val.fieldNameCamelCase !== 'name' &&\r\n val.fieldNameCamelCase !== 'latitude' &&\r\n val.fieldNameCamelCase !== 'longitude'\r\n ) {\r\n // if (val.fieldNameCamelCase !== 'showInMemberPreview') {\r\n // columns.push({ ...val });\r\n // } else\r\n columns.push({ ...val, filter: false, suppressMenu: true });\r\n }\r\n });\r\n }\r\n\r\n yield put(actions.gridColumnPublicContactSuccess(columns));\r\n } catch (error) {\r\n yield put(actions.gridColumnPublicContactError(error));\r\n }\r\n}\r\n\r\nexport function* getMemberShortDetailPreview(payload) {\r\n try {\r\n const response = yield call(getMemberShortDetail, {\r\n Id: payload.id,\r\n });\r\n const { isSuccess, data, message } = response;\r\n if (isSuccess) {\r\n yield put(actions.getMemberShortDetailPreviewSuccess(data));\r\n } else {\r\n yield put(actions.getMemberShortDetailPreviewError(message));\r\n }\r\n } catch (error) {\r\n yield put(actions.getMemberShortDetailPreviewError(error));\r\n }\r\n}\r\n\r\nexport function* getMemberDocumentDetail(payload) {\r\n try {\r\n const { dataParams } = payload;\r\n const response = yield call(getMemberDocument, {\r\n pageIndex: dataParams?.pageIndex,\r\n pageSize: dataParams?.pageSize,\r\n memberId: dataParams?.memberId,\r\n });\r\n const { data, isSuccess } = response;\r\n if (isSuccess) {\r\n yield put(actions.getDocumentDetailSuccess(data));\r\n } else {\r\n yield put(actions.getDocumentDetailError('error'));\r\n }\r\n } catch (error) {\r\n yield put(actions.getDocumentDetailError(error));\r\n }\r\n}\r\n\r\nexport function* deleteMemberDocumentDetail(payload) {\r\n try {\r\n const { dataParams } = payload;\r\n const response = yield call(deleteMemberDocument, {\r\n ids: dataParams?.idList,\r\n isRemovedFromShowcase: dataParams?.isRemove,\r\n memberId: dataParams?.memberId,\r\n forMemberDocument: dataParams?.forMemberDocument,\r\n });\r\n const { data, isSuccess } = response;\r\n if (isSuccess) {\r\n yield put(\r\n actions.getDocumentDetail({\r\n memberId: dataParams.memberId,\r\n pageIndex: dataParams.currentPage,\r\n pageSize: dataParams.pageSize,\r\n })\r\n );\r\n } else {\r\n yield put(actions.deleteDocumentDetailError('error'));\r\n }\r\n } catch (error) {\r\n yield put(actions.deleteDocumentDetailError(error));\r\n }\r\n}\r\n\r\nconst memberProfileNoPermission = () => {\r\n // If unable to retrieve the memberProfile, handle the action here\r\n};\r\n\r\nfunction* watchAll() {\r\n yield all([\r\n takeLatest(types.GET_MEMBER_CONTACT_HISTORY, memberContactHistorySaga),\r\n takeLatest(types.GET_MEMBER_PENDING, memberProfileHeaderSaga),\r\n takeLatest(types.MEMBER_PROFILE_NO_PERMISSION, memberProfileNoPermission),\r\n takeLatest(memberFulltypes.FINISH_EDIT_MEMBER, memberProfileHeaderSaga),\r\n takeLatest(types.GET_MEMBER_CONTACT_GRID, gridColumnMemberContact),\r\n takeLatest(types.GET_MEMBER_BILLING_GRID, gridColumnMemberBilling),\r\n takeLatest(\r\n types.GET_CONTACT_LOCATION_GRID,\r\n gridColumnMemberCompanyLocation\r\n ),\r\n takeLatest(types.GET_MEMBER_ACTIVITY_LOG_GRID, gridColumnMemberActivityLog),\r\n takeLatest(\r\n types.GET_MEMBER_CONTACT_HISTORY_GRID,\r\n gridColumnMemberContactHistory\r\n ),\r\n takeLatest(types.GET_PUBLIC_CONTACT_COLUMN, gridColumnPublicContact),\r\n takeLatest(\r\n types.GET_MEMBER_SHORT_DETAIL_PREVIEW,\r\n getMemberShortDetailPreview\r\n ),\r\n takeLatest(types.GET_PUBLIC_CONTACT, fetchPublicContact),\r\n takeLatest(types.GET_MEMBER_CONTACTS, getContactMemberSaga),\r\n takeLatest(types.GET_MEMBER_OVERVIEW_BRANDS, getMemberBrandsSaga),\r\n takeLatest(\r\n types.GET_MEMBER_INFORMATION_SHEET,\r\n getMemberInformationSheetSaga\r\n ),\r\n takeLatest(types.DOCUMENT_DETAIL_COLUMN_INFO, getColumnDocumentDetailList),\r\n takeLatest(types.GET_DOCUMENT_DETAIL, getMemberDocumentDetail),\r\n takeLatest(types.DELETE_DOCUMENT_DETAIL, deleteMemberDocumentDetail),\r\n ]);\r\n}\r\n\r\nexport default watchAll;\r\n","// Action Types\r\nexport const EDIT_MEMBER = 'EDIT_MEMBER';\r\nexport const CANCEL_EDIT_MEMBER = 'CANCEL_EDIT_MEMBER';\r\nexport const SAVING_MEMBER_FULL = 'SAVING_MEMBER_FULL';\r\nexport const SAVE_MEMBER_FULL = 'SAVE_MEMBER_FULL';\r\nexport const SAVE_MEMBER_FULL_SUCCESS = 'SAVE_MEMBER_FULL_SUCCESS';\r\nexport const SAVE_MEMBER_FULL_ERROR = 'SAVE_MEMBER_FULL_ERROR';\r\nexport const FINISH_EDIT_MEMBER = 'FINISH_EDIT_MEMBER';\r\n","import { createSelector } from 'reselect';\r\nimport {\r\n initialStateMember,\r\n initialStateProfile,\r\n initialStateOverview,\r\n initialContactHistory,\r\n initialStateMemberColumnGridReducer,\r\n initialStateTagLineReducer,\r\n initialStatePreviewReducer,\r\n} from './reducer';\r\n\r\nconst member = (state) => {\r\n return state.member || initialStateMember;\r\n};\r\n\r\nconst profile = (state) => {\r\n if (state && state.member) {\r\n return state.member.profile || initialStateProfile;\r\n } else {\r\n return initialStateProfile;\r\n }\r\n};\r\n\r\nconst contactHistory = (state) => {\r\n if (state && state.member) {\r\n return state.member.contactHistory || initialContactHistory;\r\n } else {\r\n return initialContactHistory;\r\n }\r\n};\r\n\r\nconst overview = (state) => {\r\n if (state && state.member) {\r\n return state.member.overview || initialStateOverview;\r\n } else {\r\n return initialStateOverview;\r\n }\r\n};\r\n\r\nconst gridColumn = (state) => {\r\n if (state && state.member) {\r\n return state.member.gridColumn || initialStateMemberColumnGridReducer;\r\n } else {\r\n return initialStateMemberColumnGridReducer;\r\n }\r\n};\r\n\r\nconst tagLine = (state) => {\r\n if (state && state.member) {\r\n return state.member.tagLine || initialStatePreviewReducer;\r\n } else {\r\n return initialStatePreviewReducer;\r\n }\r\n};\r\n\r\nconst preview = (state) => {\r\n if (state && state.member) {\r\n return state.member.preview || initialStateTagLineReducer;\r\n } else {\r\n return initialStateTagLineReducer;\r\n }\r\n};\r\n\r\n// Member Profile\r\nconst selectMemberProfile = () =>\r\n createSelector(profile, (memberState) => {\r\n return memberState.memberInfo;\r\n });\r\n\r\nconst selectMemberError = () =>\r\n createSelector(member, (memberState) => memberState.profile.error);\r\n\r\nconst selectMemberProfileLoading = () =>\r\n createSelector(profile, (memberState) => memberState.loading);\r\n\r\n// Member Contact history\r\nconst selectMemberContactHistory = () =>\r\n createSelector(contactHistory, (memberState) => {\r\n return memberState.memberContactHistory;\r\n });\r\n\r\nconst selectMemberContactHistoryError = () =>\r\n createSelector(\r\n contactHistory,\r\n (memberState) => memberState.contactHistory.error\r\n );\r\n\r\nconst selectMemberContactHistoryLoading = () =>\r\n createSelector(\r\n contactHistory,\r\n (memberState) => memberState.contactHistory.loading\r\n );\r\n\r\nconst selectMemberContact = () => {\r\n return createSelector(overview, (memberState) => memberState.memberContact);\r\n};\r\n\r\nconst selectBrands = () => {\r\n return createSelector(overview, (memberState) => memberState.brands);\r\n};\r\n\r\nconst selectInformationSheet = () => {\r\n return createSelector(\r\n overview,\r\n (memberState) => memberState.informationSheet\r\n );\r\n};\r\n\r\nconst selectBrand = () => {\r\n return createSelector(overview, (memberState) => memberState.brand);\r\n};\r\n\r\nconst selectAsset = () => {\r\n return createSelector(overview, (memberState) => memberState.asset);\r\n};\r\n\r\nconst selectDocument = () => {\r\n return createSelector(overview, (memberState) => memberState.document);\r\n};\r\n\r\nconst selectDocumentDetail = () => {\r\n return createSelector(overview, (memberState) => memberState.documentDetail);\r\n};\r\n\r\nconst selectLoadingDocumentGrid = () => {\r\n return createSelector(\r\n overview,\r\n (memberState) => memberState.loadingDocumentGrid\r\n );\r\n};\r\nconst selectLoadingGetDocument = () => {\r\n return createSelector(\r\n overview,\r\n (memberState) => memberState.loadingGetDocument\r\n );\r\n};\r\nconst selectLoadingPreview = () => {\r\n return createSelector(preview, (memberState) => memberState.loading);\r\n};\r\n\r\nconst selectErrorPreview = () => {\r\n return createSelector(preview, (memberState) => memberState.error);\r\n};\r\n\r\nconst selectShortDetailPreview = () => {\r\n return createSelector(\r\n preview,\r\n (memberState) => memberState.memberShortDetail\r\n );\r\n};\r\n\r\nconst selectPublicContactColumn = () => {\r\n return createSelector(preview, (memberState) => memberState.publicContact);\r\n};\r\n\r\nconst selectPublicContactList = () => {\r\n return createSelector(\r\n preview,\r\n (memberState) => memberState.publicContactList\r\n );\r\n};\r\n\r\nconst selectInitialPublicContactList = () => {\r\n return createSelector(\r\n preview,\r\n (memberState) => memberState.initialPublicContact\r\n );\r\n};\r\n\r\n/**********************************************************************/\r\n/************************ Grid Selectors *******************************/\r\n/**********************************************************************/\r\nconst selectMemberContactColumns = () =>\r\n createSelector(gridColumn, (memColState) => memColState.memberContact);\r\n\r\nconst selectContactLocationColumns = () =>\r\n createSelector(gridColumn, (memColState) => memColState.contactLocation);\r\n\r\nconst selectMemberBillingColumns = () =>\r\n createSelector(gridColumn, (memColState) => memColState.memberBilling);\r\n\r\nconst selectMemberActivityLogColumns = () =>\r\n createSelector(gridColumn, (memColState) => memColState.activityLog);\r\n\r\nconst selectMemberContactHistoryColumns = () =>\r\n createSelector(gridColumn, (memColState) => memColState.contactHistory);\r\n\r\n// tag line\r\nconst selectMemberIsTagLineUploadMediaOpen = () =>\r\n createSelector(\r\n tagLine,\r\n (tagLineState) => tagLineState.isUploadTagLineMediaOpen\r\n );\r\n\r\nconst selectMemberIsPreviewTagLineUploadMediaOpen = () =>\r\n createSelector(\r\n tagLine,\r\n (tagLineState) => tagLineState.isShowPreviewUploadTagLineMedia\r\n );\r\n\r\nconst selectMemberIsShowUploadTagLineMedia = () =>\r\n createSelector(\r\n tagLine,\r\n (tagLineState) => tagLineState.isShowUploadTagLineMedia\r\n );\r\n\r\nexport {\r\n selectMemberProfile,\r\n selectMemberError,\r\n selectMemberProfileLoading,\r\n selectMemberContact,\r\n selectBrands,\r\n selectBrand,\r\n selectDocument,\r\n selectInformationSheet,\r\n selectAsset,\r\n selectMemberContactHistory,\r\n selectMemberContactHistoryError,\r\n selectMemberContactHistoryLoading,\r\n selectMemberContactColumns,\r\n selectContactLocationColumns,\r\n selectMemberBillingColumns,\r\n selectMemberActivityLogColumns,\r\n selectMemberContactHistoryColumns,\r\n selectMemberIsTagLineUploadMediaOpen,\r\n selectMemberIsShowUploadTagLineMedia,\r\n selectErrorPreview,\r\n selectLoadingPreview,\r\n selectShortDetailPreview,\r\n selectPublicContactColumn,\r\n selectMemberIsPreviewTagLineUploadMediaOpen,\r\n selectPublicContactList,\r\n selectInitialPublicContactList,\r\n selectDocumentDetail,\r\n selectLoadingDocumentGrid,\r\n selectLoadingGetDocument,\r\n};\r\n","export const GET_COMPANY_INFO = 'GET_COMPANY_INFO';\r\nexport const GET_COMPANY_INFO_SUCCESS = 'GET_COMPANY_INFO_SUCCESS';\r\nexport const GET_COMPANY_INFO_ERROR = 'GET_COMPANY_INFO_ERROR';\r\nexport const GET_COMPANY_INFO_SHOWCASED_MEDIA_GRID =\r\n 'GET_COMPANY_INFO_SHOWCASED_MEDIA_GRID';\r\nexport const GET_COMPANY_INFO_OVERVIEW_SHOWCASED_MEDIA_SUCCESS =\r\n 'GET_COMPANY_INFO_OVERVIEW_SHOWCASED_MEDIA_SUCCESS';\r\nexport const GET_COMPANY_INFO_SHOWCASED_MEDIA_GRID_ERROR =\r\n 'GET_COMPANY_INFO_SHOWCASED_MEDIA_GRID_ERROR';\r\nexport const GET_OFFICES_AND_FACILITIES = 'GET_OFFICES_AND_FACILITIES';\r\nexport const GET_OFFICES_AND_FACILITIES_SUCCESS =\r\n 'GET_OFFICES_AND_FACILITIES_SUCCESS';\r\nexport const GET_OFFICES_AND_FACILITIES_ERROR =\r\n 'GET_OFFICES_AND_FACILITIES_ERROR';\r\n\r\n// get member brands\r\nexport const GET_MEMBER_COMPANY_BRANDS = 'GET_MEMBER_COMPANY_BRANDS';\r\nexport const GET_MEMBER_COMPANY_BRANDS_SUCCESS =\r\n 'GET_MEMBER_COMPANY_BRANDS_SUCCESS';\r\nexport const GET_MEMBER_COMPANY_BRANDS_ERROR =\r\n 'GET_MEMBER_COMPANY_BRANDS_ERROR';\r\n\r\nexport const GET_MEMBER_ID = 'GET_MEMBER_ID';\r\nexport const RESET_COMPANY_INFO_ERROR = 'RESET_COMPANY_INFO_ERROR';\r\n","import produce from 'immer';\r\nimport * as types from './constants';\r\n\r\n// initial state\r\nexport const initialState = {\r\n loadingCompanyInfo: false,\r\n errorCompanyInfo: false,\r\n loadingOffice: false,\r\n companyInfo: null,\r\n loadingShowcasedAsset: false,\r\n // overviewShowcasedAssets: [], // overview showcased\r\n // showcasedAssets: [], // showcased on tab showcase\r\n errorShowcasedAssets: null,\r\n officesList: null,\r\n errorOffice: false,\r\n totalOffice: null,\r\n overviewShowcasedAssets: {\r\n items: [],\r\n pagination: [],\r\n totalRecord: 0,\r\n pageIndex: 0,\r\n loading: false,\r\n error: null,\r\n },\r\n brands: {\r\n loading: false,\r\n pageIndex: 1,\r\n pageSize: 20,\r\n totalItems: 0,\r\n brandsList: [],\r\n columns: [],\r\n memberId: null,\r\n },\r\n memberId: null,\r\n};\r\n\r\n/* eslint-disable default-case, no-param-reassign */\r\nconst companyReducer = (state = initialState, action) =>\r\n produce(state, (draft) => {\r\n switch (action.type) {\r\n case types.GET_COMPANY_INFO:\r\n draft.loadingCompanyInfo = true;\r\n break;\r\n case types.GET_COMPANY_INFO_SUCCESS:\r\n draft.loadingCompanyInfo = false;\r\n draft.companyInfo = action.data;\r\n break;\r\n case types.GET_COMPANY_INFO_ERROR:\r\n draft.loadingCompanyInfo = false;\r\n draft.companyInfo = null;\r\n draft.errorCompanyInfo = action.error;\r\n break;\r\n case types.RESET_COMPANY_INFO_ERROR:\r\n draft.errorCompanyInfo = false;\r\n break;\r\n case types.GET_COMPANY_INFO_SHOWCASED_MEDIA_GRID:\r\n draft.overviewShowcasedAssets.loading = true;\r\n break;\r\n case types.GET_COMPANY_INFO_OVERVIEW_SHOWCASED_MEDIA_SUCCESS:\r\n draft.overviewShowcasedAssets.loading = false;\r\n draft.overviewShowcasedAssets.items = action.payload.gridData;\r\n draft.overviewShowcasedAssets.pagination = action.payload.paging;\r\n break;\r\n case types.GET_COMPANY_INFO_SHOWCASED_MEDIA_GRID_ERROR:\r\n draft.overviewShowcasedAssets.loading = false;\r\n draft.overviewShowcasedAssets.items = [];\r\n draft.overviewShowcasedAssets.pagination = null;\r\n draft.overviewShowcasedAssets.error = action.error;\r\n break;\r\n case types.GET_OFFICES_AND_FACILITIES:\r\n draft.loadingOffice = true;\r\n break;\r\n case types.GET_OFFICES_AND_FACILITIES_SUCCESS:\r\n draft.loadingOffice = false;\r\n draft.officesList = action?.data?.gridData;\r\n draft.totalOffice = action?.data?.paging?.totalRecord;\r\n break;\r\n case types.GET_OFFICES_AND_FACILITIES_ERROR:\r\n draft.loadingOffice = false;\r\n draft.officesList = null;\r\n draft.errorOffice = action.error;\r\n break;\r\n case types.GET_MEMBER_COMPANY_BRANDS:\r\n draft.brands['loading'] = true;\r\n break;\r\n case types.GET_MEMBER_COMPANY_BRANDS_SUCCESS:\r\n draft.brands['loading'] = false;\r\n draft.brands['brandsList'] = action?.data?.gridData || [];\r\n draft.brands['pageIndex'] =\r\n action?.data?.paging?.currentPageIndex ||\r\n initialState.brands.pageIndex;\r\n draft.brands['pageSize'] =\r\n action?.data?.paging?.currentPageSize || initialState.brands.pageSize;\r\n draft.brands['totalItems'] =\r\n action?.data?.paging?.totalRecord || initialState.brands.totalItems;\r\n break;\r\n case types.GET_MEMBER_COMPANY_BRANDS_ERROR:\r\n draft.brands['loading'] = false;\r\n break;\r\n case types.GET_MEMBER_ID:\r\n draft.memberId = action.memberId;\r\n break;\r\n }\r\n });\r\n\r\nexport default companyReducer;\r\n","import { createSelector } from 'reselect';\r\nimport { initialState } from './reducer';\r\n\r\nconst companyState = (state) => state.company || initialState;\r\n\r\nconst setlectCompanyLoading = () =>\r\n createSelector(companyState, (state) => state.loadingCompanyInfo);\r\nconst setlectCompanyInfo = () =>\r\n createSelector(companyState, (state) => state.companyInfo);\r\nconst setlectCompanyError = () =>\r\n createSelector(companyState, (state) => state.errorCompanyInfo);\r\n\r\nconst selectShowcasedAssetLoading = () =>\r\n createSelector(companyState, (state) => state.loadingShowcasedAsset);\r\n\r\nconst selectOverviewShowcasedAsset = () =>\r\n createSelector(companyState, (state) => state.overviewShowcasedAssets);\r\n\r\nconst selectShowcasedAssetError = () =>\r\n createSelector(companyState, (state) => state.errorShowcasedAssets);\r\nconst selectLoadingOffice = () =>\r\n createSelector(companyState, (state) => state.errorShowcasedAssets);\r\nconst selectOfficeList = () =>\r\n createSelector(companyState, (state) => state.officesList);\r\nconst selectTotalOffice = () =>\r\n createSelector(companyState, (state) => state.totalOffice);\r\n// select member Brands\r\nconst selectBrands = () => {\r\n return createSelector(companyState, (state) => state.brands);\r\n};\r\nconst makeSelectMemberId = () =>\r\n createSelector(companyState, (state) => state.memberId);\r\n\r\nexport {\r\n setlectCompanyLoading,\r\n setlectCompanyInfo,\r\n setlectCompanyError,\r\n selectShowcasedAssetLoading,\r\n selectOverviewShowcasedAsset,\r\n selectShowcasedAssetError,\r\n selectLoadingOffice,\r\n selectOfficeList,\r\n selectTotalOffice,\r\n selectBrands,\r\n makeSelectMemberId,\r\n};\r\n","import * as types from './constants';\r\n\r\nexport function toggleEditLayout(payload) {\r\n return {\r\n type: types.TOGGLE_EDIT_LAYOUT,\r\n payload,\r\n };\r\n}\r\n\r\nexport function updateLayoutChanged(payload) {\r\n return {\r\n type: types.UPDATE_LAYOUT_CHANGED,\r\n payload,\r\n };\r\n}\r\n\r\nexport function calendarDayView(calendarView) {\r\n return {\r\n type: types.CALENDAR_DAY_VIEW,\r\n calendarView,\r\n };\r\n}\r\n\r\nexport function calendarWeekView(calendarView) {\r\n return {\r\n type: types.CALENDAR_WEEK_VIEW,\r\n calendarView,\r\n };\r\n}\r\n\r\nexport function calendarMonthView(calendarView) {\r\n return {\r\n type: types.CALENDAR_MONTH_VIEW,\r\n calendarView,\r\n };\r\n}\r\n\r\nexport function calendarScheduleView(calendarView) {\r\n return {\r\n type: types.CALENDAR_SCHEDULE_VIEW,\r\n calendarView,\r\n };\r\n}\r\n\r\nexport function getMeetingList(fromDate, toDate) {\r\n return {\r\n type: types.GET_MEETING_LIST,\r\n fromDate,\r\n toDate,\r\n };\r\n}\r\n\r\nexport function getMeetingListSuccess(meetingList) {\r\n return {\r\n type: types.GET_MEETING_LIST_SUCCESS,\r\n meetingList,\r\n };\r\n}\r\n\r\nexport function getMeetingListError(error) {\r\n return {\r\n type: types.GET_MEETING_LIST_ERROR,\r\n error,\r\n };\r\n}\r\n\r\nexport function updateCalendarDate(calendarDate) {\r\n return {\r\n type: types.UPDATE_CALENDAR_DATE,\r\n calendarDate,\r\n };\r\n}\r\n\r\nexport const getScheduleList = (params) => ({\r\n type: types.GET_SCHEDULE_LIST,\r\n payload: params,\r\n});\r\n\r\nexport const getScheduleListSuccess = (params) => {\r\n return {\r\n type: types.GET_SCHEDULE_LIST_SUCCESS,\r\n payload: params,\r\n };\r\n};\r\n\r\nexport const getScheduleListError = (error) => ({\r\n type: types.GET_SCHEDULE_LIST_ERROR,\r\n payload: error,\r\n});\r\n\r\nexport const getProjectsGrid = () => ({\r\n type: types.GET_PROJECTS_GRID,\r\n});\r\n\r\nexport const getProjectsGridSuccess = (data) => {\r\n return {\r\n type: types.GET_PROJECTS_GRID_SUCCESS,\r\n data,\r\n };\r\n};\r\n\r\nexport const getProjectsGridError = (error) => ({\r\n type: types.GET_PROJECTS_GRID_ERROR,\r\n error,\r\n});\r\n\r\nexport const saveIdMeeting = (meetingId) => ({\r\n type: types.SAVE_ID_MEETING,\r\n meetingId,\r\n});\r\n\r\nexport const getMeetingDetails = (params) => ({\r\n type: types.GET_MEETING_DETAILS,\r\n params,\r\n});\r\n\r\nexport const getMeetingDetailsSuccess = (params) => {\r\n return {\r\n type: types.GET_MEETING_DETAILS_SUCCESS,\r\n payload: params,\r\n };\r\n};\r\n\r\nexport const getMeetingDetailsError = (error) => ({\r\n type: types.GET_MEETING_DETAILS_ERROR,\r\n payload: error,\r\n});\r\n\r\nexport const resetMeetingDetails = (params) => ({\r\n type: types.RESET_MEETING_DETAILS,\r\n payload: params,\r\n});\r\n","// Action Types\r\nexport const TOGGLE_EDIT_LAYOUT = 'TOGGLE_EDIT_LAYOUT';\r\n\r\nexport const UPDATE_LAYOUT_CHANGED = 'UPDATE_LAYOUT_CHANGED';\r\n\r\nexport const CALENDAR_DAY_VIEW = 'CALENDAR_DAY_VIEW';\r\nexport const CALENDAR_WEEK_VIEW = 'CALENDAR_WEEK_VIEW';\r\nexport const CALENDAR_MONTH_VIEW = 'CALENDAR_MONTH_VIEW';\r\nexport const CALENDAR_SCHEDULE_VIEW = 'CALENDAR_SCHEDULE_VIEW';\r\n\r\nexport const GET_MEETING_LIST = 'GET_MEETING_LIST';\r\nexport const GET_MEETING_LIST_SUCCESS = 'GET_MEETING_LIST_SUCCESS';\r\nexport const GET_MEETING_LIST_ERROR = 'GET_MEETING_LIST_ERROR';\r\n\r\nexport const GET_SCHEDULE_LIST = 'GET_SCHEDULE_LIST';\r\nexport const GET_SCHEDULE_LIST_SUCCESS = 'GET_SCHEDULE_LIST_SUCCESS';\r\nexport const GET_SCHEDULE_LIST_ERROR = 'GET_SCHEDULE_LIST_ERROR';\r\n\r\nexport const GET_PROJECTS_GRID = 'GET_PROJECTS_GRID';\r\nexport const GET_PROJECTS_GRID_SUCCESS = 'GET_PROJECTS_GRID_SUCCESS';\r\nexport const GET_PROJECTS_GRID_ERROR = 'GET_PROJECTS_GRID_ERROR';\r\n\r\nexport const UPDATE_CALENDAR_DATE = 'UPDATE_CALENDAR_DATE';\r\n\r\nexport const SAVE_ID_MEETING = 'SAVE_ID_MEETING';\r\nexport const SET_SELECTED_DATE = 'SET_SELECTED_DATE';\r\n\r\nexport const GET_MEETING_DETAILS = 'GET_MEETING_DETAILS';\r\nexport const GET_MEETING_DETAILS_SUCCESS = 'GET_MEETING_DETAILS_SUCCESS';\r\nexport const GET_MEETING_DETAILS_ERROR = 'GET_MEETING_DETAILS_ERROR';\r\nexport const RESET_MEETING_DETAILS = 'RESET_MEETING_DETAILS';\r\n","import produce from 'immer';\r\nimport * as types from './constants';\r\n\r\n// initial state\r\nexport const initialState = {\r\n editingLayout: false,\r\n isLayoutChanged: false,\r\n calendarView: 'day',\r\n calendarDate: new Date(),\r\n loadingCalendar: false,\r\n meetingList: [],\r\n errorCalendar: false,\r\n scheduleList: {\r\n loading: false,\r\n data: [],\r\n error: null,\r\n },\r\n projectList: {\r\n loading: false,\r\n data: [],\r\n error: false,\r\n },\r\n meetingId: null,\r\n\r\n selectedDate: {\r\n meetingId: null,\r\n startTime: null,\r\n endTime: null,\r\n },\r\n\r\n meetingDetails: {\r\n loading: false,\r\n data: null,\r\n error: null,\r\n },\r\n};\r\n\r\n/* eslint-disable default-case, no-param-reassign */\r\nconst productReducer = (state = initialState, action) =>\r\n produce(state, (draft) => {\r\n switch (action.type) {\r\n case types.TOGGLE_EDIT_LAYOUT:\r\n draft.editingLayout = action.payload;\r\n break;\r\n case types.UPDATE_LAYOUT_CHANGED:\r\n draft.isLayoutChanged = action.payload;\r\n break;\r\n case types.CALENDAR_DAY_VIEW:\r\n case types.CALENDAR_WEEK_VIEW:\r\n case types.CALENDAR_MONTH_VIEW:\r\n case types.CALENDAR_SCHEDULE_VIEW:\r\n draft.calendarView = action.calendarView;\r\n break;\r\n case types.GET_MEETING_LIST:\r\n draft.loadingCalendar = true;\r\n draft.errorCalendar = false;\r\n draft.meetingList = [];\r\n break;\r\n case types.GET_MEETING_LIST_SUCCESS:\r\n draft.loadingCalendar = false;\r\n draft.meetingList = action.meetingList;\r\n break;\r\n case types.GET_MEETING_LIST_ERROR:\r\n draft.loadingCalendar = false;\r\n draft.errorCalendar = action.error;\r\n break;\r\n\r\n case types.UPDATE_CALENDAR_DATE:\r\n draft.calendarDate = action.calendarDate;\r\n break;\r\n\r\n case types.GET_SCHEDULE_LIST:\r\n draft['scheduleList'].loading = true;\r\n draft['scheduleList'].data = [];\r\n draft['scheduleList'].error = null;\r\n break;\r\n case types.GET_SCHEDULE_LIST_SUCCESS:\r\n draft['scheduleList'].loading = false;\r\n draft['scheduleList'].data = action.payload;\r\n break;\r\n case types.GET_SCHEDULE_LIST_ERROR:\r\n draft['scheduleList'].loading = false;\r\n draft['scheduleList'].error = action.payload;\r\n break;\r\n case types.GET_PROJECTS_GRID:\r\n draft.projectList['loading'] = true;\r\n break;\r\n case types.GET_PROJECTS_GRID_SUCCESS:\r\n draft.projectList['loading'] = false;\r\n draft.projectList['data'] = action.data;\r\n break;\r\n case types.GET_PROJECTS_GRID_ERROR:\r\n draft.projectList['loading'] = false;\r\n draft.projectList['error'] = action.error;\r\n break;\r\n\r\n case types.SAVE_ID_MEETING:\r\n draft['meetingId'] = action.meetingId;\r\n break;\r\n\r\n case types.SET_SELECTED_DATE:\r\n draft.selectedDate['meetingId'] = action.payload?.id;\r\n draft.selectedDate['startTime'] = action.payload?.startTime;\r\n draft.selectedDate['endTime'] = action.payload?.endTime;\r\n break;\r\n\r\n case types.GET_MEETING_DETAILS:\r\n draft['meetingDetails'].loading = true;\r\n draft['meetingDetails'].data = [];\r\n draft['meetingDetails'].error = null;\r\n break;\r\n case types.GET_MEETING_DETAILS_SUCCESS:\r\n draft['meetingDetails'].loading = false;\r\n draft['meetingDetails'].data = action.payload;\r\n break;\r\n case types.GET_MEETING_DETAILS_ERROR:\r\n draft['meetingDetails'].loading = false;\r\n draft['meetingDetails'].error = action.payload;\r\n break;\r\n case types.RESET_MEETING_DETAILS:\r\n draft['meetingDetails'].loading = false;\r\n draft['meetingDetails'].data = null;\r\n draft['meetingDetails'].error = null;\r\n draft.meetingList = [];\r\n break;\r\n }\r\n });\r\n\r\nexport default productReducer;\r\n","import { createSelector } from 'reselect';\r\nimport { initialState } from './reducer';\r\n\r\nconst selectDashboard = (state) => state.dashboard || initialState;\r\n\r\nconst makeSelectEditingLayout = () =>\r\n createSelector(\r\n selectDashboard,\r\n (dashboardState) => dashboardState.editingLayout\r\n );\r\n\r\nconst makeSelectLayoutChanged = () =>\r\n createSelector(\r\n selectDashboard,\r\n (dashboardState) => dashboardState.isLayoutChanged\r\n );\r\nconst makeSelectCalendarView = () =>\r\n createSelector(\r\n selectDashboard,\r\n (dashboardState) => dashboardState.calendarView\r\n );\r\nconst makeSelectCalendarDate = () =>\r\n createSelector(\r\n selectDashboard,\r\n (dashboardState) => dashboardState.calendarDate\r\n );\r\nconst makeSelectMeetingList = () =>\r\n createSelector(\r\n selectDashboard,\r\n (dashboardState) => dashboardState.meetingList\r\n );\r\nconst makeSelectScheduleList = () =>\r\n createSelector(\r\n selectDashboard,\r\n (dashboardState) => dashboardState.scheduleList\r\n );\r\n\r\nconst makeSelectProjectsList = () =>\r\n createSelector(\r\n selectDashboard,\r\n (dashboardState) => dashboardState.projectList\r\n );\r\n\r\nconst makeSelectMeetingId = () =>\r\n createSelector(selectDashboard, (dashboardState) => dashboardState.meetingId);\r\n\r\nconst makeSelectedDate = () =>\r\n createSelector(\r\n selectDashboard,\r\n (dashboardState) => dashboardState.selectedDate\r\n );\r\n\r\nconst makeSelectLoadingCalendar = () =>\r\n createSelector(\r\n selectDashboard,\r\n (dashboardState) => dashboardState.loadingCalendar\r\n );\r\n\r\nconst makeSelectMeetingDetails = () =>\r\n createSelector(\r\n selectDashboard,\r\n (dashboardState) => dashboardState.meetingDetails\r\n );\r\n\r\nexport {\r\n makeSelectEditingLayout,\r\n makeSelectLayoutChanged,\r\n makeSelectScheduleList,\r\n makeSelectProjectsList,\r\n makeSelectCalendarView,\r\n makeSelectMeetingList,\r\n makeSelectCalendarDate,\r\n makeSelectMeetingId,\r\n makeSelectedDate,\r\n makeSelectLoadingCalendar,\r\n makeSelectMeetingDetails,\r\n};\r\n","import React from 'react';\r\nimport Messages from 'i18n/messages/maintenance';\r\nimport { LogoutOutlined } from '@ant-design/icons';\r\nimport { forwardTo } from 'utils/common/route';\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\n\r\nconst BackToEula = () => {\r\n return (\r\n }\r\n label={Messages.backToEula}\r\n onClick={() => forwardTo('/maintenance/eula/list')}\r\n />\r\n );\r\n};\r\n\r\nexport default BackToEula;\r\n","import React from 'react';\r\n\r\nimport { SaveOutlined, CloseCircleOutlined } from '@ant-design/icons';\r\n\r\nimport { RibbonBar, RibbonButton, RibbonDivider } from 'common/components';\r\nimport { Can } from 'context/Can';\r\nimport {\r\n AdvanceStack,\r\n DetailSection,\r\n ManageSharingSection,\r\n ViewLayout,\r\n} from 'pages/home/ribbon/components';\r\n\r\nimport Messages from 'i18n/messages/maintenance';\r\n\r\nimport { ABILITY_ACTION, ABILITY_SUBJECT } from 'static/Permission';\r\nimport BackToEula from 'pages/home/ribbon/components/controls/maintenance/eula/BackToEula';\r\nimport { forwardTo } from 'utils/common/route';\r\n\r\nconst EulaRibbon = (props) => {\r\n const { loading, disabled, onSubmit } = props;\r\n\r\n const handleCancelEula = () => {\r\n forwardTo('/maintenance/eula/list');\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n label={Messages.saveEula}\r\n onClick={onSubmit}\r\n loading={loading}\r\n />\r\n }\r\n label={Messages.cancelEula}\r\n onClick={handleCancelEula}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default EulaRibbon;\r\n","import * as types from './constants';\r\n\r\n//* get grid columns\r\nexport const getEulaGridColumns = (gridName) => ({\r\n type: types.GET_EULA_MAINTENANCE_GRID_COLUMNS,\r\n gridName,\r\n});\r\n\r\nexport const getEulaGridColumnsSuccess = (data) => ({\r\n type: types.GET_EULA_MAINTENANCE_GRID_COLUMNS_SUCCESS,\r\n payload: data,\r\n});\r\n\r\nexport const getEulaGridColumnsFailure = () => ({\r\n type: types.GET_EULA_MAINTENANCE_GRID_COLUMNS_FAILURE,\r\n});\r\n\r\nexport const createEula = (params) => ({\r\n type: types.CREATE_EULA,\r\n payload: params,\r\n});\r\n\r\nexport const createEulaSuccess = (id) => ({\r\n type: types.CREATE_EULA_SUCCESS,\r\n id,\r\n});\r\n\r\nexport const createEulaError = (error) => ({\r\n type: types.CREATE_EULA_ERROR,\r\n error,\r\n});\r\n\r\nexport const cloneEula = (params) => ({\r\n type: types.CLONE_EULA,\r\n payload: params,\r\n});\r\n\r\nexport const cloneEulaSuccess = (id) => ({\r\n type: types.CLONE_EULA_SUCCESS,\r\n id,\r\n});\r\n\r\nexport const cloneEulaError = (error) => ({\r\n type: types.CLONE_EULA_ERROR,\r\n error,\r\n});\r\n\r\nexport const resetSaveEula = () => ({\r\n type: types.RESET_SAVE_EULA,\r\n});\r\n\r\nexport const enableEditEula = () => ({\r\n type: types.ENABLE_EULA_MAINTENANCE_EDIT,\r\n});\r\n\r\nexport const disableEditEula = () => ({\r\n type: types.DISABLE_EULA_MAINTENANCE_EDIT,\r\n});\r\n\r\nexport const enableCreateEula = () => ({\r\n type: types.ENABLE_EULA_MAINTENANCE_CREATE,\r\n});\r\n\r\nexport const disableCreateEula = () => ({\r\n type: types.DISABLE_EULA_MAINTENANCE_CREATE,\r\n});\r\n\r\nexport const confirmCloneEula = () => ({\r\n type: types.CONFIRM_CLONE_EULA_MAINTENANCE,\r\n});\r\n\r\n\r\nexport const resetConfirmCloneEula = () => ({\r\n type: types.RESET_CONFIRM_CLONE_EULA_MAINTENANCE,\r\n});\r\n\r\n\r\n\r\nexport const saveIdEula = (id) => ({\r\n type: types.SAVE_ID_EULA,\r\n data: id,\r\n});\r\n\r\n//* get grid data\r\nexport const getEulaList = ({ pageSize, pageNumber, search }) => ({\r\n type: types.GET_EULA_MAINTENANCE_LIST,\r\n pageSize: pageSize,\r\n pageIndex: pageNumber,\r\n search,\r\n});\r\n\r\nexport const getEulaListSuccess = (data, total) => ({\r\n type: types.GET_EULA_MAINTENANCE_LIST_SUCCESS,\r\n payload: data,\r\n total,\r\n});\r\n\r\nexport const getEulaListFailure = () => ({\r\n type: types.GET_EULA_MAINTENANCE_LIST_FAILURE,\r\n});\r\nexport function updateIsDetailsViewEula(isDetailsView) {\r\n return {\r\n type: types.EULA_DISABLED_VIEW_MODE,\r\n isDetailsView,\r\n };\r\n}\r\n\r\nexport const getEulaContentDetail = (params) => {\r\n return {\r\n type: types.GET_EULA_CONTENT_DETAIL,\r\n params,\r\n };\r\n};\r\nexport function getEulaContentDetailSuccess(data) {\r\n return {\r\n type: types.GET_EULA_CONTENT_DETAIL_SUCCESS,\r\n data,\r\n };\r\n}\r\n\r\nexport function getEulaContentDetailError(error) {\r\n return {\r\n type: types.GET_EULA_CONTENT_DETAIL_ERROR,\r\n error,\r\n };\r\n}\r\n\r\n//* toggle upload media box\r\nexport function toggleUploadEulaMedia(status) {\r\n return {\r\n type: types.TOGGLE_EULA_UPLOAD_MEDIA,\r\n status,\r\n };\r\n}\r\n\r\n//* get accepted user eula grid columns\r\nexport const getAcceptedUserEulaGridColumns = (gridName) => ({\r\n type: types.GET_ACCEPTED_USER_EULA_GRID_COLUMNS,\r\n gridName,\r\n});\r\n\r\nexport const getAcceptedUserEulaGridColumnsSuccess = (columns) => ({\r\n type: types.GET_ACCEPTED_USER_EULA_GRID_COLUMNS_SUCCESS,\r\n columns,\r\n});\r\n\r\nexport const getAcceptedUserEulaGridColumnsError = (error) => ({\r\n type: types.GET_ACCEPTED_USER_EULA_GRID_COLUMNS_ERROR,\r\n error,\r\n});\r\n\r\nexport function getAcceptedUserEulaList(pageNumber, pageSize, search) {\r\n return {\r\n type: types.GET_ACCEPTED_USER_EULA_LIST,\r\n pageIndex: pageNumber,\r\n pageSize,\r\n 'Search.SearchText': search,\r\n };\r\n}\r\n\r\nexport function getAcceptedUserEulaListSuccess(acceptedUserEula, total) {\r\n return {\r\n type: types.GET_ACCEPTED_USER_EULA_LIST_SUCCESS,\r\n acceptedUserEula,\r\n total,\r\n };\r\n}\r\n\r\nexport function getAcceptedUserEulaListError(error) {\r\n return {\r\n type: types.GET_ACCEPTED_USER_EULA_LIST_ERROR,\r\n error,\r\n };\r\n}\r\n","//* get grid columns\r\nexport const GET_EULA_MAINTENANCE_GRID_COLUMNS =\r\n 'GET_EULA_MAINTENANCE_GRID_COLUMN';\r\nexport const GET_EULA_MAINTENANCE_GRID_COLUMNS_SUCCESS =\r\n 'GET_EULA_MAINTENANCE_GRID_COLUMNS_SUCCESS';\r\nexport const GET_EULA_MAINTENANCE_GRID_COLUMNS_FAILURE =\r\n 'GET_EULA_MAINTENANCE_GRID_COLUMNS_FAILURE';\r\n\r\nexport const CREATE_EULA = 'CREATE_EULA';\r\nexport const CREATE_EULA_SUCCESS = 'CREATE_EULA_SUCCESS';\r\nexport const CREATE_EULA_ERROR = 'CREATE_EULA_ERROR';\r\n\r\nexport const CLONE_EULA = 'CLONE_CREATE';\r\nexport const CLONE_EULA_SUCCESS = 'CLONE_EULA_SUCCESS';\r\nexport const CLONE_EULA_ERROR = 'CLONE_EULA_ERROR';\r\n\r\nexport const RESET_SAVE_EULA = 'RESET_SAVE_EULA';\r\n\r\nexport const ENABLE_EULA_MAINTENANCE_EDIT = 'ENABLE_EULA_MAINTENANCE_EDIT_POST';\r\nexport const DISABLE_EULA_MAINTENANCE_EDIT =\r\n 'DISABLE_EULA_MAINTENANCE_EDIT_POST';\r\n\r\nexport const ENABLE_EULA_MAINTENANCE_CREATE =\r\n 'ENABLE_EULA_MAINTENANCE_EDIT_CREATE';\r\nexport const DISABLE_EULA_MAINTENANCE_CREATE =\r\n 'ENABLE_EULA_MAINTENANCE_EDIT_CREATE';\r\n\r\nexport const CONFIRM_CLONE_EULA_MAINTENANCE = 'CONFIRM_CLONE_EULA_MAINTENANCE';\r\nexport const RESET_CONFIRM_CLONE_EULA_MAINTENANCE = 'RESET_CONFIRM_CLONE_EULA_MAINTENANCE';\r\n\r\n\r\nexport const SAVE_ID_EULA = 'SAVE_ID_EULA';\r\n\r\n//* get data list\r\nexport const GET_EULA_MAINTENANCE_LIST = 'GET_EULA_MAINTENANCE_LIST';\r\nexport const GET_EULA_MAINTENANCE_LIST_SUCCESS =\r\n 'GET_EULA_MAINTENANCE_LIST_SUCCESS';\r\nexport const GET_EULA_MAINTENANCE_LIST_FAILURE =\r\n 'GET_EULA_MAINTENANCE_LIST_FAILURE';\r\n\r\n// Only Eula Detail View\r\nexport const EULA_DISABLED_VIEW_MODE = 'EULA_DISABLED_VIEW_MODE';\r\n//* get detail data\r\nexport const GET_EULA_CONTENT_DETAIL = 'GET_EULA_CONTENT_DETAIL';\r\nexport const GET_EULA_CONTENT_DETAIL_SUCCESS =\r\n 'GET_EULA_CONTENT_DETAIL_SUCCESS';\r\nexport const GET_EULA_CONTENT_DETAIL_ERROR = 'GET_EULA_CONTENT_DETAIL_ERROR';\r\n\r\nexport const TOGGLE_EULA_UPLOAD_MEDIA = 'TOGGLE_EULA_UPLOAD_MEDIA';\r\n\r\n// Accepted user eula grid columns\r\nexport const GET_ACCEPTED_USER_EULA_GRID_COLUMNS =\r\n 'GET_ACCEPTED_USER_EULA_GRID_COLUMNS';\r\nexport const GET_ACCEPTED_USER_EULA_GRID_COLUMNS_SUCCESS =\r\n 'GET_ACCEPTED_USER_EULA_GRID_COLUMNS_SUCCESS';\r\nexport const GET_ACCEPTED_USER_EULA_GRID_COLUMNS_ERROR =\r\n 'GET_ACCEPTED_USER_EULA_GRID_COLUMNS_ERROR';\r\n// Accepted user eula list\r\nexport const GET_ACCEPTED_USER_EULA_LIST = 'GET_ACCEPTED_USER_EULA_LIST';\r\nexport const GET_ACCEPTED_USER_EULA_LIST_SUCCESS =\r\n 'GET_ACCEPTED_USER_EULA_LIST_SUCCESS';\r\nexport const GET_ACCEPTED_USER_EULA_LIST_ERROR =\r\n 'GET_ACCEPTED_USER_EULA_LIST_ERROR';\r\n","import produce from 'immer';\r\nimport * as types from './constants';\r\n\r\nexport const initialState = {\r\n gridLoading: false,\r\n gridColumns: [],\r\n eulaList: [],\r\n\r\n eulaForm: {\r\n id: null,\r\n statusSubmit: 'idle',\r\n statusClone: 'idle',\r\n error: null,\r\n\r\n isEdit: false,\r\n isCreate: false,\r\n isClone: false,\r\n },\r\n pageSize: 20,\r\n pageNumber: 1,\r\n gridTotal: 0,\r\n detailData: {},\r\n detailError: null,\r\n isUploadEulaMediaOpen: false,\r\n acceptedEulaLoading: false,\r\n acceptedEulaColumns: [],\r\n acceptedUserEula: [],\r\n acceptedEulaPageSize: 20,\r\n acceptedEulaPageNumber: 1,\r\n acceptedEulaTotal: 0,\r\n acceptedEulaError: false,\r\n acceptedSearch: '',\r\n reloadAcceptedEulaPage: false,\r\n};\r\n\r\n/* eslint-disable default-case, no-param-reassign */\r\nconst helpMaintenanceReducer = (state = initialState, action) =>\r\n produce(state, (draft) => {\r\n switch (action.type) {\r\n case types.GET_EULA_MAINTENANCE_GRID_COLUMNS:\r\n draft.gridLoading = true;\r\n break;\r\n case types.GET_EULA_MAINTENANCE_GRID_COLUMNS_SUCCESS:\r\n draft.gridLoading = false;\r\n draft.gridColumns = action.payload;\r\n break;\r\n case types.GET_EULA_MAINTENANCE_GRID_COLUMNS_FAILURE:\r\n draft.gridLoading = false;\r\n break;\r\n\r\n case types.CREATE_EULA:\r\n draft['eulaForm'].statusSubmit = 'loading';\r\n draft['eulaForm'].statusClone = 'idle';\r\n draft['eulaForm'].isClone = false;\r\n draft['eulaForm'].isCreate = false;\r\n break;\r\n case types.CREATE_EULA_SUCCESS:\r\n draft['eulaForm'].statusSubmit = 'success';\r\n draft['eulaForm'].id = action.id;\r\n break;\r\n case types.CREATE_EULA_ERROR:\r\n draft['eulaForm'].statusSubmit = 'error';\r\n draft['eulaForm'].error = action.error;\r\n break;\r\n\r\n case types.CLONE_EULA:\r\n draft['eulaForm'].statusClone = 'loading';\r\n break;\r\n case types.CLONE_EULA_SUCCESS:\r\n draft['eulaForm'].statusClone = 'success';\r\n break;\r\n case types.CLONE_EULA_ERROR:\r\n draft['eulaForm'].statusClone = 'error';\r\n break;\r\n\r\n case types.RESET_SAVE_EULA:\r\n draft['eulaForm'].statusSubmit = 'idle';\r\n draft['eulaForm'].statusClone = 'idle';\r\n draft['eulaForm'].isClone = false;\r\n draft['eulaForm'].isCreate = false;\r\n break;\r\n\r\n case types.ENABLE_EULA_MAINTENANCE_EDIT:\r\n draft['eulaForm'].isCreate = false;\r\n draft['eulaForm'].isEdit = true;\r\n break;\r\n\r\n case types.DISABLE_EULA_MAINTENANCE_EDIT:\r\n draft['eulaForm'].isEdit = false;\r\n break;\r\n\r\n case types.ENABLE_EULA_MAINTENANCE_CREATE:\r\n draft['eulaForm'].isCreate = true;\r\n draft['eulaForm'].isEdit = false;\r\n break;\r\n\r\n case types.CONFIRM_CLONE_EULA_MAINTENANCE:\r\n draft['eulaForm'].isClone = true;\r\n break;\r\n\r\n \r\n case types.RESET_CONFIRM_CLONE_EULA_MAINTENANCE:\r\n draft['eulaForm'].isClone = false;\r\n break;\r\n\r\n\r\n case types.SAVE_ID_EULA:\r\n draft['eulaForm'].id = action.data;\r\n break;\r\n\r\n case types.GET_EULA_MAINTENANCE_LIST:\r\n draft.gridLoading = true;\r\n draft.pageSize = action.pageSize;\r\n draft.pageNumber = action.pageIndex;\r\n break;\r\n case types.GET_EULA_MAINTENANCE_LIST_SUCCESS:\r\n draft.gridLoading = false;\r\n draft.eulaList = action.payload;\r\n draft.gridTotal = action.total;\r\n break;\r\n case types.GET_EULA_MAINTENANCE_LIST_FAILURE:\r\n draft.gridLoading = false;\r\n break;\r\n case types.EULA_DISABLED_VIEW_MODE:\r\n draft.isDetailsView = action.isDetailsView;\r\n break;\r\n case types.GET_EULA_CONTENT_DETAIL:\r\n draft.detailLoading = true;\r\n draft.detailData = null;\r\n draft.detailError = null;\r\n break;\r\n case types.GET_EULA_CONTENT_DETAIL_SUCCESS:\r\n draft.detailLoading = false;\r\n draft.detailData = action.data;\r\n break;\r\n case types.GET_EULA_CONTENT_DETAIL_ERROR:\r\n draft.detailLoading = false;\r\n draft.detailData = null;\r\n draft.detailError = action.error;\r\n break;\r\n case types.TOGGLE_EULA_UPLOAD_MEDIA:\r\n draft.isUploadEulaMediaOpen = action.status;\r\n break;\r\n // Accepted user eula\r\n case types.GET_ACCEPTED_USER_EULA_GRID_COLUMNS:\r\n draft.acceptedEulaLoading = true;\r\n draft.acceptedEulaColumns = [];\r\n break;\r\n case types.GET_ACCEPTED_USER_EULA_GRID_COLUMNS_SUCCESS:\r\n draft.acceptedEulaLoading = false;\r\n draft.acceptedEulaColumns = action.columns;\r\n break;\r\n case types.GET_ACCEPTED_USER_EULA_GRID_COLUMNS_ERROR:\r\n draft.acceptedEulaLoading = false;\r\n draft.acceptedEulaColumns = [];\r\n draft.acceptedEulaError = action.error;\r\n break;\r\n case types.GET_ACCEPTED_USER_EULA_LIST:\r\n draft.acceptedEulaLoading = true;\r\n draft.acceptedEulaError = false;\r\n draft.acceptedEulaPageSize = action.pageSize;\r\n draft.acceptedEulaPageNumber = action.pageIndex;\r\n draft.acceptedSearch = action['Search.SearchText'];\r\n draft.reloadAcceptedEulaPage = false;\r\n\r\n break;\r\n case types.GET_ACCEPTED_USER_EULA_LIST_SUCCESS:\r\n draft.acceptedEulaLoading = false;\r\n draft.acceptedUserEula = action.acceptedUserEula;\r\n draft.acceptedEulaTotal = action.total;\r\n break;\r\n case types.GET_ACCEPTED_USER_EULA_LIST_ERROR:\r\n draft.acceptedEulaLoading = false;\r\n draft.acceptedEulaTotal = 0;\r\n draft.acceptedUserEula = [];\r\n draft.acceptedEulaError = action.error;\r\n break;\r\n default:\r\n break;\r\n }\r\n });\r\n\r\nexport default helpMaintenanceReducer;\r\n","import { createSelector } from 'reselect';\r\nimport { initialState } from './reducer';\r\n\r\nconst selectEulaMaintenance = (state) => state.eulaMaintenance || initialState;\r\n\r\nconst selectEulaGridLoading = () =>\r\n createSelector(selectEulaMaintenance, (eulaState) => eulaState.gridLoading);\r\n\r\nconst selectEulaForm = () =>\r\n createSelector(selectEulaMaintenance, (eulaState) => eulaState.eulaForm);\r\n\r\nconst selectEulaGridPageSize = () =>\r\n createSelector(selectEulaMaintenance, (eulaState) => eulaState.pageSize);\r\n\r\nconst selectEulaGridPageNumber = () =>\r\n createSelector(selectEulaMaintenance, (eulaState) => eulaState.pageNumber);\r\n\r\nconst selectEulaGridSearch = () =>\r\n createSelector(selectEulaMaintenance, (eulaState) => eulaState.search);\r\n\r\nconst selectEulaList = () =>\r\n createSelector(selectEulaMaintenance, (eulaState) => eulaState.eulaList);\r\n\r\nconst selectEulaGridColumns = () =>\r\n createSelector(selectEulaMaintenance, (eulaState) => eulaState.gridColumns);\r\n\r\nconst selectEulaGridTotal = () =>\r\n createSelector(selectEulaMaintenance, (eulaState) => eulaState.gridTotal);\r\n\r\nconst selectEulaDetailData = () =>\r\n createSelector(selectEulaMaintenance, (eulaState) => eulaState.detailData);\r\n\r\nconst selectIsDetailsViewEula = () =>\r\n createSelector(selectEulaMaintenance, (eulaState) => eulaState.isDetailsView);\r\n\r\nconst selectIsEulaUploadMediaOpen = () =>\r\n createSelector(\r\n selectEulaMaintenance,\r\n (eulaState) => eulaState.isUploadEulaMediaOpen\r\n );\r\n\r\n// Accepted user eula\r\nconst selectAcceptedUserEulaLoading = () =>\r\n createSelector(\r\n selectEulaMaintenance,\r\n (eulaState) => eulaState.acceptedEulaLoading\r\n );\r\nconst selectAcceptedUserEulaColumns = () =>\r\n createSelector(\r\n selectEulaMaintenance,\r\n (eulaState) => eulaState.acceptedEulaColumns\r\n );\r\nconst selectAcceptedUserEula = () =>\r\n createSelector(\r\n selectEulaMaintenance,\r\n (eulaState) => eulaState.acceptedUserEula\r\n );\r\nconst selectAcceptedUserEulaPageSize = () =>\r\n createSelector(\r\n selectEulaMaintenance,\r\n (eulaState) => eulaState.acceptedEulaPageSize\r\n );\r\nconst selectAcceptedUserEulaPageNumber = () =>\r\n createSelector(\r\n selectEulaMaintenance,\r\n (eulaState) => eulaState.acceptedEulaPageNumber\r\n );\r\nconst selectAcceptedUserEulaTotal = () =>\r\n createSelector(\r\n selectEulaMaintenance,\r\n (eulaState) => eulaState.acceptedEulaTotal\r\n );\r\nconst selectAcceptedUserEulaError = () =>\r\n createSelector(\r\n selectEulaMaintenance,\r\n (eulaState) => eulaState.acceptedEulaError\r\n );\r\nconst selectAcceptedUserEulaSearch = () =>\r\n createSelector(\r\n selectEulaMaintenance,\r\n (eulaState) => eulaState.acceptedSearch\r\n );\r\n\r\nexport {\r\n selectEulaGridLoading,\r\n selectEulaGridPageSize,\r\n selectEulaGridPageNumber,\r\n selectEulaGridSearch,\r\n selectEulaList,\r\n selectEulaGridColumns,\r\n selectEulaGridTotal,\r\n selectEulaDetailData,\r\n selectIsDetailsViewEula,\r\n selectEulaForm,\r\n selectIsEulaUploadMediaOpen,\r\n selectAcceptedUserEulaLoading,\r\n selectAcceptedUserEulaColumns,\r\n selectAcceptedUserEula,\r\n selectAcceptedUserEulaPageSize,\r\n selectAcceptedUserEulaPageNumber,\r\n selectAcceptedUserEulaTotal,\r\n selectAcceptedUserEulaError,\r\n selectAcceptedUserEulaSearch,\r\n};\r\n","import React from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { notification } from 'antd';\r\n\r\nimport { forwardTo } from 'utils/common/route';\r\nimport { ThumbnailItem } from 'common/components';\r\n\r\nimport AssetQuery from 'assets/query/AssetQuery.png';\r\nimport ProductQuery from 'assets/query/ProductQuery.png';\r\nimport MemberQuery from 'assets/query/MemberQuery.png';\r\nimport FolderQuery from 'assets/query/FolderQuery.png';\r\nimport ReportQuery from 'assets/query/ReportQuery.png';\r\n\r\nimport { RIBBON_TYPES } from 'static/Constants';\r\nimport * as actionsRibbon from '@redux/ribbon/actions';\r\nimport * as ribbonSelectors from '@redux/ribbon/selectors';\r\nimport * as actionsGlobal from '@redux/global/actions';\r\nimport * as actionsGridView from 'common/components/grid-view/controllers/actions';\r\nimport { updateSearchText } from 'pages/home/utils';\r\n\r\nimport {\r\n updateQueryConditions,\r\n updateQueryAdvance,\r\n updateIdQuery,\r\n} from 'utils/queryCondition';\r\nimport { Images } from 'config/assets';\r\n\r\nimport { useIntl } from 'react-intl';\r\nimport Messages from 'i18n/messages/home';\r\n\r\nconst QueryThumbnail = (props) => {\r\n const intl = useIntl();\r\n const dispatch = useDispatch();\r\n\r\n const { dataDetail, selected, onClickItemGrid, onClickCheckboxItem } = props;\r\n\r\n const {\r\n queryConditions,\r\n columns,\r\n ribbonTypes,\r\n urlForwardTo,\r\n searchText,\r\n primaryFieldsOnly,\r\n } = JSON.parse(dataDetail?.query);\r\n\r\n const closeDetailStack = useSelector(\r\n ribbonSelectors.selectCloseDetailStack()\r\n );\r\n\r\n const onDoubleClick = (item) => {\r\n dispatch(actionsGridView.myQueryDoubleClick(true));\r\n\r\n const invalidQuery = !urlForwardTo;\r\n\r\n if (invalidQuery) {\r\n showErrorMessage();\r\n return;\r\n }\r\n\r\n pushCloseDetailStack(urlForwardTo);\r\n forwardTo(`${urlForwardTo}?query=1`);\r\n\r\n if (ribbonTypes === RIBBON_TYPES.DETAILSVIEW) {\r\n dispatch(actionsGridView.chooseGridColumns(columns, dataDetail?.id));\r\n } else {\r\n dispatch(actionsGridView.chooseGridColumns([], dataDetail?.id));\r\n }\r\n updateQueryConditions(dispatch, queryConditions, urlForwardTo, true);\r\n updateQueryAdvance(dispatch, queryConditions, urlForwardTo, true);\r\n updateIdQuery(dispatch, dataDetail?.id, urlForwardTo, true);\r\n\r\n dispatch(actionsRibbon.changeType(ribbonTypes));\r\n dispatch(actionsGridView.updateVisible(false));\r\n dispatch(actionsGlobal.updateIsBackFromQuery(true));\r\n updateSearchText(\r\n dispatch,\r\n searchText,\r\n urlForwardTo,\r\n true,\r\n primaryFieldsOnly\r\n );\r\n dispatch(actionsGridView.checkQueryCondition(true));\r\n\r\n setTimeout(() => {\r\n dispatch(actionsGridView.toggleRefreshQuery(true));\r\n dispatch(actionsGridView.updatePrevPathnameQuery(urlForwardTo));\r\n }, 200);\r\n };\r\n\r\n const showErrorMessage = () => {\r\n notification.error({\r\n message: intl.formatMessage(Messages.queryOpenError),\r\n });\r\n };\r\n\r\n const pushCloseDetailStack = (urlForwardTo) => {\r\n const { name, stack } = closeDetailStack;\r\n dispatch(\r\n actionsRibbon.updateCloseDetailStack({\r\n name,\r\n stack: [...stack, urlForwardTo],\r\n })\r\n );\r\n };\r\n\r\n let image =\r\n dataDetail?.gridName === 'member-detail-grid'\r\n ? MemberQuery\r\n : dataDetail?.gridName === 'digital-asset-detail-grid'\r\n ? AssetQuery\r\n : dataDetail?.gridName === 'folder-detail-grid'\r\n ? FolderQuery\r\n : dataDetail?.gridName === 'products-for-member' ||\r\n dataDetail?.gridName === 'product-detail-grid'\r\n ? ProductQuery\r\n : dataDetail?.gridName === 'assets-for-member'\r\n ? AssetQuery\r\n : dataDetail?.gridName === 'query-reporting-grid'\r\n ? ReportQuery\r\n : Images.RIVIR_LOGO_DEFAULT;\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nQueryThumbnail.propTypes = {\r\n dataDetail: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default React.memo(QueryThumbnail);\r\n","import React from 'react';\r\nimport { Typography, Space, Row } from 'antd';\r\nimport { get } from 'lodash';\r\nimport PropTypes from 'prop-types';\r\nimport { FormattedMessage } from 'react-intl';\r\nimport Messages from 'i18n/messages/folder';\r\nimport { formatSizeUnits } from 'utils/formatSizeUnits';\r\n\r\nconst { Paragraph, Title, Text } = Typography;\r\n\r\nconst QueryTileBody = (props) => {\r\n const { dataDetail } = props;\r\n\r\n const name = get(dataDetail, 'name', '');\r\n // const folderSize = get(dataDetail, 'folderSize', 0);\r\n // const productCount = get(dataDetail, 'productCount', 0);\r\n // const assetCount = get(dataDetail, 'assetCount', 0);\r\n const ownerName = get(dataDetail, 'ownerFullName', '');\r\n // const memberName = get(dataDetail, 'memberName', '');\r\n\r\n const infoText = [\r\n {\r\n field: 'name',\r\n value: name,\r\n },\r\n {\r\n field: 'ownerName',\r\n value: ownerName,\r\n },\r\n // {\r\n // field: 'memberName',\r\n // value: memberName,\r\n // },\r\n // {\r\n // field: 'folderSize',\r\n // value: folderSize,\r\n // },\r\n // {\r\n // field: 'productCount',\r\n // value: productCount,\r\n // },\r\n // {\r\n // field: 'assetCount',\r\n // value: assetCount,\r\n // },\r\n ];\r\n\r\n const renderQueryBodyInfo = (infoText) => {\r\n return infoText.map(({ field, value }, index) => {\r\n if (field === 'name') {\r\n return (\r\n \r\n {value}\r\n \r\n );\r\n } else if (field === 'folderSize') {\r\n return (\r\n \r\n {formatSizeUnits(value)}\r\n \r\n );\r\n } else if (field === 'productCount' || field === 'assetCount') {\r\n let text;\r\n if (field === 'productCount') {\r\n text =\r\n value > 0 ? (\r\n \r\n ) : (\r\n \r\n );\r\n } else {\r\n text =\r\n value > 0 ? (\r\n \r\n ) : (\r\n \r\n );\r\n }\r\n return value > 0 ? (\r\n \r\n {value} {text}\r\n \r\n ) : null;\r\n } else {\r\n return (\r\n value && (\r\n \r\n {value}\r\n \r\n )\r\n );\r\n }\r\n });\r\n };\r\n\r\n return (\r\n
\r\n \r\n \r\n {renderQueryBodyInfo(infoText)}\r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nQueryTileBody.propTypes = {\r\n dataDetail: PropTypes.object,\r\n};\r\n\r\nexport default QueryTileBody;\r\n","import React from 'react';\r\nimport { Row, Col } from 'antd';\r\n\r\nimport { formatMDY } from 'utils/formatDate';\r\nimport { get } from 'lodash';\r\nimport PropTypes from 'prop-types';\r\nimport { FormattedMessage } from 'react-intl';\r\nimport Messages from 'i18n/messages/folder';\r\n\r\nconst QueryTileFooter = (props) => {\r\n const { dataDetail } = props;\r\n\r\n const dateCreated = get(dataDetail, 'created', '');\r\n const lastUpdated = get(dataDetail, 'lastModified', '');\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {dateCreated && formatMDY(dateCreated)}\r\n \r\n \r\n \r\n \r\n \r\n {lastUpdated && formatMDY(lastUpdated)}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nQueryTileFooter.propTypes = {\r\n size: PropTypes.string,\r\n lastUpdate: PropTypes.string,\r\n};\r\n\r\nexport default QueryTileFooter;\r\n","import React from 'react';\r\nimport { Row, Avatar } from 'antd';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport AssetQuery from 'assets/query/AssetQuery.png';\r\nimport ProductQuery from 'assets/query/ProductQuery.png';\r\nimport MemberQuery from 'assets/query/MemberQuery.png';\r\nimport FolderQuery from 'assets/query/FolderQuery.png';\r\nimport ReportQuery from 'assets/query/ReportQuery.png';\r\nimport { Images } from 'config/assets';\r\n\r\nconst QueryTileHeader = (props) => {\r\n const { dataDetail } = props;\r\n let image =\r\n dataDetail?.gridName === 'member-detail-grid'\r\n ? MemberQuery\r\n : dataDetail?.gridName === 'digital-asset-detail-grid'\r\n ? AssetQuery\r\n : dataDetail?.gridName === 'folder-detail-grid'\r\n ? FolderQuery\r\n : dataDetail?.gridName === 'products-for-member' ||\r\n dataDetail?.gridName === 'product-detail-grid'\r\n ? ProductQuery\r\n : dataDetail?.gridName === 'assets-for-member'\r\n ? AssetQuery\r\n : dataDetail?.gridName === 'query-reporting-grid'\r\n ? ReportQuery\r\n : Images.RIVIR_LOGO_DEFAULT;\r\n\r\n return (\r\n \r\n
\r\n\r\n
\r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nQueryTileHeader.propTypes = {\r\n dataDetail: PropTypes.object,\r\n};\r\n\r\nexport default QueryTileHeader;\r\n","import React from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { Tooltip, notification } from 'antd';\r\nimport { QueryTileBody, QueryTileFooter, QueryTileHeader } from '../index';\r\nimport { get } from 'lodash';\r\nimport useDoubleClick from 'hooks/useDoubleClick';\r\nimport './QueryTile.less';\r\n\r\nimport { forwardTo } from 'utils/common/route';\r\n\r\nimport { RIBBON_TYPES } from 'static/Constants';\r\nimport * as actionsRibbon from '@redux/ribbon/actions';\r\nimport * as ribbonSelectors from '@redux/ribbon/selectors';\r\nimport * as actionsGlobal from '@redux/global/actions';\r\nimport * as actionsGridView from 'common/components/grid-view/controllers/actions';\r\nimport { updateSearchText } from 'pages/home/utils';\r\n\r\nimport {\r\n updateQueryConditions,\r\n updateQueryAdvance,\r\n updateIdQuery,\r\n} from 'utils/queryCondition';\r\n\r\nimport { useIntl } from 'react-intl';\r\nimport Messages from 'i18n/messages/home';\r\n\r\nconst QueryTile = (props) => {\r\n const intl = useIntl();\r\n const dispatch = useDispatch();\r\n\r\n const { dataDetail, disableEvent } = props;\r\n const { onClickItemGrid } = props.clickEvents;\r\n const name = get(dataDetail, 'name', '');\r\n\r\n const pathname = window.location.pathname;\r\n const {\r\n queryConditions,\r\n columns,\r\n ribbonTypes,\r\n urlForwardTo,\r\n searchText,\r\n primaryFieldsOnly,\r\n } = JSON.parse(dataDetail?.query);\r\n\r\n const closeDetailStack = useSelector(\r\n ribbonSelectors.selectCloseDetailStack()\r\n );\r\n\r\n const divRef = React.useRef();\r\n useDoubleClick({\r\n onSingleClick: (e) => {\r\n if (onClickItemGrid) onClickItemGrid(dataDetail, e);\r\n },\r\n onDoubleClick: (e) => {\r\n const invalidQuery = !urlForwardTo;\r\n\r\n if (invalidQuery) {\r\n showErrorMessage();\r\n return;\r\n }\r\n\r\n pushCloseDetailStack(urlForwardTo);\r\n forwardTo(`${urlForwardTo}?query=1`);\r\n\r\n dispatch(actionsGridView.myQueryDoubleClick(true));\r\n if (ribbonTypes === RIBBON_TYPES.DETAILSVIEW) {\r\n dispatch(actionsGridView.chooseGridColumns(columns, dataDetail?.id));\r\n } else {\r\n dispatch(actionsGridView.chooseGridColumns([], dataDetail?.id));\r\n }\r\n\r\n updateQueryConditions(\r\n dispatch,\r\n queryConditions,\r\n window.location.pathname,\r\n true\r\n );\r\n updateQueryAdvance(\r\n dispatch,\r\n queryConditions,\r\n window.location.pathname,\r\n true\r\n );\r\n updateIdQuery(dispatch, dataDetail?.id, window.location.pathname, true);\r\n\r\n dispatch(actionsRibbon.changeType(ribbonTypes));\r\n dispatch(actionsGridView.updateVisible(false));\r\n dispatch(actionsGlobal.updateIsBackFromQuery(true));\r\n updateSearchText(\r\n dispatch,\r\n searchText,\r\n urlForwardTo,\r\n true,\r\n primaryFieldsOnly\r\n );\r\n dispatch(actionsGridView.checkQueryCondition(true));\r\n\r\n setTimeout(() => {\r\n dispatch(actionsGridView.toggleRefreshQuery(true));\r\n dispatch(actionsGridView.updatePrevPathnameQuery(urlForwardTo));\r\n }, 200);\r\n },\r\n ref: divRef,\r\n latency: 250,\r\n });\r\n\r\n const showErrorMessage = () => {\r\n notification.error({\r\n message: intl.formatMessage(Messages.queryOpenError),\r\n });\r\n };\r\n\r\n const pushCloseDetailStack = (urlForwardTo) => {\r\n const { name, stack } = closeDetailStack;\r\n dispatch(\r\n actionsRibbon.updateCloseDetailStack({\r\n name,\r\n stack: [...stack, urlForwardTo],\r\n })\r\n );\r\n };\r\n\r\n return (\r\n \r\n
\r\n {/*Placeholder for click events*/}\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default QueryTile;\r\n","import React, { useEffect, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Row, Col, Image, Typography } from 'antd';\r\n\r\nimport AssetQuery from 'assets/query/AssetQuery.png';\r\nimport ProductQuery from 'assets/query/ProductQuery.png';\r\nimport MemberQuery from 'assets/query/MemberQuery.png';\r\nimport FolderQuery from 'assets/query/FolderQuery.png';\r\nimport ReportQuery from 'assets/query/ReportQuery.png';\r\nimport { Images } from 'config/assets';\r\n\r\nimport { InfoWithLabel } from 'common/components';\r\nimport { formatMDY } from 'utils/formatDate';\r\n\r\nimport AdvancedSearchTitle from 'common/components/advanced-search/AdvancedSearchTitle';\r\nimport QueryConditions from 'common/components/grid-view/components/content-pane/advancedFilter/QueryConditions';\r\nimport PropertyAdvancedFilter from 'common/components/grid-view/components/content-pane/advancedFilter/PropertyAdvancedFilter';\r\nimport { useAdvanceFilter } from 'common/components/nested-advance-Search/hook/hook';\r\n\r\nimport './QueryPanel.less';\r\n\r\nconst QueryPanel = ({ dataDetail }) => {\r\n const [propertiesData, setPropertiesData] = useState();\r\n\r\n let image =\r\n dataDetail?.gridName === 'member-detail-grid'\r\n ? MemberQuery\r\n : dataDetail?.gridName === 'digital-asset-detail-grid'\r\n ? AssetQuery\r\n : dataDetail?.gridName === 'folder-detail-grid'\r\n ? FolderQuery\r\n : dataDetail?.gridName === 'products-for-member' ||\r\n dataDetail?.gridName === 'product-detail-grid'\r\n ? ProductQuery\r\n : dataDetail?.gridName === 'assets-for-member'\r\n ? AssetQuery\r\n : dataDetail?.gridName === 'query-reporting-grid'\r\n ? ReportQuery\r\n : Images.RIVIR_LOGO_DEFAULT;\r\n\r\n const infoColProps = {\r\n infoColProps: {\r\n flex: 'auto',\r\n },\r\n labelColProps: {\r\n flex: '130px',\r\n },\r\n boldInfo: true,\r\n labelAlign: 'right',\r\n };\r\n\r\n const query = JSON.parse(dataDetail?.query || {});\r\n\r\n const { fetchEntityAttribute } = useAdvanceFilter({});\r\n const emptyFunc = () => {};\r\n\r\n const handleGetEntity = async () => {\r\n try {\r\n const data = await fetchEntityAttribute(dataDetail?.queryType);\r\n if (data) {\r\n setPropertiesData(data);\r\n }\r\n } catch (error) {}\r\n };\r\n\r\n useEffect(() => {\r\n handleGetEntity();\r\n }, [dataDetail?.queryType]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {/* */}\r\n {dataDetail?.name}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nQueryPanel.propTypes = {\r\n dataDetail: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default QueryPanel;\r\n","import { Space } from 'antd';\r\n\r\nimport { AgGridIcons } from 'common/components';\r\n\r\nimport { renderPathname } from 'pages/folders/folder-details/utils';\r\n\r\nimport { TooltipParagraph } from 'common/components';\r\n\r\nimport { Images } from 'config/assets';\r\nimport { ITEM_TYPE } from 'static/Constants';\r\n\r\nimport reactCSS from 'reactcss';\r\n\r\nexport const QueryLink = (props) => {\r\n const { value, data } = props;\r\n\r\n const { id } = data || {};\r\n\r\n const onClickLink = (e) => {\r\n const url = `/execute-query/${id}`;\r\n\r\n window.open(url).focus();\r\n //* query execution is handled in execute-query/index\r\n };\r\n\r\n return (\r\n \r\n {value}\r\n \r\n );\r\n};\r\n\r\nconst NormalDetailLink = (props) => {\r\n const { data, value } = props;\r\n const pathname = renderPathname(data?.type);\r\n\r\n const url = pathname ? `/${pathname}/${data?.id}` : window.location.pathname;\r\n\r\n const onClickLink = () => {\r\n window.open(url, '_blank').focus();\r\n };\r\n\r\n return (\r\n \r\n \r\n {value}\r\n \r\n \r\n );\r\n};\r\n\r\nconst renderLink = (params) => {\r\n const { data } = params;\r\n\r\n const { type } = data || {};\r\n\r\n if (ITEM_TYPE.query.includes(type.toLowerCase())) {\r\n return ;\r\n }\r\n\r\n return ;\r\n};\r\n\r\nconst renderFavSharePackIcons = (params) => {\r\n const data = params?.data;\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst renderFolderOptionIcon = (params) => {\r\n const { isOwner, items } = params?.data || {};\r\n\r\n const styles = reactCSS({\r\n default: {\r\n img: { width: 'auto', height: 'auto', maxWidth: 24, maxHeight: 24 },\r\n },\r\n });\r\n\r\n return (\r\n \r\n {isOwner ? (\r\n items > 0 ? (\r\n owner\r\n ) : (\r\n owner\r\n )\r\n ) : (\r\n shared\r\n )}\r\n \r\n );\r\n};\r\n\r\nconst customCellComponents = {\r\n renderLink,\r\n renderFavSharePackIcons,\r\n renderFolderOptionIcon,\r\n};\r\n\r\nexport default customCellComponents;\r\n","import React from 'react';\r\n\r\nimport { Tooltip } from 'antd';\r\nimport { ClockCircleOutlined } from '@ant-design/icons';\r\n\r\nconst FolderDownloadScheduledIcon = (props) => {\r\n const { visible = false } = props;\r\n\r\n return visible ? (\r\n \r\n \r\n \r\n ) : null;\r\n};\r\n\r\nexport default FolderDownloadScheduledIcon;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { ThumbnailItem } from 'common/components';\r\nimport FolderDownloadScheduledIcon from '../icons/FolderDownloadScheduledIcon';\r\n\r\nimport * as getLink from 'utils/common/linkBuilder';\r\n\r\nimport './FolderThumbnail.less';\r\nimport { getThumbnailImage } from '../utils';\r\n\r\n/**\r\n * Folder thumbnail is inherit from thumbnail item\r\n * @param {object} props\r\n */\r\nconst FolderThumbnailCard = (props) => {\r\n const {\r\n dataDetail,\r\n selected,\r\n onClickItemGrid,\r\n onClickCheckboxItem,\r\n disableEvent,\r\n } = props;\r\n\r\n const type = dataDetail?.type?.toLowerCase();\r\n const image = getThumbnailImage(dataDetail, type);\r\n\r\n const alink = getLink.folderLink(\r\n dataDetail?.id,\r\n dataDetail?.folderName,\r\n dataDetail?.type\r\n );\r\n\r\n return (\r\n ,\r\n ]}\r\n />\r\n );\r\n};\r\n\r\nFolderThumbnailCard.propTypes = {\r\n dataDetail: PropTypes.object.isRequired,\r\n};\r\n\r\nFolderThumbnailCard.defaultProps = {\r\n disableEvent: false,\r\n};\r\n\r\nexport default React.memo(FolderThumbnailCard);\r\n","import React from 'react';\r\n\r\nimport { Tooltip } from 'antd';\r\nimport { get } from 'lodash';\r\n\r\nimport { FolderTileBody, FolderTileFooter, FolderTileHeader } from '../index';\r\n\r\nimport useDoubleClick from 'hooks/useDoubleClick';\r\n\r\nimport { forwardTo } from 'utils/common/route';\r\nimport './FolderTile.less';\r\n\r\nconst FolderTile = (props) => {\r\n const { dataDetail, pathname, disableEvent } = props;\r\n const { onClickItemGrid, onDoubleClick } = props?.clickEvents || {};\r\n\r\n const folderName = get(dataDetail, 'folderName', '');\r\n\r\n const divRef = React.useRef();\r\n\r\n useDoubleClick({\r\n onSingleClick: (e) => {\r\n if (disableEvent) return;\r\n if (onClickItemGrid) onClickItemGrid(dataDetail, e);\r\n },\r\n onDoubleClick: (e) => {\r\n if (disableEvent) return;\r\n if (onDoubleClick) {\r\n forwardTo(`${pathname}/${dataDetail?.id}`);\r\n }\r\n },\r\n ref: divRef,\r\n latency: 250,\r\n isEnabled: !disableEvent,\r\n });\r\n\r\n return (\r\n \r\n
\r\n {disableEvent ? null : (\r\n \r\n )}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default FolderTile;\r\n","import React from 'react';\r\nimport { Row, Avatar } from 'antd';\r\nimport PropTypes from 'prop-types';\r\nimport { Images } from 'config/assets';\r\nimport { getThumbnailImage } from '../utils';\r\n\r\nconst FolderTileHeader = (props) => {\r\n const { dataDetail } = props;\r\n\r\n const type = dataDetail?.type?.toLowerCase();\r\n const image = getThumbnailImage(dataDetail, type);\r\n\r\n return (\r\n \r\n
\r\n\r\n
\r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nFolderTileHeader.propTypes = {\r\n dataDetail: PropTypes.object,\r\n};\r\n\r\nexport default FolderTileHeader;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { Typography, Space, Row, Tooltip } from 'antd';\r\nimport { get, capitalize } from 'lodash';\r\n\r\nimport FolderDownloadScheduledIcon from '../icons/FolderDownloadScheduledIcon';\r\n\r\nimport { formatSizeUnits } from 'utils/formatSizeUnits';\r\nimport { entityTypeIcon } from 'utils/entityTypeIcon';\r\n\r\nimport { FormattedMessage } from 'react-intl';\r\nimport Messages from 'i18n/messages/folder';\r\n\r\nconst { Paragraph, Title, Text } = Typography;\r\n\r\nconst FolderTileBody = (props) => {\r\n const { dataDetail } = props;\r\n\r\n const folderName = get(dataDetail, 'folderName', '');\r\n const folderSize = get(dataDetail, 'folderSize', 0);\r\n const productCount = get(dataDetail, 'productCount', 0);\r\n const assetCount = get(dataDetail, 'assetCount', 0);\r\n const ownerName = get(dataDetail, 'ownerName', '');\r\n const memberName = get(dataDetail, 'memberName', '');\r\n\r\n const isFolder = dataDetail?.type?.toLowerCase() === 'folder';\r\n\r\n const infoText = [\r\n {\r\n field: 'folderName',\r\n value: folderName,\r\n },\r\n {\r\n field: 'ownerName',\r\n value: ownerName,\r\n },\r\n {\r\n field: 'memberName',\r\n value: memberName,\r\n },\r\n {\r\n field: 'folderSize',\r\n value: folderSize,\r\n },\r\n {\r\n field: 'productCount',\r\n value: productCount,\r\n },\r\n {\r\n field: 'assetCount',\r\n value: assetCount,\r\n },\r\n ];\r\n\r\n const renderFolderBodyInfo = (infoText) => {\r\n return infoText.map(({ field, value }, index) => {\r\n if (field === 'folderName') {\r\n return (\r\n \r\n {value}\r\n \r\n );\r\n } else if (isFolder) {\r\n if (field === 'folderSize') {\r\n return (\r\n \r\n {formatSizeUnits(value)}\r\n \r\n );\r\n } else if (field === 'productCount' || field === 'assetCount') {\r\n let text;\r\n if (field === 'productCount') {\r\n text =\r\n value > 0 ? (\r\n \r\n ) : (\r\n \r\n );\r\n } else {\r\n text =\r\n value > 0 ? (\r\n \r\n ) : (\r\n \r\n );\r\n }\r\n return value > 0 ? (\r\n \r\n {value} {text}\r\n \r\n ) : null;\r\n } else {\r\n return (\r\n value && (\r\n \r\n {value}\r\n \r\n )\r\n );\r\n }\r\n }\r\n });\r\n };\r\n\r\n return (\r\n
\r\n \r\n \r\n {renderFolderBodyInfo(infoText)}\r\n \r\n \r\n \r\n {!isFolder ? (\r\n \r\n \r\n {entityTypeIcon(dataDetail?.type)}\r\n \r\n \r\n ) : null}\r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nFolderTileBody.propTypes = {\r\n dataDetail: PropTypes.object,\r\n};\r\n\r\nexport default FolderTileBody;\r\n","import React from 'react';\r\nimport { Row, Col } from 'antd';\r\n\r\nimport { formatMDY } from 'utils/formatDate';\r\nimport { get } from 'lodash';\r\nimport PropTypes from 'prop-types';\r\nimport { FormattedMessage } from 'react-intl';\r\nimport Messages from 'i18n/messages/folder';\r\n\r\nconst FolderTileFooter = (props) => {\r\n const { dataDetail } = props;\r\n\r\n const dateCreated = get(dataDetail, 'dateCreated', '');\r\n const lastUpdated = get(dataDetail, 'lastUpdated', '');\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {dateCreated && formatMDY(dateCreated)}\r\n \r\n \r\n \r\n \r\n \r\n {lastUpdated && formatMDY(lastUpdated)}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nFolderTileFooter.propTypes = {\r\n size: PropTypes.string,\r\n lastUpdate: PropTypes.string,\r\n};\r\n\r\nexport default FolderTileFooter;\r\n","import React, { useEffect } from 'react';\r\n\r\nimport { useSelector, useDispatch } from 'react-redux';\r\n\r\nimport PropTypes from 'prop-types';\r\nimport { formatMDY } from 'utils/formatDate';\r\nimport { Input, Checkbox, Col, Row, Spin, DatePicker, Select } from 'antd';\r\n\r\nimport { Form, WrapperSelect } from 'common/components';\r\n\r\nimport { FormattedMessage } from 'react-intl';\r\nimport Message from 'i18n/messages/folder';\r\nimport { Images } from 'config/assets';\r\nimport moment from 'moment';\r\nimport { getDateFormat } from 'utils/formatDate';\r\n\r\nimport * as companySelectors from 'pages/company-profile/controllers/selectors';\r\n\r\nimport userSelectors from '@redux/user/selectors';\r\n\r\nimport * as memberActions from 'pages/company-profile/controllers/actions';\r\n\r\nimport memberReducer from 'pages/company-profile/controllers/reducer';\r\nimport saga from 'pages/company-profile/controllers/saga';\r\n\r\nimport { useInjectSaga } from 'utils/common/injectSaga';\r\nimport { useInjectReducer } from 'utils/common/injectedReducers';\r\n\r\nimport {\r\n PRIVATE_FOLDER_VISIBILITY,\r\n FOLDER_VISIBILITY,\r\n DATE_FORMAT,\r\n} from 'static/Constants';\r\n\r\nimport './FolderPanelEditContent.less';\r\n\r\nconst formItemLayout = {\r\n labelCol: { span: 10 },\r\n wrapperCol: { span: 14 },\r\n};\r\n\r\nconst dateFormat = 'YYYY/MM/DD';\r\n\r\nconst FolderPanelEditContent = (props) => {\r\n useInjectReducer({ key: 'member', reducer: memberReducer });\r\n useInjectSaga({ key: 'member', saga });\r\n\r\n const dispatch = useDispatch();\r\n\r\n const {\r\n folderInfo,\r\n onFinish,\r\n onFinishFailed,\r\n onValuesChange,\r\n form,\r\n ownerFolder,\r\n loading,\r\n } = props;\r\n\r\n const userInfo = useSelector(userSelectors.makeSelectUserInfo());\r\n\r\n useEffect(() => {\r\n dispatch(memberActions.getMemberProfileHeader(userInfo?.member?.id));\r\n }, [dispatch, userInfo?.member?.id]);\r\n\r\n const memberInfo = useSelector(companySelectors.selectMemberProfile());\r\n\r\n const isPrivateVisibilityFolder = memberInfo?.folders === 'Private';\r\n\r\n const RenderFolderImg = () => {\r\n let img = !ownerFolder\r\n ? Images.sharedFolder\r\n : folderInfo?.items > 0\r\n ? Images.folder\r\n : Images.emptyFolder;\r\n\r\n return (\r\n folder\r\n );\r\n };\r\n\r\n function disabledDate(current) {\r\n // Can not select days before today and today\r\n return current && current < moment().endOf('day');\r\n }\r\n\r\n const FieldItemInputDisabled = ({ data }) => {\r\n return (\r\n }\r\n >\r\n \r\n \r\n );\r\n };\r\n\r\n const FieldItemInputCanEdit = ({ data }) => {\r\n return (\r\n }\r\n >\r\n }\r\n />\r\n \r\n );\r\n };\r\n\r\n const FieldItemCheckboxDisabled = ({ data }) => {\r\n return (\r\n }\r\n valuePropName='checked'\r\n >\r\n \r\n \r\n );\r\n };\r\n\r\n const FieldItemCheckbox = ({ data }) => {\r\n return (\r\n }\r\n valuePropName='checked'\r\n >\r\n \r\n \r\n );\r\n };\r\n const FieldItemRangePicker = ({ data }) => {\r\n return (\r\n }\r\n >\r\n \r\n \r\n );\r\n };\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n rules={[\r\n {\r\n required: true,\r\n message: (\r\n \r\n ),\r\n },\r\n {\r\n whitespace: true,\r\n message: (\r\n \r\n ),\r\n },\r\n ]}\r\n className='folder-panel-edit-content__folder-name'\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {isPrivateVisibilityFolder\r\n ? PRIVATE_FOLDER_VISIBILITY?.slice()\r\n .sort()\r\n .map((visibility) => (\r\n \r\n {visibility}\r\n \r\n ))\r\n : FOLDER_VISIBILITY?.slice()\r\n .sort()\r\n .map((visibility) => (\r\n \r\n {visibility}\r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nFolderPanelEditContent.propTypes = {\r\n folderInfo: PropTypes.object,\r\n onFinish: PropTypes.func,\r\n onFinishFailed: PropTypes.func,\r\n onValuesChange: PropTypes.func,\r\n form: PropTypes.object,\r\n ownerFolder: PropTypes.bool,\r\n};\r\n\r\nexport default FolderPanelEditContent;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Button, Row, Space } from 'antd';\r\nimport { StopOutlined, SaveOutlined } from '@ant-design/icons';\r\nimport { FormattedMessage } from 'react-intl';\r\nimport Message from 'i18n/messages/folder';\r\nimport './FolderPanelEditHeader.less';\r\n\r\nconst FolderPanelEditHeader = (props) => {\r\n const { onCancelClick, onSaveClick, disableSaveBtn } = props;\r\n return (\r\n \r\n \r\n }\r\n >\r\n \r\n \r\n }\r\n >\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nFolderPanelEditHeader.propTypes = {\r\n onCancelClick: PropTypes.func,\r\n onSaveClick: PropTypes.func,\r\n disableSaveBtn: PropTypes.bool,\r\n};\r\n\r\nFolderPanelEditHeader.defaultProps = {\r\n disableSaveBtn: true,\r\n};\r\n\r\nexport default FolderPanelEditHeader;\r\n","import React, { useState, useEffect } from 'react';\r\nimport { useDispatch } from 'react-redux';\r\nimport { Row, Typography, Tooltip, Pagination, notification, Col } from 'antd';\r\nimport { AgGridReact, AgGridColumn } from 'ag-grid-react';\r\nimport moment from 'moment';\r\nimport { dialogFunction } from 'common/components/index';\r\nimport { LicenseManager } from 'ag-grid-enterprise';\r\nimport 'ag-grid-enterprise';\r\nimport 'ag-grid-community/dist/styles/ag-grid.css';\r\nimport 'ag-grid-community/dist/styles/ag-theme-alpine.css';\r\nimport { injectIntl } from 'react-intl';\r\nimport Messages from 'i18n/messages/folder';\r\nimport * as folderService from 'services/folder';\r\nimport DigitalRightIcon from 'common/components/digital-right-icon/DigitalRightIcon';\r\nimport { useDispatchReloadPage } from 'hooks/useReloadPage';\r\n\r\nimport {\r\n DeleteOutlined,\r\n CodeSandboxOutlined,\r\n PlaySquareOutlined,\r\n UserOutlined,\r\n QuestionOutlined,\r\n SearchOutlined,\r\n SnippetsOutlined,\r\n} from '@ant-design/icons';\r\n\r\nLicenseManager.setLicenseKey(\r\n 'Using_this_AG_Grid_Enterprise_key_( AG-040843 )_in_excess_of_the_licence_granted_is_not_permitted___Please_report_misuse_to_( legal@ag-grid.com )___For_help_with_changing_this_key_please_contact_( info@ag-grid.com )___( Global Vertical Innovations, LLC )_is_granted_a_( Multiple Applications )_Developer_License_for_( 1 ))_Front-End_JavaScript_developer___All_Front-End_JavaScript_developers_need_to_be_licensed_in_addition_to_the_ones_working_with_AG_Grid_Enterprise___This_key_has_not_been_granted_a_Deployment_License_Add-on___This_key_works_with_AG_Grid_Enterprise_versions_released_before_( 11 May 2024 )____[v2]_MTcxNTM4MjAwMDAwMA==d035e6c32ae72202e23beccd712ab105'\r\n);\r\n\r\nconst { Title } = Typography;\r\n\r\nfunction iconRenderer(params) {\r\n if (params.data.type.toLowerCase() === 'product')\r\n return (\r\n <>\r\n \r\n \r\n \r\n {params.data.drm && (\r\n \r\n )}\r\n \r\n );\r\n else if (params.data.type === 'asset')\r\n return (\r\n <>\r\n \r\n \r\n \r\n {params.data.drm && (\r\n \r\n )}\r\n \r\n );\r\n else if (params.data.type === 'member')\r\n return (\r\n <>\r\n \r\n \r\n \r\n {params.data.drm && (\r\n \r\n )}\r\n \r\n );\r\n else if (params.data.type === 'Query')\r\n return (\r\n <>\r\n \r\n \r\n \r\n {params.data.drm && (\r\n \r\n )}\r\n \r\n );\r\n else if (params.data.type === 'Reporting')\r\n return (\r\n <>\r\n \r\n \r\n \r\n {params.data.drm && (\r\n \r\n )}\r\n \r\n );\r\n else return ;\r\n}\r\n\r\n// function digitalRightIconRender(params) {\r\n// if (params.data.drm)\r\n// return (\r\n// \r\n// );\r\n// else return null;\r\n// }\r\n\r\nfunction dateFormatter(params) {\r\n return moment(params.value).format('MM/DD/YYYY');\r\n}\r\n\r\nfunction convertNodeData(nodes) {\r\n const result = nodes.map((node) => node.data);\r\n return result;\r\n}\r\n\r\nfunction coverNewData(rowsSelection, gridRowsSelection, itemSelection) {\r\n let result = rowsSelection;\r\n\r\n const idxRows = result.findIndex((row) => row.id === itemSelection.id);\r\n const idxGridRows = gridRowsSelection.findIndex(\r\n (row) => row.id === itemSelection.id\r\n );\r\n\r\n if (idxRows !== -1 && idxGridRows === -1) {\r\n result = result.filter((row) => row.id !== itemSelection.id);\r\n return result;\r\n }\r\n\r\n // Set value: { {}, {} } -> Array.from -> [{}, {}]\r\n result = Array.from(new Set([...rowsSelection, ...gridRowsSelection]));\r\n return result;\r\n}\r\n\r\nconst PanelContent = (props) => {\r\n const dispatch = useDispatch();\r\n const reloadPage = useDispatchReloadPage();\r\n\r\n const { ownerFolder, shortDetail, seePreview, isEdit, intl } = props;\r\n const [currentPage, setCurrentPage] = useState(1);\r\n const [currentPageSize, setCurrentPageSize] = useState(10);\r\n\r\n const [gridApi, setGridApi] = useState();\r\n const [selectedRows, setSelectedRows] = useState([]);\r\n const [selectedItem, setSelectedItem] = useState();\r\n\r\n useEffect(() => {\r\n if (!gridApi) return;\r\n\r\n gridApi.forEachNode((node) => {\r\n const idxRow = selectedRows.findIndex(\r\n (selectedRow) => selectedRow.id === node.data.id\r\n );\r\n if (idxRow !== -1) {\r\n node.setSelected(true);\r\n } else {\r\n node.setSelected(false);\r\n }\r\n });\r\n setSelectedItem({});\r\n }, [currentPage, gridApi, selectedRows]);\r\n\r\n const getAgGridProps = (rowData = []) => {\r\n return {\r\n headerHeight: 32,\r\n rowHeight: 32,\r\n rowSelection: 'multiple',\r\n // rowMultiSelectWithClick: true,\r\n rowData: rowData.filter((item, index) => {\r\n return (\r\n index >= (currentPage - 1) * currentPageSize &&\r\n index <= currentPageSize * currentPage - 1\r\n );\r\n }),\r\n pivotPanelShow: 'never',\r\n onRowClicked: (params) => {\r\n setSelectedItem(params.data);\r\n // setSelectedRows([params.data]);\r\n },\r\n onRowDoubleClicked: (params) => {\r\n if (seePreview) seePreview(params.data);\r\n },\r\n onSelectionChanged: () => {\r\n const selectedNodes = gridApi.getSelectedNodes();\r\n const selectedDataNodes = convertNodeData(selectedNodes);\r\n // const result = coverNewData(\r\n // selectedRows,\r\n // selectedDataNodes,\r\n // selectedItem\r\n // );\r\n setSelectedRows(selectedDataNodes);\r\n },\r\n onCellClicked: (params) => {\r\n if (params.colDef.field === '' && seePreview) seePreview(params.data);\r\n },\r\n onGridReady: onGridReady,\r\n };\r\n };\r\n\r\n const onGridReady = (params) => {\r\n setGridApi(params.api);\r\n };\r\n const gridColumn = [\r\n {\r\n key: '1',\r\n field: '',\r\n width: 70,\r\n cellRendererFramework: iconRenderer,\r\n menuTabs: [],\r\n },\r\n // {\r\n // key: '2',\r\n // field: 'drm',\r\n // cellRendererFramework: digitalRightIconRender,\r\n // width: 30,\r\n // menuTabs: [],\r\n // },\r\n {\r\n key: '2',\r\n field: 'description',\r\n width: 300,\r\n menuTabs: [],\r\n },\r\n {\r\n key: '3',\r\n field: 'dateAdded',\r\n cellRendererFramework: dateFormatter,\r\n width: 130,\r\n menuTabs: [],\r\n },\r\n ];\r\n const rowData =\r\n shortDetail && shortDetail.folderContents ? shortDetail.folderContents : [];\r\n\r\n const confirmDelete = () => {\r\n if (selectedRows.length > 0) {\r\n dialogFunction({\r\n type: 'warn',\r\n content: intl.formatMessage(Messages.areYouSureToDelete),\r\n onOk: callApiDelete,\r\n });\r\n } else {\r\n notification.warn({\r\n message: 'Must select at least one items to delete.',\r\n });\r\n }\r\n };\r\n\r\n const callApiDelete = async () => {\r\n const itemList = selectedRows.map((item) => {\r\n return { id: item.id, type: item.type };\r\n });\r\n\r\n try {\r\n const response =\r\n await folderService.deleteEntityAssocicationFromShortContent({\r\n folderId: shortDetail?.id,\r\n itemList,\r\n });\r\n const { isSuccess, message } = response;\r\n if (isSuccess) {\r\n if (currentPage !== 1) {\r\n setCurrentPage(1);\r\n }\r\n setSelectedRows([]);\r\n\r\n showSuccessMessageDialog();\r\n reloadPage();\r\n } else {\r\n callApiErrorHandler(message);\r\n }\r\n } catch (error) {\r\n callApiErrorHandler(error);\r\n }\r\n };\r\n\r\n const showSuccessMessageDialog = () => {\r\n notification.success({\r\n message: intl.formatMessage(Messages.deleteSuccess),\r\n });\r\n };\r\n\r\n const callApiErrorHandler = (error) => {\r\n notification.error({\r\n message: error,\r\n });\r\n };\r\n\r\n return (\r\n
\r\n \r\n \r\n {intl.formatMessage({\r\n id: 'Taco.folder.components.contentPane.content',\r\n })}\r\n \r\n {isEdit && (\r\n
\r\n \r\n \r\n \r\n
\r\n )}\r\n
\r\n\r\n \r\n \r\n {gridColumn?.map((column) => (\r\n \r\n ))}\r\n \r\n
\r\n
\r\n {\r\n setCurrentPage(page);\r\n setCurrentPageSize(size);\r\n }}\r\n pageSize={currentPageSize}\r\n defaultCurrent={currentPage}\r\n total={rowData && rowData.length}\r\n />\r\n
\r\n {rowData.filter((item) => item.drm).length > 0 && (\r\n \r\n \r\n \r\n \r\n \r\n {intl.formatMessage({\r\n id: 'Taco.common.components.folderDRM',\r\n })}\r\n \r\n \r\n )}\r\n {\r\n setSelectedRows([]);\r\n setCurrentPageSize(10);\r\n setCurrentPage(1);\r\n }}\r\n id='button-clear-table-item'\r\n >\r\n test\r\n \r\n \r\n );\r\n};\r\n\r\nexport default injectIntl(PanelContent);\r\n","import React, { useEffect, useState } from 'react';\r\nimport PropTypes, { bool } from 'prop-types';\r\nimport { useDispatch, useSelector, shallowEqual } from 'react-redux';\r\nimport { Form, message, notification } from 'antd';\r\n\r\nimport * as actionsGrid from 'common/components/grid-view/controllers/actions';\r\nimport PanelEditContent from './FolderPanelEditContent';\r\nimport PanelHeader from './FolderPanelEditHeader';\r\nimport moment from 'moment';\r\nimport * as actions from '../../controllers/actions';\r\nimport * as selectors from '../../controllers/selectors';\r\n\r\nimport { useDispatchReloadPage } from 'hooks/useReloadPage';\r\nimport FolderPanelContent from '../panel/FolderPanelContent.old';\r\n\r\nimport './FolderPanelEdit.less';\r\nimport { formatMDY } from 'utils/formatDate';\r\n\r\nconst FolderPanelEdit = (props) => {\r\n const { folderInfo, onCloseEdit, ownerFolder, loadingDetail } = props;\r\n const dispatch = useDispatch();\r\n const reloadPage = useDispatchReloadPage();\r\n\r\n const [disableSaveBtn, setDisableSaveBtn] = useState(true);\r\n\r\n const startEdit = useSelector(selectors.selectStartEdit());\r\n const editSuccess = useSelector(selectors.selectEditSuccess());\r\n\r\n let folderInfoOrgin = {\r\n folderName: folderInfo?.folderName,\r\n specialPurpose: folderInfo?.specialPurpose,\r\n };\r\n\r\n const [form] = Form.useForm();\r\n\r\n useEffect(() => {\r\n form.setFieldsValue({\r\n folderName: folderInfo?.folderName,\r\n specialPurpose: folderInfo?.specialPurpose,\r\n visibility: folderInfo?.visibility,\r\n });\r\n // eslint-disable-next-line\r\n }, [folderInfo?.folderName, folderInfo?.specialPurpose]);\r\n\r\n useEffect(() => {\r\n if (startEdit === 'finish') {\r\n if (editSuccess === 'success') {\r\n handleEditSuccess();\r\n } else if (editSuccess === 'error') {\r\n handleEditError();\r\n }\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [startEdit, editSuccess]);\r\n\r\n const onFinishFailed = (errorInfo) => {\r\n console.log('onFinishFailed: ', errorInfo);\r\n };\r\n\r\n const isFormChanged = (fieldsValue) => {\r\n if (!shallowEqual(folderInfoOrgin, fieldsValue)) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n const onFinish = (values) => {\r\n let id = folderInfo.id;\r\n if (isFormChanged(values)) {\r\n dispatch(\r\n actions.editShortContent({\r\n ...values,\r\n expirationDate: values?.expirationDate\r\n ? moment(values?.expirationDate)\r\n : formatMDY(folderInfo?.expirationDate),\r\n id,\r\n })\r\n );\r\n } else {\r\n notification.info({\r\n message: \"Folder information doesn't change!\",\r\n placement: 'topRight',\r\n duration: 1,\r\n });\r\n setTimeout(() => {\r\n onCloseEdit();\r\n }, 200);\r\n }\r\n };\r\n\r\n const onSaveClick = () => {\r\n form.submit();\r\n };\r\n\r\n const handleEditSuccess = () => {\r\n setTimeout(() => {\r\n dispatch(actions.editShortContentFinish());\r\n onCloseEdit();\r\n\r\n reloadPage();\r\n setTimeout(() => {\r\n dispatch(actionsGrid.updateItemsSelection([folderInfo.id]));\r\n dispatch(actions.getFolderShortDetail(folderInfo.id));\r\n }, 400);\r\n }, 500);\r\n };\r\n\r\n const handleEditError = () => {\r\n message.error('Edit error - Something went wrong!');\r\n };\r\n\r\n const onValuesChange = (value) => {\r\n if (isFormChanged(form.getFieldsValue())) {\r\n setDisableSaveBtn(false);\r\n } else {\r\n setDisableSaveBtn(true);\r\n }\r\n };\r\n\r\n const isLoading = loadingDetail || startEdit === 'starting';\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nFolderPanelEdit.propTypes = {\r\n folderInfo: PropTypes.object,\r\n onCloseEdit: PropTypes.func,\r\n ownerFolder: bool,\r\n folderOption: PropTypes.string,\r\n loadingDetail: PropTypes.bool,\r\n};\r\n\r\nexport default FolderPanelEdit;\r\n","import { getNodeTreeData } from 'common/components/folder/utils';\r\n\r\nexport const transformSelectedItemToNodeTree = (node) => {\r\n return getNodeTreeData({\r\n node,\r\n });\r\n};\r\n\r\nexport const getCurrentFolderId = ({ treeData, selectedItem }) => {\r\n if (!selectedItem) return null;\r\n\r\n const node = transformSelectedItemToNodeTree(selectedItem);\r\n const ancestorNodes = findParentFolderOfNode(treeData, node); // list of ancestorNodes\r\n\r\n return ancestorNodes?.data?.id;\r\n};\r\n\r\nexport const findParentFolderOfNode = (treeData, childNode) => {\r\n let parentNode;\r\n\r\n for (let i = 0; i < treeData?.length; i++) {\r\n const node = treeData[i];\r\n if (node?.children) {\r\n if (\r\n node?.children?.some((item) => item?.data?.id === childNode?.data?.id)\r\n ) {\r\n parentNode = node;\r\n } else if (findParentFolderOfNode(node.children, childNode)) {\r\n parentNode = findParentFolderOfNode(node.children, childNode);\r\n }\r\n }\r\n }\r\n return parentNode;\r\n};\r\n","import React, { useMemo, useState } from 'react';\r\n\r\nimport { Row, Col } from 'antd';\r\nimport { DoubleRightOutlined } from '@ant-design/icons';\r\n\r\nimport { FormButton } from 'common/components';\r\nimport MoveFolderModal from 'pages/home/ribbon/components/controls/folders/MoveFolderModal';\r\n\r\nimport { useGridView } from 'hooks/useGridView';\r\n\r\nimport { getCurrentFolderId } from './utils';\r\n\r\nconst FolderPanelActions = (props) => {\r\n const { treeData, shortDetail, selectedItem, handleBuildHierarchyTree } =\r\n props;\r\n\r\n const [moveFolderModalVisible, setMoveFolderModalVisible] = useState(false);\r\n\r\n const { reloadPage } = useGridView();\r\n\r\n const onClickMove = () => {\r\n setMoveFolderModalVisible(true);\r\n };\r\n\r\n const closeMoveModal = () => {\r\n setMoveFolderModalVisible(false);\r\n };\r\n\r\n const moveSubFolderSuccessCallback = ({ destinationFolder }) => {\r\n handleBuildHierarchyTree(`/${shortDetail?.id}`);\r\n\r\n reloadPage(); //* 4555: check reload page condition may cause bug;\r\n };\r\n\r\n const checkDisabledMoveBtn = () => {\r\n const isSharedFolder = !selectedFolder?.isOwned;\r\n const isEditableFolder = selectedFolder?.editable;\r\n const isSelfSelected = selectedItem?.id === shortDetail?.id;\r\n\r\n if (!shortDetail?.isOwned && !shortDetail?.editable) return true;\r\n\r\n if (!selectedItem?.id) return true;\r\n\r\n //* preventing self-moving as it may cause issues\r\n if (isSelfSelected) return true;\r\n\r\n if (isSharedFolder && !isEditableFolder) return true;\r\n\r\n return false;\r\n };\r\n\r\n const currentFolderId = useMemo(\r\n () =>\r\n getCurrentFolderId({\r\n treeData,\r\n selectedItem,\r\n }),\r\n [selectedItem, treeData]\r\n );\r\n\r\n const selectedFolder =\r\n selectedItem?.type?.toLowerCase() === 'folder' && selectedItem;\r\n\r\n const disabled = checkDisabledMoveBtn();\r\n\r\n return (\r\n \r\n \r\n \r\n }\r\n disabled={disabled}\r\n onClick={onClickMove}\r\n />\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default FolderPanelActions;\r\n","import React from 'react';\r\n\r\nimport { Tooltip, Typography } from 'antd';\r\nimport { PlayCircleOutlined } from '@ant-design/icons';\r\n\r\nimport FolderPanelActions from './FolderPanelActions';\r\nimport { IconFolderAsset, NodeTree } from 'common/components/folder/FolderTree';\r\nimport { FolderTree } from 'common/components/folder';\r\n\r\nimport {\r\n getNodeTreeData,\r\n handleOpenDetailItem,\r\n} from 'common/components/folder/utils';\r\n\r\nimport { useGetFolderTreeData } from 'common/components/folder/hooks';\r\nimport { useChangeSize } from 'hooks/useResize';\r\n\r\nimport emptyFolderIcon from 'assets/folder/empty-folder.png';\r\nimport folderIcon from 'assets/folder/folder.png';\r\nimport classnames from 'classnames';\r\n\r\nconst FolderPanelContent = (props) => {\r\n const { shortDetail } = props;\r\n\r\n const parentNodeFolder = getNodeTreeData({\r\n node: { ...shortDetail, type: 'folder' }, // shortDetail doesn't have type value !!!\r\n folderParam: defaultFolderParam,\r\n fileParam: defaultFileParam,\r\n });\r\n\r\n const {\r\n treeData,\r\n selectedItem,\r\n expandedKeys,\r\n handleUpdateExpandedKeys,\r\n handleLoadMoreFolder,\r\n handleUpdateSelectedItem,\r\n handleBuildHierarchyTree,\r\n } = useGetFolderTreeData({\r\n defaultTreeProp: [parentNodeFolder],\r\n defaultExpandedKeys: [parentNodeFolder?.key],\r\n pageSize: 9999,\r\n filterType: 'all',\r\n folderParam: defaultFolderParam,\r\n fileParam: defaultFileParam,\r\n });\r\n\r\n const [treeWrapperWidth, treeWrapperHeight] =\r\n useChangeSize('#folder-panel-tree');\r\n const [treeWidth, treeHeight] = useChangeSize(\r\n '#folder-panel-tree > .folder-tree'\r\n );\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n Contents\r\n \r\n
\r\n treeHeight,\r\n })}\r\n id='folder-panel-tree'\r\n >\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst checkEmptyContents = (node) => {\r\n const {\r\n items = 0,\r\n contentsCount = 0,\r\n assetCount = 0,\r\n memberCount = 0,\r\n productCount = 0,\r\n queryCount = 0,\r\n subFolderCount = 0,\r\n reportingCount = 0,\r\n } = node;\r\n\r\n return (\r\n items +\r\n contentsCount +\r\n assetCount +\r\n memberCount +\r\n productCount +\r\n queryCount +\r\n subFolderCount +\r\n reportingCount ===\r\n 0\r\n );\r\n};\r\n\r\nconst defaultFolderParam = {\r\n renderFolder: (node) => {\r\n const isEmptyContents = checkEmptyContents(node);\r\n\r\n if (isEmptyContents) {\r\n return {\r\n title: (\r\n \r\n \r\n handleOpenDetailItem(node?.type, node?.id)}\r\n />\r\n \r\n \r\n ),\r\n icon: ,\r\n isLeaf: true,\r\n };\r\n }\r\n return {\r\n title: (\r\n \r\n \r\n handleOpenDetailItem(node?.type, node?.id)}\r\n />\r\n \r\n \r\n ),\r\n icon: ,\r\n };\r\n },\r\n};\r\n\r\nconst defaultFileParam = {\r\n renderFile: (node) => {\r\n return {\r\n title: (\r\n \r\n \r\n handleOpenDetailItem(node?.type, node?.id)}\r\n />\r\n \r\n \r\n ),\r\n };\r\n },\r\n};\r\n\r\nexport default FolderPanelContent;\r\n","import React, { useEffect, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { Row, Col, Image, Typography, Tooltip, Space } from 'antd';\r\nimport { get } from 'lodash';\r\n\r\nimport { InfoWithLabel, FavoriteStarIconRender } from 'common/components';\r\nimport EmptyFolderImg from 'assets/folder/empty-folder.png';\r\nimport FolderImg from 'assets/folder/folder.png';\r\nimport ShareFolderImg from 'assets/folder/shared-folder.png';\r\nimport DownloadIcon from 'assets/DownloadIcon.png';\r\nimport { injectIntl } from 'react-intl';\r\n\r\nimport { formatMDY } from 'utils/formatDate';\r\nconst { Title } = Typography;\r\n\r\nconst PanelHeader = (props) => {\r\n const { shortDetail, ownerFolder, openDownloadPanel, intl } = props;\r\n\r\n const [thumbnailImg, setThumbnailImg] = useState('');\r\n\r\n const onClickDownloadBtn = () => {\r\n openDownloadPanel && openDownloadPanel();\r\n };\r\n\r\n useEffect(() => {\r\n const thumbnailSrc = !ownerFolder\r\n ? ShareFolderImg\r\n : get(shortDetail, 'items') > 0\r\n ? FolderImg\r\n : EmptyFolderImg;\r\n setThumbnailImg(thumbnailSrc);\r\n // eslint-disable-next-line\r\n }, [ownerFolder]);\r\n\r\n const metaData = [\r\n {\r\n label: intl.formatMessage({\r\n id: 'Taco.folder.components.contentPane.owner',\r\n }),\r\n info:\r\n get(shortDetail, 'ownerName', '') && get(shortDetail, 'ownerName', ''),\r\n },\r\n {\r\n label: intl.formatMessage({\r\n id: 'Taco.folder.components.contentPane.dateCreated',\r\n }),\r\n info:\r\n formatMDY(get(shortDetail, 'dateCreated', '')) !== 'Invalid Date'\r\n ? formatMDY(get(shortDetail, 'dateCreated', ''))\r\n : '',\r\n },\r\n {\r\n label: intl.formatMessage({\r\n id: 'Taco.folder.components.contentPane.dateShared',\r\n }),\r\n info:\r\n formatMDY(get(shortDetail, 'dateShared', '')) !== 'Invalid Date'\r\n ? formatMDY(get(shortDetail, 'dateShared', ''))\r\n : '',\r\n },\r\n {\r\n label: intl.formatMessage({\r\n id: 'Taco.folder.components.contentPane.editable',\r\n }),\r\n info: get(shortDetail, 'editable', '') ? 'Yes' : 'No',\r\n },\r\n {\r\n label: intl.formatMessage({\r\n id: 'Taco.folder.components.contentPane.shareable',\r\n }),\r\n info: get(shortDetail, 'shareable', '') ? 'Yes' : 'No',\r\n },\r\n {\r\n label: intl.formatMessage({\r\n id: 'Taco.folder.components.contentPane.specialPurpose',\r\n }),\r\n info: get(shortDetail, 'specialPurpose', '') ? 'Yes' : 'No',\r\n },\r\n {\r\n label: intl.formatMessage({\r\n id: 'Taco.folder.components.contentPane.visibility',\r\n }),\r\n info: get(shortDetail, 'visibility', ''),\r\n },\r\n {\r\n label: intl.formatMessage({\r\n id: 'Taco.folder.components.contentPane.items',\r\n }),\r\n info: get(shortDetail, 'items', '') && get(shortDetail, 'items', ''),\r\n },\r\n {\r\n label: intl.formatMessage({\r\n id: 'Taco.folder.components.contentPane.expirationDate',\r\n }),\r\n info:\r\n formatMDY(get(shortDetail, 'expirationDate', '')) !== 'Invalid Date'\r\n ? formatMDY(get(shortDetail, 'expirationDate', ''))\r\n : '',\r\n },\r\n {\r\n label: intl.formatMessage({\r\n id: 'Taco.folder.components.contentPane.lastUpdated',\r\n }),\r\n info: (\r\n <>\r\n
\r\n {formatMDY(get(shortDetail, 'lastUpdated', '')) !== 'Invalid Date'\r\n ? formatMDY(get(shortDetail, 'lastUpdated', ''))\r\n : ''}\r\n
\r\n
\r\n {get(shortDetail, 'lastUpdatedBy', '') &&\r\n get(shortDetail, 'lastUpdatedBy', '')}\r\n
\r\n \r\n ),\r\n },\r\n\r\n {\r\n label: intl.formatMessage({\r\n id: 'Taco.folder.components.contentPane.lastDownload',\r\n }),\r\n info:\r\n formatMDY(get(shortDetail, 'lastDownload', '')) !== 'Invalid Date'\r\n ? formatMDY(get(shortDetail, 'lastDownload', ''))\r\n : '',\r\n },\r\n {\r\n label: intl.formatMessage({\r\n id: 'Taco.folder.components.contentPane.lastSchedule',\r\n }),\r\n info:\r\n formatMDY(get(shortDetail, 'lastSchedule', '')) !== 'Invalid Date'\r\n ? formatMDY(get(shortDetail, 'lastSchedule', ''))\r\n : '',\r\n },\r\n ];\r\n\r\n const infoColProps = {\r\n infoColProps: {\r\n flex: 'auto',\r\n },\r\n labelColProps: {\r\n flex: '130px',\r\n },\r\n boldInfo: true,\r\n labelAlign: 'right',\r\n };\r\n\r\n const dataLeft = metaData\r\n ? metaData.slice(0, Math.ceil(metaData.length / 2 + 1))\r\n : [];\r\n const dataRight = metaData\r\n ? metaData.slice(Math.ceil(metaData.length / 2 + 1))\r\n : [];\r\n\r\n const folderName = get(shortDetail, 'folderName', '');\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {folderName}\r\n \r\n \r\n \r\n
\r\n \r\n \r\n {dataLeft &&\r\n dataLeft.length > 0 &&\r\n dataLeft.map((item, index) => {\r\n return (\r\n \r\n );\r\n })}\r\n \r\n \r\n {dataRight &&\r\n dataRight.length > 0 &&\r\n dataRight.map((item, index) => {\r\n return (\r\n \r\n );\r\n })}\r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nPanelHeader.propTypes = {\r\n onTrigger: PropTypes.func,\r\n shortDetail: PropTypes.object,\r\n ownerFolder: PropTypes.bool,\r\n onEditClick: PropTypes.func,\r\n};\r\n\r\nexport default injectIntl(PanelHeader);\r\n","import React, { useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport FolderPanelContent from './FolderPanelContent';\r\nimport FolderPanelHeader from './FolderPanelHeader';\r\n\r\nimport './FolderPanel.less';\r\n\r\nconst FolderPanel = (props) => {\r\n const downloadPanelActions = useRef();\r\n\r\n const {\r\n onClosePanel,\r\n shortDetail,\r\n ownerFolder,\r\n seePreview,\r\n onEditClick,\r\n clickEditFolderHandler,\r\n } = props;\r\n\r\n const openDownloadPanel = () => {\r\n downloadPanelActions.current?.openDownloadPanel();\r\n };\r\n\r\n return (\r\n
\r\n {shortDetail && (\r\n <>\r\n
\r\n \r\n \r\n
\r\n \r\n )}\r\n
\r\n );\r\n};\r\n\r\nFolderPanel.propTypes = {\r\n onTrigger: PropTypes.func,\r\n onClosePanel: PropTypes.func,\r\n loadingDetail: PropTypes.bool,\r\n shortDetail: PropTypes.object,\r\n ownerFolder: PropTypes.bool,\r\n seePreview: PropTypes.func,\r\n onEditClick: PropTypes.func,\r\n};\r\n\r\nexport default FolderPanel;\r\n","import { useEffect } from 'react';\r\n\r\nimport * as servicesMember from 'services/members';\r\n\r\nimport { useFetch } from 'hooks/useAsync';\r\n\r\nexport const useMemberPublicContact = (props) => {\r\n const { isEnabled, memberId } = props;\r\n const { data, run } = useFetch();\r\n\r\n const fetchMemberPublicContact = (memberId) => {\r\n const params = {\r\n memberId: memberId,\r\n pageIndex: 1,\r\n pageSize: 100,\r\n };\r\n\r\n run(servicesMember.getPublicContact(params));\r\n };\r\n\r\n useEffect(() => {\r\n isEnabled && fetchMemberPublicContact(memberId);\r\n }, []);\r\n\r\n return {\r\n memberPublicContactList: data?.data?.gridData,\r\n fetchMemberPublicContact,\r\n };\r\n};\r\n","import React, { memo } from 'react';\r\n\r\nimport { Spin } from 'antd';\r\nimport { isEqual, capitalize } from 'lodash';\r\n\r\nimport { OpenItemContentPane } from 'common/components/openItem';\r\nimport FolderPanel from './panel/FolderPanel';\r\nimport { AssetPanel } from 'pages/branded-assets/components';\r\nimport MemberPanel from 'common/components/member-preview/MemberPanel';\r\nimport { QueryPanel } from 'pages/favorite-queries/components';\r\nimport { ReportingPanel } from 'pages/branded-reporting/components';\r\nimport {\r\n ProductContent,\r\n ProductActions,\r\n ProductInformation,\r\n ProductLogoThumbnail,\r\n} from 'pages/branded-products/components/content-pane';\r\n\r\nimport { useFolderContentPane } from 'pages/folders/hooks';\r\nimport { useMemberPublicContact } from 'hooks/useMemberPublicContact';\r\nimport { mapJSONToMarkdownObject } from 'utils/jsonChecker';\r\nimport * as getLink from 'utils/common/linkBuilder';\r\n\r\nimport * as constant from 'static/Constants';\r\n\r\nconst FolderContentPane = (props) => {\r\n const {\r\n setContentPreview,\r\n onCloseCallbackHandler,\r\n onOpenEdit,\r\n selectFolder,\r\n isOwner,\r\n setVisible,\r\n clickEditFolderHandler,\r\n addDrawerStack,\r\n } = props;\r\n\r\n const { shortDetail, isLoading, contentPaneType } = useFolderContentPane();\r\n\r\n const getOpenItemConfig = () => {\r\n const urlPath = getLink.getLinkPathByEntityType(contentPaneType);\r\n\r\n const configsCollection = {\r\n asset: {\r\n type: 'ASSET_CONTENT_PANE',\r\n name: shortDetail?.assetName,\r\n },\r\n member: {\r\n type: 'MEMBER_CONTENT_PANE',\r\n name: shortDetail?.memberName,\r\n },\r\n product: {\r\n type: 'PRODUCT_CONTENT_PANE',\r\n name: shortDetail?.productName,\r\n },\r\n reporting: {\r\n type: 'REPORTING_CONTENT_PANE',\r\n name: shortDetail?.name,\r\n },\r\n folder: {\r\n type: 'FOLDER_CONTENT_PANE',\r\n name: shortDetail?.folderName,\r\n },\r\n };\r\n\r\n const config = configsCollection[contentPaneType];\r\n\r\n return {\r\n type: constant.OPEN_ITEM.TYPE[config?.type],\r\n mode: constant.OPEN_ITEM.MODE.VIEW,\r\n url: `${urlPath}/${shortDetail?.id}`,\r\n name:\r\n config?.name ||\r\n `${capitalize(contentPaneType)} Full View (default view)`,\r\n };\r\n };\r\n\r\n const renderContentPane = () => {\r\n if (contentPaneType === 'folder') return renderFolderPanel();\r\n else return renderItemPanel();\r\n };\r\n\r\n const renderFolderPanel = () => {\r\n return (\r\n {\r\n setContentPreview(params);\r\n addDrawerStack('contentPreview');\r\n }}\r\n onClosePanel={() => {\r\n setVisible(false);\r\n }}\r\n onEditClick={onOpenEdit}\r\n />\r\n );\r\n };\r\n\r\n const renderItemPanel = () => {\r\n const panelCollection = {\r\n asset: AssetItemPanel,\r\n member: MemberItemPanel,\r\n product: ProductItemPanel,\r\n reporting: ReportingItemPanel,\r\n query: QueryItemPanel,\r\n };\r\n\r\n if (!contentPaneType) return null;\r\n\r\n const ItemPanel = panelCollection[contentPaneType];\r\n\r\n return ;\r\n };\r\n\r\n return (\r\n \r\n {isLoading || !shortDetail ? (\r\n
\r\n \r\n
\r\n ) : (\r\n renderContentPane()\r\n )}\r\n \r\n );\r\n};\r\n\r\nconst areEqual = (prevProps, nextProps) => {\r\n // just update when click to edit button to change view to edit mode, that button only clickable when selected folder is editable\r\n if (\r\n (prevProps?.shortDetail?.editable === nextProps?.shortDetail?.editable) ===\r\n true\r\n ) {\r\n return false;\r\n }\r\n\r\n if (!isEqual(prevProps.shortDetail, nextProps.shortDetail)) {\r\n return false;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nconst AssetItemPanel = (props) => {\r\n const { shortDetail } = props;\r\n\r\n return ;\r\n};\r\n\r\nconst MemberItemPanel = (props) => {\r\n const { shortDetail } = props;\r\n\r\n const { memberPublicContactList } = useMemberPublicContact({\r\n isEnabled: true,\r\n memberId: shortDetail.id,\r\n });\r\n\r\n function convertTagLine(data) {\r\n const parsedTagline = mapJSONToMarkdownObject(data);\r\n return parsedTagline?.content;\r\n }\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst ProductItemPanel = (props) => {\r\n const { shortDetail } = props;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst ReportingItemPanel = (props) => {\r\n const { shortDetail } = props;\r\n\r\n return ;\r\n};\r\n\r\nconst QueryItemPanel = (props) => {\r\n const { shortDetail } = props;\r\n\r\n return ;\r\n};\r\n\r\nexport default memo(FolderContentPane, areEqual);\r\n","import React, { useState } from 'react';\r\nimport { useSelector, useDispatch } from 'react-redux';\r\nimport { Modal, Input, Spin, notification, Row } from 'antd';\r\nimport gridViewReducer from 'common/components/grid-view/controllers/reducer';\r\nimport gridViewSaga from 'common/components/grid-view/controllers/saga';\r\nimport selectorsGridView from 'common/components/grid-view/controllers/selectors';\r\nimport { Form } from 'common/components';\r\n\r\nimport * as selectorsGlobal from '@redux/global/selectors';\r\nimport * as actionGlobal from '@redux/global/actions';\r\nimport { useInjectReducer } from 'utils/common/injectedReducers';\r\nimport { useInjectSaga } from 'utils/common/injectSaga';\r\nimport * as services from 'services/apl/index.js';\r\nimport messagesProduct from 'i18n/messages/product';\r\nimport { useIntl } from 'react-intl';\r\nconst keyGridView = 'gridView';\r\n\r\nconst ModalAddFolderToAPL = (props) => {\r\n useInjectReducer({ key: keyGridView, reducer: gridViewReducer });\r\n useInjectSaga({ key: keyGridView, saga: gridViewSaga });\r\n const [loading, setLoading] = useState(false);\r\n const dispatch = useDispatch();\r\n const visibleModal = useSelector(selectorsGlobal.selectShowAddFolderToAPL());\r\n const folderList = useSelector(\r\n selectorsGridView.makeSelectDetailCurrentITemsSelection()\r\n );\r\n const folderListIds = folderList?.map((item) => item.id);\r\n const [form] = Form.useForm();\r\n const { TextArea } = Input;\r\n const onCloseModal = () => {\r\n form.resetFields();\r\n dispatch(actionGlobal.updateAddFolderToAPL(false));\r\n };\r\n const intl = useIntl();\r\n\r\n const handleAddToAPL = (value) => {\r\n setLoading(true);\r\n const params = {\r\n folderIds: folderListIds,\r\n aplName: value.aplName,\r\n aplDescription: value.aplDescription,\r\n };\r\n services\r\n .addFoldersIntoNewAPL(params)\r\n .then((response) => {\r\n if (response.isSuccess) {\r\n notification.success({\r\n message: (\r\n <>\r\n \r\n {response.data.productIdsAdded.length} product(s) adds\r\n successfully\r\n \r\n \r\n {response.data.productIdsIgnored.length} product(s) adds error\r\n \r\n \r\n ),\r\n });\r\n } else {\r\n notification.error({ message: response?.message });\r\n }\r\n })\r\n .catch((error) => {\r\n notification.error({ message: error });\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n onCloseModal();\r\n });\r\n };\r\n\r\n return (\r\n <>\r\n form.submit()}\r\n >\r\n \r\n handleAddToAPL(value)}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default ModalAddFolderToAPL;\r\n","import React, { useEffect, useCallback, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\n\r\nimport { Skeleton } from 'antd';\r\n\r\nimport { GridView } from 'common/components/';\r\nimport FolderContentPane from '../FolderContentPane';\r\n// import { MemberPanel } from 'pages/branded-members/components/index';\r\nimport ModalAddFolderToAPL from './ModalAddFolderToAPL';\r\n\r\nimport {\r\n FolderGridThumbnail,\r\n FolderGridTile,\r\n} from 'pages/folders/shared/components';\r\n\r\nimport useCheckIsFolderOwner from 'hooks/useCheckIsFolderOwner';\r\nimport { useAgGridFolder } from '../../hooks/useAgGridFolder';\r\n\r\nimport * as folderEndpoints from 'services/folder/endpoints';\r\n\r\nimport * as folderActions from '../../controllers/actions';\r\n// import * as folderSelectors from '../../controllers/selectors';\r\nimport * as globalActions from '@redux/global/actions';\r\nimport * as globalSelectors from '@redux/global/selectors';\r\nimport * as actionsGridView from 'common/components/grid-view/controllers/actions';\r\nimport selectorsGridView from 'common/components/grid-view/controllers/selectors';\r\n\r\nimport { injectIntl } from 'react-intl';\r\nimport { sortFolderToTop } from 'pages/folders/shared/utils';\r\n\r\nconst FolderGridView = (props) => {\r\n const {\r\n loading,\r\n dataList,\r\n totalPagination,\r\n pageSizePagination,\r\n pageNumberPagination,\r\n loadingDetail,\r\n selectFolder,\r\n enableDownload,\r\n disableItemEvent,\r\n typeView,\r\n isInModal,\r\n visibleContentPane,\r\n hidePagination,\r\n folderOption,\r\n isFavoriteRoute,\r\n queryConditions,\r\n requestParams,\r\n shouldReloadDetailGrid,\r\n enableDragToFolder,\r\n shouldShowAdvanceFilterTags,\r\n searchText,\r\n } = props;\r\n const dispatch = useDispatch();\r\n const isShowDetail = useSelector(globalSelectors.selectShowDetail());\r\n const itemsSelection = useSelector(\r\n selectorsGridView.makeSelectItemsSelection()\r\n );\r\n const isOwner = useCheckIsFolderOwner();\r\n const isEditable = selectFolder?.editable;\r\n const [visible, setVisible] = useState(false);\r\n const [contentPreview, setContentPreview] = useState(null);\r\n\r\n // const queryPreview = useSelector(folderSelectors.selectQueryPreview());\r\n const {\r\n gridConfigProps,\r\n columnDefs,\r\n shouldReloadAgGrid,\r\n requestParamsFolder,\r\n // requestParams: requestParamsFolders,\r\n } = useAgGridFolder({\r\n folderOption,\r\n searchText,\r\n typeView,\r\n requestParams,\r\n });\r\n\r\n useEffect(() => {\r\n if (!visibleContentPane) {\r\n document.getElementById('button-clear-table-item') &&\r\n document.getElementById('button-clear-table-item').click();\r\n }\r\n }, [visibleContentPane]);\r\n\r\n useEffect(() => {\r\n return () => {\r\n // turn edit mode off when close ed panel\r\n dispatch(folderActions.turnEditShortContentOn(false));\r\n };\r\n }, []);\r\n\r\n const onClose = () => {\r\n dispatch(globalActions.removeCurrentFolder());\r\n setVisible(false);\r\n };\r\n\r\n const clickEditFolderHandler = () => {\r\n dispatch(folderActions.turnEditShortContentOn(true));\r\n dispatch(actionsGridView.updateVisible(true));\r\n };\r\n\r\n useEffect(() => {\r\n if (contentPreview && contentPreview?.type?.toLowerCase() === 'asset') {\r\n dispatch(folderActions.getDigitalAssetPreview(contentPreview.id));\r\n } else if (\r\n contentPreview &&\r\n contentPreview?.type?.toLowerCase() === 'member'\r\n ) {\r\n dispatch(folderActions.getMemberPreview(contentPreview.id));\r\n dispatch(folderActions.getPublicContact(contentPreview.id));\r\n } else if (\r\n contentPreview &&\r\n contentPreview?.type?.toLowerCase() === 'query'\r\n ) {\r\n dispatch(folderActions.getQueryPreview(contentPreview.id));\r\n } else if (\r\n contentPreview &&\r\n contentPreview?.type?.toLowerCase() === 'reporting'\r\n ) {\r\n dispatch(folderActions.getReportingPreview(contentPreview.id));\r\n } else if (\r\n contentPreview &&\r\n contentPreview?.type?.toLowerCase() === 'product'\r\n ) {\r\n dispatch(folderActions.getProductPreview(contentPreview.id));\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [contentPreview]);\r\n\r\n useEffect(() => {\r\n if (visibleContentPane && selectFolder && visible) {\r\n dispatch(folderActions.getDownloadSetting(selectFolder.id));\r\n }\r\n }, [visibleContentPane, selectFolder, visible]);\r\n\r\n useEffect(() => {\r\n // close download content pane when click edit button\r\n onClose();\r\n // eslint-disable-next-line\r\n }, [visibleContentPane]);\r\n\r\n const closeDetailContentPane = useCallback(() => {\r\n const shouldHideContentPane =\r\n (!isShowDetail && visibleContentPane && !isEditable) ||\r\n itemsSelection?.length !== 1;\r\n\r\n shouldHideContentPane && dispatch(actionsGridView.updateVisible(false));\r\n\r\n // eslint-disable-next-line\r\n }, [itemsSelection, isEditable]);\r\n\r\n const switchToDetailView = useCallback(() => {\r\n const shouldSwitchToDetailView =\r\n !isEditable && itemsSelection?.length === 1;\r\n\r\n shouldSwitchToDetailView &&\r\n dispatch(folderActions.turnEditShortContentOn(false));\r\n // eslint-disable-next-line\r\n }, [itemsSelection, isEditable]);\r\n\r\n useEffect(() => {\r\n // close detail content pane if needed\r\n closeDetailContentPane();\r\n // switch to detail content view if needed\r\n switchToDetailView();\r\n }, [closeDetailContentPane, switchToDetailView]);\r\n\r\n const onOpenEdit = () => {\r\n dispatch(folderActions.turnEditShortContentOn(true));\r\n };\r\n\r\n const onCloseEdit = () => {\r\n dispatch(folderActions.turnEditShortContentOn(false));\r\n // close detail content pane if show detail mode is off\r\n !isShowDetail && dispatch(actionsGridView.updateVisible(false));\r\n };\r\n\r\n const onCloseCallbackHandler = () => {\r\n onCloseEdit();\r\n };\r\n\r\n const folderContentPaneProps = {\r\n setContentPreview,\r\n onCloseCallbackHandler,\r\n onCloseEdit,\r\n onOpenEdit,\r\n loadingDetail,\r\n selectFolder,\r\n folderOption,\r\n isOwner,\r\n setVisible,\r\n clickEditFolderHandler,\r\n };\r\n\r\n const urlGrid = isFavoriteRoute\r\n ? folderEndpoints.FAVORITE_FOLDER_DETAIL_GRID\r\n : folderEndpoints.FOLDER_DETAIL_GRID;\r\n const urlGridDistinct = isFavoriteRoute\r\n ? folderEndpoints.FAVORITE_FOLDER_DETAIL_GRID_DISTINCT\r\n : folderEndpoints.FOLDER_DETAIL_GRID_DISTINCT;\r\n\r\n const isApplyDefaultSort = searchText ? false : true;\r\n\r\n return (\r\n <>\r\n \r\n
\r\n {\r\n const newConfigProps = {\r\n ...configProps,\r\n folderOption,\r\n disableEvent: true,\r\n };\r\n return ;\r\n }}\r\n tileGridBody={(configProps) => {\r\n const { clickEvents } = configProps;\r\n const newConfigProps = {\r\n ...clickEvents,\r\n ...configProps,\r\n folderOption,\r\n disableEvent: true,\r\n };\r\n return ;\r\n }}\r\n columnDefs={columnDefs}\r\n urlGrid={urlGrid}\r\n urlGridDistinct={urlGridDistinct}\r\n responseParams='data'\r\n requestParams={{\r\n folderOption,\r\n ...requestParamsFolder,\r\n }}\r\n shouldReloadDetailGrid={shouldReloadAgGrid}\r\n queryConditions={queryConditions}\r\n hidePagination={hidePagination}\r\n panelDetail={}\r\n typeView={typeView}\r\n type={'Folder'}\r\n disableItemEvent={disableItemEvent}\r\n enableDragToFolder={enableDragToFolder}\r\n notShowHeaderCheckbox={true}\r\n gridConfigProps={gridConfigProps}\r\n shouldShowAdvanceFilterTags={shouldShowAdvanceFilterTags}\r\n applyDefaultSort={isApplyDefaultSort}\r\n sortDataHandler={sortFolderToTop}\r\n />\r\n
\r\n
\r\n \r\n \r\n );\r\n};\r\n\r\nFolderGridView.propTypes = {\r\n loading: PropTypes.bool,\r\n dataList: PropTypes.array,\r\n totalPagination: PropTypes.number,\r\n pageSizePagination: PropTypes.number,\r\n pageNumberPagination: PropTypes.number,\r\n columns: PropTypes.array,\r\n enableDownload: PropTypes.bool,\r\n disableItemEvent: PropTypes.bool,\r\n typeView: PropTypes.string,\r\n isInModal: PropTypes.bool,\r\n visibleContentPane: PropTypes.bool,\r\n hidePagination: PropTypes.bool,\r\n folderOption: PropTypes.string,\r\n isFavoriteRoute: PropTypes.bool,\r\n};\r\n\r\nFolderGridView.defaultProps = {\r\n enableDownload: true,\r\n propTypeView: false,\r\n};\r\n\r\nexport default injectIntl(FolderGridView);\r\n","import React, { useEffect } from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { Input, Checkbox, Col, Row, Spin, DatePicker, Select } from 'antd';\r\n\r\nimport { formatMDY } from 'utils/formatDate';\r\nimport Message from 'i18n/messages/folder';\r\nimport memberReducer from 'pages/company-profile/controllers/reducer';\r\nimport { useInjectReducer } from 'utils/common/injectedReducers';\r\nimport { useInjectSaga } from 'utils/common/injectSaga';\r\nimport saga from 'pages/company-profile/controllers/saga';\r\nimport userSelectors from '@redux/user/selectors';\r\nimport moment from 'moment';\r\nimport * as memberActions from 'pages/company-profile/controllers/actions';\r\nimport { FormattedMessage } from 'react-intl';\r\nimport { Form, WrapperSelect } from 'common/components';\r\nimport { getDateFormat } from 'utils/formatDate';\r\n\r\nimport {\r\n PRIVATE_FOLDER_VISIBILITY,\r\n FOLDER_VISIBILITY,\r\n DATE_FORMAT,\r\n} from 'static/Constants';\r\n\r\nimport { useGetMemberHeaderFromMemberId } from 'common/queries/member-module';\r\n\r\nconst formItemLayout = {\r\n labelCol: { span: 10 },\r\n wrapperCol: { span: 14 },\r\n};\r\n\r\nconst FolderEditDetailContent = (props) => {\r\n useInjectReducer({ key: 'member', reducer: memberReducer });\r\n useInjectSaga({ key: 'member', saga });\r\n\r\n const dispatch = useDispatch();\r\n\r\n const { folderInfo } = props;\r\n\r\n const userInfo = useSelector(userSelectors.makeSelectUserInfo());\r\n\r\n useEffect(() => {\r\n dispatch(memberActions.getMemberProfileHeader(userInfo?.member?.id));\r\n }, [dispatch, userInfo?.member?.id]);\r\n\r\n const { data: memberHeaderOfFolderOwner } = useGetMemberHeaderFromMemberId({\r\n memberId: folderInfo?.ownerId,\r\n enabled: Boolean(folderInfo && folderInfo?.ownerId),\r\n });\r\n\r\n const isPrivateVisibilityFolder =\r\n memberHeaderOfFolderOwner?.folders?.toLowerCase() === 'private';\r\n\r\n const isRootFolder = folderInfo?.level === 1;\r\n\r\n function disabledDate(current) {\r\n // Can not select days before today and today\r\n return current && current < moment().endOf('day');\r\n }\r\n\r\n const FieldItemInputDisabled = ({ data }) => {\r\n return (\r\n }\r\n >\r\n \r\n \r\n );\r\n };\r\n\r\n const FieldItemCheckboxDisabled = ({ data }) => {\r\n return (\r\n }\r\n valuePropName='checked'\r\n >\r\n \r\n \r\n );\r\n };\r\n\r\n const FieldItemCheckbox = ({ data }) => {\r\n return (\r\n }\r\n valuePropName='checked'\r\n >\r\n \r\n \r\n );\r\n };\r\n\r\n const FieldItemRangePicker = ({ data }) => {\r\n return (\r\n }\r\n >\r\n \r\n \r\n );\r\n };\r\n const FieldItemRangePickerDisabled = ({ data }) => {\r\n return (\r\n }\r\n >\r\n \r\n \r\n );\r\n };\r\n return (\r\n <>\r\n \r\n \r\n \r\n }\r\n rules={[\r\n {\r\n required: true,\r\n message: (\r\n \r\n ),\r\n },\r\n {\r\n whitespace: true,\r\n message: (\r\n \r\n ),\r\n },\r\n ]}\r\n className='folder-panel-edit-content__folder-name'\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n {isPrivateVisibilityFolder\r\n ? PRIVATE_FOLDER_VISIBILITY?.slice()\r\n .sort()\r\n .map((visibility) => (\r\n \r\n {visibility}\r\n \r\n ))\r\n : FOLDER_VISIBILITY?.slice()\r\n .sort()\r\n .map((visibility) => (\r\n \r\n {visibility}\r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default FolderEditDetailContent;\r\n","import React, { useEffect, useState } from 'react';\r\nimport { Form, Button, Col, Row } from 'antd';\r\nimport { StyledModal } from 'common/components';\r\nimport FolderEditDetailContent from 'pages/folders/folder-details/FolderEditDetailContent';\r\nimport _ from 'lodash';\r\nimport { editFolderShortContent } from 'services/folder';\r\nimport { apiHandler } from 'utils/api';\r\nimport moment from 'moment';\r\nimport { sleep } from 'utils/delay';\r\n\r\nexport const WIDTH_CONTANT_PANE = 500;\r\n\r\nconst FolderEditModal = ({\r\n visible,\r\n onCancel,\r\n folderInfo,\r\n idSelected,\r\n onSaveSuccess,\r\n}) => {\r\n const [form] = Form.useForm();\r\n const [loading, setLoading] = useState(false);\r\n\r\n const folderName = Form.useWatch('folderName', form);\r\n\r\n const isFolderNameEmpty = folderName?.trim() === '';\r\n\r\n const submitUpdateSuccessCallback = () => {\r\n onSaveSuccess && onSaveSuccess();\r\n setLoading(false);\r\n };\r\n\r\n const saveFolder = async () => {\r\n setLoading(true);\r\n const formValue = form.getFieldsValue();\r\n const params = _.pick(formValue, [\r\n 'id',\r\n 'folderName',\r\n 'specialPurpose',\r\n 'expirationDate',\r\n 'visibility',\r\n ]);\r\n await sleep(1000);\r\n apiHandler({\r\n service: editFolderShortContent,\r\n params: { ...params, id: idSelected },\r\n successMessage: 'Edit Folder Successfully !',\r\n errorMessage: 'Edit Folder Failed !',\r\n successCallback: submitUpdateSuccessCallback,\r\n onFinally: () => {\r\n setLoading(false);\r\n },\r\n });\r\n };\r\n\r\n const renderModalFooter = () => {\r\n const CancelBtn = Button;\r\n const SaveBtn = Button;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n Cancel\r\n \r\n \r\n Save\r\n \r\n \r\n \r\n );\r\n };\r\n\r\n const modalProps = {\r\n title: 'Edit Folder',\r\n visible,\r\n onCancel,\r\n\r\n width: 700,\r\n bodyStyle: {\r\n minHeight: '40vh',\r\n },\r\n maskClosable: false,\r\n okText: 'Save',\r\n onOk: saveFolder,\r\n footer: renderModalFooter(),\r\n };\r\n\r\n useEffect(() => {\r\n if (folderInfo) {\r\n const {\r\n dateCreated,\r\n dateShared,\r\n lastUpdated,\r\n lastDownload,\r\n lastSchedule,\r\n expirationDate,\r\n ...rest\r\n } = folderInfo;\r\n const paramsForm = {\r\n ...rest,\r\n dateCreated: dateCreated ? moment(dateCreated) : null,\r\n lastUpdated: lastUpdated ? moment(lastUpdated) : null,\r\n dateShared: dateShared ? moment(dateShared) : null,\r\n lastDownload: lastDownload ? moment(lastDownload) : null,\r\n lastSchedule: lastSchedule ? moment(lastSchedule) : null,\r\n expirationDate: expirationDate ? moment(expirationDate) : null,\r\n };\r\n\r\n form.setFieldsValue(paramsForm);\r\n }\r\n }, [folderInfo]);\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default FolderEditModal;\r\n","import { Images } from 'config/assets';\r\n\r\nimport Reporting from 'assets/reporting/Reporting.png';\r\nimport AssetReport from 'assets/reporting/AssetReport.png';\r\nimport ProductReport from 'assets/reporting/ProductReport.png';\r\nimport MemberReport from 'assets/reporting/MemberReport.png';\r\n\r\nexport const getThumbnailImage = (dataDetail, type) => {\r\n const totalCount =\r\n dataDetail?.subFolderCount +\r\n dataDetail?.contentsCount +\r\n dataDetail?.productCount +\r\n dataDetail?.assetCount +\r\n dataDetail?.reportingCount +\r\n dataDetail?.queryCount +\r\n dataDetail?.memberCount;\r\n\r\n const reportingImage =\r\n (dataDetail?.advType === 'DigitalMedia' && AssetReport) ||\r\n (dataDetail?.advType === 'Member' && MemberReport) ||\r\n (dataDetail?.advType === 'ProductItem' && ProductReport);\r\n\r\n const imageCollection = {\r\n folder: totalCount > 0 ? Images.folder : Images.emptyFolder,\r\n reporting: reportingImage,\r\n query: Reporting,\r\n };\r\n\r\n const image = imageCollection[type] || dataDetail?.thumbnail;\r\n\r\n return image;\r\n};\r\n","import * as types from './constants';\r\n\r\nexport const getFolderGridColumns = (gridName) => ({\r\n type: types.GET_FOLDER_GRID_COLUMN,\r\n gridName,\r\n});\r\n\r\nexport const getFolderGridColumnsSuccess = (columns) => {\r\n return {\r\n type: types.GET_FOLDER_GRID_COLUMN_SUCCESS,\r\n columns,\r\n };\r\n};\r\n\r\nexport const getFolderGridColumnsError = (error) => ({\r\n type: types.GET_FOLDER_GRID_COLUMN_ERROR,\r\n error,\r\n});\r\n\r\nexport function getFolderList(\r\n folderOption,\r\n pageNumber,\r\n pageSize,\r\n search,\r\n isFavoriteRoute,\r\n advancedSearchContainer\r\n) {\r\n return {\r\n type: types.GET_FOLDER_GRID,\r\n folderOption,\r\n pageIndex: pageNumber,\r\n pageSize,\r\n search,\r\n isFavoriteRoute,\r\n advancedSearchContainer,\r\n };\r\n}\r\n\r\nexport const getFolderListByLevel = (params) => {\r\n return {\r\n type: types.GET_FOLDER_GRID_BY_LEVEL,\r\n ...params,\r\n };\r\n};\r\n\r\nexport const getFolderListByLevelSuccess = ({\r\n data,\r\n folderOption,\r\n ...rest\r\n}) => {\r\n return {\r\n type: types.GET_FOLDER_GRID_BY_LEVEL_SUCCESS,\r\n data,\r\n folderOption,\r\n ...rest,\r\n };\r\n};\r\n\r\nexport const updateFolderBreadcrumb = (breadcrumb) => {\r\n return {\r\n type: types.UPDATE_FOLDER_BREADCRUMB,\r\n breadcrumb,\r\n };\r\n};\r\n\r\nexport const keepBreadcrumb = (payload) => {\r\n return {\r\n type: types.KEEP_BREADCRUMB,\r\n payload,\r\n };\r\n};\r\n\r\nexport const updateShouldKeepBreadcrumb = (payload) => {\r\n return {\r\n type: types.UPDATE_SHOULD_KEEP_BREADCRUMB,\r\n payload,\r\n };\r\n};\r\n\r\nexport const getFolderListByLevelError = (error) => {\r\n return {\r\n type: types.GET_FOLDER_GRID_BY_LEVEL_ERROR,\r\n error,\r\n };\r\n};\r\n\r\nexport function getFolderListSuccess(folders, total) {\r\n return {\r\n type: types.GET_FOLDER_GRID_SUCCESS,\r\n folders,\r\n total,\r\n };\r\n}\r\n\r\nexport function getFolderListError(error) {\r\n return {\r\n type: types.GET_FOLDER_GRID_ERROR,\r\n error,\r\n };\r\n}\r\n\r\nexport const turnOnModalCreate = () => {\r\n return { type: types.TURN_ON_MODAL_CREATE };\r\n};\r\n\r\nexport const turnOffModalCreate = () => {\r\n return { type: types.TURN_OFF_MODAL_CREATE };\r\n};\r\n\r\nexport const turnOnModalCopy = () => {\r\n return { type: types.TURN_ON_MODAL_COPY };\r\n};\r\n\r\nexport const turnOffModalCopy = () => {\r\n return { type: types.TURN_OFF_MODAL_COPY };\r\n};\r\n\r\nexport const deleteFolders = (ids) => {\r\n return { type: types.DELETE_FOLDERS, payload: ids };\r\n};\r\n\r\nexport const deleteFoldersSuccess = () => {\r\n return { type: types.DELETE_FOLDERS_SUCCESS };\r\n};\r\n\r\nexport const deleteFoldersFail = (error) => {\r\n return { type: types.DELETE_FOLDERS_FAIL, error };\r\n};\r\n\r\nexport const copyFolder = (params) => {\r\n return { type: types.COPY_FOLDER, payload: params };\r\n};\r\n\r\nexport const copyFolderSuccess = () => {\r\n return { type: types.COPY_FOLDER_SUCCESS };\r\n};\r\n\r\nexport const copyFolderFail = (error) => {\r\n return { type: types.COPY_FOLDER_FAIL, error };\r\n};\r\n\r\nexport function getFolderShortDetail(id) {\r\n return {\r\n type: types.GET_FOLDER_SHORT_DETAIL,\r\n id,\r\n };\r\n}\r\n\r\nexport function getFolderShortDetailSuccess(data) {\r\n return {\r\n type: types.GET_FOLDER_SHORT_DETAIL_SUCCESS,\r\n data,\r\n };\r\n}\r\n\r\nexport function getFolderShortDetailError(error) {\r\n return {\r\n type: types.GET_FOLDER_SHORT_DETAIL_ERROR,\r\n error,\r\n };\r\n}\r\n\r\nexport function getDigitalAssetPreview(id) {\r\n return {\r\n type: types.GET_DIGITAL_ASSET_PREVIEW,\r\n id,\r\n };\r\n}\r\n\r\nexport function getDigitalAssetPreviewSuccess(data) {\r\n return {\r\n type: types.GET_DIGITAL_ASSET_PREVIEW_SUCCESS,\r\n data,\r\n };\r\n}\r\n\r\nexport function getDigitalAssetPreviewError(error) {\r\n return {\r\n type: types.GET_DIGITAL_ASSET_PREVIEW_ERROR,\r\n error,\r\n };\r\n}\r\n\r\nexport function getMemberPreview(id) {\r\n return {\r\n type: types.GET_MEMBER_PREVIEW,\r\n id,\r\n };\r\n}\r\n\r\nexport function getMemberPreviewSuccess(data) {\r\n return {\r\n type: types.GET_MEMBER_PREVIEW_SUCCESS,\r\n data,\r\n };\r\n}\r\n\r\nexport function getMemberPreviewError(error) {\r\n return {\r\n type: types.GET_MEMBER_PREVIEW_ERROR,\r\n error,\r\n };\r\n}\r\n\r\n// GET DOWNLOAD SETTING\r\nexport function getDownloadSetting(id) {\r\n return {\r\n type: types.GET_DOWNLOAD_SETTING,\r\n id,\r\n };\r\n}\r\n\r\nexport function getDownloadSettingSuccess(data) {\r\n return {\r\n type: types.GET_DOWNLOAD_SETTING_SUCCESS,\r\n data,\r\n };\r\n}\r\n\r\nexport function getDownloadSettingError(error) {\r\n return {\r\n type: types.GET_DOWNLOAD_SETTING_ERROR,\r\n error,\r\n };\r\n}\r\n\r\n// edit folder short content\r\nexport const turnEditShortContentOn = (value) => {\r\n return {\r\n type: types.TURN_EDIT_SHORT_CONTENT_ON,\r\n value,\r\n };\r\n};\r\n\r\nexport const editShortContent = (params) => {\r\n return {\r\n type: types.EDIT_FOLDER_SHORT_CONTENT,\r\n params,\r\n };\r\n};\r\n\r\nexport const editShortContentSuccess = () => ({\r\n type: types.EDIT_FOLDER_SHORT_CONTENT_SUCCESS,\r\n});\r\n\r\nexport const editShortContentError = (error) => ({\r\n type: types.EDIT_FOLDER_SHORT_CONTENT_ERROR,\r\n error,\r\n});\r\n\r\nexport const setReloadContentPane = (value) => ({\r\n type: types.SET_RELOAD_FOLDER_CONTENT_PANE,\r\n value,\r\n});\r\n\r\nexport const editShortContentFinish = () => ({\r\n type: types.EDIT_FOLDER_SHORT_CONTENT_FINISH,\r\n});\r\n\r\nexport const setReloadFolderPage = () => ({\r\n type: types.SET_RELOAD_FOLDER_PAGE,\r\n});\r\n\r\nexport const configDownloadSchedule = (params) => {\r\n return {\r\n type: types.CONFIG_SCHEDULE_DOWNLOAD,\r\n params,\r\n };\r\n};\r\n\r\nexport const configDownloadScheduleSuccess = () => ({\r\n type: types.CONFIG_SCHEDULE_DOWNLOAD_SUCCESS,\r\n});\r\n\r\nexport const configDownloadScheduleError = (error) => ({\r\n type: types.CONFIG_SCHEDULE_DOWNLOAD_ERROR,\r\n error,\r\n});\r\n\r\n// Reset Folders Paging\r\nexport const resetFolderPaging = () => ({\r\n type: types.RESET_FOLDER_PAGING,\r\n});\r\n// Reset MyFolders Paging\r\nexport const resetOwnedFolderPaging = () => ({\r\n type: types.RESET_OWNED_FOLDER_PAGING,\r\n});\r\n// Reset FoldersSharedToMe Paging\r\nexport const resetSharedFolderPaging = () => ({\r\n type: types.RESET_SHARED_FOLDER_PAGING,\r\n});\r\n\r\n// Get MyFolders\r\nexport function getOwnedFolderList(\r\n folderOption,\r\n pageNumber,\r\n pageSize,\r\n search,\r\n advancedSearchContainer\r\n) {\r\n return {\r\n type: types.GET_OWNED_FOLDER_GRID,\r\n folderOption,\r\n pageIndex: pageNumber,\r\n pageSize,\r\n search,\r\n advancedSearchContainer,\r\n };\r\n}\r\nexport function getOwnedFolderListSuccess(folders, total) {\r\n return {\r\n type: types.GET_OWNED_FOLDER_GRID_SUCCESS,\r\n folders,\r\n total,\r\n };\r\n}\r\nexport function getOwnedFolderListError(error) {\r\n return {\r\n type: types.GET_OWNED_FOLDER_GRID_ERROR,\r\n error,\r\n };\r\n}\r\n\r\n// Get FoldersSharedToMe\r\nexport function getSharedFolderList(\r\n folderOption,\r\n pageNumber,\r\n pageSize,\r\n search,\r\n advancedSearchContainer\r\n) {\r\n return {\r\n type: types.GET_SHARED_FOLDER_GRID,\r\n folderOption,\r\n pageIndex: pageNumber,\r\n pageSize,\r\n search,\r\n advancedSearchContainer,\r\n };\r\n}\r\nexport function getSharedFolderListSuccess(folders, total) {\r\n return {\r\n type: types.GET_SHARED_FOLDER_GRID_SUCCESS,\r\n folders,\r\n total,\r\n };\r\n}\r\nexport function getSharedFolderListError(error) {\r\n return {\r\n type: types.GET_SHARED_FOLDER_GRID_ERROR,\r\n error,\r\n };\r\n}\r\n\r\nexport function getPublicContact(memberId) {\r\n return {\r\n type: types.GET_PUBLIC_CONTACT_FOLDER,\r\n memberId,\r\n };\r\n}\r\n\r\nexport function getPublicContactSuccess(data) {\r\n return {\r\n type: types.GET_PUBLIC_CONTACT_FOLDER_SUCCESS,\r\n data,\r\n };\r\n}\r\n\r\nexport function getPublicContactError(error) {\r\n return {\r\n type: types.GET_PUBLIC_CONTACT_FOLDER_ERROR,\r\n error,\r\n };\r\n}\r\n\r\n// Folder details\r\nexport function getColumnsFolderDetails(gridName) {\r\n return {\r\n type: types.GET_COLUMNS_FOLDER_DETAILS,\r\n gridName,\r\n };\r\n}\r\n\r\nexport function getColumnsFolderDetailsSuccess(columns) {\r\n return {\r\n type: types.GET_COLUMNS_FOLDER_DETAILS_SUCCESS,\r\n columns,\r\n };\r\n}\r\n\r\nexport function getColumnsFolderDetailsError(error) {\r\n return {\r\n type: types.GET_COLUMNS_FOLDER_DETAILS_ERROR,\r\n error,\r\n };\r\n}\r\n\r\nexport function getFolderDetailsGridThumb(params) {\r\n return {\r\n type: types.GET_FOLDER_DETAILS_GRID_THUMB,\r\n params,\r\n };\r\n}\r\n\r\nexport function getFolderDetailsGridThumbSuccess(data) {\r\n return {\r\n type: types.GET_FOLDER_DETAILS_GRID_THUMB_SUCCESS,\r\n data,\r\n };\r\n}\r\n\r\nexport function getQueryPreview(id) {\r\n return {\r\n type: types.GET_QUERY_PREVIEW,\r\n id,\r\n };\r\n}\r\n\r\nexport function getQueryPreviewSuccess(data) {\r\n return {\r\n type: types.GET_QUERY_PREVIEW_SUCCESS,\r\n data,\r\n };\r\n}\r\n\r\nexport function getFolderDetailsGridThumbError(error) {\r\n return {\r\n type: types.GET_COLUMNS_FOLDER_DETAILS_ERROR,\r\n };\r\n}\r\n\r\nexport function getQueryPreviewError(error) {\r\n return {\r\n type: types.GET_QUERY_PREVIEW_ERROR,\r\n error,\r\n };\r\n}\r\n\r\nexport function getReportingPreview(id) {\r\n return {\r\n type: types.GET_REPORTING_PREVIEW,\r\n id,\r\n };\r\n}\r\n\r\nexport function getReportingPreviewSuccess(data) {\r\n return {\r\n type: types.GET_REPORTING_PREVIEW_SUCCESS,\r\n data,\r\n };\r\n}\r\n\r\nexport function getReportingPreviewError(error) {\r\n return {\r\n type: types.GET_REPORTING_PREVIEW_ERROR,\r\n error,\r\n };\r\n}\r\n\r\nexport function getProductPreview(id) {\r\n return {\r\n type: types.GET_PRODUCT_PREVIEW,\r\n id,\r\n };\r\n}\r\n\r\nexport function getProductPreviewSuccess(data) {\r\n return {\r\n type: types.GET_PRODUCT_PREVIEW_SUCCESS,\r\n data,\r\n };\r\n}\r\n\r\nexport function getProductPreviewError(error) {\r\n return {\r\n type: types.GET_PRODUCT_PREVIEW_ERROR,\r\n error,\r\n };\r\n}\r\n\r\nexport function saveSelectedMapping(data) {\r\n return {\r\n type: types.SAVE_SELECTED_MAPPING,\r\n data,\r\n };\r\n}\r\n\r\nexport function saveStatusDownloadFolder(data) {\r\n return {\r\n type: types.SAVE_STATUS_DOWNLOAD_FOLDER,\r\n data,\r\n };\r\n}\r\n\r\nexport function updateFolderDetailData(data) {\r\n return {\r\n type: types.UPDATE_FOLDER_DETAIL_DATA,\r\n data,\r\n };\r\n}\r\n","// GET FOLDER grid columns\r\nexport const GET_FOLDER_GRID_COLUMN = 'GET_FOLDER_GRID_COLUMN';\r\nexport const GET_FOLDER_GRID_COLUMN_SUCCESS = 'GET_FOLDER_GRID_COLUMN_SUCCESS';\r\nexport const GET_FOLDER_GRID_COLUMN_ERROR = 'GET_FOLDER_GRID_COLUMN_ERROR';\r\nexport const GET_FOLDER_LIST = 'GET_FOLDER_LIST';\r\nexport const GET_FOLDER_LIST_SUCCESS = 'GET_FOLDER_LIST_SUCCESS';\r\nexport const GET_FOLDER_LIST_ERROR = 'GET_FOLDER_LIST_ERROR';\r\n\r\nexport const TURN_ON_MODAL_CREATE = 'TURN_ON_MODAL_CREATE';\r\nexport const TURN_OFF_MODAL_CREATE = 'TURN_OFF_MODAL_CREATE';\r\n\r\nexport const TURN_ON_MODAL_COPY = 'TURN_ON_MODAL_COPY';\r\nexport const TURN_OFF_MODAL_COPY = 'TURN_OFF_MODAL_COPY';\r\n\r\nexport const CREATE_FOLDER = 'CREATE_FOLDER';\r\nexport const CREATE_FOLDER_SUCCESS = 'CREATE_FOLDER_SUCCESS';\r\nexport const CREATE_FOLDER_FAIL = 'CREATE_FOLDER_FAIL';\r\n\r\nexport const DELETE_FOLDERS = 'DELETE_FOLDERS';\r\nexport const DELETE_FOLDERS_SUCCESS = 'DELETE_FOLDERS_SUCCESS';\r\nexport const DELETE_FOLDERS_FAIL = 'DELETE_FOLDERS_FAIL';\r\n\r\nexport const COPY_FOLDER = 'COPY_FOLDER';\r\nexport const COPY_FOLDER_SUCCESS = 'COPY_FOLDER_SUCCESS';\r\nexport const COPY_FOLDER_FAIL = 'COPY_FOLDER_FAIL';\r\n\r\nexport const GET_FOLDER_GRID_BY_LEVEL = 'GET_FOLDER_GRID_BY_LEVEL';\r\nexport const GET_FOLDER_GRID_BY_LEVEL_SUCCESS =\r\n 'GET_FOLDER_GRID_BY_LEVEL_SUCCESS';\r\nexport const GET_FOLDER_GRID_BY_LEVEL_ERROR = 'GET_FOLDER_GRID_BY_LEVEL_ERROR';\r\n\r\nexport const UPDATE_FOLDER_BREADCRUMB = 'UPDATE_FOLDER_BREADCRUMB';\r\nexport const KEEP_BREADCRUMB = 'KEEP_BREADCRUMB';\r\n\r\nexport const GET_FOLDER_GRID = 'GET_FOLDER_GRID';\r\nexport const GET_FOLDER_GRID_SUCCESS = 'GET_FOLDER_GRID_SUCCESS';\r\nexport const GET_FOLDER_GRID_ERROR = 'GET_FOLDER_GRID_ERROR';\r\n\r\nexport const GET_FOLDER_SHORT_DETAIL = 'GET_FOLDER_SHORT_DETAIL';\r\nexport const GET_FOLDER_SHORT_DETAIL_SUCCESS =\r\n 'GET_FOLDER_SHORT_DETAIL_SUCCESS';\r\nexport const GET_FOLDER_SHORT_DETAIL_ERROR = 'GET_FOLDER_SHORT_DETAIL_ERROR';\r\n\r\nexport const GET_MEMBER_PREVIEW = 'GET_MEMBER_PREVIEW';\r\nexport const GET_MEMBER_PREVIEW_SUCCESS = 'GET_MEMBER_PREVIEW_SUCCESS';\r\nexport const GET_MEMBER_PREVIEW_ERROR = 'GET_MEMBER_PREVIEW_ERROR';\r\nexport const GET_DIGITAL_ASSET_PREVIEW = 'GET_DIGITAL_ASSET_PREVIEW';\r\nexport const GET_DIGITAL_ASSET_PREVIEW_SUCCESS =\r\n 'GET_DIGITAL_ASSET_PREVIEW_SUCCESS';\r\nexport const GET_DIGITAL_ASSET_PREVIEW_ERROR =\r\n 'GET_DIGITAL_ASSET_SHORT_DETAIL_ERROR';\r\n\r\n// GET DOWNLOAD SETTING\r\nexport const GET_DOWNLOAD_SETTING = 'GET_DOWNLOAD_SETTING';\r\nexport const GET_DOWNLOAD_SETTING_SUCCESS = 'GET_DOWNLOAD_SETTING_SUCCESS';\r\nexport const GET_DOWNLOAD_SETTING_ERROR = 'GET_DOWNLOAD_SETTING_ERROR';\r\n\r\n// EDIT FOLDER SHORT CONTENT\r\nexport const EDIT_FOLDER_SHORT_CONTENT = 'EDIT_FOLDER_SHORT_CONTENT';\r\nexport const TURN_EDIT_SHORT_CONTENT_ON = 'TURN_EDIT_SHORT_CONTENT_ON';\r\nexport const EDIT_FOLDER_SHORT_CONTENT_SUCCESS =\r\n 'EDIT_FOLDER_SHORT_CONTENT_SUCCESS';\r\nexport const EDIT_FOLDER_SHORT_CONTENT_ERROR =\r\n 'EDIT_FOLDER_SHORT_CONTENT_ERROR';\r\nexport const SET_RELOAD_FOLDER_CONTENT_PANE = 'SET_RELOAD_FOLDER_CONTENT_PANE';\r\nexport const EDIT_FOLDER_SHORT_CONTENT_FINISH =\r\n 'EDIT_FOLDER_SHORT_CONTENT_FINISH';\r\nexport const SET_RELOAD_FOLDER_PAGE = 'SET_RELOAD_FOLDER_PAGE';\r\n\r\nexport const CONFIG_SCHEDULE_DOWNLOAD = 'CONFIG_SCHEDULE_DOWNLOAD';\r\nexport const CONFIG_SCHEDULE_DOWNLOAD_SUCCESS =\r\n 'CONFIG_SCHEDULE_DOWNLOAD_SUCCESS';\r\nexport const CONFIG_SCHEDULE_DOWNLOAD_ERROR = 'CONFIG_SCHEDULE_DOWNLOAD_ERROR';\r\n\r\n// Leave page\r\nexport const RESET_FOLDER_PAGING = 'RESET_FOLDER_PAGING';\r\nexport const RESET_OWNED_FOLDER_PAGING = 'RESET_OWNED_FOLDER_PAGING';\r\nexport const RESET_SHARED_FOLDER_PAGING = 'RESET_SHARED_FOLDER_PAGING';\r\n// MyFolders grid\r\nexport const GET_OWNED_FOLDER_GRID = 'GET_OWNED_FOLDER_GRID';\r\nexport const GET_OWNED_FOLDER_GRID_SUCCESS = 'GET_OWNED_FOLDER_GRID_SUCCESS';\r\nexport const GET_OWNED_FOLDER_GRID_ERROR = 'GET_OWNED_FOLDER_GRID_ERROR';\r\n// FoldersSharedToMe grid\r\nexport const GET_SHARED_FOLDER_GRID = 'GET_SHARED_FOLDER_GRID';\r\nexport const GET_SHARED_FOLDER_GRID_SUCCESS = 'GET_SHARED_FOLDER_GRID_SUCCESS';\r\nexport const GET_SHARED_FOLDER_GRID_ERROR = 'GET_SHARED_FOLDER_GRID_ERROR';\r\nexport const GET_PUBLIC_CONTACT_FOLDER = 'GET_PUBLIC_CONTACT_FOLDER';\r\nexport const GET_PUBLIC_CONTACT_FOLDER_SUCCESS =\r\n 'GET_PUBLIC_CONTACT_FOLDER_SUCCESS';\r\nexport const GET_PUBLIC_CONTACT_FOLDER_ERROR =\r\n 'GET_PUBLIC_CONTACT_FOLDER_ERROR';\r\n\r\n// Folder details\r\nexport const GET_COLUMNS_FOLDER_DETAILS = 'GET_COLUMNS_FOLDER_DETAILS';\r\nexport const GET_COLUMNS_FOLDER_DETAILS_SUCCESS =\r\n 'GET_COLUMNS_FOLDER_DETAILS_SUCCESS';\r\nexport const GET_COLUMNS_FOLDER_DETAILS_ERROR =\r\n 'GET_COLUMNS_FOLDER_DETAILS_ERROR';\r\n\r\nexport const GET_FOLDER_DETAILS_GRID_THUMB = 'GET_FOLDER_DETAILS_GRID_THUMB';\r\nexport const GET_FOLDER_DETAILS_GRID_THUMB_SUCCESS =\r\n 'GET_FOLDER_DETAILS_GRID_THUMB_SUCCESS';\r\nexport const GET_FOLDER_DETAILS_GRID_THUMB_ERROR =\r\n 'GET_FOLDER_DETAILS_GRID_THUMB_ERROR';\r\nexport const GET_QUERY_PREVIEW = 'GET_QUERY_PREVIEW';\r\nexport const GET_QUERY_PREVIEW_SUCCESS = 'GET_QUERY_PREVIEW_SUCCESS';\r\nexport const GET_QUERY_PREVIEW_ERROR = 'GET_QUERY_PREVIEW_ERROR';\r\nexport const GET_REPORTING_PREVIEW = 'GET_REPORTING_PREVIEW';\r\nexport const GET_REPORTING_PREVIEW_SUCCESS = 'GET_REPORTING_PREVIEW_SUCCESS';\r\nexport const GET_REPORTING_PREVIEW_ERROR = 'GET_REPORTING_PREVIEW_ERROR';\r\n\r\nexport const GET_PRODUCT_PREVIEW = 'GET_PRODUCT_PREVIEW';\r\nexport const GET_PRODUCT_PREVIEW_SUCCESS = 'GET_PRODUCT_PREVIEW_SUCCESS';\r\nexport const GET_PRODUCT_PREVIEW_ERROR = 'GET_PRODUCT_PREVIEW_ERROR';\r\n\r\nexport const SAVE_SELECTED_MAPPING = 'SAVE_SELECTED_MAPPING';\r\nexport const SAVE_STATUS_DOWNLOAD_FOLDER = 'SAVE_STATUS_DOWNLOAD_FOLDER';\r\n\r\nexport const UPDATE_FOLDER_DETAIL_DATA = 'UPDATE_FOLDER_DETAIL_DATA';\r\n\r\nexport const UPDATE_SHOULD_KEEP_BREADCRUMB = 'UPDATE_SHOULD_KEEP_BREADCRUMB';\r\n\r\nexport const ROOT_FOLDER = 'home';\r\n","/* eslint-disable default-case */\r\nimport produce from 'immer';\r\nimport * as types from './constants';\r\n\r\n// initial state\r\nexport const initialState = {\r\n loading: false,\r\n error: false,\r\n folderOption: null,\r\n folders: [],\r\n total: 0,\r\n pageSize: 20,\r\n pageNumber: 1,\r\n search: '',\r\n ownedFolderPageSize: 20,\r\n ownedFolderPageNumber: 1,\r\n ownFolderSearch: '',\r\n sharedFolderPageSize: 20,\r\n sharedFolderPageNumber: 1,\r\n sharedFolderSearch: '',\r\n columns: [],\r\n gridName: '',\r\n deleteFolders: {\r\n statusDelete: 'idle',\r\n errorDelete: null,\r\n },\r\n\r\n copyFolder: {\r\n statusCopy: 'idle',\r\n errorCopy: null,\r\n visibleModal: false,\r\n },\r\n\r\n folderShortDetail: null,\r\n loadingDetail: false,\r\n reloadContentPane: false,\r\n memberPreview: null,\r\n memberLoading: false,\r\n assetLoading: false,\r\n assetPreview: null,\r\n downloadSetting: null,\r\n isEdit: false,\r\n startEdit: 'idle',\r\n editSuccess: 'idle',\r\n editError: null,\r\n configLoading: false,\r\n configError: null,\r\n publicContactList: null,\r\n\r\n folderDetails: {\r\n columnsGrid: [],\r\n pageSize: 20,\r\n pageNumber: 1,\r\n total: 0,\r\n loading: false,\r\n data: [],\r\n },\r\n queryLoading: false,\r\n queryPreview: false,\r\n reportingLoading: false,\r\n reportingPreview: false,\r\n\r\n productLoading: false,\r\n productPreview: false,\r\n\r\n selectedMapping: null,\r\n statusDownloadFolder: 'idle',\r\n\r\n folderDetailData: null,\r\n\r\n //\r\n folderByLevel: {\r\n loading: false,\r\n error: null,\r\n folders: [],\r\n myFolders: [],\r\n sharedFolders: [],\r\n folderBreadcrumb: [\r\n {\r\n id: types.ROOT_FOLDER,\r\n folderName: 'Home',\r\n },\r\n ],\r\n keepBreadcrumb: false,\r\n shouldKeepFolderBreadcrumb: false,\r\n }, // maybe cache in here\r\n};\r\n\r\nconst folderReducer = (state = initialState, action) =>\r\n produce(state, (draft) => {\r\n switch (action.type) {\r\n case types.GET_FOLDER_GRID_COLUMN:\r\n draft.loading = true;\r\n draft.columns = [];\r\n break;\r\n case types.GET_FOLDER_GRID_COLUMN_SUCCESS:\r\n draft.loading = false;\r\n draft.columns = action.columns;\r\n break;\r\n case types.GET_FOLDER_GRID_COLUMN_ERROR:\r\n draft.loading = false;\r\n draft.columns = [];\r\n draft.error = action.error;\r\n break;\r\n case types.GET_FOLDER_GRID:\r\n draft.loading = true;\r\n draft.error = false;\r\n draft.folderOption = action.folderOption;\r\n draft.pageSize = action.pageSize;\r\n draft.pageNumber = action.pageIndex;\r\n draft.search = action['Search.SearchText'];\r\n\r\n draft['deleteFolders'] = {\r\n statusDelete: 'idle',\r\n errorDelete: null,\r\n };\r\n draft['copyFolder'] = {\r\n name: '',\r\n statusCopy: 'idle',\r\n errorCopy: null,\r\n visibleModal: false,\r\n };\r\n break;\r\n case types.GET_FOLDER_GRID_SUCCESS:\r\n draft.loading = false;\r\n draft.folders = action.folders;\r\n draft.total = action.total;\r\n break;\r\n case types.GET_FOLDER_GRID_ERROR:\r\n draft.loading = false;\r\n draft.total = 0;\r\n draft.folders = [];\r\n draft.error = action.error;\r\n break;\r\n\r\n case types.DELETE_FOLDERS:\r\n draft.loading = true;\r\n // draft['deleteFolders'].statusDelete = 'loading';\r\n break;\r\n case types.DELETE_FOLDERS_SUCCESS:\r\n draft['deleteFolders'].statusDelete = 'success';\r\n draft.folderShortDetail = null;\r\n break;\r\n case types.DELETE_FOLDERS_FAIL:\r\n draft['deleteFolders'].statusDelete = 'fail';\r\n draft['deleteFolders'].errorDelete = action.error;\r\n draft.loading = false;\r\n break;\r\n\r\n case types.TURN_ON_MODAL_COPY:\r\n draft['copyFolder'].statusCopy = 'idle';\r\n draft['copyFolder'].visibleModal = true;\r\n break;\r\n case types.TURN_OFF_MODAL_COPY:\r\n draft['copyFolder'].statusCopy = 'idle';\r\n draft['copyFolder'].visibleModal = false;\r\n break;\r\n\r\n case types.COPY_FOLDER:\r\n draft['copyFolder'].statusCopy = 'loading';\r\n break;\r\n case types.COPY_FOLDER_SUCCESS:\r\n draft['copyFolder'].statusCopy = 'success';\r\n break;\r\n case types.COPY_FOLDER_FAIL:\r\n draft['copyFolder'].statusCopy = 'fail';\r\n draft['copyFolder'].errorCopy = action.error;\r\n break;\r\n\r\n case types.GET_FOLDER_SHORT_DETAIL:\r\n draft.loadingDetail = true;\r\n draft.error = false;\r\n break;\r\n case types.GET_FOLDER_SHORT_DETAIL_SUCCESS:\r\n draft.loadingDetail = false;\r\n draft.folderShortDetail = action.data;\r\n break;\r\n case types.GET_FOLDER_SHORT_DETAIL_ERROR:\r\n draft.loadingDetail = false;\r\n draft.error = action.error;\r\n break;\r\n case types.GET_MEMBER_PREVIEW:\r\n draft.memberLoading = true;\r\n draft.error = false;\r\n break;\r\n case types.GET_MEMBER_PREVIEW_SUCCESS:\r\n draft.memberLoading = false;\r\n draft.memberPreview = action.data;\r\n break;\r\n case types.GET_MEMBER_PREVIEW_ERROR:\r\n draft.memberLoading = false;\r\n draft.error = action.error;\r\n break;\r\n case types.GET_DIGITAL_ASSET_PREVIEW:\r\n draft.assetLoading = true;\r\n draft.error = false;\r\n break;\r\n case types.GET_DIGITAL_ASSET_PREVIEW_SUCCESS:\r\n draft.assetLoading = false;\r\n draft.assetPreview = action.data;\r\n break;\r\n case types.GET_DIGITAL_ASSET_PREVIEW_ERROR:\r\n draft.assetLoading = false;\r\n draft.error = action.error;\r\n break;\r\n // Download Setting\r\n case types.GET_DOWNLOAD_SETTING:\r\n draft.loadingDownloadSetting = true;\r\n draft.error = false;\r\n draft.downloadSetting = null;\r\n break;\r\n case types.GET_DOWNLOAD_SETTING_SUCCESS:\r\n draft.loadingDownloadSetting = false;\r\n draft.error = false;\r\n draft.downloadSetting = action.data;\r\n break;\r\n case types.GET_DOWNLOAD_SETTING_ERROR:\r\n draft.loadingDownloadSetting = false;\r\n draft.error = action.error;\r\n draft.downloadSetting = null;\r\n break;\r\n case types.TURN_EDIT_SHORT_CONTENT_ON:\r\n draft.isEdit = action.value;\r\n break;\r\n case types.EDIT_FOLDER_SHORT_CONTENT:\r\n draft.startEdit = 'starting';\r\n draft.editSuccess = 'idle';\r\n draft.editError = null;\r\n break;\r\n case types.EDIT_FOLDER_SHORT_CONTENT_SUCCESS:\r\n draft.startEdit = 'finish';\r\n draft.editSuccess = 'success';\r\n draft.reloadContentPane = true;\r\n break;\r\n case types.EDIT_FOLDER_SHORT_CONTENT_ERROR:\r\n draft.startEdit = 'finish';\r\n draft.editSuccess = 'error';\r\n draft.editError = action.error;\r\n break;\r\n case types.SET_RELOAD_FOLDER_CONTENT_PANE:\r\n draft.reloadContentPane = action.value;\r\n break;\r\n case types.EDIT_FOLDER_SHORT_CONTENT_FINISH:\r\n draft.startEdit = 'idle';\r\n draft.editSuccess = 'idle';\r\n draft.editError = null;\r\n break;\r\n case types.CONFIG_SCHEDULE_DOWNLOAD:\r\n draft.configLoading = true;\r\n break;\r\n case types.CONFIG_SCHEDULE_DOWNLOAD_SUCCESS:\r\n draft.configLoading = false;\r\n break;\r\n case types.CONFIG_SCHEDULE_DOWNLOAD_ERROR:\r\n draft.configLoading = false;\r\n draft.editError = action.error;\r\n break;\r\n case types.RESET_FOLDER_PAGING:\r\n draft.pageSize = 20;\r\n draft.pageNumber = 1;\r\n draft.search = '';\r\n break;\r\n case types.RESET_OWNED_FOLDER_PAGING:\r\n draft.ownedFolderPageSize = 20;\r\n draft.ownedFolderPageNumber = 1;\r\n draft.ownedFolderSearch = '';\r\n break;\r\n case types.RESET_SHARED_FOLDER_PAGING:\r\n draft.sharedFolderPageSize = 20;\r\n draft.sharedFolderPageNumber = 1;\r\n draft.sharedFolderSearch = '';\r\n break;\r\n case types.GET_OWNED_FOLDER_GRID:\r\n draft.loading = true;\r\n draft.error = false;\r\n draft.folderOption = action.folderOption;\r\n draft.ownedFolderPageSize = action.pageSize;\r\n draft.ownedFolderPageNumber = action.pageIndex;\r\n draft.ownedFolderSearch = action.search;\r\n\r\n draft['deleteFolders'] = {\r\n statusDelete: 'idle',\r\n errorDelete: null,\r\n };\r\n draft['copyFolder'] = {\r\n name: '',\r\n statusCopy: 'idle',\r\n errorCopy: null,\r\n visibleModal: false,\r\n };\r\n break;\r\n case types.GET_OWNED_FOLDER_GRID_SUCCESS:\r\n draft.loading = false;\r\n draft.folders = action.folders;\r\n draft.total = action.total;\r\n break;\r\n case types.GET_OWNED_FOLDER_GRID_ERROR:\r\n draft.loading = false;\r\n draft.total = 0;\r\n draft.folders = [];\r\n draft.error = action.error;\r\n break;\r\n case types.GET_SHARED_FOLDER_GRID:\r\n draft.loading = true;\r\n draft.error = false;\r\n draft.folderOption = action.folderOption;\r\n draft.sharedFolderPageSize = action.pageSize;\r\n draft.sharedFolderPageNumber = action.pageIndex;\r\n draft.sharedFolderSearch = action.search;\r\n\r\n // reset object\r\n draft['deleteFolders'] = {\r\n statusDelete: 'idle',\r\n errorDelete: null,\r\n };\r\n draft['copyFolder'] = {\r\n name: '',\r\n statusCopy: 'idle',\r\n errorCopy: null,\r\n visibleModal: false,\r\n };\r\n break;\r\n case types.GET_SHARED_FOLDER_GRID_SUCCESS:\r\n draft.loading = false;\r\n draft.folders = action.folders;\r\n draft.total = action.total;\r\n break;\r\n case types.GET_SHARED_FOLDER_GRID_ERROR:\r\n draft.loading = false;\r\n draft.total = 0;\r\n draft.folders = [];\r\n draft.error = action.error;\r\n break;\r\n case types.GET_PUBLIC_CONTACT_FOLDER:\r\n draft.loadingDetail = true;\r\n draft.error = null;\r\n break;\r\n case types.GET_PUBLIC_CONTACT_FOLDER_SUCCESS:\r\n draft.loadingDetail = false;\r\n draft.publicContactList = action.data;\r\n draft.error = null;\r\n break;\r\n case types.GET_PUBLIC_CONTACT_FOLDER_ERROR:\r\n draft.loadingDetail = false;\r\n draft.publicContactList = null;\r\n draft.error = action.error;\r\n break;\r\n\r\n case types.GET_COLUMNS_FOLDER_DETAILS_SUCCESS:\r\n draft['folderDetails'].columnsGrid = action.columns;\r\n break;\r\n\r\n case types.GET_FOLDER_DETAILS_GRID_THUMB:\r\n draft['folderDetails'].loading = true;\r\n break;\r\n\r\n case types.GET_FOLDER_DETAILS_GRID_THUMB_SUCCESS:\r\n draft['folderDetails'].loading = false;\r\n draft['folderDetails'].data = action.data.gridData;\r\n draft['folderDetails'].pageNumber = action.data.paging.currentPageIndex;\r\n draft['folderDetails'].pageSize = action.data.paging.currentPageSize;\r\n draft['folderDetails'].total = action.data.paging.totalRecord;\r\n break;\r\n\r\n case types.GET_QUERY_PREVIEW:\r\n draft.queryLoading = true;\r\n draft.error = false;\r\n break;\r\n case types.GET_QUERY_PREVIEW_SUCCESS:\r\n draft.queryLoading = false;\r\n draft.queryPreview = action.data;\r\n break;\r\n case types.GET_QUERY_PREVIEW_ERROR:\r\n draft.queryLoading = false;\r\n draft.error = action.error;\r\n break;\r\n case types.GET_REPORTING_PREVIEW:\r\n draft.reportingLoading = true;\r\n draft.error = false;\r\n break;\r\n case types.GET_REPORTING_PREVIEW_SUCCESS:\r\n draft.reportingLoading = false;\r\n draft.reportingPreview = action.data;\r\n break;\r\n case types.GET_REPORTING_PREVIEW_ERROR:\r\n draft.reportingLoading = false;\r\n draft.error = action.error;\r\n break;\r\n\r\n case types.GET_PRODUCT_PREVIEW:\r\n draft.productLoading = true;\r\n draft.error = false;\r\n break;\r\n case types.GET_PRODUCT_PREVIEW_SUCCESS:\r\n draft.productLoading = false;\r\n draft.productPreview = action.data;\r\n break;\r\n case types.GET_PRODUCT_PREVIEW_ERROR:\r\n draft.productLoading = false;\r\n draft.error = action.error;\r\n break;\r\n\r\n case types.SAVE_SELECTED_MAPPING:\r\n draft.selectedMapping = action.data;\r\n break;\r\n\r\n case types.SAVE_STATUS_DOWNLOAD_FOLDER:\r\n draft.statusDownloadFolder = action.data;\r\n break;\r\n\r\n case types.UPDATE_FOLDER_DETAIL_DATA:\r\n draft.folderDetailData = action.data;\r\n break;\r\n\r\n //\r\n case types.GET_FOLDER_GRID_BY_LEVEL:\r\n draft.folderByLevel.loading = true;\r\n draft.folderByLevel.error = null;\r\n // draft.folderByLevel.folderBreadcrumb = [\r\n // {\r\n // id: 'home',\r\n // folderName: 'Home',\r\n // },\r\n // ];\r\n break;\r\n\r\n case types.GET_FOLDER_GRID_BY_LEVEL_SUCCESS:\r\n const { folderOption, data, loading } = action;\r\n\r\n draft.folderByLevel.loading = loading ?? false;\r\n draft.folderByLevel.error = null;\r\n\r\n if (folderOption?.toLowerCase() === 'folders') {\r\n draft.folderByLevel.folders = data;\r\n } else if (folderOption?.toLowerCase() === 'myfolders') {\r\n draft.folderByLevel.myFolders = data;\r\n } else if (folderOption?.toLowerCase() === 'folderssharedtome') {\r\n draft.folderByLevel.sharedFolders = data;\r\n }\r\n break;\r\n\r\n case types.UPDATE_FOLDER_BREADCRUMB:\r\n const { breadcrumb } = action;\r\n draft.folderByLevel.folderBreadcrumb = breadcrumb;\r\n break;\r\n\r\n case types.KEEP_BREADCRUMB:\r\n draft.folderByLevel.keepBreadcrumb = action.payload;\r\n break;\r\n\r\n case types.UPDATE_SHOULD_KEEP_BREADCRUMB:\r\n draft.folderByLevel.shouldKeepFolderBreadcrumb = action.payload;\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n });\r\n\r\nexport default folderReducer;\r\n","import { createSelector } from 'reselect';\r\nimport { initialState } from './reducer';\r\n\r\nconst selectFolderList = (state) => state.folderList || initialState;\r\nconst makeSelectLoading = () =>\r\n createSelector(selectFolderList, (folderState) => folderState.loading);\r\nconst makeSelectFolderList = () =>\r\n createSelector(selectFolderList, (folderState) => folderState.folders);\r\nconst makeSelectTotal = () =>\r\n createSelector(selectFolderList, (folderState) => folderState.total);\r\nconst makeSelectPageSize = () =>\r\n createSelector(selectFolderList, (folderState) => folderState.pageSize);\r\nconst makeSelectPageNumber = () =>\r\n createSelector(selectFolderList, (folderState) => folderState.pageNumber);\r\nconst makeSelectSearch = () =>\r\n createSelector(selectFolderList, (folderState) => folderState.search);\r\nconst makeSelectOwnedFolderPageSize = () =>\r\n createSelector(\r\n selectFolderList,\r\n (folderState) => folderState.ownedFolderPageSize\r\n );\r\nconst makeSelectOwnedFolderPageNumber = () =>\r\n createSelector(\r\n selectFolderList,\r\n (folderState) => folderState.ownedFolderPageNumber\r\n );\r\nconst makeSelectOwnedFolderSearch = () =>\r\n createSelector(\r\n selectFolderList,\r\n (folderState) => folderState.ownedFolderSearch\r\n );\r\nconst makeSelectSharedFolderPageSize = () =>\r\n createSelector(\r\n selectFolderList,\r\n (folderState) => folderState.sharedFolderPageSize\r\n );\r\nconst makeSelectSharedFolderPageNumber = () =>\r\n createSelector(\r\n selectFolderList,\r\n (folderState) => folderState.sharedFolderPageNumber\r\n );\r\nconst makeSelectSharedFolderSearch = () =>\r\n createSelector(\r\n selectFolderList,\r\n (folderState) => folderState.sharedFolderSearch\r\n );\r\nconst selectColumns = () =>\r\n createSelector(selectFolderList, (folderState) => folderState.columns);\r\nconst selectError = () =>\r\n createSelector(selectFolderList, (folderState) => folderState.error);\r\n\r\nconst selectDeleteFolders = () =>\r\n createSelector(selectFolderList, (folderState) => folderState.deleteFolders);\r\n\r\nconst selectCopyFolder = () =>\r\n createSelector(selectFolderList, (folderState) => folderState.copyFolder);\r\n\r\nconst selectPublicContact = () =>\r\n createSelector(\r\n selectFolderList,\r\n (folderState) => folderState.publicContactList\r\n );\r\n\r\nconst selectFolderShortDetail = () =>\r\n createSelector(\r\n selectFolderList,\r\n (folderState) => folderState.folderShortDetail\r\n );\r\n\r\nconst selectReloadContentPane = () =>\r\n createSelector(\r\n selectFolderList,\r\n (folderState) => folderState.reloadContentPane\r\n );\r\nconst selectLoadingDetail = () =>\r\n createSelector(selectFolderList, (folderState) => folderState.loadingDetail);\r\n\r\nconst selectMemberLoading = () =>\r\n createSelector(selectFolderList, (folderState) => folderState.memberLoading);\r\nconst selectMemberPreview = () =>\r\n createSelector(selectFolderList, (folderState) => folderState.memberPreview);\r\nconst selectAssetLoading = () =>\r\n createSelector(selectFolderList, (folderState) => folderState.assetLoading);\r\nconst selectAssetPreview = () =>\r\n createSelector(selectFolderList, (folderState) => folderState.assetPreview);\r\n\r\nconst selectDownloadSetting = () =>\r\n createSelector(\r\n selectFolderList,\r\n (folderState) => folderState.downloadSetting\r\n );\r\n\r\nconst selectIsEdit = () =>\r\n createSelector(selectFolderList, (folderState) => folderState.isEdit);\r\nconst selectStartEdit = () =>\r\n createSelector(selectFolderList, (folderState) => folderState.startEdit);\r\nconst selectEditSuccess = () =>\r\n createSelector(selectFolderList, (folderState) => folderState.editSuccess);\r\nconst selectEditError = () =>\r\n createSelector(selectFolderList, (folderState) => folderState.editError);\r\nconst selectConfigLoading = () =>\r\n createSelector(selectFolderList, (folderState) => folderState.configLoading);\r\nconst selectConfigError = () =>\r\n createSelector(selectFolderList, (folderState) => folderState.configError);\r\n\r\nconst selectFolderDetails = () =>\r\n createSelector(selectFolderList, (folderState) => folderState.folderDetails);\r\nconst selectQueryLoading = () =>\r\n createSelector(selectFolderList, (folderState) => folderState.queryLoading);\r\nconst selectQueryPreview = () =>\r\n createSelector(selectFolderList, (folderState) => folderState.queryPreview);\r\nconst selectReportingLoading = () =>\r\n createSelector(\r\n selectFolderList,\r\n (folderState) => folderState.reportingLoading\r\n );\r\nconst selectReportingPreview = () =>\r\n createSelector(\r\n selectFolderList,\r\n (folderState) => folderState.reportingPreview\r\n );\r\n\r\nconst selectProductPreview = () =>\r\n createSelector(selectFolderList, (folderState) => folderState.productPreview);\r\nconst selectProductLoading = () =>\r\n createSelector(selectFolderList, (folderState) => folderState.productLoading);\r\n\r\nconst selectSelectedMapping = () =>\r\n createSelector(\r\n selectFolderList,\r\n (folderState) => folderState.selectedMapping\r\n );\r\n\r\nconst selectStatusDownloadFolder = () =>\r\n createSelector(\r\n selectFolderList,\r\n (folderState) => folderState.statusDownloadFolder\r\n );\r\n\r\nconst selectFolderDetailData = () =>\r\n createSelector(\r\n selectFolderList,\r\n (folderState) => folderState.folderDetailData\r\n );\r\n\r\n//\r\nconst selectFolderListByLevel = () =>\r\n createSelector(selectFolderList, (folderState) => folderState.folderByLevel);\r\n\r\nexport {\r\n selectFolderList,\r\n makeSelectLoading,\r\n makeSelectFolderList,\r\n makeSelectTotal,\r\n makeSelectPageSize,\r\n makeSelectPageNumber,\r\n makeSelectSearch,\r\n makeSelectOwnedFolderPageSize,\r\n makeSelectOwnedFolderPageNumber,\r\n makeSelectOwnedFolderSearch,\r\n makeSelectSharedFolderPageSize,\r\n makeSelectSharedFolderPageNumber,\r\n makeSelectSharedFolderSearch,\r\n selectColumns,\r\n selectError,\r\n selectDeleteFolders,\r\n selectFolderShortDetail,\r\n selectReloadContentPane,\r\n selectLoadingDetail,\r\n selectCopyFolder,\r\n selectMemberLoading,\r\n selectMemberPreview,\r\n selectAssetLoading,\r\n selectAssetPreview,\r\n selectIsEdit,\r\n selectStartEdit,\r\n selectEditSuccess,\r\n selectEditError,\r\n selectDownloadSetting,\r\n selectConfigLoading,\r\n selectConfigError,\r\n selectPublicContact,\r\n selectFolderDetails,\r\n selectQueryLoading,\r\n selectQueryPreview,\r\n selectReportingLoading,\r\n selectReportingPreview,\r\n selectProductPreview,\r\n selectProductLoading,\r\n selectSelectedMapping,\r\n selectStatusDownloadFolder,\r\n selectFolderDetailData,\r\n selectFolderListByLevel,\r\n};\r\n","import { useDispatch, useSelector } from 'react-redux';\r\n\r\nimport * as folderSelectors from 'pages/folders/controllers/selectors';\r\nimport * as folderActions from 'pages/folders/controllers/actions';\r\n\r\nexport const useDownloadFolderSetting = (props) => {\r\n const dispatch = useDispatch();\r\n\r\n const downloadSetting = useSelector(folderSelectors.selectDownloadSetting());\r\n\r\n const getDownloadSetting = (id) => {\r\n dispatch(folderActions.getDownloadSetting(id));\r\n };\r\n\r\n return {\r\n downloadSetting,\r\n getDownloadSetting,\r\n };\r\n};\r\n","import React from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport { useDispatch } from 'react-redux';\r\n\r\nimport { Tooltip } from 'antd';\r\n\r\nimport _ from 'lodash';\r\n\r\nimport { Space, notification } from 'antd';\r\nimport SharedIcon from 'common/components/thumb/share/SharedIcon';\r\nimport DigitalRightIcon from 'common/components/digital-right-icon/DigitalRightIcon';\r\n\r\nimport { Images } from 'config/assets';\r\n\r\nimport { IconFolderAsset } from 'common/components/folder';\r\nimport customCellComponents from 'pages/folders/components/custom-cell-components';\r\n\r\nimport { getFolderShortDetail } from 'services/folder';\r\nimport * as actionsGlobal from '@redux/global/actions';\r\n\r\nimport { formatSizeUnits } from 'utils/formatSizeUnits';\r\nimport { formatSizeUnitByParam } from 'utils/formatSizeUnits';\r\nimport { entityTypeIcon } from 'utils/entityTypeIcon';\r\nimport { formatMDY } from 'utils/formatDate';\r\nimport { formatMDYWithParam } from 'utils/formatDate';\r\n\r\nimport { getNodeTreeData } from 'common/components/folder/utils';\r\n\r\nimport emptyFolderIcon from 'assets/folder/empty-folder.png';\r\nimport folderIcon from 'assets/folder/folder.png';\r\nimport { CustomNotification } from 'common/components';\r\nimport { sleep } from 'utils/delay';\r\nimport { forwardTo } from 'utils/common/route';\r\nimport { useGridView } from 'hooks/useGridView';\r\nimport { useDownloadFolderSetting } from 'hooks/useDownloadFolderSetting';\r\nimport { useDispatchReloadPage } from 'hooks/useReloadPage';\r\n\r\nimport folderMessages from 'i18n/messages/folder';\r\n\r\n// Hooks\r\n\r\nconst useFetchFolder = (id) => {\r\n const [state, setState] = React.useReducer((_, action) => action, {\r\n isLoading: true,\r\n isReloading: false,\r\n });\r\n\r\n const { getDownloadSetting } = useDownloadFolderSetting();\r\n\r\n const fetchFolder = () => {\r\n if (!id) return;\r\n setState({ ...state, isReloading: true });\r\n getFolderShortDetail({ id, IsLoadContent: true })\r\n .then((res) => {\r\n if (res.isSuccess) {\r\n setState({\r\n isLoading: false,\r\n isReloading: false,\r\n isSuccess: true,\r\n data: res.data,\r\n });\r\n } else {\r\n notification.error({ message: res?.message || 'Folder not found' });\r\n forwardTo('/folders');\r\n }\r\n })\r\n .catch((error) => {\r\n notification.error({\r\n message: error?.message || 'Folder not found',\r\n });\r\n forwardTo('/folders');\r\n });\r\n };\r\n\r\n const reFetchingFolderShortDetail = () => {\r\n fetchFolder();\r\n };\r\n\r\n const handleLoading = () => {\r\n setState({ ...state, isReloading: true });\r\n };\r\n\r\n const updateFolderData = (data) => {\r\n setState({\r\n isLoading: false,\r\n isReloading: false,\r\n isSuccess: true,\r\n data: data,\r\n });\r\n };\r\n\r\n React.useEffect(() => {\r\n fetchFolder();\r\n }, [+id]);\r\n\r\n return {\r\n ...state,\r\n reFetchingFolderShortDetail,\r\n updateFolderData,\r\n handleLoading,\r\n setState,\r\n state,\r\n };\r\n};\r\n\r\n// const option = RIBBON_OPTIONS.BLANK;\r\nconst NAME_GRID = 'folder-detail-grid';\r\n\r\nconst useInitialComponent = () => {\r\n const dispatch = useDispatch();\r\n\r\n React.useEffect(() => {\r\n // dispatch(actionsGlobal.changeRibbonActions(option));\r\n // dispatch(folderActions.getColumnsFolderDetails(NAME_GRID));\r\n dispatch(actionsGlobal.updateIsOnlyDetailGird(true));\r\n dispatch(actionsGlobal.hideSearchBar());\r\n return () => {\r\n dispatch(actionsGlobal.updateIsOnlyDetailGird(false));\r\n };\r\n }, [dispatch]);\r\n};\r\n\r\n//\r\nconst folderInfoFields = [\r\n { label: 'Owner', value: 'ownerName' },\r\n { label: '# Items', value: 'items' },\r\n { label: 'Date Created', value: 'dateCreated', type: 'Date' },\r\n { label: 'Last Updated', value: 'lastUpdated', type: 'Date' },\r\n { type: 'icon' },\r\n];\r\n\r\nconst renderValueFolderInfo = (field, folder) => {\r\n if (!folder) return null;\r\n\r\n if (field.type === 'Date') {\r\n return formatMDY(folder[`${field.value}`]);\r\n }\r\n\r\n if (field.value === 'estSize') {\r\n return formatSizeUnits(folder[field.value]);\r\n }\r\n\r\n if (field.type === 'icon') return renderFolderIcon(folder);\r\n\r\n return folder[`${field.value}`];\r\n};\r\n\r\nconst renderFolderIcon = (folder) => {\r\n return (\r\n \r\n {!folder?.isOwner ? : null}\r\n {folder?.drm ? : null}\r\n \r\n );\r\n};\r\n\r\nconst getImageFolder = (folder) => {\r\n if (!folder) return;\r\n const { items, isOwner } = folder;\r\n\r\n // if (!isOwner) {\r\n // return Images.sharedFolder;\r\n // }\r\n\r\n if (items > 0) {\r\n return Images.folder;\r\n }\r\n\r\n return Images.emptyFolder;\r\n};\r\n\r\nconst checkOwnerFolder = (folder) => {\r\n return folder?.isOwner;\r\n};\r\n\r\nconst renderPathname = (type) => {\r\n switch (type?.toLowerCase()) {\r\n case 'asset':\r\n case 'document':\r\n return 'asset';\r\n\r\n case 'member':\r\n return 'company';\r\n\r\n case 'reporting':\r\n return 'reporting';\r\n\r\n case 'product':\r\n return 'product';\r\n\r\n case 'folder':\r\n return 'folder';\r\n case 'query':\r\n return 'execute-query';\r\n\r\n default:\r\n return '';\r\n }\r\n};\r\n\r\nconst updateNode = (treeData, node, folderId) => {\r\n return treeData?.map((nodeItem) => {\r\n if (nodeItem.data.id === folderId) {\r\n const imageFolder =\r\n node.data.subFolderCount > 0 ? folderIcon : emptyFolderIcon;\r\n return {\r\n ...node,\r\n data: { ...node.data },\r\n key: nodeItem.key,\r\n isLeaf: node.data.subFolderCount === 0 ? true : false,\r\n children: nodeItem.children,\r\n icon: ,\r\n };\r\n } else if (nodeItem?.children && nodeItem?.children.length > 0) {\r\n return {\r\n ...nodeItem,\r\n children: updateNode(nodeItem.children, node, folderId),\r\n };\r\n }\r\n return nodeItem;\r\n });\r\n};\r\n\r\nconst addNodeToTree = (tree, node, idParent, subFolderCount) => {\r\n return tree.map((parentNode) => {\r\n if (parentNode.data.id === idParent) {\r\n const childOfNodeParent = parentNode?.children ?? [];\r\n return {\r\n ...parentNode,\r\n data: { ...parentNode.data, subFolderCount },\r\n children: childOfNodeParent.concat(node),\r\n isLeaf: false,\r\n icon: ,\r\n };\r\n } else if (parentNode?.children && parentNode?.children.length > 0) {\r\n return {\r\n ...parentNode,\r\n children: addNodeToTree(\r\n parentNode.children,\r\n node,\r\n idParent,\r\n subFolderCount\r\n ),\r\n };\r\n }\r\n return parentNode;\r\n });\r\n};\r\n\r\nconst deleteSubNodesToTree = (tree, ids) => {\r\n return tree\r\n .map((item) => {\r\n if (ids.includes(item.data.id)) {\r\n return null;\r\n } else if (item?.children && item?.children.length > 0) {\r\n return {\r\n ...item,\r\n children: deleteSubNodesToTree(item?.children, ids),\r\n };\r\n }\r\n return item;\r\n })\r\n .filter((item) => item)\r\n .map((item) => {\r\n if (item?.children && item?.children.length === 0) {\r\n delete item.children;\r\n return {\r\n ...item,\r\n icon: ,\r\n isLeaf: true,\r\n };\r\n }\r\n return item;\r\n });\r\n};\r\n\r\nexport const getParentFolder = (id, tree) => {\r\n let parentNode;\r\n for (let i = 0; i < tree?.length; i++) {\r\n const node = tree[i];\r\n if (node?.children) {\r\n if (node?.children?.some((item) => item.id === id)) {\r\n parentNode = node;\r\n } else if (getParentFolder(id, node.children)) {\r\n parentNode = getParentFolder(id, node.children);\r\n }\r\n }\r\n }\r\n return parentNode;\r\n};\r\n\r\nconst defaultFolderParam = {\r\n renderFolder: (node) => {\r\n const isEmptyContents = node && node.subFolderCount === 0;\r\n\r\n if (isEmptyContents) {\r\n return {\r\n icon: ,\r\n isLeaf: true,\r\n };\r\n }\r\n\r\n return {};\r\n },\r\n};\r\n\r\nconst useReloadFolderActionWhenSuccess = ({\r\n treeData,\r\n currentFolder,\r\n handleUpdateTreeData,\r\n handleSelectNodeById,\r\n handleSetStatusTree,\r\n viewFolderContents,\r\n handleGetDataList,\r\n}) => {\r\n const reloadPage = useDispatchReloadPage();\r\n const { clearGridSelection } = useGridView();\r\n const intl = useIntl();\r\n\r\n const reloadFolderWhenCreateSuccess = async (idFolder) => {\r\n try {\r\n handleSetStatusTree('loading');\r\n const data = await getFolderShortDetail({\r\n id: idFolder,\r\n IsLoadContent: false,\r\n });\r\n const dataParent = await getFolderShortDetail({\r\n id: currentFolder.id,\r\n IsLoadContent: false,\r\n });\r\n\r\n const subFolderCountParent = dataParent.data.subFolderCount;\r\n\r\n const node = getNodeTreeData({\r\n node: { ...data.data, type: 'folder' },\r\n folderParam: defaultFolderParam,\r\n });\r\n\r\n const newTree = addNodeToTree(\r\n treeData,\r\n node,\r\n currentFolder.id,\r\n subFolderCountParent\r\n );\r\n\r\n handleUpdateTreeData(newTree);\r\n\r\n await sleep(100);\r\n handleSelectNodeById(idFolder.toString());\r\n handleSetStatusTree('success');\r\n\r\n CustomNotification.success(\r\n intl.formatMessage(folderMessages.createFolderSuccessMessage)\r\n );\r\n } catch (error) {\r\n CustomNotification.success(\r\n intl.formatMessage(folderMessages.createFolderFailedMessage)\r\n );\r\n handleSetStatusTree('success');\r\n }\r\n };\r\n\r\n const reloadFolderWhenEditSuccess = async (idFolder, updateFolderData) => {\r\n handleSetStatusTree('loading');\r\n await sleep(500);\r\n const folderDetail = await getFolderShortDetail({\r\n id: idFolder,\r\n IsLoadContent: false,\r\n });\r\n const newNode = getNodeTreeData({\r\n node: { ...folderDetail.data, type: 'folder' },\r\n folderParam: false,\r\n fileParam: false,\r\n });\r\n\r\n const newTree = updateNode(treeData, newNode, idFolder);\r\n handleSelectNodeById(currentFolder?.id);\r\n handleUpdateTreeData(newTree);\r\n\r\n updateFolderData(folderDetail.data);\r\n\r\n handleSetStatusTree('success');\r\n\r\n viewFolderContents === 'grid' ? reloadPage() : handleGetDataList(20, 1, '');\r\n };\r\n\r\n const reloadFolderWhenDeleteSuccess = async (\r\n idFolders,\r\n reFetchingFolderShortDetail,\r\n idSelected,\r\n level\r\n ) => {\r\n let successMessage = folderMessages.deleteItemsSuccessMessage;\r\n\r\n handleSetStatusTree('loading');\r\n await sleep(500);\r\n if (\r\n idFolders.length === 1 &&\r\n idFolders?.[0].toString() === idSelected.toString() &&\r\n level === 1\r\n ) {\r\n CustomNotification.success(intl.formatMessage(successMessage));\r\n handleSetStatusTree('success');\r\n forwardTo('/folders/owned');\r\n return;\r\n }\r\n\r\n if (idFolders.length === 1 && idFolders?.[0] === currentFolder.id) {\r\n const hierarchyList = currentFolder.hierarchy?.split('/');\r\n\r\n const newTree = deleteSubNodesToTree(treeData, idFolders);\r\n handleUpdateTreeData(newTree);\r\n\r\n const prevFolderId = hierarchyList[hierarchyList.length - 2];\r\n handleSelectNodeById(prevFolderId);\r\n\r\n CustomNotification.success(intl.formatMessage(successMessage));\r\n\r\n handleSetStatusTree('success');\r\n clearGridSelection();\r\n return;\r\n }\r\n\r\n await sleep(500);\r\n const newTree = deleteSubNodesToTree(treeData, idFolders);\r\n handleUpdateTreeData(newTree);\r\n reFetchingFolderShortDetail();\r\n CustomNotification.success(intl.formatMessage(successMessage));\r\n\r\n if (viewFolderContents === 'thumbnails') handleGetDataList(20, 1, '');\r\n handleSetStatusTree('success');\r\n clearGridSelection();\r\n reloadPage();\r\n };\r\n\r\n return {\r\n reloadFolderWhenCreateSuccess,\r\n reloadFolderWhenEditSuccess,\r\n reloadFolderWhenDeleteSuccess,\r\n };\r\n};\r\n\r\nconst defaultColProperties = {\r\n resizable: true,\r\n};\r\n\r\nconst formatColumns = (columns) => {\r\n if (!columns?.length) return null;\r\n\r\n const checkboxColumn = [\r\n {\r\n field: '',\r\n checkboxSelection: true,\r\n filter: false,\r\n suppressMenu: true,\r\n sortable: false,\r\n },\r\n ];\r\n\r\n const excludeColumns = ['id', 'thumbnail'];\r\n\r\n const columnsFilter = columns.filter(\r\n (column) => excludeColumns.indexOf(column?.fieldNameCamelCase) === -1\r\n );\r\n\r\n const fieldNameCamelCaseMapping = columnsFilter?.map(\r\n (item) => item.fieldNameCamelCase\r\n );\r\n\r\n const renderEntityTypeIcon = (item) => {\r\n return (\r\n \r\n {entityTypeIcon(item?.data?.type)}\r\n \r\n );\r\n };\r\n\r\n const formattedColumns = fieldNameCamelCaseMapping.map((showCol) => {\r\n const colData = columns.find(\r\n (dataCol) => dataCol?.fieldNameCamelCase === showCol\r\n );\r\n\r\n switch (showCol) {\r\n case 'type':\r\n return {\r\n ...colData,\r\n ...defaultColProperties,\r\n cellRenderer: renderEntityTypeIcon,\r\n filter: false,\r\n suppressMenu: true,\r\n width: 80,\r\n };\r\n case 'description':\r\n return {\r\n ...colData,\r\n ...defaultColProperties,\r\n minWidth: 150,\r\n resizable: true,\r\n flex: 1,\r\n cellRenderer: customCellComponents.renderLink,\r\n };\r\n\r\n case 'size':\r\n return {\r\n ...colData,\r\n ...defaultColProperties,\r\n width: 140,\r\n resizable: true,\r\n fieldName: 'Size',\r\n allowFilter: false,\r\n cellRenderer: formatSizeUnitByParam,\r\n };\r\n\r\n case 'lastUpdated':\r\n return {\r\n ...colData,\r\n ...defaultColProperties,\r\n flex: 1,\r\n minWidth: 150,\r\n valueFormatter: formatMDYWithParam,\r\n resizable: true,\r\n };\r\n\r\n case 'dateCreated':\r\n return {\r\n ...colData,\r\n ...defaultColProperties,\r\n flex: 1,\r\n minWidth: 150,\r\n valueFormatter: formatMDYWithParam,\r\n resizable: true,\r\n };\r\n\r\n case 'entityVisibilityType':\r\n return {\r\n ...colData,\r\n displayName: 'Visibility',\r\n };\r\n\r\n default:\r\n return {\r\n ...colData,\r\n ...defaultColProperties,\r\n };\r\n }\r\n });\r\n\r\n return checkboxColumn.concat(formattedColumns);\r\n};\r\n\r\nexport {\r\n folderInfoFields,\r\n renderValueFolderInfo,\r\n getImageFolder,\r\n checkOwnerFolder,\r\n renderPathname,\r\n useFetchFolder,\r\n useInitialComponent,\r\n updateNode,\r\n addNodeToTree,\r\n deleteSubNodesToTree,\r\n defaultFolderParam,\r\n useReloadFolderActionWhenSuccess,\r\n formatColumns,\r\n};\r\n","import { useState, useEffect } from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\n\r\nimport * as folderSelectors from 'pages/folders/controllers/selectors';\r\nimport * as folderActions from 'pages/folders/controllers/actions';\r\nimport selectorsGridView from 'common/components/grid-view/controllers/selectors';\r\n\r\nimport { useFetch } from 'hooks/useAsync';\r\n\r\nimport * as folderServices from 'services/folder';\r\n\r\nconst shortDetailServiceCollection = {\r\n folder: folderServices.getFolderShortDetail,\r\n asset: folderServices.getDigitalAssetPreview,\r\n member: folderServices.getMemberPreview,\r\n product: folderServices.getProductPreview,\r\n reporting: folderServices.getReportingPreview,\r\n query: folderServices.getQueryPreview,\r\n};\r\n\r\nconst useFolderContentPane = () => {\r\n const dispatch = useDispatch();\r\n\r\n const { run, data, status, resetData } = useFetch();\r\n\r\n const shortDetail = data?.data;\r\n\r\n const [contentPaneType, setContentPaneType] = useState(null);\r\n\r\n const visibleContentPane = useSelector(selectorsGridView.makeSelectVisible());\r\n\r\n const selectedItems = useSelector(\r\n selectorsGridView.makeSelectDetailCurrentITemsSelection()\r\n );\r\n\r\n const { folderBreadcrumb } = useSelector(\r\n folderSelectors.selectFolderListByLevel()\r\n );\r\n const currentFolder = folderBreadcrumb[folderBreadcrumb?.length - 1];\r\n\r\n const selectedItem = selectedItems?.[0];\r\n\r\n const currentShortItem = selectedItem\r\n ? selectedItem\r\n : currentFolder?.id === 'home'\r\n ? {}\r\n : currentFolder;\r\n\r\n const fetchShortDetail = ({ id, type }) => {\r\n if (!id) return;\r\n\r\n const service = shortDetailServiceCollection[type?.toLowerCase()];\r\n\r\n if (!service) return;\r\n\r\n const params = {\r\n id,\r\n ...(type?.toLowerCase() === 'folder' && { IsLoadContent: true }),\r\n };\r\n\r\n run(service(params), () => {\r\n setContentPaneType(type?.toLowerCase());\r\n });\r\n };\r\n\r\n const clearContentPane = () => {\r\n resetData();\r\n };\r\n\r\n const fetchData = async () => {\r\n if (!currentShortItem) return;\r\n\r\n const { id, type } = currentShortItem;\r\n\r\n await fetchShortDetail(currentShortItem);\r\n\r\n if (type?.toLowerCase() === 'folder')\r\n dispatch(folderActions.getDownloadSetting(id));\r\n };\r\n\r\n useEffect(() => {\r\n if (visibleContentPane && currentShortItem?.id) {\r\n fetchData();\r\n return;\r\n }\r\n\r\n //* clear data when close panel, it will prevent show old data when selecting other item\r\n clearContentPane();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n //* separate into 2 useEffect to prevent duplicated api call\r\n useEffect(() => {\r\n //* re-fetch short content data when selecting another item while content panel is opening\r\n if (status !== 'resolved') return;\r\n\r\n if (visibleContentPane && currentShortItem?.id) {\r\n fetchData();\r\n }\r\n\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [currentShortItem?.id]);\r\n\r\n return {\r\n shortDetail,\r\n isLoading: status === 'pending',\r\n contentPaneType,\r\n };\r\n};\r\n\r\nexport { useFolderContentPane };\r\n","import { useEffect, useMemo, useState } from 'react';\r\nimport { useSelector } from 'react-redux';\r\n\r\nimport { Typography } from 'antd';\r\n\r\nimport customCellComponents, {\r\n QueryLink,\r\n} from 'pages/folders/components/custom-cell-components';\r\n\r\nimport { CustomNotification } from 'common/components';\r\n\r\nimport {\r\n FolderGridItemContainer,\r\n useFolderGridDetailView,\r\n} from '../shared/grid-detail';\r\n\r\nimport { useCallbackRef } from 'hooks';\r\nimport { useGetColumnsGrid } from 'hooks/useGetColumns';\r\nimport useCheckFavoriteRoute from 'hooks/useCheckFavoriteRoute';\r\nimport useDocumentAttachEvent from 'hooks/documentAttachEventHook';\r\n\r\nimport * as folderSelectors from '../controllers/selectors';\r\n\r\nimport { formatMDYWithParam } from 'utils/formatDate';\r\nimport { formatSizeUnitByParam } from 'utils/formatSizeUnits';\r\nimport { sortFolderToTop } from '../shared/utils';\r\n\r\nimport { getFolderDetailGrid, getFavoriteFolderList } from 'services/folder';\r\n\r\nimport { entityTypeIcon } from 'utils/entityTypeIcon';\r\nimport { sleep } from 'utils/delay';\r\n\r\nimport { EVENT } from 'static/Constants';\r\n\r\nexport const createServerSideDatasource = (blockSizeData) => {\r\n return {\r\n getRows: (params) => {\r\n const response = blockSizeData.getData(params.request);\r\n\r\n if (response.success) {\r\n params.success({\r\n rowData: response.rows,\r\n rowCount: response.lastRow,\r\n });\r\n } else {\r\n params.fail();\r\n }\r\n },\r\n };\r\n};\r\n\r\nexport const createDataByBlockSize = (allData) => {\r\n return {\r\n getData: (request) => {\r\n const requestedRows = allData.slice(request.startRow, request.endRow);\r\n return {\r\n success: true,\r\n rows: requestedRows,\r\n lastRow: allData.length,\r\n };\r\n },\r\n };\r\n};\r\n\r\nconst pathUrl = {\r\n folder: 'folder',\r\n product: 'product',\r\n asset: 'asset',\r\n member: 'company',\r\n reporting: 'reporting',\r\n query: 'query',\r\n};\r\n\r\nconst mappingColumns = (columns = []) => {\r\n let result = [\r\n {\r\n field: '',\r\n checkboxSelection: true,\r\n filter: false,\r\n suppressMenu: true,\r\n resizable: false,\r\n allowFilter: false,\r\n allowSort: false,\r\n },\r\n {\r\n field: '',\r\n width: 85,\r\n cellRenderer: customCellComponents.renderFavSharePackIcons,\r\n filter: false,\r\n suppressMenu: true,\r\n resizable: false,\r\n allowFilter: false,\r\n allowSort: false,\r\n },\r\n {\r\n field: 'type',\r\n cellRenderer: (params) => {\r\n const { type } = params?.data ?? {};\r\n const isFolderType = type.toLowerCase() === 'folder';\r\n\r\n if (isFolderType) {\r\n return (\r\n \r\n {customCellComponents.renderFolderOptionIcon(params)}\r\n \r\n );\r\n }\r\n\r\n return (\r\n
{entityTypeIcon(type)}
\r\n );\r\n },\r\n filter: false,\r\n suppressMenu: true,\r\n width: 70,\r\n resizable: false,\r\n allowFilter: false,\r\n allowSort: false,\r\n },\r\n {\r\n field: 'description',\r\n headerName: 'Description',\r\n resizable: true,\r\n cellRenderer: (params) => {\r\n const name = params?.data?.folderName ?? params?.data?.description;\r\n if (params?.data?.type?.toLowerCase() === 'query') {\r\n return ;\r\n }\r\n\r\n const to = `${pathUrl[params?.data?.type?.toLowerCase()]}/${\r\n params?.data?.id\r\n }`;\r\n return (\r\n \r\n {params?.data?.folderName ?? params?.data?.description}\r\n \r\n );\r\n },\r\n minWidth: 300,\r\n flex: 1,\r\n allowFilter: true,\r\n allowSort: true,\r\n },\r\n ];\r\n\r\n const ShowColumns = [\r\n // 'description',\r\n 'folderSize',\r\n 'productCount',\r\n 'assetCount',\r\n 'creatorFullName',\r\n 'memberName',\r\n 'dateCreated',\r\n 'lastUpdated',\r\n 'drm',\r\n ];\r\n\r\n if (columns?.length > 0) {\r\n columns.forEach((col) => {\r\n if (ShowColumns.indexOf(col?.fieldNameCamelCase) > -1) {\r\n if (\r\n col.fieldNameCamelCase === 'creatorFullName' ||\r\n col.fieldNameCamelCase === 'memberName' ||\r\n col.fieldNameCamelCase === 'description'\r\n ) {\r\n col = { ...col, width: 150 };\r\n } else if (col.fieldNameCamelCase === 'folderSize') {\r\n col = {\r\n ...col,\r\n cellRenderer: formatSizeUnitByParam,\r\n width: 150,\r\n };\r\n } else if (\r\n col.fieldNameCamelCase === 'productCount' ||\r\n col.fieldNameCamelCase === 'assetCount'\r\n ) {\r\n col = { ...col, width: 150 };\r\n } else if (col.fieldNameCamelCase === 'drm') {\r\n col = { ...col, headerName: 'DRM', width: 150 };\r\n } else if (\r\n col.fieldNameCamelCase === 'dateCreated' ||\r\n col.fieldNameCamelCase === 'lastUpdated'\r\n ) {\r\n col = {\r\n ...col,\r\n cellRenderer: formatMDYWithParam,\r\n width: 150,\r\n };\r\n }\r\n\r\n // if (col.fieldNameCamelCase === 'description')\r\n // col = { ...col, linkTo: '/folder/{id}', minWidth: 300, flex: 1 };\r\n result.push({ ...col, resizable: true });\r\n }\r\n });\r\n }\r\n\r\n return result;\r\n};\r\n\r\nconst defaultFolderParams = {\r\n pageSize: 9999,\r\n pageIndex: 1,\r\n folderId: null,\r\n sort: [\r\n [\r\n {\r\n fieldName: 'id',\r\n isAscending: false,\r\n },\r\n ],\r\n ],\r\n filters: [],\r\n search: {\r\n searchText: '',\r\n },\r\n};\r\n\r\nconst moveFolderToTop = (data) => {\r\n return data.slice().sort(sortFolderToTop);\r\n};\r\n\r\nexport const useAgGridFolder = ({\r\n folderOption,\r\n searchText,\r\n typeView,\r\n requestParams: propsRequestParams,\r\n}) => {\r\n const isDetailGridView = typeView === 'detailsview';\r\n\r\n const columns = useGetColumnsGrid(\r\n isDetailGridView ? 'folder-detail-grid' : ''\r\n );\r\n\r\n const gridApi = useFolderGridDetailView();\r\n const isFavoriteRoute = useCheckFavoriteRoute();\r\n\r\n const { folderBreadcrumb } = useSelector(\r\n folderSelectors.selectFolderListByLevel()\r\n );\r\n\r\n const isRoot = folderBreadcrumb?.length === 1;\r\n\r\n const columnDefs = useMemo(() => mappingColumns(columns), [columns]);\r\n\r\n const [shouldReloadAgGrid, setShouldReloadAgGrid] = useState(false);\r\n const [requestParamsFolder, setRequestParamsFolder] = useState({\r\n folderId: null,\r\n });\r\n\r\n const getFolderDetailService =\r\n isFavoriteRoute && isRoot ? getFavoriteFolderList : getFolderDetailGrid;\r\n\r\n const fetchRootFolders = async (agGridParams) => {\r\n const folderParams = {\r\n ...defaultFolderParams,\r\n ...propsRequestParams,\r\n sort: searchText\r\n ? []\r\n : [\r\n {\r\n fieldName: 'id',\r\n isAscending: false,\r\n },\r\n ],\r\n folderOption,\r\n search: {\r\n searchText,\r\n },\r\n };\r\n\r\n const responseData = await getFolderDetailService(folderParams);\r\n\r\n if (responseData?.isSuccess) {\r\n const folderData = responseData?.data?.gridData ?? [];\r\n\r\n const blockSizeData = createDataByBlockSize(folderData);\r\n const datasource = createServerSideDatasource(blockSizeData);\r\n\r\n agGridParams.api.setServerSideDatasource(datasource);\r\n } else {\r\n agGridParams.api.setServerSideDatasource([]);\r\n CustomNotification.error(responseData?.message ?? 'Something went wrong');\r\n }\r\n };\r\n\r\n const getSubFolderContent = async (agGridParams) => {\r\n //* get subfolder content\r\n const currentBreadcrumb = folderBreadcrumb[folderBreadcrumb.length - 1];\r\n const folderId = currentBreadcrumb?.id;\r\n\r\n const folderParams = {\r\n ...defaultFolderParams,\r\n ...propsRequestParams,\r\n sort: searchText\r\n ? []\r\n : [\r\n {\r\n fieldName: 'id',\r\n isAscending: false,\r\n },\r\n ],\r\n search: {\r\n searchText,\r\n },\r\n folderOption,\r\n folderId,\r\n };\r\n\r\n const responseData = await getFolderDetailService(folderParams);\r\n\r\n if (responseData?.isSuccess) {\r\n const folderList = responseData?.data?.gridData ?? [];\r\n const sortedFolderList = moveFolderToTop(folderList);\r\n\r\n const blockSizeData = createDataByBlockSize(sortedFolderList);\r\n const datasource = createServerSideDatasource(blockSizeData);\r\n\r\n agGridParams.api.setServerSideDatasource(datasource);\r\n } else {\r\n agGridParams.api.setServerSideDatasource([]);\r\n CustomNotification.error(responseData?.message ?? 'Something went wrong');\r\n }\r\n };\r\n\r\n /* \r\n I don't want use this useEffect, because AgGrid force me\r\n */\r\n useEffect(() => {\r\n if (!isDetailGridView) return;\r\n\r\n if (folderBreadcrumb?.length > 1) {\r\n const currentBreadcrumb = folderBreadcrumb[folderBreadcrumb.length - 1];\r\n const folderId = currentBreadcrumb?.id;\r\n\r\n setRequestParamsFolder((prevVal) => ({\r\n ...prevVal,\r\n folderId,\r\n }));\r\n } else {\r\n setRequestParamsFolder((prevVal) => ({\r\n ...prevVal,\r\n ...propsRequestParams,\r\n folderId: null,\r\n }));\r\n }\r\n }, [folderBreadcrumb?.length, JSON.stringify(propsRequestParams)]);\r\n\r\n const onGridReady = useCallbackRef(async (params) => {\r\n if (params?.api) {\r\n gridApi.current = params?.api;\r\n }\r\n\r\n if (isRoot) {\r\n fetchRootFolders(params);\r\n } else {\r\n getSubFolderContent(params);\r\n }\r\n });\r\n\r\n const handleToggleReloadAgGrid = async () => {\r\n setShouldReloadAgGrid(true);\r\n await sleep(200);\r\n setShouldReloadAgGrid(false);\r\n };\r\n\r\n const onSortChanged = useCallbackRef(async () => {\r\n if (isRoot) {\r\n setRequestParamsFolder((prevVal) => ({\r\n ...prevVal,\r\n folderId: null,\r\n }));\r\n } else {\r\n const currentBreadcrumb = folderBreadcrumb[folderBreadcrumb.length - 1];\r\n const folderId = currentBreadcrumb?.id;\r\n setRequestParamsFolder((prevVal) => ({\r\n ...prevVal,\r\n folderId,\r\n }));\r\n }\r\n handleToggleReloadAgGrid();\r\n });\r\n\r\n const onFilterChanged = useCallbackRef(async () => {\r\n if (isRoot) {\r\n setRequestParamsFolder((prevVal) => ({\r\n ...prevVal,\r\n folderId: null,\r\n }));\r\n } else {\r\n const currentBreadcrumb = folderBreadcrumb[folderBreadcrumb.length - 1];\r\n const folderId = currentBreadcrumb?.id;\r\n setRequestParamsFolder((prevVal) => ({\r\n ...prevVal,\r\n folderId,\r\n }));\r\n }\r\n handleToggleReloadAgGrid();\r\n });\r\n\r\n useDocumentAttachEvent({\r\n name: EVENT.RELOAD_FOLDER_GRID,\r\n handler: handleToggleReloadAgGrid,\r\n });\r\n\r\n return {\r\n gridConfigProps: {\r\n onGridReady,\r\n serverSideStoreType: 'partial',\r\n cacheBlockSize: 50,\r\n blockLoadDebounceMillis: 500,\r\n notCheckTotalRecordAgGrid: true,\r\n onSortChanged,\r\n onFilterChanged,\r\n // maxBlocksInCache: 5,\r\n },\r\n requestParamsFolder,\r\n columnDefs,\r\n shouldReloadAgGrid,\r\n };\r\n};\r\n","import { useDispatch } from 'react-redux';\r\n\r\nimport { defaultSearchText } from '@redux/global/reducer';\r\nimport * as globalActions from '@redux/global/actions';\r\nimport * as gridViewActions from 'common/components/grid-view/controllers/actions';\r\nimport * as folderActions from '../controllers/actions';\r\n\r\nimport { useGridView } from 'hooks/useGridView';\r\n\r\nimport { getLinkPathByEntityType } from 'utils/common/linkBuilder';\r\nimport { buildHierarchyBreadcrumb } from './utils';\r\nimport { useFolderByLevel } from 'hooks/useFolderByLevel';\r\n\r\nexport const useFolderGridItem = (props) => {\r\n const dispatch = useDispatch();\r\n\r\n const { dataDetail, folderOption } = props;\r\n\r\n const { clearGridSelection } = useGridView();\r\n const { handleFetchFolderByLevel } = useFolderByLevel();\r\n\r\n const openEntity = () => {\r\n const { id, type } = dataDetail;\r\n\r\n if (!id) return;\r\n if (!type) return;\r\n\r\n if (type === 'query') return openQueryItem(dataDetail);\r\n\r\n const path = getLinkPathByEntityType(type);\r\n window.open(`${window.location.origin}${path}/${id}`).focus();\r\n };\r\n\r\n const openNestedFolderGrid = async () => {\r\n const { id } = dataDetail;\r\n\r\n const breadcrumbs = await buildHierarchyBreadcrumb(dataDetail);\r\n\r\n dispatch(gridViewActions.togglePreventCallApiGridView(true));\r\n dispatch(globalActions.resetSearchText(defaultSearchText));\r\n\r\n handleFetchFolderByLevel({\r\n folderId: id,\r\n folderOption,\r\n successCallback: () => {\r\n // Need to review\r\n dispatch(folderActions.updateFolderBreadcrumb(breadcrumbs));\r\n // await sleep(400);\r\n clearGridSelection();\r\n },\r\n });\r\n };\r\n\r\n const openQueryItem = (dataDetail) => {\r\n if (!dataDetail) return;\r\n\r\n const { id } = dataDetail;\r\n\r\n const url = `${window.location.origin}/execute-query/${id}`;\r\n\r\n window.open(url).focus();\r\n //* query execution are handled in execute-query/index\r\n };\r\n\r\n return {\r\n openEntity,\r\n openNestedFolderGrid,\r\n };\r\n};\r\n","import React from 'react';\r\nimport { useDispatch } from 'react-redux';\r\n\r\nimport {\r\n FolderBreadcrumb,\r\n FolderItemContainer,\r\n} from 'common/components/folder';\r\nimport { FolderThumbnailCard, FolderTile } from '../components';\r\n\r\nimport * as globalActions from '@redux/global/actions';\r\n\r\nimport { useGridView } from 'hooks/useGridView';\r\nimport { useFolderByLevel } from 'hooks/useFolderByLevel';\r\nimport useCheckFavoriteRoute from 'hooks/useCheckFavoriteRoute';\r\nimport { useFolderGridItem } from './hooks';\r\nimport useDocumentAttachEvent from 'hooks/documentAttachEventHook';\r\nimport { forwardTo } from 'utils/common/route';\r\n\r\nimport { EVENT } from 'static/Constants';\r\n\r\nexport const FolderGridViewSection = ({\r\n folderOption,\r\n // isHideBreadcrumb,\r\n searchText,\r\n requestParams,\r\n children,\r\n ...rest\r\n}) => {\r\n const dispatch = useDispatch();\r\n\r\n const isFavoriteRoute = useCheckFavoriteRoute();\r\n\r\n const { clearGridSelection } = useGridView();\r\n const {\r\n folderBreadcrumb,\r\n handleFetchFolderByLevel,\r\n updateFolderBreadcrumb,\r\n resetFolderBreadcrumb,\r\n } = useFolderByLevel();\r\n\r\n const handleGetFolderByBreadcrumb = async (idBreadcrumb) => {\r\n const currentBreadcrumb = folderBreadcrumb[folderBreadcrumb.length - 1];\r\n\r\n if (currentBreadcrumb?.id === idBreadcrumb) return;\r\n\r\n const { id } =\r\n folderBreadcrumb.find((item) => item?.id === idBreadcrumb) ?? {};\r\n\r\n const isRoot = id === 'home';\r\n\r\n const advFilterParams = isRoot ? requestParams : {};\r\n\r\n handleFetchFolderByLevel({\r\n folderId: isRoot ? null : id,\r\n folderOption,\r\n params: { ...advFilterParams, folderOption, isFavoriteRoute },\r\n });\r\n\r\n clearGridSelection();\r\n dispatch(globalActions.updateToggleDetail(false));\r\n\r\n //* update breadcrumb\r\n if (isRoot) {\r\n resetFolderBreadcrumb();\r\n } else {\r\n const foundIdxBreadcrumb = folderBreadcrumb.findIndex(\r\n (item) => parseInt(item.id) === parseInt(id)\r\n );\r\n\r\n const newBreadcrumbs = folderBreadcrumb.slice(0, foundIdxBreadcrumb + 1);\r\n updateFolderBreadcrumb(newBreadcrumbs);\r\n }\r\n };\r\n\r\n const backToHome = () => {\r\n handleGetFolderByBreadcrumb('home');\r\n };\r\n\r\n useDocumentAttachEvent({\r\n name: EVENT.BACK_FOLDER_GRID_TO_HOME,\r\n handler: backToHome,\r\n });\r\n\r\n return (\r\n
\r\n {/* {isHideBreadcrumb ? null : (\r\n )} */}\r\n handleGetFolderByBreadcrumb(breadcrumb)}\r\n />\r\n {children}\r\n
\r\n );\r\n};\r\n\r\nexport const FolderViewContainer = ({ children, configProps }) => {\r\n const dispatch = useDispatch();\r\n\r\n const { clearGridSelection } = useGridView();\r\n\r\n const { onClickItemGrid, dataDetail, folderOption } = configProps || {};\r\n\r\n const { openEntity, openNestedFolderGrid } = useFolderGridItem({\r\n dataDetail,\r\n folderOption,\r\n });\r\n const { updateShouldKeepBreadcrumb } = useFolderByLevel();\r\n\r\n const onDoubleClick = () => {\r\n if (!dataDetail) return;\r\n forwardTo(`/folder/${dataDetail?.id}`);\r\n };\r\n\r\n const onClickLink = () => {\r\n //* clicking on link will redirect to item detail page\r\n //* when closing detail, breadcrumb will reset\r\n\r\n //* So prevent resetting breadcrumb\r\n dataDetail?.type.toLowerCase() !== 'query' &&\r\n updateShouldKeepBreadcrumb(true);\r\n };\r\n\r\n /*\r\n Checkbox is wrong, because onClick is overlapping onCheckGrid\r\n */\r\n\r\n return (\r\n {\r\n const target = event.srcElement.tagName;\r\n if (target === 'A') {\r\n onClickLink();\r\n\r\n //* prevent selecting\r\n return;\r\n }\r\n\r\n onClickItemGrid && onClickItemGrid(dataDetail, event);\r\n }}\r\n >\r\n {children}\r\n \r\n );\r\n};\r\n\r\nexport const FolderGridThumbnail = (configProps) => {\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport const FolderGridTile = (configProps) => {\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n","import React, { createContext, useRef } from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\n\r\nimport { Tooltip } from 'antd';\r\n\r\nimport { CustomNotification } from 'common/components';\r\nimport {\r\n FolderBreadcrumb,\r\n FolderItemContainer,\r\n} from 'common/components/folder';\r\n\r\nimport * as folderSelectors from '../../controllers/selectors';\r\nimport * as folderActions from '../../controllers/actions';\r\n\r\nimport { getFolderDetailGrid } from 'services/folder';\r\n\r\nimport {\r\n createDataByBlockSize,\r\n createServerSideDatasource,\r\n} from '../../hooks/useAgGridFolder';\r\n\r\nimport { useCallbackRef } from 'hooks';\r\nimport 'pages/folders/style.less';\r\nimport { forwardTo } from 'utils/common/route';\r\n\r\nconst FolderGridDetailViewContext = createContext({});\r\n\r\nexport const FolderGridDetailViewProvider = ({ children }) => {\r\n const gridApi = useRef();\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n\r\nexport const useFolderGridDetailView = () => {\r\n const context = React.useContext(FolderGridDetailViewContext);\r\n\r\n if (context === undefined) {\r\n throw new Error(\r\n 'useFolderGridDetailView must be used within a FormContextProvider'\r\n );\r\n }\r\n return context;\r\n};\r\n\r\nexport const FolderGridDetailViewSection = ({\r\n folderOption,\r\n children,\r\n ...rest\r\n}) => {\r\n const { folderBreadcrumb } = useSelector(\r\n folderSelectors.selectFolderListByLevel()\r\n );\r\n\r\n const dispatch = useDispatch();\r\n\r\n const gridApi = useFolderGridDetailView();\r\n\r\n const handleGetItemByBreadcrumb = useCallbackRef(async (idBreadcrumb) => {\r\n const currentBreadcrumb = folderBreadcrumb[folderBreadcrumb.length - 1];\r\n if (currentBreadcrumb?.id === idBreadcrumb) return;\r\n\r\n const { id } =\r\n folderBreadcrumb.find((item) => item?.id === idBreadcrumb) ?? {};\r\n\r\n const isRoot = id === 'home';\r\n\r\n if (isRoot) {\r\n const folderParams = {\r\n pageSize: 9999,\r\n pageIndex: 1,\r\n sort: [\r\n {\r\n fieldName: 'id',\r\n isAscending: false,\r\n },\r\n ],\r\n filters: [\r\n {\r\n fieldName: 'level',\r\n filterType: 'Equal',\r\n value: '1', //\r\n },\r\n ],\r\n folderOption,\r\n isAdvanceSearch: false,\r\n advCriteria: [],\r\n search: {\r\n searchText: '',\r\n },\r\n };\r\n getFolderDetailGrid(folderParams).then((resp) => {\r\n if (resp?.data?.gridData) {\r\n const data = resp.data.gridData;\r\n\r\n const blockSizeData = createDataByBlockSize(data);\r\n const datasource = createServerSideDatasource(blockSizeData);\r\n\r\n if (gridApi?.current) {\r\n gridApi.current.setServerSideDatasource(datasource);\r\n }\r\n dispatch(\r\n folderActions.updateFolderBreadcrumb([\r\n {\r\n id: 'home',\r\n folderName: 'Home',\r\n },\r\n ])\r\n );\r\n }\r\n });\r\n } else {\r\n const params = {\r\n folderId: id,\r\n pageIndex: 1,\r\n pageSize: 9999,\r\n filters: [],\r\n sort: [\r\n {\r\n fieldName: 'id',\r\n isAscending: false,\r\n },\r\n ],\r\n isFavoriteRoute: false,\r\n };\r\n const foundIdxBreadcrumb = folderBreadcrumb.findIndex(\r\n (item) => parseInt(item.id) === parseInt(id)\r\n );\r\n const newBreadcrumbs = folderBreadcrumb.slice(0, foundIdxBreadcrumb + 1);\r\n const response = await getFolderDetailGrid(params);\r\n try {\r\n if (response?.isSuccess) {\r\n const gridData = response?.data?.gridData ?? [];\r\n const item = gridData.map((folder) => ({\r\n ...folder,\r\n folderName: folder?.description,\r\n }));\r\n\r\n const blockSizeData = createDataByBlockSize(item);\r\n const datasource = createServerSideDatasource(blockSizeData);\r\n\r\n if (gridApi?.current) {\r\n gridApi.current.setServerSideDatasource(datasource);\r\n }\r\n\r\n dispatch(folderActions.updateFolderBreadcrumb(newBreadcrumbs));\r\n } else {\r\n CustomNotification.error('Something went wrong');\r\n }\r\n } catch (error) {}\r\n }\r\n });\r\n\r\n return (\r\n
\r\n handleGetItemByBreadcrumb(breadcrumb)}\r\n />\r\n {children}\r\n
\r\n );\r\n};\r\n\r\nexport const FolderGridItemContainer = ({ params, children }) => {\r\n const handleOpenDetail = async () => {\r\n const { data } = params;\r\n forwardTo(`/folder/${data?.id}`);\r\n };\r\n\r\n return (\r\n \r\n {\r\n // dispatch(globalActions.updateToggleDetail(false));\r\n // }}\r\n >\r\n {children}\r\n \r\n \r\n );\r\n};\r\n","import { getFolderShortDetail } from 'services/folder';\r\n\r\nconst homeBreadcrumb = [\r\n {\r\n id: 'home',\r\n folderName: 'Home',\r\n },\r\n];\r\n\r\nexport const generateChildBreadcrumbs = async (fullPathIds) => {\r\n let result = [];\r\n\r\n const promises = fullPathIds.map((id) =>\r\n getFolderShortDetail({\r\n id,\r\n IsLoadContent: false,\r\n })\r\n );\r\n\r\n const detailFolderResponses = await Promise.all(promises);\r\n\r\n detailFolderResponses.forEach((resp) => {\r\n const breadcrumb = {\r\n id: resp?.data?.id,\r\n folderName: resp?.data?.folderName ?? resp?.data?.description,\r\n };\r\n result.push(breadcrumb);\r\n });\r\n\r\n return result;\r\n};\r\n\r\nexport const buildHierarchyBreadcrumb = async (selectedFolder) => {\r\n if (selectedFolder) {\r\n const {\r\n level,\r\n hierarchy,\r\n id: selectedId,\r\n folderName,\r\n description,\r\n editable,\r\n } = selectedFolder;\r\n const isRootFolder = level === 1;\r\n\r\n if (isRootFolder) {\r\n const breadcrumb = {\r\n id: selectedId,\r\n folderName: folderName ?? description,\r\n editable,\r\n };\r\n return homeBreadcrumb.concat(breadcrumb);\r\n }\r\n\r\n const parentIds = hierarchy\r\n ? hierarchy\r\n .split('/')\r\n .filter(Boolean)\r\n .map((id) => parseInt(id))\r\n : [];\r\n const fullPathIds = parentIds.concat(selectedId);\r\n\r\n const childBreadcrumbs = await generateChildBreadcrumbs(fullPathIds);\r\n\r\n return homeBreadcrumb.concat(childBreadcrumbs);\r\n }\r\n\r\n return [];\r\n};\r\n\r\nexport const sortFolderToTop = (a, b) => {\r\n if (a.type.toLowerCase() === 'folder') {\r\n if (b.type.toLowerCase() === 'folder') return 0;\r\n return -1; //* sort folder to the top\r\n } else if (a.type.toLowerCase() !== 'folder') {\r\n //* this is not convenient but write details like this just to support Firefox\r\n if (b.type.toLowerCase() === 'folder') return 1;\r\n return 0;\r\n }\r\n\r\n return 0;\r\n};\r\n","import React from 'react';\r\n\r\nimport { Badge, Image } from 'antd';\r\n\r\nimport classnames from 'classnames';\r\n\r\nimport SandClockImage from 'assets/navigation/sand-clock.png';\r\n\r\nexport const FilterIndicator = ({\r\n onClickAction,\r\n isGdsnReceivedProducts,\r\n absoluteRight,\r\n absoluteTop,\r\n actionData,\r\n children,\r\n}) => {\r\n return (\r\n \r\n {/* */}\r\n \r\n \r\n {isGdsnReceivedProducts ? (\r\n \r\n ) : (\r\n <>{children}\r\n )}\r\n \r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { Image } from 'antd';\r\nimport PropTypes from 'prop-types';\r\nimport classnames from 'classnames';\r\nimport { forwardTo } from 'utils/common/route';\r\n\r\nimport * as globalActions from '@redux/global/actions';\r\nimport * as globalSelectors from '@redux/global/selectors';\r\n\r\nimport * as actionsGridView from 'common/components/grid-view/controllers/actions';\r\nimport selectorsGridView from 'common/components/grid-view/controllers/selectors';\r\n\r\nimport { clearQueryCondition } from 'utils/queryCondition';\r\n\r\nimport NewImage from 'assets/navigation/new.png';\r\nimport { PRODUCT_NAV } from 'static/Constants';\r\nimport { SSO_APPROVAL_NAV } from 'static/Constants';\r\n\r\nimport { FilterIndicator } from './FilterIndicator';\r\n\r\n//* STYLING\r\nimport './HomeNavActionGroup.less';\r\n\r\nfunction HomeNavActionGroup(props) {\r\n const dispatch = useDispatch();\r\n\r\n const { actionData, absoluteRight, absoluteTop, link, type } = props;\r\n\r\n const isMemberNew = useSelector(globalSelectors.selectDisplayMemberNew());\r\n const isAssetNew = useSelector(globalSelectors.selectDisplayAssetNew());\r\n const isProductNew = useSelector(globalSelectors.selectDisplayProductNew());\r\n\r\n const isAssetUnmatch = useSelector(\r\n globalSelectors.selectDisplayAssetUnmatch()\r\n );\r\n const isProductUnmatch = useSelector(\r\n globalSelectors.selectDisplayProductUnmatch()\r\n );\r\n const isMemberUnmatch = useSelector(\r\n globalSelectors.selectDisplayMemberUnmatch()\r\n );\r\n\r\n const filterSsoUserPending = useSelector(\r\n globalSelectors.selectToggleSsoUserPending()\r\n );\r\n const filterSsoMemberPending = useSelector(\r\n globalSelectors.selectToggleSsoMemberPending()\r\n );\r\n const filterProducts = useSelector(globalSelectors.selectFilterProducts());\r\n const filterAssets = useSelector(globalSelectors.selectFilterAssets());\r\n const filterMembers = useSelector(globalSelectors.selectFilterMembers());\r\n\r\n const prevPathnameQuery = useSelector(\r\n selectorsGridView.makeSelectPrevPathnameQuery()\r\n );\r\n\r\n const isGdsnReceivedProducts = link === PRODUCT_NAV.subItems[2].link;\r\n const isSsoMemberApproval = link === SSO_APPROVAL_NAV.subItems[0].link;\r\n const isSsoUserApproval = link === SSO_APPROVAL_NAV.subItems[1].link;\r\n\r\n const actionCollection = {\r\n '/members': {\r\n target: 'new',\r\n isFiltering: isMemberNew,\r\n isUnmatched: isMemberUnmatch,\r\n toggleNew: 'toggleMemberNew',\r\n toggleUnmatched: 'toggleMemberUnmatch',\r\n resetPage: 'resetPageCurrentMember',\r\n filter: filterMembers,\r\n updateFilter: 'updateFilterMembers',\r\n },\r\n '/digital-media': {\r\n target: 'new',\r\n isFiltering: isAssetNew,\r\n isUnmatched: isAssetUnmatch,\r\n toggleNew: 'toggleAssetNew',\r\n toggleUnmatched: 'toggleAssetUnmatch',\r\n resetPage: 'resetPageCurrentMedia',\r\n filter: filterAssets,\r\n updateFilter: 'updateFilterAssets',\r\n },\r\n '/products': {\r\n target: 'new',\r\n isFiltering: isProductNew,\r\n isUnmatched: isProductUnmatch,\r\n toggleNew: 'toggleProductNew',\r\n toggleUnmatched: 'toggleProductUnmatch',\r\n resetPage: 'resetPageCurrentProduct',\r\n filter: filterProducts,\r\n updateFilter: 'updateFilterProducts',\r\n },\r\n '/products/syndication-history': {\r\n target: 'new',\r\n toggleNew: 'toggleNewSyndicationHistory',\r\n },\r\n '/products/gdsn-received-products': {\r\n target: 'new',\r\n toggleNew: 'toggleFilterPendingPublication',\r\n },\r\n '/security-matrix/permission-request': {\r\n target: 'new',\r\n toggleNew: 'toggleRequestNew',\r\n },\r\n '/sso-approval/member': {\r\n target: 'pending',\r\n toggleNew: 'toggleFilterPendingSsoMember',\r\n filter: filterSsoMemberPending,\r\n },\r\n '/sso-approval/user': {\r\n target: 'pending',\r\n toggleNew: 'toggleFilterPendingSsoUser',\r\n filter: filterSsoUserPending,\r\n },\r\n // '/ticketing-system': {\r\n // target: 'new',\r\n // toggleNew: 'toggleNewTicketingSystem',\r\n // },\r\n };\r\n\r\n const toggleNew = () => {\r\n const actions = actionCollection[link];\r\n if (actions.target !== 'new') return;\r\n if (!actions.toggleNew) return;\r\n\r\n // turnUnmatchedOff();\r\n\r\n if (actions.isFiltering) {\r\n dispatch(globalActions[actions.toggleNew](false));\r\n setTimeout(() => {\r\n dispatch(globalActions[actions.toggleNew](true));\r\n }, 100);\r\n } else {\r\n dispatch(globalActions[actions.toggleNew](true));\r\n }\r\n\r\n actions.resetPage && dispatch(actionsGridView[actions.resetPage]());\r\n };\r\n\r\n const toggleUnmatched = () => {\r\n const actions = actionCollection[link];\r\n\r\n if (!actions.toggleUnmatched) return;\r\n\r\n // turnNewOff();\r\n\r\n if (!actions.isUnmatched) {\r\n dispatch(globalActions[actions.toggleUnmatched](true));\r\n }\r\n\r\n const filterValue = actions.filters?.includes('unmatched')\r\n ? []\r\n : ['unmatched'];\r\n actions.updateFilter &&\r\n dispatch(globalActions[actions.updateFilter](filterValue));\r\n\r\n actions.resetPage && dispatch(actionsGridView[actions.resetPage]());\r\n };\r\n\r\n const filterPendingSso = () => {\r\n const actions = actionCollection[link];\r\n if (actions.target !== 'pending') return;\r\n if (actions.filter.length > 0) return;\r\n dispatch(\r\n globalActions[actions.toggleNew]([\r\n {\r\n fieldName: 'poolStatus',\r\n values: ['Pending'],\r\n filterType: 'In',\r\n },\r\n ])\r\n );\r\n actions.resetPage && dispatch(actionsGridView[actions.resetPage]());\r\n };\r\n\r\n const turnUnmatchedOff = () => {\r\n isAssetUnmatch && dispatch(globalActions.toggleAssetUnmatch(false));\r\n isProductUnmatch && dispatch(globalActions.toggleProductUnmatch(false));\r\n isMemberUnmatch && dispatch(globalActions.toggleMemberUnmatch(false));\r\n };\r\n\r\n const turnNewOff = () => {\r\n isAssetNew && dispatch(globalActions.toggleAssetNew(false));\r\n isProductNew && dispatch(globalActions.toggleProductNew(false));\r\n isMemberNew && dispatch(globalActions.toggleMemberNew(false));\r\n };\r\n\r\n const onIndicatorClick = (target) => () => {\r\n const actions = actionCollection[link];\r\n if (!actions) return;\r\n\r\n if (target === actions.target) {\r\n toggleNew();\r\n filterPendingSso();\r\n }\r\n\r\n target === 'unmatched' && toggleUnmatched();\r\n\r\n clearQueryCondition(dispatch, '', prevPathnameQuery);\r\n forwardTo(link);\r\n };\r\n\r\n const targetToggleFilter =\r\n isSsoMemberApproval || isSsoUserApproval ? 'pending' : 'new';\r\n\r\n return (\r\n \r\n {!!actionData &&\r\n actionData > 0 &&\r\n type === 'new' &&\r\n !isGdsnReceivedProducts && (\r\n \r\n \r\n \r\n )}\r\n\r\n {!!actionData && actionData > 0 && type === 'unmatched' && (\r\n \r\n \r\n \r\n )}\r\n {!!actionData && isGdsnReceivedProducts && actionData > 0 && (\r\n \r\n )}\r\n \r\n );\r\n}\r\n\r\nHomeNavActionGroup.propTypes = {\r\n //? link - path name\r\n link: PropTypes.string,\r\n //? actionData - action status of activity and new\r\n actionData: PropTypes.number,\r\n //? absoluteRight - position absolute right position\r\n absoluteRight: PropTypes.number,\r\n};\r\n\r\nexport default HomeNavActionGroup;\r\n","import React from 'react';\r\nimport PropTypes, { oneOfType } from 'prop-types';\r\nimport { useSelector } from 'react-redux';\r\nimport * as selectors from '@redux/branding/selectors';\r\nimport { Link } from 'react-router-dom';\r\nimport { Typography } from 'antd';\r\nimport classnames from 'classnames';\r\nimport HomeNavActionGroup from './HomeNavActionGroup';\r\nimport './HomeNavSubMenuTitle.less';\r\nimport { OFFSET_X_UNMATCHED } from 'static/Constants';\r\n\r\nimport { MAIN_PAGE_LINK } from 'static/Constants';\r\nimport { forwardTo } from 'utils/common/route';\r\n\r\nconst { Text } = Typography;\r\n\r\nfunction HomeNavSubMenuTitle(props) {\r\n const {\r\n titleName,\r\n keyName,\r\n link,\r\n selectedKeys,\r\n actionDataNew,\r\n actionDataUnmatched,\r\n actionLink,\r\n } = props;\r\n const pathName = window.location.pathname;\r\n const branding = useSelector(selectors.getBranding());\r\n\r\n const getPositionUnmatchedByTotalNew = (totalNew) => {\r\n if (totalNew && totalNew > 0) {\r\n return OFFSET_X_UNMATCHED.offsetXHight;\r\n }\r\n\r\n return OFFSET_X_UNMATCHED.offsetXLow;\r\n };\r\n\r\n const calcPositionActionInNavMenu = () => {\r\n switch (actionLink) {\r\n case '/products': {\r\n return getPositionUnmatchedByTotalNew(branding.totalNewProducts);\r\n }\r\n case '/digital-media': {\r\n return getPositionUnmatchedByTotalNew(branding.totalNewDams);\r\n }\r\n default:\r\n break;\r\n }\r\n };\r\n\r\n const positionUnmatched = calcPositionActionInNavMenu();\r\n\r\n const handleClickMenuTitle = (link) => {\r\n if (MAIN_PAGE_LINK.includes(link)) {\r\n forwardTo(`/blank?returnUrl=${link}`);\r\n }\r\n };\r\n\r\n return (\r\n
\r\n {!MAIN_PAGE_LINK.includes(link) && link ? (\r\n \r\n \r\n {titleName || 'NO NAME'}\r\n \r\n \r\n ) : (\r\n {\r\n e.preventDefault();\r\n handleClickMenuTitle(link);\r\n }}\r\n >\r\n \r\n {titleName || 'NO NAME'}\r\n \r\n \r\n )}\r\n \r\n \r\n
\r\n );\r\n}\r\n\r\nHomeNavSubMenuTitle.propTypes = {\r\n //? titleName - name of submenu\r\n titleName: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),\r\n //? keyName - keyname when it is selected - required\r\n keyName: PropTypes.string.isRequired,\r\n // ? link - path name\r\n link: oneOfType([\r\n PropTypes.string.isRequired,\r\n PropTypes.oneOf([undefined]).isRequired,\r\n ]),\r\n // ? selectedKey - selected key of menu Navigation\r\n selectedKey: PropTypes.string,\r\n // ? actionData - action data of sub menu item only\r\n actionData: PropTypes.number,\r\n};\r\n\r\nexport default React.memo(HomeNavSubMenuTitle);\r\n","import React from 'react';\r\n\r\nimport { FormOutlined } from '@ant-design/icons';\r\n\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\n\r\nimport Messages from 'i18n/messages/home';\r\nimport { useGlobalModal } from 'hooks';\r\n\r\nexport const WIDTH_CONTANT_PANE = 500;\r\n\r\nconst EditFolderDetail = (props) => {\r\n const { disabled } = props;\r\n\r\n const { MODAL_NAMES, openModal } = useGlobalModal();\r\n\r\n const clickEditFolderHandler = () => {\r\n openModal(MODAL_NAMES.EDIT_FOLDER);\r\n };\r\n\r\n return (\r\n <>\r\n }\r\n label={Messages.editFoldersRibbon}\r\n onClick={clickEditFolderHandler}\r\n disabled={disabled}\r\n />\r\n \r\n );\r\n};\r\n\r\nexport default EditFolderDetail;\r\n","import React from 'react';\r\nimport { useIntl } from 'react-intl';\r\n\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\nimport IconDeleteFolders from 'common/components/button/svg-icons/delete-folder.svg?react';\r\n\r\nimport Messages from 'i18n/messages/home';\r\nimport { dialogFunction, CustomNotification } from 'common/components';\r\nimport { apiHandler } from 'utils/api';\r\nimport { deleteFolders } from 'services/folder';\r\nimport folderMessages from 'i18n/messages/folder';\r\n\r\nconst DeleteFolderDetail = ({\r\n selectedFolders,\r\n onReloadWhenSaveSuccess,\r\n disabled,\r\n}) => {\r\n const intl = useIntl();\r\n\r\n const handleDeleteFolder = () => {\r\n const params = {\r\n deleteFolderIds: [selectedFolders.id],\r\n };\r\n\r\n apiHandler({\r\n service: deleteFolders,\r\n params,\r\n skipNotification: true,\r\n failCallback: (message) => {\r\n CustomNotification.error(message);\r\n },\r\n successCallback: () => {\r\n onReloadWhenSaveSuccess &&\r\n onReloadWhenSaveSuccess(params.deleteFolderIds, 'delete');\r\n },\r\n });\r\n };\r\n\r\n const showModalConfirm = () => {\r\n dialogFunction({\r\n type: 'warn',\r\n content: intl.formatMessage(folderMessages.confirmDeleteFolderMessage),\r\n okText: 'OK',\r\n cancelText: 'Cancel',\r\n onOk: () => handleDeleteFolder(),\r\n });\r\n };\r\n return (\r\n <>\r\n }\r\n label={Messages.deleteFolderDetailRibbon}\r\n onClick={showModalConfirm}\r\n disabled={disabled}\r\n />\r\n \r\n );\r\n};\r\n\r\nexport default DeleteFolderDetail;\r\n","import React from 'react';\r\n\r\nimport IconAddFolder from 'common/components/button/svg-icons/add-folder.svg?react';\r\n\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\n\r\nimport Messages from 'i18n/messages/home';\r\n\r\nconst CreateFolderDetail = (props) => {\r\n const { setVisibleModal, disabled } = props;\r\n\r\n const openNewFolderModal = () => {\r\n setVisibleModal(true);\r\n };\r\n\r\n return (\r\n <>\r\n }\r\n label={Messages.newFolder}\r\n onClick={openNewFolderModal}\r\n disabled={disabled}\r\n />\r\n \r\n );\r\n};\r\n\r\nexport default CreateFolderDetail;\r\n","import React, { useState } from 'react';\r\n\r\nimport { useIntl } from 'react-intl';\r\n\r\nimport { useSelector } from 'react-redux';\r\n\r\nimport { useIsMutating } from '@tanstack/react-query';\r\n\r\nimport { Dropdown, Menu } from 'antd';\r\nimport { FolderOutlined, DownloadOutlined } from '@ant-design/icons';\r\n\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\nimport CopyFolder from '../../controls/folders/CopyFolder';\r\nimport MoveFolder from '../../controls/folders/MoveFolder';\r\nimport BulkEditProduct from '../../controls/product/BulkEditProduct';\r\nimport CopyFolderModal from '../../controls/folders/CopyFolderModal';\r\nimport MoveFolderModal from '../../controls/folders/MoveFolderModal';\r\nimport EditFolderDetail from '../../controls/folders/EditFolderDetail';\r\nimport DeleteFolderDetail from '../../controls/folders/DeleteFolderDetail';\r\nimport CreateFolderDetail from '../../controls/folders/CreateFolderDetail';\r\nimport ExportProductPropertiesModal from '../../modal/bulk-edit-product/ExportProductPropertiesModal';\r\nimport ImportProductBulkEditModal from '../../modal/bulk-edit-product/ImportProductBulkEditModal';\r\nimport CreateFolderModal from '../../controls/folders/CreateFolderModal';\r\nimport FolderEditModal from 'pages/folders/components/modal/FolderEditModal';\r\n\r\n// redux\r\nimport gridSelector from 'common/components/grid-view/controllers/selectors';\r\nimport { useInjectReducer } from 'utils/common/injectedReducers';\r\nimport { useInjectSaga } from 'utils/common/injectSaga';\r\nimport reducer from 'common/components/grid-view/controllers/reducer';\r\nimport saga from 'common/components/grid-view/controllers/saga';\r\n\r\nimport {\r\n useCheckPermissionAnd,\r\n useCheckPermissions,\r\n} from 'hooks/useCheckPermissions';\r\nimport {\r\n usePermissionEditSharedProduct,\r\n useCheckIsSuperAdmin,\r\n useGlobalModal,\r\n} from 'hooks';\r\n\r\nimport { SECURE_CONFIG } from 'utils/SecureRoute';\r\n\r\nimport Messages from 'i18n/messages/home';\r\nimport messagesProduct from 'i18n/messages/product';\r\n\r\nimport {\r\n ABILITY_ACTION,\r\n ABILITY_SUBJECT,\r\n PERMISSION_EDIT_PRODUCTS,\r\n} from 'static/Permission';\r\n\r\nimport './FolderSection.less';\r\n\r\nimport { Can } from 'context/Can';\r\nimport {\r\n EXPORT_PRODUCT_PROPERTIES,\r\n useExportProductProperty,\r\n} from '../../modal/bulk-edit-product/hook';\r\nimport { IMPORT_PRODUCT_FOR_BULK_EDITING } from 'services/product/endpoints';\r\n\r\nconst key = 'gridView';\r\nconst { SubMenu } = Menu;\r\n\r\nconst FolderDetailSection = (props) => {\r\n useInjectReducer({ key, reducer });\r\n useInjectSaga({ key, saga });\r\n\r\n const {\r\n folderDetail,\r\n handleLoading,\r\n onReloadWhenSaveSuccess,\r\n onMoveFolder,\r\n onCopyFolder,\r\n } = props;\r\n\r\n const [copyFolderModalVisible, setCopyFolderVisible] = useState(false);\r\n const [moveFolderModalVisible, setMoveFolderVisible] = useState(false);\r\n\r\n const createFolderModalVisibleHook = useState(false);\r\n const [, setVisibleModal] = createFolderModalVisibleHook;\r\n\r\n const intl = useIntl();\r\n\r\n let detailItems = useSelector(\r\n gridSelector.makeSelectDetailCurrentITemsSelection()\r\n );\r\n\r\n const exportProductPropertyMutation = useExportProductProperty();\r\n\r\n const checkItemsProduct = () => {\r\n return detailItems\r\n .filter((item) => item?.type?.toLowerCase() === 'product')\r\n .map((item) => item?.id);\r\n };\r\n\r\n const { MODAL_NAMES, checkModalVisible, closeModal } = useGlobalModal();\r\n\r\n const isExportProductPropertyLoading = useIsMutating({\r\n mutationKey: EXPORT_PRODUCT_PROPERTIES,\r\n });\r\n\r\n const isExportProductModalOpen = checkModalVisible(\r\n MODAL_NAMES.EXPORT_PROPERTY_MODAL\r\n );\r\n\r\n const isImportProductModalOpen = checkModalVisible(\r\n MODAL_NAMES.IMPORT_PROPERTY_MODAL\r\n );\r\n\r\n const isEditFolderModalOpen = checkModalVisible(MODAL_NAMES.EDIT_FOLDER);\r\n\r\n const detailItemsProduct = checkItemsProduct();\r\n\r\n const hasPermissionEditProducts = useCheckPermissions(\r\n PERMISSION_EDIT_PRODUCTS\r\n );\r\n\r\n const hasPermissionEditSharedProduct = usePermissionEditSharedProduct();\r\n const isSuperAdmin = useCheckIsSuperAdmin();\r\n\r\n const isAllowActionsPim =\r\n isSuperAdmin || hasPermissionEditProducts || hasPermissionEditSharedProduct;\r\n\r\n const isValidPermissionAND = useCheckPermissionAnd();\r\n\r\n const hasPermissionAddEditProductOverlay = isValidPermissionAND([\r\n SECURE_CONFIG.OVERLAY_CREATE.PASS,\r\n SECURE_CONFIG.OVERLAY_EDIT.PASS,\r\n ]);\r\n\r\n const closeCopyModal = () => {\r\n setCopyFolderVisible(false);\r\n };\r\n\r\n const closeMoveModal = () => {\r\n setMoveFolderVisible(false);\r\n };\r\n\r\n const cancelEditFolder = () => {\r\n closeModal(MODAL_NAMES.EDIT_FOLDER);\r\n };\r\n\r\n const saveEditFolderSuccess = () => {\r\n cancelEditFolder();\r\n onReloadWhenSaveSuccess && onReloadWhenSaveSuccess(folderDetail.id, 'edit');\r\n };\r\n\r\n const onExportProductProperty = (exportProperties, allPopulated) => {\r\n exportProductPropertyMutation.mutate({\r\n productIds: detailItemsProduct,\r\n folderIds: [folderDetail?.id],\r\n selectedColumns: exportProperties,\r\n allPopulated,\r\n });\r\n };\r\n\r\n const menuOptions = (\r\n \r\n \r\n \r\n {(allowed) => (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n {(allowed) => (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n {(allowed) => (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n {(allowed) => (\r\n setCopyFolderVisible(true)}\r\n />\r\n )}\r\n \r\n \r\n \r\n \r\n {(allowed) => (\r\n setMoveFolderVisible(true)}\r\n />\r\n )}\r\n \r\n \r\n\r\n }\r\n disabled={!isAllowActionsPim}\r\n label={messagesProduct.bulkEditProduct}\r\n />\r\n }\r\n >\r\n \r\n \r\n \r\n );\r\n return (\r\n <>\r\n \r\n }\r\n label={Messages.folderActions}\r\n />\r\n \r\n \r\n \r\n {isExportProductModalOpen && (\r\n closeModal(MODAL_NAMES.EXPORT_PROPERTY_MODAL)}\r\n />\r\n )}\r\n {isImportProductModalOpen && (\r\n closeModal(MODAL_NAMES.IMPORT_PROPERTY_MODAL)}\r\n />\r\n )}\r\n \r\n {isEditFolderModalOpen ? (\r\n \r\n ) : null}\r\n \r\n );\r\n};\r\n\r\nexport default FolderDetailSection;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { RibbonBar, RibbonDivider } from 'common/components';\r\nimport ManageSharingSection from './components/sections/shared/ManageSharingSection';\r\nimport DetailSection from './components/sections/home-grid/DetailSection';\r\nimport FolderDetailSection from './components/sections/folder/FolderDetailSection';\r\nimport ManageScheduleDownload from 'pages/home/ribbon/components/controls/folders/ManageScheduleDownload';\r\n\r\nimport { ViewLayout, AdvanceStack, OtherLayout } from './components';\r\n\r\nimport { useFolderByLevel } from 'hooks/useFolderByLevel';\r\n\r\nconst FolderDetailRibbon = (props) => {\r\n const {\r\n folderDetail,\r\n handleLoading,\r\n onReloadWhenSaveSuccess,\r\n onMoveFolder,\r\n onCopyFolder,\r\n } = props;\r\n\r\n const { keepFolderBreadcrumb } = useFolderByLevel();\r\n\r\n const closeDetailCallback = () => {\r\n keepFolderBreadcrumb(true);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nFolderDetailRibbon.propTypes = {\r\n onSearch: PropTypes.func,\r\n toggleSearch: PropTypes.bool,\r\n};\r\n\r\nexport default FolderDetailRibbon;\r\n","import React from 'react';\r\nimport { injectIntl } from 'react-intl';\r\n\r\nimport PropTypes from 'prop-types';\r\n\r\nimport IconAddFolder from 'common/components/button/svg-icons/add-folder.svg?react';\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\n\r\nimport { SHARED_FOLDER_PATHNAME, FAVORITE_FOLDER_PATHNAME } from './pathname';\r\n\r\nimport Messages from 'i18n/messages/home';\r\n\r\nconst CreateFolder = ({\r\n pathname,\r\n disabled,\r\n setVisible,\r\n destinationFolder,\r\n}) => {\r\n // Not allow make new in the shared folder\r\n const isFavoriteDisabled = pathname === FAVORITE_FOLDER_PATHNAME;\r\n const isSharedDisabled =\r\n pathname === SHARED_FOLDER_PATHNAME && !destinationFolder?.editable;\r\n const disableButton = isFavoriteDisabled || isSharedDisabled || disabled;\r\n\r\n const showCreateFolderModal = () => {\r\n setVisible(true);\r\n };\r\n\r\n return (\r\n }\r\n label={Messages.newFolder}\r\n disabled={disableButton}\r\n onClick={showCreateFolderModal}\r\n />\r\n );\r\n};\r\n\r\nCreateFolder.propTypes = {\r\n pathname: PropTypes.string,\r\n};\r\n\r\nexport default injectIntl(CreateFolder);\r\n","export const MY_FOLDER_PATHNAME = '/folders/owned';\r\nexport const SHARED_FOLDER_PATHNAME = '/folders/shared';\r\nexport const FAVORITE_FOLDER_PATHNAME = '/favorite/favorite-folders';\r\n","import React from 'react';\r\nimport { useDispatch } from 'react-redux';\r\nimport { injectIntl, useIntl } from 'react-intl';\r\n\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\nimport { CustomNotification } from 'common/components';\r\nimport IconDeleteFolders from 'common/components/button/svg-icons/delete-folder.svg?react';\r\n\r\nimport Messages from 'i18n/messages/home';\r\nimport { useDispatchReloadPage } from 'hooks/useReloadPage';\r\nimport { useFolderByLevel } from 'hooks/useFolderByLevel';\r\nimport { useRemoveFolder } from 'hooks/useRemoveFolder';\r\nimport { useGridView } from 'hooks/useGridView';\r\nimport useCheckFavoriteRoute from 'hooks/useCheckFavoriteRoute';\r\nimport folderMessages from 'i18n/messages/folder';\r\n\r\nimport * as brandingActions from '@redux/branding/actions';\r\n\r\nconst DeleteFolders = (props) => {\r\n const intl = useIntl();\r\n const dispatch = useDispatch();\r\n const reloadPage = useDispatchReloadPage();\r\n\r\n //* isOwner is not correct any more\r\n const { isOwner, selectedItems, disabled } = props;\r\n const [firstSelectedItems] = selectedItems;\r\n\r\n const { currentBreadcrumb } = useFolderByLevel();\r\n const { showContentPane, clearGridSelection } = useGridView();\r\n const isFavoriteRoute = useCheckFavoriteRoute();\r\n\r\n const { showPopupConfirm } = useRemoveFolder({\r\n selectedItems,\r\n currentFolderId: currentBreadcrumb?.id,\r\n onDeleteFolderSuccess: () => {\r\n deleteSuccessCallback();\r\n },\r\n onDeleteItemSuccess: () => {\r\n deleteSuccessCallback();\r\n },\r\n });\r\n\r\n const onClick = () => {\r\n showPopupConfirm();\r\n };\r\n\r\n const deleteSuccessCallback = () => {\r\n CustomNotification.success(deleteItemsSuccessMessage);\r\n reloadPage({ clearSelection: true });\r\n showContentPane(false);\r\n if (isFavoriteRoute) {\r\n dispatch(brandingActions.getBrandingNoLoading());\r\n }\r\n };\r\n\r\n const allowDeleteFolder = () => {\r\n const isOwner = firstSelectedItems?.isOwner;\r\n const isEditable = firstSelectedItems?.editable;\r\n\r\n if (disabled) return true;\r\n\r\n if (!selectedItems.length) return true;\r\n\r\n return !isOwner && !isEditable;\r\n };\r\n\r\n const isDisable = allowDeleteFolder();\r\n\r\n const deleteItemsSuccessMessage = intl.formatMessage(\r\n folderMessages.deleteItemsSuccessMessage\r\n );\r\n\r\n return (\r\n }\r\n label={Messages.deleteFoldersRibbon}\r\n disabled={isDisable}\r\n onClick={onClick}\r\n />\r\n );\r\n};\r\n\r\nexport default injectIntl(DeleteFolders);\r\n","import React from 'react';\r\n\r\nimport { FormOutlined } from '@ant-design/icons';\r\n\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\n\r\nimport Messages from 'i18n/messages/home';\r\nimport { getFolderShortDetail } from 'services/folder';\r\nimport { useGlobalModal } from 'hooks';\r\n\r\nexport const WIDTH_CONTANT_PANE = 500;\r\n\r\nconst EditFolder = (props) => {\r\n const { selectedFolders, disabled, runFetchFolderShortContent } = props;\r\n\r\n const { MODAL_NAMES, openModal } = useGlobalModal();\r\n\r\n const checkDisableEdit = () => {\r\n if (disabled) return true;\r\n\r\n if (selectedFolders.length !== 1) return true;\r\n\r\n //* check selected folder\r\n const selectedFolder = selectedFolders[0];\r\n const isFolder = selectedFolder?.type?.toLowerCase() === 'folder';\r\n const isOwner = selectedFolder?.isOwner;\r\n const isEditable = selectedFolder?.editable;\r\n\r\n if (!isFolder) return true;\r\n\r\n return !isOwner && !isEditable;\r\n };\r\n\r\n const clickEditFolderHandler = () => {\r\n runFetchFolderShortContent(\r\n getFolderShortDetail({\r\n id: selectedFolders?.[0].id,\r\n IsLoadContent: false,\r\n })\r\n );\r\n openModal(MODAL_NAMES.EDIT_FOLDER);\r\n };\r\n\r\n return (\r\n <>\r\n }\r\n label={Messages.editFoldersRibbon}\r\n disabled={checkDisableEdit()}\r\n onClick={clickEditFolderHandler}\r\n />\r\n \r\n );\r\n};\r\n\r\nexport default EditFolder;\r\n","import React, { useState } from 'react';\r\n\r\nimport { useIsMutating } from '@tanstack/react-query';\r\n\r\nimport { injectIntl, useIntl } from 'react-intl';\r\nimport { useLocation } from 'react-router-dom';\r\n\r\nimport { Dropdown, Menu } from 'antd';\r\nimport { FolderOutlined, DownloadOutlined } from '@ant-design/icons';\r\n\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\nimport CreateFolder from '../../controls/folders/CreateFolder';\r\nimport DeleteFolders from '../../controls/folders/DeleteFolders';\r\nimport CopyFolder from '../../controls/folders/CopyFolder';\r\nimport MoveFolder from '../../controls/folders/MoveFolder';\r\nimport EditFolder from '../../controls/folders/EditFolder';\r\nimport BulkEditProduct from '../../controls/product/BulkEditProduct';\r\nimport CopyFolderModal from '../../controls/folders/CopyFolderModal';\r\nimport MoveFolderModal from '../../controls/folders/MoveFolderModal';\r\nimport ExportProductPropertiesModal from '../../modal/bulk-edit-product/ExportProductPropertiesModal';\r\nimport ImportProductBulkEditModal from '../../modal/bulk-edit-product/ImportProductBulkEditModal';\r\nimport CreateFolderModal from '../../controls/folders/CreateFolderModal';\r\nimport { CustomNotification } from 'common/components';\r\nimport FolderEditModal from 'pages/folders/components/modal/FolderEditModal';\r\n\r\nimport { Can } from 'context/Can';\r\n\r\nimport { useCheckPermissions } from 'hooks/useCheckPermissions';\r\nimport useCheckIsFolderOwner from 'hooks/useCheckIsFolderOwner';\r\nimport { useFolderByLevel } from 'hooks/useFolderByLevel';\r\nimport {\r\n usePermissionEditSharedProduct,\r\n useCheckIsSuperAdmin,\r\n useGlobalModal,\r\n useFetch,\r\n} from 'hooks';\r\nimport { useDispatchReloadPage } from 'hooks/useReloadPage';\r\nimport {\r\n EXPORT_PRODUCT_PROPERTIES,\r\n useExportProductProperty,\r\n} from '../../modal/bulk-edit-product/hook';\r\n\r\nimport { sleep } from 'utils/delay';\r\n\r\nimport messagesFolder from 'i18n/messages/folder';\r\nimport Messages from 'i18n/messages/home';\r\nimport messagesProduct from 'i18n/messages/product';\r\n\r\nimport {\r\n ABILITY_ACTION,\r\n ABILITY_SUBJECT,\r\n PERMISSION_EDIT_PRODUCTS,\r\n} from 'static/Permission';\r\nimport { ROOT_FOLDER } from 'pages/folders/controllers/constants';\r\nimport { IMPORT_PRODUCT_FOR_BULK_EDITING } from 'services/product/endpoints';\r\n\r\nimport './FolderSection.less';\r\n\r\nconst { SubMenu } = Menu;\r\n\r\nconst FolderSection = (props) => {\r\n const { selectedItems } = props;\r\n\r\n const { pathname } = useLocation();\r\n\r\n const intl = useIntl();\r\n\r\n const [copyFolderModalVisible, setCopyFolderVisible] = useState(false);\r\n const [moveFolderModalVisible, setMoveFolderVisible] = useState(false);\r\n\r\n const { MODAL_NAMES, checkModalVisible, closeModal } = useGlobalModal();\r\n\r\n const { data: response, run: runFetchFolderShortContent } = useFetch();\r\n\r\n const reloadPage = useDispatchReloadPage();\r\n\r\n const visibleModalHook = useState(false);\r\n const [visible, setVisible] = visibleModalHook;\r\n\r\n const exportProductPropertyMutation = useExportProductProperty();\r\n\r\n const isExportProductPropertyLoading = useIsMutating({\r\n mutationKey: EXPORT_PRODUCT_PROPERTIES,\r\n });\r\n\r\n const onCreateFolderSuccess = () => {\r\n CustomNotification.success(\r\n intl.formatMessage(messagesFolder.createFolderSuccess)\r\n );\r\n reloadPage();\r\n };\r\n\r\n const isExportProductModalOpen = checkModalVisible(\r\n MODAL_NAMES.EXPORT_PROPERTY_MODAL\r\n );\r\n\r\n const isImportProductModalOpen = checkModalVisible(\r\n MODAL_NAMES.IMPORT_PROPERTY_MODAL\r\n );\r\n\r\n const isEditFolderOpen = checkModalVisible(MODAL_NAMES.EDIT_FOLDER);\r\n\r\n const checkDisabledBulkEditProductBtn = () => {\r\n const isAllowActionsPim =\r\n isSuperAdmin ||\r\n hasPermissionEditProducts ||\r\n hasPermissionEditSharedProduct;\r\n\r\n return !isAllowActionsPim;\r\n };\r\n\r\n const checkDisableExportBulkProduct = () => {\r\n const isFolderContainProduct =\r\n selectedFolders.length > 0 &&\r\n selectedFolders?.every((folderItem) => {\r\n return !!folderItem.productCount;\r\n });\r\n const isProductsSelected = selectedProductIds.length > 0;\r\n\r\n const isValidItemSelected = isFolderContainProduct || isProductsSelected;\r\n\r\n //* checking for enable cases is easier\r\n const shouldEnable = isValidItemSelected;\r\n\r\n return !shouldEnable;\r\n };\r\n\r\n const checkDisableCopyFolder = () => {\r\n //* only support coping single folder\r\n if (selectedFolders?.length !== 1) return true;\r\n\r\n return false;\r\n };\r\n\r\n const checkDisableMoveFolder = () => {\r\n const disabled = selectedFolders.some((folder) => {\r\n const isSharedFolder = !folder.isOwner;\r\n const isEditable = folder.editable;\r\n\r\n //* disable when there is a folder that shared and editable = false\r\n return isSharedFolder && !isEditable;\r\n });\r\n\r\n return disabled;\r\n };\r\n\r\n const closeCopyModal = () => {\r\n setCopyFolderVisible(false);\r\n };\r\n\r\n const closeMoveModal = () => {\r\n setMoveFolderVisible(false);\r\n };\r\n\r\n const getSelectedFolders = () => {\r\n return selectedItems.filter((item) => item.type.toLowerCase() === 'folder');\r\n };\r\n const getSelectedFolderIds = () => {\r\n return selectedFolders.map((item) => item.id);\r\n };\r\n const getSelectedProductIds = () => {\r\n return selectedItems.reduce((accumulator, currentItem) => {\r\n const isProduct = currentItem.type.toLowerCase() === 'product';\r\n\r\n if (!isProduct) return accumulator;\r\n\r\n return [...accumulator, currentItem.id];\r\n }, []);\r\n };\r\n\r\n const onSaveEditModalSuccess = async () => {\r\n await sleep(200);\r\n closeModal(MODAL_NAMES.EDIT_FOLDER);\r\n reloadPage({ clearSelection: true });\r\n };\r\n\r\n const selectedFolders = getSelectedFolders();\r\n const selectedFolder = selectedItems?.length === 1 && selectedFolders[0];\r\n const selectedFolderIds = getSelectedFolderIds();\r\n const selectedProductIds = getSelectedProductIds();\r\n\r\n const isOwner = useCheckIsFolderOwner();\r\n const isSuperAdmin = useCheckIsSuperAdmin();\r\n const hasPermissionEditSharedProduct = usePermissionEditSharedProduct();\r\n const hasPermissionEditProducts = useCheckPermissions(\r\n PERMISSION_EDIT_PRODUCTS\r\n );\r\n\r\n const { currentBreadcrumb } = useFolderByLevel();\r\n\r\n const destinationFolder = selectedFolder\r\n ? selectedFolder\r\n : currentBreadcrumb?.id !== ROOT_FOLDER\r\n ? currentBreadcrumb\r\n : null;\r\n\r\n const isDisabledBulkEditProductBtn = checkDisabledBulkEditProductBtn();\r\n const isDisabledExportBulkEditProduct = checkDisableExportBulkProduct();\r\n const isDisabledCopyFolder = checkDisableCopyFolder();\r\n const isDisabledMoveFolder = checkDisableMoveFolder();\r\n\r\n const onExportProductProperty = (exportProperties, allPopulated) => {\r\n exportProductPropertyMutation.mutate({\r\n productIds: selectedProductIds,\r\n folderIds: selectedFolderIds,\r\n selectedColumns: exportProperties,\r\n allPopulated,\r\n });\r\n };\r\n\r\n const menuOptions = (\r\n \r\n \r\n \r\n {(allowed) => (\r\n \r\n )}\r\n \r\n \r\n\r\n \r\n \r\n {(allowed) => {\r\n return (\r\n \r\n );\r\n }}\r\n \r\n \r\n\r\n \r\n \r\n {(allowed) => (\r\n \r\n )}\r\n \r\n \r\n\r\n \r\n \r\n {(allowed) => (\r\n setCopyFolderVisible(true)}\r\n />\r\n )}\r\n \r\n \r\n \r\n \r\n {(allowed) => (\r\n setMoveFolderVisible(true)}\r\n />\r\n )}\r\n \r\n \r\n }\r\n disabled={isDisabledBulkEditProductBtn}\r\n label={messagesProduct.bulkEditProduct}\r\n />\r\n }\r\n >\r\n \r\n \r\n \r\n );\r\n return (\r\n <>\r\n \r\n }\r\n label={Messages.folderActions}\r\n />\r\n \r\n \r\n \r\n {isExportProductModalOpen && (\r\n closeModal(MODAL_NAMES.EXPORT_PROPERTY_MODAL)}\r\n />\r\n )}\r\n {isImportProductModalOpen && (\r\n closeModal(MODAL_NAMES.IMPORT_PROPERTY_MODAL)}\r\n />\r\n )}\r\n {visible && (\r\n \r\n )}\r\n {isEditFolderOpen ? (\r\n closeModal(MODAL_NAMES.EDIT_FOLDER)}\r\n onSaveSuccess={onSaveEditModalSuccess}\r\n folderInfo={response?.data}\r\n idSelected={selectedFolders?.[0]?.id}\r\n />\r\n ) : null}\r\n \r\n );\r\n};\r\n\r\nexport default injectIntl(FolderSection);\r\n","import React from 'react';\r\nimport { useSelector } from 'react-redux';\r\n\r\nimport { FolderOpenOutlined } from '@ant-design/icons';\r\n\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\n\r\nimport gridSelector from 'common/components/grid-view/controllers/selectors';\r\nimport * as folderSelectors from 'pages/folders/controllers/selectors';\r\n\r\nimport { forwardTo } from 'utils/common/route';\r\n\r\nimport Messages from 'i18n/messages/home';\r\n\r\nconst OpenFolder = () => {\r\n const selectedItems = useSelector(\r\n gridSelector.makeSelectDetailCurrentITemsSelection()\r\n );\r\n\r\n const selectedFolder =\r\n selectedItems.length === 1 &&\r\n selectedItems[0].type.toLowerCase() === 'folder'\r\n ? selectedItems[0]\r\n : null;\r\n\r\n const { folderBreadcrumb } = useSelector(\r\n folderSelectors.selectFolderListByLevel()\r\n );\r\n\r\n const onClickOpenFolderDetail = () => {\r\n forwardTo(`/folder/${folderId}`);\r\n };\r\n\r\n const getFolderId = () => {\r\n //* no select anything\r\n if (!selectedItems.length) {\r\n return currentFolder?.id === 'home' ? null : currentFolder?.id;\r\n }\r\n\r\n if (selectedFolder)\r\n //* select folder\r\n return selectedFolder.id;\r\n\r\n //* select another item type, prevent opening\r\n if (selectedItems.length > 0 && !selectedFolder) return null;\r\n };\r\n\r\n const currentFolder = folderBreadcrumb[folderBreadcrumb?.length - 1];\r\n const folderId = getFolderId();\r\n\r\n return (\r\n }\r\n label={Messages.openFolder}\r\n onClick={onClickOpenFolderDetail}\r\n disabled={!folderId}\r\n />\r\n );\r\n};\r\n\r\nexport default OpenFolder;\r\n","import React, { useState } from 'react';\r\nimport { useSelector } from 'react-redux';\r\n\r\nimport { DownloadOutlined } from '@ant-design/icons';\r\n\r\nimport { DownloadFolderModal } from 'common/components';\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\n\r\nimport gridSelector from 'common/components/grid-view/controllers/selectors';\r\nimport * as folderSelectors from 'pages/folders/controllers/selectors';\r\n\r\nimport Messages from 'i18n/messages/home';\r\n\r\nconst DownloadFolder = () => {\r\n const [downloadModalVisible, setDownloadModalVisible] = useState(false);\r\n\r\n const selectedItems = useSelector(\r\n gridSelector.makeSelectDetailCurrentITemsSelection()\r\n );\r\n\r\n const selectedFolder =\r\n selectedItems.length === 1 &&\r\n selectedItems[0].type.toLowerCase() === 'folder'\r\n ? selectedItems[0]\r\n : null;\r\n\r\n const { folderBreadcrumb } = useSelector(\r\n folderSelectors.selectFolderListByLevel()\r\n );\r\n\r\n const onClick = () => {\r\n setDownloadModalVisible(true);\r\n };\r\n\r\n const getFolderId = () => {\r\n //* no select anything\r\n if (!selectedItems.length) {\r\n return currentFolder?.id === 'home' ? null : currentFolder?.id;\r\n }\r\n\r\n if (selectedFolder)\r\n //* select folder\r\n return selectedFolder.id;\r\n\r\n //* select another item type, prevent opening\r\n if (selectedItems.length > 0 && !selectedFolder) return null;\r\n };\r\n\r\n const closeDownloadModalVisible = () => {\r\n setDownloadModalVisible(false);\r\n };\r\n\r\n const currentFolder = folderBreadcrumb[folderBreadcrumb?.length - 1];\r\n const folderId = getFolderId();\r\n\r\n return (\r\n <>\r\n }\r\n label={Messages.downloadFolder}\r\n onClick={onClick}\r\n disabled={!folderId}\r\n />\r\n \r\n \r\n );\r\n};\r\n\r\nexport default DownloadFolder;\r\n","import React from 'react';\r\nimport { useSelector } from 'react-redux';\r\n\r\nimport { ViewLayout, AdvanceStack } from 'pages/home/ribbon/components';\r\nimport { RibbonBar, RibbonDivider } from 'common/components';\r\nimport DetailSection from 'pages/home/ribbon/components/sections/home-grid/DetailSection';\r\nimport ManageSharingSection from 'pages/home/ribbon/components/sections/shared/ManageSharingSection';\r\nimport FolderSection from 'pages/home/ribbon/components/sections/folder/FolderSection';\r\nimport OpenFolder from 'pages/home/ribbon/components/controls/folders/OpenFolder';\r\nimport DownloadFolder from 'pages/home/ribbon/components/controls/folders/DownloadFolder';\r\nimport ManageScheduleDownload from 'pages/home/ribbon/components/controls/folders/ManageScheduleDownload';\r\nimport Addition from './components/sections/home-grid/AdditionSection';\r\nimport ShareSection from './components/sections/shared/ShareSection';\r\nimport BackControl from './components/controls/home/Back';\r\n\r\nimport gridSelector from 'common/components/grid-view/controllers/selectors';\r\nimport * as ribbonSelectors from '@redux/ribbon/selectors';\r\n\r\nimport { useCheckPermissions } from 'hooks/useCheckPermissions';\r\nimport { useFolderByLevel } from 'hooks/useFolderByLevel';\r\nimport { useGridView } from 'hooks/useGridView';\r\n\r\nimport { PERMISSION_VIEW_ADVANCED_FILTER_IN_FOLDER } from 'static/Permission';\r\nimport { RIBBON_TYPES } from 'static/Constants';\r\nimport './Folder.less';\r\n\r\n// const productsForMember = 'products/member';\r\n// const assetsForMember = 'assets/member';\r\n\r\nconst FoldersGridRibbon = () => {\r\n const { keepFolderBreadcrumb, showGridLoading } = useFolderByLevel();\r\n const { togglePreventCallApiGridView } = useGridView();\r\n\r\n const selectedItems = useSelector(\r\n gridSelector.makeSelectDetailCurrentITemsSelection()\r\n );\r\n\r\n const closeDetailStack = useSelector(\r\n ribbonSelectors.selectCloseDetailStack()\r\n );\r\n\r\n // const isBackToMemberProfile =\r\n // pathname.includes(productsForMember) || pathname.includes(assetsForMember);\r\n // const isReportingsBack = pathname.includes('/reporting');\r\n\r\n const hasPermissionViewAdvancedFilter = useCheckPermissions(\r\n PERMISSION_VIEW_ADVANCED_FILTER_IN_FOLDER\r\n );\r\n\r\n const onChangeView = (typeView) => {\r\n //* not for detail view\r\n if (typeView === RIBBON_TYPES.DETAILSVIEW) return;\r\n\r\n //* show loading instantly because the loading in the grid shows up after the items change type\r\n showGridLoading();\r\n\r\n //* set keepFolderBreadcrumb to true for preventing clear breadcrumb in useEffect in folder gird\r\n keepFolderBreadcrumb(true);\r\n\r\n //* let useEffect call api\r\n togglePreventCallApiGridView(false);\r\n };\r\n const selectedFolder =\r\n selectedItems.length === 1 &&\r\n selectedItems[0].type.toLowerCase() === 'folder'\r\n ? selectedItems[0]\r\n : null;\r\n\r\n const pathname = window.location.pathname;\r\n const isFavoriteView = pathname === '/favorite/favorite-folders';\r\n const isDisabledCloseDetail =\r\n window.location.search !== '?query=1' ||\r\n closeDetailStack?.name !== 'query' ||\r\n closeDetailStack?.stack.length < 2;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default FoldersGridRibbon;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { RibbonBar } from 'common/components';\r\nimport ManageSharingSection from './components/sections/shared/ManageSharingSection';\r\nimport DetailSection from './components/sections/home-grid/DetailSection';\r\nimport BackControl from './components/controls/home/Back';\r\n\r\nimport { ViewLayout, AdvanceStack } from './components';\r\nimport { HIDE_CLOSE_DETAIL_BUTTON } from 'static/Constants';\r\nimport { DISABLE_SHOW_PREVIEW_IN_HOME_RIBBON } from 'static/Constants';\r\n// const productsForMember = 'products/member';\r\n// const assetsForMember = 'assets/member';\r\n\r\nconst Home = () => {\r\n const pathname = window.location.pathname;\r\n // const isBackToMemberProfile =\r\n // pathname.includes(productsForMember) || pathname.includes(assetsForMember);\r\n // const isReportingsBack = pathname.includes('/reporting');\r\n\r\n const isDisableShowPreview = DISABLE_SHOW_PREVIEW_IN_HOME_RIBBON.some(\r\n (substring) => pathname.includes(substring)\r\n );\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n {!HIDE_CLOSE_DETAIL_BUTTON.includes(window.location.pathname) && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nHome.propTypes = {\r\n onSearch: PropTypes.func,\r\n toggleSearch: PropTypes.bool,\r\n};\r\n\r\nexport default Home;\r\n","import React from 'react';\r\n\r\nimport { useHistory } from 'react-router-dom';\r\n\r\nimport { SafetyCertificateOutlined } from '@ant-design/icons';\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\nimport useToggleActiveRibbon from './hook';\r\n\r\nimport { useGetProductFullView } from 'hooks';\r\nimport { useSsoProductParams } from 'hooks/useSso';\r\n\r\nimport Messages from 'i18n/messages/home';\r\n\r\nconst Subscription = ({ productId }) => {\r\n const history = useHistory();\r\n\r\n const { productFull } = useGetProductFullView({ productId });\r\n\r\n const { ssoParamUrl: ssoProductParams, productId: ssoProductId } =\r\n useSsoProductParams();\r\n\r\n const checkActiveContent = () => {\r\n const path = history?.location?.pathname;\r\n const regex = /\\/product\\/subscription\\/\\d+$/;\r\n return regex.test(path);\r\n };\r\n\r\n const isPathActive = checkActiveContent();\r\n const isActive = useToggleActiveRibbon(isPathActive);\r\n\r\n const handleClick = () => {\r\n if (productFull?.productId !== undefined) {\r\n if (isActive) {\r\n if (ssoProductParams) {\r\n history.push(`/product/${ssoProductId}/?${ssoProductParams}`);\r\n } else {\r\n history.push(`/product/${productFull?.productId}`);\r\n }\r\n } else {\r\n if (ssoProductParams) {\r\n history.push(\r\n `/product/subscription/${ssoProductId}?${ssoProductParams}`\r\n );\r\n } else {\r\n history.push(`/product/subscription/${productFull?.productId}`);\r\n }\r\n }\r\n }\r\n };\r\n\r\n return (\r\n }\r\n label={Messages.subscription}\r\n onClick={handleClick}\r\n toggle={isPathActive}\r\n disabled={!productFull?.productId}\r\n />\r\n );\r\n};\r\n\r\nexport default Subscription;\r\n","import React, { useState, useEffect } from 'react';\r\nimport { useParams } from 'react-router-dom';\r\n\r\nimport { Row, Col, Typography } from 'antd';\r\n\r\nimport {\r\n StyledModal,\r\n SectionWrapper,\r\n BasicFormItemList,\r\n FullWidthSpace,\r\n WithLoading,\r\n Form,\r\n CustomNotification,\r\n} from 'common/components';\r\nimport AddAssetPimModal from 'pages/product-full-view/components/modal/add-asset-pim-modal';\r\n\r\nimport { useGetQaPackagingFormDefine } from 'pages/qa-spec/components/qa-packaging/hooks';\r\nimport {\r\n useGetQaPackagingTabData,\r\n useSaveQaPackagingTab,\r\n} from 'pages/qa-spec/components/qa-packaging/queries';\r\nimport { useGetProductItemModules } from 'pages/product-full-view/components/product-new-detail-view/queries';\r\n\r\nimport {\r\n getCertificateParams,\r\n parsePackagingData,\r\n} from 'pages/qa-spec/components/qa-packaging/utils';\r\nimport useUpdateIXONEShield from 'common/components/product-add/useUpdateIXONEShield';\r\nimport {\r\n IXONECertificationWrapper,\r\n TYPE_VIEW,\r\n} from 'common/components/product-add/IXONECertificationWrapper';\r\nimport { useGetProductVersionList } from 'pages/product-history/hook';\r\nimport { useCheckAllowEditProducts } from 'hooks';\r\n\r\nconst ProductPackagingModal = (props) => {\r\n const [formInst] = Form.useForm();\r\n const { productId, id } = useParams();\r\n\r\n const { visible, closeModal, isQASpecLocked, productFull } = props;\r\n\r\n const [uploadModalTitle, setUploadModalTitle] = useState('');\r\n const [uploadDocumentModalVisible, setUploadDocumentModalVisible] =\r\n useState(false);\r\n\r\n const { checkAllowEditProductFull } = useCheckAllowEditProducts();\r\n\r\n const isAllowEditProduct = checkAllowEditProductFull(productFull);\r\n\r\n const _productId = productId || id;\r\n\r\n const { handleUpdateIXONEShield } = useUpdateIXONEShield();\r\n const { refetchDataProductModules } = useGetProductItemModules(id);\r\n\r\n const { data, isLoading: loading } = useGetQaPackagingTabData(\r\n { productId: _productId },\r\n { enabled: !!visible, retry: false }\r\n );\r\n\r\n const { handleRefetchProductVersioning } = useGetProductVersionList({\r\n enabled: false,\r\n });\r\n\r\n const {\r\n formProductDefine,\r\n formLeftBottomDefine,\r\n formProductClaimFirstSectionDefine,\r\n formRightSecondSection,\r\n formDietaryThirdSectionDefine,\r\n formRightFourthSectionDefine,\r\n } = useGetQaPackagingFormDefine({\r\n handleToggleUploadDocumentModal: () => {\r\n handleToggleUploadDocumentModal();\r\n },\r\n setUploadModalTitle,\r\n productFull,\r\n });\r\n const handleSaveQaPackagingTab = useSaveQaPackagingTab();\r\n const { isLoading: saveLoading } = handleSaveQaPackagingTab;\r\n\r\n const handleToggleUploadDocumentModal = () => {\r\n setUploadDocumentModalVisible((prev) => !prev);\r\n };\r\n\r\n const handleSave = async (ixoneIgnore, fieldList) => {\r\n formInst\r\n .validateFields()\r\n .then(async (values) => {\r\n const certificateParams = getCertificateParams(values);\r\n\r\n const ixOneIgnoreParams =\r\n ixoneIgnore === 'ignore'\r\n ? { ixOneIgnore: ixoneIgnore, IxOneIgnoreFields: fieldList }\r\n : {};\r\n\r\n const formData = {\r\n ...values,\r\n ...certificateParams,\r\n ...ixOneIgnoreParams,\r\n };\r\n\r\n handleSaveQaPackagingTab.mutate(\r\n {\r\n productId: _productId,\r\n formData: formData,\r\n },\r\n {\r\n onSuccess: async () => {\r\n if (ixoneIgnore === 'continue') {\r\n await handleUpdateIXONEShield(ixoneIgnore);\r\n }\r\n\r\n handleRefetchProductVersioning();\r\n closeModal && closeModal();\r\n refetchDataProductModules();\r\n },\r\n }\r\n );\r\n })\r\n .catch((e) => {\r\n if (e?.errorFields?.length > 0) {\r\n CustomNotification.error('Please resolve errors.');\r\n }\r\n });\r\n };\r\n const onCancel = () => {\r\n const parsedData = parsePackagingData(data);\r\n formInst.setFieldsValue(parsedData);\r\n closeModal && closeModal();\r\n };\r\n\r\n const onFormChange = (changedValues, allValues) => {\r\n if (\r\n changedValues.hasOwnProperty('recyclable') &&\r\n (changedValues?.recyclable === 'No' || !changedValues?.recyclable)\r\n ) {\r\n formInst.setFieldsValue({ recyclableTypes: [] });\r\n }\r\n if (\r\n changedValues.hasOwnProperty('bilingual') &&\r\n (changedValues?.bilingual === 'No' || !changedValues?.bilingual)\r\n ) {\r\n formInst.setFieldsValue({ secondaryLanguage: [] });\r\n }\r\n };\r\n\r\n const parsedData = parsePackagingData(data);\r\n\r\n useEffect(() => {\r\n formInst.setFieldsValue(parsedData);\r\n }, [JSON.stringify(data)]);\r\n\r\n return (\r\n {\r\n handleSave(ixoneIgnore, fieldList);\r\n }}\r\n showModal\r\n type={TYPE_VIEW.EDIT_PRODUCT}\r\n onCancel={onCancel}\r\n >\r\n {(handleConfirmIXONE) => (\r\n {\r\n handleConfirmIXONE({\r\n originalData: parsedData,\r\n changedFields: await formInst.validateFields(),\r\n });\r\n }}\r\n >\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n {uploadDocumentModalVisible && (\r\n \r\n )}\r\n \r\n
\r\n
\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nconst labelFn = (labelText) => {\r\n return {labelText && labelText};\r\n};\r\n\r\nexport default ProductPackagingModal;\r\n","import React, { useState } from 'react';\r\n\r\nimport { LockOutlined } from '@ant-design/icons';\r\n\r\nimport { RibbonButton } from 'common/components';\r\nimport ProductPackagingModal from '../../modal/product-packaging/ProductPackagingModal';\r\n\r\nimport Messages from 'i18n/messages/home';\r\nimport { useCheckQaSpecLocked } from 'pages/qa-spec/hooks/useCheckQaSpecLocked';\r\n\r\nconst ProductPackaging = ({ productFull }) => {\r\n const [modalVisible, setModalVisible] = useState(false);\r\n\r\n const closeModal = () => {\r\n setModalVisible(false);\r\n };\r\n\r\n const onClick = () => {\r\n setModalVisible(true);\r\n };\r\n\r\n const { isQASpecLocked } = useCheckQaSpecLocked();\r\n\r\n return (\r\n <>\r\n \r\n ) : (\r\n \r\n )\r\n }\r\n label={Messages.productPackaging}\r\n onClick={onClick}\r\n />\r\n \r\n \r\n );\r\n};\r\n\r\nexport default ProductPackaging;\r\n","import React from 'react';\r\nimport { CopyOutlined } from '@ant-design/icons';\r\nimport messages from 'i18n/messages/home';\r\nimport { RibbonButton } from 'common/components';\r\nimport { useGlobalModal } from 'hooks';\r\n\r\nfunction ProductClone({ isDisabled }) {\r\n const { openModal, MODAL_NAMES } = useGlobalModal();\r\n\r\n return (\r\n <>\r\n }\r\n label={messages.productClone}\r\n onClick={() => openModal(MODAL_NAMES.COPY_PRODUCT_MODAL)}\r\n disabled={isDisabled}\r\n className='button-item-dropdown'\r\n />\r\n \r\n );\r\n}\r\n\r\nexport default ProductClone;\r\n","import React from 'react';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { HistoryOutlined } from '@ant-design/icons';\r\nimport Messages from 'i18n/messages/home';\r\nimport useToggleActiveRibbon from './hook';\r\nimport { forwardTo } from 'utils/common/route';\r\nimport { RibbonButton } from 'common/components';\r\n\r\nconst SyndicationHistorySection = (props) => {\r\n const { disabled, productFull } = props;\r\n\r\n const history = useHistory();\r\n\r\n const checkActiveContent = () => {\r\n const path = history?.location?.pathname;\r\n const regex = /\\/product\\/\\d+\\/mapping$/;\r\n\r\n return regex.test(path);\r\n };\r\n\r\n const isPathActive = checkActiveContent();\r\n const isActive = useToggleActiveRibbon(isPathActive);\r\n\r\n const handleClickToSyndicationHistory = () => {\r\n forwardTo(`/product/syndication-history/${productFull?.productId}`);\r\n };\r\n\r\n return (\r\n }\r\n label={Messages.syndicationHistory}\r\n onClick={handleClickToSyndicationHistory}\r\n disabled={disabled}\r\n toggle={isActive}\r\n className='button-item-dropdown'\r\n />\r\n );\r\n};\r\n\r\nexport default SyndicationHistorySection;\r\n","import React, { useState } from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\n\r\nimport { SyncOutlined } from '@ant-design/icons';\r\nimport { RibbonButton, CustomNotification } from 'common/components';\r\n\r\nimport * as productFullViewActions from 'pages/product-full-view/controllers/actions';\r\nimport * as productFullViewSelectors from 'pages/product-full-view/controllers/selectors';\r\n\r\nimport * as mappingServices from 'services/mapping';\r\n\r\nimport { sleep } from 'utils/delay';\r\nimport { useHandleReloadPage } from 'hooks/useReloadPage';\r\n\r\nconst MappingInitSyncSection = () => {\r\n const dispatch = useDispatch();\r\n\r\n const [loading, setLoading] = useState(false);\r\n\r\n const [__, setReloadPage] = useHandleReloadPage();\r\n\r\n const selectedMappingSupportMem = useSelector(\r\n productFullViewSelectors.makeSelectSelectedMappingSupportMem()\r\n );\r\n\r\n const mappingMetaInfo = useSelector(\r\n productFullViewSelectors.makeSelectMappingMetadata()\r\n );\r\n\r\n const productHierarchyInfo = useSelector(\r\n productFullViewSelectors.makeSelectCurrentHierarchy()\r\n );\r\n\r\n const mappingId = mappingMetaInfo?.data?.mappingId;\r\n const hierarchyId = productHierarchyInfo?.productHierarchyId;\r\n\r\n const handleClick = async () => {\r\n if (selectedMappingSupportMem.length === 0) {\r\n return;\r\n }\r\n\r\n try {\r\n setLoading(true);\r\n\r\n const respone = await mappingServices.initProductMapping({\r\n hierarchyId,\r\n mappingIds: [mappingId],\r\n memberIds: selectedMappingSupportMem,\r\n });\r\n\r\n setLoading(false);\r\n const { isSuccess } = respone;\r\n\r\n if (isSuccess) {\r\n CustomNotification.success('Successfully init product mapping');\r\n const params = {\r\n mappingId,\r\n hierarchyId,\r\n };\r\n\r\n await sleep(2000);\r\n dispatch(productFullViewActions.getMappingMetadata(params));\r\n dispatch(productFullViewActions.reloadMappingSupportMemGrid());\r\n setReloadPage();\r\n }\r\n } catch (e) {\r\n setLoading(false);\r\n CustomNotification.error('Fail to init product mapping!');\r\n }\r\n };\r\n\r\n return (\r\n }\r\n label='Init mapping'\r\n onClick={handleClick}\r\n loading={loading}\r\n disabled={selectedMappingSupportMem?.length <= 0 || !hierarchyId}\r\n className='button-item-dropdown'\r\n />\r\n );\r\n};\r\n\r\nexport default MappingInitSyncSection;\r\n","import React, { useState } from 'react';\r\n\r\nimport { useIntl } from 'react-intl';\r\n\r\nimport { useSelector } from 'react-redux';\r\n\r\nimport { useLocation } from 'react-router-dom';\r\n\r\nimport { Divider, Dropdown, Menu } from 'antd';\r\n\r\nimport {\r\n SubnodeOutlined,\r\n DownloadOutlined,\r\n EditOutlined,\r\n} from '@ant-design/icons';\r\n\r\nimport { RibbonButton, DownloadFormItem } from 'common/components';\r\nimport DownloadNifFormSection from 'pages/home/ribbon/components/sections/product/DownloadNifFormSection';\r\nimport AssignCategoryToProduct from 'pages/home/ribbon/components/sections/product/AssignCategoryToProduct';\r\n\r\nimport ProductClone from './ProductClone';\r\nimport SyndicationSectionHistory from './SyndicationHistorySection';\r\nimport MappingInitSyncSection from './MappingInitSyncSection';\r\nimport ProductSheets from './ProductSheets';\r\nimport BulkEditProduct from '../product/BulkEditProduct';\r\n\r\nimport HistoryEntity from 'pages/home/ribbon/form-manange/components/form-history-grid/HistoryEntity';\r\n\r\nimport GDSNPublication from 'common/components/product-publication-setup/GDSNPublication';\r\nimport PostToWalmart from 'common/components/product-publication-setup/PostToWalmart';\r\nimport CreateProductViaFormModal from 'common/components/product-add/CreateProductViaFormModal';\r\nimport { OverlayActionMenuList } from 'pages/home/ribbon/components/sections/product/components/overlay-action-dropdown';\r\nimport WithdrawPublicationButton from '../product/WithdrawPublicationButton';\r\n\r\nimport AssignCategoryToProductModal from '../product/AssignCategoryToProductModal';\r\nimport CopyProductPropertiesModal from '../../modal/bulk-edit-product/CopyProductPropertiesModal';\r\nimport ImportProductBulkEditModal from '../../modal/bulk-edit-product/ImportProductBulkEditModal';\r\nimport ExportProductPropertiesModal from '../../modal/bulk-edit-product/ExportProductPropertiesModal';\r\nimport PublicationSetupModal from 'common/components/product-publication-setup/PublicationSetupModal';\r\nimport PublicationValidationView from 'pages/branded-products/components/publication-validation-view/PublicationValidationView';\r\nimport BulkProductOverlay from '../../sections/product/components/bulk-product-overlay-dropdown/BulkProductOverlay';\r\n\r\nimport { CanShow } from 'common/components/wrapper/show-condition';\r\n\r\nimport { useCheckPermissionAnd } from 'hooks/useCheckPermissions';\r\nimport { useIsMutating } from '@tanstack/react-query';\r\n\r\nimport {\r\n EXPORT_PRODUCT_PROPERTIES,\r\n useExportProductOverlayProperty,\r\n useExportProductProperty,\r\n EXPORT_PRODUCT_OVERLAY_PROPERTIES,\r\n useGetLatestProductFullViewInBulkEdit,\r\n} from '../../modal/bulk-edit-product/hook';\r\n\r\nimport {\r\n useCheckIsSuperAdmin,\r\n useCheckAllowEditProducts,\r\n useCheckMemberSupplier,\r\n useCheckIsSuperMember,\r\n useGlobalModal,\r\n} from 'hooks';\r\nimport { useCheckPermissions } from 'hooks/useCheckPermissions';\r\nimport { useCheckDisableWithdrawPublicationModal } from 'hooks';\r\nimport { useCheckDisabledBulkProductOverlay } from '../../sections/product/components/bulk-product-overlay-dropdown/useCheckDisabledBulkProductOverlay';\r\n\r\nimport {\r\n ABILITY_ACTION,\r\n ABILITY_SUBJECT,\r\n PERMISSION_VIEW_NEW_ITEM_FORMS,\r\n} from 'static/Permission';\r\n\r\nimport { Can } from 'context/Can';\r\n\r\nimport messages from 'i18n/messages/home';\r\nimport messagesProduct from 'i18n/messages/product';\r\n\r\nimport * as ssoProductSelectors from 'pages/sso-product/controllers/selectors';\r\n\r\nimport IXOneSection from '../../sections/product/IXOneSection';\r\nimport useCheckIXOneCapture from 'hooks/useCheckIXOneCapture';\r\nimport MakeProductActive from '../../sections/product/MakeProductActive';\r\nimport { checkDeployEnv } from 'utils/checkDeployEnv';\r\nimport { SECURE_CONFIG } from 'utils/SecureRoute';\r\n\r\nimport { IMPORT_PRODUCT_FOR_BULK_EDITING } from 'services/product/endpoints';\r\nimport { UPLOAD_OVERLAYS_BULK_TEMPLATE } from 'services/overlay/endpoints';\r\n\r\nimport { PRODUCT_VIEW } from 'static/Constants';\r\n\r\nconst sectionAfterProductSlashIdRegex = /[^\\/product\\/(0-9)][a-z]*/g;\r\n\r\nconst { SubMenu } = Menu;\r\n\r\nconst ProductFullAction = ({ productFull, productId }) => {\r\n const location = useLocation();\r\n\r\n const intl = useIntl();\r\n\r\n const [requestParams, setRequestParams] = useState(null);\r\n\r\n const { checkModalVisible, MODAL_NAMES, openModal, closeModal } =\r\n useGlobalModal();\r\n\r\n const { getLatestFullViewData, getLatestFullViewDataOverlay } =\r\n useGetLatestProductFullViewInBulkEdit({ productId });\r\n\r\n const exportProductPropertyMutation = useExportProductProperty();\r\n\r\n const exportProductOverlayPropertyMutation =\r\n useExportProductOverlayProperty();\r\n\r\n const isExportProductPropertyLoading = useIsMutating({\r\n mutationKey: EXPORT_PRODUCT_PROPERTIES,\r\n });\r\n\r\n const isExportProductOverlayPropertyLoading = useIsMutating({\r\n mutationKey: EXPORT_PRODUCT_OVERLAY_PROPERTIES,\r\n });\r\n\r\n const isAssignCategoryModalOpen = checkModalVisible(\r\n MODAL_NAMES.ASSIGN_CATEGORY_TO_PRODUCT\r\n );\r\n const isAddEditModalOpen = checkModalVisible(\r\n MODAL_NAMES.ADD_EDIT_PRODUCT_MODAL\r\n );\r\n const isCopyProductModalOpen = checkModalVisible(\r\n MODAL_NAMES.COPY_PRODUCT_MODAL\r\n );\r\n const isExportProductPropertyModalOpen = checkModalVisible(\r\n MODAL_NAMES.EXPORT_PROPERTY_MODAL\r\n );\r\n const isExportProductOverlayPropertyModalOpen = checkModalVisible(\r\n MODAL_NAMES.EXPORT_BULK_PRODUCT_OVERLAY\r\n );\r\n\r\n const isImportProductPropertyModalOpen = checkModalVisible(\r\n MODAL_NAMES.IMPORT_PROPERTY_MODAL\r\n );\r\n\r\n const isImportProductOverlayModalOpen = checkModalVisible(\r\n MODAL_NAMES.IMPORT_BULK_PRODUCT_OVERLAY\r\n );\r\n\r\n const isPublicationSetupModalOpen = checkModalVisible(\r\n MODAL_NAMES.PUBLICATION_SETUP_MODAL\r\n );\r\n\r\n const isPublicationValidateViewModalOpen = checkModalVisible(\r\n MODAL_NAMES.PUBLICATION_VALIDATE_VIEW_MODAL\r\n );\r\n\r\n const isBpSsoProductValidate = useSelector(\r\n ssoProductSelectors.selectIsBpSsoProductValidate()\r\n );\r\n\r\n const { checkAllowEditProductFull } = useCheckAllowEditProducts();\r\n const isValidPermissionAND = useCheckPermissionAnd();\r\n\r\n const activeSectionAfterProductId = location.pathname.match(\r\n sectionAfterProductSlashIdRegex\r\n )?.[0];\r\n\r\n const validateOverview = () => {\r\n const regex = /\\/product\\/\\d+$/;\r\n const isOverview = regex.test(location.pathname);\r\n return isOverview ? PRODUCT_VIEW.OVERVIEW : null;\r\n };\r\n\r\n const getActiveContent = () => {\r\n const regex = /\\/(?:product)\\/(.+)(?=\\/\\d+$)/;\r\n\r\n const results = location?.pathname?.match(regex);\r\n\r\n return results?.length\r\n ? results[1]\r\n : isBpSsoProductValidate\r\n ? PRODUCT_VIEW.OVERVIEW\r\n : validateOverview();\r\n };\r\n\r\n const activeContent = getActiveContent();\r\n\r\n const isActiveView = [\r\n PRODUCT_VIEW.DETAILVIEW,\r\n PRODUCT_VIEW.OVERVIEW,\r\n PRODUCT_VIEW.QA_SPEC,\r\n PRODUCT_VIEW.QA_EVALUATION_FORM,\r\n PRODUCT_VIEW.VERSIONS,\r\n ].includes(activeContent);\r\n\r\n const isAllowEditProduct = checkAllowEditProductFull(productFull);\r\n\r\n const allowSeeProductSyndication = isValidPermissionAND([\r\n SECURE_CONFIG.ACCESS_SYNDICATION.PASS,\r\n SECURE_CONFIG.ACCESS_GDSN.PASS,\r\n SECURE_CONFIG.PRODUCT.PASS,\r\n ]);\r\n\r\n const isSuperAdmin = useCheckIsSuperAdmin();\r\n const isMemberSupplierUser = useCheckMemberSupplier();\r\n const isSuperMember = useCheckIsSuperMember();\r\n\r\n const isAllowToDownloadNifForm = useCheckPermissions(\r\n PERMISSION_VIEW_NEW_ITEM_FORMS\r\n );\r\n\r\n const isDisableWithdrawPublicationModal =\r\n useCheckDisableWithdrawPublicationModal(productFull);\r\n const isProdEnv = checkDeployEnv('production');\r\n\r\n const isDisabledBulkProductOverlay =\r\n useCheckDisabledBulkProductOverlay(productFull);\r\n\r\n const handleCancel = () => {\r\n closeModal(MODAL_NAMES.PUBLICATION_SETUP_MODAL);\r\n setRequestParams([]);\r\n };\r\n\r\n const handleOk = (values) => {\r\n setRequestParams(values);\r\n openModal(MODAL_NAMES.PUBLICATION_VALIDATE_VIEW_MODAL);\r\n };\r\n\r\n const onExportProductProperty = (exportProperties, allPopulated) => {\r\n exportProductPropertyMutation.mutate({\r\n productIds: [productFull?.productId],\r\n selectedColumns: exportProperties,\r\n allPopulated,\r\n });\r\n };\r\n\r\n const onExportProductOverlayProperty = (exportProperties, allPopulated) => {\r\n exportProductOverlayPropertyMutation.mutate({\r\n productIds: [productFull?.productId],\r\n selectedColumns: exportProperties,\r\n allPopulated,\r\n });\r\n };\r\n\r\n const disabledDropdown =\r\n !isActiveView &&\r\n !isSuperAdmin &&\r\n !isSuperMember &&\r\n isMemberSupplierUser &&\r\n !isAllowEditProduct;\r\n\r\n const isShowIXOneCapture = useCheckIXOneCapture();\r\n\r\n const menuOptions = (\r\n \r\n {isShowIXOneCapture ? (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n ) : null}\r\n\r\n {!isProdEnv ? (\r\n \r\n \r\n \r\n ) : null}\r\n\r\n {isActiveView && (\r\n <>\r\n \r\n }\r\n label={messages.productEdit}\r\n onClick={() => openModal(MODAL_NAMES.ADD_EDIT_PRODUCT_MODAL)}\r\n disabled={!isAllowEditProduct}\r\n className='button-item-dropdown'\r\n />\r\n \r\n\r\n {!checkDeployEnv('production') && !checkDeployEnv('demo') && (\r\n \r\n )}\r\n\r\n {!checkDeployEnv('production') && !checkDeployEnv('demo') && (\r\n }\r\n label={'Bulk Product Overlay'}\r\n size={'small'}\r\n disabled={isDisabledBulkProductOverlay}\r\n />\r\n }\r\n disabled={isDisabledBulkProductOverlay}\r\n >\r\n \r\n \r\n )}\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n \r\n \r\n\r\n {[PRODUCT_VIEW.SYNDICATION].includes(activeSectionAfterProductId) && (\r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n {isSuperAdmin && (\r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n }\r\n disabled={!isAllowEditProduct}\r\n label={messagesProduct.bulkEditProduct}\r\n />\r\n }\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {/* \r\n \r\n */}\r\n \r\n );\r\n\r\n return (\r\n <>\r\n \r\n }\r\n label={messages.productActions}\r\n />\r\n \r\n\r\n {isAddEditModalOpen && (\r\n \r\n )}\r\n {isAssignCategoryModalOpen && (\r\n \r\n )}\r\n {isCopyProductModalOpen && (\r\n \r\n )}\r\n {isExportProductPropertyModalOpen && (\r\n closeModal(MODAL_NAMES.EXPORT_PROPERTY_MODAL)}\r\n />\r\n )}\r\n {isExportProductOverlayPropertyModalOpen && (\r\n closeModal(MODAL_NAMES.EXPORT_BULK_PRODUCT_OVERLAY)}\r\n />\r\n )}\r\n {isImportProductPropertyModalOpen && (\r\n closeModal(MODAL_NAMES.IMPORT_PROPERTY_MODAL)}\r\n onSuccess={getLatestFullViewData}\r\n />\r\n )}\r\n {isImportProductOverlayModalOpen && (\r\n closeModal(MODAL_NAMES.IMPORT_BULK_PRODUCT_OVERLAY)}\r\n onSuccess={getLatestFullViewDataOverlay}\r\n />\r\n )}\r\n {isPublicationSetupModalOpen && (\r\n \r\n )}\r\n\r\n {isPublicationValidateViewModalOpen && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default ProductFullAction;\r\n","import React, { useEffect } from 'react';\r\nimport { useDispatch } from 'react-redux';\r\n\r\nimport { ABILITY_ACTION, ABILITY_SUBJECT } from 'static/Permission';\r\n\r\nimport { ViewLayout, AdvanceStack, OtherLayout } from './components';\r\nimport { RibbonBar, RibbonDivider } from 'common/components';\r\nimport ManageSharingSection from './components/sections/shared/ManageSharingSection';\r\nimport DetailSection from './components/sections/home-grid/DetailSection';\r\nimport ProductHierarchy from './components/controls/product-full/ProductHierarchy';\r\nimport Subscription from './components/controls/product-full/Subscription';\r\nimport HistorySection from './components/sections/product/HistorySection';\r\nimport ProductDetailView from './components/controls/product-full/ProductDetailView';\r\nimport ActionsRibbonBar from 'common/components/contact-action/ActionsRibbonBar';\r\n// import QASpecAssignSupplier from './components/controls/product-full/QASpecAssignSupplier';\r\n// import QaEvaluationForm from './components/controls/product-full/QaEvaluationForm';\r\nimport ProductPackaging from './components/controls/product-full/ProductPackaging';\r\n\r\nimport HierarchyActions from './components/controls/product-full/HierarchyActions';\r\nimport ProductFullAction from './components/controls/product-full/ProductFullAction';\r\nimport * as actionsGlobal from '@redux/global/actions';\r\n\r\nimport { useCheckAllowEditProducts, useGetProductFullView } from 'hooks';\r\nimport { useOpenReportingResult } from 'hooks/useOpenReportingResult';\r\nimport {\r\n useCheckPermissionOR,\r\n useCheckPermissions,\r\n} from 'hooks/useCheckPermissions';\r\nimport { useFolderByLevel } from 'hooks/useFolderByLevel';\r\n// import { useInitialWorkflowQaSpec } from 'hooks/useInitialWorkflowQaSpec';\r\nimport useCheckIXOneCapture from 'hooks/useCheckIXOneCapture';\r\n\r\nimport { PERMISSION_VIEW_PRODUCT } from 'static/Permission';\r\n\r\nconst ProductFullViewRibbon = ({\r\n qaEvaluationFormId,\r\n isFetchingEvaluationForm,\r\n isHaveAddOpenItem = true,\r\n productId,\r\n shouldShowPackaging = true,\r\n}) => {\r\n const dispatch = useDispatch();\r\n const { keepSetting, keepResultGridPagination } = useOpenReportingResult();\r\n const checkPermission = useCheckPermissionOR();\r\n\r\n const isShowIXOneCapture = useCheckIXOneCapture();\r\n\r\n const hasQaSpecPermission = checkPermission([\r\n [ABILITY_ACTION.VIEW, ABILITY_SUBJECT.QA_SPECIFICATION],\r\n ]);\r\n\r\n const hasQaSpecPackingPermission = checkPermission([\r\n [ABILITY_ACTION.VIEW, ABILITY_SUBJECT.QA_SPECIFICATION],\r\n [ABILITY_ACTION.EDIT, ABILITY_SUBJECT.QA_SPECIFICATION],\r\n ]);\r\n\r\n // const hasEvaluationFormPermission = checkPermission([\r\n // [ABILITY_ACTION.VIEW, ABILITY_SUBJECT.EVALUATION_FORM],\r\n // ]);\r\n\r\n const { productFull } = useGetProductFullView({ productId });\r\n\r\n const hasPermissionViewProduct = useCheckPermissions(PERMISSION_VIEW_PRODUCT);\r\n\r\n const { checkAllowEditProductFull } = useCheckAllowEditProducts();\r\n const { shouldKeepFolderBreadcrumb, keepFolderBreadcrumb } =\r\n useFolderByLevel();\r\n\r\n const closeDetailCallback = () => {\r\n keepSetting();\r\n keepResultGridPagination();\r\n\r\n //* keep folder breadcrumb when close folder item detail\r\n shouldKeepFolderBreadcrumb && keepFolderBreadcrumb(true);\r\n };\r\n\r\n //* Reset not go back to members route.\r\n //* In case user go form member full view -> company's product.\r\n useEffect(() => {\r\n dispatch(actionsGlobal.resetProdAssetsToMember());\r\n }, [dispatch]);\r\n\r\n // const { checkInitialWorkflowQaSpecRibbon } = useInitialWorkflowQaSpec();\r\n // const isInitialWorkflowQaSpecRibbon = checkInitialWorkflowQaSpecRibbon();\r\n const isAllowEditProduct = checkAllowEditProductFull(productFull);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n {shouldShowPackaging && hasPermissionViewProduct ? (\r\n \r\n ) : null}\r\n \r\n {isAllowEditProduct ? : null}\r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n {!isAllowEditProduct && (\r\n <>\r\n \r\n \r\n \r\n )}\r\n\r\n {/* {hasQaSpecPermission && } */}\r\n\r\n {/* {isInitialWorkflowQaSpecRibbon && (\r\n <>\r\n \r\n \r\n \r\n )} */}\r\n\r\n {/* {hasEvaluationFormPermission && (\r\n <>\r\n \r\n \r\n \r\n )} */}\r\n {/* {isShowIXOneCapture ? (\r\n <>\r\n \r\n \r\n \r\n ) : null} */}\r\n\r\n \r\n {/* {isBpSsoProductValidate &&\r\n bpSsoProductData.productId == productFull?.productId && (\r\n <>\r\n \r\n \r\n \r\n \r\n )} */}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default ProductFullViewRibbon;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport Messages from 'i18n/messages/home';\r\n\r\nimport { CaretRightOutlined } from '@ant-design/icons';\r\n\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\n\r\nconst RunQueryControl = (props) => {\r\n const { onClick, disabled } = props;\r\n\r\n const onClickBtn = () => {\r\n onClick && onClick();\r\n };\r\n\r\n return (\r\n }\r\n label={Messages.runQuery}\r\n onClick={onClickBtn}\r\n disabled={disabled}\r\n />\r\n );\r\n};\r\n\r\nRunQueryControl.propTypes = {\r\n confirmRunQuery: PropTypes.func,\r\n};\r\n\r\nexport default RunQueryControl;\r\n","import React, { useState } from 'react';\r\nimport { Dropdown, Menu, Typography } from 'antd';\r\nimport { DownloadOutlined } from '@ant-design/icons';\r\n\r\nimport Messages from 'i18n/messages/home';\r\nimport RunQueryControl from '../../controls/advanced-search/RunQueryControl';\r\n\r\nimport { Can } from 'context/Can';\r\nimport { RibbonButton, RibbonSection } from 'common/components';\r\nimport { ABILITY_ACTION, ABILITY_SUBJECT } from 'static/Permission';\r\nimport { ADVANCED_FILTER_MODE } from 'pages/reporting/utils/constants';\r\n\r\nconst REPORT_EXPORT_TYPE_ADVANCED = ['XLS', 'XLSX', 'JSON', 'XML'];\r\n\r\nconst REPORT_EXPORT_TYPE_FLAT = ['XLS', 'XLSX', 'CSV', 'JSON', 'XML'];\r\n\r\nconst QuerySection = (props) => {\r\n const { disableRun, modeData, onClickRibbonBtn, disabledExportQuery } = props;\r\n const [loading, setLoading] = useState();\r\n\r\n const onClickRunBtn = () => {\r\n onClickRibbonBtn('run');\r\n };\r\n\r\n const onClickExportBtn = (exportType) => {\r\n setLoading(true);\r\n onClickRibbonBtn('export', { setLoading, exportType });\r\n };\r\n\r\n const exportType =\r\n modeData === ADVANCED_FILTER_MODE.NESTED_DATA\r\n ? REPORT_EXPORT_TYPE_ADVANCED\r\n : REPORT_EXPORT_TYPE_FLAT;\r\n\r\n const menu = (\r\n \r\n {exportType.map((exportType) => {\r\n return (\r\n {\r\n onClickExportBtn(exportType);\r\n }}\r\n key={exportType}\r\n >\r\n \r\n {exportType}\r\n \r\n \r\n );\r\n })}\r\n \r\n );\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n label={Messages.exportQuery}\r\n disabled={disabledExportQuery}\r\n />\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default QuerySection;\r\n","import React from 'react';\r\n\r\nimport {\r\n TeamOutlined,\r\n GoldOutlined,\r\n ShoppingOutlined,\r\n} from '@ant-design/icons';\r\n\r\nimport { dialogFunction, RibbonSection } from 'common/components';\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\n\r\nimport { LAYOUT_ADVANCED_SEARCH, REPORTING_VIEW_MODE } from 'static/Constants';\r\n\r\nimport { useIntl } from 'react-intl';\r\nimport Messages from 'i18n/messages/home';\r\n\r\nimport './LayoutSection.less';\r\n\r\nimport { Can } from 'context/Can';\r\nimport { ABILITY_ACTION, ABILITY_SUBJECT } from 'static/Permission';\r\n\r\nconst LayoutSection = (props) => {\r\n const intl = useIntl();\r\n const { onClickRibbonBtn, modeView, type } = props;\r\n\r\n const handleChangeLayout = (type) => {\r\n if (props.type === type) {\r\n return;\r\n }\r\n\r\n let confirmMessage = intl.formatMessage(\r\n Messages.changeViewQueryConfirm[type]\r\n );\r\n\r\n dialogFunction({\r\n type: 'warn',\r\n content: confirmMessage,\r\n okText: 'OK',\r\n cancelText: 'Cancel',\r\n onOk: (close) => handleConfirmChangeLayout(close, type),\r\n });\r\n };\r\n\r\n const handleConfirmChangeLayout = (close, type) => {\r\n onClickRibbonBtn('changeType', { type });\r\n return close();\r\n };\r\n\r\n const checkDisabledBtn = (btnType) => {\r\n return modeView === REPORTING_VIEW_MODE.VIEW && btnType !== type;\r\n };\r\n\r\n const layoutBtnCollection = [\r\n {\r\n type: LAYOUT_ADVANCED_SEARCH.MEMBER,\r\n icon: ,\r\n ability: 'MEMBER',\r\n },\r\n {\r\n type: LAYOUT_ADVANCED_SEARCH.ASSET,\r\n icon: ,\r\n ability: 'ASSET',\r\n },\r\n {\r\n type: LAYOUT_ADVANCED_SEARCH.PRODUCT,\r\n icon: ,\r\n ability: 'PRODUCT',\r\n },\r\n ];\r\n\r\n return (\r\n \r\n \r\n {layoutBtnCollection.map((layoutBtn) => {\r\n return (\r\n \r\n handleChangeLayout(layoutBtn.type)}\r\n toggle={props.type === layoutBtn.type}\r\n disabled={checkDisabledBtn(layoutBtn.type)}\r\n />\r\n \r\n );\r\n })}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default LayoutSection;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport Messages from 'i18n/messages/home';\r\n\r\nimport { SaveOutlined } from '@ant-design/icons';\r\n\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\n\r\nconst SaveQueryControl = ({ onClick, disabled }) => {\r\n const onClickBtn = () => {\r\n onClick && onClick();\r\n };\r\n\r\n return (\r\n }\r\n label={Messages.saveQuery}\r\n onClick={onClickBtn}\r\n disabled={disabled}\r\n />\r\n );\r\n};\r\n\r\nSaveQueryControl.propTypes = {\r\n confirmSaveQuery: PropTypes.func,\r\n};\r\n\r\nexport default SaveQueryControl;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport Messages from 'i18n/messages/home';\r\n\r\nimport { DeleteOutlined } from '@ant-design/icons';\r\n\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\n\r\nconst CancelQueryControl = ({ onClick }) => {\r\n const onClickBtn = () => {\r\n onClick && onClick();\r\n };\r\n\r\n return (\r\n }\r\n label={Messages.cancelEditUser}\r\n onClick={onClickBtn}\r\n k\r\n />\r\n );\r\n};\r\n\r\nCancelQueryControl.propTypes = {\r\n confirmEdit: PropTypes.func,\r\n};\r\n\r\nexport default CancelQueryControl;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { FormOutlined } from '@ant-design/icons';\r\n\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\n\r\nimport Messages from 'i18n/messages/home';\r\n\r\nconst EditQueryControl = ({ onClick }) => {\r\n const onClickBtn = () => {\r\n onClick && onClick();\r\n };\r\n\r\n return (\r\n }\r\n label={Messages.editUser}\r\n onClick={onClickBtn}\r\n />\r\n );\r\n};\r\n\r\nEditQueryControl.propTypes = {\r\n confirmEdit: PropTypes.func,\r\n};\r\n\r\nexport default EditQueryControl;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport Messages from 'i18n/messages/home';\r\n\r\nimport { CopyOutlined } from '@ant-design/icons';\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\nconst CloneQueryControl = ({ onClick }) => {\r\n const onClickBtn = () => {\r\n onClick && onClick();\r\n };\r\n\r\n return (\r\n }\r\n label={Messages.reportingClone}\r\n onClick={onClickBtn}\r\n />\r\n );\r\n};\r\n\r\nCloneQueryControl.propTypes = {\r\n confirmEdit: PropTypes.func,\r\n};\r\n\r\nexport default CloneQueryControl;\r\n","import React from 'react';\r\n\r\nimport { RibbonSection } from 'common/components';\r\nimport SaveQueryControl from '../../controls/advanced-search/SaveQueryControl';\r\nimport CancelQueryControl from '../../controls/advanced-search/CancelQueryControl';\r\nimport EditQueryControl from '../../controls/advanced-search/EditQueryControl';\r\nimport CloneQueryControl from '../../controls/advanced-search/CloneQueryControl';\r\n\r\nimport { Can } from 'context/Can';\r\nimport { ABILITY_ACTION, ABILITY_SUBJECT } from 'static/Permission';\r\nimport { REPORTING_VIEW_MODE } from 'static/Constants';\r\n\r\nconst SaveSection = (props) => {\r\n const { onClickRibbonBtn, modeView, isOwner, disableSave } = props;\r\n\r\n const onClickSaveBtn = () => {\r\n onClickRibbonBtn('save');\r\n };\r\n\r\n const onClickCancelBtn = () => {\r\n onClickRibbonBtn('cancel');\r\n };\r\n\r\n const onClickCloneBtn = () => {\r\n onClickRibbonBtn('clone');\r\n };\r\n\r\n const onClickEditBtn = () => {\r\n onClickRibbonBtn('edit');\r\n };\r\n\r\n const renderEditMode = () => {\r\n return modeView === REPORTING_VIEW_MODE.EDIT ? (\r\n \r\n \r\n \r\n \r\n ) : null;\r\n };\r\n\r\n const renderViewMode = () => {\r\n return modeView === REPORTING_VIEW_MODE.VIEW ? (\r\n \r\n {isOwner ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n ) : null;\r\n };\r\n\r\n const renderCreateView = () => {\r\n return modeView === REPORTING_VIEW_MODE.CREATE ? (\r\n \r\n \r\n \r\n ) : null;\r\n };\r\n\r\n return (\r\n \r\n {renderViewMode()}\r\n {renderEditMode()}\r\n {renderCreateView()}\r\n \r\n );\r\n};\r\n\r\nexport default SaveSection;\r\n","import React from 'react';\r\n\r\nimport { FolderOpenOutlined } from '@ant-design/icons';\r\n\r\nimport { RibbonButton, RibbonSection, RibbonDivider } from 'common/components';\r\n\r\nimport Messages from 'i18n/messages/home';\r\n\r\nconst OpenResultControl = (props) => {\r\n const { type, selectedResult, onClickRibbonBtn } = props;\r\n\r\n const onClickOpenResult = () => {\r\n onClickRibbonBtn('openResult');\r\n };\r\n\r\n const disabled = !selectedResult;\r\n\r\n return type === 'product' ? (\r\n \r\n \r\n }\r\n label={Messages.openResult}\r\n onClick={onClickOpenResult}\r\n disabled={disabled}\r\n />\r\n \r\n ) : null;\r\n};\r\n\r\nexport default OpenResultControl;\r\n","import React from 'react';\r\n\r\nimport {\r\n QuerySection,\r\n LayoutSection,\r\n SaveSection,\r\n} from './components/sections/advanced-search';\r\nimport { OtherLayout } from './components';\r\nimport { RibbonBar, RibbonDivider } from 'common/components';\r\nimport ManageSharingSection from './components/sections/shared/ManageSharingSection';\r\nimport DetailSection from './components/sections/home-grid/DetailSection';\r\nimport { ViewLayout, AdvanceStack } from './components';\r\nimport OpenResultControl from './components/controls/advanced-search/OpenResultControl';\r\nimport { useFolderByLevel } from 'hooks/useFolderByLevel';\r\nimport OpenSchedule from './components/controls/advanced-search/OpenSchedule';\r\n\r\nconst ReportingFullViewRibbon = (props) => {\r\n const {\r\n type,\r\n disabledSaveQuery,\r\n disabledExportQuery,\r\n disableRun,\r\n modeData,\r\n onClickRibbonBtn,\r\n modeView,\r\n selectedResult,\r\n isOwner,\r\n } = props;\r\n\r\n const { shouldKeepFolderBreadcrumb, keepFolderBreadcrumb } =\r\n useFolderByLevel();\r\n\r\n const closeDetailCallback = () => {\r\n //* keep folder breadcrumb when close folder item detail\r\n shouldKeepFolderBreadcrumb && keepFolderBreadcrumb(true);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nReportingFullViewRibbon.propTypes = {};\r\n\r\nexport default ReportingFullViewRibbon;\r\n","import * as types from './constants';\r\n\r\n/**\r\n * turn on edit mode in asset full view\r\n */\r\nexport const editAsset = () => {\r\n return {\r\n type: types.EDIT_ASSET,\r\n };\r\n};\r\n\r\n/**\r\n * turn off edit mode in asset full view\r\n */\r\nexport const cancelEditAsset = () => {\r\n return {\r\n type: types.CANCEL_EDIT_ASSET,\r\n };\r\n};\r\n\r\n/**\r\n * save dirty asset data in full view\r\n */\r\nexport const savingAsset = () => {\r\n return {\r\n type: types.SAVING_ASSET_FULL,\r\n };\r\n};\r\n\r\n/**\r\n * save dirty asset data in full view\r\n */\r\nexport const saveAsset = (payload) => {\r\n return {\r\n type: types.SAVE_ASSET_FULL,\r\n payload,\r\n };\r\n};\r\n\r\n/**\r\n * finish edit asset data in full view\r\n */\r\nexport const finishEditAsset = () => {\r\n return {\r\n type: types.FINISH_EDIT_ASSET,\r\n };\r\n};\r\n\r\nexport const finishEditAssetSuccess = () => {\r\n return {\r\n type: types.FINISH_EDIT_ASSET_SUCCESS,\r\n };\r\n};\r\n\r\nexport const finishEditAssetError = () => {\r\n return {\r\n type: types.FINISH_EDIT_ASSET_ERROR,\r\n };\r\n};\r\n\r\nexport const getAssetId = (assetId) => {\r\n return {\r\n type: types.GET_ASSET_ID,\r\n payload: {\r\n assetId,\r\n },\r\n };\r\n};\r\n\r\nexport const creatingAsset = () => {\r\n return {\r\n type: types.CREATING_ASSET,\r\n };\r\n};\r\n\r\nexport const cancelCreateAsset = () => {\r\n return {\r\n type: types.CANCEL_CREATE_ASSET,\r\n };\r\n};\r\n\r\nexport const cancelSavingAsset = () => {\r\n return {\r\n type: types.CANCEL_SAVING_ASSET,\r\n };\r\n};\r\n\r\nexport const enableModeLinkAsset = () => {\r\n return { type: types.ENABLE_MODE_LINK_ASSETS };\r\n};\r\n\r\nexport const disableModeLinkAsset = () => {\r\n return { type: types.DISABLE_MODE_LINK_ASSETS };\r\n};\r\n\r\n/**\r\n * Replace Preview\r\n */\r\nexport const toggleReplacePreview = () => {\r\n return {\r\n type: types.TOGGLE_REPLACE_PREVIEW,\r\n };\r\n};\r\n\r\n/**\r\n * Replace Preview\r\n */\r\nexport const cancelReplacePreview = () => {\r\n return {\r\n type: types.CANCEL_REPLACE_PREVIEW,\r\n };\r\n};\r\n\r\nexport const getUniqueId = (uniqueId) => {\r\n return {\r\n type: types.GET_UNIQUE_ID,\r\n payload: {\r\n uniqueId,\r\n },\r\n };\r\n};\r\n\r\nexport const clearUniqueId = () => {\r\n return {\r\n type: types.CLEAR_UNIQUE_ID,\r\n };\r\n};\r\n\r\nexport const getCanEdit = (canEdit) => {\r\n return {\r\n type: types.GET_CAN_EDIT,\r\n canEdit,\r\n };\r\n};\r\n","// Action Types\r\nexport const EDIT_ASSET = 'EDIT_ASSET';\r\nexport const CANCEL_EDIT_ASSET = 'CANCEL_EDIT_ASSET';\r\nexport const SAVING_ASSET_FULL = 'SAVING_ASSET_FULL';\r\nexport const SAVE_ASSET_FULL = 'SAVE_ASSET_FULL';\r\nexport const SAVE_ASSET_FULL_SUCCESS = 'SAVE_ASSET_FULL_SUCCESS';\r\nexport const SAVE_ASSET_FULL_ERROR = 'SAVE_ASSET_FULL_ERROR';\r\nexport const FINISH_EDIT_ASSET = 'FINISH_EDIT_ASSET';\r\nexport const FINISH_EDIT_ASSET_SUCCESS = 'FINISH_EDIT_ASSET_SUCCESS';\r\nexport const FINISH_EDIT_ASSET_ERROR = 'FINISH_EDIT_ASSET_ERROR';\r\nexport const GET_ASSET_ID = 'GET_ASSET_ID';\r\nexport const CREATING_ASSET = 'CREATING_ASSET';\r\nexport const CANCEL_CREATE_ASSET = 'CANCEL_CREATE_ASSET';\r\nexport const CANCEL_SAVING_ASSET = 'CANCEL_SAVING_ASSET';\r\n// Asset-grid\r\nexport const ENABLE_MODE_LINK_ASSETS = 'ENABLE_MODE_LINK_ASSETS';\r\nexport const DISABLE_MODE_LINK_ASSETS = 'DISABLE_MODE_LINK_ASSETS';\r\nexport const REPLACE_PREVIEW = 'REPLACE_PREVIEW';\r\nexport const TOGGLE_REPLACE_PREVIEW = 'TOGGLE_REPLACE_PREVIEW';\r\nexport const CANCEL_REPLACE_PREVIEW = 'CANCEL_REPLACE_PREVIEW';\r\nexport const GET_UNIQUE_ID = 'GET_UNIQUE_ID';\r\nexport const CLEAR_UNIQUE_ID = 'CLEAR_UNIQUE_ID';\r\nexport const GET_CAN_EDIT = 'GET_CAN_EDIT';\r\n","import produce from 'immer';\r\nimport * as types from './constants';\r\n\r\n// initial state\r\nexport const initialState = {\r\n edit: false,\r\n saving: false,\r\n loading: false,\r\n assetId: null,\r\n creating: false,\r\n updating: false,\r\n // asset-grid\r\n modeLinkAssets: false,\r\n replacePreview: false,\r\n uniqueId: null,\r\n canEdit: false,\r\n};\r\n\r\nconst ribbonAssetFullReducer = (state = initialState, action) =>\r\n produce(state, (draft) => {\r\n switch (action.type) {\r\n case types.EDIT_ASSET:\r\n draft.edit = true;\r\n draft.saving = false;\r\n break;\r\n case types.CANCEL_EDIT_ASSET:\r\n draft.edit = false;\r\n draft.saving = false;\r\n draft.creating = false;\r\n break;\r\n case types.SAVING_ASSET_FULL:\r\n draft.saving = true;\r\n break;\r\n case types.SAVE_ASSET_FULL:\r\n draft.loading = true;\r\n draft.saving = false;\r\n break;\r\n case types.SAVE_ASSET_FULL_SUCCESS:\r\n draft.loading = false;\r\n break;\r\n case types.SAVE_ASSET_FULL_ERROR:\r\n draft.loading = false;\r\n break;\r\n case types.FINISH_EDIT_ASSET:\r\n draft.updating = true;\r\n break;\r\n case types.FINISH_EDIT_ASSET_SUCCESS:\r\n draft.edit = false;\r\n draft.updating = false;\r\n draft.creating = false;\r\n draft.loading = false;\r\n break;\r\n case types.FINISH_EDIT_ASSET_ERROR:\r\n draft.loading = false;\r\n break;\r\n case types.GET_ASSET_ID:\r\n draft.assetId = parseInt(action.payload.assetId, 10);\r\n break;\r\n case types.CREATING_ASSET:\r\n draft.creating = true;\r\n break;\r\n case types.CANCEL_CREATE_ASSET:\r\n draft.creating = false;\r\n break;\r\n case types.CANCEL_SAVING_ASSET:\r\n draft.saving = false;\r\n break;\r\n case types.ENABLE_MODE_LINK_ASSETS:\r\n draft.modeLinkAssets = true;\r\n break;\r\n case types.DISABLE_MODE_LINK_ASSETS:\r\n draft.modeLinkAssets = false;\r\n break;\r\n case types.REPLACE_PREVIEW:\r\n draft.replacePreview = true;\r\n break;\r\n case types.TOGGLE_REPLACE_PREVIEW:\r\n draft.replacePreview = !state.replacePreview;\r\n break;\r\n case types.CANCEL_REPLACE_PREVIEW:\r\n draft.replacePreview = false;\r\n break;\r\n case types.GET_UNIQUE_ID:\r\n draft.uniqueId = action.payload.uniqueId;\r\n break;\r\n case types.CLEAR_UNIQUE_ID:\r\n draft.uniqueId = null;\r\n break;\r\n case types.GET_CAN_EDIT:\r\n draft.canEdit = action.canEdit;\r\n break;\r\n default:\r\n break;\r\n }\r\n });\r\n\r\nexport default ribbonAssetFullReducer;\r\n","import { createSelector } from 'reselect';\r\nimport { initialState } from './reducer';\r\n\r\n/**\r\n * take ribbon asset full state from redux\r\n * @param {object} state\r\n */\r\nconst assetFull = (state) => (state && state.asset) || initialState;\r\n\r\n/**\r\n * Select member edit mode\r\n */\r\nconst selectAssetEdit = () => createSelector(assetFull, (state) => state.edit);\r\n\r\n/**\r\n * Select member edit mode\r\n */\r\nconst selectAssetSaving = () =>\r\n createSelector(assetFull, (state) => state.saving);\r\n\r\n/**\r\n * Select asset id mode\r\n */\r\nconst selectAssetId = () => createSelector(assetFull, (state) => state.assetId);\r\n\r\nconst selectAssetCreating = () =>\r\n createSelector(assetFull, (state) => state.creating);\r\n\r\nconst selectAssetUpdating = () =>\r\n createSelector(assetFull, (state) => state.updating);\r\n\r\nconst selectModeLinkAssets = () =>\r\n createSelector(assetFull, ({ modeLinkAssets }) => modeLinkAssets);\r\n/**\r\n * Select replace preview\r\n */\r\nconst selectReplacePreview = () =>\r\n createSelector(assetFull, (state) => state.replacePreview);\r\n\r\nconst selectAssetUniqueId = () =>\r\n createSelector(assetFull, (state) => state.uniqueId);\r\n\r\nconst selectCanEditAsset = () =>\r\n createSelector(assetFull, (state) => state.canEdit);\r\n\r\nexport default {\r\n selectAssetEdit,\r\n selectAssetSaving,\r\n selectAssetId,\r\n selectAssetCreating,\r\n selectAssetUpdating,\r\n selectModeLinkAssets,\r\n selectReplacePreview,\r\n selectAssetUniqueId,\r\n selectCanEditAsset,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Card } from 'antd';\r\n\r\nimport './Control.less';\r\nconst Control = (props) => {\r\n const {\r\n children,\r\n cardClassName,\r\n cardBodyStyle,\r\n mode,\r\n textAlign,\r\n ...rest\r\n } = props;\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n\r\nControl.propTypes = {\r\n cardClassName: PropTypes.string,\r\n mode: PropTypes.oneOf(['', 'inline']),\r\n textAlign: PropTypes.oneOf(['left', 'right', 'center']),\r\n};\r\nControl.defaultProps = {\r\n textAlign: 'center',\r\n cardBodyStyle: {\r\n padding: '0px',\r\n margin: '0px 0px 8px 0px',\r\n },\r\n};\r\n\r\nexport default Control;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport Messages from 'i18n/messages/home';\r\n\r\nimport { ClearOutlined } from '@ant-design/icons';\r\n\r\nimport ButtonSmallIcon from 'common/components/button/ButtonSmallIcon';\r\nimport { dialogFunction } from 'common/components/index';\r\n\r\nconst ClearColumnsControl = ({ onClick }) => {\r\n const showConfirmMessage = () => {\r\n dialogFunction({\r\n type: 'warn',\r\n content: 'Are you sure to clear Data Columns?',\r\n okText: 'OK',\r\n cancelText: 'Cancel',\r\n onOk: onConfirm,\r\n });\r\n };\r\n\r\n const onConfirm = () => {\r\n onClick && onClick();\r\n };\r\n\r\n return (\r\n }\r\n label={Messages.clearColumnsQuery}\r\n onClick={showConfirmMessage}\r\n />\r\n );\r\n};\r\n\r\nClearColumnsControl.propTypes = {\r\n clearColumnsQuery: PropTypes.func,\r\n};\r\n\r\nexport default ClearColumnsControl;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport Messages from 'i18n/messages/home';\r\n\r\nimport { ClearOutlined } from '@ant-design/icons';\r\n\r\nimport ButtonSmallIcon from 'common/components/button/ButtonSmallIcon';\r\n\r\nimport { dialogFunction } from 'common/components/index';\r\n\r\nconst ClearQueryControl = ({ onClick }) => {\r\n const showConfirmMessage = () => {\r\n dialogFunction({\r\n type: 'warn',\r\n content: 'Are you sure to clear Query Conditions?',\r\n okText: 'OK',\r\n cancelText: 'Cancel',\r\n onOk: onConfirm,\r\n });\r\n };\r\n\r\n const onConfirm = () => {\r\n onClick && onClick();\r\n };\r\n\r\n return (\r\n }\r\n label={Messages.clearQuery}\r\n onClick={showConfirmMessage}\r\n />\r\n );\r\n};\r\n\r\nClearQueryControl.propTypes = {\r\n clearQuery: PropTypes.func,\r\n};\r\n\r\nexport default ClearQueryControl;\r\n","import { useMutation, useQuery } from '@tanstack/react-query';\r\nimport {\r\n configDownloadSchedule,\r\n deleteDownloadSchedule,\r\n getDownloadScheduleDetail,\r\n} from 'services/reporting';\r\nimport { getFTPconfig, validateFTPConfig } from 'services/user';\r\nexport const getKeyFactPanels = (id) => {\r\n return ['reporting', 'get-download-schedule-detail', parseInt(id)];\r\n};\r\nexport const getKeyFTPConfig = (id) => {\r\n return ['reporting', 'get-ftp-config', parseInt(id)];\r\n};\r\nexport const useGetDownloadScheduleDetail = ({ id, enabled }) => {\r\n const { data, ...restQuery } = useQuery({\r\n queryKey: getKeyFactPanels(id),\r\n queryFn: async () => {\r\n const { data } = await getDownloadScheduleDetail({ reportId: +id });\r\n return data || {};\r\n },\r\n enabled: enabled,\r\n });\r\n return {\r\n downloadScheduleDetail: data || {},\r\n ...restQuery,\r\n };\r\n};\r\nexport const useGetFTPConfig = ({ id, ...resProps }) => {\r\n const { data, ...restQuery } = useQuery({\r\n queryKey: getKeyFTPConfig(id),\r\n queryFn: async () => {\r\n const { data } = await getFTPconfig();\r\n return data || {};\r\n },\r\n ...resProps,\r\n });\r\n return {\r\n FTPConfig: data || {},\r\n ...restQuery,\r\n };\r\n};\r\nexport const useMutationFTPConfig = () => {\r\n const validateFTP = useMutation({\r\n mutationFn: validateFTPConfig,\r\n });\r\n return {\r\n validateFTP,\r\n };\r\n};\r\nexport const useMutationDownloadSChedule = () => {\r\n const deleteSchedule = useMutation({\r\n mutationFn: deleteDownloadSchedule,\r\n });\r\n const configSchedule = useMutation({\r\n mutationFn: configDownloadSchedule,\r\n });\r\n return {\r\n deleteSchedule,\r\n configSchedule,\r\n };\r\n};\r\n","import React from 'react';\r\nimport { Row, Col, Form, Checkbox } from 'antd';\r\nimport { CheckboxGroup } from 'common/components/input';\r\nimport { DAY_LIST, WEEK_DAY, MONTH_LIST, ORDER_LIST } from 'static/Constants';\r\nimport { SCHEDULE_FORM_LAYOUT } from 'common/components/modal-download-folder/constants';\r\nconst GRID_GUTTER = 8;\r\nconst ReportingDownloadScheduleMonthSetting = () => {\r\n const form = Form.useFormInstance();\r\n const atDays = Form.useWatch('onDays', form);\r\n const specificScheduleOrdinalNumeral = Form.useWatch(\r\n 'specificOrdinalNumeral',\r\n form\r\n );\r\n const specificScheduleDaysOfWeek = Form.useWatch('specificDaysOfWeek', form);\r\n const onCheckAllChange = (e) => {\r\n form.setFieldsValue({\r\n specificDaysOfWeek: e.target.checked ? WEEK_DAY : [],\r\n });\r\n };\r\n const isDaysDisabled = !!specificScheduleOrdinalNumeral?.length;\r\n const isSpecificDisabled = !!atDays?.length;\r\n const isCheckboxAllDisabled =\r\n !!specificScheduleOrdinalNumeral?.length || !!atDays?.length;\r\n return (\r\n <>\r\n \r\n {option}}\r\n />\r\n \r\n \r\n {option}}\r\n />\r\n \r\n \r\n \r\n \r\n (\r\n {option}\r\n )}\r\n />\r\n \r\n \r\n \r\n 0 &&\r\n specificScheduleDaysOfWeek?.length < WEEK_DAY.length\r\n }\r\n disabled={isCheckboxAllDisabled}\r\n style={{ marginLeft: GRID_GUTTER, marginBottom: GRID_GUTTER }}\r\n onChange={onCheckAllChange}\r\n >\r\n All\r\n
\r\n \r\n (\r\n {option}\r\n )}\r\n />\r\n \r\n \r\n \r\n \r\n );\r\n};\r\nexport default ReportingDownloadScheduleMonthSetting;\r\n","import React from 'react';\r\nimport { Row, Col, Form, InputNumber, Checkbox } from 'antd';\r\nimport { CheckboxGroup } from 'common/components/input';\r\nimport { WEEK_DAY } from 'static/Constants';\r\nimport { SCHEDULE_FORM_LAYOUT } from 'common/components/modal-download-folder/constants';\r\nconst ReportingDownloadScheduleWeekSetting = () => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n (\r\n \r\n {option}\r\n \r\n )}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\nexport default ReportingDownloadScheduleWeekSetting;","import React from 'react';\r\nimport { Form, Row, Col, TimePicker, Select, Radio, Divider } from 'antd';\r\nimport WrapperSelect from 'common/components/select/WrapperSelect';\r\nimport ReportingDownloadScheduleMonthSetting from './ReportingDownloadScheduleMonthSetting';\r\nimport ReportingDownloadScheduleWeekSetting from './ReportingDownloadScheduleWeekSetting';\r\nimport { TIME_ZONES } from 'static/TimeZones';\r\nimport { SCHEDULE_FORM_LAYOUT } from 'common/components/modal-download-folder/constants';\r\nconst { Option } = Select;\r\nconst ReportingDownloadScheduleForm = () => {\r\n const form = Form.useFormInstance();\r\n const interval = Form.useWatch('intervalType', form);\r\n return (\r\n
\r\n \r\n \r\n \r\n trigger.parentElement}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n option.children.toLowerCase().indexOf(input.toLowerCase()) >= 0\r\n }\r\n >\r\n {TIME_ZONES.map((zone) => (\r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Daily\r\n \r\n \r\n Weekly\r\n \r\n \r\n Monthly\r\n \r\n \r\n \r\n \r\n \r\n {interval === 'Weekly' ? : null}\r\n {interval === 'Monthly' ? (\r\n \r\n ) : null}\r\n
\r\n );\r\n};\r\nexport default ReportingDownloadScheduleForm;\r\n","import {\r\n FormCancelButton,\r\n FormDeleteButton,\r\n FormSaveButton,\r\n dialogFunction,\r\n} from 'common/components';\r\nimport React from 'react';\r\nconst ReportingScheduleFooter = (props) => {\r\n const {\r\n setOpenSchedule,\r\n onDeleteScheduleButton,\r\n disableSubmitButton,\r\n onSubmit,\r\n loading,\r\n } = props;\r\n const handleDelete = () => {\r\n dialogFunction({\r\n type: 'warn',\r\n content: `Are you sure you want to delete the download schedule?`,\r\n okText: 'Delete',\r\n okButtonProps: {\r\n type: 'danger',\r\n },\r\n onOk: async () => await onDeleteScheduleButton(),\r\n });\r\n };\r\n return (\r\n \r\n \r\n
\r\n {\r\n setOpenSchedule && setOpenSchedule(false);\r\n }}\r\n />\r\n \r\n
\r\n \r\n );\r\n};\r\nexport default ReportingScheduleFooter;","import moment from 'moment';\r\nimport { Button, Col, Form, Input, Radio, Row, Select, Tooltip } from 'antd';\r\nimport { useParams } from 'react-router-dom';\r\nimport { useQueryClient } from '@tanstack/react-query';\r\nimport React, { useEffect, useState } from 'react';\r\nimport { InfoCircleOutlined, CloudSyncOutlined } from '@ant-design/icons';\r\nimport { useSelector } from 'react-redux';\r\nimport selectorUser from '@redux/user/selectors';\r\nimport {\r\n CustomNotification,\r\n StyledModal,\r\n TypePicker,\r\n WrapperSelect,\r\n} from 'common/components';\r\nimport {\r\n ADVANCED_FILTER_MODE,\r\n DELIVERY_METHOD,\r\n REPORT_EXPORT_TYPE_ADVANCED,\r\n REPORT_EXPORT_TYPE_FLAT,\r\n} from '../utils/constants';\r\nimport {\r\n getKeyFactPanels,\r\n useGetDownloadScheduleDetail,\r\n useMutationDownloadSChedule,\r\n useMutationFTPConfig,\r\n} from '../hook/useScheduleDownload';\r\nimport ReportingDownloadScheduleForm from './DownloadSchedule/ReportingDownloadScheduleForm';\r\nimport ReportingScheduleFooter from './DownloadSchedule/ReportingScheduleFooter';\r\nimport { formatRangeDateTime } from 'utils/formatDate';\r\nimport { validateMultipleEmails } from 'utils';\r\nexport const DEFAULT_SETTING = {\r\n runsPerWeek: 0,\r\n intervalType: 'Daily',\r\n easterOrUserLocal: 'America/Belize',\r\n deliveryMethod: 'email',\r\n};\r\nconst ReportingScheduleModal = (props) => {\r\n const [form] = Form.useForm();\r\n const [statusFTP, setStatusFTP] = useState({\r\n isValidated: false,\r\n isSuccess: true,\r\n message: '',\r\n });\r\n const queryClient = useQueryClient();\r\n const { openSchedule, setOpenSchedule, modeData, reportingId } = props;\r\n const userInfo = useSelector(selectorUser.makeSelectUserInfo());\r\n const { downloadScheduleDetail } = useGetDownloadScheduleDetail({\r\n id: reportingId,\r\n enabled: !!reportingId && reportingId !== 'create',\r\n });\r\n const { deleteSchedule, configSchedule } = useMutationDownloadSChedule();\r\n const { validateFTP } = useMutationFTPConfig();\r\n const deliveryMethod = Form.useWatch('deliveryMethod', form);\r\n const onSchedule = async () => {\r\n try {\r\n const formValues = await form.validateFields();\r\n if (!formValues) return;\r\n const test = formatRangeDateTime(formValues?.runAt);\r\n const newDate = new Date(\r\n test.getTime() - test.getTimezoneOffset() * 60000\r\n );\r\n const params = {\r\n ...formValues,\r\n reportId: +reportingId,\r\n runAt: newDate.toISOString(),\r\n userTimeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,\r\n };\r\n configSchedule.mutate(params, {\r\n onSuccess: (result) => {\r\n if (result?.isSuccess) {\r\n CustomNotification.success(\r\n 'Reporting download schedule configured successfully'\r\n );\r\n queryClient.invalidateQueries({\r\n queryKey: getKeyFactPanels(reportingId),\r\n });\r\n closeModal();\r\n } else {\r\n CustomNotification.error(result?.message);\r\n }\r\n },\r\n });\r\n } catch (error) {\r\n console.log('error: ', error);\r\n }\r\n };\r\n const onFormChange = (changedValues, allValue) => {\r\n let updatedValues = {};\r\n if (changedValues.specificScheduleOrdinalNumeral) {\r\n updatedValues.specificScheduleOrdinalNumeral = [\r\n changedValues?.specificScheduleOrdinalNumeral?.[\r\n changedValues?.specificScheduleOrdinalNumeral.length - 1\r\n ],\r\n ].filter(Boolean);\r\n updatedValues.specificScheduleDaysOfWeek = [];\r\n }\r\n if (changedValues.specificScheduleDaysOfWeek) {\r\n if (allValue.specificScheduleOrdinalNumeral.length)\r\n updatedValues.specificScheduleDaysOfWeek = [\r\n changedValues?.specificScheduleDaysOfWeek?.[\r\n changedValues?.specificScheduleDaysOfWeek.length - 1\r\n ],\r\n ].filter(Boolean);\r\n }\r\n if (changedValues?.interval)\r\n updatedValues = {\r\n ...updatedValues,\r\n runEvery: 0,\r\n onDate: [],\r\n atDays: [],\r\n atMonth: [],\r\n specificScheduleDaysOfWeek: [],\r\n specificScheduleOrdinalNumeral: [],\r\n };\r\n if (changedValues?.atDays?.length > 0)\r\n updatedValues.specificScheduleDaysOfWeek = [];\r\n form.setFieldsValue(updatedValues);\r\n };\r\n const initScheduleDownload = (scheduleSetup = {}) => {\r\n const updateValues = {\r\n ...scheduleSetup,\r\n runAt: scheduleSetup?.runAt\r\n ? moment(scheduleSetup?.runAt)\r\n : moment('00:00:00', 'HH:mm:ss'),\r\n emails: scheduleSetup?.emails || userInfo?.email,\r\n fileType: scheduleSetup?.fileType?.toUpperCase() || 'XLSX',\r\n easterOrUserLocal: scheduleSetup?.easterOrUserLocal || 'America/Detroit',\r\n onDays: scheduleSetup?.onDays || ['1'],\r\n };\r\n form.setFieldsValue(updateValues);\r\n };\r\n const handleDeleteSchedule = async () => {\r\n await deleteSchedule.mutateAsync(\r\n { reportId: +reportingId },\r\n {\r\n onSuccess: (result) => {\r\n if (result?.isSuccess) {\r\n CustomNotification.success(\r\n 'Delete reporting download schedule successfully'\r\n );\r\n queryClient.invalidateQueries({\r\n queryKey: getKeyFactPanels(reportingId),\r\n });\r\n closeModal();\r\n } else {\r\n CustomNotification.error(result?.message);\r\n }\r\n },\r\n }\r\n );\r\n };\r\n const closeModal = () => {\r\n form.resetFields();\r\n setOpenSchedule(false);\r\n };\r\n const handleValidateFTP = () => {\r\n validateFTP.mutate(\r\n {},\r\n {\r\n onSuccess: (result) => {\r\n if (result?.isSuccess) {\r\n setStatusFTP({ isValidated: true, isSuccess: true, message: '' });\r\n } else {\r\n setStatusFTP({\r\n isValidated: true,\r\n isSuccess: false,\r\n message: result?.message,\r\n });\r\n }\r\n },\r\n }\r\n );\r\n };\r\n useEffect(() => {\r\n if (openSchedule) initScheduleDownload(downloadScheduleDetail);\r\n }, [openSchedule, JSON.stringify(downloadScheduleDetail)]);\r\n const disableSubmitButton = !statusFTP?.isSuccess && deliveryMethod === 'ftp';\r\n const exportType =\r\n modeData === ADVANCED_FILTER_MODE.NESTED_DATA\r\n ? REPORT_EXPORT_TYPE_ADVANCED\r\n : REPORT_EXPORT_TYPE_FLAT;\r\n return (\r\n \r\n }\r\n >\r\n \r\n \r\n \r\n \r\n {\r\n if (e.target.value === 'ftp' && !statusFTP?.isValidated) {\r\n handleValidateFTP();\r\n }\r\n }}\r\n >\r\n {DELIVERY_METHOD?.map((option, index) => {\r\n const title = option?.toUpperCase();\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n \r\n \r\n \r\n {deliveryMethod === 'email' && (\r\n ,\r\n }}\r\n rules={[\r\n {\r\n required: true,\r\n message: 'This field is required',\r\n },\r\n {\r\n validator: (_, value) => {\r\n const validateEmail = validateMultipleEmails(value);\r\n if (validateEmail || !value) {\r\n return Promise.resolve();\r\n } else {\r\n return Promise.reject('Invalid email format');\r\n }\r\n },\r\n },\r\n ]}\r\n >\r\n \r\n \r\n )}\r\n {deliveryMethod === 'ftp' && (\r\n \r\n \r\n }\r\n type='primary'\r\n onClick={handleValidateFTP}\r\n >\r\n Test Connection\r\n \r\n \r\n {statusFTP?.isSuccess ? (\r\n \r\n \r\n FTP Successfully Connected.\r\n \r\n \r\n ) : (\r\n \r\n \r\n {statusFTP?.message}\r\n \r\n \r\n )}\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n {\r\n return triggerNode;\r\n }}\r\n >\r\n {[\r\n exportType.map((type) => {\r\n return (\r\n \r\n {type?.toUpperCase()}\r\n \r\n );\r\n }),\r\n ]}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\nexport default ReportingScheduleModal;\r\n","import React, { useState } from 'react';\r\nimport { useParams } from 'react-router-dom';\r\nimport { FieldTimeOutlined } from '@ant-design/icons';\r\nimport { RibbonButton, RibbonSection, RibbonDivider } from 'common/components';\r\nimport { useGetDownloadScheduleDetail } from 'pages/reporting/hook/useScheduleDownload';\r\nimport { isEmpty } from 'lodash';\r\nimport ReportingScheduleModal from 'pages/reporting/components/ReportingScheduleModal';\r\nconst OpenSchedule = (props) => {\r\n const { modeData, reportId, showScheduleDownload = true } = props;\r\n const { reportingId } = useParams();\r\n const [openSchedule, setOpenSchedule] = useState(false);\r\n const _id = reportId || reportingId;\r\n const { downloadScheduleDetail } = useGetDownloadScheduleDetail({\r\n id: _id,\r\n enabled: !!_id && _id !== 'create',\r\n });\r\n const onClickOpenResult = () => {\r\n setOpenSchedule(true);\r\n };\r\n const disabled = reportingId === 'create' || !showScheduleDownload;\r\n return (\r\n <>\r\n \r\n \r\n }\r\n label='Download Schedule'\r\n onClick={onClickOpenResult}\r\n toggle={!isEmpty(downloadScheduleDetail)}\r\n />\r\n \r\n \r\n \r\n );\r\n};\r\nexport default OpenSchedule;\r\n","import React, { useState, useEffect } from 'react';\r\n\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { CloseCircleOutlined } from '@ant-design/icons';\r\n\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\nimport { dialogFunction } from 'common/components/index';\r\n\r\nimport * as constant from 'static/Constants';\r\nimport { useDispatchReloadPage } from 'hooks/useReloadPage';\r\n\r\nimport { injectIntl } from 'react-intl';\r\nimport ribbonMessages from 'i18n/messages/home';\r\nimport previewMessages from 'i18n/messages/assetPreview';\r\n\r\nimport { useCheckAllowDeleteAssets } from 'hooks';\r\n\r\nimport * as digitalAssetsService from 'services/digitalAsset';\r\n\r\nconst DeletePreview = (props) => {\r\n const reloadPage = useDispatchReloadPage();\r\n const { sectionDisabled, currentSelectedAssets, typeView, isIframe, intl } =\r\n props;\r\n\r\n const [disabled, setDisabled] = useState(true);\r\n\r\n const { checkAllowDeleteAssetFull, checkAllowDeleteAssetGrid } =\r\n useCheckAllowDeleteAssets();\r\n\r\n const isAllowDeleteGrid = checkAllowDeleteAssetGrid();\r\n const isAllowDeleteFull = checkAllowDeleteAssetFull();\r\n\r\n const checkButtonDisabled = (currentSelected) => {\r\n // const ownSelectedAssets = currentSelected?.map((asset) => {\r\n // return asset?.isOwner; // before: asset.canEdit\r\n // });\r\n\r\n const isAllowDeletePreview = checkAllowDeletePreview(\r\n typeView,\r\n isAllowDeleteGrid,\r\n isAllowDeleteFull\r\n );\r\n\r\n // The condition for the activation of the button is\r\n const isActivate =\r\n isAllowDeletePreview &&\r\n // the preview section is not disabled\r\n !sectionDisabled &&\r\n // the asset is not iFrame\r\n !isIframe;\r\n\r\n if (isActivate) {\r\n setDisabled(false);\r\n } else {\r\n setDisabled(true);\r\n }\r\n };\r\n\r\n const showConfirmModal = () => {\r\n dialogFunction({\r\n type: 'warn',\r\n content: intl.formatMessage(previewMessages.deletePreviewConfirmMessage),\r\n onOk: callDeletePreviewApi,\r\n });\r\n };\r\n\r\n const showErrorMessage = () => {\r\n dialogFunction({\r\n type: 'error',\r\n content: intl.formatMessage(previewMessages.deletePreviewError),\r\n cancelButtonProps: {\r\n style: {\r\n display: 'none',\r\n },\r\n },\r\n });\r\n };\r\n\r\n const callDeletePreviewApi = () => {\r\n //generate request data\r\n const requestData = currentSelectedAssets.reduce((accumulator, asset) => {\r\n return { ...accumulator, [asset.id]: null };\r\n }, {});\r\n\r\n const data = {\r\n data: requestData,\r\n };\r\n\r\n digitalAssetsService\r\n .updateDigitalAssetThumb(data)\r\n .then((response) => {\r\n if (response.isSuccess) {\r\n makePageReload();\r\n } else {\r\n showErrorMessage();\r\n }\r\n })\r\n .catch((err) => {\r\n showErrorMessage();\r\n });\r\n };\r\n\r\n const makePageReload = () => {\r\n // only reload page\r\n if (typeView !== constant.RIBBON_TYPES.DETAILSVIEW) {\r\n // reload asset full view page\r\n reloadPage();\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n checkButtonDisabled(currentSelectedAssets);\r\n //eslint-disable-next-line\r\n }, [currentSelectedAssets]);\r\n\r\n return (\r\n }\r\n label={ribbonMessages.deletePreview}\r\n disabled={disabled}\r\n onClick={showConfirmModal}\r\n />\r\n );\r\n};\r\n\r\nconst checkAllowDeletePreview = (\r\n typeView = '',\r\n isAllowDeleteGrid,\r\n isAllowDeleteFull\r\n) => {\r\n if (typeView?.toLowerCase() === 'grid') {\r\n return isAllowDeleteGrid;\r\n }\r\n\r\n return isAllowDeleteFull;\r\n};\r\n\r\nDeletePreview.propTypes = {\r\n currentSelectedAssets: PropTypes.array,\r\n sectionDisabled: PropTypes.bool,\r\n typeView: PropTypes.oneOf(['grid', 'full']),\r\n isIframe: PropTypes.bool,\r\n};\r\n\r\nDeletePreview.defaultProps = {\r\n typeView: 'full',\r\n};\r\n\r\nexport default injectIntl(DeletePreview);\r\n","import React, { useState, useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\n\r\nimport { Modal } from 'antd';\r\nimport { DeploymentUnitOutlined } from '@ant-design/icons';\r\nimport { cloneDeep } from 'lodash';\r\n\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\nimport { GeneratePreviewModal, GenerateConfirmModal } from '../../index';\r\n\r\nimport * as actionsAsset from 'pages/branded-assets/controllers/actions';\r\nimport * as assetsSelector from 'pages/branded-assets/controllers/selectors';\r\nimport * as digitalAssetsService from 'services/digitalAsset';\r\nimport * as ribbonSelector from '@redux/ribbon/selectors';\r\n\r\n// import * as assetFullViewSelector from 'pages/asset-full-view/controllers/selectors';\r\n\r\nimport * as constant from 'static/Constants';\r\nimport { dialogFunction } from 'common/components/index';\r\nimport { useDispatchReloadPage } from 'hooks/useReloadPage';\r\n\r\nimport ribbonMessages from 'i18n/messages/home';\r\nimport assetPreviewMessages from 'i18n/messages/assetPreview';\r\nimport { injectIntl } from 'react-intl';\r\n\r\nimport { useCheckAllowEditAssets } from 'hooks';\r\n\r\nconst GeneratePreview = (props) => {\r\n const dispatch = useDispatch();\r\n const reloadPage = useDispatchReloadPage();\r\n // props\r\n const { intl, currentSelectedAssets, sectionDisabled, disabledPreview } =\r\n props;\r\n\r\n const cachedImages = useSelector(assetsSelector.makeSelectCachedImages());\r\n\r\n // const assetFullView = useSelector(\r\n // assetFullViewSelector.makeSelectAssetData()\r\n // );\r\n\r\n const typeView = useSelector(ribbonSelector.selectRibbonType());\r\n\r\n const view = useSelector(ribbonSelector.selectRibbon());\r\n\r\n const isFullView = view === constant.RIBBON_VIEW.ASSET_FULL_VIEW.NAME;\r\n\r\n const { checkAllowEditAssetFull, checkAllowEditAssetGrid } =\r\n useCheckAllowEditAssets();\r\n\r\n const isAllowEditFull = checkAllowEditAssetFull();\r\n const isAllowEditGrid = checkAllowEditAssetGrid();\r\n\r\n // state\r\n // button disabled\r\n const [disabled, setDisabled] = useState(true);\r\n\r\n // generate thumbnail modal\r\n const [visible, setVisible] = useState(false);\r\n // confirm modal\r\n const [showConfirmModal, setShowConfirmModal] = useState(false);\r\n\r\n // dialog loading\r\n const loadingHook = useState(false);\r\n const [, setLoading] = loadingHook;\r\n\r\n // this is generate thumbnail response data, and the last data submit to update asset preview thumb\r\n // when user upload new thumb, this data will update\r\n const rootDataHook = useState([]);\r\n const [rootData] = rootDataHook;\r\n\r\n const selectGenerateThumbHook = useState([]);\r\n const [selectedGeneratedThumb, setSelectedGeneratedThumb] =\r\n selectGenerateThumbHook;\r\n\r\n // function\r\n const showConfirmModalHandler = () => {\r\n setShowConfirmModal(true);\r\n };\r\n\r\n const hideConfirmModalHandler = () => {\r\n setShowConfirmModal(false);\r\n };\r\n\r\n const showPopup = () => {\r\n hideConfirmModalHandler();\r\n setVisible(true);\r\n setLoading(true);\r\n };\r\n\r\n const handleOk = () => {\r\n setLoading(true);\r\n // call api submit update asset thumbnail\r\n callApiUpdateAssetsThumb();\r\n };\r\n\r\n const handleCancel = () => {\r\n setVisible(false);\r\n // reset preview dialog state\r\n setLoading(false);\r\n setSelectedGeneratedThumb([]);\r\n };\r\n\r\n const createCachedImages = (cacheDataList) => {\r\n const newCachedImages = cloneDeep(cachedImages);\r\n\r\n cacheDataList &&\r\n cacheDataList.forEach((assetId) => {\r\n if (newCachedImages[assetId]) {\r\n newCachedImages[assetId]++;\r\n } else {\r\n newCachedImages[assetId] = 1;\r\n }\r\n });\r\n\r\n dispatch(actionsAsset.updateCacheImage(newCachedImages));\r\n };\r\n const onClickOkSuccessMessage = (close) => {\r\n makePageReload();\r\n close();\r\n };\r\n const makePageReload = () => {\r\n // only reload page\r\n if (typeView !== constant.RIBBON_TYPES.DETAILSVIEW) {\r\n // reload asset full view page\r\n reloadPage();\r\n }\r\n };\r\n\r\n const callApiUpdateAssetsThumb = () => {\r\n //generate request data\r\n const requestData = selectedGeneratedThumb.reduce((accumulator, id) => {\r\n const currentRootDataItem = rootData.find(({ assetId }) => {\r\n return assetId === id;\r\n });\r\n return { ...accumulator, [id]: currentRootDataItem.data };\r\n }, {});\r\n\r\n const data = {\r\n data: requestData,\r\n };\r\n\r\n digitalAssetsService\r\n .updateDigitalAssetThumb(data)\r\n .then((response) => {\r\n if (response.isSuccess) {\r\n // show message\r\n showSuccessMessage();\r\n\r\n // cached update image\r\n const cacheData = data?.data;\r\n const cacheDataList = cacheData && Object.keys(cacheData);\r\n createCachedImages(cacheDataList);\r\n } else {\r\n showErrorMessage(\r\n intl.formatMessage(assetPreviewMessages.generatePreviewError)\r\n );\r\n }\r\n })\r\n .catch((err) => {\r\n showErrorMessage(\r\n intl.formatMessage(assetPreviewMessages.generatePreviewError)\r\n );\r\n })\r\n .finally(() => {\r\n // hide loading\r\n setLoading(false);\r\n // close dialog\r\n setVisible(false);\r\n });\r\n };\r\n\r\n const backgroundGeneration = () => {\r\n hideConfirmModalHandler();\r\n const selectedAssetsId =\r\n currentSelectedAssets?.length &&\r\n currentSelectedAssets.map((asset) => {\r\n return asset.id;\r\n });\r\n\r\n const params = {\r\n assetIds: selectedAssetsId,\r\n };\r\n\r\n digitalAssetsService\r\n .generatePreviewBackground(params)\r\n .then((response) => {\r\n if (response.isSuccess) {\r\n // show success message\r\n showSuccessMessage();\r\n\r\n // cached update image\r\n createCachedImages(selectedAssetsId);\r\n } else {\r\n showErrorMessage(\r\n intl.formatMessage(assetPreviewMessages.generatePreviewError)\r\n );\r\n }\r\n })\r\n .catch((err) => {\r\n showErrorMessage(\r\n intl.formatMessage(assetPreviewMessages.generatePreviewError)\r\n );\r\n });\r\n };\r\n\r\n const showSuccessMessage = () => {\r\n dialogFunction({\r\n type: 'success',\r\n content: intl.formatMessage(assetPreviewMessages.generatePreviewSuccess),\r\n onOk: onClickOkSuccessMessage,\r\n cancelButtonProps: {\r\n style: {\r\n display: 'none',\r\n },\r\n },\r\n });\r\n };\r\n\r\n const showErrorMessage = (message) => {\r\n dialogFunction({\r\n type: 'error',\r\n content: message,\r\n cancelButtonProps: {\r\n style: {\r\n display: 'none',\r\n },\r\n },\r\n });\r\n };\r\n\r\n const checkButtonDisabled = (currentSelected) => {\r\n // const ownSelectedAssets = currentSelected?.map((asset) => {\r\n // return asset?.isOwner; // before: asset.canEdit\r\n // });\r\n\r\n const isAllowGeneratePreview = checkAllowGeneratePreview(\r\n isFullView,\r\n isAllowEditFull,\r\n isAllowEditGrid\r\n );\r\n\r\n // The condition for the activation of the button is\r\n const isActivate =\r\n isAllowGeneratePreview &&\r\n // the preview section is not disabled\r\n !sectionDisabled;\r\n\r\n if (isActivate) {\r\n setDisabled(false);\r\n } else {\r\n setDisabled(true);\r\n }\r\n };\r\n\r\n // component did update\r\n // update disabled when currentSelectedAssets change\r\n useEffect(() => {\r\n checkButtonDisabled(currentSelectedAssets);\r\n //eslint-disable-next-line\r\n }, [currentSelectedAssets]);\r\n\r\n // variables\r\n // modal configs\r\n const modalConfig = {\r\n visible,\r\n okText: intl.formatMessage(assetPreviewMessages.generatePreviewSubmit),\r\n okButtonProps: {\r\n disabled: !selectedGeneratedThumb.length,\r\n },\r\n onOk: handleOk,\r\n onCancel: handleCancel,\r\n destroyOnClose: true,\r\n closable: false,\r\n wrapClassName: 'generate-preview__modal',\r\n width: 'auto',\r\n style: {\r\n maxWidth: 'min(1052px, 85%)',\r\n width: 'auto',\r\n display: 'inline-block',\r\n },\r\n bodyStyle: {\r\n maxHeight: '80vh',\r\n minWidth: '695px',\r\n overflowY: 'auto',\r\n padding: '16px 10px',\r\n },\r\n };\r\n\r\n const confirmModalConfig = {\r\n visible: showConfirmModal,\r\n onYes: backgroundGeneration,\r\n onNo: showPopup,\r\n onCancel: hideConfirmModalHandler,\r\n };\r\n\r\n return (\r\n <>\r\n }\r\n label={ribbonMessages.generatePreview}\r\n onClick={showConfirmModalHandler}\r\n disabled={disabled || disabledPreview}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst checkAllowGeneratePreview = (\r\n isFullView,\r\n isAllowEditFull,\r\n isAllowEditGrid\r\n) => {\r\n if (isFullView) {\r\n return isAllowEditFull;\r\n }\r\n\r\n return isAllowEditGrid;\r\n};\r\n\r\nGeneratePreview.propsTypes = {\r\n /**\r\n * selected assets to generate thumbnail\r\n */\r\n currentSelectedAssets: PropTypes.array,\r\n /**\r\n * preview section ribbon disabled condition\r\n */\r\n sectionDisabled: PropTypes.bool,\r\n};\r\n\r\nexport default injectIntl(GeneratePreview);\r\n","import React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport Messages from 'i18n/messages/home';\r\n\r\nimport { FolderOpenOutlined } from '@ant-design/icons';\r\n\r\nimport { forwardTo } from 'utils/common/route';\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\nimport gridSelector from 'common/components/grid-view/controllers/selectors';\r\n\r\nconst OpenAsset = () => {\r\n const selectedAssetDetail = useSelector(\r\n gridSelector.makeSelectDetailCurrentITemsSelection()\r\n );\r\n const assetId =\r\n selectedAssetDetail && selectedAssetDetail?.length > 0\r\n ? selectedAssetDetail[0]?.id\r\n : undefined;\r\n\r\n return (\r\n }\r\n label={Messages.openAsset}\r\n onClick={() => forwardTo(`/asset/${assetId}`)}\r\n disabled={assetId === undefined || selectedAssetDetail.length !== 1}\r\n />\r\n );\r\n};\r\n\r\nexport default OpenAsset;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport Messages from 'i18n/messages/home';\r\nimport { PushpinOutlined } from '@ant-design/icons';\r\n\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\n\r\nconst AddOpenItemBtn = ({ clickActionCallback }) => {\r\n const onCheckDisableBtn = () => {\r\n const routes = [\r\n '/asset/create',\r\n '/asset/create-iframe',\r\n '/member-management-company',\r\n '/asset/versions',\r\n ];\r\n let currentRoute = window.location.pathname;\r\n let isDisable = false;\r\n routes.every((route) => {\r\n if (currentRoute.includes(route)) {\r\n isDisable = true;\r\n return false;\r\n } else return true;\r\n });\r\n return isDisable;\r\n };\r\n\r\n return (\r\n }\r\n label={Messages.addOpenItem}\r\n onClick={clickActionCallback}\r\n disabled={onCheckDisableBtn()}\r\n />\r\n );\r\n};\r\n\r\nAddOpenItemBtn.propTypes = {\r\n clickActionCallback: PropTypes.func,\r\n};\r\n\r\nexport default AddOpenItemBtn;\r\n","import * as React from \"react\";\nconst SvgCopy = props => ;\nexport default SvgCopy;","import React from 'react';\r\n\r\nimport { RibbonButton } from 'common/components';\r\nimport IconCopyFolder from 'common/components/button/svg-icons/copy.svg?react';\r\n\r\nimport Messages from 'i18n/messages/home';\r\nimport { injectIntl } from 'react-intl';\r\n\r\nconst CopyFolder = ({ selectedFolders, disabled, onClick }) => {\r\n const isDisable = selectedFolders?.length === 0 || disabled;\r\n\r\n return (\r\n }\r\n label={Messages.copyFolder}\r\n disabled={isDisable}\r\n onClick={onClick}\r\n />\r\n );\r\n};\r\n\r\nexport default injectIntl(CopyFolder);\r\n","import React, { useState } from 'react';\r\n\r\nimport { Input, Checkbox, Typography } from 'antd';\r\nimport { Form, StyledModal, FolderSelector } from 'common/components';\r\n\r\nimport { apiHandler } from 'utils/api';\r\nimport { useDispatchReloadPage } from 'hooks/useReloadPage';\r\nimport { useGridView } from 'hooks/useGridView';\r\n\r\nimport * as folderServices from 'services/folder';\r\n\r\nimport { useIntl } from 'react-intl';\r\nimport Messages from 'i18n/messages/folder';\r\n\r\nconst { Title } = Typography;\r\n\r\nconst CopyFolderModal = (props) => {\r\n const [form] = Form.useForm();\r\n const intl = useIntl();\r\n\r\n const { visible, closeModal, selectedFolder, onCopy } = props;\r\n\r\n const [loading, setLoading] = useState(false);\r\n\r\n const reloadPage = useDispatchReloadPage();\r\n const { clearGridSelection } = useGridView();\r\n\r\n const onBreadcrumbChange = (currentBreadcrumbItem, breadcrumbList) => {\r\n const hierarchy =\r\n breadcrumbList\r\n .map((breadcrumbItem) => breadcrumbItem.id)\r\n .join('/')\r\n .replace('home', '') + '/';\r\n\r\n const folder = { id: currentBreadcrumbItem, hierarchy };\r\n\r\n form.setFieldsValue({ destinationFolder: folder });\r\n };\r\n\r\n const onSelectDestinationFolder = (folder) => {\r\n form.setFieldsValue({ destinationFolder: folder });\r\n };\r\n\r\n const onSubmit = () => {\r\n form.validateFields().then((values) => {\r\n let { newFolderName, destinationFolder, ...restValues } = values;\r\n\r\n const params = {\r\n ...restValues,\r\n newFolderName: newFolderName.trim(),\r\n folderId: selectedFolder?.id,\r\n destinationFolderId: destinationFolder?.id,\r\n };\r\n\r\n if (destinationFolder?.id === 'home') {\r\n delete params['destinationFolderId'];\r\n destinationFolder = undefined;\r\n }\r\n\r\n const successMessage = intl.formatMessage(Messages.copyFolderSuccess);\r\n const errorMessage = intl.formatMessage(Messages.copyFolderError);\r\n\r\n setLoading(true);\r\n\r\n apiHandler({\r\n service: folderServices.copyFolder,\r\n params,\r\n successMessage,\r\n errorMessage,\r\n successCallback: copySuccessCallback({ destinationFolder }),\r\n onFinally: copyFinally,\r\n });\r\n });\r\n };\r\n\r\n const cancelModal = () => {\r\n closeModal();\r\n resetState();\r\n };\r\n\r\n const copySuccessCallback =\r\n ({ destinationFolder }) =>\r\n () => {\r\n reloadPage();\r\n cancelModal();\r\n\r\n clearGridSelection();\r\n onCopy && onCopy({ destinationFolder });\r\n };\r\n\r\n const copyFinally = () => {\r\n setLoading(false);\r\n };\r\n\r\n const resetState = () => {\r\n form.resetFields();\r\n setLoading(false);\r\n };\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n {intl.formatMessage({\r\n id: 'Taco.folder.component.copyFormCheckbox',\r\n })}\r\n \r\n \r\n\r\n \r\n Select Destination Folder\r\n
\r\n \r\n
\r\n \r\n \r\n );\r\n};\r\n\r\nexport default CopyFolderModal;\r\n","import React from 'react';\r\nimport { Modal } from 'antd';\r\n\r\nconst ModalAction = (props) => {\r\n return ;\r\n};\r\n\r\nexport default ModalAction;\r\n","import React, { useState, useEffect } from 'react';\r\nimport { Button, Col, Input, Row } from 'antd';\r\n\r\nimport { CustomNotification, Form } from 'common/components';\r\nimport ModalAction from 'common/components/modal-action/ModalAction';\r\n\r\nimport * as folderServices from 'services/folder';\r\nimport { apiHandler } from 'utils/api';\r\n\r\nimport { injectIntl } from 'react-intl';\r\nimport Messages from 'i18n/messages/folder';\r\nimport { sleep } from 'utils/delay';\r\n\r\nconst CreateFolderModal = (props) => {\r\n const {\r\n intl,\r\n visibleHook,\r\n successCallback,\r\n handleReloadFolderList,\r\n currentFolderId,\r\n parentId,\r\n onReloadWhenSaveSuccess,\r\n additionalButton,\r\n skipNotification = false,\r\n } = props;\r\n const [visible, setVisible] = visibleHook;\r\n const [loading, setLoading] = useState(false);\r\n const [formInst] = Form.useForm();\r\n\r\n const closeModal = () => {\r\n !loading && setVisible(false);\r\n };\r\n\r\n const handleCreateFolder = async (value) => {\r\n formInst\r\n .validateFields()\r\n .then((values) => {\r\n const { name } = values;\r\n const trimmedName = name?.trim();\r\n if (name) {\r\n const params = {\r\n folderName: trimmedName,\r\n parentFolderId: parentId,\r\n };\r\n\r\n setLoading(true);\r\n apiHandler({\r\n service: folderServices.createFolder,\r\n params: params,\r\n successMessage: intl.formatMessage(Messages.createFolderSuccess),\r\n errorMessage: intl.formatMessage(Messages.createFolderError),\r\n successCallback: createFolderSuccessCallback,\r\n failCallback: createFolderFailureCallback,\r\n onFinally: createFolderFinally,\r\n skipNotification,\r\n });\r\n }\r\n })\r\n .catch((error) => {});\r\n };\r\n\r\n const createFolderSuccessCallback = async (responseData) => {\r\n await sleep(1000);\r\n\r\n !!successCallback && successCallback(responseData);\r\n !!onReloadWhenSaveSuccess &&\r\n onReloadWhenSaveSuccess(responseData.id, 'create');\r\n };\r\n\r\n const createFolderFailureCallback = (message) => {\r\n message && CustomNotification.error(message);\r\n };\r\n\r\n const createFolderFinally = async () => {\r\n if (handleReloadFolderList) {\r\n await sleep(3000);\r\n handleReloadFolderList(currentFolderId);\r\n }\r\n\r\n setVisible(false);\r\n setLoading(false);\r\n };\r\n\r\n useEffect(() => {\r\n if (!visible) {\r\n formInst.resetFields();\r\n }\r\n }, [visible, formInst]);\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n \r\n\r\n \r\n \r\n {additionalButton && additionalButton()}\r\n \r\n \r\n \r\n {intl.formatMessage(Messages.createModalCreateButton)}\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default injectIntl(CreateFolderModal);\r\n","import React from 'react';\r\n\r\nimport Slot from 'common/components/slot/Slot';\r\nimport GridStyleLayout from 'common/components/layout/GridStyleLayout';\r\n\r\nconst ManageScheduleDownloadLayout = (props) => {\r\n const { children } = props;\r\n\r\n const layoutAreas = [['toolbar'], ['grid']];\r\n\r\n return (\r\n \r\n \r\n {children}\r\n \r\n \r\n {children}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default ManageScheduleDownloadLayout;\r\n","import { useMutation } from '@tanstack/react-query';\r\n\r\nimport * as folderServices from 'services/folder';\r\nimport { dialogFunctionAsync, CustomNotification } from 'common/components';\r\n\r\nimport { getManageScheduleDownloadKey } from './queries';\r\n\r\nexport const useDeleteScheduleDownload = (props) => {\r\n const { folderId } = props;\r\n\r\n const deleteScheduleDownload = useMutation({\r\n mutationKey: ['delete-schedule-download-folder'],\r\n mutationFn: async (params) => {\r\n try {\r\n return folderServices.removeFolderScheduleDownload(params);\r\n } catch (error) {\r\n console.error('error: ', error);\r\n }\r\n },\r\n meta: {\r\n invalidates: [getManageScheduleDownloadKey(folderId)],\r\n },\r\n });\r\n\r\n const showDeleteConfirm = () => {\r\n return dialogFunctionAsync({\r\n type: 'warn',\r\n content: 'Are you sure you want to delete schedule?',\r\n okText: 'Delete',\r\n cancelText: 'Cancel',\r\n okButtonProps: {\r\n danger: true,\r\n },\r\n });\r\n };\r\n\r\n const showDeleteMessage = (status, message) => {\r\n if (status === 'success') {\r\n CustomNotification.success('Delete Schedule successfully');\r\n } else {\r\n CustomNotification.error(message || 'Fail to delete Schedule');\r\n }\r\n };\r\n\r\n return { deleteScheduleDownload, showDeleteConfirm, showDeleteMessage };\r\n};\r\n","import { useMutation } from '@tanstack/react-query';\r\n\r\nimport * as folderServices from 'services/folder';\r\nimport { CustomNotification } from 'common/components';\r\n\r\nimport { getManageScheduleDownloadKey } from './queries';\r\n\r\nexport const useUpdateScheduleDownload = (props) => {\r\n const { folderId } = props;\r\n\r\n const updateScheduleDownload = useMutation({\r\n mutationKey: ['update-schedule-download-folder'],\r\n mutationFn: async (params) => {\r\n try {\r\n return folderServices.updateFolderScheduleDownload(params);\r\n } catch (error) {\r\n console.error('error: ', error);\r\n }\r\n },\r\n meta: {\r\n invalidates: [getManageScheduleDownloadKey(folderId)],\r\n },\r\n });\r\n\r\n return { updateScheduleDownload };\r\n};\r\n","import React, { useState } from 'react';\r\n\r\nimport { Row, Col, Space } from 'antd';\r\n\r\nimport {\r\n FormEditButton,\r\n FormDeleteButton,\r\n FormCancelButton,\r\n CustomNotification,\r\n} from 'common/components';\r\nimport DownloadFolderModal from 'common/components/modal-download-folder/DownloadFolderModal';\r\n\r\nimport { useGetScheduleDownloadDetailQuery } from 'hooks/folders/queries';\r\nimport {\r\n useDeleteScheduleDownload,\r\n useCancelScheduleDownload,\r\n useUpdateScheduleDownload,\r\n} from 'hooks/folders';\r\n\r\nconst ManageScheduleDownloadToolbar = (props = {}) => {\r\n const { selectedSchedule, setSelectedSchedule, folderId } = props || {};\r\n\r\n const [downloadModalVisible, setDownloadModalVisible] = useState(false);\r\n\r\n const { data: schedulerDetail } = useGetScheduleDownloadDetailQuery({\r\n scheduleId: selectedSchedule?.id,\r\n enabled: selectedSchedule?.id && downloadModalVisible,\r\n });\r\n\r\n const { downloadSetting, ...restSchedulerDetail } = schedulerDetail || {};\r\n\r\n const { updateScheduleDownload } = useUpdateScheduleDownload({ folderId });\r\n const { deleteScheduleDownload, showDeleteConfirm, showDeleteMessage } =\r\n useDeleteScheduleDownload({ folderId });\r\n const { cancelScheduleDownload, showCancelConfirm, showCancelMessage } =\r\n useCancelScheduleDownload({\r\n folderId,\r\n });\r\n\r\n const showDownloadModal = () => {\r\n setDownloadModalVisible(true);\r\n };\r\n\r\n const closeDownloadModal = () => {\r\n setDownloadModalVisible(false);\r\n };\r\n\r\n const updateScheduler = async (formParams) => {\r\n try {\r\n const params = { id: selectedSchedule?.id, ...formParams };\r\n const response = await updateScheduleDownload.mutateAsync(params);\r\n\r\n if (response?.isSuccess) {\r\n CustomNotification.success('Update Scheduler Successfully');\r\n\r\n return Promise.resolve({ isSuccess: true });\r\n } else CustomNotification.error('Fail to update scheduler');\r\n } catch (error) {\r\n CustomNotification.error('Fail to update scheduler');\r\n }\r\n };\r\n\r\n const onClickEditBtn = () => {\r\n showDownloadModal();\r\n };\r\n\r\n const onClickDeleteBtn = async () => {\r\n const confirmed = await showDeleteConfirm();\r\n\r\n if (!confirmed?.ok) return;\r\n\r\n try {\r\n const result = await deleteScheduleDownload.mutateAsync({\r\n id: selectedSchedule?.id,\r\n });\r\n\r\n if (result.isSuccess) {\r\n setSelectedSchedule(null);\r\n return showDeleteMessage('success');\r\n }\r\n\r\n showDeleteMessage('error', result?.message);\r\n } catch (error) {\r\n showDeleteMessage('error');\r\n }\r\n };\r\n\r\n const onClickCancelBtn = async () => {\r\n const confirmed = await showCancelConfirm();\r\n\r\n if (!confirmed?.ok) return;\r\n\r\n try {\r\n const result = await cancelScheduleDownload.mutateAsync({\r\n id: selectedSchedule?.id,\r\n });\r\n\r\n if (result.isSuccess) {\r\n setSelectedSchedule(null);\r\n return showCancelMessage('success');\r\n }\r\n\r\n showCancelMessage('error', result?.message);\r\n } catch (error) {\r\n showCancelMessage('error');\r\n }\r\n };\r\n\r\n const cancelButtonDisabled =\r\n !selectedSchedule ||\r\n selectedSchedule?.status?.toLowerCase() !== 'active' ||\r\n deleteScheduleDownload?.isLoading;\r\n\r\n const editButtonDisabled =\r\n !selectedSchedule ||\r\n selectedSchedule?.status?.toLowerCase() !== 'active' ||\r\n deleteScheduleDownload?.isLoading ||\r\n cancelScheduleDownload?.isLoading;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default ManageScheduleDownloadToolbar;\r\n","import moment from 'moment';\r\nimport { formatMDYWithParam } from 'utils/formatDate';\r\n\r\nimport { TIME_ZONES } from 'static/TimeZones';\r\n\r\nexport const getColumns = () => {\r\n const columns = [\r\n {\r\n field: 'created',\r\n headerName: 'Created at',\r\n flex: 1,\r\n valueFormatter: formatMDYWithParam,\r\n },\r\n {\r\n field: 'runAt',\r\n headerName: 'Run at',\r\n flex: 1,\r\n valueFormatter: (params) => moment(params.value).format('HH:mm:ss'),\r\n },\r\n {\r\n field: 'timezone',\r\n flex: 1,\r\n valueFormatter: ({ value }) =>\r\n TIME_ZONES.find((timezone) => timezone.utc[0] === value)?.text || value,\r\n },\r\n {\r\n field: 'interval',\r\n flex: 1,\r\n },\r\n { field: 'status' },\r\n ];\r\n\r\n return columns;\r\n};\r\n","import React, { useRef } from 'react';\r\n\r\nimport { AgGridClient } from 'common/components';\r\n\r\nimport * as utils from './utils';\r\n\r\nimport { useManageScheduleDownloadQuery } from 'hooks/folders/queries';\r\n\r\nconst containerStyle = {\r\n height: '100%',\r\n};\r\n\r\nconst ManageScheduleDownloadGrid = (props) => {\r\n const gridRef = useRef();\r\n const { folderId, setSelectedSchedule } = props;\r\n\r\n const { data } = useManageScheduleDownloadQuery({ folderId });\r\n\r\n const scheduleList = data?.schedules;\r\n\r\n const columns = utils.getColumns();\r\n\r\n const onSelectionChangedHandler = (e) => {\r\n const selectedRow = gridRef.current.api.getSelectedRows();\r\n setSelectedSchedule(selectedRow?.[0]);\r\n };\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport default ManageScheduleDownloadGrid;\r\n","import React, { useState, useEffect } from 'react';\r\n\r\nimport { Modal } from 'antd';\r\nimport { useMedia } from 'react-media';\r\n\r\nimport { WithLoading } from 'common/components';\r\n\r\nimport ManageScheduleDownloadLayout from './ManageScheduleDownloadLayout';\r\nimport ManageScheduleDownloadToolbar from './ManageScheduleDownloadToolbar';\r\nimport ManageScheduleDownloadGrid from './ManageScheduleDownloadGrid';\r\n\r\nconst ManageScheduleDownloadModal = (props) => {\r\n const { visible, folderId, onCancel } = props;\r\n\r\n const [selectedSchedule, setSelectedSchedule] = useState(null);\r\n\r\n const isSmallScreen = useMedia({ query: '(max-width: 1440px)' });\r\n\r\n const resetState = () => {\r\n setSelectedSchedule(null);\r\n };\r\n\r\n useEffect(() => {\r\n resetState();\r\n }, [visible]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nexport default ManageScheduleDownloadModal;\r\n","import React, { useState } from 'react';\r\n\r\nimport { FieldTimeOutlined } from '@ant-design/icons';\r\n\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\nimport ManageScheduleDownloadModal from 'common/components/modal-manage-schedule-download/ManageScheduleDownloadModal';\r\n\r\nimport Messages from 'i18n/messages/home';\r\n\r\nconst ManageScheduleDownload = (props) => {\r\n const { selectedFolder } = props;\r\n const [manageScheduleModalVisible, setManageScheduleModalVisible] =\r\n useState(false);\r\n\r\n const onClick = () => {\r\n setManageScheduleModalVisible(true);\r\n };\r\n\r\n const closeDownloadModalVisible = () => {\r\n setManageScheduleModalVisible(false);\r\n };\r\n\r\n const folderId = selectedFolder?.id;\r\n const disabled = !folderId || !selectedFolder?.hasSchedule;\r\n\r\n return (\r\n
\r\n }\r\n label={Messages.manageSchedule}\r\n onClick={onClick}\r\n disabled={disabled}\r\n />\r\n \r\n
\r\n );\r\n};\r\n\r\nexport default ManageScheduleDownload;\r\n","import React from 'react';\r\n\r\nimport { DoubleRightOutlined } from '@ant-design/icons';\r\nimport { RibbonButton } from 'common/components';\r\n\r\nimport Messages from 'i18n/messages/home';\r\nimport { injectIntl } from 'react-intl';\r\n\r\nconst MoveFolder = ({ selectedItems, disabled, onClick }) => {\r\n const isDisable = selectedItems?.length === 0 || disabled;\r\n\r\n return (\r\n }\r\n label={Messages.moveFolder}\r\n disabled={isDisable}\r\n onClick={onClick}\r\n />\r\n );\r\n};\r\n\r\nexport default injectIntl(MoveFolder);\r\n","import React, { useState, useCallback } from 'react';\r\n\r\nimport { Typography, Checkbox, Row, Col } from 'antd';\r\nimport { InfoCircleOutlined } from '@ant-design/icons';\r\n\r\nimport {\r\n StyledModal,\r\n FolderSelector,\r\n} from 'common/components';\r\n\r\nimport { apiHandler } from 'utils/api';\r\nimport { useDispatchReloadPage } from 'hooks/useReloadPage';\r\nimport { useGridView } from 'hooks/useGridView';\r\n\r\nimport * as folderServices from 'services/folder';\r\n\r\nimport { useIntl } from 'react-intl';\r\nimport Messages from 'i18n/messages/folder';\r\n\r\nconst { Title, Text } = Typography;\r\n\r\nconst MoveFolderModal = (props) => {\r\n const intl = useIntl();\r\n\r\n const {\r\n visible,\r\n closeModal,\r\n selectedItems,\r\n currentFolderId,\r\n onMove,\r\n shouldReloadPage = true,\r\n } = props;\r\n\r\n const [destinationFolder, setDestinationFolder] = useState(null);\r\n const [isMoveToRoot, setIsMoveToRoot] = useState(false);\r\n const [loading, setLoading] = useState(false);\r\n\r\n const reloadPage = useDispatchReloadPage();\r\n const { clearGridSelection } = useGridView();\r\n\r\n const disableItemHandler = useCallback(\r\n (destinationItem) => {\r\n //* loop through to check\r\n const disabled = selectedItems?.every((selectedItem) => {\r\n //* disable when destination is itself\r\n const isItself = selectedItem.id === destinationItem.id;\r\n //* or\r\n //* disable when destination is its child\r\n //* - destination hierarchy contain its id\r\n const isChild =\r\n destinationItem?.hierarchy?.indexOf(selectedItem.id + '') > -1;\r\n\r\n return isItself || isChild;\r\n });\r\n\r\n //* disabled when moving to root\r\n return disabled || isMoveToRoot;\r\n },\r\n [selectedItems, isMoveToRoot]\r\n );\r\n\r\n const onSelectDestinationFolder = (folder) => {\r\n setDestinationFolder(folder);\r\n };\r\n\r\n const onBreadcrumbChange = (folderId, breadcrumbList) => {\r\n const hierarchy =\r\n breadcrumbList\r\n .map((breadcrumbItem) => breadcrumbItem.id)\r\n .join('/')\r\n .replace('home', '') + '/';\r\n\r\n setDestinationFolder(folderId ? { id: folderId, hierarchy } : null);\r\n };\r\n\r\n const onChangeMoveToRoot = (e) => {\r\n setIsMoveToRoot(e.target.checked);\r\n };\r\n\r\n const onSubmit = async () => {\r\n const destination = !isMoveToRoot\r\n ? { destinationFolderId: destinationFolder?.id }\r\n : {};\r\n\r\n const params = {\r\n itemSelected: getMovedItemParams(),\r\n ...destination,\r\n isMoveRootFolder: isMoveToRoot,\r\n currentFolderId: currentFolderId !== 'home' ? currentFolderId : 0,\r\n };\r\n\r\n const successMessage = intl.formatMessage(Messages.moveFolderSuccess);\r\n const errorMessage = intl.formatMessage(Messages.moveFolderError);\r\n\r\n setLoading(true);\r\n\r\n apiHandler({\r\n service: folderServices.moveFolder,\r\n params,\r\n successMessage,\r\n errorMessage,\r\n successCallback: moveSuccessCallback(destinationFolder),\r\n onFinally: moveFinally,\r\n });\r\n };\r\n\r\n const cancelModal = () => {\r\n closeModal();\r\n resetState();\r\n };\r\n\r\n const getMovedItemParams = () => {\r\n return selectedItems?.reduce((accumulator, currentSelectedItem) => {\r\n const { id, type } = currentSelectedItem;\r\n const itemMoved = { id, type };\r\n\r\n //* moveToRoot allow moving folders only\r\n const shouldIgnoreItem = isMoveToRoot && type?.toLowerCase() !== 'folder';\r\n\r\n return shouldIgnoreItem ? accumulator : [...accumulator, itemMoved];\r\n }, []);\r\n };\r\n\r\n const moveSuccessCallback = (destinationFolder) => () => {\r\n if (shouldReloadPage) {\r\n reloadPage();\r\n clearGridSelection();\r\n }\r\n\r\n cancelModal();\r\n\r\n onMove && onMove({ destinationFolder });\r\n };\r\n\r\n const moveFinally = () => {\r\n setLoading(false);\r\n };\r\n\r\n const resetState = () => {\r\n setLoading(false);\r\n setDestinationFolder(false);\r\n setIsMoveToRoot(false);\r\n };\r\n\r\n const selectedFolders = selectedItems.filter(\r\n (item) => item?.type?.toLowerCase() === 'folder'\r\n );\r\n const disableMoveToRoot =\r\n selectedFolders.length === 0 ||\r\n selectedItems?.every((item) => item?.level === 1);\r\n\r\n const disableSubmitButton =\r\n (!isMoveToRoot && destinationFolder?.id === 'home') ||\r\n (!destinationFolder && !isMoveToRoot);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {intl.formatMessage(Messages.moveToRoot)}\r\n
\r\n \r\n \r\n {isMoveToRoot ? (\r\n \r\n \r\n {intl.formatMessage(Messages.moveToRootWarningMessage)}\r\n \r\n ) : null}\r\n \r\n \r\n Select Destination Folder\r\n
\r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default MoveFolderModal;\r\n","import React from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\n\r\nimport { FolderAddOutlined } from '@ant-design/icons';\r\nimport ButtonSmallIcon from 'common/components/button/ButtonSmallIcon';\r\n\r\nimport * as actions from '@redux/global/actions';\r\n\r\nimport * as companySelectors from 'pages/company/controllers/selectors';\r\nimport * as assetFullViewSelector from 'pages/asset-full-view/controllers/selectors';\r\n\r\nimport Messages from 'i18n/messages/home';\r\n\r\nimport { ABILITY_ACTION, ABILITY_SUBJECT } from 'static/Permission';\r\nimport { useCheckPermissions } from 'hooks/useCheckPermissions';\r\nimport { useGlobalModal } from 'hooks';\r\n\r\nconst AddFolderControl = ({ selectedItemList }) => {\r\n const dispatch = useDispatch();\r\n\r\n const { MODAL_NAMES, openModal } = useGlobalModal();\r\n\r\n const companyInfo = useSelector(companySelectors.setlectCompanyInfo());\r\n const assetFullView = useSelector(\r\n assetFullViewSelector.makeSelectAssetData()\r\n );\r\n\r\n const isMemOrAssetDetailView = companyInfo?.id || assetFullView?.id;\r\n\r\n const addToFolderClick = () => {\r\n if (isMemOrAssetDetailView) {\r\n openModal(MODAL_NAMES.ADD_ITEMS_TO_FOLDER);\r\n } else dispatch(actions.toggleAddToFolder());\r\n };\r\n\r\n const allowViewFolder = useCheckPermissions([\r\n { action: ABILITY_ACTION.VIEW, subject: ABILITY_SUBJECT.FOLDER },\r\n ]);\r\n\r\n return (\r\n }\r\n label={Messages.addFolder}\r\n className='button-item-dropdown'\r\n disabled={\r\n !allowViewFolder ||\r\n disableButton(window.location.pathname) ||\r\n (selectedItemList && selectedItemList.length === 0)\r\n }\r\n onClick={addToFolderClick}\r\n />\r\n );\r\n};\r\n\r\nconst urlFolders = [\r\n '/folders',\r\n '/folders/shared',\r\n '/folders/owned',\r\n '/favorite/favorite-folders',\r\n];\r\n\r\nconst disableButton = (pathname) => {\r\n return urlFolders.includes(pathname);\r\n};\r\n\r\nAddFolderControl.propTypes = {};\r\n\r\nexport default AddFolderControl;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { StarOutlined } from '@ant-design/icons';\r\nimport ButtonSmallIcon from 'common/components/button/ButtonSmallIcon';\r\n\r\nimport { useFavorite } from 'hooks/useFavorite';\r\n\r\nimport Messages from 'i18n/messages/home';\r\n\r\nconst FavoriteControl = (props) => {\r\n const { type, selectedItemList, isDisabled } = props;\r\n\r\n const { callToggleFavoriteApi } = useFavorite({\r\n entityList: selectedItemList,\r\n type,\r\n });\r\n\r\n //* functions\r\n const onClickHandler = async () => {\r\n callToggleFavoriteApi(true);\r\n };\r\n\r\n return (\r\n }\r\n label={Messages.addFavorite}\r\n className='button-item-dropdown'\r\n onClick={onClickHandler}\r\n disabled={isDisabled}\r\n />\r\n );\r\n};\r\n\r\nFavoriteControl.propTypes = {\r\n type: PropTypes.string,\r\n isDisabled: PropTypes.bool,\r\n};\r\n\r\nexport default FavoriteControl;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { StarFilled } from '@ant-design/icons';\r\nimport ButtonSmallIcon from 'common/components/button/ButtonSmallIcon';\r\n\r\nimport { useFavorite } from 'hooks/useFavorite';\r\n\r\nimport Messages from 'i18n/messages/home';\r\n\r\nconst UnfavoriteControl = (props) => {\r\n const { type, selectedItemList, isFavoriteView } = props;\r\n\r\n const { callToggleFavoriteApi } = useFavorite({\r\n entityList: selectedItemList,\r\n type,\r\n isFavoriteView,\r\n });\r\n\r\n //* variables\r\n const isDisabled = selectedItemList?.length === 0;\r\n\r\n //* functions\r\n const onClickHandler = async () => {\r\n callToggleFavoriteApi(false);\r\n };\r\n\r\n return (\r\n }\r\n label={Messages.removeFavorite}\r\n className='button-item-dropdown'\r\n onClick={onClickHandler}\r\n disabled={isDisabled}\r\n />\r\n );\r\n};\r\n\r\nUnfavoriteControl.propTypes = {\r\n type: PropTypes.string,\r\n};\r\n\r\nexport default UnfavoriteControl;\r\n","import React from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\n\r\nimport { SisternodeOutlined } from '@ant-design/icons';\r\nimport ButtonSmallIcon from 'common/components/button/ButtonSmallIcon';\r\n\r\nimport * as actions from '@redux/global/actions';\r\n\r\nimport Messages from 'i18n/messages/home';\r\n\r\nimport selectorsGridView from 'common/components/grid-view/controllers/selectors';\r\n\r\nconst AddFolderToNewAPL = () => {\r\n const dispatch = useDispatch();\r\n\r\n const addToAPLClick = () => {\r\n dispatch(actions.toggleAddFolderToAPL());\r\n };\r\n\r\n const folderList = useSelector(\r\n selectorsGridView.makeSelectDetailCurrentITemsSelection()\r\n );\r\n\r\n const isFolderHaveProduct =\r\n folderList.filter((item) => item.productCount > 0).length === 0;\r\n\r\n return (\r\n }\r\n label={Messages.addAPL}\r\n className='button-item-dropdown'\r\n disabled={isFolderHaveProduct}\r\n onClick={addToAPLClick}\r\n />\r\n );\r\n};\r\n\r\nexport default AddFolderToNewAPL;\r\n","import React from 'react';\r\n\r\nimport { SisternodeOutlined } from '@ant-design/icons';\r\n\r\nimport Messages from 'i18n/messages/home';\r\n\r\nimport {\r\n ButtonSmallIcon,\r\n ContainerButton,\r\n ItemButton,\r\n} from 'common/components';\r\n\r\nimport { useGlobalModal } from 'hooks';\r\n\r\nimport './AddProductToNewApl.less';\r\n\r\nconst AddProductToNewApl = ({ selectedItemList }) => {\r\n const { MODAL_NAMES, openModal } = useGlobalModal();\r\n\r\n return (\r\n \r\n \r\n }\r\n label={Messages.addProductToNewApl}\r\n onClick={() => openModal(MODAL_NAMES.ADD_TO_APL)}\r\n className='button-item-dropdown'\r\n disabled={selectedItemList && selectedItemList.length === 0}\r\n />\r\n \r\n \r\n );\r\n};\r\n\r\nexport default AddProductToNewApl;\r\n","import React, { useState } from 'react';\r\nimport { useLocation } from 'react-router-dom';\r\n\r\nimport { Input, notification, Spin } from 'antd';\r\nimport { AppstoreAddOutlined } from '@ant-design/icons';\r\nimport { useIntl } from 'react-intl';\r\n\r\nimport Messages from 'i18n/messages/home';\r\nimport messagesProduct from 'i18n/messages/product';\r\n\r\nimport {\r\n Form,\r\n StyledModal,\r\n ButtonSmallIcon,\r\n ContainerButton,\r\n ItemButton,\r\n} from 'common/components';\r\n\r\nimport { addSearchProductsToApl } from 'services/apl';\r\nimport { ROUTE } from 'static/Constants';\r\nimport { useGetQuery } from 'hooks/useQuery';\r\n\r\nimport './AddProductToNewApl.less';\r\nimport { handleCreateSearchContainer } from 'pages/reporting/utils';\r\n\r\nconst AddSearchProductToNewApl = ({\r\n disabledFilterSearch,\r\n searchCategoriesEffected,\r\n searchText,\r\n filterProducts,\r\n queryConditions,\r\n}) => {\r\n const [visibleModal, setVisibleModal] = useState(false);\r\n\r\n return (\r\n <>\r\n \r\n \r\n }\r\n label={Messages.addSearchProductToNewApl}\r\n onClick={() => setVisibleModal(true)}\r\n className='button-item-dropdown'\r\n disabled={disabledFilterSearch}\r\n />\r\n \r\n \r\n\r\n {visibleModal && (\r\n setVisibleModal(false)}\r\n searchCategoriesEffected={searchCategoriesEffected}\r\n searchText={searchText}\r\n filterProducts={filterProducts}\r\n queryConditions={queryConditions}\r\n />\r\n )}\r\n \r\n );\r\n};\r\n\r\nconst layoutForm = {\r\n labelCol: { span: 6 },\r\n wrapperCol: { span: 17 },\r\n};\r\nconst ModalFormCreateApl = ({\r\n visibleModal,\r\n turnOffModal,\r\n searchCategoriesEffected,\r\n searchText,\r\n filterProducts,\r\n queryConditions,\r\n}) => {\r\n const [formInstance] = Form.useForm();\r\n const intl = useIntl();\r\n\r\n const [loading, setLoading] = useState(false);\r\n\r\n const { pathname } = useLocation();\r\n const query = useGetQuery();\r\n const memberId = query.get('memberId');\r\n\r\n const isMemberProductView = ROUTE.MEMBER_PRODUCTS === pathname;\r\n const handleSubmitForm = () => {\r\n formInstance.validateFields().then(() => {\r\n setLoading(true);\r\n let params = formInstance.getFieldsValue();\r\n params.search = { searchText: searchText };\r\n let filters = [];\r\n let arrValue = [];\r\n\r\n //* Add filter by member for member product view\r\n if (isMemberProductView && memberId) {\r\n filters.push({\r\n fieldName: 'ownerId',\r\n value: parseInt(memberId),\r\n filterType: 'Equal',\r\n });\r\n }\r\n\r\n if (filterProducts.indexOf('subscription') > -1) {\r\n filters.push({\r\n fieldName: 'subscription',\r\n value: true,\r\n filterType: 'Equal',\r\n });\r\n }\r\n if (filterProducts.indexOf('syndication') > -1) {\r\n filters.push({\r\n fieldName: 'syndication',\r\n value: true,\r\n filterType: 'Equal',\r\n });\r\n }\r\n if (filterProducts.indexOf('owner') > -1) {\r\n filters.push({\r\n fieldName: 'isOwner',\r\n value: true,\r\n filterType: 'Equal',\r\n });\r\n }\r\n if (filterProducts.indexOf('pending') > -1) {\r\n filters.push({\r\n fieldName: 'status',\r\n value: 'Pending',\r\n filterType: 'Equal',\r\n });\r\n }\r\n if (\r\n filterProducts.indexOf('Pallet') > -1 ||\r\n filterProducts.indexOf('Master Case') > -1 ||\r\n filterProducts.indexOf('Case') > -1 ||\r\n filterProducts.indexOf('Inner Pack') > -1 ||\r\n filterProducts.indexOf('Unit') > -1\r\n ) {\r\n if (filterProducts.indexOf('Pallet') > -1) {\r\n arrValue.push('Pallet');\r\n }\r\n if (filterProducts.indexOf('Master Case') > -1) {\r\n arrValue.push('Master Case');\r\n }\r\n if (filterProducts.indexOf('Case') > -1) {\r\n arrValue.push('Case');\r\n }\r\n if (filterProducts.indexOf('Inner Pack') > -1) {\r\n arrValue.push('Inner Pack');\r\n }\r\n if (filterProducts.indexOf('Unit') > -1) {\r\n arrValue.push('Unit');\r\n }\r\n }\r\n params.filters = filters;\r\n\r\n const advancedSearch = handleCreateSearchContainer(queryConditions);\r\n\r\n params.advancedSearchContainer = advancedSearch;\r\n params.searchCategory = searchCategoriesEffected;\r\n\r\n addSearchProductsToApl(params)\r\n .then((resp) => {\r\n if (resp.isSuccess) {\r\n notification.success({\r\n message: intl.formatMessage(\r\n messagesProduct.addSearchProductToAplSuccess\r\n ),\r\n });\r\n\r\n turnOffModal();\r\n } else {\r\n notification.error({\r\n message: resp?.message,\r\n });\r\n }\r\n })\r\n .catch((error) => {\r\n notification.error({\r\n message: error,\r\n });\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n });\r\n };\r\n\r\n const modalProps = {\r\n title: intl.formatMessage(messagesProduct.addSearchProductToAplLabel),\r\n accept: '.xlsx, .xls, .csv',\r\n destroyOnClose: true,\r\n visible: visibleModal,\r\n onCancel: turnOffModal,\r\n onOk: handleSubmitForm,\r\n okButtonProps: { loading: loading },\r\n cancelButtonProps: { disabled: loading },\r\n maskClosable: false,\r\n closable: !loading,\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default AddSearchProductToNewApl;\r\n","import React, { useMemo } from 'react';\r\nimport { Menu, Dropdown } from 'antd';\r\nimport { FileAddFilled } from '@ant-design/icons';\r\nimport Messages from 'i18n/messages/home';\r\n\r\nimport FavoriteControl from './FavoriteControl';\r\nimport UnfavoriteControl from './UnfavoriteControl';\r\nimport AddFolder from './AddFolder';\r\nimport AddFolderToNewAPL from './AddFolderToNewAPL';\r\nimport AddProductToNewApl from './AddProductToNewApl';\r\nimport AddSearchProductToNewApl from './AddSearchProductToNewApl';\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\nimport userSelector from '@redux/user/selectors';\r\nimport { useSelector } from 'react-redux';\r\nimport * as selectors from 'pages/company-profile/controllers/selectors';\r\n\r\nimport { Can } from 'context/Can';\r\nimport { useCheckPermissions } from 'hooks/useCheckPermissions';\r\nimport { ABILITY_ACTION, ABILITY_SUBJECT } from 'static/Permission';\r\n\r\nimport { CanShow } from 'common/components/wrapper/show-condition';\r\n\r\nimport './Addition.less';\r\n\r\nconst Addition = ({\r\n type,\r\n selectedItemList,\r\n disabledFavorite,\r\n isDisabled,\r\n disabledFilterSearch,\r\n searchCategoriesEffected,\r\n searchText,\r\n filterProducts,\r\n queryConditions,\r\n isFavoriteView,\r\n}) => {\r\n let userInfo = useSelector(userSelector.makeSelectUserInfo());\r\n const memberInfo = useSelector(selectors.selectMemberProfile());\r\n\r\n const checkAllFavoriteItem = () => {\r\n // return true if all item is favorite\r\n return !selectedItemList?.some((item) => !item?.isFavorited);\r\n };\r\n\r\n const checkAllNotFavoriteItem = () => {\r\n // return true if all item is not favorite\r\n return !selectedItemList?.some((item) => item?.isFavorited);\r\n };\r\n\r\n const shouldShowRemoveFavorite =\r\n (!selectedItemList && memberInfo?.isFavorited) ||\r\n (selectedItemList?.length > 0 && checkAllFavoriteItem());\r\n\r\n const isAllItemInTheSameType = selectedItemList?.every(\r\n (item) => item?.type?.toLowerCase() === type?.toLowerCase()\r\n );\r\n\r\n const shouldDisabledAddToFavorite =\r\n (!selectedItemList && memberInfo?.isFavorited) ||\r\n selectedItemList?.length === 0 ||\r\n !checkAllNotFavoriteItem() ||\r\n disabledFavorite ||\r\n !isAllItemInTheSameType;\r\n\r\n const viewPermission = useMemo(() => getPermissionAddToFav(type), [type]);\r\n\r\n const hasPermissionAddToFavorite = useCheckPermissions(viewPermission);\r\n\r\n const menuOptions = (\r\n \r\n {hasPermissionAddToFavorite && (\r\n \r\n \r\n \r\n )}\r\n\r\n {hasPermissionAddToFavorite && shouldShowRemoveFavorite && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n {type === 'folder' && (\r\n \r\n \r\n \r\n )}\r\n {type === 'product' && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n {type === 'product' && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n\r\n return (\r\n \r\n }\r\n disabled={\r\n window.location.pathname === '/member-management-company' ||\r\n isDisabled\r\n }\r\n label={Messages.addTo}\r\n />\r\n \r\n );\r\n};\r\n\r\nconst getPermissionAddToFav = (type) => {\r\n if (type === 'product') {\r\n return [\r\n {\r\n action: ABILITY_ACTION.VIEW,\r\n subject: ABILITY_SUBJECT.PRODUCT,\r\n },\r\n ];\r\n }\r\n\r\n if (type === 'member') {\r\n return [\r\n {\r\n action: ABILITY_ACTION.VIEW,\r\n subject: ABILITY_SUBJECT.MEMBER,\r\n },\r\n ];\r\n }\r\n\r\n if (type === 'asset') {\r\n return [\r\n {\r\n action: ABILITY_ACTION.VIEW,\r\n subject: ABILITY_SUBJECT.ASSET,\r\n },\r\n ];\r\n }\r\n\r\n if (type === 'folder') {\r\n return [\r\n {\r\n action: ABILITY_ACTION.VIEW,\r\n subject: ABILITY_SUBJECT.FOLDER,\r\n },\r\n ];\r\n }\r\n\r\n if (type === 'reporting') {\r\n return [\r\n {\r\n action: ABILITY_ACTION.VIEW,\r\n subject: ABILITY_SUBJECT.REPORTING,\r\n },\r\n ];\r\n }\r\n\r\n return [];\r\n};\r\n\r\nexport default Addition;\r\n","import React from 'react';\r\nimport { useDispatch } from 'react-redux';\r\nimport { FilterOutlined } from '@ant-design/icons';\r\n\r\nimport * as actionsGridView from 'common/components/grid-view/controllers/actions';\r\nimport Messages from 'i18n/messages/home';\r\nimport ButtonSmallIcon from '../button/ButtonSmallIcon';\r\n\r\nconst OpenAdvanceFilter = ({ disabled }) => {\r\n const dispatch = useDispatch();\r\n\r\n const handleOpenAdvanceFilter = () => {\r\n dispatch(actionsGridView.updateIsOpenAdvanceSearch(true));\r\n };\r\n\r\n return (\r\n <>\r\n }\r\n label={Messages.advanceFilter}\r\n disabled={disabled}\r\n onClick={handleOpenAdvanceFilter}\r\n className='grid-config__button'\r\n />\r\n \r\n );\r\n};\r\n\r\nexport default OpenAdvanceFilter;\r\n","import React, { useEffect } from 'react';\r\nimport { Row, Col } from 'antd';\r\nimport { useSelector } from 'react-redux';\r\nimport { DragDropContext } from 'react-beautiful-dnd';\r\n\r\nimport QueryConditions from 'pages/reporting/components/QueryConditions';\r\nimport TitleSection from 'pages/reporting/components/TitleSection';\r\nimport selectorsGridView from 'common/components/grid-view/controllers/selectors';\r\nimport ClearQueryControl from 'pages/home/ribbon/components/controls/advanced-search/ClearQueryControl';\r\n\r\nimport { useGetDataQueryConditions } from 'hooks';\r\nimport HeaderEntityAttributes from '../reporting/entity-and-attributes/HeaderEntityAttributes';\r\nimport EntitiesAndAttributes from '../reporting/entity-and-attributes/EntitiesAndAttributes';\r\nimport dialogFunction from '../dialog-function/DialogFunction';\r\nimport {\r\n ADVANCED_FILTER_MODE,\r\n INITIAL_SEARCH_SET_CONDITION,\r\n} from 'pages/reporting/utils/constants';\r\n\r\nimport { isEmpty } from 'lodash';\r\n\r\nimport './NestedAdvanceSearch.less';\r\n\r\nconst NestedAdvanceSearch = (props) => {\r\n const pathName = window.location.pathname;\r\n const queryConditions = useGetDataQueryConditions(pathName);\r\n\r\n const visible = useSelector(\r\n selectorsGridView.makeSelectIsOpenAdvanceSearch()\r\n );\r\n\r\n const {\r\n state,\r\n entityType,\r\n onDragEnd,\r\n modeData,\r\n onDragStart,\r\n setModeData,\r\n toggleSelection,\r\n handleConjunction,\r\n addQueryCondition,\r\n fetchEntityAttribute,\r\n handleUpdateDataEntity,\r\n updateQueryCondition,\r\n handleUpdateSearchText,\r\n toggleSelectionInGroup,\r\n handleQueryDateBetween,\r\n handleUpdateSearchEntity,\r\n handleUpdateQueryCondition,\r\n handleRemoveQueryConditions,\r\n handleGetEntityAndAttributes,\r\n handleUpdateQueryConditionFile,\r\n } = props;\r\n\r\n const {\r\n searchText,\r\n dataSearch,\r\n propertiesData,\r\n dataQueryConditions,\r\n selectedPropertyIds,\r\n } = state;\r\n\r\n const showConfirmMessage = (refSearchText) => {\r\n dialogFunction({\r\n type: 'warn',\r\n content: (\r\n
\r\n

\r\n Are you sure you want to switch to \r\n {modeData === ADVANCED_FILTER_MODE.FLAT_DATA\r\n ? 'Advanced Mode'\r\n : 'Basic Mode'}\r\n ?\r\n

\r\n
\r\n ),\r\n okText: 'OK',\r\n cancelText: 'Cancel',\r\n onOk: () => handleToggleMode(refSearchText),\r\n });\r\n };\r\n\r\n const handleToggleMode = (refSearchText) => {\r\n const _flat = ADVANCED_FILTER_MODE.FLAT_DATA;\r\n const _nested = ADVANCED_FILTER_MODE.NESTED_DATA;\r\n\r\n if (modeData === _flat) {\r\n updateDataChangedMode(_nested);\r\n } else {\r\n updateDataChangedMode(_flat);\r\n }\r\n\r\n handleUpdateSearchText('');\r\n refSearchText.current?.onClearSearchText();\r\n };\r\n\r\n const updateDataChangedMode = (mode) => {\r\n const entityProperties =\r\n window?.advancedSearch?.entityAttributes?.[entityType];\r\n\r\n setModeData(mode);\r\n handleUpdateDataEntity(entityProperties, mode);\r\n handleUpdateQueryCondition({\r\n ...dataQueryConditions,\r\n advancedFilterMode: mode,\r\n });\r\n };\r\n\r\n const initData = () => {\r\n const strickMode =\r\n queryConditions?.advancedFilterMode || ADVANCED_FILTER_MODE.FLAT_DATA;\r\n setModeData(strickMode);\r\n //suport init apl search set for ticket 8703\r\n if (isEmpty(queryConditions) && entityType?.toLowerCase() === 'product') {\r\n handleUpdateQueryCondition(INITIAL_SEARCH_SET_CONDITION);\r\n } else {\r\n handleUpdateQueryCondition(queryConditions);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n if (!visible) return;\r\n handleGetEntityAndAttributes(entityType);\r\n initData();\r\n }, [JSON.stringify(queryConditions), visible]);\r\n\r\n const hasQueryConditions = dataQueryConditions?.children?.length > 0;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {hasQueryConditions && (\r\n {\r\n handleUpdateQueryCondition({});\r\n }}\r\n />\r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default React.memo(NestedAdvanceSearch);\r\n","import React, { useState } from 'react';\r\nimport _ from 'lodash';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\n\r\nimport { StyledModal } from 'common/components';\r\n\r\nimport { useAdvanceFilter } from './hook/hook';\r\nimport WithLoading from '../wrapper/WithLoading';\r\nimport NestedAdvanceSearch from './NestedAdvanceSearch';\r\n\r\nimport * as actionsGridView from 'common/components/grid-view/controllers/actions';\r\nimport selectorsGridView from 'common/components/grid-view/controllers/selectors';\r\nimport { checkPathName } from './hook/utils';\r\nimport {\r\n updateQueryAdvance,\r\n updateQueryConditions,\r\n} from 'utils/queryCondition';\r\nimport { ADVANCED_FILTER_MODE } from 'pages/reporting/utils/constants';\r\n\r\nconst NestedAdvanceFilter = () => {\r\n const dispatch = useDispatch();\r\n\r\n const pathName = window.location.pathname;\r\n const entityType = checkPathName(pathName);\r\n\r\n const [modeData, setModeData] = useState(\r\n entityType === 'product'\r\n ? ADVANCED_FILTER_MODE.FLAT_DATA\r\n : ADVANCED_FILTER_MODE.NESTED_DATA\r\n );\r\n\r\n const isOpen = useSelector(selectorsGridView.makeSelectIsOpenAdvanceSearch());\r\n const { ...AdvancedSearchProps } = useAdvanceFilter({ modeData, entityType });\r\n\r\n const {\r\n state: { propertiesData, dataQueryConditions },\r\n handleUpdateQueryCondition,\r\n } = AdvancedSearchProps ?? {};\r\n\r\n const handleAdvanceFilters = () => {\r\n updateQueryConditions(dispatch, dataQueryConditions, pathName);\r\n updateQueryAdvance(dispatch, dataQueryConditions, pathName);\r\n dispatch(actionsGridView.updateIsOpenAdvanceSearch(false));\r\n dispatch(actionsGridView.myQueryDoubleClick(true));\r\n dispatch(actionsGridView.checkQueryCondition(true));\r\n dispatch(actionsGridView.updateIsOpenAdvanceSearch(false));\r\n };\r\n\r\n const handleCancel = () => {\r\n handleUpdateQueryCondition({});\r\n dispatch(actionsGridView.updateIsOpenAdvanceSearch(false));\r\n };\r\n const isLoading = propertiesData?.length > 0;\r\n const hasOverloadFile =\r\n dataQueryConditions?.children?.length > 0 &&\r\n !_.isEmpty(\r\n dataQueryConditions?.children?.find(\r\n (val) => val?.acceptableValueTemp?.length > 100000\r\n )\r\n );\r\n\r\n return (\r\n <>\r\n handleCancel()}\r\n width='80vw'\r\n bodyStyle={{ height: '80vh', padding: 0 }}\r\n okButtonProps={{ disabled: hasOverloadFile }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default NestedAdvanceFilter;\r\n","import React from 'react';\r\n\r\nimport { Menu, Dropdown } from 'antd';\r\nimport { SettingOutlined } from '@ant-design/icons';\r\n\r\nimport SearchFolder from './SearchFolder';\r\nimport DeleteFolder from './DeleteFolder';\r\n\r\nimport Messages from 'i18n/messages/home';\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\n\r\nimport { Can } from 'context/Can';\r\nimport { ABILITY_ACTION, ABILITY_SUBJECT } from 'static/Permission';\r\nimport OpenAdvanceFilter from 'common/components/nested-advance-Search/OpenAdvanceFilter';\r\nimport NestedAdvanceFilter from 'common/components/nested-advance-Search/NestedAdvanceFilter';\r\n\r\nconst AdvanceStack = (props) => {\r\n const { isDisabled, disabledAdvanceFilter, selectedItemList } = props;\r\n // check section disabled\r\n const checkSectionDisabled = () => {\r\n const hasSelectedItem = selectedItemList?.length > 0;\r\n\r\n const selectedFolder = selectedItemList?.filter((selectedItem) => {\r\n return selectedItem?.type === 'Folder';\r\n });\r\n\r\n const hasSelectedFolder = selectedFolder?.length > 0;\r\n\r\n return !hasSelectedItem || hasSelectedFolder;\r\n };\r\n\r\n const menuOptionProps = {\r\n selectedItemList,\r\n isSectionDisabled: checkSectionDisabled(),\r\n };\r\n\r\n const renderMenuOptions = (menuOptionProps) => (\r\n {\r\n // if (key === 'advancedSearch') {\r\n // dispatch()\r\n // }\r\n }}\r\n >\r\n {/* \r\n \r\n */}\r\n \r\n \r\n {(allowed) => (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n\r\n return (\r\n <>\r\n \r\n }\r\n disabled={isDisabled}\r\n label={Messages.advanceStack}\r\n />\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nAdvanceStack.propTypes = {};\r\n\r\nexport default AdvanceStack;\r\n","import React from 'react';\r\n\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { LogoutOutlined } from '@ant-design/icons';\r\n\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\nimport Messages from 'i18n/messages/home';\r\n\r\nimport useCloseDetail from 'hooks/useCloseDetail';\r\n\r\nimport { DISABLED_CLOSE_DETAIL_BUTTON } from 'static/Constants';\r\n\r\nconst BackControl = (props) => {\r\n const { isDisabled, closeDetailCallback, onClick } = props;\r\n\r\n const { goBack } = useCloseDetail();\r\n\r\n const handleClick = () => {\r\n if (onClick) return onClick(goBack);\r\n\r\n goBack();\r\n closeDetailCallback && closeDetailCallback();\r\n };\r\n\r\n return (\r\n }\r\n label={Messages.backText}\r\n onClick={handleClick}\r\n disabled={\r\n DISABLED_CLOSE_DETAIL_BUTTON.includes(window.location.pathname) ||\r\n isDisabled\r\n }\r\n />\r\n );\r\n};\r\n\r\nBackControl.propTypes = {\r\n /**\r\n * to detect type of ribbon view\r\n */\r\n ribbonType: PropTypes.oneOf([\r\n 'members',\r\n 'assets',\r\n 'reportings',\r\n 'workflows',\r\n 'products',\r\n ]),\r\n};\r\n\r\nexport default BackControl;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { FolderOutlined } from '@ant-design/icons';\r\n\r\nimport ButtonSmallIcon from 'common/components/button/ButtonSmallIcon';\r\nimport { dialogFunction } from 'common/components';\r\n\r\nimport * as folderService from 'services/folder';\r\n\r\nimport Messages from 'i18n/messages/home';\r\nimport { injectIntl } from 'react-intl';\r\n\r\nimport { ABILITY_ACTION, ABILITY_SUBJECT } from 'static/Permission';\r\nimport { useCheckPermissions } from 'hooks/useCheckPermissions';\r\n\r\nconst DeleteFolderControl = (props) => {\r\n const { intl, selectedItemList, isSectionDisabled } = props;\r\n\r\n const clickDeleteHandler = () => {\r\n showConfirmDialog();\r\n };\r\n\r\n const showConfirmDialog = () => {\r\n dialogFunction({\r\n type: 'warn',\r\n content: intl.formatMessage(Messages.deleteFromFoldersConfirm),\r\n onOk: callApiDelete,\r\n });\r\n };\r\n\r\n const callApiDelete = () => {\r\n const itemList = getItemList(selectedItemList);\r\n\r\n folderService\r\n .deleteInAllFolders(itemList)\r\n .then((response) => {\r\n const { isSuccess } = response;\r\n if (isSuccess) {\r\n showSuccessMessageDialog();\r\n } else {\r\n callApiErrorHandler();\r\n }\r\n })\r\n .catch(() => {\r\n callApiErrorHandler();\r\n });\r\n };\r\n\r\n const getItemList = (itemList) => {\r\n return itemList?.map((item) => {\r\n const { id, type } = item;\r\n return {\r\n id,\r\n type,\r\n };\r\n });\r\n };\r\n\r\n const showSuccessMessageDialog = () => {\r\n dialogFunction({\r\n type: 'success',\r\n content: intl.formatMessage(Messages.deleteFromFoldersSuccess),\r\n cancelButtonProps: {\r\n style: { display: 'none' },\r\n },\r\n });\r\n };\r\n\r\n const callApiErrorHandler = () => {\r\n dialogFunction({\r\n type: 'error',\r\n content: intl.formatMessage(Messages.deleteFromFoldersError),\r\n cancelButtonProps: {\r\n style: { display: 'none' },\r\n },\r\n });\r\n };\r\n\r\n const EDIT_FOLDERS = [\r\n { action: ABILITY_ACTION.EDIT, subject: ABILITY_SUBJECT.FOLDER },\r\n ];\r\n\r\n const disabled = !useCheckPermissions(EDIT_FOLDERS) || isSectionDisabled;\r\n\r\n return (\r\n }\r\n label={Messages.deleteFromFolders}\r\n className='button-item-dropdown'\r\n onClick={clickDeleteHandler}\r\n disabled={disabled}\r\n />\r\n );\r\n};\r\n\r\nDeleteFolderControl.propTypes = {\r\n /**\r\n * Current selected items\r\n */\r\n selectedItemList: PropTypes.arrayOf(PropTypes.object),\r\n /**\r\n * Disable state of ribbon section\r\n */\r\n isSectionDisabled: PropTypes.bool,\r\n};\r\n\r\nexport default injectIntl(DeleteFolderControl);\r\n","import React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport PropTypes from 'prop-types';\r\nimport { LayoutOutlined } from '@ant-design/icons';\r\nimport Messages from 'i18n/messages/home';\r\n\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\nimport * as selectorsGlobal from '@redux/global/selectors';\r\n\r\nimport './DetailView.less';\r\n\r\nconst DetailControl = ({ detailClick, disabledBtn, isDetailShow }) => {\r\n const isDisplayShowPreviewAcceptedEula = useSelector(\r\n selectorsGlobal.selectIsDisplayShowPreviewAcceptedEula()\r\n );\r\n\r\n const handleClickDetail = () => {\r\n detailClick();\r\n };\r\n\r\n return (\r\n }\r\n label={Messages.toggleDetail}\r\n onClick={handleClickDetail}\r\n toggle={isDetailShow}\r\n disabled={disabledBtn || isDisplayShowPreviewAcceptedEula}\r\n />\r\n );\r\n};\r\n\r\nDetailControl.propTypes = {\r\n detailClick: PropTypes.func,\r\n};\r\n\r\nexport default DetailControl;\r\n","import React from 'react';\r\n\r\nimport reactCSS from 'reactcss';\r\n\r\nimport {\r\n FolderGridThumbnail,\r\n FolderGridTile,\r\n} from 'pages/folders/shared/components';\r\n\r\nconst FolderGridTileComponent = (props) => {\r\n return (\r\n
\r\n \r\n
\r\n );\r\n};\r\n\r\nconst GRID_ITEM_RENDER = {\r\n thumbnails: {\r\n folder: FolderGridThumbnail,\r\n },\r\n tilesview: {\r\n folder: FolderGridTileComponent,\r\n },\r\n};\r\n\r\nconst styles = reactCSS({\r\n default: {\r\n gridItem: {\r\n wrapper: { cursor: 'pointer' },\r\n },\r\n folder: {\r\n tile: {\r\n wrapper: {\r\n display: 'inline-block',\r\n margin: '12px 0 0 12px ',\r\n border: '1px solid grey',\r\n },\r\n },\r\n },\r\n },\r\n});\r\n\r\nconst GridItem = (props) => {\r\n const { searchType, viewType, handleDoubleClick, ...gridItemProps } = props;\r\n const GridItemComponent = GRID_ITEM_RENDER[viewType][searchType];\r\n\r\n const newGridItemProps = {\r\n ...gridItemProps,\r\n disableEvent: true,\r\n };\r\n\r\n return (\r\n handleDoubleClick(gridItemProps)}\r\n >\r\n ;\r\n \r\n );\r\n};\r\n\r\nexport { GridItem };\r\n","import React from 'react';\r\n\r\nimport { GridItem } from './GridItem';\r\nimport { Skeleton, Empty } from 'antd';\r\n\r\nimport reactCSS from 'reactcss';\r\nimport { RIBBON_TYPES, ENTITY_TYPE } from 'static/Constants';\r\n\r\nconst styles = reactCSS({\r\n default: {\r\n grid: {\r\n width: '100%',\r\n height: '100%',\r\n display: 'flex',\r\n flexFlow: 'wrap',\r\n alignContent: 'flex-start',\r\n },\r\n gridWrap: {\r\n width: '100%',\r\n height: '100%',\r\n },\r\n },\r\n});\r\n\r\nconst Grid = (props) => {\r\n const {\r\n items,\r\n isLoading,\r\n searchType = ENTITY_TYPE.FOLDER,\r\n viewType = RIBBON_TYPES.THUMBNAILS,\r\n handleDoubleClick,\r\n } = props;\r\n\r\n return (\r\n
\r\n {items?.length === 0 ? (\r\n \r\n ) : (\r\n \r\n
\r\n {items?.map((item, index) => {\r\n item.thumbnail = item.thumb;\r\n item.isOwner = true;\r\n\r\n return (\r\n \r\n );\r\n })}\r\n
\r\n
\r\n )}\r\n
\r\n );\r\n};\r\n\r\nexport default Grid;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { Radio } from 'antd';\r\nimport { PictureOutlined, AlignLeftOutlined } from '@ant-design/icons';\r\nimport { RIBBON_TYPES } from 'static/Constants';\r\n\r\nimport reactCSS from 'reactcss';\r\n\r\nconst styles = reactCSS({\r\n default: {\r\n button: {\r\n height: '37px',\r\n fontSize: '18px',\r\n lineHeight: '37px',\r\n padding: '0 12px',\r\n },\r\n },\r\n});\r\n\r\nconst FindEntityInFolderResultToolbar = (props) => {\r\n const { typeViewHook } = props;\r\n const [currentView, setCurrentView] = typeViewHook;\r\n\r\n const onChangeView = (e) => {\r\n setCurrentView(e.target.value);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nFindEntityInFolderResultToolbar.propTypes = {\r\n typeViewHook: PropTypes.array,\r\n};\r\n\r\nexport default FindEntityInFolderResultToolbar;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { Row, Col, Typography, Pagination } from 'antd';\r\nimport Messages from 'i18n/messages/home';\r\nimport { FormattedMessage } from 'react-intl';\r\n\r\nconst { Text } = Typography;\r\n\r\nconst FindEntityInFolderResultFooter = (props) => {\r\n const {\r\n totalResult,\r\n pageSize,\r\n pageIndex,\r\n onChangePage,\r\n classNamePrefix,\r\n onShowSizeChange,\r\n } = props;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n :\r\n  \r\n {totalResult}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nFindEntityInFolderResultFooter.propTypes = {\r\n totalResult: PropTypes.number,\r\n pageSize: PropTypes.number,\r\n pageIndex: PropTypes.number,\r\n onChangePage: PropTypes.func,\r\n classNamePrefix: PropTypes.string,\r\n onShowSizeChange: PropTypes.func,\r\n};\r\n\r\nFindEntityInFolderResultFooter.defaultProps = {\r\n onChangePage: () => null,\r\n onShowSizeChange: () => null,\r\n};\r\n\r\nexport default FindEntityInFolderResultFooter;\r\n","import React, { useState, useEffect } from 'react';\r\n\r\nimport Grid from '../components/Grid';\r\n\r\nimport { StyledModal } from 'common/components';\r\n\r\nimport * as folderServices from 'services/folder';\r\n\r\nimport { RIBBON_TYPES } from 'static/Constants';\r\n\r\nimport FindEntityInFolderResultToolbar from './FindEntityInFolderResultToolbar';\r\nimport FindEntityInFolderResultFooter from './FindEntityInFolderResultFooter';\r\n\r\nimport { sleep } from 'utils/delay';\r\nimport { forwardTo } from 'utils/common/route';\r\n\r\nconst FindInAllFolderModal = (props) => {\r\n const { showResultHook, selectedItemList } = props;\r\n\r\n const [visible, setVisible] = showResultHook;\r\n const typeViewHook = useState(RIBBON_TYPES.THUMBNAILS);\r\n const [currentView, setCurrentView] = typeViewHook;\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState(false);\r\n const [result, setResult] = useState([]);\r\n const [totalResult, setTotalResult] = useState(0);\r\n const [pageIndex, setPageIndex] = useState(1);\r\n const [pageSize, setPageSize] = useState(20);\r\n\r\n const onCloseDialog = () => {\r\n setVisible(false);\r\n };\r\n\r\n const onChangePage = (newPage) => {\r\n setPageIndex(newPage);\r\n };\r\n\r\n const onShowSizeChange = (current, size) => {\r\n setPageSize(size);\r\n };\r\n\r\n const callApiFindEntityInFolder = () => {\r\n const itemList = generateEntityList();\r\n const params = {\r\n itemList,\r\n pageSize,\r\n pageIndex,\r\n };\r\n\r\n setLoading(true);\r\n\r\n folderServices\r\n .findInAllFolders(params)\r\n .then((response) => {\r\n const { isSuccess, data } = response;\r\n if (isSuccess) {\r\n const procGridData = data?.gridData?.map((dataItem) => ({\r\n ...dataItem,\r\n type: 'folder',\r\n }));\r\n setResult(procGridData);\r\n setTotalResult(data?.paging?.totalRecord);\r\n } else {\r\n callApiFindEntityInFolderErrorHandler();\r\n }\r\n })\r\n .catch((err) => callApiFindEntityInFolderErrorHandler())\r\n .finally(() => setLoading(false));\r\n };\r\n\r\n const generateEntityList = () => {\r\n return selectedItemList.map((item) => {\r\n const { id, type } = item;\r\n return {\r\n id,\r\n type,\r\n };\r\n });\r\n };\r\n\r\n const callApiFindEntityInFolderErrorHandler = () => {\r\n setError(true);\r\n };\r\n\r\n const resetModalState = () => {\r\n setResult([]);\r\n setPageIndex(1);\r\n setCurrentView(RIBBON_TYPES.THUMBNAILS);\r\n setLoading(true);\r\n setTotalResult(0);\r\n setError(false);\r\n };\r\n\r\n const handleDoubleClick = (gridItemProps) => {\r\n const folderId = gridItemProps?.dataDetail?.id;\r\n if (!folderId) return;\r\n\r\n forwardTo(`/folder/${folderId}`);\r\n onCloseDialog();\r\n };\r\n\r\n useEffect(() => {\r\n if (visible) {\r\n callApiFindEntityInFolder();\r\n } else {\r\n resetModalState();\r\n }\r\n // eslint-disable-next-line\r\n }, [visible, pageIndex, pageSize]);\r\n\r\n useEffect(() => {\r\n const onChangeViewType = async () => {\r\n setLoading(true);\r\n await sleep(500);\r\n setLoading(false);\r\n };\r\n\r\n onChangeViewType();\r\n }, [currentView]);\r\n\r\n const modalConfig = {\r\n visible,\r\n destroyOnClose: true,\r\n title: ,\r\n footer: (\r\n \r\n ),\r\n centered: true,\r\n width: 1019,\r\n style: {\r\n overflow: 'hidden',\r\n },\r\n bodyStyle: {\r\n height: '80vh',\r\n },\r\n onCancel: onCloseDialog,\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default FindInAllFolderModal;\r\n","import React, { useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { FolderOpenOutlined } from '@ant-design/icons';\r\n\r\nimport ButtonSmallIcon from 'common/components/button/ButtonSmallIcon';\r\n// import { FindEntityInFolderResultModal } from './../../index';\r\n\r\nimport Messages from 'i18n/messages/home';\r\nimport { ABILITY_ACTION, ABILITY_SUBJECT } from 'static/Permission';\r\nimport { useCheckPermissions } from 'hooks/useCheckPermissions';\r\nimport FindInAllFolderModal from 'common/components/modal/grid-view-modal/find-in-all-folder-modal/FindInAllFolderModal';\r\n\r\nconst ViewFolderControl = (props) => {\r\n const { isSectionDisabled, selectedItemList } = props;\r\n\r\n //* state\r\n const showResultHook = useState(false);\r\n const [, setShowResult] = showResultHook;\r\n //* function\r\n const clickSearchHandler = () => {\r\n showFindResultDialog();\r\n };\r\n\r\n const showFindResultDialog = () => {\r\n setShowResult(true);\r\n };\r\n\r\n const VIEW_FOLDERS = [\r\n { action: ABILITY_ACTION.VIEW, subject: ABILITY_SUBJECT.FOLDER },\r\n ];\r\n\r\n const disabled = !useCheckPermissions(VIEW_FOLDERS) || isSectionDisabled;\r\n\r\n return (\r\n <>\r\n }\r\n label={Messages.searchFolders}\r\n className='button-item-dropdown'\r\n disabled={disabled}\r\n onClick={clickSearchHandler}\r\n />\r\n {/* */}\r\n\r\n \r\n \r\n );\r\n};\r\n\r\nViewFolderControl.propTypes = {\r\n selectedItemList: PropTypes.array,\r\n isSectionDisabled: PropTypes.bool,\r\n};\r\n\r\nexport default ViewFolderControl;\r\n","import { useState, useEffect, useCallback } from 'react';\r\n\r\nimport { useQuery } from '@tanstack/react-query';\r\nimport { Form, message } from 'antd';\r\n\r\nimport { useAsync, useCheckPermissions, useGlobalModal } from 'hooks';\r\nimport { useSelector, useDispatch } from 'react-redux';\r\nimport { useIntl } from 'react-intl';\r\nimport { useMutation, useGetDataQueryConditions } from 'hooks';\r\nimport { updateIdQuery } from 'utils/queryCondition';\r\nimport { useDefaultSearchText } from 'pages/home/utils';\r\n\r\nimport { RIBBON_TYPES } from 'static/Constants';\r\nimport { saveQuery } from 'services/query';\r\n\r\nimport { selectRibbonType } from '@redux/ribbon/selectors';\r\nimport selectorsGridView from 'common/components/grid-view/controllers/selectors';\r\n\r\nimport { handleCreateSearchContainer } from 'pages/reporting/utils';\r\nimport { getGridName } from 'utils/getGridName';\r\nimport { filterParamsColumns } from 'pages/home/ribbon/components/controls/home/grid-query/utils';\r\nimport { deleteColumnCheckbox } from './utils';\r\n\r\nimport {\r\n getQueryGridView,\r\n getQueryDetailPane,\r\n getAllMemberRoles,\r\n} from 'services/query';\r\nimport { getMemberList } from 'services/members';\r\n\r\nimport { PERMISSION_MANAGE_CURATED_QUERY } from 'static/Permission';\r\nimport messagesGridView from 'i18n/messages/gridView';\r\n\r\nconst useSetDefaultWidth = (form, columns, selectedFieldName) => {\r\n const valueColumns = deleteColumnCheckbox(columns);\r\n\r\n useEffect(() => {\r\n if (valueColumns.length === 0) return;\r\n\r\n const findColumn = valueColumns.find(\r\n (col) => col.fieldName === selectedFieldName\r\n );\r\n const width = findColumn?.width ?? 0;\r\n\r\n form.setFieldsValue({ width });\r\n }, [form, valueColumns, selectedFieldName]);\r\n};\r\n\r\nconst useChangeWidth = (form, width) => {\r\n useEffect(() => {\r\n form.setFieldsValue({ width });\r\n }, [form, width]);\r\n};\r\n\r\nconst useGetSavedConfig = (gridName, isMounted) => {\r\n const [data, setData] = useState();\r\n\r\n useEffect(() => {\r\n const params = {\r\n pageIndex: 1,\r\n pageSize: 10,\r\n sort: [\r\n {\r\n fieldName: 'lastModified',\r\n isAscending: false,\r\n },\r\n ],\r\n gridName,\r\n };\r\n const delayFetchGrid = setTimeout(() => {\r\n getQueryGridView(params).then((res) => {\r\n setData(res.data);\r\n });\r\n }, 1000);\r\n\r\n return () => clearTimeout(delayFetchGrid);\r\n }, [gridName, isMounted]);\r\n\r\n return data;\r\n};\r\n\r\nconst DEFAULT_PAGE_SIZE = 9999;\r\n\r\nconst useGetMembers = ({ valuesFilter, enabled }) => {\r\n const [members, setMembers] = useState([]);\r\n\r\n useEffect(() => {\r\n if (!enabled) return;\r\n\r\n const params = {\r\n type: 'GET_MEMBER_LIST',\r\n pageNumber: 1,\r\n pageSize: DEFAULT_PAGE_SIZE,\r\n sort: [],\r\n filters: [\r\n {\r\n fieldName: 'id',\r\n values: valuesFilter,\r\n },\r\n ],\r\n };\r\n\r\n getMemberList(params).then((resp) => {\r\n setMembers(resp.gridData);\r\n });\r\n }, [enabled, valuesFilter]);\r\n\r\n return members;\r\n};\r\n\r\nconst useGetCuratedQueryDetail = ({ curatedQueryId, enabled }) => {\r\n const { data, run } = useAsync();\r\n\r\n useEffect(() => {\r\n if (!enabled) return;\r\n\r\n run(getQueryDetailPane({ id: curatedQueryId }));\r\n }, [curatedQueryId, enabled, run]);\r\n\r\n const refetchGetCuratedQueryDetail = useCallback(() => {\r\n run(getQueryDetailPane({ id: curatedQueryId }));\r\n }, [curatedQueryId, run]);\r\n\r\n return {\r\n curatedQueryData: data ?? {},\r\n refetchGetCuratedQueryDetail,\r\n };\r\n};\r\n\r\nconst getAllMemberRolesQueryKey = () => {\r\n return ['get-all-member-role'];\r\n};\r\n\r\nconst useGetAllMemberRoles = () => {\r\n const hasPermissionManageCuratedQuery = useCheckPermissions(\r\n PERMISSION_MANAGE_CURATED_QUERY\r\n );\r\n\r\n const { data, ...restData } = useQuery({\r\n queryKey: getAllMemberRolesQueryKey(),\r\n queryFn: async () => {\r\n const response = await getAllMemberRoles();\r\n\r\n return response?.data;\r\n },\r\n enabled: hasPermissionManageCuratedQuery,\r\n });\r\n\r\n return {\r\n memberRoles: data?.memberRoles ?? [],\r\n ...restData,\r\n };\r\n};\r\n\r\nconst useCreateQueryForm = () => {\r\n const [form] = Form.useForm();\r\n const intl = useIntl();\r\n const dispatch = useDispatch();\r\n\r\n const { MODAL_NAMES, closeModal, checkModalVisible } = useGlobalModal();\r\n const visible = checkModalVisible(MODAL_NAMES.CREATE_QUERY);\r\n\r\n const [selectedMembers, setSelectedMembers] = useState([]);\r\n const [toggleCuratedQuery, setCuratedQuery] = useState(false);\r\n const [shareType, setShareType] = useState('MemberRole');\r\n\r\n const [\r\n { status: statusCreate, data: dataCreate },\r\n createConfig,\r\n setDefaultState,\r\n ] = useMutation(saveQuery);\r\n const { getDefaultSearchText, getDefaultPrimaryFieldsOnly } =\r\n useDefaultSearchText();\r\n\r\n const { memberRoles } = useGetAllMemberRoles();\r\n\r\n const { chosenColumns } = useSelector(\r\n selectorsGridView.makeSelectGridConfig()\r\n );\r\n const queryConditions = useGetDataQueryConditions(window.location.pathname);\r\n const ribbonTypes = useSelector(selectRibbonType());\r\n const gridName = getGridName(window.location.pathname);\r\n const searchText = getDefaultSearchText(window.location.pathname);\r\n const primaryFieldsOnly = getDefaultPrimaryFieldsOnly(\r\n window.location.pathname\r\n );\r\n\r\n const searchCategory = useSelector(\r\n selectorsGridView.makeSelectSearchCategoriesList()\r\n );\r\n\r\n useEffect(() => {\r\n form.setFieldsValue({ gridName });\r\n }, [form, gridName]);\r\n\r\n useEffect(() => {\r\n form.resetFields();\r\n setSelectedMembers([]);\r\n setCuratedQuery(false);\r\n setShareType('MemberRole');\r\n }, [form, visible]);\r\n\r\n useEffect(() => {\r\n if (statusCreate === 'success') {\r\n message.success(intl.formatMessage(messagesGridView.createConfigSuccess));\r\n\r\n updateIdQuery(dispatch, dataCreate.id, window.location.pathname);\r\n }\r\n\r\n if (statusCreate === 'error') {\r\n message.error(intl.formatMessage(messagesGridView.createConfigError));\r\n }\r\n\r\n form.resetFields();\r\n closeModal(MODAL_NAMES.CREATE_QUERY);\r\n setDefaultState();\r\n }, [dispatch, form, gridName, intl, statusCreate]);\r\n\r\n const handleCreateConfig = async () => {\r\n const { isDefault, isCuratedQuery, dateActive, ...values } =\r\n await form.validateFields();\r\n\r\n const advancedSearchContainer =\r\n handleCreateSearchContainer(queryConditions);\r\n\r\n let params = {\r\n ...values,\r\n gridName,\r\n };\r\n\r\n // Add params curated query\r\n if (isCuratedQuery) {\r\n const { curatedQueryShareType, curatedQueryShareToMemberRoleId } = values;\r\n\r\n params = { ...params, isCuratedQuery };\r\n\r\n if (curatedQueryShareType === 'MemberRole') {\r\n if (curatedQueryShareToMemberRoleId) {\r\n params = {\r\n ...params,\r\n curatedQueryShareToMemberRoleId,\r\n curatedQueryShareToMemberType:\r\n memberRoles.find(\r\n (role) => role.memberRoleId === curatedQueryShareToMemberRoleId\r\n )?.memberRoleName ?? null,\r\n };\r\n }\r\n params = {\r\n ...params,\r\n curatedQueryShareType,\r\n curatedQueryShareToMembers: [],\r\n };\r\n }\r\n\r\n if (curatedQueryShareType === 'SpecificMembers') {\r\n params = {\r\n ...params,\r\n curatedQueryShareType,\r\n curatedQueryShareToMembers: selectedMembers.map(\r\n (member) => member.id\r\n ),\r\n };\r\n }\r\n\r\n if (curatedQueryShareType === 'AllMember') {\r\n params = {\r\n ...params,\r\n curatedQueryShareType,\r\n curatedQueryShareToMemberType: null,\r\n curatedQueryShareToMembers: [],\r\n };\r\n }\r\n\r\n if (dateActive) {\r\n params = {\r\n ...params,\r\n effectedDate: dateActive[0].toISOString(),\r\n expirationDate: dateActive[1].toISOString(),\r\n };\r\n } else {\r\n params = {\r\n ...params,\r\n effectedDate: null,\r\n expirationDate: null,\r\n };\r\n }\r\n }\r\n\r\n let jsonConfig;\r\n let downloadJsonFormat;\r\n if (ribbonTypes === RIBBON_TYPES.DETAILSVIEW) {\r\n jsonConfig = JSON.stringify({\r\n columns: filterParamsColumns(chosenColumns),\r\n queryConditions: queryConditions,\r\n ribbonTypes: ribbonTypes,\r\n urlForwardTo: window.location.pathname,\r\n searchText,\r\n 'search.searchText': searchText,\r\n primaryFieldsOnly,\r\n 'search.primaryFieldsOnly': primaryFieldsOnly,\r\n });\r\n } else {\r\n jsonConfig = JSON.stringify({\r\n queryConditions: queryConditions,\r\n ribbonTypes: ribbonTypes,\r\n urlForwardTo: window.location.pathname,\r\n searchText,\r\n 'search.searchText': searchText,\r\n primaryFieldsOnly,\r\n 'search.primaryFieldsOnly': primaryFieldsOnly,\r\n });\r\n }\r\n downloadJsonFormat = JSON.stringify({\r\n advancedSearchContainer,\r\n search: {\r\n searchText,\r\n primaryFieldsOnly,\r\n },\r\n isFavoriteRoute: false,\r\n fromDate: null,\r\n searchCategory,\r\n filters: [],\r\n pageSize: 20,\r\n pageIndex: 1,\r\n });\r\n params = Object.assign(params, {\r\n query: jsonConfig,\r\n downloadJsonFormat: downloadJsonFormat,\r\n });\r\n\r\n createConfig(params);\r\n closeModal(MODAL_NAMES.CREATE_QUERY);\r\n };\r\n return {\r\n toggleCuratedQuery,\r\n shareType,\r\n setShareType,\r\n handleCreateConfig,\r\n form,\r\n selectedMembers,\r\n setSelectedMembers,\r\n setCuratedQuery,\r\n gridName,\r\n memberRoles,\r\n statusCreate,\r\n };\r\n};\r\n\r\nexport {\r\n useSetDefaultWidth,\r\n useChangeWidth,\r\n useGetSavedConfig,\r\n useGetMembers,\r\n useGetCuratedQueryDetail,\r\n useGetAllMemberRoles,\r\n useCreateQueryForm,\r\n};\r\n","import { formatMDY } from 'utils/formatDate';\r\n\r\nconst filterParamsColumns = (columns) => {\r\n // first checkbox element hasn't fieldName\r\n const removedCheckboxColumns = columns.slice(2);\r\n let result = [];\r\n\r\n // check second grid folder grid is Icon\r\n if (removedCheckboxColumns[0]?.field === 'type') {\r\n const fieldNameColumns = removedCheckboxColumns\r\n .slice(1)\r\n .map((c) => ({ fieldName: c.fieldName, width: c.width }));\r\n result = fieldNameColumns;\r\n } else {\r\n result = removedCheckboxColumns.map((c) => ({\r\n fieldName: c.fieldName,\r\n width: c.width,\r\n }));\r\n }\r\n\r\n return result;\r\n};\r\n\r\nconst getStringFilteredColumns = (columns) => {\r\n const removedCheckboxColumns = columns.slice(2);\r\n let result = [];\r\n\r\n // check second grid folder grid is Icon\r\n if (removedCheckboxColumns[0]?.field === 'type') {\r\n const fieldNameColumns = removedCheckboxColumns\r\n .slice(1)\r\n .map((c) => c.fieldName);\r\n result = fieldNameColumns;\r\n } else {\r\n result = removedCheckboxColumns.map((c) => c.fieldName);\r\n }\r\n\r\n return result.join();\r\n};\r\n\r\nconst getListFieldName = (columns) => {\r\n // first checkbox element hasn't fieldName\r\n const removedCheckboxColumns = columns.slice(2);\r\n let result = [];\r\n\r\n // check first removedCheckboxColumns type is column (Icon)\r\n if (removedCheckboxColumns[0]?.field === 'type') {\r\n const fieldNameColumns = removedCheckboxColumns\r\n .slice(1)\r\n .map((c) => c.fieldName);\r\n result = ['type', ...fieldNameColumns];\r\n return result;\r\n }\r\n\r\n return columns.slice(1).map((c) => c.fieldName);\r\n};\r\n\r\nconst deleteColumnCheckbox = (columns) => {\r\n const removedCheckboxColumns = columns.slice(2);\r\n\r\n if (removedCheckboxColumns[0]?.field === 'type') {\r\n return columns.slice(3);\r\n }\r\n\r\n return removedCheckboxColumns;\r\n};\r\n\r\nconst defaultColumns = [\r\n {\r\n checkboxSelection: true,\r\n field: '',\r\n filter: false,\r\n suppressMenu: true,\r\n },\r\n {\r\n allowFilter: true,\r\n allowSort: true,\r\n dataType: 'string',\r\n displayName: 'Query Name',\r\n fieldName: 'name',\r\n fieldNameCamelCase: 'name',\r\n resizable: true,\r\n suppressMenu: true,\r\n width: 250,\r\n minWidth: 200,\r\n },\r\n {\r\n dataType: 'string',\r\n displayName: 'Description',\r\n fieldName: 'Description',\r\n fieldNameCamelCase: 'description',\r\n allowFilter: true,\r\n allowSort: true,\r\n suppressMenu: true,\r\n minWidth: 200,\r\n flex: 1,\r\n },\r\n {\r\n dataType: 'datetime',\r\n displayName: 'Created',\r\n fieldName: 'Created',\r\n fieldNameCamelCase: 'created',\r\n allowFilter: true,\r\n allowSort: true,\r\n suppressMenu: true,\r\n width: 150,\r\n minWidth: 150,\r\n cellRenderer: ({ value }) => {\r\n return formatMDY(value);\r\n },\r\n },\r\n {\r\n dataType: 'boolean',\r\n displayName: 'Editable',\r\n fieldName: 'Editable',\r\n fieldNameCamelCase: 'editable',\r\n allowFilter: true,\r\n allowSort: true,\r\n width: 120,\r\n minWidth: 120,\r\n suppressMenu: true,\r\n },\r\n {\r\n dataType: 'string',\r\n displayName: 'Owned By',\r\n fieldName: 'OwnerFullName',\r\n fieldNameCamelCase: 'ownerFullName',\r\n allowFilter: true,\r\n allowSort: true,\r\n width: 200,\r\n minWidth: 150,\r\n suppressMenu: true,\r\n },\r\n {\r\n dataType: 'boolean',\r\n displayName: 'Shareable',\r\n fieldName: 'Shareable',\r\n fieldNameCamelCase: 'shareable',\r\n allowFilter: true,\r\n allowSort: true,\r\n width: 100,\r\n suppressMenu: true,\r\n },\r\n {\r\n resizable: true,\r\n dataType: 'string',\r\n displayName: 'Shared By',\r\n fieldName: 'sharedByName',\r\n fieldNameCamelCase: 'sharedByName',\r\n width: 150,\r\n minWidth: 150,\r\n suppressMenu: true,\r\n },\r\n];\r\n\r\nconst isDefaultFieldColumn = {\r\n allowFilter: false,\r\n allowSort: false,\r\n displayName: 'Active',\r\n fieldName: 'active',\r\n fieldNameCamelCase: 'active',\r\n resizable: true,\r\n width: 100,\r\n suppressMenu: true,\r\n};\r\n\r\nconst shareFieldColumn = {\r\n fieldNameCamelCase: '',\r\n resizable: true,\r\n width: 350,\r\n suppressMenu: true,\r\n};\r\n\r\nconst actionFieldColumn = [\r\n {\r\n key: 4,\r\n field: '',\r\n resizable: true,\r\n width: 150,\r\n menuTabs: [],\r\n },\r\n];\r\n\r\nconst getNewDefaultColumns = (listFieldNames, allColumns, chosenColumns) => {\r\n const removedCheckboxColumns = allColumns.slice(2);\r\n\r\n let defaultColumns = listFieldNames.reduce((result, fieldName) => {\r\n const oldColumn = chosenColumns.find((col) => col.fieldName === fieldName);\r\n if (oldColumn) {\r\n result.push(oldColumn);\r\n } else {\r\n const newColumn = allColumns.find((col) => col.fieldName === fieldName);\r\n result.push(newColumn);\r\n }\r\n\r\n return result;\r\n }, []);\r\n\r\n if (removedCheckboxColumns[0]?.field === 'type') {\r\n defaultColumns = [...allColumns.slice(0, 3), ...defaultColumns];\r\n } else {\r\n defaultColumns = [...allColumns.slice(0, 2), ...defaultColumns];\r\n }\r\n return defaultColumns ?? [];\r\n};\r\n\r\nconst getColumnsAfterChangeWidth = (fieldName, width, chosenColumns) => {\r\n const defaultColumns = chosenColumns.map((col) => {\r\n if (col.fieldName === fieldName) {\r\n return { ...col, width };\r\n }\r\n return col;\r\n });\r\n\r\n return defaultColumns;\r\n};\r\n\r\nconst getDefaultConfig = (columns) => {\r\n const removedCheckboxColumns =\r\n columns[2]?.field === 'type' ? columns.slice(3) : columns.slice(2);\r\n\r\n return removedCheckboxColumns.map((col) => ({\r\n fieldName: col.fieldName,\r\n width: col.width,\r\n }));\r\n};\r\n\r\nconst filteredColumns = ['MemberName', 'IxOneId', 'CompanyBrief'];\r\n\r\nconst filterColumnsGrid = (columns) => {\r\n let result = [];\r\n\r\n if (columns?.length > 0) {\r\n columns.forEach((column) => {\r\n if (filteredColumns.includes(column.fieldName)) {\r\n if (column.fieldName === 'MemberName') {\r\n result.push({\r\n ...column,\r\n flex: 1,\r\n });\r\n }\r\n\r\n if (column.fieldName === 'IxOneId') {\r\n result.push({\r\n ...column,\r\n width: 150,\r\n });\r\n }\r\n\r\n if (column.fieldName === 'CompanyBrief') {\r\n result.push({\r\n ...column,\r\n width: 150,\r\n });\r\n }\r\n }\r\n });\r\n\r\n result = [columns[0], ...result];\r\n }\r\n\r\n return result;\r\n};\r\n\r\nconst filterSelectedMembers = (members, selectedIds, selectedMembers) => {\r\n let result = [];\r\n let existingIds = selectedMembers.map((member) => member.id);\r\n\r\n members.forEach((member) => {\r\n // prevent add same member in array\r\n if (selectedIds.includes(member.id) && !existingIds.includes(member.id)) {\r\n result.push(member);\r\n }\r\n });\r\n\r\n return result;\r\n};\r\n\r\nexport {\r\n filterParamsColumns,\r\n getStringFilteredColumns,\r\n defaultColumns,\r\n isDefaultFieldColumn,\r\n shareFieldColumn,\r\n actionFieldColumn,\r\n getListFieldName,\r\n deleteColumnCheckbox,\r\n getNewDefaultColumns,\r\n getColumnsAfterChangeWidth,\r\n getDefaultConfig,\r\n filterColumnsGrid,\r\n filterSelectedMembers,\r\n};\r\n","import React, { useEffect, useRef, useState } from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\n\r\nimport { useIntl } from 'react-intl';\r\n\r\nimport { useParams } from 'react-router-dom';\r\n\r\nimport { Form } from 'antd';\r\nimport { produce } from 'immer';\r\nimport _ from 'lodash';\r\n\r\nimport {\r\n CustomNotification,\r\n StyledModal,\r\n WithLoading,\r\n} from 'common/components';\r\nimport AddProductHierarchy from './AddProductHierarchy';\r\nimport HierarchyLevelList from './HierarchyLevelList';\r\n\r\nimport * as productActions from 'pages/product-full-view/controllers/actions';\r\nimport * as productFullViewSelector from 'pages/product-full-view/controllers/selectors';\r\n\r\nimport { useGetProductFullView, useProductHierarchies } from 'hooks';\r\nimport * as utils from 'utils/productHierarchy';\r\n\r\nimport * as productServices from 'services/product';\r\n\r\nimport {\r\n INIT_ADDING_HIERARCHY_LEVELS as DEFAULT_INIT_ADDING_HIERARCHY_LEVELS,\r\n HIERARCHY_LEVEL,\r\n} from 'static/Constants';\r\n\r\nimport {\r\n useQueryProductHierarchyShortDetail,\r\n useQueryProductHierarchyDetails,\r\n} from 'pages/product-full-view/queries';\r\n\r\nimport Messages from 'i18n/messages/product';\r\n\r\nimport './AddHierarchyModal.less';\r\n\r\nconst AddHierarchyModal = (props) => {\r\n const dispatch = useDispatch();\r\n const intl = useIntl();\r\n const hierarchyProductListRef = useRef([]);\r\n const [QttForm] = Form.useForm();\r\n\r\n const { visible, setVisible, selectedHierarchy, isEdit, isCopy, isAdd } =\r\n props;\r\n\r\n let { id: productId } = useParams();\r\n\r\n const [modalLoading, setModalLoading] = useState(false);\r\n const [selectedLevel, setSelectedLevel] = useState(null);\r\n const [selectedProduct, setSelectedProduct] = useState(null);\r\n\r\n const [hierarchyLevelList, setHierarchyLevelList] = useState(\r\n _.cloneDeep(DEFAULT_INIT_ADDING_HIERARCHY_LEVELS)\r\n );\r\n\r\n const currentHierarchy = useSelector(\r\n productFullViewSelector.makeSelectCurrentHierarchy()\r\n );\r\n\r\n const { productFull: currentProduct } = useGetProductFullView({ productId });\r\n\r\n const { invalidateProductHierarchyShortDetail } =\r\n useQueryProductHierarchyShortDetail();\r\n\r\n const {\r\n data: currentHierarchyShortDetails,\r\n invalidateProductHierarchyDetails,\r\n } = useQueryProductHierarchyDetails({\r\n hierarchyId: currentHierarchy?.productHierarchyId,\r\n });\r\n\r\n // const [hierarchyProductList, setHierarchyProductList] = useState([]);\r\n //* refactor hierarchyProductList from state to ref\r\n const hierarchyProductList = hierarchyProductListRef.current;\r\n const setHierarchyProductList = (newState) => {\r\n const data =\r\n typeof newState === 'function'\r\n ? newState(hierarchyProductList)\r\n : newState;\r\n\r\n hierarchyProductListRef.current = data;\r\n };\r\n\r\n const { saveHierarchiesMutation } = useProductHierarchies({\r\n productId: currentProduct?.productId,\r\n });\r\n\r\n const onCloseModal = () => {\r\n setVisible(false);\r\n };\r\n\r\n const onOkHandler = () => {\r\n if (selectedLevel) {\r\n selectProductForLevel();\r\n return;\r\n }\r\n\r\n callApi();\r\n };\r\n\r\n const selectProductForLevel = () => {\r\n if (!selectedLevel) return;\r\n appendSelectedProductToProductList();\r\n\r\n setHierarchyLevelList((prevState) => {\r\n const cloneState = _.cloneDeep(prevState);\r\n //* set product to level\r\n\r\n _.set(\r\n cloneState,\r\n `[${selectedLevel.index}].productItemId`,\r\n selectedProduct?.id\r\n );\r\n\r\n utils.setParentProductForThisLevel({\r\n levelList: cloneState,\r\n level: selectedLevel,\r\n addedProductId: selectedProduct?.id,\r\n });\r\n\r\n utils.setParentProductForChildrenLevel({\r\n levelList: cloneState,\r\n productList: hierarchyProductList,\r\n level: selectedLevel,\r\n addedProductId: selectedProduct?.id,\r\n });\r\n\r\n updateQuantityForm({ levelList: cloneState });\r\n\r\n return cloneState;\r\n });\r\n\r\n goBackToSelectLevelView();\r\n };\r\n\r\n const appendSelectedProductToProductList = () => {\r\n if (!selectedProduct) return;\r\n setHierarchyProductList((prevState) => {\r\n const productItem = _.cloneDeep(selectedProduct);\r\n\r\n _.set(productItem, 'productItemId', productItem.id);\r\n\r\n const newState = [...prevState, productItem];\r\n\r\n return newState;\r\n });\r\n };\r\n\r\n const updateQuantityForm = ({ levelList }) => {\r\n const hightestLevel = utils.getHighestLevel(levelList);\r\n const isHighestLevel = selectedLevel.packageLevel === hightestLevel;\r\n\r\n QttForm.setFieldsValue({\r\n [selectedLevel.index]: isHighestLevel ? 1 : null,\r\n });\r\n };\r\n\r\n const getApiParams = async () => {\r\n try {\r\n const quantities = await QttForm.validateFields();\r\n\r\n const clonedHierarchyLevelList = _.cloneDeep(hierarchyLevelList);\r\n const levelHasProductList = clonedHierarchyLevelList.filter((level) => {\r\n return level.productItemId;\r\n });\r\n\r\n const itemsParam = levelHasProductList.map((level) => {\r\n const { productItemId, parentProductItemId, packageLevel } = level;\r\n return {\r\n productItemId,\r\n parentProductItemId,\r\n packageLevel,\r\n quantity: quantities[level.index],\r\n };\r\n });\r\n\r\n return {\r\n hierarchyId: isEdit ? selectedHierarchy?.productHierarchyId : undefined,\r\n ownerId: currentProduct?.ownerId,\r\n items: itemsParam,\r\n };\r\n } catch (error) {\r\n console.log('error: ', error);\r\n return;\r\n }\r\n };\r\n\r\n const getApiMessages = () => {\r\n return {\r\n success: intl.formatMessage(\r\n Messages[\r\n isAdd\r\n ? 'addHierarchySuccess'\r\n : isEdit\r\n ? 'editHierarchySuccess'\r\n : 'copyHierarchySuccess'\r\n ]\r\n ),\r\n error: intl.formatMessage(\r\n Messages[\r\n isAdd\r\n ? 'addHierarchyError'\r\n : isEdit\r\n ? 'editHierarchyError'\r\n : 'copyHierarchyError'\r\n ]\r\n ),\r\n };\r\n };\r\n\r\n const callApi = async () => {\r\n const params = await getApiParams();\r\n const messages = getApiMessages();\r\n\r\n saveHierarchiesMutation.mutate(params, {\r\n onSuccess: (response) => {\r\n if (!response.isSuccess) {\r\n CustomNotification.error(response.message || messages.error);\r\n return;\r\n }\r\n\r\n setVisible(false);\r\n\r\n CustomNotification.success(messages.success);\r\n\r\n dispatch(productActions.updateSelectedHierarchy(null));\r\n dispatch(productActions.updateHierarchyEndpoint(null));\r\n\r\n //* reload hierarchies in drawer\r\n invalidateProductHierarchyDetails(\r\n currentHierarchyShortDetails?.hierarchyId\r\n );\r\n\r\n //* reload hierarchy dropdown in product header\r\n invalidateProductHierarchyShortDetail(productId);\r\n },\r\n onError: () => {\r\n CustomNotification.error(messages.error);\r\n },\r\n });\r\n };\r\n\r\n const goBackToSelectLevelView = () => {\r\n setSelectedLevel(null);\r\n setSelectedProduct(null);\r\n };\r\n\r\n const clearState = () => {\r\n setHierarchyProductList([]);\r\n setHierarchyLevelList(_.cloneDeep(DEFAULT_INIT_ADDING_HIERARCHY_LEVELS));\r\n setSelectedLevel(null);\r\n setSelectedProduct(null);\r\n QttForm.resetFields();\r\n };\r\n\r\n const updateHierarchyLevelListWithEqualLevel = (levelKey, levelPackage) => {\r\n setHierarchyLevelList((prevState) => {\r\n const newState = produce(prevState, (draft) => {\r\n const equalWithIndex = draft.findIndex((levelItem) =>\r\n levelItem?.equalWith?.includes(levelKey)\r\n );\r\n\r\n draft[equalWithIndex].key = levelKey;\r\n draft[equalWithIndex].packageLevel = levelPackage;\r\n });\r\n\r\n return newState;\r\n });\r\n };\r\n\r\n const setCurrentProductToHierarchyLevelList = (level) => {\r\n setHierarchyLevelList((prevState) => {\r\n const newState = produce(prevState, (draft) => {\r\n const index = draft.findIndex((levelItem) => levelItem.key === level);\r\n\r\n draft[index].productItemId = currentProduct?.productId;\r\n\r\n //* set parentProductId for first lower level\r\n if (index < 4)\r\n draft[index + 1].parentProductItemId = currentProduct?.productId;\r\n });\r\n\r\n return newState;\r\n });\r\n };\r\n\r\n const addCurrentProductToHierarchyProductList = () => {\r\n const productItem = {\r\n productItemId: currentProduct.productId,\r\n productName: currentProduct.productName,\r\n thumbnail: currentProduct.productPrimaryImage,\r\n packageLevel: currentProduct.packageLevel,\r\n };\r\n\r\n setHierarchyProductList((prevState) => {\r\n prevState.push(productItem);\r\n\r\n return prevState;\r\n });\r\n };\r\n\r\n const initCurrentProduct = () => {\r\n if (!visible) return;\r\n if (isEdit || isCopy) return;\r\n\r\n if (!currentProduct) return;\r\n\r\n const currentProductLevel = currentProduct.packageLevel;\r\n const level = Object.values(HIERARCHY_LEVEL).find(\r\n (LEVEL) => LEVEL.NAME === currentProductLevel\r\n )?.KEY;\r\n\r\n const levelIndex = hierarchyLevelList.findIndex(\r\n (levelItem) => levelItem.key === level\r\n );\r\n\r\n if (levelIndex === -1) {\r\n //* levelIndex === -1 when level is not exist in INIT_ADDING_HIERARCHY_LEVELS (such as Display Shipper, ...)\r\n //* replace equal level with this level\r\n updateHierarchyLevelListWithEqualLevel(level, currentProductLevel);\r\n }\r\n\r\n addCurrentProductToHierarchyProductList();\r\n setCurrentProductToHierarchyLevelList(level);\r\n };\r\n\r\n const initHierarchyData = async () => {\r\n if (isAdd) return;\r\n if (!selectedHierarchy) return;\r\n if (!visible) return;\r\n\r\n setModalLoading(true);\r\n const params = {\r\n hierarchyId: selectedHierarchy.productHierarchyId,\r\n };\r\n\r\n const { isSuccess, data } =\r\n await productServices.getProductHierarchyDetailsService(params);\r\n\r\n let productList;\r\n\r\n if (isSuccess && data?.productItems?.length)\r\n productList = data?.productItems.map((productItem) => {\r\n const { productId, ...rest } = productItem;\r\n return {\r\n productItemId: productId,\r\n ...rest,\r\n };\r\n });\r\n else productList = selectedHierarchy.productItemLinks;\r\n\r\n //* INIT HIERARCHY DATA FROM PRODUCT LIST\r\n //* offsetLevels is missing levels on top\r\n const offsetLevels = utils.getOffsetLevels(productList);\r\n\r\n //* map product list to hierarchy level\r\n const initLevelList = utils.getInitLevelList(productList);\r\n\r\n //* sort initLevelList to the right order\r\n const sortedLevelList = utils.sortLevelList(initLevelList);\r\n\r\n //* add missing hierarchy to middle and bottom of initLevelList\r\n const filledLevelList = utils.fillLevelList(sortedLevelList);\r\n\r\n //* concat with offset levels to get completed list\r\n const completeInitLevelList = [...offsetLevels, ...filledLevelList];\r\n\r\n const reIndexInitLevelList = utils.reIndexLevelList(completeInitLevelList);\r\n\r\n initHierarchyProductList(productList);\r\n initHierarchyLevelList({ levelList: reIndexInitLevelList });\r\n initQuantityForm({ levelList: reIndexInitLevelList });\r\n\r\n setModalLoading(false);\r\n };\r\n\r\n const initHierarchyLevelList = ({ levelList }) => {\r\n setHierarchyLevelList(levelList);\r\n };\r\n\r\n const initHierarchyProductList = (productList) => {\r\n if (!productList) return;\r\n\r\n const initProductList = utils.getInitialProductList({\r\n productList,\r\n currentProduct,\r\n });\r\n\r\n setHierarchyProductList(initProductList);\r\n };\r\n\r\n const initQuantityForm = ({ levelList }) => {\r\n const initialQuantityForm = utils.getInitialQuantity({ levelList });\r\n\r\n QttForm.setFieldsValue(initialQuantityForm);\r\n };\r\n\r\n const checkHighestLevelProduct = () => {\r\n const highestLevelProduct = utils.getHighestLevelProduct({\r\n levelList: hierarchyLevelList,\r\n });\r\n\r\n const currentHighestLevelProduct =\r\n utils.getSelectedHierarchyHighestLevelProduct({\r\n levelList: hierarchyLevelList,\r\n selectedHierarchy,\r\n });\r\n\r\n return highestLevelProduct === currentHighestLevelProduct;\r\n };\r\n\r\n const updateSubmitBtnDisabled = () => {\r\n if (!isCopy) return false;\r\n if (!selectedHierarchy) return false;\r\n\r\n if (selectedLevel) return false;\r\n\r\n let disabled = checkHighestLevelProduct();\r\n\r\n return disabled;\r\n };\r\n\r\n //* mount update\r\n useEffect(() => {\r\n clearState();\r\n initHierarchyData();\r\n initCurrentProduct();\r\n //eslint-disable-next-line\r\n }, [visible]);\r\n\r\n const submitDisabled = updateSubmitBtnDisabled();\r\n\r\n //* render\r\n const modalTitle = intl.formatMessage(\r\n Messages[\r\n isEdit\r\n ? 'editHierarchyTitle'\r\n : isCopy\r\n ? 'copyHierarchyTitle'\r\n : 'addHierarchyTitle'\r\n ]\r\n );\r\n const okText = intl.formatMessage(\r\n Messages[\r\n selectedLevel\r\n ? 'selectProductHierarchy'\r\n : isEdit || isCopy\r\n ? 'editHierarchy'\r\n : 'addHierarchy'\r\n ]\r\n );\r\n\r\n const modalProps = {\r\n title: modalTitle,\r\n visible,\r\n onCancel: onCloseModal,\r\n wrapClassName: 'add-hierarchy__modal',\r\n bodyStyle: {\r\n height: selectedLevel ? 405 : 300,\r\n position: 'relative',\r\n },\r\n width: 700,\r\n destroyOnClose: true,\r\n closeable: false,\r\n okText,\r\n onOk: onOkHandler,\r\n okButtonProps: {\r\n loading: saveHierarchiesMutation?.isLoading,\r\n disabled: submitDisabled,\r\n },\r\n };\r\n\r\n const addProductHierarchyProps = {\r\n closeModal: onCloseModal,\r\n goBackToSelectLevelView,\r\n selectedLevel,\r\n selectedProduct,\r\n setSelectedProduct,\r\n productId,\r\n };\r\n\r\n const hierarchyLevelListProps = {\r\n isCopy,\r\n form: QttForm,\r\n currentProduct,\r\n hierarchyLevelList,\r\n hierarchyProductList,\r\n selectedHierarchy,\r\n closeModal: onCloseModal,\r\n goBackToSelectLevelView,\r\n setHierarchyLevelList,\r\n setHierarchyProductList,\r\n setSelectedLevel,\r\n checkHighestLevelProduct,\r\n initQuantityForm,\r\n };\r\n\r\n return (\r\n \r\n {modalLoading ? (\r\n \r\n ) : selectedLevel ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default AddHierarchyModal;\r\n","import React, { useState } from 'react';\r\n\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\nimport { FileAddOutlined } from '@ant-design/icons';\r\n\r\nimport AddHierarchyModal from '../../modal/product-hierarchy/AddHierarchyModal';\r\n\r\nimport Messages from 'i18n/messages/home';\r\n\r\nconst AddHierarchy = (props) => {\r\n const { sectionDisabled } = props;\r\n\r\n const [visible, setVisible] = useState(false);\r\n\r\n const onClickHandler = () => {\r\n setVisible(true);\r\n };\r\n\r\n const isDisabled = sectionDisabled;\r\n\r\n return (\r\n <>\r\n }\r\n label={Messages.addHierarchy}\r\n onClick={onClickHandler}\r\n disabled={isDisabled}\r\n />\r\n \r\n \r\n );\r\n};\r\n\r\nexport default AddHierarchy;\r\n","import React, { useState } from 'react';\r\n\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\nimport { EditOutlined } from '@ant-design/icons';\r\n\r\nimport AddHierarchyModal from '../../modal/product-hierarchy/AddHierarchyModal';\r\n\r\nimport Messages from 'i18n/messages/home';\r\n\r\nconst EditHierarchy = (props) => {\r\n const { selectedHierarchy, sectionDisabled } = props;\r\n\r\n const [visible, setVisible] = useState(false);\r\n\r\n const onClickHandler = () => {\r\n setVisible(true);\r\n };\r\n\r\n const isDisabled = !selectedHierarchy || sectionDisabled;\r\n\r\n return (\r\n <>\r\n }\r\n label={Messages.editHierarchy}\r\n onClick={onClickHandler}\r\n disabled={isDisabled}\r\n />\r\n \r\n \r\n );\r\n};\r\n\r\nexport default EditHierarchy;\r\n","import React, { useState } from 'react';\r\n\r\nimport { CopyOutlined } from '@ant-design/icons';\r\n\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\nimport AddHierarchyModal from '../../modal/product-hierarchy/AddHierarchyModal';\r\n\r\nimport Messages from 'i18n/messages/home';\r\n\r\nconst CopyHierarchy = (props) => {\r\n const { selectedHierarchy, sectionDisabled } = props;\r\n\r\n const [visible, setVisible] = useState(false);\r\n\r\n const onClickHandler = () => {\r\n setVisible(true);\r\n };\r\n\r\n const isDisabled = !selectedHierarchy || sectionDisabled;\r\n\r\n return (\r\n <>\r\n }\r\n label={Messages.copyHierarchy}\r\n onClick={onClickHandler}\r\n disabled={isDisabled}\r\n />\r\n \r\n \r\n );\r\n};\r\n\r\nexport default CopyHierarchy;\r\n","import React from 'react';\r\n\r\nimport { useIntl } from 'react-intl';\r\nimport { useParams } from 'react-router-dom';\r\n\r\nimport { useDispatch } from 'react-redux';\r\n\r\nimport { DeleteOutlined } from '@ant-design/icons';\r\n\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\nimport { dialogFunction, CustomNotification } from 'common/components';\r\n\r\nimport * as productActions from 'pages/product-full-view/controllers/actions';\r\n\r\nimport { useProductHierarchies, useProductFullView } from 'hooks';\r\nimport { useGetToleranceProductId } from 'pages/product-full-view/hooks';\r\nimport { useQueryProductHierarchyShortDetail } from 'pages/product-full-view/queries';\r\n\r\nimport Messages from 'i18n/messages/home';\r\n\r\nimport { useGetCurrentProductHierarchyDetails } from 'pages/product-full-view/hooks';\r\n\r\nconst DeleteHierarchy = (props) => {\r\n const intl = useIntl();\r\n const dispatch = useDispatch();\r\n\r\n const { id: productId } = useParams();\r\n\r\n const { selectedHierarchy, sectionDisabled } = props;\r\n\r\n const { productFull } = useProductFullView({ productId });\r\n const { deleteHierarchiesMutation } = useProductHierarchies({\r\n productId: productFull?.productId,\r\n });\r\n\r\n const toleranceProductId = useGetToleranceProductId();\r\n\r\n const { invalidateProductHierarchyShortDetail } =\r\n useQueryProductHierarchyShortDetail();\r\n\r\n const {\r\n data: currentHierarchyShortDetails,\r\n invalidateProductHierarchyDetails,\r\n } = useGetCurrentProductHierarchyDetails();\r\n\r\n const loading = deleteHierarchiesMutation.isLoading;\r\n\r\n const showDeleteConfirmDialog = () => {\r\n dialogFunction({\r\n type: 'warn',\r\n okButtonProps: {\r\n loading: loading,\r\n },\r\n content: intl.formatMessage(Messages.deleteHierarchyMessage),\r\n onOk: callApiDeleteHierarchy,\r\n });\r\n };\r\n\r\n const callApiDeleteHierarchy = () => {\r\n const successMessage = intl.formatMessage(Messages.deleteHierarchySuccess);\r\n const errorMessage = intl.formatMessage(Messages.deleteHierarchyError);\r\n\r\n const params = {\r\n hierarchyId: selectedHierarchy?.productHierarchyId,\r\n };\r\n\r\n deleteHierarchiesMutation.mutate(params, {\r\n onSuccess: ({ isSuccess }) => {\r\n if (!isSuccess) CustomNotification.error(errorMessage);\r\n\r\n CustomNotification.success(successMessage);\r\n dispatch(productActions.updateSelectedHierarchy(null));\r\n dispatch(productActions.updateHierarchyEndpoint(null));\r\n //* reload hierarchies in drawer\r\n invalidateProductHierarchyDetails(\r\n currentHierarchyShortDetails?.hierarchyId\r\n );\r\n\r\n //* reload hierarchy dropdown in product header\r\n invalidateProductHierarchyShortDetail(toleranceProductId);\r\n },\r\n onError: () => {\r\n CustomNotification.error(errorMessage);\r\n },\r\n });\r\n };\r\n\r\n const onClickHandler = () => {\r\n showDeleteConfirmDialog();\r\n };\r\n\r\n const isDisabled = !selectedHierarchy || sectionDisabled;\r\n\r\n return (\r\n <>\r\n }\r\n label={Messages.deleteHierarchy}\r\n onClick={onClickHandler}\r\n disabled={isDisabled}\r\n />\r\n \r\n );\r\n};\r\n\r\nexport default DeleteHierarchy;\r\n","import React from 'react';\r\n\r\nimport { useLocation } from 'react-router-dom';\r\n\r\nimport { useSelector } from 'react-redux';\r\n\r\nimport { Dropdown, Menu } from 'antd';\r\nimport { ClusterOutlined } from '@ant-design/icons';\r\n\r\nimport { RibbonButton } from 'common/components';\r\n\r\nimport AddHierarchy from '../../controls/product-full/AddHierarchy';\r\nimport EditHierarchy from '../../controls/product-full/EditHierarchy';\r\nimport CopyHierarchy from '../../controls/product-full/CopyHierarchy';\r\nimport DeleteHierarchy from '../../controls/product-full/DeleteHierarchy';\r\n\r\nimport { PRODUCT_VIEW } from 'static/Constants';\r\nimport { useCheckIsProductOverlay } from 'hooks/product';\r\n\r\nimport messages from 'i18n/messages/home';\r\n\r\nimport * as productDetailSelectors from 'pages/product-full-view/controllers/selectors';\r\n\r\nimport {\r\n useCheckAllowEditProducts,\r\n useGetProductFullView,\r\n usePermissionEditProduct,\r\n} from 'hooks';\r\n\r\nimport './HierarchyActions.less';\r\n\r\nconst HierarchyActions = ({ productId }) => {\r\n const location = useLocation();\r\n\r\n const { productFull } = useGetProductFullView({ productId });\r\n\r\n const { checkAllowEditProductFull } = useCheckAllowEditProducts();\r\n\r\n const hasPermissionEditProduct = usePermissionEditProduct();\r\n\r\n const isAllowEditProduct = checkAllowEditProductFull(productFull);\r\n\r\n const isOverlayProduct = useCheckIsProductOverlay({\r\n productId,\r\n });\r\n\r\n const isShowHierarchySections = hasPermissionEditProduct && !isOverlayProduct;\r\n\r\n const selectedHierarchy = useSelector(\r\n productDetailSelectors.makeSelectSelectedHierarchy()\r\n );\r\n\r\n const sectionDisabled = !isAllowEditProduct;\r\n\r\n const getActiveContent = () => {\r\n const regex = /\\/(?:product)\\/(.+)(?=\\/\\d+$)/;\r\n\r\n const results = location?.pathname?.match(regex);\r\n\r\n return results?.length ? results[1] : validateOverview();\r\n };\r\n\r\n const validateOverview = () => {\r\n const regex = /\\/product\\/\\d+$/;\r\n const isOverview = regex.test(location.pathname);\r\n return isOverview ? PRODUCT_VIEW.OVERVIEW : null;\r\n };\r\n\r\n const activeContent = getActiveContent();\r\n\r\n const isHierarchyContent = activeContent === PRODUCT_VIEW.HIERARCHY;\r\n\r\n const hierarchyEditable =\r\n isHierarchyContent && !productFull?.gdsnShield && isAllowEditProduct;\r\n\r\n const renderHierarchyActions = (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n\r\n return (\r\n <>\r\n {isShowHierarchySections && hierarchyEditable && (\r\n \r\n }\r\n label={messages.productHierarchyActions}\r\n />\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default HierarchyActions;\r\n","import React from 'react';\r\nimport { useHistory } from 'react-router-dom';\r\n\r\nimport { ProfileOutlined } from '@ant-design/icons';\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\nimport useToggleActiveRibbon from './hook';\r\n\r\nimport { useSsoProductParams } from 'hooks/useSso';\r\n\r\nimport Messages from 'i18n/messages/home';\r\nimport { useGetProductFullView } from 'hooks';\r\n\r\nconst ProductDetailView = ({ productId: productIdProp }) => {\r\n const history = useHistory();\r\n\r\n const { productFull } = useGetProductFullView({ productId: productIdProp });\r\n\r\n const { ssoParamUrl: ssoProductParams, productId: ssoProductId } =\r\n useSsoProductParams();\r\n\r\n const checkActiveContent = () => {\r\n const path = history?.location?.pathname;\r\n const regex = /\\/product\\/detail\\/\\d+$/;\r\n return regex.test(path);\r\n };\r\n\r\n const isPathActive = checkActiveContent();\r\n const isActive = useToggleActiveRibbon(isPathActive);\r\n\r\n const handleClick = () => {\r\n if (isActive) {\r\n if (ssoProductParams) {\r\n history.push(`/product/${ssoProductId}/?${ssoProductParams}`);\r\n } else {\r\n history.push(`/product/${productFull?.productId}`);\r\n }\r\n } else {\r\n if (ssoProductParams) {\r\n history.push(`/product/detail/${ssoProductId}?${ssoProductParams}`);\r\n } else {\r\n history.push(`/product/detail/${productFull?.productId}`);\r\n }\r\n }\r\n };\r\n\r\n return (\r\n }\r\n label={Messages.productDetailView}\r\n onClick={handleClick}\r\n toggle={isPathActive}\r\n disabled={!productFull?.productId}\r\n />\r\n );\r\n};\r\n\r\nexport default ProductDetailView;\r\n","import React from 'react';\r\nimport { useHistory } from 'react-router-dom';\r\n\r\nimport { ApartmentOutlined } from '@ant-design/icons';\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\n\r\nimport { useGetProductFullView } from 'hooks';\r\nimport { useSsoProductParams } from 'hooks/useSso';\r\nimport Messages from 'i18n/messages/home';\r\nimport useToggleActiveRibbon from './hook';\r\n\r\nconst ProductHierarchy = ({ productId }) => {\r\n const history = useHistory();\r\n\r\n const { productFull } = useGetProductFullView({ productId });\r\n\r\n const { ssoParamUrl: ssoProductParams, productId: ssoProductId } =\r\n useSsoProductParams();\r\n\r\n const checkActiveContent = () => {\r\n const path = history?.location?.pathname;\r\n\r\n const regex = /\\/product\\/hierarchy\\/\\d+$/;\r\n return regex.test(path);\r\n };\r\n\r\n const isPathActive = checkActiveContent();\r\n const isActive = useToggleActiveRibbon(isPathActive);\r\n\r\n const handleClick = () => {\r\n if (isActive) {\r\n if (ssoProductParams) {\r\n history.push(`/product/${ssoProductId}/?${ssoProductParams}`);\r\n } else {\r\n history.push(`/product/${productFull?.productId}`);\r\n }\r\n } else {\r\n if (ssoProductParams) {\r\n history.push(`/product/hierarchy/${ssoProductId}?${ssoProductParams}`);\r\n } else {\r\n history.push(`/product/hierarchy/${productFull?.productId}`);\r\n }\r\n }\r\n };\r\n\r\n return (\r\n }\r\n label={Messages.productHierarchy}\r\n onClick={handleClick}\r\n toggle={isPathActive}\r\n disabled={!productFull?.productId}\r\n />\r\n );\r\n};\r\n\r\nexport default ProductHierarchy;\r\n","import React from 'react';\r\n\r\nimport { useSelector } from 'react-redux';\r\n\r\nimport IconDownloadSheet from 'common/components/button/svg-icons/ICO_10.46.svg?react';\r\nimport { CloudDownloadOutlined } from '@ant-design/icons';\r\n\r\nimport * as productSelectors from 'pages/product-full-view/controllers/selectors';\r\n\r\nimport { forwardTo } from 'utils/common/route';\r\nimport { saveFile } from 'utils/saveFile';\r\n\r\nimport { downloadMappingProductSheets } from 'services/mapping';\r\n\r\nimport messages from 'i18n/messages/home';\r\n\r\nimport {\r\n CustomNotification,\r\n ItemButton,\r\n ContainerButton,\r\n RibbonButton,\r\n} from 'common/components';\r\n\r\nconst ProductSheets = ({ productId, disabled }) => {\r\n return (\r\n }\r\n label={messages.downloadSheet}\r\n onClick={() => forwardTo(`/product/sheets/${productId}`)}\r\n disabled={disabled}\r\n className='button-item-dropdown'\r\n />\r\n );\r\n};\r\n\r\nexport const DownloadMappingProductSheets = () => {\r\n const selectedMapping = useSelector(\r\n productSelectors.makeSelectSelectedMapping()\r\n );\r\n const currentHierarchy = useSelector(\r\n productSelectors.makeSelectCurrentHierarchy()\r\n );\r\n\r\n const handleDownloadMappingProductSheets = () => {\r\n downloadMappingProductSheets({\r\n mappingId: parseInt(selectedMapping?.mappingId),\r\n hierarchyId: parseInt(currentHierarchy?.productHierarchyId),\r\n })\r\n .then((response) => {\r\n if (response.isSuccess) {\r\n saveFile(response?.data?.url);\r\n } else {\r\n CustomNotification.error(response?.message);\r\n }\r\n })\r\n .catch(() => {\r\n CustomNotification.error('Something went wrong. Try again');\r\n });\r\n };\r\n\r\n return (\r\n \r\n \r\n }\r\n label={messages.download}\r\n disabled={!selectedMapping || !currentHierarchy}\r\n onClick={handleDownloadMappingProductSheets}\r\n />\r\n \r\n \r\n );\r\n};\r\n\r\nexport default ProductSheets;\r\n","import { useState, useEffect } from 'react';\r\n\r\nconst useToggleActiveRibbon = (isPathActive) => {\r\n const [isActive, setIsActive] = useState(false);\r\n\r\n useEffect(() => {\r\n if (isPathActive) {\r\n setIsActive(true);\r\n } else {\r\n setIsActive(false);\r\n }\r\n }, [isPathActive]);\r\n\r\n return isActive;\r\n};\r\n\r\nexport default useToggleActiveRibbon;\r\n","import React from 'react';\r\nimport { Table } from 'antd';\r\nimport { DeleteOutlined } from '@ant-design/icons';\r\n\r\nconst SelectedProductList = ({ productList, handleRemoveActiveProduct }) => {\r\n const mappingListUpload = productList;\r\n\r\n const COLUMNS_TABLE = [\r\n {\r\n title: 'Product Name',\r\n dataIndex: 'productName',\r\n render: (productName, record) => {\r\n return (\r\n <>\r\n \r\n {productName}\r\n \r\n \r\n );\r\n },\r\n },\r\n {\r\n title: 'GTIN',\r\n dataIndex: 'gtin',\r\n },\r\n {\r\n title: 'RIVIR ID',\r\n dataIndex: 'rivirId',\r\n },\r\n {\r\n title: 'Category I',\r\n dataIndex: 'category1Name',\r\n },\r\n {\r\n title: 'Category II',\r\n dataIndex: 'category2Name',\r\n },\r\n {\r\n title: 'Category III',\r\n dataIndex: 'category3Name',\r\n },\r\n {\r\n title: 'Category IV',\r\n dataIndex: 'category4Name',\r\n },\r\n {\r\n title: '',\r\n render: (_, record) => (\r\n handleRemoveActiveProduct(record)}\r\n style={{ cursor: 'pointer', color: '#ff4d4f' }}\r\n >\r\n \r\n \r\n ),\r\n },\r\n ];\r\n\r\n return (\r\n
\r\n \r\n
\r\n );\r\n};\r\n\r\nexport default SelectedProductList;\r\n","import { RetweetOutlined } from '@ant-design/icons';\r\nimport { Button, Col, Empty, Form, Row, Typography } from 'antd';\r\nimport React, { useState } from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\n\r\nimport {\r\n CustomNotification,\r\n FormAddButton,\r\n ProductCategoryTree,\r\n dialogFunction,\r\n} from 'common/components';\r\n\r\nimport SelectedProductList from './SelectedProductList';\r\nimport messages from 'i18n/messages/home';\r\nimport { StyledModal } from 'common/components';\r\n\r\nimport gridSelector from 'common/components/grid-view/controllers/selectors';\r\nimport * as actionsGridView from 'common/components/grid-view/controllers/actions';\r\nimport { useGetMemberId } from 'hooks/useGetMemberId';\r\nimport { useDispatchReloadPage } from 'hooks/useReloadPage';\r\nimport { useGetProductCategoryTreeView } from 'pages/company-profile/components/tabs/system/category-management/hooks/useProductCategoryManagement';\r\nimport * as categoryManagement from 'services/categoryManagement';\r\nimport { EVENT } from 'static/Constants';\r\nimport { apiHandler } from 'utils/api';\r\n\r\nimport ProductCategoryForm from 'pages/company-profile/components/tabs/system/category-management/components/ProductCategoryForm';\r\nimport {\r\n generateIdsBySelectedKey,\r\n getCategoryObjectWhenSelectNode,\r\n} from 'pages/company-profile/components/tabs/system/category-management/utils';\r\n\r\nimport './AssignCategoryToProductModal.less';\r\nimport { useGlobalModal, useUserInfo } from 'hooks';\r\nimport { useGetProductVersionList } from 'pages/product-history/hook';\r\n\r\nconst { Title } = Typography;\r\n\r\nconst AssignCategoryToProductModal = ({\r\n isProductDetail = false,\r\n productFull,\r\n}) => {\r\n const intl = useIntl();\r\n const dispatch = useDispatch();\r\n const [form] = Form.useForm();\r\n\r\n const [nodeSelected, setNodeSelected] = useState(null);\r\n const [idDeletedList, setIdDeletedList] = useState([]);\r\n const [isPrefetching, setIsPrefetching] = useState(true);\r\n const [isBlankCategory, setIsBlankCategory] = useState(false);\r\n const [loadingAssignCategoryToProduct, setLoadingAssignCategoryToProduct] =\r\n useState(false);\r\n\r\n const { memberId } = useGetMemberId();\r\n\r\n const { closeModal, checkModalVisible, MODAL_NAMES } = useGlobalModal();\r\n\r\n const isModalOpen = checkModalVisible(MODAL_NAMES.ASSIGN_CATEGORY_TO_PRODUCT);\r\n\r\n const { userInfo } = useUserInfo();\r\n const currentMemberId = userInfo?.member.id;\r\n\r\n const reloadPage = useDispatchReloadPage();\r\n\r\n const selectedItemDetailList = useSelector(\r\n gridSelector.makeSelectDetailCurrentITemsSelection()\r\n );\r\n\r\n const { handleRefetchProductVersioning } = useGetProductVersionList({\r\n enabled: false,\r\n });\r\n\r\n const { nestedCategory, isLoading } = useGetProductCategoryTreeView(\r\n currentMemberId,\r\n isModalOpen,\r\n isPrefetching,\r\n setIsPrefetching\r\n );\r\n\r\n const getProductSelectedList = () => {\r\n const productSelected = isProductDetail\r\n ? [productFull]\r\n : selectedItemDetailList;\r\n\r\n const productFilter = productSelected.filter(\r\n (item) => !idDeletedList.includes(item?.id)\r\n );\r\n return productFilter;\r\n };\r\n\r\n const productSelectedList = getProductSelectedList();\r\n\r\n const isDisabled =\r\n !isBlankCategory && (!nodeSelected || !productSelectedList.length);\r\n\r\n const onCancel = () => {\r\n closeModal(MODAL_NAMES.ASSIGN_CATEGORY_TO_PRODUCT);\r\n };\r\n\r\n const dispatchReloadCategoryEvent = () => {\r\n const event = new CustomEvent(EVENT.RELOAD_CATEGORY);\r\n document.dispatchEvent(event);\r\n };\r\n\r\n const resetActiveProducts = () => {\r\n setIdDeletedList([]);\r\n };\r\n\r\n const handleRemoveActiveProduct = (productItem) => {\r\n setIdDeletedList((prev) => [...prev, productItem?.id]);\r\n };\r\n\r\n const onSelectNode = (nodeFound) => {\r\n const fieldsValues = getCategoryObjectWhenSelectNode(\r\n nestedCategory,\r\n nodeFound\r\n );\r\n setIsBlankCategory(false);\r\n form.setFieldsValue(fieldsValues);\r\n setNodeSelected(nodeFound);\r\n };\r\n\r\n const sendPayLoadToBeWhenAssignCategoryToProduct = (forceUpdate = false) => {\r\n let params = {};\r\n\r\n const idProductAssignList = productSelectedList.map(\r\n (productItem) => productItem.id\r\n );\r\n\r\n if (isBlankCategory) {\r\n params = {\r\n category1Id: null,\r\n category2Id: null,\r\n category3Id: null,\r\n category4Id: null,\r\n };\r\n } else {\r\n const idCategoryList = generateIdsBySelectedKey(nodeSelected?.key ?? '');\r\n for (let i = 0; i < idCategoryList.length; i++) {\r\n params[`category${i + 1}Id`] = idCategoryList[i];\r\n }\r\n }\r\n\r\n const idProductList = isProductDetail\r\n ? [productFull.productId]\r\n : idProductAssignList;\r\n\r\n return (params = {\r\n ...params,\r\n memberId,\r\n productItemIds: idProductList,\r\n forceUpdate,\r\n });\r\n };\r\n\r\n const unSelectNode = () => {\r\n const unSelectNode = new CustomEvent('unSelectNode', {\r\n detail: 'reset-category-modal',\r\n });\r\n document.dispatchEvent(unSelectNode);\r\n };\r\n\r\n const setEmptyCategory = () => {\r\n form.resetFields();\r\n unSelectNode();\r\n setNodeSelected(null);\r\n setIsBlankCategory(true);\r\n };\r\n\r\n const successCallbackReassign = () => {\r\n dispatchReloadCategoryEvent();\r\n closeModal(MODAL_NAMES.ASSIGN_CATEGORY_TO_PRODUCT);\r\n reloadPage({ clearSelection: true });\r\n setLoadingAssignCategoryToProduct(false);\r\n dispatch(actionsGridView.updatePagesSelection([]));\r\n dispatch(actionsGridView.updateItemPageSelection([]));\r\n handleRefetchProductVersioning();\r\n };\r\n\r\n const onOkReassignCategoryToProduct = () => {\r\n setLoadingAssignCategoryToProduct(true);\r\n const params = sendPayLoadToBeWhenAssignCategoryToProduct(true);\r\n apiHandler({\r\n service: categoryManagement.assignCategoryToProduct,\r\n params,\r\n successMessage: intl.formatMessage(\r\n messages.assignCategoryToProductSuccess\r\n ),\r\n errorMessage: intl.formatMessage(messages.assignCategoryToProductFail),\r\n\r\n successCallback: successCallbackReassign,\r\n onFinally: () => {\r\n setLoadingAssignCategoryToProduct(false);\r\n },\r\n });\r\n };\r\n\r\n const AssignCategoryToProduct = () => {\r\n setLoadingAssignCategoryToProduct(true);\r\n const confirmOverWriteCategory = isProductDetail\r\n ? 'confirmOverwriteCategoryProductDetail'\r\n : 'confirmOverwriteCategoryProductGrid';\r\n\r\n const params = sendPayLoadToBeWhenAssignCategoryToProduct();\r\n\r\n apiHandler({\r\n service: categoryManagement.assignCategoryToProduct,\r\n params,\r\n successMessage: intl.formatMessage(\r\n messages.assignCategoryToProductSuccess\r\n ),\r\n errorMessage: intl.formatMessage(messages.assignCategoryToProductFail),\r\n skipNotification: true,\r\n successCallback: (data) => {\r\n if (!data.existProductLinks) {\r\n CustomNotification.success(\r\n intl.formatMessage(messages.assignCategoryToProductSuccess)\r\n );\r\n successCallbackReassign();\r\n }\r\n },\r\n failCallback: () => {\r\n setLoadingAssignCategoryToProduct(false);\r\n dialogFunction({\r\n type: 'warn',\r\n content: intl.formatMessage(messages[confirmOverWriteCategory]),\r\n okText: 'OK',\r\n cancelText: 'Cancel',\r\n onOk: () => onOkReassignCategoryToProduct(),\r\n });\r\n },\r\n });\r\n };\r\n\r\n const renderModalFooter = () => {\r\n const CancelBtn = Button;\r\n const AssignBtn = Button;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {intl.formatMessage(messages.previewRequirementsCancelButton)}\r\n \r\n \r\n {intl.formatMessage(messages.assignCategoryToProductText)}\r\n \r\n \r\n \r\n );\r\n };\r\n\r\n const modalProps = {\r\n title: intl.formatMessage(messages.assignCategoryToProduct),\r\n visible: isModalOpen,\r\n onCancel,\r\n width: '1150px',\r\n bodyStyle: { maxHeight: '670px', height: '66vh' },\r\n forceRender: true,\r\n footer: renderModalFooter(),\r\n destroyOnClose: true,\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {intl.formatMessage(messages.assignedProductTitle)} (\r\n {productSelectedList.length})\r\n \r\n \r\n \r\n }\r\n onClick={resetActiveProducts}\r\n disabled={!idDeletedList.length}\r\n />\r\n \r\n \r\n {productSelectedList.length > 0 ? (\r\n \r\n ) : (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nexport default AssignCategoryToProductModal;\r\n","import React from 'react';\r\n\r\nimport { Menu } from 'antd';\r\nimport { EditOutlined, UploadOutlined } from '@ant-design/icons';\r\n\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\n\r\nimport messagesProduct from 'i18n/messages/product';\r\nimport { useGlobalModal } from 'hooks';\r\n\r\nconst BulkEditProduct = (props) => {\r\n const { disabled, selectedProducts, selectedFolders, disabledExport } = props;\r\n\r\n const { openModal, MODAL_NAMES } = useGlobalModal();\r\n const onClickExportButton = () => {\r\n openModal(MODAL_NAMES.EXPORT_PROPERTY_MODAL);\r\n };\r\n\r\n const onClickImportButton = () => {\r\n openModal(MODAL_NAMES.IMPORT_PROPERTY_MODAL);\r\n };\r\n\r\n const isDisabledExportButton =\r\n disabledExport || (!selectedProducts?.length && !selectedFolders?.length);\r\n\r\n return (\r\n <>\r\n \r\n }\r\n label={messagesProduct.exportSelectedProduct}\r\n onClick={onClickExportButton}\r\n disabled={isDisabledExportButton}\r\n />\r\n \r\n \r\n }\r\n label={messagesProduct.importBuildEdit}\r\n onClick={onClickImportButton}\r\n disabled={disabled}\r\n />\r\n \r\n \r\n );\r\n};\r\n\r\nexport default BulkEditProduct;\r\n","export const DEFAULT_COLUMNS = {\r\n dataRecipientGln: { headerName: 'Data Recipient GLN' },\r\n dataSourceGln: { headerName: 'Data Source GLN' },\r\n gtin: { headerName: 'GTIN' },\r\n publicationDate: { format: 'date' },\r\n targetMarket: {},\r\n};\r\n","import { DEFAULT_COLUMNS } from './constants';\r\n\r\nimport { Checkbox } from 'antd';\r\n\r\nimport { formatMDY } from 'utils/formatDate';\r\n\r\nexport const getColumnDefs = ({ item }) => {\r\n const fields = Object.keys(item ? item : DEFAULT_COLUMNS);\r\n const checkboxColumns = {\r\n checkboxSelection: true,\r\n headerCheckboxSelection: true,\r\n filter: false,\r\n resizable: false,\r\n suppressMenu: true,\r\n width: 50,\r\n };\r\n\r\n const columns = fields.reduce((accumulator, currentField, index) => {\r\n const COLUMN = DEFAULT_COLUMNS[currentField];\r\n const valueFormatter = getValueFormatter(COLUMN?.format);\r\n\r\n const column = {\r\n field: currentField,\r\n headerName: COLUMN?.headerName,\r\n valueFormatter,\r\n flex: 1,\r\n };\r\n\r\n accumulator.push(column);\r\n\r\n return accumulator;\r\n }, []);\r\n\r\n const actionColumn = {\r\n field: 'unRegisterProduct',\r\n flex: 1,\r\n headerName: 'Unregister Product',\r\n cellRenderer: (params) => {\r\n return ;\r\n },\r\n };\r\n return [checkboxColumns, ...columns, actionColumn];\r\n};\r\n\r\nconst CheckboxRender = ({ params }) => {\r\n const onChangeUnregisterCheckbox = (params) => (e) => {\r\n const rowNode = params.node;\r\n\r\n rowNode.setDataValue('unRegisterProduct', e.target.checked);\r\n };\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst getValueFormatter = (format) => {\r\n const formatterCollection = {\r\n date: formatDate,\r\n };\r\n\r\n return formatterCollection[format];\r\n};\r\n\r\nconst formatDate = (params) => {\r\n return formatMDY(params.value);\r\n};\r\n","import React, { useMemo, useEffect, useRef, useState } from 'react';\r\n\r\nimport { AgGridClient } from 'common/components';\r\n\r\nimport * as utils from './utils';\r\n\r\nconst disableRowClickCols = ['unRegisterProduct'];\r\n\r\nconst PublicationTable = (props) => {\r\n const { data, onSelect } = props;\r\n\r\n const refAggrid = useRef();\r\n const [rowData, setRowData] = useState([]);\r\n\r\n const columns = useMemo(() => {\r\n const firstRowData = data?.[0];\r\n\r\n return utils.getColumnDefs({ item: firstRowData });\r\n }, [data?.[0]]);\r\n\r\n const onSelectRow = (params) => {\r\n const selectedRows = params.api.getSelectedRows();\r\n onSelect && onSelect(selectedRows);\r\n };\r\n\r\n const onCellClick = (clickEvent) => {\r\n const colId = clickEvent?.column?.colId;\r\n if (!disableRowClickCols.includes(colId)) {\r\n clickEvent.node.setSelected(true);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n const newData = data.map((dataItem) => ({\r\n unRegisterProduct: false,\r\n ...dataItem,\r\n }));\r\n\r\n setRowData(newData);\r\n }, [data]);\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport default PublicationTable;\r\n","import { useState, useRef } from 'react';\r\n\r\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\r\n\r\nimport { dialogFunction, CustomNotification } from 'common/components';\r\n\r\nimport {\r\n deleteProductItemsPublication,\r\n getAllPublications,\r\n} from 'services/product';\r\n\r\nexport const useWithdrawPublication = (props = {}) => {\r\n const shouldReloadRef = useRef();\r\n const { products, enabled = false } = props;\r\n\r\n const [selectedPublications, setSelectedPublications] = useState([]);\r\n\r\n const queryClient = useQueryClient();\r\n\r\n const publicationsQuery = useQuery({\r\n queryKey: ['get-all-publication', products?.[0]?.id],\r\n queryFn: async ({ queryKey }) => {\r\n const productId = queryKey?.[1];\r\n\r\n if (!productId) return;\r\n\r\n const params = { productId };\r\n const response = await getAllPublications(params);\r\n\r\n if (!response?.isSuccess) throw new Error(response?.message);\r\n\r\n return response?.data;\r\n },\r\n enabled,\r\n retry: false,\r\n });\r\n\r\n const withdrawPublicationMutation = useMutation({\r\n mutationKey: 'withdraw-publication',\r\n mutationFn: (params) => {\r\n return deleteProductItemsPublication(params);\r\n },\r\n onSuccess: (response) => {\r\n response?.isSuccess &&\r\n queryClient.invalidateQueries({\r\n queryKey: ['get-all-publication', products?.[0]?.id],\r\n });\r\n\r\n shouldReloadRef.current = response?.isSuccess;\r\n },\r\n onError: () => {\r\n CustomNotification.error(\r\n 'Cannot withdraw product(s) publication/registration!'\r\n );\r\n },\r\n });\r\n\r\n const getWithdrawPublicationParams = () => {\r\n return selectedPublications.map((publicationItem) => {\r\n return {\r\n catalogueItemReferenceGtin: publicationItem?.gtin,\r\n dataSourceGln: publicationItem?.dataSourceGln,\r\n dataRecipientGln: publicationItem?.dataRecipientGln,\r\n catalogueItemReferenceTargetMarketCountryCode:\r\n publicationItem?.targetMarket,\r\n unRegisterProduct: publicationItem?.unRegisterProduct,\r\n };\r\n });\r\n };\r\n\r\n const confirmDeleteProductsPublication = () => {\r\n dialogFunction({\r\n type: 'warn',\r\n content:\r\n 'Are you sure to withdraw the selected product(s) publication/registration?',\r\n okText: 'Confirm',\r\n okButtonProps: {\r\n type: 'danger',\r\n },\r\n onOk: handleWithdrawPublication,\r\n });\r\n };\r\n\r\n const handleWithdrawPublication = async () => {\r\n withdrawPublicationMutation.mutate(\r\n {\r\n withdrawPublishedProducts: getWithdrawPublicationParams(),\r\n },\r\n {\r\n onSuccess: (response) => {\r\n if (response?.isSuccess) {\r\n CustomNotification.success(\r\n 'Withdraw product(s) publication/registration successfully!'\r\n );\r\n } else {\r\n CustomNotification.error(\r\n response?.message ||\r\n 'Cannot withdraw product(s) publication/registration!'\r\n );\r\n }\r\n setSelectedPublications([]);\r\n },\r\n }\r\n );\r\n };\r\n\r\n const selectPublications = (publicationSelected) => {\r\n setSelectedPublications(publicationSelected);\r\n };\r\n\r\n const unSelectPublication = (publication) => {\r\n setSelectedPublications((prevState) =>\r\n prevState.filter(\r\n (publicationItem) => publicationItem.id !== publication.id\r\n )\r\n );\r\n };\r\n\r\n return {\r\n publicationsQuery,\r\n confirmDeleteProductsPublication,\r\n selectPublications,\r\n selectedPublications,\r\n unSelectPublication,\r\n shouldReload: shouldReloadRef.current,\r\n };\r\n};\r\n","import React from 'react';\r\n\r\nimport { StyledModal, DataDisplay } from 'common/components';\r\nimport PublicationTable from './PublicationTable';\r\n\r\nimport { useGridView } from 'hooks';\r\nimport { useWithdrawPublication } from 'hooks/useWithdrawPublication';\r\n\r\nimport Messages from 'i18n/messages/home';\r\nimport { useIntl } from 'react-intl';\r\n\r\nconst WithdrawPublicationModal = (props) => {\r\n const intl = useIntl();\r\n\r\n const { visible, closeModal, products } = props;\r\n\r\n const { reloadPage } = useGridView();\r\n\r\n const {\r\n publicationsQuery,\r\n selectedPublications,\r\n selectPublications,\r\n confirmDeleteProductsPublication,\r\n shouldReload,\r\n } = useWithdrawPublication({\r\n products,\r\n enabled: visible,\r\n });\r\n\r\n const { data, isLoading, error } = publicationsQuery;\r\n const publicationList = data?.publicationListModels;\r\n\r\n const onOk = () => {\r\n confirmDeleteProductsPublication();\r\n };\r\n\r\n const onCancel = () => {\r\n closeModal && closeModal();\r\n if (shouldReload) {\r\n setTimeout(() => {\r\n reloadPage({ clearSelection: true });\r\n }, 300);\r\n }\r\n };\r\n\r\n const errorMessage = intl.formatMessage(Messages.getPublicationErrorMessage);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default WithdrawPublicationModal;\r\n","import React, { useState } from 'react';\r\n\r\nimport { DeleteOutlined } from '@ant-design/icons';\r\n\r\nimport { RibbonButton } from 'common/components';\r\n\r\nimport WithdrawPublicationModal from '../../modal/withdraw-publication/WithdrawPublicationModal';\r\n\r\nimport messages from 'i18n/messages/home';\r\n\r\nconst WithdrawPublicationButton = (props) => {\r\n const { products, isDisabled } = props;\r\n const [modalVisible, setModalVisible] = useState(false);\r\n\r\n const showModal = () => {\r\n setModalVisible(true);\r\n };\r\n\r\n const closeModal = () => {\r\n setModalVisible(false);\r\n };\r\n\r\n const onClick = () => {\r\n showModal();\r\n };\r\n\r\n return (\r\n <>\r\n }\r\n label={messages.withDrawProductPublicationFull}\r\n disabled={isDisabled}\r\n onClick={onClick}\r\n />\r\n \r\n \r\n );\r\n};\r\n\r\nexport default WithdrawPublicationButton;\r\n","import * as React from \"react\";\nconst SvgIco1013 = props => ;\nexport default SvgIco1013;","import React from 'react';\r\nimport Messages from 'i18n/messages/home';\r\n\r\nimport IconEmail from 'common/components/button/svg-icons/ICO_10.13.svg?react';\r\n\r\nimport ButtonSmallIcon from 'common/components/button/ButtonSmallIcon';\r\n\r\nimport './styles.less';\r\n\r\nconst EmailControl = ({ ...otherProps }) => {\r\n return (\r\n }\r\n label={Messages.emailMember}\r\n className='button-item-dropdown'\r\n {...otherProps}\r\n />\r\n );\r\n};\r\n\r\nEmailControl.propTypes = {};\r\n\r\nexport default EmailControl;\r\n","import React from 'react';\r\nimport { SendOutlined } from '@ant-design/icons';\r\nimport Messages from 'i18n/messages/home';\r\n\r\nimport ButtonSmallIcon from 'common/components/button/ButtonSmallIcon';\r\n\r\nconst SendToFTP = ({ ...otherProps }) => {\r\n return (\r\n }\r\n label={Messages.sendToFTP}\r\n className='button-item-dropdown'\r\n {...otherProps}\r\n />\r\n );\r\n};\r\n\r\nSendToFTP.propTypes = {};\r\n\r\nexport default SendToFTP;\r\n","import React from 'react';\r\nimport { CommentOutlined } from '@ant-design/icons';\r\nimport Messages from 'i18n/messages/home';\r\n\r\nimport ButtonSmallIcon from 'common/components/button/ButtonSmallIcon';\r\n\r\nconst SendToMessage = ({ ...otherProps }) => {\r\n return (\r\n }\r\n label={Messages.sendViaText}\r\n className='button-item-dropdown'\r\n {...otherProps}\r\n />\r\n );\r\n};\r\n\r\nSendToMessage.propTypes = {};\r\n\r\nexport default SendToMessage;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { AdditionControl, DetailControl } from '../../index';\r\nimport ContainerButton from 'common/components/button/ContainerButton';\r\nimport ItemButton from 'common/components/button/ItemButton';\r\n\r\nconst Favorite = ({ detailClick, addToFolderClick }) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nFavorite.propTypes = {\r\n detailClick: PropTypes.func,\r\n};\r\n\r\nexport default Favorite;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport AdvanceStack from '../../controls/home/AdvanceStack';\r\n\r\nimport ContainerButton from 'common/components/button/ContainerButton';\r\nimport ItemButton from 'common/components/button/ItemButton';\r\n\r\nconst Folder = ({ onSearch, toggleSearch }) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nFolder.propTypes = {\r\n onSearch: PropTypes.func,\r\n toggleSearch: PropTypes.func,\r\n};\r\n\r\nexport default Folder;\r\n","import React from 'react';\r\nimport { useDispatch } from 'react-redux';\r\n\r\nimport ContainerButton from 'common/components/button/ContainerButton';\r\nimport ItemButton from 'common/components/button/ItemButton';\r\n\r\nimport * as globalActions from '@redux/global/actions';\r\n\r\nimport AddOpenItemBtn from '../../controls/common/AddOpenItemBtn';\r\n\r\nconst MemberAddOpenItemSection = () => {\r\n const dispatch = useDispatch();\r\n\r\n const toggleAddOpenItem = () => {\r\n dispatch(globalActions.toggleIsAddingOpenItem(true));\r\n };\r\n\r\n return (\r\n \r\n \r\n {\r\n toggleAddOpenItem();\r\n }}\r\n />\r\n \r\n \r\n );\r\n};\r\n\r\nexport default MemberAddOpenItemSection;\r\n","import React from 'react';\r\n\r\nimport { BackControl } from '../../index';\r\nimport MemberAddOpenItemSection from '../member-full/MemberAddOpenItemSection';\r\n\r\nimport { RibbonSection } from 'common/components';\r\nimport { RibbonSectionDivider } from 'pages/home/ribbon/components';\r\n\r\nconst OtherLayout = (props) => {\r\n const {\r\n ribbonType,\r\n isHaveAddOpenItem = true,\r\n disableBackControl,\r\n closeDetailCallback,\r\n } = props;\r\n\r\n return (\r\n \r\n {isHaveAddOpenItem && (\r\n <>\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n\r\nOtherLayout.propTypes = {\r\n /**\r\n * to detect type of ribbon view\r\n */\r\n};\r\n\r\nexport default OtherLayout;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport Control from '../Control';\r\nconst InlineControl = (props) => {\r\n const { icon, text, ...rest } = props;\r\n return (\r\n \r\n {icon}\r\n {text}\r\n \r\n );\r\n};\r\n\r\nInlineControl.propTypes = {\r\n icon: PropTypes.element,\r\n};\r\n\r\nexport default InlineControl;\r\n","import React from 'react';\r\nimport { Typography } from 'antd';\r\nimport { LayoutOutlined } from '@ant-design/icons';\r\nimport ViewControl from './InlineControl';\r\nimport { FormattedMessage } from 'react-intl';\r\nimport Messages from 'i18n/messages/home';\r\nconst { Text } = Typography;\r\nconst QuickViewControl = (props) => {\r\n const { quickViewClick } = props;\r\n return (\r\n \r\n }\r\n text={\r\n \r\n \r\n \r\n }\r\n onClick={quickViewClick}\r\n >\r\n );\r\n};\r\n\r\nQuickViewControl.propTypes = {};\r\n\r\nexport default QuickViewControl;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { SearchOutlined } from '@ant-design/icons';\r\nimport Messages from 'i18n/messages/home';\r\n\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\n\r\nconst SearchControl = ({ onSearch }) => {\r\n return (\r\n }\r\n label={Messages.searchText}\r\n onClick={onSearch}\r\n />\r\n );\r\n};\r\n\r\nSearchControl.propTypes = {\r\n onSearch: PropTypes.func,\r\n};\r\n\r\nexport default SearchControl;\r\n","import React from 'react';\r\nimport { FileSearchOutlined } from '@ant-design/icons';\r\nimport Messages from 'i18n/messages/home';\r\n\r\nimport ButtonSmallIcon from 'common/components/button/ButtonSmallIcon';\r\n\r\nconst AdvanceSearchControl = () => {\r\n return (\r\n }\r\n label={Messages.advanceSearch}\r\n className='button-item-dropdown'\r\n />\r\n );\r\n};\r\n\r\nAdvanceSearchControl.propTypes = {};\r\n\r\nexport default AdvanceSearchControl;\r\n","import React, { useState } from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport {\r\n Modal,\r\n Checkbox,\r\n Row,\r\n Col,\r\n Radio,\r\n InputNumber,\r\n Typography,\r\n} from 'antd';\r\nimport { TableOutlined } from '@ant-design/icons';\r\n\r\nimport Messages from 'i18n/messages/home';\r\n\r\nimport { Form } from 'common/components';\r\nimport ButtonSmallIcon from 'common/components/button/ButtonSmallIcon';\r\n\r\nimport * as actionsGridView from 'common/components/grid-view/controllers/actions';\r\nimport selectorsGridView from 'common/components/grid-view/controllers/selectors';\r\n\r\nimport { useSetDefaultWidth, useChangeWidth } from './hooks';\r\nimport {\r\n getListFieldName,\r\n deleteColumnCheckbox,\r\n getNewDefaultColumns,\r\n getColumnsAfterChangeWidth,\r\n getDefaultConfig,\r\n} from './utils';\r\n\r\nimport './style.less';\r\n\r\nconst { Text } = Typography;\r\n\r\nconst GridColumnsControl = ({ disabled }) => {\r\n const dispatch = useDispatch();\r\n const [form] = Form.useForm();\r\n const [visible, setVisible] = useState(false);\r\n const [width, setWidth] = useState(0);\r\n const [selectedFieldName, setSelectedFieldName] = useState('');\r\n\r\n const { allColumns, chosenColumns, id } = useSelector(\r\n selectorsGridView.makeSelectGridConfig()\r\n );\r\n\r\n useSetDefaultWidth(form, chosenColumns, selectedFieldName);\r\n useChangeWidth(form, width);\r\n\r\n const handleClickField = (fieldName) => {\r\n const findChosenColumns = chosenColumns.find(\r\n (col) => col.fieldName === fieldName\r\n );\r\n\r\n if (!findChosenColumns) {\r\n setWidth(0);\r\n }\r\n\r\n if (findChosenColumns?.width) {\r\n setWidth(findChosenColumns.width);\r\n }\r\n\r\n setSelectedFieldName(fieldName);\r\n };\r\n\r\n const handleChangeWidth = (width) => {\r\n const result = getColumnsAfterChangeWidth(\r\n selectedFieldName,\r\n width,\r\n chosenColumns\r\n );\r\n dispatch(actionsGridView.changeWidthColumn(result));\r\n };\r\n\r\n const handleFilterColumnsGrid = () => {\r\n let result = getDefaultConfig(chosenColumns);\r\n dispatch(actionsGridView.chooseGridColumns(result, id));\r\n dispatch(actionsGridView.updateIsRefreshGrid());\r\n setVisible(false);\r\n };\r\n\r\n return (\r\n <>\r\n setVisible(false)}\r\n >\r\n {visible && (\r\n \r\n )}\r\n \r\n }\r\n label={Messages.gridColumns}\r\n disabled={disabled}\r\n onClick={() => setVisible(true)}\r\n className='grid-config__button'\r\n />\r\n \r\n );\r\n};\r\n\r\nconst ListColumns = (props) => {\r\n const { form, columns, chosenColumns, handleClickField, handleChangeWidth } =\r\n props;\r\n\r\n const dispatch = useDispatch();\r\n const defaultRadio = deleteColumnCheckbox(chosenColumns)[0]?.fieldName;\r\n\r\n // Remove checkbox column\r\n const columnsRender = deleteColumnCheckbox(columns);\r\n\r\n const handleChangeColumns = (checkedValues) => {\r\n const newColumns = getNewDefaultColumns(\r\n checkedValues,\r\n columns,\r\n chosenColumns\r\n );\r\n dispatch(actionsGridView.changeSelectedColumns(newColumns));\r\n };\r\n\r\n return (\r\n <>\r\n \r\n handleClickField(e.target.value)}\r\n >\r\n \r\n {columnsRender.map((column, index) => (\r\n \r\n \r\n \r\n {column.displayName}\r\n \r\n \r\n ))}\r\n \r\n \r\n\r\n \r\n \r\n Width of selected column (in pixels): \r\n \r\n \r\n
\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n \r\n \r\n );\r\n};\r\n\r\nGridColumnsControl.propTypes = {};\r\n\r\nexport default GridColumnsControl;\r\n","import React from 'react';\r\n\r\nimport { SaveOutlined } from '@ant-design/icons';\r\n\r\nimport Messages from 'i18n/messages/home';\r\n\r\nimport ButtonSmallIcon from 'common/components/button/ButtonSmallIcon';\r\n\r\nimport { useGlobalModal } from 'hooks';\r\n\r\nimport './SaveGrid.less';\r\n\r\nconst SaveGrid = (props) => {\r\n const { MODAL_NAMES, openModal } = useGlobalModal();\r\n\r\n return (\r\n <>\r\n }\r\n label={Messages.saveConfig}\r\n onClick={() => openModal(MODAL_NAMES.CREATE_QUERY)}\r\n className='grid-config__button'\r\n />\r\n \r\n );\r\n};\r\n\r\nSaveGrid.propTypes = {};\r\n\r\nexport default SaveGrid;\r\n","import React, { useState, useEffect, useMemo } from 'react';\r\nimport { useSelector, useDispatch } from 'react-redux';\r\n\r\nimport {\r\n Input,\r\n Radio,\r\n Select,\r\n DatePicker,\r\n Row,\r\n Col,\r\n Typography,\r\n Badge,\r\n} from 'antd';\r\n\r\nimport { Form, WrapperSelect } from 'common/components';\r\n\r\nimport { CloseOutlined } from '@ant-design/icons';\r\n\r\nimport { useInjectReducer } from 'utils/common/injectedReducers';\r\nimport { useInjectSaga } from 'utils/common/injectSaga';\r\n\r\nimport { AgGrid, FormAddButton } from 'common/components';\r\nimport MemberThumbnailCard from 'pages/branded-members/components/card/MemberThumbnailCard';\r\n\r\nimport {\r\n MEMBER_DETAIL_GRID,\r\n MEMBER_DETAIL_GRID_DISTINCT,\r\n} from 'services/members/endpoints';\r\n\r\nimport {\r\n GET_ALL_QUERIES_NOT_CURATED_QUERY_GRID,\r\n GET_ALL_QUERIES_NOT_CURATED_QUERY_GRID_DISTINCT,\r\n} from 'services/markupMaintenance/endpoints';\r\n\r\nimport reducerMember from 'pages/branded-members/controllers/reducer';\r\nimport sagaMember from 'pages/branded-members/controllers/saga';\r\nimport { makeSelectColumns } from 'pages/branded-members/controllers/selectors';\r\nimport { gridMemberColumnInfo } from 'pages/branded-members/controllers/actions';\r\n\r\nimport usePrevious from 'hooks/usePrevious';\r\n\r\nimport { filterColumnsGrid, filterSelectedMembers } from './utils';\r\n\r\nimport { DATE_FORMAT } from 'static/Constants';\r\n\r\nimport './AddCuratedQueryConfig.less';\r\n\r\nconst layout = {\r\n labelCol: {\r\n span: 5,\r\n },\r\n wrapperCol: {\r\n span: 18,\r\n },\r\n};\r\n\r\nconst { Search } = Input;\r\nconst { RangePicker } = DatePicker;\r\nconst { Text } = Typography;\r\n\r\nconst AddCuratedQueryConfig = (props) => {\r\n const {\r\n form,\r\n selectedQueryDetail,\r\n setSelectedQuery,\r\n selectedMembers,\r\n setSelectedMembers,\r\n shareType,\r\n setShareType,\r\n mode,\r\n memberRoles,\r\n } = props;\r\n\r\n useEffect(() => {\r\n if (mode === 'create') {\r\n form.setFieldsValue({\r\n curatedQueryShareType: 'MemberRole',\r\n });\r\n } else if (mode === 'edit' && selectedQueryDetail?.length > 0) {\r\n /* Keep memberType prevent errors from old data */\r\n if (selectedQueryDetail[0]?.curatedQueryShareType === 'MemberType') {\r\n setShareType('MemberRole');\r\n form.setFieldsValue({\r\n curatedQueryShareType: 'MemberRole',\r\n });\r\n } else {\r\n setShareType(selectedQueryDetail[0]?.curatedQueryShareType);\r\n form.setFieldsValue({\r\n curatedQueryShareType: selectedQueryDetail[0]?.curatedQueryShareType,\r\n });\r\n }\r\n }\r\n }, [form, mode]);\r\n\r\n return (\r\n \r\n \r\n {mode === 'create' && (\r\n \r\n )}\r\n
\r\n \r\n setShareType(e.target.value)}>\r\n Member Role\r\n Pickup Members\r\n All Member\r\n \r\n \r\n\r\n {/* Keep memberType prevent errors from old data */}\r\n {shareType === 'MemberRole' || shareType === 'MemberType' ? (\r\n \r\n \r\n {memberRoles\r\n ?.slice()\r\n .sort()\r\n .map((role) => (\r\n \r\n {role?.memberRoleName}\r\n \r\n ))}\r\n \r\n \r\n ) : null}\r\n\r\n \r\n \r\n \r\n\r\n {shareType === 'SpecificMembers' && selectedMembers.length > 0 && (\r\n \r\n \r\n \r\n Members:\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n\r\n {shareType === 'SpecificMembers' && (\r\n \r\n \r\n \r\n )}\r\n
\r\n );\r\n};\r\n\r\nconst nameGrid = 'member-detail-grid';\r\nconst key = 'memberList';\r\n\r\nconst MemberSelection = ({ selectedMembers, setSelectedMembers }) => {\r\n useInjectReducer({ key, reducer: reducerMember });\r\n useInjectSaga({ key, saga: sagaMember });\r\n\r\n const [selectedIds, setSelectedIds] = useState([]);\r\n const [searchText, setSearchText] = useState('');\r\n const [membersGrid, setMembersGrid] = useState([]);\r\n\r\n const prevSearchText = usePrevious(searchText);\r\n\r\n const [pagination, setPagination] = useState(1);\r\n\r\n const dispatch = useDispatch();\r\n\r\n const memberColumns = useSelector(makeSelectColumns());\r\n\r\n useEffect(() => {\r\n dispatch(gridMemberColumnInfo(nameGrid));\r\n }, [dispatch]);\r\n\r\n useEffect(() => {\r\n if (searchText !== prevSearchText) {\r\n setPagination(1);\r\n }\r\n }, [dispatch, prevSearchText, searchText]);\r\n\r\n const filteredMemberColumns = useMemo(\r\n () => filterColumnsGrid(memberColumns),\r\n [memberColumns]\r\n );\r\n\r\n const handleAddMembers = () => {\r\n const filteredMembers = filterSelectedMembers(\r\n membersGrid,\r\n selectedIds,\r\n selectedMembers\r\n );\r\n\r\n setSelectedMembers((prevMembers) => [...prevMembers, ...filteredMembers]);\r\n };\r\n\r\n return (\r\n
\r\n
\r\n setSearchText(value)}\r\n />\r\n \r\n
\r\n\r\n {filteredMemberColumns?.length > 0 && (\r\n setSelectedIds(ids)}\r\n handleChangePagination={(page) => setPagination(page)}\r\n getDataFromGrid={(items) => setMembersGrid(items)}\r\n paramsGrid={{\r\n search: {\r\n searchText,\r\n },\r\n }}\r\n pageNumberPagination={pagination}\r\n rowMultiSelectWithClick={true}\r\n />\r\n )}\r\n
\r\n );\r\n};\r\n\r\nconst MemberDisplay = ({ selectedMembers, setSelectedMembers }) => {\r\n const handleDeleteMember = (id) => {\r\n const result = selectedMembers.filter((member) => member.id !== id);\r\n setSelectedMembers(result);\r\n };\r\n\r\n return (\r\n \r\n {selectedMembers.map((member) => (\r\n \r\n handleDeleteMember(member.id)}>\r\n \r\n \r\n }\r\n className='member-display__badge'\r\n >\r\n \r\n \r\n \r\n ))}\r\n \r\n );\r\n};\r\n\r\nconst NonCuratedQuerySelection = (props) => {\r\n const { setSelectedQuery } = props;\r\n const [searchText, setSearchText] = useState('');\r\n const [selectedIds, setSelectedIds] = useState([]);\r\n const prevSearchText = usePrevious(searchText);\r\n const [pagination, setPagination] = useState(1);\r\n\r\n const nonCuratedQueryColumns = [\r\n {\r\n checkboxSelection: true,\r\n field: '',\r\n filter: false,\r\n sortable: false,\r\n suppressMenu: true,\r\n },\r\n {\r\n allowFilter: true,\r\n allowSort: true,\r\n dataType: 'string',\r\n displayName: 'Query Name',\r\n fieldName: 'Name',\r\n fieldNameCamelCase: 'name',\r\n resizable: true,\r\n flex: 1,\r\n minWidth: 150,\r\n },\r\n {\r\n allowFilter: true,\r\n allowSort: true,\r\n dataType: 'string',\r\n displayName: 'Grid Name',\r\n fieldName: 'GridName',\r\n fieldNameCamelCase: 'gridName',\r\n resizable: true,\r\n width: 200,\r\n },\r\n {\r\n allowFilter: true,\r\n allowSort: true,\r\n dataType: 'int32',\r\n displayName: 'Created By',\r\n fieldName: 'CreatedBy',\r\n fieldNameCamelCase: 'createdBy',\r\n resizable: true,\r\n width: 120,\r\n },\r\n {\r\n allowFilter: true,\r\n allowSort: true,\r\n dataType: 'string',\r\n displayName: 'Created By Name',\r\n fieldName: 'CreatedName',\r\n fieldNameCamelCase: 'createdName',\r\n resizable: true,\r\n width: 250,\r\n },\r\n ];\r\n\r\n useEffect(() => {\r\n if (searchText !== prevSearchText) {\r\n setPagination(1);\r\n }\r\n }, [prevSearchText, searchText]);\r\n\r\n return (\r\n
\r\n
\r\n setSearchText(value)}\r\n />\r\n
\r\n {nonCuratedQueryColumns?.length > 0 && (\r\n {\r\n setSelectedIds(ids);\r\n setSelectedQuery(ids);\r\n }}\r\n handleChangePagination={(page) => setPagination(page)}\r\n paramsGrid={{\r\n search: {\r\n searchText,\r\n },\r\n }}\r\n gridConfigProps={{\r\n rowSelection: 'single',\r\n }}\r\n pageNumberPagination={pagination}\r\n />\r\n )}\r\n
\r\n );\r\n};\r\n\r\nexport default AddCuratedQueryConfig;\r\n","import React, { useState, useEffect } from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { Modal, Button, Form, notification } from 'antd';\r\nimport AddCuratedQueryConfig from './AddCuratedQueryConfig';\r\n\r\nimport { getGridName } from 'utils/getGridName';\r\n\r\nimport { saveCuratedQuery } from 'services/markupMaintenance';\r\nimport * as markupActions from 'pages/markup-maintenance/controllers/actions';\r\nimport * as markupSelectors from 'pages/markup-maintenance/controllers/selectors';\r\nimport { ABILITY_ACTION, ABILITY_SUBJECT } from 'static/Permission';\r\nimport { useCheckPermissions } from 'hooks/useCheckPermissions';\r\nimport {\r\n useGetCuratedQueryDetail,\r\n useGetMembers,\r\n useGetAllMemberRoles,\r\n} from './hooks';\r\nimport moment from 'moment';\r\n\r\nimport './AddCuratedQuery.less';\r\n\r\nconst PERMISSION_EDIT_CURATED_QUERY = [\r\n {\r\n action: ABILITY_ACTION.MANAGE,\r\n subject: ABILITY_SUBJECT.CURATED_QUERY,\r\n },\r\n];\r\n\r\nconst AddCuratedQuery = (props) => {\r\n const { visible, setVisible, mode, selectedQueryDetail } = props;\r\n const hasPermissionEditCuratedQuery = useCheckPermissions(\r\n PERMISSION_EDIT_CURATED_QUERY\r\n );\r\n\r\n const { memberRoles } = useGetAllMemberRoles();\r\n\r\n const dispatch = useDispatch();\r\n\r\n const pageSize = useSelector(markupSelectors.selectCuratedQueryPageSize());\r\n\r\n const { curatedQueryData } = useGetCuratedQueryDetail({\r\n curatedQueryId: selectedQueryDetail[0]?.id,\r\n enabled:\r\n hasPermissionEditCuratedQuery &&\r\n mode === 'edit' &&\r\n Boolean(selectedQueryDetail[0]?.id),\r\n });\r\n\r\n const filteredMembers = useGetMembers({\r\n valuesFilter: curatedQueryData?.curatedQueryShareToMembers,\r\n enabled:\r\n hasPermissionEditCuratedQuery &&\r\n mode === 'edit' &&\r\n curatedQueryData?.curatedQueryShareToTotalsMembers > 0 &&\r\n curatedQueryData?.curatedQueryShareType === 'SpecificMembers',\r\n });\r\n\r\n const [form] = Form.useForm();\r\n\r\n const [selectedMembers, setSelectedMembers] = useState([]);\r\n const [selectedQuery, setSelectedQuery] = useState([]);\r\n const [shareType, setShareType] = useState('MemberRole');\r\n const [statusSubmit, setStatusSubmit] = useState('idle');\r\n\r\n const gridName = getGridName(window.location.pathname);\r\n\r\n useEffect(() => {\r\n form.setFieldsValue({ gridName });\r\n }, [form, gridName]);\r\n\r\n useEffect(() => {\r\n if (!visible) {\r\n form.resetFields();\r\n setSelectedMembers([]);\r\n setShareType('MemberRole');\r\n }\r\n }, [form, visible]);\r\n\r\n useEffect(() => {\r\n if (mode === 'edit' && selectedQueryDetail?.length > 0) {\r\n setShareType(selectedQueryDetail[0]?.curatedQueryShareType);\r\n\r\n if (selectedQueryDetail[0]?.curatedQueryShareToMemberType) {\r\n const curatedQueryShareToMemberRoleId =\r\n memberRoles.find(\r\n (role) =>\r\n role?.memberRoleName ===\r\n selectedQueryDetail[0]?.curatedQueryShareToMemberType\r\n )?.memberRoleId ?? null;\r\n\r\n form.setFieldsValue({\r\n curatedQueryShareToMemberRoleId,\r\n });\r\n }\r\n }\r\n }, [selectedQueryDetail, form, mode, visible, memberRoles]);\r\n\r\n useEffect(() => {\r\n if (hasPermissionEditCuratedQuery && visible) {\r\n form.setFieldsValue({\r\n //TODO: DATETIME\r\n dateActive: [\r\n curatedQueryData?.effectedDate\r\n ? moment(curatedQueryData?.effectedDate)\r\n : null,\r\n curatedQueryData?.effectedDate\r\n ? moment(curatedQueryData?.expirationDate)\r\n : null,\r\n ],\r\n curatedQueryShareToMemberType:\r\n curatedQueryData?.curatedQueryShareToMemberType,\r\n });\r\n }\r\n }, [\r\n hasPermissionEditCuratedQuery,\r\n form,\r\n visible,\r\n curatedQueryData.effectedDate,\r\n curatedQueryData.expirationDate,\r\n curatedQueryData.curatedQueryShareToMemberType,\r\n ]);\r\n\r\n useEffect(() => {\r\n if (hasPermissionEditCuratedQuery && filteredMembers.length > 0) {\r\n setSelectedMembers(filteredMembers);\r\n }\r\n }, [filteredMembers, hasPermissionEditCuratedQuery]);\r\n\r\n const handleCreateConfig = async () => {\r\n const { dateActive, ...values } = await form.validateFields();\r\n\r\n setStatusSubmit('loading');\r\n\r\n const submitId =\r\n selectedQueryDetail?.length > 0\r\n ? selectedQueryDetail[0]?.id\r\n : selectedQuery?.length > 0 && selectedQuery[0];\r\n\r\n let params = {\r\n ...values,\r\n id: submitId,\r\n gridName,\r\n };\r\n\r\n const { curatedQueryShareType, curatedQueryShareToMemberRoleId } = values;\r\n\r\n if (curatedQueryShareType === 'MemberRole') {\r\n if (curatedQueryShareToMemberRoleId) {\r\n params = {\r\n ...params,\r\n curatedQueryShareToMemberRoleId,\r\n curatedQueryShareToMemberType:\r\n memberRoles.find(\r\n (role) => role.memberRoleId === curatedQueryShareToMemberRoleId\r\n )?.memberRoleName ?? null,\r\n };\r\n }\r\n params = {\r\n ...params,\r\n curatedQueryShareType,\r\n curatedQueryShareToMembers: [],\r\n };\r\n }\r\n\r\n if (curatedQueryShareType === 'SpecificMembers') {\r\n params = {\r\n ...params,\r\n curatedQueryShareType,\r\n curatedQueryShareToMembers: selectedMembers.map((member) => member.id),\r\n };\r\n }\r\n\r\n if (curatedQueryShareType === 'AllMember') {\r\n params = {\r\n ...params,\r\n curatedQueryShareType,\r\n curatedQueryShareToMemberType: null,\r\n curatedQueryShareToMembers: [],\r\n };\r\n }\r\n\r\n if (dateActive) {\r\n params = {\r\n ...params,\r\n effectedDate: dateActive[0]?.toISOString(),\r\n expirationDate: dateActive[1]?.toISOString(),\r\n };\r\n } else {\r\n params = {\r\n ...params,\r\n effectedDate: null,\r\n expirationDate: null,\r\n };\r\n }\r\n\r\n try {\r\n const response = await saveCuratedQuery(params);\r\n const { isSuccess, message } = response;\r\n if (isSuccess) {\r\n notification.success({\r\n message: 'Save curated query successfully!',\r\n });\r\n form.resetFields();\r\n setVisible(false);\r\n setStatusSubmit('error');\r\n\r\n setTimeout(() => {\r\n dispatch(markupActions.getCuratedQueryList(1, pageSize, ''));\r\n }, 200);\r\n } else {\r\n setStatusSubmit('error');\r\n\r\n notification.error({\r\n message: message || 'Cannot save curated query!',\r\n });\r\n }\r\n } catch (error) {\r\n setStatusSubmit('error');\r\n notification.error({ message: error || 'Cannot save curated query!' });\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n {visible && (\r\n setVisible(false)}\r\n onCancel={() => setVisible(false)}\r\n destroyOnClose\r\n width={1100}\r\n maskClosable={false}\r\n className='modal-create-query'\r\n footer={[\r\n \r\n Submit\r\n ,\r\n ]}\r\n >\r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nAddCuratedQuery.propTypes = {};\r\n\r\nexport default AddCuratedQuery;\r\n","import React from 'react';\r\nimport { useDispatch } from 'react-redux';\r\nimport { Menu, Typography, message } from 'antd';\r\nimport {\r\n BarsOutlined,\r\n CheckCircleTwoTone,\r\n DoubleRightOutlined,\r\n ShareAltOutlined,\r\n} from '@ant-design/icons';\r\nimport { useIntl } from 'react-intl';\r\n\r\nimport MessagesGridView from 'i18n/messages/gridView';\r\n\r\nimport Messages from 'i18n/messages/home';\r\nimport ButtonSmallIcon from 'common/components/button/ButtonSmallIcon';\r\n\r\nimport * as actionsGridView from 'common/components/grid-view/controllers/actions';\r\n\r\nimport { getGridName } from 'utils/getGridName';\r\nimport { updateSearchText } from 'pages/home/utils';\r\n\r\nimport { useGetSavedConfig } from './hooks';\r\n\r\nimport { RIBBON_TYPES } from 'static/Constants';\r\nimport * as actionsRibbon from '@redux/ribbon/actions';\r\n\r\nimport {\r\n updateQueryConditions,\r\n updateQueryAdvance,\r\n updateIdQuery,\r\n} from 'utils/queryCondition';\r\nimport useGetDataIdQuery from 'hooks/useGetDataIdQuery';\r\n\r\nconst { SubMenu } = Menu;\r\nconst { Text } = Typography;\r\n\r\nconst SavedConfigurations = ({ disabled, setVisible, isMounted }) => {\r\n const dispatch = useDispatch();\r\n const intl = useIntl();\r\n\r\n const pathname = window.location.pathname;\r\n\r\n const idQueryActive = useGetDataIdQuery(window.location.pathname);\r\n\r\n const gridName = getGridName(pathname);\r\n\r\n const data = useGetSavedConfig(gridName, isMounted);\r\n\r\n const handleSetDefault = (item) => {\r\n const { query, id } = item;\r\n const {\r\n queryConditions,\r\n columns,\r\n ribbonTypes,\r\n searchText,\r\n primaryFieldsOnly,\r\n } = JSON.parse(query);\r\n dispatch(actionsGridView.myQueryDoubleClick(true));\r\n updateSearchText(dispatch, searchText, pathname, true, primaryFieldsOnly);\r\n dispatch(actionsGridView.checkQueryCondition(true));\r\n message.success(intl.formatMessage(MessagesGridView.applyConfig));\r\n\r\n if (ribbonTypes === RIBBON_TYPES.DETAILSVIEW) {\r\n dispatch(actionsGridView.chooseGridColumns(columns, id));\r\n } else {\r\n dispatch(actionsGridView.chooseGridColumns([], id));\r\n }\r\n\r\n updateQueryConditions(dispatch, queryConditions, window.location.pathname);\r\n updateQueryAdvance(dispatch, queryConditions, window.location.pathname);\r\n updateIdQuery(dispatch, id, window.location.pathname);\r\n\r\n dispatch(actionsRibbon.changeType(ribbonTypes));\r\n dispatch(actionsGridView.updateVisible(false));\r\n dispatch(actionsGridView.toggleRefreshQuery(true));\r\n };\r\n\r\n const checkApplyConfig = (item) => item.id === idQueryActive;\r\n\r\n const checkIsSharedConfig = (item) => item.isOwner === false;\r\n\r\n const data10 = data?.gridData?.slice(0, 10);\r\n\r\n return (\r\n \r\n }\r\n label={Messages.savedConfig}\r\n disabled={disabled}\r\n className='grid-config__button'\r\n />\r\n }\r\n >\r\n {data10?.map((item) => (\r\n handleSetDefault(item)}\r\n className='grid-config__menu--item'\r\n >\r\n {item.name}\r\n \r\n {checkApplyConfig(item) ? (\r\n \r\n ) : null}\r\n \r\n \r\n {checkIsSharedConfig(item) ? : null}\r\n \r\n \r\n ))}\r\n\r\n {data?.paging.totalRecord > 10 && (\r\n setVisible(true)}\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default SavedConfigurations;\r\n","import React from 'react';\r\nimport { useDispatch } from 'react-redux';\r\n\r\nimport { ClearOutlined } from '@ant-design/icons';\r\n\r\nimport { dialogFunction } from 'common/components/index';\r\n\r\nimport Messages from 'i18n/messages/home';\r\n\r\nimport ButtonSmallIcon from 'common/components/button/ButtonSmallIcon';\r\n\r\nimport { defaultSearchText } from '@redux/global/reducer';\r\nimport * as actionsGlobal from '@redux/global/actions';\r\nimport * as actionsGridView from 'common/components/grid-view/controllers/actions';\r\n\r\nimport {\r\n updateQueryConditions,\r\n updateQueryAdvance,\r\n updateIdQuery,\r\n} from 'utils/queryCondition';\r\n\r\nimport useGetDataIdQuery from 'hooks/useGetDataIdQuery';\r\n\r\nconst ClearQuery = (props) => {\r\n const dispatch = useDispatch();\r\n\r\n const idQueryActive = useGetDataIdQuery(window.location.pathname);\r\n\r\n const confirmClearQuery = () => {\r\n dialogFunction({\r\n type: 'warn',\r\n content: 'Are you sure to clear current query?',\r\n okText: 'OK',\r\n cancelText: 'Cancel',\r\n onOk: handleClearQuery,\r\n });\r\n };\r\n\r\n const handleClearQuery = () => {\r\n dispatch(actionsGridView.chooseGridColumns([]));\r\n\r\n updateQueryConditions(dispatch, [], window.location.pathname);\r\n updateQueryAdvance(dispatch, [], window.location.pathname);\r\n updateIdQuery(dispatch, null, window.location.pathname);\r\n\r\n dispatch(actionsGridView.myQueryDoubleClick(true));\r\n dispatch(actionsGridView.checkQueryCondition(true));\r\n dispatch(actionsGlobal.resetSearchText(defaultSearchText));\r\n };\r\n\r\n return (\r\n }\r\n label={Messages.clearConfig}\r\n onClick={confirmClearQuery}\r\n className='grid-config__button'\r\n disabled={idQueryActive === null}\r\n />\r\n );\r\n};\r\n\r\nClearQuery.propTypes = {};\r\n\r\nexport default ClearQuery;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport Messages from 'i18n/messages/home';\r\n\r\nimport { FormOutlined } from '@ant-design/icons';\r\n\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\n\r\nconst EditControl = ({ confirmEdit }) => {\r\n return (\r\n }\r\n label={Messages.editUser}\r\n onClick={confirmEdit}\r\n />\r\n );\r\n};\r\n\r\nEditControl.propTypes = {\r\n confirmEdit: PropTypes.func,\r\n};\r\n\r\nexport default EditControl;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport Messages from 'i18n/messages/home';\r\n\r\nimport { SaveOutlined } from '@ant-design/icons';\r\n\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\n\r\nconst SaveControl = ({ confirmEdit }) => {\r\n return (\r\n }\r\n label={Messages.saveUser}\r\n onClick={confirmEdit}\r\n />\r\n );\r\n};\r\n\r\nSaveControl.propTypes = {\r\n confirmEdit: PropTypes.func,\r\n};\r\n\r\nexport default SaveControl;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport Messages from 'i18n/messages/home';\r\n\r\nimport { DeleteOutlined } from '@ant-design/icons';\r\n\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\n\r\nconst CancelEdit = ({ confirmEdit }) => {\r\n return (\r\n }\r\n label={Messages.cancelEditUser}\r\n onClick={confirmEdit}\r\n />\r\n );\r\n};\r\n\r\nCancelEdit.propTypes = {\r\n confirmEdit: PropTypes.func,\r\n};\r\n\r\nexport default CancelEdit;\r\n","import React from 'react';\r\n\r\nimport RibbonButton from 'common/components/button/RibbonButton';\r\n\r\nconst ToggleUploadMediaBtn = ({\r\n clickActionCallback,\r\n label,\r\n icon,\r\n disabled,\r\n}) => {\r\n return (\r\n \r\n );\r\n};\r\n\r\n// AddOpenItemBtn.propTypes = {\r\n// clickActionCallback: PropTypes.func,\r\n// };\r\n\r\nexport default ToggleUploadMediaBtn;\r\n","import React, { useEffect } from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\n\r\nimport { CloseSquareOutlined, FolderOpenOutlined } from '@ant-design/icons';\r\n\r\nimport Messages from 'i18n/messages/maintenance';\r\n\r\nimport * as maintainHelpActions from 'pages/maintenance/controllers/actions';\r\nimport * as maintainHelpSelectors from 'pages/maintenance/controllers/selectors';\r\n\r\nimport ToggleUploadMediaBtn from '../../controls/maintenance/help/ToggleUploadMediaBtn';\r\n\r\nconst ToggleHelpUploadMediaSection = ({ disabled }) => {\r\n const dispatch = useDispatch();\r\n\r\n useEffect(() => {\r\n if (disabled) {\r\n dispatch(maintainHelpActions.toggleUploadHelpMedia(false));\r\n }\r\n return;\r\n }, [disabled, dispatch]);\r\n\r\n const isHelpUploadMediaOpen = useSelector(\r\n maintainHelpSelectors.selectIsHelpUploadMediaOpen()\r\n );\r\n\r\n const mapStatusToIcon = () => {\r\n if (isHelpUploadMediaOpen) {\r\n return ;\r\n } else {\r\n return ;\r\n }\r\n };\r\n\r\n const mapStatusToText = () => {\r\n if (isHelpUploadMediaOpen) {\r\n return Messages.closeMedia;\r\n } else {\r\n return Messages.openMedia;\r\n }\r\n };\r\n\r\n const toggleIsHelpMediaOpen = () => {\r\n dispatch(maintainHelpActions.toggleUploadHelpMedia(!isHelpUploadMediaOpen));\r\n };\r\n\r\n return (\r\n {\r\n toggleIsHelpMediaOpen();\r\n }}\r\n disabled={disabled}\r\n />\r\n );\r\n};\r\n\r\nexport default ToggleHelpUploadMediaSection;\r\n","import React, { useState, useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { Row, Col, message, Spin, Result } from 'antd';\r\nimport { cloneDeep } from 'lodash';\r\n\r\nimport { GeneratePreviewItem } from '../../index';\r\n\r\nimport { getGeneratedPreview } from 'services/digitalAsset';\r\n\r\nimport Messages from 'i18n/messages/assetPreview';\r\nimport { injectIntl } from 'react-intl';\r\n\r\nimport './GeneratePreviewModal.less';\r\n\r\nconst GeneratePreviewModal = (props) => {\r\n // props\r\n const {\r\n rootDataHook,\r\n selectGenerateThumbHook,\r\n selectedAssets,\r\n intl,\r\n loadingHook,\r\n } = props;\r\n const [\r\n selectedGeneratedThumb,\r\n setSelectedGeneratedThumb,\r\n ] = selectGenerateThumbHook;\r\n\r\n // state\r\n const [loading, setLoading] = loadingHook;\r\n\r\n // this is original data, the copy of generate thumbnail response data, use for reverting thumb\r\n const [orgData, setOrgData] = useState([]);\r\n\r\n // this is generate thumbnail response data, and the last data submit to update asset preview thumb\r\n // when user upload new thumb, this data will update\r\n const [rootData, setRootData] = rootDataHook;\r\n\r\n const [errorMessage, setErrorMessage] = useState(false);\r\n\r\n // function\r\n const handleToggleSelectItem = (id) => () => {\r\n const isSelected = selectedGeneratedThumb?.includes(id);\r\n // check if id is selected, unselect this id, else select this id\r\n const newSelectedGeneratedThumb = isSelected\r\n ? selectedGeneratedThumb.filter((item) => item !== id)\r\n : [...selectedGeneratedThumb, id];\r\n\r\n setSelectedGeneratedThumb(newSelectedGeneratedThumb);\r\n };\r\n\r\n const generateSelectedAssetId = () => {\r\n return (\r\n selectedAssets?.length > 0 &&\r\n selectedAssets.map((asset) => {\r\n return asset.id;\r\n })\r\n );\r\n };\r\n\r\n const setResponseData = (responseData) => {\r\n const responseDataId = responseData.map((data) => data.assetId);\r\n\r\n setRootData(cloneDeep(responseData));\r\n // create copy of response data to store independently\r\n setOrgData(cloneDeep(responseData));\r\n setSelectedGeneratedThumb(responseDataId);\r\n };\r\n\r\n const fetchPreview = () => {\r\n const selectedAssetId = generateSelectedAssetId();\r\n const params = {\r\n assetIds: selectedAssetId,\r\n };\r\n\r\n getGeneratedPreview(params)\r\n .then((response) => {\r\n const { isSuccess, data } = response;\r\n if (isSuccess && data?.data?.length) {\r\n setResponseData(data.data);\r\n } else {\r\n errorHandler();\r\n }\r\n })\r\n .catch(() => errorHandler())\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n };\r\n\r\n const errorHandler = () => {\r\n setErrorMessage(intl.formatMessage(Messages.generatePreviewError));\r\n };\r\n\r\n const updateRootData = (id, newImage) => {\r\n try {\r\n // find updated data in root data\r\n const updatedData = cloneDeep(\r\n rootData.find((data) => data.assetId === id)\r\n );\r\n\r\n // update image in updated data\r\n updatedData.data = newImage;\r\n\r\n // create new root data and update it\r\n const index = rootData.findIndex((data) => data.assetId === id);\r\n let newRootData = cloneDeep(rootData);\r\n\r\n newRootData[index] = updatedData;\r\n\r\n // update root data state\r\n setRootData(newRootData);\r\n } catch (e) {\r\n // handle error\r\n updateRootDataErrorHandler();\r\n }\r\n };\r\n\r\n const revertRootData = (id) => {\r\n try {\r\n // find revert data in orgData\r\n const revertData = cloneDeep(orgData.find((data) => data.assetId === id));\r\n\r\n // create new root data and update it\r\n const index = rootData.findIndex((data) => data.assetId === id);\r\n\r\n let newRootData = cloneDeep(rootData);\r\n\r\n newRootData[index] = revertData;\r\n\r\n // update root data state\r\n setRootData(newRootData);\r\n } catch (error) {\r\n updateRootDataErrorHandler(true);\r\n }\r\n };\r\n\r\n const updateRootDataErrorHandler = (isRevert) => {\r\n const msg = isRevert\r\n ? Messages.generatePreviewRevertThumbError\r\n : Messages.generatePreviewUpdateThumbError;\r\n message.error(intl.formatMessage(msg));\r\n };\r\n\r\n const checkPreviewItemRevertable = (id) => {\r\n // get image from root data\r\n const rootItem = rootData.find((previewItem) => {\r\n return previewItem.assetId === id;\r\n });\r\n // get image from original data\r\n const originItem = orgData.find((previewItem) => {\r\n return previewItem.assetId === id;\r\n });\r\n\r\n return rootItem && originItem && rootItem.data !== originItem.data;\r\n };\r\n\r\n const renderGenerateThumbnailList = () => {\r\n // generate render list from root data\r\n const renderList =\r\n !!rootData.length &&\r\n rootData.map((thumbItem) => {\r\n // find asset detail from selected asset items\r\n const assetDetail = selectedAssets.find((assetDetailItem) => {\r\n return assetDetailItem.id === thumbItem.assetId;\r\n });\r\n\r\n return {\r\n ...thumbItem,\r\n assetName: assetDetail?.assetName,\r\n };\r\n });\r\n\r\n // render\r\n return (\r\n renderList &&\r\n renderList.map((renderItem, index) => {\r\n const { assetId } = renderItem;\r\n const isSelected = selectedGeneratedThumb.includes(assetId);\r\n const revertable = checkPreviewItemRevertable(assetId);\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n })\r\n );\r\n };\r\n\r\n const resetData = () => {\r\n setOrgData([]);\r\n setRootData([]);\r\n setErrorMessage(false);\r\n };\r\n\r\n // did mount\r\n useEffect(() => {\r\n fetchPreview();\r\n\r\n // component unmount\r\n return () => {\r\n resetData();\r\n };\r\n // eslint-disable-next-line\r\n }, []);\r\n\r\n const loadingTip = intl.formatMessage(Messages.generateLoading);\r\n\r\n return (\r\n \r\n \r\n {!loading && !!errorMessage ? (\r\n \r\n ) : (\r\n renderGenerateThumbnailList()\r\n )}\r\n \r\n \r\n );\r\n};\r\n\r\nGeneratePreviewModal.propTypes = {\r\n // hook to get update root data and send it back to generate thumbnail modal\r\n rootDataHook: PropTypes.array,\r\n // hook to get selected item and send it back to generate thumbnail modal\r\n selectGenerateThumbHook: PropTypes.array,\r\n // show loading hook\r\n loadingHook: PropTypes.array,\r\n // current selected asset items\r\n selectedAssets: PropTypes.array,\r\n};\r\n\r\nGeneratePreviewModal.defaultProps = {\r\n handleSetSelectedItem: () => {},\r\n selectedAssets: [],\r\n};\r\n\r\nexport default injectIntl(GeneratePreviewModal);\r\n","import React from 'react';\r\n\r\nimport { Modal, Button } from 'antd';\r\n\r\nimport { DialogIcon } from 'common/components';\r\n\r\nimport Messages from 'i18n/messages/assetPreview';\r\nimport { FormattedMessage } from 'react-intl';\r\n\r\nimport './GenerateConfirmModal.less';\r\n\r\nconst GenerateConfirmModal = (props) => {\r\n const { visible, onYes, onNo, onCancel } = props;\r\n\r\n const modalFooter = (\r\n
\r\n \r\n \r\n \r\n
\r\n );\r\n\r\n const modalConfig = {\r\n visible: visible,\r\n wrapClassName: 'dialog-modal',\r\n footer: modalFooter,\r\n closable: false,\r\n };\r\n\r\n return (\r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default GenerateConfirmModal;\r\n","export const detectBrowser = () => {\r\n const userAgentString = navigator.userAgent;\r\n if (userAgentString.indexOf('Chrome') > -1) return 'Chrome';\r\n if (userAgentString.indexOf('Firefox') > -1) return 'Firefox';\r\n if (userAgentString.indexOf('Safari') > -1) return 'Safari';\r\n return false;\r\n};\r\n","import React, { useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { Space, Upload, Button } from 'antd';\r\nimport { UploadOutlined } from '@ant-design/icons';\r\nimport { get } from 'lodash';\r\n\r\nimport { ThumbnailItem } from 'common/components';\r\n\r\nimport {\r\n ACCEPT_UPLOAD_IMAGE_FILE_TYPE,\r\n BROWSER_NOT_SUPPORTED_IMAGE_TYPES,\r\n} from 'static/Constants';\r\nimport { detectBrowser } from 'utils/browser';\r\n\r\nimport Messages from 'i18n/messages/assetPreview';\r\nimport { FormattedMessage } from 'react-intl';\r\n\r\nconst GeneratePreviewItem = (props) => {\r\n const {\r\n selected,\r\n item,\r\n handleToggleSelectItem,\r\n updateRootData,\r\n revertRootData,\r\n revertable,\r\n } = props;\r\n const { data, assetId, assetName } = item;\r\n\r\n const [imageError, setImageError] = useState(false);\r\n const [imageLoading, setImageLoading] = useState(false);\r\n\r\n // function\r\n const handleClickUploadButton = (info) => {\r\n let imageFile = get(info, 'file.originFileObj', false);\r\n\r\n // parse to base64\r\n const fileReader = new FileReader();\r\n fileReader.onloadstart = () => {\r\n // show loading\r\n setImageError(false);\r\n setImageLoading(true);\r\n };\r\n fileReader.onloadend = (e) => {\r\n const imageSrc = e.target.result;\r\n const image = new Image();\r\n image.src = imageSrc;\r\n\r\n updateRootData(assetId, imageSrc);\r\n\r\n image.onload = onImageLoadHandler;\r\n\r\n image.onerror = onImageErrorHandler(imageFile);\r\n };\r\n fileReader.readAsDataURL(imageFile);\r\n };\r\n\r\n const onImageLoadHandler = () => {\r\n setImageLoading(false);\r\n };\r\n\r\n const onImageErrorHandler = (imageFile) => () => {\r\n setImageErrorMessage(imageFile);\r\n setImageLoading(false);\r\n };\r\n\r\n const setImageErrorMessage = (imageFile) => {\r\n const fileType = imageFile.type;\r\n const browser = detectBrowser();\r\n const notSupportedImageType =\r\n browser && BROWSER_NOT_SUPPORTED_IMAGE_TYPES[browser];\r\n\r\n let errorMessage = Messages.generateLoadImageError;\r\n if (browser && notSupportedImageType?.includes(fileType)) {\r\n errorMessage = Messages.generateLoadImageBrowserError;\r\n }\r\n\r\n setImageError(errorMessage);\r\n };\r\n\r\n const handleClickRevertButton = () => {\r\n setImageError(false);\r\n revertRootData(assetId);\r\n };\r\n // variable\r\n const classNamePrefix = 'generate-preview__item';\r\n return (\r\n \r\n \r\n \r\n {}}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nGeneratePreviewItem.propTypes = {\r\n /**\r\n * is selected item\r\n */\r\n selected: PropTypes.bool,\r\n /**\r\n * item data\r\n */\r\n data: PropTypes.object,\r\n /**\r\n * handle toggle select item\r\n */\r\n handleToggleSelectItem: PropTypes.func,\r\n /**\r\n * handle update root data when item update new image\r\n */\r\n updateRootData: PropTypes.func,\r\n /**\r\n * handle update root data when item revert image\r\n */ revertRootData: PropTypes.func,\r\n /**\r\n * enable revert button\r\n */\r\n revertable: PropTypes.bool,\r\n};\r\n\r\nexport default GeneratePreviewItem;\r\n","import React, { useState, useEffect } from 'react';\r\nimport { useSelector } from 'react-redux';\r\n\r\nimport {\r\n Skeleton,\r\n Table,\r\n Button,\r\n Space,\r\n Typography,\r\n Result,\r\n Empty,\r\n} from 'antd';\r\nimport { UserOutlined, TeamOutlined } from '@ant-design/icons';\r\nimport { DeleteButton } from 'common/components';\r\n\r\nimport gridSelectors from 'common/components/grid-view/controllers/selectors';\r\n\r\nimport { getShareList } from 'services/manageSharing';\r\nimport { formatMDY } from 'utils/formatDate';\r\nimport { entityTypeIconRenderer } from 'static/Icons';\r\n\r\nimport Messages from 'i18n/messages/share';\r\nimport { injectIntl } from 'react-intl';\r\n\r\nimport './ManageShareModal.less';\r\n\r\nconst { Text } = Typography;\r\n\r\nconst ManageShareModal = (props) => {\r\n const shareWithIcons = {\r\n user: (props) => ,\r\n member: (props) => ,\r\n };\r\n\r\n const pageSize = 10;\r\n\r\n //* props\r\n const {\r\n intl,\r\n selectedRowHook,\r\n shareListHook,\r\n removeShareItem,\r\n reloadListHook,\r\n } = props;\r\n\r\n const selectedItemList = useSelector(\r\n gridSelectors.makeSelectDetailCurrentITemsSelection()\r\n );\r\n\r\n //* state\r\n const [loading, setLoading] = useState(true);\r\n const [listLoading, setListLoading] = useState(false);\r\n const [shareList, setShareList] = shareListHook;\r\n const [pageIndex, setPageIndex] = useState(1);\r\n const [total, setTotal] = useState(0);\r\n const [error, setError] = useState(false);\r\n const [selectedRow, setSelectedRow] = selectedRowHook;\r\n const [reloadList, setReloadListHook] = reloadListHook;\r\n\r\n //* function\r\n const fetchData = (pageIndex) => {\r\n const params = generateGetShareListParams(pageIndex);\r\n getShareList(params)\r\n .then((response) => {\r\n const { data, isSuccess } = response;\r\n if (isSuccess) {\r\n setShareList(data?.gridData || []);\r\n setTotal(data?.paging?.totalRecord);\r\n } else {\r\n fetchDataErrorHandler();\r\n }\r\n })\r\n .catch(() => {\r\n fetchDataErrorHandler();\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n setListLoading(false);\r\n setReloadListHook(false);\r\n });\r\n };\r\n\r\n const generateGetShareListParams = (pageIndex) => {\r\n const entities =\r\n selectedItemList?.length &&\r\n selectedItemList.map((item) => {\r\n const { type, id } = item;\r\n return {\r\n entityType: type,\r\n id,\r\n };\r\n });\r\n\r\n return {\r\n entities,\r\n pageIndex,\r\n pageSize,\r\n sort: [],\r\n filters: [],\r\n };\r\n };\r\n\r\n const fetchDataErrorHandler = () => {\r\n setError(true);\r\n };\r\n\r\n const generateColumns = () => {\r\n return [\r\n {\r\n title: intl.formatMessage(Messages.entityHeading),\r\n dataIndex: 'sharedName',\r\n key: 'sharedName',\r\n ellipsis: true,\r\n render: renderEntityColumn,\r\n },\r\n {\r\n title: intl.formatMessage(Messages.shareWithHeading),\r\n dataIndex: 'with',\r\n key: 'with',\r\n ellipsis: true,\r\n render: renderShareWithColumn,\r\n },\r\n {\r\n title: intl.formatMessage(Messages.shareAtHeading),\r\n dataIndex: 'dateShare',\r\n key: 'dateShare',\r\n align: 'center',\r\n width: '200px',\r\n render: (text) => {\r\n return text ? formatMDY(text) : null;\r\n },\r\n },\r\n {\r\n title: '',\r\n dataIndex: 'remove',\r\n key: 'remove',\r\n align: 'right',\r\n width: '50px',\r\n render: renderRemoveColumn,\r\n },\r\n ];\r\n };\r\n\r\n const renderEntityColumn = (text, record) => {\r\n const { shareType } = record;\r\n\r\n const Icon = (props) => {\r\n return entityTypeIconRenderer(shareType, props);\r\n };\r\n\r\n return (\r\n \r\n \r\n {text}\r\n \r\n );\r\n };\r\n\r\n const renderShareWithColumn = (text, record) => {\r\n const { userFullName, memberFullName } = record;\r\n const type = !!userFullName ? 'user' : 'member';\r\n\r\n const Icon = shareWithIcons[type];\r\n const displayName = !!userFullName ? userFullName : memberFullName;\r\n return (\r\n \r\n \r\n {displayName}\r\n \r\n );\r\n };\r\n\r\n const renderRemoveColumn = (text, record) => {\r\n const { isEditable } = record;\r\n return isEditable ? (\r\n }\r\n onClick={onRemoveBtnClick(record)}\r\n />\r\n ) : null;\r\n };\r\n\r\n const onRemoveBtnClick = (record) => () => {\r\n const deleteShareList = [record];\r\n removeShareItem(deleteShareList);\r\n };\r\n\r\n const onSelectChange = (selectedRowKeys) => {\r\n setSelectedRow(selectedRowKeys);\r\n };\r\n\r\n const handleShareListTableChange = (pagination, filters, sorter, extra) => {\r\n const { current } = pagination;\r\n\r\n setListLoading(true);\r\n setPageIndex(current);\r\n fetchData(current);\r\n };\r\n\r\n const renderShareList = () => {\r\n const rowSelection = {\r\n selectedRowKeys: selectedRow,\r\n onChange: onSelectChange,\r\n columnWidth: '40px',\r\n };\r\n\r\n const paginationConfigs = {\r\n position: ['bottomLeft'],\r\n current: pageIndex,\r\n total: total,\r\n pageSize: pageSize,\r\n };\r\n\r\n return (\r\n \r\n );\r\n };\r\n\r\n //* did mount\r\n useEffect(() => {\r\n fetchData(pageIndex);\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (reloadList) {\r\n setListLoading(true);\r\n fetchData(pageIndex);\r\n }\r\n // eslint-disable-next-line\r\n }, [reloadList]);\r\n\r\n return (\r\n \r\n {error ? (\r\n \r\n ) : shareList.length ? (\r\n renderShareList()\r\n ) : (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default injectIntl(ManageShareModal);\r\n","import { useState, useEffect } from 'react';\r\n\r\nimport { useSelector } from 'react-redux';\r\n\r\nimport gridViewSelectors from 'common/components/grid-view/controllers/selectors';\r\n\r\nimport {\r\n pathnameFavMember,\r\n pathnameFavAssets,\r\n pathnameFavFolders,\r\n pathnameFavProducts,\r\n pathnameProduct,\r\n pathnameMember,\r\n pathnameDigitalMedia,\r\n pathnameDigitalMediaNew,\r\n pathnameAssets,\r\n pathnameDocument,\r\n pathnameMultiMedia,\r\n pathnameReportings,\r\n pathnameReportingsOwned,\r\n pathnameReportingsShared,\r\n pathnameFolders,\r\n pathnameFoldersOwned,\r\n pathnameFoldersShared,\r\n pathnameAssetsForMember,\r\n pathnameProductsForMember,\r\n} from 'static/Constants';\r\n\r\nconst useGetDataAdvanceFilter = (pathname) => {\r\n const [state, setState] = useState([]);\r\n\r\n const favMembersQueryAdvance = useSelector(\r\n gridViewSelectors.makeSelectFavMembersQueryAdvance()\r\n );\r\n const favAssetsQueryAdvance = useSelector(\r\n gridViewSelectors.makeSelectFavAssetsQueryAdvance()\r\n );\r\n const favFoldersQueryAdvance = useSelector(\r\n gridViewSelectors.makeSelectFavFoldersQueryAdvance()\r\n );\r\n const favProductsQueryAdvance = useSelector(\r\n gridViewSelectors.makeSelectFavProductsQueryAdvance()\r\n );\r\n const productsQueryAdvance = useSelector(\r\n gridViewSelectors.makeSelectProductsQueryAdvance()\r\n );\r\n const membersQueryAdvance = useSelector(\r\n gridViewSelectors.makeSelectMembersQueryAdvance()\r\n );\r\n const digitalMediaQueryAdvance = useSelector(\r\n gridViewSelectors.makeSelectDigitalMediaQueryAdvance()\r\n );\r\n const digitalMediaNewQueryAdvance = useSelector(\r\n gridViewSelectors.makeSelectDigitalMediaNewQueryAdvance()\r\n );\r\n const assetsQueryAdvance = useSelector(\r\n gridViewSelectors.makeSelectAssetsQueryAdvance()\r\n );\r\n const documentsQueryAdvance = useSelector(\r\n gridViewSelectors.makeSelectDocumentsQueryAdvance()\r\n );\r\n const multiMediaQueryAdvance = useSelector(\r\n gridViewSelectors.makeSelectMultiMediaQueryAdvance()\r\n );\r\n const reportingsQueryAdvance = useSelector(\r\n gridViewSelectors.makeSelectReportingsQueryAdvance()\r\n );\r\n const myReportsQueryAdvance = useSelector(\r\n gridViewSelectors.makeSelectMyReportsQueryAdvance()\r\n );\r\n const reportsSharedToMeQueryAdvance = useSelector(\r\n gridViewSelectors.makeSelectReportsSharedToMeQueryAdvance()\r\n );\r\n const foldersQueryAdvance = useSelector(\r\n gridViewSelectors.makeSelectFoldersQueryAdvance()\r\n );\r\n const myFoldersQueryAdvance = useSelector(\r\n gridViewSelectors.makeSelectMyFoldersQueryAdvance()\r\n );\r\n const foldersSharedToMeQueryAdvance = useSelector(\r\n gridViewSelectors.makeSelectFoldersSharedToMeQueryAdvance()\r\n );\r\n const assetsForMemberQueryAdvance = useSelector(\r\n gridViewSelectors.makeSelectAssetsForMemberQueryAdvance()\r\n );\r\n const productsForMemberQueryAdvance = useSelector(\r\n gridViewSelectors.makeSelectProductsForMemberQueryAdvance()\r\n );\r\n\r\n useEffect(() => {\r\n let data = [];\r\n\r\n switch (pathname) {\r\n case pathnameFavMember:\r\n data = favMembersQueryAdvance;\r\n break;\r\n case pathnameFavAssets:\r\n data = favAssetsQueryAdvance;\r\n break;\r\n case pathnameFavFolders:\r\n data = favFoldersQueryAdvance;\r\n break;\r\n case pathnameFavProducts:\r\n data = favProductsQueryAdvance;\r\n break;\r\n case pathnameProduct:\r\n data = productsQueryAdvance;\r\n break;\r\n case pathnameMember:\r\n data = membersQueryAdvance;\r\n break;\r\n case pathnameDigitalMedia:\r\n data = digitalMediaQueryAdvance;\r\n break;\r\n case pathnameDigitalMediaNew:\r\n data = digitalMediaNewQueryAdvance;\r\n break;\r\n case pathnameAssets:\r\n data = assetsQueryAdvance;\r\n break;\r\n case pathnameDocument:\r\n data = documentsQueryAdvance;\r\n break;\r\n case pathnameMultiMedia:\r\n data = multiMediaQueryAdvance;\r\n break;\r\n case pathnameReportings:\r\n data = reportingsQueryAdvance;\r\n break;\r\n case pathnameReportingsOwned:\r\n data = myReportsQueryAdvance;\r\n break;\r\n case pathnameReportingsShared:\r\n data = reportsSharedToMeQueryAdvance;\r\n break;\r\n case pathnameFolders:\r\n data = foldersQueryAdvance;\r\n break;\r\n case pathnameFoldersOwned:\r\n data = myFoldersQueryAdvance;\r\n break;\r\n case pathnameFoldersShared:\r\n data = foldersSharedToMeQueryAdvance;\r\n break;\r\n default:\r\n break;\r\n }\r\n if (pathname.includes(pathnameAssetsForMember)) {\r\n data = assetsForMemberQueryAdvance;\r\n }\r\n if (pathname.includes(pathnameProductsForMember)) {\r\n data = productsForMemberQueryAdvance;\r\n }\r\n setState(data);\r\n }, [\r\n pathname,\r\n favMembersQueryAdvance,\r\n favAssetsQueryAdvance,\r\n favFoldersQueryAdvance,\r\n favProductsQueryAdvance,\r\n productsQueryAdvance,\r\n membersQueryAdvance,\r\n digitalMediaQueryAdvance,\r\n digitalMediaNewQueryAdvance,\r\n assetsQueryAdvance,\r\n documentsQueryAdvance,\r\n multiMediaQueryAdvance,\r\n reportingsQueryAdvance,\r\n myReportsQueryAdvance,\r\n reportsSharedToMeQueryAdvance,\r\n foldersQueryAdvance,\r\n myFoldersQueryAdvance,\r\n foldersSharedToMeQueryAdvance,\r\n assetsForMemberQueryAdvance,\r\n productsForMemberQueryAdvance,\r\n ]);\r\n\r\n return state;\r\n};\r\n\r\nexport default useGetDataAdvanceFilter;\r\n","import React, { useState } from 'react';\r\nimport { useParams } from 'react-router-dom';\r\nimport { FileAddOutlined } from '@ant-design/icons';\r\n\r\nimport { ButtonSmallIcon } from 'common/components';\r\nimport CreateProductViaFormModal from 'common/components/product-add/CreateProductViaFormModal';\r\n\r\nconst AddProductFromMember = (props) => {\r\n const { id: productId } = useParams();\r\n const [addModalVisible, setAddModalVisible] = useState(false);\r\n\r\n return (\r\n <>\r\n {addModalVisible && (\r\n \r\n )}\r\n\r\n }\r\n label={'Create Product'}\r\n onClick={() => setAddModalVisible(true)}\r\n disabled={props.disabled}\r\n />\r\n \r\n );\r\n};\r\n\r\nAddProductFromMember.propTypes = {};\r\n\r\nexport default AddProductFromMember;\r\n","import React from 'react';\r\nimport { DownloadOutlined } from '@ant-design/icons';\r\nimport { notification } from 'antd';\r\n\r\nimport { ButtonSmallIcon } from 'common/components';\r\n\r\nimport {\r\n getProductViaSpreadSheet,\r\n getTdcProductViaSpreadSheet,\r\n} from 'services/product';\r\nimport { saveFile } from 'utils/saveFile';\r\n\r\nconst DownloadProductTemplateFromMember = (props) => {\r\n const handleDownloadTemplateProduct = (type) => async () => {\r\n try {\r\n const response =\r\n type === 'tdc'\r\n ? await getTdcProductViaSpreadSheet()\r\n : await getProductViaSpreadSheet();\r\n\r\n const urlPath = type === 'tdc' ? 'fileUrl' : 'url';\r\n\r\n if (response.isSuccess) {\r\n saveFile(response.data[urlPath]);\r\n } else {\r\n notification.error({\r\n message: response.data.message,\r\n });\r\n }\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n };\r\n\r\n return (\r\n }\r\n label={'Download Template'}\r\n onClick={handleDownloadTemplateProduct('pim')}\r\n disabled={props.disabled}\r\n />\r\n );\r\n};\r\n\r\nDownloadProductTemplateFromMember.propTypes = {};\r\n\r\nexport default DownloadProductTemplateFromMember;\r\n","import React, { useState, useEffect } from 'react';\r\nimport { useDispatch } from 'react-redux';\r\nimport { useIntl } from 'react-intl';\r\n\r\nimport { UploadOutlined } from '@ant-design/icons';\r\nimport { notification, Modal } from 'antd';\r\n\r\nimport { ButtonSmallIcon, UploadFile } from 'common/components';\r\nimport ErrorModal from 'common/components/product-publication-setup/ErrorModal.js';\r\n\r\nimport {\r\n usePermissionEditSharedProduct,\r\n useCheckIsSuperAdmin,\r\n useCheckPermissions,\r\n} from 'hooks';\r\n\r\nimport { PERMISSION_EDIT_PRODUCTS } from 'static/Permission';\r\nimport { UPLOAD_MAX_SIZE } from 'static/Constants';\r\n\r\nimport {\r\n IMPORT_PRODUCT_VIA_SPREADSHEET,\r\n IMPORT_TDC_PRODUCT_VIA_SPREADSHEET,\r\n} from 'services/product/endpoints';\r\n\r\nimport * as brandingActions from '@redux/branding/actions';\r\n\r\nimport messagesProduct from 'i18n/messages/product';\r\n\r\nconst UploadProductTemplateFromMember = (props) => {\r\n const [visibleModal, setVisibleModal] = useState(false);\r\n const [updateType, setUploadType] = useState('pim');\r\n\r\n const isSuperAdmin = useCheckIsSuperAdmin();\r\n\r\n const hasPermissionEditProducts = useCheckPermissions(\r\n PERMISSION_EDIT_PRODUCTS\r\n );\r\n\r\n const hasPermissionEditSharedProduct = usePermissionEditSharedProduct();\r\n\r\n const isAllowActionsPim =\r\n isSuperAdmin || hasPermissionEditProducts || hasPermissionEditSharedProduct;\r\n\r\n const onClickUploadTemplate = (type) => () => {\r\n setVisibleModal(true);\r\n setUploadType(type);\r\n };\r\n\r\n return (\r\n <>\r\n {visibleModal && (\r\n setVisibleModal(false)}\r\n type={updateType}\r\n memberId={props.memberId}\r\n />\r\n )}\r\n }\r\n label={'Upload Template'}\r\n onClick={onClickUploadTemplate('pim')}\r\n disabled={!isAllowActionsPim}\r\n />\r\n \r\n );\r\n};\r\n\r\nconst ModalUploadTemplateProduct = (props) => {\r\n const { visibleModal, turnOffModal, type, memberId } = props;\r\n const [errorList, setErrorList] = useState([]);\r\n\r\n useEffect(() => {\r\n if (!visibleModal) setErrorList([]);\r\n }, [visibleModal]);\r\n\r\n const dispatch = useDispatch();\r\n const intl = useIntl();\r\n\r\n const handleResponseUpload = (response) => {\r\n const successMessage =\r\n type === 'tdc'\r\n ? messagesProduct.uploadTdcSuccess\r\n : messagesProduct.createProductSuccess;\r\n\r\n if (response?.data) {\r\n if (response?.data?.isSuccess) {\r\n notification.success({\r\n message: intl.formatMessage(successMessage),\r\n });\r\n\r\n turnOffModal();\r\n\r\n if (type === 'tdc') return;\r\n\r\n dispatch(brandingActions.getBrandingNoLoading());\r\n } else {\r\n if (response?.data?.errors) {\r\n setErrorList(response?.data?.errors);\r\n }\r\n }\r\n }\r\n };\r\n\r\n const apiUrl =\r\n type === 'tdc'\r\n ? IMPORT_TDC_PRODUCT_VIA_SPREADSHEET\r\n : IMPORT_PRODUCT_VIA_SPREADSHEET;\r\n\r\n const nameFormData = type === 'tdc' ? 'file' : 'TemplateFile';\r\n\r\n return (\r\n \r\n
\r\n handleResponseUpload(response)}\r\n maxSize={UPLOAD_MAX_SIZE.GENERAL}\r\n additionalBodyPayload={{\r\n memberId: memberId,\r\n }}\r\n supportTypes={['xlsx', 'xls']}\r\n />\r\n
\r\n {errorList && errorList.length > 0 && (\r\n \r\n )}\r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\nUploadProductTemplateFromMember.propTypes = {};\r\n\r\nexport default UploadProductTemplateFromMember;\r\n","import React from 'react';\r\nimport { Divider } from 'antd';\r\n\r\nconst RibbtonSectionDivider = () => {\r\n return ;\r\n};\r\n\r\nexport default RibbtonSectionDivider;\r\n","// import ribbon components\r\nimport Favorite from './sections/home-grid/Favorite';\r\nimport View from './sections/home-grid/ViewLayout';\r\nimport Folder from './sections/home-grid/Folder';\r\nimport Search from './sections/home-grid/SearchLayout';\r\nimport Grid from './sections/home-grid/GridLayout';\r\nimport Other from './sections/home-grid/OtherLayout';\r\n\r\nimport Addition from './controls/home/Addition';\r\nimport AddFolder from './controls/home/AddFolder';\r\nimport Detail from './controls/home/DetailView';\r\nimport QuickView from './controls/home/QuickView';\r\nimport SearchFolder from './controls/home/SearchFolder';\r\nimport DeleteFolder from './controls/home/DeleteFolder';\r\nimport ViewAlt from './controls/home/InlineControl';\r\nimport SearchAlt from './controls/home/Search';\r\nimport BackAlt from './controls/home/Back';\r\nimport AdvanceSearch from './controls/home/AdvanceSearch';\r\nimport GridColumns from './controls/home/grid-query/GridColumns';\r\nimport SaveGrid from './controls/home/grid-query/SaveGrid';\r\nimport AddCuratedQuery from './controls/home/grid-query/AddCuratedQuery';\r\nimport ManageGridQuery from './controls/home/grid-query/ManageGridQuery';\r\nimport SavedConfigurations from './controls/home/grid-query/SavedConfigurations';\r\nimport ClearQuery from './controls/home/grid-query/ClearQuery';\r\nimport EditMember from './sections/member-full/EditMember';\r\nimport BrandImage from './sections/member-full/BrandImage';\r\nimport ToggleHelpUploadMediaSection from './sections/post-full/ToggleHelpUploadMediaSection';\r\nimport ToggleEulaUploadMediaSection from './sections/eula-full/ToggleEulaUploadMediaSection';\r\nimport ToggleTagLineUploadMediaSection from './sections/member-full/ToggleTagLineUploadMediaSection';\r\n\r\nimport OpenAsset from './controls/asset/OpenAsset';\r\n\r\nimport GeneratePreviewModal from './modal/generate-preview/GeneratePreviewModal';\r\nimport GenerateConfirmModal from './modal/generate-confirm/GenerateConfirmModal';\r\nimport GeneratePreviewItem from './modal/generate-preview/GeneratePreviewItem';\r\nimport ManageShareModal from './modal/manage-share/ManageShareModal';\r\nimport ManageShareModalToolbar from './modal/manage-share/ManageShareModalToolbar';\r\n\r\nimport AdvanceFilter from './controls/home/AdvanceFilter';\r\nimport AdvanceStack from './controls/home/AdvanceStack';\r\nimport PimActions from './controls/home/PimActions';\r\nimport GridConfig from './sections/home-grid/GridConfig';\r\n\r\nimport ManageSharingSection from '../components/sections/shared/ManageSharingSection';\r\nimport DetailSection from '../components/sections/home-grid/DetailSection';\r\n\r\n//? ribbon btn divider\r\nimport RibbonSectionDivider from './ribbbonSectionDivider/RibbonSectionDivider';\r\n\r\n// export ribbon component\r\n\r\nexport { EditMember, BrandImage };\r\n\r\nexport const FavoriteLayout = Favorite;\r\nexport const ViewLayout = View;\r\nexport const FolderLayout = Folder;\r\nexport const SearchLayout = Search;\r\nexport const GridLayout = Grid;\r\nexport const OtherLayout = Other;\r\n\r\nexport const AdditionControl = Addition;\r\nexport const AddFolderControl = AddFolder;\r\nexport const DetailControl = Detail;\r\nexport const QuickViewControl = QuickView;\r\nexport const ViewLayoutControl = ViewAlt;\r\nexport const SearchFolderControl = SearchFolder;\r\nexport const DeleteFolderControl = DeleteFolder;\r\nexport const SearchControl = SearchAlt;\r\nexport const BackControl = BackAlt;\r\nexport const AdvanceSearchControl = AdvanceSearch;\r\nexport const GridColumnsControl = GridColumns;\r\nexport const SaveGridControl = SaveGrid;\r\nexport const AddCuratedQueryControl = AddCuratedQuery;\r\nexport const ManageQuery = ManageGridQuery;\r\n\r\nexport const OpenAssetControl = OpenAsset;\r\n\r\nexport {\r\n GeneratePreviewModal,\r\n GeneratePreviewItem,\r\n GenerateConfirmModal,\r\n ManageShareModal,\r\n ManageShareModalToolbar,\r\n ToggleHelpUploadMediaSection,\r\n ToggleEulaUploadMediaSection,\r\n ToggleTagLineUploadMediaSection,\r\n SavedConfigurations,\r\n AdvanceFilter,\r\n ClearQuery,\r\n AdvanceStack,\r\n PimActions,\r\n GridConfig,\r\n RibbonSectionDivider,\r\n ManageSharingSection,\r\n DetailSection,\r\n};\r\n","import React from 'react';\r\nimport { useSelector, useDispatch } from 'react-redux';\r\n\r\nimport { ControlOutlined } from '@ant-design/icons';\r\n\r\nimport ButtonSmallIcon from 'common/components/button/ButtonSmallIcon';\r\n\r\nimport selectorsGridView from 'common/components/grid-view/controllers/selectors';\r\n\r\nimport * as actionGlobal from '@redux/global/actions';\r\nimport * as selectorsGlobal from '@redux/global/selectors';\r\n\r\nimport { useGlobalModal } from 'hooks';\r\n\r\nimport Messages from 'i18n/messages/home';\r\n\r\nimport * as actionsGridView from 'common/components/grid-view/controllers/actions';\r\n\r\nimport * as actions from '@redux/global/actions';\r\n\r\nconst ManageGridQuery = (props) => {\r\n const dispatch = useDispatch();\r\n\r\n const isAddToFolderShow = useSelector(\r\n selectorsGlobal.selectShowAddToFolder()\r\n );\r\n const isDetailShow = useSelector(selectorsGridView.makeSelectVisible());\r\n\r\n const { MODAL_NAMES, openModal } = useGlobalModal();\r\n\r\n const openModalManageQueries = () => {\r\n if (isAddToFolderShow) dispatch(actionGlobal.toggleAddToFolder());\r\n if (isDetailShow) dispatch(actionsGridView.updateVisible(false));\r\n dispatch(actions.hideDetail());\r\n openModal(MODAL_NAMES.MANAGE_QUERIES);\r\n };\r\n return (\r\n <>\r\n }\r\n label={Messages.manageConfig}\r\n onClick={openModalManageQueries}\r\n className='grid-config__button'\r\n />\r\n \r\n );\r\n};\r\n\r\nexport default ManageGridQuery;\r\n","import React, { useEffect, useRef, useMemo } from 'react';\r\n\r\nimport { Row, Col, Space, Checkbox, Input } from 'antd';\r\n\r\nimport {\r\n getAllExpandKeys,\r\n getTreeData,\r\n compareExpandKey,\r\n} from 'utils/exportProductProperties';\r\n\r\nimport { useIntl } from 'react-intl';\r\nimport Messages from 'i18n/messages/product';\r\n\r\nconst { Search } = Input;\r\n\r\nconst CopyProductToolbar = (props) => {\r\n const intl = useIntl();\r\n const expandKeysRef = useRef([]);\r\n\r\n const {\r\n visible,\r\n dataSource,\r\n leftExpandedKeys,\r\n setLeftExpandedKeys,\r\n setIsShowSelection,\r\n isSameSize,\r\n onChangeSameSize,\r\n isSameStyleFlavor,\r\n onChangeSameStyleFlavor,\r\n isHeaderOnly,\r\n onChangeHeaderOnly,\r\n isCopyAllPopulated,\r\n setIsCopyAllPopulated,\r\n searchHook,\r\n disabled,\r\n } = props;\r\n\r\n const [searchText, setSearchText] = searchHook;\r\n\r\n const isExpandedAll = useMemo(\r\n () => compareExpandKey(leftExpandedKeys, expandKeysRef.current, visible),\r\n [leftExpandedKeys, visible]\r\n );\r\n\r\n const onSearch = (value) => {\r\n setSearchText(value);\r\n };\r\n\r\n const onChangeExpandAll = (e) => {\r\n const checked = e.target.checked;\r\n if (checked) setLeftExpandedKeys(expandKeysRef.current);\r\n else setLeftExpandedKeys([]);\r\n };\r\n\r\n const onChangeShowSelection = (e) => {\r\n const checked = e.target.checked;\r\n setIsShowSelection(checked);\r\n };\r\n\r\n const onChangeCopyAllPopulated = (e) => {\r\n const checked = e.target.checked;\r\n setIsCopyAllPopulated(checked);\r\n };\r\n\r\n const initExpandKeys = () => {\r\n const treeData = getTreeData(dataSource);\r\n const allExpandKeys = getAllExpandKeys(treeData);\r\n expandKeysRef.current = allExpandKeys;\r\n };\r\n\r\n useEffect(() => {\r\n initExpandKeys();\r\n }, [dataSource]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n {intl.formatMessage(Messages.exportPropertiesExpandAll)}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Header Only\r\n
\r\n \r\n Same Size\r\n
\r\n \r\n Same Style/Flavor\r\n
\r\n \r\n Copy All Populated\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default CopyProductToolbar;\r\n","import React from 'react';\r\nimport { Typography, List, Avatar } from 'antd';\r\n\r\nimport { Images } from 'config/assets';\r\n\r\nimport classnames from 'classnames';\r\n\r\nimport './CopyProductResult.less';\r\n\r\nconst { Title } = Typography;\r\n\r\nconst CopyProductResult = (props) => {\r\n const { listData = [] } = props;\r\n\r\n return (\r\n
\r\n Please check list of copied products:\r\n
\r\n {\r\n return (\r\n \r\n \r\n \r\n
\r\n }\r\n title={\r\n \r\n {`RIVIR ID: ${item.rivirId}`}\r\n \r\n }\r\n />\r\n \r\n );\r\n }}\r\n />\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default CopyProductResult;\r\n","import { useMemo } from 'react';\r\n\r\nimport _ from 'lodash';\r\n\r\nimport * as productServices from 'services/product';\r\nimport { NUMERIC_TYPE } from 'static/Constants';\r\n\r\nimport { useIntl } from 'react-intl';\r\nimport Messages from 'i18n/messages/product';\r\nimport { useQuery } from '@tanstack/react-query';\r\n\r\nconst KEY_COPY_PRODUCT = {\r\n GET_PROPERTIES_FOR_COPY_PRODUCT: ['pim', 'copy-product-item'],\r\n};\r\n\r\nconst useGetPropertiesForCopyProduct = (visible) =>\r\n useQuery({\r\n queryKey: KEY_COPY_PRODUCT.GET_PROPERTIES_FOR_COPY_PRODUCT,\r\n queryFn: async () => {\r\n const response = await productServices.getPropertiesForCopyProduct();\r\n if (response?.isSuccess) {\r\n return response?.data?.properties;\r\n } else {\r\n throw new Error(response?.message);\r\n }\r\n },\r\n enabled: visible,\r\n retry: false,\r\n });\r\n\r\nexport const useGetProductPropertiesToCopy = (visible) => {\r\n const intl = useIntl();\r\n\r\n const noHeaderLabel = intl.formatMessage(\r\n Messages.exportProductPropertiesNoHeaderTitle\r\n );\r\n\r\n const { status: loadingStatus, data: rootData } =\r\n useGetPropertiesForCopyProduct(visible);\r\n\r\n const generateSourceData = (data) => {\r\n if (!data) return [];\r\n const moduleData = generateModuleData(data);\r\n const propertyItemData = generatePropertyItemData(moduleData, data);\r\n const objectTypePropertyData =\r\n generateOjectTypePropertiesData(propertyItemData);\r\n\r\n return [...moduleData, ...objectTypePropertyData, ...propertyItemData];\r\n };\r\n\r\n const generateModuleData = (data) => {\r\n if (!data) return [];\r\n const moduleData = data.map((propertyItem) => {\r\n return {\r\n key: propertyItem.moduleName || 'noHeader',\r\n title: propertyItem.moduleDisplayName || noHeaderLabel,\r\n type: 'group',\r\n };\r\n });\r\n\r\n const uniqData = _.uniqBy(moduleData, 'key');\r\n\r\n return uniqData;\r\n };\r\n\r\n const generatePropertyItemData = (moduleData, data) => {\r\n if (!moduleData || !data) return;\r\n\r\n const formattedPropertiesData = data.map((propertyItem) => {\r\n const { dataType, displayName, fieldFullPath, fieldName } = propertyItem;\r\n\r\n let changeInt;\r\n if (NUMERIC_TYPE.includes(dataType?.toLowerCase())) changeInt = 'Number';\r\n\r\n const propertyModuleName =\r\n propertyItem.moduleDisplayName || noHeaderLabel;\r\n\r\n const modulePath = moduleData.find((moduleItem) => {\r\n return moduleItem.title === propertyModuleName;\r\n })?.key;\r\n const propertyPathArray = fieldFullPath.split('.');\r\n //* remove the first path as it is module path\r\n if (propertyItem.moduleDisplayName) propertyPathArray.shift();\r\n\r\n const realPropertyPath = propertyPathArray.join('.');\r\n const formattedPropertyPath = modulePath + '.' + realPropertyPath;\r\n\r\n return {\r\n key: formattedPropertyPath,\r\n data: {\r\n displayName,\r\n fieldName,\r\n fieldFullPath,\r\n dataType: changeInt ?? dataType,\r\n },\r\n };\r\n });\r\n return formattedPropertiesData;\r\n };\r\n\r\n const generateOjectTypePropertiesData = (propertiesData) => {\r\n if (!propertiesData) return [];\r\n const objectTypePropertyData = [];\r\n propertiesData.forEach((propertyItem) => {\r\n const paths = propertyItem.key.split('.');\r\n if (paths.length <= 2) return;\r\n let pathString = '';\r\n\r\n for (let i = 0; i < paths.length - 1; i++) {\r\n pathString += paths[i];\r\n\r\n const isPathStringAdded = objectTypePropertyData.find(\r\n (propertyObjectItem) => propertyObjectItem.key === pathString\r\n );\r\n\r\n if (!isPathStringAdded && pathString.includes('.')) {\r\n objectTypePropertyData.push({\r\n key: pathString,\r\n fieldName: paths[i],\r\n title: _.startCase(paths[i]),\r\n type: 'object',\r\n });\r\n }\r\n pathString += '.';\r\n }\r\n });\r\n return objectTypePropertyData;\r\n };\r\n\r\n const sourceData = useMemo(() => {\r\n return generateSourceData(rootData);\r\n }, [rootData]);\r\n\r\n return { rootData, sourceData, loadingStatus };\r\n};\r\n","import React, { useState, useEffect, useRef, useMemo } from 'react';\r\n\r\nimport {\r\n Typography,\r\n Row,\r\n Col,\r\n Modal,\r\n notification,\r\n Result,\r\n InputNumber,\r\n Space,\r\n} from 'antd';\r\n\r\nimport ExportPropertiesTree from './ExportPropertiesTree';\r\nimport CopyProductToolbar from './CopyProductToolbar';\r\nimport CopyProductResult from './CopyProductResult';\r\n\r\nimport * as productServices from 'services/product';\r\nimport { useGetProductPropertiesToCopy } from 'hooks/copyProductPropertiesHooks';\r\nimport {\r\n WithLoading,\r\n CustomizeTransfer,\r\n dialogFunction,\r\n} from 'common/components';\r\n\r\nimport {\r\n useQueryFactsPanel,\r\n useQuerySupplementFactsPanel,\r\n useQueryDrugFactsPanel,\r\n useQueryPetFoodPanel,\r\n} from 'pages/product-full-view/components/product-media-area/multiple-panel/facts-panel/useQueryFactsPanel';\r\n\r\nimport { useIntl } from 'react-intl';\r\nimport Messages from 'i18n/messages/product';\r\nimport { useMutation } from '@tanstack/react-query';\r\nimport { isArray, isObject, union } from 'lodash';\r\n\r\nimport { useDispatchReloadPage } from 'hooks/useReloadPage';\r\nimport { useGetProductItemModules } from 'pages/product-full-view/components/product-new-detail-view/queries';\r\nimport { useDispatch } from 'react-redux';\r\nimport { useGlobalModal } from 'hooks';\r\n\r\nimport * as actionsGridView from 'common/components/grid-view/controllers/actions';\r\n\r\nimport { KEY_COPY_PROPERTIES } from 'static/Constants';\r\n\r\nimport './BulkEditProduct.less';\r\n\r\nconst { Title } = Typography;\r\n\r\nconst CopyProductPropertiesModal = (props) => {\r\n const dispatch = useDispatch();\r\n const intl = useIntl();\r\n const addedKeysRef = useRef([]);\r\n const reloadPage = useDispatchReloadPage();\r\n\r\n const { productId } = props;\r\n\r\n const { closeModal, checkModalVisible, MODAL_NAMES } = useGlobalModal();\r\n\r\n const isModalOpen = checkModalVisible(MODAL_NAMES.COPY_PRODUCT_MODAL);\r\n\r\n const [leftExpandedKeys, setLeftExpandedKeys] = useState([]);\r\n const [isShowSelection, setIsShowSelection] = useState(false);\r\n const [isHeaderOnly, setIsHeaderOnly] = useState(false);\r\n const [isSameSize, setIsSameSize] = useState(false);\r\n const [isSameStyleFlavor, setIsSameStyleFlavor] = useState(false);\r\n const [isCopyAllPopulated, setIsCopyAllPopulated] = useState(false);\r\n const searchHook = useState('');\r\n const [searchText, setSearchText] = searchHook;\r\n const [submitDisabled, setSubmitDisabled] = useState(true);\r\n const [numberOfCopies, setNumberOfCopies] = useState(1);\r\n const [keyHeaderOnly, setKeyHeaderOnly] = useState([]);\r\n const [keySameSize, setKeySameSize] = useState([]);\r\n const [keySameStyle, setKeySameStyle] = useState([]);\r\n\r\n const { sourceData, rootData, loadingStatus } =\r\n useGetProductPropertiesToCopy(isModalOpen);\r\n\r\n const productItemQuery = useGetProductItemModules(productId);\r\n const { productItemModules, statusFetchProductItem: moduleStatus } =\r\n productItemQuery;\r\n\r\n const { listFactsPanel, isLoading: loadingFacts } = useQueryFactsPanel({\r\n id: productId,\r\n });\r\n const { listSupplementFactsPanel, isLoading: loadingSupFacts } =\r\n useQuerySupplementFactsPanel({\r\n id: productId,\r\n });\r\n const { listDrugFactsPanel, isLoading: loadingDrugFacts } =\r\n useQueryDrugFactsPanel({\r\n id: productId,\r\n });\r\n\r\n const { listPetFoodPanel, isLoading: loadingPetFood } = useQueryPetFoodPanel({\r\n id: productId,\r\n });\r\n\r\n const copyMutation = useMutation({\r\n mutationFn: productServices.copyProductItem,\r\n });\r\n\r\n const onOk = () => {\r\n dialogFunction({\r\n type: 'warn',\r\n okButtonProps: {\r\n loading: copyMutation.isLoading,\r\n },\r\n content: `Do you want to copy ${numberOfCopies} product(s)?`,\r\n onOk: callApiCopyProperties,\r\n });\r\n };\r\n\r\n const onCancel = () => {\r\n closeModal(MODAL_NAMES.COPY_PRODUCT_MODAL);\r\n };\r\n\r\n const onTransferChange = (addedKeys) => {\r\n addedKeysRef.current = addedKeys;\r\n setSubmitDisabled(!addedKeys.length);\r\n };\r\n\r\n const callApiCopyProperties = () => {\r\n const properties = getPropertyFieldName({\r\n data: sourceData,\r\n addedKeys: addedKeysRef.current,\r\n });\r\n const params = {\r\n productItemId: productId,\r\n numberOfCopies: numberOfCopies,\r\n isPopulated: isCopyAllPopulated,\r\n selectedColumns: properties,\r\n };\r\n\r\n copyMutation.mutate(params, {\r\n onSuccess: async (result) => {\r\n if (result?.isSuccess) {\r\n dialogFunction({\r\n type: 'info',\r\n content: (\r\n \r\n ),\r\n cancelButtonProps: {\r\n hidden: true,\r\n },\r\n });\r\n reloadPage();\r\n dispatch(actionsGridView.deleteItemsSelection());\r\n } else {\r\n notification.error({\r\n message:\r\n result?.message ||\r\n result?.data?.message ||\r\n intl.formatMessage(Messages.copyProductPropertiesError),\r\n });\r\n }\r\n closeModal(MODAL_NAMES.COPY_PRODUCT_MODAL);\r\n },\r\n onError: () => {\r\n notification.error({\r\n message: intl.formatMessage(Messages.copyProductPropertiesError),\r\n });\r\n },\r\n });\r\n };\r\n\r\n const getPropertyFieldName = ({ data, addedKeys }) => {\r\n return addedKeys.reduce((accumulator, currentAddedKeys) => {\r\n const addedPropertyData = data.find((propertyItem) => {\r\n return propertyItem.key === currentAddedKeys;\r\n });\r\n const fieldFullPath = addedPropertyData?.data?.fieldFullPath;\r\n\r\n if (addedPropertyData && fieldFullPath)\r\n accumulator.push({ fieldName: fieldFullPath });\r\n\r\n return accumulator;\r\n }, []);\r\n };\r\n\r\n const resetState = () => {\r\n if (isModalOpen) return;\r\n\r\n setIsShowSelection(false);\r\n setLeftExpandedKeys([]);\r\n setSearchText('');\r\n };\r\n\r\n useEffect(() => {\r\n resetState();\r\n }, [isModalOpen]);\r\n\r\n const getKeyHasValue = (arrKey, data, nameKey) => {\r\n const invalidValues = [null, undefined, ''];\r\n for (const [key, value] of Object.entries(data)) {\r\n if (!invalidValues.includes(value)) {\r\n if (isArray(value)) {\r\n value.forEach((val) => {\r\n if (isObject(val)) {\r\n getKeyHasValue(arrKey, val, `${nameKey}.${key}`);\r\n } else {\r\n arrKey.push(`${nameKey}.${key}`.toLocaleLowerCase());\r\n }\r\n });\r\n } else if (isObject(value)) {\r\n getKeyHasValue(arrKey, value, `${nameKey}.${key}`);\r\n } else {\r\n arrKey.push(`${nameKey}.${key}`.toLocaleLowerCase());\r\n }\r\n // triggle BE field LIST STRING\r\n if (\r\n nameKey.includes('DrugFacts') &&\r\n (key === 'useDetail' ||\r\n key === 'warningDetail' ||\r\n key === 'otherInformation') &&\r\n value?.length > 0\r\n ) {\r\n arrKey.push(`${nameKey}.${key}`.toLocaleLowerCase());\r\n }\r\n }\r\n }\r\n };\r\n\r\n const keyNonHeaderData = useMemo(() => {\r\n let key = [];\r\n productItemModules?.productItemModules?.length > 0 &&\r\n productItemModules?.productItemModules.forEach((module) => {\r\n if (module.moduleName !== 'Header') {\r\n const arrKey = [];\r\n getKeyHasValue(arrKey, module?.data, module.moduleName);\r\n key = key.concat(arrKey);\r\n }\r\n });\r\n listFactsPanel?.length > 0 &&\r\n listFactsPanel.forEach((fact) => {\r\n const arrKey = [];\r\n getKeyHasValue(arrKey, fact, 'NutritionFacts');\r\n key = key.concat(arrKey);\r\n });\r\n listSupplementFactsPanel?.length > 0 &&\r\n listSupplementFactsPanel.forEach((fact) => {\r\n const arrKey = [];\r\n getKeyHasValue(arrKey, fact, 'SupplementFacts');\r\n key = key.concat(arrKey);\r\n });\r\n listDrugFactsPanel?.length > 0 &&\r\n listDrugFactsPanel.forEach((fact) => {\r\n const arrKey = [];\r\n getKeyHasValue(arrKey, fact, 'DrugFacts');\r\n key = key.concat(arrKey);\r\n });\r\n listPetFoodPanel?.length > 0 &&\r\n listPetFoodPanel.forEach((fact) => {\r\n const arrKey = [];\r\n getKeyHasValue(arrKey, fact, 'PetNutritionFacts');\r\n key = key.concat(arrKey);\r\n });\r\n return key;\r\n }, [\r\n productItemModules,\r\n listFactsPanel,\r\n listSupplementFactsPanel,\r\n listDrugFactsPanel,\r\n listPetFoodPanel,\r\n ]);\r\n\r\n const getKey = (sameSize) => {\r\n let key = [];\r\n let keyInclude = [];\r\n let keyNotInclude = [];\r\n\r\n if (sameSize) {\r\n key = KEY_COPY_PROPERTIES.SAME_SIZE;\r\n keyNotInclude = KEY_COPY_PROPERTIES.SAME_SIZE_NOT_INCLUDE;\r\n } else {\r\n key = KEY_COPY_PROPERTIES.SAME_STYLE_FLAVOR;\r\n keyNotInclude = KEY_COPY_PROPERTIES.SAME_STYLE_NOT_INCLUDE;\r\n keyInclude = KEY_COPY_PROPERTIES.SAME_STYLE_INCLUDE;\r\n }\r\n sourceData.forEach((val) => {\r\n if (val?.data)\r\n if (!keyNotInclude.includes(val?.key)) {\r\n const splitKey = val?.key?.split('.');\r\n if (!keyNotInclude.includes(splitKey[0])) {\r\n if (keyNonHeaderData && keyNonHeaderData.length > 0) {\r\n if (\r\n keyNonHeaderData.includes(\r\n val?.data?.fieldFullPath?.toLocaleLowerCase()\r\n )\r\n ) {\r\n key.push(val.key);\r\n }\r\n }\r\n }\r\n if (keyInclude && keyInclude.includes(splitKey[0])) {\r\n key.push(val.key);\r\n }\r\n }\r\n });\r\n return key;\r\n };\r\n\r\n const onChangeSameSize = (e) => {\r\n const checked = e.target.checked;\r\n setIsSameSize(checked);\r\n let keyStyle = getKey(false);\r\n let keySize = getKey(true);\r\n let key = [];\r\n if (checked) {\r\n if (isHeaderOnly) {\r\n key = key.concat(KEY_COPY_PROPERTIES.HEADER_ONLY);\r\n }\r\n if (isSameStyleFlavor) {\r\n key = key.concat(keyStyle);\r\n }\r\n\r\n const newKey = addedKeysRef?.current.filter((val) => !key.includes(val));\r\n setKeySameSize(union(keySize, newKey));\r\n } else {\r\n key = key.concat(keySize);\r\n if (isHeaderOnly) {\r\n key = key.concat(KEY_COPY_PROPERTIES.HEADER_ONLY);\r\n }\r\n if (isSameStyleFlavor) {\r\n key = key.concat(keyStyle);\r\n }\r\n const newKey = addedKeysRef?.current.filter((val) => !key.includes(val));\r\n setKeySameSize(newKey);\r\n }\r\n if (!isSameStyleFlavor) {\r\n setKeySameStyle([]);\r\n }\r\n if (!isHeaderOnly) {\r\n setKeyHeaderOnly([]);\r\n }\r\n };\r\n\r\n const onChangeSameStyleFlavor = (e) => {\r\n const checked = e.target.checked;\r\n setIsSameStyleFlavor(checked);\r\n let keyStyle = getKey(false);\r\n let keySize = getKey(true);\r\n let key = [];\r\n\r\n if (checked) {\r\n if (isHeaderOnly) {\r\n key = key.concat(KEY_COPY_PROPERTIES.HEADER_ONLY);\r\n }\r\n if (isSameSize) {\r\n key = key.concat(keySize);\r\n }\r\n const newKey = addedKeysRef?.current.filter((val) => !key.includes(val));\r\n setKeySameStyle(union(keyStyle, newKey));\r\n } else {\r\n key = key.concat(keyStyle);\r\n if (isHeaderOnly) {\r\n key = key.concat(KEY_COPY_PROPERTIES.HEADER_ONLY);\r\n }\r\n if (isSameSize) {\r\n key = key.concat(keySize);\r\n }\r\n const newKey = addedKeysRef?.current.filter((val) => !key.includes(val));\r\n setKeySameStyle(newKey);\r\n }\r\n if (!isSameSize) {\r\n setKeySameSize([]);\r\n }\r\n if (!isHeaderOnly) {\r\n setKeyHeaderOnly([]);\r\n }\r\n };\r\n\r\n const onChangeHeaderOnly = (e) => {\r\n const checked = e.target.checked;\r\n setIsHeaderOnly(checked);\r\n\r\n let keyStyle = getKey(false);\r\n let keySize = getKey(true);\r\n let key = [];\r\n if (checked) {\r\n if (isSameSize) {\r\n key = key.concat(keySize);\r\n }\r\n if (isSameStyleFlavor) {\r\n key = key.concat(keyStyle);\r\n }\r\n const newKey = addedKeysRef?.current.filter((val) => !key.includes(val));\r\n setKeyHeaderOnly(union(KEY_COPY_PROPERTIES.HEADER_ONLY, newKey));\r\n } else {\r\n key = key.concat(KEY_COPY_PROPERTIES.HEADER_ONLY);\r\n if (isSameSize) {\r\n key = key.concat(keySize);\r\n }\r\n if (isSameStyleFlavor) {\r\n key = key.concat(keyStyle);\r\n }\r\n const newKey = addedKeysRef?.current.filter((val) => !key.includes(val));\r\n setKeyHeaderOnly(newKey);\r\n }\r\n if (!isSameSize) {\r\n setKeySameSize([]);\r\n }\r\n if (!isSameStyleFlavor) {\r\n setKeySameStyle([]);\r\n }\r\n };\r\n\r\n const addRightKey = useMemo(() => {\r\n return union(keySameSize, keySameStyle, keyHeaderOnly);\r\n }, [keySameSize, keySameStyle, keyHeaderOnly]);\r\n\r\n const renderModalTitle = () => {\r\n const title = intl.formatMessage(Messages.copyProperties);\r\n\r\n return (\r\n \r\n \r\n \r\n {title}\r\n \r\n \r\n \r\n \r\n \r\n \r\n Number of copies\r\n \r\n {\r\n setNumberOfCopies(value);\r\n }}\r\n onKeyPress={(event) => {\r\n if (!/[0-9]/.test(event.key)) {\r\n event.preventDefault();\r\n }\r\n }}\r\n onBlur={() => {\r\n if (!numberOfCopies) {\r\n setNumberOfCopies(1);\r\n }\r\n }}\r\n />\r\n \r\n \r\n \r\n );\r\n };\r\n\r\n return (\r\n \r\n \r\n {loadingStatus === 'loading' ? (\r\n
\r\n \r\n
\r\n ) : null}\r\n {loadingStatus === 'error' ? (\r\n
\r\n \r\n
\r\n ) : null}\r\n {loadingStatus === 'success' ? (\r\n
\r\n \r\n {(listProps) => (\r\n \r\n )}\r\n \r\n
\r\n ) : null}\r\n \r\n );\r\n};\r\n\r\nexport default CopyProductPropertiesModal;\r\n","import React, { useEffect, useRef, useMemo } from 'react';\r\n\r\nimport { Row, Col, Space, Checkbox, Input } from 'antd';\r\n\r\nimport {\r\n getAllExpandKeys,\r\n getTreeData,\r\n compareExpandKey,\r\n} from 'utils/exportProductProperties';\r\n\r\nimport { useIntl } from 'react-intl';\r\nimport Messages from 'i18n/messages/product';\r\n\r\nconst { Search } = Input;\r\n\r\nconst ExportProductToolbar = (props) => {\r\n const intl = useIntl();\r\n const expandKeysRef = useRef([]);\r\n\r\n const {\r\n visible,\r\n dataSource,\r\n leftExpandedKeys,\r\n setLeftExpandedKeys,\r\n isShowSelection,\r\n setIsShowSelection,\r\n searchHook,\r\n isPopulated,\r\n setIsPopulated,\r\n submitDisabled,\r\n } = props;\r\n\r\n const [searchText, setSearchText] = searchHook;\r\n\r\n const isExpandedAll = useMemo(\r\n () => compareExpandKey(leftExpandedKeys, expandKeysRef.current, visible),\r\n [leftExpandedKeys, visible]\r\n );\r\n\r\n const onSearch = (value) => {\r\n setSearchText(value);\r\n };\r\n\r\n const onChangeExpandAll = (e) => {\r\n const checked = e.target.checked;\r\n if (checked) setLeftExpandedKeys(expandKeysRef.current);\r\n else setLeftExpandedKeys([]);\r\n };\r\n\r\n const onChangeShowSelection = (e) => {\r\n const checked = e.target.checked;\r\n setIsShowSelection(checked);\r\n };\r\n\r\n const onChangeAllPopulated = (e) => {\r\n const checked = e.target.checked;\r\n setIsPopulated(checked);\r\n };\r\n\r\n const initExpandKeys = () => {\r\n const treeData = getTreeData(dataSource);\r\n const allExpandKeys = getAllExpandKeys(treeData);\r\n expandKeysRef.current = allExpandKeys;\r\n };\r\n\r\n useEffect(() => {\r\n initExpandKeys();\r\n }, [dataSource]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n {intl.formatMessage(Messages.populateAllProduct)}\r\n \r\n \r\n {intl.formatMessage(Messages.exportPropertiesExpandAll)}\r\n \r\n \r\n {intl.formatMessage(Messages.exportPropertiesShowSelection)}\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default ExportProductToolbar;\r\n","import { useMemo } from 'react';\r\n\r\nimport _ from 'lodash';\r\n\r\nimport * as productServices from 'services/product';\r\nimport { NUMERIC_TYPE } from 'static/Constants';\r\n\r\nimport { useIntl } from 'react-intl';\r\nimport Messages from 'i18n/messages/product';\r\nimport { useQuery } from '@tanstack/react-query';\r\n\r\nconst KEY_EXPORT_PRODUCT = {\r\n GET_PRODUCT_PROPERTIES_TO_EXPORT: [\r\n 'pim',\r\n 'get-product-properties-to-export-data',\r\n ],\r\n};\r\n\r\nconst useGetPropertiesForExportProduct = (visible) =>\r\n useQuery({\r\n queryKey: KEY_EXPORT_PRODUCT.GET_PRODUCT_PROPERTIES_TO_EXPORT,\r\n queryFn: async () => {\r\n const response = await productServices.getProductPropertiesToExport();\r\n if (response?.isSuccess) {\r\n return response?.data?.properties;\r\n } else {\r\n throw new Error(response?.message);\r\n }\r\n },\r\n enabled: visible,\r\n retry: false,\r\n });\r\n\r\nexport const useGetProductPropertiesToExport = (visible) => {\r\n const intl = useIntl();\r\n\r\n const { status: loadingStatus, data: rootData } =\r\n useGetPropertiesForExportProduct(visible);\r\n\r\n const noHeaderLabel = intl.formatMessage(\r\n Messages.exportProductPropertiesNoHeaderTitle\r\n );\r\n\r\n const generateSourceData = (data) => {\r\n if (!data) return [];\r\n const moduleData = generateModuleData(data);\r\n const propertyItemData = generatePropertyItemData(moduleData, data);\r\n const objectTypePropertyData =\r\n generateOjectTypePropertiesData(propertyItemData);\r\n\r\n return [...moduleData, ...objectTypePropertyData, ...propertyItemData];\r\n };\r\n\r\n const generateModuleData = (data) => {\r\n if (!data) return [];\r\n const moduleData = data.map((propertyItem) => {\r\n return {\r\n key: propertyItem.moduleName || 'noHeader',\r\n title: propertyItem.moduleDisplayName || noHeaderLabel,\r\n type: 'group',\r\n };\r\n });\r\n\r\n const uniqData = _.uniqBy(moduleData, 'key');\r\n\r\n return uniqData;\r\n };\r\n\r\n const generatePropertyItemData = (moduleData, data) => {\r\n if (!moduleData || !data) return;\r\n\r\n const formattedPropertiesData = data.map((propertyItem) => {\r\n const { dataType, displayName, fieldFullPath, fieldName } = propertyItem;\r\n\r\n let changeInt;\r\n if (NUMERIC_TYPE.includes(dataType?.toLowerCase())) changeInt = 'Number';\r\n\r\n const propertyModuleName =\r\n propertyItem.moduleDisplayName || noHeaderLabel;\r\n\r\n const modulePath = moduleData.find((moduleItem) => {\r\n return moduleItem.title === propertyModuleName;\r\n })?.key;\r\n const propertyPathArray = fieldFullPath.split('.');\r\n //* remove the first path as it is module path\r\n if (propertyItem.moduleDisplayName) propertyPathArray.shift();\r\n\r\n const realPropertyPath = propertyPathArray.join('.');\r\n const formattedPropertyPath = modulePath + '.' + realPropertyPath;\r\n\r\n return {\r\n key: formattedPropertyPath,\r\n data: {\r\n displayName,\r\n fieldName,\r\n fieldFullPath,\r\n dataType: changeInt ?? dataType,\r\n },\r\n };\r\n });\r\n return formattedPropertiesData;\r\n };\r\n\r\n const generateOjectTypePropertiesData = (propertiesData) => {\r\n if (!propertiesData) return [];\r\n const objectTypePropertyData = [];\r\n propertiesData.forEach((propertyItem) => {\r\n const paths = propertyItem.key.split('.');\r\n if (paths.length <= 2) return;\r\n let pathString = '';\r\n\r\n for (let i = 0; i < paths.length - 1; i++) {\r\n pathString += paths[i];\r\n\r\n const isPathStringAdded = objectTypePropertyData.find(\r\n (propertyObjectItem) => propertyObjectItem.key === pathString\r\n );\r\n\r\n if (!isPathStringAdded && pathString.includes('.')) {\r\n objectTypePropertyData.push({\r\n key: pathString,\r\n fieldName: paths[i],\r\n title: _.startCase(paths[i]),\r\n type: 'object',\r\n });\r\n }\r\n pathString += '.';\r\n }\r\n });\r\n return objectTypePropertyData;\r\n };\r\n\r\n const sourceData = useMemo(() => {\r\n return generateSourceData(rootData);\r\n }, [rootData]);\r\n\r\n return { rootData, sourceData, loadingStatus };\r\n};\r\n","import React, { useState, useEffect, useRef } from 'react';\r\nimport { useIsMutating } from '@tanstack/react-query';\r\nimport { useIntl } from 'react-intl';\r\nimport { useSelector } from 'react-redux';\r\n\r\nimport {\r\n Button,\r\n Typography,\r\n Row,\r\n Col,\r\n Modal,\r\n notification,\r\n Result,\r\n Tooltip,\r\n} from 'antd';\r\nimport { QuestionCircleOutlined } from '@ant-design/icons';\r\n\r\nimport classnames from 'classnames';\r\n\r\nimport { WithLoading } from 'common/components';\r\n\r\nimport { CustomizeTransfer } from 'common/components';\r\nimport ExportPropertiesTree from './ExportPropertiesTree';\r\nimport ExportProductToolbar from './ExportProductToolbar';\r\n\r\nimport * as productServices from 'services/product';\r\nimport { useGetProductPropertiesToExport } from 'hooks/exportProductPropertiesHooks';\r\nimport { useGlobalModal } from 'hooks';\r\n\r\nimport * as api from 'config/axios';\r\nimport * as globalSelectors from '@redux/global/selectors';\r\n\r\nimport Messages from 'i18n/messages/product';\r\n\r\nimport './BulkEditProduct.less';\r\n\r\nconst { Title } = Typography;\r\n\r\nconst ExportProductPropertiesModal = (props) => {\r\n const intl = useIntl();\r\n const addedKeysRef = useRef([]);\r\n\r\n const { onExport, title, visible, loading, closeModal } = props;\r\n\r\n const [leftExpandedKeys, setLeftExpandedKeys] = useState([]);\r\n const [isShowSelection, setIsShowSelection] = useState(false);\r\n const searchHook = useState('');\r\n const [searchText, setSearchText] = searchHook;\r\n\r\n const [submitDisabled, setSubmitDisabled] = useState(true);\r\n const [isExportProperties, setIsExportProperties] = useState(false);\r\n const [isPopulated, setIsPopulated] = useState(false);\r\n\r\n const { sourceData, rootData, loadingStatus } =\r\n useGetProductPropertiesToExport(visible);\r\n\r\n const upDownProgressData = useSelector(\r\n globalSelectors.selectUploadDownloadProgress()\r\n );\r\n\r\n const onOk = () => {\r\n setIsExportProperties(true);\r\n const exportProperties = !isPopulated\r\n ? getExportedPropertyFieldName({\r\n data: sourceData,\r\n addedKeys: addedKeysRef.current,\r\n })\r\n : [];\r\n onExport && onExport(exportProperties, isPopulated);\r\n };\r\n\r\n const closeExportModal = () => {\r\n if (!isExportProperties) return;\r\n\r\n const isDownLoadSuccess = upDownProgressData\r\n ?.filter((item) => item?.type === 'download')\r\n ?.every((item) => item?.status === 'done');\r\n\r\n if (isDownLoadSuccess) {\r\n closeModal && closeModal();\r\n setIsExportProperties(false);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n closeExportModal();\r\n }, [upDownProgressData]);\r\n\r\n const onCancel = () => {\r\n closeModal && closeModal();\r\n };\r\n\r\n const onClickDownloadManual = () => {\r\n callApiDownloadManual();\r\n };\r\n\r\n const onTransferChange = (addedKeys) => {\r\n addedKeysRef.current = addedKeys;\r\n setSubmitDisabled(!addedKeys.length);\r\n };\r\n\r\n const callApiDownloadManual = () => {\r\n productServices\r\n .downloadManualEditingBulkProduct()\r\n .then((response) => {\r\n const { isSuccess, data } = response;\r\n if (isSuccess && data) api.sendDownload({ url: response?.data?.url });\r\n else handleDownloadManualError(response);\r\n })\r\n .catch(() => {\r\n handleDownloadManualError();\r\n });\r\n };\r\n\r\n const handleDownloadManualError = (response) => {\r\n notification.error({\r\n message:\r\n response?.message ||\r\n response?.data?.message ||\r\n intl.formatMessage(Messages.exportPropertiesDownloadManualError),\r\n });\r\n };\r\n\r\n const getExportedPropertyFieldName = ({ data, addedKeys }) => {\r\n return addedKeys.reduce((accumulator, currentAddedKeys) => {\r\n const addedPropertyData = data.find((propertyItem) => {\r\n return propertyItem.key === currentAddedKeys;\r\n });\r\n const fieldFullPath = addedPropertyData?.data?.fieldFullPath;\r\n\r\n if (addedPropertyData && fieldFullPath) accumulator.push(fieldFullPath);\r\n\r\n return accumulator;\r\n }, []);\r\n };\r\n\r\n const resetState = () => {\r\n if (visible) return;\r\n\r\n setIsShowSelection(false);\r\n setLeftExpandedKeys([]);\r\n setSearchText('');\r\n };\r\n\r\n useEffect(() => {\r\n resetState();\r\n }, [visible]);\r\n\r\n const renderModalTitle = () => {\r\n const DownloadManualBtn = Button;\r\n\r\n return (\r\n \r\n \r\n \r\n {title}\r\n \r\n \r\n \r\n \r\n \r\n }\r\n onClick={onClickDownloadManual}\r\n />\r\n \r\n \r\n \r\n );\r\n };\r\n\r\n return (\r\n \r\n \r\n {loadingStatus === 'loading' ? (\r\n
\r\n \r\n
\r\n ) : null}\r\n {loadingStatus === 'error' ? (\r\n
\r\n \r\n
\r\n ) : null}\r\n {loadingStatus === 'success' ? (\r\n \r\n \r\n \r\n All properties are populated!\r\n \r\n \r\n \r\n {(listProps) => (\r\n \r\n )}\r\n \r\n \r\n ) : null}\r\n \r\n );\r\n};\r\n\r\nexport default ExportProductPropertiesModal;\r\n","import React, { useState, useEffect, useMemo, useRef } from 'react';\r\n\r\nimport _ from 'lodash';\r\nimport { Tree, Typography, Row, Col } from 'antd';\r\nimport { MemberRoleSectionWrapper as SectionWrapper } from 'pages/role/components';\r\nimport { EVENT } from 'static/Constants';\r\n\r\nimport useDocumentAttachEvent from 'hooks/documentAttachEventHook';\r\nimport * as exportProductPropertiesUtils from 'utils/exportProductProperties';\r\n\r\nimport { useIntl } from 'react-intl';\r\nimport Messages from 'i18n/messages/product';\r\n\r\nconst { Title, Text, Paragraph } = Typography;\r\n\r\nconst ExportPropertiesTree = (props) => {\r\n const intl = useIntl();\r\n const movingRightToLeftKeysRef = useRef([]);\r\n const treeContainerRef = useRef([]);\r\n\r\n const {\r\n visible,\r\n dataSource,\r\n direction,\r\n addKeysHook,\r\n selectKeysHook,\r\n setLeftExpandedKeys,\r\n leftExpandedKeys,\r\n isShowSelection,\r\n searchText,\r\n propertyTitle,\r\n rootData,\r\n } = props;\r\n\r\n // console.log('leftExpandedKeys: ', leftExpandedKeys);\r\n const [addedKeys, setAddedKey] = addKeysHook;\r\n const [selectedKeys, setSelectedKeys] = selectKeysHook;\r\n\r\n const [treeData, setTreeData] = useState([]);\r\n const [checkedKeys, setCheckedKeys] = useState([]);\r\n const [treeHeight, setTreeHeight] = useState(450);\r\n\r\n const semiFlattenData = useMemo(() => {\r\n const semiFlattenData = [];\r\n exportProductPropertiesUtils.semiFlatData({\r\n data: treeData,\r\n result: semiFlattenData,\r\n });\r\n\r\n return semiFlattenData;\r\n }, [treeData]);\r\n\r\n const onExpand = (expandedKeysValue, e) => {\r\n if (e?.node?.data) return;\r\n if (direction === 'right') return;\r\n const newExpandedKeys = exportProductPropertiesUtils.getExpandKeysOnEvent(\r\n leftExpandedKeys,\r\n e\r\n );\r\n setLeftExpandedKeys(newExpandedKeys);\r\n };\r\n\r\n const onSelect = (selectedKeys, e) => {\r\n if (direction === 'right') return;\r\n const newExpandedKeys = exportProductPropertiesUtils.getExpandKeysOnEvent(\r\n leftExpandedKeys,\r\n e\r\n );\r\n setLeftExpandedKeys(newExpandedKeys);\r\n };\r\n\r\n const onCheck = (_, e) => {\r\n const { checkedNodes, node } = e;\r\n\r\n const checkedKeys = checkedNodes.map((nodeItem) => nodeItem.key);\r\n const reCheckedKeys = reGenCheckedKeys(checkedKeys);\r\n const reSelectedKeys = reGenSelectedKeys(reCheckedKeys);\r\n\r\n setCheckedKeys(reCheckedKeys);\r\n setSelectedKeys(reSelectedKeys);\r\n\r\n expandOnCheckedNode(node);\r\n };\r\n\r\n const reGenCheckedKeys = (originCheckedKeys) => {\r\n return originCheckedKeys.reduce((accumulator, currentKey) => {\r\n const currentData = semiFlattenData.find((dataItem) => {\r\n return dataItem.key === currentKey;\r\n });\r\n\r\n if (!currentData?.children?.length) accumulator.push(currentKey);\r\n\r\n return accumulator;\r\n }, []);\r\n };\r\n\r\n const reGenSelectedKeys = (checkedKey) => {\r\n if (direction === 'right') return checkedKey;\r\n\r\n return checkedKey.filter((keyItem) => {\r\n return !addedKeys.includes(keyItem);\r\n });\r\n };\r\n const expandOnCheckedNode = (node) => {\r\n //* expand this node and all its children\r\n if (node?.data) return;\r\n if (direction === 'right') return;\r\n\r\n const shouldCollapse = node.expanded && node.checked;\r\n\r\n const expandKeysOnNode = [node.key];\r\n exportProductPropertiesUtils.getAllChildrenKeyDeep(\r\n node?.children,\r\n expandKeysOnNode\r\n );\r\n\r\n const newExpandedKeys = shouldCollapse\r\n ? leftExpandedKeys.filter((leftExpandedKeyItem) => {\r\n return !expandKeysOnNode.includes(leftExpandedKeyItem);\r\n })\r\n : [...expandKeysOnNode, ...leftExpandedKeys];\r\n\r\n setLeftExpandedKeys(newExpandedKeys);\r\n };\r\n\r\n const expandAllTreeNodes = (treeData) => {\r\n const expandedKeys = getExpandKeyFromTreeData(treeData);\r\n setLeftExpandedKeys(expandedKeys);\r\n };\r\n\r\n const getExpandKeyFromTreeData = (treeData) => {\r\n const semiFlattenData = [];\r\n exportProductPropertiesUtils.semiFlatData({\r\n data: treeData,\r\n result: semiFlattenData,\r\n });\r\n return semiFlattenData.map((dataItem) => dataItem.key);\r\n };\r\n\r\n const generateTreeDataFromSource = ({ data, inCase }) => {\r\n const treeData = exportProductPropertiesUtils.getTreeData(data);\r\n\r\n if (direction === 'left') return generateLeftTree({ treeData, inCase });\r\n else return generateRightTree(rootData);\r\n };\r\n\r\n const generateTreeDataFromFiltered = () => {\r\n if (direction === 'right')\r\n return generateTreeDataFromSource({ data: dataSource, inCase: 'filter' });\r\n\r\n const filteredData = _.cloneDeep(treeData);\r\n\r\n const flattenData = [];\r\n\r\n exportProductPropertiesUtils.flatData({\r\n data: filteredData,\r\n result: flattenData,\r\n });\r\n\r\n const newTreeData = exportProductPropertiesUtils.getTreeData(flattenData);\r\n\r\n return generateLeftTree({ treeData: newTreeData });\r\n };\r\n\r\n const generateLeftTree = ({ treeData, inCase }) => {\r\n if (inCase === 'update')\r\n updateCheckedKeysByAddedKeys({\r\n treeData,\r\n movingKeys: movingRightToLeftKeysRef.current,\r\n });\r\n return exportProductPropertiesUtils.mapDisabledData(treeData, addedKeys);\r\n };\r\n\r\n const generateRightTree = (data) => {\r\n const arrRightData = data.filter((val) => {\r\n const propertyPathArray = val?.fieldFullPath?.split('.');\r\n //* remove the first path as it is module path\r\n if (val?.moduleDisplayName) propertyPathArray.shift();\r\n\r\n const realPropertyPath = propertyPathArray.join('.');\r\n const modulePath = val?.moduleName || 'noHeader';\r\n const key = modulePath + '.' + realPropertyPath;\r\n\r\n return addedKeys.includes(key);\r\n });\r\n const newRightData =\r\n exportProductPropertiesUtils.generateSourceData(arrRightData);\r\n const treeRightData =\r\n exportProductPropertiesUtils.getTreeData(newRightData);\r\n\r\n return treeRightData;\r\n };\r\n\r\n const filterShowSelection = () => {\r\n if (direction === 'right') return;\r\n\r\n setTreeData((prevState) => {\r\n const clonedData = _.cloneDeep(prevState);\r\n\r\n const filteredData = exportProductPropertiesUtils.createFilterData(\r\n clonedData,\r\n checkedKeys,\r\n addedKeys\r\n );\r\n\r\n //* all checkbox should be checked\r\n checkAllFilterSelection(filteredData);\r\n\r\n //* disabled added items\r\n const newState = exportProductPropertiesUtils.mapDisabledData(\r\n filteredData,\r\n addedKeys\r\n );\r\n\r\n return newState;\r\n });\r\n };\r\n\r\n const checkAllFilterSelection = (filteredData) => {\r\n // treeData\r\n const semiFlattenData = [];\r\n exportProductPropertiesUtils.semiFlatData({\r\n data: filteredData,\r\n result: semiFlattenData,\r\n });\r\n const newCheckedKeys = semiFlattenData.map((dataItem) => {\r\n return dataItem.key;\r\n });\r\n\r\n setCheckedKeys(newCheckedKeys);\r\n };\r\n\r\n const deFilterShowSelection = () => {\r\n if (direction === 'right') return;\r\n const treeData = exportProductPropertiesUtils.getTreeData(dataSource);\r\n const treeDataWithDisabledNote =\r\n exportProductPropertiesUtils.mapDisabledData(treeData, addedKeys);\r\n deFilterUpdateCheckedKeys(treeDataWithDisabledNote);\r\n setTreeData(treeDataWithDisabledNote);\r\n };\r\n\r\n const deFilterUpdateCheckedKeys = (data) => {\r\n const semiFlattenData = [];\r\n exportProductPropertiesUtils.semiFlatData({\r\n data,\r\n result: semiFlattenData,\r\n });\r\n const newCheckedKeys = semiFlattenData.reduce(\r\n (accumulator, currentDataItem) => {\r\n const isChecked =\r\n !currentDataItem.children.length &&\r\n checkedKeys.includes(currentDataItem.key);\r\n\r\n const isAllChildrenChecked =\r\n exportProductPropertiesUtils.checkAllChildrenCheckedDeep(\r\n currentDataItem,\r\n checkedKeys\r\n );\r\n\r\n if (isChecked || isAllChildrenChecked)\r\n accumulator.push(currentDataItem.key);\r\n\r\n return accumulator;\r\n },\r\n []\r\n );\r\n //* if there are added keys, they should be checked\r\n setCheckedKeys([...newCheckedKeys, ...addedKeys]);\r\n };\r\n\r\n const updateCheckedKeysByAddedKeys = ({ treeData, movingKeys }) => {\r\n const semiFlattenData = [];\r\n exportProductPropertiesUtils.semiFlatData({\r\n data: treeData,\r\n result: semiFlattenData,\r\n });\r\n\r\n const filteredOutMovingKeys = selectedKeys.filter(\r\n (selectedKeyItem) => !movingKeys.includes(selectedKeyItem)\r\n );\r\n\r\n const newCheckedKeys = semiFlattenData.reduce(\r\n (accumulator, currentDataItem) => {\r\n const isChecked =\r\n !currentDataItem?.children?.length &&\r\n filteredOutMovingKeys.includes(currentDataItem.key);\r\n\r\n const isAllChildrenAdded =\r\n exportProductPropertiesUtils.checkAllChildrenAddedDeep(\r\n currentDataItem,\r\n addedKeys\r\n );\r\n\r\n if (isAllChildrenAdded || isChecked)\r\n return [...accumulator, currentDataItem.key];\r\n return accumulator;\r\n },\r\n []\r\n );\r\n\r\n setCheckedKeys(newCheckedKeys);\r\n };\r\n\r\n const getExpandedKeyFromAddedKey = () => {\r\n return addedKeys.reduce((accumulator, currentAddedKey) => {\r\n const currentAddedKeyPath = currentAddedKey.split('.');\r\n currentAddedKeyPath.forEach((path, index) => {\r\n const parentKey = currentAddedKeyPath.slice(0, index + 1).join('.');\r\n accumulator.push(parentKey);\r\n });\r\n return accumulator;\r\n }, []);\r\n };\r\n\r\n const onMoveLeftCallback = (e) => {\r\n const { rightSelectedKeys: movingKeys } = e.detail;\r\n\r\n movingRightToLeftKeysRef.current = movingKeys;\r\n\r\n if (direction === 'left') return;\r\n setCheckedKeys([]);\r\n };\r\n\r\n useDocumentAttachEvent({\r\n name: EVENT.EXPORT_PRODUCT_PROPERTIES_TRANSFER.toLeft,\r\n handler: onMoveLeftCallback,\r\n });\r\n\r\n // const initTreeData = () => {\r\n // const treeData = generateTreeData();\r\n\r\n // setTreeData(treeData);\r\n // };\r\n\r\n const updateTreeData = () => {\r\n const treeData = isShowSelection\r\n ? generateTreeDataFromFiltered()\r\n : generateTreeDataFromSource({ data: dataSource, inCase: 'update' });\r\n\r\n setTreeData(treeData);\r\n };\r\n\r\n const searchProperties = () => {\r\n if (direction === 'right') return;\r\n\r\n const originTreeData = generateTreeDataFromSource({\r\n data: dataSource,\r\n inCase: 'search',\r\n });\r\n\r\n const searchedResults =\r\n exportProductPropertiesUtils.searchItems(originTreeData, searchText) ||\r\n [];\r\n\r\n setTreeData(searchedResults);\r\n expandAllTreeNodes(searchedResults);\r\n };\r\n\r\n const getTotalItemSelected = () => {\r\n const totalItemSelected = exportProductPropertiesUtils.getTotalItemSelected(\r\n {\r\n data: semiFlattenData,\r\n selectedKeys,\r\n addedKeys: direction === 'left' ? addedKeys : [],\r\n }\r\n );\r\n return totalItemSelected;\r\n };\r\n\r\n const clearState = () => {\r\n if (visible) return;\r\n\r\n setAddedKey([]);\r\n setSelectedKeys([]);\r\n setTreeData([]);\r\n setCheckedKeys([]);\r\n };\r\n const getTreeHeight = () => {\r\n const treeContainer = treeContainerRef.current;\r\n\r\n setTreeHeight(treeContainer.offsetHeight);\r\n };\r\n\r\n const getTreeHeightDebounce = _.debounce(getTreeHeight, 500);\r\n\r\n //* make tree vertical responsive\r\n useEffect(() => {\r\n window.addEventListener('resize', getTreeHeightDebounce);\r\n return () => {\r\n window.removeEventListener('resize', getTreeHeightDebounce);\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n isShowSelection && filterShowSelection();\r\n !isShowSelection && deFilterShowSelection();\r\n }, [isShowSelection]);\r\n\r\n useEffect(() => {\r\n if (direction === 'left' && searchText) searchProperties();\r\n else updateTreeData();\r\n }, [addedKeys, searchText, dataSource]);\r\n\r\n useEffect(() => {\r\n clearState();\r\n }, [visible]);\r\n\r\n const renderTitle = (nodeData) => {\r\n const { title, data, fieldName } = nodeData;\r\n\r\n if (title)\r\n return (\r\n \r\n {title}\r\n \r\n );\r\n\r\n return (\r\n \r\n \r\n \r\n {data?.displayName || fieldName}\r\n \r\n \r\n {data ? (\r\n \r\n \r\n \r\n {intl.formatMessage(\r\n Messages.exportProductPropertiesFieldNameLabel\r\n )}\r\n :{' '}\r\n \r\n {data?.fieldName}\r\n \r\n \r\n \r\n {intl.formatMessage(\r\n Messages.exportProductPropertiesFieldTypeLabel\r\n )}\r\n :{' '}\r\n \r\n \r\n {data.dataType}\r\n \r\n \r\n \r\n ) : null}\r\n \r\n );\r\n };\r\n\r\n const expandedKeys =\r\n direction === 'right' ? getExpandedKeyFromAddedKey() : leftExpandedKeys;\r\n\r\n const sectionTitle =\r\n direction === 'left' ? 'productProperties' : propertyTitle;\r\n\r\n const totalItemSelected = getTotalItemSelected({\r\n data: dataSource,\r\n selectedKeys,\r\n });\r\n\r\n const totalItemSelectedText =\r\n totalItemSelected > 1 ? 'totalItemsSelected' : 'totalItemSelected';\r\n\r\n return (\r\n
\r\n \r\n
\r\n ' ' : undefined}\r\n onExpand={onExpand}\r\n expandedKeys={expandedKeys}\r\n onCheck={onCheck}\r\n onSelect={onSelect}\r\n checkedKeys={checkedKeys}\r\n treeData={treeData}\r\n titleRender={renderTitle}\r\n defaultExpandParent={direction === 'right'}\r\n />\r\n
\r\n \r\n {propertyTitle === 'exportProperties' && (\r\n \r\n {totalItemSelected}{' '}\r\n {intl.formatMessage(Messages[totalItemSelectedText])}\r\n \r\n )}\r\n
\r\n );\r\n};\r\n\r\nexport default ExportPropertiesTree;\r\n","import React, { useState } from 'react';\r\n\r\nimport { List, Modal, notification, Typography } from 'antd';\r\nimport { InfoCircleOutlined } from '@ant-design/icons';\r\n\r\nimport * as api from 'config/axios';\r\nimport { CustomNotification, UploadFile, WithLoading } from 'common/components';\r\n\r\nimport { GET_EDITING_FIELDS_FORM_TEMPLATE } from 'services/product/endpoints';\r\nimport { UPLOAD_MAX_SIZE } from 'static/Constants';\r\nimport { useDispatchReloadPage } from 'hooks/useReloadPage';\r\n\r\nimport { useIntl } from 'react-intl';\r\nimport Messages from 'i18n/messages/product';\r\nimport {\r\n IXONECertificationWrapper,\r\n TYPE_VIEW,\r\n} from 'common/components/product-add/IXONECertificationWrapper';\r\nimport useUpdateIXONEShield from 'common/components/product-add/useUpdateIXONEShield';\r\n\r\nconst { Text, Paragraph } = Typography;\r\n\r\nconst ImportProductBulkEditModal = (props) => {\r\n const intl = useIntl();\r\n const reloadPage = useDispatchReloadPage();\r\n\r\n const { handleUpdateIXONEShield } = useUpdateIXONEShield();\r\n\r\n const { title, apiUrl, visible, closeModal, onSuccess } = props;\r\n\r\n const [errorList, setErrorList] = useState([]);\r\n const [fileUpload, setFileUpload] = useState();\r\n const [tdcProductIds, setTdcProductIds] = useState([]);\r\n const [loading, setLoading] = useState(false);\r\n const [bulkEditLoading, setBulkEditLoading] = useState(false);\r\n\r\n const onCancel = () => {\r\n closeModal && closeModal();\r\n setErrorList([]);\r\n };\r\n\r\n const handleResponseUpload = async (response, ixoneIgnore) => {\r\n setErrorList([]);\r\n\r\n if (response?.isSuccess) {\r\n if (ixoneIgnore === 'continue') {\r\n await handleUpdateIXONEShield(ixoneIgnore, tdcProductIds);\r\n }\r\n const systemMessage = response?.message;\r\n CustomNotification.success(\r\n systemMessage ||\r\n intl.formatMessage(Messages.importProductBulkEditSuccess)\r\n );\r\n reloadPage();\r\n\r\n onSuccess && onSuccess();\r\n\r\n setBulkEditLoading(false);\r\n\r\n closeModal && closeModal();\r\n } else {\r\n notification.error({\r\n message:\r\n response?.message ||\r\n intl.formatMessage(Messages.importProductBulkEditError),\r\n });\r\n if (response?.data?.validateFailDetails) {\r\n setErrorList(response?.data?.validateFailDetails);\r\n }\r\n setBulkEditLoading(false);\r\n }\r\n };\r\n\r\n const renderErrorList = () => {\r\n return (\r\n
\r\n \r\n Error\r\n \r\n }\r\n bordered\r\n dataSource={errorList}\r\n renderItem={(errorItem) => {\r\n const errorMessage = errorItem.reason || 'Invalid data';\r\n return (\r\n \r\n \r\n \r\n {errorMessage}\r\n {' '}\r\n in{' '}\r\n \r\n {errorItem?.sheetName}\r\n {' '}\r\n sheet, on row{' '}\r\n \r\n {errorItem?.row}\r\n \r\n , column{' '}\r\n \r\n {errorItem?.column}\r\n \r\n \r\n \r\n );\r\n }}\r\n />\r\n
\r\n );\r\n };\r\n\r\n const getFileChange = (paramsUpload) => {\r\n setFileUpload(paramsUpload.file.originFileObj);\r\n };\r\n\r\n const handleValidateFileUpload = (handleConfirmIXONE) => {\r\n setLoading(true);\r\n api\r\n .sendUpload({\r\n api: GET_EDITING_FIELDS_FORM_TEMPLATE,\r\n payload: {\r\n file: fileUpload,\r\n },\r\n })\r\n .then(({ data }) => {\r\n if (data?.isSuccess) {\r\n const productList = data?.data?.data;\r\n let Ids = [];\r\n productList?.forEach((product) => {\r\n const { ixOneId, ixOneCertifiedStatus, productId } = product;\r\n if (ixOneId && ixOneCertifiedStatus !== 'Removed') {\r\n Ids.push(+productId);\r\n }\r\n });\r\n setTdcProductIds(Ids);\r\n\r\n handleConfirmIXONE({\r\n originalData: Ids,\r\n changedFields: data?.data?.fields,\r\n });\r\n setLoading(false);\r\n } else {\r\n setLoading(false);\r\n CustomNotification.warning(data?.message ?? 'Server error');\r\n }\r\n })\r\n .catch(() => {\r\n setLoading(false);\r\n CustomNotification.warning('Server error');\r\n });\r\n };\r\n\r\n const handleUploadBulkEdit = (ixoneIgnore) => {\r\n setBulkEditLoading(true);\r\n api\r\n .sendUpload({\r\n api: apiUrl,\r\n payload: {\r\n file: fileUpload,\r\n },\r\n })\r\n .then(async (response) => {\r\n await handleResponseUpload(response?.data, ixoneIgnore);\r\n })\r\n .catch(() => {\r\n CustomNotification.warning('Server error');\r\n setBulkEditLoading(false);\r\n });\r\n };\r\n\r\n return (\r\n {\r\n handleUploadBulkEdit(ixoneIgnore);\r\n }}\r\n onCancel={onCancel}\r\n >\r\n {(handleConfirmIXONE) => (\r\n \r\n \r\n
\r\n {\r\n handleValidateFileUpload(handleConfirmIXONE);\r\n }}\r\n maxSize={UPLOAD_MAX_SIZE.GENERAL}\r\n />\r\n
\r\n
\r\n {errorList?.length ? renderErrorList() : null}\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default ImportProductBulkEditModal;\r\n","import { useIntl } from 'react-intl';\r\n\r\nimport { useQueryClient } from '@tanstack/react-query';\r\n\r\nimport { useProductOverlaidList } from 'common/queries/product-module';\r\n\r\nimport { useMutation } from '@tanstack/react-query';\r\n\r\nimport { CustomNotification } from 'common/components';\r\n\r\nimport * as productServices from 'services/product';\r\nimport { downloadBulkProductOverlay } from 'services/overlay';\r\n\r\nimport * as api from 'config/axios';\r\n\r\nimport Messages from 'i18n/messages/product';\r\nimport { useProductFullView } from 'hooks';\r\nimport { useReloadDocumentCertificateTab } from 'hooks/useReloadDocumentCertificateTab';\r\n\r\nexport const EXPORT_PRODUCT_PROPERTIES = ['product', 'export-property'];\r\nexport const EXPORT_PRODUCT_OVERLAY_PROPERTIES = [\r\n 'product',\r\n 'export-product-overlay-property',\r\n];\r\n\r\nexport const useExportProductProperty = () => {\r\n const intl = useIntl();\r\n\r\n return useMutation({\r\n mutationKey: EXPORT_PRODUCT_PROPERTIES,\r\n mutationFn: async (params) => {\r\n const response = await productServices.exportProductProperties(params);\r\n\r\n const { isSuccess, data } = response || {};\r\n\r\n if (isSuccess) {\r\n return Promise.resolve(data || {});\r\n } else {\r\n return Promise.reject(response || 'Sever Error');\r\n }\r\n },\r\n onSuccess: (data) => {\r\n api.sendDownload({ url: data?.url });\r\n CustomNotification.success('Download successfully');\r\n },\r\n onError: (response) => {\r\n const errorMessage =\r\n response?.message ||\r\n response?.data?.message ||\r\n intl.formatMessage(Messages.exportProductPropertiesError);\r\n\r\n CustomNotification.error(errorMessage);\r\n },\r\n });\r\n};\r\n\r\nexport const useExportProductOverlayProperty = () => {\r\n const intl = useIntl();\r\n\r\n return useMutation({\r\n mutationKey: EXPORT_PRODUCT_OVERLAY_PROPERTIES,\r\n mutationFn: async (params) => {\r\n const response = await downloadBulkProductOverlay(params);\r\n\r\n const { isSuccess, data } = response || {};\r\n\r\n if (isSuccess) {\r\n return Promise.resolve(data || {});\r\n } else {\r\n return Promise.reject(response || 'Sever Error');\r\n }\r\n },\r\n onSuccess: (data) => {\r\n api.sendDownload({ url: data?.url });\r\n CustomNotification.success('Download successfully');\r\n },\r\n onError: (response) => {\r\n const errorMessage =\r\n response?.message ||\r\n response?.data?.message ||\r\n intl.formatMessage(Messages.exportProductPropertiesError);\r\n\r\n CustomNotification.error(errorMessage);\r\n },\r\n });\r\n};\r\n\r\nexport const useGetLatestProductFullViewInBulkEdit = ({ productId }) => {\r\n const queryClient = useQueryClient();\r\n\r\n const { reloadProductFullView } = useProductFullView({\r\n productId,\r\n });\r\n\r\n const { reloadDocumentCertificateTab } = useReloadDocumentCertificateTab();\r\n\r\n const { invalidateProductOverlaidList } = useProductOverlaidList(null, {\r\n enabled: false,\r\n });\r\n\r\n const getLatestFullViewData = () => {\r\n queryClient.invalidateQueries({ queryKey: ['pim'] });\r\n\r\n reloadProductFullView();\r\n\r\n reloadDocumentCertificateTab();\r\n };\r\n\r\n const getLatestFullViewDataOverlay = () => {\r\n getLatestFullViewData();\r\n\r\n invalidateProductOverlaidList();\r\n };\r\n\r\n return {\r\n getLatestFullViewData,\r\n getLatestFullViewDataOverlay,\r\n };\r\n};\r\n","import React from 'react';\r\n\r\nimport { List, Row, Col, Checkbox, Typography } from 'antd';\r\nimport classnames from 'classnames';\r\n\r\nconst { Text } = Typography;\r\n\r\nconst HierarchyProductList = (props) => {\r\n const {\r\n productList,\r\n selectedProduct,\r\n setSelectedProduct,\r\n getProduct,\r\n totalProduct,\r\n pageIndex,\r\n setPageIndex,\r\n } = props;\r\n\r\n const onClickProduct = (product) => () => {\r\n setSelectedProduct(product);\r\n };\r\n\r\n const onChangePagination = (page) => {\r\n setPageIndex(page);\r\n getProduct({ page });\r\n };\r\n\r\n const checkSelectedProduct = (product) => {\r\n return selectedProduct?.id === product.id;\r\n };\r\n\r\n const pagination = {\r\n pageSize: 5,\r\n total: totalProduct,\r\n current: pageIndex,\r\n onChange: onChangePagination,\r\n };\r\n\r\n return (\r\n \r\n {productList.map((product, index) => {\r\n const isSelected = checkSelectedProduct(product);\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {product.productName}\r\n \r\n \r\n \r\n \r\n \r\n Package Level:\r\n \r\n {product.packageLevel}\r\n \r\n \r\n \r\n UPC12:\r\n \r\n {product.upc12}\r\n \r\n \r\n GTIN:\r\n {product.gtin}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n );\r\n};\r\n\r\nexport default HierarchyProductList;\r\n","import React, { useEffect, useRef, useState } from 'react';\r\n\r\nimport { LeftOutlined } from '@ant-design/icons';\r\nimport { Button, Input, Row, Space, Typography } from 'antd';\r\n\r\nimport { WithLoading } from 'common/components';\r\nimport HierarchyProductList from './HierarchyProductList';\r\n\r\nimport * as productServices from 'services/product';\r\nimport { HIERARCHY_LEVEL } from 'static/Constants';\r\n\r\nimport Messages from 'i18n/messages/product';\r\nimport { useIntl } from 'react-intl';\r\n\r\nimport { useGetProductFullView } from 'hooks';\r\n\r\nconst { Text } = Typography;\r\n\r\nconst AddProductHierarchy = (props) => {\r\n const intl = useIntl();\r\n const searchInputRef = useRef(null);\r\n\r\n const {\r\n selectedLevel,\r\n setSelectedProduct,\r\n selectedProduct,\r\n goBackToSelectLevelView,\r\n productId,\r\n } = props;\r\n\r\n const [searchText, setSearchText] = useState('');\r\n const [totalProduct, setTotalProduct] = useState(0);\r\n const [pageIndex, setPageIndex] = useState(1);\r\n\r\n const [searchProductData, setSearchProductData] = useState([]);\r\n const [searchProductError, setSearchProductError] = useState(false);\r\n const [searchLoading, setSearchLoading] = useState(false);\r\n\r\n const { productFull: currentProduct } = useGetProductFullView({ productId });\r\n\r\n const pageSize = 5;\r\n\r\n const onClickBackButton = () => {\r\n goBackToSelectLevelView();\r\n };\r\n\r\n const onSearchProduct = (value) => {\r\n setSearchText(value);\r\n callApiSearchProduct({ page: 1, search: value });\r\n };\r\n\r\n const callApiSearchProduct = ({ page, search }) => {\r\n setSearchLoading(true);\r\n setSearchProductData([]);\r\n setSearchProductError(false);\r\n\r\n const selectedLevelParams = Object.values(HIERARCHY_LEVEL).find(\r\n (LEVEL) => LEVEL.KEY === selectedLevel.key\r\n )?.NAME;\r\n\r\n const params = {\r\n packageLevels: [selectedLevelParams],\r\n search: {\r\n searchText: typeof search === 'string' ? search : searchText,\r\n },\r\n pageIndex: page,\r\n pageSize,\r\n ownerId: currentProduct?.ownerId,\r\n };\r\n\r\n productServices\r\n .searchProductForAddHierarchy(params)\r\n .then((response) => {\r\n const { isSuccess, data } = response;\r\n\r\n if (isSuccess && data?.gridData?.length) {\r\n setSearchProductData(data.gridData);\r\n setTotalProduct(data.paging?.totalRecord);\r\n } else {\r\n throw new Error();\r\n }\r\n })\r\n .catch((error) => {\r\n setSearchProductError(true);\r\n })\r\n .finally(() => {\r\n setSearchLoading(false);\r\n });\r\n };\r\n\r\n const focusSearchInput = () => {\r\n if (!searchInputRef.current) return;\r\n searchInputRef.current.focus({\r\n cursor: 'start',\r\n });\r\n };\r\n\r\n useEffect(() => {\r\n focusSearchInput();\r\n }, []);\r\n\r\n return (\r\n <>\r\n
\r\n \r\n }\r\n onClick={onClickBackButton}\r\n size='small'\r\n shape='circle'\r\n />\r\n \r\n \r\n \r\n {searchLoading ? (\r\n \r\n ) : null}\r\n {searchProductError ? (\r\n \r\n {intl.formatMessage(Messages.searchProductError)}\r\n \r\n ) : null}\r\n {searchProductData.length ? (\r\n \r\n ) : null}\r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default AddProductHierarchy;\r\n","import React from 'react';\r\n\r\nimport {\r\n Col,\r\n Typography,\r\n Button,\r\n InputNumber,\r\n Form,\r\n Tooltip,\r\n Space,\r\n} from 'antd';\r\nimport { UndoOutlined } from '@ant-design/icons';\r\nimport _ from 'lodash';\r\n\r\nimport { DeleteButton, dialogFunction } from 'common/components';\r\n\r\nimport * as utils from 'utils/productHierarchy';\r\n\r\nimport Messages from 'i18n/messages/product';\r\nimport { useIntl } from 'react-intl';\r\n\r\nconst { Text, Link } = Typography;\r\n\r\nconst HierarchyLevelProductItem = (props) => {\r\n const intl = useIntl();\r\n const {\r\n form,\r\n hierarchyProductList,\r\n currentProduct,\r\n product,\r\n level,\r\n highestLevel,\r\n isCopy,\r\n hierarchyLevelList,\r\n setHierarchyLevelList,\r\n onClickLevelButton,\r\n onClickRevertBtn,\r\n } = props;\r\n\r\n const onDeleteProduct = (level) => () => {\r\n dialogFunction({\r\n type: 'warn',\r\n content: intl.formatMessage(Messages.deletePackageLevelMessage),\r\n onOk: deletePackageLevel(level),\r\n okText: intl.formatMessage(Messages.deletePackageLevelYes),\r\n });\r\n };\r\n\r\n const deletePackageLevel = (level) => () => {\r\n removeLevel(level);\r\n };\r\n\r\n const removeLevel = (deletedLevel) => {\r\n setHierarchyLevelList((prevState) => {\r\n const cloneState = _.cloneDeep(prevState);\r\n\r\n _.set(cloneState, `[${deletedLevel.index}].productItemId`, null);\r\n _.set(cloneState, `[${deletedLevel.index}].parentProductItemId`, null);\r\n\r\n const removedState = utils.getRemovedLevelResultList({\r\n deletedLevel,\r\n levelList: cloneState,\r\n });\r\n\r\n const reIndexState = utils.reIndexLevelList(removedState);\r\n\r\n removeParentProductItem({ level: deletedLevel, levelList: reIndexState });\r\n\r\n reSetHighestLevelQuantity({ levelList: reIndexState });\r\n\r\n return reIndexState;\r\n });\r\n };\r\n\r\n const removeParentProductItem = ({ level, levelList }) => {\r\n const childrenLevelList = levelList.filter((levelItem) => {\r\n return levelItem.parentProductItemId === level.productItemId;\r\n });\r\n\r\n childrenLevelList.forEach((levelItem) => {\r\n _.set(\r\n levelList,\r\n `${levelItem.index}.parentProductItemId`,\r\n level.parentProductItemId\r\n );\r\n });\r\n };\r\n\r\n const reSetHighestLevelQuantity = ({ levelList }) => {\r\n const highestLevel = utils.getHighestLevel(levelList);\r\n\r\n const highestLevelList = levelList.filter(\r\n (levelItem) => levelItem.packageLevel === highestLevel\r\n );\r\n\r\n highestLevelList.forEach((levelItem) => {\r\n _.set(levelList, `${levelItem.index}.quantity`, 1);\r\n\r\n form.setFieldsValue({\r\n [levelItem.index]: 1,\r\n });\r\n });\r\n };\r\n\r\n const isCurrentProduct = product.productItemId === currentProduct.productId;\r\n const currentProductCount = utils.countCurrentProduct({\r\n currentProduct,\r\n levelList: hierarchyLevelList,\r\n });\r\n const shouldShowDeleteBtn = !isCurrentProduct || currentProductCount > 1;\r\n\r\n const isHighestLevel = level.packageLevel === highestLevel;\r\n const shouldChangeProduct = !isCurrentProduct && isCopy && isHighestLevel;\r\n\r\n const productInfoText =\r\n product.productName ||\r\n product.productDescription ||\r\n product.gtin ||\r\n product.upc12 ||\r\n product.rivirId ||\r\n intl.formatMessage(Messages.hierarchyProductNoInfo);\r\n\r\n const isRevertable = utils.checkRevertable({\r\n productList: hierarchyProductList,\r\n level,\r\n shouldChangeProduct,\r\n });\r\n\r\n const quantityRule = [\r\n { required: true, message: intl.formatMessage(Messages.required) },\r\n ];\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n {!isCurrentProduct ? (\r\n \r\n {productInfoText}\r\n \r\n ) : (\r\n \r\n {product?.productName}\r\n \r\n )}\r\n \r\n {shouldChangeProduct ? (\r\n \r\n \r\n \r\n {isRevertable ? (\r\n \r\n \r\n \r\n ) : null}\r\n \r\n \r\n \r\n ) : (\r\n <>\r\n \r\n