{"version":3,"sources":["Utils/image.js","styles/colors.js","styles/globalStyle.js","styles/theme.js","Modules/login.js","Modules/modal.js","Modules/user.js","Modules/custom.js","Modules/sidebar.js","Modules/index.js","Components/ScrollToTop.js","Components/Header.js","Pages/Common/MainPage.js","Data/permission.js","Components/SideMenuBar.js","Components/Footer.js","Utils/tokens.js","Utils/api.js","Components/ModalComponents/CategoryModal.js","Components/ModalComponents/UserInfoModal.js","services/axiosService.js","services/api/index.js","services/api/category/category.js","Components/ModalComponents/AxisCategoryModal.js","Components/SearchBar.js","Components/ModalComponents/HostSelectModal.js","Components/Editor.js","Components/ModalComponents/CurationWorkContentModal.js","Components/ModalComponents/GlobalModal.js","Components/TopButton.js","Pages/Common/Login/Login.js","Components/Loading.js","Components/LoadingWrapper.js","Pages/Common/Login/LoginContainer.js","routes/PrivateRoute.js","Data/crawlStatus.js","services/api/crawl.js","Components/CrawlDataForm.js","Components/Button.js","Components/WorkerContentHeader.js","Pages/Worker/CrawlDataDetail/CrawlDataDetail.js","Pages/Worker/CrawlDataDetail/CrawlDataDetailContainer.js","Components/Pagination.js","Components/NoData.js","Components/DataFilter.js","Components/SearchResultCount.js","Components/Tab.js","Pages/Worker/CrawlDataScreening/_table.js","Pages/Worker/CrawlDataScreening/CrawlDataScreening.js","Pages/Worker/CrawlDataScreening/CrawlDataScreeningContainer.js","Utils/time.js","Components/DataTable.js","Pages/Worker/CrawlDataList/CrawlDataList.js","Pages/Worker/CrawlDataList/CrawlDataListContainer.js","Pages/Worker/CurationDataList/_Search.js","Pages/Worker/ArchiveDataList/ArchiveDataList.js","Pages/Worker/ArchiveDataList/ArchiveDataListContainer.js","Pages/Worker/CurationDataDetail/CurationDataDetail.js","services/api/custom.js","Pages/Worker/CurationDataDetail/CurationDataDetailContainer.js","Components/CurationDataCard.js","Components/CurationDataCard2.js","Pages/Worker/CurationDataList/_CurationTable.js","Pages/Worker/CurationDataList/CurationDataList.js","Pages/Worker/CurationDataList/CurationDataListContainer.js","Pages/Worker/AdminCurationDataList.js","Pages/Worker/WorkerSection.js","Pages/User/CurationDataList/_CurationTable.js","Pages/User/CurationDataList/_Search.js","Data/category.js","Pages/User/CategorySelect.js","Pages/User/CurationDataList/_CurationList.js","Pages/User/CurationDataList/CurationDataList.js","Pages/User/CurationDataList/CurationDataListContainer.js","Pages/User/UserOnlyDataLookUpPage/UserArchiveDataList.js","Pages/User/UserOnlyDataLookUpPage/UserOnlyDataLookUpPage.js","Pages/User/UserOnlyDataLookUpPage/UserOnlyDataLookUpPageContainer.js","Pages/User/UserSection.js","Pages/Manager/ExcelDataRegister/ExcelDataRegister.js","services/api/excel.js","Pages/Manager/ExcelDataRegister/ExcelDataRegisterContainer.js","Pages/Manager/UserManagement/UserManagement.js","Pages/Manager/UserManagement/UserManagementContainer.js","Components/DashboardComponents/TitleCard.js","Components/DashboardComponents/DocumentStatCard.js","Components/DashboardComponents/UserSelectCard.js","Components/DashboardComponents/WorkStatCard.js","Components/DashboardComponents/ChartCard.js","Components/DashboardComponents/ProcessMenu.js","Components/DashboardComponents/DateRange.js","Pages/Manager/Dashboard/Map.js","Pages/Manager/Dashboard/LineGraph.js","Components/DashboardComponents/Duration.js","Pages/Manager/Dashboard/Dashboard.js","Pages/Manager/Dashboard/DashboardContainer.js","Pages/Manager/CategoryManagement/CategoryManagement.js","Pages/Manager/CategoryManagement/CategoryManagementContainer.js","Pages/Manager/HostManagement/HostManagement.js","Pages/Manager/HostManagement/HostManagementContainer.js","Pages/Manager/MultilingualDictionary/MultilingualDictionary.js","Pages/Manager/MultilingualDictionary/MultilingualDictionaryContainer.js","Pages/Manager/UserCustomMenu/UserCustomMenu.js","Pages/Manager/UserCustomMenu/UserCustomMenuContainer.js","Pages/Manager/ManagerSection.js","routes/PublicRoute.js","templates/WorkerLayout.js","templates/UserLayout.js","App.js","reportWebVitals.js","index.js"],"names":["getAddressRemovedPath","imgPath","length","substring","tailwindColors","transparent","black","white","red","pink","purple","indigo","blue","cyan","teal","green","lime","yellow","amber","orange","brown","grey","myColors","GlobalStyle","createGlobalStyle","require","screenSize","theme","base","primary","secondary","accent","info","success","warning","error","mobile_s","mobile_m","mobile_l","tablet","laptop","laptop_l","SET_LOGIN","SET_LOGOUT","setLogout","logout_type","type","initialState","isLogin","localStorage","getItem","SET_MODAL","SET_MODAL_DATA","CLEAR_AXIS_CATEGORY","SET_CATEGORY_MODAL_TYPE","setModal","modalType","setModalData","modalData","dataType","setCategoryModalType","categoryModalType","doc_country","doc_publish_country","doc_category","doc_content_category","doc_content_type","doc_custom","doc_language","doc_topic","doc_host","modal_user","axis_category","curation_work_content","SET_USER","setUser","user","SET_AXIS","setAxis","axisObj","X","Y","SET_EDITING_AXIS","SET_EDITING_AXIS_DATA","initialEdittingAxis","selected","setEditingAxisData","axis","axisType","setEditingAxis","SET_AXIS_MENU_DATA","setAxisMenuData","axisMenuData","initialAxisMenuData","OPEN_SIDEBAR","CLOSE_SIDEBAR","width","opened","rootReducer","combineReducers","login","state","action","_token","tokens","token","_refreshToken","refreshToken","setItem","_type","alert","removeItem","window","location","href","modal","_modalData","custom","editingAxis","sidebar","ScrollToTop","pathname","useLocation","useEffect","scrollTo","HeaderContainer","styled","header","props","ContentWrapper","div","Logo","img","LoginInfo","Header","name","logo","dispatch","useDispatch","history","useHistory","onClick","push","src","className","Wrapper","MainPage","title","height","PERMISSON_DATA","0","1","2","3","4","9","SideMenuBar","permission","sidebarWidth","useSelector","Container","SidebarCloseButton","size","to","alt","MenuList","Icon","BsBarChart","BsTable","BsEye","BsFileEarmarkDiff","BsSave","BsInboxes","BsJournals","BsFillDiagram3Fill","AiOutlineRobot","BsTranslate","BsPersonLinesFill","BsRulers","aside","button","ul","MenuGroup","children","useState","open","setOpen","setHeight","ref","useRef","console","log","current","offsetHeight","MenuGroupContainer","prev","MenuGroupList","Menu","MenuContainer","MenuLink","activeClassName","li","NavLink","footer","FooterContent","LogoutButton","Footer","getToken","headers","authorization","refreshHeaders","refresh","getRefreshToken","baseURL","process","ScreeningDataFetchApi","listSize","pageNo","isKeep","searchObj","config","params","keep","axios","get","ScreeningDataStageApi","stageDataList","body","list","put","ScreeningDataKeepApi","keepDataList","post","ScreeningDataDeleteApi","deleteDataList","delete","CrawlDataListFetchApi","statusCode","general","query","isCrawled","is_crawled","CrawlDataDetailFetchApi","_id","LoginApi","userID","userPW","a","userAuthApi","sessionHandler","err","Promise","resolve","reject","response","status","RefreshTokenApi","then","res","data","setTokens","Name","Number","Category","catch","userCustomCurationDataFetchApi","archive","categoryListFetchApi","code","MultilingualDictionaryApi","method","config2","HostManagementApi","FetchUsersApi","crawlHostDataFetchApi","host_id","router","crawlSumDataFetchApi","userWorkLogFetchApi","dataObj","curationWorkListFetchApi","countryWorkListFetchApi","workAllLogFetchApi","CATEGORY_TYPE_DATA","subTitle","multiSelect","ModalWrapper","Modalheader","ModalTitle","ModalSubTitle","ModalBody","ModalActions","Button","color","ListBody","ListContainer","ListHeader","ListWrapper","ListItem","active","css","CategoryList","CategoryModal","executeModal","closeModal","categoryList","setCategoryList","6","upperCode","setUpperCode","setLength","selectedCategoryList","setSelectedCategoryList","categoryModalData","isSelectedCategory","category","some","v","CODE","clickHandler","e","item","detail","_upperCode","upperCodeHandler","lengthHandler","addCategory","dataCleansing","rawData","index","findIndex","i","_categoryList","dataFetch","map","index2","value","CT_NM","filter","IDX","InputWrapper","InputTitle","required","InputFieldWrapper","InputField","input","SelectField","select","Message","LogoInputLabel","label","LogoInputWrap","LogoPreviewContainer","UserInfoModal","id","setID","setUserID","idMsg","setIdMsg","setUserPW","userPWCheck","setUserPWCheck","salt","setSalt","Tel","setTel","Position","setPosition","setName","Email","setEmail","setCategory","Company","setCompany","logoFile","setLogoFile","logoFileName","setLogoFileName","confirm","setConfirm","imageSrc","setImageSrc","userInfo","Confirm","uid","getUserLogoApi","_confirmCheck","cursor","onChange","target","disabled","userId","verifyUserIdApi","permission_code","permission_name","htmlFor","accept","image","files","fileBlob","reader","FileReader","readAsDataURL","onload","result","encodeFileToBase64","formData","FormData","append","JSON","stringify","addUserApi","reload","forEach","modifyUserInfoApi","instance","create","timeout","interceptors","request","use","message","groupCollapsed","url","groupEnd","_axios","HTTP_METHOD","getCategryListAPI","CATEGORY_INFO","CategoryBtnWrapper","CategoryTypeButton","focused","SelectedItemContainer","selectedCategories","setSelectedCategories","large","medium","focusedCategory","setFocusedCategory","currentCategoryType","setCurrentCategoryType","existingAxisMenuData","stratifyCategoryList","caregoryList","mappedList","CID","x_type","x_code","ct_name","level","categorySchemaMapping","newList","mediumCategories","smallCategories","subCategory","includes","onClickLargeCategory","onClickMediumCategory","onClickSmallCategory","SearchBarContainer","form","OptionWrapper","SearchBtn","SearchBar","keywordHandler","searchAction","onSubmit","placeholder","SearchResultWrapper","SearchResultRow","HostSelectModal","keyword","setKeyword","hostList","setHostList","selectHost","setSelectHost","preventDefault","like","NAME","HOST","editorConfiguration","plugins","ImageUploadEditing","PasteFromOffice","Essentials","Paragraph","Bold","Italic","Heading","Underline","Strikethrough","BlockQuote","Link","MediaEmbed","Font","Image","ImageStyle","ImageToolbar","ImageUpload","ImageCaption","ImageResize","ImageResizeEditing","Clipboard","ImageResizeHandles","LinkImage","List","Alignment","Table","TableToolbar","TextTransformation","TableProperties","TableCellProperties","Indent","IndentBlock","Base64UploadAdapter","InlineEditor","HorizontalLine","toolbar","heading","options","model","view","class","fontSize","alignment","table","contentToolbar","resizeUnit","resizeOptions","icon","typing","transformations","remove","fontFamily","CustomCKEditor","Editor","_docContentHandler","readOnly","paste","event","editor","dataTransfer","deleteContent","document","selection","file","images","imageForm","change","writer","imageElement","createElement","insertContent","stop","ClassicEditor","getData","onReady","documentView","editing","on","priority","toolbarElement","ui","element","style","display","CurationWorkContentModal","MODAL_TYPES","BACKDROP_CLOSE","MODAL_COMPONENTS","AxisCategoryModal","Background","GlobalModal","stopPropagation","ModalComponent","renderComponent","Top","TopButton","Wrap","LoginContainer","LogoContainer","CustomInput","LoginButton","PageIngoContainer","ErrorMsg","p","Login","_inputIDHandler","_inputPWHandler","loginFunc","errorMsg","LoaderContainer","Loading","promiseInProgress","usePromiseTracker","margin","LoadingWrapper","inputID","setInputID","inputPW","setInputPW","setErrorMsg","trackPromise","PrivateRoute","Component","component","rest","STATUS_CODE_SET","mainTitle","5","8","BsJournal","AddThumbnails","docId","DeleteThumbnails","indexes","deleteIndexes","CrawlDataForm","docs","itemId","setItemId","docCategory","docContentCategory","docContentType","docCountry","docPublishCountry","docCustom","docLanguage","docTopic","docHost","docContent","setDocContent","docKeyword","setDocKeyword","docKorSummary","setDocKorSummary","docOriginSummary","setDocOriginSummary","docKorTitle","setDocKorTitle","docOriginTitle","setDocOriginTitle","docMemo","setDocMemo","docPage","setDocPage","docBiblio","setDocBiblio","docPublisher","setDocPublisher","docPublishing","setDocPublishing","docRecomment","setDocRecomment","docPublishDate","setDocPublishDate","docWriteDate","setDocWriteDate","docRegisterDate","setDocRegisterDate","docCollectDate","setDocCollectDate","docBundleTitle","setDocBundleTitle","docBundleUrl","setDocBundleUrl","docRelateTitle","setDocRelateTitle","docRelateUrl","setDocRelateUrl","docThumbnail","setDocThumbnail","docUrl","setDocUrl","docUrlIntro","setDocUrlIntro","docProject","setDocProject","docThumbnailSelect","setDocThumbnailSelect","docKeywordString","setDocKeywordString","docCategoryIndexList","setDocCategoryIndexList","docCountryIndexList","setDocCountryIndexList","docPublishCountryIndexList","setDocPublishCountryIndexList","docLanguageIndexList","setDocLanguageIndexList","docContentCategoryIndexList","setDocContentCategoryIndexList","docContentTypeIndexList","setDocContentTypeIndexList","docCustomIndexList","setDocCustomIndexList","docTopicIndexList","setDocTopicIndexList","_docThumbnailSelectHandler","_openCategoryModal","useImperativeHandle","getCrawlFormData","_docs","charCodeAt","Object","keys","item_id","doc_content","replaceAll","doc_write_date","doc_register_date","doc_publish_date","doc_collect_date","doc_keyword","join","doc_thumbnail","doc_origin_summary","doc_kor_summary","doc_publisher","doc_publishing","doc_page","doc_origin_title","doc_kor_title","doc_url","doc_url_intro","doc_relate_title","doc_relate_url","doc_bundle_title","doc_bundle_url","doc_recomment","doc_biblio","doc_memo","doc_spare2","split","trim","_list","CustomFormRow","CustomFormItem","CustomList","min","replace","maxLength","ImageContainer","ThumbnailWrap","checked","deleteThumbnail","ThumbnailAddInput","onChangeThumbnailAddInput","multiple","ThumbnailAddButton","forwardRef","CustomButton","WorkerContentHeader","TitleWrap","Content","ButtonWrapper","CrawlDataDetail","crawlDataFormRef","dataKeep","dataReject","dataStage","dataUpdate","cancel","CrawlDataDetailContainer","useParams","setDocs","_rawStatusDetailData","doc_keyowrd","Array","isArray","doc_project","String","fromCharCode","doc_spare1","imageDetachHandler","leaveSetting","returnValue","addEventListener","removeEventListener","CrawlDataKeepApi","CrawlDataRejectApi","_crawlDataFormDocs","cover_thumbnail","CrawlDataStageApi","patch","crawlDataUpdateApi","PaginationContainer","ButtonGroup","PaginationButtonGroup","PaginationButton","Pagination","dcCount","setPageNo","pageSize","pageCount","setPageCount","pageGroupCount","setPageGroupCount","currentPageNumberlist","setCurrentPageNumberList","currentPageGroup","setCurrentPageGroup","_handlerPageNo","_currentPageNo","getPageNumberList","pageGroup","_pageCount","Math","ceil","_pageGroupCount","newPageGroup","parseInt","prevpageGroup","nextPageGroup","NoData","SearchResultNotthingContainer","FilterHeader","Title","FilterActions","FilterBody","ActionButton","OptionContainer","OptionRow","OptionCol","OptionTitle","OptionInput","OptionSelect","Chip","DataFilter","dataFilterFetch","optionIsOpen","setOptionIsOpen","setIsCrawled","sort","setSort","dateRange","setDateRange","isDateRange","setIsDateRange","sortType","setSortType","dateGte","setDateGte","Date","toISOString","dateLte","setDateLte","pageGte","setPageGte","pageLte","setPageLte","screeningHost","setScreeningHost","screeningLanguage","setScreeningLanguage","isValidEndDate","start","end","getTime","searchReset","_dateGte","setDate","getDate","setMonth","getMonth","setFullYear","getFullYear","default","last","SearchResultCount","count","Tab","TabGroup","Item","ScreeningTable","screeningData","onChangeCheckedAll","checkedAll","onChangeEach","sortState","SORT_ORDER","order","row","rel","RowWrap","justify","gap","BottomWrap","ScreeningButton","CrawlDataScreening","onChangeListSize","stageScreeningData","selectedTab","onClickTab","TAB_VALUES","screeningSortRules","page","asc","rows","b","desc","language","date","CrawlDataScreeningContainer","setScreeningData","unsortedData","setUnsortedData","setSearchObj","setDcCount","setListSize","itemList","setItemList","setCheckedAll","setStageDataList","setKeepDataList","setDeleteDataList","setSelectedTab","setIsKeep","setSortState","_screeningData","_rawScreeningData","_dcCount","obj","_itemList","_newItemList","_item_id","_index","tabName","newScreeningData","toYYMMDD_DOT","dayjs","format","toYYYYMMDD_DOT","TableWrapper","CustomTable","Badge","CustomRadio","DataTable","tableData","doc_category_list","SearchResult","PaginationWrap","CrawlDataList","crawlDataList","대기","보류","CrawlDataListContainer","setCrawlDataList","currentCode","setCurrentCode","_crawlDataList","_rawCrawlDataList","stat","newListSize","newCode","Search","onSubmitSearch","onChangeSearchInput","SearchForm","SerchInputWrap","SearchInput","SearchContainer","ArchiveDataList","archiveDataList","setSearchInput","onSearch","ArchiveDataListContainer","setArchiveDataList","searchInput","_archiveDataList","_rawArchiveDataList","doc_country_list","x","valueOrDefaultValue","NearDocsContainer","EditButton","ArticleContainer","ArticleTopArea","ArticleHeader","ArticleInfoContainer","Info","LinkContainer","LinkButton","KeywordContainer","ContentContainer","ContentRow","CurationDataDetail","goDataManage","nearDocs","doc_language_list","doc_content_type_list","doc_content_category_list","doc_topic_list","doc_id","doc_title","next","customUrl","setUserCustomMenu","removeUserCustomMenu","getUserCustomMenuByUserId","getNextPrevDoc","CurationDataDetailContainer","setNearDocs","doc_publish_country_list","fetchNearDocs","CardWrapper","SubTitle","CategoryBadge","CountryBadge","PageBadge","PublisherBadge","RegiDateBadge","CurationDataCard","curationDataItem","UrlPreview","CurationDataCard2","CurationTable","curationData","handleRowClick","CurationListTable","doc_Publish_date","CurationCard1Wrapper","CurationCard2Wrapper","CustomLink","CurationDataList","curationDataList","viewType","viewTypeHandler","전체","CurationDataListContainer","setCurationDataList","setViewType","storedViewType","_curationDataList","_rawCurationDataList","AdminCurationDataList","WorkerSection","path","exact","from","CurationSearch","ButtonContainer","CATEGORY_TYPE_LIST","CategorySelect","axisMenu","selectedMenu","menuClickHandler","CategorySelectSection","CategoryBar","CategoryType","CategoryBarItemContainer","CategoryBarItem","CurationList","curations","onClickCuration","curation","Curation","CurationContents","DocumentSection","DocumentWrap","ResultWrap","CagetorySelectWrap","CurationTableWrap","CurationListWrap","UserCurationDataList","UserCurationDataListContainer","dataMode","customDataFetch","ActionGroup","ArchiveDataTable","ArchiveDataItem","UserArchiveDataList","listSizeHandler","archiveData","curationRequest","doc_keywords","ModeSwitchButton","ContentBody","UserOnlyDataLookUpPage","modeSwitchHandler","UserOnlyDataLookUpPageContainer","setAxisMenu","setDataMode","setSelectedMenu","selectedAll","setSelectedAll","setArchiveData","menuDataFetch","x_axis","y_axis","lengtth","_axisObj","archiveDataFetch","requested","curationRequestApi","onClickAllMenu","UserSection","FileList","FileCard","UploadContainer","BodyContainer","ErrorListHeader","ErrorListRow","ErrorListWrapper","ExcelDataRegister","readExcel","nextStep","prevStep","step","deleteExcelData","readPdf","pdfMetaData","deletePdf","readImage","deleteImage","imageMetaData","excelData","errorList","excelFilename","setExcelFilename","pdfFilename","setPdfFilename","imageFileName","setImagefileName","cellInfo","available","isLastStage","uploadExcel","ExcelDataRegisterContainer","setExcelData","pdfData","setPdfData","setPdfMetaData","thumbnails","setThumbnails","thumbnailMetaData","setThumbnailMetaData","setErrorList","setStep","getfileSize","floor","pow","toFixed","toNextStep","pdf","thumbnaiil","upload","_pdfData","_pdfMetaData","pdf_file_name","normalize","_obj","firstSheet","getFirstSheet","copySheetForCheck","checkCorrectFormat","cells","parseHeaderAndRow","errList","checkErrorFields","_exelData","XLSX","utils","sheet_to_json","defval","readAsBinaryString","regiExcel","_newPdfData","_newPdfMetaData","_thumbnails","_thumbnailMetaData","thumbnail_file_name","_newThumbnails","thumbnail","_newThumbnailMetaData","thumbnailmeta","CELL_OBJECT_TYPE","n","s","d","DATA_TYPE","EXCEL_SCHEMA","dc_domain","isRequired","doc_modify_date","doc_original_summary","doc_poject","validate","isValid","pop","fileName","excelFile","read","cellDates","sheetName","SheetNames","Sheets","sheet","removeUnusedFiled","columnRegex","rowRegex","cellName","column","headerName","hasOwnProperty","t","headerCellNames","schemaNames","requiredFieldNames","key","values","fieldName","field","columnName","find","rowNumber","AddUserWrap","UserManagement","userData","openUserModifyModal","deleteUser","restrictUser","openUserAddModal","CreateAt","UserManagementContainer","setUserData","deleteUserByIdApi","restrict","restrictUserApi","TitleCard","subtitle","DocumentStatCard","countryDocumentData","country","collect","screening","refine","register","UserSelectCard","currentUserIdHandler","setCurrentUserId","userList","setUserList","StatContainer","WorkStatCard","workAllLogData","workAllStatusHandler","workAllStatus","ChartCard","MenuItem","ProcessMenu","processHandler","_processHandler","DateRangeContainer","DateRange","dateRangeHandler","Map","getCountryMapChartData","useLayoutEffect","root","am5","new","setThemes","am5themes_Animated","chart","container","am5map","projection","polygonSeries","series","geoJSON","am5geodata_worldLow","geodataNames","am5geodata_lang_KO","exclude","mapPolygons","template","setAll","tooltipText","interactive","states","fill","stroke","events","ev","dataItem","dataContext","zoomToDataItem","hide","show","set","dispose","LineGraph","lineGraphData","duration","divName","graphDuration","setGraphDuration","am5xy","panX","panY","wheelX","wheelY","layout","verticalLayout","maxTooltipDistance","yAxis","yAxes","extraMax","maxDeviation","extraTooltipPrecision","renderer","xAxis","xAxes","baseInterval","timeUnit","minGridDistance","valueYField","valueXField","tooltip","bullets","sprite","radius","strokes","lineY","getPrivate","y","positionToDate","positionToValue","orientation","Duration","setDuration","currentDuration","setCurrentDuration","currentDurationHandler","CountryContentWrapper","TabButton","CrawlFileTypeWrapper","CrawlFileTypeStatCard","CrawlStatusTable","LineGraphOnlyOneWrapper","LineGraphWrapper","Dashboard","countryPieChartData","menuType","menuHandler","rowClickHandler","crawlHostList","selectedHostId","currentCrawlHostLog","crawlSum","curationWorkModalOpen","curationWorkList","userWorkAllData","processTitle","crawlCountSort","top","right","bottom","left","innerRadius","padAngle","cornerRadius","activeOuterRadiusOffset","borderWidth","borderColor","modifiers","arcLinkLabelsSkipAngle","arcLinkLabelsTextColor","arcLinkLabelsThickness","colors","scheme","arcLinkLabelsColor","arcLabelsSkipAngle","arcLabelsTextColor","defs","background","padding","stagger","rotation","lineWidth","spacing","legends","anchor","direction","translateX","translateY","itemsSpacing","itemWidth","itemHeight","itemTextColor","itemDirection","itemOpacity","symbolSize","symbolShape","effects","ES_ID","DT","QUALITY","CONTENT_BEF","CONTENT_CUR","html","word","excel","ppt","etc","rowSpan","colSpan","job_id","host","created_at","fontWeight","toUpperCase","start_time","end_time","DashboardContainer","setMenuType","setCrawlHostList","setCurrentCrawlHostLog","setSelectedHostId","setCrawlSum","setProcess","currentUserId","setLineGraphData","setCurationWorkList","setUserWorkAllData","setCountryPieChartData","setCountryDocumentData","setWorkAllLogData","setWorkAllStatus","sortDataType","setSortDataType","graphDataCleansing","cnt","_getUserWorkAllLog","_rawData","_tmp","getUserWorkAllLog","screeningResult","refineResult","registerResult","curationResult","pieChartDataCleansing","_pieChart","random","toString","countryName","_collect","_screening","_refine","_register","_curation","_data","wid","getUserWorkLog","getCurationWorkList","reverse","sortResult","CategoryContainer","AddCategoryContainer","CategoryHeader","AddItem","ViewItem","EditItem","CategoryManagement","typeHandler","editableCode","editCategoryName","categoryEdit","categoryEditConfirm","categoryEditCancel","onChangeEditInput","onChangeAddInput","categoryAdd","categoryDelete","CATEGOROY_CODE_LIST","categoryName","정책분류","유형분류","국가분류","언어","토픽분류","기관맞춤형분류","CategoryManagementContainer","setEditableCode","addCategoryName","setAddCategoryName","setEditCategoryName","setType","ct_nm","categoryItemEditApi","categoryItemAddApi","categoryItemDeleteApi","LineBox","DictionaryFunctionWrapper","DictionaryFunctionBtnWrapper","DictonaryDataTable","FilterWrapper","HostRegisterContainer","HostManagement","currentHostList","filterOpen","_filterOpenHandler","_filterInputsHandler","_registerHostOpenHandler","filterSearch","selectedHost","excelDownload","excelUpload","hostRegisterUpload","_hostPublisherHandler","_hostWorkCycleHandler","hostWorkCycle","hostPublisher","nextrendSync","hostTestList","lang","workCycle","idx","HostManagementContainer","setCurrentHostList","setSelectedHost","filterInputs","setFilterInputs","setFilterOpen","setHostPublisher","setHostWorkCycle","_arr","LANG","COUNTRY","CATEGORY","WORK_CYCLE","_result","book","book_new","_hostArray","aoa_to_sheet","book_append_sheet","writeFile","_excelData","eachHostModify","hostSyncApi","ShortSearchBar","DataAddContainer","MultilingualDictionary","dataAddOpen","dataAddOpenHandler","currentWordData","editWordIndex","editWordData","editWordOpen","editWordCancel","editWordHandler","saveWord","deleteWord","search","addWord","addWordDataHandler","wordDataUpload","wordDataDownload","MULTI_TEXT","MultilingualDictionaryContainer","wordData","setWordData","setCurrentWordData","setDataAddOpen","setEditWordIndex","setEditWordData","addWordData","setAddWordData","multi_text","slice","flat","Infinity","PreviewMenuWrapper","MenuCustomCard","SaveButton","UserListCard","UserCard","AxisCardWrapper","AxisCard","UserCustomMenu","onClickUser","openCategoryModal","previewAxisMenu","axisCategoryInfo","saveUserAxisData","UserCustomMenuContainer","setCurrentAxis","existingUserCategories","setExistingUserCategories","setAxisCategoryInfo","setPreviewAxisMenu","previewSetting","_userList","addCategories","xaxis","cid","yaxis","deleteCategories","existingCategory","PublicRoute","restricted","WorkerLayout","shallowEqual","Contents","UserLayout","App","ManagerSection","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","store","createStore","__REDUX_DEVTOOLS_EXTENSION__","ReactDOM","render","StrictMode","getElementById"],"mappings":"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","file":"static/js/main.8c49c46f.chunk.js","sourcesContent":["/**\n *\n * @param {Buffer} imageBuffer\n */\nexport const encodeBufferToBase64 = (imageBuffer) => {\n if (!imageBuffer) return \"\";\n return (\n \"data:image/jpg;base64, \" +\n Buffer.from(imageBuffer.data, \"utf-8\").toString(\"base64\")\n );\n};\n\nexport const getAddressRemovedPath = (imgPath) => {\n if (!imgPath) return null;\n if (imgPath.length > 18 && imgPath.substring(0, 18) === \"1.214.203.131:3330\")\n return imgPath.substring(18, imgPath.length);\n\n return imgPath;\n};\n","export const tailwindColors = {\n transparent: \"transparent\",\n black: \"#000000\",\n white: \"#ffffff\",\n red: \"#f44336\",\n \"red-50\": \"#ffebee\",\n \"red-100\": \"#ffcdd2\",\n \"red-200\": \"#ef9a9a\",\n \"red-300\": \"#e57373\",\n \"red-400\": \"#ef5350\",\n \"red-500\": \"#f44336\",\n \"red-600\": \"#e53935\",\n \"red-700\": \"#d32f2f\",\n \"red-800\": \"#c62828\",\n \"red-900\": \"#b71c1c\",\n \"red-100-accent\": \"#ff8a80\",\n \"red-200-accent\": \"#ff5252\",\n \"red-400-accent\": \"#ff1744\",\n \"red-700-accent\": \"#d50000\",\n pink: \"#e91e63\",\n \"pink-50\": \"#fce4ec\",\n \"pink-100\": \"#f8bbd0\",\n \"pink-200\": \"#f48fb1\",\n \"pink-300\": \"#f06292\",\n \"pink-400\": \"#ec407a\",\n \"pink-500\": \"#e91e63\",\n \"pink-600\": \"#d81b60\",\n \"pink-700\": \"#c2185b\",\n \"pink-800\": \"#ad1457\",\n \"pink-900\": \"#880e4f\",\n \"pink-100-accent\": \"#ff80ab\",\n \"pink-200-accent\": \"#ff4081\",\n \"pink-400-accent\": \"#f50057\",\n \"pink-700-accent\": \"#c51162\",\n purple: \"#9c27b0\",\n \"purple-50\": \"#f3e5f5\",\n \"purple-100\": \"#e1bee7\",\n \"purple-200\": \"#ce93d8\",\n \"purple-300\": \"#ba68c8\",\n \"purple-400\": \"#ab47bc\",\n \"purple-500\": \"#9c27b0\",\n \"purple-600\": \"#8e24aa\",\n \"purple-700\": \"#7b1fa2\",\n \"purple-800\": \"#6a1b9a\",\n \"purple-900\": \"#4a148c\",\n \"purple-100-accent\": \"#ea80fc\",\n \"purple-200-accent\": \"#e040fb\",\n \"purple-400-accent\": \"#d500f9\",\n \"purple-700-accent\": \"#aa00ff\",\n \"deep-purple\": \"#673ab7\",\n \"deep-purple-50\": \"#ede7f6\",\n \"deep-purple-100\": \"#d1c4e9\",\n \"deep-purple-200\": \"#b39ddb\",\n \"deep-purple-300\": \"#9575cd\",\n \"deep-purple-400\": \"#7e57c2\",\n \"deep-purple-500\": \"#673ab7\",\n \"deep-purple-600\": \"#5e35b1\",\n \"deep-purple-700\": \"#512da8\",\n \"deep-purple-800\": \"#4527a0\",\n \"deep-purple-900\": \"#311b92\",\n \"deep-purple-100-accent\": \"#b388ff\",\n \"deep-purple-200-accent\": \"#7c4dff\",\n \"deep-purple-400-accent\": \"#651fff\",\n \"deep-purple-700-accent\": \"#6200ea\",\n indigo: \"#3f51b5\",\n \"indigo-50\": \"#e8eaf6\",\n \"indigo-100\": \"#c5cae9\",\n \"indigo-200\": \"#9fa8da\",\n \"indigo-300\": \"#7986cb\",\n \"indigo-400\": \"#5c6bc0\",\n \"indigo-500\": \"#3f51b5\",\n \"indigo-600\": \"#3949ab\",\n \"indigo-700\": \"#303f9f\",\n \"indigo-800\": \"#283593\",\n \"indigo-900\": \"#1a237e\",\n \"indigo-100-accent\": \"#8c9eff\",\n \"indigo-200-accent\": \"#536dfe\",\n \"indigo-400-accent\": \"#3d5afe\",\n \"indigo-700-accent\": \"#304ffe\",\n blue: \"#2196f3\",\n \"blue-50\": \"#e3f2fd\",\n \"blue-100\": \"#bbdefb\",\n \"blue-200\": \"#90caf9\",\n \"blue-300\": \"#64b5f6\",\n \"blue-400\": \"#42a5f5\",\n \"blue-500\": \"#2196f3\",\n \"blue-600\": \"#1e88e5\",\n \"blue-700\": \"#1976d2\",\n \"blue-800\": \"#1565c0\",\n \"blue-900\": \"#0d47a1\",\n \"blue-100-accent\": \"#82b1ff\",\n \"blue-200-accent\": \"#448aff\",\n \"blue-400-accent\": \"#2979ff\",\n \"blue-700-accent\": \"#2962ff\",\n \"light-blue\": \"#03a9f4\",\n \"light-blue-50\": \"#e1f5fe\",\n \"light-blue-100\": \"#b3e5fc\",\n \"light-blue-200\": \"#81d4fa\",\n \"light-blue-300\": \"#4fc3f7\",\n \"light-blue-400\": \"#29b6f6\",\n \"light-blue-500\": \"#03a9f4\",\n \"light-blue-600\": \"#039be5\",\n \"light-blue-700\": \"#0288d1\",\n \"light-blue-800\": \"#0277bd\",\n \"light-blue-900\": \"#01579b\",\n \"light-blue-100-accent\": \"#80d8ff\",\n \"light-blue-200-accent\": \"#40c4ff\",\n \"light-blue-400-accent\": \"#00b0ff\",\n \"light-blue-700-accent\": \"#0091ea\",\n cyan: \"#00bcd4\",\n \"cyan-50\": \"#e0f7fa\",\n \"cyan-100\": \"#b2ebf2\",\n \"cyan-200\": \"#80deea\",\n \"cyan-300\": \"#4dd0e1\",\n \"cyan-400\": \"#26c6da\",\n \"cyan-500\": \"#00bcd4\",\n \"cyan-600\": \"#00acc1\",\n \"cyan-700\": \"#0097a7\",\n \"cyan-800\": \"#00838f\",\n \"cyan-900\": \"#006064\",\n \"cyan-100-accent\": \"#84ffff\",\n \"cyan-200-accent\": \"#18ffff\",\n \"cyan-400-accent\": \"#00e5ff\",\n \"cyan-700-accent\": \"#00b8d4\",\n teal: \"#009688\",\n \"teal-50\": \"#e0f2f1\",\n \"teal-100\": \"#b2dfdb\",\n \"teal-200\": \"#80cbc4\",\n \"teal-300\": \"#4db6ac\",\n \"teal-400\": \"#26a69a\",\n \"teal-500\": \"#009688\",\n \"teal-600\": \"#00897b\",\n \"teal-700\": \"#00796b\",\n \"teal-800\": \"#00695c\",\n \"teal-900\": \"#004d40\",\n \"teal-100-accent\": \"#a7ffeb\",\n \"teal-200-accent\": \"#64ffda\",\n \"teal-400-accent\": \"#1de9b6\",\n \"teal-700-accent\": \"#00bfa5\",\n green: \"#4caf50\",\n \"green-50\": \"#e8f5e9\",\n \"green-100\": \"#c8e6c9\",\n \"green-200\": \"#a5d6a7\",\n \"green-300\": \"#81c784\",\n \"green-400\": \"#66bb6a\",\n \"green-500\": \"#4caf50\",\n \"green-600\": \"#43a047\",\n \"green-700\": \"#388e3c\",\n \"green-800\": \"#2e7d32\",\n \"green-900\": \"#1b5e20\",\n \"green-100-accent\": \"#b9f6ca\",\n \"green-200-accent\": \"#69f0ae\",\n \"green-400-accent\": \"#00e676\",\n \"green-700-accent\": \"#00c853\",\n \"light-green\": \"#8bc34a\",\n \"light-green-50\": \"#f1f8e9\",\n \"light-green-100\": \"#dcedc8\",\n \"light-green-200\": \"#c5e1a5\",\n \"light-green-300\": \"#aed581\",\n \"light-green-400\": \"#9ccc65\",\n \"light-green-500\": \"#8bc34a\",\n \"light-green-600\": \"#7cb342\",\n \"light-green-700\": \"#689f38\",\n \"light-green-800\": \"#558b2f\",\n \"light-green-900\": \"#33691e\",\n \"light-green-100-accent\": \"#ccff90\",\n \"light-green-200-accent\": \"#b2ff59\",\n \"light-green-400-accent\": \"#76ff03\",\n \"light-green-700-accent\": \"#64dd17\",\n lime: \"#cddc39\",\n \"lime-50\": \"#f9fbe7\",\n \"lime-100\": \"#f0f4c3\",\n \"lime-200\": \"#e6ee9c\",\n \"lime-300\": \"#dce775\",\n \"lime-400\": \"#d4e157\",\n \"lime-500\": \"#cddc39\",\n \"lime-600\": \"#c0ca33\",\n \"lime-700\": \"#afb42b\",\n \"lime-800\": \"#9e9d24\",\n \"lime-900\": \"#827717\",\n \"lime-100-accent\": \"#f4ff81\",\n \"lime-200-accent\": \"#eeff41\",\n \"lime-400-accent\": \"#c6ff00\",\n \"lime-700-accent\": \"#aeea00\",\n yellow: \"#ffeb3b\",\n \"yellow-50\": \"#fffde7\",\n \"yellow-100\": \"#fff9c4\",\n \"yellow-200\": \"#fff59d\",\n \"yellow-300\": \"#fff176\",\n \"yellow-400\": \"#ffee58\",\n \"yellow-500\": \"#ffeb3b\",\n \"yellow-600\": \"#fdd835\",\n \"yellow-700\": \"#fbc02d\",\n \"yellow-800\": \"#f9a825\",\n \"yellow-900\": \"#f57f17\",\n \"yellow-100-accent\": \"#ffff8d\",\n \"yellow-200-accent\": \"#ffff00\",\n \"yellow-400-accent\": \"#ffea00\",\n \"yellow-700-accent\": \"#ffd600\",\n amber: \"#ffc107\",\n \"amber-50\": \"#fff8e1\",\n \"amber-100\": \"#ffecb3\",\n \"amber-200\": \"#ffe082\",\n \"amber-300\": \"#ffd54f\",\n \"amber-400\": \"#ffca28\",\n \"amber-500\": \"#ffc107\",\n \"amber-600\": \"#ffb300\",\n \"amber-700\": \"#ffa000\",\n \"amber-800\": \"#ff8f00\",\n \"amber-900\": \"#ff6f00\",\n \"amber-100-accent\": \"#ffe57f\",\n \"amber-200-accent\": \"#ffd740\",\n \"amber-400-accent\": \"#ffc400\",\n \"amber-700-accent\": \"#ffab00\",\n orange: \"#ff9800\",\n \"orange-50\": \"#fff3e0\",\n \"orange-100\": \"#ffe0b2\",\n \"orange-200\": \"#ffcc80\",\n \"orange-300\": \"#ffb74d\",\n \"orange-400\": \"#ffa726\",\n \"orange-500\": \"#ff9800\",\n \"orange-600\": \"#fb8c00\",\n \"orange-700\": \"#f57c00\",\n \"orange-800\": \"#ef6c00\",\n \"orange-900\": \"#e65100\",\n \"orange-100-accent\": \"#ffd180\",\n \"orange-200-accent\": \"#ffab40\",\n \"orange-400-accent\": \"#ff9100\",\n \"orange-700-accent\": \"#ff6d00\",\n \"deep-orange\": \"#ff5722\",\n \"deep-orange-50\": \"#fbe9e7\",\n \"deep-orange-100\": \"#ffccbc\",\n \"deep-orange-200\": \"#ffab91\",\n \"deep-orange-300\": \"#ff8a65\",\n \"deep-orange-400\": \"#ff7043\",\n \"deep-orange-500\": \"#ff5722\",\n \"deep-orange-600\": \"#f4511e\",\n \"deep-orange-700\": \"#e64a19\",\n \"deep-orange-800\": \"#d84315\",\n \"deep-orange-900\": \"#bf360c\",\n \"deep-orange-100-accent\": \"#ff9e80\",\n \"deep-orange-200-accent\": \"#ff6e40\",\n \"deep-orange-400-accent\": \"#ff3d00\",\n \"deep-orange-700-accent\": \"#dd2c00\",\n brown: \"#795548\",\n \"brown-50\": \"#efebe9\",\n \"brown-100\": \"#d7ccc8\",\n \"brown-200\": \"#bcaaa4\",\n \"brown-300\": \"#a1887f\",\n \"brown-400\": \"#8d6e63\",\n \"brown-500\": \"#795548\",\n \"brown-600\": \"#6d4c41\",\n \"brown-700\": \"#5d4037\",\n \"brown-800\": \"#4e342e\",\n \"brown-900\": \"#3e2723\",\n grey: \"#9e9e9e\",\n \"grey-50\": \"#fafafa\",\n \"grey-100\": \"#f5f5f5\",\n \"grey-200\": \"#eeeeee\",\n \"grey-300\": \"#e0e0e0\",\n \"grey-400\": \"#bdbdbd\",\n \"grey-500\": \"#9e9e9e\",\n \"grey-600\": \"#757575\",\n \"grey-700\": \"#616161\",\n \"grey-800\": \"#424242\",\n \"grey-900\": \"#212121\",\n \"blue-grey\": \"#607d8b\",\n \"blue-grey-50\": \"#eceff1\",\n \"blue-grey-100\": \"#cfd8dc\",\n \"blue-grey-200\": \"#b0bec5\",\n \"blue-grey-300\": \"#90a4ae\",\n \"blue-grey-400\": \"#78909c\",\n \"blue-grey-500\": \"#607d8b\",\n \"blue-grey-600\": \"#546e7a\",\n \"blue-grey-700\": \"#455a64\",\n \"blue-grey-800\": \"#37474f\",\n \"blue-grey-900\": \"#263238\",\n \"red-contrast\": \"white\",\n \"red-50-contrast\": \"black\",\n \"red-100-contrast\": \"black\",\n \"red-200-contrast\": \"black\",\n \"red-300-contrast\": \"black\",\n \"red-400-contrast\": \"black\",\n \"red-500-contrast\": \"white\",\n \"red-600-contrast\": \"white\",\n \"red-700-contrast\": \"white\",\n \"red-800-contrast\": \"white\",\n \"red-900-contrast\": \"white\",\n \"red-100-accent-contrast\": \"black\",\n \"red-200-accent-contrast\": \"white\",\n \"red-400-accent-contrast\": \"white\",\n \"red-700-accent-contrast\": \"white\",\n \"pink-contrast\": \"white\",\n \"pink-50-contrast\": \"black\",\n \"pink-100-contrast\": \"black\",\n \"pink-200-contrast\": \"black\",\n \"pink-300-contrast\": \"black\",\n \"pink-400-contrast\": \"black\",\n \"pink-500-contrast\": \"white\",\n \"pink-600-contrast\": \"white\",\n \"pink-700-contrast\": \"white\",\n \"pink-800-contrast\": \"white\",\n \"pink-900-contrast\": \"white\",\n \"pink-100-accent-contrast\": \"black\",\n \"pink-200-accent-contrast\": \"white\",\n \"pink-400-accent-contrast\": \"white\",\n \"pink-700-accent-contrast\": \"white\",\n \"purple-contrast\": \"white\",\n \"purple-50-contrast\": \"black\",\n \"purple-100-contrast\": \"black\",\n \"purple-200-contrast\": \"black\",\n \"purple-300-contrast\": \"white\",\n \"purple-400-contrast\": \"white\",\n \"purple-500-contrast\": \"white\",\n \"purple-600-contrast\": \"white\",\n \"purple-700-contrast\": \"white\",\n \"purple-800-contrast\": \"white\",\n \"purple-900-contrast\": \"white\",\n \"purple-100-accent-contrast\": \"black\",\n \"purple-200-accent-contrast\": \"white\",\n \"purple-400-accent-contrast\": \"white\",\n \"purple-700-accent-contrast\": \"white\",\n \"deep-purple-contrast\": \"white\",\n \"deep-purple-50-contrast\": \"black\",\n \"deep-purple-100-contrast\": \"black\",\n \"deep-purple-200-contrast\": \"black\",\n \"deep-purple-300-contrast\": \"white\",\n \"deep-purple-400-contrast\": \"white\",\n \"deep-purple-500-contrast\": \"white\",\n \"deep-purple-600-contrast\": \"white\",\n \"deep-purple-700-contrast\": \"white\",\n \"deep-purple-800-contrast\": \"white\",\n \"deep-purple-900-contrast\": \"white\",\n \"deep-purple-100-accent-contrast\": \"black\",\n \"deep-purple-200-accent-contrast\": \"white\",\n \"deep-purple-400-accent-contrast\": \"white\",\n \"deep-purple-700-accent-contrast\": \"white\",\n \"indigo-contrast\": \"white\",\n \"indigo-50-contrast\": \"black\",\n \"indigo-100-contrast\": \"black\",\n \"indigo-200-contrast\": \"black\",\n \"indigo-300-contrast\": \"white\",\n \"indigo-400-contrast\": \"white\",\n \"indigo-500-contrast\": \"white\",\n \"indigo-600-contrast\": \"white\",\n \"indigo-700-contrast\": \"white\",\n \"indigo-800-contrast\": \"white\",\n \"indigo-900-contrast\": \"white\",\n \"indigo-100-accent-contrast\": \"black\",\n \"indigo-200-accent-contrast\": \"white\",\n \"indigo-400-accent-contrast\": \"white\",\n \"indigo-700-accent-contrast\": \"white\",\n \"blue-contrast\": \"white\",\n \"blue-50-contrast\": \"black\",\n \"blue-100-contrast\": \"black\",\n \"blue-200-contrast\": \"black\",\n \"blue-300-contrast\": \"black\",\n \"blue-400-contrast\": \"black\",\n \"blue-500-contrast\": \"white\",\n \"blue-600-contrast\": \"white\",\n \"blue-700-contrast\": \"white\",\n \"blue-800-contrast\": \"white\",\n \"blue-900-contrast\": \"white\",\n \"blue-100-accent-contrast\": \"black\",\n \"blue-200-accent-contrast\": \"white\",\n \"blue-400-accent-contrast\": \"white\",\n \"blue-700-accent-contrast\": \"white\",\n \"light-blue-contrast\": \"white\",\n \"light-blue-50-contrast\": \"black\",\n \"light-blue-100-contrast\": \"black\",\n \"light-blue-200-contrast\": \"black\",\n \"light-blue-300-contrast\": \"black\",\n \"light-blue-400-contrast\": \"black\",\n \"light-blue-500-contrast\": \"white\",\n \"light-blue-600-contrast\": \"white\",\n \"light-blue-700-contrast\": \"white\",\n \"light-blue-800-contrast\": \"white\",\n \"light-blue-900-contrast\": \"white\",\n \"light-blue-100-accent-contrast\": \"black\",\n \"light-blue-200-accent-contrast\": \"black\",\n \"light-blue-400-accent-contrast\": \"black\",\n \"light-blue-700-accent-contrast\": \"white\",\n \"cyan-contrast\": \"white\",\n \"cyan-50-contrast\": \"black\",\n \"cyan-100-contrast\": \"black\",\n \"cyan-200-contrast\": \"black\",\n \"cyan-300-contrast\": \"black\",\n \"cyan-400-contrast\": \"black\",\n \"cyan-500-contrast\": \"white\",\n \"cyan-600-contrast\": \"white\",\n \"cyan-700-contrast\": \"white\",\n \"cyan-800-contrast\": \"white\",\n \"cyan-900-contrast\": \"white\",\n \"cyan-100-accent-contrast\": \"black\",\n \"cyan-200-accent-contrast\": \"black\",\n \"cyan-400-accent-contrast\": \"black\",\n \"cyan-700-accent-contrast\": \"black\",\n \"teal-contrast\": \"white\",\n \"teal-50-contrast\": \"black\",\n \"teal-100-contrast\": \"black\",\n \"teal-200-contrast\": \"black\",\n \"teal-300-contrast\": \"black\",\n \"teal-400-contrast\": \"black\",\n \"teal-500-contrast\": \"white\",\n \"teal-600-contrast\": \"white\",\n \"teal-700-contrast\": \"white\",\n \"teal-800-contrast\": \"white\",\n \"teal-900-contrast\": \"white\",\n \"teal-100-accent-contrast\": \"black\",\n \"teal-200-accent-contrast\": \"black\",\n \"teal-400-accent-contrast\": \"black\",\n \"teal-700-accent-contrast\": \"black\",\n \"green-contrast\": \"white\",\n \"green-50-contrast\": \"black\",\n \"green-100-contrast\": \"black\",\n \"green-200-contrast\": \"black\",\n \"green-300-contrast\": \"black\",\n \"green-400-contrast\": \"black\",\n \"green-500-contrast\": \"white\",\n \"green-600-contrast\": \"white\",\n \"green-700-contrast\": \"white\",\n \"green-800-contrast\": \"white\",\n \"green-900-contrast\": \"white\",\n \"green-100-accent-contrast\": \"black\",\n \"green-200-accent-contrast\": \"black\",\n \"green-400-accent-contrast\": \"black\",\n \"green-700-accent-contrast\": \"black\",\n \"light-green-contrast\": \"black\",\n \"light-green-50-contrast\": \"black\",\n \"light-green-100-contrast\": \"black\",\n \"light-green-200-contrast\": \"black\",\n \"light-green-300-contrast\": \"black\",\n \"light-green-400-contrast\": \"black\",\n \"light-green-500-contrast\": \"black\",\n \"light-green-600-contrast\": \"black\",\n \"light-green-700-contrast\": \"black\",\n \"light-green-800-contrast\": \"white\",\n \"light-green-900-contrast\": \"white\",\n \"light-green-100-accent-contrast\": \"black\",\n \"light-green-200-accent-contrast\": \"black\",\n \"light-green-400-accent-contrast\": \"black\",\n \"light-green-700-accent-contrast\": \"black\",\n \"lime-contrast\": \"black\",\n \"lime-50-contrast\": \"black\",\n \"lime-100-contrast\": \"black\",\n \"lime-200-contrast\": \"black\",\n \"lime-300-contrast\": \"black\",\n \"lime-400-contrast\": \"black\",\n \"lime-500-contrast\": \"black\",\n \"lime-600-contrast\": \"black\",\n \"lime-700-contrast\": \"black\",\n \"lime-800-contrast\": \"black\",\n \"lime-900-contrast\": \"white\",\n \"lime-100-accent-contrast\": \"black\",\n \"lime-200-accent-contrast\": \"black\",\n \"lime-400-accent-contrast\": \"black\",\n \"lime-700-accent-contrast\": \"black\",\n \"yellow-contrast\": \"black\",\n \"yellow-50-contrast\": \"black\",\n \"yellow-100-contrast\": \"black\",\n \"yellow-200-contrast\": \"black\",\n \"yellow-300-contrast\": \"black\",\n \"yellow-400-contrast\": \"black\",\n \"yellow-500-contrast\": \"black\",\n \"yellow-600-contrast\": \"black\",\n \"yellow-700-contrast\": \"black\",\n \"yellow-800-contrast\": \"black\",\n \"yellow-900-contrast\": \"black\",\n \"yellow-100-accent-contrast\": \"black\",\n \"yellow-200-accent-contrast\": \"black\",\n \"yellow-400-accent-contrast\": \"black\",\n \"yellow-700-accent-contrast\": \"black\",\n \"amber-contrast\": \"black\",\n \"amber-50-contrast\": \"black\",\n \"amber-100-contrast\": \"black\",\n \"amber-200-contrast\": \"black\",\n \"amber-300-contrast\": \"black\",\n \"amber-400-contrast\": \"black\",\n \"amber-500-contrast\": \"black\",\n \"amber-600-contrast\": \"black\",\n \"amber-700-contrast\": \"black\",\n \"amber-800-contrast\": \"black\",\n \"amber-900-contrast\": \"black\",\n \"amber-100-accent-contrast\": \"black\",\n \"amber-200-accent-contrast\": \"black\",\n \"amber-400-accent-contrast\": \"black\",\n \"amber-700-accent-contrast\": \"black\",\n \"orange-contrast\": \"black\",\n \"orange-50-contrast\": \"black\",\n \"orange-100-contrast\": \"black\",\n \"orange-200-contrast\": \"black\",\n \"orange-300-contrast\": \"black\",\n \"orange-400-contrast\": \"black\",\n \"orange-500-contrast\": \"black\",\n \"orange-600-contrast\": \"black\",\n \"orange-700-contrast\": \"black\",\n \"orange-800-contrast\": \"white\",\n \"orange-900-contrast\": \"white\",\n \"orange-100-accent-contrast\": \"black\",\n \"orange-200-accent-contrast\": \"black\",\n \"orange-400-accent-contrast\": \"black\",\n \"orange-700-accent-contrast\": \"black\",\n \"deep-orange-contrast\": \"white\",\n \"deep-orange-50-contrast\": \"black\",\n \"deep-orange-100-contrast\": \"black\",\n \"deep-orange-200-contrast\": \"black\",\n \"deep-orange-300-contrast\": \"black\",\n \"deep-orange-400-contrast\": \"black\",\n \"deep-orange-500-contrast\": \"white\",\n \"deep-orange-600-contrast\": \"white\",\n \"deep-orange-700-contrast\": \"white\",\n \"deep-orange-800-contrast\": \"white\",\n \"deep-orange-900-contrast\": \"white\",\n \"deep-orange-100-accent-contrast\": \"black\",\n \"deep-orange-200-accent-contrast\": \"black\",\n \"deep-orange-400-accent-contrast\": \"white\",\n \"deep-orange-700-accent-contrast\": \"white\",\n \"brown-contrast\": \"white\",\n \"brown-50-contrast\": \"black\",\n \"brown-100-contrast\": \"black\",\n \"brown-200-contrast\": \"black\",\n \"brown-300-contrast\": \"white\",\n \"brown-400-contrast\": \"white\",\n \"brown-500-contrast\": \"white\",\n \"brown-600-contrast\": \"white\",\n \"brown-700-contrast\": \"white\",\n \"brown-800-contrast\": \"white\",\n \"brown-900-contrast\": \"white\",\n \"grey-contrast\": \"black\",\n \"grey-50-contrast\": \"black\",\n \"grey-100-contrast\": \"black\",\n \"grey-200-contrast\": \"black\",\n \"grey-300-contrast\": \"black\",\n \"grey-400-contrast\": \"black\",\n \"grey-500-contrast\": \"black\",\n \"grey-600-contrast\": \"white\",\n \"grey-700-contrast\": \"white\",\n \"grey-800-contrast\": \"white\",\n \"grey-900-contrast\": \"white\",\n \"blue-grey-contrast\": \"white\",\n \"blue-grey-50-contrast\": \"black\",\n \"blue-grey-100-contrast\": \"black\",\n \"blue-grey-200-contrast\": \"black\",\n \"blue-grey-300-contrast\": \"black\",\n \"blue-grey-400-contrast\": \"white\",\n \"blue-grey-500-contrast\": \"white\",\n \"blue-grey-600-contrast\": \"white\",\n \"blue-grey-700-contrast\": \"white\",\n \"blue-grey-800-contrast\": \"white\",\n \"blue-grey-900-contrast\": \"white\",\n};\n\nexport const myColors = {\n blue100: \"#C8E2FF\",\n blue200: \"#4390F0\",\n blue300: \"#3381E9\",\n blue400: \"#0D72E3\",\n blue500: \"#043075\",\n\n skyblue: \"#4EC4FB\",\n\n red: \"#EB1839\",\n pink: \"#ff3287\",\n\n green100: \"#DAF3DB\",\n green200: \"#bdeabf\",\n green300: \"#009972\",\n\n purple: \"#6838e9\",\n\n yellow100: \"#FDF2CC\",\n yellow200: \"#fbe9a8\",\n yellow300: \"#FEDE50\",\n yellow400: \"#faca07\",\n\n orange: \"#EF8234\",\n};\n","import { tailwindColors } from \"./colors\";\n\nconst { createGlobalStyle } = require(\"styled-components\");\n\nexport const GlobalStyle = createGlobalStyle`\n*{margin:0;padding:0;font:inherit;color:inherit;}\n*, :after, :before {box-sizing:border-box;flex-shrink:0;}\n:root {-webkit-tap-highlight-color:transparent;-webkit-text-size-adjust:100%;text-size-adjust:100%;cursor:default;line-height:1.5;overflow-wrap:break-word;-moz-tab-size:4;tab-size:4}\nhtml, body {\n height:100%;\n color:${tailwindColors[\"grey-800\"]};\n}\nimg, picture, video, canvas, svg {display: block;max-width:100%;}\nbutton {background:none;border:0;cursor:pointer;}\na {text-decoration:none;}\ntable {border-collapse:collapse;border-spacing:0}\nul {list-style-type: none;}\n`;\n","import { myColors, tailwindColors } from \"./colors\";\n\nconst screenSize = {\n mobile_s: \"320px\",\n mobile_m: \"375px\",\n mobile_l: \"425px\",\n tablet: \"768px\",\n laptop: \"1024px\",\n laptop_l: \"1440px\",\n};\n\nexport const theme = {\n base: tailwindColors,\n \"base-100\": tailwindColors.white,\n \"base-200\": tailwindColors[\"grey-200\"],\n \"base-300\": tailwindColors[\"grey-300\"],\n \"base-400\": tailwindColors[\"grey-400\"],\n \"base-500\": tailwindColors[\"grey-500\"],\n \"base-content\": tailwindColors[\"grey-900\"],\n\n primary: myColors.blue400,\n \"primary-focus\": myColors.blue500,\n \"primary-content\": tailwindColors.white,\n\n secondary: tailwindColors,\n \"secondary-focus\": tailwindColors,\n \"secondary-content\": tailwindColors,\n\n accent: tailwindColors,\n \"accent-focus\": tailwindColors,\n \"accent-content\": tailwindColors,\n\n info: tailwindColors,\n \"info-focus\": tailwindColors,\n \"info-content\": tailwindColors,\n\n success: tailwindColors,\n \"success-focus\": tailwindColors,\n \"success-content\": tailwindColors,\n\n warning: tailwindColors,\n \"warning-focus\": tailwindColors,\n \"warning-content\": tailwindColors,\n\n error: tailwindColors,\n \"error-focus\": tailwindColors,\n \"error-content\": tailwindColors,\n\n mobile_s: `(max-width : ${screenSize.mobile_s})`,\n mobile_m: `(max-width : ${screenSize.mobile_m})`,\n mobile_l: `(max-width : ${screenSize.mobile_l})`,\n tablet: `(max-width : ${screenSize.tablet})`,\n laptop: `(max-width : ${screenSize.laptop})`,\n laptop_l: `(max-width : ${screenSize.laptop_l})`,\n};\n","const SET_LOGIN = \"login/SET_LOGIN\";\nconst SET_LOGOUT = \"login/SET_LOGOUT\";\n\n/* \n token - 로그인한 유저의 token 정보\n refreshToken - 로그인한 유저의 refreshToken 정보. \n 여기서 refreshToken은 로그인 연장에 사용함.\n token 만료 시 refreshToken만료 검사\n refreshToken이 만료되지 않았다면 로그인 연장.\n refreshToken이 만료되었다면 로그아웃 후 재로그인 요청\n*/\n/* \n 로그아웃 에서 일반 로그아웃과 세션만료 로그아웃을 구분함.\n normal_logout - 일반 로그아웃\n expired_logout - 세션 만료 로그아웃\n*/\n\nexport const setLogin = (tokens) => ({ type: SET_LOGIN, tokens });\nexport const setLogout = (logout_type) => ({ type: SET_LOGOUT, logout_type });\n\nconst initialState = {\n isLogin: !!localStorage.getItem(\"token\"), // 로그인 상태를 담고 있는 state\n};\n\nexport default function login(state = initialState, action) {\n switch (action.type) {\n case SET_LOGIN:\n const _token = action.tokens.token;\n const _refreshToken = action.tokens.refreshToken;\n localStorage.setItem(\"token\", _token);\n localStorage.setItem(\"refreshToken\", _refreshToken);\n return {\n ...state,\n isLogin: true,\n };\n\n case SET_LOGOUT:\n const _type = action.logout_type;\n if (_type === \"NORMAL_LOGOUT\") {\n alert(\"성공적으로 로그아웃 되었습니다.\");\n } else if (_type === \"EXPIRED_LOGOUT\") {\n alert(\"세션이 만료되어 로그아웃 되었습니다.\");\n }\n localStorage.removeItem(\"token\"); // 로컬스토리지에서 데이터 삭제\n localStorage.removeItem(\"refreshToken\"); // 로컬스토리지에서 데이터 삭제\n window.location.href = \"/\";\n return {\n ...state,\n isLogin: false,\n };\n default:\n return state;\n }\n}\n\n/* \n 로그인 처리 관련 함수를 여기서 모두 관리하도록 할 예정.\n 로그인 처리 함수가 흩어져 있으면 보기가 어려움 ...\n action 함수가 state 관리를 위해서 있는 거긴 한데 \n 여기에서 localStorage 접근을 좀 해야겠음..\n*/\n\n/* \n 로그인을 하면 로컬스토리지에 token값과 refreshToken 값을 저장하며 , \n 저장한 token값은 서버와 통신을 할 때 로그인 유효 여부를 판단하기 위해 사용한다.\n\n 저장한 token값은 로그아웃을 하지 않는 이상 localStorage에서 삭제되지 않지만,\n 통신 과정에서 token값이 유효하지 않거나 만료되었다면 서버에서 401에러를 반환한다.\n \n 이 401 인증실패 에러를 받았다면 로그아웃 처리 하고 재로그인을 하도록 유도한다. \n\n 그리고 프론트엔드 에서는 토큰 외의 유저 정보를 따로 저장하지 않아도 된다. \n\n 사용자가 로그인을 했을 때, 백엔드에서 해당 유저에 대한 토큰을 생성하고, \n 그 때 로그인한 유저에 대한 정보를 전역으로 관리하도록 한다. \n\n 프론트엔드에서 통신할 때 헤더로 보내는 토큰을 백엔드에서 받아 \n 1. 토큰의 유효성 검사 => 유효하지 않거나 만료되었을 경우 401 에러 반환\n 2. 로그인한 사용자에 대한 정보를 전역에서 가져와서 사용함. (post요청 등... DB에 무언갈르 기록할 일이 있을 때.)\n*/\n\n/* \n 로컬스토리지에 token key에 대한 value가 존재한다면 true값을 반환하며,\n 로컬스토리지에 token key에 대한 value가 undefined 이거나 null .. 등 falsy한 값을 가지면 false를 반환한다 (!! 연산자)\n*/\n","const SET_MODAL = \"modal/SET_MODAL\";\nconst SET_MODAL_DATA = \"modal/SET_MODAL_DATA\";\nconst CLEAR_AXIS_CATEGORY = \"modal/CLEAR_AXIS_CATEGORY\";\nconst SET_CATEGORY_MODAL_TYPE = \"modal/SET_CATEGORY_MODAL_TYPE\";\n\nexport const setModal = (modalType) => ({ type: SET_MODAL, modalType });\nexport const setModalData = (modalData, dataType) => ({\n type: SET_MODAL_DATA,\n modalData,\n dataType,\n});\nexport const clearCategoryData = () => ({ type: CLEAR_AXIS_CATEGORY });\nexport const setCategoryModalType = (categoryModalType) => ({\n type: SET_CATEGORY_MODAL_TYPE,\n categoryModalType,\n});\nconst initialState = {\n modalType: null,\n categoryModalType: null,\n modalData: {\n doc_country:[],\n doc_publish_country:[],\n doc_category:[],\n doc_content_category:[],\n doc_content_type:[],\n doc_custom:[],\n doc_language:[],\n doc_topic:[],\n doc_host:null, // host와 publisher 를 동시에 담는 객체\n\n modal_user: [],\n axis_category:null,\n curation_work_content:\"\", // 큐레이션 작업 내용을 저장하는 변수\n },\n};\n\nexport default function modal(state = initialState, action) {\n switch (action.type) {\n case SET_MODAL:\n return {\n ...state,\n modalType: action.modalType,\n };\n case SET_MODAL_DATA:\n const _modalData = { ...state.modalData };\n _modalData[action.dataType] = action.modalData;\n return {\n ...state,\n modalData: _modalData,\n };\n case CLEAR_AXIS_CATEGORY:\n _modalData[action.axis_category] = null;\n return {\n ...state,\n modalData: _modalData,\n };\n case SET_CATEGORY_MODAL_TYPE:\n return {\n ...state,\n categoryModalType: action.categoryModalType,\n };\n default:\n return state;\n }\n}\n","const SET_USER = \"user/SET_USER\";\n\nexport const setUser = (user) => ({ type: SET_USER, user });\n\nconst initialState = {\n user: null, // 로그인한 유저의 정보를 담고 있는 state`\n};\n\nexport default function user(state = initialState, action) {\n switch (action.type) {\n case SET_USER:\n return {\n ...state,\n user: action.user,\n };\n\n default:\n return state;\n }\n}\n\n/* \n 그리고 프론트엔드 에서는 토큰 외의 유저 정보를 따로 저장하지 않아도 된다. \n\n 사용자가 로그인을 했을 때, 백엔드에서 해당 유저에 대한 토큰을 생성하고, \n 그 때 로그인한 유저에 대한 정보를 전역으로 관리하도록 한다. \n\n 프론트엔드에서 통신할 때 헤더로 보내는 토큰을 백엔드에서 받아 \n 1. 토큰의 유효성 검사 => 유효하지 않거나 만료되었을 경우 401 에러 반환\n 2. 로그인한 사용자에 대한 정보를 전역에서 가져와서 사용함. (post요청 등... DB에 무언갈르 기록할 일이 있을 때.)\n*/\n","const SET_AXIS = \"custom/SET_AXIS\";\n\nexport const setAxis = (axisObj) => ({ type: SET_AXIS, axisObj });\n\nconst initialState = {\n axisObj: { X: null, Y: null }, // 사용자의 커스텀 메뉴 정보를 담고있는 객체\n};\n\nexport default function user(state = initialState, action) {\n switch (action.type) {\n case SET_AXIS:\n return {\n ...state,\n axisObj: action.axisObj,\n };\n\n default:\n return state;\n }\n}\n\nconst SET_EDITING_AXIS = \"custom/SET_EDITING_AXIS\";\nconst SET_EDITING_AXIS_DATA = \"custom/SET_EDITING_AXIS_DATA\";\n\nconst initialEdittingAxis = {\n X: null,\n Y: null,\n selected: null,\n}; // 사용자의 커스텀 메뉴 정보를 담고있는 객체\nexport const setEditingAxisData = (axis, axisType) => ({\n type: SET_EDITING_AXIS_DATA,\n axis,\n axisType,\n});\n\nexport const setEditingAxis = (axis) => ({\n type: SET_EDITING_AXIS,\n axis,\n});\nexport const editingAxis = (state = initialEdittingAxis, action) => {\n switch (action.type) {\n case SET_EDITING_AXIS:\n return {\n ...state,\n selected: action.axis,\n };\n case SET_EDITING_AXIS_DATA:\n return {\n ...state,\n [action.axis]: action.axisType,\n };\n default:\n return state;\n }\n};\n\nconst SET_AXIS_MENU_DATA = \"custom/SET_AXIS_MENU_DATA\";\n\nexport const setAxisMenuData = (axis, axisMenuData) => ({\n type: SET_AXIS_MENU_DATA,\n axis,\n axisMenuData,\n});\n\nconst initialAxisMenuData = {\n X: [],\n Y: [],\n};\n\nexport const axisMenuData = (state = initialAxisMenuData, action) => {\n switch (action.type) {\n case SET_AXIS_MENU_DATA:\n return {\n ...state,\n [action.axis]: action.axisMenuData,\n };\n default:\n return state;\n }\n};\n","const OPEN_SIDEBAR = \"sidebar/OPEN_SIDEBAR\";\nconst CLOSE_SIDEBAR = \"sidebar/CLOSE_SIDEBAR\";\n\nexport const openSidebar = () => ({ type: OPEN_SIDEBAR, width: \"280px\" });\nexport const closeSidebar = () => ({ type: CLOSE_SIDEBAR, width: 0 });\n\nconst initialState = {\n width: \"280px\", // 사용자의 커스텀 메뉴 정보를 담고있는 객체\n opened: true,\n};\n\nexport const sidebar = (state = initialState, action) => {\n const { type, width } = action;\n switch (type) {\n case OPEN_SIDEBAR:\n return {\n ...state,\n width,\n opened: true,\n };\n\n case CLOSE_SIDEBAR:\n return {\n ...state,\n width,\n opened: false,\n };\n\n default:\n return state;\n }\n};\n","import { combineReducers } from \"redux\";\n\nimport login from \"./login\";\nimport modal from \"./modal\";\nimport user from \"./user\";\nimport custom, { editingAxis, axisMenuData } from \"./custom\";\nimport { sidebar } from \"./sidebar\";\n\nconst rootReducer = combineReducers({\n login,\n modal,\n user,\n custom,\n editingAxis,\n sidebar,\n axisMenuData,\n});\n\nexport default rootReducer;\n","import { useEffect } from \"react\";\nimport { useLocation } from \"react-router-dom\";\n\nexport default function ScrollToTop() {\n const { pathname } = useLocation();\n useEffect(() => {\n window.scrollTo(0, 0);\n }, [pathname]);\n\n\n return null;\n}\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { useDispatch } from \"react-redux\";\nimport { setLogout } from \"../Modules/login\";\nimport { useHistory } from \"react-router-dom\";\nimport { myColors, tailwindColors } from \"styles/colors\";\n\nfunction Header({ name, logo }) {\n const dispatch = useDispatch();\n const history = useHistory();\n\n const go메인페이지 = () => {\n history.push(\"/home\");\n };\n\n const logout = () => {\n dispatch(setLogout(\"NORMAL_LOGOUT\"));\n };\n return (\n \n \n \n \n

{name}

\n

님 안녕하세요.

\n \n
\n
\n
\n );\n}\n\nconst HeaderContainer = styled.header`\n position: fixed; // 상단고정\n z-index: 999; // 맨 위에\n display: flex;\n flex-direction: row;\n align-items: center;\n width: 100%;\n height: 6rem;\n background-color: ${tailwindColors.white};\n box-shadow: rgba(99, 99, 99, 0.3) 0px 0px 8px 0px;\n\n @media ${(props) => props.theme.mobile_l} {\n height: 4rem;\n }\n`;\n\nconst ContentWrapper = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n height: 100%;\n padding: 1rem 3rem;\n overflow: hidden;\n\n @media ${(props) => props.theme.tablet} {\n padding: 1rem 1rem;\n }\n\n @media ${(props) => props.theme.mobile_l} {\n padding: 0.5rem 1rem;\n justify-content: center;\n }\n`;\n\nconst Logo = styled.img`\n height: 100%;\n object-fit: contain;\n cursor: pointer;\n`;\n\nconst LoginInfo = styled.div`\n display: flex;\n flex-direction: row;\n align-items: center;\n .userName {\n font-weight: bold;\n }\n button {\n margin-left: 1rem;\n height: 2rem;\n border: none;\n padding: 0 1rem 0 1rem;\n background-color: ${myColors.blue500};\n color: ${tailwindColors.white};\n font-weight: bold;\n cursor: pointer;\n }\n\n @media ${(props) => props.theme.mobile_l} {\n display: none;\n }\n`;\nexport default Header;\n","import React from \"react\";\nimport styled from \"styled-components\";\n\nfunction MainPage() {\n return (\n \n

Nextrend.kr 임시 메인페이지. 이 곳에 페이지 메인 기능 설명

\n \n
\n );\n}\n\nconst Wrapper = styled.div`\n width: 90%;\n margin: 0 auto;\n`;\nexport default MainPage;\n","export const PERMISSON_DATA = {\n 0: \"사용자\",\n 1: \"스크리닝 작업자\",\n 2: \"정제 작업자\",\n 3: \"등록 작업자\",\n 4: \"큐레이션 작업자\",\n 9: \"관리자\",\n};\n","import React, { useEffect, useRef, useState } from \"react\";\nimport styled from \"styled-components\";\nimport { NavLink } from \"react-router-dom\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport {\n BsFillCaretDownFill,\n BsTable,\n BsBarChart,\n BsEye,\n BsFileEarmarkDiff,\n BsInboxes,\n BsSave,\n BsJournals,\n BsTranslate,\n BsFillDiagram3Fill,\n BsPersonLinesFill,\n BsRulers,\n} from \"react-icons/bs\";\nimport { BiLogOut } from \"react-icons/bi\";\nimport { AiOutlineRobot } from \"react-icons/ai\";\nimport { FaAngleDoubleLeft } from \"react-icons/fa\";\n\nimport { setLogout } from \"Modules/login\";\nimport { closeSidebar } from \"Modules/sidebar\";\nimport { myColors, tailwindColors } from \"styles/colors\";\nimport { PERMISSON_DATA } from \"Data/permission\";\n\nexport const SideMenuBar = ({ permission, name }) => {\n const sidebarWidth = useSelector((state) => state.sidebar.width);\n const dispatch = useDispatch();\n const logout = () => dispatch(setLogout(\"NORMAL_LOGOUT\"));\n\n return (\n \n
\n dispatch(closeSidebar())}>\n \n \n
\n \n \n \n \n {name}님\n 안녕하세요.\n \n \n
\n
\n \n {PERMISSON_DATA[permission] === \"관리자\" && (\n <>\n \n \n \n )}\n \n <>\n {PERMISSON_DATA[permission] !== \"사용자\" &&\n PERMISSON_DATA[permission] !== \"정제 작업자\" && (\n \n )}\n {PERMISSON_DATA[permission] !== \"사용자\" && (\n \n )}\n {PERMISSON_DATA[permission] !== \"사용자\" &&\n PERMISSON_DATA[permission] !== \"정제 작업자\" && (\n \n )}\n {(PERMISSON_DATA[permission] === \"관리자\" ||\n PERMISSON_DATA[permission] === \"큐레이션 작업자\") && (\n \n )}\n {(PERMISSON_DATA[permission] === \"관리자\" ||\n PERMISSON_DATA[permission] === \"큐레이션 작업자\") && (\n \n )}\n \n \n \n {PERMISSON_DATA[permission] === \"관리자\" && (\n <>\n \n \n \n \n )}\n \n \n {PERMISSON_DATA[permission] === \"관리자\" && (\n <>\n \n \n \n )}\n \n \n \n );\n};\n\nconst Container = styled.aside`\n position: fixed;\n z-index: 100;\n display: flex;\n flex-direction: column;\n width: ${(props) => props.width ?? \"280px\"};\n height: 100vh;\n background-color: ${tailwindColors.white};\n box-shadow: rgba(99, 99, 99, 0.3) 0px 0px 8px 0px;\n overflow: hidden;\n transition: width 0.5s;\n`;\n\nconst SidebarCloseButton = styled.button`\n align-self: flex-end;\n padding: 0.5rem;\n color: ${tailwindColors[\"grey-600\"]};\n`;\n\nconst Header = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n width: 280px;\n height: 18%;\n\n border-bottom: 1px solid ${tailwindColors[\"grey-300\"]};\n & > div {\n display: flex;\n flex-direction: column;\n width: 100%;\n padding: 1rem;\n }\n`;\n\nconst Logo = styled.img`\n margin-bottom: 1rem;\n`;\n\nconst LoginInfo = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n font-size: 0.875rem;\n font-weight: bold;\n color: ${tailwindColors[\"grey-600\"]};\n\n & > span:first-of-type {\n color: ${tailwindColors[\"grey-800\"]};\n }\n\n & button {\n display: flex;\n align-items: center;\n gap: 0.2rem;\n color: ${tailwindColors[\"grey-800\"]};\n transition: color 0.2s;\n\n :hover {\n color: ${myColors.red};\n }\n }\n`;\n\nconst MenuList = styled.ul`\n height: 82%;\n overflow-y: auto;\n padding-bottom: 4rem;\n & > * + * {\n border-top: 1px solid ${tailwindColors[\"grey-300\"]};\n }\n & > *:last-child {\n border-bottom: 1px solid ${tailwindColors[\"grey-300\"]};\n }\n`;\n\n// <----- start of MenuGroup ----->\n\nexport const MenuGroup = ({ title, children }) => {\n const [open, setOpen] = useState(true);\n const [height, setHeight] = useState(0);\n\n const ref = useRef();\n\n useEffect(() => {\n console.log(ref.current.offsetHeight);\n setHeight(ref.current.offsetHeight);\n }, []);\n\n const toggleGroup = () => {\n setOpen((prev) => !prev);\n };\n\n return (\n \n
\n \n

{title}

\n
\n \n {children}\n \n
\n );\n};\n\nconst MenuGroupContainer = styled.div`\n & > div {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 1rem;\n color: ${tailwindColors[\"grey-800\"]};\n cursor: pointer;\n\n :hover {\n color: ${myColors.blue300};\n }\n\n svg {\n transition: transform 0.2s;\n transform: ${(props) => !props.open && \"rotate(-90deg)\"};\n }\n\n h3 {\n font-weight: bold;\n user-select: none;\n }\n }\n`;\n\nconst MenuGroupList = styled.ul`\n display: flex;\n flex-direction: column;\n max-height: ${(props) => (props.open ? \"100vh\" : \"0\")};\n overflow: hidden;\n transition: all 0.2s linear;\n`;\n\n// <----- end of MenuGroup ----->\n\n// <----- start of Menu ----->\n\n/**\n *\n * @param {import(\"react-icons\").IconType} Icon\n * @param {string} name\n * @param {string} to\n * @returns\n */\nconst Menu = ({ to, name, Icon }) => {\n return (\n \n \n \n {name}\n \n \n );\n};\n\nconst MenuContainer = styled.li`\n cursor: pointer;\n`;\n\nconst MenuLink = styled(NavLink)`\n display: flex;\n align-items: center;\n gap: 0.625rem;\n width: 100%;\n padding: 1rem 1.5rem;\n font-weight: bold;\n color: ${tailwindColors[\"grey-800\"]};\n transition: all 0.2s;\n\n &:hover {\n background-color: ${myColors.blue100};\n }\n\n &.active {\n background-color: ${myColors.blue400};\n color: ${tailwindColors.white};\n }\n`;\n\n// <----- end of Menu ----->\n","import React from \"react\";\nimport { useDispatch } from \"react-redux\";\nimport styled from \"styled-components\";\nimport { setLogout } from \"Modules/login\";\nimport { myColors, tailwindColors } from \"styles/colors\";\n\nfunction Footer() {\n const dispatch = useDispatch();\n\n const logout = () => {\n dispatch(setLogout(\"NORMAL_LOGOUT\"));\n };\n\n return (\n \n \n \n
회사명
\n
케이앤랩 (KNlab)
\n
\n \n
본사 소재지
\n
경상북도 구미시 대학로 61, 산학협력관 710호
\n
\n \n
기업부설연구소
\n
서울특별시 금천구 디지털로 121, 에이스가산타워 601-1호
\n
\n \n
Copyright ⓒ 케이엔랩 All rights reserved.
\n
\n 로그아웃\n
\n
\n );\n}\n\nconst Wrapper = styled.footer`\n width: 100%;\n padding: 2rem;\n background-color: ${myColors.blue500};\n color: white;\n\n @media ${(props) => props.theme.tablet} {\n padding: 1rem;\n }\n`;\n\nconst FooterContent = styled.div`\n width: 100%;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n\n @media ${(props) => props.theme.mobile_l} {\n flex-direction: column;\n align-items: center;\n text-align: center;\n gap: 0.5rem;\n }\n`;\n\nconst ContentWrapper = styled.div`\n display: flex;\n align-items: right;\n font-size: 14px;\n .title {\n max-width: 8rem;\n width: 100%;\n font-weight: bold;\n }\n\n @media ${(props) => props.theme.tablet} {\n flex-direction: column;\n align-items: center;\n text-align: center;\n }\n\n @media ${(props) => props.theme.mobile_l} {\n font-size: 12px;\n }\n`;\n\nconst LogoutButton = styled.button`\n display: none;\n width: 100%;\n padding: 0.5rem;\n background-color: ${tailwindColors[\"grey-700\"]};\n font-size: 14px;\n font-weight: bold;\n\n @media ${(props) => props.theme.mobile_l} {\n display: block;\n }\n`;\n\nexport default Footer;\n","const getToken = () => {\n if (!!localStorage.getItem(\"token\")) {\n return localStorage.getItem(\"token\");\n }\n};\nconst getRefreshToken = () => {\n if (!!localStorage.getItem(\"refreshToken\")) {\n return localStorage.getItem(\"refreshToken\");\n }\n};\n\nconst setTokens = (res) => {\n return new Promise((resolve, reject) => {\n localStorage.setItem(\"token\", res.data.token);\n localStorage.setItem(\"refreshToken\", res.data.refreshToken);\n resolve(null);\n });\n};\nexport { getToken, getRefreshToken, setTokens };\n","import axios from \"axios\";\nimport { getToken, getRefreshToken, setTokens } from \"./tokens\";\nimport { setUser } from \"../Modules/user\";\nimport { setLogout } from \"../Modules/login\";\n\n/* \n get 요청에서 headers와 params를 동시에 보내려면 아래와 같이 config 객체를 생성한 후 얘를 담아야 함\n https://stackoverflow.com/questions/48261227/use-axios-get-with-params-and-config-together\n */\n\n/* \n 로그인 상태가 아니라면 아래의 통신 함수들은 모두 사용할 일이 없음. \n 로그인에 성공하였다면 그 때 토큰을 받아와서 통신 때마다 토큰의 유효성을 검사함. \n*/\nconst headers = { authorization: `Bearer ${getToken()}` };\n\nconst refreshHeaders = {\n authorization: `Bearer ${getToken()}`,\n refresh: getRefreshToken(),\n};\n\nconst baseURL = `${process.env.REACT_APP_API_ENDPOINT}`;\n\n/**\n * -------------- 관리자 데이터 작업 관련 API <시작> -----------------\n */\n\n/* 크롤데이터 스크리닝 데이터 받아오기 */\nconst ScreeningDataFetchApi = (listSize, pageNo, isKeep, searchObj = null) => {\n let config = {\n headers: { authorization: `Bearer ${getToken()}` },\n params: {\n listSize: listSize,\n pageNo: pageNo,\n ...searchObj,\n },\n };\n if (isKeep) {\n config.params.keep = 1;\n }\n return axios.get(`${baseURL}/crawl/screening`, config);\n};\n\n/* 크롤데이터 스크리닝에서 정제 단계로 넘기기 */\nconst ScreeningDataStageApi = (stageDataList) => {\n const config = {\n headers: { authorization: `Bearer ${getToken()}` },\n };\n let body = {\n list: stageDataList,\n };\n return axios.put(`${baseURL}/crawl/screening`, body, config);\n};\n\n/* 크롤데이터 스크리닝 단계에서 보류하기 */\nconst ScreeningDataKeepApi = (keepDataList) => {\n const config = {\n headers: { authorization: `Bearer ${getToken()}` },\n };\n let body = {\n list: keepDataList,\n };\n return axios.post(`${baseURL}/crawl/screening`, body, config);\n};\n/* 크롤데이터 스크리닝 단계에서 버리기 */\nconst ScreeningDataDeleteApi = (deleteDataList) => {\n const config = {\n headers: { authorization: `Bearer ${getToken()}` },\n params: {\n list: deleteDataList,\n },\n };\n return axios.delete(`${baseURL}/crawl/screening`, config);\n};\n\n/* 크롤데이터 리스트 받아오기 */\nconst CrawlDataListFetchApi = (\n statusCode,\n listSize,\n pageNo,\n searchObj = null,\n general = false,\n query,\n isCrawled = null,\n) => {\n const params = {\n listSize,\n pageNo,\n general,\n query,\n is_crawled: isCrawled,\n ...searchObj,\n };\n const config = {\n headers: { authorization: `Bearer ${getToken()}` },\n params,\n };\n return axios.get(`${baseURL}/crawl/list/${statusCode}`, config);\n};\n\n/* 크롤데이터 버리기 */\nconst CrawlDataRejectApi = (_id, statusCode) => {\n const config = {\n headers: { authorization: `Bearer ${getToken()}` },\n params: {\n statusCode,\n },\n };\n return axios.delete(`${baseURL}/crawl/detail/${_id}`, config);\n};\n\n/* 크롤데이터 보류 하기*/\n\nconst CrawlDataKeepApi = (_id, statusCode) => {\n let body = {\n statusCode,\n };\n const config = {\n headers: { authorization: `Bearer ${getToken()}` },\n };\n return axios.put(`${baseURL}/crawl/detail/${_id}`, body, config);\n};\n/* 크롤데이터 넘기기*/\nconst CrawlDataStageApi = (statusCode, _id, docs) => {\n const body = {\n statusCode,\n _id,\n docs,\n cover_thumbnail: docs.cover_thumbnail,\n };\n const config = {\n headers: { authorization: `Bearer ${getToken()}` },\n };\n\n return axios.post(`${baseURL}/crawl/detail/${_id}`, body, config);\n};\n\nconst crawlDataUpdateApi = (statusCode, _id, docs) => {\n const body = {\n statusCode,\n _id,\n docs,\n cover_thumbnail: docs.cover_thumbnail,\n };\n const config = {\n headers: { authorization: `Bearer ${getToken()}` },\n };\n\n return axios.patch(`${baseURL}/crawl/detail/${_id}`, body, config);\n};\n\n/* 본문 이미지 첨부 후 url 받아오는 함수 */\nconst documentPastedImageApi = (imageForm) => {\n return axios.post(`${baseURL}/file/docImageAttach/`, imageForm, {\n headers: {\n \"Content-Type\": \"multipart/form-data\",\n },\n });\n};\n\nconst uploadExcelDataApi = (formData) => {\n return axios.post(`${baseURL}/file/uploadExcelData/`, formData, {\n headers: {\n \"Content-Type\": \"multipart/form-data\",\n authorization: `Bearer ${getToken()}`,\n },\n });\n};\n\nconst documentDetachImageApi = (_id) => {\n let config = {\n headers: { authorization: `Bearer ${getToken()}` },\n params: { _id },\n };\n return axios.get(`${baseURL}/file/docImageDetach/`, config);\n};\n\n/* 크롤데이터 상세조회에서 사용하는 통신 함수 */\nconst CrawlDataDetailFetchApi = (statusCode, _id) => {\n let config = {\n headers: { authorization: `Bearer ${getToken()}` },\n params: {\n statusCode: statusCode,\n },\n };\n return axios.get(`${baseURL}/crawl/detail/${_id}`, config);\n};\n\n/**\n * -------------- 관리자 데이터 작업 관련 API <끝> -----------------\n */\n\n/**\n * -------------- 로그인, 회원등록, 인증 <시작> -----------------\n */\n\n/* 로그인 할 때 사용하는 통신 함수 */\nconst LoginApi = async (userID, userPW) => {\n const body = {\n userID,\n userPW,\n };\n\n return axios.post(`${baseURL}/nextrend/login`, body);\n};\n\n/* 일반 token 만료 후 refreshToken 검증 하는 함수 */\n\nconst RefreshTokenApi = () => {\n const config = {\n headers: refreshHeaders,\n };\n return axios.get(`${baseURL}/nextrend/refresh`, config);\n};\n\n/* user 토큰 인증 및 유저 정보 가져오기 */\nconst userAuthApi = () => {\n let config = {\n headers: { authorization: `Bearer ${getToken()}` },\n };\n return axios.get(`${baseURL}/nextrend/user`, config);\n};\n\n/* 데이터 요청 시 토큰 만료 및 리프레시 토큰 만료 세션 처리 함수 */\nconst sessionHandler = (err, dispatch) => {\n /* dispatch 를 사용하기 위해서 인자로 받아옴 */\n return new Promise((resolve, reject) => {\n console.log(err);\n if (err.response.status === 401) {\n RefreshTokenApi()\n .then((res) => {\n setTokens(res);\n userAuthApi().then((res) => {\n dispatch(\n setUser({\n name: res.data.Name,\n permission: Number(res.data.Category),\n }),\n );\n resolve(\"세션유효\");\n });\n })\n .catch((err) => {\n if (err.response.status === 401) {\n dispatch(setLogout(\"EXPIRED_LOGOUT\"));\n }\n });\n }\n });\n};\n\n/**\n * -------------- 로그인, 회원등록, 인증 <끝> -----------------\n */\n\n/**\n * -------------- 사용자용 기능 <시작> -----------------\n */\n\n//사용자(고객)의 큐레이션, 아카이브 데이터 조회 api\nconst userCustomCurationDataFetchApi = (\n axis,\n listSize = 10,\n pageNo = 1,\n query = null,\n archive = null,\n) => {\n const general = query ? true : false;\n const config = {\n headers: { authorization: `Bearer ${getToken()}` },\n params: {\n axis,\n statusCode: archive ? 6 : 8,\n listSize,\n pageNo,\n query,\n general,\n },\n };\n return axios.get(`${baseURL}/nextrend/custom/search`, config);\n};\n\nconst curationRequestApi = (_id) => {\n const body = {\n statusCode: 6,\n _id,\n requested: true,\n docs: {},\n };\n const config = {\n headers: { authorization: `Bearer ${getToken()}` },\n };\n return axios.post(`${baseURL}/crawl/detail/${_id}`, body, config);\n};\n\n/**\n * -------------- 사용자용 기능 <끝> -----------------\n */\n\n/**\n * -------------- 관리자 카테고리 관리 <시작> -----------------\n */\n\n/* 대륙 리스트 전체 받아오는 함수 */\nconst ContinentsListDataFetchApi = () => {\n let config = {\n headers: { authorization: `Bearer ${getToken()}` },\n };\n return axios.get(`${baseURL}/nextrend/continents`, config);\n};\n\n/* 대륙 별 국가 리스트를 받아오는 함수 */\nconst CountrysListDataFetchApi = (continent) => {\n let config = {\n headers: { authorization: `Bearer ${getToken()}` },\n };\n\n return axios.get(`${baseURL}/nextrend/countrys/${continent}`, config);\n};\n\n/* 주제 분류 리스트를 받아오는 함수 */\nconst CategorysListDataFetchApi = (upperCode = null) => {\n let config = {\n headers: { authorization: `Bearer ${getToken()}` },\n params: { upperCode },\n };\n return axios.get(`${baseURL}/nextrend/categorys`, config);\n};\n\n/* 주제 분류 리스트를 모두 받아오는 함수 */\nconst CategoryOptionFetchApi = (type) => {\n let config = {\n headers: { authorization: `Bearer ${getToken()}` },\n params: { type },\n };\n return axios.get(`${baseURL}/nextrend/categorys/dict`, config);\n};\n\n/* 카테고리 데이터 받아오기 */\nconst categoryListFetchApi = (type, length, code = null) => {\n let config = {\n headers: { authorization: `Bearer ${getToken()}` },\n params: {\n type,\n length,\n code,\n },\n };\n return axios.get(`${baseURL}/nextrend/cat`, config);\n};\n/* 카테고리 추가하기 */\nconst categoryItemAddApi = (type, length, ct_nm, code = null) => {\n const body = {\n type,\n length,\n ct_nm,\n code,\n };\n const config = {\n headers: { authorization: `Bearer ${getToken()}` },\n };\n return axios.post(`${baseURL}/nextrend/cat`, body, config);\n};\n/* 카테고리 수정하기 */\nconst categoryItemEditApi = (type, code, ct_nm) => {\n let body = {\n type,\n code,\n ct_nm,\n };\n const config = {\n headers: { authorization: `Bearer ${getToken()}` },\n };\n return axios.put(`${baseURL}/nextrend/cat`, body, config);\n};\n/* 카테고리 삭제하기 */\nconst categoryItemDeleteApi = (type, code) => {\n const config = {\n headers: headers,\n params: {\n type,\n code,\n },\n };\n return axios.delete(`${baseURL}/nextrend/cat`, config);\n};\n\n//data와 method 형태로 변경..\nconst MultilingualDictionaryApi = (data = null, method) => {\n const config = {\n headers: { authorization: `Bearer ${getToken()}` },\n };\n if (method === \"GET\") {\n const config = {\n headers: { authorization: `Bearer ${getToken()}` },\n };\n return axios.get(`${baseURL}/nextrend/multilingual`, config);\n }\n if (method === \"POST\") {\n if (\"multi_text\" in data) {\n return axios.post(`${baseURL}/nextrend/multilingual`, data, config);\n }\n if (\"list\" in data) {\n return axios.post(\n `${baseURL}/nextrend/multilingual/upload`,\n data,\n config,\n );\n }\n }\n if (method === \"PUT\") {\n return axios.put(`${baseURL}/nextrend/multilingual`, data, config);\n }\n if (method === \"DELETE\") {\n const config2 = {\n headers: { authorization: `Bearer ${getToken()}` },\n params: {\n ...data,\n },\n };\n return axios.delete(`${baseURL}/nextrend/multilingual`, config2);\n }\n};\n\nconst HostManagementApi = (data = null, method) => {\n const config = {\n headers: { authorization: `Bearer ${getToken()}` },\n };\n if (method === \"GET\") {\n if (data !== null) {\n // 검색 쿼리가 있다면?\n config[\"params\"] = { ...data };\n }\n return axios.get(`${baseURL}/nextrend/host`, config);\n }\n if (method === \"POST\") {\n return axios.post(`${baseURL}/nextrend/host`, data, config);\n }\n};\nconst HostTestApi = (data = null, method) => {\n const config = {\n headers: { authorization: `Bearer ${getToken()}` },\n };\n if (method === \"GET\") {\n return axios.get(`${baseURL}/nextrend/host/test`, config);\n }\n if (method === \"POST\") {\n return axios.post(`${baseURL}/nextrend/host/test`, data, config);\n }\n};\n\n/**\n * -------------- 관리자 카테고리 관리 <끝> -----------------\n */\n\n/**\n * -------------- 관리자의 사용자 관리 <시작> -----------------\n */\n\nconst FetchUsersApi = () => {\n let config = {\n headers: { authorization: `Bearer ${getToken()}` },\n };\n return axios.get(`${baseURL}/nextrend/user/list`, config);\n};\n\nconst getUserInfoApi = (uid) => {\n let config = {\n headers: { authorization: `Bearer ${getToken()}` },\n params: {\n uid: uid,\n },\n };\n return axios.get(`${baseURL}/nextrend/user/get`, config);\n};\n\nconst getUserLogoApi = (uid) => {\n const config = {\n headers: { authorization: `Bearer ${getToken()}` },\n params: {\n uid,\n },\n };\n return axios.get(`${baseURL}/nextrend/user/logo`, config);\n};\n\nconst modifyUserInfoApi = (formData) => {\n return axios.post(`${baseURL}/nextrend/user/modify`, formData, {\n headers: {\n \"Content-Type\": \"multipart/form-data\",\n authorization: `Bearer ${getToken()}`,\n },\n });\n};\n\nconst deleteUserByIdApi = (uid) => {\n const body = {\n uid,\n };\n const config = {\n headers: { authorization: `Bearer ${getToken()}` },\n };\n return axios.post(`${baseURL}/nextrend/user/delete`, body, config);\n};\nconst verifyUserIdApi = (userId, id) => {\n const body = {\n userId,\n id,\n };\n const config = {\n headers: { authorization: `Bearer ${getToken()}` },\n };\n return axios.post(`${baseURL}/nextrend/user/verify`, body, config);\n};\n\nconst addUserApi = (formData) => {\n return axios.post(`${baseURL}/nextrend/user/add`, formData, {\n headers: {\n \"Content-Type\": \"multipart/form-data\",\n authorization: `Bearer ${getToken()}`,\n },\n });\n};\n\nconst restrictUserApi = (uid, restrict) => {\n const body = {\n uid,\n restrict,\n };\n const config = {\n headers: { authorization: `Bearer ${getToken()}` },\n };\n return axios.post(`${baseURL}/nextrend/user/restrict`, body, config);\n};\n\n/**\n * -------------- 관리자의 사용자 관리 <끝> -----------------\n */\n\n/* 사용자 맞춤형 메뉴 관련 api */\n\n/* 특정 카테고리의 하위 카테고리 목록을 받아오는 기능을 함. */\nconst axisMenuPreviewFetchApi = (cid) => {\n const config = {\n headers: headers,\n params: { cid },\n };\n return axios.get(`${baseURL}/nextrend/custom/test`, config);\n};\n/* uid에 해당하는 유저의 설정된 x축, y축 의 하위 메뉴 정보를 받아옴. (사용자화면 출력용?? ) */\nconst userAxisMenuFetchApi = (uid) => {\n let config = {\n headers: { authorization: `Bearer ${getToken()}` },\n params: { uid },\n };\n return axios.get(`${baseURL}/nextrend/custom/load`, config);\n};\n/* uid에 해당하는 유저의 메뉴 세팅 정보를 받아옴.*/\nconst userAxisMenuSettingFetchApi = (uid) => {\n let config = {\n headers: { authorization: `Bearer ${getToken()}` },\n params: { uid },\n };\n return axios.get(`${baseURL}/nextrend/custom`, config);\n};\nconst userAxisMenuSaveApi = (axisSetObj, saveType) => {\n const config = {\n headers: { authorization: `Bearer ${getToken()}` },\n };\n if (saveType === \"create\") {\n return axios.post(`${baseURL}/nextrend/custom`, axisSetObj, config);\n }\n if (saveType === \"update\") {\n return axios.put(`${baseURL}/nextrend/custom`, axisSetObj, config);\n }\n};\n\nconst crawlHostDataFetchApi = (host_id = null) => {\n const config = {\n headers: { authorization: `Bearer ${getToken()}` },\n };\n const router = host_id\n ? `${baseURL}/crawl/host/${host_id}`\n : `${baseURL}/crawl/host`;\n\n return axios.get(router, config);\n};\n\nconst crawlSumDataFetchApi = () => {\n return axios.get(`${baseURL}/crawl/sum`, { headers: { headers } });\n};\nconst userWorkLogFetchApi = (dataObj) => {\n const config = {\n headers: { headers },\n params: { ...dataObj },\n };\n return axios.get(`${baseURL}/nextrend/board/work`, config);\n};\nconst curationWorkListFetchApi = (dataObj) => {\n const config = {\n headers: { headers },\n params: { ...dataObj },\n };\n return axios.get(`${baseURL}/nextrend/board/curation`, config);\n};\n\nconst countryWorkListFetchApi = (process) => {\n const config = {\n headers: { headers },\n params: { status: process },\n };\n return axios.get(`${baseURL}/nextrend/board`, config);\n};\n\nconst workAllLogFetchApi = (process) => {\n return axios.get(`${baseURL}/nextrend/board/all`, { headers: { headers } });\n};\n\nconst hostSyncApi = () => {\n const config = {\n headers: { authorization: `Bearer ${getToken()}` },\n };\n return axios.put(`${baseURL}/nextrend/host/sync/ `, config);\n};\n\nexport {\n LoginApi,\n RefreshTokenApi,\n CrawlDataListFetchApi,\n CrawlDataDetailFetchApi,\n CrawlDataRejectApi,\n CrawlDataStageApi,\n CrawlDataKeepApi,\n ScreeningDataDeleteApi,\n ScreeningDataKeepApi,\n ScreeningDataStageApi,\n ScreeningDataFetchApi,\n ContinentsListDataFetchApi,\n CountrysListDataFetchApi,\n FetchUsersApi,\n getUserInfoApi,\n modifyUserInfoApi,\n deleteUserByIdApi,\n addUserApi,\n CategorysListDataFetchApi,\n CategoryOptionFetchApi,\n userAuthApi,\n sessionHandler,\n documentPastedImageApi,\n documentDetachImageApi,\n uploadExcelDataApi,\n restrictUserApi,\n verifyUserIdApi,\n categoryListFetchApi,\n categoryItemAddApi,\n categoryItemDeleteApi,\n categoryItemEditApi,\n axisMenuPreviewFetchApi,\n userAxisMenuFetchApi,\n userAxisMenuSettingFetchApi,\n userAxisMenuSaveApi,\n MultilingualDictionaryApi,\n HostManagementApi,\n HostTestApi,\n userCustomCurationDataFetchApi,\n curationRequestApi,\n crawlHostDataFetchApi,\n crawlSumDataFetchApi,\n userWorkLogFetchApi,\n curationWorkListFetchApi,\n countryWorkListFetchApi,\n workAllLogFetchApi,\n hostSyncApi,\n getUserLogoApi,\n crawlDataUpdateApi,\n};\n","import React, { useState, useEffect } from \"react\";\nimport { useSelector, useDispatch } from \"react-redux\";\nimport { sessionHandler, categoryListFetchApi } from \"../../Utils/api\";\n\nimport styled, { css } from \"styled-components\";\nimport { myColors, tailwindColors } from \"styles/colors\";\nimport { BsCheckLg } from \"react-icons/bs\";\n\nconst CATEGORY_TYPE_DATA = {\n doc_category: {\n type: 1,\n title: \"정책 분류 설정\",\n subTitle:\n \"정책 분류를 선택해주세요. 항목을 더블클릭하면 추가됩니다. 추가된 정책 분류는 아래의 리스트에서 미리 볼 수 있으며, 추가된 칩을 클릭하면 목록에서 삭제됩니다.\",\n multiSelect: true,\n },\n doc_content_type: {\n type: 2,\n title: \"문서 유형 설정\",\n subTitle: \"문서 유형을 선택해주세요.\",\n multiSelect: true,\n },\n doc_content_category: {\n type: 2,\n title: \"내용 구분 설정\",\n subTitle: \"내용 구분을 선택해주세요.\",\n multiSelect: true,\n },\n doc_country: {\n type: 3,\n title: \"문서 대상 국가 설정\",\n subTitle:\n \"대상 국가를 선택해주세요. 항목을 더블클릭하면 추가됩니다. 추가된 국가는 아래의 리스트에서 미리 볼 수 있으며, 추가된 칩을 클릭하면 목록에서 삭제됩니다.\",\n multiSelect: true,\n },\n doc_publish_country: {\n type: 3,\n title: \"문서 발행 국가 설정\",\n subTitle:\n \"발행 국가를 선택해주세요. 항목을 더블클릭하면 추가됩니다. 추가된 국가는 아래의 리스트에서 미리 볼 수 있으며, 추가된 칩을 클릭하면 목록에서 삭제됩니다. 발행 국가는 1개만 선택 가능 합니다.\",\n multiSelect: false,\n },\n doc_language: {\n type: 4,\n title: \"언어 설정\",\n subTitle:\n \"언어를 선택해주세요. 항목을 더블클릭하면 추가되며, 하나의 언어만 선택 가능합니다.\",\n multiSelect: false,\n },\n doc_topic: {\n type: 5,\n title: \"토픽 분류 설정\",\n subTitle: \"토픽 분류를 선택해주세요..\",\n multiSelect: true,\n },\n doc_custom: {\n type: 6,\n title: \"기관맞춤형 분류 설정\",\n subTitle:\n \"기관맞춤형 분류를 설정해주세요. 항목을 더블클릭하면 추가되며, 추가된 칩을 클릭하면 목록에서 삭제됩니다. 설정된 기관맞춤형 분류는 사용자 페이지에 표출할 때 사용됩니다.\",\n multiSelect: true,\n },\n};\n\nfunction CategoryModal({ executeModal, closeModal }) {\n const [categoryList, setCategoryList] = useState([\n { length: 2, list: [] },\n { length: 4, list: [] },\n { length: 6, list: [] },\n ]);\n const [upperCode, setUpperCode] = useState({ 2: null, 4: null, 6: null });\n const [length, setLength] = useState(2); // 대분류 (2) 중분류 (4) 소분류 (6)\n\n const [selectedCategoryList, setSelectedCategoryList] = useState([]);\n\n const dispatch = useDispatch();\n const categoryModalType = useSelector(\n (state) => state.modal.categoryModalType\n );\n const categoryModalData = useSelector(\n (state) => state.modal.modalData[categoryModalType]\n );\n\n const isSelectedCategory = (category) => {\n return selectedCategoryList.some((v) => v.CODE === category.CODE);\n };\n\n const upperCodeHandler = (code, length) => {\n let _upperCode = { ...upperCode };\n _upperCode[length] = code;\n setUpperCode(_upperCode);\n };\n const lengthHandler = (length) => {\n setLength(length);\n };\n const clickHandler = (e, item, code, length) => {\n //console.log(e.detail) // 1 : 원클릭 2: 더블클릭\n if (e.detail === 1) {\n upperCodeHandler(code, length);\n lengthHandler(length + 2);\n } else if (e.detail === 2) {\n addCategory(item);\n }\n };\n\n const addCategory = (item) => {\n if (isSelectedCategory(item)) {\n alert(\"이미 선택된 항목 입니다.\");\n } else if (CATEGORY_TYPE_DATA[categoryModalType].multiSelect) {\n setSelectedCategoryList([...selectedCategoryList, item]);\n } else {\n setSelectedCategoryList([item]);\n }\n };\n\n /* 데이터 불러오기 */\n const dataFetch = () => {\n const type = CATEGORY_TYPE_DATA[categoryModalType].type;\n categoryListFetchApi(type, length, upperCode[length - 2])\n .then((res) => {\n dataCleansing(res.data);\n })\n .catch((err) => {\n sessionHandler(err, dispatch).then((res) => {\n categoryListFetchApi(type, length, upperCode[length - 2]).then(\n (res) => {\n dataCleansing(res.data);\n }\n );\n });\n });\n };\n const saveCategory = () => {\n executeModal(selectedCategoryList, categoryModalType);\n closeModal();\n };\n const deleteCategory = (code) => {\n setSelectedCategoryList(\n selectedCategoryList.filter((item) => item.CODE !== code)\n );\n };\n\n const dataCleansing = (rawData) => {\n const index = categoryList.findIndex((i) => i.length == length);\n let _categoryList = [...categoryList];\n _categoryList[index] = { length, list: rawData };\n setCategoryList(_categoryList);\n };\n\n const listInit = () => {\n setCategoryList([\n { length: 2, list: [] },\n { length: 4, list: [] },\n { length: 6, list: [] },\n ]);\n setUpperCode({ 2: null, 4: null, 6: null });\n setLength(2);\n setSelectedCategoryList(categoryModalData);\n };\n useEffect(() => {\n listInit();\n }, [categoryModalType]);\n\n useEffect(() => {\n dataFetch();\n }, [length, upperCode]);\n\n return (\n <>\n \n \n {CATEGORY_TYPE_DATA[categoryModalType].title}\n \n {CATEGORY_TYPE_DATA[categoryModalType].subTitle}\n \n \n \n \n \n
대분류
\n
중분류
\n
소분류
\n
\n \n {categoryList.map((category, index) => {\n return (\n \n {category.list.length === 0 ? (\n 상위분류를 먼저 선택하세요\n ) : (\n category.list.map((item, index2) => {\n return (\n <>\n \n {\n clickHandler(\n e,\n item,\n item.CODE,\n category.length\n );\n }}\n >\n {item.CT_NM}\n \n \n \n \n );\n })\n )}\n \n );\n })}\n \n
\n \n {selectedCategoryList.map((item) => {\n return (\n {\n deleteCategory(item.CODE);\n }}\n >\n {item.CT_NM}\n \n );\n })}\n \n
\n \n \n \n \n
\n \n );\n}\n\n/* 모달 디자인 관련 컴포넌트 ... 나중에 전역 관리 할 수 있음 좋겠네 ㅠ */\nconst ModalWrapper = styled.div`\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n background-color: white;\n border-radius: 0.25rem;\n padding: 1.5rem;\n`;\nconst Modalheader = styled.div`\n justify-content: left;\n margin-bottom: 1rem;\n`;\nconst ModalTitle = styled.div`\n font-size: 24px;\n font-weight: bold;\n margin-bottom: 0.5rem;\n color: rgba(0, 0, 0, 0.7);\n`;\nconst ModalSubTitle = styled.div`\n font-size: 16px;\n margin-bottom: 0.5rem;\n`;\nconst ModalBody = styled.div`\n display: flex;\n flex-direction: column;\n margin-bottom: 1rem;\n`;\n\nconst ModalActions = styled.div`\n display: flex;\n justify-content: center;\n gap: 1rem;\n`;\n\nconst Button = styled.button`\n width: 5rem;\n padding: 0.5rem 1rem;\n background-color: ${(props) => props.color || \"grey\"};\n font-weight: bold;\n color: white;\n cursor: pointer;\n`;\n\n/* 리스트 관리 스타일 */\n\nconst ListBody = styled.div`\n display: grid;\n grid-template-columns: 1fr 1fr 1fr;\n width: 100%;\n`;\nconst ListContainer = styled.div`\n display: flex;\n flex-direction: column;\n margin-bottom: 1rem;\n`;\nconst ListHeader = styled.div`\n display: grid;\n grid-template-columns: 1fr 1fr 1fr;\n width: 100%;\n background-color: ${myColors.blue500};\n\n & div {\n flex: 1;\n padding: 0.5rem 0;\n font-weight: bold;\n color: white;\n text-align: center;\n }\n`;\n\nconst ListWrapper = styled.ul`\n height: 30rem;\n border: solid 1px #eeeeee;\n overflow: auto;\n`;\nconst ListItem = styled.li`\n cursor: pointer;\n padding: 1rem;\n min-height: 1.5rem;\n border-bottom: dotted 1px #eeeeee;\n ${(props) =>\n props.active &&\n css`\n background-color: ${tailwindColors[\"grey-100\"]};\n `};\n font-weight: ${(props) => (props.selected || props.active) && \"bold\"};\n\n & > .title {\n display: flex;\n align-items: center;\n justify-content: space-between;\n svg {\n visibility: ${(props) => (props.selected ? \"visible\" : \"hidden\")};\n }\n }\n`;\n\nconst CategoryList = styled.div`\n display: flex;\n justify-content: left;\n align-items: center;\n flex-wrap: wrap;\n gap: 0.5rem;\n min-height: 4rem;\n padding: 1rem;\n border: solid 1px #eee;\n\n div {\n cursor: pointer;\n background-color: ${tailwindColors[\"grey-300\"]};\n padding: 0.5rem 1rem;\n border-radius: 1rem;\n font-size: 12px;\n font-weight: bold;\n }\n`;\nexport default CategoryModal;\n","import React, { useState, useEffect } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport styled, { css } from \"styled-components\";\nimport {\n modifyUserInfoApi,\n addUserApi,\n verifyUserIdApi,\n getUserLogoApi,\n} from \"../../Utils/api\";\nimport permission from \"../../Data/permission.json\";\nimport { AiOutlineClose } from \"react-icons/ai\";\n\nfunction UserInfoModal({ closeModal, executeModal }) {\n const [id, setID] = useState(\"\");\n const [userID, setUserID] = useState(\"\");\n const [idMsg, setIdMsg] = useState(null);\n\n const [userPW, setUserPW] = useState(\"\");\n const [userPWCheck, setUserPWCheck] = useState(\"\");\n const [salt, setSalt] = useState(\"\");\n const [Tel, setTel] = useState(\"\");\n const [Position, setPosition] = useState(\"\");\n const [Name, setName] = useState(\"\");\n const [Email, setEmail] = useState(\"\");\n const [Category, setCategory] = useState(0); // 최초 설정은 일반사용자 ...\n const [Company, setCompany] = useState(\"\");\n const [logoFile, setLogoFile] = useState();\n const [logoFileName, setLogoFileName] = useState(\"\");\n const [confirm, setConfirm] = useState(false);\n const [imageSrc, setImageSrc] = useState(\"\");\n\n const userInfo = useSelector(\n (state) => state.modal.modalData.modal_user.user,\n );\n\n const type = useSelector((state) => state.modal.modalData.modal_user.type);\n\n const encodeFileToBase64 = (fileBlob) => {\n const reader = new FileReader();\n reader.readAsDataURL(fileBlob);\n return new Promise((resolve) => {\n reader.onload = () => {\n setImageSrc(reader.result);\n resolve();\n };\n });\n };\n\n // const logoToBase64 = (imageBuffer) => {\n // setImageSrc(encodeBufferToBase64(imageBuffer));\n // };\n\n const _userUserIDHandler = (e) => {\n setUserID(e.target.value);\n };\n const _userTelHandler = (e) => {\n setTel(e.target.value);\n };\n const _userNameHandler = (e) => {\n setName(e.target.value);\n };\n const _userUserPWHandler = (e) => {\n setUserPW(e.target.value);\n };\n const _userPWCheckHandler = (e) => {\n setUserPWCheck(e.target.value);\n };\n const _userPositionHandler = (e) => {\n setPosition(e.target.value);\n };\n const _userEmailHandler = (e) => {\n setEmail(e.target.value);\n };\n const _userCategoryHandler = (e) => {\n setCategory(e.target.value);\n };\n const _userCompanyHandler = (e) => {\n setCompany(e.target.value);\n };\n const _userLogoHandler = (e) => {\n const image = e.target.files[0];\n encodeFileToBase64(image);\n setLogoFile(image);\n setLogoFileName(image.name);\n };\n\n useEffect(() => {\n setUserID(userInfo.userID || \"\");\n setID(userInfo.id || \"\");\n setUserPW(userInfo.userPW || \"\");\n setTel(userInfo.Tel || \"\");\n setPosition(userInfo.Position || \"\");\n setName(userInfo.Name || \"\");\n setEmail(userInfo.Email || \"\");\n setCategory(userInfo.Category || 0);\n setSalt(userInfo.salt || \"\");\n setConfirm(userInfo.Confirm || \"\");\n setCompany(userInfo.Company || \"\");\n if (!type) {\n getUserLogoApi(userInfo.id).then((res) => {\n console.log(res.data);\n const logo = res.data.logo;\n if (logo) setImageSrc(logo);\n });\n }\n }, []);\n\n const _userIDdVerify = () => {\n if (userID !== \"\") {\n verifyUserIdApi(userID)\n .then(() => {\n setIdMsg(\"사용가능한 ID입니다.\");\n setConfirm(true);\n })\n .catch((err) => {\n setIdMsg(\"이미 존재하는 ID입니다.\");\n });\n } else {\n setIdMsg(\"사용할 아이디를 입력해주세요.\");\n }\n };\n const _userPWVerify = () => {\n if (userPW !== \"\" && userPW !== userPWCheck) {\n return false;\n }\n return true;\n };\n const _fieldCheck = () => {\n /* userID, userPW, userPWCheck, Email, Name, category 는 필수필드 */\n /* 필수 필드 조건을 모두 만족하였다면 true를 반환, 그렇지 않다면 false를 반환하도록 함.*/\n return (\n userID !== \"\" &&\n userPW !== \"\" &&\n userPWCheck !== \"\" &&\n Email !== \"\" &&\n Name !== \"\"\n );\n };\n\n const _confirmCheck = () => {\n if (!type || confirm) {\n if (_fieldCheck()) {\n if (_userPWVerify()) {\n return true;\n } else {\n alert(\"새 비밀번호와 비밀번호 확인이 일치하지 않습니다.\");\n return false;\n }\n } else {\n alert(\"필수필드를 모두 입력해주세요\");\n return false;\n }\n } else {\n alert(\"사용할 아이디를 확인하여주세요.\");\n return false;\n }\n };\n const _addUser = () => {\n let userInfo = {\n userID,\n userPW,\n Tel,\n Position,\n Name,\n Email,\n Category,\n Company,\n salt,\n };\n if (_confirmCheck()) {\n const formData = new FormData();\n formData.append(\"userInfo\", JSON.stringify(userInfo));\n if (logoFile) formData.append(\"logoImage\", logoFile);\n addUserApi(formData)\n .then(() => {\n alert(\"성공적으로 생성되었습니다.\");\n window.location.reload();\n })\n .catch((err) => {\n if (err.response.status === 400) {\n console.log(err.Message);\n alert(\"추가 중 오류발생\");\n }\n });\n closeModal();\n }\n };\n\n const _modifyUser = () => {\n let userInfo = {\n userID,\n userPW,\n Tel,\n Position,\n Name,\n Email,\n Category,\n Company,\n salt,\n id,\n };\n if (_confirmCheck()) {\n const formData = new FormData();\n formData.append(\"userInfo\", JSON.stringify(userInfo));\n formData.append(\"uid\", userInfo.id);\n if (logoFile) formData.append(\"logoImage\", logoFile);\n formData.forEach((v) => console.log(v));\n modifyUserInfoApi(formData)\n .then(() => {\n alert(\"성공적으로 수정되었습니다.\");\n window.location.reload();\n })\n .catch((err) => {\n if (err.response.status === 400) {\n alert(\"추가 중 오류발생\");\n }\n });\n closeModal();\n }\n };\n\n return (\n <>\n \n \n \n 사용자{type ? \" 추가\" : \" 정보 수정\"}\n \n \n \n {\"아래 데이터를 입력한 후 확인을 누르면 정보가 반영됩니다.\"}\n \n \n \n \n \n 아이디\n \n {type && (\n \n )}\n \n {idMsg}\n \n\n \n \n \n {type ? \"비밀번호\" : \"새 비밀번호\"}\n \n \n \n \n\n \n \n 비밀번호 확인\n \n \n \n \n \n 전화번호\n \n \n \n \n \n 소속\n \n \n \n \n \n 직책\n \n \n \n \n \n 사용자 이름\n \n \n \n\n \n \n 이메일\n \n \n \n\n \n \n 사용자 권한\n \n {permission.permission.map((item, index) => {\n return (\n \n );\n })}\n \n \n \n \n \n 로고\n \n 파일 선택\n \n \n {logoFileName ? logoFileName : \"이미지 파일을 선택해주세요\"}\n \n \n \n \n \n {imageSrc && \"로고}\n \n \n \n \n \n \n \n );\n}\n\nconst Button = styled.button`\n background-color: ${(props) => props.color || \"grey\"};\n cursor: pointer;\n min-width: 5rem;\n border: none;\n border-radius: 4px;\n color: white;\n font-weight: bold;\n margin: 0 0.5rem 0 0.5rem;\n height: 100%;\n padding: 0.5rem;\n`;\n\nconst InputWrapper = styled.div`\n display: flex;\n flex-direction: column;\n width: 50%;\n margin: 0.5rem 0;\n`;\nconst InputTitle = styled.div`\n min-width: 7rem;\n ${({ required }) =>\n required &&\n css`\n &:before {\n content: \"*\";\n margin-right: 4px;\n font-size: 16px;\n color: red;\n }\n `};\n`;\nconst InputFieldWrapper = styled.div`\n display: flex;\n align-items: center;\n height: 2rem;\n`;\nconst InputField = styled.input`\n padding-left: 0.5rem;\n border-radius: 4px;\n border: solid 1px #d6d6d6;\n width: 100%;\n max-width: 16rem;\n height: 100%;\n &:focus {\n outline: none;\n }\n &[type=\"file\"] {\n display: none;\n }\n`;\n\nconst SelectField = styled.select`\n padding-left: 0.5rem;\n border-radius: 4px;\n border: solid 1px #d6d6d6;\n width: 100%;\n max-width: 16rem;\n height: 100%;\n &:focus {\n outline: none;\n }\n`;\nconst Message = styled.div`\n color: red;\n text-align: left;\n margin-top: 4px;\n`;\nconst ModalWrapper = styled.div`\n font-size: 14px;\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n background-color: white;\n border-radius: 0.25rem;\n padding: 1.5rem;\n`;\nconst Modalheader = styled.div`\n justify-content: left;\n margin-bottom: 1rem;\n`;\nconst ModalTitle = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n font-size: 24px;\n font-weight: bold;\n margin-bottom: 0.5rem;\n color: rgba(0, 0, 0, 0.7);\n`;\nconst ModalSubTitle = styled.div`\n font-size: 16px;\n margin-bottom: 0.5rem;\n`;\nconst ModalBody = styled.div`\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n width: 100%;\n padding-left: 8rem;\n margin-bottom: 1rem;\n`;\n\nconst InputContainer = styled.div`\n display: flex;\n align-items: center;\n margin-bottom: 0.5rem;\n p {\n width: 7rem;\n }\n input {\n height: 1.5rem;\n border: solid 1px #d6d6d6;\n padding: 0.5rem 1rem 0.5rem 1rem;\n border-radius: 10px;\n }\n select {\n height: 2rem;\n border: solid 1px #d6d6d6;\n padding: 0.5rem 1rem 0.5rem 1rem;\n border-radius: 10px;\n }\n`;\nconst ModalActions = styled.div`\n display: flex;\n justify-content: center;\n flex-direction: row;\n`;\n\nconst LogoInputLabel = styled.label`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 5rem;\n height: 100%;\n padding: 0 1rem;\n background-color: #eee;\n cursor: pointer;\n\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nconst LogoInputWrap = styled.div`\n display: flex;\n align-items: center;\n max-width: 16rem;\n width: 100%;\n height: 100%;\n border: solid 1px #d6d6d6;\n border-radius: 4px;\n overflow: hidden;\n\n & span {\n padding-left: 0.5rem;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n`;\nconst LogoPreviewContainer = styled.div`\n width: 24rem;\n height: 6rem;\n padding: 0.5rem;\n border: 1px solid #d6d6d6;\n border-radius: 4px;\n overflow: hidden;\n & img {\n width: 100%;\n height: 100%;\n object-fit: contain;\n }\n`;\n\nexport default UserInfoModal;\n","import axios, { AxiosRequestConfig } from \"axios\";\nimport { getToken } from \"Utils/tokens\";\n\nconst instance = axios.create({\n baseURL: `${process.env.REACT_APP_API_ENDPOINT}`,\n timeout: 30000,\n});\n\ninstance.interceptors.request.use(\n (config) => ({\n ...config,\n headers: {\n \"Content-Type\": \"application/json\",\n authorization: `Bearer ${getToken()}`,\n ...config.headers,\n },\n }),\n (error) => {\n alert(error.message);\n return Promise.reject(error);\n },\n);\n\ninstance.interceptors.response.use(\n (res) => {\n console.groupCollapsed(\n `[${res.status} ${res.config.method}] ${res.config.url}`,\n );\n console.log(\">>> data\", res.data);\n console.groupEnd();\n\n return res;\n },\n (error) => {\n console.log(`[ Error ] ${error.message}`, error.config);\n return Promise.reject(error.response.data);\n },\n);\n\n/**\n *\n * @param {AxiosRequestConfig} props\n * @returns\n */\nexport const _axios = async (props) => {\n const { data } = await instance(props);\n return { data };\n};\n","export const HTTP_METHOD = {\n GET: \"GET\",\n POST: \"POST\",\n PUT: \"PUT\",\n DELETE: \"DELETE\",\n};\n","import axios from \"axios\";\nimport { _axios } from \"services/axiosService\";\nimport { getToken } from \"Utils/tokens\";\nimport { HTTP_METHOD } from \"..\";\n\nexport const getCategryListAPI = (code = null) => {\n return _axios({\n method: HTTP_METHOD.GET,\n url: `/nextrend/cat/list`,\n params: { type: code },\n });\n};\n","import React, { useState, useEffect } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport styled from \"styled-components\";\nimport { BsCheckLg, BsX } from \"react-icons/bs\";\nimport { getCategryListAPI } from \"services/api/category/category\";\nimport { sessionHandler } from \"../../Utils/api\";\nimport { myColors, tailwindColors } from \"styles/colors\";\nimport { type } from \"@amcharts/amcharts5\";\nimport { setAxisMenuData } from \"Modules/custom\";\n\nconst CATEGORY_INFO = [\n { name: \"정책 분류\", code: 1 },\n { name: \"유형 분류\", code: 2 },\n { name: \"국가\", code: 3 },\n { name: \"언어\", code: 4 },\n { name: \"토픽 분류\", code: 5 },\n { name: \"기관 맞춤형 분류\", code: 6 },\n];\n\nfunction CategoryModal({ executeModal, closeModal }) {\n const dispatch = useDispatch();\n const [categoryList, setCategoryList] = useState([]);\n const [selectedCategories, setSelectedCategories] = useState([]);\n const [focusedCategory, setFocusedCategory] = useState({\n large: null,\n medium: null,\n });\n const [currentCategoryType, setCurrentCategoryType] = useState(null);\n const editingAxis = useSelector((state) => state.editingAxis);\n const existingAxisMenuData = useSelector((state) => state.axisMenuData);\n\n const onClickCategoryType = (code) => {\n console.log(editingAxis);\n setFocusedCategory({\n large: null,\n medium: null,\n });\n setCurrentCategoryType(code);\n\n setSelectedCategories([]);\n };\n\n const onClickLargeCategory = (e, item) => {\n if (e.detail === 1) {\n setFocusedCategory({ large: item, medium: null });\n return;\n }\n\n if (selectedCategories.includes(item)) {\n alert(\"이미 선택된 카테고리입니다\");\n } else {\n setSelectedCategories((prev) => [...prev, item]);\n }\n console.log(\"editingAxis : \", editingAxis);\n };\n\n const onClickMediumCategory = (e, item) => {\n if (e.detail === 1) {\n setFocusedCategory((prev) => ({ ...prev, medium: item }));\n } else {\n setSelectedCategories((prev) => [...prev, item]);\n }\n };\n\n const onClickSmallCategory = (e, item) => {\n if (e.detail === 2) setSelectedCategories((prev) => [...prev, item]);\n };\n\n const removeSelectedItem = (item) => {\n setSelectedCategories((prev) =>\n prev.filter((category) => category.CID !== item.CID)\n );\n };\n\n /* 데이터 불러오기 */\n const dataFetch = () => {\n getCategryListAPI(currentCategoryType)\n .then((res) => {\n setCategoryList(stratifyCategoryList(res.data));\n })\n .catch((err) => {\n console.log(\"에러\", err);\n sessionHandler(err, dispatch).then((res) => {\n getCategryListAPI(currentCategoryType).then((res) => {\n setCategoryList(res.data);\n });\n });\n });\n };\n\n const categorySchemaMapping = (categoryList) => {\n return categoryList.map((category) => ({\n CID: category.IDX,\n x_type: category.type,\n x_code: category.code,\n ct_name: category.name,\n level: category.level,\n }));\n };\n\n const stratifyCategoryList = (caregoryList) => {\n const mappedList = categorySchemaMapping(caregoryList);\n\n const newList = mappedList\n .filter((v) => v.level === \"대분류\")\n .map((large) => {\n const mediumCategories = mappedList\n .filter(\n (v) =>\n v.level === \"중분류\" && v.x_code.substring(0, 2) === large.x_code\n )\n .map((medium) => {\n const smallCategories = mappedList.filter(\n (v) =>\n v.level === \"소분류\" &&\n v.x_code.substring(0, 4) === medium.x_code\n );\n return { ...medium, subCategory: smallCategories };\n });\n return { ...large, subCategory: mediumCategories };\n });\n console.log(newList);\n return newList;\n };\n\n const saveCategory = () => {\n if (selectedCategories.length === 0) {\n alert(\"카테고리를 선택해주세요.\");\n } else {\n // 1. 모달에서 값 선택 후 redux에 저장\n executeModal(selectedCategories, \"axis_category\");\n console.log(selectedCategories);\n closeModal();\n dispatch(setAxisMenuData(editingAxis.selected, selectedCategories));\n }\n };\n\n useEffect(() => {\n if (!!currentCategoryType) {\n dataFetch();\n }\n }, [currentCategoryType]);\n\n useEffect(() => {\n console.log(\"existring : \", existingAxisMenuData);\n console.log(\"editingAxis : \", editingAxis);\n console.log(\"생긴거좀보자 : \", existingAxisMenuData[editingAxis.selected]);\n setCurrentCategoryType(editingAxis[editingAxis.selected]);\n setSelectedCategories(existingAxisMenuData[editingAxis.selected]);\n }, []);\n\n return (\n <>\n \n \n 맞춤형 메뉴 주제 설정\n \n 하위 카테고리가 없는 항목은 선택할 수 없습니다\n \n \n \n \n {CATEGORY_INFO.map((v) => (\n onClickCategoryType(v.code)}\n selected={currentCategoryType == v.code}\n disabled={\n editingAxis.selected === \"X\"\n ? editingAxis.Y == v.code\n : editingAxis.X == v.code\n }\n >\n {v.name}\n \n ))}\n \n {currentCategoryType !== 0 && (\n \n \n
대분류
\n
중분류
\n
소분류
\n
\n \n \n {categoryList.map((category, i) => (\n \n onClickLargeCategory(e, category)}\n >\n {category.ct_name}\n {selectedCategories?.includes(category) && (\n \n )}\n \n \n ))}\n \n \n {!focusedCategory.large ? (\n 상위분류를 먼저 선택하세요\n ) : (\n focusedCategory.large.subCategory.map((category, i) => (\n \n onClickMediumCategory(e, category)}\n >\n {category.ct_name}\n {selectedCategories.includes(category) && (\n \n )}\n \n \n ))\n )}\n \n \n {!focusedCategory.medium ? (\n 상위분류를 먼저 선택하세요\n ) : (\n focusedCategory.medium.subCategory.map((category, i) => (\n \n onClickSmallCategory(e, category)}\n >\n {category.ct_name}\n {selectedCategories.includes(category) && (\n \n )}\n \n \n ))\n )}\n \n \n
\n )}\n \n {selectedCategories.map((category) => (\n removeSelectedItem(category)}\n >\n {category.ct_name}\n \n \n ))}\n \n
\n \n \n \n \n
\n \n );\n}\n\n/* 모달 디자인 관련 컴포넌트 ... 나중에 전역 관리 할 수 있음 좋겠네 ㅠ */\nconst ModalWrapper = styled.div`\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n background-color: white;\n border-radius: 0.25rem;\n padding: 1.5rem;\n`;\nconst Modalheader = styled.div`\n justify-content: left;\n margin-bottom: 1rem;\n`;\nconst ModalTitle = styled.div`\n font-size: 24px;\n font-weight: bold;\n margin-bottom: 0.5rem;\n color: rgba(0, 0, 0, 0.7);\n`;\nconst ModalSubTitle = styled.div`\n font-size: 16px;\n margin-bottom: 0.5rem;\n`;\nconst ModalBody = styled.div`\n display: flex;\n flex-direction: column;\n margin-bottom: 1rem;\n`;\n\nconst ModalActions = styled.div`\n display: flex;\n justify-content: center;\n gap: 1rem;\n`;\nconst CategoryBtnWrapper = styled.div`\n margin-bottom: 1rem;\n`;\n\nconst CategoryTypeButton = styled.button`\n min-width: 5rem;\n margin-right: 0.5rem;\n padding: 0.5rem 1rem;\n border: solid 1px ${myColors.blue500};\n border-radius: 20px;\n background-color: ${(props) =>\n props.selected ? myColors.blue500 : \"#ffffff\"};\n color: ${(props) => (props.selected ? \"#ffffff\" : myColors.blue500)};\n font-weight: bold;\n\n :disabled {\n opacity: 0.2;\n cursor: not-allowed;\n &:hover {\n cursor: not-allowed;\n background-color: #ffffff;\n color: ${myColors.blue500};\n }\n }\n\n &:hover {\n cursor: pointer;\n background-color: ${myColors.blue500};\n color: white;\n }\n`;\n\nconst Button = styled.button`\n background-color: ${(props) => props.color || \"grey\"};\n cursor: pointer;\n width: 5rem;\n padding: 0.5rem;\n color: white;\n font-weight: bold;\n`;\n\n/* 리스트 관리 스타일 */\n\nconst ListBody = styled.div`\n display: flex;\n flex-direction: row;\n width: 100%;\n`;\nconst ListContainer = styled.div`\n display: flex;\n flex-direction: column;\n margin-bottom: 1rem;\n color: ${tailwindColors.black};\n`;\nconst ListHeader = styled.div`\n flex: 1;\n display: flex;\n background-color: ${myColors.blue500};\n div {\n padding: 0.5rem 0 0.5rem 0;\n flex: 1;\n text-align: center;\n color: white;\n font-weight: bold;\n }\n`;\nconst ListWrapper = styled.ul`\n flex: 1;\n list-style-type: none;\n height: 30rem;\n overflow: auto;\n margin: 0;\n padding: 0;\n border: solid 1px #eeeeee;\n overflow-x: hidden;\n`;\nconst ListItem = styled.li`\n padding: 1rem;\n min-height: 1.5rem;\n border-bottom: dotted 1px #eeeeee;\n cursor: ${(props) => (props.disabled ? \"not-allowed\" : \"pointer\")};\n color: ${(props) => props.disabled && \"#888888\"};\n font-weight: ${(props) => (props.focused || props.selected) && \"bold\"};\n background-color: ${(props) => (props.focused ? \"#dfdfdf\" : \"#ffffff\")};\n\n & > div {\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n`;\n\nconst SelectedItemContainer = styled.div`\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 0.5rem;\n\n & > div {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.2rem;\n height: 2rem;\n padding: 0 0.5rem 0 1rem;\n border-radius: 1rem;\n background-color: ${myColors.blue100};\n font-weight: bold;\n white-space: nowrap;\n cursor: pointer;\n transition: background-color 0.2s;\n :hover {\n background-color: ${myColors.blue200};\n }\n }\n`;\n\nexport default CategoryModal;\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { AiOutlineSearch } from \"react-icons/ai\";\nfunction SearchBar({ keywordHandler = null, searchAction = null }) {\n return (\n searchAction(e)}>\n \n \n \n \n \n \n \n );\n}\n\nconst SearchBarContainer = styled.form`\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n border: solid 1px #435269;\n border-radius: 3rem;\n height: 3rem;\n color: #595959;\n background-color: white;\n`;\n\nconst OptionWrapper = styled.div`\n display: flex;\n align-items: center;\n`;\nconst SearchBtn = styled.button`\n display: flex;\n align-items: center;\n margin-left: 1rem;\n margin-right: 1rem;\n border: none;\n background-color: white;\n &:hover {\n cursor: pointer;\n }\n color: #435269;\n`;\nconst InputField = styled.input`\n align-items: center;\n flex-grow: 1;\n height: 2rem;\n margin-left: 1rem;\n &:focus {\n outline: none;\n }\n border: none;\n &::placeholder {\n color: #435269;\n }\n`;\nconst ExactlySearchOption = styled.div`\n display: flex;\n align-items: center;\n width: 6rem;\n input[type=\"checkbox\"] {\n }\n label {\n font-size: 12px;\n }\n`;\n\nexport default SearchBar;\n","import React, { useState } from \"react\";\nimport styled from \"styled-components\";\nimport SearchBar from \"../SearchBar\";\nimport { HostManagementApi } from \"../../Utils/api\";\nimport { useDispatch } from \"react-redux\";\nimport { myColors, tailwindColors } from \"styles/colors\";\nimport { BsCheckLg } from \"react-icons/bs\";\nfunction HostSelectModal({ executeModal, closeModal }) {\n const [keyword, setKeyword] = useState(\"\");\n const [hostList, setHostList] = useState([]); // 검색 결과 호스트 목록\n const [selectHost, setSelectHost] = useState(null); // 선택한 호스트 및 발급기관명\n const saveCategory = () => {\n executeModal(selectHost, \"doc_host\");\n closeModal();\n };\n\n const clickHandler = (item) => {\n setSelectHost(item);\n };\n const keywordHandler = (e) => {\n setKeyword(e.target.value);\n };\n const searchHost = (e) => {\n e.preventDefault();\n let searchObj = { like: keyword };\n HostManagementApi(searchObj, \"GET\").then((res) => {\n setHostList(res.data);\n });\n };\n\n return (\n <>\n \n \n HOST 검색\n \n HOST 도메인의 일부를 검색하여 결과를 확인하고, 값을 등록해주세요.\n \n \n \n \n \n {hostList.length === 0 ? (\n 검색결과가 없습니다\n ) : (\n hostList.map((item, index) => {\n return (\n {\n clickHandler(item);\n }}\n >\n
\n {`${item.NAME ?? \"\"} (${item.HOST})`}\n {selectHost === item && }\n
\n \n );\n })\n )}\n
\n
\n \n \n \n \n
\n \n );\n}\n\n/* 모달 디자인 관련 컴포넌트 ... 나중에 전역 관리 할 수 있음 좋겠네 ㅠ */\nconst ModalWrapper = styled.div`\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n background-color: white;\n border-radius: 0.25rem;\n padding: 1.5rem;\n`;\nconst Modalheader = styled.div`\n justify-content: left;\n margin-bottom: 1rem;\n`;\nconst ModalTitle = styled.div`\n font-size: 24px;\n font-weight: bold;\n margin-bottom: 0.5rem;\n color: rgba(0, 0, 0, 0.7);\n`;\nconst ModalSubTitle = styled.div`\n font-size: 16px;\n margin-bottom: 0.5rem;\n`;\nconst ModalBody = styled.div`\n display: flex;\n flex-direction: column;\n margin-bottom: 1rem;\n`;\n\nconst ModalActions = styled.div`\n display: flex;\n justify-content: center;\n gap: 1rem;\n`;\n\nconst Button = styled.button`\n width: 5rem;\n padding: 0.5rem 1rem;\n background-color: ${(props) => props.color || \"grey\"};\n font-weight: bold;\n color: white;\n cursor: pointer;\n`;\n\nconst SearchResultWrapper = styled.div`\n border: solid 1px #d6d6d6;\n border-radius: 4px;\n margin: 1rem 0 1rem 0;\n height: 30rem;\n overflow-y: auto;\n`;\n\nconst SearchResultRow = styled.div`\n padding: 1rem;\n border-bottom: solid 1px #d6d6d6;\n background-color: ${(props) => props.selected && myColors.blue100};\n font-weight: ${(props) => props.selected && \"bold\"};\n & > div {\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n`;\n\nexport default HostSelectModal;\n","import React from \"react\";\n\nimport CKEditorInspector from '@ckeditor/ckeditor5-inspector';\nimport { CKEditor } from \"@ckeditor/ckeditor5-react\";\n\n// NOTE: Use the editor from source (not a build)!\nimport ClassicEditor from \"@ckeditor/ckeditor5-editor-classic/src/classiceditor\";\nimport Clipboard from \"@ckeditor/ckeditor5-clipboard/src/clipboard\";\n\nimport InlineEditor from \"@ckeditor/ckeditor5-editor-classic/src/classiceditor\";\nimport Essentials from \"@ckeditor/ckeditor5-essentials/src/essentials\";\nimport Paragraph from \"@ckeditor/ckeditor5-paragraph/src/paragraph\";\nimport Bold from \"@ckeditor/ckeditor5-basic-styles/src/bold\";\nimport Italic from \"@ckeditor/ckeditor5-basic-styles/src/italic\";\nimport Underline from \"@ckeditor/ckeditor5-basic-styles/src/underline\";\nimport Strikethrough from \"@ckeditor/ckeditor5-basic-styles/src/strikethrough\";\nimport BlockQuote from \"@ckeditor/ckeditor5-block-quote/src/blockquote\";\nimport Link from \"@ckeditor/ckeditor5-link/src/link\";\nimport MediaEmbed from \"@ckeditor/ckeditor5-media-embed/src/mediaembed\";\nimport PasteFromOffice from \"@ckeditor/ckeditor5-paste-from-office/src/pastefromoffice\";\nimport Heading from \"@ckeditor/ckeditor5-heading/src/heading\";\nimport Font from \"@ckeditor/ckeditor5-font/src/font\";\n\nimport Image from \"@ckeditor/ckeditor5-image/src/image\";\nimport ImageStyle from \"@ckeditor/ckeditor5-image/src/imagestyle\";\nimport ImageToolbar from \"@ckeditor/ckeditor5-image/src/imagetoolbar\";\nimport ImageUpload from \"@ckeditor/ckeditor5-image/src/imageupload\";\nimport ImageCaption from \"@ckeditor/ckeditor5-image/src/imagecaption\";\nimport ImageResize from \"@ckeditor/ckeditor5-image/src/imageresize\";\nimport ImageResizeEditing from \"@ckeditor/ckeditor5-image/src/imageresize/imageresizeediting\";\nimport ImageResizeHandles from \"@ckeditor/ckeditor5-image/src/imageresize/imageresizehandles\";\nimport List from \"@ckeditor/ckeditor5-list/src/list\";\nimport Alignment from \"@ckeditor/ckeditor5-alignment/src/alignment\";\nimport Table from \"@ckeditor/ckeditor5-table/src/table\";\nimport TableToolbar from \"@ckeditor/ckeditor5-table/src/tabletoolbar\";\nimport TableProperties from \"@ckeditor/ckeditor5-table/src/tableproperties\";\nimport TableCellProperties from \"@ckeditor/ckeditor5-table/src/tablecellproperties\";\nimport TextTransformation from \"@ckeditor/ckeditor5-typing/src/texttransformation\";\nimport Indent from \"@ckeditor/ckeditor5-indent/src/indent\";\nimport IndentBlock from \"@ckeditor/ckeditor5-indent/src/indentblock\";\nimport Base64UploadAdapter from \"@ckeditor/ckeditor5-upload/src/adapters/base64uploadadapter\";\nimport LinkImage from \"@ckeditor/ckeditor5-link/src/linkimage\";\nimport HorizontalLine from \"@ckeditor/ckeditor5-horizontal-line/src/horizontalline\";\nimport ImageUploadEditing from \"@ckeditor/ckeditor5-image/src/imageupload/imageuploadediting\";\nimport UpcastWriter from \"@ckeditor/ckeditor5-engine/src/view/upcastwriter\";\nimport styled from \"styled-components\";\n\nimport FormData from 'form-data';\nimport { documentPastedImageApi,documentDetachImageApi } from \"../Utils/api\";\n\nconst editorConfiguration = {\n plugins: [\n ImageUploadEditing,\n PasteFromOffice,\n Essentials,\n Paragraph,\n Bold,\n Italic,\n Heading,\n Underline,\n Strikethrough,\n BlockQuote,\n Link,\n MediaEmbed,\n Font,\n Image,\n ImageStyle,\n ImageToolbar,\n ImageUpload,\n ImageCaption,\n ImageResize,\n ImageResizeEditing,\n Clipboard,\n ImageResizeHandles,\n LinkImage,\n List,\n Alignment,\n Table,\n TableToolbar,\n TextTransformation,\n TableProperties,\n TableCellProperties,\n Indent,\n IndentBlock,\n Base64UploadAdapter,\n InlineEditor,\n HorizontalLine,\n ],\n toolbar: [\n \"heading\",\n \"|\",\n \"bold\",\n \"italic\",\n \"underline\",\n \"strikethrough\",\n \"|\",\n \"fontSize\",\n \"fontColor\",\n \"fontBackgroundColor\",\n \"fontFamily\",\n \"|\",\n \"bulletedList\",\n \"numberedList\",\n \"|\",\n \"alignment:left\",\n \"alignment:right\",\n \"alignment:center\",\n \"alignment:justify\",\n \"|\",\n \"blockQuote\",\n \"HorizontalLine\",\n \"|\",\n \"insertTable\",\n \"imageUpload\",\n \"link\",\n \"mediaEmbed\",\n ],\n\n heading: {\n options: [\n {\n model: \"paragraph\",\n view: \"p\",\n title: \"본문\",\n class: \"ck-heading_paragraph\",\n },\n {\n model: \"heading1\",\n view: \"h1\",\n title: \"헤더1\",\n class: \"ck-heading_heading1\",\n },\n {\n model: \"heading2\",\n view: \"h2\",\n title: \"헤더2\",\n class: \"ck-heading_heading2\",\n },\n {\n model: \"heading3\",\n view: \"h3\",\n title: \"헤더3\",\n class: \"ck-heading_heading3\",\n },\n ],\n },\n fontSize: {\n options: [9, 10, 11, 12, 13, 14, 15, 16, 20, 24, 28],\n },\n alignment: {\n options: [\"justify\", \"left\", \"center\", \"right\"],\n },\n table: {\n contentToolbar: [\"tableColumn\", \"tableRow\", \"mergeTableCells\"],\n },\n image: {\n toolbar: [\n \"imageStyle:alignLeft\",\n \"imageStyle:full\",\n \"imageStyle:alignRight\",\n \"|\",\n \"imageStyle:align-block-left\",\n \"imageStyle:align-block-right\",\n \"imageStyle:block\",\n \"|\",\n \"imageTextAlternative\",\n \"|\",\n \"resizeImage\",\n \"toggleImageCaption\",\n \"linkImage\",\n ],\n resizeUnit: \"%\",\n resizeOptions: [\n {\n name: \"resizeImage:original\",\n value: null,\n icon: \"original\",\n },\n {\n name: \"resizeImage:25\",\n value: \"25\",\n icon: \"small\",\n },\n {\n name: \"resizeImage:50\",\n value: \"50\",\n icon: \"medium\",\n },\n {\n name: \"resizeImage:75\",\n value: \"75\",\n icon: \"large\",\n },\n ],\n },\n\n typing: {\n transformations: {\n remove: [\n \"enDash\",\n \"emDash\",\n \"oneHalf\",\n \"oneThird\",\n \"twoThirds\",\n \"oneForth\",\n \"threeQuarters\",\n ],\n },\n },\n placeholder: \"본문을 입력하세요.\",\n fontFamily: {\n options: [\n \"default\",\n \"Ubuntu, Arial, sans-serif\",\n \"Ubuntu Mono, Courier New, Courier, monospace\",\n ],\n },\n};\nfunction Editor({ _docContentHandler = null, data = null, readOnly = false ,_id=null , height=null}) {\n\n /*data props에 나중에 데이터 불러와서 넣으면 됨.\n */\n\n const paste = async (event,data,editor)=>{\n if (data.dataTransfer.files.length > 0) {\n // 기존 파이프라인에서 추가된 컨텐츠 삭제\n editor.model.deleteContent(editor.model.document.selection);\n\n // file 정보 받아오기\n const file = data.dataTransfer.files[0];\n const images = new FormData();\n images.append('file',file);\n images.append('_id',_id);\n\n // 객체 생성\n const result = await documentPastedImageApi(images);\n editor.model.change(writer => {\n const imageElement = writer.createElement('imageInline', {\n src: 'http://'+result.data\n });\n // 현재 에디터의 모델이 선택하고 있는 영역에 새로 만든 컨텐츠를 삽입.\n editor.model.insertContent(imageElement, editor.model.document.selection);\n });\n }\n //이벤트를 종료함으로써 이후 로직을 무시\n event.stop();\n\n \n \n }\n return (\n \n {\n if (!readOnly) {\n const data = editor.getData();\n _docContentHandler(data);\n }\n }}\n onReady={(editor) => {\n const documentView = editor.editing.view.document\n documentView.on('paste', (event,data)=>{paste(event,data,editor)}, { priority: 'lowest' });\n // priority가 가장 낮기 때문에 기존의 파이프라인 마지막 결과 컨텐츠에 접근할 수 있음.\n documentView.on('drop', (event,data)=>{paste(event,data,editor)}, { priority: 'lowest' });\n const toolbarElement = editor.ui.view.toolbar.element;\n if (readOnly) {\n toolbarElement.style.display = \"none\";\n }\n }}\n />\n \n );\n}\n\nconst CustomCKEditor = styled.div`\n width: 100%;\n .ck-editor__editable_inline {\n height:${(props) => props.height || \"1000px\"};\n padding: 2rem;\n }\n`;\nexport default Editor;\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { useSelector } from \"react-redux\";\nimport Editor from \"../Editor\";\nfunction CurationWorkContentModal({ closeModal }) {\n const curation_work_content = useSelector(\n (state) => state.modal.modalData.curation_work_content\n );\n return (\n \n \n 큐레이션 작업내용 확인\n \n 해당 작업자의 큐레이션 작업 내역을 확인하세요.\n \n \n \n \n \n \n );\n}\nexport default CurationWorkContentModal;\n\n/* 모달 디자인 관련 컴포넌트 ... 나중에 전역 관리 할 수 있음 좋겠네 ㅠ */\nconst ModalWrapper = styled.div`\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n background-color: white;\n border-radius: 0.25rem;\n padding: 1.5rem;\n`;\nconst Modalheader = styled.div`\n justify-content: left;\n margin-bottom: 1rem;\n`;\nconst ModalTitle = styled.div`\n font-size: 24px;\n font-weight: bold;\n margin-bottom: 0.5rem;\n color: rgba(0, 0, 0, 0.7);\n`;\nconst ModalSubTitle = styled.div`\n font-size: 16px;\n margin-bottom: 0.5rem;\n`;\nconst ModalBody = styled.div`\n display: flex;\n flex-direction: column;\n margin-bottom: 1rem;\n`;\n\nconst ModalActions = styled.div`\n display: flex;\n justify-content: center;\n flex-direction: row;\n`;\n\nconst Button = styled.button`\n background-color: ${(props) => props.color || \"grey\"};\n cursor: pointer;\n min-width: 5rem;\n border: none;\n border-radius: 4px;\n color: white;\n font-weight: bold;\n margin: 0 0.5rem 0 0.5rem;\n`;\n\nconst SearchResultWrapper = styled.div`\n border: solid 1px #d6d6d6;\n border-radius: 4px;\n margin: 1rem 0 1rem 0;\n height: 30rem;\n overflow-y: auto;\n`;\n\nconst SearchResultRow = styled.div`\n padding: 1rem;\n border-bottom: solid 1px #d6d6d6;\n`;\n","import React from \"react\";\nimport { useSelector, useDispatch } from \"react-redux\";\nimport styled from \"styled-components\";\nimport { setModal, setModalData } from \"../../Modules/modal\";\n/* modal Components */\nimport CategoryModal from \"./CategoryModal\";\nimport UserInfoModal from \"./UserInfoModal\";\nimport AxisCategoryModal from \"./AxisCategoryModal\";\nimport HostSelectModal from \"./HostSelectModal\";\nimport CurationWorkContentModal from \"./CurationWorkContentModal\";\n\nexport const MODAL_TYPES = {\n UserInfoModal: \"UserInfoModal\",\n CategoryModal: \"CategoryModal\",\n AxisCategoryModal: \"AxisCategoryModal\",\n HostSelectModal: \"HostSelectModal\",\n CurationWorkContentModal: \"CurationWorkContentModal\",\n};\n\nconst BACKDROP_CLOSE = {\n [MODAL_TYPES.UserInfoModal]: false,\n [MODAL_TYPES.CategoryModal]: true,\n [MODAL_TYPES.AxisCategoryModal]: true,\n [MODAL_TYPES.HostSelectModal]: true,\n [MODAL_TYPES.CurationWorkContentModal]: true,\n};\n\nconst MODAL_COMPONENTS = {\n [MODAL_TYPES.CategoryModal]: CategoryModal,\n [MODAL_TYPES.UserInfoModal]: UserInfoModal,\n [MODAL_TYPES.AxisCategoryModal]: AxisCategoryModal,\n [MODAL_TYPES.HostSelectModal]: HostSelectModal,\n [MODAL_TYPES.CurationWorkContentModal]: CurationWorkContentModal,\n};\n\nfunction GlobalModal() {\n const dispatch = useDispatch();\n /* modalType이 존재한다면 모달창을 렌더링하도록 하며, modalType이 null이면 모달창을 렌더링하지 않는다. */\n /* 이 Modal 컴포넌트는 App.js 에 */\n /* https://mygumi.tistory.com/406 참고코드 */\n\n const modalType = useSelector((state) => state.modal.modalType);\n\n const closeModal = () => {\n dispatch(setModal(null));\n };\n\n const onBackDrop = (e) => {\n if (!BACKDROP_CLOSE[modalType]) return;\n closeModal();\n };\n\n const executeModal = (modalData, dataType) => {\n dispatch(setModalData(modalData, dataType));\n };\n\n const renderComponent = () => {\n if (!modalType) {\n return null;\n }\n const ModalComponent = MODAL_COMPONENTS[modalType];\n return (\n \n );\n };\n\n return (\n <>\n {modalType ? (\n <>\n \n e.stopPropagation()}>\n {renderComponent()}\n \n \n \n ) : null}\n \n );\n}\n\nconst Background = styled.div`\n z-index: 2000;\n position: fixed;\n left: 0;\n top: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n background: rgba(0, 0, 0, 0.5);\n`;\n\nconst ModalWrapper = styled.div`\n position: relative;\n /* top: 50%;\n left: 50%;\n transform: translate(-50%, -50%); */\n z-index: 2001;\n max-width: 960px;\n width: 700px;\n box-shadow: 0px 11px 15px -7px rgba(0, 0, 0, 0.2),\n 0px 24px 38px 3px rgba(0, 0, 0, 0.14), 0px 9px 46px 8px rgba(0, 0, 0, 0.12);\n margin: 2rem;\n`;\n\nexport default GlobalModal;\n","import React from \"react\"\nimport styled from \"styled-components\"\nimport {BiArrowToTop} from \"react-icons/bi\"\nfunction TopButton(){\n const scrollToTop = ()=>{\n window.scrollTo(0, 0);\n }\n return ()\n}\n\nconst Top = styled.button`\n display: flex;\n position: fixed;\n align-items: center;\n justify-content: center;\n height: 3rem;\n width:3rem;\n border: none;\n border-radius: 3rem;\n font-size: 20px;\n background-color: #435269;\n color: white;\n border: solid 1px #d6d6d6;\n box-shadow: 0 0 0.875rem 0 rgba(33, 37, 41, 0.05);\n z-index: 999;\n right: 0;\n bottom: 0;\n margin: 2rem;\n cursor: pointer;\n transition: 0.2s;\n &:hover {\n background-color: #d8dee6;\n color: #435269;\n font-weight: bold;\n }\n & * {\n margin: 4px;\n }\n`;\nexport default TopButton;\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { myColors } from \"styles/colors\";\nfunction Login({ _inputIDHandler, _inputPWHandler, loginFunc, errorMsg }) {\n return (\n <>\n \n loginFunc(e)}>\n \n \"넥스트렌드\n \n \n \n {errorMsg !== \"\" ? {errorMsg} : null}\n 로그인\n \n \n

\n \n 서비스 소개\n \n

\n

\n powered by KN Lab.Inc\n

\n
\n
\n \n );\n}\n\nconst Wrap = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100vh;\n padding: 1rem;\n background-image: url(\"../../img/login_back.jpg\");\n background-repeat: no-repeat;\n background-size: cover;\n`;\n\nconst LoginContainer = styled.form`\n display: flex;\n flex-direction: column;\n max-width: 30rem;\n align-items: center;\n justify-content: center;\n`;\n\nconst LogoContainer = styled.div`\n img {\n max-width: 100%;\n }\n margin-bottom: 1rem;\n`;\nconst CustomInput = styled.input`\n border-radius: 1.5rem;\n width: 90%;\n height: 3rem;\n border: solid 1px #d6d6d6;\n padding-left: 1rem;\n font-size: 16px;\n margin: 0.5rem 0 0.5rem 0;\n`;\n\nconst LoginButton = styled.button`\n width: 90%;\n height: 3rem;\n border-radius: 1.5rem;\n border: solid 1px #d6d6d6;\n padding: 0 1rem;\n margin: 0.5rem 0;\n font-size: 16px;\n\n cursor: pointer;\n background-color: #435269;\n color: white;\n font-weight: bold;\n &:hover {\n filter: brightness(150%);\n transition: all 0.5s;\n }\n &:active {\n filter: brightness(50%);\n transition: all 0.2s;\n }\n`;\n\nconst PageIngoContainer = styled.div`\n display: flex;\n justify-content: center;\n flex-wrap: wrap;\n row-gap: 1rem;\n column-gap: 10rem;\n max-width: 30rem;\n width: 100%;\n & > p:hover {\n text-decoration: underline;\n }\n`;\n\nconst ErrorMsg = styled.p`\n color: ${myColors.red};\n`;\n\nexport default Login;\n","import React from \"react\";\nimport { usePromiseTracker } from \"react-promise-tracker\";\nimport styled from \"styled-components\";\nimport BeatLoader from \"react-spinners/BeatLoader\";\nimport { myColors } from \"styles/colors\";\nfunction Loading() {\n const { promiseInProgress } = usePromiseTracker();\n return (\n <>\n {promiseInProgress && (\n <>\n \n \n \n \n \n \n )}\n \n );\n}\n\nconst Background = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n position: absolute;\n z-index: 10;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n`;\n\nconst LoaderContainer = styled.div`\n display: block;\n z-index: 10;\n`;\n\nexport default Loading;\n","import styled from \"styled-components\";\nimport Loading from \"./Loading\";\n\nexport const LoadingWrapper = ({ children }) => {\n return (\n \n \n {children}\n \n );\n};\n\nconst Wrap = styled.div`\n position: relative;\n width: 100%;\n height: 100%;\n`;\n","import React, { useState } from \"react\";\nimport { useDispatch } from \"react-redux\";\n\nimport { LoginApi } from \"Utils/api\";\nimport { setLogin } from \"Modules/login\";\n\nimport Login from \"./Login\";\nimport { LoadingWrapper } from \"Components/LoadingWrapper\";\nimport { trackPromise } from \"react-promise-tracker\";\n\nfunction LoginContainer() {\n const dispatch = useDispatch();\n\n const [inputID, setInputID] = useState(\"\");\n const [inputPW, setInputPW] = useState(\"\");\n const [errorMsg, setErrorMsg] = useState(\"\");\n\n const _inputIDHandler = (e) => {\n setInputID(e.target.value);\n };\n const _inputPWHandler = (e) => {\n setInputPW(e.target.value);\n };\n\n const loginFunc = (e) => {\n e.preventDefault();\n if (inputID === \"\") {\n setErrorMsg(\"아이디를 입력해주세요.\");\n } else if (inputPW === \"\") {\n setErrorMsg(\"비밀번호를 입력해주세요.\");\n } else {\n setErrorMsg(\"\");\n trackPromise(\n LoginApi(inputID, inputPW)\n .then((res) => {\n const _token = res.data.token;\n const _refreshToken = res.data.refreshToken;\n // 토큰 정보를 담는 객체\n const _tokensObj = {\n token: _token,\n refreshToken: _refreshToken,\n };\n\n dispatch(setLogin(_tokensObj));\n })\n .catch((err) => {\n if (err.response.status === 401) {\n alert(\"아이디 또는 비밀번호가 일치하지 않습니다.\");\n }\n })\n );\n }\n };\n\n return (\n <>\n \n \n \n \n );\n}\n\nexport default LoginContainer;\n","import React from \"react\";\nimport { Route, Redirect } from \"react-router-dom\";\nimport { useSelector } from \"react-redux\";\nimport Loading from \"../Components/Loading\";\nimport styled from \"styled-components\";\n\n/* \n 로그인한 상태에서만 접근 가능한 페이지다.\n 로그인하지 않은 상태로 페이지에 접근하려 하면 로그인 화면으로 리다이렉트 시킨다.\n*/\n\nfunction PrivateRoute({ component: Component, ...rest }) {\n const isLogin = useSelector((state) => state.login.isLogin);\n\n return (\n \n isLogin ? (\n \n {/* */}\n \n \n ) : (\n \n )\n }\n />\n );\n}\n\nconst Wrap = styled.div`\n position: relative;\n width: 100%;\n height: 100%;\n`;\nexport default PrivateRoute;\n","import {\n BsFileEarmarkDiff,\n BsInboxes,\n BsJournal,\n BsSave,\n} from \"react-icons/bs\";\n\nexport const STATUS_CODE_SET = {\n 2: {\n type: \"refine\",\n mainTitle: \"크롤 데이터 정제\",\n title: \"데이터 정제 진행\",\n icon: BsFileEarmarkDiff,\n },\n 3: {\n type: \"refine\",\n mainTitle: \"크롤 데이터 정제\",\n title: \"데이터 정제 진행\",\n icon: BsFileEarmarkDiff,\n },\n 4: {\n type: \"register\",\n mainTitle: \"크롤 데이터 등록\",\n title: \"데이터 등록 진행\",\n icon: BsSave,\n },\n 5: {\n type: \"register\",\n mainTitle: \"크롤 데이터 등록\",\n title: \"데이터 등록 진행\",\n icon: BsSave,\n },\n 6: {\n type: \"archive\",\n title: \"아카이브 데이터 수정\",\n icon: BsInboxes,\n },\n 8: {\n type: \"curation\",\n title: \"큐레이션 데이터 수정\",\n icon: BsJournal,\n },\n};\n","import { _axios } from \"services/axiosService\";\nimport { HTTP_METHOD } from \".\";\n\nexport const crawlDataUpdate = async (data) => {\n return _axios({\n url: \"/file/uploadExcelData\",\n method: HTTP_METHOD.POST,\n data,\n });\n};\n\nexport const AddThumbnails = async (docId, statusCode, files) => {\n return _axios({\n headers: { \"Content-Type\": \"multipart/form-data\" },\n url: `/crawl/thumbnail/${docId}`,\n method: HTTP_METHOD.POST,\n params: { statusCode },\n data: files,\n });\n};\n\nexport const DeleteThumbnails = async (docId, statusCode, indexes) => {\n return _axios({\n url: `/crawl/thumbnail/${docId}`,\n method: HTTP_METHOD.DELETE,\n params: { statusCode },\n data: {\n deleteIndexes: indexes,\n },\n });\n};\n","import React, {\n useEffect,\n useState,\n forwardRef,\n useImperativeHandle,\n} from \"react\";\nimport styled from \"styled-components\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { setModal, setModalData, setCategoryModalType } from \"../Modules/modal\";\nimport { MdSettings } from \"react-icons/md\";\nimport Editor from \"./Editor\";\nimport { myColors, tailwindColors } from \"styles/colors\";\nimport { BsPlusCircle, BsXCircle } from \"react-icons/bs\";\nimport { AddThumbnails, DeleteThumbnails } from \"services/api/crawl\";\nimport FormData from \"form-data\";\n\n/* forwordRef는 부모 컴포넌트에서 자식 컴포넌트를 컨트롤하기 위해 */\nfunction CrawlDataForm({ docs, type, statusCode, _id }, ref) {\n const dispatch = useDispatch();\n\n const [itemId, setItemId] = useState(\"\");\n /* 현재 보여질 데이터 정보들 */\n /* redux에서 관리되는 데이터 */\n const docCategory = useSelector(\n (state) => state.modal.modalData.doc_category\n ); // dc_code > doc_category 문서의 정책 분류\n const docContentCategory = useSelector(\n (state) => state.modal.modalData.doc_content_category\n ); // doc_content_category 문서 내용의 성격 구분\n const docContentType = useSelector(\n (state) => state.modal.modalData.doc_content_type\n ); // doc_content_type 문서의 유형 분류\n const docCountry = useSelector((state) => state.modal.modalData.doc_country); // dc_country > doc_country 문서 대상 국가\n const docPublishCountry = useSelector(\n (state) => state.modal.modalData.doc_publish_country\n ); // dc_country_pub > doc_publish_country 문서 발행 국가\n const docCustom = useSelector((state) => state.modal.modalData.doc_custom); // doc_custom 기관 맞춤형 카테고리\n const docLanguage = useSelector(\n (state) => state.modal.modalData.doc_language\n ); // dc_lang > doc_language 문서 언어\n const docTopic = useSelector((state) => state.modal.modalData.doc_topic); // doc_topic 문서 내용의 이슈 주제 분류\n const docHost = useSelector((state) => state.modal.modalData.doc_host); // doc_host, doc_publisher host 및 발급기관명 관리\n /* 현재 보여질 데이터 정보들 */\n const [docContent, setDocContent] = useState(\"\"); // dc_content > doc_content 문서 본문\n //const [docHost, setDocHost] = useState(\"\"); // dc_host > doc_host 기관 host 도메인\n const [docKeyword, setDocKeyword] = useState(\"\"); // dc_keyword > doc_keyword 키워드 검색단어. 받아올 떈 배열이나 관리는 문자열로 할 예정. 현재 db 필드에는 doc_keyowrd 로 되어있음..\n const [docKorSummary, setDocKorSummary] = useState(\"\"); // dc_smry_kr > doc_kor_summary 문서 한글 요약\n const [docOriginSummary, setDocOriginSummary] = useState(\"\"); // dc_smry_or > doc_origin_summary 문서 원문 요약\n const [docKorTitle, setDocKorTitle] = useState(\"\"); // dc_title_kr > doc_kor_title 문서 한글 제목\n const [docOriginTitle, setDocOriginTitle] = useState(\"\"); // dc_title_or > doc_kor_origin 문서 원문제목\n const [docMemo, setDocMemo] = useState(\"\"); // doc_memo 관리자 전용 메모\n const [docPage, setDocPage] = useState(\"\"); // dc_page > doc_page 문서 페이지 수\n const [docBiblio, setDocBiblio] = useState(\"\"); // doc_biblio 문서의 서지사항\n const [docPublisher, setDocPublisher] = useState(\"\"); // doc_publisher 문서 발급 기관명\n const [docPublishing, setDocPublishing] = useState(\"\"); // doc_publishing 주문형 조사과제명의 세부과업명\n const [docRecomment, setDocRecomment] = useState(\"\"); // doc_recomment 큐레이션 추천문서\n const [docPublishDate, setDocPublishDate] = useState(\"\"); // doc_publish_date 수집 문서의 발행일\n const [docWriteDate, setDocWriteDate] = useState(\"\"); // doc_write_date 수집 문서의 작성일\n const [docRegisterDate, setDocRegisterDate] = useState(\"\"); // doc_register_date 문서의 서비스 등록일\n const [docCollectDate, setDocCollectDate] = useState(\"\"); // doc_collect_date 문서 수집일 (크롤링 일)\n const [docBundleTitle, setDocBundleTitle] = useState(\"\"); // doc_bundle_title 묶음문서 제목\n const [docBundleUrl, setDocBundleUrl] = useState(\"\"); // doc_bundle_url 묶음문서 링크\n const [docRelateTitle, setDocRelateTitle] = useState(\"\"); // doc_relate_title 연관문서 제목\n const [docRelateUrl, setDocRelateUrl] = useState(\"\"); // doc_relate_url 연관문서 링크\n const [docThumbnail, setDocThumbnail] = useState([]); // dc_cover > doc_thumbnail 문서 표지 파일\n const [docUrl, setDocUrl] = useState(\"\"); // dc_url_loc > doc_url 문서의 파일이 위치한 url\n const [docUrlIntro, setDocUrlIntro] = useState(\"\"); // dc_url_intro > doc_url_intro 문서 파일의 안내 url\n const [docProject, setDocProject] = useState(\"\"); // doc_project 조사과제명\n /* 데이터 관리 및 저장용 변수 */\n const [docThumbnailSelect, setDocThumbnailSelect] = useState(\"\"); // doc_thumbnail 에서 고른 표지\n const [docKeywordString, setDocKeywordString] = useState(\"\"); // doc_keyword를 string으로 관리하기 위한 변수\n\n /* 데이터 저장용 변수 */\n const [docCategoryIndexList, setDocCategoryIndexList] = useState([]); // doc_category의 index리스트. 데이터 저장용 변수\n const [docCountryIndexList, setDocCountryIndexList] = useState([]); // doc_country의 index리스트. 데이터 저장용 변수\n const [docPublishCountryIndexList, setDocPublishCountryIndexList] = useState(\n []\n ); // doc_publish_country의 index리스트. 데이터 저장용 변수\n const [docLanguageIndexList, setDocLanguageIndexList] = useState([]); // doc_language의 index리스트. 데이터 저장용 변수\n const [docContentCategoryIndexList, setDocContentCategoryIndexList] =\n useState([]); // doc_content_category의 index리스트. 데이터 저장용 변수\n const [docContentTypeIndexList, setDocContentTypeIndexList] = useState([]); // doc_content_type의 index리스트. 데이터 저장용 변수.\n const [docCustomIndexList, setDocCustomIndexList] = useState([]); // doc_custom의 index리스트. 데이터 저장용 변수\n const [docTopicIndexList, setDocTopicIndexList] = useState([]); // doc_topic 의 index리스트. 데이터 저장용 변수\n\n const [mainThumbnail, setMainThumbnail] = useState(\"\");\n\n const [uploadThumbnailList, setUploadThumbnailList] = useState([]);\n const [uploadThumbnailSrcList, setUploadThumbnailSrcList] = useState([]);\n\n /* 데이터 값 핸들러 */\n const _docKorSummaryHandler = (e) => {\n setDocKorSummary(e.target.value);\n };\n const _docOriginSummaryHandler = (e) => {\n setDocOriginSummary(e.target.value);\n };\n const _docKorTitleHandler = (e) => {\n setDocKorTitle(e.target.value);\n };\n const _docOriginTitleHandler = (e) => {\n setDocOriginTitle(e.target.value);\n };\n const _docMemoHandler = (e) => {\n setDocMemo(e.target.value);\n };\n const _docPageHandler = (e) => {\n setDocPage(e.target.value);\n };\n const _docBiblioHandler = (e) => {\n setDocBiblio(e.target.value);\n };\n const _docPublisherHandler = (e) => {\n setDocPublisher(e.target.value);\n };\n const _docPublishingHandler = (e) => {\n setDocPublishing(e.target.value);\n };\n const _docRecommentHandler = (e) => {\n e.target.value = e.target.value.replace(/[^A-Za-z]/gi, \"\");\n setDocRecomment(e.target.value);\n };\n const _docPublishDateHandler = (e) => {\n setDocPublishDate(e.target.value);\n };\n const _docWriteDateHandler = (e) => {\n setDocWriteDate(e.target.value);\n };\n const _docRegisterDateHandler = (e) => {\n setDocRegisterDate(e.target.value);\n };\n const _docCollectDateHandler = (e) => {\n setDocCollectDate(e.target.value);\n };\n const _docBundleTitleHandler = (e) => {\n setDocBundleTitle(e.target.value);\n };\n const _docBundleUrlHandler = (e) => {\n setDocBundleUrl(e.target.value);\n };\n const _docRelateTitleHandler = (e) => {\n setDocRelateTitle(e.target.value);\n };\n const _docRelateUrlHandler = (e) => {\n setDocRelateUrl(e.target.value);\n };\n const _docUrlHandler = (e) => {\n setDocUrl(e.target.value);\n };\n const _docUrlIntroHandler = (e) => {\n setDocUrlIntro(e.target.value);\n };\n const _docProjectHandler = (e) => {\n setDocProject(e.target.value);\n };\n\n const _docKeywordStringHandler = (e) => {\n setDocKeywordString(e.target.value);\n };\n const _docThumbnailSelectHandler = (e) => {\n console.log(+e.target.value);\n setDocThumbnailSelect(+e.target.value);\n };\n const _docContentHandler = (data) => {\n setDocContent(data);\n };\n\n const _openCategoryModal = (categoryModalType) => {\n dispatch(setModal(\"CategoryModal\"));\n dispatch(setCategoryModalType(categoryModalType));\n };\n\n const _openHostSelectModal = () => {\n dispatch(setModal(\"HostSelectModal\"));\n };\n /* 부모 컴포넌트에서 호출할 수 있는 함수.*/\n /* input state 값들을 객체에 담아서 반환함.*/\n useImperativeHandle(ref, () => ({\n getCrawlFormData() {\n let _docs = {};\n _docs[\"doc_content\"] = docContent;\n _docs[\"doc_write_date\"] = docWriteDate;\n _docs[\"doc_publish_date\"] = docPublishDate;\n _docs[\"doc_collect_date\"] = docCollectDate;\n _docs[\"doc_register_date\"] = docRegisterDate;\n _docs[\"doc_keyowrd\"] = docKeyword; // 오타로 필드가 설정되어있음..\n _docs[\"doc_kor_title\"] = docKorTitle;\n _docs[\"doc_origin_title\"] = docOriginTitle;\n _docs[\"doc_kor_summary\"] = docKorSummary;\n _docs[\"doc_origin_summary\"] = docOriginSummary;\n _docs[\"doc_page\"] = docPage;\n _docs[\"doc_host\"] = docHost && docHost.IDX;\n _docs[\"doc_url\"] = docUrl;\n _docs[\"doc_url_intro\"] = docUrlIntro;\n _docs[\"doc_project\"] = docProject;\n _docs[\"doc_biblio\"] = docBiblio;\n _docs[\"doc_memo\"] = docMemo;\n _docs[\"doc_publisher\"] = docPublisher;\n _docs[\"doc_publishing\"] = docPublishing;\n _docs[\"doc_recomment\"] = docRecomment.charCodeAt(0);\n _docs[\"doc_bundle_title\"] = docBundleTitle;\n _docs[\"doc_bundle_url\"] = docBundleUrl;\n _docs[\"doc_relate_title\"] = docRelateTitle;\n _docs[\"doc_relate_url\"] = docRelateUrl;\n _docs[\"doc_keyowrd\"] = docKeyword;\n _docs[\"doc_category\"] = docCategoryIndexList;\n _docs[\"doc_country\"] = docCountryIndexList;\n _docs[\"doc_publish_country\"] = docPublishCountryIndexList;\n _docs[\"doc_language\"] = docLanguageIndexList;\n _docs[\"doc_content_category\"] = docContentCategoryIndexList;\n _docs[\"doc_content_type\"] = docContentTypeIndexList;\n _docs[\"doc_custom\"] = docCustomIndexList;\n _docs[\"doc_topic\"] = docTopicIndexList;\n\n _docs[\"doc_thumbnail\"] = docThumbnail;\n // type !== \"screening\" && type !== \"refine\" && type !== \"register\"\n // ? docThumbnailSelect\n // : docThumbnail;\n\n _docs[\"item_id\"] = itemId;\n\n _docs[\"cover_thumbnail\"] = docThumbnailSelect;\n\n return _docs;\n },\n }));\n\n const onChangeThumbnailAddInput = (e) => {\n const formData = new FormData();\n [...e.target.files].forEach((file) => formData.append(\"files\", file));\n AddThumbnails(_id, statusCode, formData)\n .then((res) => {\n console.log(\"리턴썸네일 : \", res.data.doc_thumbnail);\n console.log(res.data);\n setDocThumbnail(res.data.doc_thumbnail);\n })\n .catch((err) => console.log(\"썸네일추가실패\"));\n // [...e.target.files].forEach((image) => {\n // setUploadThumbnailList((prev) => [...prev, image]);\n // encodeFileToBase64(image);\n // });\n e.target.value = null;\n };\n\n const encodeFileToBase64 = (fileBlob) => {\n const reader = new FileReader();\n reader.readAsDataURL(fileBlob);\n reader.onload = () => {\n setUploadThumbnailSrcList((prev) => [...prev, reader.result]);\n };\n };\n\n const deleteUploadThumbnail = (index) => {\n setUploadThumbnailList((prev) => prev.filter((v, i) => i !== index));\n setUploadThumbnailSrcList((prev) => prev.filter((v, i) => i !== index));\n };\n\n const deleteThumbnail = (index) => {\n if (\n confirm(\n \"해당 표지 파일을 삭제하시겠습니까? \\n삭제된 표지 파일은 복구할 수 없습니다\"\n )\n ) {\n DeleteThumbnails(_id, statusCode, [index])\n .then((res) => {\n console.log(\"삭제결과 : \", res.data);\n setDocThumbnail(res.data.doc_thumbnail);\n })\n .catch((err) => console.log(\"삭제실패\"));\n }\n };\n\n useEffect(() => {\n /* docs가 빈 객체가 아니라면 */\n if (Object.keys(docs).length !== 0) {\n setItemId(docs.item_id);\n setDocContent(\n docs.doc_content.replaceAll(\"\\n\", \"


\")\n ); // /n 개행 태그를
태그로 치환하여 공백을 그대로 출력\n setDocWriteDate(\n docs.doc_write_date && docs.doc_write_date.substring(0, 10)\n ); // date 객체에 넣어주기\n setDocRegisterDate(\n docs.doc_register_date && docs.doc_register_date.substring(0, 10)\n );\n setDocPublishDate(\n docs.doc_publish_date && docs.doc_publish_date.substring(0, 10)\n );\n setDocCollectDate(\n docs.doc_collect_date && docs.doc_collect_date.substring(0, 10)\n );\n setDocKeywordString(docs.doc_keyword && docs.doc_keyword.join(\", \"));\n setDocThumbnail(docs.doc_thumbnail);\n setDocThumbnailSelect(\n type === \"archive\" ? docs.doc_thumbnail[0] : docs.doc_thumbnail\n );\n setDocOriginSummary(docs.doc_origin_summary);\n setDocKorSummary(docs.doc_kor_summary);\n setDocPublisher(docs.doc_publisher);\n setDocPublishing(docs.doc_publishing);\n setDocPage(docs.doc_page);\n setDocOriginTitle(docs.doc_origin_title);\n setDocKorTitle(docs.doc_kor_title);\n setDocUrl(docs.doc_url);\n setDocUrlIntro(docs.doc_url_intro);\n setDocRelateTitle(docs.doc_relate_title);\n setDocRelateUrl(docs.doc_relate_url);\n setDocBundleTitle(docs.doc_bundle_title);\n setDocBundleUrl(docs.doc_bundle_url);\n setDocRecomment(docs.doc_recomment);\n setDocBiblio(docs.doc_biblio);\n setDocMemo(docs.doc_memo);\n\n setDocThumbnailSelect(docs.doc_spare2);\n dispatch(setModalData(docs.doc_category, \"doc_category\"));\n dispatch(setModalData(docs.doc_country, \"doc_country\"));\n dispatch(setModalData(docs.doc_publish_country, \"doc_publish_country\"));\n dispatch(setModalData(docs.doc_language, \"doc_language\"));\n dispatch(setModalData(docs.doc_custom, \"doc_custom\"));\n dispatch(setModalData(docs.doc_topic, \"doc_topic\"));\n dispatch(setModalData(docs.doc_content_category, \"doc_content_category\"));\n dispatch(setModalData(docs.doc_content_type, \"doc_content_type\"));\n dispatch(setModalData(docs.doc_host[0], \"doc_host\"));\n }\n console.log(docs);\n }, [docs]);\n\n useEffect(() => {\n /* dcKeywordString 값이 변경되면 dcKeyword 배열도 자동으로 반영되도록.*/\n setDocKeyword(docKeywordString.split(\",\").map((item) => item.trim()));\n }, [docKeywordString]);\n\n useEffect(() => {\n const _list = docCountry.map((item) => item.CODE);\n setDocCountryIndexList(_list);\n }, [docCountry]);\n\n useEffect(() => {\n const _list = docCategory.map((item) => item.CODE);\n setDocCategoryIndexList(_list);\n }, [docCategory]);\n\n useEffect(() => {\n const _list = docPublishCountry.map((item) => item.CODE);\n setDocPublishCountryIndexList(_list);\n }, [docPublishCountry]);\n\n useEffect(() => {\n const _list = docLanguage.map((item) => item.CODE);\n setDocLanguageIndexList(_list);\n }, [docLanguage]);\n\n useEffect(() => {\n const _list = docContentCategory.map((item) => item.CODE);\n setDocContentCategoryIndexList(_list);\n }, [docContentCategory]);\n\n useEffect(() => {\n const _list = docContentType.map((item) => item.CODE);\n setDocContentTypeIndexList(_list);\n }, [docContentType]);\n\n useEffect(() => {\n const _list = docCustom.map((item) => item.CODE);\n setDocCustomIndexList(_list);\n }, [docCustom]);\n\n useEffect(() => {\n const _list = docTopic.map((item) => item.CODE);\n setDocTopicIndexList(_list);\n }, [docTopic]);\n\n return (\n \n \n \n

원제목

\n \n
\n \n

한글제목

\n \n
\n
\n \n \n

원문 요약

\n \n
\n
\n \n \n

한글 요약

\n \n
\n
\n {type !== \"refine\" && (\n <>\n \n \n
\n

문서 정책 분류

\n {\n _openCategoryModal(\"doc_category\");\n }}\n >\n 설정\n \n
\n
\n {docCategory.map((item, index) => {\n return {item.CT_NM};\n })}\n
\n
\n \n
\n

문서 토픽 분류

\n {\n _openCategoryModal(\"doc_topic\");\n }}\n >\n 설정\n \n
\n
\n {docTopic.map((item, index) => {\n return {item.CT_NM};\n })}\n
\n
\n
\n \n \n
\n

문서 대상 국가

\n {\n _openCategoryModal(\"doc_country\");\n }}\n >\n 설정\n \n
\n
\n {docCountry.map((item, index) => {\n return {item.CT_NM};\n })}\n
\n
\n \n
\n

문서 발급 국가

\n {\n _openCategoryModal(\"doc_publish_country\");\n }}\n >\n 설정\n \n
\n
\n {docPublishCountry.map((item, index) => {\n return {item.CT_NM};\n })}\n
\n
\n
\n \n \n
\n

문서 유형 분류

\n {\n _openCategoryModal(\"doc_content_type\");\n }}\n >\n 설정\n \n
\n
\n {docContentType.map((item, index) => {\n return {item.CT_NM};\n })}\n
\n
\n \n
\n

문서 내용 구분 분류

\n {\n _openCategoryModal(\"doc_content_category\");\n }}\n >\n 설정\n \n
\n
\n {docContentCategory.map((item, index) => {\n return {item.CT_NM};\n })}\n
\n
\n
\n \n \n
\n

기관맞춤형 분류

\n {\n _openCategoryModal(\"doc_custom\");\n }}\n >\n 설정\n \n
\n
\n {docCustom.map((item, index) => {\n return {item.CT_NM};\n })}\n
\n
\n
\n \n )}\n \n \n

문서 위치 URL

\n \n
\n \n

문서 안내 URL

\n \n
\n
\n \n \n
\n

HOST 도메인

\n \n
\n
\n {docHost && docHost.HOST}\n dispatch(setModalData(\"\", \"doc_host\"))}\n >\n X비우기\n \n
\n
\n \n

발급기관 명

\n \n
\n
\n \n \n
\n

언어

\n {\n _openCategoryModal(\"doc_language\");\n }}\n >\n 선택\n \n
\n
\n {docLanguage.map((item, index) => {\n return {item.CT_NM};\n })}\n
\n
\n \n

페이지 수

\n \n
\n
\n \n \n

원문 작성일

\n \n
\n \n

원문 발행일

\n \n
\n
\n \n \n

데이터 수집일

\n \n
\n \n

서비스 등록일

\n \n
\n
\n \n \n

조사과제명

\n \n
\n \n

주문형 조사과제명의 세부과업명

\n \n
\n
\n \n \n

연관문서 제목

\n \n
\n \n

연관문서 URL

\n \n
\n
\n \n \n

묶음문서 제목

\n \n
\n \n

묶음문서 URL

\n \n
\n
\n \n \n

큐레이션 추천문서

\n \n
\n \n

서지사항

\n \n
\n
\n \n \n

키워드

\n \n
\n
\n \n \n

관리자 메모

\n \n
\n
\n {(type === \"curation\" || type === \"archive\") && (\n <>\n \n \n

내용

\n
\n \n
\n
\n
\n \n \n

표지 파일

\n \n {docThumbnail?.map((item, index) => {\n return (\n \n \n \n
deleteThumbnail(index)}>\n \n
\n \n );\n })}\n \n
\n {/* \n {type === \"curation\" ? (\n \n ) : (\n docThumbnail?.map((item, index) => {\n return (\n \n \n \n
deleteThumbnail(index)}>\n \n
\n \n );\n })\n )}\n \n
*/}\n
\n
\n \n )}\n
\n );\n}\n\nconst Wrap = styled.div`\n display: flex;\n flex-direction: column;\n width: 100%;\n border: 1px solid ${tailwindColors[\"grey-400\"]};\n`;\nconst CustomFormItem = styled.div`\n flex: 1;\n display: flex;\n align-items: center;\n min-height: 3rem;\n overflow: hidden;\n font-size: 14px;\n border-bottom: dotted 1px ${tailwindColors[\"grey-300\"]};\n\n .title {\n display: flex;\n justify-content: center;\n align-items: center;\n flex-direction: column;\n width: 10rem;\n height: 100%;\n padding: 0.5rem 1rem;\n font-weight: bold;\n background-color: ${tailwindColors[\"grey-300\"]};\n text-align: center;\n\n button {\n display: inherit;\n align-items: center;\n height: 1.5rem;\n padding: 0.2rem 0.5rem;\n border-radius: 7.5rem;\n background-color: ${tailwindColors[\"grey-400\"]};\n }\n }\n\n & .content-box {\n flex: 1;\n }\n\n .form {\n flex: 1;\n background-color: ${tailwindColors.white};\n padding: 0.5rem 1rem;\n display: flex;\n justify-content: center;\n align-items: center;\n border: none;\n height: 100%;\n text-overflow: ellipsis;\n }\n .textarea {\n padding-top: 2rem;\n }\n .notInput {\n width: 100%;\n flex-wrap: wrap;\n justify-content: left;\n column-gap: 0.5rem;\n row-gap: 0.2rem;\n text-overflow: ellipsis;\n white-space: nowrap;\n background-color: ${tailwindColors.white};\n }\n .host {\n flex: 1;\n display: flex;\n align-items: center;\n width: 100%;\n height: 100%;\n padding: 0.5rem 1rem;\n background-color: ${tailwindColors.white};\n overflow: hidden;\n white-space: nowrap;\n\n span {\n width: calc(100% - 72px);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n button {\n width: 72px;\n padding: 0.2rem 0.5rem;\n margin-left: auto;\n border-radius: 7.5rem;\n background-color: ${tailwindColors[\"red-300\"]};\n color: ${tailwindColors[\"red-300-contrast\"]};\n font-weight: bold;\n }\n }\n`;\n\nconst CustomFormRow = styled.div`\n display: flex;\n width: 100%;\n`;\n\nconst CustomList = styled.div`\n padding: 0.5rem 1rem;\n background-color: ${tailwindColors[\"grey-300\"]};\n min-width: 4rem;\n text-align: center;\n border-radius: 1rem;\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nconst ImageContainer = styled.div`\n gap: 0.5rem;\n flex: 1;\n display: flex;\n padding: 2rem;\n background-color: ${tailwindColors.white};\n overflow-x: auto;\n\n input[type=\"radio\"] {\n margin: 10px;\n display: none;\n }\n\n label {\n img {\n cursor: pointer;\n object-fit: contain;\n }\n }\n .curation-thumbnail {\n height: 20rem;\n }\n`;\n\nconst ThumbnailWrap = styled.div`\n position: relative;\n height: 20rem;\n transition: transform 0.2s;\n cursor: pointer;\n overflow: hidden;\n\n &:hover {\n > img {\n transform: scale(1.1);\n }\n }\n\n & img {\n border: ${(props) => props.selected && `0.3rem solid ${myColors.red}`};\n height: 100%;\n transition: transform 0.2s;\n }\n\n & > div {\n position: absolute;\n bottom: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0.5rem;\n width: 100%;\n background-color: ${myColors.red};\n backdrop-filter: blur(3px);\n color: ${tailwindColors.white};\n :hover {\n filter: brightness(0.9);\n }\n }\n`;\n\nconst ThumbnailAddInput = styled.input`\n display: none;\n`;\n\nconst ThumbnailAddButton = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 20rem;\n width: 14rem;\n background-color: ${tailwindColors[\"grey-200\"]};\n color: ${tailwindColors[\"grey-700\"]};\n cursor: pointer;\n transition: background-color 0.2s;\n :hover {\n background-color: ${tailwindColors[\"grey-300\"]};\n }\n`;\n\n/* forwardRef를 사용하여 부모가 자식 컴포넌트 함수를 호출할 수 있도록 함*/\nexport default forwardRef(CrawlDataForm);\n","/* 그냥 단순 버튼 컴포넌트임 ... */\nimport React from \"react\";\nimport styled from \"styled-components\";\nimport { tailwindColors } from \"styles/colors\";\n\nfunction Button({ color, children, ...rest }) {\n return (\n \n {children}\n \n );\n}\n\nconst CustomButton = styled.button`\n display: flex;\n justify-content: center;\n align-items: center;\n min-width: 10rem;\n padding: 0.5rem 1rem;\n border: none;\n background-color: ${(props) => props.color || tailwindColors[\"grey-600\"]};\n color: white;\n cursor: pointer;\n p {\n margin-left: 0.5rem;\n font-weight: bold;\n }\n`;\nexport default Button;\n","import styled from \"styled-components\";\nimport { tailwindColors } from \"styles/colors\";\n\nexport const WorkerContentHeader = ({ title, Icon, children }) => {\n return (\n \n \n {Icon && }\n

{title}

\n
\n {children}\n
\n );\n};\n\nconst Container = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n`;\n\nconst TitleWrap = styled.div`\n display: flex;\n align-items: center;\n gap: 1rem;\n white-space: nowrap;\n\n & h2 {\n font-size: 2rem;\n font-weight: bold;\n }\n`;\n\nconst Content = styled.div``;\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport {\n BsCheckCircle,\n BsDashCircle,\n BsTrash,\n BsXCircle,\n} from \"react-icons/bs\";\n\nimport { STATUS_CODE_SET } from \"Data/crawlStatus\";\nimport { myColors, tailwindColors } from \"styles/colors\";\nimport CrawlDataForm from \"Components/CrawlDataForm\";\nimport Button from \"Components/Button\";\nimport { WorkerContentHeader } from \"Components/WorkerContentHeader\";\n\nfunction CrawlDataDetail({\n crawlDataFormRef,\n docs,\n dataKeep,\n dataReject,\n dataStage,\n dataUpdate,\n cancel,\n statusCode,\n type,\n _id,\n}) {\n return (\n \n \n \n \n \n \n {type === \"archive\" && (\n \n )}\n {type !== \"archive\" && type !== \"curation\" && (\n \n )}\n \n \n \n \n \n );\n}\n\nconst Wrap = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n min-width: 1024px;\n width: 100%;\n padding: 1.5rem 3rem;\n background-color: ${tailwindColors[\"grey-50\"]};\n`;\n\nconst Content = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n margin-top: 1rem;\n`;\n\nconst ButtonWrapper = styled.div`\n display: flex;\n margin: 2rem;\n justify-content: center;\n gap: 1rem;\n`;\n\nexport default CrawlDataDetail;\n","import React, { useState, useEffect, useRef } from \"react\";\nimport {\n CrawlDataDetailFetchApi,\n CrawlDataRejectApi,\n CrawlDataStageApi,\n CrawlDataKeepApi,\n sessionHandler,\n crawlDataUpdateApi,\n} from \"../../../Utils/api\";\nimport CrawlDataDetail from \"./CrawlDataDetail\";\nimport { useParams, useHistory } from \"react-router-dom\";\nimport { useDispatch } from \"react-redux\";\nimport { trackPromise } from \"react-promise-tracker\";\nimport { LoadingWrapper } from \"../../../Components/LoadingWrapper\";\nimport { STATUS_CODE_SET } from \"Data/crawlStatus\";\nimport { getAddressRemovedPath } from \"Utils/image\";\n\nfunction CrawlDataDetailContainer() {\n /* \n 라우터에서 받아온 정보. \n _id - 해당 크롤 데이터의 id\n screeningStatus - 단계 상태 코드\n */\n const { _id, statusCode } = useParams();\n const history = useHistory();\n const dispatch = useDispatch();\n const crawlDataFormRef = useRef();\n /* \n CrawlDataRefine > CrawlDataForm 에 있는 정보를 가져오기 위해서.\n 부모 컴포넌트에서 자식 컴포넌트의 함수를 호출하는 상황임.\n CrawlDataForm 에 ref를.. 걸고자 함. \n */\n\n const [docs, setDocs] = useState({}); // 폼에 default 값으로 출력할 데이터를 객체로 전달. 관리 편하게\n const [isLeave, setIsLeave] = useState(false); // 페이지 이동 및 나가기 여부\n\n /* 데이터 불러오기 */\n const dataFetch = () => {\n trackPromise(\n CrawlDataDetailFetchApi(statusCode, _id)\n .then((res) => {\n console.log(\"res : \", res.data);\n dataCleansing(res.data);\n })\n .catch((err) => {\n sessionHandler(err, dispatch).then((res) => {\n CrawlDataDetailFetchApi(statusCode, _id).then((res) => {\n dataCleansing(res.data);\n });\n });\n })\n );\n };\n\n /* 데이터 정제하기 */\n const dataCleansing = (rawData) => {\n const _rawStatusDetailData = rawData.docs;\n const _docs = {\n is_crawled: _rawStatusDetailData.is_crawled,\n doc_content: _rawStatusDetailData.doc_content || \"\",\n doc_collect_date: _rawStatusDetailData.doc_collect_date || \"\",\n doc_write_date: _rawStatusDetailData.doc_write_date || \"\",\n doc_register_date: _rawStatusDetailData.doc_register_date || \"\",\n doc_publish_date: _rawStatusDetailData.doc_publish_date || \"\",\n doc_keyword: _rawStatusDetailData.doc_keyowrd || [], // 오타로 필드가 설정되어있어서 ...\n doc_publisher: _rawStatusDetailData.doc_publisher || \"\",\n //TODO: 백엔드에서 주소빼고 주면 나중에 변경해야함\n doc_thumbnail: _rawStatusDetailData.doc_thumbnail\n ? Array.isArray(_rawStatusDetailData.doc_thumbnail)\n ? _rawStatusDetailData.doc_thumbnail.map((v) =>\n getAddressRemovedPath(v)\n )\n : [getAddressRemovedPath(_rawStatusDetailData.doc_thumbnail)]\n : [],\n // doc_thumbnail: _rawStatusDetailData.doc_thumbnail\n // ? _rawStatusDetailData.doc_thumbnail.map((v) =>\n // getAddressRemovedPath(v)\n // )\n // : [],\n doc_country: _rawStatusDetailData.doc_country || [],\n doc_publish_country: _rawStatusDetailData.doc_publish_country || [],\n doc_category: _rawStatusDetailData.doc_category || [],\n doc_content_type: _rawStatusDetailData.doc_content_type || [],\n doc_topic: _rawStatusDetailData.doc_topic || [],\n doc_custom: _rawStatusDetailData.doc_custom || [],\n doc_content_category: _rawStatusDetailData.doc_content_category || [],\n doc_language: _rawStatusDetailData.doc_language || [],\n doc_page: _rawStatusDetailData.doc_page || 0,\n doc_origin_title: _rawStatusDetailData.doc_origin_title || \"\",\n doc_kor_title: _rawStatusDetailData.doc_kor_title || \"\",\n doc_kor_summary: _rawStatusDetailData.doc_kor_summary || \"\",\n doc_origin_summary: _rawStatusDetailData.doc_origin_summary || \"\",\n doc_url: _rawStatusDetailData.doc_url || \"\",\n doc_url_intro: _rawStatusDetailData.doc_url_intro || \"\",\n doc_project: _rawStatusDetailData.doc_project || \"\",\n doc_biblio: _rawStatusDetailData.doc_biblio || \"\",\n doc_relate_title: _rawStatusDetailData.doc_relate_title || \"\",\n doc_relate_url: _rawStatusDetailData.doc_relate_url || \"\",\n doc_bundle_title: _rawStatusDetailData.doc_bundle_title || \"\",\n doc_bundle_url: _rawStatusDetailData.doc_bundle_url || \"\",\n doc_memo: _rawStatusDetailData.doc_memo || \"\",\n doc_host: _rawStatusDetailData.doc_host || \"\",\n doc_recomment: _rawStatusDetailData.doc_recomment\n ? String.fromCharCode(_rawStatusDetailData.doc_recomment)\n : \"\", // 아스키코드..\n doc_publishing: _rawStatusDetailData.doc_publishing || \"\",\n doc_spare1: _rawStatusDetailData.doc_spare1,\n doc_spare2: _rawStatusDetailData.doc_spare2,\n\n item_id: _rawStatusDetailData.item_id,\n };\n setDocs(_docs);\n };\n\n const dataKeep = () => {\n if (!window.confirm(\"해당 데이터를 보류하시겠습니까?\")) return;\n\n CrawlDataKeepApi(_id, statusCode).then((res) => {\n alert(\"해당 데이터에 대한 작업이 보류되었습니다.\");\n if (statusCode === \"6\") {\n history.push(`/archive`); // 목록으로 돌아가기\n } else {\n history.push(`/crawl/${statusCode}`); // 목록으로 돌아가기\n }\n });\n };\n\n const dataReject = () => {\n if (!window.confirm(\"해당 데이터를 버리시겠습니까?\")) return;\n\n CrawlDataRejectApi(_id, statusCode).then((res) => {\n alert(\"해당 데이터가 성공적으로 삭제되었습니다.\");\n if (statusCode === \"6\") {\n history.push(`/archive`); // 목록으로 돌아가기\n } else if (statusCode === \"8\") {\n history.push(`/curation`);\n } else {\n history.push(`/crawl/${statusCode}`); // 목록으로 돌아가기\n }\n });\n };\n\n const dataStage = () => {\n if (!window.confirm(\"작업을 완료하시겠습니까?\")) return;\n\n const _crawlDataFormDocs = crawlDataFormRef.current.getCrawlFormData();\n\n CrawlDataStageApi(statusCode, _id, _crawlDataFormDocs).then((res) => {\n alert(\"해당 데이터가 성공적으로 저장되었습니다.\");\n if (statusCode === \"6\") {\n history.push(`/archive`); // 목록으로 돌아가기\n } else if (statusCode === \"8\") {\n history.push(`/curation`);\n } else {\n history.push(`/crawl/${statusCode}`); // 목록으로 돌아가기\n }\n });\n };\n\n const dataUpdate = () => {\n if (!window.confirm(\"작업을 완료하시겠습니까?\")) return;\n\n const _crawlDataFormDocs = crawlDataFormRef.current.getCrawlFormData();\n console.log(\n \"🚀 ~ file: CrawlDataDetailContainer.js:155 ~ dataUpdate ~ _crawlDataFormDocs:\",\n _crawlDataFormDocs\n );\n crawlDataUpdateApi(statusCode, _id, _crawlDataFormDocs).then((res) => {\n alert(\"해당 데이터가 성공적으로 저장되었습니다.\");\n if (statusCode === \"6\") {\n history.push(`/archive`); // 목록으로 돌아가기\n } else if (statusCode === \"8\") {\n history.push(`/curation`);\n } else {\n history.push(`/crawl/${statusCode}`); // 목록으로 돌아가기\n }\n });\n };\n\n const cancel = () => {\n if (\n !window.confirm(\"작업을 중단하시겠습니까?\\n변경사항은 저장되지 않습니다.\")\n )\n return;\n //documentDetachImageApi(itemId);\n history.push(`/crawl/${statusCode}`); // 목록으로 돌아가기\n if (statusCode === \"6\") {\n history.push(`/archive`); // 목록으로 돌아가기\n } else if (statusCode === \"8\") {\n history.push(`/curation`);\n } else {\n history.push(`/crawl/${statusCode}`); // 목록으로 돌아가기\n }\n };\n\n /* 이미지 핸들러 */\n const imageDetachHandler = () => {\n // if (confirm(\"변경사항은 저장되지 않습니다. 페이지를 닫겠습니까?\")) {\n // documentDetachImageApi(itemId).then((res) => {\n // });\n // }\n // documentDetachImageApi(_id).then((res) => {\n // });\n };\n const leaveSetting = (e) => {\n // 명세에 따라 preventDefault는 호출해야하며, 기본 동작을 방지합니다.\n e.preventDefault();\n // 대표적으로 Chrome에서는 returnValue 설정이 필요합니다.\n e.returnValue = \"\";\n };\n\n useEffect(() => {\n window.addEventListener(\"beforeunload\", leaveSetting);\n window.addEventListener(\"unload\", imageDetachHandler);\n return () => {\n window.removeEventListener(\"beforeunload\", leaveSetting);\n window.removeEventListener(\"unload\", imageDetachHandler);\n imageDetachHandler();\n };\n }, []);\n\n useEffect(() => {\n dataFetch();\n }, [_id]);\n\n return (\n \n \n \n );\n}\n\nexport default CrawlDataDetailContainer;\n","import React, { useEffect, useState } from \"react\";\nimport styled from \"styled-components\";\nimport {\n BsChevronDoubleLeft,\n BsChevronDoubleRight,\n BsChevronLeft,\n BsChevronRight,\n} from \"react-icons/bs\";\nimport { myColors, tailwindColors } from \"styles/colors\";\n\nfunction Pagination({ dcCount, listSize, pageNo, setPageNo, pageSize = 10 }) {\n /* \n pageNo 현재 클릭한 페이지의 No\n listSize 한 페이지에 보여질 document의 개수\n dcCount 전체 document의 개수\n */\n\n const [pageCount, setPageCount] = useState(0); // 총 보여질 페이지 갯수\n const [pageGroupCount, setPageGroupCount] = useState(0);\n const [currentPageNumberlist, setCurrentPageNumberList] = useState([]); // 현재 보여질 페이지 배열\n const [currentPageGroup, setCurrentPageGroup] = useState(0);\n\n //페이지 전환\n const _handlerPageNo = (e) => {\n const _currentPageNo = Number(e.target.value);\n setPageNo(_currentPageNo);\n };\n\n //다음 페이지 그룹으로 전환\n const toNextPageGroup = () => {\n if (currentPageGroup + 1 >= Math.ceil(pageCount / pageSize)) return;\n const nextPageGroup = currentPageGroup + 1;\n setCurrentPageGroup(nextPageGroup);\n setCurrentPageNumberList(getPageNumberList(nextPageGroup));\n setPageNo(nextPageGroup * pageSize + 1);\n };\n\n const toPrevPageGroup = () => {\n if (currentPageGroup === 0) return;\n const prevpageGroup = currentPageGroup - 1;\n setCurrentPageGroup(prevpageGroup);\n setCurrentPageNumberList(getPageNumberList(prevpageGroup));\n setPageNo(prevpageGroup * pageSize + 1);\n };\n\n const toFirstPage = () => {\n setCurrentPageGroup(0);\n setPageNo(1);\n };\n\n const toLastPage = () => {\n setCurrentPageGroup(pageGroupCount - 1);\n setPageNo(pageCount);\n };\n\n const getPageNumberList = (pageGroup) => {\n const result = [];\n if ((pageGroup + 1) * pageSize > pageCount) {\n for (let i = 1; i < (pageCount % pageSize) + 1; i++) {\n result.push(pageGroup * pageSize + i);\n }\n } else {\n for (let i = 1; i <= pageSize; i++) {\n result.push(pageGroup * pageSize + i);\n }\n }\n return result;\n };\n\n //총 페이지 수 초기화\n useEffect(() => {\n const _pageCount = Math.ceil(dcCount / listSize);\n const _pageGroupCount = Math.ceil(_pageCount / pageSize);\n setPageCount(_pageCount);\n setPageGroupCount(_pageGroupCount);\n }, [dcCount, listSize]);\n\n useEffect(() => {\n setCurrentPageNumberList(getPageNumberList(currentPageGroup));\n }, [pageCount, currentPageGroup]);\n\n //listSize나 Tab전환에 의해서 pageNo가 바뀌었을 때 제자리를 찾아가기 위해\n useEffect(() => {\n const newPageGroup = parseInt((pageNo - 1) / pageSize);\n setCurrentPageGroup(newPageGroup);\n }, [pageNo, pageSize]);\n\n return (\n \n \n \n \n \n \n {currentPageNumberlist.map((item, i) => (\n \n {item}\n \n ))}\n \n \n \n \n \n \n \n \n \n \n );\n}\n\nconst PaginationContainer = styled.div`\n display: flex;\n align-items: center;\n gap: 0.5rem;\n\n @media ${(props) => props.theme.tablet} {\n flex-wrap: wrap;\n justify-content: space-between;\n }\n`;\n\nconst ButtonGroup = styled.div`\n display: flex;\n align-items: center;\n gap: 0.2rem;\n\n @media ${(props) => props.theme.tablet} {\n flex: 1;\n &:nth-of-type(1) {\n order: 2;\n }\n &:nth-of-type(3) {\n order: 3;\n }\n }\n`;\n\nconst Button = styled.button`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n border: 1px solid ${tailwindColors[\"grey-400\"]};\n\n &:disabled {\n background-color: ${tailwindColors[\"grey-200\"]};\n cursor: not-allowed;\n }\n\n @media ${(props) => props.theme.tablet} {\n flex: 1;\n }\n`;\n\nconst PaginationButtonGroup = styled.div`\n display: flex;\n @media ${(props) => props.theme.tablet} {\n order: 1;\n flex-wrap: wrap;\n justify-content: center;\n width: 100%;\n }\n`;\n\nconst PaginationButton = styled.button`\n min-width: 40px;\n height: 40px;\n padding: 0.5rem;\n background-color: ${(props) =>\n props.active ? myColors.blue500 : tailwindColors.white};\n font-size: 14px;\n font-weight: bold;\n color: ${(props) => props.active && tailwindColors.white};\n cursor: pointer;\n &:hover {\n background-color: ${myColors.blue500};\n color: ${tailwindColors.white};\n }\n &:active {\n filter: brightness(50%);\n }\n`;\n\nexport default Pagination;\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { CgFileDocument } from \"react-icons/cg\";\n\nfunction NoData() {\n return (\n <>\n \n \n
등록된 데이터가 없습니다.
\n
\n \n );\n}\nexport default NoData;\n\nconst SearchResultNotthingContainer = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n flex-direction: column;\n margin: 10rem 0;\n .comment {\n font-size: 30px;\n color: #d6d6d6;\n }\n\n @media ${(props) => props.theme.mobile_l} {\n .comment {\n font-size: 1.5rem;\n }\n }\n`;\n","import React, { useState, useEffect } from \"react\";\nimport styled from \"styled-components\";\nimport { FaFilter } from \"react-icons/fa\";\nimport { MdSettings } from \"react-icons/md\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { AiOutlinePlus, AiOutlineMinus, AiOutlineSearch } from \"react-icons/ai\";\n\nimport { setModal, setModalData, setCategoryModalType } from \"Modules/modal\";\nimport { myColors, tailwindColors } from \"styles/colors\";\n\nfunction DataFilter({ dataFilterFetch = null, type }) {\n const dispatch = useDispatch();\n const [optionIsOpen, setOptionIsOpen] = useState(false);\n\n const [keyword, setKeyword] = useState(\"\"); // keyword\n const [isCrawled, setIsCrawled] = useState(null); // is_crawled 여부\n\n // 스크리닝 부터 사용되는 필터들\n const [sort, setSort] = useState(\"\");\n const [dateRange, setDateRange] = useState(\"all\"); // 날짜 범위를 지정할 수 있도록 함. 기본 값은 전체\n /* \n all : 전체 범위\n past_week : 최근 1주\n past_month : 최근 1달\n past_3_month : 최근 3달\n past_6_month : 최근 6달\n past_year : 최근 1년\n past_3_year : 최근 3년\n custom_range : 직접 설정\n */\n const [isDateRange, setIsDateRange] = useState(false); // 날짜 범위를 직접 설정할 것인지 아닌지 ...\n const [sortType, setSortType] = useState(\"doc_collect_date\");\n const [dateGte, setDateGte] = useState(\"2019-01-01\"); // 임시 값. 현재 시각 기준 3년 전으로 설정 할 예정...\n const [dateLte, setDateLte] = useState(\n new Date().toISOString().substring(0, 10)\n );\n const [pageGte, setPageGte] = useState(0);\n const [pageLte, setPageLte] = useState(0);\n\n const [screeningHost, setScreeningHost] = useState(\"\"); // 스크리닝 호스트 검색용\n const [screeningLanguage, setScreeningLanguage] = useState(\"\"); // 스크리닝 언어 검색용\n\n const docLanguage = useSelector(\n (state) => state.modal.modalData.doc_language\n );\n const docCountry = useSelector((state) => state.modal.modalData.doc_country); // doc_country HOST 국가\n const docPublishCountry = useSelector(\n (state) => state.modal.modalData.doc_publish_country\n );\n const docCategory = useSelector(\n (state) => state.modal.modalData.doc_category\n );\n const docContentType = useSelector(\n (state) => state.modal.modalData.doc_content_type\n );\n const docHost = useSelector((state) => state.modal.modalData.doc_host); // doc_host, doc_publisher host 및 발급기관명 관리\n\n const _openCategoryModal = (categoryModalType) => {\n dispatch(setModal(\"CategoryModal\")); //초기화\n dispatch(setModalData([], categoryModalType));\n dispatch(setCategoryModalType(categoryModalType));\n };\n\n const _openHostSelectModal = () => {\n dispatch(setModalData(null, \"doc_host\")); // 초기화\n dispatch(setModal(\"HostSelectModal\"));\n };\n\n const _screeningHostHandler = (e) => {\n setScreeningHost(e.target.value);\n };\n const _screeningLanguageHandler = (e) => {\n setScreeningLanguage(e.target.value);\n };\n const _isCrawledHandler = (e) => {\n if (e.target.value === \"전체\") setIsCrawled(null);\n else setIsCrawled(e.target.value);\n };\n const _optionIsOpenHandler = () => {\n setOptionIsOpen(!optionIsOpen);\n };\n\n const _sortTypeHandler = (e) => {\n setSortType(e.target.value);\n };\n const _sortHandler = (e) => {\n setSort(e.target.value);\n };\n const _dateGteHandler = (e) => {\n setDateGte(e.target.value);\n };\n const _dateLteHandler = (e) => {\n if (isValidEndDate(dateGte, e.target.value)) {\n setDateLte(e.target.value);\n } else {\n alert(\"날짜 선택이 잘못되었습니다.\");\n setDateLte(new Date().toISOString().substring(0, 10));\n }\n };\n const _pageGteHandler = (e) => {\n setPageGte(e.target.value);\n };\n const _pageLteHandler = (e) => {\n setPageLte(e.target.value);\n };\n\n const _dateRangeHandler = (e) => {\n setDateRange(e.target.value);\n setIsDateRange(e.target.value === \"custom_range\" ? true : false); // 직접 설정일 경우 ..\n };\n\n const isValidEndDate = (start, end) => {\n // 현재 시점에서 미래의 날짜는 선택할 수 없음\n if (new Date().getTime() - new Date(end).getTime < 0) return false;\n return new Date(end).getTime() - new Date(start).getTime() >= 0; // endDate가 startDate보다 과거라면 해당 날짜는 선택할 수 없음.\n };\n\n const searchFilter = () => {\n const searchObj = {};\n if (\n docLanguage.length > 1 ||\n docCountry.length > 1 ||\n docCategory.length > 1 ||\n docContentType.length > 1 ||\n docPublishCountry.length > 1\n ) {\n alert(\"검색 필드 하나에 하나의 필터 값만 설정 가능 합니다.\");\n return;\n }\n\n if (docCountry.length !== 0) {\n searchObj[\"doc_country\"] = docCountry.map((item) => item.CODE);\n }\n if (docCategory.length !== 0) {\n searchObj[\"doc_category\"] = docCategory.map((item) => item.CODE);\n }\n if (docContentType.length !== 0) {\n searchObj[\"doc_content_type\"] = docContentType.map((item) => item.CODE);\n }\n if (docPublishCountry.length !== 0) {\n searchObj[\"doc_publish_country\"] = docPublishCountry.map(\n (item) => item.CODE\n );\n }\n if (type === \"screening\") {\n if (screeningHost !== \"\") {\n searchObj[\"host\"] = screeningHost;\n }\n if (screeningLanguage !== \"\") {\n searchObj[\"lang\"] = screeningLanguage;\n }\n } else {\n if (docHost !== null) {\n searchObj[\"doc_host\"] = docHost.IDX;\n }\n if (docLanguage.length !== 0) {\n searchObj[\"doc_language\"] = docLanguage.map((item) => item.CODE);\n }\n }\n\n if (type === \"archive\") {\n searchObj[\"is_crawled\"] = isCrawled;\n }\n if (sort !== \"\") {\n searchObj[\"sort\"] = sort;\n }\n searchObj[\"sortType\"] = sortType;\n if (dateRange !== \"all\") {\n searchObj[\"dateGte\"] = dateGte;\n searchObj[\"dateLte\"] = dateLte;\n }\n if (keyword !== \"\") {\n searchObj[\"keyword\"] = keyword;\n }\n if (pageGte !== 0 || pageLte !== 0) {\n searchObj[\"pageLte\"] = pageLte;\n searchObj[\"pageGte\"] = pageGte;\n }\n dataFilterFetch(searchObj);\n };\n\n // 설정 완료 해야함\n const searchReset = () => {\n setScreeningHost(\"\");\n setScreeningLanguage(\"\");\n setKeyword(\"\");\n setIsCrawled(true);\n dispatch(setModalData([], \"doc_country\"));\n dispatch(setModalData([], \"doc_publish_country\"));\n dispatch(setModalData([], \"doc_host\"));\n dispatch(setModalData([], \"doc_language\"));\n dispatch(setModalData([], \"doc_content_type\"));\n dispatch(setModalData([], \"doc_category\"));\n dispatch(setModalData(null, \"doc_host\"));\n setDateRange(\"all\");\n setSortType(\"doc_collect_date\");\n setDateGte(\"2019-01-01\");\n setDateLte(new Date().toISOString().substring(0, 10));\n setPageGte(0);\n setPageLte(0);\n };\n\n useEffect(() => {\n const _dateGte = new Date(); // 오늘 날짜\n if (dateRange === \"past_week\") {\n _dateGte.setDate(_dateGte.getDate() - 7); // 7일. 1주일 전\n } else if (dateRange === \"past_month\") {\n _dateGte.setMonth(_dateGte.getMonth() - 1); // 1달 전\n } else if (dateRange === \"past_3_month\") {\n _dateGte.setMonth(_dateGte.getMonth() - 3); // 3달 전\n } else if (dateRange === \"past_6_month\") {\n _dateGte.setMonth(_dateGte.getMonth() - 6); // 6달 전\n } else if (dateRange === \"past_year\") {\n _dateGte.setFullYear(_dateGte.getFullYear() - 1); // 1년 전\n } else if (dateRange === \"past_3_year\") {\n _dateGte.setFullYear(_dateGte.getFullYear() - 3); // 3년 전\n }\n setDateGte(_dateGte.toISOString().substring(0, 10));\n }, [dateRange]);\n\n useEffect(() => {\n if (optionIsOpen) {\n searchReset();\n }\n }, [optionIsOpen]);\n return (\n \n \n \n <FaFilter color=\"#435269\" />\n <p>상세 검색</p>\n \n \n {optionIsOpen ? (\n <>\n \n 검색 필터 접기\n \n ) : (\n <>\n \n 검색 필터 펼치기\n \n )}\n \n \n {optionIsOpen && (\n \n \n \n \n 기간\n \n \n {type !== \"screening\" && (\n <>\n \n \n \n \n )}\n \n\n \n \n \n \n \n \n \n \n \n \n \n {isDateRange && (\n <>\n \n \n \n )}\n\n \n \n \n \n \n \n \n \n \n 페이지 수\n \n ~\n \n \n {type === \"archive\" && (\n \n 데이터 유형\n \n \n \n \n \n \n )}\n \n \n \n {type === \"screening\" ? (\n <>\n 언어코드 검색\n \n \n ) : (\n <>\n 언어\n {\n _openCategoryModal(\"doc_language\");\n }}\n >\n 선택\n \n \n {docLanguage.map((item, index) => {\n return {item.CT_NM};\n })}\n \n \n )}\n \n \n {type === \"screening\" ? (\n <>\n HOST명 검색\n \n \n ) : (\n <>\n HOST 선택\n {\n _openHostSelectModal();\n }}\n >\n 선택\n \n \n {docHost && {docHost.HOST}}\n \n \n )}\n \n \n\n {(type === \"archive\" || type === \"curation\") && (\n <>\n \n \n 유형 분류\n {\n _openCategoryModal(\"doc_content_category\");\n }}\n >\n 선택\n \n \n {docContentType.map((item, index) => {\n return {item.CT_NM};\n })}\n \n \n \n 정책 분류\n {\n _openCategoryModal(\"doc_category\");\n }}\n >\n 선택\n \n \n {docCategory.map((item, index) => {\n return {item.CT_NM};\n })}\n \n \n \n \n \n 대상 국가\n {\n _openCategoryModal(\"doc_country\");\n }}\n >\n 선택\n \n \n {docCountry.map((item, index) => {\n return {item.CT_NM};\n })}\n \n \n \n 발행 국가\n {\n _openCategoryModal(\"doc_publish_country\");\n }}\n >\n 선택\n \n \n {docPublishCountry.map((item, index) => {\n return {item.CT_NM};\n })}\n \n \n \n \n )}\n \n \n 초기화\n \n \n 검색\n \n \n \n )}\n \n );\n}\n\nconst Wrap = styled.div`\n width: 100%;\n flex-direction: column;\n border: 1px solid ${tailwindColors[\"grey-300\"]};\n padding: 1rem;\n font-size: 14px;\n`;\n\nconst FilterHeader = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n`;\nconst Title = styled.div`\n display: flex;\n align-items: center;\n\n p {\n margin: 0 0 0 0.5rem;\n font-size: 16px;\n font-weight: bold;\n color: #435269;\n }\n`;\nconst CustomButton = styled.button`\n display: flex;\n align-items: center;\n gap: 0.3rem;\n border: none;\n padding: 0.5rem 1rem;\n background-color: ${myColors.blue500};\n font-size: 14px;\n font-weight: bold;\n color: white;\n cursor: pointer;\n`;\nconst FilterActions = styled.div`\n display: flex;\n justify-content: right;\n gap: 1rem;\n border-top: 1px solid ${tailwindColors[\"grey-300\"]};\n padding: 0.5rem 0;\n`;\n\nconst FilterBody = styled.div``;\n\nconst ActionButton = styled.button`\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0 0.5rem;\n border: solid 1px ${tailwindColors[\"grey-300\"]};\n border-radius: 4px;\n cursor: pointer;\n\n &:hover {\n background-color: ${tailwindColors[\"grey-200\"]};\n }\n\n .delete {\n background-color: #b80000;\n color: white;\n }\n`;\nconst OptionContainer = styled.div`\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n padding: 1rem 0;\n`;\n\nconst OptionRow = styled.div`\n display: grid;\n grid-template-columns: 1fr 1fr;\n height: 30px;\n`;\n\nconst OptionCol = styled.div`\n flex: 1;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0 0.5rem;\n`;\n\nconst OptionTitle = styled.div`\n min-width: 140px;\n display: flex;\n justify-content: center;\n align-items: center;\n height: 30px;\n background-color: #d6d6d6;\n font-size: 12px;\n text-align: center;\n word-wrap: break-word;\n`;\n\nconst OptionInput = styled.input`\n display: flex;\n align-items: center;\n width: ${(props) => props.width};\n height: 100%;\n border: solid 1px #d6d6d6;\n padding-left: 0.5rem;\n`;\n\nconst OptionSelect = styled.select`\n display: flex;\n align-items: center;\n height: 100%;\n border: solid 1px #d6d6d6;\n padding-left: 0.5rem;\n`;\n\n/* antd 와 비슷한 cascader 제작을 위한 inner component*/\n\nconst CustomList = styled.div`\n display: flex;\n`;\nconst Chip = styled.div`\n font-size: 12px;\n padding: 0.25rem 0.5rem;\n margin: 0.25rem;\n background-color: #eee;\n min-width: 2rem;\n text-align: center;\n border-radius: 1rem;\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nexport default DataFilter;\n","import { HiOutlineDocumentSearch } from \"react-icons/hi\";\nimport styled from \"styled-components\";\nimport { myColors } from \"styles/colors\";\n\nexport const SearchResultCount = ({ count }) => {\n return (\n \n \n 검색 결과 ({count}건)\n \n );\n};\n\nconst Wrap = styled.div`\n display: flex;\n align-items: center;\n width: 100%;\n padding: 1rem 0;\n font-size: 1.5rem;\n font-weight: bold;\n white-space: nowrap;\n\n & > span:nth-of-type(2) {\n color: ${myColors.red};\n }\n`;\n","import styled from \"styled-components\";\nimport { myColors, tailwindColors } from \"styles/colors\";\n\nexport const Tab = ({ children }) => {\n return {children};\n};\n\nconst TabItem = ({ selected, onClick, label }) => {\n return (\n \n {label}\n \n );\n};\n\nTab.Item = TabItem;\n\nconst TabGroup = styled.div`\n display: flex;\n align-items: center;\n align-self: flex-start;\n`;\n\nconst Item = styled.div`\n padding: 0.5rem 1rem;\n border-bottom: 0.2rem solid ${tailwindColors.white};\n border-bottom-color: ${(props) => props.selected && myColors.blue400};\n font-size: 1.2rem;\n font-weight: bold;\n color: ${(props) =>\n props.selected ? myColors.blue400 : tailwindColors[\"grey-600\"]};\n cursor: pointer;\n`;\n","import { BsArrowDown, BsArrowUp } from \"react-icons/bs\";\nimport styled from \"styled-components\";\nimport { myColors, tailwindColors } from \"styles/colors\";\nimport { SORT_ORDER } from \"./CrawlDataScreeningContainer\";\n\nexport const ScreeningTable = ({\n screeningData,\n stageDataList,\n keepDataList,\n deleteDataList,\n onChangeCheckedAll,\n checkedAll,\n onChangeEach,\n sort,\n sortState,\n}) => {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {screeningData.map((row, index) => (\n \n \n \n \n \n \n \n \n \n \n ))}\n \n
\n
\n 완료\n \n
\n
\n
\n 보류\n \n
\n
\n
\n 삭제\n \n
\n
원문요약HOST명 sort(\"date\")}>\n 원문수집일\n {sortState.type === \"date\" &&\n SORT_ORDER[sortState.order] === \"asc\" && }\n {sortState.type === \"date\" &&\n SORT_ORDER[sortState.order] === \"desc\" && }\n \n sort(\"language\")}>언어\n {sortState.type === \"language\" &&\n SORT_ORDER[sortState.order] === \"asc\" && }\n {sortState.type === \"language\" &&\n SORT_ORDER[sortState.order] === \"desc\" && }\n sort(\"page\")}>\n 페이지\n {sortState.type === \"page\" &&\n SORT_ORDER[sortState.order] === \"asc\" && }\n {sortState.type === \"page\" &&\n SORT_ORDER[sortState.order] === \"desc\" && }\n
\n {\n onChangeEach(e, \"stage\");\n }}\n />\n \n {\n onChangeEach(e, \"keep\");\n }}\n />\n \n {\n onChangeEach(e, \"delete\");\n }}\n />\n \n \n {row.doc_origin_summary ?? \"요약 없음\"}\n \n {row.doc_host}{row.doc_collect_date}{row.doc_language}{row.doc_page}p
\n );\n};\n\nconst Table = styled.table`\n width: 100%;\n table-layout: fixed;\n padding: 0 1rem;\n font-size: 14px;\n border: 1px solid ${tailwindColors[\"grey-400\"]};\n\n tr {\n display: flex;\n th,\n td {\n :nth-of-type(1),\n :nth-of-type(2),\n :nth-of-type(3) {\n width: 2.5rem;\n }\n :nth-of-type(4) {\n flex: 1;\n }\n :nth-of-type(5) {\n width: 15%;\n white-space: nowrap;\n }\n :nth-of-type(6) {\n width: 7rem;\n white-space: nowrap;\n }\n :nth-of-type(7) {\n min-width: 4rem;\n white-space: nowrap;\n }\n :nth-of-type(8) {\n min-width: 4rem;\n white-space: nowrap;\n }\n }\n }\n\n & thead {\n width: 100%;\n position: sticky;\n top: 0;\n background-color: ${tailwindColors[\"grey-100\"]};\n\n th {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0.5rem 0;\n border-bottom: 1px solid ${tailwindColors[\"grey-400\"]};\n font-weight: bold;\n\n //원문수집일\n :nth-of-type(6) {\n color: ${(props) =>\n props.sortState.type === \"date\" && myColors.blue400};\n cursor: pointer;\n }\n //언어\n :nth-of-type(7) {\n color: ${(props) =>\n props.sortState.type === \"language\" && myColors.blue400};\n cursor: pointer;\n }\n //페지\n :nth-of-type(8) {\n color: ${(props) =>\n props.sortState.type === \"page\" && myColors.blue400};\n cursor: pointer;\n }\n\n div {\n display: flex;\n flex-direction: column;\n align-items: center;\n }\n }\n }\n\n & tbody {\n display: block;\n width: 100%;\n overflow-y: auto;\n tr {\n overflow: hidden;\n border-bottom: 1px solid ${tailwindColors[\"grey-400\"]};\n :nth-of-type(2n) {\n background-color: ${tailwindColors[\"grey-50\"]};\n }\n }\n td {\n padding: 1rem 0.5rem;\n //라디오 버튼\n :nth-of-type(1),\n :nth-of-type(2),\n :nth-of-type(3) {\n text-align: center;\n }\n //원문요약\n :nth-of-type(4) {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n a:hover {\n text-decoration: underline;\n }\n }\n //host명\n :nth-of-type(5) {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n //원문수집일\n :nth-of-type(6) {\n text-align: center;\n }\n //언어\n :nth-of-type(7) {\n text-align: center;\n }\n //페이지수\n :nth-of-type(8) {\n text-align: right;\n }\n }\n }\n`;\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { AiOutlineCheck } from \"react-icons/ai\";\nimport { BsEye } from \"react-icons/bs\";\n\nimport Pagination from \"Components/Pagination\";\nimport NoData from \"Components/NoData\";\nimport DataFilter from \"Components/DataFilter\";\nimport { WorkerContentHeader } from \"Components/WorkerContentHeader\";\nimport { SearchResultCount } from \"Components/SearchResultCount\";\nimport { Tab } from \"Components/Tab\";\nimport { myColors } from \"styles/colors\";\nimport { ScreeningTable } from \"./_table\";\n\nfunction CrawlDataScreening({\n dcCount,\n listSize,\n onChangeListSize,\n pageNo,\n setPageNo,\n screeningData,\n stageScreeningData,\n stageDataList,\n keepDataList,\n deleteDataList,\n onChangeCheckedAll,\n checkedAll,\n onChangeEach,\n selectedTab,\n onClickTab,\n dataFilterFetch,\n sort,\n sortState,\n}) {\n return (\n \n \n \n \n \n \n \n onClickTab(\"스크리닝 대기\")}\n />\n onClickTab(\"스크리닝 보류\")}\n />\n \n onChangeListSize(e)}\n >\n \n \n \n \n \n \n \n \n \n {screeningData.length !== 0 ? (\n <>\n \n \n \n \n 스크리닝 완료\n \n \n \n \n ) : (\n \n )}\n \n \n );\n}\n\nconst Wrap = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n min-width: 52rem;\n padding: 1.5rem 3rem;\n`;\n\nconst Content = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n font-size: 14px;\n`;\n\nconst RowWrap = styled.div`\n display: flex;\n align-items: center;\n justify-content: ${(props) => props.justify};\n gap: ${(props) => props.gap};\n width: 100%;\n margin-top: 1rem;\n\n .list-size {\n padding: 0.5rem;\n border: solid 1px #d6d6d6;\n font-size: 1rem;\n }\n`;\n\nconst BottomWrap = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n margin-top: 1rem;\n`;\n\nconst ScreeningButton = styled.button`\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 1rem;\n background-color: ${myColors.blue500};\n color: white;\n font-weight: bold;\n cursor: pointer;\n`;\n\nexport default CrawlDataScreening;\n","import React, { useState, useEffect } from \"react\";\nimport { useDispatch } from \"react-redux\";\nimport { trackPromise } from \"react-promise-tracker\";\nimport { LoadingWrapper } from \"Components/LoadingWrapper\";\n\nimport {\n ScreeningDataFetchApi,\n ScreeningDataStageApi,\n ScreeningDataDeleteApi,\n ScreeningDataKeepApi,\n sessionHandler,\n} from \"Utils/api\";\nimport CrawlDataScreening from \"./CrawlDataScreening\";\n\nconst TAB_VALUES = {\n \"스크리닝 대기\": false,\n \"스크리닝 보류\": true,\n};\n\nconst pageSorts = {\n asc: (rows) => [...rows].sort((a, b) => a.doc_page - b.doc_page),\n desc: (rows) => [...rows].sort((a, b) => b.doc_page - a.doc_page),\n};\n\nconst languageSort = {\n asc: (rows) =>\n [...rows].sort((a, b) =>\n a.doc_language < b.doc_language\n ? -1\n : a.doc_language < b.doc_language\n ? 1\n : 0\n ),\n desc: (rows) =>\n [...rows].sort((a, b) =>\n a.doc_language > b.doc_language\n ? -1\n : a.doc_language > b.doc_language\n ? 1\n : 0\n ),\n};\n\nconst dateSort = {\n asc: (rows) =>\n [...rows].sort(\n (a, b) =>\n new Date(a.doc_collect_date).getTime() -\n new Date(b.doc_collect_date).getTime()\n ),\n desc: (rows) =>\n [...rows].sort(\n (a, b) =>\n new Date(b.doc_collect_date).getTime() -\n new Date(a.doc_collect_date).getTime()\n ),\n};\n\nconst screeningSortRules = {\n page: pageSorts,\n language: languageSort,\n date: dateSort,\n};\n\nexport const SORT_ORDER = [\"asc\", \"desc\"];\n\nfunction CrawlDataScreeningContainer() {\n const [screeningData, setScreeningData] = useState([]); // 현재 보여질 데이터\n const [unsortedData, setUnsortedData] = useState([]);\n const [searchObj, setSearchObj] = useState(null); // 검색 옵션\n /* 페이지네이션 */\n const [dcCount, setDcCount] = useState(0); // document 총 개수\n const [pageNo, setPageNo] = useState(1); // 현재 활성화 된 페이지 번호\n const [listSize, setListSize] = useState(50); // 한 페이지에 나타낼 document 개수\n /* 완료, 보류, 삭제 전체선택 구현하기 */\n const [itemList, setItemList] = useState([]); // {id,status} 객체 리스트로 구성되어 있음.\n const [checkedAll, setCheckedAll] = useState(\"delete\"); // 전체선택 기본값은 delete\n const [stageDataList, setStageDataList] = useState([]);\n const [keepDataList, setKeepDataList] = useState([]);\n const [deleteDataList, setDeleteDataList] = useState([]); // 기본 값은 delete\n const [selectedTab, setSelectedTab] = useState(\"스크리닝 대기\");\n const [isKeep, setIsKeep] = useState(TAB_VALUES[\"스크리닝 대기\"]);\n /* 정렬 */\n const [sortState, setSortState] = useState({ type: null, order: 0 });\n\n const dispatch = useDispatch();\n\n const onClickTab = (tabName) => {\n if (selectedTab === tabName) return;\n\n setSelectedTab(tabName);\n setIsKeep(TAB_VALUES[tabName]);\n setPageNo(1);\n setSortState({ type: null, order: 0 });\n };\n\n const onChangeListSize = (e) => {\n setListSize(e.target.value);\n setPageNo(1);\n setSortState({ type: null, order: 0 });\n };\n\n const sort = (type) => {\n if (sortState.type !== type) {\n const order = 0;\n const newScreeningData =\n screeningSortRules[type][SORT_ORDER[order]](unsortedData);\n setSortState({ type, order });\n setScreeningData(newScreeningData);\n } else if (sortState.order === 1) {\n setSortState({ type: null, order: 0 });\n setScreeningData(unsortedData);\n } else {\n const order = sortState.order + 1;\n const newScreeningData =\n screeningSortRules[type][SORT_ORDER[order]](unsortedData);\n setSortState((prev) => ({ ...prev, order }));\n setScreeningData(newScreeningData);\n }\n setCheckedAll(\"delete\");\n };\n\n const onChangeCheckedAll = (e) => {\n if (e.target.checked) {\n setCheckedAll(e.target.value);\n }\n };\n\n const onChangeEach = (e, type) => {\n const _item_id = e.target.value;\n const _index = itemList.findIndex(\n (item) => item.item_id === Number(_item_id)\n );\n const _newItemList = [...itemList];\n _newItemList[_index].status = type;\n setItemList(_newItemList);\n console.log(_newItemList);\n };\n\n const dataFilterFetch = (searchObj) => {\n setSearchObj(searchObj);\n };\n\n /* 선택된 데이터를 크롤데이터 정제 단계로 넘기고 나머지 데이터는 버리기 */\n const stageScreeningData = async () => {\n if (window.confirm(\"선택 하신 대로 스크리닝을 진행하시겠습니까?\")) {\n ScreeningDataStageApi(stageDataList).then((res) => {\n if (res.status === 200) {\n ScreeningDataKeepApi(keepDataList).then((res) => {\n if (res.status === 200) {\n if (deleteDataList.length !== 0) {\n ScreeningDataDeleteApi(deleteDataList).then((res) => {\n if (res.status === 200) {\n alert(\"스크리닝이 성공적으로 완료되었습니다.\");\n dataFetch();\n }\n });\n } else {\n alert(\"스크리닝이 성공적으로 완료되었습니다.\");\n dataFetch();\n }\n }\n });\n }\n });\n }\n };\n\n /* 데이터 불러오기 */\n const dataFetch = (searchObj = null) => {\n trackPromise(\n ScreeningDataFetchApi(listSize, pageNo, isKeep, searchObj)\n .then((res) => {\n console.log(res.data);\n dataCleansing(res.data);\n })\n .catch((err) => {\n sessionHandler(err, dispatch).then((res) => {\n ScreeningDataFetchApi(listSize, pageNo).then((res) => {\n dataCleansing(res.data);\n });\n });\n })\n );\n };\n\n /* 데이터 정제하기 */\n const dataCleansing = (rawData) => {\n let _screeningData = [];\n let _rawScreeningData = rawData.docs;\n let _dcCount = rawData.dcCount;\n\n _rawScreeningData.forEach((item, index) => {\n const obj = {\n item_id: item.item_id,\n doc_origin_summary: item.doc_origin_summary,\n doc_host: item.doc_host,\n doc_language: item.doc_language,\n doc_collect_date: item.doc_collect_date.substring(0, 10),\n doc_page: item.doc_page,\n doc_url: item.doc_url,\n };\n _screeningData.push(obj);\n });\n\n setDcCount(_dcCount);\n setScreeningData(_screeningData);\n setUnsortedData(_screeningData);\n };\n\n /* pageNo, listSize 가 변경되었을 때 데이터를 다시 불러옴 */\n useEffect(() => {\n setCheckedAll(\"delete\");\n dataFetch(searchObj);\n }, [pageNo, listSize, isKeep, searchObj]);\n\n /* 데이터를 불러오는데 성공하였을 경우 각 데이터의 id값과 해당 데이터의 status를 list에 먼저 세팅해줌*/\n useEffect(() => {\n const _itemList = screeningData.map((item) => ({\n item_id: item.item_id,\n status: \"delete\",\n }));\n setItemList(_itemList);\n }, [screeningData]);\n\n useEffect(() => {\n const _newItemList = [...itemList];\n _newItemList.map((item, index) => {\n item.status = checkedAll;\n return item;\n });\n\n setItemList(_newItemList);\n }, [checkedAll]);\n /* itemList 의 status가 변경되었을 경우 */\n useEffect(() => {\n setStageDataList(\n itemList\n .filter((item) => item.status === \"stage\")\n .map((item) => item.item_id)\n );\n setKeepDataList(\n itemList\n .filter((item) => item.status === \"keep\")\n .map((item) => item.item_id)\n );\n setDeleteDataList(\n itemList\n .filter((item) => item.status === \"delete\")\n .map((item) => item.item_id)\n );\n }, [itemList]);\n\n return (\n \n \n \n );\n}\n\nexport default CrawlDataScreeningContainer;\n","import dayjs from \"dayjs\";\n\nexport const toYYMMDD_DOT = (date) => {\n if (!date) return \"\";\n return dayjs(date).format(\"YY.MM.DD\");\n};\n\nexport const toYYYYMMDD_DOT = (date) => {\n if (!date) return \"\";\n return dayjs(date).format(\"YYYY.MM.DD\");\n};\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { HiOutlineExternalLink } from \"react-icons/hi\";\nimport { Link } from \"react-router-dom\";\nimport { toYYYYMMDD_DOT } from \"Utils/time\";\nimport { myColors, tailwindColors } from \"styles/colors\";\n\nfunction DataTable({\n tableData,\n type,\n statusCode = null,\n stageDataList = null,\n keepDataList = null,\n deleteDataList = null,\n onChangeCheckedAll = null,\n checkedAll = null,\n onChangeEach = null,\n}) {\n return (\n <>\n \n \n \n \n {type === \"archive\" && (\n <>\n 구분\n {/* 문서 발행 국가 */}\n 정책 분류\n \n )}\n {/* {(type === \"register\" || type === \"archive\") && 한글제목} */}\n {type !== \"screening\" && 원제목}\n {/* 원문 요약 */}\n \n {type === \"screening\" ? \"HOST명\" : \"발급기관명\"}\n \n 언어\n 원문수집일\n 페이지 수\n\n {type === \"screening\" && (\n <>\n \n 완료\n \n \n \n 보류\n \n \n \n 삭제\n \n \n \n )}\n 원문링크\n \n \n \n {tableData.map((item, index) => {\n return (\n \n {type === \"archive\" && (\n <>\n \n {item.is_crawled ? (\n 크롤\n ) : (\n 수기\n )}\n \n {/* {item.doc_country_list} */}\n {item.doc_category_list}\n \n )}\n {/* {(type === \"register\" || type === \"archive\") && (\n {item.doc_kor_title}\n )} */}\n {type !== \"screening\" && (\n \n \n {item.doc_origin_title}\n \n \n )}\n {/* {item.doc_origin_summary} */}\n \n {type === \"screening\" ? item.doc_host : item.doc_publisher}\n \n \n {type === \"screening\"\n ? item.doc_language\n : item.doc_language?.length > 0\n ? item.doc_language[0].CT_NM\n : \"\"}\n \n {toYYYYMMDD_DOT(item.doc_collect_date)}\n {item.doc_page ? `${item.doc_page}p` : \"-\"}\n {type === \"screening\" && (\n <>\n \n {\n onChangeEach(e, \"stage\");\n }}\n />\n \n \n {\n onChangeEach(e, \"keep\");\n }}\n />\n \n \n {\n onChangeEach(e, \"delete\");\n }}\n />\n \n \n )}\n\n \n \n \n \n \n \n );\n })}\n \n \n \n \n );\n}\n\nconst TableWrapper = styled.div`\n width: 100%;\n max-height: 65rem;\n overflow: auto;\n box-shadow: rgb(9 30 66 / 25%) 0px 1px 1px;\n border-radius: 4px;\n border: solid 1px #eee;\n font-size: 14px;\n text-align: center;\n`;\n\nconst CustomTable = styled.table`\n width: 100%;\n border-collapse: collapse;\n .lang {\n width: 4rem;\n }\n .is_crawled {\n width: 3rem;\n }\n .dc_dt_collect {\n width: 6rem;\n }\n .dc_publisher {\n width: 10rem;\n }\n .dc_page,\n .dc_url_loc {\n width: 4rem;\n }\n\n thead {\n position: sticky;\n top: 0px;\n background-color: #d8dee6;\n color: #323d4d;\n border-bottom: 2px solid rgba(0, 0, 0, 0.1);\n }\n tbody tr:nth-child(odd) {\n background-color: #f4f5f8;\n }\n tr {\n height: 2.5rem;\n border-bottom: solid 1px #eee;\n }\n\n th {\n white-space: nowrap;\n padding: 0.5rem;\n }\n\n td {\n word-break: break-all;\n padding: 0.5rem;\n a {\n color: black;\n text-decoration: none;\n &:hover {\n text-decoration: underline;\n color: #435269;\n }\n }\n svg {\n margin: 0 auto;\n }\n }\n input[type=\"checkbox\"] {\n width: 20px; /*Desired width*/\n height: 20px; /*Desired height*/\n }\n`;\n\nconst Badge = styled.div`\n background-color: ${(props) =>\n props.is_crawled ? myColors.blue500 : myColors.green300};\n font-weight: bold;\n color: ${tailwindColors.white};\n border-radius: 2px;\n padding: 2px;\n`;\n\nconst CustomRadio = styled.input`\n font-size: 1em;\n width: 1.25em; /* 너비 설정 */\n height: 1.25em; /* 높이 설정 */\n vertical-align: middle;\n`;\nexport default DataTable;\n","import React from \"react\";\nimport styled from \"styled-components\";\n\nimport { STATUS_CODE_SET } from \"Data/crawlStatus\";\nimport Pagination from \"Components/Pagination\";\nimport NoData from \"Components/NoData\";\nimport DataFilter from \"Components/DataFilter\";\nimport DataTable from \"Components/DataTable\";\nimport { WorkerContentHeader } from \"Components/WorkerContentHeader\";\nimport { SearchResultCount } from \"Components/SearchResultCount\";\nimport { Tab } from \"Components/Tab\";\n\nfunction CrawlDataList({\n statusCode,\n dcCount,\n listSize,\n onChangeListSize,\n pageNo,\n setPageNo,\n crawlDataList,\n selectedTab,\n onClickTab,\n dataFilterFetch,\n}) {\n return (\n \n \n \n \n\n \n \n \n onClickTab(\"대기\")}\n />\n onClickTab(\"보류\")}\n />\n \n onChangeListSize(e)}\n >\n \n \n \n \n \n \n \n \n \n {crawlDataList.length !== 0 ? (\n <>\n \n \n \n \n \n \n \n ) : (\n \n )}\n \n \n );\n}\n\nconst Wrap = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n min-width: 1024px;\n width: 100%;\n padding: 1.5rem 3rem;\n`;\n\nconst Content = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n`;\n\nconst SearchResult = styled.div`\n width: 100%;\n`;\n\nconst RowWrap = styled.div`\n display: flex;\n align-items: center;\n justify-content: ${(props) => props.justify};\n gap: ${(props) => props.gap};\n width: 100%;\n margin-top: 1rem;\n\n .list-size {\n padding: 0.5rem;\n border: solid 1px #d6d6d6;\n font-size: 1rem;\n }\n`;\n\nconst PaginationWrap = styled.div`\n margin-top: 1.5rem;\n`;\n\nexport default CrawlDataList;\n","import React, { useEffect, useState } from \"react\";\nimport { useParams } from \"react-router-dom\";\nimport { useDispatch } from \"react-redux\";\nimport { trackPromise } from \"react-promise-tracker\";\n\nimport { CrawlDataListFetchApi, sessionHandler } from \"Utils/api\";\nimport { LoadingWrapper } from \"Components/LoadingWrapper\";\n\nimport CrawlDataList from \"./CrawlDataList\";\n\n// data를 fetch할 때 보류면 statuscode+1을 한다.\nconst TAB_VALUES = {\n 대기: false,\n 보류: true,\n};\n\nfunction CrawlDataListContainer() {\n const dispatch = useDispatch();\n /* 현재 보여질 데이터 */\n const [crawlDataList, setCrawlDataList] = useState([]);\n const [searchObj, setSearchObj] = useState(null); // 검색 옵션\n\n /* refine, register 를 router로 부터 받아와서 구분하도록 함.... */\n const { statusCode } = useParams();\n const [currentCode, setCurrentCode] = useState(statusCode);\n\n /* 페이지네이션 */\n const [dcCount, setDcCount] = useState(0); // document 총 개수\n const [pageNo, setPageNo] = useState(1); // 현재 활성화 된 페이지 번호\n const [listSize, setListSize] = useState(10); // 한 페이지에 나타낼 document 개수\n const [selectedTab, setSelectedTab] = useState(\"대기\");\n\n const onClickTab = (tabName) => {\n if (selectedTab === tabName) return;\n\n setSelectedTab(tabName);\n //보류면 statusCode + 1 대기면 기본 statusCode\n const newCode = TAB_VALUES[tabName]\n ? Number(statusCode) + 1\n : Number(statusCode);\n setCurrentCode(newCode);\n\n setPageNo(1);\n };\n\n const onChangeListSize = (e) => {\n const newListSize = e.target.value;\n setListSize(newListSize);\n setPageNo(1);\n };\n\n const dataCleansing = (rawData) => {\n let _crawlDataList = [];\n let _rawCrawlDataList = rawData.docs;\n let _dcCount = rawData.dcCount;\n\n _rawCrawlDataList.forEach((item, index) => {\n const obj = {\n doc_origin_title: item.doc_origin_title,\n doc_kor_title: item.doc_kor_title,\n doc_keyword: item.doc_keyowrd,\n doc_collect_date: item.doc_collect_date.substring(0, 10),\n _id: item._id,\n item_id: item.item_id,\n stat: item.stat,\n doc_language: item.doc_language,\n doc_page: item.doc_page,\n doc_url: item.doc_url,\n doc_origin_summary: item.doc_origin_summary,\n doc_publisher: item.doc_publisher,\n };\n _crawlDataList.push(obj);\n });\n setDcCount(_dcCount);\n setCrawlDataList(_crawlDataList);\n };\n\n /* 데이터 불러오기 */\n const dataFetch = (searchObj = null) => {\n trackPromise(\n CrawlDataListFetchApi(currentCode, listSize, pageNo, searchObj)\n .then((res) => {\n console.log(res.data);\n dataCleansing(res.data);\n })\n .catch((err) => {\n sessionHandler(err, dispatch).then((res) => {\n CrawlDataListFetchApi(\n currentCode,\n listSize,\n pageNo,\n searchObj\n ).then((res) => {\n dataCleansing(res.data);\n });\n });\n })\n );\n };\n\n const dataFilterFetch = (searchObj) => {\n setSearchObj(searchObj);\n };\n\n /* pageNo, statusCode 가 변경되었을 때 데이터를 다시 불러옴 */\n useEffect(() => {\n dataFetch(searchObj);\n }, [pageNo, currentCode, listSize, searchObj]);\n\n return (\n \n \n \n );\n}\nexport default CrawlDataListContainer;\n","import { HiSearch } from \"react-icons/hi\";\nimport styled from \"styled-components\";\nimport { myColors, tailwindColors } from \"styles/colors\";\n\nexport const Search = ({ onSubmitSearch, onChangeSearchInput }) => {\n return (\n \n {/*
검색
*/}\n \n \n \n \n \n \n \n
\n );\n};\n\nconst Wrap = styled.div`\n display: flex;\n width: 100%;\n background-color: ${tailwindColors[\"grey-100\"]};\n\n & > div:first-of-type {\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 1rem;\n background-color: ${tailwindColors[\"grey-600\"]};\n color: ${tailwindColors.white};\n font-weight: bold;\n }\n`;\n\nconst SearchForm = styled.form`\n display: flex;\n align-items: center;\n width: 100%;\n padding: 1rem;\n\n & > button {\n width: 80px;\n height: 40px;\n padding: 0.5rem 1rem;\n border: none;\n background-color: ${myColors.blue500};\n font-size: 14px;\n color: white;\n font-weight: bold;\n white-space: nowrap;\n cursor: pointer;\n\n :nth-of-type(2) {\n background-color: ${tailwindColors[\"grey-700\"]};\n margin-left: 0.5rem;\n }\n }\n`;\n\nconst SerchInputWrap = styled.div`\n display: flex;\n align-items: center;\n max-width: 30rem;\n width: 100%;\n background-color: ${tailwindColors[\"grey-100\"]};\n\n & label {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding-left: 0.5rem;\n cursor: pointer;\n }\n`;\n\nconst SearchInput = styled.input`\n flex: 1;\n padding: 0.5rem 1rem;\n border: 1px solid ${tailwindColors[\"grey-400\"]};\n background-color: ${tailwindColors.white};\n`;\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { CgFileDocument } from \"react-icons/cg\";\nimport { BsInboxes } from \"react-icons/bs\";\n\nimport Pagination from \"Components/Pagination\";\nimport DataFilter from \"Components/DataFilter\";\nimport DataTable from \"Components/DataTable\";\nimport { WorkerContentHeader } from \"Components/WorkerContentHeader\";\nimport { SearchResultCount } from \"Components/SearchResultCount\";\nimport { Tab } from \"Components/Tab\";\nimport { Search } from \"../CurationDataList/_Search\";\n\nfunction ArchiveDataList({\n archiveDataList,\n statusCode,\n dcCount,\n onChangeListSize,\n listSize,\n pageNo,\n setPageNo,\n dataFilterFetch,\n selectedTab,\n setSearchInput,\n onClickTab,\n onSearch,\n}) {\n const onSubmitSearch = (e) => {\n e.preventDefault();\n onSearch();\n };\n\n const onChangeSearch = (e) => {\n setSearchInput(e.target.value);\n };\n\n return (\n \n \n \n \n \n \n \n \n \n \n onClickTab(\"아카이브 문서\")}\n />\n onClickTab(\"큐레이션 선정 문서\")}\n selected={selectedTab === \"큐레이션 선정 문서\"}\n />\n \n onChangeListSize(e)}\n >\n \n \n \n \n \n \n \n \n \n {archiveDataList.length !== 0 ? (\n <>\n \n \n \n \n \n ) : (\n <>\n \n \n
등록된 데이터가 없습니다.
\n
\n \n )}\n
\n
\n );\n}\n\nconst Wrap = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n min-width: 1024px;\n width: 100%;\n padding: 1.5rem 3rem;\n`;\n\nconst SearchContainer = styled.div`\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n width: 100%;\n`;\n\nconst Content = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n font-size: 14px;\n`;\n\nconst SearchResultNotthingContainer = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n flex-direction: column;\n margin-top: 10rem;\n .comment {\n font-size: 30px;\n color: #d6d6d6;\n }\n`;\n\nconst RowWrap = styled.div`\n display: flex;\n align-items: center;\n justify-content: ${(props) => props.justify};\n gap: ${(props) => props.gap};\n width: 100%;\n margin-top: 1rem;\n\n .list-size {\n padding: 0.5rem;\n border: solid 1px #d6d6d6;\n font-size: 1rem;\n }\n`;\n\nconst PaginationWrap = styled.div`\n margin-top: 1.5rem;\n`;\n\nexport default ArchiveDataList;\n","import React, { useState, useEffect } from \"react\";\nimport ArchiveDataList from \"./ArchiveDataList\";\nimport { useDispatch } from \"react-redux\";\nimport { trackPromise } from \"react-promise-tracker\";\n\nimport { CrawlDataListFetchApi, sessionHandler } from \"Utils/api\";\nimport { LoadingWrapper } from \"Components/LoadingWrapper\";\n\nconst TAB_VALUES = {\n \"아카이브 문서\": 6,\n \"큐레이션 선정 문서\": 7,\n};\n\nconst STATUS_CODE = 6;\n\nfunction ArchiveDataListContainer() {\n const dispatch = useDispatch();\n /* 현재 보여질 데이터 */\n const [archiveDataList, setArchiveDataList] = useState([]);\n const [searchObj, setSearchObj] = useState(null); // 검색 옵션\n const [searchInput, setSearchInput] = useState(\"\");\n\n /* 페이지네이션 */\n const [dcCount, setDcCount] = useState(0); // document 총 개수\n const [pageNo, setPageNo] = useState(1); // 현재 활성화 된 페이지 번호\n const [listSize, setListSize] = useState(10); // 한 페이지에 나타낼 document 개수\n const [selectedTab, setSelectedTab] = useState(\"아카이브 문서\");\n\n const onClickTab = (tabName) => {\n if (selectedTab === tabName) return;\n\n setSelectedTab(tabName);\n setPageNo(1);\n };\n\n const onChangeListSize = (e) => {\n const newListSize = e.target.value;\n setListSize(newListSize);\n setPageNo(1);\n };\n\n /* 데이터 정제하기 */\n const dataCleansing = (rawData) => {\n let _archiveDataList = [];\n let _rawArchiveDataList = rawData.docs;\n let _dcCount = rawData.dcCount;\n _rawArchiveDataList.forEach((item) => {\n const obj = {\n _id: item._id,\n doc_kor_title: item.doc_kor_title,\n doc_origin_title: item.doc_origin_title,\n doc_origin_summary: item.doc_origin_summary,\n doc_kor_summary: item.doc_kor_summary,\n doc_page: item.doc_page,\n doc_country_list: item.doc_country.map((x) => x.CT_NM).join(\", \"),\n doc_category_list: item.doc_category.map((x) => x.CT_NM).join(\", \"),\n doc_url: item.doc_url ? item.doc_url.replace(\"%3A\", \":\") : \"\",\n is_crawled: item.is_crawled,\n doc_collect_date: item.doc_collect_date,\n doc_language: item.doc_language,\n doc_publisher: item.doc_publisher,\n };\n _archiveDataList.push(obj);\n });\n setDcCount(_dcCount);\n setArchiveDataList(_archiveDataList);\n };\n\n /* 필터 적용 데이터 받아오기 */\n\n const dataFilterFetch = (searchObj) => {\n setSearchObj(searchObj);\n };\n\n /* 데이터 불러오기 */\n const dataFetch = (searchObj = null, general = false, query) => {\n trackPromise(\n CrawlDataListFetchApi(\n TAB_VALUES[selectedTab],\n listSize,\n pageNo,\n searchObj,\n general,\n query\n )\n .then((res) => {\n dataCleansing(res.data);\n })\n .catch((err) => {\n console.log(err);\n sessionHandler(err, dispatch).then((res) => {\n CrawlDataListFetchApi(\n TAB_VALUES[selectedTab],\n listSize,\n pageNo,\n searchObj\n ).then((res) => {\n dataCleansing(res.data);\n });\n });\n })\n );\n };\n\n const onSearch = () => {\n setPageNo(1);\n if (!searchInput) {\n dataFetch(null, false);\n } else {\n dataFetch(null, true, searchInput);\n }\n };\n\n useEffect(() => {\n dataFetch(searchObj, searchInput ? true : false, searchInput ?? null);\n }, [selectedTab, pageNo, listSize, searchObj]);\n\n return (\n \n \n \n );\n}\nexport default ArchiveDataListContainer;\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { AiOutlineLink } from \"react-icons/ai\";\nimport { BsGear, BsImage, BsJournal } from \"react-icons/bs\";\nimport Editor from \"Components/Editor\";\nimport { WorkerContentHeader } from \"Components/WorkerContentHeader\";\nimport { myColors, tailwindColors } from \"styles/colors\";\nimport { PERMISSON_DATA } from \"Data/permission\";\nimport { toYYYYMMDD_DOT } from \"Utils/time\";\nimport { Link } from \"react-router-dom\";\n\nfunction CurationDataDetail({ docs, permission, goDataManage, nearDocs }) {\n return (\n \n {PERMISSON_DATA[permission] === \"관리자\" && (\n \n \n \n 편집\n \n \n )}\n \n \n

{docs.doc_kor_title}

\n

{docs.doc_origin_title}

\n {docs.doc_biblio &&

{docs.doc_biblio}

}\n
\n\n \n \n {docs.doc_thumbnail ? (\n \n ) : (\n
\n \n
\n )}\n
\n \n
\n \n
\n \n 원문 수집일 :\n
\n
\n {valueOrDefaultValue(toYYYYMMDD_DOT(docs.doc_collect_date))}\n
\n
\n \n
\n \n 원문 작성일 :\n
\n
\n {valueOrDefaultValue(toYYYYMMDD_DOT(docs.doc_write_date))}\n
\n
\n \n
\n \n 원문 발행일 :\n
\n
\n {valueOrDefaultValue(toYYYYMMDD_DOT(docs.doc_publish_date))}\n
\n
\n \n
\n \n 문서 서비스 등록일 :\n
\n
\n {valueOrDefaultValue(toYYYYMMDD_DOT(docs.doc_register_date))}\n
\n
\n \n
\n \n 문서 언어 :\n
\n
\n {valueOrDefaultValue(docs.doc_language_list)}\n
\n
\n \n
\n \n 발행기관 명 :\n
\n
\n {valueOrDefaultValue(docs.doc_publisher)}\n
\n
\n \n
\n \n 발행 HOST :\n
\n
\n {valueOrDefaultValue(docs.doc_host)}\n
\n
\n \n
\n \n 발행 면수 :\n
\n
\n {valueOrDefaultValue(docs.doc_page)}\n
\n
\n
\n
\n \n
\n \n 대상 국가 :\n
\n
\n {valueOrDefaultValue(docs.doc_country_list)}\n
\n
\n \n
\n \n 정책 분류 :\n
\n
\n {valueOrDefaultValue(docs.doc_category_list)}\n
\n
\n \n
\n \n 문서 유형 분류 :\n
\n
\n {valueOrDefaultValue(docs.doc_content_type_list)}\n
\n
\n \n
\n \n 내용 구분 분류 :\n
\n
\n {valueOrDefaultValue(docs.doc_content_category_list)}\n
\n
\n \n
\n \n 문서 토픽 분류 :\n
\n
\n {valueOrDefaultValue(docs.doc_topic_list)}\n
\n
\n\n \n
\n \n 조사 과제 명 :\n
\n
\n {valueOrDefaultValue(docs.doc_project)}\n
\n
\n \n
\n \n 세부과업명 :\n
\n
\n {valueOrDefaultValue(docs.doc_publishing)}\n
\n
\n \n
\n \n 큐레이션 추천문서 :\n
\n
\n {valueOrDefaultValue(docs.doc_recomment)}\n
\n
\n
\n
\n
\n \n window.open(docs.doc_url)}\n >\n 원문보기\n \n window.open(docs.doc_url_intro)}\n >\n 원문안내\n \n \n \n
키워드
\n
\n {docs.doc_keyword &&\n docs.doc_keyword.map((item, index) => {\n return (\n
\n {item}\n
\n );\n })}\n
\n
\n \n \n
연관문서
\n {docs.doc_relate_title && docs.doc_relate_url ? (\n \n ) : (\n \"연관문서 없음\"\n )}\n
\n \n
묶음문서 이동
\n\n {docs.doc_bundle_title && docs.doc_bundle_url ? (\n \n ) : (\n \"묶음문서 없음\"\n )}\n
\n \n
한글 요약
\n
{docs.doc_kor_summary}
\n
\n \n
원문 요약
\n
{docs.doc_origin_summary}
\n
\n \n
본문내용
\n
\n \n \n \n
\n
\n {PERMISSON_DATA[permission] === \"사용자\" && (\n \n
\n
이전 글
\n
\n \n {nearDocs.prev.doc_title}\n \n
\n
\n
\n
다음 글
\n
\n \n {nearDocs.next.doc_title}\n \n
\n
\n
\n )}\n
\n );\n}\n\nconst valueOrDefaultValue = (value) => {\n return value ? value : \"-\";\n};\n\nconst NearDocsContainer = styled.div`\n width: 100%;\n margin-top: 2rem;\n border: 1px solid ${tailwindColors[\"grey-300\"]};\n\n & > * + * {\n border-top: 1px solid ${tailwindColors[\"grey-300\"]};\n }\n\n & > div {\n display: flex;\n width: 100%;\n a:hover {\n text-decoration: underline;\n }\n\n div:first-of-type {\n background-color: ${tailwindColors[\"grey-200\"]};\n padding: 1rem 3rem;\n font-weight: bold;\n }\n\n div:nth-of-type(2) {\n padding: 1rem;\n }\n }\n`;\n\nconst Wrap = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n padding: 1.5rem 3rem;\n\n @media ${(props) => props.theme.laptop} {\n padding: 1.5rem 1rem;\n }\n\n @media ${(props) => props.theme.mobile_l} {\n padding: 1.5rem 0.5rem;\n }\n`;\n\nconst EditButton = styled.button`\n display: flex;\n align-items: center;\n gap: 0.3rem;\n padding: 0.5rem 1rem;\n background-color: ${myColors.blue500};\n color: ${tailwindColors.white};\n cursor: pointer;\n`;\n\nconst ArticleContainer = styled.div`\n display: flex;\n flex-direction: column;\n width: 100%;\n margin-top: 3rem;\n`;\nconst ArticleTopArea = styled.div`\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 3rem;\n width: 100%;\n margin-bottom: 4rem;\n\n @media ${(props) => props.theme.tablet} {\n flex-direction: column;\n gap: 1.5rem;\n }\n`;\n\nconst ThumbnailWrap = styled.div`\n display: flex;\n align-items: center;\n max-width: 12rem;\n width: 100%;\n overflow: hidden;\n\n & > div {\n display: flex;\n align-items: center;\n justify-content: center;\n max-width: 12rem;\n width: 100%;\n height: 16rem;\n background-color: ${tailwindColors[\"grey-100\"]};\n color: ${tailwindColors[\"grey-600\"]};\n }\n\n @media ${(props) => props.theme.tablet} {\n align-self: flex-start;\n }\n`;\nconst Image = styled.img`\n width: 100%;\n height: 100%;\n object-fit: contain;\n`;\nconst ArticleHeader = styled.div`\n display: flex;\n flex-direction: column;\n gap: 0.3rem;\n margin-bottom: 1.5rem;\n\n & h3 {\n font-size: 2rem;\n color: ${tailwindColors.black};\n font-weight: bold;\n }\n\n & h4 {\n color: ${tailwindColors[\"grey-700\"]};\n }\n\n & p {\n color: ${tailwindColors.black};\n width: 100%;\n }\n\n @media ${(props) => props.theme.mobile_l} {\n & h3 {\n font-size: 1.5rem;\n }\n }\n`;\n\nconst ArticleInfoContainer = styled.div`\n display: flex;\n flex-wrap: wrap;\n flex: 1;\n min-width: max-content;\n & > div {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n flex: 1;\n }\n\n @media ${(props) => props.theme.tablet} {\n width: 100%;\n > div {\n flex-grow: 1;\n min-width: max-content;\n }\n }\n\n @media ${(props) => props.theme.mobile_l} {\n flex-direction: column;\n gap: 1rem;\n }\n`;\n\nconst Info = styled.div`\n display: flex;\n gap: 0.5rem;\n font-size: 14px;\n white-space: nowrap;\n word-break: break-all;\n\n .title {\n display: flex;\n gap: 0.2rem;\n font-weight: bold;\n }\n`;\n\nconst LinkContainer = styled.div`\n display: flex;\n align-items: center;\n gap: 1rem;\n margin-bottom: 3rem;\n`;\n\nconst LinkButton = styled.button`\n height: 3rem;\n padding: 0.5rem 1.5rem;\n background-color: ${tailwindColors.white};\n font-weight: bold;\n\n &.origin {\n background-color: ${myColors.blue500};\n color: ${tailwindColors.white};\n }\n\n &.origin-intro {\n background-color: ${tailwindColors[\"grey-300\"]};\n }\n\n &.relate {\n border: 1px solid ${tailwindColors[\"grey-700\"]};\n }\n\n &.bundle {\n border: 1px solid ${tailwindColors[\"grey-700\"]};\n }\n\n &:disabled {\n opacity: 0.2;\n cursor: not-allowed;\n }\n`;\n\nconst KeywordContainer = styled.div`\n display: flex;\n flex-direction: column;\n gap: 1rem;\n margin-bottom: 3rem;\n\n .title {\n color: ${tailwindColors.black};\n font-size: 1.2rem;\n font-weight: bold;\n }\n .contents {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n flex: 1;\n row-gap: 0.5rem;\n column-gap: 0.625rem;\n }\n .badge {\n padding: 0.5rem 2rem;\n border-radius: 1.25rem;\n flex-shrink: 1;\n background-color: ${tailwindColors[\"grey-200\"]};\n font-size: 14px;\n font-weight: bold;\n word-break: break-all;\n }\n\n @media ${(props) => props.theme.tablet} {\n }\n\n @media ${(props) => props.theme.mobile_l} {\n .badge {\n padding: 0.5rem 1rem;\n font-size: 12px;\n }\n }\n`;\n\nconst ContentContainer = styled.div`\n display: flex;\n flex-direction: column;\n gap: 2rem;\n`;\n\nconst ContentRow = styled.div`\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n color: ${tailwindColors.black};\n\n .title {\n width: 100%;\n\n font-weight: bold;\n font-size: 1.2rem;\n padding: 0.5rem 0;\n :not(div:last-of-type) {\n border-bottom: 1px solid ${tailwindColors[\"grey-300\"]};\n }\n }\n .contents {\n display: flex;\n align-content: space-around;\n flex-wrap: wrap;\n\n a {\n display: flex;\n align-items: center;\n flex: 1;\n gap: 0.5rem;\n :hover {\n text-decoration: underline;\n }\n }\n }\n`;\n\nexport default CurationDataDetail;\n","import { _axios } from \"services/axiosService\";\nimport { HTTP_METHOD } from \".\";\nimport { getToken } from \"Utils/tokens\";\n\nconst customUrl = \"nextrend/custom\";\n\n/**\n *\n * @param {{xaxis:number[],yaxis:number[],uid:number}} data\n * @returns\n */\nexport const setUserCustomMenu = async (data) => {\n return _axios({\n url: `${customUrl}`,\n method: HTTP_METHOD.POST,\n data,\n });\n};\n\nexport const removeUserCustomMenu = async (data) => {\n return _axios({\n url: `${customUrl}`,\n method: HTTP_METHOD.DELETE,\n data,\n });\n};\n\n//관리자 , 사용자 공동사용\nexport const getUserCustomMenuByUserId = async (uid) => {\n return _axios({\n url: `${customUrl}`,\n method: HTTP_METHOD.GET,\n params: { uid },\n });\n};\n\nexport const getNextPrevDoc = ({ axis, docId, statusCode }) => {\n return _axios({\n url: `${customUrl}/next-prev`,\n method: HTTP_METHOD.GET,\n headers: { authorization: `Bearer ${getToken()}` },\n\n params: { axis, docId, statusCode },\n });\n};\n","import React, { useState, useEffect } from \"react\";\nimport CurationDataDetail from \"./CurationDataDetail\";\nimport { useParams, useHistory } from \"react-router-dom\";\nimport { CrawlDataDetailFetchApi, sessionHandler } from \"../../../Utils/api\";\nimport { useSelector, useDispatch } from \"react-redux\";\nimport { trackPromise } from \"react-promise-tracker\";\nimport { LoadingWrapper } from \"../../../Components/LoadingWrapper\";\nimport { getAddressRemovedPath } from \"Utils/image\";\nimport { getNextPrevDoc } from \"services/api/custom\";\n\nfunction CurationDataDetailContainer() {\n const statusCode = 8;\n const permission = useSelector((state) => state.user.user.permission);\n const axisObj = useSelector((state) => state.custom.axisObj);\n const { _id } = useParams();\n const [docs, setDocs] = useState({}); // 폼에 default 값으로 출력할 데이터를 객체로 전달. 관리 편하게\n const [nearDocs, setNearDocs] = useState({\n prev: { doc_id: \"\", doc_title: \"\" },\n next: { doc_id: \"\", doc_title: \"\" },\n }); // 이전글 다음글 데이터\n\n const history = useHistory();\n const dispatch = useDispatch();\n /* 데이터 관리로 이동 */\n const goDataManage = () => {\n history.push(`/crawl/${statusCode}/${_id}`);\n };\n /* 데이터 불러오기 */\n const dataFetch = () => {\n trackPromise(\n CrawlDataDetailFetchApi(statusCode, _id)\n .then((res) => {\n console.log(res.data);\n dataCleansing(res.data);\n })\n .catch((err) => {\n console.log(\"큐레이션 상세 조회 에러\");\n console.error(err);\n sessionHandler(err, dispatch).then((res) => {\n CrawlDataDetailFetchApi(statusCode, _id).then((res) => {\n dataCleansing(res.data);\n });\n });\n }),\n );\n };\n\n const fetchNearDocs = () => {\n const { X, Y } = axisObj;\n\n trackPromise(\n getNextPrevDoc({\n axis: { [X.type]: X.code, [Y.type]: Y.code },\n docId: _id,\n statusCode,\n })\n .then((res) => {\n setNearDocs(res.data);\n })\n .catch((err) => {\n sessionHandler(err, dispatch).then((res) => {\n getNextPrevDoc({\n axis: { [X.type]: X.code, [Y.type]: Y.code },\n docId: _id,\n statusCode,\n }).then((res) => {\n setNearDocs(res.data);\n });\n });\n }),\n );\n };\n\n /* 데이터 정제하기 */\n const dataCleansing = (rawData) => {\n const _rawStatusDetailData = rawData.docs;\n let _docs = {\n doc_content: _rawStatusDetailData.doc_content || \"\",\n doc_collect_date: _rawStatusDetailData.doc_collect_date || \"\",\n doc_write_date: _rawStatusDetailData.doc_write_date || \"\",\n doc_publish_date: _rawStatusDetailData.doc_publish_date || \"\",\n doc_register_date: _rawStatusDetailData.doc_register_date || \"\",\n doc_keyword: _rawStatusDetailData.doc_keyowrd,\n doc_publisher: _rawStatusDetailData.doc_publisher || \"\",\n doc_thumbnail: getAddressRemovedPath(_rawStatusDetailData.doc_thumbnail),\n doc_publish_country: _rawStatusDetailData.doc_publish_country || \"\",\n doc_publish_country_list: _rawStatusDetailData.doc_publish_country\n .map((x) => x.CT_NM)\n .join(\", \"),\n doc_category: _rawStatusDetailData.doc_category,\n doc_category_list: _rawStatusDetailData.doc_category\n .map((x) => x.CT_NM)\n .join(\", \"),\n doc_country: _rawStatusDetailData.doc_country,\n doc_country_list: _rawStatusDetailData.doc_country\n .map((x) => x.CT_NM)\n .join(\", \"),\n doc_page: _rawStatusDetailData.doc_page || \"\",\n doc_content_type: _rawStatusDetailData.doc_content_type || [],\n doc_content_type_list: _rawStatusDetailData.doc_content_type\n .map((x) => x.CT_NM)\n .join(\", \"),\n doc_content_category: _rawStatusDetailData.doc_content_category || [],\n doc_content_category_list: _rawStatusDetailData.doc_content_category\n .map((x) => x.CT_NM)\n .join(\", \"),\n doc_origin_title: _rawStatusDetailData.doc_origin_title || \"\",\n doc_kor_title: _rawStatusDetailData.doc_kor_title || \"\",\n doc_kor_summary: _rawStatusDetailData.doc_kor_summary || \"\",\n doc_origin_summary: _rawStatusDetailData.doc_origin_summary || \"\",\n doc_recomment: _rawStatusDetailData.doc_recomment || \"\",\n doc_url: _rawStatusDetailData.doc_url || \"\",\n doc_url_intro: _rawStatusDetailData.doc_url_intro || \"\",\n doc_relate_title: _rawStatusDetailData.doc_relate_title || \"\",\n doc_relate_url: _rawStatusDetailData.doc_relate_url || \"\",\n doc_bundle_url: _rawStatusDetailData.doc_bundle_url || \"\",\n doc_bundle_title: _rawStatusDetailData.doc_bundle_title || \"\",\n doc_project: _rawStatusDetailData.doc_project || \"\",\n doc_publishing: _rawStatusDetailData.doc_publishing || \"\",\n doc_biblio: _rawStatusDetailData.doc_biblio || \"\",\n doc_topic: _rawStatusDetailData.doc_topic || [],\n doc_topic_list: _rawStatusDetailData.doc_topic\n .map((x) => x.CT_NM)\n .join(\", \"),\n doc_language: _rawStatusDetailData.doc_language || [],\n doc_language_list: _rawStatusDetailData.doc_language\n .map((x) => x.CT_NM)\n .join(\", \"),\n doc_host:\n _rawStatusDetailData.doc_host &&\n _rawStatusDetailData.doc_host.length !== 0\n ? _rawStatusDetailData.doc_host[0].HOST\n : \"\",\n };\n setDocs(_docs);\n };\n\n useEffect(() => {\n dataFetch();\n }, [_id]);\n\n useEffect(() => {\n if (permission !== 0 || !axisObj.X || !axisObj.Y) return;\n fetchNearDocs();\n }, [_id, axisObj.X, axisObj.Y, permission]);\n\n return (\n \n \n \n );\n}\nexport default CurationDataDetailContainer;\n","import React from \"react\";\nimport styled from \"styled-components\";\nfunction CurationDataCard({ curationDataItem }) {\n return (\n <>\n \n \n \n \n \n \n \n <div>[{curationDataItem.doc_country_list}]</div>\n <div>{curationDataItem.doc_kor_title}</div>\n \n {curationDataItem.doc_origin_title}\n \n \n {curationDataItem.doc_category_list}\n \n \n {curationDataItem.doc_publish_country_list}\n \n \n {curationDataItem.doc_publisher}\n \n \n \n {curationDataItem.doc_page}쪽\n \n {curationDataItem.doc_register_date}\n \n \n {curationDataItem.doc_content}\n \n \n \n );\n}\n\nconst CardWrapper = styled.div`\n width:inherit;\n display: flex;\n padding: 1rem;\n box-shadow: rgb(9 30 66 / 25%) 0px 1px 1px;\n border-radius: 4px;\n margin: 1rem;\n transition: all 0.3s ease-in-out; /* 부드러운 모션을 위해 추가*/\n &:hover {\n transform: scale(1.02);\n cursor: pointer;\n }\n background-color: white;\n`;\nconst ImageContainer = styled.div`\n min-width: 12rem;\n max-width: 12rem;\n height: 100%;\n overflow: hidden;\n box-shadow: rgb(9 30 66 / 25%) 0px 1px 1px;\n`;\nconst Image = styled.img`\n width: 100%;\n height: 100%;\n object-fit: cover;\n`;\nconst ContentContainer = styled.div`\n p {\n padding: 0;\n margin: 0;\n }\n div {\n margin-bottom: 0.5rem;\n }\n display: flex;\n flex-direction: column;\n padding: 1rem;\n`;\nconst Title = styled.div`\n display: flex;\n div:nth-child(1){\n min-width:5rem;\n }\n div {\n margin-right: 0.5rem;\n font-weight: bold;\n font-size: 20px;\n }\n /* p태그 첫번째 요소는 말머리 */\n /* div:nth-child(1) {\n color: black;\n } */\n /* p태그 두번째 요소는 한글 제목*/\n div:nth-child(1) {\n color: #435269;\n }\n`;\nconst SubTitle = styled.div`\n /* p태그 세번째 요소는 원문 제목*/\n font-size: 14px;\n color: grey;\n word-break:break-all;\n word-wrap:break-word;\n`;\nconst Info = styled.div`\n font-size: 12px;\n display: flex;\n\n div {\n align-items: center;\n padding: 0.5rem;\n margin: 0;\n }\n`;\nconst Badge = styled.div`\n &:before {\n content: \"\";\n color: white;\n font-weight: bold;\n font-size: 12px;\n padding-left: 5px;\n padding-right: 5px;\n margin-right: 5px;\n border-radius: 3px;\n background-color: ${(props) => props.color || \"grey\"};\n }\n`;\nconst CategoryBadge = styled(Badge)`\n &:before {\n content: \"주제\";\n }\n`;\nconst CountryBadge = styled(Badge)`\n &:before {\n content: \"발행 국가\";\n }\n`;\nconst PageBadge = styled(Badge)`\n &:before {\n content: \"페이지수\";\n }\n`;\nconst PublisherBadge = styled(Badge)`\n &:before {\n content: \"발행기관명\";\n }\n`;\nconst RegiDateBadge = styled(Badge)`\n &:before {\n content: \"데이터 등록 일자\";\n }\n`;\nconst Content = styled.div`\n overflow: hidden;\n\n text-overflow: ellipsis;\n\n display: -webkit-box;\n\n -webkit-line-clamp: 5; /* 라인수 */\n\n -webkit-box-orient: vertical;\n\n word-wrap: break-word;\n word-break:break-all;\n`;\nexport default CurationDataCard;\n","import React from \"react\";\nimport styled from \"styled-components\";\n\nfunction CurationDataCard2({ curationDataItem }) {\n return (\n \n \n \n \n \n \n <div>[{curationDataItem.doc_country_list}]</div>\n <div>{curationDataItem.doc_kor_title}</div>\n \n {curationDataItem.doc_origin_title}\n \n
{curationDataItem.doc_category_list}
\n
|
\n
{curationDataItem.doc_publish_country_list}
\n
|
\n
{curationDataItem.doc_host}
\n
|
\n
{curationDataItem.doc_register_date}
\n
|
\n
{curationDataItem.doc_page}쪽
\n
\n {curationDataItem.doc_url}\n
\n
\n );\n}\nconst CardWrapper = styled.div`\n display: flex;\n align-items: center;\n padding: 1rem;\n box-shadow: rgb(9 30 66 / 25%) 0px 1px 1px;\n border-radius: 4px;\n margin: 0.5rem;\n transition: all 0.3s ease-in-out; /* 부드러운 모션을 위해 추가*/\n &:hover {\n transform: scale(1.02);\n cursor: pointer;\n }\n background-color: white;\n`;\nconst ImageContainer = styled.div`\n width: 8rem;\n height: 6rem;\n overflow: hidden;\n border: solid 1px #eee;\n /*box-shadow: rgb(9 30 66 / 25%) 0px 1px 1px;*/\n`;\nconst Image = styled.img`\n width: 100%;\n height: 100%;\n object-fit: cover;\n`;\nconst ContentContainer = styled.div`\n p {\n padding: 0;\n margin: 0;\n }\n div {\n margin-bottom: 0.25rem;\n }\n display: flex;\n flex-direction: column;\n padding: 1rem;\n`;\nconst Title = styled.div`\n display: flex;\n div {\n margin-right: 0.5rem;\n font-weight: bold;\n font-size: 16px;\n }\n div:nth-child(1) {\n color: #435269;\n }\n`;\nconst SubTitle = styled.div`\n /* p태그 세번째 요소는 원문 제목*/\n font-size: 14px;\n color: grey;\n`;\nconst Info = styled.div`\n font-size: 12px;\n display: flex;\n div {\n align-items: center;\n padding-right: 0.5rem;\n margin: 0;\n }\n`;\nconst UrlPreview = styled.div`\n color: #009999;\n font-size: 12px;\n`;\nexport default CurationDataCard2;\n","import styled from \"styled-components\";\nimport { myColors, tailwindColors } from \"styles/colors\";\nimport { toYYMMDD_DOT } from \"Utils/time\";\n\nexport const CurationTable = ({ curationData, handleRowClick }) => {\n return (\n <>\n \n \n \n \n \n \n \n \n \n \n \n \n 제목\n 대상 국가\n 정책 분류\n 문서 분류\n 발급 기관 명\n 페이지 수\n 원문 발행일\n \n \n \n {curationData.map((item, index) => {\n return (\n {\n handleRowClick(item._id);\n }}\n key={index}\n >\n \n
\n
\n \n
\n
\n
{item.doc_kor_title}
\n
{item.doc_origin_title}
\n
\n
\n \n {item.doc_country_list}\n {item.doc_category_list}\n {item.doc_content_type_list}\n {item.doc_publisher}\n\n {item.doc_page}쪽\n \n {toYYMMDD_DOT(item.doc_Publish_date)}\n \n \n );\n })}\n \n
\n \n );\n};\n\nconst CurationListTable = styled.table`\n width: 100%;\n table-layout: fixed;\n font-size: 14px;\n\n thead {\n border-bottom: 1px solid ${tailwindColors[\"grey-400\"]};\n background-color: ${tailwindColors[\"grey-100\"]};\n font-weight: bold;\n text-align: center;\n white-space: nowrap;\n }\n\n th {\n padding: 0.5rem;\n }\n\n td {\n padding: 0.2rem;\n word-break: break-all;\n }\n\n & tbody {\n width: 100%;\n\n tr {\n width: 100%;\n height: 2.5rem;\n border-bottom: 1px solid ${tailwindColors[\"grey-400\"]};\n background-color: ${tailwindColors.white};\n cursor: pointer;\n\n :hover {\n background-color: ${tailwindColors[\"grey-100\"]};\n }\n /* :nth-of-type(2n) {\n background-color: ${tailwindColors[\"grey-50\"]};\n } */\n\n td {\n :nth-of-type(1) {\n width: 40%;\n }\n :nth-of-type(2) {\n width: 12%;\n }\n :nth-of-type(3) {\n width: 12%;\n }\n :nth-of-type(4) {\n width: 8%;\n }\n :nth-of-type(5) {\n width: 12%;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n :nth-of-type(6) {\n width: 10%;\n }\n }\n }\n }\n\n .center {\n text-align: center;\n }\n .content {\n display: flex;\n width: 100%;\n .img-container {\n width: 5rem;\n height: 5rem;\n overflow: hidden;\n img {\n width: 100%;\n height: 100%;\n object-fit: contain;\n }\n }\n .title-container {\n display: flex;\n flex-direction: column;\n justify-content: center;\n width: calc(100% - 5rem);\n\n .dc_title_kr {\n width: 100%;\n padding: 0 0.5rem;\n\n font-weight: bold;\n font-size: 16px;\n color: ${tailwindColors.black};\n\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n .dc_title_or {\n padding: 0 0.5rem;\n\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n }\n }\n`;\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { Link } from \"react-router-dom\";\nimport { BsJournals } from \"react-icons/bs\";\n\nimport { myColors } from \"styles/colors\";\nimport Pagination from \"Components/Pagination\";\nimport CurationDataCard from \"Components/CurationDataCard\";\nimport CurationDataCard2 from \"Components/CurationDataCard2\";\nimport NoData from \"Components/NoData\";\nimport { WorkerContentHeader } from \"Components/WorkerContentHeader\";\nimport { SearchResultCount } from \"Components/SearchResultCount\";\nimport { Tab } from \"Components/Tab\";\n\nimport { CurationTable } from \"./_CurationTable\";\nimport { Search } from \"./_Search\";\nimport DataFilter from \"Components/DataFilter\";\n\nfunction CurationDataList({\n curationDataList,\n dcCount,\n listSize,\n pageNo,\n setPageNo,\n viewType,\n viewTypeHandler,\n handleRowClick,\n userInfo,\n dataFilterFetch,\n onChangeListSize,\n setSearchInput,\n onSearch,\n selectedTab,\n onClickTab,\n}) {\n const onSubmitSearch = (e) => {\n e.preventDefault();\n onSearch();\n };\n\n const onChangeSearch = (e) => {\n setSearchInput(e.target.value);\n };\n\n return (\n \n \n {/* \n \n \n \n \n \n \n */}\n \n \n\n \n \n \n \n\n \n \n onClickTab(\"전체\")}\n />\n onClickTab(\"크롤 데이터\")}\n />\n onClickTab(\"수동 데이터\")}\n />\n \n\n onChangeListSize(e)}\n >\n \n \n \n \n \n \n \n \n \n {curationDataList.length !== 0 ? (\n <>\n {viewType === \"list\" && (\n \n )}\n {viewType === \"card1\" && (\n \n {curationDataList.map((item, index) => {\n return (\n \n \n \n );\n })}\n \n )}\n {viewType === \"card2\" && (\n \n {curationDataList.map((item, index) => {\n return (\n \n \n \n );\n })}\n \n )}\n \n \n \n \n ) : (\n \n )}\n \n );\n}\n\nconst Wrap = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n min-width: 1024px;\n width: 100%;\n padding: 1.5rem 3rem;\n`;\n\nconst ViewType = styled.div`\n display: flex;\n font-size: 14px;\n input[type=\"radio\"] {\n display: none;\n &:checked + label {\n color: white;\n font-weight: bold;\n background-color: ${myColors.blue500};\n }\n }\n label {\n display: flex;\n align-items: center;\n gap: 0.2rem;\n padding: 0.25rem 1rem;\n cursor: pointer;\n }\n`;\n\nconst RowWrap = styled.div`\n display: flex;\n align-items: center;\n justify-content: ${(props) => props.justify};\n gap: ${(props) => props.gap};\n width: 100%;\n margin-top: 1rem;\n\n .list-size {\n padding: 0.5rem;\n border: solid 1px #d6d6d6;\n }\n`;\n\nconst SearchContainer = styled.div`\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n width: 100%;\n`;\n\nconst CurationCard1Wrapper = styled.div`\n width: 100%;\n display: grid;\n grid-template-columns: 1fr 1fr;\n`;\n\nconst CurationCard2Wrapper = styled.div`\n display: flex;\n flex-direction: column;\n width: 100%;\n`;\n\nconst CustomLink = styled(Link)`\n text-decoration: none;\n color: black;\n`;\n\nconst PaginationWrap = styled.div`\n margin-top: 1.5rem;\n`;\n\nexport default CurationDataList;\n","import React, { useState, useEffect } from \"react\";\nimport CurationDataList from \"./CurationDataList\";\nimport { CrawlDataListFetchApi, sessionHandler } from \"../../../Utils/api\";\nimport { useHistory } from \"react-router-dom\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { trackPromise } from \"react-promise-tracker\";\nimport { getAddressRemovedPath } from \"Utils/image\";\n\nconst TAB_VALUES = {\n 전체: null,\n \"크롤 데이터\": true,\n \"수동 데이터\": false,\n};\n\nfunction CurationDataListContainer() {\n const [curationDataList, setCurationDataList] = useState([]);\n const userInfo = useSelector((state) => state.user.user);\n const [searchObj, setSearchObj] = useState(null); // 검색 옵션\n const [searchInput, setSearchInput] = useState(\"\");\n\n /* 페이지네이션 */\n const [dcCount, setDcCount] = useState(0); // document 총 개수\n const [pageNo, setPageNo] = useState(1); // 현재 활성화 된 페이지 번호\n const [listSize, setListSize] = useState(10); // 한 페이지에 나타낼 document 개수\n\n const [selectedTab, setSelectedTab] = useState(\"전체\");\n\n const [viewType, setViewType] = useState(\"list\"); //viewType : list,card1, card2\n\n const dispatch = useDispatch();\n const statusCode = 8;\n const storedViewType = localStorage.getItem(\"curationViewType\");\n\n const viewTypeHandler = (e) => {\n setViewType(e.target.value);\n localStorage.setItem(\"curationViewType\", e.target.value);\n };\n\n const onClickTab = (tabName) => {\n if (selectedTab === tabName) return;\n\n setSelectedTab(tabName);\n setPageNo(1);\n };\n\n const onChangeListSize = (e) => {\n const newListSize = e.target.value;\n setListSize(newListSize);\n setPageNo(1);\n };\n\n const history = useHistory();\n const handleRowClick = (_id) => {\n history.push(\n `/${userInfo.permission !== 0 ? \"curation\" : \"library\"}/${_id}`\n );\n };\n\n /* 데이터 정제하기 */\n const dataCleansing = (rawData) => {\n let _curationDataList = [];\n let _rawCurationDataList = rawData.docs;\n let _dcCount = rawData.dcCount;\n\n _rawCurationDataList.forEach((item) => {\n const obj = {\n _id: item._id,\n doc_origin_title: item.doc_origin_title,\n doc_kor_title: item.doc_kor_title,\n doc_page: item.doc_page,\n doc_thumbnail: getAddressRemovedPath(item.doc_thumbnail),\n doc_country_list: item.doc_country.map((x) => x.CT_NM).join(\", \"),\n doc_publish_country_list: item.doc_publish_country\n .map((x) => x.CT_NM)\n .join(\", \"),\n doc_category_list: item.doc_category.map((x) => x.CT_NM).join(\", \"),\n doc_register_date: item.doc_register_date\n ? item.doc_register_date.substring(0, 10)\n : null,\n\n doc_content_type_list: item.doc_content_type\n .map((x) => x.CT_NM)\n .join(\", \"),\n doc_content: item.doc_content\n ? item.doc_content.replace(/(<([^>]+)>)/gi, \"\")\n : \"\", // 태그 삭제 정규표현식\n doc_url: item.doc_url,\n doc_publisher: item.doc_publisher,\n doc_publish_date: item.doc_publish_date,\n };\n _curationDataList.push(obj);\n });\n\n setDcCount(_dcCount);\n\n setCurationDataList(_curationDataList);\n };\n\n const dataFilterFetch = (searchObj) => {\n setSearchObj(searchObj);\n };\n\n /* 데이터 불러오기 */\n const dataFetch = (searchObj = null, general = false, query) => {\n trackPromise(\n CrawlDataListFetchApi(\n statusCode,\n listSize,\n pageNo,\n searchObj,\n general,\n query,\n TAB_VALUES[selectedTab]\n )\n .then((res) => {\n console.log(res.data);\n dataCleansing(res.data);\n })\n .catch((err) => {\n console.error(err);\n sessionHandler(err, dispatch).then((res) => {\n CrawlDataListFetchApi(statusCode, listSize, pageNo, searchObj).then(\n (res) => {\n dataCleansing(res.data);\n }\n );\n });\n })\n );\n };\n\n const onSearch = () => {\n setPageNo(1);\n dataFetch(null, true, searchInput);\n };\n\n useEffect(() => {\n if (storedViewType !== null) setViewType(storedViewType);\n });\n\n useEffect(() => {\n dataFetch(searchObj, searchInput ? true : false, searchInput);\n }, [pageNo, listSize, searchObj, selectedTab]);\n\n return (\n <>\n \n \n );\n}\nexport default CurationDataListContainer;\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { LoadingWrapper } from \"../../Components/LoadingWrapper\";\nimport CurationDataListContainer from \"./CurationDataList/CurationDataListContainer\";\nfunction AdminCurationDataList() {\n return (\n \n \n \n );\n}\n\nexport default AdminCurationDataList;\n","import React from \"react\";\nimport { Switch, Redirect } from \"react-router-dom\";\nimport PrivateRoute from \"routes/PrivateRoute\";\n\nimport CrawlDataDetailContainer from \"./CrawlDataDetail/CrawlDataDetailContainer\";\nimport CrawlDataScreeningContainer from \"./CrawlDataScreening/CrawlDataScreeningContainer\";\nimport CrawlDataListContainer from \"./CrawlDataList/CrawlDataListContainer\";\nimport ArchiveDataListContainer from \"./ArchiveDataList/ArchiveDataListContainer\";\nimport CurationDataDetailContainer from \"./CurationDataDetail/CurationDataDetailContainer\";\nimport AdminCurationDataList from \"./AdminCurationDataList\";\n\nfunction WorkerSection() {\n return (\n \n \n \n {/* statusCode 3번 , 5번 접근 방지*/}\n \n {/* statusCode 3번 , 5번 접근 방지*/}\n \n \n \n \n \n \n );\n}\n\nexport default WorkerSection;\n","import styled from \"styled-components\";\nimport { tailwindColors } from \"styles/colors\";\nimport { toYYMMDD_DOT } from \"Utils/time\";\n\nexport const CurationTable = ({ curationData, handleRowClick }) => {\n return (\n <>\n \n \n \n \n \n \n \n \n \n \n \n \n 제목\n 대상 국가\n 정책 분류\n 문서 분류\n 발행기관 명\n 페이지 수\n 원문 발행일\n \n \n \n {curationData.map((item, index) => {\n return (\n {\n handleRowClick(item._id);\n }}\n key={index}\n >\n \n
\n
\n \n
\n
\n
{item.doc_kor_title}
\n
{item.doc_origin_title}
\n
\n
\n \n {item.doc_country_list}\n {item.doc_category_list}\n {item.doc_content_type_list}\n {item.doc_publisher}\n\n \n {item.doc_page && `${item.doc_page}p`}\n \n \n {toYYMMDD_DOT(item.doc_publish_date)}\n \n \n );\n })}\n \n
\n \n );\n};\n\nconst CurationListTable = styled.table`\n width: 100%;\n table-layout: fixed;\n font-size: 14px;\n\n col:nth-of-type(1) {\n width: 40%;\n }\n col:nth-of-type(2) {\n width: 12%;\n }\n col:nth-of-type(3) {\n width: 12%;\n }\n col:nth-of-type(4) {\n width: 8%;\n }\n col:nth-of-type(5) {\n width: 12%;\n }\n col:nth-of-type(6) {\n width: 8%;\n }\n col:nth-of-type(7) {\n width: 10%;\n }\n\n thead {\n border-bottom: 1px solid ${tailwindColors[\"grey-400\"]};\n background-color: ${tailwindColors[\"grey-100\"]};\n font-weight: bold;\n text-align: center;\n white-space: nowrap;\n }\n\n th {\n padding: 0.5rem;\n }\n\n td {\n padding: 0.2rem;\n word-break: break-all;\n }\n\n & tbody {\n width: 100%;\n\n tr {\n width: 100%;\n height: 2.5rem;\n border-bottom: 1px solid ${tailwindColors[\"grey-400\"]};\n background-color: ${tailwindColors.white};\n cursor: pointer;\n\n :hover {\n background-color: ${tailwindColors[\"grey-100\"]};\n }\n /* :nth-of-type(2n) {\n background-color: ${tailwindColors[\"grey-50\"]};\n } */\n\n td {\n :nth-of-type(1) {\n width: 40%;\n }\n :nth-of-type(2) {\n width: 12%;\n }\n :nth-of-type(3) {\n width: 12%;\n }\n :nth-of-type(4) {\n width: 8%;\n }\n :nth-of-type(5) {\n width: 12%;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n :nth-of-type(6) {\n width: 10%;\n }\n }\n }\n }\n\n .center {\n text-align: center;\n }\n .content {\n display: flex;\n width: 100%;\n .img-container {\n width: 5rem;\n height: 5rem;\n overflow: hidden;\n img {\n width: 100%;\n height: 100%;\n object-fit: contain;\n }\n }\n .title-container {\n display: flex;\n flex-direction: column;\n justify-content: center;\n width: calc(100% - 5rem);\n\n .dc_title_kr {\n width: 100%;\n padding: 0 0.5rem;\n\n font-weight: bold;\n font-size: 16px;\n color: ${tailwindColors.black};\n\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n .dc_title_or {\n padding: 0 0.5rem;\n\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n }\n }\n\n @media ${(props) => props.theme.laptop} {\n col:nth-of-type(5) {\n width: 0;\n }\n th:nth-of-type(5) {\n overflow: hidden;\n }\n td:nth-of-type(5) {\n overflow: hidden;\n }\n }\n`;\n","import { HiSearch } from \"react-icons/hi\";\nimport styled from \"styled-components\";\nimport { myColors, tailwindColors } from \"styles/colors\";\n\nexport const CurationSearch = ({ onSubmitSearch, onChangeSearchInput }) => {\n return (\n \n {/*
검색
*/}\n \n \n \n \n \n \n \n \n \n
\n );\n};\n\nconst Wrap = styled.div`\n display: flex;\n width: 100%;\n background-color: ${tailwindColors[\"grey-100\"]};\n\n & > div:first-of-type {\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 1rem;\n background-color: ${tailwindColors[\"grey-600\"]};\n color: ${tailwindColors.white};\n font-weight: bold;\n }\n`;\n\nconst SearchForm = styled.form`\n display: flex;\n align-items: center;\n width: 100%;\n padding: 1rem;\n\n @media ${(props) => props.theme.tablet} {\n gap: 0.5rem;\n flex-wrap: wrap;\n }\n`;\n\nconst SerchInputWrap = styled.div`\n display: flex;\n align-items: center;\n max-width: 30rem;\n flex: 1;\n width: 100%;\n background-color: ${tailwindColors[\"grey-100\"]};\n\n & label {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding-left: 0.5rem;\n cursor: pointer;\n }\n\n @media ${(props) => props.theme.tablet} {\n max-width: 100%;\n\n label {\n padding-left: 0;\n }\n\n svg {\n display: none;\n }\n }\n`;\n\nconst SearchInput = styled.input`\n flex: 1;\n padding: 0.5rem 1rem;\n border: 1px solid ${tailwindColors[\"grey-400\"]};\n background-color: ${tailwindColors.white};\n`;\n\nconst ButtonContainer = styled.div`\n display: flex;\n gap: 0.5rem;\n & > button {\n width: 80px;\n height: 40px;\n padding: 0.5rem 1rem;\n border: none;\n background-color: ${myColors.blue500};\n font-size: 14px;\n color: white;\n font-weight: bold;\n white-space: nowrap;\n cursor: pointer;\n\n :nth-of-type(2) {\n background-color: ${tailwindColors[\"grey-700\"]};\n }\n }\n @media ${(props) => props.theme.tablet} {\n flex-direction: row-reverse;\n width: 100%;\n\n button:nth-of-type(1) {\n flex: 2;\n }\n button:nth-of-type(2) {\n flex: 1;\n }\n }\n`;\n","export const CATEGORY_TYPE_LIST = {\n 1: \"정책 분류\",\n 2: \"유형 분류\",\n 3: \"국가 분류\",\n 4: \"언어 분류\",\n 5: \"토픽 분류\",\n 6: \"기관 맞춤형 분류\",\n};\n","import { CATEGORY_TYPE_LIST } from \"Data/category\";\nimport styled from \"styled-components\";\nimport { myColors, tailwindColors } from \"styles/colors\";\n\nexport const CategorySelect = ({\n axisObj,\n axisMenu,\n selectedMenu,\n menuClickHandler,\n}) => {\n return (\n \n \n \n {axisObj.X && CATEGORY_TYPE_LIST[axisObj.X.type]}\n \n \n {axisMenu.X.map((category, index) => {\n return (\n {\n menuClickHandler(\"X\", category);\n }}\n >\n {category.ct_name}\n \n );\n })}\n \n \n \n \n {axisObj.Y && CATEGORY_TYPE_LIST[axisObj.Y.type]}\n \n \n {axisMenu.Y.map((category, index) => {\n return (\n {\n menuClickHandler(\"Y\", category);\n }}\n >\n {category.ct_name}\n \n );\n })}\n \n \n \n );\n};\n\nconst CategorySelectSection = styled.div`\n width: 100%;\n border: 1px solid ${tailwindColors[\"grey-200\"]};\n\n & > div:first-of-type {\n & > div:last-of-type {\n border-bottom: 1px solid ${tailwindColors[\"grey-200\"]};\n }\n }\n`;\n\nconst CategoryBar = styled.div`\n display: flex;\n align-items: center;\n width: 100%;\n height: 4rem;\n\n @media ${(props) => props.theme.tablet} {\n flex-direction: column;\n height: auto;\n }\n`;\n\nconst CategoryType = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 10rem;\n height: 100%;\n padding: 0.5rem 1rem;\n background-color: ${tailwindColors[\"grey-700\"]};\n color: ${tailwindColors.white};\n font-weight: bold;\n\n @media ${(props) => props.theme.tablet} {\n width: 100%;\n height: 3rem;\n }\n\n @media ${(props) => props.theme.mobile_l} {\n font-size: 14px;\n }\n`;\n\nconst CategoryBarItemContainer = styled.div`\n flex: 1;\n display: flex;\n align-items: center;\n padding: 0.5rem;\n height: 100%;\n overflow-x: auto;\n overflow-y: hidden;\n`;\n\nconst CategoryBarItem = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 2.5rem;\n padding: 0.5rem 2rem;\n border-radius: 1.25rem;\n background-color: ${(props) => props.selected && myColors.blue500};\n color: ${(props) => props.selected && tailwindColors.white};\n font-weight: ${(props) => props.selected && \"bold\"};\n cursor: pointer;\n\n @media ${(props) => props.theme.tablet} {\n padding: 0.5rem 1rem;\n }\n\n @media ${(props) => props.theme.mobile_l} {\n font-size: 14px;\n }\n`;\n","import styled from \"styled-components\";\nimport { tailwindColors } from \"styles/colors\";\nimport { toYYMMDD_DOT } from \"Utils/time\";\n\nexport const CurationList = ({ curations, onClickCuration }) => {\n return (\n \n {curations.map((curation) => (\n onClickCuration(curation._id)}\n key={curation._id}\n >\n \n \n \n \n

{curation.doc_kor_title}

\n

{curation.doc_origin_title}

\n
\n {curation.doc_country_list && (\n {curation.doc_country_list}\n )}\n {curation.doc_category_list && (\n {curation.doc_category_list}\n )}\n {curation.doc_content_type_list && (\n {curation.doc_content_type_list}\n )}\n\n {curation.doc_page && {`${curation.doc_page}p`}}\n
\n {\n

\n 발행기관 : \n {curation.doc_publisher}\n

\n }\n {

{toYYMMDD_DOT(curation.doc_publish_date)}

}\n
\n \n ))}\n
\n );\n};\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n width: 100%;\n\n border: 1px solid ${tailwindColors[\"grey-300\"]};\n\n & > * + * {\n border-top: 1px solid ${tailwindColors[\"grey-300\"]};\n }\n`;\n\nconst Curation = styled.div`\n display: flex;\n width: 100%;\n padding: 0.5rem;\n gap: 0.5rem;\n\n :hover {\n background-color: ${tailwindColors[\"grey-100\"]};\n cursor: pointer;\n }\n\n @media ${(props) => props.theme.mobile_l} {\n font-size: 14px;\n }\n\n @media ${(props) => props.theme.mobile_m} {\n font-size: 12px;\n }\n`;\nconst ThumbnailWrap = styled.div`\n min-width: 5rem;\n width: 100%;\n flex: 0.2;\n\n img {\n width: 100%;\n object-fit: contain;\n }\n`;\n\nconst CurationContents = styled.div`\n display: flex;\n flex-direction: column;\n flex: 1;\n & .kor_title {\n word-break: break-all;\n font-weight: bold;\n font-size: 1.2rem;\n\n @media ${(props) => props.theme.mobile_l} {\n font-size: 1rem;\n }\n\n @media ${(props) => props.theme.mobile_m} {\n font-size: 14px;\n }\n }\n & .origin_title {\n word-break: break-all;\n font-weight: bold;\n color: ${tailwindColors[\"grey-600\"]};\n }\n & > div {\n display: flex;\n flex-wrap: wrap;\n margin: 0.5rem 0;\n\n & > * {\n padding: 0 0.3rem;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n }\n & > * + * {\n ::before {\n content: \"\";\n width: 2px;\n height: 14px;\n background-color: ${tailwindColors[\"grey-600\"]};\n }\n }\n }\n\n & .publisher {\n word-break: break-all;\n margin-top: auto;\n }\n`;\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { Link } from \"react-router-dom\";\nimport { HiOutlineDocumentSearch } from \"react-icons/hi\";\n\nimport Pagination from \"Components/Pagination\";\nimport CurationDataCard from \"Components/CurationDataCard\";\nimport CurationDataCard2 from \"Components/CurationDataCard2\";\nimport NoData from \"Components/NoData\";\nimport { LoadingWrapper } from \"Components/LoadingWrapper\";\nimport { myColors } from \"styles/colors\";\n\nimport { CurationTable } from \"./_CurationTable\";\nimport { CurationSearch } from \"./_Search\";\nimport { CategorySelect } from \"../CategorySelect\";\nimport { CurationList } from \"./_CurationList\";\n\nfunction UserCurationDataList({\n curationDataList,\n dcCount,\n listSize,\n pageNo,\n setPageNo,\n viewType,\n viewTypeHandler,\n handleRowClick,\n userInfo,\n onChangeListSize,\n setSearchInput,\n onSearch,\n axisMenu,\n axisObj,\n selectedMenu,\n menuClickHandler,\n}) {\n const onSubmitSearch = (e) => {\n e.preventDefault();\n onSearch();\n };\n\n const onChangeSearch = (e) => {\n setSearchInput(e.target.value);\n };\n\n return (\n \n \n \n 검색 결과 ({dcCount}건)\n {/* \n \n \n \n \n \n \n */}\n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {curationDataList.length !== 0 ? (\n <>\n {viewType === \"list\" && (\n \n \n \n )}\n \n \n \n {viewType === \"card1\" && (\n \n {curationDataList.map((item, index) => {\n return (\n \n \n \n );\n })}\n \n )}\n {viewType === \"card2\" && (\n \n {curationDataList.map((item, index) => {\n return (\n \n \n \n );\n })}\n \n )}\n \n \n \n \n ) : (\n \n )}\n \n \n \n \n );\n}\n\nconst Wrap = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n`;\n\nconst DocumentSection = styled.div`\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n align-items: center;\n`;\n\nconst DocumentWrap = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n`;\n\nconst ResultWrap = styled.div`\n display: flex;\n align-items: center;\n width: 100%;\n padding: 1rem 0;\n font-size: 1.5rem;\n font-weight: bold;\n white-space: nowrap;\n\n & > span:nth-of-type(2) {\n color: ${myColors.red};\n }\n`;\n\nconst ViewType = styled.div`\n display: flex;\n font-size: 14px;\n margin-left: auto;\n\n input[type=\"radio\"] {\n display: none;\n &:checked + label {\n color: white;\n font-weight: bold;\n background-color: ${myColors.blue500};\n }\n }\n label {\n display: flex;\n align-items: center;\n gap: 0.2rem;\n padding: 0.25rem 1rem;\n cursor: pointer;\n }\n`;\n\nconst CagetorySelectWrap = styled.div`\n width: 100%;\n margin-bottom: 1rem;\n`;\n\nconst RowWrap = styled.div`\n display: flex;\n align-items: center;\n justify-content: ${(props) => props.justify};\n gap: ${(props) => props.gap};\n width: 100%;\n padding: 1rem 0 0.5rem;\n\n .list-size {\n padding: 0.5rem;\n border: solid 1px #d6d6d6;\n }\n`;\n\nconst CurationTableWrap = styled.div`\n @media ${(props) => props.theme.tablet} {\n display: none;\n }\n`;\nconst CurationListWrap = styled.div`\n display: none;\n width: 100%;\n @media ${(props) => props.theme.tablet} {\n display: block;\n }\n`;\n\nconst CurationCard1Wrapper = styled.div`\n width: 100%;\n display: grid;\n grid-template-columns: 1fr 1fr;\n`;\nconst CurationCard2Wrapper = styled.div`\n display: flex;\n flex-direction: column;\n width: 100%;\n`;\n\nconst CustomLink = styled(Link)`\n text-decoration: none;\n color: black;\n`;\n\nconst PaginationWrap = styled.div`\n margin-top: 1.5rem;\n`;\n\nexport default UserCurationDataList;\n","import React, { useState, useEffect } from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { trackPromise } from \"react-promise-tracker\";\n\nimport { userCustomCurationDataFetchApi, sessionHandler } from \"Utils/api\";\n\nimport CurationDataList from \"./CurationDataList\";\nimport { getAddressRemovedPath } from \"Utils/image\";\n\nfunction UserCurationDataListContainer({\n axisObj,\n axisMenu,\n selectedMenu,\n menuClickHandler,\n dataMode,\n}) {\n const [curationDataList, setCurationDataList] = useState([]);\n const userInfo = useSelector((state) => state.user.user);\n // const axisObj = useSelector((state) => state.custom.axisObj);\n const [searchObj, setSearchObj] = useState(null); // 검색 옵션\n const [searchInput, setSearchInput] = useState(\"\");\n\n /* 페이지네이션 */\n const [dcCount, setDcCount] = useState(0); // document 총 개수\n const [pageNo, setPageNo] = useState(1); // 현재 활성화 된 페이지 번호\n const [listSize, setListSize] = useState(10); // 한 페이지에 나타낼 document 개수\n\n const [viewType, setViewType] = useState(\"list\"); //viewType : list,card1, card2\n\n const dispatch = useDispatch();\n const statusCode = 8;\n const storedViewType = localStorage.getItem(\"curationViewType\");\n\n const viewTypeHandler = (e) => {\n setViewType(e.target.value);\n localStorage.setItem(\"curationViewType\", e.target.value);\n };\n\n const history = useHistory();\n const handleRowClick = (_id) => {\n history.push(\n `/${userInfo.permission !== 0 ? \"curation\" : \"library\"}/${_id}`\n );\n };\n\n const onChangeListSize = (e) => {\n setListSize(e.target.value);\n setPageNo(1);\n };\n\n /* 데이터 정제하기 */\n const dataCleansing = (rawData) => {\n let _curationDataList = [];\n let _rawCurationDataList = rawData.docs;\n let _dcCount = rawData.dcCount;\n\n _rawCurationDataList.forEach((item) => {\n const obj = {\n _id: item._id,\n doc_origin_title: item.doc_origin_title,\n doc_kor_title: item.doc_kor_title,\n doc_page: item.doc_page,\n doc_thumbnail: getAddressRemovedPath(item.doc_thumbnail),\n doc_country_list: item.doc_country.map((x) => x.CT_NM).join(\", \"),\n doc_publish_country_list: item.doc_publish_country\n .map((x) => x.CT_NM)\n .join(\", \"),\n doc_category_list: item.doc_category.map((x) => x.CT_NM).join(\", \"),\n doc_register_date: item.doc_register_date\n ? item.doc_register_date.substring(0, 10)\n : null,\n\n doc_content_type_list: item.doc_content_type\n .map((x) => x.CT_NM)\n .join(\", \"),\n doc_content: item.doc_content\n ? item.doc_content.replace(/(<([^>]+)>)/gi, \"\")\n : \"\", // 태그 삭제 정규표현식\n doc_url: item.doc_url,\n doc_publisher: item.doc_publisher,\n doc_publish_date: item.doc_publish_date,\n };\n _curationDataList.push(obj);\n });\n\n setDcCount(_dcCount);\n\n setCurationDataList(_curationDataList);\n };\n\n const dataFilterFetch = (searchObj) => {\n setSearchObj(searchObj);\n };\n\n const customDataFetch = () => {\n if (axisObj.X === null || axisObj.Y === null) return;\n console.log(\"axisObj\", axisObj);\n const axis = {\n [axisObj.X.type]: axisObj.X.code,\n [axisObj.Y.type]: axisObj.Y.code,\n };\n console.log(\"axis : \", axis);\n\n trackPromise(\n userCustomCurationDataFetchApi(axis, listSize, pageNo, searchInput)\n .then((res) => {\n dataCleansing(res.data);\n })\n .catch((err) => {\n sessionHandler(err, dispatch).then((res) => {\n userCustomCurationDataFetchApi(axis).then((res) => {\n dataCleansing(res.data);\n });\n });\n })\n );\n };\n\n const onSearch = () => {\n customDataFetch();\n };\n\n useEffect(() => {\n if (storedViewType !== null) setViewType(storedViewType);\n });\n\n useEffect(() => {\n setPageNo(1);\n }, [listSize, axisObj, searchObj]);\n\n useEffect(() => {\n if (dataMode === \"curation\") customDataFetch();\n }, [pageNo, listSize, axisObj, searchObj, dataMode]);\n\n return (\n <>\n \n \n );\n}\nexport default UserCurationDataListContainer;\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport Pagination from \"Components/Pagination\";\nimport NoData from \"Components/NoData\";\nimport { SearchResultCount } from \"Components/SearchResultCount\";\nimport { myColors, tailwindColors } from \"styles/colors\";\nimport { toYYMMDD_DOT } from \"Utils/time\";\nimport { CategorySelect } from \"../CategorySelect\";\nimport { CurationSearch as Search } from \"../CurationDataList/_Search\";\n\nfunction UserArchiveDataList({\n dcCount,\n listSize,\n pageNo,\n setPageNo,\n listSizeHandler,\n archiveData,\n curationRequest,\n axisObj,\n axisMenu,\n selectedMenu,\n menuClickHandler,\n onSearch,\n setSearchInput,\n}) {\n const onSubmitSearch = (e) => {\n e.preventDefault();\n onSearch();\n };\n\n const onChangeSearch = (e) => {\n setSearchInput(e.target.value);\n };\n\n return (\n \n \n \n \n \n \n {archiveData.length === 0 ? (\n \n ) : (\n <>\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 순번\n 대상 국가\n 키워드\n 원문 제목\n 발행기관 명\n 원문 발행일\n 페이지 수\n 큐레이션\n \n \n \n {archiveData.map((item, index) => {\n return (\n \n {listSize * (pageNo - 1) + index + 1}\n {item.doc_country_list}\n {item.doc_keywords.join(\", \")}\n \n \n {item.doc_origin_title}\n \n \n {item.doc_publisher}\n \n {toYYMMDD_DOT(item.doc_publish_date)}\n \n \n {item.doc_page && `${item.doc_page}p`}\n \n \n {item.status === 6 ? (\n {\n curationRequest(item._id);\n }}\n >\n 신청하기\n \n ) : (\n
신청완료
\n )}\n \n \n );\n })}\n \n
\n {/* tablet 이하 사이즈용 리스트 */}\n \n {archiveData.map((item, index) => (\n \n
\n

\n \n {item.doc_origin_title}\n \n

\n {item.doc_publisher && (\n

\n 발행기관 : \n {item.doc_publisher}\n

\n )}\n

\n 키워드 : \n {item.doc_keywords.join(\", \")}\n

\n

\n {item.doc_country_list && (\n \n {item.doc_country_list}\n \n )}\n {item.doc_publish_date && (\n \n {toYYMMDD_DOT(item.doc_publish_date)}\n \n )}\n {item.doc_page && (\n {`${item.doc_page}p`}\n )}\n

\n
\n
\n {item.status === 6 ? (\n {\n curationRequest(item._id);\n }}\n >\n 신청하기\n \n ) : (\n
신청완료
\n )}\n
\n
\n ))}\n
\n \n \n \n \n )}\n
\n );\n}\n\nconst Wrap = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n`;\n\nconst CagetorySelectWrap = styled.div`\n width: 100%;\n margin-bottom: 1rem;\n`;\n\nconst ActionGroup = styled.div`\n display: flex;\n width: 100%;\n margin-bottom: 0.5rem;\n & select {\n padding: 0.5rem;\n margin-left: auto;\n border: solid 1px #d6d6d6;\n }\n`;\n\nconst ArchiveDataTable = styled.table`\n width: 100%;\n table-layout: fixed;\n border-collapse: collapse;\n font-size: 14px;\n\n col {\n :nth-of-type(1) {\n width: 4.5rem;\n }\n :nth-of-type(2) {\n width: 10%;\n }\n :nth-of-type(3) {\n width: 10%;\n }\n :nth-of-type(4) {\n max-width: 40%;\n }\n :nth-of-type(5) {\n width: 15%;\n }\n :nth-of-type(6) {\n width: 6rem;\n }\n :nth-of-type(7) {\n width: 4.5rem;\n }\n :nth-of-type(8) {\n width: 6rem;\n }\n }\n\n thead {\n border-bottom: 1px solid ${tailwindColors[\"grey-400\"]};\n background-color: ${tailwindColors[\"grey-100\"]};\n font-weight: bold;\n text-align: center;\n white-space: nowrap;\n\n th {\n padding: 0.5rem;\n }\n }\n & tbody {\n width: 100%;\n\n tr {\n width: 100%;\n height: 2.5rem;\n border-bottom: 1px solid ${tailwindColors[\"grey-400\"]};\n background-color: ${tailwindColors.white};\n text-align: center;\n\n td {\n padding: 0.3rem;\n\n :first-of-type {\n }\n\n &.country-list {\n }\n &.keyword {\n div {\n display: flex;\n flex-direction: column;\n\n span {\n width: max-content;\n }\n }\n word-break: keep-all;\n }\n &.origin-title {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-align: center;\n a:hover {\n color: ${myColors.blue500};\n text-decoration: underline;\n }\n }\n &.publisher {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-align: left;\n }\n &.publish-date {\n }\n &.page {\n min-width: 4.5rem;\n }\n &.curation-request {\n & > * {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n width: max-content;\n margin: 0 auto;\n padding: 0.2rem 0.5rem;\n font-weight: bold;\n white-space: nowrap;\n }\n\n & > button {\n border: solid 1px ${tailwindColors[\"grey-400\"]};\n &:hover {\n cursor: pointer;\n background-color: ${tailwindColors[\"grey-200\"]};\n }\n }\n\n & > div {\n background-color: ${myColors.green300};\n color: ${tailwindColors.white};\n }\n }\n }\n }\n }\n\n @media ${(props) => props.theme.tablet} {\n display: none;\n }\n`;\n\nconst ArchiveDataList = styled.div`\n display: none;\n\n flex-direction: column;\n width: 100%;\n\n border: 1px solid ${tailwindColors[\"grey-300\"]};\n\n & > * + * {\n border-top: 1px solid ${tailwindColors[\"grey-300\"]};\n }\n\n @media ${(props) => props.theme.tablet} {\n display: flex;\n }\n`;\n\nconst ArchiveDataItem = styled.div`\n display: flex;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n padding: 0.5rem;\n\n //아카이브 내용\n & > div:nth-of-type(1) {\n flex: 1;\n word-break: break-all;\n font-size: 14px;\n\n .origin-title {\n font-weight: bold;\n font-size: 1rem;\n\n a:hover {\n color: ${myColors.blue500};\n text-decoration: underline;\n }\n }\n\n .keyword {\n word-break: keep-all;\n }\n\n .other-info {\n display: flex;\n flex-wrap: wrap;\n margin: 0.5rem 0;\n\n & > * {\n padding: 0 0.3rem;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n\n &:first-of-type {\n padding-left: 0;\n }\n }\n & > * + * {\n ::before {\n content: \"\";\n width: 2px;\n height: 14px;\n background-color: ${tailwindColors[\"grey-600\"]};\n }\n }\n }\n }\n\n //큐레이션 신청\n & > div:nth-of-type(2) {\n & > * {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n width: max-content;\n margin: 0 auto;\n padding: 0.5rem;\n font-weight: bold;\n white-space: nowrap;\n }\n\n & > button {\n border: solid 1px ${tailwindColors[\"grey-400\"]};\n &:hover {\n cursor: pointer;\n background-color: ${tailwindColors[\"grey-200\"]};\n }\n }\n\n & > div {\n background-color: ${myColors.green300};\n color: ${tailwindColors.white};\n }\n }\n`;\n\nconst PaginationWrap = styled.div`\n margin-top: 1.5rem;\n`;\n\nexport default UserArchiveDataList;\n","import React from \"react\";\nimport styled, { css } from \"styled-components\";\nimport UserCurationDataListContainer from \"../CurationDataList/CurationDataListContainer\";\nimport UserArchiveDataList from \"./UserArchiveDataList\";\nimport { HiOutlineArchive, HiOutlineDocumentDuplicate } from \"react-icons/hi\";\nimport { myColors, tailwindColors } from \"styles/colors\";\n\nfunction UserOnlyDataLookUpPage({\n axisMenu,\n menuClickHandler,\n axisObj,\n dataMode,\n modeSwitchHandler,\n dcCount,\n listSize,\n listSizeHandler,\n pageNo,\n setPageNo,\n archiveData,\n curationRequest,\n selectedMenu,\n onSearch,\n setSearchInput,\n}) {\n return (\n \n \n {dataMode === \"archive\" ? (\n \n ) : (\n \n )}\n \n \n {dataMode === \"archive\" ? (\n <>\n \n 큐레이션 보기\n \n ) : (\n <>\n \n 아카이브 보기\n \n )}\n \n \n );\n}\n\nconst Wrapper = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 1.5rem 3rem;\n margin: 0 auto;\n\n @media ${(props) => props.theme.laptop} {\n padding: 1.5rem 1rem;\n }\n\n @media ${(props) => props.theme.mobile_l} {\n padding: 1.5rem 0.5rem;\n }\n`;\n\nconst ModeSwitchButton = styled.button`\n display: flex;\n position: fixed;\n align-items: center;\n justify-content: center;\n min-width: 10rem;\n height: 3rem;\n border: none;\n border-radius: 3rem;\n font-size: 14px;\n background-color: #435269;\n color: white;\n border: solid 1px #d6d6d6;\n box-shadow: 0 0 0.875rem 0 rgba(33, 37, 41, 0.05);\n z-index: 999;\n right: 3.5rem;\n bottom: 0;\n margin: 2rem;\n cursor: pointer;\n transition: 0.2s;\n &:hover {\n background-color: #d8dee6;\n color: #435269;\n font-weight: bold;\n }\n & * {\n margin: 4px;\n }\n`;\n\nconst AxisTitle = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n grid-column: 1 / 2;\n grid-row: 1 / 2;\n background-color: ${myColors.blue500};\n color: #ffffff;\n\n cursor: pointer;\n\n & > div {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n\n :hover {\n background-color: rgba(255, 255, 255, 0.2);\n }\n }\n\n ${(props) =>\n props.selected &&\n css`\n & > div {\n background-color: #ffffff;\n color: ${myColors.blue500};\n font-weight: bold;\n\n :hover {\n background-color: #ffffff;\n }\n }\n `}\n`;\n\nconst AxisMenuBar = styled.div`\n ${(props) =>\n props.axis === \"X\" &&\n css`\n display: flex;\n align-items: center;\n flex-direction: row;\n grid-column: 2 / 3;\n grid-row: 1 / 2;\n background-color: ${myColors.blue500};\n color: white;\n `}\n ${(props) =>\n props.axis === \"Y\" &&\n css`\n display: flex;\n flex-direction: column;\n background-color: ${tailwindColors[\"grey-100\"]};\n grid-column: 1 / 2;\n grid-row: 2 / 3;\n `}\n`;\n\nconst XAxismenuBarItem = styled.div`\n display: flex;\n align-items: center;\n height: 100%;\n padding-left: 2rem;\n padding-right: 2rem;\n text-align: center;\n cursor: pointer;\n &:hover {\n background-color: rgba(255, 255, 255, 0.2);\n }\n ${(props) =>\n props.selected &&\n css`\n background-color: #ffffff;\n color: ${myColors.blue500};\n font-weight: bold;\n &:hover {\n background-color: #ffffff;\n }\n `};\n`;\n\nconst YAxisMenuBarItem = styled.div`\n padding: 1rem 0.5rem 1rem 0.5rem;\n text-align: center;\n cursor: pointer;\n &:hover {\n background-color: #d6d6d6;\n }\n ${(props) =>\n props.selected &&\n css`\n background-color: ${myColors.blue100};\n &:hover {\n background-color: ${myColors.blue100};\n }\n font-weight: bold;\n `};\n`;\n\nconst ContentBody = styled.div`\n display: flex;\n justify-content: center;\n width: 100%;\n`;\n\nexport default UserOnlyDataLookUpPage;\n","import React, { useState, useEffect } from \"react\";\nimport { trackPromise } from \"react-promise-tracker\";\nimport { useSelector, useDispatch } from \"react-redux\";\n\nimport { setLogout } from \"Modules/login\";\nimport { setAxis } from \"Modules/custom\";\nimport {\n curationRequestApi,\n userCustomCurationDataFetchApi,\n sessionHandler,\n} from \"Utils/api\";\nimport { getUserCustomMenuByUserId } from \"services/api/custom\";\n\nimport UserOnlyDataLookUpPage from \"./UserOnlyDataLookUpPage\";\n\nfunction UserOnlyDataLookUpPageContainer() {\n const dispatch = useDispatch();\n const userInfo = useSelector((state) => state.user.user);\n const axisObj = useSelector((state) => state.custom.axisObj);\n const [axisMenu, setAxisMenu] = useState({ X: [], Y: [] });\n const [dataMode, setDataMode] = useState(\"curation\"); // curation , archive\n const [selectedMenu, setSelectedMenu] = useState({\n X: {},\n Y: {},\n });\n const [searchInput, setSearchInput] = useState(\"\");\n\n const [selectedAll, setSelectedAll] = useState(true);\n\n const [archiveData, setArchiveData] = useState([]);\n /* 페이지네이션 */\n const [dcCount, setDcCount] = useState(0); // document 총 개수\n const [pageNo, setPageNo] = useState(1); // 현재 활성화 된 페이지 번호\n const [listSize, setListSize] = useState(10); // 한 페이지에 나타낼 document 개수\n\n const curationRequest = (id) => {\n if (confirm(\"해당 아카이브 자료의 큐레이션을 신청하시겠습니까?\")) {\n curationRequestApi(id).then((res) => {\n if (res.status === 200) {\n alert(\"성공적으로 신청되었습니다.\");\n archiveDataFetch();\n }\n });\n }\n };\n\n const menuDataFetch = (uid) => {\n console.log(\"uid\", uid);\n getUserCustomMenuByUserId(uid).then((res) => {\n const { x_axis, y_axis } = res.data;\n console.log(\"유저카테고리 : \", res.data);\n\n if (x_axis.length === 0 || y_axis.lengtth === 0) {\n alert(\"x축, y축 메뉴가 모두 설정되지 않은 사용자입니다.\");\n dispatch(setLogout(\"NORMAL_LOGOUT\"));\n } else {\n setAxisMenu({ X: x_axis, Y: y_axis });\n\n const _axisObj = {\n X: { type: x_axis[0].x_type, code: x_axis.map((v) => v.x_code) },\n Y: { type: y_axis[0].x_type, code: y_axis.map((v) => v.x_code) },\n };\n console.log(\"axisObj\", _axisObj);\n dispatch(setAxis(_axisObj));\n }\n });\n };\n\n const onClickAllMenuButton = () => {\n menuDataFetch(userInfo.id);\n setSelectedMenu({ X: axisMenu.X, Y: axisMenu.Y });\n setSelectedAll(true);\n };\n\n const archiveDataFetch = () => {\n if (axisObj.X !== null && axisObj.Y !== null) {\n const axis = {};\n axis[axisObj.X.type] = axisObj.X.code;\n axis[axisObj.Y.type] = axisObj.Y.code;\n trackPromise(\n userCustomCurationDataFetchApi(axis, listSize, pageNo, null, true)\n .then((res) => {\n dataCleansing(res.data);\n })\n .catch((err) => {\n sessionHandler(err, dispatch).then((res) => {\n userCustomCurationDataFetchApi(\n axis,\n listSize,\n pageNo,\n null,\n true,\n ).then((res) => {\n dataCleansing(res.data);\n });\n });\n }),\n );\n }\n };\n\n const modeSwitchHandler = () => {\n if (dataMode === \"curation\") {\n setDataMode(\"archive\");\n setSelectedMenu({ X: {}, Y: {} });\n setSelectedAll(true);\n } else {\n setDataMode(\"curation\");\n setSelectedMenu({ X: {}, Y: {} });\n setSelectedAll(true);\n }\n const { X, Y } = axisMenu;\n const _axisObj = {\n X: { type: X[0].x_type, code: X.map((v) => v.x_code) },\n Y: { type: Y[0].x_type, code: Y.map((v) => v.x_code) },\n };\n console.log(\"test\", _axisObj);\n dispatch(setAxis(_axisObj));\n };\n\n const dataCleansing = (rawData) => {\n let _archiveDataList = [];\n let _rawArchiveDataList = rawData.docs;\n let _dcCount = rawData.dcCount;\n _rawArchiveDataList.forEach((item) => {\n const obj = {\n _id: item._id,\n doc_origin_title: item.doc_origin_title,\n doc_page: item.doc_page,\n doc_url: item.doc_url.replace(\"%3A\", \":\"),\n doc_publish_date: item.doc_publish_date,\n status: item.status,\n doc_country_list: item.doc_country.map((x) => x.CT_NM).join(\", \"),\n doc_publisher: item.doc_publisher,\n doc_keywords: item.doc_keyowrd, // 백엔드에서 오타 수정 필요 2023.07.13 발견\n };\n _archiveDataList.push(obj);\n });\n setDcCount(_dcCount);\n setArchiveData(_archiveDataList);\n };\n\n const menuClickHandler = (axis, item) => {\n const _axisObj = { ...axisObj };\n if (selectedMenu[axis].code === item.x_code) {\n _axisObj[axis] = {\n type: item.x_type,\n code: axisMenu[axis].map((v) => v.x_code),\n };\n setSelectedMenu((prev) => ({ ...prev, [axis]: { code: null } }));\n } else {\n _axisObj[axis] = { type: item.x_type, code: [item.x_code] };\n setSelectedMenu((prev) => ({ ...prev, [axis]: { code: item.x_code } }));\n }\n console.log(selectedMenu);\n setSelectedAll(false);\n dispatch(setAxis(_axisObj));\n setPageNo(1);\n };\n const listSizeHandler = (e) => {\n setListSize(e.target.value);\n setPageNo(1);\n };\n\n const customDataFetch = () => {\n if (axisObj.X === null || axisObj.Y === null) return;\n console.log(\"axisObj\", axisObj);\n const axis = {\n [axisObj.X.type]: axisObj.X.code,\n [axisObj.Y.type]: axisObj.Y.code,\n };\n console.log(\"axis : \", axis);\n\n trackPromise(\n userCustomCurationDataFetchApi(axis, listSize, pageNo, searchInput, true)\n .then((res) => {\n dataCleansing(res.data);\n })\n .catch((err) => {\n sessionHandler(err, dispatch).then((res) => {\n userCustomCurationDataFetchApi(\n axis,\n listSize,\n pageNo,\n searchInput,\n true,\n ).then((res) => {\n dataCleansing(res.data);\n });\n });\n }),\n );\n };\n\n const onSearch = () => {\n customDataFetch();\n };\n\n useEffect(() => {\n menuDataFetch(userInfo.id);\n }, [userInfo]);\n\n useEffect(() => {\n if (dataMode === \"archive\") {\n archiveDataFetch();\n }\n }, [dataMode, pageNo, listSize, axisObj]);\n\n return (\n <>\n \n \n );\n}\nexport default UserOnlyDataLookUpPageContainer;\n","import React from \"react\";\nimport { Switch, Redirect } from \"react-router-dom\";\nimport PrivateRoute from \"routes/PrivateRoute\";\n\nimport UserOnlyDataLookUpPageContainer from \"./UserOnlyDataLookUpPage/UserOnlyDataLookUpPageContainer\";\nimport CurationDataDetailContainer from \"../Worker/CurationDataDetail/CurationDataDetailContainer\";\n\nfunction UserSection() {\n return (\n \n \n \n \n {/*사용자는 /library 경로 외 접근 금지*/}\n \n );\n}\n\nexport default UserSection;\n","import React, { useState } from \"react\";\nimport styled from \"styled-components\";\nimport { HiOutlineDocumentText } from \"react-icons/hi\";\nimport { FaCloudUploadAlt } from \"react-icons/fa\";\nimport {\n RiFileExcel2Line,\n RiDeleteBinLine,\n RiImageAddLine,\n} from \"react-icons/ri\";\nimport {\n AiOutlineFilePdf,\n AiOutlineSearch,\n AiOutlineCheckCircle,\n AiOutlineCloseCircle,\n} from \"react-icons/ai\";\nimport { WorkerContentHeader } from \"Components/WorkerContentHeader\";\nimport { BsTable } from \"react-icons/bs\";\n\nfunction ExcelDataRegister({\n readExcel,\n nextStep,\n prevStep,\n step,\n deleteExcelData,\n readPdf,\n pdfMetaData,\n deletePdf,\n readImage,\n deleteImage,\n imageMetaData,\n excelData,\n errorList,\n}) {\n const [excelFilename, setExcelFilename] = useState(null);\n const [pdfFilename, setPdfFilename] = useState(null);\n const [imageFileName, setImagefileName] = useState();\n const excelFileHandler = (e) => {\n setExcelFilename(e.target.files[0].name);\n readExcel(e);\n };\n const pdfFileHandler = (e) => {\n if (e.target.files.length === 1) {\n setPdfFilename(e.target.files[0].name);\n } else {\n setPdfFilename(\n `${e.target.files[0].name} 외 ${e.target.files.length - 1}건`\n );\n }\n\n readPdf(e);\n };\n\n const imageFileHandler = (e) => {\n if (e.target.files.length === 1) {\n setImagefileName(e.target.files[0].name);\n } else {\n setImagefileName(\n `${e.target.files[0].name} 외 ${e.target.files.length - 1}장`\n );\n }\n\n readImage(e);\n };\n\n const excelFileDelete = (e) => {\n setExcelFilename(null);\n deleteExcelData();\n };\n return (\n \n \n \n {/* <----- 엑셀 등록 단계 -----> */}\n {step === 1 && (\n \n \n
STEP 1
\n
\n \n
EXCEL
\n
파일 업로드
\n
\n
\n \n \n
\n DB 제출용 포맷\n 에 맞추어진 \n 엑셀 파일\n 을 업로드 후 다음 단계를 진행해주세요.\n
\n
\n
\n \n \n {excelFilename || \"엑셀 파일을 등록해주세요.\"}\n
\n \n
\n {errorList.length > 0 && (\n \n

잘못된 입력 목록

\n \n
셀번호
\n
내용
\n
\n {errorList.map((err, i) => (\n \n
{err.cellInfo}
\n
{err.message}
\n
\n ))}\n
\n )}\n
\n
\n )}\n {/* <----- pdf 등록 단계 -----> */}\n {step === 2 && (\n \n \n
STEP 2
\n
\n \n
PDF
\n
파일 업로드
\n
\n
\n \n \n
\n PDF파일\n 을 업로드 해주세요.\n
\n
\n
\n \n \n {pdfFilename || \"PDF 파일을 등록해주세요.\"}\n
\n {/* */}\n
\n
\n
\n )}\n {/* <----- pdf 확인 단계 -----> */}\n {step === 3 && (\n \n \n
STEP 3
\n
\n \n
PDF 및 EXCEL
\n
검토
\n
\n
\n \n
\n EXCEL 파일\n \n PDF 파일\n \n 을 대조한 결과 입니다. 파일을 검토하여 적절하지 못한 파일은\n 삭제하여주세요. PDF가 등록된 문서만 등록됩니다.\n \n
\n \n {pdfMetaData.map((file, index) => {\n return (\n \n
\n \n
\n
{file.name}
\n
{file.size}
\n
\n
\n {file.available ? (\n
\n \n
작업 가능
\n
\n ) : (\n
\n \n
EXCEL과 매치 불가
\n
\n )}\n {\n deletePdf(file.name);\n }}\n className=\"file-delete-button\"\n >\n \n \n
\n );\n })}\n
\n
\n
\n )}\n\n {/* <----- image 등록 단계 -----> */}\n {step === 4 && (\n \n \n
STEP 4
\n
\n \n
이미지
\n
파일 업로드
\n
\n
\n \n \n
\n 이미지 파일\n 을 업로드 해주세요.\n
\n
\n 등록 가능한 확장자 : [ .jpg, .jpeg, .png, .gif ]\n
\n
\n
\n \n \n {imageFileName || \"이미지 파일을 등록해주세요.\"}\n
\n {/* */}\n
\n
\n
\n )}\n {/* <----- image 확인 단계 -----> */}\n {step === 5 && (\n \n \n
STEP 5
\n
\n \n
이미지 및 EXCEL
\n
검토
\n
\n
\n \n
\n EXCEL 파일\n \n 이미지 파일\n \n 을 대조한 결과 입니다. 파일을 검토하여 적절하지 못한 파일은\n 삭제하여주세요.\n \n
\n \n {imageMetaData.map((file, index) => {\n return (\n \n
\n \n
\n
{file.name}
\n
{file.size}
\n
\n
\n {file.available ? (\n
\n \n
작업 가능
\n
\n ) : (\n
\n \n
EXCEL과 매치 불가
\n
\n )}\n {\n deleteImage(file.name);\n }}\n className=\"file-delete-button\"\n >\n \n \n
\n );\n })}\n
\n
\n
\n )}\n\n {step === 6 && (\n \n \n
STEP 6
\n
\n \n
최종
\n
검토
\n
\n
\n \n
\n \n 등록될 문서의 원재목과 한글제목만 간략히 표현됩니다.\n \n
\n \n {excelData.map((row, index) => {\n return (\n \n
\n \n
\n
{row.doc_kor_title}
\n
{row.doc_origin_title}
\n
\n
\n
\n );\n })}\n
\n
\n
\n )}\n\n \n {step !== 1 && }\n \n \n\n {/* 아래쪽 컨테이너 아직 사용안함 */}\n {/* \n \n
\n \n
데이터 등록
\n
진행 상황
\n
\n
\n \n
\n \n 등록한 PDF파일과 EXCEL파일의 데이터 등록 진행상황을 확인하세요.\n \n
\n
\n
*/}\n
\n
\n );\n}\n\nconst Wrap = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n min-width: 1024px;\n width: 100%;\n padding: 1.5rem 3rem;\n`;\n\nconst ButtonContainer = styled.div`\n width: 100%;\n display: flex;\n justify-content: center;\n margin-top: 1rem;\n button {\n background-color: grey;\n color: white;\n font-weight: bold;\n margin-left: 0.5rem;\n margin-right: 0.5rem;\n border: none;\n cursor: pointer;\n width: 10rem;\n border-radius: 4px;\n height: 2rem;\n transition: 0.2s;\n &:hover {\n background-color: #d6d6d6;\n }\n }\n`;\n\nconst FileList = styled.div`\n width: 90%;\n margin: 2rem auto;\n`;\nconst FileCard = styled.div`\n border-radius: 4px;\n box-shadow: rgb(9 30 66 / 25%) 0px 1px 1px;\n padding: 0.5rem 1rem 0.5rem 1rem;\n width: 100%;\n margin: 1rem 0 1rem 0;\n display: flex;\n justify-content: space-between;\n .file-container {\n display: flex;\n }\n .file-info {\n margin-left: 1rem;\n display: flex;\n justify-content: center;\n flex-direction: column;\n div:nth-child(2) {\n color: #363636;\n font-size: 14px;\n }\n }\n .file-availability {\n display: flex;\n align-items: center;\n div {\n margin-left: 0.5rem;\n }\n }\n .file-delete-button {\n border: none;\n width: 0;\n border-radius: 1.25rem;\n display: none;\n background-color: #d0021b;\n cursor: pointer;\n }\n &:hover {\n .file-delete-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2.5rem;\n height: 2.5rem;\n }\n .file-availability {\n display: none;\n }\n }\n`;\nconst Wrapper = styled.div`\n width: 100%;\n`;\n\nconst UploadContainer = styled.div`\n margin-top: 2rem;\n @keyframes loadEffect2 {\n 0% {\n opacity: 0;\n transform: translateX(-30px);\n }\n 50% {\n opacity: 0.5;\n transform: translateX(30px);\n }\n 100% {\n opacity: 1;\n transform: translateX(0px);\n }\n }\n animation: 0.6s ease-in-out loadEffect2;\n box-shadow: rgb(9 30 66 / 25%) 0px 1px 1px;\n`;\nconst HeaderContainer = styled.div`\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: left;\n div {\n font-size: 24px;\n }\n .bold {\n font-weight: bold;\n }\n .step {\n font-size: 18px;\n border-top-left-radius: 4px;\n display: flex;\n align-items: center;\n padding-right: 2rem;\n padding-left: 2rem;\n height: 100%;\n background-color: grey;\n /* background-color: #435269; */\n }\n .title {\n display: flex;\n margin-left: 1rem;\n div {\n margin-left: 5px;\n }\n }\n background-color: ${(props) => props.color || \"grey\"};\n color: white;\n height: 3rem;\n`;\nconst BodyContainer = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: right;\n align-items: center;\n padding: 2rem;\n min-height: 20rem;\n .explain {\n margin: 1rem 1rem 0.5rem;\n }\n .emphasis {\n font-weight: bold;\n }\n .more-explain {\n margin-bottom: 0.5rem;\n font-size: 0.8rem;\n color: #444444;\n }\n .upload {\n display: flex;\n height: 32px;\n }\n .upload-button,\n .delete-button {\n margin-left: 1rem;\n border: none;\n padding: 0 1rem 0 1rem;\n border-radius: 5px;\n background-color: grey;\n color: white;\n font-weight: bold;\n cursor: pointer;\n }\n .select-file {\n display: flex;\n align-items: center;\n border-radius: 4px;\n font-size: 14px;\n border: solid 1px #d6d6d6;\n label {\n display: flex;\n align-items: center;\n background: #eee;\n height: 100%;\n cursor: pointer;\n padding-left: 1rem;\n padding-right: 1rem;\n width: 5rem;\n justify-content: center;\n white-space: nowrap;\n }\n span {\n padding-left: 1rem;\n padding-right: 1rem;\n min-width: 15rem;\n max-width: 20rem;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n input[type=\"file\"] {\n display: none;\n }\n }\n`;\n\nconst ErrorListHeader = styled.div`\n box-sizing: border-box;\n display: flex;\n justify-content: center;\n align-items: center;\n width: 100%;\n background-color: #d0021b;\n color: #ffffff;\n font-weight: bold;\n\n & > div {\n padding: 0.5rem;\n }\n\n & > div:nth-of-type(1) {\n width: 30%;\n }\n\n & > div:nth-of-type(2) {\n width: 70%;\n }\n`;\nconst ErrorListRow = styled.div`\n box-sizing: border-box;\n\n display: flex;\n justify-content: center;\n align-items: center;\n width: 100%;\n border-bottom: 1px solid #dfdfdf;\n border-left: 1px solid #dfdfdf;\n border-right: 1px solid #dfdfdf;\n\n & > * + * {\n border-left: 1px solid #dfdfdf;\n }\n\n & > div {\n padding: 0.5rem;\n }\n\n & > div:nth-of-type(1) {\n width: 30%;\n }\n\n & > div:nth-of-type(2) {\n width: 70%;\n }\n`;\n\nconst ErrorListWrapper = styled.div`\n box-sizing: border-box;\n\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n max-width: 800px;\n width: 100%;\n margin: 0 auto;\n padding-bottom: 4rem;\n text-align: center;\n & > h3 {\n font-size: 2rem;\n font-weight: bold;\n margin-bottom: 2rem;\n }\n\n & > ${ErrorListRow}:nth-of-type(2n) {\n background-color: #fafafa;\n }\n`;\n\nexport default ExcelDataRegister;\n","import { _axios } from \"services/axiosService\";\nimport { HTTP_METHOD } from \".\";\n\nexport const uploadExcel = async (data) => {\n return _axios({\n url: \"/file/uploadExcelData\",\n method: HTTP_METHOD.POST,\n data,\n });\n};\n","import React, { useEffect, useState } from \"react\";\nimport ExcelDataRegister from \"./ExcelDataRegister\";\nimport XLSX from \"xlsx\";\nimport { uploadExcelDataApi, categoryListFetchApi } from \"../../../Utils/api\";\nimport resolve from \"resolve\";\nimport { useHistory } from \"react-router-dom\";\nimport { uploadExcel } from \"services/api/excel\";\n\nfunction ExcelDataRegisterContainer() {\n const [excelData, setExcelData] = useState([]);\n const [pdfData, setPdfData] = useState([]);\n const [pdfMetaData, setPdfMetaData] = useState([]);\n const [thumbnails, setThumbnails] = useState([]);\n const [thumbnailMetaData, setThumbnailMetaData] = useState([]);\n const [errorList, setErrorList] = useState([]);\n const [step, setStep] = useState(1);\n\n const history = useHistory();\n\n function getfileSize(x) {\n var s = [\"bytes\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\"];\n var e = Math.floor(Math.log(x) / Math.log(1024));\n return (x / Math.pow(1024, e)).toFixed(2) + \" \" + s[e];\n }\n\n const deletePdf = (name) => {\n if (confirm(\"해당 PDF파일을 목록에서 제거하시겠습니까?\")) {\n const _newPdfData = pdfData.filter((file) => file.name !== name);\n const _newPdfMetaData = pdfMetaData.filter((file) => file.name !== name);\n setPdfData(_newPdfData);\n setPdfMetaData(_newPdfMetaData);\n }\n };\n\n const readPdf = (e) => {\n const files = e.target.files;\n console.log(files);\n const _pdfData = [];\n const _pdfMetaData = [];\n for (const file of files) {\n const available = excelData.some(\n (item) => item.pdf_file_name === file.name.normalize(\"NFC\")\n );\n const _obj = {\n size: getfileSize(file.size),\n name: file.name,\n available,\n };\n _pdfData.push(file);\n _pdfMetaData.push(_obj);\n }\n\n setPdfData(_pdfData);\n setPdfMetaData(_pdfMetaData);\n };\n\n const readImage = (e) => {\n const images = e.target.files;\n const _thumbnails = [];\n const _thumbnailMetaData = [];\n for (const image of images) {\n const available = excelData.some(\n (item) => item.thumbnail_file_name === image.name.normalize(\"NFC\")\n );\n const _obj = {\n size: getfileSize(image.size),\n name: image.name,\n available,\n };\n _thumbnails.push(image);\n _thumbnailMetaData.push(_obj);\n }\n setThumbnails(_thumbnails);\n setThumbnailMetaData(_thumbnailMetaData);\n console.log(thumbnailMetaData);\n };\n\n const deleteImage = (name) => {\n if (confirm(\"해당 이미지 파일을 목록에서 제거하시겠습니까?\")) {\n const _newThumbnails = thumbnails.filter(\n (thumbnail) => thumbnail.name !== name\n );\n const _newThumbnailMetaData = thumbnailMetaData.filter(\n (thumbnailmeta) => thumbnailmeta.name !== name\n );\n setThumbnails(_newThumbnails);\n setThumbnailMetaData(_newThumbnailMetaData);\n }\n };\n\n const readExcel = (e) => {\n setErrorList([]);\n let input = e.target;\n let reader = new FileReader();\n reader.onload = function () {\n let data = reader.result;\n const firstSheet = getFirstSheet(data);\n const copySheetForCheck = { ...firstSheet };\n if (!checkCorrectFormat(copySheetForCheck)) {\n alert(\"잘못된 엑셀 양식입니다.\");\n window.location.reload();\n return;\n }\n const cells = parseHeaderAndRow(copySheetForCheck);\n const errList = checkErrorFields(cells);\n setErrorList(errList);\n const jsonData = XLSX.utils.sheet_to_json(firstSheet, {\n defval: null,\n });\n\n const _exelData = jsonData.map((item) => {\n return {\n ...item,\n is_crawled: false,\n status: 6, //아카이브\n doc_content_type: item[\"doc_content_type\"]\n ? item[\"doc_content_type\"].split(\", \")\n : null,\n doc_content_category: item[\"doc_content_category\"]\n ? item[\"doc_content_category\"].split(\", \")\n : null,\n doc_language: item[\"doc_language\"]\n ? item[\"doc_language\"].split(\", \")\n : null,\n doc_publish_country: item[\"doc_publish_country\"]\n ? item[\"doc_publish_country\"].split(\", \")\n : null,\n doc_country: item[\"doc_country\"]\n ? item[\"doc_country\"].split(\", \")\n : null,\n doc_keyowrd: item[\"doc_keyowrd\"]\n ? item[\"doc_keyowrd\"].split(\", \")\n : null,\n doc_category: item[\"doc_category\"]\n ? item[\"doc_category\"].replaceAll('\"', \"\").split(\", \") //쌍따옴표제거\n : null,\n doc_topic: item[\"doc_topic\"] ? item[\"doc_topic\"].split(\", \") : null,\n doc_custom: item[\"doc_custom\"]\n ? item[\"doc_custom\"].split(\", \")\n : null,\n };\n });\n setExcelData(_exelData);\n };\n reader.readAsBinaryString(input.files[0]);\n };\n\n const deleteExcelData = () => {\n setExcelData([]);\n setErrorList([]);\n };\n\n const regiExcel = () => {\n if (excelData.length === 0) {\n alert(\"등록할 데이터가 없습니다.\");\n } else {\n alert(\"성공적으로 엑셀 데이터가 로딩되었습니다.\");\n }\n };\n const upload = () => {\n const files = new FormData();\n pdfData.forEach((pdf) => files.append(\"pdfs\", pdf));\n thumbnails.forEach((thumbnaiil) => files.append(\"thumbnails\", thumbnaiil));\n files.append(\"meta\", JSON.stringify(excelData));\n console.log(excelData);\n uploadExcel(files)\n .then((res) => {\n console.log(res);\n alert(\"엑셀 데이터 업로드에 성공했습니다\");\n history.push(\"/curation\");\n })\n .catch((err) => {\n console.error(err);\n alert(\"엑셀 데이터 업로드에 실패했습니다\");\n window.location.reload();\n });\n // uploadExcelDataApi(files)\n // .then((res) => {\n // console.log(res);\n // history.push(\"/curation\");\n // })\n // .catch((err) => {\n // console.error(err);\n // alert(\"엑셀 데이터 업로드에 실패했습니다\");\n // window.location.reload();\n // });\n };\n const toNextStep = {\n 1: () => {\n if (errorList.length > 0) {\n alert(\"잘못된 셀을 수정 후 다시 업로드 해주세요\");\n } else if (excelData.length === 0) {\n alert(\"엑셀 데이터를 등록해주세요\");\n } else {\n setStep((prev) => prev + 1);\n }\n },\n 2: () => {\n if (pdfData.length === 0) {\n setStep((prev) => prev + 2);\n } else {\n setStep((prev) => prev + 1);\n }\n },\n 3: () => {\n if (pdfMetaData.some((data) => !data.available)) {\n alert(\"등록 불가능한 파일을 제거해주세요\");\n } else {\n setStep((prev) => prev + 1);\n }\n },\n 4: () => {\n if (thumbnails.length === 0) {\n setStep((prev) => prev + 2);\n } else {\n setStep((prev) => prev + 1);\n }\n },\n 5: () => {\n if (thumbnailMetaData.some((data) => !data.available)) {\n alert(\"등록 불가능한 파일을 제거해주세요\");\n } else {\n setStep((prev) => prev + 1);\n }\n },\n 6: () => {\n upload();\n },\n };\n\n const nextStep = () => {\n toNextStep[step]();\n };\n\n const prevStep = () => {\n if (step === 1) {\n return;\n }\n if (\n (step === 4 && pdfData.length === 0) ||\n (step === 6 && thumbnails.length === 0)\n ) {\n setStep((prev) => prev - 2);\n } else setStep((prev) => prev - 1);\n };\n\n const findCategoryCode = async (카테고리타입, 분류리스트) => {\n let 대분류UpperCode = 0;\n let 중분류UpperCode = 0;\n let 소분류Code = 0;\n if (!분류리스트[0]) {\n // 대분류값을 엑셀에 입력하지 않음\n console.log(\"대분류 입력 값이 없습니다\");\n return null;\n } else {\n // 대분류 값을 엑셀에 입력 하였음\n let 대분류 = await categoryListFetchApi(카테고리타입, 2);\n let 대분류검색결과 = 대분류.data.find((item) => {\n return item.CT_NM === 분류리스트[0];\n });\n // console.log(대분류검색결과)\n if (대분류검색결과) {\n // 검색 결과 대분류가 존재 한다면?\n 대분류UpperCode = 대분류검색결과.CODE;\n //console.log(대분류UpperCode);\n\n if (!분류리스트[1]) {\n // 중분류 값을 엑셀에 입력하지 않음\n console.log(\"중분류 입력 값이 없습니다\");\n return 대분류UpperCode;\n } else {\n let 중분류 = await categoryListFetchApi(\n 카테고리타입,\n 4,\n 대분류UpperCode\n );\n let 중분류검색결과 = 중분류.data.find((item) => {\n return item.CT_NM === 분류리스트[1];\n });\n //console.log(중분류검색결과)\n if (중분류검색결과) {\n // 검색 결과 대분류가 존재 한다면?\n 중분류UpperCode = 중분류검색결과.CODE;\n //console.log(중분류UpperCode);\n\n if (!분류리스트[2]) {\n console.log(\"소분류 입력 값이 없습니다\");\n return 중분류UpperCode;\n } else {\n let 소분류 = await categoryListFetchApi(\n 카테고리타입,\n 6,\n 중분류UpperCode\n );\n let 소분류검색결과 = 소분류.data.find((item) => {\n return item.CT_NM === 분류리스트[2];\n });\n if (소분류검색결과) {\n 소분류Code = 소분류검색결과.CODE;\n //console.log(소분류Code);\n return 소분류Code;\n } else {\n console.log(\"등록되지 않은 소분류 입니다.\");\n return 중분류UpperCode;\n }\n }\n } else {\n console.log(\"등록되지 않은 중분류 입니다.\");\n return 대분류UpperCode;\n }\n }\n } else {\n // 등록되지 않은 대분류 라면\n console.log(\"등록되지 않은 대분류 입니다\");\n resolve(null);\n }\n }\n };\n\n useEffect(() => {\n const str = \"기획재정-경제일반-그결과는/국정일반-없는중분류/외교안보\";\n const arr1 = str.split(\"/\");\n }, []);\n return (\n <>\n \n \n );\n}\nexport default ExcelDataRegisterContainer;\n\n// SheetJS 라이브러리용\nconst CELL_OBJECT_TYPE = {\n n: \"number\",\n s: \"string\",\n b: \"boolean\",\n d: \"date\",\n};\n\nconst DATA_TYPE = {\n NUMBER: \"number\",\n STRING: \"string\",\n DATE: \"date\",\n BOOLEAN: \"boolean\",\n};\n\nconst EXCEL_SCHEMA = {\n // pdf 있으면 필요함\n dc_domain: {\n isRequired: false,\n type: DATA_TYPE.STRING,\n },\n doc_biblio: {\n isRequired: false,\n type: DATA_TYPE.STRING,\n },\n doc_bundle_title: {\n isRequired: false,\n type: DATA_TYPE.STRING,\n },\n doc_bundle_url: {\n isRequired: false,\n type: DATA_TYPE.STRING,\n },\n doc_category: {\n // 카테고리 받아와야함\n isRequired: false,\n type: DATA_TYPE.STRING,\n },\n doc_collect_date: {\n isRequired: false,\n type: DATA_TYPE.DATE,\n },\n doc_content: {\n isRequired: false,\n type: DATA_TYPE.STRING,\n },\n doc_content_category: {\n // 카테고리 받아와야함\n isRequired: false,\n type: DATA_TYPE.STRING,\n },\n doc_content_type: {\n // 카테고리 받아오기\n isRequired: false,\n type: DATA_TYPE.STRING,\n },\n doc_country: {\n // 국가 받아오기\n isRequired: false,\n type: DATA_TYPE.STRING,\n },\n doc_custom: {\n isRequired: false,\n type: DATA_TYPE.STRING,\n },\n doc_language: {\n isRequired: false,\n type: DATA_TYPE.STRING,\n },\n doc_keyword: {\n isRequired: false,\n type: DATA_TYPE.STRING,\n },\n doc_kor_summary: {\n isRequired: false,\n type: DATA_TYPE.STRING,\n },\n doc_kor_title: {\n isRequired: false,\n type: DATA_TYPE.STRING,\n },\n doc_memo: {\n isRequired: false,\n type: DATA_TYPE.STRING,\n },\n doc_modify_date: {\n isRequired: false,\n type: DATA_TYPE.DATE,\n },\n doc_origin_title: {\n isRequired: false,\n type: DATA_TYPE.STRING,\n },\n doc_original_summary: {\n isRequired: false,\n type: DATA_TYPE.STRING,\n },\n //pdf 있으면 필요함\n doc_page: {\n isRequired: false,\n type: DATA_TYPE.NUMBER,\n },\n doc_poject: {\n isRequired: false,\n type: DATA_TYPE.STRING,\n },\n doc_publish_country: {\n // 받아오기\n isRequired: false,\n type: DATA_TYPE.STRING,\n },\n doc_publish_date: {\n isRequired: false,\n type: DATA_TYPE.DATE,\n },\n doc_publisher: {\n isRequired: false,\n type: DATA_TYPE.STRING,\n },\n doc_publishing: {\n isRequired: false,\n type: DATA_TYPE.STRING,\n },\n doc_recomment: {\n isRequired: false,\n type: DATA_TYPE.STRING,\n },\n doc_register_date: {\n isRequired: false,\n type: DATA_TYPE.DATE,\n },\n doc_relate_title: {\n isRequired: false,\n type: DATA_TYPE.STRING,\n },\n doc_relate_url: {\n isRequired: false,\n type: DATA_TYPE.STRING,\n },\n\n doc_topic: {\n // 받아오기\n isRequired: false,\n type: DATA_TYPE.STRING,\n },\n doc_url: {\n isRequired: false,\n type: DATA_TYPE.STRING,\n },\n doc_url_intro: {\n isRequired: false,\n type: DATA_TYPE.STRING,\n },\n doc_write_date: {\n isRequired: false,\n type: DATA_TYPE.DATE,\n },\n\n pdf_file_name: {\n isRequired: false,\n type: DATA_TYPE.STRING,\n validate: (v) => {\n const result = {};\n result.isValid = v.split(\".\").pop() === \"pdf\";\n if (!result.isValid)\n result.message = \"확장자까지 올바르게 입력되어야합니다.\";\n return result;\n },\n },\n\n thumbnail_file_name: {\n isRequired: false,\n type: DATA_TYPE.STRING,\n validate: (fileName) => {\n const result = {};\n result.isValid = [\"jpeg,\", \"jpg\", \"gif\", \"png\"].some(\n (v) => v === fileName.split(\".\").pop()\n );\n if (!result.isValid)\n result.message = \"확장자까지 올바르게 입력되어야합니다.\";\n return result;\n },\n },\n\n /// 사용자 입력 필요없는 필드\n // doc_file: {\n // isRequired: false,\n // type: DATA_TYPE.STRING,\n // },\n // doc_hit: {\n // isRequired: false,\n // type: DATA_TYPE.NUMBER,\n // },\n // doc_host: {\n // isRequired: false,\n // type: DATA_TYPE.STRING,\n // },\n // status: {\n // isRequired: false,\n // type: DATA_TYPE.NUMBER,\n // },\n // item_id: {\n // isRequired: false,\n // type: DATA_TYPE.NUMBER,\n // },\n // is_crawled: {\n // isRequired: false,\n // type: DATA_TYPE.BOOLEAN,\n // },\n // doc_thumbnail: {\n // isRequired: false,\n // type: DATA_TYPE.STRING,\n // },\n};\n\n/**\n *\n * @param {XLSX.WorkSheet} sheet\n */\nconst removeUnusedFiled = (sheet) => {\n delete sheet[\"!margins\"];\n delete sheet[\"!ref\"];\n};\n\n/**\n *\n * @param {string | ArrayBuffer | null} data\n * FileReader로 읽은 result\n */\nconst getFirstSheet = (data) => {\n const excelFile = XLSX.read(data, {\n type: \"binary\",\n cellDates: true,\n });\n const sheetName = excelFile.SheetNames[0];\n const firstSheet = excelFile.Sheets[sheetName];\n return firstSheet;\n};\n\n/**\n *\n * @param {XLSX.WorkSheet} sheet\n */\nconst parseHeaderAndRow = (sheet) => {\n removeUnusedFiled(sheet);\n const cells = { headers: {}, rows: {} };\n const columnRegex = /[^A-Z]/g;\n const rowRegex = /[^0-9]/g;\n for (let cellName in sheet) {\n const column = cellName.replace(columnRegex, \"\");\n const row = parseInt(cellName.replace(rowRegex, \"\"));\n\n if (row === 1) {\n const headerName = sheet[cellName].v;\n cells.headers[column] = {\n value: headerName,\n type: EXCEL_SCHEMA[headerName].type,\n isRequired: EXCEL_SCHEMA[headerName].isRequired,\n };\n } else {\n if (!cells.rows.hasOwnProperty(row)) cells.rows[row] = [];\n cells.rows[row].push({\n column,\n row,\n value: sheet[cellName].v,\n type: CELL_OBJECT_TYPE[sheet[cellName].t],\n });\n }\n }\n return cells;\n};\n\n/**\n *\n * @param {XLSX.WorkSheet} sheet\n */\nconst checkCorrectFormat = (sheet) => {\n const rowRegex = /[^0-9]/g;\n const headerCellNames = Object.keys(sheet)\n .filter((cellName) => cellName.replace(rowRegex, \"\") === \"1\")\n .map((cellName) => sheet[cellName].v)\n .sort();\n\n const schemaNames = Object.keys(EXCEL_SCHEMA).sort();\n if (\n headerCellNames.length !== schemaNames.length ||\n headerCellNames.some((v, i) => v !== schemaNames[i])\n ) {\n return false;\n }\n return true;\n};\n\n/**\n *\n * @param {{headers: {}, rows: {}} data\n *\n */\nconst checkErrorFields = (data) => {\n const errorList = [];\n const requiredFieldNames = Object.keys(EXCEL_SCHEMA).filter(\n (key) => EXCEL_SCHEMA[key].isRequired\n );\n\n Object.values(data.rows).forEach((row) => {\n //필수 필드가 채워졌는지 확인\n requiredFieldNames.forEach((fieldName) => {\n if (\n !Object.values(row)\n .map((field) => data.headers[field.column].value)\n .includes(fieldName)\n ) {\n const columnName = Object.keys(data.headers).find(\n (key) => data.headers[key].value === fieldName\n );\n const rowNumber = row[0].row;\n errorList.push({\n cellInfo: `${columnName} - ${rowNumber}`,\n message: `${fieldName}은 필수 필드입니다.`,\n });\n }\n });\n\n //입력된 필드의 타입이 맞는지 확인\n Object.values(row).forEach((field) => {\n if (data.headers[field.column].type !== field.type)\n errorList.push({\n cellInfo: `${field.column} - ${field.row}`,\n message: `${data.headers[field.column].type} 타입으로 입력해주세요`,\n });\n });\n\n //validate 로직이 있는 필드 체크\n Object.values(row).forEach((field) => {\n if (\n EXCEL_SCHEMA[data.headers[field.column].value].hasOwnProperty(\n \"validate\"\n )\n ) {\n const { isValid, message } = EXCEL_SCHEMA[\n data.headers[field.column].value\n ].validate(field.value);\n if (!isValid) {\n errorList.push({\n cellInfo: `${field.column} - ${field.row}`,\n message,\n });\n }\n }\n });\n });\n\n return errorList;\n};\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport {\n AiOutlineUserDelete,\n AiOutlineUserAdd,\n AiOutlineStop,\n AiOutlineStepForward,\n} from \"react-icons/ai\";\nimport { RiUserSettingsLine } from \"react-icons/ri\";\nimport { BsPersonLinesFill } from \"react-icons/bs\";\n\nimport { WorkerContentHeader } from \"Components/WorkerContentHeader\";\nimport { toYYYYMMDD_DOT } from \"Utils/time\";\nimport { myColors, tailwindColors } from \"styles/colors\";\n\nfunction UserManagement({\n userData,\n openUserModifyModal,\n deleteUser,\n restrictUser,\n openUserAddModal,\n PERMISSON_DATA,\n}) {\n return (\n \n \n \n {\n openUserAddModal();\n }}\n >\n \n

사용자 추가

\n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n 사용자 ID\n 사용자 이름\n 이메일\n 연락처\n 소속\n 직책\n 계정 생성일\n 사용자 권한\n 관리\n \n \n \n {userData.map((user, index) => {\n return (\n \n {user.userID}\n {user.Name}\n {user.Email}\n {user.Tel}\n {user.Company}\n {user.Position}\n {toYYYYMMDD_DOT(user.CreateAt)}\n {PERMISSON_DATA[user.Category]}\n \n \n {\n openUserModifyModal(user);\n }}\n >\n \n

수정

\n \n {\n deleteUser(user.id);\n }}\n >\n \n

삭제

\n \n {user.stat ? (\n <>\n {\n restrictUser(user.id, false);\n }}\n >\n \n

재개

\n \n \n ) : (\n <>\n {\n restrictUser(user.id, true);\n }}\n >\n \n

중지

\n \n \n )}\n
\n \n \n );\n })}\n \n
\n
\n
\n );\n}\n\nconst Wrap = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n min-width: 1280px;\n width: 100%;\n padding: 1.5rem 3rem;\n`;\n\nconst AddUserWrap = styled.div`\n display: flex;\n width: 100%;\n padding: 2rem 0 0.5rem;\n\n & button {\n padding: 0.5rem 1rem;\n margin: 0;\n background-color: ${myColors.blue500};\n border-radius: 0;\n p {\n font-size: 1rem;\n }\n }\n`;\n\nconst ButtonWrapper = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: center;\n`;\n\nconst Button = styled.button`\n margin: 0.5rem;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 0.3rem 1rem 0.3rem 1rem;\n border-radius: 5px;\n border: none;\n background-color: ${(props) => props.color || \"grey\"};\n cursor: pointer;\n min-width: 5rem;\n p {\n margin-left: 0.5rem;\n font-size: 12px;\n font-weight: bold;\n color: white;\n }\n\n &.btn-edit {\n background-color: ${myColors.blue500};\n }\n &.btn-delete {\n background-color: ${myColors.red};\n }\n &.btn-stop {\n }\n &.btn-start {\n background-color: ${myColors.green300};\n }\n`;\nconst TableWrapper = styled.div`\n width: 100%;\n max-height: 65rem;\n overflow: auto;\n box-shadow: rgb(9 30 66 / 25%) 0px 1px 1px;\n`;\nconst CustomTable = styled.table`\n width: 100%;\n text-align: center;\n border-collapse: collapse;\n thead {\n position: sticky;\n top: 0px;\n border-bottom: solid 1px ${tailwindColors[\"grey-400\"]};\n background-color: ${tailwindColors[\"grey-100\"]};\n color: ${tailwindColors.black};\n font-weight: bold;\n }\n tr {\n height: 2.5rem;\n }\n tr:nth-child(2n) {\n background-color: ${tailwindColors[\"grey-100\"]};\n }\n input[type=\"checkbox\"] {\n width: 20px; /*Desired width*/\n height: 20px; /*Desired height*/\n }\n`;\n\nexport default UserManagement;\n","import React, { useState, useEffect } from \"react\";\nimport { useDispatch } from \"react-redux\";\nimport {\n FetchUsersApi,\n deleteUserByIdApi,\n sessionHandler,\n restrictUserApi,\n} from \"../../../Utils/api\";\nimport UserManagement from \"./UserManagement\";\nimport { setModal, setModalData } from \"../../../Modules/modal\";\nimport { trackPromise } from \"react-promise-tracker\";\nimport { LoadingWrapper } from \"../../../Components/LoadingWrapper\";\n\nfunction UserManagementContainer() {\n const [userData, setUserData] = useState([]);\n const dispatch = useDispatch();\n\n const PERMISSON_DATA = {\n 0: \"사용자\",\n 1: \"스크리닝 작업자\",\n 2: \"정제 작업자\",\n 3: \"등록 작업자\",\n 4: \"큐레이션 작업자\",\n 9: \"관리자\",\n };\n\n const openUserModifyModal = (user) => {\n dispatch(setModal(\"UserInfoModal\"));\n dispatch(setModalData({ user, type: false }, \"modal_user\"));\n };\n const openUserAddModal = () => {\n dispatch(setModal(\"UserInfoModal\"));\n dispatch(setModalData({ user: [], type: true }, \"modal_user\"));\n };\n\n const getUserList = () => {\n trackPromise(\n FetchUsersApi()\n .then((res) => {\n setUserData(res.data);\n })\n .catch((err) => {\n sessionHandler(err, dispatch).then((res) => {\n FetchUsersApi().then((res) => {\n setUserData(res.data);\n });\n });\n })\n );\n };\n const deleteUser = (id) => {\n if (confirm(\"삭제하시겠습니까?\")) {\n deleteUserByIdApi(id)\n .then((res) => {\n alert(\"성공적으로 삭제되었습니다\");\n })\n .catch((err) => {\n if (err.response.status === 400) {\n alert(\"유저 정보 변경 중 오류발생\");\n }\n });\n window.location.reload(); //\n }\n };\n const restrictUser = (id, restrict) => {\n restrictUserApi(id, restrict)\n .then(() => {\n alert(\"성공적으로 수행되었습니다\");\n })\n .catch((err) => {\n if (err.response.status === 400) {\n alert(\"유저 정보 변경 중 오류발생\");\n }\n });\n window.location.reload();\n };\n\n useEffect(() => {\n getUserList();\n }, []);\n\n return (\n \n \n \n );\n}\n\nexport default UserManagementContainer;\n","import React from \"react\";\nimport styled from \"styled-components\";\nfunction TitleCard({ children, title, subtitle }) {\n return (\n \n
\n
{title}
\n
{subtitle}
\n
\n
{children}
\n
\n );\n}\n\nconst CardWrapper = styled.div`\n border-radius: 4px;\n box-shadow: 0 0 0.875rem 0 rgba(33, 37, 41, 0.05);\n background-color: white;\n .title {\n border-bottom: 1px solid #e6e9ed;\n padding: 1rem;\n }\n .title-main {\n font-size: 18px;\n color: rgb(59, 59, 59);\n padding-bottom: 0.25rem;\n }\n .title-sub {\n font-size: 12px;\n color: #939ba2;\n }\n .content {\n height: 100%;\n padding: 1rem;\n }\n`;\nexport default TitleCard;\n","import React from \"react\";\nimport styled from \"styled-components\";\n\nfunction DocumentStatCard({ countryDocumentData }) {\n return (\n \n
\n {countryDocumentData === null ? (\n
국가를 지도에서 선택해주세요!
\n ) : (\n <>\n
{countryDocumentData.country}
\n
의 문서 현황입니다.
\n \n )}\n
\n {countryDocumentData === null ? (\n
표시할 값이 없습니다.
\n ) : (\n
\n
\n
수집 문서 수
\n
{countryDocumentData.data.collect}
\n
\n
\n
스크리닝 완료 (정제) 문서 수
\n
\n {countryDocumentData.data.screening}\n
\n
\n
\n
정제 완료 (등록) 문서 수
\n
{countryDocumentData.data.refine}
\n
\n
\n
등록 완료 (아카이브) 문서 수
\n
\n {countryDocumentData.data.register}\n
\n
\n
\n
큐레이션 완료 (큐레이션) 문서 수
\n
\n {countryDocumentData.data.curation}\n
\n
\n
\n )}\n
\n );\n}\n\nconst CardWrapper = styled.div`\n border-radius: 4px;\n box-shadow: 0 0 0.875rem 0 rgba(33, 37, 41, 0.05);\n background-color: white;\n color: rgb(59, 59, 59);\n .title {\n border-bottom: 1px solid #e6e9ed;\n padding: 1rem;\n }\n .title-main {\n font-size: 18px;\n padding-bottom: 0.25rem;\n }\n .title-sub {\n font-size: 12px;\n color: #939ba2;\n }\n .stat {\n margin-bottom: 1rem;\n display: flex;\n align-items: center;\n justify-content: space-between;\n .stat-title {\n font-size: 14px;\n }\n .stat-count {\n font-size: 20px;\n font-weight: bold;\n color: #435269;\n }\n }\n .stat-list {\n padding: 1rem;\n min-height: 10rem;\n }\n`;\nexport default DocumentStatCard;\n","import React, { useState,useEffect } from \"react\";\nimport styled from \"styled-components\";\nimport { FetchUsersApi } from \"../../Utils/api\";\n\nfunction UserSelectCard({ currentUserIdHandler,setCurrentUserId}) {\n const [userList, setUserList] = useState([]); // 유저 목록\n const getUserList = () => {\n FetchUsersApi().then((res) => {\n setUserList(\n res.data.filter((user) => {\n return user.Category !== \"0\";\n })\n );\n });\n };\n useEffect(() => {\n getUserList();\n }, []);\n useEffect(() => {\n if (userList.length !== 0) {\n setCurrentUserId(userList[0].id); // 첫번째 사용자를 초기 사용자로 세팅.\n }\n }, [userList]);\n\n return (\n \n
\n \n
의 작업 통계 입니다.
\n
\n
\n );\n}\n\nconst CardWrapper = styled.div`\n margin: 1rem 0.5rem 1rem 0.5rem;\n border-radius: 4px;\n box-shadow: 0 0 0.875rem 0 rgba(33, 37, 41, 0.05);\n background-color: white;\n color: rgb(59, 59, 59);\n display: flex;\n padding: 1rem;\n .title {\n display: flex;\n align-items: center;\n }\n .user-select {\n font-size: 18px;\n color: rgb(59, 59, 59);\n margin-right: 0.5rem;\n border: none;\n &:focus {\n outline: none;\n }\n & option {\n font-size: 12px;\n }\n }\n .sub {\n font-size: 14px;\n color: #939ba2;\n }\n .content {\n height: 100%;\n }\n ul {\n display: flex;\n margin: 0;\n padding: 0;\n }\n`;\n\nexport default UserSelectCard;\n","import React from \"react\";\nimport styled from \"styled-components\";\nfunction WorkStatCard({ workAllLogData, workAllStatus, workAllStatusHandler }) {\n return (\n \n
\n
작업량 통계
\n
\n 각 단계를 클릭하면 원형 그래프를 확인할 수 있습니다.\n
\n {/*
\n \n \n \n \n
*/}\n
\n
\n {\n workAllStatusHandler(-1);\n }}\n >\n
수집
\n
{workAllLogData.collect}
\n \n {\n workAllStatusHandler(0);\n }}\n >\n
스크리닝
\n
{workAllLogData.screening}
\n \n {\n workAllStatusHandler(2);\n }}\n >\n
정제
\n
{workAllLogData.register}
\n \n {\n workAllStatusHandler(4);\n }}\n >\n
등록(아카이브)
\n
{workAllLogData.archive}
\n \n {\n workAllStatusHandler(6);\n }}\n >\n
큐레이션
\n
{workAllLogData.curation}
\n \n
\n
\n );\n}\nconst CardWrapper = styled.div`\n border-radius: 4px;\n box-shadow: 0 0 0.875rem 0 rgba(33, 37, 41, 0.05);\n background-color: white;\n .title {\n border-bottom: 1px solid #e6e9ed;\n padding: 1rem;\n }\n .title-main {\n font-size: 18px;\n color: rgb(59, 59, 59);\n padding-bottom: 0.25rem;\n }\n .title-sub {\n font-size: 12px;\n color: #939ba2;\n }\n .toggle-button {\n display: inline-block;\n padding: 8px;\n background-color: #eee;\n font-size: 12px;\n border-radius: 0.5rem;\n\n label {\n padding: 0.25rem 0.5rem 0.25rem 0.5rem;\n cursor: pointer;\n }\n input[type=\"radio\"] {\n display: none;\n }\n input[type=\"radio\"]:checked + label {\n transition: ease-in-out 0.2s;\n background-color: rgba(0, 0, 0, 0.5);\n box-shadow: 0 0 0.875rem 0 rgba(33, 37, 41, 0.05);\n color: white;\n border-radius: 0.5rem;\n }\n }\n .content {\n height: 100%;\n display: flex;\n justify-content: center;\n\n & > * + * {\n border-left: solid 1px #eee;\n }\n }\n`;\nconst StatContainer = styled.div`\n flex-grow: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n\n width: 8rem;\n margin: 0.5rem;\n padding: 1rem;\n cursor: pointer;\n\n .stat-name {\n color: rgb(59, 59, 59);\n font-size: 14px;\n font-weight: bold;\n }\n .stat-count {\n font-size: 20px;\n font-weight: bold;\n color: #435269;\n }\n`;\nexport default WorkStatCard;\n","import React from \"react\";\nimport styled from \"styled-components\";\n\nfunction ChartCard({ children }) {\n return (\n \n
\n
세계 문서 비율
\n
공정별 세계 비율 입니다.
\n
\n
{children}
\n
\n );\n}\n\nconst CardWrapper = styled.div`\n border-radius: 4px;\n box-shadow: 0 0 0.875rem 0 rgba(33, 37, 41, 0.05);\n background-color: white;\n color: rgb(59, 59, 59);\n .title {\n border-bottom: 1px solid #e6e9ed;\n padding: 1rem;\n }\n .title-main {\n font-size: 18px;\n padding-bottom: 0.25rem;\n }\n .title-sub {\n font-size: 12px;\n color: #939ba2;\n }\n .chart {\n height: 20rem;\n }\n`;\nexport default ChartCard;\n","import React from \"react\";\nimport styled, { css } from \"styled-components\";\n\nfunction ProcessMenu({process,processHandler}) {\n \n const _processHandler = (value) => {\n processHandler(value);\n };\n return (\n \n
\n
단계 선택
\n
통계를 확인할 단계를 선택하세요.
\n
\n
    \n\n {\n _processHandler(1);\n }}\n active={process === 1}\n >\n 스크리닝\n \n {\n _processHandler(2);\n }}\n active={process === 2}\n >\n 정제\n \n {\n _processHandler(4);\n }}\n active={process === 4}\n >\n 등록(아카이브)\n \n {\n _processHandler(6);\n }}\n active={process === 6}\n >\n 큐레이션\n \n
\n
\n );\n}\nconst CardWrapper = styled.div`\n margin: 1rem 0.5rem 0 0.5rem;\n border-radius: 4px;\n box-shadow: 0 0 0.875rem 0 rgba(33, 37, 41, 0.05);\n background-color: white;\n .title {\n border-bottom: 1px solid #e6e9ed;\n padding: 1rem;\n }\n .title-main {\n font-size: 18px;\n color: rgb(59, 59, 59);\n padding-bottom: 0.25rem;\n }\n .title-sub {\n font-size: 12px;\n color: #939ba2;\n }\n ul {\n display: flex;\n margin: 0;\n padding: 0;\n }\n`;\nconst MenuItem = styled.li`\n height: 100%;\n text-align: center;\n min-width: 150px;\n list-style-type: none;\n padding: 1rem 1.5rem 1rem 1.5rem;\n cursor: pointer;\n &:hover {\n background-color: #435269;\n color: white;\n font-weight: bold;\n }\n ${(props) =>\n props.active &&\n css`\n background-color: ${(props) => (props.active ? \"#435269\" : \"white\")};\n color: white;\n font-weight: bold;\n `};\n`;\n\nexport default ProcessMenu;\n","import React, { useState,useEffect } from \"react\";\nimport styled from \"styled-components\";\n\nfunction DateRange({setDateGte}) {\n /* \n all : 전체 범위\n past_week : 최근 1주\n past_month : 최근 1달\n past_3_month : 최근 3달\n past_6_month : 최근 6달\n past_year : 최근 1년\n past_3_year : 최근 3년\n custom_range : 직접 설정\n */\n const [dateRange, setDateRange] = useState(\"past_3_month\");\n\n const dateRangeHandler = (e) => {\n setDateRange(e.target.value);\n };\n useEffect(()=>{\n const _dateGte = new Date(); // 오늘 날짜\n if(dateRange === \"all\"){\n _dateGte.setFullYear(_dateGte.getFullYear() - 30); // 30년 전\n }\n if(dateRange === \"past_week\"){\n _dateGte.setDate(_dateGte.getDate() - 7); // 7일. 1주일 전\n }\n else if(dateRange === \"past_month\"){\n _dateGte.setMonth(_dateGte.getMonth() - 1); // 1달 전\n }\n else if(dateRange === \"past_3_month\"){\n _dateGte.setMonth(_dateGte.getMonth() - 3); // 3달 전\n }\n else if(dateRange === \"past_6_month\"){\n _dateGte.setMonth(_dateGte.getMonth() - 6); // 6달 전\n }\n else if(dateRange === \"past_year\"){\n _dateGte.setFullYear(_dateGte.getFullYear() - 1); // 1년 전\n }\n else if(dateRange === \"past_3_year\"){\n _dateGte.setFullYear(_dateGte.getFullYear() - 3); // 3년 전\n }\n setDateGte(_dateGte.toISOString().substring(0,10));\n },[dateRange])\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n}\n\nconst DateRangeContainer = styled.div`\n display: inline-block;\n padding: 8px;\n background-color: #eee;\n font-size: 12px;\n border-radius: 0.5rem;\n\n label {\n padding: 0.25rem 0.5rem 0.25rem 0.5rem;\n cursor: pointer;\n }\n input[type=\"radio\"] {\n display: none;\n }\n input[type=\"radio\"]:checked + label {\n transition: ease-in-out 0.2s;\n background-color: rgba(0, 0, 0, 0.5);\n box-shadow: 0 0 0.875rem 0 rgba(33, 37, 41, 0.05);\n color: white;\n border-radius: 0.5rem;\n }\n`;\nexport default DateRange;\n","import React, { useLayoutEffect } from \"react\";\nimport * as am5 from \"@amcharts/amcharts5\";\nimport * as am5map from \"@amcharts/amcharts5/map\";\nimport am5themes_Animated from \"@amcharts/amcharts5/themes/Animated\";\nimport am5geodata_worldLow from \"@amcharts/amcharts5-geodata/worldLow\";\nimport am5geodata_lang_KO from \"@amcharts/amcharts5-geodata/lang/KO\";\nfunction Map({getCountryMapChartData}) {\n useLayoutEffect(() => {\n let root = am5.Root.new(\"chartdiv\");\n\n root.setThemes([am5themes_Animated.new(root)]);\n let chart = root.container.children.push(\n am5map.MapChart.new(root, {\n //panX: \"rotateX\",\n projection: am5map.geoEquirectangular(),\n })\n );\n // let polygonSeries = chart.series.push(\n // am5map.MapPolygonSeries.new(root, {\n // geoJSON: am5geodata_worldLow,\n // geodataNames: am5geodata_lang_KO,\n // exclude: [\"AQ\"],\n // })\n // );\n\n // Create polygon series\n var polygonSeries = chart.series.push(\n am5map.MapPolygonSeries.new(root, {\n geoJSON: am5geodata_worldLow,\n geodataNames: am5geodata_lang_KO,\n exclude: [\"AQ\"],\n })\n );\n\n polygonSeries.mapPolygons.template.setAll({\n tooltipText: \"{name}\",\n interactive: true,\n });\n polygonSeries.mapPolygons.template.states.create(\"hover\", {\n fill: am5.color(0x435269),\n });\n\n polygonSeries.mapPolygons.template.states.create(\"country-select\", {\n fill: am5.color(0x297373),\n stroke: am5.color(0x297373),\n });\n\n let selectedColumn;\n polygonSeries.mapPolygons.template.events.on(\"click\", function (ev) {\n console.log(\"Clicked on a column\", ev.target);\n /*\n let country = ev.target;\n\n if (selectedColumn) {\n country.states.applyAnimate(\"default\");\n selectedColumn = undefined;\n }\n \n country.states.applyAnimate(\"country-select\");\n selectedColumn = country;\n*/\n var country = ev.target.dataItem.dataContext.name;\n var map;\n console.log(country);\n polygonSeries.zoomToDataItem(ev.target.dataItem);\n polygonSeries.hide();\n polygonSeries.show();\n getCountryMapChartData(country)\n });\n\n chart.set(\"zoomControl\", am5map.ZoomControl.new(root, {}));\n return () => {\n root.dispose();\n };\n }, []);\n\n return
;\n}\n\nexport default Map;\n","import React, { useState, useEffect, useLayoutEffect } from \"react\";\nimport * as am5 from \"@amcharts/amcharts5\";\nimport * as am5xy from \"@amcharts/amcharts5/xy\";\nimport am5themes_Animated from \"@amcharts/amcharts5/themes/Animated\";\n\nfunction LineGraph({ lineGraphData, duration, divName }) {\n const [graphDuration, setGraphDuration] = useState(\"day\");\n useEffect(() => {\n switch (duration) {\n case \"daily\":\n setGraphDuration(\"day\");\n break;\n case \"weekly\":\n setGraphDuration(\"week\");\n break;\n case \"month\":\n setGraphDuration(\"month\");\n break;\n }\n }, [duration]);\n\n useLayoutEffect(() => {\n var root = am5.Root.new(divName);\n root.setThemes([am5themes_Animated.new(root)]);\n var chart = root.container.children.push(\n am5xy.XYChart.new(root, {\n panX: true,\n panY: true,\n wheelX: \"panX\",\n wheelY: \"zoomX\",\n layout: root.verticalLayout,\n maxTooltipDistance: 0,\n })\n );\n\n // Create Y-axis\n var yAxis = chart.yAxes.push(\n am5xy.ValueAxis.new(root, {\n extraMax: 0.1,\n maxDeviation: 0.1,\n extraTooltipPrecision: 1,\n renderer: am5xy.AxisRendererY.new(root, {}),\n })\n );\n\n // Create X-Axis\n let xAxis = chart.xAxes.push(\n am5xy.DateAxis.new(root, {\n baseInterval: { timeUnit: \"day\", count: 1 },\n \n renderer: am5xy.AxisRendererX.new(root, { minGridDistance: 30 }),\n })\n );\n\n xAxis.get(\"dateFormats\")[\"day\"] = \"MM/dd\";\n xAxis.get(\"periodChangeDateFormats\")[\"day\"] = \"MMMM\";\n\n var series = chart.series.push(\n am5xy.LineSeries.new(root, {\n name: \"작업량\",\n xAxis: xAxis,\n yAxis: yAxis,\n valueYField: \"value\",\n valueXField: \"date\",\n tooltip: am5.Tooltip.new(root, {}),\n })\n );\n\n series.bullets.push(function () {\n return am5.Bullet.new(root, {\n sprite: am5.Circle.new(root, {\n radius: 5,\n fill: am5.color(0x435269),\n }),\n });\n });\n\n series.strokes.template.set(\"strokeWidth\", 5);\n\n series\n .get(\"tooltip\")\n .label.set(\"text\", \"[bold]{name}[/]\\n{valueX.formatDate()}: {valueY}\");\n series.data.setAll(lineGraphData); // 데이터 적용\n\n // Pre-zoom X axis\n /* series.events.once(\"datavalidated\", (ev, target) => {\n xAxis.zoomToDates(new Date(2021, 0, 1), new Date(2022, 0, 1));\n });*/\n\n // Add legend\n var legend = chart.children.push(am5.Legend.new(root, {}));\n legend.data.setAll(chart.series.values);\n\n // Add cursor\n // chart.set(\n // \"cursor\",\n // am5xy.XYCursor.new(root, {\n // behavior: \"zoomXY\",\n // xAxis: xAxis,\n // })\n // );\n\n // xAxis.set(\n // \"tooltip\",\n // am5.Tooltip.new(root, {\n // themeTags: [\"axis\"],\n // })\n // );\n\n // yAxis.set(\n // \"tooltip\",\n // am5.Tooltip.new(root, {\n // themeTags: [\"axis\"],\n // })\n // );\n // Add cursor\n var cursor = chart.set(\n \"cursor\",\n am5xy.XYCursor.new(root, {\n xAxis: xAxis,\n })\n );\n cursor.lineY.set(\"visible\", false);\n\n cursor.events.on(\"cursormoved\", function (ev) {\n var x = ev.target.getPrivate(\"positionX\");\n var y = ev.target.getPrivate(\"positionY\");\n\n var dateX = xAxis.positionToDate(x);\n var valueY = xAxis.positionToValue(y);\n });\n\n // add scrollbar\n chart.set(\n \"scrollbarX\",\n am5.Scrollbar.new(root, {\n orientation: \"horizontal\",\n })\n );\n\n return () => {\n root.dispose();\n };\n }, [lineGraphData, graphDuration]);\n\n return
;\n}\n\nexport default LineGraph;\n","import React, { useState,useEffect } from \"react\";\nimport styled from \"styled-components\";\n\nfunction Duration({setDuration}) {\n /* \n daily : 일간\n weekly : 주간\n month : 월간\n */\n const [currentDuration, setCurrentDuration] = useState(\"weekly\");\n\n const currentDurationHandler = (e) => {\n setCurrentDuration(e.target.value);\n };\n useEffect(()=>{\n setDuration(currentDuration)\n },[currentDuration])\n\n return (\n \n \n \n \n \n \n \n \n );\n}\n\nconst DateRangeContainer = styled.div`\n display: inline-block;\n padding: 8px;\n background-color: #eee;\n font-size: 12px;\n border-radius: 0.5rem;\n margin-left:1rem;\n\n label {\n padding: 0.25rem 0.5rem 0.25rem 0.5rem;\n cursor: pointer;\n }\n input[type=\"radio\"] {\n display: none;\n }\n input[type=\"radio\"]:checked + label {\n transition: ease-in-out 0.2s;\n background-color: rgba(0, 0, 0, 0.5);\n box-shadow: 0 0 0.875rem 0 rgba(33, 37, 41, 0.05);\n color: white;\n border-radius: 0.5rem;\n }\n`;\nexport default Duration;\n","import React from \"react\";\n\nimport TitleCard from \"../../../Components/DashboardComponents/TitleCard\";\nimport DocumentStatCard from \"../../../Components/DashboardComponents/DocumentStatCard\";\n\nimport UserSelectCard from \"../../../Components/DashboardComponents/UserSelectCard\";\nimport WorkStatCard from \"../../../Components/DashboardComponents/WorkStatCard\";\nimport ChartCard from \"../../../Components/DashboardComponents/ChartCard\";\nimport ProcessMenu from \"../../../Components/DashboardComponents/ProcessMenu\";\nimport DateRange from \"../../../Components/DashboardComponents/DateRange\";\nimport Map from \"./Map\";\nimport LineGraph from \"./LineGraph\";\nimport styled from \"styled-components\";\nimport Duration from \"../../../Components/DashboardComponents/Duration\";\nimport { ResponsivePie } from \"@nivo/pie\"; // 원형차트 임시...\nimport { FaSort } from \"react-icons/fa\";\nimport { myColors } from \"styles/colors\";\n\nfunction Dashboard({\n countryPieChartData,\n menuType,\n menuHandler,\n process,\n processHandler,\n rowClickHandler,\n crawlHostList,\n selectedHostId,\n currentCrawlHostLog,\n crawlSum,\n setCurrentUserId,\n currentUserIdHandler,\n setDateGte,\n lineGraphData,\n setDuration,\n duration,\n curationWorkModalOpen,\n curationWorkList,\n userWorkAllData,\n workAllLogData,\n workAllStatus,\n workAllStatusHandler,\n processTitle,\n countryDocumentData,\n getCountryMapChartData,\n crawlCountSort,\n}) {\n return (\n \n \n
\n \n 문서 전체 통계 & 국가별 통계\n \n \n 작업자별 작업 통계 및 현황\n \n \n 크롤러 작동 현황\n \n {/*\n \n 시스템 접속 통계\n \n */}\n
\n
\n \n {menuType === \"docs_country\" && (\n <>\n <>\n \n\n \n \n \n \n
\n \n \n \n \n
\n
\n \n \n \n \n {userWorkAllData.map((item, index) => {\n return (\n
\n
{processTitle[index]}
\n \n
\n );\n })}\n
\n \n \n \n )}\n {menuType === \"docs_worker\" && (\n <>\n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 작업 문서 ID\n 작업 일시\n 컨텐츠 품질\n 작업 전\n 작업 후\n \n \n \n {curationWorkList.map((item, index) => {\n return (\n \n {item.ES_ID}\n {item.DT}\n {item.QUALITY}\n \n {\n curationWorkModalOpen(item.CONTENT_BEF || \"\");\n }}\n >\n 조회\n \n \n \n {\n curationWorkModalOpen(item.CONTENT_CUR);\n }}\n >\n 조회\n \n \n \n );\n })}\n \n \n \n \n {/*\n \n \n \n 작업 문서 ID\n 작업 일시\n 작업 단계\n \n \n \n \n _abcdefghijklmnop\n 2022-04-07 13:36:00\n 스크리닝 완료\n \n \n \n */}\n \n \n )}\n {menuType === \"crawl\" && (\n <>\n \n \n \n
URL
\n
{crawlSum.url}
\n
\n \n
HTML
\n
{crawlSum.html}
\n
\n \n
PDF
\n
{crawlSum.pdf}
\n
\n \n
WORD
\n
{crawlSum.word}
\n
\n \n
EXCEL
\n
{crawlSum.excel}
\n
\n \n
PPT
\n
{crawlSum.ppt}
\n
\n \n
ETC
\n
{crawlSum.etc}
\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n HOST ID\n HOST 도메인\n 작업 총량\n 작업 생성일\n 크롤링 상태\n \n \n \n URL\n {\n crawlCountSort(\"url\");\n }}\n />\n \n \n HTML\n {\n crawlCountSort(\"html\");\n }}\n />\n \n \n PDF\n {\n crawlCountSort(\"pdf\");\n }}\n />\n \n \n WORD\n {\n crawlCountSort(\"word\");\n }}\n />\n \n \n EXCEL\n {\n crawlCountSort(\"excel\");\n }}\n />\n \n \n PPT\n {\n crawlCountSort(\"ppt\");\n }}\n />\n \n \n ETC\n {\n crawlCountSort(\"etc\");\n }}\n />\n \n \n \n \n {crawlHostList.map((item, index) => {\n return (\n <>\n {\n rowClickHandler(item.job_id);\n }}\n >\n {item.job_id}\n {item.host}\n {item.url}\n {item.html}\n {item.pdf}\n {item.word}\n {item.excel}\n {item.ppt}\n {item.etc}\n {item.created_at}\n \n {item.status.toUpperCase()}\n \n \n {selectedHostId === item.job_id && (\n \n \n
\n {currentCrawlHostLog.length === 0 ? (\n
작업 로그가 없습니다.
\n ) : (\n currentCrawlHostLog.map((log, index) => {\n return (\n
\n
[시작일] {log.start_time}
\n
[종료일] {log.end_time}
\n
[url] {log.url}
\n
[html] {log.html}
\n
[pdf] {log.pdf}
\n
[word] {log.word}
\n
[excel] {log.excel}
\n
[ppt] {log.ppt}
\n
\n );\n })\n )}\n
\n \n \n )}\n \n );\n })}\n \n
\n \n \n )}\n
\n
\n );\n}\n\nconst Wrap = styled.div`\n display: flex;\n flex-direction: column;\n min-width: 1280px;\n`;\n\nconst Wrapper = styled.div`\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n min-height: 1280px;\n padding: 1.5rem 3rem;\n background-color: #eee;\n`;\n\nconst CountryContentWrapper = styled.div`\n display: grid;\n grid-template-columns: 7fr 3fr;\n gap: 0.5rem;\n\n & .country-left-section {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n }\n`;\n\nconst Tab = styled.div`\n height: 4rem;\n border-bottom: solid 1px rgba(0, 0, 0, 0.1);\n align-items: bottom;\n display: flex;\n align-items: end;\n padding: 0 3rem;\n .button-group {\n }\n`;\nconst TabButton = styled.button`\n color: ${(props) => props.active && myColors.blue400};\n border: none;\n border-bottom: ${(props) => props.active && `solid 3px ${myColors.blue400};`};\n font-weight: bold;\n background-color: white;\n cursor: pointer;\n padding: 1rem;\n`;\n\nconst CrawlFileTypeWrapper = styled.div`\n display: flex;\n flex-wrap: wrap;\n`;\nconst CrawlFileTypeStatCard = styled.div`\n border: solid 1px #d6d6d6;\n border-radius: 4px;\n box-shadow: rgb(9 30 66 / 25%) 0px 1px 1px;\n padding: 1rem;\n\n border-left: ${(props) => `solid 5px ${props.color}` || \"solid 5px #eee\"};\n margin: 1rem;\n min-width: 7rem;\n\n .file-type {\n color: #435269;\n font-size: 12px;\n }\n .file-status {\n color: #5a5c69;\n font-size: 20px;\n font-weight: bold;\n }\n`;\n\nconst CrawlStatusTable = styled.table`\n width: 100%;\n table-layout: fixed;\n border-collapse: collapse;\n text-align: left;\n font-size: 14px;\n color: rgb(59, 59, 59);\n th {\n color: #323d4d;\n background-color: #d8dee6;\n }\n th,\n td {\n border-bottom: 1px solid #d6d6d6;\n padding: 10px;\n word-wrap: break-word;\n }\n\n tr:first-child,\n tr:last-child {\n border: none;\n }\n input[type=\"text\"] {\n width: 100%;\n }\n .work-log-wrapper {\n display: flex;\n flex-wrap: nowrap;\n overflow-x: auto;\n }\n .work-log {\n margin: 10px;\n border: solid 1px #d6d6d6;\n border-radius: 4px;\n box-shadow: rgb(9 30 66 / 25%) 0px 1px 1px;\n padding: 1rem;\n min-width: 190px;\n }\n .sort-btn {\n cursor: pointer;\n }\n`;\n\nconst LineGraphOnlyOneWrapper = styled.div`\n padding: 3rem;\n`;\n\nconst LineGraphWrapper = styled.div`\n display: grid;\n row-gap: 2rem;\n grid-template-columns: 1fr 1fr;\n overflow: hidden;\n\n .graph-title-container {\n display: flex;\n flex-direction: column;\n padding-top: 1rem;\n .graph-title {\n display: flex;\n padding-left: 3rem;\n font-weight: bold;\n color: #435269;\n }\n }\n`;\n\nexport default Dashboard;\n","import React, { useEffect, useState } from \"react\";\nimport Dashboard from \"./Dashboard\";\nimport { useDispatch } from \"react-redux\";\nimport { setModal, setModalData } from \"../../../Modules/modal\";\nimport { trackPromise } from \"react-promise-tracker\";\nimport {\n crawlHostDataFetchApi,\n crawlSumDataFetchApi,\n userWorkLogFetchApi,\n curationWorkListFetchApi,\n sessionHandler,\n countryWorkListFetchApi,\n workAllLogFetchApi,\n} from \"../../../Utils/api\";\nimport { LoadingWrapper } from \"../../../Components/LoadingWrapper\";\n\nfunction DashboardContainer() {\n // docs 문서 통계\n // work 작업자 작업 통계\n // crawl 크롤러 현황\n const dispatch = useDispatch();\n const [menuType, setMenuType] = useState(\"docs_country\");\n\n const [crawlHostList, setCrawlHostList] = useState([]); // 크롤 호스트 전체 목록\n const [currentCrawlHostLog, setCurrentCrawlHostLog] = useState([]); // 선택한 호스트의 크롤링 작업 로그 목록\n const [selectedHostId, setSelectedHostId] = useState(null); // 현태 선택한 호스트\n const [crawlSum, setCrawlSum] = useState(null); // 현재 크롤링 총 작업 현황\n const [process, setProcess] = useState(1);\n\n const [currentUserId, setCurrentUserId] = useState(null); // 현재 선택된 유저의 id\n\n const [dateGte, setDateGte] = useState(\"2022-01-01\"); // 현재 시각 기준 3년 전으로 설정 할 예정...\n const [lineGraphData, setLineGraphData] = useState([]); // 기간별 통계 꺾은선 그래프 데이터\n\n const [duration, setDuration] = useState(\"daily\");\n\n const [curationWorkList, setCurationWorkList] = useState([]); // 해당 작업자의 큐레이션 내역 목록\n\n const [userWorkAllData, setUserWorkAllData] = useState([]); // 해당 작업자의 총 작업량\n const [countryPieChartData, setCountryPieChartData] = useState([]); // 세계 국가 문서 현황\n const [countryDocumentData, setCountryDocumentData] = useState(null); // 특정 국가 문서 현황\n const [workAllLogData, setWorkAllLogData] = useState({});\n const [workAllStatus, setWorkAllStatus] = useState(-1); // 전체 작업에서 통계를 확인할 단계\n\n const [sortType, setSortType] = useState(\"asc\");\n const [sortDataType, setSortDataType] = useState(null);\n const processTitle = {\n 0: \"스크리닝\",\n 1: \"정제\",\n 2: \"등록\",\n 3: \"큐레이션\",\n };\n const menuHandler = (e) => {\n setMenuType(e.target.value);\n };\n const processHandler = (select) => {\n setProcess(select);\n };\n const rowClickHandler = (host_id) => {\n // 현재 선택된 host_id 새로 보고자 하는 host_id 같을경우 이미 오픈된 목록을 닫는걸로 생각\n if (selectedHostId === host_id) {\n setSelectedHostId(null);\n } else {\n setSelectedHostId(host_id);\n }\n };\n const workAllStatusHandler = (status) => {\n setWorkAllStatus(status);\n };\n const currentUserIdHandler = (e) => {\n setCurrentUserId(e.target.value);\n };\n const curationWorkModalOpen = (data) => {\n dispatch(setModal(\"CurationWorkContentModal\"));\n dispatch(setModalData(data, \"curation_work_content\"));\n };\n\n function getRandomColor() {\n return \"#\" + Math.floor(Math.random() * 16777215).toString(16);\n }\n\n const crawlCountSort = (dataType) => {\n setSortDataType(dataType);\n if (sortType === \"asc\") {\n setSortType(\"desc\");\n } else {\n setSortType(\"asc\");\n }\n };\n const getCrawlHostList = () => {\n trackPromise(\n crawlHostDataFetchApi()\n .then((res) => {\n console.log(res.data);\n setCrawlHostList(res.data);\n crawlSumDataFetchApi().then((res) => {\n setCrawlSum(res.data[0]);\n });\n })\n .catch((err) => {\n sessionHandler(err, dispatch).then((res) => {\n crawlHostDataFetchApi().then((res) => {\n setCrawlHostList(res.data);\n crawlSumDataFetchApi().then((res) => {\n setCrawlSum(res.data[0]);\n });\n });\n });\n })\n );\n };\n\n const getCrawlHostLogList = () => {\n trackPromise(\n crawlHostDataFetchApi(selectedHostId)\n .then((res) => {\n setCurrentCrawlHostLog(res.data.reverse()); // 최신순\n })\n .catch((err) => {\n sessionHandler(err, dispatch).then((res) => {\n crawlHostDataFetchApi(selectedHostId).then((res) => {\n setCurrentCrawlHostLog(res.data.reverse()); // 최신순\n });\n });\n })\n );\n };\n const graphDataCleansing = (rawData) => {\n setLineGraphData(\n rawData.map((item, index) => {\n return { date: new Date(item.start).getTime(), value: item.cnt };\n })\n );\n };\n const getUserWorkLog = () => {\n const dataObj = {\n status: process,\n wid: Number(currentUserId),\n duration: duration,\n dateLte: new Date().toISOString().substring(0, 10),\n dateGte: dateGte,\n };\n trackPromise(\n userWorkLogFetchApi(dataObj)\n .then((res) => {\n graphDataCleansing(res.data);\n })\n .catch((err) => {\n sessionHandler(err, dispatch).then((res) => {\n userWorkLogFetchApi(dataObj).then((res) => {\n graphDataCleansing(res.data);\n });\n });\n })\n );\n };\n const _getUserWorkAllLog = async (process) => {\n const dataObj = {\n status: process,\n duration: duration,\n dateLte: new Date().toISOString().substring(0, 10),\n dateGte: dateGte,\n };\n const _rawData = await userWorkLogFetchApi(dataObj);\n const _tmp = _rawData.data.map((item, index) => {\n return { date: new Date(item.start).getTime(), value: item.cnt };\n });\n return _tmp;\n };\n\n const getUserWorkAllLog = async () => {\n const screeningResult = await _getUserWorkAllLog(0);\n const refineResult = await _getUserWorkAllLog(2);\n const registerResult = await _getUserWorkAllLog(4);\n const curationResult = await _getUserWorkAllLog(6);\n let _tmp = [\n [...screeningResult],\n [...refineResult],\n [...registerResult],\n [...curationResult],\n ];\n setUserWorkAllData(_tmp);\n };\n const getCurationWorkList = () => {\n const dataObj = {\n wid: Number(currentUserId),\n dateLte: new Date().toISOString().substring(0, 10),\n dateGte: \"1970-01-01\",\n };\n trackPromise(\n curationWorkListFetchApi(dataObj)\n .then((res) => {\n setCurationWorkList(res.data);\n })\n .catch((err) => {\n sessionHandler(err, dispatch).then((res) => {\n curationWorkListFetchApi(dataObj).then((res) => {\n setCurationWorkList(res.data);\n });\n });\n })\n );\n };\n\n const pieChartDataCleansing = (rawData) => {\n let _pieChart = [];\n\n for (var key in rawData) {\n let obj = {\n id: key,\n label: key,\n value: rawData[key],\n color: getRandomColor(),\n };\n _pieChart.push(obj);\n }\n setCountryPieChartData(_pieChart);\n };\n\n const getCountryWorkList = () => {\n trackPromise(\n countryWorkListFetchApi(workAllStatus)\n .then((res) => {\n pieChartDataCleansing(res.data);\n })\n .catch((err) => {\n sessionHandler(err, dispatch).then((res) => {\n countryWorkListFetchApi(workAllStatus).then((res) => {\n pieChartDataCleansing(res.data);\n });\n });\n })\n );\n };\n\n const getWorkAllLogData = () => {\n trackPromise(\n workAllLogFetchApi()\n .then((res) => {\n setWorkAllLogData(res.data);\n })\n .catch((err) => {\n sessionHandler(err, dispatch).then((res) => {\n workAllLogFetchApi().then((res) => {\n setWorkAllLogData(res.data);\n });\n });\n })\n );\n };\n\n const getCountryMapChartData = async (countryName) => {\n const _collect = await countryWorkListFetchApi(-1);\n const _screening = await countryWorkListFetchApi(0);\n const _refine = await countryWorkListFetchApi(2);\n const _register = await countryWorkListFetchApi(4);\n const _curation = await countryWorkListFetchApi(6);\n const _data = {\n collect: _collect.data[countryName] || 0,\n screening: _screening.data[countryName] || 0,\n refine: _refine.data[countryName] || 0,\n register: _register.data[countryName] || 0,\n curation: _curation.data[countryName] || 0,\n };\n console.log(_data);\n setCountryDocumentData({ country: countryName, data: _data });\n };\n useEffect(() => {\n getCrawlHostList(); // 크롤 호스트 목록 불러오기\n }, []);\n\n useEffect(() => {\n if (menuType === \"docs_country\") {\n getUserWorkAllLog();\n getCountryWorkList();\n getWorkAllLogData();\n }\n if (!!currentUserId) {\n getUserWorkLog();\n }\n }, [currentUserId, dateGte, process, duration, workAllStatus]);\n useEffect(() => {\n if (!!currentUserId) {\n getCurationWorkList();\n }\n }, [currentUserId]);\n\n useEffect(() => {\n if (selectedHostId !== null) {\n getCrawlHostLogList();\n }\n }, [selectedHostId]);\n\n useEffect(() => {\n if (sortDataType !== null) {\n if (sortType === \"asc\") {\n const sortResult = crawlHostList.sort(\n (a, b) => a[sortDataType] - b[sortDataType]\n );\n setCrawlHostList(sortResult);\n } else {\n const sortResult = crawlHostList.sort(\n (a, b) => b[sortDataType] - a[sortDataType]\n );\n setCrawlHostList(sortResult);\n }\n }\n }, [sortType, sortDataType]);\n return (\n \n \n \n );\n}\nexport default DashboardContainer;\n","import React from \"react\";\nimport styled, { css } from \"styled-components\";\nimport {\n MdOutlineModeEditOutline,\n MdOutlineDeleteOutline,\n MdOutlineCheck,\n MdClose,\n} from \"react-icons/md\";\nimport { WorkerContentHeader } from \"Components/WorkerContentHeader\";\nimport { BsFillDiagram3Fill } from \"react-icons/bs\";\nimport { myColors, tailwindColors } from \"styles/colors\";\nimport { CATEGOROY_CODE_LIST } from \"./CategoryManagementContainer\";\nfunction CategoryManagement({\n categoryList,\n type,\n typeHandler,\n editableCode,\n editCategoryName,\n categoryEdit,\n categoryEditConfirm,\n categoryEditCancel,\n onChangeEditInput,\n upperCodeHandler,\n lengthHandler,\n onChangeAddInput,\n categoryAdd,\n categoryDelete,\n upperCode,\n}) {\n return (\n \n \n \n \n {[...Object.keys(CATEGOROY_CODE_LIST)].map((categoryName) => (\n {\n typeHandler(CATEGOROY_CODE_LIST[categoryName]);\n }}\n className={\n type === CATEGOROY_CODE_LIST[categoryName] ? \"active\" : null\n }\n >\n {categoryName}\n \n ))}\n \n \n \n
대분류
\n
중분류
\n
소분류
\n
\n \n \n \n {\n categoryAdd(2);\n }}\n >\n 등록\n \n \n \n \n {\n categoryAdd(4);\n }}\n >\n 등록\n \n \n \n \n {\n categoryAdd(6);\n }}\n >\n 등록\n \n \n \n \n {categoryList.map((category, index) => {\n return (\n \n {category.list.map((item, index2) => {\n return (\n
\n {editableCode === item.CODE ? (\n \n \n
\n {\n categoryEditConfirm(item.CODE);\n }}\n >\n \n \n \n \n \n
\n
\n ) : (\n \n {\n upperCodeHandler(item.CODE, category.length);\n lengthHandler(category.length + 2);\n }}\n >\n {item.CT_NM} ({item.CODE})\n
\n
\n {\n categoryEdit(item);\n }}\n >\n \n \n {\n categoryDelete(item.CODE);\n }}\n >\n \n \n
\n \n )}\n \n );\n })}\n
\n );\n })}\n
\n
\n
\n
\n );\n}\n\nconst Wrap = styled.div`\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100vh;\n padding: 1.5rem 3rem;\n`;\n\nconst Content = styled.div`\n flex-grow: 1;\n display: flex;\n flex-direction: column;\n min-width: 930px;\n width: 100%;\n`;\n\nconst MenuList = styled.ul`\n display: flex;\n width: fit-content;\n list-style-type: none;\n margin-bottom: 1.5rem;\n\n li {\n display: flex;\n padding: 1rem 2rem;\n border-bottom: solid 1px ${tailwindColors.white};\n background-color: ${tailwindColors.white};\n font-size: 1.2rem;\n font-weight: bold;\n\n cursor: pointer;\n }\n li:hover {\n }\n .active {\n border-bottom: solid 0.25rem ${myColors.blue400};\n color: ${myColors.blue400};\n }\n`;\n\nconst CategoryContainer = styled.div`\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n .content-title {\n border-bottom: 1px solid #d6d6d6;\n padding: 1rem;\n .main-title {\n font-size: 16px;\n font-weight: bold;\n margin-bottom: 8px;\n }\n .sub-title {\n /*font-size:14px;*/\n }\n }\n .content-body {\n width: 100%;\n }\n`;\n\nconst AddCategoryContainer = styled.div`\n display: flex;\n width: 100%;\n border: 1px solid ${tailwindColors[\"grey-300\"]};\n & > * + * {\n border-left: 1px solid ${tailwindColors[\"grey-300\"]};\n }\n`;\n\nconst CategoryHeader = styled.div`\n display: flex;\n width: 100%;\n background-color: ${myColors.blue500};\n div {\n padding: 0.5rem 0 0.5rem 0;\n flex-grow: 1;\n text-align: center;\n color: white;\n font-weight: bold;\n }\n`;\n\nconst AddItem = styled.div`\n flex-grow: 1;\n display: flex;\n padding: 0.5rem;\n\n input {\n flex: 1;\n padding: 0 1rem;\n border: 1px solid ${tailwindColors[\"grey-300\"]};\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n button {\n cursor: pointer;\n min-width: 5rem;\n background-color: ${myColors.blue500};\n color: white;\n padding: 0.5rem 1rem;\n }\n`;\n\nconst ListContainer = styled.div`\n display: flex;\n width: 100%;\n border: 1px solid ${tailwindColors[\"grey-300\"]};\n & > * + * {\n border-left: 1px solid ${tailwindColors[\"grey-300\"]};\n }\n`;\n\nconst ListWrapper = styled.ul`\n width: calc(100% / 3);\n height: 32rem;\n overflow-y: auto;\n overflow-x: hidden;\n`;\n\nconst ListItem = styled.li`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 1rem;\n border-bottom: 1px solid ${tailwindColors[\"grey-300\"]};\n background-color: white;\n\n .actions {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n\n button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2rem;\n height: 2rem;\n border: 1px solid ${tailwindColors[\"grey-400\"]};\n background-color: ${tailwindColors.white};\n font-size: 18px;\n\n cursor: pointer;\n :hover {\n background-color: ${tailwindColors[\"grey-100\"]};\n }\n }\n }\n`;\n\nconst ViewItem = styled(ListItem)`\n .title {\n cursor: pointer;\n }\n button {\n &.delete {\n background-color: ${myColors.red};\n color: white;\n border: none;\n :hover {\n background-color: ${myColors.red};\n }\n }\n }\n\n ${(props) =>\n props.active &&\n css`\n background-color: ${tailwindColors[\"grey-200\"]};\n font-weight: bold;\n `};\n`;\n\nconst EditItem = styled(ListItem)`\n background-color: ${myColors.blue100};\n input {\n display: flex;\n align-items: center;\n max-width: 11rem;\n padding-left: 0.5rem;\n border: none;\n }\n button {\n &.confirm {\n background-color: ${myColors.blue400};\n border: none;\n color: white;\n :hover {\n background-color: ${myColors.blue400};\n }\n }\n }\n`;\n\nexport default CategoryManagement;\n","import React, { useState, useEffect } from \"react\";\nimport { useDispatch } from \"react-redux\";\nimport { trackPromise } from \"react-promise-tracker\";\n\nimport { LoadingWrapper } from \"Components/LoadingWrapper\";\nimport {\n categoryListFetchApi,\n categoryItemAddApi,\n categoryItemDeleteApi,\n categoryItemEditApi,\n sessionHandler,\n} from \"Utils/api\";\n\nimport CategoryManagement from \"./CategoryManagement\";\n\nexport const CATEGOROY_CODE_LIST = {\n 정책분류: 1,\n 유형분류: 2,\n 국가분류: 3,\n 언어: 4,\n 토픽분류: 5,\n 기관맞춤형분류: 6,\n};\n\nfunction CategoryManagementContainer() {\n const dispatch = useDispatch();\n\n const [editableCode, setEditableCode] = useState(0);\n /* 수정할 항목의 코드를 저장한다.\n 0일 경우 수정 할 항목이 지정되지 않은 상태이다.\n 그러므로, 수정 확인 또는 수정 취소 시 해당 값을 0으로 다시 지정해 주어야 한다.\n */\n\n const [addCategoryName, setAddCategoryName] = useState(\"\"); // 새롭게 등록할 카테고리 이름\n const [editCategoryName, setEditCategoryName] = useState(\"\"); // 수정할 카테고리 이름\n\n const [type, setType] = useState(1); // 정책분류 , 유형구분 , 국가 분류, 언어\n const [categoryList, setCategoryList] = useState([\n { length: 2, list: [] },\n { length: 4, list: [] },\n { length: 6, list: [] },\n ]);\n const [upperCode, setUpperCode] = useState({ 2: null, 4: null, 6: null });\n const [length, setLength] = useState(2); // 대분류 (2) 중분류 (4) 소분류 (6)\n\n const typeHandler = (type) => {\n setCategoryList([\n { length: 2, list: [] },\n { length: 4, list: [] },\n { length: 6, list: [] },\n ]);\n setUpperCode({ 2: null, 4: null, 6: null });\n setLength(2);\n setType(type);\n };\n const onChangeEditInput = (e) => {\n setEditCategoryName(e.target.value);\n };\n const onChangeAddInput = (e) => {\n setAddCategoryName(e.target.value);\n };\n\n const upperCodeHandler = (code, length) => {\n let _upperCode = { ...upperCode };\n _upperCode[length] = code;\n setUpperCode(_upperCode);\n };\n const lengthHandler = (length) => {\n setLength(length);\n };\n\n const categoryEdit = (item) => {\n setEditableCode(item.CODE);\n setEditCategoryName(item.CT_NM);\n };\n const categoryEditConfirm = (code) => {\n categoryItemEditApi(type, code, editCategoryName).then((res) => {\n if (res.status === 200) {\n alert(\"성공적으로 수정되었습니다.\");\n dataFetch();\n categoryEditCancel();\n }\n });\n };\n const categoryEditCancel = () => {\n setEditableCode(0);\n setEditCategoryName(\"\");\n };\n const categoryAdd = (length) => {\n if (addCategoryName === \"\") {\n alert(\"카테고리 이름을 입력해주세요\");\n return;\n }\n if (length === 4 && upperCode[2] === null) {\n alert(\"대분류를 먼저 선택해주세요.\");\n return;\n } else if (length === 6 && upperCode[4] === null) {\n alert(\"중분류를 먼저 선택해주세요.\");\n return;\n } else {\n const code = length === 2 ? null : upperCode[length - 2];\n categoryItemAddApi(type, length, addCategoryName, code).then((res) => {\n if (res.status === 200) {\n alert(\"성공적으로 등록되었습니다.\");\n dataFetch();\n // setAddCategoryName(\"\"); input 초기화 왜 안되는거지\n }\n });\n }\n };\n const categoryDelete = (code) => {\n if (\n confirm(\n \"해당 카테고리를 삭제하시겠습니까? 연관된 문서에서 카테고리 설정이 삭제됩니다.\"\n )\n ) {\n categoryItemDeleteApi(type, code).then((res) => {\n if (res.status === 200) {\n alert(\"성공적으로 삭제되었습니다.\");\n dataFetch();\n }\n });\n }\n };\n /* 데이터 불러오기 */\n const dataFetch = () => {\n trackPromise(\n categoryListFetchApi(type, length, upperCode[length - 2])\n .then((res) => {\n console.log(res.data);\n dataCleansing(res.data);\n })\n .catch((err) => {\n sessionHandler(err, dispatch).then((res) => {\n categoryListFetchApi(type, length, upperCode[length - 2]).then(\n (res) => {\n dataCleansing(res.data);\n }\n );\n });\n })\n );\n };\n const dataCleansing = (rawData) => {\n const index = categoryList.findIndex((i) => i.length == length);\n let _categoryList = [...categoryList];\n _categoryList[index] = { length, list: rawData };\n setCategoryList(_categoryList);\n };\n\n useEffect(() => {\n dataFetch();\n console.log(upperCode[2]);\n }, [type, length, upperCode]);\n\n return (\n \n \n \n );\n}\n\nexport default CategoryManagementContainer;\n","import React from \"react\";\nimport { FaFilter } from \"react-icons/fa\";\nimport styled from \"styled-components\";\nimport { MdUpload, MdSettings, MdOutlineSearch, MdSync } from \"react-icons/md\";\nimport { WorkerContentHeader } from \"Components/WorkerContentHeader\";\nimport { AiOutlineRobot } from \"react-icons/ai\";\nimport { myColors, tailwindColors } from \"styles/colors\";\nfunction HostManagement({\n currentHostList,\n filterOpen,\n _filterOpenHandler,\n _filterInputsHandler,\n _registerHostOpenHandler,\n filterSearch,\n excelDownload,\n excelUpload,\n selectedHost,\n _openCategoryModal,\n docCategory,\n docLanguage,\n docCountry,\n hostRegisterUpload,\n _hostPublisherHandler,\n _hostWorkCycleHandler,\n hostWorkCycle,\n hostPublisher,\n nextrendSync,\n hostTestList,\n}) {\n return (\n \n \n \n {/* \n
\n
크롤링 HOST 테스트 등록 / 결과
\n
\n 엑셀로 HOST 데이터를 업로드하여 크롤링 가능 여부를 테스트 합니다.\n 테스트 목록에 HOST가 등록되어 있을때는 데이터 추가 등록이 불가능\n 합니다. 테스트가 완료되면 완료 결과에 따라 HOST를 선택하여 실제로\n 작동할 HOST를 선택하여 등록할 수 있습니다.\n
\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n HOST 도메인\n 시간\n 결과\n 등록\n 삭제\n \n \n 작업 시작 시간\n 작업 종료 시간\n 러닝 타임\n URL\n HTML\n PDF\n WORD\n EXCEL\n PPT\n ETC\n \n \n \n {hostTestList.map((host, index) => {\n return (\n <>\n \n {host.host}\n {host.start_time}\n {host.end_time}\n {host.running_time}\n {host.test_end ? (\n <>\n {host.url}\n {host.html}\n {host.pdf}\n {host.word}\n {host.excel}\n {host.ppt}\n {host.etc}\n \n ) : (\n \n 크롤링 테스트 중입니다\n \n )}\n {host.is_registered ? (\n 기등록됨\n ) : (\n \n {\n _registerHostOpenHandler(host);\n }}\n >\n 등록\n \n \n )}\n \n 버리기\n \n \n {selectedHost && selectedHost.idx === host.idx && (\n \n \n
\n 아래의 값을 모두 채워 등록해주세요. 언어, 국가,\n 정책분류는 각 1개씩만 설정가능 합니다.\n
\n \n
\n
HOST 도메인
\n
{host.host}
\n
\n
\n
발급기관명
\n \n
\n
\n
\n HOST 해당 언어\n
\n {\n _openCategoryModal(\"doc_language\");\n }}\n >\n \n 선택\n \n \n {docLanguage.map((item, index) => {\n return (\n {item.CT_NM}\n );\n })}\n \n
\n
\n
\n HOST 해당 국가\n
\n {\n _openCategoryModal(\"doc_country\");\n }}\n >\n \n 선택\n \n \n {docCountry.map((item, index) => {\n return (\n {item.CT_NM}\n );\n })}\n \n
\n
\n
\n HOST 정책 분류\n
\n {\n _openCategoryModal(\"doc_category\");\n }}\n >\n \n 선택\n \n \n {docCategory.map((item, index) => {\n return (\n {item.CT_NM}\n );\n })}\n \n
\n
\n
\n 크롤러 수집주기 (day)\n
\n \n
\n \n 등록\n \n
\n \n \n )}\n \n );\n })}\n \n
\n
\n
*/}\n \n
\n
현재 작동중인 크롤링 HOST 목록
\n
\n 엑셀로 데이터를 업로드하고 관리할 수 있습니다. 업로드한 데이터는\n 기존의 데이터를 덮어씌웁니다.\n
\n
\n
\n \n \n \n \n \n \n {filterOpen && (\n \n
\n \n
검색 필터 설정
\n
\n
\n
\n
HOST 도메인
\n \n
\n
\n
HOST 언어
\n \n
\n
\n
HOST 해당 국가
\n \n
\n
\n
발급 기관 명
\n \n
\n
\n
HOST 정책 분류
\n \n
\n
\n
크롤링 수집주기
\n \n
\n
\n
\n \n
\n
\n )}\n \n \n \n \n \n \n \n \n \n \n \n \n HOST 도메인\n HOST 해당 언어\n HOST 해당 국가\n 발급 기관 명\n HOST 정책 분류\n 크롤링 수집주기(일 단위)\n 관리\n \n \n \n {currentHostList.map((host, index) => {\n return (\n <>\n \n {host.host}\n {host.lang.length !== 0 && host.lang[0].CT_NM}\n \n {host.country.length !== 0 && host.country[0].CT_NM}\n \n {host.name}\n \n {host.category.length !== 0 && host.category[0].CT_NM}\n \n {host.workCycle}\n \n {\n _registerHostOpenHandler(host);\n }}\n >\n \n 관리\n \n \n \n {selectedHost && selectedHost.idx === host.idx && (\n \n \n
\n 아래의 값을 모두 채워 등록해주세요. 언어, 국가,\n 정책분류는 각 1개씩만 설정가능 합니다.\n
\n \n
\n
HOST 도메인
\n
{host.host}
\n
\n
\n
발급기관명
\n \n
\n
\n
\n HOST 해당 언어\n
\n {\n _openCategoryModal(\"doc_language\");\n }}\n >\n \n 선택\n \n \n {docLanguage.map((item, index) => {\n return (\n {item.CT_NM}\n );\n })}\n \n
\n
\n
\n HOST 해당 국가\n
\n {\n _openCategoryModal(\"doc_country\");\n }}\n >\n \n 선택\n \n \n {docCountry.map((item, index) => {\n return (\n {item.CT_NM}\n );\n })}\n \n
\n
\n
\n HOST 정책 분류\n
\n {\n _openCategoryModal(\"doc_category\");\n }}\n >\n \n 선택\n \n \n {docCategory.map((item, index) => {\n return (\n {item.CT_NM}\n );\n })}\n \n
\n
\n
\n 크롤러 수집주기 (day)\n
\n \n
\n \n 등록\n \n
\n \n \n )}\n \n );\n })}\n \n
\n
\n
\n
\n
\n );\n}\n\nconst Wrap = styled.div`\n display: flex;\n flex-direction: column;\n min-width: 1280px;\n width: 100%;\n padding: 1.5rem 3rem;\n`;\n\nconst Wrapper = styled.div`\n display: flex;\n flex-direction: column;\n width: 100%;\n min-height: 1280px;\n margin-top: 2rem;\n font-size: 14px;\n`;\n\nconst LineBox = styled.div`\n border: 1px solid ${tailwindColors[\"grey-300\"]};\n background-color: white;\n`;\n\nconst ContentContainer = styled(LineBox)`\n .content-title {\n border-bottom: 1px solid #d6d6d6;\n padding: 1rem;\n .main-title {\n font-size: 1.2rem;\n font-weight: bold;\n }\n .sub-title {\n font-size: 1rem;\n }\n }\n .content-body {\n padding: 1rem;\n }\n`;\n\nconst DictionaryFunctionWrapper = styled.div`\n display: flex;\n justify-content: space-between;\n`;\n\nconst DictionaryFunctionBtnWrapper = styled.div`\n display: flex;\n gap: 1rem;\n input[type=\"file\"] {\n display: none;\n }\n height: 2rem;\n label {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 1rem;\n background-color: ${myColors.blue500};\n font-size: 14px;\n color: white;\n cursor: pointer;\n }\n\n button {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0 1rem;\n background-color: ${myColors.blue500};\n font-size: 14px;\n color: white;\n cursor: pointer;\n }\n`;\nconst DictonaryDataTable = styled.table`\n width: 100%;\n table-layout: fixed;\n border-collapse: collapse;\n text-align: left;\n margin-top: 1rem;\n margin-bottom: 1rem;\n thead {\n background-color: #d8dee6;\n color: #323d4d;\n border-bottom: 2px solid rgba(0, 0, 0, 0.1);\n }\n th,\n td {\n border-bottom: solid 1px #eee;\n padding: 10px;\n word-break: normal;\n word-wrap: break-word;\n }\n tbody {\n tr:nth-child(even) {\n background-color: #f4f5f8;\n }\n }\n input[type=\"text\"] {\n width: 100%;\n }\n .crawl-setting {\n width: 10rem;\n }\n .crawl-test {\n color: #009999;\n font-weight: bold;\n }\n .registered {\n font-weight: bold;\n color: #b80000;\n }\n .actions {\n display: flex;\n align-items: center;\n justify-content: center;\n button {\n height: 2rem;\n width: 2rem;\n margin-left: 0.5rem;\n display: flex;\n align-items: center;\n justify-content: center;\n border: solid 1px rgba(0, 0, 0, 0.1);\n border-radius: 4px;\n cursor: pointer;\n }\n .delete {\n background-color: #b80000;\n color: white;\n }\n .confirm {\n background-color: #435269;\n color: white;\n }\n }\n .setting {\n text-align: center;\n }\n input[type=\"text\"] {\n &:focus {\n outline: none;\n }\n }\n`;\n\nconst FilterWrapper = styled.div`\n width: 100%;\n padding: 1rem;\n margin: 1rem 0;\n background-color: ${tailwindColors[\"grey-100\"]};\n\n .filter-title {\n color: ${tailwindColors.black};\n font-weight: bold;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin-bottom: 1rem;\n }\n .filter-body {\n display: grid;\n width: 100%;\n grid-template-columns: 1fr 1fr;\n gap: 1rem;\n }\n .filter-item {\n display: flex;\n align-items: center;\n width: 100%;\n height: 2.5rem;\n > div {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 8rem;\n height: 100%;\n padding: 0.5rem 1rem;\n background-color: ${tailwindColors[\"grey-400\"]};\n font-size: 14px;\n font-weight: bold;\n text-align: center;\n word-wrap: break-word;\n }\n input {\n flex: 1;\n display: flex;\n align-items: center;\n height: 100%;\n\n border: 1px solid ${tailwindColors[\"grey-400\"]};\n padding: 0 0.5rem;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n }\n .filter-action {\n display: flex;\n justify-content: flex-end;\n margin-top: 1rem;\n button {\n cursor: pointer;\n background-color: ${myColors.blue500};\n color: white;\n padding: 0.5rem 1rem;\n }\n }\n`;\nconst ActionButton = styled.button`\n margin: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: solid 1px rgba(0, 0, 0, 0.1);\n border-radius: 4px;\n cursor: pointer;\n .delete {\n background-color: #b80000;\n color: white;\n }\n`;\n\nconst HostRegisterContainer = styled.div`\n display: flex;\n flex-wrap: wrap;\n .input-wrapper {\n margin: 0.5rem;\n display: flex;\n height: 2rem;\n align-items: center;\n .input-title {\n min-width: 100px;\n display: flex;\n justify-content: center;\n align-items: center;\n height: 30px;\n background-color: #d6d6d6;\n font-size: 12px;\n margin-right: 0.5rem;\n padding-left: 5px;\n padding-right: 5px;\n text-align: center;\n word-wrap: break-word;\n }\n input {\n max-width: 100px;\n border: solid 1px #d6d6d6;\n margin: 0 0.5rem 0 0.5rem;\n padding: 0.5rem;\n &:focus {\n outline: none;\n }\n }\n }\n`;\nconst CustomList = styled.div`\n display: flex;\n`;\nconst Chip = styled.div`\n font-size: 12px;\n padding: 0.25rem 0.5rem;\n margin: 0.25rem;\n background-color: #eee;\n min-width: 2rem;\n text-align: center;\n border-radius: 1rem;\n display: flex;\n align-items: center;\n justify-content: center;\n`;\nexport default HostManagement;\n","import React, { useState, useEffect } from \"react\";\nimport HostManagement from \"./HostManagement\";\nimport XLSX from \"xlsx\";\nimport {\n HostManagementApi,\n hostSyncApi,\n HostTestApi,\n sessionHandler,\n} from \"../../../Utils/api\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport {\n setModal,\n setModalData,\n setCategoryModalType,\n} from \"../../../Modules/modal\";\nimport { trackPromise } from \"react-promise-tracker\";\nimport { LoadingWrapper } from \"../../../Components/LoadingWrapper\";\n\nfunction HostManagementContainer() {\n const dispatch = useDispatch();\n const [hostList, setHostList] = useState([]);\n const [hostTestList, setHostTestList] = useState([]);\n\n const [currentHostList, setCurrentHostList] = useState([]);\n const [selectedHost, setSelectedHost] = useState(null);\n /* 검색 필터 변수 */\n const [filterInputs, setFilterInputs] = useState({\n host: \"\",\n lang: \"\",\n country: \"\",\n name: \"\",\n category: \"\",\n workCycle: \"\",\n });\n const { host, lang, country, name, category, workCycle } = filterInputs; // 비구조화 할당을 통해 값 추출\n const [filterOpen, setFilterOpen] = useState(true);\n\n /* crawlDataForm 과 공유하여 사용. 어차피 각 화면은 독립적이기 때문에. */\n const [hostPublisher, setHostPublisher] = useState(\"\");\n const [hostWorkCycle, setHostWorkCycle] = useState(\"\");\n const docLanguage = useSelector(\n (state) => state.modal.modalData.doc_language\n ); // doc_language HOST 언어\n const docCountry = useSelector((state) => state.modal.modalData.doc_country); // doc_country HOST 국가\n const docCategory = useSelector(\n (state) => state.modal.modalData.doc_category\n ); // doc_category HOST 정책 분류\n\n const _hostPublisherHandler = (e) => {\n setHostPublisher(e.target.value);\n };\n const _hostWorkCycleHandler = (e) => {\n setHostWorkCycle(e.target.value);\n };\n const _registerHostOpenHandler = (host) => {\n //현재 선택된 host_id 새로 보고자 하는 host_id 같을경우 이미 오픈된 목록을 닫는걸로 생각\n if (selectedHost) {\n if (selectedHost.idx === host.idx) {\n setSelectedHost(null);\n } else {\n setSelectedHost(host);\n }\n } else {\n setSelectedHost(host);\n }\n };\n const _openCategoryModal = (categoryModalType) => {\n dispatch(setModal(\"CategoryModal\"));\n dispatch(setCategoryModalType(categoryModalType));\n };\n const _filterInputsHandler = (e) => {\n const { value, name } = e.target; // 우선 e.target 에서 name 과 value 를 추출\n setFilterInputs({\n ...filterInputs, // 기존의 input 객체를 복사한 뒤\n [name]: value, // name 키를 가진 값을 value 로 설정\n });\n };\n const filterSearch = () => {\n let _result = [...hostList];\n for (let key in filterInputs) {\n // host와 name은 포함검색되어야하기에\n if (key === \"host\" || key === \"name\") {\n _result = _result.filter((item) => {\n return item[key].includes(filterInputs[key]);\n });\n } else {\n if (filterInputs[key] !== \"\") {\n // 빈 값이 filter에 걸리면 값이 걸러지지 않기 때문..\n if (key === \"workCycle\") {\n _result = _result.filter((item) => {\n return item[key] == filterInputs[key];\n });\n } else {\n _result = _result.filter((item) => {\n if (item[key].length === 0) {\n return false;\n } else {\n return item[key][0].CT_NM === filterInputs[key];\n }\n });\n }\n }\n }\n }\n setCurrentHostList(_result);\n };\n const _filterOpenHandler = () => {\n setFilterOpen(!filterOpen);\n };\n\n const excelUpload = (e) => {\n let _excelData = [];\n let input = e.target;\n let reader = new FileReader();\n reader.onload = function () {\n let data = reader.result;\n const excelFile = XLSX.read(data, { type: \"binary\" });\n const sheetName = excelFile.SheetNames[0];\n const firstSheet = excelFile.Sheets[sheetName];\n const jsonData = XLSX.utils.sheet_to_json(firstSheet, { defval: \"\" });\n jsonData.map((item) => {\n // _excelData.push({\n // host: item[\"HOST 도메인\"],\n // country: item[\"HOST 해당 국가\"],\n // lang: item[\"HOST 해당 언어\"],\n // name: item[\"발급 기관 명\"],\n // category: item[\"HOST 정책 분류\"],\n // workCycle: item[\"크롤링 수집주기\"],\n // });\n _excelData.push(item[\"HOST 도메인\"]);\n });\n console.log(_excelData);\n //hostTestUpload(_excelData);\n };\n reader.readAsBinaryString(input.files[0]);\n };\n const excelDownload = () => {\n // 새 엑셀 임시 새 문서 생성\n const book = XLSX.utils.book_new();\n // 값 생성\n let _arr = [\n [\n \"HOST 도메인\",\n \"HOST 해당 언어\",\n \"HOST 해당 국가\",\n \"발급 기관 명\",\n \"HOST 정책 분류\",\n \"크롤링 수집주기\",\n ],\n ];\n hostList.map((item) => {\n _arr.push([\n item.host,\n item.lang,\n item.country,\n item.name,\n item.category,\n item.workCycle,\n ]);\n });\n const _hostArray = XLSX.utils.aoa_to_sheet(_arr);\n // 첫번째 시트에 생성한 데이터를 넣는다.\n XLSX.utils.book_append_sheet(book, _hostArray, \"HOST 목록\");\n // 엑셀파일을 생성하고 저장한다.\n XLSX.writeFile(book, `host_list.xlsx`);\n };\n\n const hostTestUpload = (excel_data) => {\n HostTestApi({ list: excel_data }, \"POST\").then((res) => {\n if (res.status === 200) {\n alert(\"성공적으로 업로드되었습니다\");\n dataFetch();\n }\n });\n };\n\n const eachHostModify = (host) => {\n HostManagementApi({ list: host }, \"POST\").then((res) => {\n if (res.status === 200) {\n alert(\"성공적으로 수정 되었습니다\");\n dataFetch();\n }\n });\n };\n\n const nextrendSync = () => {\n hostSyncApi().then((res) => {\n if (res.status === 200) {\n alert(\"성공적으로 동기화 되었습니다.\");\n dataFetch();\n //testDataFetch();\n }\n });\n };\n const hostRegisterUpload = () => {\n if (selectedHost) {\n if (\n hostPublisher === \"\" ||\n docCountry.length === 0 ||\n docCategory.length === 0 ||\n docLanguage.length === 0 ||\n hostWorkCycle === \"\"\n ) {\n alert(\"모든 값을 채워주세요\");\n return;\n } else if (docCountry.length > 1) {\n alert(\"국가는 하나만 선택 가능합니다.\");\n } else if (docCategory.length > 1) {\n alert(\"정책 분류는 하나만 선택 가능합니다.\");\n } else if (docLanguage.length > 1) {\n alert(\"언어는 하나만 선택 가능합니다.\");\n } else {\n const hostObj = {\n category: docCategory[0].CODE,\n country: docCountry[0].CODE,\n lang: docLanguage[0].CODE,\n name: hostPublisher,\n host: selectedHost.host,\n workCycle: hostWorkCycle,\n };\n eachHostModify([hostObj]);\n }\n } else {\n alert(\"host를 선택해주세요.\");\n }\n };\n\n const testDataFetch = () => {\n trackPromise(\n HostTestApi(null, \"GET\")\n .then((res) => {\n console.log(res.data);\n testDataCleansing(res.data);\n })\n .catch((err) => {\n sessionHandler(err, dispatch).then((res) => {\n HostTestApi(null, \"GET\").then((res) => {\n testDataCleansing(res.data);\n });\n });\n })\n );\n };\n const dataFetch = () => {\n trackPromise(\n HostManagementApi(null, \"GET\")\n .then((res) => {\n dataCleansing(res.data);\n })\n .catch((err) => {\n sessionHandler(err, dispatch).then((res) => {\n HostManagementApi(null, \"GET\").then((res) => {\n dataCleansing(res.data);\n });\n });\n })\n );\n };\n const dataCleansing = (rawData) => {\n const _arr = rawData.map((item) => {\n let _obj = {};\n _obj[\"idx\"] = item.IDX;\n _obj[\"host\"] = item.HOST || \"\";\n _obj[\"lang\"] = item.LANG;\n _obj[\"name\"] = item.NAME || \"\";\n _obj[\"country\"] = item.COUNTRY;\n _obj[\"category\"] = item.CATEGORY;\n _obj[\"workCycle\"] = item.WORK_CYCLE || \"\";\n return _obj;\n });\n setHostList(_arr);\n };\n\n const testDataCleansing = (rawData) => {\n const _arr = rawData.map((item, index) => {\n let _obj = { ...item };\n _obj[\"idx\"] = index;\n _obj[\"test_end\"] = true;\n _obj[\"is_registered\"] =\n hostList.filter((host) => host.host === \"https://www.worldbank.org/\")\n .length === 1;\n return _obj;\n });\n setHostTestList(_arr);\n };\n\n useEffect(() => {\n dataFetch();\n //testDataFetch();\n }, []);\n useEffect(() => {\n setCurrentHostList(hostList);\n }, [hostList]);\n useEffect(() => {\n if (!!selectedHost) {\n console.log(selectedHost);\n setHostPublisher(selectedHost.name);\n setHostWorkCycle(selectedHost.workCycle);\n dispatch(setModalData(selectedHost.category, \"doc_category\")); // 값 세팅\n dispatch(setModalData(selectedHost.country, \"doc_country\")); // 값 세팅\n dispatch(setModalData(selectedHost.lang, \"doc_language\")); // 값 세팅\n }\n }, [selectedHost]);\n return (\n \n \n \n );\n}\nexport default HostManagementContainer;\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport {\n MdUpload,\n MdDownload,\n MdOutlineModeEditOutline,\n MdOutlineDeleteOutline,\n MdOutlineCheck,\n MdClose,\n} from \"react-icons/md\";\nimport { BsTranslate } from \"react-icons/bs\";\n\nimport SearchBar from \"Components/SearchBar\";\nimport { WorkerContentHeader } from \"Components/WorkerContentHeader\";\n\nfunction MultilingualDictionary({\n dataAddOpen,\n dataAddOpenHandler,\n currentWordData,\n editWordIndex,\n editWordData,\n editWordOpen,\n editWordCancel,\n editWordHandler,\n saveWord,\n deleteWord,\n keywordHandler,\n search,\n addWord,\n addWordDataHandler,\n wordDataUpload,\n wordDataDownload,\n}) {\n return (\n \n \n \n \n
\n
\n 검색에 사용할 다국어 단어 정의를 추가해주세요. 검색은 검색어를\n 포함한 결과를 표출합니다.\n
\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 다국어 단어 정의\n 관리\n \n \n \n {currentWordData.map((word, index) => {\n return editWordIndex === word.IDX ? (\n \n \n \n \n \n \n \n \n
\n {\n saveWord(word);\n }}\n >\n \n \n \n
\n \n \n ) : (\n \n \n \n \n {word.MULTI_TEXT}\n \n
\n {\n editWordOpen(word);\n }}\n >\n \n \n {\n deleteWord(word);\n }}\n >\n \n \n
\n \n \n );\n })}\n \n
\n \n \n {dataAddOpen && (\n
\n \n \n
\n )}\n
\n
\n
\n
\n
\n );\n}\n\nconst Wrap = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n min-width: 1024px;\n width: 100%;\n padding: 1.5rem 3rem;\n`;\n\nconst Content = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n\n font-size: 14px;\n`;\n\nconst ShortSearchBar = styled.div`\n width: 500px;\n`;\nconst LineBox = styled.div`\n /* border: solid 1px #d6d6d6;\n border-radius: 4px; */\n background-color: white;\n margin: 1rem;\n border-radius: 4px;\n box-shadow: 0 0 0.875rem 0 rgba(33, 37, 41, 0.05);\n`;\n\nconst ContentContainer = styled(LineBox)`\n width: 100%;\n .content-title {\n border-bottom: 1px solid #d6d6d6;\n padding: 1rem;\n .main-title {\n font-size: 16px;\n font-weight: bold;\n }\n }\n .content-body {\n padding: 1rem;\n }\n`;\n\nconst DictionaryFunctionWrapper = styled.div`\n display: flex;\n justify-content: space-between;\n padding: 1rem;\n`;\nconst DictionaryFunctionBtnWrapper = styled.div`\n display: flex;\n input[type=\"file\"] {\n display: none;\n }\n button,\n label {\n cursor: pointer;\n margin: 0.5rem;\n font-size: 12px;\n display: flex;\n align-items: center;\n background-color: #435269;\n color: white;\n border: solid 1px rgba(0, 0, 0, 0.1);\n border-radius: 4px;\n padding: 0 0.5rem 0 0.5rem;\n }\n`;\nconst DictonaryDataTable = styled.table`\n width: 100%;\n border-collapse: collapse;\n text-align: left;\n th,\n td {\n border-bottom: 1px solid #d6d6d6;\n padding: 10px;\n }\n tr:first-child,\n tr:last-child {\n border: none;\n }\n input[type=\"text\"] {\n width: 100%;\n }\n .sort-btn {\n background-color: white;\n border: none;\n cursor: pointer;\n }\n .actions {\n display: flex;\n align-items: center;\n justify-content: center;\n button {\n height: 2rem;\n width: 2rem;\n margin-left: 0.5rem;\n display: flex;\n align-items: center;\n justify-content: center;\n border: solid 1px rgba(0, 0, 0, 0.1);\n border-radius: 4px;\n cursor: pointer;\n }\n .delete {\n background-color: #b80000;\n color: white;\n }\n .confirm {\n background-color: #435269;\n color: white;\n }\n }\n .setting {\n text-align: center;\n }\n input[type=\"text\"] {\n &:focus {\n outline: none;\n }\n }\n`;\n\nconst DataAddContainer = styled.div`\n display: flex;\n margin: 1rem;\n & * {\n margin-right: 1rem;\n }\n button {\n padding: 0.5rem;\n font-size: 12px;\n background-color: #435269;\n color: white;\n border: solid 1px rgba(0, 0, 0, 0.1);\n border-radius: 4px;\n cursor: pointer;\n }\n input[type=\"text\"] {\n height: 85%;\n min-width: 300px;\n padding-left: 0.5rem;\n &:focus {\n outline: none;\n }\n }\n`;\nexport default MultilingualDictionary;\n","import React, { useState, useEffect } from \"react\";\nimport MultilingualDictionary from \"./MultilingualDictionary\";\nimport { MultilingualDictionaryApi, sessionHandler } from \"../../../Utils/api\";\nimport { trackPromise } from \"react-promise-tracker\";\nimport { useDispatch } from \"react-redux\";\nimport XLSX from \"xlsx\";\nimport { LoadingWrapper } from \"../../../Components/LoadingWrapper\";\nfunction MultilingualDictionaryContainer() {\n const dispatch = useDispatch();\n const [wordData, setWordData] = useState([]); // 단어 데이터\n const [currentWordData, setCurrentWordData] = useState([]); // 현재 보여질 결과\n const [dataAddOpen, setDataAddOpen] = useState(false);\n const [editWordIndex, setEditWordIndex] = useState(-1); // 수정할 다국어 단어의 index\n const [editWordData, setEditWordData] = useState(\"\"); // 수정할 다국어 단어의 data\n const [keyword, setKeyword] = useState(\"\"); // 검색어\n const [addWordData, setAddWordData] = useState(\"\"); // 추가할 데이터\n const dataAddOpenHandler = () => {\n setDataAddOpen(!dataAddOpen);\n };\n const addWordDataHandler = (e) => {\n setAddWordData(e.target.value);\n };\n const addWord = () => {\n if (addWordData === \"\") {\n alert(\"추가할 단어를 입력해주세요\");\n return;\n } else {\n const data = { multi_text: addWordData };\n MultilingualDictionaryApi(data, \"POST\").then((res) => {\n if (res.status === 200) {\n alert(\"성공적으로 등록되었습니다.\");\n dataFetch();\n }\n });\n }\n };\n const editWordOpen = (word) => {\n setEditWordIndex(word.IDX);\n setEditWordData(word.MULTI_TEXT);\n };\n const editWordCancel = () => {\n setEditWordIndex(-1);\n setEditWordData(\"\");\n };\n const editWordHandler = (e) => {\n setEditWordData(e.target.value);\n };\n\n const wordDataUpload = (e) => {\n let _excelData = [];\n let input = e.target;\n let reader = new FileReader();\n reader.onload = function () {\n let data = reader.result;\n const excelFile = XLSX.read(data, { type: \"binary\" });\n const sheetName = excelFile.SheetNames[0];\n const firstSheet = excelFile.Sheets[sheetName];\n const jsonData = XLSX.utils.sheet_to_json(firstSheet, { defval: \"\" });\n jsonData.map((word, index) => {\n _excelData.push({\n multi_text: Object.values(word)\n .slice(1)\n .map((item) => item.split(\", \"))\n .flat(Infinity)\n .filter((item) => item !== \"\")\n .join(\", \"),\n });\n });\n const list = { list: _excelData };\n MultilingualDictionaryApi(list, \"POST\").then((res) => {\n if (res.status === 200) {\n alert(\"성공적으로 등록되었습니다.\");\n dataFetch();\n }\n });\n };\n reader.readAsBinaryString(input.files[0]);\n };\n\n const wordDataDownload = (e) => {\n // 새 엑셀 임시 새 문서 생성\n const book = XLSX.utils.book_new();\n // 값 생성. 언어 구분 없어도 가능.\n let _arr = [\n [\n \"id\",\n \"다국어 유사어, 관련어를 (, )로 구분 또는 셀로 구분하여 입력하세요.\",\n ],\n ];\n wordData.map((item) => {\n _arr.push([item.IDX, ...item.MULTI_TEXT.split(\", \")]);\n });\n const _hostArray = XLSX.utils.aoa_to_sheet(_arr);\n // 첫번째 시트에 생성한 데이터를 넣는다.\n XLSX.utils.book_append_sheet(book, _hostArray, \"다국어 사전 목록\");\n // 엑셀파일을 생성하고 저장한다.\n XLSX.writeFile(book, \"multilingual_dictionary_list.xlsx\");\n };\n const saveWord = (word) => {\n const data = { idx: word.IDX, multi_text: editWordData };\n MultilingualDictionaryApi(data, \"PUT\").then((res) => {\n if (res.status === 200) {\n alert(\"성공적으로 수정되었습니다.\");\n editWordCancel();\n dataFetch();\n }\n });\n };\n const deleteWord = (word) => {\n const data = { idx: word.IDX };\n MultilingualDictionaryApi(data, \"DELETE\").then((res) => {\n if (res.status === 200) {\n alert(\"성공적으로 삭제되었습니다.\");\n dataFetch();\n }\n });\n };\n const keywordHandler = (e) => {\n setKeyword(e.target.value);\n };\n\n const search = () => {\n setCurrentWordData(\n wordData.filter((word) => {\n return word.MULTI_TEXT.includes(keyword);\n })\n );\n };\n\n const dataFetch = () => {\n trackPromise(\n MultilingualDictionaryApi(null, \"GET\")\n .then((res) => {\n setWordData(res.data);\n setCurrentWordData(res.data);\n })\n .catch((err) => {\n sessionHandler(err, dispatch).then((res) => {\n MultilingualDictionaryApi(null, \"GET\").then((res) => {\n setWordData(res.data);\n setCurrentWordData(res.data);\n });\n });\n })\n );\n };\n\n useEffect(() => {\n dataFetch();\n }, []);\n\n useEffect(() => {\n if (currentWordData.length !== 0) {\n setCurrentWordData(\n wordData.filter((word) => {\n return word.MULTI_TEXT.includes(keyword);\n })\n );\n }\n }, [keyword]);\n\n return (\n \n \n \n );\n}\nexport default MultilingualDictionaryContainer;\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { BsRulers } from \"react-icons/bs\";\n\nimport { WorkerContentHeader } from \"Components/WorkerContentHeader\";\nimport { myColors, tailwindColors } from \"styles/colors\";\n\nfunction UserCustomMenu({\n userList,\n currentUserId,\n onClickUser,\n openCategoryModal,\n previewAxisMenu,\n axisCategoryInfo,\n saveUserAxisData,\n}) {\n return (\n \n \n \n \n
\n
사용자 목록
\n
\n 사용자 맞춤형 화면을 생성 또는 수정하시려면 사용자 목록에서\n 사용자를 클릭하세요.\n
\n
\n
\n {userList.map((user, index) => {\n return (\n {\n onClickUser(user.id);\n }}\n >\n
\n
{user.Name}
\n
{user.userID}
\n
\n
\n {user.Company || \"소속 없음\"} /{\" \"}\n {user.Position || \"직책 없음\"}\n
\n \n );\n })}\n
\n
\n \n
\n
사용자 맞춤형 X축 및 Y축 설정
\n
\n 해당 축에 표시할 분류를 선택하세요. 선택한 분류의 하위 분류가 해당\n 축의 메뉴로 표출됩니다. 클릭시 모달창이 뜹니다. X축과 Y축이 동일한\n 카테고리 타입을 가질 수 없습니다.\n
\n
\n
\n \n \n {\n openCategoryModal(\"X\");\n }}\n >\n 주제 1\n \n
\n
\n {axisCategoryInfo.X.name || \"선택없음\"}\n
\n
\n
\n \n {\n openCategoryModal(\"Y\");\n }}\n >\n 주제 2\n \n
\n
\n {axisCategoryInfo.Y.name || \"선택없음\"}\n
\n
\n
\n
\n 저장\n
\n
\n \n
\n
\n
{axisCategoryInfo.X.name ?? \"주제1\"}
\n
\n {previewAxisMenu.X.map((item, index) => (\n
{item.ct_name}
\n ))}\n
\n
\n
\n
{axisCategoryInfo.Y.name ?? \"주제2\"}
\n
\n {previewAxisMenu.Y.map((item, index) => (\n
{item.ct_name}
\n ))}\n
\n
\n
\n
\n 해당 위치에 조건에 맞는 자료가 표출됩니다.\n
\n
\n
\n
\n
\n
\n );\n}\n\nconst Wrap = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n min-width: 1024px;\n width: 100%;\n height: 100%;\n padding: 1.5rem 3rem;\n`;\n\nconst Content = styled.div`\n display: flex;\n align-items: center;\n width: 100%;\n height: 100%;\n font-size: 14px;\n`;\n\nconst PreviewMenuWrapper = styled.div`\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n\n .menu-area {\n border: 1px solid ${tailwindColors[\"grey-200\"]};\n & > * + * {\n .menu-item-container {\n border-top: 1px solid ${tailwindColors[\"grey-200\"]};\n }\n }\n }\n\n .menu-container {\n display: flex;\n align-items: center;\n width: 100%;\n height: 3rem;\n\n & > div:first-of-type {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 140px;\n height: 100%;\n background-color: ${myColors.blue500};\n font-weight: bold;\n color: ${tailwindColors.white};\n }\n\n .menu-item-container {\n flex: 1;\n display: flex;\n align-items: center;\n overflow-x: auto;\n height: 100%;\n\n & > div {\n display: flex;\n align-items: center;\n height: 100%;\n padding: 0 1.5rem;\n :hover {\n background-color: ${tailwindColors[\"grey-100\"]};\n }\n }\n }\n }\n .contents-body {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100%;\n margin-top: 5rem;\n }\n`;\nconst CardWrapper = styled.div`\n margin: 1rem 0.5rem 1rem 0.5rem;\n border-radius: 4px;\n box-shadow: 0 0 0.875rem 0 rgba(33, 37, 41, 0.05);\n background-color: white;\n height: 100%;\n .title {\n font-weight: bold;\n border-bottom: 1px solid #e6e9ed;\n padding: 1rem;\n }\n .title-main {\n font-size: 18px;\n color: rgb(59, 59, 59);\n padding-bottom: 0.25rem;\n }\n .title-sub {\n font-size: 12px;\n color: #939ba2;\n }\n .content {\n padding: 1rem;\n height: 100%;\n }\n`;\n\nconst MenuCustomCard = styled(CardWrapper)`\n width: 80%;\n .content {\n display: flex;\n flex-direction: column;\n gap: 2rem;\n min-height: 35rem;\n }\n`;\nconst SaveButton = styled.button`\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100%;\n padding: 1rem 2rem;\n background-color: ${myColors.green300};\n color: white;\n font-weight: bold;\n\n cursor: pointer;\n`;\nconst UserListCard = styled(CardWrapper)`\n width: 20%;\n .content {\n background-color: #f6f6f6;\n height: 35rem;\n overflow: scroll;\n }\n`;\nconst UserCard = styled.div`\n padding: 0.5rem;\n margin-bottom: 0.5rem;\n border-radius: 4px;\n border-left: ${(props) =>\n props.active ? `solid 5px ${myColors.blue400} ` : null};\n background-color: ${tailwindColors.white};\n box-shadow: 0 0 0.875rem 0 rgba(33, 37, 41, 0.05);\n\n &:hover {\n transform: scale(1.02);\n cursor: pointer;\n }\n .name-and-id {\n width: 100%;\n display: flex;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n .name {\n color: ${(props) =>\n props.active ? myColors.blue400 : tailwindColors[\"grey-600\"]};\n font-weight: bold;\n font-size: 16px;\n margin-right: 1rem;\n }\n .id {\n flex: 1;\n color: #939ba2;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n .company {\n font-size: 12px;\n margin-top: 0.25rem;\n }\n`;\nconst AxisCardWrapper = styled.div`\n display: flex;\n gap: 2rem;\n\n .action {\n margin-left: auto;\n }\n`;\nconst AxisCard = styled.div`\n display: flex;\n .axis-setting {\n cursor: pointer;\n border: none;\n display: flex;\n background-color: ${myColors.blue500};\n color: white;\n font-weight: bold;\n padding: 0.5rem 1rem;\n align-items: center;\n }\n .axis-contents {\n display: flex;\n border: 1px solid #e6e9ed;\n padding: 0.5rem 1rem 0.5rem 1rem;\n align-items: center;\n .category-info {\n color: ${myColors.blue500};\n font-size: 16px;\n font-weight: bold;\n padding: 4px;\n }\n .category-code {\n padding: 4px;\n }\n }\n`;\nexport default UserCustomMenu;\n","import React, { useState, useEffect } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { trackPromise } from \"react-promise-tracker\";\n\nimport { FetchUsersApi, sessionHandler } from \"Utils/api\";\nimport { setModal } from \"Modules/modal\";\nimport {\n setAxisMenuData,\n setEditingAxis,\n setEditingAxisData,\n} from \"Modules/custom\";\nimport { LoadingWrapper } from \"Components/LoadingWrapper\";\nimport {\n getUserCustomMenuByUserId,\n removeUserCustomMenu,\n setUserCustomMenu,\n} from \"services/api/custom\";\n\nimport UserCustomMenu from \"./UserCustomMenu\";\nimport { CATEGORY_TYPE_LIST } from \"Data/category\";\n\nfunction UserCustomMenuContainer() {\n const dispatch = useDispatch();\n const [userList, setUserList] = useState([]);\n const [currentUserId, setCurrentUserId] = useState(null); // 현재 선택된 유저의 id\n const [currentAxis, setCurrentAxis] = useState(\"X\"); // 현재 수정중인 축\n const [existingUserCategories, setExistingUserCategories] = useState({\n X: [],\n Y: [],\n });\n const currentCategory = useSelector(\n (state) => state.modal.modalData.axis_category\n ); // 현재 수정중인 축의 카테고리\n\n const [axisCategoryInfo, setAxisCategoryInfo] = useState({\n X: { name: null },\n Y: { name: null },\n });\n // 선택된 값을 미리 보여주기 위한 state\n const axisMenuData = useSelector((state) => state.axisMenuData);\n const [previewAxisMenu, setPreviewAxisMenu] = useState({ X: [], Y: [] }); // 미리보기용 하위 메뉴\n\n //작업할 축 선택하여 모달열기\n const openCategoryModal = (axis) => {\n setCurrentAxis(axis);\n dispatch(setEditingAxis(axis));\n dispatch(setModal(\"AxisCategoryModal\"));\n };\n\n const onClickUser = (uid) => {\n setCurrentUserId(uid);\n setPreviewAxisMenu({ X: [], Y: [] });\n dispatch(setAxisMenuData(\"X\", []));\n dispatch(setAxisMenuData(\"Y\", []));\n setAxisCategoryInfo({\n X: { name: null },\n Y: { name: null },\n });\n };\n\n const getUserList = () => {\n trackPromise(\n FetchUsersApi()\n .then((res) => {\n const _userList = res.data.filter((user) => {\n return user.Category === \"0\";\n });\n setUserList(_userList);\n })\n .catch((err) => {\n sessionHandler(err, dispatch).then((res) => {\n FetchUsersApi().then((res) => {\n const _userList = res.data.filter((user) => {\n return user.Category === \"0\"; // 일반 사용자만 출력...\n });\n setUserList(_userList);\n });\n });\n })\n );\n };\n\n const getUserCategories = (uid) => {\n trackPromise(\n getUserCustomMenuByUserId(uid).then((res) => {\n const { x_axis, y_axis } = res.data;\n //기존에 등록되어있던 카테고리 저장해놓기\n // 기존거랑 비교해서 추가되는거만 post 하고 없어지는거는 delete 해야되서\n setExistingUserCategories({\n X: x_axis,\n Y: y_axis,\n });\n if (x_axis.length !== 0 && y_axis.length !== 0) {\n setAxisCategoryInfo((prev) => ({\n ...prev,\n X: { name: CATEGORY_TYPE_LIST[x_axis[0].x_type] },\n Y: { name: CATEGORY_TYPE_LIST[x_axis[0].x_type] },\n }));\n\n dispatch(setAxisMenuData(\"X\", x_axis ?? []));\n dispatch(setAxisMenuData(\"Y\", y_axis ?? []));\n\n dispatch(setEditingAxisData(\"X\", x_axis[0].x_type + \"\"));\n dispatch(setEditingAxisData(\"Y\", x_axis[0].x_type + \"\"));\n } else {\n dispatch(setEditingAxisData(\"X\", 0));\n dispatch(setEditingAxisData(\"Y\", 0));\n }\n })\n );\n };\n\n const previewSetting = (axis) => {\n console.log(\"프리뷰세팅 축 : \", axis);\n console.log(\"axisMenuData : \", axisMenuData);\n console.log(`axisMenuData[${axis}]:`, axisMenuData[axis]);\n\n if (axisMenuData[axis].length === 0) return;\n setPreviewAxisMenu((prev) => ({\n ...prev,\n [axis]: axisMenuData[axis],\n }));\n setAxisCategoryInfo((prev) => ({\n ...prev,\n [axis]: {\n name: CATEGORY_TYPE_LIST[axisMenuData[axis][0].x_type],\n },\n }));\n dispatch(setEditingAxis(axis));\n dispatch(setEditingAxisData(axis, axisMenuData[axis][0].x_type));\n };\n\n const saveUserAxisData = () => {\n if (axisMenuData.X.length === 0 || axisMenuData.Y.length === 0) {\n alert(\"X축과 Y축 모두 카테고리를 설정하여야 합니다.\");\n return;\n }\n\n const addCategories = {\n uid: currentUserId,\n };\n\n //기존에 없는거만 추가해야된다\n if (\n existingUserCategories.X.length > 0 &&\n existingUserCategories.Y.length > 0\n ) {\n addCategories.xaxis = axisMenuData.X.map(\n (category) => category.CID\n ).filter(\n (cid) => !existingUserCategories.X.map((v) => v.CID).includes(cid)\n );\n addCategories.yaxis = axisMenuData.Y.map(\n (category) => category.CID\n ).filter(\n (cid) => !existingUserCategories.Y.map((v) => v.CID).includes(cid)\n );\n } else {\n addCategories.xaxis = axisMenuData.X.map((v) => v.CID);\n addCategories.yaxis = axisMenuData.Y.map((v) => v.CID);\n }\n\n // 기존에 없던게 없어졌으면 빼야된다 (idx 배열 담아서 보내기)\n const deleteCategories = [\n ...existingUserCategories.X.filter(\n (existingCategory) =>\n !axisMenuData.X.some((v) => v.CID === existingCategory.CID)\n ).map((v) => v.idx),\n ...existingUserCategories.Y.filter(\n (existingCategory) =>\n !axisMenuData.Y.some((v) => v.CID === existingCategory.CID)\n ).map((v) => v.idx),\n ];\n\n if (addCategories.xaxis.length > 0 || addCategories.yaxis.length > 0) {\n setUserCustomMenu(addCategories).then((res) => {\n alert(\"성공적으로 저장되었습니다.\");\n });\n }\n\n if (deleteCategories.length > 0) {\n removeUserCustomMenu({ idx: deleteCategories });\n }\n location.reload();\n };\n\n useEffect(() => {\n getUserList();\n }, []);\n\n useEffect(() => {\n if (userList.length !== 0) {\n setCurrentUserId(userList[0].id); // 첫번째 사용자를 초기 사용자로 세팅.\n }\n }, [userList]);\n\n useEffect(() => {\n // 현재 사용자가 변경되었을 때\n if (currentUserId !== null) {\n // getAxisMenuUserSetting(currentUserId);\n getUserCategories(currentUserId);\n }\n }, [currentUserId]);\n\n useEffect(() => {\n // 해당 유저의 세팅정보가 없거나 X축 또는 Y축의 세팅 정보가 없을 때\n if (axisMenuData.X === null) {\n setPreviewAxisMenu((prev) => ({ ...prev, X: [] }));\n }\n if (axisMenuData.Y === null) {\n setPreviewAxisMenu((prev) => ({ ...prev, Y: [] }));\n }\n if (axisMenuData.X !== null) {\n previewSetting(\"X\");\n }\n if (axisMenuData.Y !== null) {\n previewSetting(\"Y\");\n }\n }, [axisMenuData]);\n\n return (\n \n \n \n );\n}\n\nexport default UserCustomMenuContainer;\n","import React from \"react\";\nimport { Switch } from \"react-router-dom\";\nimport PrivateRoute from \"routes/PrivateRoute\";\n\nimport ExcelDataRegisterContainer from \"../Manager/ExcelDataRegister/ExcelDataRegisterContainer\";\nimport UserManagementContainer from \"../Manager/UserManagement/UserManagementContainer\";\nimport DashboardContainer from \"./Dashboard/DashboardContainer\";\nimport CategoryManagementContainer from \"./CategoryManagement/CategoryManagementContainer\";\nimport HostManagementContainer from \"./HostManagement/HostManagementContainer\";\nimport MultilingualDictionaryContainer from \"./MultilingualDictionary/MultilingualDictionaryContainer\";\nimport UserCustomMenuContainer from \"./UserCustomMenu/UserCustomMenuContainer\";\nfunction UserSection() {\n return (\n \n \n \n \n \n \n \n \n \n );\n}\n\nexport default UserSection;\n","import React from \"react\";\nimport { Route, Redirect } from \"react-router-dom\";\nimport { useSelector } from \"react-redux\";\n/* \n restricted 는 로그인 한 상태에서는 접근할 수 없는 사이트이며, \n 로그인 상태에서 해당 페이지에 접근하려 하면 메인페이지로 리다이렉트 시킨다.\n*/\nfunction PublicRoute({ component: Component, restricted, ...rest }) {\n\n const isLogin = useSelector((state) => state.login.isLogin);\n const userInfo = useSelector((state) => state.user.user);\n\n return (\n \n isLogin && restricted ? (\n \n ) : (\n \n )\n }\n />\n );\n}\nexport default PublicRoute;\n","import { shallowEqual, useDispatch, useSelector } from \"react-redux\";\nimport styled from \"styled-components\";\nimport { FaBars } from \"react-icons/fa\";\n\nimport { openSidebar } from \"Modules/sidebar\";\nimport { tailwindColors } from \"styles/colors\";\nimport { SideMenuBar } from \"Components\";\n\nexport const WorkerLayout = ({ children }) => {\n const dispatch = useDispatch();\n const sidebarWidth = useSelector((state) => state.sidebar.width);\n const userInfo = useSelector((state) => state.user.user, shallowEqual);\n\n return (\n \n \n \n {children}\n \n );\n};\n\nconst Container = styled.div`\n position: relative;\n`;\n\nconst Button = styled.button`\n position: fixed;\n top: 0.3rem;\n left: 0.3rem;\n z-index: 10;\n padding: 0.5rem;\n color: ${tailwindColors[\"grey-600\"]};\n transition: background-color 0.2s;\n\n &:hover {\n background-color: ${tailwindColors[\"grey-300\"]};\n }\n`;\n\nconst Contents = styled.div`\n display: flex;\n flex-direction: column;\n width: 100%;\n min-height: 100vh;\n padding-left: ${(props) => props.width ?? \"280px\"};\n transition: padding 0.5s;\n`;\n","import Footer from \"Components/Footer\";\nimport Header from \"Components/Header\";\nimport { shallowEqual, useSelector } from \"react-redux\";\nimport styled from \"styled-components\";\n\nexport const UserLayout = ({ children }) => {\n const userInfo = useSelector((state) => state.user.user, shallowEqual);\n return (\n \n
\n \n {children}\n