{"version":3,"sources":["framework/core/hooks/useMenuLoad.js","framework/core/hooks/useBase64.js","framework/core/hooks/useUserInfo.js","framework/core/hooks/useSignIn.js","framework/core/hooks/useCookieData.js","framework/layout/LoginForm.js","framework/components/controls/ISODialog/ModalNoButton.js","framework/layout/passwordChange.js","framework/layout/DefaultLayout/MenuTop.js","framework/layout/DefaultLayout/MenuSide.js","framework/layout/DefaultLayout/Copyrights.js","framework/components/tab/TabHeader.js","framework/core/hooks/usePageRole.js","framework/components/tab/TabPanel.js","framework/core/hooks/usePageInfo.js","framework/components/tab/TabItem.js","framework/components/tab/TabItemList.js","framework/layout/DefaultLayout/index.js","pages/index.js","framework/core/apis/ISOAxios.js","framework/core/reducers/MessageReducer.js","framework/core/reducers/login.js","framework/components/controls/GridContextMenu/index.js","framework/components/controls/ISOCheckBox.js","framework/core/reducers/FavoritMenuReducer.js","framework/core/reducers/MenuReducer.js","framework/components/controls/ISOConfirmDialog.js","framework/core/hooks/useLocalStorage.js","framework/components/controls/ISOAlert.js","pages/MAI/MAI100/MAI115.js","framework/core/reducers/PageRoleReducer.js","framework/core/utils/kanbanApis.js","framework/core/utils/validation.js","framework/components/controls/ISORoleButton.js","framework/components/controls/ISOTextArea.js","pages/COM/AttachFile.js","framework/components/controls/ISODialog/common.js","framework/core/utils/tableGridApis.js","framework/components/controls/ISOGrid.js","framework/components/controls/ISOCombobox.js","framework/components/controls/ISODateTime.js","framework/components/controls/ISOPopup.js","framework/components/controls/ISOTreeGrid.js","framework/components/controls/ISOJqxKanban.js","framework/components/controls/ISOKanban/style.js","framework/components/controls/ISOFile.js","framework/components/controls/ISOTableGrid/ISOTableGrid.js","framework/components/controls/ISOTableGrid/ISOTableGridCell.js","framework/components/controls/ISOButton.js","framework/core/utils/ISOUtils.js","framework/components/controls/ISOInput.js","../src lazy /^/pages.*$/ groupOptions: {} namespace object","framework/components/loaderable/Loader.js","framework/core/utils/SysData.js","framework/core/utils/gridApis.js","framework/core/utils/utils.js","framework/components/controls/ISODialog/ModalOkClose.js","framework/components/controls/ISODialog/ModalOkOnly.js","framework/components/controls/ISODialog/ConfirmDialog.js","framework/components/controls/ISODialog.js","framework/components/loaderable/Loading.js","framework/core/reducers/TabReducer.js","framework/layout/LayerComponents.js","framework/core/hooks/useSessionStorage.js","framework/core/reducers/ResizeReducer.js","framework/core/reducers/index.js","framework/core/reducers/_store.js","App.js","reportWebVitals.js","index.js"],"names":["useMenuLoad","dispathcer","useDispatch","dispatchFavoritMenu","data","dataList","loadSessionStorage","useSessionStorage","localStorageSave","localStorageLoad","localStorageRemove","useLocalStorage","MenuLoad","Flat2Hierarchy4Args","flatMenu","hierarchyMenu","mappedArr","arrElem","mappedElem","i","len","length","MENU_ID","children","hasOwnProperty","PARENT_ID","push","e","MenuSave","async","userId","plantId","params","DataPackage","create","KeyValues","NewKeyValue","response","ISOAxios","Execute","JSON","stringify","JsonData","jsonData","menuList","MenuRemove","menuReset","GetFavoritMenu","SetFavoritMenu","signinUser","PLT_ID","USER_ID","LoadFavoritMenu","RemoveFavoritMenu","dataReset","Flat2Hierarchy","parse","useBase64","CryptoJS","CBC","Pkcs7","saltKey","createPublicKey","crypto","base64Encode","base64","encode","base64Decode","decode","encryption","text","pbkdf2Sync","toString","createHash","update","digest","encryptAES","encrypt","decryptAES","encryptedBase64","decrypted","decrypt","str","Utf8","useUserInfo","getProfile","updateProfile","Values","undefined","Object","keys","map","it","changePassword","oldPass","newPass","useSignIn","saveSessionStorage","clearSessionStorage","setCookie","getCookie","name","value","days","arguments","expires","Date","setDate","getDate","document","cookie","concat","toUTCString","cname","ca","split","c","charAt","substring","indexOf","setCookieAES","getCookieAES","useCookieData","SESSION_EXPIRATION_TERM","parseFloat","process","MenuReload","callback","ret","err","React","useEffect","prevSignInfo","RESULT","expiration","getTime","SignIn","password","isRemember","Division","ISOUtils","ui","showLoading","Login","Token","saveSession","result","resultData","encodeURI","saveLoginInfo","hideLoading","loadLoginInfo","userid","userpw","remember","LoginForm","referDialog115","useRef","title","values","setValues","useState","showPassword","isLoading","userIdRef","ISOInput","passwordRef","rememberCheckRef","ISOCheckBox","buttonRef","ISOButton","onFinish","current","getValue","e3","modal","alert","alertType","Error","disable","_buttonRef$current","message","ErrorMessage","enable","console","log","_jsxs","_Fragment","_jsx","CssBaseline","Container","maxWidth","className","Typography","component","Card","CardMedia","alt","image","CardContent","FormControl","fullWidth","ref","autoFocus","required","error","placeholder","onKeyPress","key","type","InputProps","endAdornment","InputAdornment","position","IconButton","onClick","handleClickShowPassword","Visibility","VisibilityOff","color","label","checked","style","minWidth","textLabel","marginTop","marginLeft","showDialog","MAI115","ModalNoButton","props","onModalClose","Dialog","onClose","open","isOpen","PaperComponent","dialogId","TransitionComponent","Transition","ResizableBox","height","width","ISODialogTitle","id","ISODialogContent","defaultProps","passwordSchema","Yup","OLD_PASS","NEW_PASS","min","max","matches","when","is","val","then","notOneOf","NEW_PASS_CONFIRM","oneOf","ChangePassword","forwardRef","setIsOpen","showPassword1","showPassword2","showPassword3","dispatcher","showMessgaeInfo","show","intput1","intput2","intput3","changePasswordRef","confirmRef","handleMouseDownPassword","event","preventDefault","useImperativeHandle","showChangePassword","padding","handleClickShowPassword1","onMouseDown","handleClickShowPassword2","handleClickShowPassword3","size","onChangePassword","validationSchema","v1","v2","v3","validateSync","strict","abortEarly","msg","replaceAll","errors","buttonAlign","isShow","showFunctionDialog","hideDialog","changeHandle","CircularProgress","thickness","Check","ConfirmDialog","MenuTop","logOutTime","setLogoutTime","parseInt","passwordChange","userInfo","handleClick","changeLanguage","setMenuState","topMenu","items","selectItem","menuTop","userName","decodeURI","USER_NAME","onClickFullScreen","utils","fullScreenMode","role","MENU_NAME","visibility","locale","onChange","handleLogoutClick","MenuSide","selectedTop","sideMenu","setSideMenu","sideMenutTitle","filter","newMenuList","item","favoritMenu","useSelector","state","sideMenuHandle","menuArr","index","ListItem","selected","menuSide","newData","handleLocalClick","ExpandLess","ExpandMore","Collapse","in","timeout","unmountOnExit","SideTabMenuComponent","sidetabmenuSelected","sideTabMenuSelected","target","attributes","SideMenuFavorit","selectedItem","List","SideMenuSearch","float","Checkbox","sideMenuAutoHidden","changeSideMenuAutoHidden","collapsed","memo","idx","Array","isArray","disableGutters","searchMenuList","setSearchMenuList","PROGRAM_PATH","sort","a","b","maxHeight","TextField","defaultValue","newList","match","RegExp","Copyrights","TabHeader","_ref","hideSideMenuClick","selectTab","removeTab","usePageRole","MNU_ID","roles","pageRole","loadButtonRoleData","fetchPageRole","returnData","BTN_TYPE","menuItem","add","addRole","loadRole","checkRole","chk","TabPanel","pageInfo","setPageInfo","tabs","menuIdItem","findMenuItem","tmp","lenght","PRNT_MNU_ID","tabList","activeTab","isActive","menuId","pageTitle","useMemo","usePageInfo","LoadableTabview","contents","displayPath","NAME_PATH","liArray","favActive","setFavActive","k","onMouseUp","PROGRAM_ID","display","Fade","getActPage","f","TabItem","activePage","prevTab","nextTab","onRemoveAllClick","removeAll","TabList","tabData","DefaultLayout","messgaeInfo","tabInfo","dispatch","StorageLoad","topMenuList","_","LEVEL","menuState","siderTimer","hideSideMenu","findMenu","menuid","ISO","Link","to","src","oSiderTimer","window","setTimeout","collapsible","collapsedWidth","OSiderOver","clearTimeout","OSiderOut","handleMenuClick","v","_chkMyData","_chkMyData2","chkMyData","Number","Info","myData","payload","addTab","ModalOkOnly","buttonOkTitle","onModalOkClick","onCloseMessgaeInfo","hide","user","isLoggedIn","axiosRequestConfig","baseURL","headers","responseType","xsrfCookieName","xsrfHeaderName","axiosInstance","axios","init","dataPackage","init1","create1","programid","methodname","ProgramId","MethodName","keyValue","Key","Value","GetParam4Plant","m","GetPlantId","sessionStorage","getItem","SetToken","setItem","GetToken","post","url","jsonCheck","RequestPop","ExecuteAsync","LoginAsync","MESSAGE_SHOW","MESSAGE_HIDE","REDUCER_MESSAGE","initialState","MessageReducer","action","LOGOUT","LOGIN_REQUEST","LOGIN_SUCCESS","LOGIN_FAILURE","REDUCER_LOGIN","login","logout","clearStore","defaultState","fetchingUpdate","loginReducer","GridContextMenu","PureComponent","constructor","contextMenu","createRef","JqxMenu","openMenu","clientX","clientY","scrollTop","scrollY","scrollLeft","scrollX","this","render","_this","exportToCSV","_columns","_source","filename","gridType","columns","source","convertColumns","col","visible","hidden","dataField","dafafield","convertSource","records","forEach","row","datafield","content","startsWith","csvFileContent","join","blob","Blob","navigator","msSaveBlob","URL","createObjectURL","link","createElement","href","setAttribute","download","body","appendChild","click","removeChild","revokeObjectURL","theme","onItemclick","args","mode","autoOpenPopup","super","setState","bind","setValue","disabled","aligne","FormControlLabel","control","icon","CheckBoxOutlineBlankIcon","fontSize","checkedIcon","CheckBoxIcon","labelPlacement","ITEM_LIST","ITEM_RESET","REDUCER_FAVORITMENU","FavoritMenuReducer","REDUCER_MENULIST","MenuReducer","ISOConfirmDialog","close","removeElementReconfirm","divName","conFirmDivName","onConfirmClick","onCloseClick","componentDidMount","onInit","DialogContent","DialogContentText","DialogActions","localStorage","removeItem","StorageSave","ISOAlert","alertDivName","toUpperCase","Alert","severity","validator","validationType","refPlantName","refUser","refSysNm","refRequestDate","ISODateTime","refDeadlineDate","refReqEmail","refReqCall","refObsDesc","ISOTextArea","refReqDate","refReceptionistInfo","_refDeadlineDate$curr","clear","getRecptionistInfo","checkValidate","actionType","_refPlantName$current","_refUser$current","_refReqEmail$current","_refReqCall$current","_refSysNm$current","_refObsDesc$current","_refRequestDate$curre","_refDeadlineDate$curr2","isValid","types","email","phoneWithHyphen","toISOString","Warning","validationAlert","getLabel","param","gridData","onSave","_refPlantName$current2","_refUser$current2","_refReqEmail$current2","_refReqCall$current2","_refSysNm$current2","_refReqDate$current","_refRequestDate$curre2","_refRequestDate$curre3","_refDeadlineDate$curr3","_refDeadlineDate$curr4","_refObsDesc$current2","REQUEST_COM","REQUEST_USER_NM","REQUEST_USER_EMAIL","REQUEST_USER_PHONE","SYS_NM","REQUEST_DATE","OBS_DATE","DEADLINE_DATE","OBS_DESC","successAlert","RequestComponent","styled","span","_templateObject","_taggedTemplateLiteral","readOnly","popperPlacement","colSpan","minRows","maxRows","font","resize","overflow","marginbottom","textAlign","ISORoleButton","marginRight","confirm","ISODialog","onclose","isResizeable","ITEM_ADD","ITEM_REMOVE","REDUCER_PAGEROLE","PageRoleReducer","myObj","deleteKey","reduce","jqxkanbanApi","addColumn","maxItems","iconClassName","column","kanbanApi","addGroup","_ref2","taskIds","number","phone","ip","regex","_len","_key","_component$current","includes","numberValue","test","ex","ButtonType","ADD","APPLY","BARCODEPRINT","CANCEL","COPY","DELETE","EXCEL","INIT","MODIFY","NONE","OK","PRINT","REGISTE","REMOVE","RESET","SAVE","SAVEALL","SEARCH","SETTING","Component","setTextLabel","loadAllowButtoneRoles","find","setRoleCheck","buttonType","other","buttonEnable","Button","variant","connect","errormessage","TextareaAutosize","helperText","getXmlEscapedToOriginal","setLabel","hiddenStyle","colspan","propsTypes","PropTypes","string","oneOfType","bool","func","AttachFile","API_URL","replace","thumbnail","setThumbnail","file","previewURL","selectedFiles","setSelectedFiles","uploadFiles","setUploadFiles","validFiles","setValidFiles","errorMessage","setErrorMessage","attachSeq","uploadedFileCnt","setUploadedFileCnt","uploadedCallbackFunction","setUploadedCallbackFunction","filteredArray","handlePostUpload","req","FormData","append","config","res","handlePostSelect","fileUploadResult","UploadSucceeded","catch","fileSize","Math","floor","pow","toFixed","fileInputRef","removeFile","validFileIndex","findIndex","splice","selectedFileIndex","selectedFileListDBUpdate","attachFileSeqs","j","seq","tempAttachSeq","fileType","responseJson","fileList","path","uploaded","rename","getFileList","getList","saveFileList","cnt","uploadingCnt","handlePostUploadBefore","tempUploadFiles","serverFileName","OriFileName","paramDetail","nameSplit","FileName","RealFileName","clearFileList","files","multiple","reader","FileReader","onloadend","readAsDataURL","toImage","accept","btnVisible","paddingBottom","border","borderRadius","cursor","fixed","top","left","marginBottom","margin","backgroundSize","backgroundPosition","invalid","downloadFile","useStyles","makeStyles","spacing","extendedIcon","handleId","Draggable","handle","cancel","Paper","Slide","direction","withStyles","root","closeButton","right","palette","grey","classes","MuiDialogTitle","disableTypography","CloseIcon","MuiDialogContent","ISODialogActions","leftButton","justifyContent","centerButton","rightButton","alignClass","MuiDialogActions","tableGridApi","RowState","Detached","Unchanged","Added","Deleted","Modified","Total","SubTotal","SelectionMode","Row","Cell","addColumnGroup","align","group","allowEdit","hAlign","vAlign","columnGroup","template","editor","dataType","formatFunction","allowResize","cellsAlign","cellsVerticalAlign","verticalAlign","ISOGrid","grid","JqxGrid","deleteRow","rowid","getrowid","getselectedrowindex","localdata","deleterow","deleteRowByIndex","rowIndex","setColumns","setColumnGroups","colgroup","columnGroups","getRowDataById","getrowdatabyid","getRowData","rowindex","getrowdata","addRow","addedItems","rowItem","DataRow","addItems","r","ary","setDataBinding","addrow","setcolumnproperty","datafiled","property","propertyValue","clearSelection","clearselection","getRows","getrows","selectAllRows","selectallrows","setCellValue","rowBoundIndex","cellValue","setcellvalue","getCellValue","getcellvalue","getCell","getcell","onRowClick","selectedRow","bounddata","rightclick","originalEvent","onRowDoubleClick","onCellBeginEdit","onCellEndEdit","columntype","displayfield","selectRow","unselectRow","getSelectedRow","getSelectedrows","getSelectedRowIndex","addEventListener","datasource","datafields","count","columnCount","isDoneSettingColumn","settingColumnAfter","NO","jqx","dataAdapter","datatype","selectionmode","CHK","selectrow","boundindex","adapter","autoBind","createeditor","jqxDropDownList","displayMember","valueMember","autoDropDownHeight","useynSource","columnType","format","cellsformat","settingColumn","selectedRowIndex","unselectrow","getselectedrowindexes","gridProps","onRowclick","onRowdoubleclick","columngroups","onCellbeginedit","onCellendedit","pageable","autoheight","sortable","altrows","enabletooltips","editable","columnsresize","toolbarheight","statusbarheight","columnsheight","groupsheaderheight","ISOCombobox","getSelectedIndex","selectedValue","getElementByIndex","Select","options","isDisabled","isClearable","clearable","isSearchable","searchable","isMulti","multiable","classNamePrefix","styles","menu","provided","zIndex","MenuProps","anchorOrigin","vertical","horizontal","transformOrigin","getContentAnchorEl","menuPlacement","setSelectedIndex","onReady","defaultSelected","addBlank","jsonResult","unshift","VALUE","LABEL","addSelect","addAll","componentWillMount","codeId","_this$props$defaultSe","subParam1","subParam2","deptType","filterOut","defaultSelectCode","array","changed","bindingSource","isAddAll","isAddBlank","isAddSelect","defaultIndex","registerLocale","ko","minDate","maxDate","startDate","endDate","date","string2Date","dateFormat","aaa","dateToString","getDate2String","fmt","valueOf","d","weekName","$1","getFullYear","lPad","getMonth","getDay","getHours","getMinutes","getSeconds","toLocaleDateString","lo","weekday","year","month","day","getUTCDate","toJSON","setMinDate","stringToDate","setMaxDate","setReadOnly","setStartDate","setEndDate","onOpen","datePicker","setOpen","DatePicker","Content","ISOPopup","actionChildren","onAccept","acceptBtnLabel","closeBtnLabel","handleClose","keepMounted","handleAccept","ISOTreeGrid","treeGrid","rowKey","rowData","rowPosition","parent","_this$treeGrid","_this$treeGrid2","checkRow","rowId","collapseRow","_this$treeGrid3","collapseAll","_this$treeGrid4","destroy","_this$treeGrid5","_this$treeGrid6","expandRow","_this$treeGrid7","expandAll","_this$treeGrid8","JqxTreeGrid","localData","_this$state","_this$state2","_this$state3","checkboxes","autoRowHeight","altRows","selectionMode","columnsResize","statusBarHeight","ISOJqxKanban","div","_templateObject2","_templateObject3","isDragDisabled","isDragging","h3","_templateObject4","_templateObject5","isDraggingOver","ISOTableGridCell","TableCell","columnIndex","scope","others","jqxkanban","kanban","tableGrid","inputProps","autoComplete","multiline","webpackAsyncContext","__webpack_require__","o","Promise","resolve","code","ids","all","slice","module","exports","Loader","createDataPackage","AssemblyName","Namespace","ClassName","SysData","selectAttachFiles","saveAttachInfo","attachGroupSeq","fileInfo","columnOpt","columngroup","cellsrenderer","validation","cellvaluechanging","cellclassname","cellsalign","resizable","draggable","classname","buttonclick","pinned","columngroupOpt","parentgroup","uploadFile","uploadFileCallback","toggleFullScreen","fullscreenElement","exitFullscreen","documentElement","requestFullscreen","xmlStr","loadingDivName","Success","fileAttach","attachFiles","uploadResult","x","FileSize","updateResult","sizeToText","appendProperty","properyName","saveConfirm","deleteConfirm","txtLabel","failureAlert","checkAlert","divTarget","getElementById","unmountComponentAtNode","parentNode","setColumn","opt","threestatecheckbox","jqxComboBox","displayMembuer","setColumnGroup","lpad","s","padLength","padString","rpad","moment","stringDate","toDate","fileToBase64Async","reject","onload","onerror","ModalOkClose","onModalCloseClick","buttonCloseTitle","dialog","setDialog","onOkClick","onCancelClick","closeDialog","getStateValue","Grid","container","cancelLabel","confirmLabel","Loading","pastDelay","TABCOUNT","ADD_TAB","REMOVE_TAB","REMOVE_ALL","SELECT_TAB","PREV_TAB","NEXT_TAB","nextId","tab","Loadable","loader","loading","prevPage","prevPageList","nextPage","tabReducer","isLastPage","button","ResultBoxNoBorder","paddingLeft","paddingRight","OLayer","cssClass","htmlId","OHeader","OSider","cssWidth","cssHideStyle","flex","onMouseEnter","onMouseLeave","OMain","OSearchBox","OResultBox","resultHeight","autoHeight","contentsHeight","querySelector","clientHeight","searchBoxHeight","formBoxHeight","addLayer","addLayerHeight","overflowY","AutoHeightCalculate","OFormBox","ButtonWrap","InputWrap","SearchWrap","isLogoutReducer","isLoginReducer","callLogin","sessionName","seaaionValue","REDUCER_RESIZE","divSize","appReducer","combineReducers","sizeStyle","rootReducer","createStore","reducers","__REDUX_DEVTOOLS_EXTENSION__","createTheme","App","Provider","store","BrowserRouter","basename","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM"],"mappings":"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B,EA0BFjmB,EAASiF,aAAe,CACtBm7B,aAAc,GACd99B,WAAW,EACXgB,MAAO,UACP6X,UAAU,EACV3Y,OAAO,EACPJ,WAAW,EACXi+B,WAAW,EACX59B,YAAa,GACbF,UAAU,EACVgf,UAAU,EACV3e,KAAM,OACNkW,QAAQ,EACR7c,MAAO,GACPiH,QAAS,KACTkH,SAAU,KACV1H,WAAY,KACZujB,aAAc,MAGDjmB,K,sBCjNf,IAAI1E,EAAM,CACT,UAAW,CACV,KAED,WAAY,CACX,KAED,yBAA0B,CACzB,KAED,4BAA6B,CAC5B,KAED,eAAgB,CACf,IACA,GAED,kBAAmB,CAClB,IACA,GAED,yBAA0B,CACzB,IACA,IAED,4BAA6B,CAC5B,IACA,IAED,qBAAsB,CACrB,IACA,IAED,wBAAyB,CACxB,IACA,IAED,4BAA6B,CAC5B,IACA,IAED,+BAAgC,CAC/B,IACA,IAED,4BAA6B,CAC5B,KAED,+BAAgC,CAC/B,KAED,gCAAiC,CAChC,IACA,IAED,mCAAoC,CACnC,IACA,IAED,4BAA6B,CAC5B,IACA,IAED,+BAAgC,CAC/B,IACA,IAED,4BAA6B,CAC5B,IACA,IAED,+BAAgC,CAC/B,IACA,IAED,qBAAsB,CACrB,IACA,GAED,wBAAyB,CACxB,IACA,GAED,4BAA6B,CAC5B,IACA,IAED,+BAAgC,CAC/B,IACA,IAED,4BAA6B,CAC5B,IACA,IAED,+BAAgC,CAC/B,IACA,IAED,4BAA6B,CAC5B,IACA,IAED,+BAAgC,CAC/B,IACA,IAED,4BAA6B,CAC5B,IACA,IAED,+BAAgC,CAC/B,IACA,IAED,4BAA6B,CAC5B,IACA,IAED,+BAAgC,CAC/B,IACA,IAED,qBAAsB,CACrB,IACA,EACA,EACA,IAED,wBAAyB,CACxB,IACA,EACA,EACA,IAED,4BAA6B,CAC5B,IACA,EACA,GAED,+BAAgC,CAC/B,IACA,EACA,GAED,4BAA6B,CAC5B,IACA,EACA,GAED,+BAAgC,CAC/B,IACA,EACA,GAED,qBAAsB,CACrB,IACA,IAED,wBAAyB,CACxB,IACA,IAED,4BAA6B,CAC5B,IACA,IAED,+BAAgC,CAC/B,IACA,IAED,4BAA6B,CAC5B,IACA,IAED,+BAAgC,CAC/B,IACA,IAED,qBAAsB,CACrB,IACA,IAED,wBAAyB,CACxB,IACA,IAED,sCAAuC,CACtC,IACA,IAED,yCAA0C,CACzC,IACA,IAED,iCAAkC,CACjC,IACA,IAED,oCAAqC,CACpC,IACA,IAED,qBAAsB,CACrB,IACA,EACA,GAED,wBAAyB,CACxB,IACA,EACA,GAED,sCAAuC,CACtC,IACA,IAED,yCAA0C,CACzC,IACA,IAED,qBAAsB,CACrB,IACA,IAED,wBAAyB,CACxB,IACA,IAED,sCAAuC,CACtC,IACA,IAED,yCAA0C,CACzC,IACA,IAED,iCAAkC,CACjC,IACA,IAED,oCAAqC,CACpC,IACA,IAED,qBAAsB,CACrB,IACA,IAED,wBAAyB,CACxB,IACA,IAED,qBAAsB,CACrB,IACA,EACA,GAED,wBAAyB,CACxB,IACA,EACA,GAED,sCAAuC,CACtC,IACA,EACA,GAED,yCAA0C,CACzC,IACA,EACA,GAED,qBAAsB,CACrB,IACA,IAED,wBAAyB,CACxB,IACA,IAED,qBAAsB,CACrB,IACA,IAED,wBAAyB,CACxB,IACA,IAED,qBAAsB,CACrB,IACA,IAED,wBAAyB,CACxB,IACA,IAED,+BAAgC,CAC/B,IACA,IAED,kCAAmC,CAClC,IACA,IAED,qBAAsB,CACrB,IACA,IAED,wBAAyB,CACxB,IACA,IAED,+BAAgC,CAC/B,IACA,IAED,kCAAmC,CAClC,IACA,IAED,qBAAsB,CACrB,IACA,EACA,IAED,wBAAyB,CACxB,IACA,EACA,IAED,qBAAsB,CACrB,IACA,IAED,wBAAyB,CACxB,IACA,IAED,qBAAsB,CACrB,IACA,EACA,IAED,wBAAyB,CACxB,IACA,EACA,IAED,qBAAsB,CACrB,IACA,IAED,wBAAyB,CACxB,IACA,IAED,qBAAsB,CACrB,IACA,IAED,wBAAyB,CACxB,IACA,IAED,qBAAsB,CACrB,IACA,IAED,wBAAyB,CACxB,IACA,IAED,qBAAsB,CACrB,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","file":"static/js/main.3c66ec84.chunk.js","sourcesContent":["/* eslint-disable no-prototype-builtins */\r\nimport { useDispatch } from 'react-redux';\r\nimport useLocalStorage from './useLocalStorage';\r\nimport useSessionStorage from './useSessionStorage';\r\nimport ISOAxios, { DataPackage } from '../apis/ISOAxios';\r\nimport { dataList, dataReset } from '../reducers/FavoritMenuReducer';\r\nimport { menuList, menuReset } from '../reducers/MenuReducer';\r\n\r\n/**\r\n * 프로그램 메뉴 정보를 API Server에서 가져온다\r\n * 로컬 스토리지에서 저장, 제거, 읽기를 실행한다.\r\n * 데이타베이스으 복잡한 쿼리 없이 Flat2Hierarchy를 지원\r\n */\r\nexport default function useMenuLoad() {\r\n const dispathcer = useDispatch();\r\n const dispatchFavoritMenu = (data) => dispathcer(dataList(data));\r\n const dispatchFavoritMenuReset = () => dispathcer(dataReset());\r\n const dispatchMenu = (data) => dispathcer(menuList(data));\r\n const dispatchMenuReset = () => dispathcer(menuReset());\r\n const { loadSessionStorage } = useSessionStorage('loginSign');\r\n const { localStorageSave, localStorageLoad, localStorageRemove } = useLocalStorage();\r\n\r\n const MenuSave = async (userId, plantId) => {\r\n let params = DataPackage.create('SGN100', 'GetMenus');\r\n params.KeyValues.push(DataPackage.NewKeyValue('PLT_ID', plantId || ''));\r\n params.KeyValues.push(DataPackage.NewKeyValue('USER_ID', userId));\r\n try {\r\n const response = await ISOAxios.Execute(params);\r\n if (response) {\r\n localStorageRemove('MENU');\r\n localStorageSave('MENU', JSON.stringify(response.JsonData));\r\n const jsonData = response.JsonData;\r\n dispatchMenu(jsonData);\r\n }\r\n return response;\r\n } catch (e) {\r\n return e;\r\n }\r\n };\r\n\r\n const MenuLoad = () => localStorageLoad('MENU');\r\n const MenuRemove = () => {\r\n localStorageRemove('MENU');\r\n dispatchMenuReset();\r\n };\r\n\r\n const Flat2Hierarchy = () => {\r\n const flatMenu = JSON.parse(MenuLoad());\r\n // eslint-disable-next-line no-use-before-define\r\n return Flat2Hierarchy4Args(flatMenu);\r\n };\r\n\r\n const Flat2Hierarchy4Args = (flatMenu) => {\r\n const hierarchyMenu = [];\r\n const mappedArr = {};\r\n let arrElem;\r\n let mappedElem;\r\n try {\r\n for (let i = 0, len = flatMenu.length; i < len; i++) {\r\n arrElem = flatMenu[i];\r\n mappedArr[arrElem.MENU_ID] = arrElem;\r\n mappedArr[arrElem.MENU_ID].children = [];\r\n }\r\n // eslint-disable-next-line no-restricted-syntax\r\n for (const MENU_ID in mappedArr) {\r\n if (mappedArr.hasOwnProperty(MENU_ID)) {\r\n mappedElem = mappedArr[MENU_ID];\r\n if (mappedElem.PARENT_ID) {\r\n try {\r\n mappedArr[mappedElem.PARENT_ID].children.push(mappedElem);\r\n } catch {}\r\n } else {\r\n hierarchyMenu.push(mappedElem);\r\n }\r\n }\r\n }\r\n } catch (e) {\r\n // console.log(e);\r\n }\r\n return hierarchyMenu;\r\n };\r\n\r\n const GetFavoritMenu = async (userId, plantId) => {\r\n let params = DataPackage.create('SGN100', 'GetFavoritMenu');\r\n params.KeyValues.push(DataPackage.NewKeyValue('PLT_ID', plantId || ''));\r\n params.KeyValues.push(DataPackage.NewKeyValue('USER_ID', userId));\r\n try {\r\n const response = await ISOAxios.Execute(params);\r\n if (response) {\r\n localStorageRemove('FAVORITMENU');\r\n localStorageSave('FAVORITMENU', JSON.stringify(response.JsonData));\r\n const jsonData = response.JsonData;\r\n dispatchFavoritMenu(jsonData);\r\n }\r\n return response;\r\n } catch (e) {\r\n return e;\r\n }\r\n };\r\n const SetFavoritMenu = async (MENU_ID) => {\r\n const signinUser = loadSessionStorage();\r\n let params = DataPackage.create('SGN100', 'SetFavoritMenu');\r\n params.KeyValues.push(DataPackage.NewKeyValue('PLT_ID', signinUser.PLT_ID || null));\r\n params.KeyValues.push(DataPackage.NewKeyValue('USER_ID', signinUser.USER_ID));\r\n params.KeyValues.push(DataPackage.NewKeyValue('MENU_ID', MENU_ID));\r\n try {\r\n const response = await ISOAxios.Execute(params);\r\n if (response) {\r\n localStorageRemove('FAVORITMENU');\r\n localStorageSave('FAVORITMENU', JSON.stringify(response.JsonData));\r\n const jsonData = response.JsonData;\r\n dispatchFavoritMenu(jsonData);\r\n }\r\n return response;\r\n } catch (e) {\r\n return e;\r\n }\r\n };\r\n const LoadFavoritMenu = () => localStorageLoad('FAVORITMENU');\r\n const RemoveFavoritMenu = () => {\r\n localStorageRemove('FAVORITMENU');\r\n dispatchFavoritMenuReset();\r\n };\r\n\r\n return {\r\n MenuSave,\r\n MenuLoad,\r\n MenuRemove,\r\n GetFavoritMenu,\r\n SetFavoritMenu,\r\n LoadFavoritMenu,\r\n RemoveFavoritMenu,\r\n Flat2Hierarchy,\r\n Flat2Hierarchy4Args,\r\n };\r\n}\r\n","import crypto from 'crypto';\r\nimport base64 from 'base-64';\r\nimport * as CryptoJS from 'crypto-js';\r\n\r\nexport default function useBase64() {\r\n const cfg = {\r\n mode: CryptoJS.mode.CBC,\r\n padding: CryptoJS.pad.Pkcs7,\r\n };\r\n const saltKey = 'reactISOe3Framework';\r\n const base64Encode = (data) => base64.encode(data);\r\n const base64Decode = (data) => base64.decode(data);\r\n\r\n const encryption = (text) => crypto.pbkdf2Sync(text, saltKey, 1, 64, 'sha512').toString('base64');\r\n const createHash = (text) => crypto.createHash('sha1').update(text).digest('hex');\r\n const createPublicKey = () => crypto.createPublicKey(createPublicKey);\r\n const encryptAES = (text) => CryptoJS.AES.encrypt(text, saltKey).toString();\r\n const decryptAES = (encryptedBase64) => {\r\n const decrypted = CryptoJS.AES.decrypt(encryptedBase64, saltKey);\r\n if (decrypted) {\r\n try {\r\n const str = decrypted.toString(CryptoJS.enc.Utf8);\r\n if (str.length > 0) {\r\n return str;\r\n }\r\n return 'error 1';\r\n } catch (e) {\r\n return 'error 2';\r\n }\r\n }\r\n return 'error 3';\r\n };\r\n\r\n return {\r\n createPublicKey,\r\n base64Encode,\r\n base64Decode,\r\n encryption,\r\n createHash,\r\n encryptAES,\r\n decryptAES,\r\n };\r\n}\r\n\r\nexport function base64En(data) {\r\n return base64.encode(data);\r\n}\r\nexport function base64De(data) {\r\n return base64.decode(data);\r\n}\r\n","/* eslint-disable array-callback-return */\r\n/* eslint-disable func-names */\r\n// import React from 'react';\r\nimport ISOAxios, { DataPackage } from '../apis/ISOAxios';\r\nimport useSessionStorage from './useSessionStorage';\r\nimport useBase64 from './useBase64';\r\n\r\n/**\r\n * 로그인 사용자 정보 확인 및 수정\r\n * 비밀번호 변경\r\n */\r\nexport default function useUserInfo() {\r\n const { loadSessionStorage } = useSessionStorage('loginSign');\r\n const { base64Encode } = useBase64();\r\n const signinUser = loadSessionStorage();\r\n\r\n /**\r\n * 로그인한 사용자정보를 요청한다.\r\n * @param {*} Callback (result, error)\r\n */\r\n const getProfile = async function (userId) {\r\n let params = DataPackage.create('SGN100', 'SelectItem');\r\n params.KeyValues.push(DataPackage.NewKeyValue('USER_ID', userId || signinUser.USER_ID));\r\n try {\r\n const response = await ISOAxios.Execute(params);\r\n return response;\r\n } catch (e) {\r\n return e;\r\n }\r\n };\r\n\r\n /**\r\n * 사용자정보를 수정한다.\r\n * @param {*} Values - Json Object\r\n * @param {*} Callback (result, error)\r\n */\r\n const updateProfile = async function (Values) {\r\n if (Values === undefined || Values === null || JSON.stringify(Values) === '{}') return null;\r\n let params = DataPackage.create('SGN100', 'UpdateItem');\r\n params.KeyValues.push(DataPackage.NewKeyValue('PLT_ID', signinUser.PLT_ID || ''));\r\n params.KeyValues.push(DataPackage.NewKeyValue('USER_ID', signinUser.USER_ID));\r\n try {\r\n Object.keys(Values).map((it) => {\r\n params.KeyValues.push(DataPackage.NewKeyValue(it, Values[it]));\r\n });\r\n const response = await ISOAxios.Execute(params);\r\n return response;\r\n } catch (e) {\r\n return e;\r\n }\r\n };\r\n\r\n /**\r\n * BIZ Procedure PROC_CHANGE_PASSWORD.\r\n * let resultData = ret.JsonData[0];\r\n * Column - RESULT (resultData.RESULT)\r\n * 301 - 이전 비밀번호 오류\r\n * 200 - 정상\r\n * @param {*} oldPass 이전 비밀번호\r\n * @param {*} newPass 새로운 비밀번호\r\n * @param {*} Callback (result, error)\r\n */\r\n const changePassword = async function (oldPass, newPass) {\r\n let params = DataPackage.create('SGN100', 'ChangePassword');\r\n params.KeyValues.push(DataPackage.NewKeyValue('PLT_ID', signinUser.PLT_ID || ''));\r\n params.KeyValues.push(DataPackage.NewKeyValue('USER_ID', signinUser.USER_ID));\r\n params.KeyValues.push(DataPackage.NewKeyValue('OLD_PASS', base64Encode(oldPass)));\r\n params.KeyValues.push(DataPackage.NewKeyValue('NEW_PASS', base64Encode(newPass)));\r\n try {\r\n const response = await ISOAxios.Execute(params);\r\n return response;\r\n } catch (e) {\r\n return e;\r\n }\r\n };\r\n\r\n return {\r\n signinUser,\r\n getProfile,\r\n updateProfile,\r\n changePassword,\r\n };\r\n}\r\n","/* eslint-disable no-return-assign */\r\n/* eslint-disable prefer-arrow-callback */\r\nimport React from 'react';\r\nimport useMenuLoad from './useMenuLoad';\r\nimport useCookieData from './useCookieData';\r\nimport useUserInfo from './useUserInfo';\r\nimport useSessionStorage, { saveSession } from './useSessionStorage';\r\nimport useBase64 from './useBase64';\r\nimport ISOAxios, { DataPackage } from '../apis/ISOAxios';\r\nimport ISOUtils from 'src/framework/core/utils/ISOUtils';\r\n\r\n/** *\r\n * LoginForm에서 사용자 로그인 처리를 담당하는 영역\r\n * API Server와 통신\r\n * 프로그램 Menu 정보 수집\r\n * 쿠키 데이타 처리\r\n * 세션 스토리지에 데이타 처리\r\n * F5를 누를 경우 로그인 정보 확인\r\n */\r\nexport default function useSignIn() {\r\n const { saveSessionStorage, loadSessionStorage, clearSessionStorage } = useSessionStorage('loginSign');\r\n const { MenuSave, MenuLoad, MenuRemove, GetFavoritMenu } = useMenuLoad();\r\n const { setCookie, getCookie } = useCookieData();\r\n const { getProfile } = useUserInfo();\r\n const { base64Encode } = useBase64();\r\n const SESSION_EXPIRATION_TERM = parseFloat(process.env.REACT_APP_SESSION_EXPIRATION_TERM) || 1000 * 60 * 60 * 24;\r\n\r\n const saveLoginInfo = (userId, password, isRemember) => {\r\n if (isRemember) {\r\n setCookie('userid', userId);\r\n if (!process.env.NODE_ENV || process.env.NODE_ENV === 'development') {\r\n setCookie('userpw', password);\r\n }\r\n } else {\r\n setCookie('userid', '', -1);\r\n if (!process.env.NODE_ENV || process.env.NODE_ENV === 'development') {\r\n setCookie('userpw', '', -1);\r\n }\r\n }\r\n setCookie('signIn', userId);\r\n setCookie('remember', isRemember);\r\n };\r\n\r\n const loadLoginInfo = () => {\r\n const ret = { userid: '', userpw: '' };\r\n ret.userid = getCookie('userid');\r\n if (!process.env.NODE_ENV || process.env.NODE_ENV === 'development') {\r\n ret.userpw = getCookie('userpw');\r\n } else {\r\n ret.userpw = '';\r\n }\r\n ret.remember = getCookie('remember');\r\n return ret;\r\n };\r\n\r\n const MenuReload = (userId, plantId, callback) => {\r\n MenuSave(userId, plantId, (ret, err) => {\r\n callback(ret, err);\r\n });\r\n };\r\n\r\n const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));\r\n\r\n const SignIn = async (userId, password, callback, isRemember = false) => {\r\n let params = DataPackage.create('SGN100', 'GetLogin');\r\n params.KeyValues.push(DataPackage.NewKeyValue('username', userId));\r\n params.KeyValues.push(DataPackage.NewKeyValue('password', base64Encode(password)));\r\n params.Division = 'USER';\r\n /**\r\n * Token Service에서 인증 확인\r\n * Token이 존재하면 로그인 과정을 진행한다.\r\n * Token session Storage에 저장을 한다.\r\n * 사용자 정보 가져온 후 메뉴 및 즐겨찾기 메뉴정보를 가져온다.\r\n */\r\n try {\r\n ISOUtils.ui.showLoading();\r\n\r\n const response = await ISOAxios.Login(params);\r\n if (response && response.Token) {\r\n saveSession('Token', response.Token);\r\n let result = await getProfile(userId);\r\n if (result && result.JsonData && JSON.stringify(result.JsonData) !== '[]') {\r\n const resultData = result.JsonData[0];\r\n Object.keys(resultData).map((it) => (resultData[it] = encodeURI(resultData[it])));\r\n const expiration = new Date(new Date().getTime() + SESSION_EXPIRATION_TERM);\r\n resultData.expiration = expiration;\r\n resultData.RESULT = 200;\r\n MenuSave(resultData.USER_ID, ''); // resultData.PLT_ID\r\n GetFavoritMenu(resultData.USER_ID, ''); // resultData.PLT_ID\r\n saveSessionStorage(resultData, true); // 로그인정보 Storage 저장\r\n saveLoginInfo(userId, password, isRemember);\r\n }\r\n }\r\n if (typeof callback === 'function') callback(response, null);\r\n } catch (e) {\r\n if (typeof callback === 'function') callback(null, e);\r\n } finally {\r\n ISOUtils.ui.hideLoading();\r\n }\r\n };\r\n\r\n React.useEffect(() => {\r\n try {\r\n // 이전 로그인 정보 확인 (디버깅 결과 useEffect 보다 먼저 발생함.)\r\n // F5 또는 새로고침을 누른 경우 호출됨\r\n const prevSignInfo = loadSessionStorage();\r\n if (prevSignInfo && prevSignInfo.USER_ID.length > 0 && prevSignInfo.RESULT === 200) {\r\n if (prevSignInfo && prevSignInfo.expiration) {\r\n // console.log(\"f5 refresh load data.....1 : \", );\r\n /// Menu Data Reload\r\n MenuReload(prevSignInfo.USER_ID, ''); // prevSignInfo.PLT_ID\r\n /// Favorit Menu Reload\r\n GetFavoritMenu(prevSignInfo.USER_ID, ''); // prevSignInfo.PLT_ID\r\n // CHECK SESSION_EXPIRATION_TERM\r\n if (new Date(prevSignInfo.expiration) > new Date()) {\r\n const expiration = new Date(new Date().getTime() + SESSION_EXPIRATION_TERM);\r\n prevSignInfo.expiration = expiration;\r\n saveSessionStorage(prevSignInfo, true); // 로그인정보 Storage 저장\r\n } else {\r\n clearSessionStorage(true);\r\n MenuRemove();\r\n }\r\n }\r\n }\r\n } catch (e) {\r\n //\r\n }\r\n }, []);\r\n\r\n return {\r\n SignIn,\r\n MenuReload,\r\n MenuLoad,\r\n MenuRemove,\r\n loadLoginInfo,\r\n saveSessionStorage,\r\n loadSessionStorage,\r\n };\r\n}\r\n","import base64 from 'base-64';\r\nimport useBase64 from './useBase64';\r\n\r\n/**\r\n * 쿠키 데이타 처리\r\n * @param {*} name\r\n */\r\nexport default function useCookieData() {\r\n const { base64Encode, base64Decode, encryptAES, decryptAES } = useBase64();\r\n\r\n const setCookie = (name, value, days = 7) => {\r\n const expires = new Date();\r\n expires.setDate(expires.getDate() + days);\r\n document.cookie = `${name}=${base64Encode(value)}; expires=${expires.toUTCString()}; path=/`;\r\n };\r\n const getCookie = (name) => {\r\n try {\r\n const cname = `${name}=`;\r\n const ca = document.cookie.split(';');\r\n for (let i = 0; i < ca.length; i++) {\r\n let c = ca[i];\r\n while (c.charAt(0) === ' ') {\r\n c = c.substring(1);\r\n }\r\n if (c.indexOf(cname) === 0) {\r\n return base64Decode(c.substring(cname.length, c.length));\r\n }\r\n }\r\n return '';\r\n } catch (e) {\r\n return '';\r\n }\r\n };\r\n\r\n const setCookieAES = (name, value, days = 7) => {\r\n const expires = new Date();\r\n expires.setDate(expires.getDate() + days);\r\n document.cookie = `${name}=${encryptAES(value)}; expires=${expires.toUTCString()}; path=/`;\r\n };\r\n const getCookieAES = (name) => {\r\n try {\r\n const cname = `${name}=`;\r\n const ca = document.cookie.split(';');\r\n for (let i = 0; i < ca.length; i++) {\r\n let c = ca[i];\r\n while (c.charAt(0) === ' ') {\r\n c = c.substring(1);\r\n }\r\n if (c.indexOf(cname) === 0) {\r\n return decryptAES(c.substring(cname.length, c.length));\r\n }\r\n }\r\n return '';\r\n } catch (e) {\r\n return '';\r\n }\r\n };\r\n\r\n return {\r\n base64Encode,\r\n base64Decode,\r\n setCookie,\r\n getCookie,\r\n setCookieAES,\r\n getCookieAES,\r\n };\r\n}\r\n\r\nexport function saveCookie(name, value, days = 7) {\r\n const expires = new Date();\r\n expires.setDate(expires.getDate() + days);\r\n document.cookie = `${name}=${base64.encode(value)}; expires=${expires.toUTCString()}; path=/`;\r\n}\r\nexport function loadCookie(name) {\r\n try {\r\n const cname = `${name}=`;\r\n const ca = document.cookie.split(';');\r\n for (let i = 0; i < ca.length; i++) {\r\n let c = ca[i];\r\n while (c.charAt(0) === ' ') {\r\n c = c.substring(1);\r\n }\r\n if (c.indexOf(cname) === 0) {\r\n return base64.decode(c.substring(cname.length, c.length));\r\n }\r\n }\r\n return '';\r\n } catch (e) {\r\n return '';\r\n }\r\n}\r\n","/* eslint-disable no-alert */\r\nimport React from 'react';\r\nimport CssBaseline from '@material-ui/core/CssBaseline';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Container from '@material-ui/core/Container';\r\nimport Card from '@material-ui/core/Card';\r\nimport CardContent from '@material-ui/core/CardContent';\r\nimport CardMedia from '@material-ui/core/CardMedia';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport InputAdornment from '@material-ui/core/InputAdornment';\r\nimport FormControl from '@material-ui/core/FormControl';\r\nimport Visibility from '@material-ui/icons/Visibility';\r\nimport VisibilityOff from '@material-ui/icons/VisibilityOff';\r\nimport ISOInput from '../components/controls/ISOInput';\r\nimport ISOCheckBox from '../components/controls/ISOCheckBox';\r\nimport ISOButton from '../components/controls/ISOButton';\r\nimport useSignIn from '../core/hooks/useSignIn';\r\nimport { alertType, e3 } from 'src/framework/core/utils/utils';\r\nimport MAI115 from 'src/pages/MAI/MAI100/MAI115';\r\n\r\n/**\r\n * /pages/index 하위 페이지 로그인 페이지 항목을 변경할 경우\r\n */\r\nexport default function LoginForm() {\r\n const referDialog115 = React.useRef();\r\n const title = `${process.env.REACT_APP_COMPANY_NAME} ${process.env.REACT_APP_PROJECT_NAME} Login`; // 로그인 페이지 제목\r\n\r\n // 로그인 및 메뉴 정보 처리\r\n const { SignIn, loadLoginInfo } = useSignIn();\r\n const { userid, userpw, remember } = loadLoginInfo();\r\n const [values, setValues] = React.useState({\r\n showPassword: false,\r\n isLoading: false,\r\n });\r\n const userIdRef = React.useRef(ISOInput);\r\n const passwordRef = React.useRef(ISOInput);\r\n const rememberCheckRef = React.useRef(ISOCheckBox);\r\n const buttonRef = React.useRef(ISOButton);\r\n\r\n const handleValidation = () => {\r\n if (!userIdRef.current.getValue()) {\r\n e3.modal.alert(alertType.Error, '사용자 계정 정보를 입력하세요!');\r\n return false;\r\n }\r\n if (!passwordRef.current.getValue()) {\r\n e3.modal.alert(alertType.Error, '비밀번호를 입력하세요!');\r\n return false;\r\n }\r\n return true;\r\n };\r\n \r\n const onFinish = async () => {\r\n if (handleValidation()) {\r\n setValues({ ...values, isLoading: true });\r\n buttonRef.current.disable();\r\n SignIn(\r\n userIdRef.current.getValue(),\r\n passwordRef.current.getValue(),\r\n (ret, err) => {\r\n try {\r\n if (err) {\r\n if (typeof err === 'string') {\r\n e3.modal.alert(alertType.Error, err);\r\n } else {\r\n e3.modal.alert(alertType.Error, err.message);\r\n }\r\n setValues({ ...values, isLoading: false });\r\n }\r\n if (ret && ret.ErrorMessage && ret.ErrorMessage.length > 0) {\r\n e3.modal.alert(alertType.Error, ret.ErrorMessage);\r\n }\r\n buttonRef.current?.enable();\r\n } catch (e) {\r\n console.log(e);\r\n }\r\n },\r\n rememberCheckRef.current.getValue(),\r\n );\r\n }\r\n };\r\n const handleClickShowPassword = () => {\r\n setValues({ ...values, showPassword: !values.showPassword });\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n {\r\n if (e.key === 'Enter') {\r\n await onFinish();\r\n }\r\n }}\r\n />\r\n 0 ? true : false }\r\n required={true}\r\n error={true}\r\n aria-describedby=\"password-error-text\"\r\n placeholder=\"비밀번호\"\r\n value={userpw}\r\n onKeyPress={async (e) => {\r\n if (e.key === 'Enter') {\r\n await onFinish();\r\n }\r\n }}\r\n InputProps={{\r\n endAdornment: (\r\n \r\n \r\n {values.showPassword ? : }\r\n \r\n \r\n ),\r\n }}\r\n />\r\n
\r\n
\r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n {referDialog115.current.showDialog()}} />\r\n \r\n \r\n
\r\n\r\n
\r\n Copyright ⓒ {process.env.REACT_APP_COPYRIGHTS_YEAR} {process.env.REACT_APP_COMPANY_NAME}. All rights\r\n reserved.\r\n
\r\n
\r\n
\r\n
\r\n \r\n );\r\n}\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport { ResizableBox } from 'react-resizable';\r\nimport { PaperComponent, Transition, ISODialogTitle, ISODialogContent } from './common';\r\n\r\n/**\r\n * content body style class :: dialog-content-body\r\n * Title과 Actions의 사이즈의 변경이 있으면 스타일 시트도 변경이 필요합니다.\r\n * 현재 Title 64px, Actions 62px Default 값입니다.\r\n * @param {*} props\r\n * isOpen: PropTypes.bool,\r\n * title: PropTypes.string,\r\n * children: PropTypes.any,\r\n * onModalCloseClick: PropTypes.func.isRequired,\r\n * width: PropTypes.number,\r\n * height: PropTypes.number,\r\n * dialogId: PropTypes.string\r\n */\r\nfunction ModalNoButton(props) {\r\n const { onModalClose } = props;\r\n return (\r\n
\r\n \r\n \r\n
\r\n \r\n {props.title}\r\n \r\n \r\n
{props.children}
\r\n
\r\n
\r\n
\r\n \r\n
\r\n );\r\n}\r\nModalNoButton.propTypes = {\r\n isOpen: PropTypes.bool,\r\n title: PropTypes.string,\r\n children: PropTypes.any,\r\n onModalClose: PropTypes.func.isRequired,\r\n width: PropTypes.number,\r\n height: PropTypes.number,\r\n dialogId: PropTypes.string,\r\n};\r\nModalNoButton.defaultProps = {\r\n isOpen: false,\r\n width: 600,\r\n height: 400,\r\n dialogId: 'draggable-dialog-nobutton',\r\n};\r\n\r\nexport default ModalNoButton;\r\n","import React from 'react';\r\nimport { useDispatch } from 'react-redux';\r\nimport * as Yup from 'yup';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport InputAdornment from '@material-ui/core/InputAdornment';\r\nimport Visibility from '@material-ui/icons/Visibility';\r\nimport VisibilityOff from '@material-ui/icons/VisibilityOff';\r\nimport Check from '@material-ui/icons/Check';\r\nimport CircularProgress from '@material-ui/core/CircularProgress';\r\nimport useUserInfo from '../core/hooks/useUserInfo';\r\nimport { ConfirmDialog } from '../components/controls/ISODialog';\r\nimport ModalNoButton from 'src/framework/components/controls/ISODialog/ModalNoButton';\r\nimport { show } from '../core/reducers/MessageReducer';\r\nimport ISOInput from '../components/controls/ISOInput';\r\nimport ISOButton from '../components/controls/ISOButton';\r\n\r\nconst passwordSchema = Yup.object({\r\n OLD_PASS: Yup.string().required('이전 비밀번호는 필수 입력값 입니다.'),\r\n NEW_PASS: Yup.string()\r\n .min(8, '최소 8자리까지 입니다.')\r\n .max(32, '최대 32자리까지 입니다.')\r\n .required('신규 비밀번호는 필수 입력값 입니다.')\r\n .matches(\r\n /^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)[A-Za-z\\d$@$!%*#?&]/,\r\n '하나 이상의 대문자, 소문자, 숫자의 조합이 필요합니다.(8~32)',\r\n )\r\n .when('OLD_PASS', {\r\n is: (val) => (val && val.length) > 0,\r\n then: Yup.string().notOneOf([Yup.ref('OLD_PASS')], '이전 비밀번호와 동일합니다.'),\r\n }),\r\n NEW_PASS_CONFIRM: Yup.string().when('NEW_PASS', {\r\n is: (val) => (val && val.length) > 0,\r\n then: Yup.string().oneOf([Yup.ref('NEW_PASS')], '비밀번호 확인이 일치하지 않습니다.'),\r\n }),\r\n});\r\n\r\nconst ChangePassword = React.forwardRef((props, ref) => {\r\n const [isOpen, setIsOpen] = React.useState(false);\r\n const [values, setValues] = React.useState({\r\n showPassword1: false,\r\n showPassword2: false,\r\n showPassword3: false,\r\n isLoading: false,\r\n });\r\n const { changePassword } = useUserInfo();\r\n const dispatcher = useDispatch();\r\n const showMessgaeInfo = (data) => dispatcher(show(data));\r\n const intput1 = React.useRef(ISOInput);\r\n const intput2 = React.useRef(ISOInput);\r\n const intput3 = React.useRef(ISOInput);\r\n const changePasswordRef = React.useRef(ISOButton);\r\n const confirmRef = React.useRef();\r\n\r\n const validationSchema = () => {\r\n const v1 = intput1.current.getValue();\r\n const v2 = intput2.current.getValue();\r\n const v3 = intput3.current.getValue();\r\n try {\r\n passwordSchema.validateSync(\r\n { OLD_PASS: v1, NEW_PASS: v2, NEW_PASS_CONFIRM: v3 },\r\n {\r\n strict: false,\r\n abortEarly: false,\r\n },\r\n );\r\n return true;\r\n } catch (e) {\r\n let msg = null;\r\n if (typeof e === 'string') msg = e.replaceAll('ValidationError: ', '');\r\n else msg = e.errors[0];\r\n showMessgaeInfo({\r\n title: '비밀번호 변경 실패',\r\n message: msg,\r\n width: 450,\r\n height: 200,\r\n buttonAlign: 'center',\r\n isShow: true,\r\n type: 'Normal',\r\n });\r\n return false;\r\n }\r\n };\r\n\r\n const onModalClose = () => {\r\n setIsOpen(false);\r\n };\r\n\r\n const changeHandle = async () => {\r\n const oldPass = intput1.current.getValue();\r\n const newPass = intput2.current.getValue();\r\n const ret = await changePassword(oldPass, newPass);\r\n if (ret && ret.JsonData && JSON.stringify(ret.JsonData) !== '[]') {\r\n const chk = ret.JsonData[0];\r\n if (chk.RESULT === 200) {\r\n onModalClose();\r\n showMessgaeInfo({\r\n title: '비밀번호 변경 성공',\r\n message: '비밀번호를 변경하였습니다.!',\r\n width: 400,\r\n height: 200,\r\n buttonAlign: 'center',\r\n isShow: true,\r\n type: 'Normal',\r\n });\r\n } else {\r\n showMessgaeInfo({\r\n title: '비밀번호 변경 실패',\r\n message: '비밀번호를 변경을 실패하였습니다.!',\r\n width: 400,\r\n height: 200,\r\n buttonAlign: 'center',\r\n isShow: true,\r\n type: 'Normal',\r\n });\r\n setValues({ ...values, isLoading: false });\r\n changePasswordRef.current.enable();\r\n }\r\n }\r\n };\r\n const onChangePassword = () => {\r\n if (validationSchema() === true) {\r\n confirmRef.current.showFunctionDialog('비밀번호를 변경하시겠습니까?', () => {\r\n confirmRef.current.hideDialog();\r\n setValues({ ...values, isLoading: true });\r\n changePasswordRef.current.disable();\r\n changeHandle();\r\n });\r\n }\r\n };\r\n const handleClickShowPassword1 = () => {\r\n setValues({ ...values, showPassword1: !values.showPassword1 });\r\n };\r\n const handleClickShowPassword2 = () => {\r\n setValues({ ...values, showPassword2: !values.showPassword2 });\r\n };\r\n const handleClickShowPassword3 = () => {\r\n setValues({ ...values, showPassword3: !values.showPassword3 });\r\n };\r\n const handleMouseDownPassword = (event) => {\r\n event.preventDefault(); // 화면 갱신 방지\r\n };\r\n\r\n React.useImperativeHandle(ref, () => ({\r\n showChangePassword() {\r\n setIsOpen(true);\r\n },\r\n }));\r\n\r\n // TODO: ModalNoButton -> ISODialog.ConfirmDialog 로 대체\r\n // TODO: ConfirmDialog -> e3.modal.confirm 이용\r\n return (\r\n <>\r\n \r\n
\r\n
\r\n \r\n \r\n {values.showPassword1 ? : }\r\n \r\n \r\n ),\r\n }}\r\n />\r\n
\r\n
\r\n \r\n \r\n {values.showPassword2 ? : }\r\n \r\n \r\n ),\r\n }}\r\n />\r\n
\r\n
\r\n \r\n \r\n {values.showPassword3 ? : }\r\n \r\n \r\n ),\r\n }}\r\n />\r\n
\r\n \r\n ※ 허용 특수문자 : "!", "@", "#", "$", "%", "&",\r\n "*", "?"\r\n \r\n\r\n
\r\n \r\n {values.isLoading ? : }\r\n 비밀번호 변경\r\n \r\n \r\n {' '}\r\n 닫기{' '}\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n );\r\n});\r\n\r\nexport default ChangePassword;\r\n","import React, { useEffect, useState, useRef } from 'react';\r\nimport useSessionStorage from 'src/framework/core/hooks/useSessionStorage';\r\nimport ChangePassword from '../passwordChange';\r\nimport * as utils from 'src/framework/core/utils/utils';\r\n/**\r\n// DB에서 가져온 Menu정보를 LocalStore에 저장하고 LocalStore에서 정보를 읽어온다.\r\n// LVL == 1 이면 Root(/) Home\r\n// LVL == 2 이면 Top Menu 출력하는 1차 메뉴정보이다.\r\n*/\r\nexport default function MenuTop(props) {\r\n const [logOutTime, setLogoutTime] = useState(parseInt(process.env.REACT_APP_SESSION_SECOND));\r\n const { loadSessionStorage, clearSessionStorage } = useSessionStorage('loginSign');\r\n const passwordChange = useRef();\r\n const userInfo = loadSessionStorage();\r\n\r\n const { handleClick, changeLanguage, values, setMenuState } = props;\r\n const topMenu = props.items;\r\n const selectItem = values.menuTop;\r\n const userName =\r\n userInfo && userInfo.USER_ID ? `${decodeURI(userInfo.USER_NAME)}(${userInfo.USER_ID})` : '방문자(****)';\r\n\r\n const handleLogoutClick = () => {\r\n clearSessionStorage(true);\r\n // window.document.location.reload();\r\n };\r\n\r\n const onChangePassword = () => {\r\n passwordChange.current.showChangePassword();\r\n };\r\n\r\n const onClickFullScreen = () => {\r\n if (utils.toggleFullScreen() === true) {\r\n setMenuState({\r\n ...values,\r\n fullScreenMode: true,\r\n });\r\n } else {\r\n setMenuState({\r\n ...values,\r\n fullScreenMode: false,\r\n });\r\n }\r\n };\r\n\r\n const onInitLogOutTime = () => {\r\n setLogoutTime(parseInt(process.env.REACT_APP_SESSION_SECOND));\r\n };\r\n\r\n /**\r\n * 초 -> 시간 변환\r\n * @param time\r\n * @returns {string}\r\n */\r\n const timeFormat = (time) => {\r\n let hour = 0;\r\n let min = 0;\r\n let sec = 0;\r\n\r\n if (time > 0) {\r\n min = parseInt(time / 60);\r\n sec = time % 60;\r\n\r\n if (min > 60) {\r\n hour = parseInt(min / 60);\r\n min %= 60;\r\n }\r\n\r\n if (sec < 10) sec = `0${sec}`;\r\n if (min < 10) min = `0${min}`;\r\n\r\n return `${hour}:${min}:${sec}`;\r\n }\r\n };\r\n\r\n /**\r\n * body event 추가\r\n */\r\n // useEffect(() => {\r\n // document.body.addEventListener('click', onInitLogOutTime);\r\n // return () => { window.removeEventListener('click', onInitLogOutTime); };\r\n // }, []);\r\n\r\n /**\r\n * 로그아웃 시간 처리\r\n */\r\n // useEffect(() => {\r\n // const countdown = setInterval(() => {\r\n // if (logOutTime > 0) {\r\n // setLogoutTime(logOutTime - 1);\r\n // } else {\r\n // handleLogoutClick();\r\n // }\r\n // }, 1000);\r\n // return () => { clearInterval(countdown); };\r\n // }, [logOutTime]);\r\n\r\n return (\r\n <>\r\n
    \r\n {topMenu.map((it) =>\r\n selectItem === it.MENU_ID ? (\r\n \r\n {it.MENU_NAME}\r\n \r\n ) : (\r\n
  • \r\n {it.MENU_NAME}\r\n
  • \r\n ),\r\n )}\r\n
\r\n\r\n
\r\n \r\n
\r\n\r\n
\r\n {/* {timeFormat(logOutTime)} */}\r\n {userName}\r\n \r\n {/* full/origin 버튼 */}\r\n {values.fullScreenMode === false ? (\r\n \r\n ) : (\r\n \r\n )}\r\n
\r\n
\r\n \r\n
\r\n \r\n );\r\n}\r\n","import React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { List, ListItem, Collapse } from '@material-ui/core';\r\nimport { ExpandLess, ExpandMore } from '@material-ui/icons';\r\nimport TextField from '@material-ui/core/TextField';\r\nimport Checkbox from '@material-ui/core/Checkbox';\r\nimport _ from 'lodash';\r\nimport useMenuLoad from 'src/framework/core/hooks/useMenuLoad';\r\n\r\nconst MenuSide = (props) => {\r\n const { values, setMenuState, handleClick } = props;\r\n const selectedTop = values.menuTop;\r\n const menuList = props.items;\r\n const [sideMenu, setSideMenu] = React.useState({}); // 3 level 메뉴가 있을 경우 사용\r\n // const sideMenuList = _.filter(menuList, function (item) { return (item.MNU_ID.substring(0,4) === selectedTop.substring(0,4)) > 0 && item.LVL > 2;});\r\n const sideMenutTitle = menuList.filter((it) => it.MENU_ID === selectedTop);\r\n const newMenuList = useMenuLoad()\r\n .Flat2Hierarchy4Args(menuList)\r\n .filter((item) => item.MENU_ID === selectedTop);\r\n const favoritMenu = useSelector((state) => state.favoritMenu).dataList;\r\n // const favoritMenu2 = useMenuLoad().LoadFavoritMenu();\r\n // if(Array.isArray(favoritMenu) && favoritMenu.length > 0) favoritMenu.map((item, index)=>(console.log(index, item)))\r\n\r\n const handleLocalClick = (item) => {\r\n const newData = { ...sideMenu, [item]: !sideMenu[item] };\r\n setSideMenu(newData);\r\n };\r\n const onClickSideTab = (e) => {\r\n setMenuState({\r\n ...values,\r\n sideTabMenuSelected: e.target.attributes.data.value, // 사이드 메뉴 상단 탭 설정\r\n });\r\n };\r\n const changeSideMenuAutoHidden = () => {\r\n setMenuState({\r\n ...values,\r\n sideMenuAutoHidden: !values.sideMenuAutoHidden, // 자동 숨김 설정 여부\r\n collapsed: !values.sideMenuAutoHidden, // 자동 숨김 설정에 따라 사이드 메뉴 숨김/표시\r\n });\r\n };\r\n // material-ui를 이용한 측면 메뉴 생성 함수 (측면 메뉴 콤포넌트)\r\n const sideMenuHandle = (menuArr, handleClick) => {\r\n if (menuArr && menuArr.children && menuArr.children.length > 0) {\r\n return menuArr.children.map((item, index) => {\r\n if (!item.children || item.children.length === 0) {\r\n return (\r\n handleClick(e, item.MENU_ID)}\r\n >\r\n {item.MENU_NAME}\r\n \r\n );\r\n }\r\n return (\r\n
\r\n handleLocalClick(item.MENU_ID)}\r\n >\r\n {item.MENU_NAME} {sideMenu[item.MENU_ID] ? : }\r\n \r\n \r\n {sideMenuHandle(item, handleClick)}\r\n \r\n
\r\n );\r\n });\r\n }\r\n return null;\r\n };\r\n\r\n // useEffect(() => {\r\n // console.log('컴포넌트가 화면에 나타남', selectedTop);\r\n // return () => {\r\n // console.log('컴포넌트가 화면에서 사라짐', selectedTop);\r\n // };\r\n // }, [selectedTop]);\r\n\r\n return (\r\n <>\r\n
\r\n
\r\n
    \r\n \r\n
\r\n
\r\n {values.sideTabMenuSelected === 'sideTabMenu10' ? (\r\n
\r\n

\r\n 즐겨찾기\r\n {/* */}\r\n

\r\n
\r\n \r\n
\r\n
\r\n ) : values.sideTabMenuSelected === 'sideTabMenu20' ? (\r\n
\r\n

\r\n {sideMenutTitle && sideMenutTitle.length > 0 ? sideMenutTitle[0].MENU_NAME : ''}\r\n {/* */}\r\n

\r\n {sideMenuHandle(newMenuList[0], handleClick)}\r\n
\r\n ) : (\r\n
\r\n

\r\n 메뉴 검색\r\n {/* */}\r\n

\r\n
\r\n \r\n
\r\n
\r\n )}\r\n\r\n
\r\n
메뉴 자동감추기
\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\nMenuSide.defaultProps = {\r\n item: 'A0100000000',\r\n};\r\n\r\n/**\r\n * 즐겨찾기, 2단메뉴, 메뉴 검색을 선택하는 탭메뉴 콤포넌트\r\n */\r\nconst SideTabMenuComponent = React.memo((props) => {\r\n const { sidetabmenuSelected, onClick } = props;\r\n const sideTabMenuLinks = [\r\n { idx: 1, key: 'sideTabMenu10', name: '즐겨찾기' },\r\n { idx: 2, key: 'sideTabMenu20', name: '메뉴' },\r\n { idx: 3, key: 'sideTabMenu30', name: '메뉴 검색' },\r\n ];\r\n return (\r\n <>\r\n {sideTabMenuLinks.map((item) =>\r\n sidetabmenuSelected === item.key ? (\r\n
  • \r\n {item.name}\r\n
  • \r\n ) : (\r\n
  • \r\n {item.name}\r\n
  • \r\n ),\r\n )}\r\n \r\n );\r\n});\r\n\r\n/**\r\n * 즐겨찾기 측면 메뉴 콤포넌트\r\n */\r\nconst SideMenuFavorit = React.memo((props) => {\r\n const { favoritMenu, onClick, selectedItem } = props;\r\n return (\r\n \r\n {Array.isArray(favoritMenu) && favoritMenu.length > 0\r\n ? favoritMenu.map((item) => (\r\n onClick(e, item.MENU_ID)}\r\n >\r\n {item.MENU_NAME}\r\n \r\n ))\r\n : ''}\r\n \r\n );\r\n});\r\n\r\n/**\r\n * 메뉴 검색 측면메뉴 콤포넌트\r\n */\r\nconst SideMenuSearch = React.memo((props) => {\r\n const { menuList, onClick } = props;\r\n const [searchMenuList, setSearchMenuList] = React.useState('[]'); // 검색 설정 값을 태에서 한정됨. 유지를 위할 경우 상위 콤포넌트로 이동 필요.\r\n\r\n React.useEffect(() => {\r\n setSearchMenuList(\r\n menuList\r\n .filter((item) => item.PROGRAM_PATH && item.PROGRAM_PATH.length > 1)\r\n .sort((a, b) => (a.MENU_NAME < b.MENU_NAME ? -1 : a.MENU_NAME > b.MENU_NAME ? 1 : 0)),\r\n );\r\n }, []);\r\n\r\n const onChange = (e) => {\r\n try {\r\n let newList = [];\r\n newList = menuList\r\n .filter((item) => item.PROGRAM_PATH && item.PROGRAM_PATH.length > 1)\r\n .filter((item) => item.MENU_NAME.match(new RegExp(e.target.value, 'i')))\r\n .sort((a, b) => (a.MENU_NAME < b.MENU_NAME ? -1 : a.MENU_NAME > b.MENU_NAME ? 1 : 0));\r\n if (newList && JSON.stringify(newList) !== '[]') {\r\n setSearchMenuList(newList);\r\n }\r\n } catch (e) {\r\n // console.log('onChange -> newList', e);\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n
    \r\n \r\n \r\n {Array.isArray(searchMenuList) && searchMenuList.length > 0\r\n ? searchMenuList.map((item) => (\r\n onClick(e, item.MENU_ID)}\r\n >\r\n {item.MENU_NAME}\r\n \r\n ))\r\n : ''}\r\n \r\n
    \r\n \r\n );\r\n});\r\n\r\nexport default MenuSide;\r\n","import React from 'react';\r\n/**\r\n * 레이아뭇 하단의 카피라이트 정보 출력하는 콤포넌트\r\n * @returns 콤포넌트\r\n */\r\nexport default function Copyrights() {\r\n return (\r\n
    \r\n
    Copyright ⓒ {process.env.REACT_APP_COPYRIGHTS_YEAR} {process.env.REACT_APP_COMPANY_NAME}. All rights reserved.​
    \r\n

    Ver. {process.env.REACT_APP_VERSION}

    \r\n
    \r\n );\r\n}\r\n","import React from 'react';\r\nimport { useDispatch } from 'react-redux';\r\nimport { removeTab, selectTab } from 'src/framework/core/reducers/TabReducer';\r\n\r\nfunction TabHeader({ item, hideSideMenuClick }) {\r\n const dispatcher = useDispatch();\r\n const onClosed = (id) => dispatcher(removeTab(item.id));\r\n const dispacherSelect = (id) => dispatcher(selectTab(item.id));\r\n\r\n const onClose = (e) => {\r\n onClosed(e.target.value);\r\n hideSideMenuClick();\r\n };\r\n\r\n const labelClick = (e) => {\r\n dispacherSelect(e.target.value);\r\n hideSideMenuClick();\r\n };\r\n\r\n return (\r\n <>\r\n \r\n {item.id === 0 ? null : (\r\n \r\n )}\r\n \r\n );\r\n}\r\n\r\nexport default TabHeader;\r\n","import React from 'react'; // useLayoutEffect\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport ISOAxios, { DataPackage } from '../apis/ISOAxios';\r\nimport { add } from '../reducers/PageRoleReducer';\r\n\r\n/**\r\n * 프로그램 페이지에 접근 가능한지 여부 및 CRUD를 확인한다.\r\n * @param {*} MNU_ID\r\n */\r\nexport default function usePageRole(MNU_ID) {\r\n const dispatcher = useDispatch();\r\n const roles = useSelector((state) => state.pageRole.roles);\r\n const addRole = async (item) => dispatcher(add(item));\r\n let pageRole = null;\r\n\r\n /**\r\n * 내부에 memoize 사용\r\n * 인증 설정 영역의 데이타 규격 확인 :: BIZ SYS050.SelectItem\r\n * 메뉴 로드 중에 권한 정보를 포함한다면 API 호출 없이 권한 확인\r\n * @param {*} callback\r\n */\r\n const fetchPageRole = async (callback) => {\r\n let params = DataPackage.create('SYS050', 'SelectItem');\r\n // params.KeyValues.push(DataPackage.NewKeyValue('PLT_ID', userInfo.user.PLT_ID || ''));\r\n params.KeyValues.push(DataPackage.NewKeyValue('MENU_ID', MNU_ID));\r\n try {\r\n const response = await ISOAxios.Execute(params);\r\n if (response) {\r\n if (typeof callback === 'function') callback(response, null);\r\n }\r\n } catch (e) {\r\n if (typeof callback === 'function') callback(null, e);\r\n }\r\n };\r\n\r\n /**\r\n * API Server에 해당 정보를 전송하여 확인 한다.\r\n */\r\n const loadButtonRoleData = async () => {\r\n await fetchPageRole((ret, err) => {\r\n if (err) {\r\n //\r\n } else {\r\n try {\r\n const returnData = ret.JsonData; // 리턴 데이타 구조에 맞게 수정\r\n let role = [];\r\n returnData.map((e) => {\r\n role.push(e.BTN_TYPE);\r\n });\r\n let menuItem = { [MNU_ID]: role };\r\n const temp = addRole(menuItem);\r\n // console.log(\"addRole\", temp, roles);\r\n pageRole = menuItem;\r\n } catch (e) {\r\n //\r\n }\r\n }\r\n });\r\n };\r\n\r\n // useLayoutEffect(() => {\r\n // console.log('useLayoutEffect')\r\n // })\r\n\r\n const loadRole = () => roles.filter((item) => Object.keys(item)[0] === MNU_ID);\r\n\r\n const checkRole = () => {\r\n let chk = loadRole();\r\n // console.log(\"checkRole\", roles, chk);\r\n if (chk?.length > 0 && Object.keys(chk)[0] === MNU_ID) return true;\r\n return false;\r\n };\r\n\r\n React.useEffect(() => {\r\n try {\r\n if (MNU_ID !== 'home') {\r\n if (checkRole() === false) loadButtonRoleData();\r\n pageRole = loadRole()[0];\r\n }\r\n } catch (e) {\r\n // console.log(e);\r\n }\r\n }, []);\r\n\r\n return pageRole;\r\n}\r\n","import React from 'react';\r\nimport { Fade } from '@material-ui/core';\r\nimport usePageInfo from 'src/framework/core/hooks/usePageInfo';\r\nimport useMenuLoad from 'src/framework/core/hooks/useMenuLoad';\r\n\r\nconst TabPanel = ({ item, hideSideMenuClick }) => {\r\n const { pageInfo } = usePageInfo();\r\n const { SetFavoritMenu, LoadFavoritMenu } = useMenuLoad();\r\n const LoadableTabview = item.contents;\r\n const displayPath = item.NAME_PATH === undefined ? null : item.NAME_PATH.split('>');\r\n const liArray = !displayPath ? null : displayPath.map((e, index) =>
  • {e}
  • );\r\n const [favActive, setFavActive] = React.useState({\r\n state: false,\r\n text: '즐겨찾기 추가',\r\n });\r\n React.useEffect(() => {\r\n try {\r\n const favoritMenu = JSON.parse(LoadFavoritMenu()).filter((k) => k.MENU_ID === pageInfo.menuId);\r\n if (favoritMenu.length > 0) {\r\n setFavActive({\r\n state: true,\r\n text: '즐겨찾기 제거',\r\n });\r\n }\r\n } catch (error) {\r\n //\r\n }\r\n }, []);\r\n const onClickSetFavorit = async () => {\r\n if (pageInfo.menuId) {\r\n if (pageInfo.menuId === 'home') return false;\r\n const ret = await SetFavoritMenu(pageInfo.menuId);\r\n if (ret && ret.JsonData && JSON.stringify(ret.JsonData) !== '[]') {\r\n const fMenu = JSON.parse(LoadFavoritMenu()).filter((k) => k.MENU_ID === pageInfo.menuId);\r\n if (fMenu.length > 0) {\r\n setFavActive({\r\n state: true,\r\n text: '즐겨찾기 제거',\r\n });\r\n } else {\r\n setFavActive({\r\n state: false,\r\n text: '즐겨찾기 추가',\r\n });\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n return (\r\n
    \r\n
    \r\n
      \r\n {liArray}\r\n {item.id === 0 ? '' :
    • {item.PROGRAM_ID}
    • }\r\n
    \r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n {/* */}\r\n
    \r\n
    \r\n );\r\n};\r\n\r\nexport default TabPanel;\r\n","import React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport useMenuLoad from './useMenuLoad';\r\nimport usePageRole from './usePageRole';\r\n\r\n/**\r\n * Redux(Reducer) Tabs 조회하여 현재 페이지의 정보를 담아두는 영역\r\n */\r\nexport default function usePageInfo() {\r\n const [pageInfo, setPageInfo] = React.useState('');\r\n const tabs = useSelector((state) => state.tabs);\r\n const { MenuLoad } = useMenuLoad();\r\n // const { t } = useI18n();\r\n const menuList = JSON.parse(MenuLoad());\r\n const menuIdItem = [];\r\n const BUTTON_ROLE_CONTROL = process.env.REACT_APP_BUTTON_ROLE_CONTROL || false; // 버튼 권한 설정 적용여부\r\n\r\n const findMenuItem = () => {\r\n try {\r\n const tmp = menuList.filter((item) => item.MNU_ID === menuIdItem[menuIdItem.length - 1]);\r\n if (tmp && tmp.lenght > 0 && tmp[0].PRNT_MNU_ID && tmp[0].PRNT_MNU_ID.length > 1) {\r\n menuIdItem.push(tmp[0].PRNT_MNU_ID);\r\n findMenuItem();\r\n }\r\n } catch (error) {\r\n //\r\n }\r\n };\r\n\r\n try {\r\n if (tabs && Array.isArray(tabs.tabList) && tabs.tabList.length > 0) {\r\n const activeTab = tabs.tabList.filter((item) => item.isActive === true)[0];\r\n if (pageInfo === '') {\r\n // 초기상태이면\r\n setPageInfo(activeTab);\r\n } else if (pageInfo.menuId !== activeTab.menuId) {\r\n setPageInfo(activeTab);\r\n }\r\n // console.log(\"usePageInfo --> pageInfo, activeTab \", pageInfo, activeTab);\r\n }\r\n\r\n if (pageInfo && pageInfo.menuId && pageInfo.menuId.length > 0 && !pageInfo.pageTitle) {\r\n menuIdItem.push(pageInfo.menuId);\r\n findMenuItem();\r\n }\r\n } catch (error) {\r\n // console.log(\"error\", error);\r\n }\r\n\r\n /// 현재 페이지의 버튼 권한 정보를 수집하여 스토어에 저장한다.\r\n if (BUTTON_ROLE_CONTROL) {\r\n const pageRole = usePageRole(pageInfo.menuId);\r\n }\r\n React.useMemo(() => [pageInfo], []);\r\n return { pageInfo };\r\n}\r\n","import 'src/styles/style.css';\r\nimport React from 'react';\r\nimport { useDispatch } from 'react-redux';\r\nimport TabHeader from './TabHeader';\r\nimport TabPanel from './TabPanel';\r\nimport { nextTab, prevTab, removeTab, removeAll, selectTab } from 'src/framework/core/reducers/TabReducer';\r\n\r\nfunction getActPage(items) {\r\n return items.filter((f) => f.isActive === true)[0];\r\n}\r\n\r\nconst TabItem = ({ items, hideSideMenuClick }) => {\r\n const dispathcer = useDispatch();\r\n const dispachPrev = (id) => dispathcer(prevTab(id));\r\n const dispachNext = (id) => dispathcer(nextTab(id));\r\n const removeAllTab = () => dispathcer(removeAll());\r\n\r\n const onPrevClick = (e) => {\r\n const activePage = getActPage(items);\r\n dispachPrev(activePage.id);\r\n };\r\n\r\n const onNextClick = (e) => {\r\n const activePage = getActPage(items);\r\n dispachNext(activePage.id);\r\n };\r\n\r\n const onRemoveAllClick = () => {\r\n removeAllTab();\r\n };\r\n\r\n return (\r\n <>\r\n
    \r\n
    \r\n
      \r\n {items.map((item, index) => (\r\n
    • \r\n \r\n
    • \r\n ))}\r\n
    \r\n
    \r\n
    \r\n \r\n \r\n \r\n
    \r\n
    \r\n {items.map((item) => (\r\n
    \r\n \r\n
    \r\n ))}\r\n \r\n );\r\n};\r\n\r\nexport default TabItem;\r\n","import React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport TabItem from './TabItem';\r\n\r\nfunction TabList({ hideSideMenuClick }) {\r\n const tabData = useSelector((state) => state.tabs);\r\n return (\r\n <>\r\n \r\n \r\n );\r\n}\r\n\r\nexport default TabList;\r\n","import React, { useState, useEffect } from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { Link } from 'react-router-dom';\r\nimport _ from 'lodash';\r\nimport * as ISO from 'src/framework/layout/LayerComponents';\r\nimport 'src/styles/DefaultLayout.css';\r\nimport 'src/styles/controlStyle.css';\r\nimport MenuTop from './MenuTop';\r\nimport MenuSide from './MenuSide';\r\nimport Copyrights from './Copyrights';\r\nimport { addTab } from 'src/framework/core/reducers/TabReducer';\r\nimport TabList from 'src/framework/components/tab/TabItemList';\r\nimport { ModalOkOnly } from 'src/framework/components/controls/ISODialog';\r\nimport { hide } from 'src/framework/core/reducers/MessageReducer';\r\nimport { StorageLoad } from 'src/framework/core/hooks/useLocalStorage';\r\nimport { alertType, e3 } from 'src/framework/core/utils/utils';\r\n\r\nconst DefaultLayout = React.memo(() => {\r\n const messgaeInfo = useSelector((state) => state.message);\r\n const tabInfo = useSelector((state) => state.tabs);\r\n\r\n const dispatch = useDispatch();\r\n const onCreate = (payload) => dispatch(addTab(payload));\r\n const hideMessgaeInfo = () => dispatch(hide());\r\n const menuList = useSelector((state) => state.menuList).dataList || JSON.parse(StorageLoad('MENU'));\r\n const topMenuList = _.filter(menuList, { LEVEL: 1 });\r\n // console.log(topMenuList);\r\n const [menuState, setMenuState] = useState({\r\n collapsed: false, // 사이드 메뉴 숨김/표시 값\r\n menuTop: topMenuList.length > 0 ? topMenuList[0].MENU_ID : '', // 탑메뉴 선택 값\r\n menuSide: '', // 사이드메뉴 선택 값\r\n sideTabMenuSelected: 'sideTabMenu20', // 사이드메뉴 상단 탭 선택 값\r\n sideMenuAutoHidden: false, // 사이드메뉴 자동 숨김 설정 값\r\n locale: 'ko', // 다국어 선택 값\r\n siderTimer: null,\r\n fullScreenMode: false,\r\n });\r\n const toggle = async () => {\r\n await setMenuState({\r\n ...menuState,\r\n collapsed: !menuState.collapsed,\r\n });\r\n };\r\n const handleMenuTopClick = async (e) => {\r\n if (menuState.sideMenuAutoHidden) {\r\n const oSiderTimer = window.setTimeout(() => {\r\n hideSideMenu();\r\n }, 5000);\r\n await setMenuState({\r\n ...menuState,\r\n menuTop: e.target.attributes.data.value,\r\n sideTabMenuSelected: 'sideTabMenu20',\r\n collapsed: false,\r\n siderTimer: oSiderTimer,\r\n });\r\n } else {\r\n await setMenuState({\r\n ...menuState,\r\n menuTop: e.target.attributes.data.value,\r\n sideTabMenuSelected: 'sideTabMenu20',\r\n });\r\n }\r\n };\r\n const OSiderOver = (e) => {\r\n if (menuState.sideMenuAutoHidden) {\r\n window.clearTimeout(menuState.siderTimer);\r\n }\r\n };\r\n const OSiderOut = (e) => {\r\n if (menuState.sideMenuAutoHidden) {\r\n window.setTimeout(() => {\r\n hideSideMenu();\r\n }, 700);\r\n }\r\n };\r\n const handleMenuClick = (e, v) => {\r\n let chkMyData = null;\r\n if (tabInfo.tabList.length === Number.parseInt(process.env.REACT_APP_TAB_COUNT)) {\r\n e3.modal.alert(alertType.Info, '화면은 15개까지만 열릴 수 있습니다. 화면을 닫고 다시 시도해주세요.');\r\n return false;\r\n }\r\n // if (e && e.item && e.item.props && e.item.props.data) {\r\n // onCreate(e.item.props.data);\r\n // } else if (e && e.target && e.target.dataset && e.target.dataset.myData) {\r\n // const myData = findMenu(e.target.dataset.myData);\r\n // if (myData?.length > 0) chkMyData = myData;\r\n // if (myData && myData.length > 0) onCreate(myData[0]);\r\n // }\r\n if (v) {\r\n const myData = findMenu(v);\r\n if (myData?.length > 0) chkMyData = myData;\r\n if (myData && myData.length > 0) onCreate(myData[0]);\r\n }\r\n if (menuState.sideMenuAutoHidden && chkMyData?.length > 0) {\r\n setMenuState({\r\n ...menuState,\r\n menuSide: chkMyData[0].MENU_ID,\r\n collapsed: true,\r\n });\r\n } else if (menuState.sideMenuAutoHidden && chkMyData === null) {\r\n setMenuState({\r\n ...menuState,\r\n collapsed: true,\r\n });\r\n } else if (!menuState.sideMenuAutoHidden && chkMyData?.length > 0) {\r\n setMenuState({\r\n ...menuState,\r\n menuSide: chkMyData[0].MENU_ID,\r\n });\r\n }\r\n };\r\n const hideSideMenu = () => {\r\n if (menuState.sideMenuAutoHidden) {\r\n setMenuState({\r\n ...menuState,\r\n collapsed: true,\r\n siderTimer: null,\r\n });\r\n }\r\n };\r\n const debugState = () => {\r\n console.log('DefaultLayout', menuState);\r\n };\r\n const changeLanguage = (e) => {\r\n setMenuState({\r\n ...menuState,\r\n locale: e.target.value,\r\n });\r\n };\r\n const findMenu = (menuid) => menuList.filter((item) => item.MENU_ID === menuid);\r\n const onCloseMessgaeInfo = () => {\r\n hideMessgaeInfo();\r\n };\r\n\r\n useEffect(() => {\r\n if (topMenuList && topMenuList[0]) {\r\n setMenuState({\r\n ...menuState,\r\n menuTop: topMenuList[0].MENU_ID,\r\n });\r\n }\r\n }, [menuList]);\r\n\r\n return (\r\n <>\r\n \r\n \r\n
    \r\n \r\n \r\n {/* {React.createElement(menuState.collapsed ? FormatIndentDecreaseIcon : FormatIndentIncreaseIcon, { className: 'trigger', onClick: toggle })} */}\r\n \r\n \"\"\r\n \r\n
    \r\n \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n \r\n
    {messgaeInfo.message}
    \r\n \r\n \r\n );\r\n});\r\n\r\nexport default DefaultLayout;\r\n","import React, { useEffect } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport LoginForm from 'src/framework/layout/LoginForm';\r\nimport DefaultLayout from 'src/framework/layout/DefaultLayout/index';\r\n\r\nexport default function Login() {\r\n const userInfo = useSelector((state) => state.user);\r\n\r\n useEffect(() => {});\r\n\r\n return userInfo.isLoggedIn ? : ;\r\n}\r\n","import axios from 'axios';\r\nimport base64 from 'base-64';\r\nimport { alertType, e3, jsonCheck } from 'src/framework/core/utils/utils';\r\n\r\nconst API_URL = process.env.REACT_APP_PROXY;\r\n\r\nconst axiosRequestConfig = {\r\n baseURL: API_URL,\r\n headers: {\r\n 'Content-Type': 'application/json; charset=utf-8',\r\n },\r\n responseType: 'json',\r\n xsrfCookieName: 'XSRF-TOKEN',\r\n xsrfHeaderName: 'X-XSRF-TOKEN',\r\n};\r\n\r\nconst axiosInstance = axios.create(axiosRequestConfig);\r\n\r\nexport const DataPackage = {\r\n init: () => {\r\n let dataPackage = {};\r\n dataPackage.Token = '';\r\n dataPackage.JsonData = '';\r\n dataPackage.ErrorMessage = '';\r\n dataPackage.ProgramId = '';\r\n dataPackage.MethodName = '';\r\n dataPackage.Division = '';\r\n dataPackage.KeyValues = [];\r\n return dataPackage;\r\n },\r\n init1: () => {\r\n let dataPackage = {};\r\n dataPackage.JsonData = '';\r\n dataPackage.ErrorMessage = '';\r\n dataPackage.ProgramId = '';\r\n dataPackage.MethodName = '';\r\n dataPackage.Division = '';\r\n dataPackage.KeyValues = [];\r\n return dataPackage;\r\n },\r\n create1: (programid, methodname) => {\r\n let dataPackage = DataPackage.init1();\r\n dataPackage.ProgramId = programid;\r\n dataPackage.MethodName = methodname;\r\n return dataPackage;\r\n },\r\n create: (programid, methodname) => {\r\n let dataPackage = DataPackage.init();\r\n dataPackage.ProgramId = programid;\r\n dataPackage.MethodName = methodname;\r\n return dataPackage;\r\n },\r\n NewKeyValue: (key, value) => {\r\n let keyValue = {};\r\n keyValue.Key = key;\r\n keyValue.Value = value;\r\n return keyValue;\r\n },\r\n GetParam4Plant: () => {\r\n let m = {};\r\n m.Key = 'PLT_ID';\r\n m.Value = DataPackage.GetPlantId();\r\n return m;\r\n },\r\n GetPlantId: () => {\r\n const tmp = window.sessionStorage.getItem('loginSign');\r\n const ret = tmp && tmp.length > 0 ? JSON.parse(DataPackage.base64Decode(tmp.toString())) : undefined;\r\n return ret.PLT_ID || '';\r\n },\r\n base64Decode: (data) => base64.decode(data),\r\n base64Encode: (data) => base64.encode(data),\r\n};\r\n\r\nconst ISOAxios = {\r\n SetToken: (value) => {\r\n window.sessionStorage.setItem('Token', value);\r\n },\r\n GetToken: () => {\r\n const tmp = window.sessionStorage.getItem('Token');\r\n const ret = tmp && tmp.length > 0 ? tmp.toString() : undefined;\r\n return ret;\r\n },\r\n post: (params, url) => {},\r\n Execute: async (params) => {\r\n try {\r\n e3.ui.showLoading();\r\n\r\n params.Token = ISOAxios.GetToken();\r\n const result = await axiosInstance.post('/execute', JSON.stringify(params));\r\n\r\n e3.ui.hideLoading();\r\n const data = jsonCheck(result.data);\r\n\r\n if (data.ErrorMessage) {\r\n throw new Error(data.ErrorMessage);\r\n }\r\n data.JsonData = jsonCheck(data.JsonData);\r\n return data;\r\n } catch (err) {\r\n e3.ui.hideLoading();\r\n console.error(err);\r\n throw new Error(err);\r\n }\r\n },\r\n RequestPop: async (params) => {\r\n try {\r\n e3.ui.showLoading();\r\n const result = await axiosInstance.post('/executent', JSON.stringify(params));\r\n const data = jsonCheck(result.data);\r\n\r\n if (data.ErrorMessage) {\r\n throw new Error(data.ErrorMessage);\r\n }\r\n\r\n data.JsonData = jsonCheck(data.JsonData);\r\n e3.ui.hideLoading();\r\n return data;\r\n } catch (err) {\r\n throw new Error(err);\r\n }\r\n },\r\n Login: async (params) => {\r\n try {\r\n const result = await axiosInstance.post('/login', JSON.stringify(params));\r\n return typeof result.data === 'string' ? JSON.parse(result.data) : result.data;\r\n\r\n // throw new Error(result.data.ErrorMessage);\r\n } catch (err) {\r\n throw new Error(err);\r\n }\r\n },\r\n ExecuteAsync: (params) => {\r\n let fun = axiosInstance.post('/execute', JSON.stringify(params));\r\n return fun;\r\n },\r\n LoginAsync: (params) => {\r\n let fun = axiosInstance.post('/login', JSON.stringify(params));\r\n return fun;\r\n },\r\n GetPlantId: () => {\r\n const tmp = window.sessionStorage.getItem('loginSign');\r\n const ret = tmp && tmp.length > 0 ? JSON.parse(ISOAxios.base64Decode(tmp.toString())) : undefined;\r\n return ret.PLT_ID || '';\r\n },\r\n base64Decode: (data) => base64.decode(data),\r\n base64Encode: (data) => base64.encode(data),\r\n};\r\n\r\nexport default ISOAxios;\r\n","const MESSAGE_SHOW = 'MESSAGE_SHOW';\r\nconst MESSAGE_HIDE = 'MESSAGE_HIDE';\r\nconst REDUCER_MESSAGE = 'REDUCER_MESSAGE';\r\n\r\n/*\r\n흐름 정리\r\nredux reducer 파일 생성 (현재 파일) :: /reducers/object_file_name.js\r\n/reducers/index.js redux reducer 파일 추가 Import\r\nPage Object 구성 파일 추가 :: /pages/page_file_name.js , /pages/page_include directory/page_add_on_file\r\nPage Backend 통신 구성 파일 또는 함수를 Page 파일에 추가한다.\r\nUI Button Action --> Javascript Event --> Backend 통신(Axios) --> Redux Action --> Reducer sate object --> page\r\n*/\r\n\r\n/// redux Action (plain action only)\r\nexport const show = (data) => ({\r\n type: MESSAGE_SHOW,\r\n target: REDUCER_MESSAGE,\r\n data,\r\n});\r\nexport const hide = () => ({\r\n type: MESSAGE_HIDE,\r\n target: REDUCER_MESSAGE,\r\n});\r\n\r\n/// state - state object structure (reducer initialize object )\r\nexport const initialState = {\r\n title: '',\r\n message: '',\r\n isShow: false,\r\n width: 600,\r\n height: 400,\r\n buttonAlign: 'center',\r\n type: 'Normal',\r\n};\r\n\r\n/// reducer - state object change and return\r\nexport default function MessageReducer(state = initialState, action) {\r\n if (action.target !== REDUCER_MESSAGE) return state;\r\n // const results = state.results;\r\n // console.log(\"Reducer ===> MessageReducer state, action :: \" , state, action);\r\n switch (action.type) {\r\n case MESSAGE_SHOW:\r\n return {\r\n ...state,\r\n title: action.data.title,\r\n message: action.data.message,\r\n isShow: true,\r\n width: action.data.width || 600,\r\n height: action.data.height || 400,\r\n buttonAlign: action.data.buttonAlign || 'center',\r\n type: action.data.type || 'Normal',\r\n };\r\n case MESSAGE_HIDE:\r\n return initialState;\r\n default:\r\n return state;\r\n }\r\n}\r\n","// const LOGIN = 'LOGIN';\r\nconst LOGOUT = 'LOGOUT';\r\nconst RESET_STORE = 'RESET_STORE';\r\nconst LOGIN_REQUEST = 'LOGIN_REQUEST';\r\nconst LOGIN_SUCCESS = 'LOGIN_SUCCESS';\r\nconst LOGIN_FAILURE = 'LOGIN_FAILURE';\r\nconst REDUCER_LOGIN = 'REDUCER_LOGIN';\r\n\r\nexport const login = (data) => {\r\n // console.log(\"action login :: \", data);\r\n if (data.RESULT === 200) {\r\n return {\r\n type: LOGIN_SUCCESS,\r\n target: REDUCER_LOGIN,\r\n result: data,\r\n };\r\n }\r\n return {\r\n type: LOGIN_FAILURE,\r\n target: REDUCER_LOGIN,\r\n result: data,\r\n };\r\n\r\n // return {\r\n // type: types.LOGIN,\r\n // target: types.REDUCER_LOGIN,\r\n // promise: { method: 'post', url: '/login', data: { id, password } }\r\n // };\r\n};\r\nexport const logout = () => ({\r\n type: LOGOUT,\r\n target: REDUCER_LOGIN,\r\n});\r\n\r\nexport const clearStore = () => ({\r\n type: RESET_STORE,\r\n target: '',\r\n});\r\n\r\nexport const defaultState = {\r\n isLoggedIn: false,\r\n fetchingUpdate: false,\r\n user: {},\r\n};\r\n\r\nexport default function loginReducer(state = defaultState, action) {\r\n if (action.target !== REDUCER_LOGIN) return state;\r\n // console.log(\" loginReducer action :: \", action);\r\n switch (action.type) {\r\n case LOGIN_REQUEST:\r\n return {\r\n ...state,\r\n fetchingUpdate: true,\r\n };\r\n case LOGIN_SUCCESS:\r\n return {\r\n ...state,\r\n fetchingUpdate: false,\r\n isLoggedIn: true,\r\n user: action.result,\r\n };\r\n case LOGIN_FAILURE:\r\n return {\r\n ...state,\r\n fetchingUpdate: false,\r\n };\r\n case LOGOUT:\r\n return defaultState;\r\n default:\r\n return state;\r\n }\r\n}\r\n","import React from 'react';\r\nimport JqxMenu from 'jqwidgets-scripts/jqwidgets-react-tsx/jqxmenu';\r\n\r\nclass GridContextMenu extends React.PureComponent {\r\n contextMenu = React.createRef(JqxMenu);\r\n\r\n openMenu = (clientX, clientY) => {\r\n const scrollTop = window.scrollY;\r\n const scrollLeft = window.scrollX;\r\n this.contextMenu.current.open(parseInt(clientX, 10) + 5 + scrollLeft, parseInt(clientY, 10) + 5 + scrollTop);\r\n };\r\n\r\n render() {\r\n const onItemClick = (e) => {\r\n if (e.args.id === 'CSVEXPORT') {\r\n exportToCSV('csvfile.csv');\r\n }\r\n };\r\n\r\n const convertColumns = (gridType, columns) => {\r\n if (gridType === 'ISOGrid') {\r\n return columns.map((col) => ({\r\n ...col,\r\n visible: !col.hidden,\r\n label: col.text,\r\n dataField: col.dafafield,\r\n }));\r\n }\r\n return columns;\r\n };\r\n\r\n const convertSource = (gridType, source) => {\r\n if (gridType === 'ISOGrid') {\r\n return source.records;\r\n }\r\n return source;\r\n };\r\n\r\n const exportToCSV = (filename = 'csvfile.csv') => {\r\n let { gridType, columns, source } = this.props;\r\n\r\n if (!(columns && columns.length > 0)) {\r\n return;\r\n }\r\n\r\n columns = convertColumns(gridType, columns);\r\n source = convertSource(gridType, source);\r\n console.log(columns, source);\r\n\r\n let jsonData = {};\r\n jsonData.columns = [];\r\n jsonData.records = [];\r\n // Header\r\n columns?.forEach((col) => {\r\n if (col.visible) jsonData.columns.push(`\"${col.label}\"`);\r\n });\r\n // Records\r\n source?.forEach((item) => {\r\n let row = [];\r\n columns.forEach((col) => {\r\n if (col.visible) row.push(item[col.datafield]);\r\n });\r\n for (let i = 0; i < row.length; i++) {\r\n if (row[i] == null) {\r\n continue;\r\n }\r\n let content = row[i].toString(); //.replaceAll(',', '');\r\n if (content.startsWith('-')) content = \"'\" + content;\r\n row[i] = '\"' + content + '\"';\r\n }\r\n jsonData.records.push(row);\r\n });\r\n\r\n let separator = ',';\r\n let csvFileContent = jsonData.columns.join(separator) + '\\r\\n';\r\n jsonData.records.forEach((row) => {\r\n csvFileContent += row.join(separator) + '\\r\\n';\r\n });\r\n\r\n if (csvFileContent) {\r\n const blob = new Blob(['\\uFEFF' + csvFileContent], { type: 'text/csv; charset=utf-18' });\r\n if (typeof window.navigator.msSaveBlob !== 'undefined') {\r\n window.navigator.msSaveBlob(blob, filename);\r\n return;\r\n }\r\n const url = window.URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.style.display = 'none';\r\n link.href = url;\r\n link.setAttribute('download', filename);\r\n if (typeof link.download === 'undefined') {\r\n link.setAttribute('target', '_blank');\r\n }\r\n document.body.appendChild(link);\r\n link.click();\r\n document.body.removeChild(link);\r\n setTimeout(() => {\r\n window.URL.revokeObjectURL(url);\r\n }, 100);\r\n }\r\n };\r\n\r\n return (\r\n \r\n
      \r\n
    • CSV Export
    • \r\n
    \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default GridContextMenu;\r\n","import React from 'react';\r\nimport Checkbox from '@material-ui/core/Checkbox';\r\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\r\nimport CheckBoxIcon from '@material-ui/icons/CheckBox';\r\nimport CheckBoxOutlineBlankIcon from '@material-ui/icons/CheckBoxOutlineBlank';\r\nimport PropTypes from 'prop-types';\r\n\r\nclass ISOCheckBox extends React.PureComponent {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.enable = this.enable.bind(this);\r\n this.disable = this.disable.bind(this);\r\n this.setValue = this.setValue.bind(this);\r\n this.getValue = this.getValue.bind(this);\r\n this.onChange = this.onChange.bind(this);\r\n\r\n this.state = {\r\n label: this.props.label,\r\n disabled: this.props.disabled,\r\n checked: this.props.checked,\r\n aligne: this.props.aligne,\r\n };\r\n }\r\n\r\n enable() {\r\n if (this.state.disabled) {\r\n this.setState({\r\n disabled: false,\r\n });\r\n }\r\n }\r\n\r\n disable() {\r\n if (!this.state.disabled) {\r\n this.setState({\r\n disabled: true,\r\n });\r\n }\r\n }\r\n\r\n setValue(source) {\r\n if (source) {\r\n this.setState({\r\n checked: source,\r\n });\r\n }\r\n }\r\n\r\n getValue() {\r\n return this.state.checked;\r\n }\r\n\r\n onChange = (e) => {\r\n this.setState({\r\n checked: e.target.checked,\r\n });\r\n\r\n if (this.props.onChange) {\r\n this.props.onChange(e);\r\n }\r\n };\r\n\r\n render() {\r\n return (\r\n <>\r\n }\r\n checkedIcon={}\r\n checked={this.state.checked}\r\n onChange={this.onChange}\r\n />\r\n }\r\n label={this.state.label}\r\n labelPlacement={this.state.aligne}\r\n />\r\n \r\n );\r\n }\r\n}\r\n\r\nISOCheckBox.propTypes = {\r\n label: PropTypes.string,\r\n disabled: PropTypes.bool,\r\n checked: PropTypes.bool,\r\n aligne: PropTypes.string,\r\n};\r\n\r\nISOCheckBox.defaultProps = {\r\n label: 'chechBox',\r\n disabled: false,\r\n checked: false,\r\n aligne: 'start',\r\n};\r\n\r\nexport default ISOCheckBox;\r\n","// const CREATE = 'CREATE';\r\n// const REMOVE = 'REMOVE';\r\n// const ITEM_SAVE = 'SAVE';\r\n// const ITEM_REMOVE = 'REMOVE';\r\n// const ITEM_READ = 'SELECTED';\r\nconst ITEM_LIST = 'LIST';\r\nconst ITEM_RESET = 'RESET';\r\nconst REDUCER_FAVORITMENU = 'REDUCER_FAVORITMENU';\r\n\r\n/*\r\n흐름 정리\r\nredux reducer 파일 생성 (현재 파일) :: /reducers/object_file_name.js\r\n/reducers/index.js redux reducer 파일 추가 Import\r\nPage Object 구성 파일 추가 :: /pages/page_file_name.js , /pages/page_include directory/page_add_on_file\r\nPage Backend 통신 구성 파일 또는 함수를 Page 파일에 추가한다.\r\nUI Button Action --> Javascript Event --> Backend 통신(Axios) --> Redux Action --> Reducer sate object --> page\r\n*/\r\n\r\n/// redux Action (plain action only)\r\nexport const dataList = (data) => ({\r\n type: ITEM_LIST,\r\n target: REDUCER_FAVORITMENU,\r\n data,\r\n});\r\nexport const dataReset = () => ({\r\n type: ITEM_RESET,\r\n target: REDUCER_FAVORITMENU,\r\n});\r\n\r\n/// state - state object structure (reducer initialize object )\r\nexport const initialState = {\r\n dataList: [],\r\n};\r\n\r\n/// reducer - state object change and return\r\nexport default function FavoritMenuReducer(state = initialState, action) {\r\n if (action.target !== REDUCER_FAVORITMENU) return state;\r\n // const results = state.results;\r\n // console.log(\"Reducer ===> FavoritMenuReducer state, action :: \" , state, action);\r\n switch (action.type) {\r\n case ITEM_LIST:\r\n return {\r\n ...state,\r\n dataList: action.data,\r\n };\r\n case ITEM_RESET:\r\n return initialState;\r\n default:\r\n return state;\r\n }\r\n}\r\n","const ITEM_LIST = 'LIST';\r\nconst ITEM_RESET = 'RESET';\r\nconst REDUCER_MENULIST = 'REDUCER_MENULIST';\r\n\r\n/*\r\n흐름 정리\r\nredux reducer 파일 생성 (현재 파일) :: /reducers/object_file_name.js\r\n/reducers/index.js redux reducer 파일 추가 Import\r\nPage Object 구성 파일 추가 :: /pages/page_file_name.js , /pages/page_include directory/page_add_on_file\r\nPage Backend 통신 구성 파일 또는 함수를 Page 파일에 추가한다.\r\nUI Button Action --> Javascript Event --> Backend 통신(Axios) --> Redux Action --> Reducer sate object --> page\r\n*/\r\n\r\n/// redux Action (plain action only)\r\nexport const menuList = (data) => ({\r\n type: ITEM_LIST,\r\n target: REDUCER_MENULIST,\r\n data,\r\n});\r\nexport const menuReset = () => ({\r\n type: ITEM_RESET,\r\n target: REDUCER_MENULIST,\r\n});\r\n\r\n/// state - state object structure (reducer initialize object )\r\nexport const initialState = {\r\n dataList: [],\r\n};\r\n\r\n/// reducer - state object change and return\r\nexport default function MenuReducer(state = initialState, action) {\r\n if (action.target !== REDUCER_MENULIST) return state;\r\n // const results = state.results;\r\n // console.log(\"Reducer ===> MenuReducer state, action :: \" , state, action);\r\n switch (action.type) {\r\n case ITEM_LIST:\r\n return {\r\n ...state,\r\n dataList: action.data,\r\n };\r\n case ITEM_RESET:\r\n return initialState;\r\n default:\r\n return state;\r\n }\r\n}\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogContentText from '@material-ui/core/DialogContentText';\r\nimport ISOButton from './ISOButton';\r\nimport { e3, divName } from 'src/framework/core/utils/utils';\r\nimport { PaperComponent, Transition, ISODialogTitle } from './ISODialog/common';\r\n\r\nclass ISOConfirmDialog extends React.PureComponent {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.close = this.close.bind(this);\r\n this.onConfirmClick = this.onConfirmClick.bind(this);\r\n this.onCloseClick = this.onCloseClick.bind(this);\r\n\r\n this.state = {\r\n isOpen: true,\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n if (this.props.onInit) {\r\n this.props.onInit();\r\n }\r\n }\r\n\r\n /**\r\n * Dialog Close\r\n */\r\n close = () => {\r\n this.setState({\r\n isOpen: false,\r\n });\r\n e3.ui.removeElementReconfirm(divName.conFirmDivName);\r\n };\r\n\r\n /**\r\n * 확인 버튼 Event\r\n * @param e\r\n */\r\n onConfirmClick = (e) => {\r\n if (this.props.onConfirmClick) {\r\n this.props.onConfirmClick(e);\r\n }\r\n\r\n this.close();\r\n };\r\n\r\n /**\r\n * 취소 버튼 Event\r\n * @param e\r\n */\r\n onCloseClick = (e) => {\r\n if (this.props.onCloseClick) {\r\n this.props.onCloseClick(e);\r\n }\r\n\r\n this.close();\r\n };\r\n\r\n render() {\r\n return (\r\n
    \r\n \r\n \r\n {this.props.title ? this.props.title : this.props.children}\r\n \r\n \r\n \r\n {this.props.contents ? this.props.contents : this.props.children}\r\n \r\n \r\n \r\n 확인\r\n 닫기\r\n \r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\nISOConfirmDialog.propTypes = {\r\n title: PropTypes.string.isRequired,\r\n onInit: PropTypes.func,\r\n onConfirmClick: PropTypes.func,\r\n onCloseClick: PropTypes.func,\r\n};\r\n\r\nISOConfirmDialog.defaultProps = {\r\n title: '제목',\r\n onInit: null,\r\n onConfirmClick: null,\r\n onCloseClick: null,\r\n};\r\n\r\nexport default ISOConfirmDialog;\r\n","/* eslint-disable no-console */\r\n/* eslint-disable consistent-return */\r\n/* eslint-disable no-alert */\r\n// import base64 from 'base-64';\r\n\r\n/**\r\n * 로컬 스토리지 저장관련 처리\r\n * 로컬 스토리지는 base64Encode를 지원하지 않는 것 같다.\r\n * @param {*} name\r\n */\r\nexport default function useLocalStorage() {\r\n const localStorageSave = (name, value) => {\r\n try {\r\n if (typeof (localStorage) === 'undefined') { alert('localStorage 를 지원합니다'); return; }\r\n const data = typeof (value) !== 'string' ? JSON.stringify(value) : value;\r\n localStorage.setItem(name, data);\r\n } catch (e) {\r\n console.log(e.ErrorMessage);\r\n }\r\n };\r\n const localStorageLoad = (name) => {\r\n try {\r\n if (typeof (localStorage) === 'undefined') { alert('localStorage 를 지원합니다'); return; }\r\n return localStorage.getItem(name);\r\n } catch (e) {\r\n return e.ErrorMessage;\r\n }\r\n };\r\n const localStorageRemove = (name) => {\r\n try {\r\n if (typeof (localStorage) === 'undefined') { alert('localStorage 를 지원합니다'); return; }\r\n localStorage.removeItem(name);\r\n } catch (e) {\r\n alert(e.ErrorMessage);\r\n }\r\n };\r\n\r\n return {\r\n localStorageSave,\r\n localStorageLoad,\r\n localStorageRemove,\r\n };\r\n}\r\n\r\nexport function StorageSave(name, value) {\r\n try {\r\n if (typeof (localStorage) === 'undefined') { alert('localStorage 를 지원합니다'); return; }\r\n const data = typeof (value) !== 'string' ? JSON.stringify(value) : value;\r\n localStorage.setItem(name, data);\r\n } catch (e) {\r\n console.log(e.ErrorMessage);\r\n }\r\n}\r\nexport function StorageLoad(name) {\r\n try {\r\n if (typeof (localStorage) === 'undefined') { alert('localStorage 를 지원합니다'); return; }\r\n return localStorage.getItem(name);\r\n } catch (e) {\r\n return e.ErrorMessage;\r\n }\r\n}\r\nexport function StorageRemove(name) {\r\n try {\r\n if (typeof (localStorage) === 'undefined') { alert('localStorage 를 지원합니다'); return; }\r\n localStorage.removeItem(name);\r\n } catch (e) {\r\n alert(e.ErrorMessage);\r\n }\r\n}\r\n","import React from 'react';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport PropTypes from 'prop-types';\r\nimport Alert from '@material-ui/lab/Alert';\r\nimport ISOButton from './ISOButton';\r\nimport { divName, e3 } from 'src/framework/core/utils/utils';\r\nimport { PaperComponent, Transition, ISODialogTitle } from './ISODialog/common';\r\n\r\nclass ISOAlert extends React.PureComponent {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n isOpen: true,\r\n };\r\n }\r\n\r\n close = () => {\r\n this.setState({\r\n isOpen: false,\r\n });\r\n e3.ui.removeElementReconfirm(divName.alertDivName);\r\n };\r\n\r\n render() {\r\n return (\r\n <>\r\n \r\n {this.props.alertType.toUpperCase()}\r\n \r\n \r\n {/* {this.props.alertType} */}\r\n {this.props.contents}\r\n \r\n \r\n \r\n 확인\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nISOAlert.propTypes = {\r\n alertType: PropTypes.string,\r\n contents: PropTypes.string,\r\n};\r\n\r\nISOAlert.defaultProps = {\r\n alertType: 'error',\r\n contents: '내용',\r\n};\r\n\r\nexport default ISOAlert;\r\n","import React, { useEffect, useRef } from 'react';\r\nimport * as ISO from 'src/framework/layout/LayerComponents';\r\nimport { ISODialog, ISODialogTitle, ISODialogContent } from 'src/framework/components/controls/ISODialog';\r\n\r\nimport { ISORoleButton, ButtonType, ISOInput, ISOButton } from 'src/framework/components/controls';\r\nimport { ISOCombobox, ISODateTime } from 'src/framework/components/controls';\r\nimport { alertType, e3 } from 'src/framework/core/utils/utils';\r\nimport ISOUtils from 'src/framework/core/utils/ISOUtils';\r\nimport ISOAxios, { DataPackage } from 'src/framework/core/apis/ISOAxios';\r\nimport ISOTextArea from 'src/framework/components/controls/ISOTextArea';\r\nimport AttachFile from \"../../COM/AttachFile\";\r\nimport styled from 'styled-components';\r\n/**\r\n * 로그인 화면에서\r\n * 계정 없이 요청하기\r\n * 비회원 요청\r\n */\r\n\r\nconst MAI115 = React.forwardRef((props, ref) => {\r\n const { data: { validator, validationType }, } = ISOUtils;\r\n const [isOpen, setIsOpen] = React.useState(false);\r\n const refPlantName = useRef(ISOInput);\r\n const refUser = useRef(ISOInput);\r\n const refSysNm = useRef(ISOInput);\r\n const refRequestDate = useRef(ISODateTime);\r\n const refDeadlineDate = useRef(ISODateTime);\r\n const refReqEmail = useRef(ISOInput);\r\n const refReqCall = useRef(ISOInput);\r\n const refObsDesc = useRef(ISOTextArea);\r\n const refReqDate = useRef(ISODateTime);\r\n const refReceptionistInfo = useRef();\r\n const attachFileRef = useRef();\r\n const attachSeq = null;\r\n\r\n useEffect(() => {\r\n if (isOpen) {\r\n setTimeout(() => {\r\n refDeadlineDate.current?.clear();\r\n }, 100);\r\n }\r\n getRecptionistInfo();\r\n }, [isOpen]);\r\n\r\n React.useImperativeHandle(ref, () => ({\r\n showDialog() {\r\n setIsOpen(true);\r\n }\r\n }));\r\n\r\n const onSaveClick = () => {\r\n e3.modal.confirm('확인', '요청하시겠습니까?', checkValidate(onSave));\r\n };\r\n\r\n const checkValidate = actionType => {\r\n const isValid = validator(\r\n { component: refReqEmail, types: [validationType.email] },\r\n { component: refReqCall, types: [validationType.phoneWithHyphen] },\r\n );\r\n\r\n if (!refPlantName.current?.getValue()) {\r\n e3.modal.validationAlert(refPlantName.current.getLabel());\r\n return false;\r\n }\r\n if (!refUser.current?.getValue()) {\r\n e3.modal.validationAlert(refUser.current.getLabel());\r\n return false;\r\n }\r\n if (!refReqEmail.current?.getValue()) {\r\n e3.modal.validationAlert(refReqEmail.current.getLabel());\r\n return false;\r\n }\r\n if (!isValid) {\r\n return;\r\n }\r\n if (!refReqCall.current?.getValue()) {\r\n e3.modal.validationAlert(refReqCall.current.getLabel());\r\n return false;\r\n }\r\n if (!refSysNm.current?.getValue()) {\r\n e3.modal.validationAlert(refSysNm.current.getLabel());\r\n return false;\r\n }\r\n if (!refObsDesc.current?.getValue()) {\r\n e3.modal.validationAlert(refObsDesc.current.getLabel());\r\n return false;\r\n }\r\n if (new Date().toISOString().substring(0, 10) < refRequestDate.current?.getDate()) {\r\n e3.modal.alert(alertType.Warning, '장애 발생일을 오늘보다 미래로 설정할 수 없습니다.');\r\n return false;\r\n }\r\n if (new Date().toISOString().substring(0, 10) > refDeadlineDate.current?.getDate()) {\r\n e3.modal.alert(alertType.Warning, '조치 기한을 오늘보다 과거로 설정할 수 없습니다.');\r\n return false;\r\n }\r\n\r\n return actionType;\r\n };\r\n\r\n const getRecptionistInfo = async () => {\r\n let param = DataPackage.create1('MAI100', 'SelectReceptionistInfo');\r\n\r\n try {\r\n const result = await ISOAxios.RequestPop(param);\r\n const gridData = result.JsonData;\r\n\r\n refReceptionistInfo.current = gridData;\r\n } catch (error) {\r\n e3.modal.alert(alertType.Error, error.message);\r\n }\r\n }\r\n const onClose = () => setIsOpen(false);\r\n\r\n // // 2개 이상 첨부파일 저장\r\n // const onSaveFile = async () => {\r\n // attachFileRef.current.saveFileList(attachSeq, (seq) => {\r\n // onSave(seq);\r\n // });\r\n // };\r\n\r\n const onSave = async (tempAttachSeq) => {\r\n let param = DataPackage.create1('MAI100', 'InsertRequest_Before');\r\n param.JsonData = JSON.stringify({\r\n REQUEST_COM: refPlantName.current?.getValue(), //고객사명\r\n REQUEST_USER_NM: refUser.current?.getValue(), //요청자 이름\r\n REQUEST_USER_EMAIL: refReqEmail.current?.getValue(), //이메일\r\n REQUEST_USER_PHONE: refReqCall.current?.getValue(), //전화번호\r\n SYS_NM: refSysNm.current?.getValue(), //시스템명\r\n // ATTACH_SEQ: tempAttachSeq,\r\n REQUEST_DATE: refReqDate.current?.getDate(), //요청일\r\n OBS_DATE: refRequestDate.current?.getDate() == 'Invalid date' ? null : refRequestDate.current?.getDate(),\r\n DEADLINE_DATE: refDeadlineDate.current?.getDate() == 'Invalid date' ? null : refDeadlineDate.current?.getDate(),\r\n OBS_DESC: refObsDesc.current?.getValue(),\r\n });\r\n try {\r\n await ISOAxios.RequestPop(param);\r\n e3.modal.successAlert();\r\n onClose();\r\n } catch (error) {\r\n e3.modal.alert(alertType.Error, error.message);\r\n }\r\n };\r\n\r\n\r\n // //유지보수 번호 추출\r\n // const getSeq = async () => {\r\n // debugger;\r\n // let param = DataPackage.create1('MAI100', 'SelectMaintenanceSeq');\r\n // try {\r\n // const result = await ISOAxios.RequestPop(param);\r\n // const resultData = result.JsonData;\r\n\r\n // return resultData[0].MAINTENANCE_SEQ;\r\n // } catch (error) {\r\n // e3.modal.alert(alertType.Error, error.message);\r\n // }\r\n // }\r\n\r\n const RequestComponent = () => {\r\n const Dot = styled.span`\r\n display:block;\r\n content: '';\r\n position:absolute;\r\n top:12px;\r\n left:0;\r\n width:4px;\r\n height:4px;\r\n background-color: ${props => props.required ? '#de071a' : '#aaa'};\r\n `;\r\n\r\n return (\r\n
    \r\n
    \r\n \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {/* \r\n 첨부 파일\r\n \r\n \r\n \r\n */}\r\n \r\n \r\n \r\n \r\n
    \r\n onSaveClick()}>\r\n setIsOpen(false)}>\r\n
    \r\n \r\n \r\n
    \r\n
    \r\n )\r\n }\r\n\r\n return (\r\n <>\r\n \r\n 유지보수 요청\r\n \r\n \r\n \r\n );\r\n});\r\n\r\nexport default MAI115;","const ITEM_LIST = 'LIST';\r\nconst ITEM_ADD = 'ADD';\r\nconst ITEM_REMOVE = 'REMOVE';\r\nconst ITEM_RESET = 'RESET';\r\nconst REDUCER_PAGEROLE = 'REDUCER_PAGEROLE';\r\n\r\n/// redux Action (plain action only)\r\nexport const list = (data) => ({\r\n type: ITEM_LIST,\r\n target: REDUCER_PAGEROLE,\r\n data,\r\n});\r\nexport const add = (data) => ({\r\n type: ITEM_ADD,\r\n target: REDUCER_PAGEROLE,\r\n data,\r\n});\r\nexport const remove = (data) => ({\r\n type: ITEM_REMOVE,\r\n target: REDUCER_PAGEROLE,\r\n data,\r\n});\r\nexport const reset = () => ({\r\n type: ITEM_RESET,\r\n target: REDUCER_PAGEROLE,\r\n});\r\n\r\n/// state - state object structure (reducer initialize object )\r\n/// { menuIDKey: [buttonRoles] }\r\nexport const initialState = {\r\n roles: [],\r\n};\r\n\r\nfunction removeByKey(myObj, deleteKey) {\r\n return Object.keys(myObj)\r\n .filter((key) => key !== deleteKey)\r\n .reduce((result, current) => {\r\n result[current] = myObj[current];\r\n return result;\r\n }, {});\r\n}\r\n\r\n/// reducer - state object change and return\r\nexport default function PageRoleReducer(state = initialState, action) {\r\n if (action.target !== REDUCER_PAGEROLE) return state;\r\n const roles = state.roles;\r\n // console.log('Reducer ===> PageRoleReducer state, action :: ', state, action);\r\n switch (action.type) {\r\n case ITEM_LIST:\r\n return {\r\n roles: action.data,\r\n };\r\n case ITEM_ADD:\r\n return {\r\n ...state,\r\n roles: roles.filter((item) => {\r\n if (Object.keys(item)[0] === Object.keys(action.data)[0]) return true;\r\n return false;\r\n }).length < 1 ? roles.concat(action.data) : roles,\r\n };\r\n case ITEM_REMOVE:\r\n return removeByKey(state, action.data);\r\n case ITEM_RESET:\r\n return initialState;\r\n default:\r\n return state;\r\n }\r\n}\r\n","const jqxkanbanApi = {\r\n addColumn: ({ text, dataField, maxItems, iconClassName, collapsible = false }) => {\r\n const column = {};\r\n\r\n column.text = text;\r\n column.dataField = dataField;\r\n\r\n if (maxItems !== undefined) {\r\n column.maxItems = maxItems;\r\n }\r\n\r\n if (iconClassName !== undefined) {\r\n column.iconClassName = iconClassName;\r\n }\r\n\r\n column.collapsible = collapsible;\r\n\r\n return column;\r\n },\r\n};\r\n\r\nconst kanbanApi = {\r\n addGroup: ({ id, title }) => {\r\n let column = {};\r\n column.id = id;\r\n column.title = title;\r\n column.taskIds = [];\r\n return column;\r\n },\r\n};\r\n\r\nexport { jqxkanbanApi, kanbanApi };\r\n","import { alertType, e3 } from 'src/framework/core/utils/utils';\r\n\r\nconst validationType = {\r\n number: 'number',\r\n email: 'email',\r\n phone: 'phone',\r\n phoneWithHyphen: 'phoneWithHyphen',\r\n ip: 'ip',\r\n};\r\n\r\nconst regex = {\r\n number: /^[0-9]/g,\r\n float: /^-?[0-9]\\d*(\\.\\d+)?$/,\r\n email: /^[-A-Za-z0-9_]+[-A-Za-z0-9_.]*[@]{1}[-A-Za-z0-9_]+[-A-Za-z0-9_.]*[.]{1}[A-Za-z]{1,5}$/,\r\n phone: /^\\d{2,3}\\d{3,4}\\d{4}$/,\r\n phoneWithHyphen: /^\\d{2,3}-\\d{3,4}-\\d{4}$/,\r\n ip: /^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/,\r\n};\r\n\r\n/**\r\n * @param {...{component: object, label: string, required: boolean, types: Array}} args\r\n * component: object\r\n * label: string (기본값: component의 getLabel())\r\n * required: bool (기본값: true)\r\n * validationTypes: array of validationType\r\n * @returns\r\n */\r\nconst validator = (...args) => {\r\n if (!args || !args.length) {\r\n e3.modal.alert(alertType.Error, '파라미터를 전달해주세요!');\r\n return false;\r\n }\r\n\r\n for (let i = 0; i < args.length; i++) {\r\n const component = args[i].component;\r\n const label = args[i].label || component?.current?.getLabel() || '';\r\n const required = args[i].required === false ? false : true;\r\n const types = args[i].types || [];\r\n\r\n if (typeof component !== 'object' || !component.current) {\r\n e3.modal.alert(alertType.Error, `${i}번째 Component 파라미터 형식이 올바르지 않습니다.`);\r\n return false;\r\n }\r\n\r\n if (!label) {\r\n e3.modal.alert(alertType.Error, `${i}번째 Label을 찾을 수 없습니다.`);\r\n return false;\r\n }\r\n const value = component.current.getValue();\r\n\r\n if (required && !value) {\r\n e3.modal.alert(alertType.Error, `${label}: 필수항목입니다.`);\r\n return false;\r\n }\r\n\r\n if ((required || value) && types.includes(validationType.number)) {\r\n try {\r\n const numberValue = parseFloat(value);\r\n if (!regex.float.test(numberValue)) {\r\n e3.modal.alert(alertType.Error, `${label}: 숫자만 입력해주세요.`);\r\n return false;\r\n }\r\n } catch (ex) {\r\n return false;\r\n }\r\n }\r\n if ((required || value) && types.includes(validationType.email)) {\r\n if (!regex.email.test(value)) {\r\n e3.modal.alert(alertType.Error, `${label}: 이메일 형식으로 입력해주세요.`);\r\n return false;\r\n }\r\n }\r\n if ((required || value) && types.includes(validationType.phone)) {\r\n if (!regex.phone.test(value)) {\r\n e3.modal.alert(alertType.Error, `${label}: '-' 없는 전화번호를 입력해주세요.`);\r\n return false;\r\n }\r\n }\r\n if ((required || value) && types.includes(validationType.phoneWithHyphen)) {\r\n if (!regex.phoneWithHyphen.test(value)) {\r\n e3.modal.alert(alertType.Error, `${label}: '-' 가 포함된 올바른 전화번호를 입력해주세요.`);\r\n return false;\r\n }\r\n }\r\n if ((required || value) && types.includes(validationType.ip)) {\r\n if (!regex.ip.test(value)) {\r\n e3.modal.alert(alertType.Error, `${label}: IP 형식으로 입력해주세요.`);\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n};\r\n\r\nexport { validationType, regex, validator };\r\n","import React from 'react';\r\nimport { Button } from '@material-ui/core';\r\nimport PropTypes from 'prop-types';\r\nimport { connect } from 'react-redux';\r\n\r\n/**\r\n * @description ISORollButton 종류\r\n */\r\nexport const ButtonType = {\r\n ADD: 'ADD',\r\n APPLY: 'APPLY',\r\n BARCODEPRINT: 'BARCODEPRINT',\r\n CANCEL: 'CANCEL',\r\n COPY: 'COPY',\r\n DELETE: 'DELETE',\r\n EXCEL: 'EXCEL',\r\n INIT: 'INIT',\r\n MODIFY: 'MODIFY',\r\n NONE: 'NONE',\r\n OK: 'OK',\r\n PRINT: 'PRINT',\r\n REGISTE: 'REGISTE',\r\n REMOVE: 'REMOVE',\r\n RESET: 'RESET',\r\n SAVE: 'SAVE',\r\n SAVEALL: 'SAVEALL',\r\n SEARCH: 'SEARCH',\r\n SETTING: 'SETTING',\r\n};\r\n\r\nclass ISORoleButton extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.enable = this.enable.bind(this);\r\n this.disable = this.disable.bind(this);\r\n this.setValue = this.setValue.bind(this);\r\n this.getValue = this.getValue.bind(this);\r\n this.onClick = this.onClick.bind(this);\r\n\r\n this.state = {\r\n textLabel: props.textLabel,\r\n disabled: props.disabled,\r\n value: props.value,\r\n };\r\n }\r\n\r\n enable() {\r\n if (this.state.disabled) {\r\n this.setState({\r\n disabled: false,\r\n });\r\n }\r\n }\r\n\r\n disable() {\r\n if (!this.state.disabled) {\r\n this.setState({\r\n disabled: true,\r\n });\r\n }\r\n }\r\n\r\n setValue(source) {\r\n if (source) {\r\n this.setState({\r\n value: source,\r\n });\r\n }\r\n }\r\n\r\n getValue() {\r\n return this.state.value;\r\n }\r\n\r\n setTextLabel(source) {\r\n this.setState({\r\n textLabel: source,\r\n });\r\n }\r\n\r\n onClick = (e) => {\r\n if (this.props.onClick !== null) {\r\n this.props.onClick(e);\r\n }\r\n };\r\n loadAllowButtoneRoles() {\r\n try {\r\n const BUTTON_ROLE_CONTROL = process.env.REACT_APP_BUTTON_ROLE_CONTROL || false; // 버튼 권한 설정 적용여부\r\n if (BUTTON_ROLE_CONTROL) {\r\n // store에 저장된 tabList 목록 중 Active인 화면의 정보를 가져온다.\r\n const { tabs } = this.props;\r\n let activePage = tabs.find((item) => {\r\n if (item.isActive === true && item.menuId !== 'home') {\r\n return item;\r\n }\r\n });\r\n if (activePage === undefined || activePage === null || JSON.stringify(activePage) === '{}') {\r\n activePage = null;\r\n }\r\n // console.log('activePage', activePage, this.props);\r\n if (activePage !== null && activePage.menuId) {\r\n // store에 저장된 button role 중에 현재 메뉴 아이디에 해당하는 role list를 가져온다.\r\n const { roles } = this.props;\r\n let role = roles.find((item) => {\r\n let key = Object.keys(item)[0];\r\n if (activePage.menuId === key) {\r\n return item;\r\n }\r\n });\r\n if (role === undefined || role === null || JSON.stringify(role) === '{}') {\r\n return this.props.pageRole;\r\n }\r\n // console.log('role', role, this.props);\r\n return role[activePage.menuId];\r\n }\r\n }\r\n } catch (e) {\r\n console.log(e, this.props);\r\n }\r\n return this.props.pageRole;\r\n }\r\n\r\n setRoleCheck() {\r\n // buttonType='NONE' 일 경우 권한 검사 진행 여부 (Fasle 일 경우 true 리턴)\r\n // REACT_APP_BUTTON_ROLE_NONE_CHECK 가 true 이면 buttonRoles에 'NONE'이 포함되어야 한다.\r\n let noneTypeCheck = process.env.REACT_APP_BUTTON_ROLE_NONE_CHECK === 'true';\r\n if (this.props.buttonType === 'NONE' && noneTypeCheck === false) return true;\r\n\r\n let buttonRoles = this.loadAllowButtoneRoles();\r\n // console.log('setRoleCheck', buttonRoles, this.props.buttonType, buttonRoles.indexOf(this.props.buttonType) > -1);\r\n return buttonRoles.indexOf(this.props.buttonType) > -1;\r\n }\r\n\r\n render() {\r\n const { textLabel, buttonType, pageRole, tabs, roles, dispatch, ...other } = this.props;\r\n const buttonEnable = this.setRoleCheck();\r\n // 버튼 권한이 없을 경우 화면에 버튼을 출력할 것인지 확인 (true이면 화면에 출력한다.)\r\n const disableButtonShow = process.env.REACT_APP_BUTTON_ROLE_DISABLE_SHOW === 'true';\r\n return (\r\n <>\r\n {buttonEnable ? (\r\n \r\n ) : disableButtonShow ? (\r\n \r\n ) : (\r\n  \r\n )}\r\n \r\n );\r\n }\r\n}\r\n\r\nISORoleButton.propTypes = {\r\n textLabel: PropTypes.string,\r\n color: PropTypes.string,\r\n component: PropTypes.string,\r\n disabled: PropTypes.bool,\r\n fullWidth: PropTypes.bool,\r\n href: PropTypes.string,\r\n size: PropTypes.string,\r\n variant: PropTypes.string,\r\n value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n onClick: PropTypes.func,\r\n buttonType: PropTypes.string,\r\n pageRole: PropTypes.array,\r\n};\r\n\r\nISORoleButton.defaultProps = {\r\n color: 'default',\r\n component: 'button',\r\n disabled: false,\r\n fullWidth: false,\r\n href: '',\r\n size: 'medium',\r\n variant: 'contained',\r\n value: '',\r\n onClick: null,\r\n buttonType: 'NONE',\r\n pageRole: ['NONE'],\r\n};\r\n\r\nlet mapStateToProps = (state) => ({ roles: state.pageRole.roles, tabs: state.tabs.tabList });\r\n\r\n// export default connect(mapStateToProps)(ISORoleButton);\r\n\r\nISORoleButton = connect(mapStateToProps, null, null, { forwardRef: true })(ISORoleButton);\r\nexport default ISORoleButton;\r\n","//ISOTextArea\r\nimport React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport TextField from '@material-ui/core/TextField';\r\nimport TextareaAutosize from '@material-ui/core/TextareaAutosize';\r\nimport { getXmlEscapedToOriginal } from \"../../core/utils/utils\";\r\n\r\nclass ISOTextArea extends React.PureComponent {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n textLabel: props.textLabel,\r\n value: props.value,\r\n disabled: props.disabled,\r\n readOnly: props.readOnly,\r\n };\r\n }\r\n\r\n enable() {\r\n if (this.state.disabled) {\r\n this.setState({\r\n disabled: false,\r\n });\r\n }\r\n }\r\n\r\n disable() {\r\n if (!this.state.disabled) {\r\n this.setState({\r\n disabled: true,\r\n });\r\n }\r\n }\r\n\r\n setValue(source) {\r\n this.setState({\r\n // value: source,\r\n value: getXmlEscapedToOriginal(source),\r\n });\r\n }\r\n\r\n getValue() {\r\n return this.state.value;\r\n }\r\n\r\n setLabel(source) {\r\n if (source) {\r\n this.setState({\r\n textLabel: source,\r\n });\r\n }\r\n }\r\n getLabel() {\r\n return this.state.textLabel;\r\n }\r\n\r\n clear() {\r\n this.setValue('');\r\n }\r\n\r\n onChange = (e) => {\r\n this.setState({\r\n value: e.target.value,\r\n });\r\n\r\n if (this.props.onChange) {\r\n this.props.onChange(e);\r\n }\r\n };\r\n\r\n onClick = (e) => {\r\n if (this.props.onClick) {\r\n this.props.onClick(e);\r\n }\r\n };\r\n\r\n control = (other, errormessage) => (\r\n \r\n );\r\n \r\n render() {\r\n const { textLabel, colSpan, ...other } = this.props;\r\n const { errormessage } = this.state;\r\n const hiddenStyle = this.props.hidden ? 'hidden' : 'visible';\r\n return (\r\n <>\r\n {this.props.textLabel ? (\r\n <>\r\n \r\n \r\n \r\n \r\n {this.control(other, errormessage)}\r\n \r\n \r\n ) : this.props.colspan ? (\r\n <>\r\n \r\n {this.control(other, errormessage)}\r\n \r\n \r\n ) : (\r\n this.control(other, errormessage)\r\n )}\r\n \r\n );\r\n }\r\n}\r\n\r\nISOTextArea.propsTypes = {\r\n textLabel: PropTypes.string,\r\n colSpan: PropTypes.number,\r\n minRows: PropTypes.number,\r\n maxRows: PropTypes.number,\r\n value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n disabled: PropTypes.bool,\r\n readOnly: PropTypes.bool,\r\n onClick: PropTypes.func,\r\n onChange: PropTypes.func,\r\n};\r\n\r\nISOTextArea.defaultProps = {\r\n minRows: 5,\r\n maxRows: 5,\r\n value: '',\r\n disabled: false,\r\n readOnly: false,\r\n onClick: null,\r\n onChange: null,\r\n};\r\n\r\nexport default ISOTextArea;\r\n","import React, { useCallback, useEffect } from 'react';\r\nimport axios from 'axios';\r\nimport ISOButton from '../../framework/components/controls/ISOButton';\r\nimport ISOAxios, { DataPackage } from '../../framework/core/apis/ISOAxios';\r\nimport { alertType, e3 } from '../../framework/core/utils/utils';\r\nimport { jsonCheck } from '../../framework/core/utils/utils';\r\n\r\nconst AttachFile = React.forwardRef((props, ref) => {\r\n const API_URL = process.env.REACT_APP_PROXY.replace('queryservice', 'FileTransferService');\r\n\r\n // 썸네일\r\n const [thumbnail, setThumbnail] = React.useState({\r\n file: '',\r\n previewURL: '',\r\n });\r\n\r\n const [selectedFiles, setSelectedFiles] = React.useState([]);\r\n const [uploadFiles, setUploadFiles] = React.useState([]);\r\n const [validFiles, setValidFiles] = React.useState([]);\r\n const [errorMessage, setErrorMessage] = React.useState('');\r\n\r\n // 첨부파일 순번\r\n let attachSeq = 0;\r\n\r\n // 업로드할 첨부파일 갯수, 업로드 후 호출할 callback 함수\r\n const [uploadedFileCnt, setUploadedFileCnt] = React.useState(0);\r\n const [uploadedCallbackFunction, setUploadedCallbackFunction] = React.useState(null);\r\n\r\n React.useEffect(() => {\r\n let filteredArray = selectedFiles.reduce((file, current) => {\r\n const x = file.find((item) => item.name === current.name);\r\n if (!x) {\r\n return file.concat([current]);\r\n }\r\n return file;\r\n }, []);\r\n setValidFiles([...filteredArray]);\r\n\r\n if (selectedFiles.length === 0) {\r\n // 썸네일 데이터 초기화\r\n setThumbnail({\r\n file: '',\r\n previewURL: '',\r\n });\r\n }\r\n }, [selectedFiles]);\r\n\r\n React.useEffect(() => {\r\n // 업로드가 완료되면 callback 함수 호출\r\n if (uploadFiles.length == uploadedFileCnt) {\r\n if (typeof uploadedCallbackFunction == 'function') {\r\n uploadedCallbackFunction(uploadFiles);\r\n }\r\n }\r\n }, [uploadFiles]);\r\n\r\n const handlePostUpload = async (file) => {\r\n const req = new FormData();\r\n if (file) {\r\n req.append('fileStream', file);\r\n const config = {\r\n headers: {\r\n 'Content-Type': 'application/json; charset=utf-8',\r\n },\r\n };\r\n await axios\r\n .post(`${API_URL}/Upload`, req, config)\r\n .then((res) => {\r\n if (res) {\r\n const ret = jsonCheck(res.data);\r\n\r\n if (!ret.ErrorMessage) {\r\n const fileUploadResult = JSON.parse(ret.JsonData);\r\n if (fileUploadResult.UploadSucceeded) {\r\n const updatedArray = [...uploadFiles, fileUploadResult];\r\n\r\n setUploadFiles((uploadFiles) => [...uploadFiles, fileUploadResult]);\r\n }\r\n } else {\r\n // 오류가 1건이라도 발생하면...\r\n e3.modal.alert(alertType.Error, ret.ErrorMessage);\r\n // 기존 첨부목록을 다시 불러옴\r\n handlePostSelect(attachSeq);\r\n }\r\n }\r\n })\r\n .catch((error) => {\r\n console.log(error);\r\n });\r\n }\r\n };\r\n\r\n const fileSize = (size) => {\r\n if (size === 0) return '0 Bytes';\r\n const k = 1024;\r\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\r\n const i = Math.floor(Math.log(size) / Math.log(k));\r\n return `${parseFloat((size / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;\r\n };\r\n\r\n const fileInputRef = React.useRef(null);\r\n const fileInputRefClick = (e) => {\r\n // 파일 추가 시 파일목록에 파일이 없으면 input value 값 초기화\r\n if (selectedFiles.length === 0) fileInputRef.current.value = '';\r\n fileInputRef.current.click();\r\n };\r\n const onFileInputChange = (e) => {\r\n if (e.target.files && e.target.files.length) {\r\n for (let i = 0; i < e.target.files.length; i++) {\r\n // 단건 파일 선택인 경우, 해당 파일만 목록에 나타나도록 함\r\n if (props.multiple == 'false') {\r\n setSelectedFiles((selectedFiles) => [e.target.files[i]]);\r\n } else {\r\n setSelectedFiles((selectedFiles) => [...selectedFiles, e.target.files[i]]);\r\n }\r\n }\r\n }\r\n\r\n // 썸네일 데이터 추가\r\n if (props.thumbnail && e.target.files[0]) {\r\n e.preventDefault();\r\n let reader = new FileReader();\r\n let file = e.target.files[0];\r\n reader.onloadend = () => {\r\n setThumbnail({\r\n file: file,\r\n previewURL: reader.result,\r\n });\r\n };\r\n reader.readAsDataURL(file);\r\n }\r\n };\r\n\r\n const removeFile = (name) => {\r\n const validFileIndex = validFiles.findIndex((e) => e.name === name);\r\n validFiles.splice(validFileIndex, 1);\r\n setValidFiles([...validFiles]);\r\n const selectedFileIndex = selectedFiles.findIndex((e) => e.name === name);\r\n selectedFiles.splice(selectedFileIndex, 1);\r\n setSelectedFiles([...selectedFiles]);\r\n fileInputRef.current.value = '';\r\n };\r\n\r\n const downloadFile = (name, seq) => {\r\n const url = `${API_URL}/Download4N/${encodeURI(seq)}`;\r\n window.open(url, '_blank');\r\n };\r\n\r\n const handlePostUploadBefore = (tempAttachSeq, callback) => {\r\n // 삭제된 파일 갱신\r\n selectedFileListDBUpdate(tempAttachSeq);\r\n\r\n // 파일 업로드를 수행함\r\n\r\n // 이미 이전에 올렸던 파일은 제외 함\r\n for (let i = selectedFiles.length - 1; i > -1; i--) {\r\n if (selectedFiles[i].uploaded == 'Y') removeFile(selectedFiles[i].name);\r\n }\r\n // 올리려는 파일이 없는 경우 바로 callback함수 호출\r\n if (selectedFiles.length == 0) {\r\n callback();\r\n return;\r\n }\r\n\r\n // 파일 업로드\r\n let cnt = 0;\r\n setUploadedFileCnt(selectedFiles.length);\r\n // 파일 업로드 완료 후에 실행할 callback 함수 바인딩\r\n setUploadedCallbackFunction(() => {\r\n return callback;\r\n });\r\n for (let i = 0; i < selectedFiles.length; i++) {\r\n handlePostUpload(selectedFiles[i]);\r\n }\r\n };\r\n\r\n // 현재 선택된 파일 정보를 DB에 저장\r\n const selectedFileListDBUpdate = async (tempAttachSeq) => {\r\n // 현재 파일 목록 정보를 DB에 업데이트 함 (삭제된 것 반영)\r\n let attachFileSeqs = '';\r\n for (let j = 0; j < selectedFiles.length; j++) {\r\n if (selectedFiles[j].seq > '') {\r\n attachFileSeqs += attachFileSeqs.length == 0 ? selectedFiles[j].seq : ',' + selectedFiles[j].seq;\r\n }\r\n }\r\n let param = DataPackage.create('MAI100', 'DeleteAttachFileNot');\r\n param.KeyValues.push(DataPackage.NewKeyValue('ATTACH_SEQ', tempAttachSeq));\r\n param.KeyValues.push(DataPackage.NewKeyValue('ATTACH_FILE_SEQS', attachFileSeqs));\r\n param.KeyValues.push(DataPackage.NewKeyValue('FILE_TYPE', props.fileType));\r\n\r\n try {\r\n // 저장\r\n // if (tempAttachSeq != null) {\r\n await ISOAxios.Execute(param);\r\n // }\r\n // else {\r\n // await ISOAxios.RequestPop(param);\r\n // }\r\n } catch (error) {\r\n e3.modal.alert(alertType.Error, error.message);\r\n }\r\n };\r\n\r\n // 첨부파일 목록 가져오기\r\n const handlePostSelect = async (attachSeq) => {\r\n let param = DataPackage.create('MAI100', 'SelectAttach');\r\n param.KeyValues.push(DataPackage.NewKeyValue('ATTACH_SEQ', attachSeq));\r\n param.KeyValues.push(DataPackage.NewKeyValue('FILE_TYPE', props.fileType));\r\n try {\r\n let response = (await ISOAxios.Execute(param)).JsonData;\r\n\r\n if (response) {\r\n }\r\n\r\n let responseJson = response;\r\n let fileList = [];\r\n let file = {};\r\n for (let i = 0; i < responseJson.length; i++) {\r\n file = {\r\n name: responseJson[i]['ORI_FILE_NM'],\r\n size: responseJson[i]['FILE_SIZE'],\r\n type: responseJson[i]['FILE_TYPE'],\r\n path: responseJson[i]['FILE_PATH'],\r\n uploaded: 'Y',\r\n seq: responseJson[i]['ATTACH_FILE_SEQ'],\r\n rename: responseJson[i]['SAVE_FILE_NM'],\r\n };\r\n\r\n fileList.push(file);\r\n }\r\n\r\n setSelectedFiles(fileList);\r\n } catch (error) {\r\n e3.modal.alert(alertType.Error, error.message);\r\n }\r\n };\r\n\r\n React.useImperativeHandle(ref, () => ({\r\n // 첨부파일 목록 불러오기\r\n async getFileList(tempAttachSeq) {\r\n handlePostSelect(tempAttachSeq);\r\n },\r\n getList() {\r\n return selectedFiles;\r\n },\r\n // 첨부파일 저장\r\n async saveFileList(tempAttachSeq, callback) {\r\n // 시작전 첨부파일 순번 기억\r\n attachSeq = tempAttachSeq;\r\n\r\n // 업로드할 파일 갯수 확인\r\n let cnt = selectedFiles.length;\r\n let uploadingCnt = 0;\r\n for (let i = 0; i < cnt; i++) {\r\n if (selectedFiles[i].uploaded != 'Y') uploadingCnt++;\r\n }\r\n\r\n // 업로드 해야 할 파일이 하나라도 있으면 업로드 진행함\r\n // 업로드 할 파일이 없는 경우에는 파일목록 갱신하고, 게시판 저장으로 넘어감\r\n if (uploadingCnt == 0) {\r\n // 삭제된 파일 갱신\r\n await selectedFileListDBUpdate(tempAttachSeq);\r\n // callback 함수를 호출\r\n callback(tempAttachSeq);\r\n return;\r\n }\r\n\r\n handlePostUploadBefore(tempAttachSeq, async (tempUploadFiles) => {\r\n // 업로드 할 파일이 없다면 바로 게시판 저장으로 넘어감\r\n if (tempUploadFiles.length == 0) {\r\n callback(tempAttachSeq);\r\n return;\r\n }\r\n\r\n // 1. 첨부 그룹 저장\r\n let param = DataPackage.create('MAI100', 'SaveAttach');\r\n\r\n param.KeyValues.push(DataPackage.NewKeyValue('ATTACH_SEQ', tempAttachSeq > '0' ? tempAttachSeq : ''));\r\n param.KeyValues.push(DataPackage.NewKeyValue('USE_YN', 'Y'));\r\n\r\n try {\r\n // 저장\r\n let result = '';\r\n // if (tempAttachSeq != ''){\r\n result = await ISOAxios.Execute(param);\r\n // }\r\n // else {\r\n // result = await ISOAxios.RequestPop(param);\r\n // }\r\n\r\n // 2. 첨부 파일 저장\r\n for (let i = 0; i < tempUploadFiles.length; i++) {\r\n let serverFileName = tempUploadFiles[i].OriFileName;\r\n for (let j = 0; j < selectedFiles.length; j++) {\r\n let clientFileName = selectedFiles[j].name;\r\n if (serverFileName == clientFileName) {\r\n // 저장로직 실행\r\n let paramDetail = DataPackage.create('MAI100', 'SaveAttachFile');\r\n\r\n tempAttachSeq = tempAttachSeq > '0' ? tempAttachSeq : result.KeyValues[2].Value;\r\n\r\n let nameSplit = selectedFiles[j].name.split('.');\r\n\r\n paramDetail.KeyValues.push(DataPackage.NewKeyValue('ATTACH_SEQ', tempAttachSeq));\r\n paramDetail.KeyValues.push(DataPackage.NewKeyValue('ATTACH_FILE_SEQ', ''));\r\n paramDetail.KeyValues.push(DataPackage.NewKeyValue('ORI_FILE_NM', selectedFiles[j].name));\r\n paramDetail.KeyValues.push(DataPackage.NewKeyValue('FILE_EXT', nameSplit[nameSplit.length - 1]));\r\n paramDetail.KeyValues.push(DataPackage.NewKeyValue('FILE_SIZE', selectedFiles[j].size));\r\n paramDetail.KeyValues.push(DataPackage.NewKeyValue('FILE_TYPE', props.fileType));\r\n paramDetail.KeyValues.push(DataPackage.NewKeyValue('FILE_PATH', tempUploadFiles[i].FileName));\r\n\r\n paramDetail.KeyValues.push(DataPackage.NewKeyValue('SAVE_FILE_NM', tempUploadFiles[i].RealFileName));\r\n paramDetail.KeyValues.push(DataPackage.NewKeyValue('USE_YN', 'Y'));\r\n\r\n try {\r\n await ISOAxios.Execute(paramDetail);\r\n } catch (error) {\r\n e3.modal.alert(alertType.Error, error.message);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // 첨부파일 저장이 완료 되었으면 게시판 내용 저장\r\n callback(tempAttachSeq);\r\n } catch (error) {\r\n e3.modal.alert(alertType.Error, error.message);\r\n }\r\n });\r\n },\r\n clearFileList() {\r\n setSelectedFiles([]);\r\n setUploadFiles([]);\r\n setValidFiles([]);\r\n },\r\n }));\r\n\r\n return (\r\n <>\r\n \r\n
    \r\n \r\n {props.name || '첨부파일'} 추가{' '}\r\n \r\n
    \r\n\r\n \r\n {selectedFiles.map((data, i) => {\r\n if (props.toImage) {\r\n return (\r\n
    \r\n {data.type.indexOf('image') > -1 && (\r\n \r\n )}\r\n removeFile(data.name)}\r\n >\r\n {' '}\r\n X{' '}\r\n
    \r\n \r\n );\r\n } else {\r\n return (\r\n
    \r\n
    \r\n
    \r\n
    \r\n {data.name}\r\n ({fileSize(data.size)}){' '}\r\n {data.invalid && ({errorMessage})}\r\n removeFile(data.name)}\r\n >\r\n {' '}\r\n X{' '}\r\n
    \r\n downloadFile(data.rename, data.seq)}\r\n className=\"file-download\"\r\n >\r\n {' '}\r\n 다운로드{' '}\r\n \r\n
    \r\n \r\n );\r\n }\r\n })}\r\n \r\n \r\n );\r\n});\r\n\r\nexport default AttachFile;\r\n","import React from 'react';\r\nimport Draggable from 'react-draggable';\r\nimport { withStyles, makeStyles } from '@material-ui/core/styles';\r\nimport MuiDialogTitle from '@material-ui/core/DialogTitle';\r\nimport MuiDialogActions from '@material-ui/core/DialogActions';\r\nimport MuiDialogContent from '@material-ui/core/DialogContent';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport CloseIcon from '@material-ui/icons/Close';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Slide from '@material-ui/core/Slide';\r\nimport Paper from '@material-ui/core/Paper';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n margin: {\r\n margin: theme.spacing(1),\r\n },\r\n extendedIcon: {\r\n marginRight: theme.spacing(1),\r\n },\r\n}));\r\n\r\nfunction PaperComponent(props) {\r\n const handleId = `#${props['aria-labelledby']}`;\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nconst Transition = React.forwardRef((props, ref) => );\r\n\r\n/**\r\n * Dialog Text 입력할 경우

    ~

    에 해당하는 material-ui Component\r\n * @param {*} props\r\n */\r\nfunction DialogText(props) {\r\n return (\r\n <>\r\n {props.children}\r\n \r\n );\r\n}\r\n\r\nconst styles = (theme) => ({\r\n root: {\r\n margin: 0,\r\n padding: theme.spacing(2),\r\n cursor: 'move',\r\n },\r\n closeButton: {\r\n position: 'absolute',\r\n right: theme.spacing(1),\r\n top: theme.spacing(1),\r\n color: theme.palette.grey[500],\r\n cursor: 'pointer',\r\n },\r\n});\r\n\r\nconst ISODialogTitle = withStyles(styles)((props) => {\r\n const { classes, children, onClose, ...other } = props;\r\n return (\r\n \r\n {children}\r\n {onClose ? (\r\n \r\n \r\n \r\n ) : null}\r\n \r\n );\r\n});\r\nconst ISODialogContent = withStyles((theme) => ({\r\n root: {\r\n padding: theme.spacing(2),\r\n },\r\n}))(MuiDialogContent);\r\n\r\nconst stylesAction = (theme) => ({\r\n root: {\r\n margin: 0,\r\n padding: theme.spacing(1),\r\n },\r\n leftButton: {\r\n justifyContent: 'right',\r\n },\r\n centerButton: {\r\n justifyContent: 'center',\r\n },\r\n rightButton: {\r\n justifyContent: 'flex-end',\r\n },\r\n});\r\nconst ISODialogActions = withStyles(stylesAction)((props) => {\r\n const { classes, children, buttonAlign, ...other } = props;\r\n const alignClass =\r\n buttonAlign === 'left' ? classes.leftButton : buttonAlign === 'center' ? classes.centerButton : classes.rightButton;\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n});\r\n\r\nexport { PaperComponent, Transition, useStyles, DialogText, ISODialogTitle, ISODialogContent, ISODialogActions };\r\n","const tableGridApi = {\r\n RowState: {\r\n Detached: 'Detached',\r\n Unchanged: 'Unchanged',\r\n Added: 'Added',\r\n Deleted: 'Deleted',\r\n Modified: 'Modified',\r\n Total: 'Total',\r\n SubTotal: 'SubTotal',\r\n },\r\n SelectionMode: {\r\n Row: 'Row',\r\n Cell: 'Cell',\r\n },\r\n addColumnGroup: ({ label, align, name }) => {\r\n const group = {};\r\n group.label = label;\r\n group.align = align;\r\n group.name = name;\r\n return group;\r\n },\r\n addColumn: ({\r\n label,\r\n dataField,\r\n width = 50,\r\n allowEdit = false,\r\n hAlign = 'center',\r\n vAlign = 'middle',\r\n visible = true,\r\n columnGroup,\r\n template,\r\n editor,\r\n dataType,\r\n formatFunction,\r\n allowResize = true,\r\n }) => {\r\n const column = {};\r\n column.align = hAlign;\r\n column.label = label;\r\n column.dataField = dataField;\r\n column.width = width;\r\n column.allowEdit = allowEdit;\r\n column.cellsAlign = hAlign; // TODO: 필요없는지 확인하여 삭제\r\n column.cellsVerticalAlign = vAlign;\r\n column.verticalAlign = 'middle';\r\n column.allowResize = allowResize;\r\n column.visible = visible;\r\n\r\n if (template) {\r\n column.template = template;\r\n }\r\n\r\n if (editor) {\r\n column.editor = editor;\r\n }\r\n\r\n if (columnGroup) {\r\n column.columnGroup = columnGroup;\r\n }\r\n\r\n if (formatFunction) {\r\n column.formatFunction = formatFunction;\r\n }\r\n\r\n if (dataType) {\r\n column.dataType = dataType;\r\n }\r\n\r\n return column;\r\n },\r\n};\r\n\r\nexport { tableGridApi };\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport JqxGrid, { jqx } from 'jqwidgets-scripts/jqwidgets-react-tsx/jqxgrid';\r\nimport GridContextMenu from 'src/framework/components/controls/GridContextMenu';\r\n\r\nclass ISOGrid extends React.PureComponent {\r\n grid = React.createRef(JqxGrid);\r\n contextMenu = React.createRef(GridContextMenu);\r\n\r\n selectedRow;\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.deleteRow = this.deleteRow.bind(this);\r\n this.deleteRowByIndex = this.deleteRowByIndex.bind(this);\r\n this.setDataBinding = this.setDataBinding.bind(this);\r\n this.setColumns = this.setColumns.bind(this);\r\n this.setColumnGroups = this.setColumnGroups.bind(this);\r\n this.selectRow = this.selectRow.bind(this);\r\n this.unselectRow = this.unselectRow.bind(this);\r\n this.getRowDataById = this.getRowDataById.bind(this);\r\n this.getRowData = this.getRowData.bind(this);\r\n this.getSelectedRow = this.getSelectedRow.bind(this);\r\n this.getSelectedrows = this.getSelectedrows.bind(this);\r\n this.addRow = this.addRow.bind(this);\r\n this.clearSelection = this.clearSelection.bind(this);\r\n this.getRows = this.getRows.bind(this);\r\n this.selectAllRows = this.selectAllRows.bind(this);\r\n this.setCellValue = this.setCellValue.bind(this);\r\n this.getCellValue = this.getCellValue.bind(this);\r\n this.getCell = this.getCell.bind(this);\r\n this.getSelectedRowIndex = this.getSelectedRowIndex.bind(this);\r\n\r\n this.onRowClick = this.onRowClick.bind(this);\r\n this.onRowDoubleClick = this.onRowDoubleClick.bind(this);\r\n\r\n this.state = {\r\n columns: this.props.columns,\r\n columnGroups: this.props.columnGroups,\r\n source: {\r\n localdata: {},\r\n },\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n document.addEventListener('contextmenu', (event) => event.preventDefault());\r\n }\r\n\r\n /**\r\n * 행 삭제\r\n */\r\n deleteRow = () => {\r\n const rowid = this.grid.current.getrowid(this.grid.current.getselectedrowindex());\r\n\r\n let { source } = this.state;\r\n let localdata = source._source.localdata;\r\n localdata.splice(rowid, 1);\r\n source.localdata = localdata;\r\n\r\n this.grid.current.deleterow(rowid);\r\n };\r\n\r\n /**\r\n *\r\n * @param {int} rowIndex\r\n */\r\n deleteRowByIndex = (rowIndex) => {\r\n const rowid = this.grid.current.getrowid(rowIndex);\r\n\r\n let { source } = this.state;\r\n let localdata = source._source.localdata;\r\n localdata.splice(rowid, 1);\r\n source.localdata = localdata;\r\n\r\n this.grid.current.deleterow(rowid);\r\n };\r\n\r\n /**\r\n * Grid Data bind..\r\n * @param datasource\r\n */\r\n setDataBinding(datasource) {\r\n if (!datasource) return;\r\n\r\n const { columns } = this.state;\r\n\r\n let datafields = [];\r\n let convertSource = [];\r\n let count = 0;\r\n let columnCount = columns.length;\r\n\r\n // 순서\r\n // 1. 컬럼 설정\r\n // 2. 컬럼 설정 이후 데이터 바인딩\r\n const isDoneSettingColumn = async () => {\r\n if (count == columnCount) settingColumnAfter();\r\n };\r\n\r\n const settingColumn = async () => {\r\n columns.forEach(async (e) => {\r\n if (e.columntype == 'dropdownlist') {\r\n let params = DataPackage.create('SYS100', 'getCodes');\r\n params.KeyValues.push(DataPackage.NewKeyValue('codeId', e.datafield));\r\n let data = jsonCheck((await ISOAxios.Execute(params)).JsonData);\r\n\r\n if (data) {\r\n let source = {\r\n datatype: 'array',\r\n datafields: [\r\n { name: 'LABEL', type: 'string' },\r\n { name: 'VALUE', type: 'string' },\r\n ],\r\n localdata: data,\r\n };\r\n\r\n let adapter = new jqx.dataAdapter(source, { autoBind: true });\r\n\r\n datafields.push({\r\n name: e.datafield + '_NM',\r\n value: e.datafield,\r\n values: {\r\n source: adapter.records,\r\n value: 'VALUE',\r\n name: 'LABEL',\r\n },\r\n });\r\n datafields.push({\r\n name: e.datafield,\r\n type: 'string',\r\n });\r\n\r\n e.createeditor = (row, value, editor) => {\r\n editor.jqxDropDownList({\r\n source: adapter,\r\n displayMember: 'LABEL',\r\n valueMember: 'VALUE',\r\n autoDropDownHeight: data.length < 8 ? true : false,\r\n });\r\n };\r\n }\r\n count++;\r\n\r\n isDoneSettingColumn();\r\n } else if (e.datafield === 'USE_YN') {\r\n let useynSource = {\r\n datatype: 'array',\r\n datafields: [\r\n { name: 'label', type: 'string' },\r\n { name: 'value', type: 'string' },\r\n ],\r\n localdata: [\r\n { value: 'Y', label: '사용' },\r\n { value: 'N', label: '사용안함' },\r\n ],\r\n };\r\n let dataAdapter = new jqx.dataAdapter(useynSource, {\r\n autoBind: true,\r\n });\r\n datafields.push({\r\n name: 'USEYNNME',\r\n value: e.datafield,\r\n values: {\r\n source: dataAdapter.records,\r\n value: 'value',\r\n name: 'label',\r\n },\r\n });\r\n datafields.push({\r\n name: e.datafield,\r\n type: 'string',\r\n });\r\n\r\n count++;\r\n\r\n isDoneSettingColumn();\r\n } else {\r\n datafields.push({\r\n name: e.datafield,\r\n type: e.columnType,\r\n format: e.cellsformat,\r\n });\r\n\r\n count++;\r\n\r\n isDoneSettingColumn();\r\n }\r\n });\r\n };\r\n\r\n const settingColumnAfter = () => {\r\n if (typeof datasource === 'string') {\r\n convertSource = JSON.parse(datasource);\r\n } else {\r\n convertSource = datasource;\r\n }\r\n\r\n convertSource.forEach((e, index) => {\r\n e.NO = index + 1;\r\n });\r\n\r\n const source = new jqx.dataAdapter({\r\n datatype: 'array',\r\n datafields: datafields,\r\n localdata: convertSource,\r\n });\r\n\r\n this.setState({\r\n source: source,\r\n });\r\n\r\n if (this.props.selectionmode === 'checkbox' && this.state.source.records) {\r\n this.clearSelection();\r\n // console.log(this.state.source.records);\r\n this.state.source.records.map((e, i) => {\r\n if (e.CHK && e.CHK === '1') {\r\n // this.selectrow(e.boundindex);\r\n this.grid.current.selectrow(e.boundindex);\r\n }\r\n // else {\r\n // // console.log(\"unselectrow\", i, e.boundindex, e);\r\n // this.unselectrow(e.boundindex);\r\n // }\r\n });\r\n }\r\n };\r\n\r\n settingColumn();\r\n }\r\n\r\n /**\r\n * column Setting\r\n * @param colgroup\r\n */\r\n setColumns = (columns) => {\r\n this.setState({\r\n columns: columns,\r\n });\r\n };\r\n\r\n /**\r\n * column Group Setting\r\n * @param colgroup\r\n */\r\n setColumnGroups = (colgroup) => {\r\n this.setState({\r\n columnGroups: colgroup,\r\n });\r\n };\r\n\r\n /**\r\n * 행 선택 (1개)\r\n * @param index\r\n */\r\n selectRow(index) {\r\n const selectedRowIndex = this.grid.current.getselectedrowindex();\r\n if (selectedRowIndex !== index) {\r\n if (selectedRowIndex > -1) {\r\n this.grid.current.unselectrow(selectedRowIndex);\r\n }\r\n this.grid.current.selectrow(index);\r\n this.selectedRow = this.grid.current.getrows().find((e) => e.boundindex === index);\r\n }\r\n }\r\n\r\n /**\r\n * Grid Row unSelect\r\n * @param index\r\n */\r\n unselectRow(index) {\r\n this.grid.current.unselectrow(index);\r\n }\r\n\r\n /**\r\n * 행ID로 행 정보 찾기\r\n * @param id\r\n * @returns {*}\r\n */\r\n getRowDataById = (id) => this.grid.current.getrowdatabyid(id);\r\n\r\n getRowData = (rowindex) => this.grid.current.getrowdata(rowindex);\r\n\r\n /**\r\n * 선택된 행 반환(단수)\r\n * @returns {null}\r\n */\r\n getSelectedRow() {\r\n if (this.selectedRow) {\r\n return this.selectedRow;\r\n }\r\n const index = this.grid.current.getselectedrowindex();\r\n const selectedRow = this.grid.current.getrows().find((e) => e.boundindex === index);\r\n if (selectedRow > -1) this.selectedRow = selectedRow;\r\n return selectedRow;\r\n }\r\n\r\n /**\r\n * 선택된 행 반환(복수)\r\n * @returns {null}\r\n */\r\n getSelectedrows() {\r\n const indexes = this.grid.current.getselectedrowindexes();\r\n return indexes.map((e) => this.grid.current.getrows().find((f) => f.boundindex === e));\r\n }\r\n\r\n /**\r\n * 행 추가\r\n */\r\n addRow = (addedItems) => {\r\n let { source, columns } = this.state;\r\n let rowItem = {};\r\n let DataRow = addItems;\r\n //console.log(DataRow);\r\n if (DataRow === undefined) {\r\n columns.forEach((r) => {\r\n rowItem[r.datafield] = '';\r\n });\r\n } else if (DataRow !== null) {\r\n rowItem = addedItems;\r\n }\r\n if (source.records === undefined) {\r\n let ary = [];\r\n ary.push(rowItem);\r\n this.setDataBinding(ary);\r\n } else {\r\n this.grid.current.addrow(source.records.length + 1, rowItem);\r\n let localdata = source._source.localdata;\r\n localdata.push(rowItem);\r\n\r\n source.localdata = localdata;\r\n }\r\n };\r\n\r\n setcolumnproperty = (datafiled, property, propertyValue) => {this.grid.current.setcolumnproperty(datafiled, property, propertyValue);};\r\n\r\n /**\r\n * 선택된 행 초기화\r\n */\r\n clearSelection = () => {\r\n this.grid.current.clearselection();\r\n };\r\n\r\n /**\r\n * 전체 로우 반환\r\n * @returns {*}\r\n */\r\n getRows = () => this.grid.current.getrows();\r\n\r\n /**\r\n * 전체 행 선택\r\n */\r\n selectAllRows = () => {\r\n this.grid.current.selectallrows();\r\n };\r\n\r\n setCellValue = (rowBoundIndex, dataField, cellValue) => {\r\n this.grid.current.setcellvalue(rowBoundIndex, dataField, cellValue);\r\n };\r\n getCellValue = (rowBoundIndex, dataField) => this.grid.current.getcellvalue(rowBoundIndex, dataField);\r\n getCell = (rowBoundIndex, dataField) => this.grid.current.getcell(rowBoundIndex, dataField);\r\n\r\n getSelectedRowIndex() {\r\n const index = this.grid.current.getselectedrowindex();\r\n return index;\r\n }\r\n\r\n /**\r\n * 행 선택 이벤트\r\n * @param e\r\n */\r\n onRowClick = (e) => {\r\n this.selectedRow = e.args.row.bounddata;\r\n if (e.args.rightclick) {\r\n this.contextMenu.current.openMenu(e.args.originalEvent.clientX, e.args.originalEvent.clientY);\r\n }\r\n if (this.props.onRowClick) {\r\n this.props.onRowClick(e);\r\n }\r\n };\r\n\r\n onRowDoubleClick = (e) => {\r\n if (this.props.onRowDoubleClick) {\r\n this.props.onRowDoubleClick(e);\r\n }\r\n };\r\n\r\n onCellBeginEdit = (e) => {\r\n if (this.props.onCellBeginEdit) {\r\n this.props.onCellBeginEdit(e);\r\n }\r\n };\r\n\r\n onCellEndEdit = (e) => {\r\n if (this.props.onCellEndEdit) {\r\n this.props.onCellEndEdit(e);\r\n } else {\r\n let { source } = this.state;\r\n let localdata = source._source.localdata;\r\n\r\n let columntype = e.args.columntype;\r\n let row = e.args.rowindex;\r\n let column = e.args.datafield;\r\n let value = e.args.value;\r\n\r\n if (columntype == 'dropdownlist') {\r\n // ITEM_CD\r\n localdata[row][column] = value.value;\r\n // ITEM_CD_NM\r\n localdata[row][column + '_NM'] = value.label;\r\n // ITEM_NM\r\n localdata[row][e.args.displayfield] = value.label;\r\n } else {\r\n localdata[row][column] = value;\r\n }\r\n\r\n source.localdata = localdata;\r\n }\r\n };\r\n render() {\r\n const { columns, columnGroups, onRowClick, onCellBeginEdit, onCellEndEdit, ...gridProps } = this.props;\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nISOGrid.propTypes = {\r\n // ISOGrid props\r\n columns: PropTypes.array.isRequired,\r\n columnGroups: PropTypes.array,\r\n onRowClick: PropTypes.func,\r\n onRowDoubleClick: PropTypes.func,\r\n onCellBeginEdit: PropTypes.func,\r\n onCellEndEdit: PropTypes.func,\r\n\r\n // jqxGrid 자체 props\r\n theme: PropTypes.string,\r\n width: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n height: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n pageable: PropTypes.bool,\r\n autoheight: PropTypes.bool,\r\n sortable: PropTypes.bool,\r\n altrows: PropTypes.bool,\r\n enabletooltips: PropTypes.bool,\r\n editable: PropTypes.bool,\r\n selectionmode: PropTypes.string,\r\n columnsresize: PropTypes.bool,\r\n toolbarheight: PropTypes.number,\r\n statusbarheight: PropTypes.number,\r\n columnsheight: PropTypes.number,\r\n groupsheaderheight: PropTypes.number,\r\n};\r\n\r\nISOGrid.defaultProps = {\r\n // ISOGrid props\r\n columns: [],\r\n columnGroups: [],\r\n onRowClick: null,\r\n onRowDoubleClick: null,\r\n onCellBeginEdit: null,\r\n onCellEndEdit: null,\r\n\r\n // jqxGrid 자체 props\r\n width: '100%',\r\n height: '100%',\r\n pageable: false,\r\n autoheight: false,\r\n sortable: true,\r\n altrows: false,\r\n enabletooltips: false,\r\n editable: false,\r\n selectionmode: 'singlerow',\r\n columnsresize: true,\r\n toolbarheight: 24,\r\n statusbarheight: 24,\r\n columnsheight: 23,\r\n groupsheaderheight: 23,\r\n};\r\n\r\nexport default ISOGrid;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport Select from 'react-select';\r\nimport ISOAxios, { DataPackage } from 'src/framework/core/apis/ISOAxios';\r\nimport { prototype } from 'apexcharts';\r\nimport { getXmlEscapedToOriginal } from \"../../core/utils/utils\";\r\n\r\nclass ISOCombobox extends React.PureComponent {\r\n defaultSelected;\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.enable = this.enable.bind(this);\r\n this.disable = this.disable.bind(this);\r\n this.clear = this.clear.bind(this);\r\n this.setValue = this.setValue.bind(this);\r\n this.getValue = this.getValue.bind(this);\r\n this.setDataBinding = this.setDataBinding.bind(this);\r\n this.setSelectedIndex = this.setSelectedIndex.bind(this);\r\n this.onChange = this.onChange.bind(this);\r\n this.onReady = this.onReady.bind(this);\r\n\r\n this.defaultSelected = {};\r\n if (props.multiable) {\r\n this.defaultSelected = [];\r\n } else {\r\n this.defaultSelected[this.props.displayMember] = props.placeholder ? props.placeholder : '';\r\n this.defaultSelected[this.props.valueMember] = '';\r\n }\r\n\r\n this.state = {\r\n textLabel: props.textLabel,\r\n selectedValue: this.defaultSelected,\r\n source: [],\r\n disabled: this.props.disabled,\r\n };\r\n }\r\n\r\n addBlank(jsonResult) {\r\n const blankData = { VALUE: '', LABEL: '' };\r\n jsonResult.unshift(blankData);\r\n return jsonResult;\r\n }\r\n\r\n addSelect(jsonResult) {\r\n const blankData = { VALUE: '', LABEL: '선택' };\r\n jsonResult.unshift(blankData);\r\n return jsonResult;\r\n }\r\n\r\n addAll(jsonResult) {\r\n const allData = { VALUE: '', LABEL: '전체' };\r\n jsonResult.unshift(allData);\r\n return jsonResult;\r\n }\r\n\r\n async componentWillMount() {\r\n if (this.props.codeId) {\r\n if (this.props.codeId == 'USER_ID') {\r\n let params = DataPackage.create('SYS120', 'GetUsers');\r\n if (this.props.subParam1) {\r\n // 리더 여부\r\n params.KeyValues.push(DataPackage.NewKeyValue('leader_yn', this.props.subParam1));\r\n }\r\n if (this.props.subParam2) {\r\n // 부서\r\n params.KeyValues.push(DataPackage.NewKeyValue('departId', this.props.subParam2));\r\n }\r\n\r\n let result = (await ISOAxios.Execute(params)).JsonData;\r\n if (this.props.filter) {\r\n result = result.filter((item) => item.VALUE === this.props.filter);\r\n }\r\n\r\n await this.setDataBinding(result);\r\n } else if (this.props.codeId == 'Leader') {\r\n let params = DataPackage.create('VAC100', 'GetLeaders');\r\n if (this.props.subParam1) {\r\n // 리더 여부\r\n params.KeyValues.push(DataPackage.NewKeyValue('leader_yn', this.props.subParam1));\r\n }\r\n\r\n let result = (await ISOAxios.Execute(params)).JsonData;\r\n if (this.props.filter) {\r\n result = result.filter((item) => item.VALUE === this.props.filter);\r\n }\r\n\r\n await this.setDataBinding(result);\r\n } else if (this.props.codeId == 'DEPTId') {\r\n let params = DataPackage.create('SYS100', 'GetDEPT');\r\n if (this.props.deptType) {\r\n // 본부 선택\r\n params.KeyValues.push(DataPackage.NewKeyValue('DEPT_TYPE', this.props.deptType));\r\n }\r\n\r\n let result = (await ISOAxios.Execute(params)).JsonData;\r\n for(let i = 0; i < result.length; i++){\r\n result[i].LABEL = getXmlEscapedToOriginal(result[i].LABEL)\r\n }\r\n if (this.props.filter) {\r\n result = result.filter((item) => item.VALUE === this.props.filter);\r\n }\r\n if (this.props.filterOut) {\r\n result = result.filter((item) => item.VALUE !== this.props.filterOut);\r\n }\r\n\r\n await this.setDataBinding(result);\r\n }\r\n else {\r\n let params = DataPackage.create('SYS100', 'getCodes');\r\n\r\n params.KeyValues.push(DataPackage.NewKeyValue('codeId', this.props.codeId));\r\n if (this.props.plantId) {\r\n params.KeyValues.push(DataPackage.NewKeyValue('plantId', this.props.plantId));\r\n }\r\n params.KeyValues.push(DataPackage.NewKeyValue('defaultValue', this.props.defaultValue));\r\n let result = (await ISOAxios.Execute(params)).JsonData;\r\n\r\n if (this.props.filter) {\r\n result = result.filter((item) => item.VALUE === this.props.filter);\r\n }\r\n\r\n if (this.props.filterOut) {\r\n result = result.filter((item) => item.VALUE !== this.props.filterOut);\r\n }\r\n\r\n await this.setDataBinding(result);\r\n await this.onReady();\r\n }\r\n\r\n if (this.props.defaultSelectCode != undefined && this.props.defaultSelectCode != null && this.props.defaultSelectCode?.length > 0) {\r\n await this.setValue(this.props.defaultSelectCode);\r\n }\r\n }\r\n }\r\n\r\n enable() {\r\n if (this.state.disabled) {\r\n this.setState({\r\n disabled: false,\r\n });\r\n }\r\n }\r\n\r\n disable() {\r\n if (!this.state.disabled) {\r\n this.setState({\r\n disabled: true,\r\n });\r\n }\r\n }\r\n\r\n clear() {\r\n this.setState({\r\n selectedValue: this.defaultSelected,\r\n });\r\n }\r\n\r\n getLabel() {\r\n return this.state.textLabel;\r\n }\r\n\r\n getValue() {\r\n let value = null;\r\n\r\n if (this.state.selectedValue) {\r\n if (this.state.multiable) {\r\n value = this.state.selectedValue.map((e) => e.value).join(',');\r\n } else {\r\n value = this.state.selectedValue.value;\r\n if (!value) {\r\n value = this.defaultSelected[this.props.valueMember];\r\n }\r\n }\r\n }\r\n return value;\r\n }\r\n\r\n async setValue(value) {\r\n const { source } = this.state;\r\n\r\n if (source.length === 0) return false;\r\n\r\n let array = [];\r\n if (typeof source === 'array') {\r\n //\r\n } else {\r\n array = source.find((e) => e.value === value);\r\n }\r\n\r\n const changed = this.state.selectedValue !== array;\r\n await this.setState({\r\n selectedValue: array,\r\n });\r\n if (changed) {\r\n if (this.props.onChange) {\r\n this.props.onChange(array);\r\n }\r\n }\r\n }\r\n\r\n async setSelectedIndex(value) {\r\n if (value) {\r\n const { source } = this.state;\r\n\r\n if (source) {\r\n const array = source.find((e, i) => {\r\n if (i === value) {\r\n return e;\r\n }\r\n });\r\n await this.setState({\r\n selectedValue: array,\r\n });\r\n if (this.props.onChange) {\r\n await this.props.onChange(array);\r\n }\r\n }\r\n }\r\n }\r\n\r\n getSelectedIndex = () => {\r\n const index = this.state.source.findIndex((e) => {\r\n if (typeof this.state.selectedValue === 'array') {\r\n return null;\r\n }\r\n if (e.value === this.state.selectedValue.value) {\r\n return e;\r\n }\r\n });\r\n return index;\r\n };\r\n async setDataBinding(source) {\r\n if (source) {\r\n let selected;\r\n let bindingSource = typeof source === 'string' ? JSON.parse(source) : source;\r\n if (this.props.isAddAll) {\r\n bindingSource = this.addAll(bindingSource);\r\n }\r\n if (this.props.isAddBlank) {\r\n bindingSource = this.addBlank(bindingSource);\r\n }\r\n if (this.props.isAddSelect) {\r\n bindingSource = this.addSelect(bindingSource);\r\n }\r\n\r\n if (this.props.placeholder && this.props.defaultValue) {\r\n bindingSource = [{ label: this.props.placeholder, value: '' }, ...bindingSource];\r\n }\r\n\r\n let convertSource = bindingSource.map((e) => ({\r\n label: e[this.props.displayMember],\r\n value: e[this.props.valueMember],\r\n }));\r\n\r\n // default로 선택 했을 때의 처리\r\n if (this.state.source && this.props.placeholder) {\r\n selected = this.getElementByIndex(convertSource, 0);\r\n } else if (this.props.defaultIndex > -1) {\r\n selected = this.getElementByIndex(convertSource, this.props.defaultIndex);\r\n }\r\n\r\n // 이벤트 강제 발생\r\n if (selected) {\r\n this.onChange(selected);\r\n }\r\n\r\n this.setState({\r\n source: convertSource,\r\n });\r\n }\r\n if (this.state.disabled) {\r\n this.disable();\r\n }\r\n }\r\n\r\n getElementByIndex = (source, index) => {\r\n\r\n const element = source.find((e, i) => {\r\n if (i === index) {\r\n return e;\r\n }\r\n });\r\n\r\n return element;\r\n };\r\n\r\n async onChange(e) {\r\n await this.setState({\r\n selectedValue: e == null ? this.defaultSelected : e,\r\n });\r\n\r\n if (this.props.onChange) {\r\n this.props.onChange(e);\r\n }\r\n }\r\n\r\n async onReady(e) {\r\n if (this.props.onReady) {\r\n this.props.onReady(e);\r\n }\r\n }\r\n\r\n control = (props) => (\r\n ({ ...provided, zIndex: 999 }) }}\r\n MenuProps={{\r\n anchorOrigin: {\r\n vertical: 'bottom',\r\n horizontal: 'left',\r\n },\r\n transformOrigin: {\r\n vertical: 'top',\r\n horizontal: 'left',\r\n },\r\n getContentAnchorEl: null,\r\n }}\r\n menuPlacement={this.props.menuPlacement}\r\n />\r\n );\r\n\r\n render() {\r\n return (\r\n <>\r\n {this.props.textLabel || this.props.children ? (\r\n <>\r\n \r\n \r\n \r\n {this.control(this.props)}\r\n \r\n ) : this.props.colspan ? (\r\n <>\r\n {this.control(this.props)}\r\n \r\n ) : (\r\n this.control(this.props)\r\n )}\r\n \r\n );\r\n }\r\n}\r\n\r\nISOCombobox.propTypes = {\r\n codeId: PropTypes.string,\r\n plantId: PropTypes.string,\r\n subParam1: PropTypes.string,\r\n subParam2: PropTypes.string,\r\n filter: PropTypes.string,\r\n filterOut: PropTypes.string,\r\n\r\n colspan: PropTypes.number,\r\n required: PropTypes.bool,\r\n placeholder: PropTypes.string,\r\n defaultValue: PropTypes.bool,\r\n textLabel: PropTypes.string,\r\n clearable: PropTypes.bool,\r\n searchable: PropTypes.bool,\r\n disabled: PropTypes.bool,\r\n multiable: PropTypes.bool,\r\n displayMember: PropTypes.string,\r\n valueMember: PropTypes.string,\r\n onChange: PropTypes.func,\r\n isAddAll: PropTypes.bool,\r\n isAddBlank: PropTypes.bool,\r\n defaultIndex: PropTypes.number,\r\n defaultSelectCode: PropTypes.string,\r\n menuPlacement: PropTypes.oneOf(['auto', 'top']),\r\n onReady: PropTypes.func,\r\n};\r\n\r\nISOCombobox.defaultProps = {\r\n menuPlacement: 'auto',\r\n defaultValue: false,\r\n clearable: false,\r\n searchable: false,\r\n disabled: false,\r\n multiable: false,\r\n displayMember: 'LABEL',\r\n valueMember: 'VALUE',\r\n onChange: null,\r\n isAddAll: false,\r\n isAddBlank: false,\r\n onReady: null,\r\n};\r\n\r\nexport default ISOCombobox;","import React from 'react';\r\nimport PropsType from 'prop-types';\r\nimport DatePicker, { registerLocale } from 'react-datepicker';\r\nimport ko from 'date-fns/locale/ko';\r\nimport 'react-datepicker/dist/react-datepicker.css';\r\nimport { e3, getString2Date } from 'src/framework/core/utils/utils';\r\nimport { date } from 'yup';\r\n\r\nregisterLocale('ko', ko);\r\n\r\nclass ISODateTime extends React.PureComponent {\r\n datePicker;\r\n\r\n constructor(props) {\r\n super(props);\r\n this.datePicker = React.createRef(DatePicker);\r\n\r\n this.state = {\r\n value: new Date(),\r\n minDate: props.minDate,\r\n maxDate: props.maxDate,\r\n readOnly: props.readOnly,\r\n disabled: props.disabled,\r\n startDate: props.startDate,\r\n endDate: props.endDate,\r\n popperPlacement: props.popperPlacement,\r\n };\r\n }\r\n\r\n clear = () => {\r\n this.setState({\r\n value: '',\r\n minDate: '',\r\n maxDate: '',\r\n startDate: '',\r\n endDate: '',\r\n });\r\n };\r\n\r\n enable = () => {\r\n this.setState({\r\n disabled: false,\r\n });\r\n };\r\n\r\n disable = () => {\r\n this.setState({\r\n disabled: true,\r\n });\r\n };\r\n\r\n getLabel() {\r\n return this.state.textLabel;\r\n }\r\n\r\n setDate = (source) => {\r\n if (source) {\r\n this.setState({\r\n value: e3.date.string2Date(source, this.props.dateFormat),\r\n });\r\n return;\r\n }\r\n\r\n this.setState({\r\n value: '',\r\n });\r\n };\r\n\r\n getDate = (defaultFormat = true) => {\r\n if (defaultFormat) {\r\n const aaa = e3.date.dateToString(this.state.value, this.props.dateFormat);\r\n return aaa === 'Invalid date' ? null : aaa;\r\n }\r\n return this.state.value;\r\n };\r\n\r\n getDate2String = (fmt) => {\r\n if (!this.state.value.valueOf()) return '';\r\n const d = this.state.value;\r\n const weekName = ['일요일', '월요일', '화요일', '수요일', '목요일', '금요일', '토요일'];\r\n let format = fmt === undefined ? this.props.dateFormat : fmt;\r\n return format.replace(/(yyyy|yy|MM|dd|E|hh|mm|ss|a\\/p)/gi, ($1) => {\r\n switch ($1) {\r\n case 'yyyy':\r\n return d.getFullYear();\r\n case 'yy':\r\n return e3.string.lPad(d.getFullYear() % 1000, 2);\r\n case 'MM':\r\n return e3.string.lPad(d.getMonth() + 1, 2);\r\n case 'dd':\r\n return e3.string.lPad(d.getDate(), 2);\r\n case 'E':\r\n return weekName[d.getDay()];\r\n case 'HH':\r\n return e3.string.lPad(d.getHours(), 2);\r\n case 'hh':\r\n return e3.string.lPad(d.getHours() % 12 ? d.getHours() % 12 : 12, 2);\r\n case 'mm':\r\n return e3.string.lPad(d.getMinutes(), 2);\r\n case 'ss':\r\n return e3.string.lPad(d.getSeconds(), 2);\r\n case 'a/p':\r\n return d.getHours() < 12 ? '오전' : '오후';\r\n default:\r\n return $1;\r\n }\r\n });\r\n };\r\n\r\n toLocaleDateString = (locale) => {\r\n const options = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' };\r\n let lo = locale === undefined ? locale : undefined;\r\n return this.state.value.toLocaleDateString(lo, options);\r\n };\r\n\r\n getUTCDate = () => this.state.value.getUTCDate();\r\n\r\n toJSON = () => this.state.value.toJSON();\r\n\r\n setMinDate = (source) => {\r\n this.setState({\r\n minDate: e3.string.stringToDate(source, this.props.dateFormat),\r\n });\r\n };\r\n\r\n setMaxDate = (source) => {\r\n this.setState({\r\n maxDate: e3.string.stringToDate(source, this.props.dateFormat),\r\n });\r\n };\r\n\r\n setReadOnly = (source) => {\r\n this.setState({\r\n readOnly: e3.string.stringToDate(source, this.props.dateFormat),\r\n });\r\n };\r\n\r\n setStartDate = (source) => {\r\n this.setState({\r\n startDate: e3.string.stringToDate(source, this.props.dateFormat),\r\n });\r\n };\r\n\r\n setEndDate = (source) => {\r\n this.setState({\r\n endDate: e3.string.stringToDate(source, this.props.dateFormat),\r\n });\r\n };\r\n\r\n /**\r\n * show datepirkcer\r\n */\r\n onOpen = (e) => {\r\n this.datePicker.current.setOpen(true);\r\n };\r\n\r\n onClose = (e) => {\r\n // this.datePicker.current.setOpen(false);\r\n };\r\n\r\n onChange = (e) => {\r\n this.setDate(e);\r\n\r\n if (this.props.onChange) {\r\n this.props.onChange(e);\r\n }\r\n };\r\n\r\n control = (other) => (\r\n \r\n {/*
    */}\r\n {/*
    오늘
    */}\r\n {/*
    닫기
    */}\r\n {/*
    */}\r\n \r\n );\r\n\r\n render() {\r\n const { textLabel, ...other } = this.props;\r\n\r\n return (\r\n <>\r\n {this.props.textLabel ? (\r\n <>\r\n \r\n \r\n \r\n {this.control(other)}\r\n \r\n ) : this.props.colspan ? (\r\n <>\r\n {this.control(other)}\r\n \r\n ) : (\r\n this.control(other)\r\n )}\r\n \r\n );\r\n }\r\n}\r\n\r\nISODateTime.propTypes = {\r\n textLabel: PropsType.string,\r\n colspan: PropsType.number,\r\n dateFormat: PropsType.string,\r\n disabled: PropsType.bool,\r\n minDate: PropsType.object,\r\n maxDate: PropsType.object,\r\n selectsRange: PropsType.bool,\r\n monthsShown: PropsType.number, // 달력 표시\r\n showPreviousMonths: PropsType.bool, // 금일 기준 이전달 표시\r\n selectsStart: PropsType.bool,\r\n startDate: PropsType.string,\r\n selectsEnd: PropsType.bool,\r\n endDate: PropsType.string,\r\n width: PropsType.oneOfType([PropsType.string, PropsType.number]),\r\n height: PropsType.oneOfType([PropsType.string, PropsType.number]),\r\n popperPlacement: PropsType.string,\r\n};\r\n\r\nISODateTime.defaultProps = {\r\n width: '100%',\r\n height: '100%',\r\n dateFormat: 'yyyy-MM-dd',\r\n disabled: false,\r\n popperPlacement:'bottom',\r\n};\r\n\r\nexport default ISODateTime;\r\n","import React, { useState } from 'react';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport Draggable from 'react-draggable';\r\nimport MuiDialogTitle from '@material-ui/core/DialogTitle';\r\nimport MuiDialogActions from '@material-ui/core/DialogActions';\r\nimport MuiDialogContent from '@material-ui/core/DialogContent';\r\nimport Slide from '@material-ui/core/Slide';\r\nimport Paper from '@material-ui/core/Paper';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport CloseIcon from '@material-ui/icons/Close';\r\nimport { ResizableBox } from 'react-resizable';\r\nimport { withStyles, makeStyles } from '@material-ui/core/styles';\r\nimport { ISOButton } from 'src/framework/components/controls';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n margin: {\r\n margin: theme.spacing(1),\r\n },\r\n extendedIcon: {\r\n marginRight: theme.spacing(1),\r\n },\r\n root: {\r\n margin: 0,\r\n padding: theme.spacing(2),\r\n cursor: 'move',\r\n },\r\n closeButton: {\r\n position: 'absolute',\r\n right: theme.spacing(1),\r\n top: theme.spacing(1),\r\n color: theme.palette.grey[500],\r\n cursor: 'pointer',\r\n },\r\n}));\r\n\r\nfunction PaperComponent(props) {\r\n const handleId = `#${props['aria-labelledby']}`;\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nconst Transition = React.forwardRef((props, ref) => );\r\n\r\nconst Content = withStyles((theme) => ({\r\n root: {\r\n padding: theme.spacing(2),\r\n },\r\n}))(MuiDialogContent);\r\n\r\nexport function ISOPopup(props, ref) {\r\n const [isOpen, setIsOpen] = useState(false);\r\n const classes = useStyles();\r\n const {\r\n title,\r\n actionChildren,\r\n children,\r\n onAccept,\r\n onClose,\r\n dialogId,\r\n height,\r\n width,\r\n buttonAlign,\r\n acceptBtnLabel,\r\n closeBtnLabel,\r\n ...other\r\n } = props;\r\n const alignClass =\r\n buttonAlign === 'left' ? classes.leftButton : buttonAlign === 'center' ? classes.centerButton : classes.rightButton;\r\n\r\n React.useImperativeHandle(ref, () => ({\r\n open() {\r\n setIsOpen(true);\r\n },\r\n close() {\r\n setIsOpen(false);\r\n },\r\n }));\r\n\r\n const handleAccept = () => {\r\n if (onAccept) {\r\n onAccept();\r\n }\r\n };\r\n\r\n const handleClose = () => {\r\n setIsOpen(false);\r\n };\r\n\r\n return (\r\n
    \r\n \r\n \r\n
    \r\n \r\n {title}\r\n \r\n \r\n \r\n \r\n \r\n
    {props.children}
    \r\n
    \r\n \r\n {actionChildren ? (\r\n actionChildren\r\n ) : (\r\n <>\r\n \r\n {acceptBtnLabel ? acceptBtnLabel : '확인'}\r\n \r\n {\r\n if (onClose) {\r\n onClose();\r\n }\r\n handleClose();\r\n }}\r\n >\r\n {closeBtnLabel ? closeBtnLabel : '닫기'}\r\n \r\n \r\n )}\r\n \r\n
    \r\n
    \r\n \r\n
    \r\n );\r\n}\r\n\r\nexport default React.forwardRef(ISOPopup);\r\n","/* eslint-disable react/no-unused-state */\r\nimport React from 'react';\r\nimport JqxTreeGrid, { ITreeGridProps, jqx } from 'jqwidgets-scripts/jqwidgets-react-tsx/jqxtreegrid';\r\nimport PropTypes from 'prop-types';\r\n\r\n/**\r\n * E3 TreeGrid Component\r\n */\r\nclass ISOTreeGrid extends React.PureComponent {\r\n treeGrid;\r\n\r\n /**\r\n * constructor\r\n * @param props\r\n */\r\n constructor(props) {\r\n super(props);\r\n\r\n this.tmp = React.createRef(JqxTreeGrid);\r\n\r\n this.setDataBinding = this.setDataBinding.bind(this);\r\n this.addRow = this.addRow.bind(this);\r\n this.addrow = this.addrow.bind(this);\r\n this.clearSelection = this.clearSelection.bind(this);\r\n this.clear = this.clear.bind(this);\r\n this.checkRow = this.checkRow.bind(this);\r\n this.collapseRow = this.collapseRow.bind(this);\r\n this.collapseAll = this.collapseAll.bind(this);\r\n this.destroy = this.destroy.bind(this);\r\n this.deleteRow = this.deleteRow.bind(this);\r\n this.expandRow = this.expandRow.bind(this);\r\n this.expandAll = this.expandAll.bind(this);\r\n\r\n this.state = {\r\n columns: this.props.columns,\r\n columnGroups: this.props.columnGroups,\r\n source: {\r\n localData: {},\r\n },\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n this.treeGrid = this.tmp.current;\r\n }\r\n\r\n /**\r\n * set source value of state\r\n * @param {*} datasource object\r\n * @returns :: no returtn\r\n */\r\n setDataBinding = (datasource) => {\r\n if (!datasource) return;\r\n const source = new jqx.dataAdapter(datasource);\r\n this.setState({\r\n source: source,\r\n });\r\n };\r\n\r\n /**\r\n * Grid Row add\r\n */\r\n addRow = () => {\r\n this.treeGrid.addRow(0, {}, 'first'); // first, last\r\n };\r\n\r\n /**\r\n * Add Tree Grid(table type) row(tr)\r\n * @param {*} rowKey :: rowData Key\r\n * @param {*} rowData :: All rows object {.....}\r\n * @param {*} rowPosition :: first, last..string value\r\n * @param {*} parent :: parent Key\r\n */\r\n addrow = (rowKey, rowData, rowPosition, parent) => {\r\n if (parent) {\r\n this.treeGrid?.addRow(rowKey, rowData, rowPosition, parent);\r\n } else {\r\n this.treeGrid?.addRow(rowKey, rowData, rowPosition);\r\n }\r\n };\r\n\r\n /**\r\n * Grid Selected Row clear\r\n */\r\n clearSelection = () => {\r\n this.treeGrid.clearSelection();\r\n };\r\n\r\n /**\r\n * Grid clear\r\n */\r\n clear = () => {\r\n this.treeGrid.clear();\r\n };\r\n\r\n /**\r\n * Grid Row Check\r\n * @param rowId\r\n */\r\n checkRow = (rowId) => {\r\n this.treeGrid.checkRow(rowId);\r\n };\r\n\r\n /**\r\n * Grid row Collapse\r\n * @param rowId\r\n */\r\n collapseRow = (rowId) => {\r\n this.treeGrid?.collapseRow(rowId);\r\n };\r\n\r\n /**\r\n * Grid Row Collaspse All\r\n */\r\n collapseAll = () => {\r\n this.treeGrid?.collapseAll();\r\n };\r\n\r\n /**\r\n * ref Component destroy\r\n */\r\n destroy = () => {\r\n this.treeGrid?.destroy();\r\n };\r\n\r\n /**\r\n * Grid Row Delete\r\n * @param rowId\r\n */\r\n deleteRow = (rowId) => {\r\n this.treeGrid?.deleteRow(rowId);\r\n };\r\n\r\n /**\r\n * Grid Row Expand\r\n * @param rowId\r\n */\r\n expandRow = (rowId) => {\r\n this.treeGrid?.expandRow(rowId);\r\n };\r\n /**\r\n * Grid All Expand\r\n */\r\n expandAll = () => {\r\n this.treeGrid?.expandAll();\r\n };\r\n\r\n render() {\r\n return (\r\n { this.treeGrid = r.current; }}\r\n ref={this.tmp}\r\n {...this.props}\r\n source={this.state?.source}\r\n columns={this.state?.columns}\r\n columnGroups={this.state?.columnGroups}\r\n />\r\n );\r\n }\r\n}\r\n\r\nISOTreeGrid.propTypes = {\r\n theme: PropTypes.string,\r\n width: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n height: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n columns: PropTypes.array.isRequired,\r\n checkboxes: PropTypes.bool,\r\n pageable: PropTypes.bool,\r\n autoRowHeight: PropTypes.bool,\r\n sortable: PropTypes.bool,\r\n altRows: PropTypes.bool,\r\n editable: PropTypes.bool,\r\n selectionMode: PropTypes.oneOf(['multipleRows', 'singleRow', 'custom', 'none']),\r\n columnsResize: PropTypes.bool,\r\n statusBarHeight: PropTypes.number,\r\n};\r\n\r\nISOTreeGrid.defaultProps = {\r\n width: '100%',\r\n height: '100%',\r\n columns: [],\r\n checkboxes: false,\r\n pageable: false,\r\n autoRowHeight: false,\r\n sortable: true,\r\n altRows: false,\r\n editable: false,\r\n selectionMode: 'singleRow',\r\n columnsResize: true,\r\n statusBarHeight: 25,\r\n};\r\n\r\nexport default ISOTreeGrid;\r\n","import React from 'react';\r\nimport JqxKanban, { IKanbanProps, jqx } from 'jqwidgets-scripts/jqwidgets-react-tsx/jqxkanban';\r\nimport { alertType, e3 } from 'src/framework/core/utils/utils';\r\n\r\nclass ISOJqxKanban extends React.PureComponent {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n customRender: false,\r\n columnRenderer: this.columnRenderer,\r\n dataFields: [],\r\n columns: [],\r\n source: [],\r\n resources: this.resourcesAdapterFunc,\r\n localData: [],\r\n };\r\n }\r\n\r\n //#region == Methods ==\r\n setDataFields = ({ id, status, text, tags, color, resourceId }) => {\r\n if ((id && status && text && tags) === false) {\r\n throw new Error('id, status, text, tags is required in ISOKanban');\r\n }\r\n\r\n this.state.dataFields = [];\r\n this.state.dataFields.push({ name: 'id', map: id, type: 'string' });\r\n this.state.dataFields.push({ name: 'status', map: status, type: 'string' });\r\n this.state.dataFields.push({ name: 'text', map: text, type: 'string' });\r\n this.state.dataFields.push({ name: 'tags', map: tags, type: 'string' });\r\n\r\n if (color) {\r\n this.state.color = color;\r\n this.state.dataFields.push({ name: 'color', map: color });\r\n }\r\n\r\n if (resourceId) {\r\n this.state.resourceId = resourceId;\r\n this.state.dataFields.push({ name: 'resourceId', map: resourceId });\r\n }\r\n };\r\n\r\n setColumns = (param) => {\r\n try {\r\n if (this.state.dataFields.length === 0) {\r\n e3.modal.alert(alertType.Error, 'dataFields가 생성되지 않았습니다.');\r\n return;\r\n }\r\n\r\n const tmpColumn = param.map((columnInfo) => {\r\n const column = {};\r\n\r\n column.text = columnInfo.text;\r\n column.dataField = columnInfo.dataField;\r\n\r\n if (columnInfo.maxItems !== undefined) {\r\n column.maxItems = columnInfo.maxItems;\r\n }\r\n\r\n if (columnInfo.iconClassName !== undefined) {\r\n column.iconClassName = columnInfo.iconClassName;\r\n }\r\n\r\n if (columnInfo.collapsible !== undefined) {\r\n column.collapsible = columnInfo.collapsible;\r\n }\r\n\r\n return column;\r\n });\r\n\r\n this.setState({ columns: tmpColumn });\r\n } catch (error) {\r\n e3.modal.alert(alertType.Error, error.errormessage);\r\n }\r\n };\r\n\r\n setDataBinding = (param) => {\r\n this.state.localData = param;\r\n const source = this.createSource();\r\n this.setState({ source: source });\r\n };\r\n\r\n addItem = ({ id, status, text, tags, color, resourceId }) => {\r\n try {\r\n this.refKanban.addItem({ id: id, status: status, text: text, tags: tags, color: color, resourceId: resourceId });\r\n } catch (error) {\r\n e3.modal.alert(alertType.Error, error);\r\n }\r\n };\r\n\r\n removeItem = (itemId) => {\r\n try {\r\n this.refKanban.removeItem(itemId);\r\n } catch (error) {\r\n e3.modal.alert(alertType.Error, error);\r\n }\r\n };\r\n\r\n updateItem = (id, { status: status, text: text, tags: tags, color: color, resourceId: resourceId }) => {\r\n try {\r\n this.refKanban.updateItem(id, { status: status, text: text, tags: tags, color: color, resourceId: resourceId });\r\n } catch (error) {\r\n e3.modal.alert(alertType.Error, error.message);\r\n }\r\n };\r\n\r\n getColumn = (dataField) => this.refKanban.getColumn(dataField);\r\n\r\n getColumnItems = (dataField) => this.refKanban.getColumnItems(dataField);\r\n\r\n getItems = () => this.refKanban.getItems();\r\n\r\n destroy = () => this.refKanban.destroy();\r\n //#endregion == Methods ==\r\n\r\n //#region == Events ==\r\n onItemAttrClicked = (e) => {\r\n console.log('onItemAttrClicked');\r\n };\r\n\r\n onColumnAttrClicked = (e) => {\r\n console.log('onColumnAttrClicked');\r\n };\r\n\r\n onItemMoved = (e) => {\r\n console.log('onItemMoved');\r\n };\r\n //#endregion == Events ==\r\n\r\n render() {\r\n return (\r\n <>\r\n {this.state.columns.length > 0 ? (\r\n (this.refKanban = r)}\r\n width={'100%'}\r\n height={'100%'}\r\n columns={this.state.columns}\r\n source={this.state.source}\r\n resources={this.state.resources}\r\n columnRenderer={this.state.columnRenderer}\r\n onItemAttrClicked={(e) => {\r\n this.onItemAttrClicked(e);\r\n if (this.props.onItemAttrClicked) {\r\n this.props.onItemAttrClicked(e);\r\n }\r\n }}\r\n onColumnAttrClicked={(e) => {\r\n this.onColumnAttrClicked(e);\r\n if (this.props.onColumnAttrClicked) {\r\n this.props.onColumnAttrClicked(e);\r\n }\r\n }}\r\n onItemMoved={(e) => {\r\n this.onItemMoved(e);\r\n if (this.props.onItemMoved) {\r\n this.props.onItemMoved(e);\r\n }\r\n }}\r\n />\r\n ) : null}\r\n \r\n );\r\n }\r\n\r\n //#region == private method ==\r\n resourcesAdapterFunc = () => {\r\n const resourcesSource = {\r\n dataFields: [\r\n { name: 'id', type: 'number' },\r\n { name: 'name', type: 'string' },\r\n { name: 'image', type: 'string' },\r\n { name: 'common', type: 'boolean' },\r\n ],\r\n dataType: 'array',\r\n localData: [{ id: 0, name: 'No name', image: './../images/andrew.png', common: true }],\r\n };\r\n const resourcesDataAdapter = new jqx.dataAdapter(resourcesSource);\r\n return resourcesDataAdapter;\r\n };\r\n\r\n columnRenderer = (element, collapsedElement, column) => {\r\n if (element[0]) {\r\n const headerStatus = element[0].getElementsByClassName('jqx-kanban-column-header-status')[0];\r\n setTimeout(() => {\r\n const columnItems = this.refKanban.getColumnItems(column.dataField).length;\r\n if (column.maxItems === 9999) {\r\n headerStatus.innerHTML = ' ( ' + columnItems + ' )';\r\n } else {\r\n headerStatus.innerHTML = ' ( ' + columnItems + '/' + column.maxItems + ' )';\r\n }\r\n }, 100);\r\n }\r\n };\r\n\r\n createSource = () => {\r\n const source = {\r\n dataFields: this.state.dataFields,\r\n dataType: 'array',\r\n localData: this.state.localData,\r\n };\r\n return new jqx.dataAdapter(source);\r\n };\r\n //#endregion == private method ==\r\n}\r\n\r\nexport default ISOJqxKanban;\r\n","import styled from 'styled-components';\r\n\r\nexport const ISOKanbanContainer = styled.div`\r\n display: flex;\r\n`;\r\n\r\nexport const TaskGroupContainer = styled.div`\r\n margin: 8px;\r\n border: 1px solid lightgrey;\r\n border-radius: 2px;\r\n width: 220px;\r\n\r\n display: flex;\r\n flex-direction: column;\r\n`;\r\n\r\nexport const TaskContainer = styled.div`\r\n border: 1px solid lightgrey;\r\n border-radius: 2px;\r\n padding: 8px;\r\n margin-bottom: 8px;\r\n background-color: ${(props) => (props.isDragDisabled ? 'lightgrey' : props.isDragging ? 'lightgreen' : 'white')};\r\n`;\r\n\r\nexport const TaskGroupTitle = styled.h3`\r\n padding: 8px;\r\n`;\r\n\r\nexport const TaskList = styled.div`\r\n padding: 8px;\r\n background-color: ${(props) => (props.isDraggingOver ? '#f5f5f5' : 'white')};\r\n flex-grow: 1;\r\n min-height: 100px;\r\n`;\r\n","import React from 'react';\r\nimport { e3 } from 'src/framework/core/utils/utils';\r\nimport { ISOButton } from 'src/framework/components/controls';\r\n\r\nconst ISOFile = (props, ref) => {\r\n const API_URL = process.env.REACT_APP_PROXY.replace('queryservice', 'FileTransferService');\r\n\r\n const refFileInput = React.useRef(null);\r\n\r\n const [selectedFiles, setSelectedFiles] = React.useState([]);\r\n const [errorMessage, setErrorMessage] = React.useState('');\r\n\r\n React.useImperativeHandle(ref, () => ({\r\n getList() {\r\n return selectedFiles;\r\n },\r\n setFiles(files) {\r\n setSelectedFiles(files);\r\n },\r\n }));\r\n\r\n const onFileInputChange = async (e) => {\r\n if (e.target.files && e.target.files.length) {\r\n if (props.multiple == 'false') {\r\n setSelectedFiles((selectedFiles) => [e.target.files[0]]);\r\n } else {\r\n for (let i = 0; i < e.target.files.length; i++) {\r\n // 동일한 파일명 추가 제외(Size는?)\r\n let x = selectedFiles.find((x) => x.name === e.target.files[i].name);\r\n if (!x) {\r\n await setSelectedFiles((selectedFiles) => [...selectedFiles, e.target.files[i]]);\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n const removeFile = (name) => {\r\n const selectedFileIndex = selectedFiles.findIndex((e) => e.name === name);\r\n selectedFiles.splice(selectedFileIndex, 1);\r\n setSelectedFiles([...selectedFiles]);\r\n refFileInput.current.value = '';\r\n };\r\n\r\n const downloadFile = (name, seq) => {\r\n const url = `${API_URL}/Download4N/${encodeURI(seq)}`;\r\n window.open(url, '_blank');\r\n };\r\n\r\n return (\r\n <>\r\n \r\n e.preventDefault()}\r\n onDragEnter={(e) => e.preventDefault()}\r\n onDragLeave={(e) => e.preventDefault()}\r\n onDrop={(e) => e.preventDefault()}\r\n draggable=\"false\"\r\n >\r\n {selectedFiles.map((data, i) => (\r\n
    \r\n
    \r\n
    \r\n
    \r\n {data.name}\r\n ({e3.sizeToText(data.size)}) {data.invalid && ({errorMessage})}\r\n
    removeFile(data.name)}>\r\n {' X '}\r\n
    \r\n downloadFile(data.rename, data.seq)}\r\n className=\"file-download\"\r\n >\r\n {' Download '}\r\n \r\n
    \r\n
    \r\n ))}\r\n \r\n
    \r\n {\r\n refFileInput.current.click();\r\n }}\r\n >\r\n 첨부파일 추가\r\n \r\n
    \r\n \r\n );\r\n};\r\n\r\nexport default React.forwardRef(ISOFile);\r\n","import React from 'react';\r\nimport Table from '@material-ui/core/Table';\r\nimport TableBody from '@material-ui/core/TableBody';\r\nimport TableCell from '@material-ui/core/TableCell';\r\nimport TableContainer from '@material-ui/core/TableContainer';\r\nimport TableHead from '@material-ui/core/TableHead';\r\nimport TableRow from '@material-ui/core/TableRow';\r\nimport { e3, alertType, jsonCheck } from 'src/framework/core/utils/utils';\r\nimport { ISOTableGridCell } from 'src/framework/components/controls';\r\nimport JqxMenu from 'jqwidgets-scripts/jqwidgets-react-tsx/jqxmenu';\r\nimport GridContextMenu from '../GridContextMenu';\r\nimport ISOUtils from 'src/framework/core/utils/ISOUtils';\r\n\r\nclass ISOTableGrid extends React.PureComponent {\r\n contextMenu = React.createRef(GridContextMenu);\r\n mergeBaseCell = {};\r\n subTotalMark = {};\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n customRender: false,\r\n isMultiSelect: props.isMultiSelect ? props.isMultiSelect : false,\r\n selected: [],\r\n selectedCell: -1,\r\n mergeColumns: [],\r\n columnGroups: [],\r\n subTotalColumn: {},\r\n totalColumn: {},\r\n columns: [],\r\n source: [],\r\n originalSource: [],\r\n headerInfo: [],\r\n rowInfo: [],\r\n lastSelectedIndex: -1,\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n if (this.props.allowContext === true) {\r\n document.addEventListener('contextmenu', (event) => event.preventDefault());\r\n }\r\n }\r\n\r\n setSubTotalColumn = ({ summaryType, baseField, labelField, label, labelColSpan, targetColumns = [] }) => {\r\n this.state.subTotalColumn.summaryType = summaryType;\r\n this.state.subTotalColumn.baseField = baseField;\r\n this.state.subTotalColumn.labelField = labelField;\r\n this.state.subTotalColumn.label = label;\r\n this.state.subTotalColumn.labelColSpan = labelColSpan;\r\n this.state.subTotalColumn.targetColumns = targetColumns;\r\n };\r\n\r\n setTotalColumn = ({ summaryType, labelField, label, labelColSpan, targetColumns = [] }) => {\r\n this.state.totalColumn.summaryType = summaryType;\r\n this.state.totalColumn.labelField = labelField;\r\n this.state.totalColumn.label = label;\r\n this.state.totalColumn.labelColSpan = labelColSpan;\r\n this.state.totalColumn.targetColumns = targetColumns;\r\n };\r\n\r\n addMergeColumns = (params) => {\r\n this.setState({ mergeColumns: params });\r\n };\r\n\r\n addColumnGroups = (params) => {\r\n try {\r\n this.state.columnGroups = params;\r\n this.initHeaderInfo();\r\n } catch (error) {\r\n e3.modal.alert(alertType.Error, error.message);\r\n }\r\n };\r\n\r\n addColumns = (params) => {\r\n try {\r\n this.state.columns = params;\r\n this.initHeaderInfo();\r\n } catch (error) {\r\n e3.modal.alert(alertType.Error, error.message);\r\n }\r\n };\r\n\r\n setDataBinding = async (params) => {\r\n params = jsonCheck(params);\r\n try {\r\n e3.appendProperty(params, 'RowState', ISOUtils.tableGrid.RowState.Unchanged);\r\n\r\n this.state.originalSource = params;\r\n let viewSource = params.slice();\r\n\r\n if (Object.getOwnPropertyNames(this.state.subTotalColumn).length > 0 && params.length > 0) {\r\n this.createSubTotalData(viewSource);\r\n }\r\n\r\n if (Object.getOwnPropertyNames(this.state.totalColumn).length > 0 && params.length > 0) {\r\n this.createTotalData(viewSource);\r\n }\r\n\r\n this.state.source = viewSource;\r\n\r\n this.createBodyInfo();\r\n\r\n this.setState({ customRender: !this.state.customRender });\r\n } catch (error) {\r\n e3.modal.alert(alertType.Error, error.message);\r\n }\r\n };\r\n\r\n getRowData = (rowindex) => {\r\n return this.state.source[rowindex];\r\n };\r\n\r\n getCellData = (rowIndex, cellIndex) => {\r\n const columnName = getColumnNameByIndex(cellIndex);\r\n if (this.state.source && this.state.source.length > rowIndex && this.state.source[rowIndex]) {\r\n return this.state.source[rowIndex][columnName];\r\n }\r\n return null;\r\n };\r\n\r\n getColumnNameByIndex = (cellIndex) => {\r\n const columnName = this.state.columns.filter((item) => item.visible)[cellIndex]?.dataField;\r\n return columnName || '';\r\n };\r\n\r\n getColumnLabelByIndex = (cellIndex) => {\r\n const columnLabel = this.state.columns.filter((item) => item.visible)[cellIndex]?.label;\r\n return columnLabel || '';\r\n };\r\n\r\n getSelectedRowIndex = () => {\r\n return this.state.lastSelectedIndex;\r\n };\r\n\r\n getSelectedCellIndex = () => {\r\n return this.state.selectedCell;\r\n };\r\n\r\n onRowClick = async (e) => {\r\n if (this.props.onRowClick) {\r\n this.props.onRowClick(e);\r\n }\r\n };\r\n\r\n onMouseDown = async (e) => {\r\n try {\r\n if (e.nativeEvent.button === 2 && this.props.allowContext === true) {\r\n this.contextMenu.current.openMenu(e.clientX, e.clientY);\r\n // const scrollTop = window.scrollY;\r\n // const scrollLeft = window.scrollX;\r\n // this.contextMenu.current.open(\r\n // parseInt(e.clientX, 10) + 5 + scrollLeft,\r\n // parseInt(e.clientY, 10) + 5 + scrollTop,\r\n // );\r\n }\r\n } catch (error) {\r\n e3.modal.alert(alertType.Error, error.message);\r\n }\r\n };\r\n\r\n onCellClick = async (e) => {\r\n let newSelected = [];\r\n let currentIndex = parseInt(e.currentTarget.attributes.rowindex.value);\r\n let currentCellIndex = parseInt(e.currentTarget.attributes.columnindex.value);\r\n if (this.state.isMultiSelect) {\r\n const selectedIndex = this.state.selected.indexOf(currentIndex);\r\n\r\n if (selectedIndex === -1) {\r\n newSelected = newSelected.concat(this.state.selected, currentIndex);\r\n } else if (selectedIndex === 0) {\r\n newSelected = newSelected.concat(this.state.selected.slice(1));\r\n } else if (selectedIndex === this.state.selected.length - 1) {\r\n newSelected = newSelected.concat(this.state.selected.slice(0, -1));\r\n } else if (selectedIndex > 0) {\r\n newSelected = newSelected.concat(\r\n this.state.selected.slice(0, selectedIndex),\r\n this.state.selected.slice(selectedIndex + 1),\r\n );\r\n }\r\n } else {\r\n newSelected.push(currentIndex);\r\n }\r\n\r\n this.state.selected = newSelected;\r\n this.state.lastSelectedIndex = currentIndex;\r\n this.state.selectedCell = currentCellIndex;\r\n\r\n this.setState({ customRender: !this.state.customRender });\r\n\r\n if (this.props.onCellClick) {\r\n this.props.onCellClick(e);\r\n }\r\n };\r\n\r\n checkSelected = (rowindex, columnindex) => {\r\n if (this.props.selectionMode === ISOUtils.tableGrid.SelectionMode.Cell) {\r\n return this.isSelected(rowindex) && this.isSelectedCell(columnindex);\r\n } else {\r\n return this.isSelected(rowindex);\r\n }\r\n };\r\n render() {\r\n return (\r\n
    \r\n \r\n \r\n {this.createHeader()}\r\n {this.createBody()}\r\n \r\n \r\n\r\n \r\n
    \r\n );\r\n }\r\n\r\n //#region == private function ==\r\n\r\n isSelected = (rowindex) => this.state.selected.indexOf(rowindex) !== -1;\r\n isSelectedCell = (columnindex) => this.state.selectedCell === columnindex;\r\n\r\n initHeaderInfo = () => {\r\n if (this.state.columnGroups.length > 0) {\r\n this.createHeaderInfo();\r\n }\r\n\r\n this.setState({ customRender: !this.state.customRender });\r\n };\r\n\r\n createHeaderInfo = () => {\r\n let headerInfo = [\r\n {\r\n cellInfo: [],\r\n },\r\n {\r\n cellInfo: [],\r\n },\r\n ];\r\n\r\n headerInfo[1].cellInfo = this.state.columns\r\n .filter((column) => column.visible && column.columnGroup)\r\n .map((column) => {\r\n let cellInfo = {};\r\n cellInfo.width = column.width;\r\n cellInfo.label = column.label;\r\n cellInfo.rowSpan = 1;\r\n cellInfo.colSpan = 1;\r\n return cellInfo;\r\n });\r\n\r\n let beforColumnGroupName = '';\r\n\r\n this.state.columns\r\n .filter((column) => column.visible)\r\n .forEach((column) => {\r\n let cellInfo = {};\r\n cellInfo.label = column.label;\r\n\r\n if (column.columnGroup) {\r\n cellInfo.rowSpan = 1;\r\n\r\n if (column.columnGroup === beforColumnGroupName) {\r\n const lastIndex = headerInfo[0].cellInfo.length - 1;\r\n const lastColSpan = headerInfo[0].cellInfo[lastIndex].colSpan;\r\n const lastWidth = headerInfo[0].cellInfo[lastIndex].width;\r\n headerInfo[0].cellInfo[lastIndex].colSpan = lastColSpan + 1;\r\n headerInfo[0].cellInfo[lastIndex].width = lastWidth + column.width;\r\n } else {\r\n cellInfo.colSpan = 1;\r\n cellInfo.label = this.state.columnGroups.find((g) => g.name === column.columnGroup).label;\r\n cellInfo.width = column.width;\r\n headerInfo[0].cellInfo.push(cellInfo);\r\n }\r\n beforColumnGroupName = column.columnGroup;\r\n } else {\r\n cellInfo.width = column.width;\r\n cellInfo.rowSpan = 2;\r\n cellInfo.colSpan = 1;\r\n headerInfo[0].cellInfo.push(cellInfo);\r\n }\r\n });\r\n\r\n this.state.headerInfo = headerInfo;\r\n };\r\n\r\n createHeader = () => {\r\n let headerRows = [];\r\n\r\n if (this.state.columnGroups.length > 0) {\r\n headerRows = this.state.headerInfo.map((info, rowIndex) => (\r\n \r\n {info.cellInfo.map((cell, cellIndex) => (\r\n \r\n {cell.label}\r\n \r\n ))}\r\n \r\n ));\r\n } else {\r\n headerRows[0] = (\r\n \r\n {this.state.columns\r\n .filter((column) => column.visible)\r\n .map((column, colIndex) => (\r\n \r\n {column.label}\r\n \r\n ))}\r\n \r\n );\r\n }\r\n\r\n return headerRows;\r\n };\r\n\r\n createBodyInfo = async () => {\r\n try {\r\n this.state.rowInfo = [];\r\n this.state.source.map((row, rowindex) => {\r\n this.createRowInfo(rowindex);\r\n\r\n this.state.columns\r\n .filter((col) => col.visible)\r\n .map((col, columnindex) => {\r\n this.createCellInfo(row, rowindex, col, columnindex);\r\n this.setMergeInfo(row, rowindex, col, columnindex);\r\n });\r\n\r\n if (row.RowState === ISOUtils.tableGrid.RowState.SubTotal) {\r\n this.setSubTotalInfo(rowindex);\r\n } else if (row.RowState === ISOUtils.tableGrid.RowState.Total) {\r\n this.setTotalInfo(rowindex);\r\n }\r\n });\r\n } catch (error) {\r\n e3.modal.alert(alertType.Error, error.message);\r\n }\r\n };\r\n\r\n checkMergeCell = (rowindex, columnindex) => {\r\n let rtnBool = true;\r\n let startIndex = this.mergeBaseCell[Object.keys(this.mergeBaseCell)[0]].columnindex;\r\n let endIndex = columnindex - startIndex;\r\n if (rowindex !== 0 && columnindex !== 0) {\r\n for (let i = 0; i <= endIndex; i++) {\r\n if (\r\n this.state.rowInfo[rowindex].cellInfo[columnindex - i].value ===\r\n this.state.rowInfo[rowindex - 1].cellInfo[columnindex - i].value\r\n ) {\r\n rtnBool = true;\r\n } else {\r\n rtnBool = false;\r\n }\r\n }\r\n }\r\n\r\n return rtnBool;\r\n };\r\n\r\n setMergeInfo = (row, rowindex, col, columnindex) => {\r\n const cellInfo = this.state.rowInfo[rowindex].cellInfo[columnindex];\r\n if (this.state.mergeColumns.indexOf(col.dataField) > -1) {\r\n if (\r\n rowindex === 0 ||\r\n row.RowState === ISOUtils.tableGrid.RowState.SubTotal ||\r\n row.RowState === ISOUtils.tableGrid.RowState.Total\r\n ) {\r\n this.mergeBaseCell[col.dataField] = cellInfo;\r\n } else {\r\n if (this.mergeBaseCell[col.dataField].value === cellInfo.value) {\r\n const rtnBool = this.checkMergeCell(rowindex, columnindex);\r\n if (rtnBool) {\r\n //if (columnindex === 0 || this.mergeBaseCell[col.dataField].beforCellValue === cellInfo.beforCellValue) {\r\n const baseRowIndex = this.mergeBaseCell[col.dataField].rowindex;\r\n const baseColumnIndex = this.mergeBaseCell[col.dataField].columnindex;\r\n const baseRowSpan = this.mergeBaseCell[col.dataField].rowSpan;\r\n this.state.rowInfo[baseRowIndex].cellInfo[baseColumnIndex].rowSpan = baseRowSpan + 1;\r\n this.state.rowInfo[rowindex].cellInfo[columnindex].visible = false;\r\n } else {\r\n this.mergeBaseCell[col.dataField] = cellInfo;\r\n }\r\n } else {\r\n this.mergeBaseCell[col.dataField] = cellInfo;\r\n }\r\n }\r\n }\r\n };\r\n setSubTotalInfo = (rowindex) => {\r\n const cellInfo = this.state.rowInfo[rowindex].cellInfo.find(\r\n (cell) => cell.dataField === this.state.subTotalColumn.labelField,\r\n );\r\n cellInfo.colSpan = this.state.subTotalColumn.labelColSpan;\r\n };\r\n\r\n setTotalInfo = (rowindex) => {\r\n const cellInfo = this.state.rowInfo[rowindex].cellInfo.find(\r\n (cell) => cell.dataField === this.state.totalColumn.labelField,\r\n );\r\n cellInfo.colSpan = this.state.totalColumn.labelColSpan;\r\n };\r\n\r\n createBody = () => {\r\n let rows = [];\r\n\r\n this.state.source.map((row, index) => {\r\n let tableRow = {};\r\n const isItemSelected = this.isSelected(row);\r\n\r\n if (row.RowState === ISOUtils.tableGrid.RowState.Total) {\r\n tableRow = (\r\n \r\n {this.createCell(index, 'e3-table-grid-total-row')}\r\n \r\n );\r\n } else if (row.RowState === ISOUtils.tableGrid.RowState.SubTotal) {\r\n tableRow = (\r\n \r\n {this.createCell(index, 'e3-table-grid-subtotal-row')}\r\n \r\n );\r\n } else {\r\n tableRow = (\r\n \r\n {this.createCell(index, null)}\r\n \r\n );\r\n }\r\n rows = rows.concat(tableRow);\r\n });\r\n return rows;\r\n };\r\n\r\n createRowInfo = (rowindex) => {\r\n this.state.rowInfo[rowindex] = {\r\n rowindex: rowindex,\r\n cellInfo: [],\r\n };\r\n };\r\n\r\n createCellInfo = (row, rowindex, col, columnindex) => {\r\n let cellInfo = {};\r\n cellInfo.rowindex = rowindex;\r\n cellInfo.columnindex = columnindex;\r\n cellInfo.dataField = col.dataField;\r\n cellInfo.rowSpan = 1;\r\n cellInfo.colSpan = 1;\r\n cellInfo.visible = true;\r\n cellInfo.value = row[col.dataField];\r\n if (columnindex > 0) {\r\n const beforDataField = this.state.columns.filter((c) => c.visible)[columnindex - 1].dataField;\r\n cellInfo.beforCellValue = row[beforDataField];\r\n }\r\n\r\n this.state.rowInfo[rowindex].cellInfo[columnindex] = cellInfo;\r\n };\r\n\r\n createCell = (rowindex, className) => {\r\n const cellInfo = this.state.rowInfo[rowindex].cellInfo;\r\n let offset = 1;\r\n let cells = cellInfo\r\n .filter((cell) => cell.visible)\r\n .map((cell, index) => {\r\n if (offset === 1) {\r\n offset = cell.colSpan;\r\n return (\r\n c.dataField === cell.dataField).align}\r\n >\r\n {this.cellsrenderer(cell.value)}\r\n \r\n );\r\n } else {\r\n offset -= 1;\r\n return null;\r\n }\r\n });\r\n\r\n return cells;\r\n };\r\n\r\n cellsrenderer = (value) => {\r\n try {\r\n if (value === null) {\r\n return <>;\r\n } else {\r\n return (value + '').split('\\n').length > 1 ?
    {value}
    : value;\r\n }\r\n } catch (error) {\r\n e3.modal.alert(alertType.Error, error.message);\r\n }\r\n };\r\n\r\n createSubTotalData = (source) => {\r\n try {\r\n this.beforRowValue = '';\r\n this.subTotalMark = Object.assign({}, this.state.subTotalColumn);\r\n this.subTotalMark.beforRowValue = '';\r\n this.subTotalMark.targetInfo = [];\r\n\r\n this.state.subTotalColumn.targetColumns.forEach((dataField) => {\r\n let data = {};\r\n data.dataField = dataField;\r\n data.value = 0;\r\n\r\n this.subTotalMark.targetInfo.push(data);\r\n });\r\n\r\n for (let rowindex = 0; rowindex <= source.length; rowindex++) {\r\n if (rowindex === source.length) {\r\n const newRow = this.createSubTotalNewRow(source[0]);\r\n source.splice(rowindex, 0, newRow);\r\n break;\r\n } else if (rowindex > 0) {\r\n if (source[rowindex][this.subTotalMark.baseField] !== this.subTotalMark.beforRowValue) {\r\n const newRow = this.createSubTotalNewRow(source[0]);\r\n source.splice(rowindex, 0, newRow);\r\n rowindex++;\r\n }\r\n }\r\n\r\n this.subTotalMark.beforRowValue = source[rowindex][this.subTotalMark.baseField];\r\n this.subTotalMark.targetInfo.forEach((data) => {\r\n data.value =\r\n (Math.round(parseFloat(data.value) * 100) +\r\n Math.round(parseFloat(source[rowindex][data.dataField]) * 100)) /\r\n 100;\r\n });\r\n }\r\n\r\n this.subTotalMark = {};\r\n } catch (error) {\r\n e3.modal.alert(alertType.Error, error.message);\r\n }\r\n };\r\n\r\n createTotalData = (source) => {\r\n try {\r\n const newRow = e3.cloneObject(source[0]);\r\n\r\n newRow.RowState = ISOUtils.tableGrid.RowState.Total;\r\n newRow[this.state.totalColumn.labelField] = this.state.totalColumn.label;\r\n\r\n this.state.totalColumn.targetColumns.map((dataField) => {\r\n newRow[dataField] = this.state.originalSource.reduce(\r\n (a, v) => (a = (Math.round(parseFloat(a) * 100) + Math.round(parseFloat(v[dataField]) * 100)) / 100),\r\n 0,\r\n );\r\n });\r\n\r\n source.push(newRow);\r\n } catch (error) {\r\n e3.modal.alert(alertType.Error, error.message);\r\n }\r\n };\r\n\r\n createSubTotalNewRow = (baseObj) => {\r\n const newRow = e3.cloneObject(baseObj);\r\n newRow.RowState = ISOUtils.tableGrid.RowState.SubTotal;\r\n newRow[this.subTotalMark.labelField] = this.subTotalMark.label;\r\n this.subTotalMark.targetInfo.forEach((info) => {\r\n newRow[info.dataField] = info.value;\r\n info.value = 0;\r\n });\r\n return newRow;\r\n };\r\n\r\n //#endregion == private function ==\r\n}\r\n\r\nexport default ISOTableGrid;\r\n","import React from 'react';\r\nimport TableCell from '@material-ui/core/TableCell';\r\n\r\nclass ISOTableGridCell extends React.PureComponent {\r\n constructor(props) {\r\n super(props);\r\n }\r\n\r\n render() {\r\n return (\r\n <>\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default ISOTableGridCell;\r\n","import React from 'react';\r\nimport { Button } from '@material-ui/core';\r\nimport PropTypes from 'prop-types';\r\n\r\nclass ISOButton extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.enable = this.enable.bind(this);\r\n this.disable = this.disable.bind(this);\r\n this.setValue = this.setValue.bind(this);\r\n this.getValue = this.getValue.bind(this);\r\n this.onClick = this.onClick.bind(this);\r\n\r\n this.state = {\r\n textLabel: props.textLabel,\r\n disabled: props.disabled,\r\n value: props.value,\r\n };\r\n }\r\n\r\n enable() {\r\n if (this.state.disabled) {\r\n this.setState({\r\n disabled: false,\r\n });\r\n }\r\n }\r\n\r\n disable() {\r\n if (!this.state.disabled) {\r\n this.setState({\r\n disabled: true,\r\n });\r\n }\r\n }\r\n\r\n setValue(source) {\r\n if (source) {\r\n this.setState({\r\n value: source,\r\n });\r\n }\r\n }\r\n\r\n getValue() {\r\n return this.state.value;\r\n }\r\n\r\n setTextLabel(source) {\r\n this.setState({\r\n textLabel: source,\r\n });\r\n }\r\n\r\n onClick = (e) => {\r\n if (this.props.onClick !== null) {\r\n this.props.onClick(e);\r\n }\r\n }\r\n\r\n render() {\r\n const { textLabel, ...others } = this.props;\r\n return (\r\n <>\r\n \r\n {this.state.textLabel ? this.state.textLabel : this.props.children ? this.props.children : 'button' }\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nISOButton.propTypes = {\r\n textLabel: PropTypes.string,\r\n color: PropTypes.string,\r\n component: PropTypes.string,\r\n disabled: PropTypes.bool,\r\n fullWidth: PropTypes.bool,\r\n href: PropTypes.string,\r\n size: PropTypes.string,\r\n variant: PropTypes.string,\r\n value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n onClick: PropTypes.func,\r\n};\r\n\r\nISOButton.defaultProps = {\r\n color: 'default',\r\n component: 'button',\r\n disabled: false,\r\n fullWidth: false,\r\n href: '',\r\n size: 'medium',\r\n variant: 'contained',\r\n value: '',\r\n onClick: null,\r\n};\r\n\r\nexport default ISOButton;\r\n","import { e3 } from 'src/framework/core/utils/utils';\r\nimport { validationType, regex, validator } from './validation';\r\nimport { jqxkanbanApi, kanbanApi } from './kanbanApis';\r\nimport { tableGridApi } from './tableGridApis';\r\n\r\nconst ISOUtils = {\r\n ...e3,\r\n modal: {\r\n ...e3.modal,\r\n },\r\n data: {\r\n ...e3.data,\r\n validationType,\r\n regex,\r\n validator,\r\n },\r\n jqxkanban: jqxkanbanApi,\r\n kanban: kanbanApi,\r\n tableGrid: tableGridApi,\r\n};\r\n\r\nexport default ISOUtils;\r\n","import React from 'react';\r\nimport TextField from '@material-ui/core/TextField';\r\nimport PropTypes from 'prop-types';\r\n\r\nclass ISOInput extends React.PureComponent {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n textLabel: this.props.textLabel,\r\n disabled: this.props.disabled,\r\n value: this.props.value,\r\n inputProps: {\r\n readOnly: this.props.readOnly,\r\n hidden: this.props.hidden,\r\n },\r\n errormessage: this.props.errormessage,\r\n };\r\n\r\n this.enable = this.enable.bind(this);\r\n this.disable = this.disable.bind(this);\r\n this.setValue = this.setValue.bind(this);\r\n this.getValue = this.getValue.bind(this);\r\n this.setLabel = this.setLabel.bind(this);\r\n this.getLabel = this.getLabel.bind(this);\r\n this.setReadOnly = this.setReadOnly.bind(this);\r\n this.clear = this.clear.bind(this);\r\n this.onClick = this.onClick.bind(this);\r\n this.onChange = this.onChange.bind(this);\r\n this.onKeyPress = this.onKeyPress.bind(this);\r\n }\r\n\r\n enable() {\r\n if (this.state.disabled) {\r\n this.setState({\r\n disabled: false,\r\n });\r\n }\r\n }\r\n\r\n disable() {\r\n if (!this.state.disabled) {\r\n this.setState({\r\n disabled: true,\r\n });\r\n }\r\n }\r\n\r\n setValue(source) {\r\n this.setState({\r\n value: source || '',\r\n });\r\n }\r\n\r\n getValue() {\r\n return this.state.value;\r\n }\r\n\r\n setLabel(source) {\r\n if (source) {\r\n this.setState({\r\n textLabel: source,\r\n });\r\n }\r\n }\r\n\r\n getLabel() {\r\n return this.state.textLabel;\r\n }\r\n\r\n setReadOnly(source) {\r\n if (source && typeof source === 'boolean') {\r\n this.setState({\r\n inputProps: {\r\n readOnly: source,\r\n },\r\n });\r\n }\r\n }\r\n\r\n setErrorMessage(message) {\r\n this.setState({\r\n errormessage: message,\r\n });\r\n }\r\n\r\n clear() {\r\n this.setState({\r\n value: '',\r\n errormessage: null,\r\n });\r\n }\r\n\r\n onClick = (e) => {\r\n if (this.props.onClick) {\r\n this.props.onClick(e);\r\n }\r\n };\r\n\r\n onChange = (e) => {\r\n this.setState({\r\n value: e.target.value,\r\n });\r\n\r\n if (this.props.onChange) {\r\n this.props.onChange(e);\r\n }\r\n if (this.props.required && e.target.value === '') {\r\n this.setState({\r\n errormessage: '필수 입력입니다.',\r\n });\r\n } else {\r\n this.setState({ errormessage: null });\r\n }\r\n };\r\n\r\n onKeyPress = (e) => {\r\n if (this.props.onKeyPress) {\r\n this.props.onKeyPress(e);\r\n }\r\n };\r\n\r\n control = (other, errormessage) => (\r\n \r\n );\r\n\r\n render() {\r\n const { textLabel, colspan, ...other } = this.props;\r\n const { errormessage } = this.state;\r\n const hiddenStyle = this.props.hidden ? 'hidden' : 'visible';\r\n return (\r\n <>\r\n {this.props.textLabel || this.props.children ? (\r\n <>\r\n \r\n \r\n \r\n \r\n {this.control(other, errormessage)}\r\n \r\n \r\n ) : this.props.colspan ? (\r\n <>\r\n \r\n {this.control(other, errormessage)}\r\n \r\n \r\n ) : (\r\n this.control(other, errormessage)\r\n )}\r\n \r\n );\r\n }\r\n}\r\n\r\nISOInput.propTypes = {\r\n textLabel: PropTypes.string,\r\n colspan: PropTypes.number,\r\n autoComplete: PropTypes.string,\r\n autoFocus: PropTypes.bool,\r\n color: PropTypes.string,\r\n defaultValue: PropTypes.string,\r\n disabled: PropTypes.bool,\r\n error: PropTypes.bool,\r\n fullWidth: PropTypes.bool,\r\n multiline: PropTypes.bool,\r\n placeholder: PropTypes.string,\r\n required: PropTypes.bool,\r\n readOnly: PropTypes.bool,\r\n type: PropTypes.string,\r\n hidden: PropTypes.bool,\r\n value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n onClick: PropTypes.func,\r\n onChange: PropTypes.func,\r\n onKeyPress: PropTypes.func,\r\n errormessage: PropTypes.string,\r\n};\r\n\r\nISOInput.defaultProps = {\r\n autoComplete: '',\r\n autoFocus: false,\r\n color: 'primary',\r\n disabled: false,\r\n error: false,\r\n fullWidth: false,\r\n multiline: false,\r\n placeholder: '',\r\n required: false,\r\n readOnly: false,\r\n type: 'text',\r\n hidden: false,\r\n value: '',\r\n onClick: null,\r\n onChange: null,\r\n onKeyPress: null,\r\n errormessage: null,\r\n};\r\n\r\nexport default ISOInput;\r\n","var map = {\n\t\"./pages\": [\n\t\t105\n\t],\n\t\"./pages/\": [\n\t\t105\n\t],\n\t\"./pages/COM/AttachFile\": [\n\t\t214\n\t],\n\t\"./pages/COM/AttachFile.js\": [\n\t\t214\n\t],\n\t\"./pages/Home\": [\n\t\t427,\n\t\t2\n\t],\n\t\"./pages/Home.js\": [\n\t\t427,\n\t\t2\n\t],\n\t\"./pages/MAI/COM_ACTION\": [\n\t\t406,\n\t\t24\n\t],\n\t\"./pages/MAI/COM_ACTION.js\": [\n\t\t406,\n\t\t24\n\t],\n\t\"./pages/MAI/MAI100\": [\n\t\t429,\n\t\t10\n\t],\n\t\"./pages/MAI/MAI100.js\": [\n\t\t429,\n\t\t10\n\t],\n\t\"./pages/MAI/MAI100/MAI110\": [\n\t\t407,\n\t\t25\n\t],\n\t\"./pages/MAI/MAI100/MAI110.js\": [\n\t\t407,\n\t\t25\n\t],\n\t\"./pages/MAI/MAI100/MAI115\": [\n\t\t183\n\t],\n\t\"./pages/MAI/MAI100/MAI115.js\": [\n\t\t183\n\t],\n\t\"./pages/MAI/MAI100/MAI115_old\": [\n\t\t428,\n\t\t14\n\t],\n\t\"./pages/MAI/MAI100/MAI115_old.js\": [\n\t\t428,\n\t\t14\n\t],\n\t\"./pages/MAI/MAI100/MAI120\": [\n\t\t408,\n\t\t26\n\t],\n\t\"./pages/MAI/MAI100/MAI120.js\": [\n\t\t408,\n\t\t26\n\t],\n\t\"./pages/MAI/MAI100/MAI130\": [\n\t\t409,\n\t\t27\n\t],\n\t\"./pages/MAI/MAI100/MAI130.js\": [\n\t\t409,\n\t\t27\n\t],\n\t\"./pages/MAI/MAI200\": [\n\t\t431,\n\t\t4\n\t],\n\t\"./pages/MAI/MAI200.js\": [\n\t\t431,\n\t\t4\n\t],\n\t\"./pages/MAI/MAI200/MAI210\": [\n\t\t410,\n\t\t15\n\t],\n\t\"./pages/MAI/MAI200/MAI210.js\": [\n\t\t410,\n\t\t15\n\t],\n\t\"./pages/MAI/MAI200/MAI211\": [\n\t\t404,\n\t\t28\n\t],\n\t\"./pages/MAI/MAI200/MAI211.js\": [\n\t\t404,\n\t\t28\n\t],\n\t\"./pages/MAI/MAI200/MAI212\": [\n\t\t405,\n\t\t29\n\t],\n\t\"./pages/MAI/MAI200/MAI212.js\": [\n\t\t405,\n\t\t29\n\t],\n\t\"./pages/MAI/MAI200/MAI220\": [\n\t\t430,\n\t\t30\n\t],\n\t\"./pages/MAI/MAI200/MAI220.js\": [\n\t\t430,\n\t\t30\n\t],\n\t\"./pages/MAI/MAI200/MAI221\": [\n\t\t411,\n\t\t22\n\t],\n\t\"./pages/MAI/MAI200/MAI221.js\": [\n\t\t411,\n\t\t22\n\t],\n\t\"./pages/MAI/MAI300\": [\n\t\t432,\n\t\t0,\n\t\t1,\n\t\t31\n\t],\n\t\"./pages/MAI/MAI300.js\": [\n\t\t432,\n\t\t0,\n\t\t1,\n\t\t31\n\t],\n\t\"./pages/MAI/MAI300/MAI310\": [\n\t\t426,\n\t\t0,\n\t\t1\n\t],\n\t\"./pages/MAI/MAI300/MAI310.js\": [\n\t\t426,\n\t\t0,\n\t\t1\n\t],\n\t\"./pages/MAI/MAI300/MAI320\": [\n\t\t412,\n\t\t0,\n\t\t5\n\t],\n\t\"./pages/MAI/MAI300/MAI320.js\": [\n\t\t412,\n\t\t0,\n\t\t5\n\t],\n\t\"./pages/MAI/MAI400\": [\n\t\t433,\n\t\t16\n\t],\n\t\"./pages/MAI/MAI400.js\": [\n\t\t433,\n\t\t16\n\t],\n\t\"./pages/MAI/MAI400/MAI410\": [\n\t\t413,\n\t\t32\n\t],\n\t\"./pages/MAI/MAI400/MAI410.js\": [\n\t\t413,\n\t\t32\n\t],\n\t\"./pages/MAI/MAI400/MAI420\": [\n\t\t414,\n\t\t33\n\t],\n\t\"./pages/MAI/MAI400/MAI420.js\": [\n\t\t414,\n\t\t33\n\t],\n\t\"./pages/SYS/SYS100\": [\n\t\t434,\n\t\t11\n\t],\n\t\"./pages/SYS/SYS100.js\": [\n\t\t434,\n\t\t11\n\t],\n\t\"./pages/SYS/SYS100/SYS100_EditPanel\": [\n\t\t415,\n\t\t34\n\t],\n\t\"./pages/SYS/SYS100/SYS100_EditPanel.js\": [\n\t\t415,\n\t\t34\n\t],\n\t\"./pages/SYS/SYS100/SYS100_Grid\": [\n\t\t416,\n\t\t35\n\t],\n\t\"./pages/SYS/SYS100/SYS100_Grid.js\": [\n\t\t416,\n\t\t35\n\t],\n\t\"./pages/SYS/SYS110\": [\n\t\t435,\n\t\t0,\n\t\t8\n\t],\n\t\"./pages/SYS/SYS110.js\": [\n\t\t435,\n\t\t0,\n\t\t8\n\t],\n\t\"./pages/SYS/SYS110/SYS110_EditPanel\": [\n\t\t417,\n\t\t36\n\t],\n\t\"./pages/SYS/SYS110/SYS110_EditPanel.js\": [\n\t\t417,\n\t\t36\n\t],\n\t\"./pages/SYS/SYS120\": [\n\t\t436,\n\t\t17\n\t],\n\t\"./pages/SYS/SYS120.js\": [\n\t\t436,\n\t\t17\n\t],\n\t\"./pages/SYS/SYS120/SYS120_EditPanel\": [\n\t\t418,\n\t\t37\n\t],\n\t\"./pages/SYS/SYS120/SYS120_EditPanel.js\": [\n\t\t418,\n\t\t37\n\t],\n\t\"./pages/SYS/SYS120/SYS120_Grid\": [\n\t\t419,\n\t\t38\n\t],\n\t\"./pages/SYS/SYS120/SYS120_Grid.js\": [\n\t\t419,\n\t\t38\n\t],\n\t\"./pages/SYS/SYS130\": [\n\t\t437,\n\t\t39\n\t],\n\t\"./pages/SYS/SYS130.js\": [\n\t\t437,\n\t\t39\n\t],\n\t\"./pages/SYS/SYS140\": [\n\t\t438,\n\t\t0,\n\t\t3\n\t],\n\t\"./pages/SYS/SYS140.js\": [\n\t\t438,\n\t\t0,\n\t\t3\n\t],\n\t\"./pages/SYS/SYS140/SYS140_EditPanel\": [\n\t\t420,\n\t\t0,\n\t\t7\n\t],\n\t\"./pages/SYS/SYS140/SYS140_EditPanel.js\": [\n\t\t420,\n\t\t0,\n\t\t7\n\t],\n\t\"./pages/SYS/SYS200\": [\n\t\t439,\n\t\t40\n\t],\n\t\"./pages/SYS/SYS200.js\": [\n\t\t439,\n\t\t40\n\t],\n\t\"./pages/SYS/SYS210\": [\n\t\t440,\n\t\t41\n\t],\n\t\"./pages/SYS/SYS210.js\": [\n\t\t440,\n\t\t41\n\t],\n\t\"./pages/SYS/SYS220\": [\n\t\t441,\n\t\t18\n\t],\n\t\"./pages/SYS/SYS220.js\": [\n\t\t441,\n\t\t18\n\t],\n\t\"./pages/SYS/SYS220/SYS220_P1\": [\n\t\t421,\n\t\t42\n\t],\n\t\"./pages/SYS/SYS220/SYS220_P1.js\": [\n\t\t421,\n\t\t42\n\t],\n\t\"./pages/SYS/SYS225\": [\n\t\t442,\n\t\t19\n\t],\n\t\"./pages/SYS/SYS225.js\": [\n\t\t442,\n\t\t19\n\t],\n\t\"./pages/SYS/SYS225/SYS225_P1\": [\n\t\t422,\n\t\t43\n\t],\n\t\"./pages/SYS/SYS225/SYS225_P1.js\": [\n\t\t422,\n\t\t43\n\t],\n\t\"./pages/SYS/SYS230\": [\n\t\t443,\n\t\t0,\n\t\t12\n\t],\n\t\"./pages/SYS/SYS230.js\": [\n\t\t443,\n\t\t0,\n\t\t12\n\t],\n\t\"./pages/SYS/SYS240\": [\n\t\t444,\n\t\t44\n\t],\n\t\"./pages/SYS/SYS240.js\": [\n\t\t444,\n\t\t44\n\t],\n\t\"./pages/SYS/SYS260\": [\n\t\t445,\n\t\t0,\n\t\t13\n\t],\n\t\"./pages/SYS/SYS260.js\": [\n\t\t445,\n\t\t0,\n\t\t13\n\t],\n\t\"./pages/SYS/SYS300\": [\n\t\t446,\n\t\t45\n\t],\n\t\"./pages/SYS/SYS300.js\": [\n\t\t446,\n\t\t45\n\t],\n\t\"./pages/SYS/SYS310\": [\n\t\t447,\n\t\t46\n\t],\n\t\"./pages/SYS/SYS310.js\": [\n\t\t447,\n\t\t46\n\t],\n\t\"./pages/SYS/SYS350\": [\n\t\t448,\n\t\t47\n\t],\n\t\"./pages/SYS/SYS350.js\": [\n\t\t448,\n\t\t47\n\t],\n\t\"./pages/SYS/SYS360\": [\n\t\t449,\n\t\t48\n\t],\n\t\"./pages/SYS/SYS360.js\": [\n\t\t449,\n\t\t48\n\t],\n\t\"./pages/SYS/SYS900\": [\n\t\t450,\n\t\t0,\n\t\t9\n\t],\n\t\"./pages/SYS/SYS900.js\": [\n\t\t450,\n\t\t0,\n\t\t9\n\t],\n\t\"./pages/SYS/SYS900/SYS900_P1\": [\n\t\t423,\n\t\t49\n\t],\n\t\"./pages/SYS/SYS900/SYS900_P1.js\": [\n\t\t423,\n\t\t49\n\t],\n\t\"./pages/VAC/VAC100\": [\n\t\t451,\n\t\t6\n\t],\n\t\"./pages/VAC/VAC100.js\": [\n\t\t451,\n\t\t6\n\t],\n\t\"./pages/VAC/VAC100/VAC100_ReferDialog\": [\n\t\t424,\n\t\t50\n\t],\n\t\"./pages/VAC/VAC100/VAC100_ReferDialog.js\": [\n\t\t424,\n\t\t50\n\t],\n\t\"./pages/VAC/VAC200\": [\n\t\t452,\n\t\t51\n\t],\n\t\"./pages/VAC/VAC200.js\": [\n\t\t452,\n\t\t51\n\t],\n\t\"./pages/VAC/VAC300\": [\n\t\t453,\n\t\t20\n\t],\n\t\"./pages/VAC/VAC300.js\": [\n\t\t453,\n\t\t20\n\t],\n\t\"./pages/VAC/VAC400\": [\n\t\t454,\n\t\t21\n\t],\n\t\"./pages/VAC/VAC400.js\": [\n\t\t454,\n\t\t21\n\t],\n\t\"./pages/VAC/VAC500\": [\n\t\t455,\n\t\t23\n\t],\n\t\"./pages/VAC/VAC500.js\": [\n\t\t455,\n\t\t23\n\t],\n\t\"./pages/index\": [\n\t\t105\n\t],\n\t\"./pages/index.js\": [\n\t\t105\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(function() {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn Promise.all(ids.slice(1).map(__webpack_require__.e)).then(function() {\n\t\treturn __webpack_require__(id);\n\t});\n}\nwebpackAsyncContext.keys = function webpackAsyncContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackAsyncContext.id = 477;\nmodule.exports = webpackAsyncContext;","const Loader = () => (\r\n
    \r\n \"loading\"\r\n
    \r\n);\r\n\r\nexport default Loader;\r\n","import React from 'react';\r\nimport ISOAxios, { DataPackage } from '../apis/ISOAxios';\r\nimport { e3, alertType } from 'src/framework/core/utils/utils';\r\n\r\nconst createDataPackage = () => {\r\n let dataPackage = DataPackage.init();\r\n dataPackage.AssemblyName = 'E3.COM.SYS.BIZ.dll';\r\n dataPackage.Namespace = 'E3.COM.SYS.BIZ';\r\n dataPackage.ClassName = 'SYSTEM';\r\n return dataPackage;\r\n};\r\n\r\nconst SysData = {\r\n selectAttachFiles: async (attachSeq) => {\r\n let fileList = [];\r\n try {\r\n let param = createDataPackage();\r\n param.MethodName = 'SelectAttachFiles';\r\n param.KeyValues.push(DataPackage.NewKeyValue('ATTACH_SEQ', attachSeq));\r\n\r\n let response = await ISOAxios.Execute(param);\r\n\r\n let responseJson = response.JsonData;\r\n let file = {};\r\n for (let i = 0; i < responseJson.length; i++) {\r\n file = {\r\n name: responseJson[i]['ORI_FILE_NM'],\r\n size: responseJson[i]['FILE_SIZE'],\r\n type: responseJson[i]['FILE_TYPE'],\r\n path: responseJson[i]['FILE_PATH'],\r\n uploaded: 'Y',\r\n seq: responseJson[i]['ATTACH_FILE_SEQ'],\r\n rename: responseJson[i]['SAVE_FILE_NM'],\r\n };\r\n\r\n fileList.push(file);\r\n }\r\n } catch (error) {\r\n e3.modal.alert(alertType.Error, error.message);\r\n }\r\n\r\n return fileList;\r\n },\r\n saveAttachInfo: async (attachGroupSeq, fileInfo) => {\r\n try {\r\n let param = createDataPackage();\r\n param.MethodName = 'SaveAttach';\r\n\r\n param.KeyValues.push(DataPackage.NewKeyValue('ATTACH_SEQ', attachGroupSeq));\r\n param.JsonData = JSON.stringify(fileInfo);\r\n\r\n return await ISOAxios.Execute(param);\r\n } catch (error) {\r\n e3.modal.alert(alertType.Error, error.message);\r\n }\r\n },\r\n // selectMenus: async () => {\r\n // try {\r\n // let param = createDataPackage();\r\n // param.MethodName = 'SelectMenus';\r\n // let response = await ISOAxios.Execute(param);\r\n // return JSON.parse(response.JsonData);\r\n // } catch (error) {\r\n // e3.modal.alert(alertType.Error, error.message);\r\n // }\r\n // },\r\n};\r\n\r\nexport default SysData;\r\n","import { jqx } from 'jqwidgets-scripts/jqwidgets-react-tsx/jqxgrid';\r\n\r\n/**\r\n * column default options;\r\n */\r\nconst columnOpt = {\r\n text: '',\r\n datafield: '',\r\n sortable: true,\r\n columngroup: '',\r\n columntype: 'string', // string, numberinput, date, combobox\r\n cellsrenderer: null,\r\n validation: null,\r\n cellvaluechanging: null,\r\n cellsformat: '',\r\n cellclassname: '',\r\n align: 'center',\r\n cellsalign: 'left',\r\n // width: 150,\r\n resizable: true,\r\n draggable: true,\r\n editable: false,\r\n classname: '',\r\n hidden: false,\r\n buttonclick: null,\r\n pinned: false,\r\n // createeditor: null,\r\n};\r\n\r\nconst columngroupOpt = {\r\n text: '',\r\n align: 'center',\r\n name: '',\r\n parentgroup: '',\r\n};\r\n\r\n/**\r\n * string or array to jaxdatasource\r\n * @param datasource\r\n * @returns {null|*}\r\n */\r\nconst dataAdapter = (datasource) => {\r\n if (!datasource) return null;\r\n\r\n let convertSource = null;\r\n\r\n if (typeof datasource === 'string') {\r\n convertSource = JSON.parse(datasource);\r\n } else {\r\n convertSource = datasource;\r\n }\r\n return new jqx.dataAdapter({\r\n datatype: 'array',\r\n localdata: convertSource,\r\n });\r\n};\r\n\r\n/**\r\n * 칼럼 추가\r\n * @param options\r\n * @returns {{buttonclick: null, datafield: string, hidden: boolean, resizable: boolean, editable: boolean, columngroup: string, sortable: boolean, cellsrenderer: null, align: string, cellclassname: string, draggable: boolean, classname: string, width: number, cellsalign: string, text: string, cellvaluechanging: null, cellsformat: string, validation: null, columntype: string}}\r\n */\r\nconst setColumn = (opt) => {\r\n let target = JSON.parse(JSON.stringify(columnOpt));\r\n\r\n if (opt.datafield && opt.datafield === 'NO') {\r\n opt.width = 50;\r\n opt.cellsalign = 'center';\r\n }\r\n\r\n if (opt.columnType === 'checkbox') {\r\n target.columntype = 'checkbox';\r\n target.threestatecheckbox = false;\r\n }\r\n\r\n // 셀 정렬\r\n if (opt.columnType === 'numberinput' && !opt.cellsalign) {\r\n opt.cellsalign = 'right';\r\n } else if (opt.columnType === 'string' && !opt.cellsalign) {\r\n opt.cellsalign = 'left';\r\n } else if (opt.columnType === 'date' && !opt.cellsalign) {\r\n opt.cellsalign = 'center';\r\n }\r\n\r\n // column format setting\r\n if (opt.columnType === 'date' && !opt.cellsformat) {\r\n opt.cellsformat = 'yyyy-MM-dd HH:mm:ss';\r\n } else if (opt.columnType === 'numberinput' && !opt.cellsformat) {\r\n opt.cellsformat = 'D';\r\n }\r\n\r\n // grid combobax 자동 생성\r\n if (!opt.cellsformat && opt.columnType === 'combobox') {\r\n opt.displayfield = '';\r\n opt.createeditor = (row, value, editor) => {\r\n editor.jqxComboBox({\r\n source: dataAdapter(opt.source),\r\n displayMembuer: 'LABEL',\r\n valueMember: 'VALUE',\r\n });\r\n };\r\n }\r\n\r\n if (opt.width === 0 && !opt.hidden) {\r\n opt.hidden = true;\r\n }\r\n\r\n return { ...target, ...opt };\r\n};\r\n\r\nconst setColumnGroup = (opt) => {\r\n let target = JSON.parse(JSON.stringify(columngroupOpt));\r\n\r\n return { ...target, ...opt };\r\n};\r\n\r\nexport { setColumn, setColumnGroup };\r\n","import _ from 'lodash';\r\nimport { render, unmountComponentAtNode } from 'react-dom';\r\nimport React from 'react';\r\nimport moment from 'moment';\r\nimport ISOConfirmDialog from 'src/framework/components/controls/ISOConfirmDialog';\r\nimport Loader from 'src/framework/components/loaderable/Loader';\r\nimport ISOAlert from 'src/framework/components/controls/ISOAlert';\r\nimport SysData from './SysData';\r\nimport axios from 'axios';\r\nimport { jqxkanbanApi, kanbanApi } from './kanbanApis';\r\nimport { tableGridApi } from './tableGridApis';\r\nimport { setColumn, setColumnGroup } from './gridApis';\r\n\r\nexport { SysData };\r\n\r\n/**\r\n * String to JSON\r\n *\r\n * @param {string}\r\n * @returns {string}\r\n */\r\nexport const jsonCheck = (str) => {\r\n try {\r\n const json = JSON.parse(str);\r\n //console.log(typeof json === 'object');\r\n return json;\r\n } catch (e) {\r\n return str;\r\n }\r\n};\r\nexport const jsonCheckTokenNull = (str) => {\r\n try {\r\n const json = JSON.parse(str);\r\n //console.log(typeof json === 'object');\r\n return json;\r\n } catch (e) {\r\n return str;\r\n }\r\n};\r\n\r\nconst uploadFile = async (file, uploadFileCallback) => {\r\n const API_URL = process.env.REACT_APP_FILESERVICE;\r\n const req = new FormData();\r\n if (file) {\r\n req.append('fileStream', file);\r\n const config = {\r\n headers: {\r\n 'Content-Type': 'application/json; charset=utf-8',\r\n },\r\n };\r\n await axios\r\n .post(`${API_URL}/Upload`, req, config)\r\n .then((res) => {\r\n if (res) {\r\n const ret = jsonCheck(res.data);\r\n\r\n if (!ret.ErrorMessage) {\r\n const fileUploadResult = ret.JsonData;\r\n\r\n if (uploadFileCallback) {\r\n uploadFileCallback(fileUploadResult);\r\n }\r\n } else {\r\n e3.modal.alert(alertType.Error, ret.ErrorMessage);\r\n }\r\n }\r\n })\r\n .catch((error) => {\r\n console.log(error);\r\n });\r\n }\r\n};\r\n\r\n/**\r\n * true // console enable\r\n * false // console disable\r\n */\r\nexport const isDebug = () => true;\r\n/**\r\n * Combine paths\r\n *\r\n * @param {string} parent\r\n * @param {string} child\r\n * @returns {string}\r\n */\r\nexport const combinePaths = (parent, child) => `${parent.replace(/\\/$/, '')}/${child.replace(/^\\//, '')}`;\r\n\r\n/**\r\n * Recursively build paths for each navigation item\r\n *\r\n * @param routes\r\n * @param {string} parentPath\r\n * @returns {*}\r\n */\r\nexport const buildPaths = (routes, parentPath = '') =>\r\n routes.map((route) => {\r\n const path = combinePaths(parentPath, route.path);\r\n return {\r\n ...route,\r\n path,\r\n ...(route.routes && { routes: buildPaths(route.routes, path) }),\r\n };\r\n });\r\n\r\n/**\r\n * Recursively provide parent reference for each navigation item\r\n *\r\n * @param routes\r\n * @param parentRoute\r\n * @returns {*}\r\n */\r\nexport const setupParents = (routes, parentRoute = null) =>\r\n routes.map((route) => {\r\n const withParent = {\r\n ...route,\r\n ...(parentRoute && { parent: parentRoute }),\r\n };\r\n return {\r\n ...withParent,\r\n ...(withParent.routes && {\r\n routes: setupParents(withParent.routes, withParent),\r\n }),\r\n };\r\n });\r\n\r\n/**\r\n * Convert navigation tree into flat array\r\n *\r\n * @param routes\r\n * @returns {any[]}\r\n */\r\nexport const flattenRoutes = (routes) =>\r\n routes.map((route) => [route.routes ? flattenRoutes(route.routes) : [], route]).flat(Infinity);\r\n\r\n/**\r\n * Combine all the above functions together\r\n *\r\n * @param routes\r\n * @returns {any[]}\r\n */\r\nexport const generateAppRoutes = (routes) => flattenRoutes(setupParents(buildPaths(routes)));\r\n\r\n/**\r\n * Provides path from root to the element\r\n *\r\n * @param route\r\n * @returns {any[]}\r\n */\r\nconst pathTo = (route) => {\r\n if (!route.parent) {\r\n return [route];\r\n }\r\n return [...pathTo(route.parent), route];\r\n};\r\nexport default pathTo;\r\n\r\n/**\r\n * 그리드 컬럼 정보를 이용하여 이름 정보 확인\r\n * @param {react-data-grid columns} arr\r\n * @param {column key} key\r\n */\r\nexport const getNameFromArray = (arr, key) => arr.filter((it) => it.key === key)[0].name;\r\n\r\nexport const localStorageSave = (name, value) => {\r\n try {\r\n if (typeof localStorage === 'undefined') {\r\n alert('localStorage 를 지원합니다');\r\n return;\r\n }\r\n localStorage.setItem(name, value);\r\n } catch (e) {\r\n alert(e.ErrorMessage);\r\n }\r\n};\r\nexport const localStorageLoad = (name) => {\r\n try {\r\n if (typeof localStorage === 'undefined') {\r\n alert('localStorage 를 지원합니다');\r\n return;\r\n }\r\n // eslint-disable-next-line consistent-return\r\n return localStorage.getItem(name);\r\n } catch (e) {\r\n // eslint-disable-next-line consistent-return\r\n return e.ErrorMessage;\r\n }\r\n};\r\nexport const localStorageRemove = (name) => {\r\n try {\r\n if (typeof localStorage === 'undefined') {\r\n alert('localStorage 를 지원합니다');\r\n return;\r\n }\r\n localStorage.removeItem(name);\r\n } catch (e) {\r\n alert(e.ErrorMessage);\r\n }\r\n};\r\n\r\n/**\r\n * window.location.hostname; // => aaaa.local\r\n * window.location.href; // => http://aaaa.local:8088/test.jsp\r\n * window.location.host; // => aaaa.local:8088\r\n * window.location.port; // => 8088\r\n * window.location.pathname; // => test.jsp\r\n * window.location.search; // => ?gg=1\r\n * window.location.protocol; // => http:\r\n */\r\nexport const getCurrentURL = (def = 'about') => {\r\n const url =\r\n window.location.pathname === '/' ? def : window.location.pathname.substring(1, window.location.pathname.length);\r\n if (url.indexOf('/')) {\r\n const p = url.split('/');\r\n return p[0];\r\n }\r\n return url;\r\n};\r\nexport const getCurrentMenu = () => {\r\n if (window.location.pathname === '/') return null;\r\n return _.filter(JSON.parse(localStorageLoad('MENU')), { RMS: window.location.pathname });\r\n};\r\n\r\nexport const getHeader = (p) => {\r\n const header = new Headers({\r\n Accept: 'application/json',\r\n 'Content-Type': 'application/json; charset=utf-8',\r\n 'X-API-Key': '123',\r\n });\r\n return header;\r\n};\r\n\r\nexport const fetchPost = (url, params, callback) => {\r\n const requestOptions = {\r\n method: 'POST',\r\n headers: getHeader(params),\r\n body: JSON.stringify(params),\r\n // mode:\"no-cors\"\r\n };\r\n fetch(url, requestOptions)\r\n .then((response) => response.json())\r\n .then((data) => callback(data, null))\r\n .catch((error) => callback(null, error));\r\n};\r\n\r\nexport const stringifyComponent = (Comp) => {\r\n try {\r\n return JSON.stringify(Comp);\r\n } catch (err) {\r\n return String(Comp);\r\n }\r\n};\r\n\r\nexport const setCookie = (name, value, days = 7) => {\r\n const expires = new Date();\r\n expires.setDate(expires.getDate() + days);\r\n document.cookie = `${name}=${value}; expires=${expires.toUTCString()}; path=/`;\r\n};\r\nexport const getCookie = (name) => {\r\n const cname = `${name}=`;\r\n const ca = document.cookie.split(';');\r\n for (let i = 0; i < ca.length; i++) {\r\n let c = ca[i];\r\n while (c.charAt(0) === ' ') {\r\n c = c.substring(1);\r\n }\r\n if (c.indexOf(cname) === 0) {\r\n return c.substring(cname.length, c.length);\r\n }\r\n }\r\n return '';\r\n};\r\nexport const toggleFullScreen = () => {\r\n let ret = false;\r\n try {\r\n if (!document.fullscreenElement) {\r\n document.documentElement.requestFullscreen();\r\n ret = true;\r\n } else if (document.exitFullscreen) {\r\n document.exitFullscreen();\r\n ret = false;\r\n }\r\n } catch {}\r\n return ret;\r\n};\r\n\r\nexport const paginate = (totalCount, pageblock, pageCurrent, displaypagesize = pageblock) => {\r\n const pageCount = Math.ceil(totalCount / pageblock);\r\n if (pageCount === 1) return null;\r\n const pages = _.range(1, pageCount + 1);\r\n const startIndex = (pageCurrent - 1) * pageblock;\r\n return {\r\n totalCount: totalCount,\r\n pageblock: pageblock,\r\n page: pageCurrent,\r\n itemss: _(pages).slice(startIndex).take(displaypagesize).value(),\r\n };\r\n};\r\nexport const setPageCurrent = () => {\r\n const menuTabs = localStorageLoad('MENUTABS') ? JSON.parse(localStorageLoad('MENUTABS')) : [];\r\n let isNew = true;\r\n let currentMenu = null;\r\n if (getCurrentMenu()) currentMenu = getCurrentMenu()[0];\r\n console.log('currentMenu', currentMenu);\r\n if (currentMenu) {\r\n menuTabs.forEach((element) => {\r\n if (element.RMS === currentMenu.RMS) isNew = false;\r\n });\r\n if (isNew && currentMenu) {\r\n if (menuTabs.length === 10) menuTabs.shift();\r\n menuTabs.push(currentMenu);\r\n localStorageSave('MENUTABS', JSON.stringify(menuTabs));\r\n }\r\n console.log('navigation -> Page -> PageBody Current Menu :', menuTabs);\r\n }\r\n};\r\n\r\nexport const getNameValue = (eventTarget, name = '') => {\r\n const ret = { name: '', value: '', type: '' };\r\n if (name && name.length > 0) {\r\n ret.name = name;\r\n } else {\r\n ret.name = eventTarget.name ? eventTarget.name : eventTarget.id;\r\n }\r\n ret.type = eventTarget.type;\r\n ret.value = eventTarget.value ? eventTarget.value : '';\r\n return ret;\r\n};\r\n\r\nexport const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));\r\n\r\nexport const getYearMonth = () => {\r\n let dte = new Date();\r\n let year = dte.getFullYear();\r\n let month = dte.getMonth() + 1;\r\n month = month < 10 ? `0${month}` : month;\r\n return `${year}-${month}`;\r\n};\r\nexport const getDate = () => {\r\n let todaye = new Date();\r\n let year = todaye.getFullYear();\r\n let month = todaye.getMonth() + 1;\r\n let date = todaye.getDate();\r\n month = month < 10 ? `0${month}` : month;\r\n date = date < 10 ? `0${date}` : date;\r\n return `${year}-${month}-${date}`;\r\n};\r\nexport const getEndDate = (strdate) => {\r\n let v = strdate.split('-');\r\n let enddate = new Date(parseInt(v[0]), parseInt(v[1]), 1 - 1);\r\n return enddate.getDate();\r\n};\r\nexport const getString2Date = (strdate) => {\r\n let v = strdate.split('-');\r\n return new Date(parseInt(v[0]), parseInt(v[1]) - 1, parseInt(v[2]));\r\n};\r\nexport const getInteger2Date = (year, month, date) => new Date(year, month, date);\r\nexport const getString2Day = (strdate) => getString2Date(strdate).getDay();\r\nexport const getInteger2Day = (year, month, date) => getInteger2Date(year, month, date).getDay();\r\n\r\n/**\r\n * XML Escaped character To Original character\r\n * TODO: 태그 변경 시 태그 사이의 공백은   로 변경 적용 필요\r\n *\r\n * @param {string}\r\n * @returns {string}\r\n */\r\nexport const getXmlEscapedToOriginal = (xmlStr) => {\r\n if (xmlStr == null) return \"\";\r\n\r\n return xmlStr\r\n .replace(/'/g, \"'\")\r\n .replace(/"/g, '\"')\r\n .replace(/>/g, \">\")\r\n .replace(/</g, \"<\")\r\n .replace(/&/g, \"&\")\r\n .replace(/ /g, \" \");\r\n};\r\n\r\n/** ****************************\r\n * 상수\r\n ***************************** */\r\nexport const divName = {\r\n conFirmDivName: 'e3-confirm-alert',\r\n alertDivName: 'e3-alert',\r\n loadingDivName: 'e3-loading',\r\n};\r\n\r\nexport const alertType = {\r\n Error: 'error',\r\n Warning: 'warning',\r\n Info: 'info',\r\n Success: 'success',\r\n};\r\n\r\nexport const e3 = {\r\n fileAttach: async (attachGroupSeq, attachFiles, callback) => {\r\n try {\r\n if (attachGroupSeq === '' && attachFiles.length === 0) {\r\n // 단순 callback 수행\r\n if (callback) {\r\n callback(attachGroupSeq);\r\n }\r\n } else {\r\n // 기존 등록 파일목록 저장\r\n let uploadResult = attachFiles.filter((x) => x.seq !== undefined);\r\n\r\n // 신규 파일만 upload && 정보 add\r\n const files = attachFiles.filter((x) => x.seq === undefined);\r\n\r\n for (let i = 0; i < files.length; i++) {\r\n await uploadFile(files[i], (result) => {\r\n let file = {\r\n name: result.OriFileName,\r\n size: result.FileSize + '',\r\n type: '',\r\n path: result.FileName,\r\n uploaded: result.UploadSucceeded ? 'Y' : 'N',\r\n seq: '',\r\n rename: result.RealFileName,\r\n };\r\n uploadResult.splice(uploadResult.length, 0, file);\r\n });\r\n }\r\n let updateResult = await SysData.saveAttachInfo(attachGroupSeq, uploadResult);\r\n if (callback) {\r\n let attachSeq = updateResult.KeyValues[0].Value;\r\n callback(attachSeq, uploadResult);\r\n }\r\n }\r\n } catch (error) {\r\n e3.modal.alert(alertType.Error, error.message);\r\n }\r\n },\r\n sizeToText: (size) => {\r\n if (size === 0) return '0 Bytes';\r\n const k = 1024;\r\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\r\n const i = Math.floor(Math.log(size) / Math.log(k));\r\n return `${parseFloat((size / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;\r\n },\r\n appendProperty: (array, properyName, defaultValue = '') => {\r\n array.map((item) => {\r\n item[properyName] = defaultValue;\r\n });\r\n },\r\n /** ****************************\r\n * Modal\r\n ***************************** */\r\n modal: {\r\n alert: (alertType, contents) => {\r\n const component = ;\r\n\r\n e3.ui.createElement(divName.alertDivName, component);\r\n },\r\n confirm: (title, contents, onConfirmClick, onCloseClick) => {\r\n const component = (\r\n \r\n );\r\n\r\n e3.ui.createElement(divName.conFirmDivName, component);\r\n },\r\n saveConfirm: (onConfirmClick, onCloseClick) => {\r\n e3.modal.confirm('확인', '저장하시겠습니까?', onConfirmClick, onCloseClick);\r\n },\r\n deleteConfirm: (onConfirmClick, onCloseClick) => {\r\n e3.modal.confirm('확인', '삭제하시겠습니까?', onConfirmClick, onCloseClick);\r\n },\r\n validationAlert: (txtLabel) => {\r\n e3.modal.alert(alertType.Warning, txtLabel + '을(를) 입력해주세요.');\r\n },\r\n successAlert: () => {\r\n e3.modal.alert(alertType.Success, '성공하였습니다.!');\r\n },\r\n failureAlert: () => {\r\n e3.modal.alert(alertType.Error, '실패하였습니다.');\r\n },\r\n checkAlert: () => {\r\n e3.modal.alert(alertType.Warning, '자료를 선택해주세요.');\r\n },\r\n },\r\n\r\n /** ****************************A\r\n * Ui\r\n ***************************** */\r\n ui: {\r\n createElement: (divName, component) => {\r\n let divTarget = document.getElementById(divName);\r\n if (divTarget) {\r\n render(component, divTarget);\r\n } else {\r\n divTarget = document.createElement('div');\r\n divTarget.id = divName;\r\n document.body.appendChild(divTarget);\r\n render(component, divTarget);\r\n }\r\n },\r\n removeElementReconfirm: (divName) => {\r\n const target = document.getElementById(divName);\r\n if (target) {\r\n unmountComponentAtNode(target);\r\n target.parentNode.removeChild(target);\r\n }\r\n },\r\n showLoading: () => {\r\n e3.ui.createElement(divName.loadingDivName, );\r\n },\r\n hideLoading: () => {\r\n e3.ui.removeElementReconfirm(divName.loadingDivName);\r\n },\r\n },\r\n grid: {\r\n setColumn,\r\n setColumnGroup,\r\n lpad: (s, padLength, padString = '0') => {\r\n while (s.length <= padLength) s = padString + s;\r\n return s;\r\n },\r\n rpad: (s, padLength, padString = '0') => {\r\n while (s.length <= padLength) s += padString;\r\n return s;\r\n },\r\n },\r\n date: {\r\n /**\r\n * 형변환 날짜 > 문\r\n * @param date typeof date\r\n * @param format yyyy-mm-dd..\r\n * @returns {string}\r\n */\r\n dateToString: (date, format) => moment(date).format(format.toUpperCase()),\r\n string2Date: (stringDate) => {\r\n try {\r\n return new Date(stringDate);\r\n }\r\n catch{\r\n try{\r\n return new Date.parse(stringDate);\r\n }\r\n catch {\r\n return stringDate;\r\n }\r\n }\r\n }\r\n },\r\n string: {\r\n /**\r\n * 좌측 문자열 채우기\r\n * @param val 채울값\r\n * @param len 채울 길이\r\n * @returns {string}\r\n */\r\n lPad: (val, len) => {\r\n const str = val.toString();\r\n let i = 0;\r\n let ret = '';\r\n while (i++ < len - str.length) {\r\n ret += '0';\r\n }\r\n return ret + str;\r\n },\r\n /**\r\n * 형변환 문자 > 날짜\r\n * @param s\r\n * @param format\r\n * @returns {Date}\r\n */\r\n stringToDate: (s, format) => {\r\n if (s) return moment(s, format).toDate();\r\n return '';\r\n },\r\n },\r\n\r\n /**\r\n * 파일 to base64\r\n */\r\n fileToBase64Async: (file) => {\r\n return new Promise((resolve, reject) => {\r\n let reader = new FileReader();\r\n reader.onload = () => resolve(reader.result);\r\n reader.onerror = reject;\r\n reader.readAsDataURL(file);\r\n });\r\n },\r\n\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport { ResizableBox } from 'react-resizable';\r\nimport { PaperComponent, Transition, ISODialogTitle, ISODialogContent, useStyles, ISODialogActions } from './common';\r\nimport Button from '@material-ui/core/Button';\r\n\r\n/**\r\n * content body style class :: dialog-content-body\r\n * Title과 Actions의 사이즈의 변경이 있으면 스타일 시트도 변경이 필요합니다.\r\n * 현재 Title 64px, Actions 62px Default 값입니다.\r\n * @param {*} props\r\n * isOpen: PropTypes.bool,\r\n * title: PropTypes.string,\r\n * children: PropTypes.any,\r\n * buttonOkTitle: PropTypes.string,\r\n * buttonCloseTitle: PropTypes.string,\r\n * onModalOkClick: PropTypes.func,\r\n * onModalCloseClick: PropTypes.func.isRequired,\r\n * width: PropTypes.number,\r\n * height: PropTypes.number,\r\n * dialogId: PropTypes.string\r\n */\r\nfunction ModalOkClose(props) {\r\n const classes = useStyles();\r\n const { onModalOkClick, onModalCloseClick } = props;\r\n return (\r\n
    \r\n \r\n \r\n
    \r\n \r\n {props.title}\r\n \r\n \r\n
    {props.children}
    \r\n
    \r\n \r\n \r\n {props.buttonOkTitle}\r\n \r\n \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n );\r\n}\r\nModalOkClose.propTypes = {\r\n isOpen: PropTypes.bool,\r\n title: PropTypes.string,\r\n children: PropTypes.any,\r\n buttonOkTitle: PropTypes.string,\r\n buttonCloseTitle: PropTypes.string,\r\n onModalOkClick: PropTypes.func,\r\n onModalCloseClick: PropTypes.func.isRequired,\r\n buttonAlign: PropTypes.oneOf(['right', 'left', 'center']),\r\n width: PropTypes.number,\r\n height: PropTypes.number,\r\n dialogId: PropTypes.string,\r\n};\r\nModalOkClose.defaultProps = {\r\n isOpen: false,\r\n buttonOkTitle: 'OK',\r\n buttonCloseTitle: 'Close',\r\n buttonAlign: 'right',\r\n width: 600,\r\n height: 400,\r\n dialogId: 'draggable-dialog-okclose',\r\n};\r\n\r\nconst ModalOkCloseRef = React.forwardRef((props, ref) => {\r\n const [isOpen, setIsOpen] = React.useState(false);\r\n React.useImperativeHandle(ref, () => ({\r\n showDialog() {\r\n setIsOpen(true);\r\n },\r\n hideDialog() {\r\n setIsOpen(false);\r\n },\r\n getStateValue() {\r\n return isOpen;\r\n },\r\n }));\r\n return (\r\n <>\r\n \r\n \r\n );\r\n});\r\n\r\nexport { ModalOkClose, ModalOkCloseRef };\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport { ResizableBox } from 'react-resizable';\r\nimport { PaperComponent, Transition, ISODialogTitle, ISODialogContent, useStyles, ISODialogActions } from './common';\r\nimport Button from '@material-ui/core/Button';\r\n\r\n/**\r\n * Ok(확인) 버튼만 지원하는 Modal 창입니다.\r\n * dialogId는 창이 움직일때 사용되는 값입니다.\r\n * 여러 개의 창을 사용할 경우 모두 다르게 적용이 필요합니다.\r\n * @param {*} props\r\n * isOpen: PropTypes.bool,\r\n * title: PropTypes.string,\r\n * children: PropTypes.any,\r\n * buttonOkTitle: PropTypes.string,\r\n * onModalOkClick: PropTypes.func,\r\n * width: PropTypes.number,\r\n * height: PropTypes.number,\r\n * dialogId: PropTypes.string,\r\n */\r\nfunction ModalOkOnly(props) {\r\n const classes = useStyles();\r\n const { onModalOkClick } = props;\r\n return (\r\n
    \r\n \r\n \r\n
    \r\n \r\n {props.title}\r\n \r\n \r\n
    {props.children}
    \r\n
    \r\n \r\n \r\n {props.buttonOkTitle}\r\n \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n );\r\n}\r\nModalOkOnly.propTypes = {\r\n isOpen: PropTypes.bool,\r\n title: PropTypes.string,\r\n children: PropTypes.any,\r\n buttonOkTitle: PropTypes.string,\r\n onModalOkClick: PropTypes.func,\r\n buttonAlign: PropTypes.oneOf(['right', 'left', 'center']),\r\n width: PropTypes.number,\r\n height: PropTypes.number,\r\n dialogId: PropTypes.string,\r\n};\r\nModalOkOnly.defaultProps = {\r\n isOpen: false,\r\n buttonOkTitle: 'OK',\r\n buttonAlign: 'right',\r\n width: 600,\r\n height: 400,\r\n dialogId: 'draggable-dialog-okonly',\r\n};\r\n\r\nconst ModalOkOnlyRef = React.forwardRef((props, ref) => {\r\n const [isOpen, setIsOpen] = React.useState(false);\r\n React.useImperativeHandle(ref, () => ({\r\n showDialog() {\r\n setIsOpen(true);\r\n },\r\n hideDialog() {\r\n setIsOpen(false);\r\n },\r\n getStateValue() {\r\n return isOpen;\r\n },\r\n }));\r\n return (\r\n <>\r\n \r\n \r\n );\r\n});\r\n\r\nexport { ModalOkOnly, ModalOkOnlyRef };\r\n","/* eslint-disable react/jsx-props-no-spreading */\r\nimport React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport Draggable from 'react-draggable';\r\nimport { withStyles, makeStyles } from '@material-ui/core/styles';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport MuiDialogTitle from '@material-ui/core/DialogTitle';\r\nimport MuiDialogActions from '@material-ui/core/DialogActions';\r\nimport MuiDialogContent from '@material-ui/core/DialogContent';\r\nimport DialogContentText from '@material-ui/core/DialogContentText';\r\nimport Button from '@material-ui/core/Button';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport CloseIcon from '@material-ui/icons/Close';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Slide from '@material-ui/core/Slide';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport { ResizableBox } from 'react-resizable';\r\nimport Paper from '@material-ui/core/Paper';\r\nimport {\r\n PaperComponent,\r\n Transition,\r\n useStyles,\r\n DialogText,\r\n ISODialogTitle,\r\n ISODialogContent,\r\n ISODialogActions,\r\n} from './common';\r\n\r\nconst ConfirmDialog = React.forwardRef((props, ref) => {\r\n const [dialog, setDialog] = React.useState({\r\n isOpen: false,\r\n message: '',\r\n onOkClick: null,\r\n onCancelClick: null,\r\n });\r\n const closeDialog = () => {\r\n setDialog({\r\n ...dialog,\r\n isOpen: false,\r\n message: '',\r\n onOkClick: null,\r\n onCancelClick: null,\r\n });\r\n };\r\n React.useImperativeHandle(ref, () => ({\r\n showDialog(msg) {\r\n setDialog({\r\n ...dialog,\r\n isOpen: true,\r\n message: msg,\r\n });\r\n },\r\n showFunctionDialog(msg, onOkClick, onCancelClick) {\r\n setDialog({\r\n ...dialog,\r\n isOpen: true,\r\n message: msg,\r\n onOkClick: onOkClick,\r\n onCancelClick: onCancelClick,\r\n });\r\n },\r\n hideDialog() {\r\n setDialog({\r\n ...dialog,\r\n isOpen: false,\r\n message: '',\r\n onOkClick: null,\r\n onCancelClick: null,\r\n });\r\n },\r\n getStateValue() {\r\n return dialog;\r\n },\r\n }));\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n {dialog.message || '적용하시겠습니까?'}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n});\r\n\r\nexport { ConfirmDialog };\r\n","/* eslint-disable react/jsx-props-no-spreading */\r\nimport React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport { ResizableBox } from 'react-resizable';\r\n\r\nimport {\r\n PaperComponent,\r\n Transition,\r\n DialogText,\r\n ISODialogTitle,\r\n ISODialogContent,\r\n ISODialogActions,\r\n} from './ISODialog/common';\r\nimport { ModalOkClose, ModalOkCloseRef } from './ISODialog/ModalOkClose';\r\nimport { ModalOkOnly, ModalOkOnlyRef } from './ISODialog/ModalOkOnly';\r\nimport { ConfirmDialog } from './ISODialog/ConfirmDialog';\r\n\r\nfunction ISODialog(props) {\r\n const { children, onClose, isOpen, dialogId, height, width, isResizeable, ...other } = props;\r\n return (\r\n
    \r\n \r\n {isResizeable?\r\n \r\n
    {props.children}
    \r\n
    :\r\n
    {props.children}
    \r\n }\r\n \r\n \r\n
    \r\n );\r\n}\r\nISODialog.propTypes = {\r\n onClose: PropTypes.func,\r\n isOpen: PropTypes.bool,\r\n dialogId: PropTypes.string,\r\n height: PropTypes.number,\r\n width: PropTypes.number,\r\n isResizeable: PropTypes.bool,\r\n};\r\nISODialog.defaultProps = {\r\n isResizeable: true,\r\n height: 600,\r\n width: 400,\r\n};\r\n\r\nexport {\r\n ModalOkOnly,\r\n ModalOkOnlyRef,\r\n ModalOkClose,\r\n ModalOkCloseRef,\r\n ConfirmDialog,\r\n DialogText,\r\n PaperComponent,\r\n ISODialog,\r\n ISODialogTitle,\r\n ISODialogContent,\r\n ISODialogActions,\r\n};\r\n","import React from 'react';\r\n\r\nexport default function Loading(props) {\r\n if (props.error) {\r\n console.log(props.error);\r\n return (\r\n
    \r\n

    ERROR

    \r\n

    페이지를 찾을 수 없습니다.

    \r\n
    \r\n );\r\n } if (props.pastDelay) {\r\n return
    Loading...
    ;\r\n }\r\n return null;\r\n}\r\n","/* 액션 타입 선언 */\r\n\r\nimport Loading from 'src/framework/components/loaderable/Loading';\r\nimport Loadable from 'react-loadable';\r\n\r\nconst TABCOUNT = process.env.REACT_APP_TAB_COUNT; //FHD기준\r\n\r\nconst ADD_TAB = 'ADD_TAB';\r\nconst REMOVE_TAB = 'REMOVE_TAB';\r\nconst REMOVE_ALL = 'REMOVE_ALL';\r\nconst SELECT_TAB = 'SELECT_TAB';\r\nconst PREV_TAB = 'PREV_TAB';\r\nconst NEXT_TAB = 'NEXT_TAB';\r\n\r\n/* 액션 생성함수 선언 */\r\nlet nextId = 1;\r\nexport const addTab = (payload) => ({\r\n type: ADD_TAB,\r\n tab: {\r\n id: nextId++, // 새 항목을 추가하고 nextId 값에 1을 더해줍니다.\r\n menuId: payload.MENU_ID,\r\n name: payload.MENU_NAME,\r\n contents: Loadable({\r\n loader: () => import('../../../pages' + payload.PROGRAM_PATH),\r\n loading: Loading,\r\n }),\r\n MNU_ID: payload.MENU_ID,\r\n NAME_PATH: payload.NAME_PATH,\r\n PROGRAM_ID: payload.PROGRAM_ID,\r\n isActive: true,\r\n },\r\n});\r\n\r\nexport const removeTab = (id) => ({\r\n type: REMOVE_TAB,\r\n id: id,\r\n});\r\n\r\nexport const removeAll = () => ({\r\n type: REMOVE_ALL,\r\n});\r\n\r\nexport const selectTab = (id) => ({\r\n type: SELECT_TAB,\r\n id: id,\r\n});\r\n\r\nexport const prevTab = (id) => ({\r\n type: PREV_TAB,\r\n id: id,\r\n});\r\n\r\nexport const nextTab = (id) => ({\r\n type: NEXT_TAB,\r\n id: id,\r\n});\r\n\r\nconst initialState = {\r\n tabList: [\r\n {\r\n id: 0,\r\n menuId: 'home',\r\n name: 'Home',\r\n contents: Loadable({\r\n loader: () => import('../../../pages/Home'),\r\n loading: Loading,\r\n }),\r\n isActive: true,\r\n },\r\n ],\r\n};\r\n\r\nconst prevPage = (tabList, id) => {\r\n const prevPageList = tabList.filter((f) => {\r\n return f.id > 0 && f.id < id;\r\n });\r\n const prevPage = prevPageList[prevPageList.length - 1];\r\n if (prevPage == undefined) {\r\n return 0;\r\n } else {\r\n return prevPage.id;\r\n }\r\n};\r\n\r\nconst nextPage = (tabList, id) => {\r\n const nextPageList = tabList.filter((f) => {\r\n return f.id > id && id < tabList[tabList.length - 1].id;\r\n });\r\n const nextPage = nextPageList[0];\r\n if (nextPage == undefined) {\r\n return id;\r\n } else {\r\n return nextPage.id;\r\n }\r\n};\r\n\r\nexport default function tabReducer(state = initialState, action) {\r\n const tabList = state.tabList;\r\n let isLastPage = true;\r\n switch (action.type) {\r\n case ADD_TAB:\r\n return {\r\n ...state,\r\n tabList:\r\n tabList.filter((e) => {\r\n if (e.menuId == action.tab.menuId) return true;\r\n else return false;\r\n }).length < 1 && tabList.length < TABCOUNT\r\n ? tabList\r\n .map((e) => {\r\n return { ...e, isActive: false };\r\n })\r\n .concat(action.tab)\r\n : tabList.map((e, index, array) => {\r\n if (e.menuId === action.tab.menuId) {\r\n isLastPage = false;\r\n return { ...e, isActive: true };\r\n } else if (e.menuId === array[array.length - 1].menuId && isLastPage) return { ...e, isActive: true };\r\n else return { ...e, isActive: false };\r\n }),\r\n };\r\n case REMOVE_TAB:\r\n return {\r\n ...state,\r\n tabList: tabList\r\n .filter((f, index, array) => {\r\n return f.id !== action.id;\r\n })\r\n .map((e, index, array) => {\r\n if (index === array.length - 1) return { ...e, isActive: true };\r\n else return { ...e, isActive: false };\r\n }),\r\n };\r\n case REMOVE_ALL:\r\n state = initialState;\r\n return state;\r\n case SELECT_TAB:\r\n return {\r\n ...state,\r\n tabList: tabList.map((e) => {\r\n if (e.id === action.id) return { ...e, isActive: true };\r\n else return { ...e, isActive: false };\r\n }),\r\n };\r\n case PREV_TAB:\r\n return {\r\n ...state,\r\n tabList: tabList.map((e) => {\r\n if (e.id === prevPage(tabList, action.id)) return { ...e, isActive: true };\r\n else return { ...e, isActive: false };\r\n }),\r\n };\r\n case NEXT_TAB:\r\n return {\r\n ...state,\r\n tabList: tabList.map((e) => {\r\n if (e.id === nextPage(tabList, action.id)) return { ...e, isActive: true };\r\n else return { ...e, isActive: false };\r\n }),\r\n };\r\n default:\r\n return state;\r\n }\r\n}\r\n","/* eslint-disable react/jsx-props-no-spreading */\r\nimport React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport styled from 'styled-components';\r\n// import { makeStyles } from '@material-ui/core/styles';\r\n\r\n/**\r\n * \r\n */\r\nexport const Button = styled.button`\r\n align-items: center;\r\n background-color: transparent;\r\n border: 2px solid deepskyblue;\r\n border-radius: 8px;\r\n color: white;\r\n display: inline-flex;\r\n font-family: sans-serif;\r\n font-size: inherit;\r\n line-height: 1.4rem;\r\n margin: 0 4px;\r\n padding: 8px 12px 8px 4px;\r\n position: relative;\r\n text-decoration: none;\r\n transition:\r\n border-color 150ms ease-out,\r\n transform 150ms ease-out;\r\n\r\n &:not([disabled]) {\r\n cursor: pointer;\r\n }\r\n &:not([disabled]):hover {\r\n border-color: white;\r\n }\r\n &:not([disabled]):active {\r\n transform: scale(0.95);\r\n }\r\n &:focus {\r\n outline: none;\r\n }\r\n &:focus::after {\r\n content: ' ';\r\n position: absolute;\r\n left: 2px;\r\n right: 2px;\r\n top: 2px;\r\n bottom: 2px;\r\n border: 2px solid white; \r\n border-radius: 5px;\r\n }\r\n &[disabled] {\r\n opacity: 0.5;\r\n }\r\n}`;\r\n\r\n/**\r\n * 검색 영역안의 박스 출력\r\n */\r\nexport const SearchBox = styled.div`\r\n position: relative;\r\n display: inline-block;\r\n width: 100%;\r\n padding: 7px 7px;\r\n border: 1px solid #bbb;\r\n border-radius: 2px;\r\n -webkit-transition: all .2s;\r\n transition: all .2s;\r\n`;\r\n/**\r\n * 박스 출력이 없는 영역 설정\r\n */\r\nexport const ResultBoxNoBorder = styled.div`\r\n position: relative;\r\n display: inline-block;\r\n width: 100%; height: ${(props) => props.height || '100%'};\r\n padding: 0; margin: 0 auto;\r\n -webkit-transition: all .2s;\r\n transition: all .2s;\r\n`;\r\nexport const DivPaddingLeft = styled.div`\r\n display: inline-block;\r\n width: ${(props) => props.width || '100%'};\r\n height: ${(props) => props.height || '100%'};\r\n margin: 0 auto;\r\n padding-top: 2px;\r\n padding-bottom: 2px;\r\n padding-left: ${(props) => props.paddingLeft || '10px'}; \r\n`;\r\nDivPaddingLeft.defaultProps = {\r\n className: 'chcMnq',\r\n};\r\nexport const DivPaddingRight = styled.div`\r\n display: inline-block;\r\n width: ${(props) => props.width || '100%'};\r\n height: ${(props) => props.height || '100%'};\r\n margin: 0 auto;\r\n padding-top: 2px;\r\n padding-bottom: 2px;\r\n padding-right: ${(props) => props.paddingRight || '10px'}; \r\n`;\r\nDivPaddingRight.defaultProps = {\r\n className: 'chcMnq',\r\n};\r\n/**\r\n * Flex group style\r\n */\r\nexport const groupStyles = {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n};\r\n/**\r\n * 배지 출력 스타일\r\n */\r\nexport const groupBadgeStyles = {\r\n backgroundColor: '#EBECF0',\r\n borderRadius: '2em',\r\n color: '#172B4D',\r\n display: 'inline-block',\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n lineHeight: '1',\r\n minWidth: 1,\r\n padding: '0.16666666666667em 0.5em',\r\n textAlign: 'center',\r\n};\r\n\r\nexport const formatGroupLabel = React.memo((data) => (\r\n
    \r\n {data.label}\r\n {data.options.length}\r\n
    \r\n));\r\n\r\n/**\r\n * Result Div Resize\r\n * @param {*} props {autoHeight, addLayer}\r\n */\r\nexport function AutoHeightCalculate(props) {\r\n let resultHeight = 500;\r\n const paddingSize = 4;\r\n try {\r\n if (props.autoHeight !== undefined && props.autoHeight) {\r\n // const contentsHeight = window.getComputedStyle(document.querySelector('.main-body-content')).height;\r\n const contentsHeight = document.querySelector('.tab-content.active .main-body-content') ? document.querySelector('.tab-content.active .main-body-content').clientHeight : 754;\r\n const searchBoxHeight = document.querySelector('.tab-content.active .main-body-search-area') ? document.querySelector('.tab-content.active .main-body-search-area').clientHeight : 0;\r\n const formBoxHeight = document.querySelector('.tab-content.active .main-body-form-area') ? document.querySelector('.tab-content.active .main-body-form-area').clientHeight : 0;\r\n if (props.addLayer !== undefined && props.addLayer) {\r\n const addLayerHeight = document.querySelector(`.tab-content.active .${props.addLayer}`) ? document.querySelector(`.tab-content.active .${props.addLayer}`).clientHeight : 0;\r\n resultHeight = (parseInt(contentsHeight) - parseInt(searchBoxHeight) - parseInt(addLayerHeight) - parseInt(formBoxHeight) - paddingSize);\r\n } else {\r\n resultHeight = (parseInt(contentsHeight) - parseInt(searchBoxHeight) - parseInt(formBoxHeight) - paddingSize);\r\n }\r\n // console.log(\"AutoHeightCalculate :: \", contentsHeight, searchBoxHeight, formBoxHeight, resultHeight);\r\n if (!resultHeight) {\r\n document.querySelector('.tab-content.active .main-body-result-area').style.height = '100%';\r\n } else {\r\n document.querySelector('.tab-content.active .main-body-result-area').style.height = `${resultHeight}px`;\r\n document.querySelector('.tab-content.active .main-body-result-area .main-body-result-box').style.height = `${resultHeight - paddingSize}px`;\r\n document.querySelector('.tab-content.active .main-body-result-area').style.overflowY = 'auto';\r\n }\r\n }\r\n } catch (error) {\r\n //\r\n }\r\n}\r\n/**\r\n * section Tag Layout\r\n * 영역을 나누는 태그 설정\r\n * @param {*} props\r\n */\r\nexport const OLayer = React.memo((props) => {\r\n const cssClass = `layout ${props && props.className && props.className !== undefined ? props.className : ''}`;\r\n const htmlId = `${props && props.id && props.id !== undefined ? props.id : ''}`;\r\n return (\r\n
    \r\n {props.children}\r\n
    \r\n );\r\n});\r\n\r\n/**\r\n * Top Menu area layout\r\n * 탑메뉴 영역의 설정\r\n */\r\nexport const OHeader = React.memo((props) => {\r\n const cssClass = `layout-header ${props && props.className && props.className !== undefined ? props.className : ''}`;\r\n return (\r\n
    \r\n {props.children}\r\n
    \r\n );\r\n});\r\n\r\n/** *\r\n * Side menu area layout (Hide & Show - props.collapsed)\r\n * 좌측 메뉴 출력 영역 설정 (숨김과 보임 기능 설정)\r\n */\r\nexport const OSider = React.memo((props) => {\r\n const cssClass = `side-menu layout-sider${props && props.className && props.className !== undefined ? props.className : ''}`;\r\n const cssWidth = props.collapsedWidth;\r\n const { collapsible, OSiderOver, OSiderOut } = props;\r\n const collapsed = collapsible ? props.collapsed : collapsible;\r\n const cssHideStyle = {\r\n flex: `0 0 ${cssWidth}px`, maxWidth: `${cssWidth}0px`, minWidth: `${cssWidth}0px`, width: `${cssWidth}0px`,\r\n };\r\n const cssShowStyle = {};\r\n return (\r\n \r\n );\r\n});\r\n\r\nOSider.propTypes = {\r\n className: PropTypes.string,\r\n collapsedWidth: PropTypes.number,\r\n collapsible: PropTypes.bool,\r\n collapsed: PropTypes.bool,\r\n};\r\nOSider.defaultProps = {\r\n collapsedWidth: 0,\r\n collapsible: true,\r\n};\r\n\r\n/**\r\n * Contents Area - O Tabs Here\r\n * 각 페이지의 내용을 출력하는 영역 (Tabs에서 처리)\r\n */\r\nexport const OMain = React.memo((props) => {\r\n const cssClass = `layout-content ${props && props.className && props.className !== undefined ? props.className : ''}`;\r\n return (\r\n
    \r\n {props.children}\r\n
    \r\n );\r\n});\r\n\r\n/**\r\n * Title bar in Main Contents Area\r\n * 페이지 제목 및 브레드크럼 출력하는 영역\r\n */\r\nexport const OTitleBox = React.memo((props) => (\r\n
    \r\n
    \r\n
      \r\n {\r\n props.pageInfo.pageTitle.map((item) => (
    • {item}
    • ))\r\n }\r\n
    \r\n \r\n {props.children}\r\n \r\n
    \r\n
    \r\n));\r\n\r\n/**\r\n * Search Object contents here in Main Contents Area\r\n * 검색 항목에 사용하는 영역\r\n */\r\nexport const OSearchBox = React.memo((props) => (\r\n
    \r\n
    \r\n {props.children}\r\n
    \r\n
    \r\n));\r\n\r\n/**\r\n * Search result data to Grid display area in Main Contents Area\r\n * 검색 결과를 출력하는 그리드를 출력하는 영역\r\n */\r\nexport const OResultBox = React.memo((props) => {\r\n React.useEffect(() => {\r\n AutoHeightCalculate(props);\r\n }, []);\r\n\r\n return (\r\n props.style !== undefined ? (\r\n
    \r\n
    \r\n {props.children}\r\n
    \r\n
    \r\n )\r\n : (\r\n
    \r\n
    \r\n {props.children}\r\n
    \r\n
    \r\n )\r\n );\r\n});\r\n\r\n/**\r\n * Form Object - data handle object\r\n * 데이타의 등록, 수정, 삭제 하는 영역\r\n */\r\nexport const OFormBox = React.memo((props) => (\r\n props.style !== undefined ? (\r\n
    \r\n
    \r\n {props.children}\r\n
    \r\n
    \r\n ) : (\r\n
    \r\n
    \r\n {props.children}\r\n
    \r\n
    \r\n )\r\n));\r\n\r\n/**\r\n * Loading page\r\n * 페이지 열리는 동안 출력되는 영역\r\n */\r\nexport const LoadingPage = React.memo(() => (\r\n
    \r\n
    \r\n Page Loading.......\r\n
    \r\n
    \r\n));\r\n\r\n/**\r\n * Grid No data\r\n * 자료 없음을 출력\r\n */\r\nexport const EmptyRowsRenderer = React.memo(() =>
    Nothing to show No - Data
    );\r\n\r\n/// 그리드 컬럼 24 분활\r\nexport const layoutlabel = {\r\n labelCol: {\r\n span: 4,\r\n },\r\n wrapperCol: {\r\n span: 20,\r\n },\r\n};\r\n\r\n/**\r\n * 버튼 콘트롤을 Flex하게 출력하기 위한 콤포넌트\r\n * 버튼을 children 으로 추가한다.\r\n */\r\nexport const ButtonArea = React.memo((props) => (\r\n
    \r\n {props.children}\r\n
    \r\n));\r\n\r\nexport const ButtonWrap = React.memo((props) => (\r\n
    \r\n {props.children}\r\n
    \r\n));\r\n\r\nexport const InputWrap = React.memo((props) => (\r\n
    \r\n \r\n \r\n {props.children}\r\n \r\n
    \r\n
    \r\n));\r\n\r\nexport const SearchWrap = React.memo((props) => (\r\n
    \r\n \r\n \r\n {props.children}\r\n \r\n
    \r\n
    \r\n));\r\n\r\nexport const RowWrap = React.memo((props) => (\r\n \r\n {props.children}\r\n \r\n));\r\n\r\nexport const ColumnWrap = React.memo((props) => (\r\n <>\r\n {props.textlabel\r\n ? (\r\n <>\r\n \r\n \r\n \r\n {props.children ? (\r\n \r\n {props.children}\r\n \r\n )\r\n : ''}\r\n\r\n \r\n )\r\n : (\r\n \r\n {props.children}\r\n \r\n )}\r\n \r\n));\r\n\r\n/**\r\n * Input 과 Label 을 하나로 사용하는 콤포넌트\r\n * value 와 onChange 기능을 사용\r\n */\r\nexport const InputTextWithLabel = React.memo((props) => {\r\n const { onChange } = props;\r\n return (\r\n <>\r\n
    \r\n \r\n \r\n
    \r\n \r\n );\r\n});\r\nexport const InputTextWithLabelRef = React.forwardRef((props, ref) => {\r\n const [value, setValue] = React.useState('');\r\n const [disabled, setDisabled] = React.useState(false);\r\n React.useImperativeHandle(\r\n ref,\r\n () => ({\r\n setDisabled(b) {\r\n setDisabled(b);\r\n },\r\n onChange(e) {\r\n setValue(e);\r\n },\r\n async getStateValue() {\r\n return value;\r\n },\r\n }),\r\n );\r\n return (\r\n <>\r\n \r\n \r\n );\r\n});\r\n\r\n/**\r\n * inputRef를 사용하는 콤포넌트\r\n * 부모 페이지의 변수와 연결하여 사용\r\n * inputRef={el=>(inputElement.VOC_NM=el)} - inputElement.VOC_NM 부모 페이지의 변수\r\n * inputElement 변수 선언은 함수 밖에서 선언하여야 한다.\r\n * 그렇지 않을 경우 Rerender에서 다시 초기화 되는 문제가 발생한다.\r\n */\r\nexport const InputTextWithLabel4inputRef = React.memo((props) => (\r\n <>\r\n
    \r\n \r\n \r\n
    \r\n \r\n));\r\n","import { useDispatch } from 'react-redux';\r\nimport base64 from 'base-64';\r\nimport { login, logout, clearStore } from '../reducers/login';\r\n\r\n/**\r\n * 로그인 처리 및 세션 저장소에 데이타 저장 처리\r\n */\r\nexport default function useSessionStorage(name) {\r\n const dispatcher = useDispatch();\r\n const callLogin = (data) => dispatcher(login(data));\r\n const callLogout = () => dispatcher(logout());\r\n const callClearStore = () => dispatcher(clearStore());\r\n const base64Encode = (data) => base64.encode(data);\r\n const base64Decode = (data) => base64.decode(data);\r\n const clearSessionStorage = (isLogoutReducer = false) => {\r\n window.sessionStorage.clear();\r\n if (isLogoutReducer) {\r\n callClearStore();\r\n callLogout();\r\n }\r\n };\r\n const saveSessionStorage = (value, isLoginReducer = false) => {\r\n const val = typeof (value) !== 'string' ? JSON.stringify(value) : value;\r\n window.sessionStorage.setItem(name, base64Encode(val));\r\n if (isLoginReducer) callLogin(value);\r\n };\r\n const loadSessionStorage = () => {\r\n const tmp = window.sessionStorage.getItem(name);\r\n const ret = tmp && tmp.length > 0 ? JSON.parse(base64Decode(tmp.toString())) : undefined;\r\n return ret;\r\n };\r\n\r\n return {\r\n clearSessionStorage,\r\n saveSessionStorage,\r\n loadSessionStorage,\r\n };\r\n}\r\n\r\nexport function saveSession(sessionName, seaaionValue) {\r\n const val = typeof (seaaionValue) !== 'string' ? JSON.stringify(seaaionValue) : seaaionValue;\r\n window.sessionStorage.setItem(sessionName, val);\r\n}\r\nexport function loadSession(sessionName) {\r\n const tmp = window.sessionStorage.getItem(sessionName);\r\n const ret = tmp && tmp.length > 0 ? tmp.toString() : undefined;\r\n return ret;\r\n}\r\n","const ITEM_SET = 'SET';\r\nconst ITEM_GET = 'GET';\r\nconst REDUCER_RESIZE = 'REDUCER_RESIZE';\r\n\r\n/*\r\n흐름 정리\r\nredux reducer 파일 생성 (현재 파일) :: /reducers/object_file_name.js\r\n/reducers/index.js redux reducer 파일 추가 Import\r\nPage Object 구성 파일 추가 :: /pages/page_file_name.js , /pages/page_include directory/page_add_on_file\r\nPage Backend 통신 구성 파일 또는 함수를 Page 파일에 추가한다.\r\nUI Button Action --> Javascript Event --> Backend 통신(Axios) --> Redux Action --> Reducer sate object --> page\r\n*/\r\n\r\n/// redux Action (plain action only)\r\nexport const setSize = (data) => ({\r\n type: ITEM_SET,\r\n target: REDUCER_RESIZE,\r\n data,\r\n});\r\nexport const getSize = () => ({\r\n type: ITEM_GET,\r\n target: REDUCER_RESIZE,\r\n});\r\n\r\n/// state - state object structure (reducer initialize object )\r\nexport const initialState = {\r\n divSize: {},\r\n};\r\n\r\n/// reducer - state object change and return\r\nexport default function ResizeReducer(state = initialState, action) {\r\n if (action.target !== REDUCER_RESIZE) return state;\r\n // const results = state.results;\r\n // console.log(\"Reducer ===> ResizeReducer state, action :: \" , state, action);\r\n switch (action.type) {\r\n case ITEM_SET:\r\n return {\r\n ...state,\r\n sizeStyle: action.data,\r\n };\r\n case ITEM_GET:\r\n return initialState;\r\n default:\r\n return state;\r\n }\r\n}\r\n","import { combineReducers } from 'redux';\r\nimport loginReducer from './login';\r\nimport tabReducer from './TabReducer';\r\nimport favoritMenu from './FavoritMenuReducer';\r\nimport menuList from './MenuReducer';\r\nimport sizeStyle from './ResizeReducer';\r\nimport MessageReducer from './MessageReducer';\r\nimport PageRoleReducer from './PageRoleReducer';\r\n\r\nconst appReducer = combineReducers({\r\n user: loginReducer,\r\n tabs: tabReducer,\r\n message: MessageReducer,\r\n favoritMenu,\r\n menuList,\r\n sizeStyle,\r\n pageRole: PageRoleReducer,\r\n});\r\n\r\nconst rootReducer = (state, action) => {\r\n if (action.type === 'RESET_STORE') {\r\n state = undefined;\r\n }\r\n return appReducer(state, action);\r\n};\r\n\r\nexport default rootReducer;\r\n","import { createStore } from 'redux';\r\nimport reducers from './index';\r\n\r\nexport default createStore(\r\n reducers,\r\n window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__(),\r\n);\r\n","import React from 'react';\r\nimport { BrowserRouter } from 'react-router-dom'; // * BrowserRouter 불러오기\r\nimport { ThemeProvider, createTheme } from '@material-ui/core';\r\nimport 'jqwidgets-scripts/jqwidgets/styles/jqx.base.css';\r\nimport { Provider } from 'react-redux';\r\nimport store from './framework/core/reducers/_store';\r\nimport './styles/App.css';\r\nimport Login from './pages/index';\r\n\r\nconst theme = createTheme({\r\n palette: {\r\n type: 'dark',\r\n },\r\n});\r\nconst isUseTheme = false;\r\n\r\nexport default function App() {\r\n if (isUseTheme) {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n","const reportWebVitals = (onPerfEntry) => {\r\n if (onPerfEntry && onPerfEntry instanceof Function) {\r\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\r\n getCLS(onPerfEntry);\r\n getFID(onPerfEntry);\r\n getFCP(onPerfEntry);\r\n getLCP(onPerfEntry);\r\n getTTFB(onPerfEntry);\r\n });\r\n }\r\n};\r\n\r\nexport default reportWebVitals;\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport './styles/index.css';\r\nimport App from './App';\r\nimport reportWebVitals from './reportWebVitals';\r\n\r\nReactDOM.render(, document.getElementById('root'));\r\n\r\nreportWebVitals();\r\n"],"sourceRoot":""}