{"version":3,"sources":["api/common.ts","jquery-global.js","api/learning.ts","layout/Orientation.ts","layout/Rect.ts","layout/DockLocation.ts","layout/DragDrop.ts","layout/I18nLabel.ts","layout/DropInfo.ts","layout/model/Action.ts","layout/model/Actions.ts","layout/Attribute.ts","layout/AttributeDefinitions.ts","layout/model/Node.ts","layout/model/SplitterNode.ts","layout/model/TabNode.ts","layout/model/RowNode.ts","layout/model/TabSetNode.ts","layout/model/BorderNode.ts","layout/model/BorderSet.ts","layout/model/Model.ts","layout/view/BorderButton.tsx","layout/view/BorderTabSet.tsx","layout/view/Splitter.tsx","layout/view/Tab.tsx","layout/PopupMenu.tsx","layout/view/DropdownMenu.tsx","layout/view/TabButton.tsx","layout/view/TabSet.tsx","layout/view/FlexLayout.tsx","store/selectors/appLayout.ts","store/selectors/auth.ts","store/selectors/learning.ts","theme/index.ts","layout/AppHeaderLogo.tsx","components/core/ui/ScrollableView.tsx","components/Widget.tsx","components/learning/CourseItem.tsx","components/learning/Courses.tsx","components/learning/ClassItem.tsx","auth/index.tsx","components/learning/ClassDetail.tsx","components/learning/Classes.tsx","components/learning/JoinClass.tsx","components/learning/Slides.tsx","components/core/charts/dark.js","components/core/charts/CandlestickChart.tsx","components/learning/CourseDetail.tsx","components/user/UserMenu.tsx","components/index.tsx","layout/AppHeader.tsx","layout/Layout.tsx","layout/Screen.tsx","App.tsx","registerServiceWorker.ts","index.tsx","store/appLayout/index.ts","store/learning/index.ts","store/index.ts","store/auth/index.ts","store/appLayout/actions.ts","store/appLayout/reducer.ts","store/appLayout/sagas.ts","store/auth/actions.ts","store/auth/reducer.ts","store/learning/actions.ts","store/learning/reducer.ts","store/learning/sagas.ts"],"names":["DEFAULT_ACCESS_TOKEN","config","baseURL","apiGet","url","a","state","currentStore","getState","accessToken","auth","user","expired","access_token","configWithBearer","Object","assign","headers","Authorization","axios","get","response","status","data","isError","errorMessage","window","jQuery","jquery","$","getCourses","courseType","getOwnedClasses","classType","getOwnedClassMeeting","classId","getEnrolledClasses","getEnrolledClassMeeting","getLessons","courseId","getSchedules","ZoomMtg","setZoomJSLib","preLoadWasm","prepareJssdk","userLangTemplate","i18n","getAll","userLangDict","load","reload","API_KEY","startClassMeeting","name","returnUrl","console","log","meeting","init","leaveUrl","success","join","meetingNumber","meetingId","userName","signature","apiKey","passWord","meetingPassword","error","res","joinClassMeeting","Orientation","_name","this","from","HORZ","VERT","Rect","x","y","width","height","rect","element","styleWithPosition","style","left","top","Math","max","position","getRight","getBottom","insets","right","bottom","outerRect","orientation","prefSize","DockLocation","indexPlus","_orientation","_indexPlus","values","LEFT","RIGHT","TOP","BOTTOM","CENTER","r","clone","size","start","end","canUseDOM","document","createElement","DragDrop","_fDblClick","_fClick","_fDragEnd","_fDragMove","_fDragStart","_fDragCancel","_glass","_manualGlassManagement","_lastClick","_clickX","_clickY","_startX","_startY","_glassShowing","_dragging","zIndex","backgroundColor","opacity","filter","_onMouseMove","bind","_onMouseUp","_onKeyPress","fCancel","documentElement","clientWidth","clientHeight","positionElement","body","appendChild","tabIndex","focus","addEventListener","removeChild","event","fDragStart","fDragMove","fDragEnd","fDragCancel","fClick","fDblClick","posEvent","_getLocationEvent","addGlass","clientX","clientY","cursor","getComputedStyle","target","_stopPropagation","_preventDefault","undefined","keyCode","hideGlass","removeEventListener","touches","changedTouches","stopPropagation","preventDefault","abs","_getLocationEventEnd","clickTime","Date","getTime","instance","I18nLabel","DropInfo","node","location","index","className","Action","type","Actions","json","toNodeId","ADD_NODE","toNode","getName","fromNodeId","MOVE_NODE","fromNode","tabNodeId","DELETE_TAB","text","RENAME_TAB","SELECT_TAB","tabNode","tabsetNodeId","SET_ACTIVE_TABSET","tabsetNode","splitSpec","node1","node1Id","node2","node2Id","ADJUST_SPLIT","weight1","pixelWidth1","weight2","pixelWidth2","nodeId","pos","ADJUST_BORDER_SPLIT","MAXIMIZE_TOGGLE","attributes","UPDATE_MODEL_ATTRIBUTES","UPDATE_NODE_ATTRIBUTES","Attribute","modelName","defaultValue","alwaysWriteJson","to","value","args","ENUM","INT","NUMBER","STRING","BOOLEAN","ID","JSON","AttributeDefinitions","nameToAttribute","attr","push","addWithAll","conversion","jsonObj","obj","forEach","fromValue","Node","model","_model","_attributes","_parent","_children","_fixed","_rect","_visible","_listeners","_dirty","_tempSize","empty","id","_nextUniqueId","_setId","flip","getOrientation","callback","params","val","_getAttributeDefinitions","getModelName","_getAttribute","fn","level","_forEachNode","visible","_fireEvent","parent","weight","selected","dragNode","rtn","contains","canDrop","length","_findDropTargetNode","_dragNode","_x","_y","dropInfo","isEnableDrop","getType","isEnableDivide","_getOnAllowDrop","childNode","indexOf","splice","stringify","SplitterNode","TYPE","_addNode","getSplitterSize","_value","_json","TabNode","_tabRect","_extra","_attributeDefinitions","fromJson","attributeDefinitions","add","setType","addInherited","_getAttr","_getAttributeAsStringOrUndefined","equals","_remove","toJson","update","_createAttributeDefinitions","RowNode","_drawChildren","newLayoutNode","children","jsonChild","TabSetNode","child","_fromJson","_addChild","_getAttributeAsNumberOrUndefined","pixelSize","_getSize","totalWeight","fixedPixels","prefPixels","totalPrefWeight","drawChildren","_getDrawChildren","_getPrefSize","_isFixed","getWeight","resizePreferred","availablePixels","totalSizeGiven","variableSize","_setTempSize","floor","_getTempSize","p","_layout","splitterNode","pBounds","getRect","getWidth","getHeight","splitter","splitterPos","_getSplitterBounds","weightedLength","getId","i","newSplitter","_setParent","_tidy","childChildren","getChildren","_removeChild","subchild","subChildrenTotal","subChildChildren","j","subsubChild","_setWeight","isEnableDeleteWhenEmpty","getRoot","yy","xx","w","h","isEnableEdgeDock","dockLocation","outlineRect","getDockRect","_canDockInto","_index","tabSet","getParent","_setSelected","BorderNode","reduce","sum","vrow","hrow","_removeAll","_setActiveTabset","_toJson","_contentRect","_tabHeaderRect","maximized","_setMaximizedTabset","active","getSelected","getMaximizedTabset","getActiveTabset","getLocation","getTabRect","childCenter","isMaximized","removeInsets","getHeaderHeight","isEnableTabStrip","getTabStripHeight","_setVisible","dragParent","fromIndex","insertPos","_i","parentRow","newRow","map","isActive","_location","_adjustedSize","border","getByName","setFrom","show","outer","split1","split","getBorderBarSize","inner","split2","reflect","_setRect","selectedNode","childRect","childY","childHeight","childX","childWidth","_getOuterInnerRects","innerRect","BorderSet","_borders","borderSet","borderJson","borderNode","outerInnerRects","sumHeight","sumWidth","adjustableHeight","adjustableWidth","showingBorders","isShowing","_setAdjustedSize","getSize","_getAdjustedSize","_layoutBorderOuter","_layoutBorderInner","Model","_idMap","_nextId","_changeListener","_root","_onAllowDrop","_maximizedTabSet","_activeTabSet","_borderRects","global","borders","layout","listener","action","newNode","drop","_delete","_setName","_adjustSplitSide","_setSize","_updateAttrs","_updateIdMap","visitNodes","pixels","splitterSize","enableEdgeDock","Error","_layoutBorder","onAllowDrop","BorderButton","selfRef","contentsRef","onMouseDown","message","props","i18nName","Move_Tab","dragStart","isEnableDrag","onClick","_event2","doAction","selectTab","onClose","_event","deleteTab","onCloseMouseDown","updateRect","clientRect","ReactDOM","getBoundingClientRect","_setTabRect","leadingContent","cm","getClassName","classNames","getIcon","icon","renderState","leading","content","customizeTab","closeButton","ref","isEnableClose","onTouchStart","marginLeft","marginRight","React","BorderTabSet","toolbarRef","getTabHeaderRect","parseInt","tabs","isSelected","key","borderClasses","buttons","headerContent","customizeTabSet","toolbar","toolbar2","Splitter","outlineDiv","startDrag","onDragStart","onDragMove","onDragEnd","onDragCancel","parentNode","rootdiv","_wasDragging","getBoundPosition","offsetTop","offsetLeft","_calculateSplit","adjustBorderSplit","adjustSplit","bounds","_styleWithPosition","Tab","setActiveTabset","renderComponent","isEnableRenderOnDemand","newProps","setState","classes","flexlayoutBorderInnerBottom","querySelector","flexlayoutTabBorderBottom","display","borderRadius","paddingLeft","factory","PopupMenu","items","hidden","elm","onDocMouseUp","setTimeout","hide","triggerElement","onSelect","classNameMapper","triggerRect","docRect","onHide","item","onItemClick","DropdownMenu","closeTab","maxTab","isEnableMaximize","maximize","exampleMenu","minimal","enforceFocus","Position","BOTTOM_LEFT","TabButton","contentWidth","contentRef","onDoubleClick","isEnableRename","editing","onEndEdit","onTextBoxMouseDown","onTextBoxKeyPress","renameTab","select","newName","contentStyle","autoFocus","onKeyDown","visibility","TabSet","headerRef","overflowbuttonRef","recalcVisibleTabs","showOverflow","showToolbar","onOverflowClick","hiddenTabs","onOverflowItemSelect","Move_Tabset","onInterceptMouseDown","onMaximizeToggle","hideTabsAfter","updateVisibleTabs","_nextProps","toolbarWidth","getSelectedNode","showTab","header","tabStrip","showHeader","tabStripClasses","getClassNameTabStrip","tabHeaderClasses","getClassNameHeader","FlexLayout","centerRect","tabIds","newTabJson","firstMove","dragDiv","dragDivText","edgeRightDiv","edgeBottomDiv","edgeLeftDiv","edgeTopDiv","fnNewNodeDropped","onModelChange","forceUpdate","domRect","defaultClassName","onCancelAdd","onCancelDrag","wasDragging","e","hideEdges","onDragDivMouseDown","allowDrag","innerHTML","showEdges","speed","transition","addNode","moveNode","_setChangeListener","onAction","outcome","borderComponents","tabSetComponents","tabComponents","splitterComponents","renderBorder","getBorderSet","renderChildren","nextTopIds","nextTopIdsMap","t","keys","self","getBorders","selectedTab","tabsetId","getNodeById","dragText","onDrop","centerInRect","borderBottomLeftRadius","borderBottomRightRadius","borderTopRightRadius","borderTopLeftRadius","maximizeToggle","renderValues","onRenderTab","tabSetNode","onRenderTabSet","param","i18nMapper","activeScreenIDSelector","appLayout","activeScreen","screensSelector","screens","themeSelector","theme","activeScreenSelector","createSelector","activeScreenID","find","s","authenticatedUserSelector","rolesSelector","profile","role","Array","isArray","String","coursesSelector","learning","courses","classesSelector","requestingClassesSelector","requestingClasses","requestingCoursesSelector","requestingCourses","coursesByTypeSelector","_","classesByTypeSelector","upcommingClassesSelector","c","endedClassesSelector","courseSelector","course","classSelector","lessonsInCourseSelector","lessons","schedulesInClassSelector","schedules","useTheme","useSelector","Selectors","dispatch","useDispatch","newTheme","actionCreators","changeTheme","AppHeaderLogo","src","ScrollableView","styled","SimpleBar","Wrapper","div","Widget","memo","iconSize","color","CourseItem","interactive","elevation","Elevation","TWO","isOnline","marginBottom","description","intent","open","Courses","history","useHistory","useEffect","requestCourses","goCourseDetail","noContentText","title","ClassItem","theClass","mgr","settings","authority","client_id","redirect_uri","post_logout_redirect_uri","response_type","scope","popup_redirect_uri","popup_post_logout_redirect_uri","silent_redirect_uri","automaticSilentRenew","filterProtocolClaims","loadUserInfo","userStore","Oidc","store","localStorage","getUser","then","saveAuthenticatedUser","events","addSilentRenewError","addAccessTokenExpiring","addAccessTokenExpired","removeUser","removeAuthenticatedUser","addUserLoaded","addUserUnloaded","SignInCallback","signinCallback","catch","err","SilentRenewCallback","signinSilentCallback","SignOutCallback","signoutPopupCallback","Login","useLocation","useAuth","signIn","goBack","isOpen","Classes","DIALOG_BODY","DIALOG_FOOTER","DIALOG_FOOTER_ACTIONS","signinPopup","u","signoutPopup","ClassDetail","useParams","requestSchedules","hasNextSchedule","schedule","isNextSchedule","isLastSchedule","padNumber","num","substr","calculateTimeLeft","fromTime","now","moment","time","duration","diff","round","asSeconds","ScheduleItem","useState","setIsOpen","isTeacher","includes","secondsLeft","setSecondsLeft","interval","setInterval","seconds","clearInterval","format","lesson","lessonId","flex","justifyContent","alignItems","margin","full_name","disabled","outlined","LessonItem","alignText","fill","lessonName","videoUrl","rightIcon","roles","requestOwnedClasses","requestEnrolledClasses","goClassDetail","path","JoinClass","zoomElement","getElementById","Presentation","iframe","Slides","colorPalette","tooltip","axisPointer","label","lineStyle","crossStyle","legend","textStyle","toolbox","iconStyle","normal","borderColor","dataZoom","fillerColor","dataBackground","areaStyle","timeline","itemStyle","controlStyle","timeAxis","axisLine","axisTick","axisLabel","splitLine","splitArea","logAxis","valueAxis","categoryAxis","line","symbol","graph","gauge","candlestick","color0","borderColor0","echarts","registerTheme","data0","rawData","categoryData","splitData","calculateMA","dayCount","result","len","option","grid","xAxis","scale","boundaryGap","onZero","splitNumber","min","yAxis","series","markPoint","formatter","coord","valueDim","markLine","symbolSize","emphasis","smooth","CourseDetail","selectedTabId","setSelectedTabId","requestLessons","onChange","tabId","animate","panel","Padding","IntroductionPanel","dangerouslySetInnerHTML","__html","objective","benefit","teachers","ContentPanel","lineHeight","paddingTop","Teachers","teacher","flexDirection","gender","getGenderName","roleId","getRoleName","introduction","MethodologyPanel","UserAvatarContainer","UserAvatar","img","UserMenu","setTheme","signOut","classList","remove","MINIMAL","sub","href","BOTTOM_RIGHT","getWidgetComponent","component","CandlestickChart","AppHeader","createNode","align","Alignment","screen","large","Layout","initialLayout","onLayoutChanged","setModel","updateLayout","getComponent","newLayoutComponents","newId","enableClose","getActiveTabSet","getFirstTabSet","Screen","screenID","layoutRef","changeActiveScreen","protected","requestSaveActiveScreenLayout","extraComponent","pathname","FocusStyleManager","onlyShowFocusOnTabs","App","exact","isLocalhost","Boolean","hostname","match","registerValidSW","swUrl","navigator","serviceWorker","register","registration","onupdatefound","installingWorker","installing","onstatechange","controller","baseUrl","getElementsByTagName","getAttribute","createBrowserHistory","basename","configureStore","URL","process","toString","origin","fetch","contentType","ready","unregister","checkValidServiceWorker","registerServiceWorker","rootSaga","reducers","all","initialState","sagaMiddleware","createSagaMiddleware","middleware","routerMiddleware","rootReducer","combineReducers","router","connectRouter","enhancers","windowIfDefined","__REDUX_DEVTOOLS_EXTENSION__","storage","createStore","compose","applyMiddleware","run","screenLayout","createBlankScreen","DEFAULT_BLANK_SCREEN_LAYOUT","tabEnableClose","tabSetHeaderHeight","tabSetTabStripHeight","tabEnableRename","DEFAULT_OPENING_SCREEN_LAYOUT","DEFAULT_CLASSES_SCREEN_LAYOUT","DEFAULT_MYSEMINARS_SCREEN_LAYOUT","unloadedState","defaultLayout","reducer","incomingAction","activeScreenIndex","findIndex","newScreenID","newScreen","saveActiveScreenLayout","activeScreenLayoutSaga","put","takeLatest","fork","receiveCourses","receiveClasses","receiveLessons","receiveSchedules","Map","set","requesLessons","coursesSaga","lessonsSaga","ownedClassesSaga","enrolledClassesSaga","schedulesSaga","call","takeEvery"],"mappings":"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","file":"static/js/main.1ae2b0b7.chunk.js","sourcesContent":["import axios, { AxiosResponse } from 'axios';\r\nimport { currentStore, ApplicationState } from '../store';\r\n\r\nconst DEFAULT_ACCESS_TOKEN = \"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6IkdYdExONzViZlZQakdvNERWdjV4QkRITHpnSSIsImtpZCI6IkdYdExONzViZlZQakdvNERWdjV4QkRITHpnSSJ9.eyJpc3MiOiJodHRwczovL2FjY291bnRzLmZpcmVhbnQudm4iLCJhdWQiOiJodHRwczovL2FjY291bnRzLmZpcmVhbnQudm4vcmVzb3VyY2VzIiwiZXhwIjoxODg5NjIyNTMwLCJuYmYiOjE1ODk2MjI1MzAsImNsaWVudF9pZCI6ImZpcmVhbnQudHJhZGVzdGF0aW9uIiwic2NvcGUiOlsiYWNhZGVteS1yZWFkIiwiYWNhZGVteS13cml0ZSIsImFjY291bnRzLXJlYWQiLCJhY2NvdW50cy13cml0ZSIsImJsb2ctcmVhZCIsImNvbXBhbmllcy1yZWFkIiwiZmluYW5jZS1yZWFkIiwiaW5kaXZpZHVhbHMtcmVhZCIsImludmVzdG9wZWRpYS1yZWFkIiwib3JkZXJzLXJlYWQiLCJvcmRlcnMtd3JpdGUiLCJwb3N0cy1yZWFkIiwicG9zdHMtd3JpdGUiLCJzZWFyY2giLCJzeW1ib2xzLXJlYWQiLCJ1c2VyLWRhdGEtcmVhZCIsInVzZXItZGF0YS13cml0ZSIsInVzZXJzLXJlYWQiXSwianRpIjoiMjYxYTZhYWQ2MTQ5Njk1ZmJiYzcwODM5MjM0Njc1NWQifQ.dA5-HVzWv-BRfEiAd24uNBiBxASO-PAyWeWESovZm_hj4aXMAZA1-bWNZeXt88dqogo18AwpDQ-h6gefLPdZSFrG5umC1dVWaeYvUnGm62g4XS29fj6p01dhKNNqrsu5KrhnhdnKYVv9VdmbmqDfWR8wDgglk5cJFqalzq6dJWJInFQEPmUs9BW_Zs8tQDn-i5r4tYq2U8vCdqptXoM7YgPllXaPVDeccC9QNu2Xlp9WUvoROzoQXg25lFub1IYkTrM66gJ6t9fJRZToewCt495WNEOQFa_rwLCZ1QwzvL0iYkONHS_jZ0BOhBCdW9dWSawD6iF1SIQaFROvMDH1rg\";\r\n\r\nconst config = {\r\n baseURL: \"https://betarest.fireant.vn\",\r\n};\r\n\r\nexport interface Response {\r\n data: T | null | undefined,\r\n isError: boolean,\r\n errorMessage: string\r\n}\r\n\r\nexport async function apiGet(url: string): Promise> {\r\n const state: ApplicationState = currentStore?.getState();\r\n let accessToken = DEFAULT_ACCESS_TOKEN;\r\n \r\n if (state.auth?.user) {\r\n if (!state.auth?.user.expired) {\r\n accessToken = state.auth?.user?.access_token;\r\n }\r\n }\r\n\r\n const configWithBearer = Object.assign({}, config, { headers: { Authorization: `Bearer ${accessToken}` } });\r\n try {\r\n let response = await axios.get>(url, configWithBearer);\r\n\r\n if (response.status == 200) {\r\n return { data: response.data, isError: false, errorMessage: '' };\r\n }\r\n\r\n return { data: null, isError: true, errorMessage: 'Lỗi khi thực hiện yêu cầu.' };\r\n }\r\n catch {\r\n return { data: null, isError: true, errorMessage: 'Lỗi khi thực hiện yêu cầu.' };\r\n }\r\n}","import jquery from 'jquery';\r\nwindow.jQuery = jquery;\r\nwindow.$ = jquery;","import { apiGet, Response } from './common';\r\nimport { Course, Lesson, Class, Schedule, Meeting } from '../models';\r\nimport '../jquery-global';\r\nimport { ZoomMtg } from '@zoomus/websdk';\r\nimport '@zoomus/websdk/dist/css/bootstrap.css';\r\nimport '@zoomus/websdk/dist/css/react-select.css';\r\n\r\ndeclare var $: any;\r\n\r\n(function () {\r\n ZoomMtg.setZoomJSLib('https://learning.fireant.vn/websdk/dist/lib', '/av')\r\n\r\n ZoomMtg.preLoadWasm();\r\n ZoomMtg.prepareJssdk();\r\n\r\n //Add your own custom language key \r\n var langArray = ['de-DE', 'es-ES', 'en-US', 'fr-FR', 'jp-JP', 'pt-PT', 'ru-RU', 'zh-CN', 'vi-VN'];\r\n\r\n // set the userLangTemplate variable to a default language code\r\n var userLangTemplate = $.i18n.getAll(\"en-US\");\r\n\r\n // Define the userLangDict variable\r\n // Use the language-key-value.json file to determine which keys to set the custom language\r\n var userLangDict = Object.assign({}, userLangTemplate, {\r\n 'apac.errorcodes_not_start': 'Meeting chưa bắt đầu. Hãy thử lại sau.',\r\n });\r\n\r\n // Set the userLangDict and custom code language in the load method\r\n $.i18n.load(userLangDict, \"vi-VN\");\r\n\r\n //change the language resource that you are currently using. \r\n $.i18n.reload(\"vi-VN\");\r\n\r\n})();\r\n\r\nexport async function getCourses(courseType: 0 | 1): Promise> {\r\n return apiGet(`/academy/courses?type=${courseType}`);\r\n}\r\n\r\nexport async function getOwnedClasses(classType: 0 | 1): Promise> {\r\n return apiGet(`/academy/classes/ownedClasses?type=${classType}`);\r\n}\r\n\r\nexport async function getOwnedClassMeeting(classId: number): Promise> {\r\n return apiGet(`/academy/classes/ownedClasses/${classId}/meeting`);\r\n}\r\n\r\nexport async function getEnrolledClasses(classType: 0 | 1): Promise> {\r\n return apiGet(`/academy/classes/enrolledClasses?type=${classType}`);\r\n}\r\n\r\nexport async function getEnrolledClassMeeting(classId: number): Promise> {\r\n return apiGet(`/academy/classes/enrolledClasses/${classId}/meeting`);\r\n}\r\n\r\nexport async function getLessons(courseId: number): Promise> {\r\n return apiGet(`/academy/courses/${courseId}/lessons`);\r\n}\r\n\r\nexport async function getSchedules(classId: number): Promise> {\r\n return apiGet(`/academy/classes/${classId}/schedule`);\r\n}\r\n\r\nconst API_KEY = 'FIni0K63TPSMaRR81C730Q';\r\n\r\nexport async function startClassMeeting(classId: number, name: string, returnUrl: string) {\r\n\r\n const response = await getOwnedClassMeeting(classId);\r\n\r\n if (!response.isError) {\r\n const meeting = response.data;\r\n\r\n if (meeting) {\r\n ZoomMtg.init({\r\n leaveUrl: returnUrl,\r\n success() {\r\n ZoomMtg.join(\r\n {\r\n meetingNumber: meeting?.meetingId,\r\n userName: name,\r\n signature: meeting?.signature,\r\n apiKey: API_KEY,\r\n passWord: meeting?.meetingPassword,\r\n success() {\r\n console.log('start meeting success');\r\n },\r\n error(res: any) {\r\n console.log(res);\r\n }\r\n }\r\n );\r\n },\r\n error(res: any) {\r\n console.log(res);\r\n }\r\n });\r\n }\r\n }\r\n else {\r\n console.log(response.errorMessage);\r\n }\r\n}\r\n\r\nexport async function joinClassMeeting(classId: number, name: string, returnUrl: string) {\r\n\r\n const response = await getEnrolledClassMeeting(classId);\r\n\r\n if (!response.isError) {\r\n const meeting = response.data;\r\n\r\n if (meeting) {\r\n ZoomMtg.init({\r\n leaveUrl: returnUrl,\r\n success() {\r\n ZoomMtg.join(\r\n {\r\n meetingNumber: meeting?.meetingId,\r\n userName: name,\r\n signature: meeting?.signature,\r\n apiKey: API_KEY,\r\n passWord: meeting?.meetingPassword,\r\n success() {\r\n console.log('join meeting success');\r\n },\r\n error(res: any) {\r\n console.log(res);\r\n }\r\n }\r\n );\r\n },\r\n error(res: any) {\r\n console.log(res);\r\n }\r\n });\r\n }\r\n }\r\n else {\r\n console.log(response.errorMessage);\r\n }\r\n}","class Orientation {\n\n static HORZ = new Orientation(\"horz\");\n static VERT = new Orientation(\"vert\");\n\n static flip(from: Orientation) {\n if (from === Orientation.HORZ) {\n return Orientation.VERT;\n }\n else {\n return Orientation.HORZ;\n }\n }\n\n /** @hidden @internal */\n private _name: string;\n\n /** @hidden @internal */\n private constructor(name: string) {\n this._name = name;\n }\n\n toString() {\n return this._name;\n }\n}\n\nexport default Orientation;","import Orientation from \"./Orientation\";\nimport { JSMap } from \"./Types\";\n\nclass Rect {\n\n static empty() {\n return new Rect(0, 0, 0, 0);\n }\n\n x: number;\n y: number;\n width: number;\n height: number;\n\n constructor(x: number, y: number, width: number, height: number) {\n this.x = x;\n this.y = y;\n this.width = width;\n this.height = height;\n }\n\n clone() {\n return new Rect(this.x, this.y, this.width, this.height);\n }\n\n equals(rect: Rect) {\n if (this.x === rect.x\n && this.y === rect.y\n && this.width === rect.width\n && this.height === rect.height) {\n return true;\n }\n else {\n return false;\n }\n }\n\n getBottom() {\n return this.y + this.height;\n }\n\n getRight() {\n return this.x + this.width;\n }\n\n positionElement(element: HTMLElement) {\n this.styleWithPosition(element.style);\n }\n\n styleWithPosition(style: JSMap) {\n style.left = this.x + \"px\";\n style.top = this.y + \"px\";\n style.width = Math.max(0, this.width) + \"px\"; // need Math.max to prevent -ve, cause error in IE\n style.height = Math.max(0, this.height) + \"px\";\n style.position = \"absolute\";\n return style;\n }\n\n contains(x: number, y: number) {\n if (this.x <= x && x <= this.getRight()\n && this.y <= y && y <= this.getBottom()) {\n return true;\n }\n else {\n return false;\n }\n }\n\n removeInsets(insets : {top: number, left: number, bottom: number, right: number}) {\n return new Rect(\n this.x + insets.left,\n this.y + insets.top,\n Math.max(0, this.width - insets.left - insets.right),\n Math.max(0, this.height - insets.top - insets.bottom));\n }\n\n centerInRect(outerRect: Rect) {\n this.x = (outerRect.width - this.width) / 2;\n this.y = (outerRect.height - this.height) / 2;\n }\n\n /** @hidden @internal */\n _getSize(orientation: Orientation) {\n let prefSize = this.width;\n if (orientation === Orientation.VERT) {\n prefSize = this.height;\n }\n return prefSize;\n }\n\n toString() {\n return \"(Rect: x=\" + this.x + \", y=\" + this.y + \", width=\" + this.width + \", height=\" + this.height + \")\";\n }\n}\n\nexport default Rect;\n\n","import Orientation from \"./Orientation\";\nimport Rect from \"./Rect\";\nimport { JSMap } from \"./Types\";\n\nclass DockLocation {\n\n static values: JSMap = {};\n static TOP = new DockLocation(\"top\", Orientation.VERT, 0);\n static BOTTOM = new DockLocation(\"bottom\", Orientation.VERT, 1);\n static LEFT = new DockLocation(\"left\", Orientation.HORZ, 0);\n static RIGHT = new DockLocation(\"right\", Orientation.HORZ, 1);\n static CENTER = new DockLocation(\"center\", Orientation.VERT, 0);\n\n /** @hidden @internal */\n static getByName(name: string): DockLocation {\n return DockLocation.values[name];\n }\n\n /** @hidden @internal */\n static getLocation(rect: Rect, x: number, y: number) {\n if (x < rect.x + rect.width / 4) {\n return DockLocation.LEFT;\n }\n\n else if (x > rect.getRight() - rect.width / 4) {\n return DockLocation.RIGHT;\n }\n\n else if (y < rect.y + rect.height / 4) {\n return DockLocation.TOP;\n }\n\n else if (y > rect.getBottom() - rect.height / 4) {\n return DockLocation.BOTTOM;\n }\n else {\n return DockLocation.CENTER;\n }\n }\n\n /** @hidden @internal */\n _name: string;\n /** @hidden @internal */\n _orientation: Orientation;\n /** @hidden @internal */\n _indexPlus: number;\n\n /** @hidden @internal */\n constructor(name: string, orientation: Orientation, indexPlus: number) {\n this._name = name;\n this._orientation = orientation;\n this._indexPlus = indexPlus;\n DockLocation.values[this._name] = this;\n }\n\n getName() {\n return this._name;\n }\n\n getOrientation() {\n return this._orientation;\n }\n\n /** @hidden @internal */\n getDockRect(r: Rect) {\n if (this === DockLocation.TOP) {\n return new Rect(r.x, r.y, r.width, r.height / 2);\n }\n else if (this === DockLocation.BOTTOM) {\n return new Rect(r.x, r.getBottom() - r.height / 2, r.width, r.height / 2);\n }\n if (this === DockLocation.LEFT) {\n return new Rect(r.x, r.y, r.width / 2, r.height);\n }\n else if (this === DockLocation.RIGHT) {\n return new Rect(r.getRight() - r.width / 2, r.y, r.width / 2, r.height);\n }\n else {\n return r.clone();\n }\n }\n\n /** @hidden @internal */\n split(rect: Rect, size: number) {\n if (this === DockLocation.TOP) {\n const r1 = new Rect(rect.x, rect.y, rect.width, size);\n const r2 = new Rect(rect.x, rect.y + size, rect.width, rect.height - size);\n return { start: r1, end: r2 };\n }\n else if (this === DockLocation.LEFT) {\n const r1 = new Rect(rect.x, rect.y, size, rect.height);\n const r2 = new Rect(rect.x + size, rect.y, rect.width - size, rect.height);\n return { start: r1, end: r2 };\n }\n if (this === DockLocation.RIGHT) {\n const r1 = new Rect(rect.getRight() - size, rect.y, size, rect.height);\n const r2 = new Rect(rect.x, rect.y, rect.width - size, rect.height);\n return { start: r1, end: r2 };\n }\n else {// if (this === DockLocation.BOTTOM) {\n const r1 = new Rect(rect.x, rect.getBottom() - size, rect.width, size);\n const r2 = new Rect(rect.x, rect.y, rect.width, rect.height - size);\n return { start: r1, end: r2 };\n }\n }\n\n /** @hidden @internal */\n reflect() {\n if (this === DockLocation.TOP) {\n return DockLocation.BOTTOM;\n }\n else if (this === DockLocation.LEFT) {\n return DockLocation.RIGHT;\n }\n if (this === DockLocation.RIGHT) {\n return DockLocation.LEFT;\n }\n else { // if (this === DockLocation.BOTTOM) {\n return DockLocation.TOP;\n }\n }\n\n toString() {\n return \"(DockLocation: name=\" + this._name + \", orientation=\" + this._orientation + \")\";\n }\n}\n\n\nexport default DockLocation;\n\n","import Rect from \"./Rect\";\n\nconst canUseDOM = !!(\n (typeof window !== \"undefined\" &&\n window.document &&\n window.document.createElement)\n );\n\nclass DragDrop {\n static instance = new DragDrop();\n\n /** @hidden @internal */\n private _fDblClick: ((event: Event) => void) | undefined;\n /** @hidden @internal */\n private _fClick: ((event: Event) => void) | undefined;\n /** @hidden @internal */\n private _fDragEnd: ((event: Event) => void) | undefined;\n /** @hidden @internal */\n private _fDragMove: ((event: React.MouseEvent) => void) | undefined;\n /** @hidden @internal */\n private _fDragStart: ((pos: { clientX: number, clientY: number }) => boolean) | undefined;\n /** @hidden @internal */\n private _fDragCancel: ((wasDragging: boolean) => void) | undefined;\n\n /** @hidden @internal */\n private _glass: HTMLDivElement | undefined;\n /** @hidden @internal */\n private _manualGlassManagement: boolean = false;\n /** @hidden @internal */\n private _lastClick: number;\n /** @hidden @internal */\n private _clickX: number;\n /** @hidden @internal */\n private _clickY: number;\n /** @hidden @internal */\n private _startX: number = 0;\n /** @hidden @internal */\n private _startY: number = 0;\n /** @hidden @internal */\n private _glassShowing: boolean = false;\n /** @hidden @internal */\n private _dragging: boolean = false;\n\n /** @hidden @internal */\n private constructor() {\n if ( canUseDOM ) { // check for serverside rendering\n this._glass = document.createElement(\"div\");\n this._glass.style.zIndex = \"998\";\n this._glass.style.position = \"absolute\";\n this._glass.style.backgroundColor = \"white\";\n this._glass.style.opacity = \".00\"; // may need to be .01 for IE???\n this._glass.style.filter = \"alpha(opacity=01)\";\n }\n\n this._onMouseMove = this._onMouseMove.bind(this);\n this._onMouseUp = this._onMouseUp.bind(this);\n this._onKeyPress = this._onKeyPress.bind(this);\n\n this._lastClick = 0;\n this._clickX = 0;\n this._clickY = 0;\n }\n\n // if you add the glass pane then you should remove it\n addGlass(fCancel: ((wasDragging: boolean) => void) | undefined) {\n if (!this._glassShowing) {\n const glassRect = new Rect(0, 0, document.documentElement.clientWidth, document.documentElement.clientHeight);\n glassRect.positionElement(this._glass!);\n document.body.appendChild(this._glass!);\n this._glass!.tabIndex = -1;\n this._glass!.focus();\n this._glass!.addEventListener(\"keydown\", this._onKeyPress);\n this._glassShowing = true;\n this._fDragCancel = fCancel;\n this._manualGlassManagement = false;\n }\n else { // second call to addGlass (via dragstart)\n this._manualGlassManagement = true;\n }\n }\n\n hideGlass() {\n if (this._glassShowing) {\n document.body.removeChild(this._glass!);\n this._glassShowing = false;\n }\n }\n\n startDrag(event: Event | React.MouseEvent | React.TouchEvent | undefined,\n fDragStart: ((pos: { clientX: number, clientY: number }) => boolean) | undefined,\n fDragMove: ((event: React.MouseEvent) => void) | undefined,\n fDragEnd: ((event: Event) => void) | undefined,\n fDragCancel?: ((wasDragging: boolean) => void) | undefined,\n fClick?: ((event: Event) => void) | undefined,\n fDblClick?: ((event: Event) => void) | undefined) {\n\n const posEvent = this._getLocationEvent(event);\n this.addGlass(fDragCancel);\n\n // if (this._dragging) { // TODO\n // console.warn(\"this._dragging true on startDrag should never happen\");\n // }\n\n if (event) {\n this._startX = posEvent.clientX;\n this._startY = posEvent.clientY;\n this._glass!.style.cursor = getComputedStyle(event.target as Element).cursor;\n this._stopPropagation(event);\n this._preventDefault(event);\n } else {\n this._startX = 0;\n this._startY = 0;\n this._glass!.style.cursor = \"default\";\n }\n\n this._dragging = false;\n this._fDragStart = fDragStart;\n this._fDragMove = fDragMove;\n this._fDragEnd = fDragEnd;\n this._fDragCancel = fDragCancel;\n this._fClick = fClick;\n this._fDblClick = fDblClick;\n\n document.addEventListener(\"mouseup\", this._onMouseUp);\n document.addEventListener(\"mousemove\", this._onMouseMove);\n document.addEventListener(\"touchend\", this._onMouseUp);\n document.addEventListener(\"touchmove\", this._onMouseMove);\n }\n\n isDragging() {\n return this._dragging;\n }\n\n toString() {\n const rtn = \"(DragDrop: \" +\n \"startX=\" + this._startX +\n \", startY=\" + this._startY +\n \", dragging=\" + this._dragging +\n \")\";\n\n return rtn;\n }\n\n /** @hidden @internal */\n private _onKeyPress(event: KeyboardEvent) {\n if (this._fDragCancel !== undefined && event.keyCode === 27) { // esc\n this.hideGlass();\n document.removeEventListener(\"mousemove\", this._onMouseMove);\n document.removeEventListener(\"mouseup\", this._onMouseUp);\n this._fDragCancel(this._dragging);\n this._dragging = false;\n }\n }\n\n /** @hidden @internal */\n private _getLocationEvent(event: any) {\n let posEvent: any = event;\n if (event && event.touches) {\n posEvent = event.touches[0];\n }\n return posEvent;\n }\n\n /** @hidden @internal */\n private _getLocationEventEnd(event: any) {\n let posEvent: any = event;\n if (event.changedTouches) {\n posEvent = event.changedTouches[0];\n }\n return posEvent;\n }\n\n /** @hidden @internal */\n private _stopPropagation(event: Event | React.MouseEvent | React.TouchEvent) {\n if (event.stopPropagation) {\n event.stopPropagation();\n }\n }\n\n /** @hidden @internal */\n private _preventDefault(event: Event | React.MouseEvent | React.TouchEvent) {\n if (event.preventDefault) {\n event.preventDefault();\n }\n return event;\n }\n\n /** @hidden @internal */\n private _onMouseMove(event: Event | React.MouseEvent | React.TouchEvent) {\n const posEvent = this._getLocationEvent(event);\n this._stopPropagation(event);\n this._preventDefault(event);\n\n if (!this._dragging && (Math.abs(this._startX - posEvent.clientX) > 5 || Math.abs(this._startY - posEvent.clientY) > 5)) {\n this._dragging = true;\n if (this._fDragStart) {\n this._glass!.style.cursor = \"move\";\n this._dragging = this._fDragStart({ \"clientX\": this._startX, \"clientY\": this._startY });\n }\n }\n\n if (this._dragging) {\n if (this._fDragMove) {\n this._fDragMove(posEvent);\n }\n }\n return false;\n }\n\n /** @hidden @internal */\n private _onMouseUp(event: Event) {\n const posEvent = this._getLocationEventEnd(event);\n\n this._stopPropagation(event);\n this._preventDefault(event);\n\n if (!this._manualGlassManagement) {\n this.hideGlass();\n }\n\n document.removeEventListener(\"mousemove\", this._onMouseMove);\n document.removeEventListener(\"mouseup\", this._onMouseUp);\n document.removeEventListener(\"touchend\", this._onMouseUp);\n document.removeEventListener(\"touchmove\", this._onMouseMove);\n\n if (this._dragging) {\n this._dragging = false;\n if (this._fDragEnd) {\n this._fDragEnd(event);\n }\n // dump(\"set dragging = false\\n\");\n }\n else {\n if (this._fDragCancel) {\n this._fDragCancel(this._dragging);\n }\n if (Math.abs(this._startX - posEvent.clientX) <= 5 && Math.abs(this._startY - posEvent.clientY) <= 5) {\n const clickTime = new Date().getTime();\n // check for double click\n if (Math.abs(this._clickX - posEvent.clientX) <= 5 && Math.abs(this._clickY - posEvent.clientY) <= 5) {\n if (clickTime - this._lastClick < 500) {\n if (this._fDblClick) {\n this._fDblClick(event);\n }\n }\n }\n\n if (this._fClick) {\n this._fClick(event);\n }\n this._lastClick = clickTime;\n this._clickX = posEvent.clientX;\n this._clickY = posEvent.clientY;\n }\n }\n return false;\n }\n}\n\nexport default DragDrop;\n\n","export enum I18nLabel {\n Move_Tab = \"Di chuyển: \",\n Move_Tabset = \"Di chuyển TAB\"\n}\n\nexport default I18nLabel;","import DockLocation from \"./DockLocation\";\nimport IDropTarget from \"./model/IDropTarget\";\nimport Node from \"./model/Node\";\nimport Rect from \"./Rect\";\n\nclass DropInfo {\n node: (Node & IDropTarget);\n rect: Rect;\n location: DockLocation;\n index: number;\n className: string;\n\n constructor(node: (Node & IDropTarget), rect: Rect, location: DockLocation, index: number, className: string) {\n this.node = node;\n this.rect = rect;\n this.location = location;\n this.index = index;\n this.className = className;\n }\n}\nexport default DropInfo;\n","import { JSMap } from \"../Types\";\n\nclass Action {\n type: string;\n data: JSMap;\n\n constructor(type: string, data: JSMap) {\n this.type = type;\n this.data = data;\n }\n}\n\nexport default Action;\n","import DockLocation from \"../DockLocation\";\nimport Action from \"./Action\";\n\n/**\n * The Action creator class for FlexLayout model actions\n */\nclass Actions {\n\n static ADD_NODE = \"FlexLayout_AddNode\";\n static MOVE_NODE = \"FlexLayout_MoveNode\";\n static DELETE_TAB = \"FlexLayout_DeleteTab\";\n static RENAME_TAB = \"FlexLayout_RenameTab\";\n static SELECT_TAB = \"FlexLayout_SelectTab\";\n static SET_ACTIVE_TABSET = \"FlexLayout_SetActiveTabset\";\n static ADJUST_SPLIT = \"FlexLayout_AdjustSplit\";\n static ADJUST_BORDER_SPLIT = \"FlexLayout_AdjustBorderSplit\";\n static MAXIMIZE_TOGGLE = \"FlexLayout_MaximizeToggle\";\n static UPDATE_MODEL_ATTRIBUTES = \"FlexLayout_UpdateModelAttributes\";\n static UPDATE_NODE_ATTRIBUTES = \"FlexLayout_UpdateNodeAttributes\";\n\n /**\n * Adds a tab node to the given tabset node\n * @param json the json for the new tab node e.g {type:\"tab\", component:\"table\"}\n * @param toNodeId the new tab node will be added to the tabset with this node id\n * @param location the location where the new tab will be added, one of the DockLocation enum values.\n * @param index for docking to the center this value is the index of the tab, use -1 to add to the end.\n * @returns {{type: (string|string), json: *, toNode: *, location: (*|string), index: *}}\n */\n static addNode(json: any, toNodeId: string, location: DockLocation, index: number): Action {\n return new Action(Actions.ADD_NODE, { json, toNode: toNodeId, location: location.getName(), index });\n }\n\n /**\n * Moves a node (tab or tabset) from one location to another\n * @param fromNodeId the id of the node to move\n * @param toNodeId the id of the node to receive the moved node\n * @param location the location where the moved node will be added, one of the DockLocation enum values.\n * @param index for docking to the center this value is the index of the tab, use -1 to add to the end.\n * @returns {{type: (string|string), fromNode: *, toNode: *, location: (*|string), index: *}}\n */\n static moveNode(fromNodeId: string, toNodeId: string, location: DockLocation, index: number): Action {\n return new Action(Actions.MOVE_NODE, {\n fromNode: fromNodeId,\n toNode: toNodeId,\n location: location.getName(),\n index\n });\n }\n\n /**\n * Deletes a tab node from the layout\n * @param tabNodeId the id of the node to delete\n * @returns {{type: (string|string), node: *}}\n */\n static deleteTab(tabNodeId: string): Action {\n return new Action(Actions.DELETE_TAB, { node: tabNodeId });\n }\n\n /**\n * Change the given nodes tab text\n * @param tabNodeId the id of the node to rename\n * @param text the test of the tab\n * @returns {{type: (string|string), node: *, text: *}}\n */\n static renameTab(tabNodeId: string, text: string): Action {\n return new Action(Actions.RENAME_TAB, { node: tabNodeId, text });\n }\n\n /**\n * Selects the given tab in its parent tabset\n * @param tabNodeId the id of the node to set selected\n * @returns {{type: (string|string), tabNode: *}}\n */\n static selectTab(tabNodeId: string): Action {\n return new Action(Actions.SELECT_TAB, { tabNode: tabNodeId });\n }\n\n /**\n * Set the given tabset node as the active tabset\n * @param tabsetNodeId the id of the tabset node to set as active\n * @returns {{type: (string|string), tabsetNode: *}}\n */\n static setActiveTabset(tabsetNodeId: string): Action {\n return new Action(Actions.SET_ACTIVE_TABSET, { tabsetNode: tabsetNodeId });\n }\n\n /**\n * Adjust the splitter between two tabsets\n * @example\n * Actions.adjustSplit({node1: \"1\", weight1:30, pixelWidth1:300, node2: \"2\", weight2:70, pixelWidth2:700});\n *\n * @param splitSpec an object the defines the new split between two tabsets, see example below.\n * @returns {{type: (string|string), node1: *, weight1: *, pixelWidth1: *, node2: *, weight2: *, pixelWidth2: *}}\n */\n static adjustSplit(splitSpec: { node1Id: string, weight1: number, pixelWidth1: number, node2Id: string, weight2: number, pixelWidth2: number }): Action {\n const node1 = splitSpec.node1Id;\n const node2 = splitSpec.node2Id;\n\n return new Action(Actions.ADJUST_SPLIT, {\n node1, weight1: splitSpec.weight1, pixelWidth1: splitSpec.pixelWidth1,\n node2, weight2: splitSpec.weight2, pixelWidth2: splitSpec.pixelWidth2\n });\n }\n\n static adjustBorderSplit(nodeId: string, pos: number): Action {\n return new Action(Actions.ADJUST_BORDER_SPLIT, { node: nodeId, pos });\n }\n\n /**\n * Maximizes the given tabset\n * @param tabsetNodeId the id of the tabset to maximize\n * @returns {{type: (string|string), node: *}}\n */\n static maximizeToggle(tabsetNodeId: string): Action {\n return new Action(Actions.MAXIMIZE_TOGGLE, { node: tabsetNodeId });\n }\n\n /**\n * Updates the global model jsone attributes\n * @param attributes the json for the model attributes to update (merge into the existing attributes)\n * @returns {{type: (string|string), json: *}}\n */\n static updateModelAttributes(attributes: any): Action {\n return new Action(Actions.UPDATE_MODEL_ATTRIBUTES, { json: attributes });\n }\n\n /**\n * Updates the given nodes json attributes\n * @param nodeId the id of the node to update\n * @param attributes the json attributes to update (merge with the existing attributes)\n * @returns {{type: (string|string), node: *, json: *}}\n */\n static updateNodeAttributes(nodeId: string, attributes: any): Action {\n return new Action(Actions.UPDATE_NODE_ATTRIBUTES, { node: nodeId, json: attributes });\n }\n}\n\nexport default Actions;\n\n","/** @hidden @internal */\nclass Attribute {\n\n static ENUM = \"Enum\";\n static INT = \"Int\";\n static NUMBER = \"Number\";\n static STRING = \"String\";\n static BOOLEAN = \"Boolean\";\n static ID = \"Id\";\n static JSON = \"Json\";\n\n name: string;\n modelName?: string ;\n defaultValue: any;\n alwaysWriteJson?: boolean;\n type?: string;\n values: any[];\n from: number;\n to: number;\n\n constructor(name: string, modelName: string | undefined, defaultValue: any, alwaysWriteJson?: boolean) {\n this.name = name;\n this.modelName = modelName;\n this.defaultValue = defaultValue;\n this.alwaysWriteJson = alwaysWriteJson;\n\n this.type = undefined;\n this.values = [];\n this.from = -99999999;\n this.to = 99999999;\n }\n\n setType(value: string) {\n this.type = value;\n return this;\n }\n\n setValues(...args: any[]) {\n this.values = args;\n return this;\n }\n\n setFrom(value: number) {\n this.from = value;\n return this;\n }\n\n setTo(value: number) {\n this.to = value;\n return this;\n }\n}\n\n/** @hidden @internal */\nexport default Attribute;\n","import Attribute from \"./Attribute\";\nimport { JSMap } from \"./Types\";\n\n/** @hidden @internal */\nclass AttributeDefinitions {\n\n attributes: Attribute[];\n nameToAttribute: JSMap;\n\n constructor() {\n this.attributes = [];\n this.nameToAttribute = {};\n }\n\n addWithAll(name: string, modelName: string | undefined, defaultValue: any, alwaysWriteJson?: boolean) {\n const attr = new Attribute(name, modelName, defaultValue, alwaysWriteJson);\n this.attributes.push(attr);\n this.nameToAttribute[name] = attr;\n return attr;\n }\n\n addInherited(name: string, modelName: string) {\n return this.addWithAll(name, modelName, undefined, false);\n }\n\n add(name: string, defaultValue: any, alwaysWriteJson?: boolean) {\n return this.addWithAll(name, undefined, defaultValue, alwaysWriteJson);\n }\n\n getAttributes() {\n return this.attributes;\n }\n\n getModelName(name: string) {\n const conversion = this.nameToAttribute[name];\n if (conversion !== undefined) {\n return conversion.modelName;\n }\n return undefined;\n }\n\n toJson(jsonObj: any, obj: any) {\n this.attributes.forEach((attr) => {\n const fromValue = obj[attr.name];\n if (attr.alwaysWriteJson || fromValue !== attr.defaultValue) {\n jsonObj[attr.name] = fromValue;\n }\n });\n }\n\n fromJson(jsonObj: any, obj: any) {\n this.attributes.forEach((attr) => {\n const fromValue = jsonObj[attr.name];\n if (fromValue === undefined) {\n obj[attr.name] = attr.defaultValue;\n }\n else {\n obj[attr.name] = fromValue;\n }\n });\n }\n\n update(jsonObj: any, obj: any) {\n this.attributes.forEach((attr) => {\n\n const fromValue = jsonObj[attr.name];\n if (fromValue !== undefined) {\n obj[attr.name] = fromValue;\n }\n });\n }\n\n setDefaults(obj: any) {\n this.attributes.forEach((attr) => {\n obj[attr.name] = attr.defaultValue;\n });\n }\n\n}\n\n/** @hidden @internal */\nexport default AttributeDefinitions;\n","import AttributeDefinitions from \"../AttributeDefinitions\";\nimport DockLocation from \"../DockLocation\";\nimport DropInfo from \"../DropInfo\";\nimport Orientation from \"../Orientation\";\nimport Rect from \"../Rect\";\nimport { JSMap } from \"../Types\";\nimport IDraggable from \"./IDraggable\";\nimport Model from \"./Model\";\n\nabstract class Node {\n\n /** @hidden @internal */\n protected _model: Model;\n /** @hidden @internal */\n protected _attributes: JSMap;\n /** @hidden @internal */\n protected _parent?: Node;\n /** @hidden @internal */\n protected _children: Node[];\n /** @hidden @internal */\n protected _fixed: boolean;\n /** @hidden @internal */\n protected _rect: Rect;\n /** @hidden @internal */\n protected _visible: boolean;\n /** @hidden @internal */\n protected _listeners: JSMap<(params: any) => void>;\n /** @hidden @internal */\n protected _dirty: boolean = false;\n /** @hidden @internal */\n protected _tempSize: number = 0;\n\n /** @hidden @internal */\n protected constructor(model: Model) {\n this._model = model;\n this._attributes = {};\n this._children = [];\n this._fixed = false;\n this._rect = Rect.empty();\n this._visible = false;\n this._listeners = {};\n }\n\n getId() {\n let id = this._attributes.id;\n if (id !== undefined) {\n return id as string;\n }\n\n id = this._model._nextUniqueId();\n this._setId(id);\n\n return id as string;\n }\n\n getModel() {\n return this._model;\n }\n\n getType() {\n return this._attributes.type as string;\n }\n\n getParent() {\n return this._parent;\n }\n\n getChildren() {\n return this._children;\n }\n\n getRect() {\n return this._rect;\n }\n\n isVisible() {\n return this._visible;\n }\n\n getOrientation(): Orientation {\n if (this._parent === undefined) {\n return Orientation.HORZ;\n }\n else {\n return Orientation.flip(this._parent.getOrientation());\n }\n }\n\n // event can be: resize, visibility, maximize (on tabset), close\n setEventListener(event: string, callback: (params: any) => void) {\n this._listeners[event] = callback;\n }\n\n removeEventListener(event: string) {\n delete this._listeners[event];\n }\n\n /** @hidden @internal */\n _setId(id: string) {\n this._attributes.id = id;\n }\n\n /** @hidden @internal */\n _fireEvent(event: string, params: any) {\n // console.log(this._type, \" fireEvent \" + event + \" \" + JSON.stringify(params));\n if (this._listeners[event] !== undefined) {\n this._listeners[event](params);\n }\n }\n\n /** @hidden @internal */\n _getAttr(name: string) {\n let val = this._attributes[name];\n\n if (val === undefined) {\n const modelName = this._getAttributeDefinitions().getModelName(name);\n if (modelName !== undefined) {\n val = this._model._getAttribute(modelName);\n }\n }\n\n // console.log(name + \"=\" + val);\n return val;\n }\n\n /** @hidden @internal */\n _forEachNode(fn: (node: Node, level: number) => void, level: number) {\n fn(this, level);\n level++;\n this._children.forEach((node) => {\n node._forEachNode(fn, level);\n });\n }\n\n\n /** @hidden @internal */\n _setVisible(visible: boolean) {\n if (visible !== this._visible) {\n this._fireEvent(\"visibility\", { visible });\n this._visible = visible;\n }\n }\n\n /** @hidden @internal */\n _getDrawChildren(): Node[] | undefined {\n return this._children;\n }\n\n /** @hidden @internal */\n _setParent(parent: Node) {\n this._parent = parent;\n }\n\n /** @hidden @internal */\n _setRect(rect: Rect) {\n this._rect = rect;\n }\n\n /** @hidden @internal */\n _setWeight(weight: number) {\n this._attributes.weight = weight;\n }\n\n /** @hidden @internal */\n _setSelected(index: number) {\n this._attributes.selected = index;\n }\n\n /** @hidden @internal */\n _isFixed() {\n return this._fixed;\n }\n\n /** @hidden @internal */\n _layout(rect: Rect) {\n this._rect = rect;\n }\n\n /** @hidden @internal */\n _findDropTargetNode(dragNode: (Node & IDraggable), x: number, y: number): DropInfo | undefined {\n let rtn: DropInfo | undefined;\n if (this._rect.contains(x, y)) {\n rtn = this.canDrop(dragNode, x, y);\n if (rtn === undefined) {\n if (this._children.length !== 0) {\n for (const child of this._children) {\n rtn = child._findDropTargetNode(dragNode, x, y);\n if (rtn !== undefined) {\n break;\n }\n }\n }\n }\n }\n\n return rtn;\n }\n\n /** @hidden @internal */\n canDrop(_dragNode: (Node & IDraggable), _x: number, _y: number): DropInfo | undefined {\n return undefined;\n }\n\n /** @hidden @internal */\n _canDockInto(dragNode: (Node & IDraggable), dropInfo: DropInfo | undefined): boolean {\n if (dropInfo != null) {\n if (dropInfo.location === DockLocation.CENTER && dropInfo.node.isEnableDrop() === false) {\n return false;\n }\n\n // prevent named tabset docking into another tabset, since this would lose the header\n if (dropInfo.location === DockLocation.CENTER && dragNode.getType() === \"tabset\" && dragNode.getName() !== undefined) {\n return false;\n }\n\n if (dropInfo.location !== DockLocation.CENTER && dropInfo.node.isEnableDivide() === false) {\n return false;\n }\n\n // finally check model callback to check if drop allowed\n if (this._model._getOnAllowDrop()) {\n return (this._model._getOnAllowDrop() as (dragNode: (Node), dropInfo: DropInfo) => boolean)(dragNode, dropInfo);\n }\n }\n return true;\n }\n\n /** @hidden @internal */\n _removeChild(childNode: Node) {\n const pos = this._children.indexOf(childNode);\n if (pos !== -1) {\n this._children.splice(pos, 1);\n }\n this._dirty = true;\n return pos;\n }\n\n /** @hidden @internal */\n _addChild(childNode: Node, pos?: number) {\n if (pos != null) {\n this._children.splice(pos, 0, childNode);\n }\n else {\n this._children.push(childNode);\n pos = this._children.length - 1;\n }\n childNode._parent = this;\n this._dirty = true;\n return pos;\n }\n\n /** @hidden @internal */\n _removeAll() {\n this._children = [];\n this._dirty = true;\n }\n\n /** @hidden @internal */\n _styleWithPosition(style?: JSMap) {\n if (style == null) {\n style = {};\n }\n return this._rect.styleWithPosition(style);\n }\n\n /** @hidden @internal */\n _getTempSize() {\n return this._tempSize;\n }\n\n /** @hidden @internal */\n _setTempSize(value: number) {\n this._tempSize = value;\n }\n\n /** @hidden @internal */\n isEnableDivide() {\n return true;\n }\n\n /** @hidden @internal */\n _toAttributeString() {\n return JSON.stringify(this._attributes, undefined, \"\\t\");\n }\n\n // implemented by subclasses\n /** @hidden @internal */\n abstract _updateAttrs(json: any): void;\n /** @hidden @internal */\n abstract _getAttributeDefinitions(): AttributeDefinitions;\n /** @hidden @internal */\n abstract _toJson(): any;\n\n /** @hidden @internal */\n protected _getAttributeAsStringOrUndefined(attr: string) {\n const value = this._attributes[attr];\n if (value !== undefined) {\n return value as string;\n }\n return undefined;\n }\n\n /** @hidden @internal */\n protected _getAttributeAsNumberOrUndefined(attr: string) {\n const value = this._attributes[attr];\n if (value !== undefined) {\n return value as number;\n }\n return undefined;\n }\n\n}\n\nexport default Node;\n","import AttributeDefinitions from \"../AttributeDefinitions\";\nimport Orientation from \"../Orientation\";\nimport Model from \"./Model\";\nimport Node from \"./Node\";\n\nclass SplitterNode extends Node {\n\n static readonly TYPE: string = \"splitter\";\n\n /** @hidden @internal */\n constructor(model: Model) {\n super(model);\n this._fixed = true;\n this._attributes.type = SplitterNode.TYPE;\n model._addNode(this);\n }\n\n /** @hidden @internal */\n getWidth() {\n return this._model.getSplitterSize();\n }\n\n /** @hidden @internal */\n getHeight() {\n return this._model.getSplitterSize();\n }\n\n /** @hidden @internal */\n getWeight(): number {\n return 0;\n }\n\n /** @hidden @internal */\n _setWeight(_value: number): void {\n return;\n }\n\n /** @hidden @internal */\n _getPrefSize(_orientation: Orientation): number {\n return this._model.getSplitterSize();\n }\n\n /** @hidden @internal */\n _updateAttrs(_json: any): void {\n return;\n }\n\n /** @hidden @internal */\n _getAttributeDefinitions(): AttributeDefinitions {\n return new AttributeDefinitions();\n }\n\n /** @hidden @internal */\n _toJson(): any {\n return undefined;\n }\n}\n\nexport default SplitterNode;\n","import Attribute from \"../Attribute\";\nimport AttributeDefinitions from \"../AttributeDefinitions\";\nimport Rect from \"../Rect\";\nimport { JSMap } from \"../Types\";\nimport BorderNode from \"./BorderNode\";\nimport IDraggable from \"./IDraggable\";\nimport Model from \"./Model\";\nimport Node from \"./Node\";\nimport TabSetNode from \"./TabSetNode\";\n\nclass TabNode extends Node implements IDraggable {\n\n static readonly TYPE = \"tab\";\n\n /** @hidden @internal */\n static _fromJson(json: any, model: Model) {\n const newLayoutNode = new TabNode(model, json);\n return newLayoutNode;\n }\n /** @hidden @internal */\n private static _attributeDefinitions: AttributeDefinitions = TabNode._createAttributeDefinitions();\n\n /** @hidden @internal */\n private static _createAttributeDefinitions(): AttributeDefinitions {\n\n const attributeDefinitions = new AttributeDefinitions();\n attributeDefinitions.add(\"type\", TabNode.TYPE, true);\n attributeDefinitions.add(\"id\", undefined).setType(Attribute.ID);\n\n attributeDefinitions.add(\"icon\", \"application\").setType(Attribute.STRING);\n attributeDefinitions.add(\"name\", \"[Unnamed Tab]\").setType(Attribute.STRING);\n attributeDefinitions.add(\"component\", undefined).setType(Attribute.STRING);\n attributeDefinitions.add(\"layout\", undefined);\n attributeDefinitions.add(\"config\", undefined).setType(Attribute.JSON);\n\n attributeDefinitions.addInherited(\"enableClose\", \"tabEnableClose\").setType(Attribute.BOOLEAN);\n attributeDefinitions.addInherited(\"enableDrag\", \"tabEnableDrag\").setType(Attribute.BOOLEAN);\n attributeDefinitions.addInherited(\"enableRename\", \"tabEnableRename\").setType(Attribute.BOOLEAN);\n attributeDefinitions.addInherited(\"className\", \"tabClassName\").setType(Attribute.STRING);\n attributeDefinitions.addInherited(\"icon\", \"tabIcon\").setType(Attribute.STRING);\n attributeDefinitions.addInherited(\"enableRenderOnDemand\", \"tabEnableRenderOnDemand\").setType(Attribute.BOOLEAN);\n return attributeDefinitions;\n }\n\n /** @hidden @internal */\n private _tabRect?: Rect;\n /** @hidden @internal */\n private _extra: JSMap;\n\n /** @hidden @internal */\n constructor(model: Model, json: any) {\n super(model);\n\n this._extra = {}; // extra data added to node not saved in json\n\n TabNode._attributeDefinitions.fromJson(json, this._attributes);\n model._addNode(this);\n }\n\n getTabRect() {\n return this._tabRect;\n }\n\n /** @hidden @internal */\n _setTabRect(rect: Rect) {\n this._tabRect = rect;\n }\n\n getName() {\n return this._getAttr(\"name\") as string;\n }\n\n\n getComponent() {\n return this._getAttributeAsStringOrUndefined(\"component\");\n }\n\n getLayout() {\n return this._getAttributeAsStringOrUndefined(\"layout\");\n }\n\n /**\n * Returns the config attribute that can be used to store node specific data that\n * WILL be saved to the json. The config attribute should be changed via the action Actions.updateNodeAttributes rather\n * than directly, for example:\n * this.state.model.doAction(\n * FlexLayout.Actions.updateNodeAttributes(node.getId(), {config:myConfigObject}));\n */\n getConfig() {\n return this._attributes.config;\n }\n\n /**\n * Returns an object that can be used to store transient node specific data that will\n * NOT be saved in the json.\n */\n getExtraData() {\n return this._extra;\n }\n\n getIcon() {\n return this._getAttributeAsStringOrUndefined(\"icon\");\n }\n\n isEnableClose() {\n return this._getAttr(\"enableClose\") as boolean;\n }\n\n isEnableDrag() {\n return this._getAttr(\"enableDrag\") as boolean;\n }\n\n isEnableRename() {\n return this._getAttr(\"enableRename\") as boolean;\n }\n\n getClassName() {\n return this._getAttributeAsStringOrUndefined(\"className\");\n }\n\n isEnableRenderOnDemand() {\n return this._getAttr(\"enableRenderOnDemand\") as boolean;\n }\n\n /** @hidden @internal */\n _setName(name: string) {\n this._attributes.name = name;\n }\n\n /** @hidden @internal */\n _layout(rect: Rect) {\n if (!rect.equals(this._rect)) {\n this._fireEvent(\"resize\", { rect });\n }\n this._rect = rect;\n }\n\n /** @hidden @internal */\n _delete() {\n (this._parent as TabSetNode | BorderNode)._remove(this);\n this._fireEvent(\"close\", {});\n }\n\n /** @hidden @internal */\n _toJson() {\n const json = {};\n TabNode._attributeDefinitions.toJson(json, this._attributes);\n return json;\n }\n\n /** @hidden @internal */\n _updateAttrs(json: any) {\n TabNode._attributeDefinitions.update(json, this._attributes);\n }\n\n /** @hidden @internal */\n _getAttributeDefinitions() {\n return TabNode._attributeDefinitions;\n }\n}\n\nexport default TabNode;\n","import AttributeDefinitions from \"../AttributeDefinitions\";\nimport DockLocation from \"../DockLocation\";\nimport DropInfo from \"../DropInfo\";\nimport Orientation from \"../Orientation\";\nimport Rect from \"../Rect\";\nimport BorderNode from \"./BorderNode\";\nimport IDraggable from \"./IDraggable\";\nimport IDropTarget from \"./IDropTarget\";\nimport Model from \"./Model\";\nimport Node from \"./Node\";\nimport SplitterNode from \"./SplitterNode\";\nimport TabSetNode from \"./TabSetNode\";\n\nclass RowNode extends Node implements IDropTarget {\n\n static readonly TYPE = \"row\";\n\n /** @hidden @internal */\n static _fromJson(json: any, model: Model) {\n const newLayoutNode = new RowNode(model, json);\n\n if (json.children != null) {\n for (const jsonChild of json.children) {\n if (jsonChild.type === TabSetNode.TYPE) {\n const child = TabSetNode._fromJson(jsonChild, model);\n newLayoutNode._addChild(child);\n }\n else {\n const child = RowNode._fromJson(jsonChild, model);\n newLayoutNode._addChild(child);\n }\n }\n }\n\n return newLayoutNode;\n }\n /** @hidden @internal */\n private static _attributeDefinitions: AttributeDefinitions = RowNode._createAttributeDefinitions();\n\n /** @hidden @internal */\n private static _createAttributeDefinitions(): AttributeDefinitions {\n const attributeDefinitions = new AttributeDefinitions();\n attributeDefinitions.add(\"type\", RowNode.TYPE, true);\n attributeDefinitions.add(\"id\", undefined);\n\n attributeDefinitions.add(\"weight\", 100);\n attributeDefinitions.add(\"width\", undefined);\n attributeDefinitions.add(\"height\", undefined);\n\n return attributeDefinitions;\n }\n /** @hidden @internal */\n private _drawChildren: (Node)[];\n\n /** @hidden @internal */\n constructor(model: Model, json: any) {\n super(model);\n\n this._dirty = true;\n this._drawChildren = [];\n RowNode._attributeDefinitions.fromJson(json, this._attributes);\n model._addNode(this);\n }\n\n getWeight() {\n return this._attributes.weight as number;\n }\n\n getWidth() {\n return this._getAttributeAsNumberOrUndefined(\"width\");\n }\n\n getHeight() {\n return this._getAttributeAsNumberOrUndefined(\"height\");\n }\n\n /** @hidden @internal */\n _setWeight(weight: number) {\n this._attributes.weight = weight;\n }\n\n /** @hidden @internal */\n _layout(rect: Rect) {\n super._layout(rect);\n\n const pixelSize = this._rect._getSize(this.getOrientation());\n\n let totalWeight = 0;\n let fixedPixels = 0;\n let prefPixels = 0;\n let totalPrefWeight = 0;\n const drawChildren = this._getDrawChildren() as Array;\n\n for (const child of drawChildren) {\n const prefSize = child._getPrefSize(this.getOrientation());\n if (child._isFixed()) {\n if (prefSize !== undefined) {\n fixedPixels += prefSize;\n }\n }\n else {\n if (prefSize === undefined) {\n totalWeight += child.getWeight();\n }\n else {\n prefPixels += prefSize;\n totalPrefWeight += child.getWeight();\n }\n }\n }\n\n let resizePreferred = false;\n let availablePixels = pixelSize - fixedPixels - prefPixels;\n if (availablePixels < 0) {\n availablePixels = pixelSize - fixedPixels;\n resizePreferred = true;\n totalWeight += totalPrefWeight;\n }\n\n // assign actual pixel sizes\n let totalSizeGiven = 0;\n let variableSize = 0;\n for (const child of drawChildren) {\n const prefSize = child._getPrefSize(this.getOrientation());\n if (child._isFixed()) {\n if (prefSize !== undefined) {\n child._setTempSize(prefSize);\n }\n }\n else {\n if (prefSize == null || resizePreferred) {\n if (totalWeight === 0) {\n child._setTempSize(0);\n }\n else {\n child._setTempSize(Math.floor(availablePixels * (child.getWeight() / totalWeight)));\n }\n variableSize += child._getTempSize();\n }\n else {\n child._setTempSize(prefSize);\n }\n }\n\n totalSizeGiven += child._getTempSize();\n }\n\n // adjust sizes to exactly fit\n if (variableSize > 0) {\n while (totalSizeGiven < pixelSize) {\n for (const child of drawChildren) {\n const prefSize = child._getPrefSize(this.getOrientation());\n if (!child._isFixed() && (prefSize === undefined || resizePreferred) && totalSizeGiven < pixelSize) {\n child._setTempSize(child._getTempSize() + 1);\n totalSizeGiven++;\n }\n }\n }\n }\n\n // layout children\n let p = 0;\n for (const child of drawChildren) {\n if (this.getOrientation() === Orientation.HORZ) {\n child._layout(new Rect(this._rect.x + p, this._rect.y, child._getTempSize(), this._rect.height));\n }\n else {\n child._layout(new Rect(this._rect.x, this._rect.y + p, this._rect.width, child._getTempSize()));\n }\n p += child._getTempSize();\n }\n\n return true;\n }\n\n /** @hidden @internal */\n _getSplitterBounds(splitterNode: SplitterNode) {\n const pBounds = [0, 0];\n const drawChildren = this._getDrawChildren() as Array;\n const p = drawChildren.indexOf(splitterNode);\n if (this.getOrientation() === Orientation.HORZ) {\n pBounds[0] = drawChildren[p - 1].getRect().x;\n pBounds[1] = drawChildren[p + 1].getRect().getRight() - splitterNode.getWidth();\n }\n else {\n pBounds[0] = drawChildren[p - 1].getRect().y;\n pBounds[1] = drawChildren[p + 1].getRect().getBottom() - splitterNode.getHeight();\n }\n return pBounds;\n }\n\n /** @hidden @internal */\n _calculateSplit(splitter: SplitterNode, splitterPos: number) {\n let rtn;\n const drawChildren = this._getDrawChildren() as Array;\n const p = drawChildren.indexOf(splitter);\n const pBounds = this._getSplitterBounds(splitter);\n\n const weightedLength = drawChildren[p - 1].getWeight() + drawChildren[p + 1].getWeight();\n\n const pixelWidth1 = Math.max(0, splitterPos - pBounds[0]);\n const pixelWidth2 = Math.max(0, pBounds[1] - splitterPos);\n\n if (pixelWidth1 + pixelWidth2 > 0) {\n const weight1 = (pixelWidth1 * weightedLength) / (pixelWidth1 + pixelWidth2);\n const weight2 = (pixelWidth2 * weightedLength) / (pixelWidth1 + pixelWidth2);\n\n rtn = {\n node1Id: drawChildren[p - 1].getId(), weight1, pixelWidth1,\n node2Id: drawChildren[p + 1].getId(), weight2, pixelWidth2\n };\n }\n\n return rtn;\n }\n\n /** @hidden @internal */\n _getDrawChildren(): Node[] | undefined {\n if (this._dirty) {\n this._drawChildren = [];\n\n for (let i = 0; i < this._children.length; i++) {\n const child = this._children[i] as RowNode | TabSetNode;\n if (i !== 0) {\n const newSplitter = new SplitterNode(this._model);\n newSplitter._setParent(this);\n this._drawChildren.push(newSplitter);\n }\n this._drawChildren.push(child);\n }\n this._dirty = false;\n }\n\n return this._drawChildren;\n }\n\n /** @hidden @internal */\n _tidy() {\n // console.log(\"a\", this._model.toString());\n let i = 0;\n while (i < this._children.length) {\n const child = this._children[i];\n if (child instanceof RowNode) {\n child._tidy();\n\n const childChildren = child.getChildren();\n if (childChildren.length === 0) {\n this._removeChild(child);\n }\n else if (childChildren.length === 1) {\n // hoist child/children up to this level\n const subchild = childChildren[0];\n this._removeChild(child);\n if (subchild instanceof RowNode) {\n let subChildrenTotal = 0;\n const subChildChildren = subchild.getChildren();\n for (const ssc of subChildChildren) {\n const subsubChild = ssc as RowNode | TabSetNode;\n subChildrenTotal += subsubChild.getWeight();\n }\n for (let j = 0; j < subChildChildren.length; j++) {\n const subsubChild = subChildChildren[j] as RowNode | TabSetNode;\n subsubChild._setWeight(child.getWeight() * subsubChild.getWeight() / subChildrenTotal);\n this._addChild(subsubChild, i + j);\n }\n }\n else {\n subchild._setWeight(child.getWeight());\n this._addChild(subchild, i);\n }\n }\n else {\n i++;\n }\n }\n else if (child instanceof TabSetNode && child.getChildren().length === 0) {\n if (child.isEnableDeleteWhenEmpty()) {\n this._removeChild(child);\n }\n else {\n i++;\n }\n }\n else {\n i++;\n }\n }\n\n // add tabset into empty root\n if (this === this._model.getRoot() && this._children.length === 0) {\n const child = new TabSetNode(this._model, { type: \"tabset\" });\n this._addChild(child);\n }\n\n // console.log(\"b\", this._model.toString());\n }\n\n /** @hidden @internal */\n canDrop(dragNode: (Node & IDraggable), x: number, y: number): DropInfo | undefined {\n const yy = y - this._rect.y;\n const xx = x - this._rect.x;\n const w = this._rect.width;\n const h = this._rect.height;\n const margin = 10; // height of edge rect\n const half = 50; // half width of edge rect\n let dropInfo;\n\n if (this._model.isEnableEdgeDock() && this._parent === undefined) { // _root row\n if (x < this._rect.x + margin && (yy > h / 2 - half && yy < h / 2 + half)) {\n const dockLocation = DockLocation.LEFT;\n const outlineRect = dockLocation.getDockRect(this._rect);\n outlineRect.width = outlineRect.width / 2;\n dropInfo = new DropInfo(this, outlineRect, dockLocation, -1, \"layout__outline_rect_edge\");\n }\n else if (x > this._rect.getRight() - margin && (yy > h / 2 - half && yy < h / 2 + half)) {\n const dockLocation = DockLocation.RIGHT;\n const outlineRect = dockLocation.getDockRect(this._rect);\n outlineRect.width = outlineRect.width / 2;\n outlineRect.x += outlineRect.width;\n dropInfo = new DropInfo(this, outlineRect, dockLocation, -1, \"layout__outline_rect_edge\");\n }\n else if (y < this._rect.y + margin && (xx > w / 2 - half && xx < w / 2 + half)) {\n const dockLocation = DockLocation.TOP;\n const outlineRect = dockLocation.getDockRect(this._rect);\n outlineRect.height = outlineRect.height / 2;\n dropInfo = new DropInfo(this, outlineRect, dockLocation, -1, \"layout__outline_rect_edge\");\n }\n else if (y > this._rect.getBottom() - margin && (xx > w / 2 - half && xx < w / 2 + half)) {\n const dockLocation = DockLocation.BOTTOM;\n const outlineRect = dockLocation.getDockRect(this._rect);\n outlineRect.height = outlineRect.height / 2;\n outlineRect.y += outlineRect.height;\n dropInfo = new DropInfo(this, outlineRect, dockLocation, -1, \"layout__outline_rect_edge\");\n }\n\n if (dropInfo !== undefined) {\n if (!dragNode._canDockInto(dragNode, dropInfo)) {\n return undefined;\n }\n }\n }\n\n return dropInfo;\n }\n\n /** @hidden @internal */\n drop(dragNode: (Node & IDraggable), location: DockLocation, _index: number): void {\n const dockLocation = location;\n\n const parent = dragNode.getParent();\n\n if (parent) {\n parent._removeChild(dragNode);\n }\n\n if (parent !== undefined && parent!.getType() === TabSetNode.TYPE) {\n parent._setSelected(0);\n }\n\n if (parent !== undefined && parent!.getType() === BorderNode.TYPE) {\n parent._setSelected(-1);\n }\n\n let tabSet: TabSetNode | undefined;\n if (dragNode instanceof TabSetNode) {\n tabSet = dragNode;\n }\n else {\n tabSet = new TabSetNode(this._model, {});\n tabSet._addChild(dragNode);\n }\n let size = this._children.reduce((sum, child) => {\n return sum + (child as RowNode | TabSetNode).getWeight();\n }, 0);\n\n if (size === 0) {\n size = 100;\n }\n\n tabSet._setWeight(size / 3);\n\n if (dockLocation === DockLocation.LEFT) {\n this._addChild(tabSet, 0);\n }\n else if (dockLocation === DockLocation.RIGHT) {\n this._addChild(tabSet);\n }\n else if (dockLocation === DockLocation.TOP) {\n const vrow = new RowNode(this._model, {});\n const hrow = new RowNode(this._model, {});\n hrow._setWeight(75);\n tabSet._setWeight(25);\n this._children.forEach((child) => {\n hrow._addChild(child);\n });\n this._removeAll();\n vrow._addChild(tabSet);\n vrow._addChild(hrow);\n this._addChild(vrow);\n }\n else if (dockLocation === DockLocation.BOTTOM) {\n const vrow = new RowNode(this._model, {});\n const hrow = new RowNode(this._model, {});\n hrow._setWeight(75);\n tabSet._setWeight(25);\n this._children.forEach((child) => {\n hrow._addChild(child);\n });\n this._removeAll();\n vrow._addChild(hrow);\n vrow._addChild(tabSet);\n this._addChild(vrow);\n }\n\n this._model._setActiveTabset(tabSet);\n\n this._model._tidy();\n }\n\n /** @hidden @internal */\n _toJson() {\n const json: any = {};\n RowNode._attributeDefinitions.toJson(json, this._attributes);\n\n json.children = [];\n this._children.forEach((child) => {\n json.children.push(child._toJson());\n });\n\n return json;\n }\n\n isEnableDrop() {\n return true;\n }\n\n /** @hidden @internal */\n _getPrefSize(orientation: Orientation) {\n let prefSize = this.getWidth();\n if (orientation === Orientation.VERT) {\n prefSize = this.getHeight();\n }\n return prefSize;\n }\n\n /** @hidden @internal */\n _getAttributeDefinitions() {\n return RowNode._attributeDefinitions;\n }\n\n /** @hidden @internal */\n _updateAttrs(json: any) {\n RowNode._attributeDefinitions.update(json, this._attributes);\n }\n}\n\nexport default RowNode;\n","import Attribute from \"../Attribute\";\nimport AttributeDefinitions from \"../AttributeDefinitions\";\nimport DockLocation from \"../DockLocation\";\nimport DropInfo from \"../DropInfo\";\nimport Orientation from \"../Orientation\";\nimport Rect from \"../Rect\";\nimport BorderNode from \"./BorderNode\";\nimport IDraggable from \"./IDraggable\";\nimport IDropTarget from \"./IDropTarget\";\nimport Model from \"./Model\";\nimport Node from \"./Node\";\nimport RowNode from \"./RowNode\";\nimport TabNode from \"./TabNode\";\n\nclass TabSetNode extends Node implements IDraggable, IDropTarget {\n static readonly TYPE = \"tabset\";\n\n /** @hidden @internal */\n static _fromJson(json: any, model: Model) {\n const newLayoutNode = new TabSetNode(model, json);\n\n if (json.children != null) {\n json.children.forEach((jsonChild: any) => {\n const child = TabNode._fromJson(jsonChild, model);\n newLayoutNode._addChild(child);\n });\n }\n\n if (json.maximized && json.maximized === true) {\n model._setMaximizedTabset(newLayoutNode);\n }\n\n if (json.active && json.active === true) {\n model._setActiveTabset(newLayoutNode);\n }\n\n return newLayoutNode;\n }\n /** @hidden @internal */\n private static _attributeDefinitions: AttributeDefinitions = TabSetNode._createAttributeDefinitions();\n\n /** @hidden @internal */\n private static _createAttributeDefinitions(): AttributeDefinitions {\n\n const attributeDefinitions = new AttributeDefinitions();\n attributeDefinitions.add(\"type\", TabSetNode.TYPE, true);\n attributeDefinitions.add(\"id\", undefined).setType(Attribute.ID);\n\n attributeDefinitions.add(\"weight\", 100);\n attributeDefinitions.add(\"width\", undefined);\n attributeDefinitions.add(\"height\", undefined);\n attributeDefinitions.add(\"selected\", 0);\n attributeDefinitions.add(\"name\", undefined).setType(Attribute.STRING);\n\n attributeDefinitions.addInherited(\"enableDeleteWhenEmpty\", \"tabSetEnableDeleteWhenEmpty\");\n attributeDefinitions.addInherited(\"enableDrop\", \"tabSetEnableDrop\");\n attributeDefinitions.addInherited(\"enableDrag\", \"tabSetEnableDrag\");\n attributeDefinitions.addInherited(\"enableDivide\", \"tabSetEnableDivide\");\n attributeDefinitions.addInherited(\"enableMaximize\", \"tabSetEnableMaximize\");\n attributeDefinitions.addInherited(\"classNameTabStrip\", \"tabSetClassNameTabStrip\");\n attributeDefinitions.addInherited(\"classNameHeader\", \"tabSetClassNameHeader\");\n attributeDefinitions.addInherited(\"enableTabStrip\", \"tabSetEnableTabStrip\");\n attributeDefinitions.addInherited(\"borderInsets\", \"tabSetBorderInsets\");\n attributeDefinitions.addInherited(\"marginInsets\", \"tabSetMarginInsets\");\n\n attributeDefinitions.addInherited(\"headerHeight\", \"tabSetHeaderHeight\");\n attributeDefinitions.addInherited(\"tabStripHeight\", \"tabSetTabStripHeight\");\n return attributeDefinitions;\n }\n\n /** @hidden @internal */\n private _contentRect?: Rect;\n /** @hidden @internal */\n private _tabHeaderRect?: Rect;\n\n /** @hidden @internal */\n constructor(model: Model, json: any) {\n super(model);\n\n TabSetNode._attributeDefinitions.fromJson(json, this._attributes);\n model._addNode(this);\n }\n\n getName() {\n return this._getAttributeAsStringOrUndefined(\"name\");\n }\n\n getSelected() {\n const selected = this._attributes.selected;\n if (selected !== undefined) {\n return selected as number;\n }\n return -1;\n }\n\n getSelectedNode() {\n const selected = this.getSelected();\n if (selected !== -1) {\n return this._children[selected];\n }\n return undefined;\n }\n\n getWeight(): number {\n return this._attributes.weight as number;\n }\n\n getWidth() {\n return this._getAttributeAsNumberOrUndefined(\"width\");\n }\n\n getHeight() {\n return this._getAttributeAsNumberOrUndefined(\"height\");\n }\n\n isMaximized() {\n return this._model.getMaximizedTabset() === this;\n }\n\n isActive() {\n return this._model.getActiveTabset() === this;\n }\n\n isEnableDeleteWhenEmpty() {\n return this._getAttr(\"enableDeleteWhenEmpty\") as boolean;\n }\n\n isEnableDrop() {\n return this._getAttr(\"enableDrop\") as boolean;\n }\n\n isEnableDrag() {\n return this._getAttr(\"enableDrag\") as boolean;\n }\n\n isEnableDivide() {\n return this._getAttr(\"enableDivide\") as boolean;\n }\n\n isEnableMaximize() {\n return this._getAttr(\"enableMaximize\") as boolean;\n }\n\n isEnableTabStrip() {\n return this._getAttr(\"enableTabStrip\") as boolean;\n }\n\n getClassNameTabStrip() {\n return this._getAttributeAsStringOrUndefined(\"classNameTabStrip\");\n }\n\n getClassNameHeader() {\n return this._getAttributeAsStringOrUndefined(\"classNameHeader\");\n }\n\n getHeaderHeight() {\n return this._getAttr(\"headerHeight\") as number;\n }\n\n getTabStripHeight() {\n return this._getAttr(\"tabStripHeight\") as number;\n }\n\n /** @hidden @internal */\n _setWeight(weight: number) {\n this._attributes.weight = weight;\n }\n\n /** @hidden @internal */\n _setSelected(index: number) {\n this._attributes.selected = index;\n }\n\n /** @hidden @internal */\n canDrop(dragNode: (Node & IDraggable), x: number, y: number): DropInfo | undefined {\n let dropInfo;\n\n if (dragNode === this) {\n const dockLocation = DockLocation.CENTER;\n const outlineRect = this._tabHeaderRect;\n dropInfo = new DropInfo(this, outlineRect!, dockLocation, -1, \"layout__outline_rect\");\n }\n else if (this._contentRect!.contains(x, y)) {\n const dockLocation = DockLocation.getLocation(this._contentRect!, x, y);\n const outlineRect = dockLocation.getDockRect(this._rect);\n dropInfo = new DropInfo(this, outlineRect, dockLocation, -1, \"layout__outline_rect\");\n }\n else if (this._children.length > 0 && this._tabHeaderRect != null && this._tabHeaderRect.contains(x, y)) {\n let child = this._children[0] as TabNode;\n let r = child.getTabRect()!;\n const yy = r.y;\n const h = r.height;\n let p = this._tabHeaderRect.x;\n let childCenter = 0;\n for (let i = 0; i < this._children.length; i++) {\n child = this._children[i] as TabNode;\n r = child.getTabRect()!;\n childCenter = r.x + r.width / 2;\n if (x >= p && x < childCenter) {\n const dockLocation = DockLocation.CENTER;\n const outlineRect = new Rect(r.x - 2, yy, 3, h);\n dropInfo = new DropInfo(this, outlineRect, dockLocation, i, \"layout__outline_rect\");\n break;\n }\n p = childCenter;\n }\n if (dropInfo == null) {\n const dockLocation = DockLocation.CENTER;\n const outlineRect = new Rect(r.getRight() - 2, yy, 3, h);\n dropInfo = new DropInfo(this, outlineRect, dockLocation, this._children.length, \"layout__outline_rect\");\n }\n }\n\n if (!dragNode._canDockInto(dragNode, dropInfo)) {\n return undefined;\n }\n\n return dropInfo;\n }\n\n /** @hidden @internal */\n _layout(rect: Rect) {\n\n if (this.isMaximized()) {\n rect = (this._model.getRoot() as Node).getRect();\n }\n\n rect = rect.removeInsets(this._getAttr(\"marginInsets\"));\n this._rect = rect;\n rect = rect.removeInsets(this._getAttr(\"borderInsets\"));\n\n const showHeader = (this.getName() !== undefined);\n let y = 0;\n if (showHeader) {\n y += this.getHeaderHeight();\n }\n if (this.isEnableTabStrip()) {\n this._tabHeaderRect = new Rect(rect.x, rect.y + y, rect.width, this.getTabStripHeight());\n y += this.getTabStripHeight();\n }\n this._contentRect = new Rect(rect.x, rect.y + y, rect.width, rect.height - y);\n\n this._children.forEach((child, i) => {\n child._layout(this._contentRect!);\n child._setVisible(i === this.getSelected());\n });\n }\n\n /** @hidden @internal */\n _remove(node: TabNode) {\n this._removeChild(node);\n this._model._tidy();\n this._setSelected(Math.max(0, this.getSelected() - 1));\n }\n\n /** @hidden @internal */\n drop(dragNode: (Node & IDraggable), location: DockLocation, index: number) {\n const dockLocation = location;\n\n if (this === dragNode) { // tabset drop into itself\n return; // dock back to itself\n }\n\n let dragParent = dragNode.getParent() as (BorderNode | TabSetNode);\n let fromIndex = 0;\n if (dragParent !== undefined) {\n fromIndex = dragParent._removeChild(dragNode);\n }\n // console.log(\"removed child: \" + fromIndex);\n\n // if dropping a tab back to same tabset and moving to forward position then reduce insertion index\n if (dragNode.getType() === TabNode.TYPE && dragParent === this && fromIndex < index && index > 0) {\n index--;\n }\n\n // for the tabset/border being removed from set the selected index\n if (dragParent !== undefined) {\n if (dragParent.getType() === TabSetNode.TYPE) {\n dragParent._setSelected(0);\n }\n else if (dragParent.getType() === BorderNode.TYPE) {\n if (dragParent.getSelected() !== -1) {\n if (fromIndex === dragParent.getSelected() && dragParent.getChildren().length > 0) {\n dragParent._setSelected(0);\n }\n else if (fromIndex < dragParent.getSelected()) {\n dragParent._setSelected(dragParent.getSelected() - 1);\n }\n else if (fromIndex > dragParent.getSelected()) {\n // leave selected index as is\n }\n else {\n dragParent._setSelected(-1);\n }\n }\n }\n }\n\n // simple_bundled dock to existing tabset\n if (dockLocation === DockLocation.CENTER) {\n let insertPos = index;\n if (insertPos === -1) {\n insertPos = this._children.length;\n }\n\n if (dragNode.getType() === TabNode.TYPE) {\n this._addChild(dragNode, insertPos);\n this._setSelected(insertPos);\n // console.log(\"added child at : \" + insertPos);\n }\n else {\n dragNode.getChildren().forEach((child, _i) => {\n this._addChild(child, insertPos);\n // console.log(\"added child at : \" + insertPos);\n insertPos++;\n });\n }\n this._model._setActiveTabset(this);\n\n }\n else {\n let tabSet: TabSetNode | undefined;\n if (dragNode instanceof TabNode) {\n // create new tabset parent\n // console.log(\"create a new tabset\");\n tabSet = new TabSetNode(this._model, {});\n tabSet._addChild(dragNode);\n // console.log(\"added child at end\");\n dragParent = tabSet;\n }\n else {\n tabSet = dragNode as TabSetNode;\n }\n\n const parentRow = this._parent as Node;\n const pos = parentRow.getChildren().indexOf(this);\n\n if (parentRow.getOrientation() === dockLocation._orientation) {\n tabSet._setWeight(this.getWeight() / 2);\n this._setWeight(this.getWeight() / 2);\n // console.log(\"added child 50% size at: \" + pos + dockLocation.indexPlus);\n parentRow._addChild(tabSet, pos + dockLocation._indexPlus);\n }\n else {\n // create a new row to host the new tabset (it will go in the opposite direction)\n // console.log(\"create a new row\");\n const newRow = new RowNode(this._model, {});\n newRow._setWeight(this.getWeight());\n newRow._addChild(this);\n this._setWeight(50);\n tabSet._setWeight(50);\n // console.log(\"added child 50% size at: \" + dockLocation.indexPlus);\n newRow._addChild(tabSet, dockLocation._indexPlus);\n\n parentRow._removeChild(this);\n parentRow._addChild(newRow, pos);\n }\n this._model._setActiveTabset(tabSet);\n\n }\n this._model._tidy();\n\n }\n\n /** @hidden @internal */\n _toJson(): any {\n const json: any = {};\n TabSetNode._attributeDefinitions.toJson(json, this._attributes);\n json.children = this._children.map((child) => child._toJson());\n\n if (this.isActive()) {\n json.active = true;\n }\n\n if (this.isMaximized()) {\n json.maximized = true;\n }\n\n return json;\n }\n\n /** @hidden @internal */\n _updateAttrs(json: any) {\n TabSetNode._attributeDefinitions.update(json, this._attributes);\n }\n\n /** @hidden @internal */\n _getAttributeDefinitions() {\n return TabSetNode._attributeDefinitions;\n }\n\n /** @hidden @internal */\n _getPrefSize(orientation: Orientation) {\n let prefSize = this.getWidth();\n if (orientation === Orientation.VERT) {\n prefSize = this.getHeight();\n }\n return prefSize;\n }\n}\n\nexport default TabSetNode;\n","import Attribute from \"../Attribute\";\nimport AttributeDefinitions from \"../AttributeDefinitions\";\nimport DockLocation from \"../DockLocation\";\nimport DropInfo from \"../DropInfo\";\nimport Orientation from \"../Orientation\";\nimport Rect from \"../Rect\";\nimport IDraggable from \"./IDraggable\";\nimport IDropTarget from \"./IDropTarget\";\nimport Model from \"./Model\";\nimport Node from \"./Node\";\nimport SplitterNode from \"./SplitterNode\";\nimport TabNode from \"./TabNode\";\nimport TabSetNode from \"./TabSetNode\";\n\nclass BorderNode extends Node implements IDropTarget {\n static readonly TYPE = \"border\";\n\n /** @hidden @internal */\n static _fromJson(json: any, model: Model) {\n\n const location = DockLocation.getByName(json.location);\n const border = new BorderNode(location, json, model);\n if (json.children) {\n border._children = json.children.map((jsonChild: any) => {\n const child = TabNode._fromJson(jsonChild, model);\n child._setParent(border);\n return child;\n });\n }\n\n return border;\n }\n /** @hidden @internal */\n private static _attributeDefinitions: AttributeDefinitions = BorderNode._createAttributeDefinitions();\n\n /** @hidden @internal */\n private static _createAttributeDefinitions(): AttributeDefinitions {\n\n const attributeDefinitions = new AttributeDefinitions();\n attributeDefinitions.add(\"type\", BorderNode.TYPE, true);\n\n attributeDefinitions.add(\"size\", 200);\n attributeDefinitions.add(\"selected\", -1);\n attributeDefinitions.add(\"show\", true).setType(Attribute.BOOLEAN);\n\n attributeDefinitions.addInherited(\"barSize\", \"borderBarSize\").setType(Attribute.INT).setFrom(0);\n attributeDefinitions.addInherited(\"enableDrop\", \"borderEnableDrop\").setType(Attribute.BOOLEAN);\n attributeDefinitions.addInherited(\"className\", \"borderClassName\").setType(Attribute.STRING);\n return attributeDefinitions;\n }\n\n /** @hidden @internal */\n private _contentRect?: Rect;\n /** @hidden @internal */\n private _tabHeaderRect?: Rect;\n /** @hidden @internal */\n private _location: DockLocation;\n /** @hidden @internal */\n private _drawChildren: Node[];\n /** @hidden @internal */\n private _adjustedSize: number = 0;\n\n /** @hidden @internal */\n constructor(location: DockLocation, json: any, model: Model) {\n super(model);\n\n this._location = location;\n this._drawChildren = [];\n this._attributes.id = `border_${location.getName()}`;\n BorderNode._attributeDefinitions.fromJson(json, this._attributes);\n model._addNode(this);\n }\n\n getLocation() {\n return this._location;\n }\n\n getTabHeaderRect() {\n return this._tabHeaderRect;\n }\n\n getContentRect() {\n return this._contentRect;\n }\n\n isEnableDrop() {\n return this._getAttr(\"enableDrop\") as boolean;\n }\n\n getClassName() {\n return this._getAttributeAsStringOrUndefined(\"className\");\n }\n\n getBorderBarSize() {\n return this._getAttr(\"barSize\") as number;\n }\n\n getSize() {\n return this._attributes.size as number;\n }\n\n getSelected(): number {\n return this._attributes.selected as number;\n }\n\n getSelectedNode(): Node | undefined {\n if (this.getSelected() !== -1) {\n return this._children[this.getSelected()];\n }\n return undefined;\n }\n\n getOrientation() {\n return this._location.getOrientation();\n }\n\n isMaximized() {\n return false;\n }\n\n isShowing() {\n return this._attributes.show as boolean;\n }\n\n /** @hidden @internal */\n _setSelected(index: number) {\n this._attributes.selected = index;\n }\n\n /** @hidden @internal */\n _setSize(pos: number) {\n this._attributes.size = pos;\n }\n\n /** @hidden @internal */\n _updateAttrs(json: any) {\n BorderNode._attributeDefinitions.update(json, this._attributes);\n }\n\n /** @hidden @internal */\n _getDrawChildren() {\n return this._drawChildren;\n }\n\n /** @hidden @internal */\n _setAdjustedSize(size: number) {\n this._adjustedSize = size;\n }\n\n /** @hidden @internal */\n _getAdjustedSize() {\n return this._adjustedSize;\n }\n\n /** @hidden @internal */\n _layoutBorderOuter(outer: Rect) {\n const split1 = this._location.split(outer, this.getBorderBarSize()); // split border outer\n this._tabHeaderRect = split1.start;\n return split1.end;\n }\n\n /** @hidden @internal */\n _layoutBorderInner(inner: Rect) {\n this._drawChildren = [];\n const location = this._location;\n\n const split1 =\n location.split(inner, this._adjustedSize + this._model.getSplitterSize()); // split off tab contents\n const split2 =\n location.reflect().split(split1.start, this._model.getSplitterSize()); // split contents into content and splitter\n\n this._contentRect = split2.end;\n\n this._children.forEach((child, i) => {\n child._layout(this._contentRect!);\n child._setVisible(i === this.getSelected());\n this._drawChildren.push(child);\n });\n\n if (this.getSelected() === -1) {\n return inner;\n } else {\n const newSplitter = new SplitterNode(this._model);\n newSplitter._setParent(this);\n newSplitter._setRect(split2.start);\n this._drawChildren.push(newSplitter);\n\n return split1.end;\n }\n }\n\n /** @hidden @internal */\n _remove(node: TabNode) {\n if (this.getSelected() !== -1) {\n const selectedNode = this._children[this.getSelected()];\n if (node === selectedNode) {\n this._setSelected(-1);\n this._removeChild(node);\n } else {\n this._removeChild(node);\n for (let i = 0; i < this._children.length; i++) {\n if (this._children[i] === selectedNode) {\n this._setSelected(i);\n break;\n }\n }\n }\n } else {\n this._removeChild(node);\n }\n }\n\n /** @hidden @internal */\n canDrop(dragNode: (Node & IDraggable), x: number, y: number): DropInfo | undefined {\n if (dragNode.getType() !== TabNode.TYPE) {\n return undefined;\n }\n\n let dropInfo;\n const dockLocation = DockLocation.CENTER;\n\n if (this._tabHeaderRect!.contains(x, y)) {\n if (this._location._orientation === Orientation.VERT) {\n if (this._children.length > 0) {\n let child = this._children[0];\n let childRect = (child as TabNode).getTabRect()!;\n const childY = childRect.y;\n\n const childHeight = childRect.height;\n\n let pos = this._tabHeaderRect!.x;\n let childCenter = 0;\n for (let i = 0; i < this._children.length; i++) {\n child = this._children[i];\n childRect = (child as TabNode).getTabRect()!;\n childCenter = childRect.x + childRect.width / 2;\n if (x >= pos && x < childCenter) {\n const outlineRect = new Rect(childRect.x - 2, childY, 3, childHeight);\n dropInfo = new DropInfo(this, outlineRect, dockLocation, i, \"layout__outline_rect\");\n break;\n }\n pos = childCenter;\n }\n if (dropInfo == null) {\n const outlineRect = new Rect(childRect.getRight() - 2, childY, 3, childHeight);\n dropInfo = new DropInfo(this, outlineRect, dockLocation, this._children.length, \"layout__outline_rect\");\n }\n } else {\n const outlineRect = new Rect(this._tabHeaderRect!.x + 1, this._tabHeaderRect!.y + 2, 3, 18);\n dropInfo = new DropInfo(this, outlineRect, dockLocation, 0, \"layout__outline_rect\");\n\n }\n } else {\n if (this._children.length > 0) {\n let child = this._children[0];\n let childRect = (child as TabNode).getTabRect()!;\n const childX = childRect.x;\n const childWidth = childRect.width;\n\n let pos = this._tabHeaderRect!.y;\n let childCenter = 0;\n for (let i = 0; i < this._children.length; i++) {\n child = this._children[i];\n childRect = (child as TabNode).getTabRect()!;\n childCenter = childRect.y + childRect.height / 2;\n if (y >= pos && y < childCenter) {\n const outlineRect = new Rect(childX, childRect.y - 2, childWidth, 3);\n dropInfo = new DropInfo(this, outlineRect, dockLocation, i, \"layout__outline_rect\");\n break;\n }\n pos = childCenter;\n }\n if (dropInfo == null) {\n const outlineRect = new Rect(childX, childRect.getBottom() - 2, childWidth, 3);\n dropInfo = new DropInfo(this, outlineRect, dockLocation, this._children.length, \"layout__outline_rect\");\n }\n } else {\n const outlineRect = new Rect(this._tabHeaderRect!.x + 2, this._tabHeaderRect!.y + 1, 18, 3);\n dropInfo = new DropInfo(this, outlineRect, dockLocation, 0, \"layout__outline_rect\");\n }\n\n }\n if (!dragNode._canDockInto(dragNode, dropInfo)) {\n return undefined;\n }\n } else if (this.getSelected() !== -1 && this._contentRect!.contains(x, y)) {\n const outlineRect = this._contentRect;\n dropInfo = new DropInfo(this, outlineRect!, dockLocation, -1, \"layout__outline_rect\");\n if (!dragNode._canDockInto(dragNode, dropInfo)) {\n return undefined;\n }\n }\n\n return dropInfo;\n }\n\n /** @hidden @internal */\n drop(dragNode: (Node & IDraggable), _location: DockLocation, index: number): void {\n let fromIndex = 0;\n const parent: Node | undefined = dragNode.getParent();\n if (parent !== undefined) {\n fromIndex = parent._removeChild(dragNode);\n }\n\n // if dropping a tab back to same tabset and moving to forward position then reduce insertion index\n if (dragNode.getType() === TabNode.TYPE && parent === this && fromIndex < index && index > 0) {\n index--;\n }\n\n // for the tabset/border being removed from set the selected index\n if (parent !== undefined) {\n if (parent instanceof TabSetNode) {\n parent._setSelected(0);\n } else if (parent instanceof BorderNode) {\n if (parent.getSelected() !== -1) {\n if (fromIndex === parent.getSelected() && parent._children.length > 0) {\n parent._setSelected(0);\n } else if (fromIndex < parent.getSelected()) {\n parent._setSelected(parent.getSelected() - 1);\n } else if (fromIndex > parent.getSelected()) {\n // leave selected index as is\n } else {\n parent._setSelected(-1);\n }\n }\n }\n }\n\n // simple_bundled dock to existing tabset\n let insertPos = index;\n if (insertPos === -1) {\n insertPos = this._children.length;\n }\n\n if (dragNode.getType() === TabNode.TYPE) {\n this._addChild(dragNode, insertPos);\n }\n\n if (this.getSelected() !== -1) { // already open\n this._setSelected(insertPos);\n }\n\n this._model._tidy();\n }\n\n /** @hidden @internal */\n _toJson() {\n const json: any = {};\n BorderNode._attributeDefinitions.toJson(json, this._attributes);\n json.location = this._location.getName();\n json.children = this._children.map((child) => (child as TabNode)._toJson());\n return json;\n }\n\n /** @hidden @internal */\n _getSplitterBounds(splitter: SplitterNode) {\n const pBounds = [0, 0];\n const outerRect = this._model._getOuterInnerRects().outer;\n const innerRect = this._model._getOuterInnerRects().inner;\n if (this._location === DockLocation.TOP) {\n pBounds[0] = outerRect.y;\n pBounds[1] = innerRect.getBottom() - splitter.getHeight();\n } else if (this._location === DockLocation.LEFT) {\n pBounds[0] = outerRect.x;\n pBounds[1] = innerRect.getRight() - splitter.getWidth();\n } else if (this._location === DockLocation.BOTTOM) {\n pBounds[0] = innerRect.y;\n pBounds[1] = outerRect.getBottom() - splitter.getHeight();\n } else if (this._location === DockLocation.RIGHT) {\n pBounds[0] = innerRect.x;\n pBounds[1] = outerRect.getRight() - splitter.getWidth();\n }\n return pBounds;\n }\n\n /** @hidden @internal */\n _calculateSplit(splitter: SplitterNode, splitterPos: number) {\n const pBounds = this._getSplitterBounds(splitter);\n if (this._location === DockLocation.BOTTOM || this._location === DockLocation.RIGHT) {\n return Math.max(0, pBounds[1] - splitterPos);\n } else {\n return Math.max(0, splitterPos - pBounds[0]);\n }\n }\n\n /** @hidden @internal */\n _getAttributeDefinitions() {\n return BorderNode._attributeDefinitions;\n }\n}\n\n\nexport default BorderNode;\n","import DropInfo from \"../DropInfo\";\nimport Orientation from \"../Orientation\";\nimport Rect from \"../Rect\";\nimport BorderNode from \"./BorderNode\";\nimport IDraggable from \"./IDraggable\";\nimport Model from \"./Model\";\nimport Node from \"./Node\";\n\nclass BorderSet {\n\n /** @hidden @internal */\n static _fromJson(json: any, model: Model) {\n const borderSet = new BorderSet(model);\n borderSet._borders = json.map((borderJson: any) => BorderNode._fromJson(borderJson, model));\n return borderSet;\n }\n /** @hidden @internal */\n private _model: Model;\n /** @hidden @internal */\n private _borders: BorderNode[];\n\n /** @hidden @internal */\n constructor(model: Model) {\n this._model = model;\n this._borders = [];\n }\n\n getBorders() {\n return this._borders;\n }\n\n /** @hidden @internal */\n _forEachNode(fn: (node: Node, level: number) => void) {\n this._borders.forEach((borderNode) => {\n fn(borderNode, 0);\n borderNode.getChildren().forEach((node) => {\n node._forEachNode(fn, 1);\n });\n });\n }\n\n /** @hidden @internal */\n _toJson() {\n return this._borders.map((borderNode) => borderNode._toJson());\n }\n\n /** @hidden @internal */\n _layoutBorder(outerInnerRects: { inner: Rect, outer: Rect }) {\n\n const rect = outerInnerRects.outer;\n const height = rect.height;\n const width = rect.width;\n let sumHeight = 0;\n let sumWidth = 0;\n let adjustableHeight = 0;\n let adjustableWidth = 0;\n\n const showingBorders = this._borders.filter((border) => border.isShowing());\n\n // sum size of borders to see they will fit\n for (const border of showingBorders) {\n if (border.isShowing()) {\n border._setAdjustedSize(border.getSize());\n const visible = border.getSelected() !== -1;\n if (border.getLocation().getOrientation() === Orientation.HORZ) {\n sumWidth += border.getBorderBarSize() + this._model.getSplitterSize();\n if (visible) {\n sumWidth += border.getSize();\n adjustableWidth += border.getSize();\n }\n }\n else {\n sumHeight += border.getBorderBarSize() + this._model.getSplitterSize();\n if (visible) {\n sumHeight += border.getSize();\n adjustableHeight += border.getSize();\n }\n }\n }\n }\n\n // adjust border sizes if too large\n let j = 0;\n while ((sumWidth > width && adjustableWidth > 0)\n || (sumHeight > height && adjustableHeight > 0)) {\n const border = showingBorders[j];\n if (border.getSelected() !== -1) { // visible\n const size = border._getAdjustedSize();\n if (sumWidth > width && adjustableWidth > 0\n && border.getLocation().getOrientation() === Orientation.HORZ\n && size > 0) {\n border._setAdjustedSize(size - 1);\n sumWidth--;\n adjustableWidth--;\n }\n else if (sumHeight > height && adjustableHeight > 0\n && border.getLocation().getOrientation() === Orientation.VERT\n && size > 0) {\n border._setAdjustedSize(size - 1);\n sumHeight--;\n adjustableHeight--;\n }\n }\n j = (j + 1) % showingBorders.length;\n }\n\n showingBorders.forEach((border) => {\n outerInnerRects.outer = border._layoutBorderOuter(outerInnerRects.outer);\n });\n\n outerInnerRects.inner = outerInnerRects.outer;\n\n showingBorders.forEach((border) => {\n outerInnerRects.inner = border._layoutBorderInner(outerInnerRects.inner);\n });\n return outerInnerRects;\n }\n\n /** @hidden @internal */\n _findDropTargetNode(dragNode: (Node & IDraggable), x: number, y: number): DropInfo | undefined {\n for (const border of this._borders) {\n if (border.isShowing()) {\n const dropInfo = border.canDrop(dragNode, x, y);\n if (dropInfo !== undefined) {\n return dropInfo;\n }\n }\n }\n return undefined;\n }\n}\n\nexport default BorderSet;\n","import Attribute from \"../Attribute\";\nimport AttributeDefinitions from \"../AttributeDefinitions\";\nimport DockLocation from \"../DockLocation\";\nimport DropInfo from \"../DropInfo\";\nimport Orientation from \"../Orientation\";\nimport Rect from \"../Rect\";\nimport { JSMap } from \"../Types\";\nimport Action from \"./Action\";\nimport Actions from \"./Actions\";\nimport BorderNode from \"./BorderNode\";\nimport BorderSet from \"./BorderSet\";\nimport IDraggable from \"./IDraggable\";\nimport IDropTarget from \"./IDropTarget\";\nimport Node from \"./Node\";\nimport RowNode from \"./RowNode\";\nimport TabNode from \"./TabNode\";\nimport TabSetNode from \"./TabSetNode\";\n\n/**\n * Class containing the Tree of Nodes used by the FlexLayout component\n */\nclass Model {\n\n /**\n * Loads the model from the given json object\n * @param json the json model to load\n * @returns {Model} a new Model object\n */\n static fromJson(json: any) {\n const model = new Model();\n Model._attributeDefinitions.fromJson(json.global, model._attributes);\n\n if (json.borders) {\n model._borders = BorderSet._fromJson(json.borders, model);\n }\n model._root = RowNode._fromJson(json.layout, model);\n model._tidy(); // initial tidy of node tree\n return model;\n }\n /** @hidden @internal */\n private static _attributeDefinitions: AttributeDefinitions = Model._createAttributeDefinitions();\n\n /** @hidden @internal */\n private static _createAttributeDefinitions(): AttributeDefinitions {\n const attributeDefinitions = new AttributeDefinitions();\n // splitter\n attributeDefinitions.add(\"splitterSize\", 8).setType(Attribute.INT).setFrom(1);\n attributeDefinitions.add(\"enableEdgeDock\", true).setType(Attribute.BOOLEAN);\n attributeDefinitions.add(\"marginInsets\", { top: 0, right: 0, bottom: 0, left: 0 }).setType(Attribute.JSON);\n\n // tab\n attributeDefinitions.add(\"tabEnableClose\", true).setType(Attribute.BOOLEAN);\n attributeDefinitions.add(\"tabEnableDrag\", true).setType(Attribute.BOOLEAN);\n attributeDefinitions.add(\"tabEnableRename\", true).setType(Attribute.BOOLEAN);\n attributeDefinitions.add(\"tabClassName\", undefined).setType(Attribute.STRING);\n attributeDefinitions.add(\"tabIcon\", undefined).setType(Attribute.STRING);\n attributeDefinitions.add(\"tabEnableRenderOnDemand\", true).setType(Attribute.BOOLEAN);\n attributeDefinitions.add(\"tabDragSpeed\", 0.3).setType(Attribute.NUMBER);\n\n // tabset\n attributeDefinitions.add(\"tabSetEnableDeleteWhenEmpty\", true).setType(Attribute.BOOLEAN);\n attributeDefinitions.add(\"tabSetEnableDrop\", true).setType(Attribute.BOOLEAN);\n attributeDefinitions.add(\"tabSetEnableDrag\", true).setType(Attribute.BOOLEAN);\n attributeDefinitions.add(\"tabSetEnableDivide\", true).setType(Attribute.BOOLEAN);\n attributeDefinitions.add(\"tabSetEnableMaximize\", true).setType(Attribute.BOOLEAN);\n attributeDefinitions.add(\"tabSetClassNameTabStrip\", undefined).setType(Attribute.STRING);\n attributeDefinitions.add(\"tabSetClassNameHeader\", undefined).setType(Attribute.STRING);\n attributeDefinitions.add(\"tabSetEnableTabStrip\", true).setType(Attribute.BOOLEAN);\n attributeDefinitions.add(\"tabSetHeaderHeight\", 20).setType(Attribute.INT).setFrom(0);\n attributeDefinitions.add(\"tabSetTabStripHeight\", 20).setType(Attribute.INT).setFrom(0);\n attributeDefinitions.add(\"tabSetMarginInsets\", { top: 0, right: 0, bottom: 0, left: 0 }).setType(Attribute.JSON);\n attributeDefinitions.add(\"tabSetBorderInsets\", { top: 0, right: 0, bottom: 0, left: 0 }).setType(Attribute.JSON);\n\n attributeDefinitions.add(\"borderBarSize\", 25);\n attributeDefinitions.add(\"borderEnableDrop\", true).setType(Attribute.BOOLEAN);\n attributeDefinitions.add(\"borderClassName\", undefined).setType(Attribute.STRING);\n return attributeDefinitions;\n }\n\n /** @hidden @internal */\n private _attributes: JSMap;\n /** @hidden @internal */\n private _idMap: JSMap;\n /** @hidden @internal */\n private _nextId: number;\n /** @hidden @internal */\n private _changeListener?: (() => void);\n /** @hidden @internal */\n private _root?: RowNode;\n /** @hidden @internal */\n private _borders: BorderSet;\n /** @hidden @internal */\n private _onAllowDrop?: (dragNode: (Node), dropInfo: DropInfo) => boolean;\n /** @hidden @internal */\n private _maximizedTabSet?: TabSetNode;\n /** @hidden @internal */\n private _activeTabSet?: TabSetNode;\n /** @hidden @internal */\n private _borderRects: { inner: Rect, outer: Rect } = { inner: Rect.empty(), outer: Rect.empty() };\n\n /**\n * 'private' constructor. Use the static method Model.fromJson(json) to create a model\n * @hidden @internal\n */\n\n private constructor() {\n this._attributes = {};\n this._idMap = {};\n this._nextId = 0;\n this._borders = new BorderSet(this);\n }\n\n /** @hidden @internal */\n _setChangeListener(listener: (() => void) | undefined) {\n this._changeListener = listener;\n }\n\n\n /**\n * Get the currently active tabset node\n */\n getActiveTabset() {\n return this._activeTabSet;\n }\n\n /** @hidden @internal */\n _setActiveTabset(tabsetNode: TabSetNode) {\n this._activeTabSet = tabsetNode;\n }\n\n /**\n * Get the currently maximized tabset node\n */\n getMaximizedTabset() {\n return this._maximizedTabSet;\n }\n\n /** @hidden @internal */\n _setMaximizedTabset(tabsetNode: TabSetNode) {\n this._maximizedTabSet = tabsetNode;\n }\n\n /**\n * Gets the root RowNode of the model\n * @returns {RowNode}\n */\n getRoot() {\n return this._root as RowNode;\n }\n\n /**\n * Gets the\n * @returns {BorderSet|*}\n */\n getBorderSet() {\n return this._borders;\n }\n\n /** @hidden @internal */\n _getOuterInnerRects() {\n return this._borderRects;\n }\n\n /**\n * Visits all the nodes in the model and calls the given function for each\n * @param fn a function that takes visited node and a integer level as parameters\n */\n visitNodes(fn: (node: Node, level: number) => void) {\n this._borders._forEachNode(fn);\n (this._root as RowNode)._forEachNode(fn, 0);\n }\n\n /**\n * Gets a node by its id\n * @param id the id to find\n */\n getNodeById(id: string) {\n return this._idMap[id];\n }\n\n /**\n * Update the node tree by performing the given action,\n * Actions should be generated via static methods on the Actions class\n * @param action the action to perform\n */\n doAction(action: Action) {\n // console.log(action);\n switch (action.type) {\n case Actions.ADD_NODE:\n {\n const newNode = new TabNode(this, action.data.json);\n const toNode = this._idMap[action.data.toNode] as (Node & IDraggable);\n if (toNode instanceof TabSetNode || toNode instanceof BorderNode || toNode instanceof RowNode) {\n toNode.drop(newNode, DockLocation.getByName(action.data.location), action.data.index);\n }\n break;\n }\n case Actions.MOVE_NODE:\n {\n const fromNode = this._idMap[action.data.fromNode] as (Node & IDraggable);\n if (fromNode instanceof TabNode || fromNode instanceof TabSetNode) {\n const toNode = this._idMap[action.data.toNode] as (Node & IDropTarget);\n if (toNode instanceof TabSetNode || toNode instanceof BorderNode || toNode instanceof RowNode) {\n toNode.drop(fromNode, DockLocation.getByName(action.data.location), action.data.index);\n }\n }\n break;\n }\n case Actions.DELETE_TAB:\n {\n const node = this._idMap[action.data.node];\n if (node instanceof TabNode) {\n delete this._idMap[action.data.node];\n node._delete();\n }\n break;\n }\n case Actions.RENAME_TAB:\n {\n const node = this._idMap[action.data.node];\n if (node instanceof TabNode) {\n node._setName(action.data.text);\n }\n break;\n }\n case Actions.SELECT_TAB:\n {\n const tabNode = this._idMap[action.data.tabNode];\n if (tabNode instanceof TabNode) {\n const parent = tabNode.getParent() as Node;\n const pos = parent.getChildren().indexOf(tabNode);\n\n if (parent instanceof BorderNode) {\n if (parent.getSelected() === pos) {\n parent._setSelected(-1);\n }\n else {\n parent._setSelected(pos);\n }\n\n }\n else if (parent instanceof TabSetNode) {\n if (parent.getSelected() !== pos) {\n parent._setSelected(pos);\n }\n this._activeTabSet = parent;\n }\n }\n break;\n }\n case Actions.SET_ACTIVE_TABSET:\n {\n const tabsetNode = this._idMap[action.data.tabsetNode];\n if (tabsetNode instanceof TabSetNode) {\n this._activeTabSet = tabsetNode;\n }\n break;\n }\n case Actions.ADJUST_SPLIT:\n {\n const node1 = this._idMap[action.data.node1];\n const node2 = this._idMap[action.data.node2];\n\n if ((node1 instanceof TabSetNode || node1 instanceof RowNode) &&\n (node2 instanceof TabSetNode || node2 instanceof RowNode)) {\n this._adjustSplitSide(node1, action.data.weight1, action.data.pixelWidth1);\n this._adjustSplitSide(node2, action.data.weight2, action.data.pixelWidth2);\n }\n break;\n }\n case Actions.ADJUST_BORDER_SPLIT:\n {\n const node = this._idMap[action.data.node];\n if (node instanceof BorderNode) {\n node._setSize(action.data.pos);\n }\n break;\n }\n case Actions.MAXIMIZE_TOGGLE:\n {\n const node = this._idMap[action.data.node];\n if (node instanceof TabSetNode) {\n if (node === this._maximizedTabSet) {\n this._maximizedTabSet = undefined;\n } else {\n this._maximizedTabSet = node;\n this._activeTabSet = node;\n }\n }\n\n break;\n }\n case Actions.UPDATE_MODEL_ATTRIBUTES:\n {\n this._updateAttrs(action.data.json);\n break;\n }\n\n case Actions.UPDATE_NODE_ATTRIBUTES:\n {\n const node = this._idMap[action.data.node];\n node._updateAttrs(action.data.json);\n break;\n }\n default:\n break;\n }\n\n this._updateIdMap();\n\n if (this._changeListener !== undefined) {\n this._changeListener();\n }\n }\n\n /** @hidden @internal */\n _updateIdMap() {\n // regenerate idMap to stop it building up\n this._idMap = {};\n this.visitNodes((node) => this._idMap[node.getId()] = node);\n // console.log(JSON.stringify(Object.keys(this._idMap)));\n }\n\n /** @hidden @internal */\n _adjustSplitSide(node: (TabSetNode | RowNode), weight: number, pixels: number) {\n node._setWeight(weight);\n if (node.getWidth() != null && node.getOrientation() === Orientation.VERT) {\n node._updateAttrs({ width: pixels });\n }\n else if (node.getHeight() != null && node.getOrientation() === Orientation.HORZ) {\n node._updateAttrs({ height: pixels });\n }\n }\n\n /**\n * Converts the model to a json object\n * @returns {*} json object that represents this model\n */\n toJson() {\n const json: any = { global: {}, layout: {} };\n Model._attributeDefinitions.toJson(json.global, this._attributes);\n\n // save state of nodes\n this.visitNodes((node) => {\n node._fireEvent(\"save\", undefined);\n });\n\n json.borders = this._borders._toJson();\n json.layout = (this._root as RowNode)._toJson();\n return json;\n }\n\n getSplitterSize() {\n return this._attributes.splitterSize as number;\n }\n\n isEnableEdgeDock() {\n return this._attributes.enableEdgeDock as boolean;\n }\n\n /** @hidden @internal */\n _addNode(node: Node) {\n const id = node.getId();\n if (this._idMap[id] !== undefined) {\n throw new Error(`Error: each node must have a unique id, duplicate id:${node.getId()}`);\n }\n\n if (node.getType() !== \"splitter\") {\n this._idMap[id] = node;\n }\n }\n\n /** @hidden @internal */\n _layout(rect: Rect) {\n // let start = Date.now();\n this._borderRects = this._borders._layoutBorder({ outer: rect, inner: rect });\n rect = this._borderRects.inner.removeInsets(this._getAttribute(\"marginInsets\"));\n\n (this._root as RowNode)._layout(rect);\n return rect;\n // console.log(\"layout time: \" + (Date.now() - start));\n }\n\n /** @hidden @internal */\n _findDropTargetNode(dragNode: (Node & IDraggable), x: number, y: number) {\n let node = (this._root as RowNode)._findDropTargetNode(dragNode, x, y);\n if (node === undefined) {\n node = this._borders._findDropTargetNode(dragNode, x, y);\n }\n return node;\n }\n\n /** @hidden @internal */\n _tidy() {\n // console.log(\"before _tidy\", this.toString());\n (this._root as RowNode)._tidy();\n // console.log(\"after _tidy\", this.toString());\n }\n\n /** @hidden @internal */\n _updateAttrs(json: any) {\n Model._attributeDefinitions.update(json, this._attributes);\n }\n\n /** @hidden @internal */\n _nextUniqueId() {\n this._nextId++;\n while (this._idMap[\"#\" + this._nextId] !== undefined) {\n this._nextId++;\n }\n\n return \"#\" + this._nextId;\n }\n\n /** @hidden @internal */\n _getAttribute(name: string): any {\n return this._attributes[name];\n }\n\n /**\n * Sets a function to allow/deny dropping a node\n * @param onAllowDrop function that takes the drag node and DropInfo and returns true if the drop is allowed\n */\n setOnAllowDrop(onAllowDrop: (dragNode: Node, dropInfo: DropInfo) => boolean) {\n this._onAllowDrop = onAllowDrop;\n }\n\n /** @hidden @internal */\n _getOnAllowDrop() {\n return this._onAllowDrop;\n }\n\n toString() {\n return JSON.stringify(this.toJson());\n }\n}\n\nexport default Model;\n","import * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { I18nLabel } from \"../I18nLabel\";\nimport Actions from \"../model/Actions\";\nimport BorderNode from \"../model/BorderNode\";\nimport TabNode from \"../model/TabNode\";\nimport Rect from \"../Rect\";\nimport FlexLayout from \"./FlexLayout\";\n\n\nimport { Icon, IconName } from \"@blueprintjs/core\";\n\n\n/** @hidden @internal */\nexport interface IBorderButtonProps {\n layout: FlexLayout;\n node: TabNode;\n selected: boolean;\n border: string;\n}\n\n/** @hidden @internal */\nexport class BorderButton extends React.Component {\n selfRef?: HTMLDivElement;\n contentsRef?: HTMLDivElement;\n\n onMouseDown = (event: React.MouseEvent | React.TouchEvent) => {\n const message = this.props.layout.i18nName(I18nLabel.Move_Tab, this.props.node.getName());\n this.props.layout.dragStart(\n event,\n message,\n this.props.node, this.props.node.isEnableDrag(),\n this.onClick,\n (_event2: Event) => undefined\n );\n }\n\n onClick = () => {\n const node = this.props.node;\n this.props.layout.doAction(Actions.selectTab(node.getId()));\n }\n\n onClose = (_event: React.MouseEvent) => {\n const node = this.props.node;\n this.props.layout.doAction(Actions.deleteTab(node.getId()));\n }\n\n onCloseMouseDown = (event: React.MouseEvent | React.TouchEvent) => {\n event.stopPropagation();\n }\n\n componentDidMount() {\n this.updateRect();\n }\n\n componentDidUpdate() {\n this.updateRect();\n }\n\n updateRect() {\n // record position of tab in border\n const clientRect = (ReactDOM.findDOMNode(this.props.layout) as Element).getBoundingClientRect();\n const r = (this.selfRef as Element).getBoundingClientRect();\n this.props.node._setTabRect(new Rect(r.left - clientRect.left, r.top - clientRect.top, r.width, r.height));\n }\n\n render() {\n const cm = this.props.layout.getClassName;\n const parent = this.props.node.getParent() as BorderNode;\n let classNames = cm(\"layout__border_button\") + \" \" +\n cm(\"layout__border_button_\" + this.props.border);\n const node = this.props.node;\n\n if (this.props.selected) {\n classNames += \" \" + cm(\"layout__border_button--selected\");\n }\n else {\n classNames += \" \" + cm(\"layout__border_button--unselected\");\n }\n\n if (this.props.node.getClassName() !== undefined) {\n classNames += \" \" + this.props.node.getClassName();\n }\n\n let leadingContent;\n\n if (node.getIcon() !== undefined) {\n leadingContent = ;\n }\n\n\n\n // allow customization of leading contents (icon) and contents\n const renderState = { leading: leadingContent, content: node.getName() };\n this.props.layout.customizeTab(node, renderState);\n\n const content =
this.contentsRef = (ref === null) ? undefined : ref} className={cm(\"layout__border_button_content\")}>{renderState.content}
;\n\n let leading = null;\n\n if (renderState.leading) {\n leading =
{renderState.leading}
;\r\n }\n\n let closeButton;\n if (this.props.node.isEnableClose()) {\n closeButton =
;\n }\n return
this.selfRef = (ref === null) ? undefined : ref}\n style={{}}\n className={classNames}\n onMouseDown={this.onMouseDown}\n onTouchStart={this.onMouseDown}>\n {leading}\n {\n parent.getClassName() !== \"border_right\"\n &&\n closeButton\n }\n {content}\n {\n parent.getClassName() === \"border_right\"\n &&\n closeButton\n }\n
;\n }\n}\n\n// export default BorderButton;\n","import * as React from \"react\";\nimport DockLocation from \"../DockLocation\";\nimport Border from \"../model/BorderNode\";\nimport TabNode from \"../model/TabNode\";\nimport {BorderButton} from \"./BorderButton\";\nimport FlexLayout from \"./FlexLayout\";\n\n/** @hidden @internal */\nexport interface IBorderTabSetProps {\n border:Border;\n layout:FlexLayout;\n}\n\n/** @hidden @internal */\nexport class BorderTabSet extends React.Component {\n toolbarRef?: HTMLDivElement;\n\n render() {\n const cm = this.props.layout.getClassName;\n const border = this.props.border;\n const style = border.getTabHeaderRect()!.styleWithPosition({});\n if (border.getLocation().getName() === \"bottom\") {\n style.width = `${parseInt(style.width, 10) + 12}px`;\n } else if(border.getLocation().getName() === \"left\") {\n style.height = `${parseInt(style.height, 10) + 6}px`;\n\n } else if(border.getLocation().getName() === \"right\") {\n style.height = `${parseInt(style.height, 10) + 6}px`;\n\n }\n\n const tabs = [];\n if (border.getLocation() !== DockLocation.LEFT) {\n for (let i = 0; i < border.getChildren().length; i++) {\n const isSelected = border.getSelected() === i;\n const child = border.getChildren()[i] as TabNode;\n tabs.push();\n }\n }\n else {\n for (let i = border.getChildren().length - 1; i >= 0; i--) {\n const isSelected = border.getSelected() === i;\n const child = border.getChildren()[i] as TabNode;\n tabs.push();\n }\n }\n\n let borderClasses = cm(\"layout__border_\" + border.getLocation().getName());\n if (this.props.border.getClassName() !== undefined) {\n borderClasses += \" \" + this.props.border.getClassName();\n }\n\n // allow customization of tabset right/bottom buttons\n let buttons:any[] = [];\n const renderState = {headerContent:{}, buttons};\n this.props.layout.customizeTabSet(border, renderState);\n buttons = renderState.buttons;\n\n const toolbar = this.toolbarRef = (toolbar2===null)?undefined:toolbar2}\n className={cm(\"layout__border_toolbar_\" + border.getLocation().getName())}>\n {buttons}\n ;\n\n return \n
\n {tabs}\n
\n {toolbar}\n ;\n }\n}\n\nexport default BorderTabSet;","import * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport DragDrop from \"../DragDrop\";\nimport Actions from \"../model/Actions\";\nimport BorderNode from \"../model/BorderNode\";\nimport Node from \"../model/Node\";\nimport RowNode from \"../model/RowNode\";\nimport SplitterNode from \"../model/SplitterNode\";\nimport Orientation from \"../Orientation\";\nimport FlexLayout from \"./FlexLayout\";\n\n/** @hidden @internal */\nexport interface ISplitterProps {\n layout: FlexLayout;\n node: SplitterNode;\n}\n\n/** @hidden @internal */\nexport class Splitter extends React.Component {\n\n pBounds?: number[];\n outlineDiv?: HTMLDivElement;\n\n onMouseDown = (event: Event | React.MouseEvent | React.TouchEvent) => {\n DragDrop.instance.startDrag(event, this.onDragStart, this.onDragMove, this.onDragEnd, this.onDragCancel);\n const parentNode = this.props.node.getParent() as RowNode;\n this.pBounds = parentNode._getSplitterBounds(this.props.node);\n const rootdiv = ReactDOM.findDOMNode(this.props.layout) as Element;\n this.outlineDiv = document.createElement(\"div\");\n this.outlineDiv.style.position = \"absolute\";\n this.outlineDiv.className = this.props.layout.getClassName(\"layout__splitter_drag\");\n this.outlineDiv.style.cursor = this.props.node.getOrientation() === Orientation.HORZ ? \"ns-resize\" : \"ew-resize\";\n this.props.node.getRect().positionElement(this.outlineDiv);\n rootdiv.appendChild(this.outlineDiv);\n }\n\n onDragCancel = (_wasDragging: boolean) => {\n const rootdiv = ReactDOM.findDOMNode(this.props.layout) as Element;\n rootdiv.removeChild(this.outlineDiv as Element);\n }\n\n onDragStart = () => {\n\n return true;\n }\n\n onDragMove = (event: React.MouseEvent) => {\n const clientRect = (ReactDOM.findDOMNode(this.props.layout) as Element).getBoundingClientRect();\n const pos = {\n x: event.clientX - clientRect.left,\n y: event.clientY - clientRect.top\n };\n\n const outlineDiv = this.outlineDiv as HTMLDivElement;\n\n if (this.props.node.getOrientation() === Orientation.HORZ) {\n outlineDiv.style.top = this.getBoundPosition(pos.y - 4) + \"px\";\n }\n else {\n outlineDiv.style.left = this.getBoundPosition(pos.x - 4) + \"px\";\n }\n }\n\n onDragEnd = () => {\n const node = this.props.node;\n const parentNode = node.getParent() as RowNode;\n let value = 0;\n const outlineDiv = this.outlineDiv as HTMLDivElement;\n if (node.getOrientation() === Orientation.HORZ) {\n value = outlineDiv.offsetTop;\n }\n else {\n value = outlineDiv.offsetLeft;\n }\n\n if (parentNode instanceof BorderNode) {\n const pos = (parentNode as BorderNode)._calculateSplit(node, value);\n this.props.layout.doAction(Actions.adjustBorderSplit((node.getParent() as Node).getId(), pos));\n }\n else {\n const splitSpec = parentNode._calculateSplit(this.props.node, value);\n if (splitSpec !== undefined) {\n this.props.layout.doAction(Actions.adjustSplit(splitSpec));\n }\n }\n\n const rootdiv = ReactDOM.findDOMNode(this.props.layout) as Element;\n rootdiv.removeChild(this.outlineDiv as HTMLDivElement);\n }\n\n getBoundPosition(p: number) {\n const bounds = this.pBounds as number[];\n let rtn = p;\n if (p < bounds[0]) {\n rtn = bounds[0];\n }\n if (p > bounds[1]) {\n rtn = bounds[1];\n }\n\n return rtn;\n }\n\n render() {\n const cm = this.props.layout.getClassName;\n\n const node = this.props.node;\n const style = node._styleWithPosition(\n {\n cursor: this.props.node.getOrientation() === Orientation.HORZ ? \"ns-resize\" : \"ew-resize\"\n }\n );\n return ;\n }\n}\n\nexport default Splitter;\n","import * as React from \"react\";\nimport Actions from \"../model/Actions\";\nimport TabNode from \"../model/TabNode\";\nimport TabSetNode from \"../model/TabSetNode\";\nimport { JSMap } from \"../Types\";\nimport FlexLayout from \"./FlexLayout\";\n\n/** @hidden @internal */\nexport interface ITabProps {\n layout: FlexLayout;\n selected: boolean;\n node: TabNode;\n factory: (node: TabNode) => React.ReactNode;\n}\n\n/** @hidden @internal */\nexport class Tab extends React.Component {\n\n constructor(props: ITabProps) {\n super(props);\n this.state = { renderComponent: !props.node.isEnableRenderOnDemand() || props.selected };\n }\n\n componentDidMount() {\n // console.log(\"mount \" + this.props.node.getName());\n }\n\n componentWillUnmount() {\n // console.log(\"unmount \" + this.props.node.getName());\n }\n\n componentWillReceiveProps(newProps: ITabProps) {\n if (!this.state.renderComponent && newProps.selected) {\n // load on demand\n // console.log(\"load on demand: \" + this.props.node.getName());\n this.setState({ renderComponent: true });\n }\n }\n\n onMouseDown = () => {\n const parent = this.props.node.getParent() as TabSetNode;\n if (parent.getType() === TabSetNode.TYPE) {\n if (!parent.isActive()) {\n this.props.layout.doAction(Actions.setActiveTabset(parent.getId()));\n }\n }\n }\n\n render() {\n const cm = this.props.layout.getClassName;\n const node = this.props.node;\n const classes = node.getClassName();\n const parentNode = node.getParent() as TabSetNode;\n const nodeId = parentNode.getId();\n const flexlayoutBorderInnerBottom : HTMLElement | null = document.querySelector(\".layout__border_inner_bottom\");\n const flexlayoutTabBorderBottom : HTMLElement | null = document.querySelector(\".layout__tab-border_bottom\");\n const style: JSMap = node._styleWithPosition({\n display: this.props.selected ? \"block\" : \"none\"\n });\n if (nodeId === \"border_bottom\") {\n style.borderRadius = \"3px 3px 0px 0px\";\n }\n if (nodeId === \"border_left\") {\n style.borderRadius = \"0px 3px 3px 0px\";\n }\n if (nodeId === \"border_right\") {\n style.borderRadius = \"3px 0px 0px 3px\";\n }\n if (parentNode.isMaximized()) {\n style.zIndex = 100;\n }\n if(flexlayoutTabBorderBottom !== null) {\n const left:any = flexlayoutTabBorderBottom.style.left;\n if (flexlayoutBorderInnerBottom !== null && parseInt(style.left, 10) >= 25) {\n flexlayoutBorderInnerBottom.style.paddingLeft = `${parseInt(left, 10) - 25}px`;\n }\n }\n\n let child;\n if (this.state.renderComponent) {\n child = this.props.factory(node);\n }\n\n return
{child}\n
;\n }\n}\n\nexport default Tab;\n","import * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport TabNode from \"./model/TabNode\";\n\n/** @hidden @internal */\nexport interface IPopupMenuProps {\n element: Element;\n items: Array<{ index: number, node: TabNode, name: string }>;\n onHide: () => void;\n onSelect: (item: { index: number, node: TabNode, name: string }) => void;\n classNameMapper: (defaultClassName: string) => string;\n}\n\n/** @hidden @internal */\nclass PopupMenu extends React.Component {\n\n static show(triggerElement: Element,\n items: Array<{ index: number, node: TabNode, name: string }>,\n onSelect: (item: { index: number, node: TabNode, name: string }) => void,\n classNameMapper: (defaultClassName: string) => string) {\n\n const triggerRect = triggerElement.getBoundingClientRect();\n const docRect = document.body.getBoundingClientRect();\n\n const elm = document.createElement(\"div\");\n elm.className = classNameMapper(\"layout__popup_menu_container\");\n elm.style.right = (docRect.right - triggerRect.right) + \"px\";\n elm.style.top = triggerRect.bottom + \"px\";\n document.body.appendChild(elm);\n\n const onHide = () => {\n ReactDOM.unmountComponentAtNode(elm);\n document.body.removeChild(elm);\n };\n\n ReactDOM.render(, elm);\n }\n\n items: Array<{ index: number, name: string }> = [];\n hidden: boolean = true;\n elm?: Element;\n\n\n constructor(props: IPopupMenuProps) {\n super(props);\n this.onDocMouseUp = this.onDocMouseUp;\n this.hidden = false;\n }\n\n componentDidMount() {\n document.addEventListener(\"mouseup\", this.onDocMouseUp);\n }\n\n componentWillUnmount() {\n document.removeEventListener(\"mouseup\", this.onDocMouseUp);\n }\n\n onDocMouseUp = (_event: Event) => {\n setTimeout(() => {\n this.hide();\n }, 0);\n }\n\n hide() {\n if (!this.hidden) {\n this.props.onHide();\n this.hidden = true;\n }\n }\n\n onItemClick(item: { index: number, node: TabNode, name: string }, event: React.MouseEvent) {\n this.props.onSelect(item);\n this.hide();\n event.stopPropagation();\n }\n\n render() {\n const items = this.props.items.map(item =>
{item.name}
);\n\n return
\n {items}\n
;\n }\n}\n\n/** @hidden @internal */\nexport default PopupMenu;\n","import * as React from \"react\";\n\nimport { Button, Menu, MenuItem, Popover, Position, IconName } from \"@blueprintjs/core\";\nimport Actions from \"../model/Actions\";\nimport TabNode from \"../model/TabNode\";\nimport TabSetNode from \"../model/TabSetNode\";\nimport FlexLayout from \"./FlexLayout\";\n\nexport interface ITabButtonProps {\n node: TabNode;\n layout: FlexLayout;\n}\nexport class DropdownMenu extends React.PureComponent {\n closeTab = ():void => {\n const node = this.props.node;\n this.props.layout.doAction(Actions.deleteTab(node.getId()));\n }\n maxTab = ():void => {\n const parentNode = this.props.node.getParent() as TabSetNode;\n if (parentNode.isEnableMaximize()) {\n this.props.layout.maximize(parentNode);\n }\n }\n\n render() {\n\n let icon = this.props.node.getIcon();\n\n if (icon == undefined) {\n icon = \"application\";\r\n }\n const parentNode = this.props.node.getParent() as TabSetNode;\n\n const isEnableMaximize = parentNode && parentNode.isEnableMaximize();\n const isEnableClose = this.props.node.isEnableClose();\n\n if (isEnableMaximize && isEnableClose) {\n const exampleMenu = (\n \n {this.props.node.isEnableClose() && }\n \n \n );\n return (\n \n );\n }\n toolbar =
this.toolbarRef = (ref === null) ? undefined : ref} className={cm(\"layout__tab_toolbar\")}\n onMouseDown={this.onInterceptMouseDown}>\n {buttons}\n
;\n }\n\n if (this.showOverflow === true) {\n tabs.push();\n }\n\n const showHeader = node.getName() !== undefined;\n let header;\n let tabStrip;\n\n let tabStripClasses = cm(\"layout__tab_header_outer\");\n if (this.props.node.getClassNameTabStrip() !== undefined) {\n tabStripClasses += \" \" + this.props.node.getClassNameTabStrip();\n }\n if (node.isActive() && !showHeader) {\n tabStripClasses += \" \" + cm(\"layout__tabset-selected\");\n }\n\n if (node.isMaximized() && !showHeader) {\n tabStripClasses += \" \" + cm(\"layout__tabset-maximized\");\n }\n\n if (showHeader) {\n let tabHeaderClasses = cm(\"layout__tabset_header\");\n if (node.isActive()) {\n tabHeaderClasses += \" \" + cm(\"layout__tabset-selected\");\n }\n if (node.isMaximized()) {\n tabHeaderClasses += \" \" + cm(\"layout__tabset-maximized\");\n }\n if (this.props.node.getClassNameHeader() !== undefined) {\n tabHeaderClasses += \" \" + this.props.node.getClassNameHeader();\n }\n\n header =
\n {headerContent}\n {toolbar}\n
;\n tabStrip =
\n
this.headerRef = (ref === null) ? undefined : ref} className={cm(\"layout__tab_header_inner\")}>\n {tabs}\n
\n
;\n }\n else {\n tabStrip =
\n
this.headerRef = (ref === null) ? undefined : ref} className={cm(\"layout__tab_header_inner\")}>\n {tabs}\n
\n {toolbar}\n
;\n }\n\n return
\n {header}\n {tabStrip}\n
;\n }\n\n onOverflowClick = (hiddenTabs: Array<{ name: string, node: TabNode, index: number }>) => {\n // console.log(\"hidden tabs: \" + hiddenTabs);\n const element = this.overflowbuttonRef as Element;\n PopupMenu.show(element, hiddenTabs, this.onOverflowItemSelect, this.props.layout.getClassName);\n }\n\n onOverflowItemSelect = (item: { name: string, node: TabNode, index: number }) => {\n this.props.layout.doAction(Actions.selectTab(item.node.getId()));\n }\n\n onMouseDown = (event: React.MouseEvent | React.TouchEvent) => {\n let name = this.props.node.getName();\n if (name === undefined) {\n name = \"\";\n }\n else {\n name = \": \" + name;\n }\n this.props.layout.doAction(Actions.setActiveTabset(this.props.node.getId()));\n const message = this.props.layout.i18nName(I18nLabel.Move_Tabset, name);\n this.props.layout.dragStart(event, message, this.props.node, this.props.node.isEnableDrag(), (_event2: Event) => undefined, this.onDoubleClick);\n }\n\n onInterceptMouseDown = (event: React.MouseEvent | React.MouseEvent) => {\n event.stopPropagation();\n }\n\n onMaximizeToggle = () => {\n if (this.props.node.isEnableMaximize()) {\n this.props.layout.maximize(this.props.node);\n }\n }\n\n onDoubleClick = (_event: Event) => {\n if (this.props.node.isEnableMaximize()) {\n this.props.layout.maximize(this.props.node);\n }\n }\n}\n\n\nexport default TabSet;\n","import * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport DockLocation from \"../DockLocation\";\nimport DragDrop from \"../DragDrop\";\nimport { I18nLabel } from \"../I18nLabel\";\nimport Action from \"../model/Action\";\nimport Actions from \"../model/Actions\";\nimport BorderNode from \"../model/BorderNode\";\nimport BorderSet from \"../model/BorderSet\";\nimport IDraggable from \"../model/IDraggable\";\nimport Model from \"../model/Model\";\nimport Node from \"../model/Node\";\nimport RowNode from \"../model/RowNode\";\nimport SplitterNode from \"../model/SplitterNode\";\nimport TabNode from \"../model/TabNode\";\nimport TabSetNode from \"../model/TabSetNode\";\nimport Rect from \"../Rect\";\nimport { JSMap } from \"../Types\";\nimport BorderTabSet from \"./BorderTabSet\";\nimport Splitter from \"./Splitter\";\nimport Tab from \"./Tab\";\nimport TabSet from \"./TabSet\";\n\nexport interface IFlexLayoutProps {\n model: Model;\n factory: (node: TabNode) => React.ReactNode;\n onAction?: (action: Action) => Action | undefined;\n onRenderTab?: (\n node: TabNode,\n renderValues: { leading: React.ReactNode; content: React.ReactNode }\n ) => void;\n onRenderTabSet?: (\n tabSetNode: TabSetNode | BorderNode,\n renderValues: {\n headerContent?: React.ReactNode;\n buttons: React.ReactNode[];\n }\n ) => void;\n onModelChange?: (model: Model) => void;\n classNameMapper?: (defaultClassName: string) => string;\n i18nMapper?: (id: I18nLabel, param?: string) => string;\n style?: any;\n}\n\n/**\n * A React component that hosts a multi-tabbed layout\n */\nexport class FlexLayout extends React.Component {\n\n /** @hidden @internal */\n selfRef?: HTMLDivElement;\n\n /** @hidden @internal */\n private model?: Model;\n /** @hidden @internal */\n private rect: Rect;\n /** @hidden @internal */\n private centerRect?: Rect;\n\n /** @hidden @internal */\n // private start: number = 0;\n /** @hidden @internal */\n // private layoutTime: number = 0;\n\n /** @hidden @internal */\n private tabIds: string[];\n /** @hidden @internal */\n private newTabJson: any;\n /** @hidden @internal */\n private firstMove: boolean = false;\n /** @hidden @internal */\n private dragNode?: Node & IDraggable;\n /** @hidden @internal */\n private dragDiv?: HTMLDivElement;\n /** @hidden @internal */\n private dragDivText: string = \"\";\n /** @hidden @internal */\n private dropInfo: any;\n /** @hidden @internal */\n private outlineDiv?: HTMLDivElement;\n\n /** @hidden @internal */\n private edgeRightDiv?: HTMLDivElement;\n /** @hidden @internal */\n private edgeBottomDiv?: HTMLDivElement;\n /** @hidden @internal */\n private edgeLeftDiv?: HTMLDivElement;\n /** @hidden @internal */\n private edgeTopDiv?: HTMLDivElement;\n /** @hidden @internal */\n private fnNewNodeDropped?: () => void;\n\n constructor(props: IFlexLayoutProps) {\n super(props);\n this.model = this.props.model;\n this.rect = new Rect(0, 0, 0, 0);\n this.model._setChangeListener(this.onModelChange);\n this.updateRect = this.updateRect;\n this.getClassName = this.getClassName;\n this.tabIds = [];\n }\n\n /** @hidden @internal */\n onModelChange = () => {\n this.forceUpdate();\n if (this.props.onModelChange) {\n this.props.onModelChange(this.model!);\n }\n }\n\n /** @hidden @internal */\n doAction(action: Action): void {\n if (this.props.onAction !== undefined) {\n const outcome = this.props.onAction(action);\n if (outcome !== undefined) {\n this.model!.doAction(outcome);\n }\n } else {\n this.model!.doAction(action);\n }\n }\n\n /** @hidden @internal */\n componentWillReceiveProps(newProps: IFlexLayoutProps) {\n if (this.model !== newProps.model) {\n if (this.model !== undefined) {\n this.model._setChangeListener(undefined); // stop listening to old model\n }\n this.model = newProps.model;\n this.model._setChangeListener(this.onModelChange);\n this.forceUpdate();\n }\n }\n\n /** @hidden @internal */\n componentDidMount() {\n this.updateRect();\n\n // need to re-render if size changes\n window.addEventListener(\"resize\", this.updateRect);\n }\n\n /** @hidden @internal */\n componentDidUpdate() {\n this.updateRect();\n // console.log(\"FlexLayout time: \" + this.layoutTime + \"ms Render time: \" + (Date.now() - this.start) + \"ms\");\n }\n\n /** @hidden @internal */\n updateRect = () => {\n const domRect = (this.selfRef as HTMLDivElement).getBoundingClientRect();\n const rect = new Rect(0, 0, domRect.width, domRect.height);\n if (!rect.equals(this.rect)) {\n this.rect = rect;\n this.forceUpdate();\n }\n }\n\n /** @hidden @internal */\n getClassName = (defaultClassName: string) => {\n if (this.props.classNameMapper === undefined) {\n return defaultClassName;\n } else {\n return this.props.classNameMapper(defaultClassName);\n }\n }\n\n /** @hidden @internal */\n componentWillUnmount() {\n window.removeEventListener(\"resize\", this.updateRect);\n }\n\n /** @hidden @internal */\n render() {\n // this.start = Date.now();\n const borderComponents: React.ReactNode[] = [];\n const tabSetComponents: React.ReactNode[] = [];\n const tabComponents: JSMap = {};\n const splitterComponents: React.ReactNode[] = [];\n\n this.centerRect = this.model!._layout(this.rect);\n\n this.renderBorder(\n this.model!.getBorderSet(),\n borderComponents,\n tabComponents,\n splitterComponents\n );\n this.renderChildren(\n this.model!.getRoot(),\n tabSetComponents,\n tabComponents,\n splitterComponents\n );\n\n const nextTopIds: string[] = [];\n const nextTopIdsMap: JSMap = {};\n\n // Keep any previous tabs in the same DOM order as before, removing any that have been deleted\n this.tabIds.forEach(t => {\n if (tabComponents[t]) {\n nextTopIds.push(t);\n nextTopIdsMap[t] = t;\n }\n });\n this.tabIds = nextTopIds;\n\n // Add tabs that have been added to the DOM\n Object.keys(tabComponents).forEach(t => {\n if (!nextTopIdsMap[t]) {\n this.tabIds.push(t);\n }\n });\n\n // this.layoutTime = (Date.now() - this.start);\n\n return (\n (this.selfRef = self === null ? undefined : self)}\n className={this.getClassName(\"layout__layout\")}\n style={this.props.style}\n >\n {tabSetComponents}\n {this.tabIds.map(t => {\n return tabComponents[t];\n })}\n {borderComponents}\n {splitterComponents}\n \n );\n }\n\n /** @hidden @internal */\n renderBorder(\n borderSet: BorderSet,\n borderComponents: React.ReactNode[],\n tabComponents: JSMap,\n splitterComponents: React.ReactNode[]\n ) {\n for (const border of borderSet.getBorders()) {\n if (border.isShowing()) {\n borderComponents.push(\n \n );\n const drawChildren = border._getDrawChildren();\n let i = 0;\n for (const child of drawChildren) {\n if (child instanceof SplitterNode) {\n splitterComponents.push(\n \n );\n } else if (child instanceof TabNode) {\n tabComponents[child.getId()] = (\n \n );\n }\n i++;\n }\n }\n }\n }\n\n /** @hidden @internal */\n renderChildren(\n node: RowNode | TabSetNode,\n tabSetComponents: React.ReactNode[],\n tabComponents: JSMap,\n splitterComponents: React.ReactNode[]\n ) {\n const drawChildren = node._getDrawChildren();\n\n for (const child of drawChildren!) {\n if (child instanceof SplitterNode) {\n splitterComponents.push(\n \n );\n } else if (child instanceof TabSetNode) {\n tabSetComponents.push(\n \n );\n this.renderChildren(\n child,\n tabSetComponents,\n tabComponents,\n splitterComponents\n );\n } else if (child instanceof TabNode) {\n const selectedTab = child.getParent()!.getChildren()[\n (child.getParent() as TabSetNode).getSelected()\n ];\n // if (selectedTab === undefined) { // TODO\n // // this should not happen!\n // console.warn(\"undefined selectedTab should not happen\");\n // }\n tabComponents[child.getId()] = (\n \n );\n } else {\n // is row\n this.renderChildren(\n child as RowNode,\n tabSetComponents,\n tabComponents,\n splitterComponents\n );\n }\n }\n }\n\n /**\n * Adds a new tab to the given tabset\n * @param tabsetId the id of the tabset where the new tab will be added\n * @param json the json for the new tab node\n */\n addTabToTabSet(tabsetId: string, json: any) {\n const tabsetNode = this.model!.getNodeById(tabsetId);\n if (tabsetNode !== undefined) {\n this.doAction(Actions.addNode(json, tabsetId, DockLocation.CENTER, -1));\n }\n }\n\n /**\n * Adds a new tab to the active tabset (if there is one)\n * @param json the json for the new tab node\n */\n addTabToActiveTabSet(json: any) {\n const tabsetNode = this.model!.getActiveTabset();\n if (tabsetNode !== undefined) {\n this.doAction(\n Actions.addNode(json, tabsetNode.getId(), DockLocation.CENTER, -1)\n );\n }\n }\n\n /**\n * Adds a new tab by dragging a labeled panel to the drop location, dragging starts immediatelly\n * @param dragText the text to show on the drag panel\n * @param json the json for the new tab node\n * @param onDrop a callback to call when the drag is complete\n */\n addTabWithDragAndDrop(dragText: string, json: any, onDrop?: () => void) {\n this.fnNewNodeDropped = onDrop;\n this.newTabJson = json;\n this.dragStart(\n undefined,\n dragText,\n TabNode._fromJson(json, this.model!),\n true,\n undefined,\n undefined\n );\n }\n\n /**\n * Adds a new tab by dragging a labeled panel to the drop location, dragging starts when you\n * mouse down on the panel\n *\n * @param dragText the text to show on the drag panel\n * @param json the json for the new tab node\n * @param onDrop a callback to call when the drag is complete\n */\n addTabWithDragAndDropIndirect(\n dragText: string,\n json: any,\n onDrop?: () => void\n ) {\n this.fnNewNodeDropped = onDrop;\n this.newTabJson = json;\n\n DragDrop.instance.addGlass(this.onCancelAdd);\n\n this.dragDivText = dragText;\n this.dragDiv = document.createElement(\"div\");\n this.dragDiv.className = this.getClassName(\"layout__drag_rect\");\n this.dragDiv.innerHTML = this.dragDivText;\n this.dragDiv.addEventListener(\n \"mousedown\",\n this.onDragDivMouseDown\n );\n this.dragDiv.addEventListener(\n \"touchstart\",\n this.onDragDivMouseDown\n );\n\n const r = new Rect(10, 10, 150, 50);\n r.centerInRect(this.rect);\n this.dragDiv.style.left = r.x + \"px\";\n this.dragDiv.style.top = r.y + \"px\";\n\n const rootdiv = ReactDOM.findDOMNode(this);\n rootdiv!.appendChild(this.dragDiv);\n }\n\n /** @hidden @internal */\n onCancelAdd = () => {\n const rootdiv = ReactDOM.findDOMNode(this);\n rootdiv!.removeChild(this.dragDiv!);\n this.dragDiv = undefined;\n if (this.fnNewNodeDropped != null) {\n this.fnNewNodeDropped();\n this.fnNewNodeDropped = undefined;\n }\n DragDrop.instance.hideGlass();\n this.newTabJson = undefined;\n }\n\n /** @hidden @internal */\n onCancelDrag = (wasDragging: boolean) => {\n if (wasDragging) {\n const rootdiv = ReactDOM.findDOMNode(this) as HTMLDivElement;\n\n try {\n rootdiv.removeChild(this.outlineDiv!);\n } catch (e) { }\n\n try {\n rootdiv.removeChild(this.dragDiv!);\n } catch (e) { }\n\n this.dragDiv = undefined;\n this.hideEdges(rootdiv);\n if (this.fnNewNodeDropped != null) {\n this.fnNewNodeDropped();\n this.fnNewNodeDropped = undefined;\n }\n DragDrop.instance.hideGlass();\n this.newTabJson = undefined;\n }\n }\n\n /** @hidden @internal */\n onDragDivMouseDown = (event: Event) => {\n event.preventDefault();\n this.dragStart(\n event,\n this.dragDivText,\n TabNode._fromJson(this.newTabJson, this.model!),\n true,\n undefined,\n undefined\n );\n }\n\n /** @hidden @internal */\n dragStart = (\n event: Event | React.MouseEvent | React.TouchEvent | undefined,\n dragDivText: string,\n node: Node & IDraggable,\n allowDrag: boolean,\n onClick?: (event: Event) => void,\n onDoubleClick?: (event: Event) => void\n ) => {\n if (this.model!.getMaximizedTabset() !== undefined || !allowDrag) {\n DragDrop.instance.startDrag(\n event,\n undefined,\n undefined,\n undefined,\n undefined,\n onClick,\n onDoubleClick\n );\n } else {\n this.dragNode = node;\n this.dragDivText = dragDivText;\n DragDrop.instance.startDrag(\n event,\n this.onDragStart,\n this.onDragMove,\n this.onDragEnd,\n this.onCancelDrag,\n onClick,\n onDoubleClick\n );\n }\n }\n\n /** @hidden @internal */\n onDragStart = () => {\n this.dropInfo = undefined;\n const rootdiv = ReactDOM.findDOMNode(this) as HTMLElement;\n this.outlineDiv = document.createElement(\"div\");\n this.outlineDiv.className = this.getClassName(\"layout__outline_rect\");\n rootdiv.appendChild(this.outlineDiv);\n\n if (this.dragDiv == null) {\n this.dragDiv = document.createElement(\"div\");\n this.dragDiv.className = this.getClassName(\"layout__drag_rect\");\n this.dragDiv.innerHTML = this.dragDivText;\n rootdiv.appendChild(this.dragDiv);\n }\n // add edge indicators\n this.showEdges(rootdiv);\n\n if (\n this.dragNode !== undefined &&\n this.dragNode instanceof TabNode &&\n this.dragNode.getTabRect() !== undefined\n ) {\n this.dragNode.getTabRect()!.positionElement(this.outlineDiv);\n }\n this.firstMove = true;\n\n return true;\n }\n\n /** @hidden @internal */\n onDragMove = (event: React.MouseEvent) => {\n if (this.firstMove === false) {\n const speed = this.model!._getAttribute(\"tabDragSpeed\") as number;\n this.outlineDiv!.style.transition = `top ${speed}s, left ${speed}s, width ${speed}s, height ${speed}s`;\n }\n this.firstMove = false;\n const clientRect = this.selfRef!.getBoundingClientRect();\n const pos = {\n x: event.clientX - clientRect.left,\n y: event.clientY - clientRect.top\n };\n\n this.dragDiv!.style.left =\n pos.x - this.dragDiv!.getBoundingClientRect().width / 2 + \"px\";\n this.dragDiv!.style.top = pos.y + 5 + \"px\";\n\n const dropInfo = this.model!._findDropTargetNode(\n this.dragNode!,\n pos.x,\n pos.y\n );\n if (dropInfo) {\n this.dropInfo = dropInfo;\n this.outlineDiv!.className = this.getClassName(dropInfo.className);\n dropInfo.rect.positionElement(this.outlineDiv!);\n }\n }\n\n /** @hidden @internal */\n onDragEnd = () => {\n const rootdiv = ReactDOM.findDOMNode(this) as HTMLElement;\n rootdiv.removeChild(this.outlineDiv!);\n rootdiv.removeChild(this.dragDiv!);\n this.dragDiv = undefined;\n this.hideEdges(rootdiv);\n DragDrop.instance.hideGlass();\n\n if (this.dropInfo) {\n if (this.newTabJson !== undefined) {\n this.doAction(\n Actions.addNode(\n this.newTabJson,\n this.dropInfo.node.getId(),\n this.dropInfo.location,\n this.dropInfo.index\n )\n );\n\n if (this.fnNewNodeDropped != null) {\n this.fnNewNodeDropped();\n this.fnNewNodeDropped = undefined;\n }\n this.newTabJson = undefined;\n } else if (this.dragNode !== undefined) {\n this.doAction(\n Actions.moveNode(\n this.dragNode.getId(),\n this.dropInfo.node.getId(),\n this.dropInfo.location,\n this.dropInfo.index\n )\n );\n }\n }\n }\n\n /** @hidden @internal */\n showEdges(rootdiv: HTMLElement) {\n if (this.model!.isEnableEdgeDock()) {\n const domRect = rootdiv.getBoundingClientRect();\n const r = this.centerRect!;\n const size = 100;\n const length = size + \"px\";\n const radius = \"50px\";\n const width = \"10px\";\n\n this.edgeTopDiv = document.createElement(\"div\");\n this.edgeTopDiv.className = this.getClassName(\"layout__edge_rect\");\n this.edgeTopDiv.style.top = r.y + \"px\";\n this.edgeTopDiv.style.left = r.x + (r.width - size) / 2 + \"px\";\n this.edgeTopDiv.style.width = length;\n this.edgeTopDiv.style.height = width;\n this.edgeTopDiv.style.borderBottomLeftRadius = radius;\n this.edgeTopDiv.style.borderBottomRightRadius = radius;\n\n this.edgeLeftDiv = document.createElement(\"div\");\n this.edgeLeftDiv.className = this.getClassName(\"layout__edge_rect\");\n this.edgeLeftDiv.style.top = r.y + (r.height - size) / 2 + \"px\";\n this.edgeLeftDiv.style.left = r.x + \"px\";\n this.edgeLeftDiv.style.width = width;\n this.edgeLeftDiv.style.height = length;\n this.edgeLeftDiv.style.borderTopRightRadius = radius;\n this.edgeLeftDiv.style.borderBottomRightRadius = radius;\n\n this.edgeBottomDiv = document.createElement(\"div\");\n this.edgeBottomDiv.className = this.getClassName(\"layout__edge_rect\");\n this.edgeBottomDiv.style.bottom = domRect.height - r.getBottom() + \"px\";\n this.edgeBottomDiv.style.left = r.x + (r.width - size) / 2 + \"px\";\n this.edgeBottomDiv.style.width = length;\n this.edgeBottomDiv.style.height = width;\n this.edgeBottomDiv.style.borderTopLeftRadius = radius;\n this.edgeBottomDiv.style.borderTopRightRadius = radius;\n\n this.edgeRightDiv = document.createElement(\"div\");\n this.edgeRightDiv.className = this.getClassName(\"layout__edge_rect\");\n this.edgeRightDiv.style.top = r.y + (r.height - size) / 2 + \"px\";\n this.edgeRightDiv.style.right = domRect.width - r.getRight() + \"px\";\n this.edgeRightDiv.style.width = width;\n this.edgeRightDiv.style.height = length;\n this.edgeRightDiv.style.borderTopLeftRadius = radius;\n this.edgeRightDiv.style.borderBottomLeftRadius = radius;\n\n rootdiv.appendChild(this.edgeTopDiv);\n rootdiv.appendChild(this.edgeLeftDiv);\n rootdiv.appendChild(this.edgeBottomDiv);\n rootdiv.appendChild(this.edgeRightDiv);\n }\n }\n\n /** @hidden @internal */\n hideEdges(rootdiv: HTMLElement) {\n if (this.model!.isEnableEdgeDock()) {\n try {\n rootdiv.removeChild(this.edgeTopDiv!);\n rootdiv.removeChild(this.edgeLeftDiv!);\n rootdiv.removeChild(this.edgeBottomDiv!);\n rootdiv.removeChild(this.edgeRightDiv!);\n } catch (e) { }\n }\n }\n\n /** @hidden @internal */\n maximize(tabsetNode: TabSetNode) {\n this.doAction(Actions.maximizeToggle(tabsetNode.getId()));\n }\n\n /** @hidden @internal */\n customizeTab(\n tabNode: TabNode,\n renderValues: { leading: React.ReactNode; content: React.ReactNode }\n ) {\n if (this.props.onRenderTab) {\n this.props.onRenderTab(tabNode, renderValues);\n }\n }\n\n /** @hidden @internal */\n customizeTabSet(\n tabSetNode: TabSetNode | BorderNode,\n renderValues: {\n headerContent?: React.ReactNode;\n buttons: React.ReactNode[];\n }\n ) {\n if (this.props.onRenderTabSet) {\n this.props.onRenderTabSet(tabSetNode, renderValues);\n }\n }\n\n i18nName(id: I18nLabel, param?: string): string {\n let message = null;\n if (this.props.i18nMapper) {\n message = this.props.i18nMapper(id, param);\n }\n if (message === null) {\n message = id + (param === undefined ? \"\" : param);\n }\n return message;\n }\n}\n\nexport default FlexLayout;\n","import { createSelector } from 'reselect';\r\nimport { ApplicationState } from '../';\r\n\r\nexport const activeScreenIDSelector = (state: ApplicationState) => state.appLayout?.activeScreen;\r\nexport const screensSelector = (state: ApplicationState) => state.appLayout?.screens;\r\nexport const themeSelector = (state: ApplicationState) => state.appLayout?.theme;\r\n\r\nexport const activeScreenSelector = createSelector(\r\n activeScreenIDSelector,\r\n screensSelector,\r\n (activeScreenID, screens) => {\r\n if (activeScreenID && screens && screens.length > 0) {\r\n return screens.find(s => s.id == activeScreenID);\r\n }\r\n\r\n return undefined;\r\n }\r\n)\r\n","import { createSelector } from 'reselect';\r\nimport { ApplicationState } from '../';\r\n\r\nconst lastAuthenticatedUserSelector = (state: ApplicationState) => state.auth?.user;\r\n\r\nexport const authenticatedUserSelector = createSelector(\r\n lastAuthenticatedUserSelector,\r\n (user) => {\r\n if (!user) {\r\n return null;\r\n }\r\n\r\n if (user.expired) {\r\n return null;\r\n }\r\n\r\n return user;\r\n }\r\n)\r\n\r\nexport const rolesSelector = createSelector(\r\n authenticatedUserSelector,\r\n (user) => {\r\n if (user) {\r\n if (user.profile.role) {\r\n if (Array.isArray(user.profile.role)) {\r\n return user.profile.role as string[];\r\n }\r\n else if (typeof user.profile.role === 'string' || user.profile.role instanceof String) {\r\n return [user.profile.role] as string[];\r\n }\r\n }\r\n }\r\n\r\n return [];\r\n }\r\n)\r\n","import { createSelector } from 'reselect';\r\nimport { ApplicationState } from '../';\r\n\r\nexport const coursesSelector = (state: ApplicationState) => state.learning?.courses;\r\nexport const classesSelector = (state: ApplicationState) => state.learning?.classes;\r\nexport const requestingClassesSelector = (state: ApplicationState) => state.learning?.requestingClasses;\r\nexport const requestingCoursesSelector = (state: ApplicationState) => state.learning?.requestingCourses;\r\nexport const lessonsSelector = (state: ApplicationState) => state.learning?.lessons;\r\nexport const schedulesSelector = (state: ApplicationState) => state.learning?.schedules;\r\n\r\nexport const coursesByTypeSelector = createSelector(\r\n coursesSelector,\r\n (_: any, courseType: 0 | 1) => courseType,\r\n (courses, courseType) => courses?.get(courseType)\r\n)\r\n\r\nexport const classesByTypeSelector = createSelector(\r\n classesSelector,\r\n (_: any, classType: 0 | 1) => classType,\r\n (classes, classType) => classes?.get(classType)\r\n)\r\n\r\nexport const upcommingClassesSelector = createSelector(\r\n classesSelector,\r\n (_: any, classType: 0 | 1) => classType,\r\n (classes, classType) => classes?.get(classType)?.filter(c => c.status == 1)\r\n)\r\n\r\n\r\nexport const endedClassesSelector = createSelector(\r\n classesSelector,\r\n (_: any, classType: 0 | 1) => classType,\r\n (classes, classType) => classes?.get(classType)?.filter(c => c.status == 2)\r\n)\r\n\r\nexport const courseSelector = createSelector(\r\n coursesSelector,\r\n (_: any, courseType: 0 | 1, courseId: number) => ({ courseType, courseId }),\r\n (courses, { courseType, courseId }) => courses?.get(courseType)?.find(course => course.courseId === courseId)\r\n)\r\n\r\nexport const classSelector = createSelector(\r\n classesSelector,\r\n (_: any, classType: 0 | 1, classId: number) => ({ classType, classId }),\r\n (classes, { classType, classId }) => classes?.get(classType)?.find(c => c.classId === classId)\r\n)\r\n\r\nexport const lessonsInCourseSelector = createSelector(\r\n lessonsSelector,\r\n (_: any, courseId: number) => courseId,\r\n (lessons, courseId) => lessons?.get(courseId)\r\n)\r\n\r\nexport const schedulesInClassSelector = createSelector(\r\n schedulesSelector,\r\n (_: any, classId: number) => classId,\r\n (schedules, classId) => schedules?.get(classId)\r\n)","import * as React from \"react\";\r\nimport { actionCreators } from \"../store\";\r\nimport * as Selectors from '../store/selectors';\r\nimport { THEME } from '../models';\r\nimport { useSelector, useDispatch } from \"react-redux\";\r\n\r\nconst useTheme = (): [THEME | undefined, (t: THEME) => void] => {\r\n const theme = useSelector(Selectors.themeSelector);\r\n const dispatch = useDispatch();\r\n\r\n const setTheme = (newTheme: THEME) => {\r\n dispatch(actionCreators.changeTheme(newTheme));\r\n }\r\n\r\n return [ theme, setTheme ];\r\n}\r\n\r\nexport { useTheme };","import { Classes } from \"@blueprintjs/core\";\r\nimport * as React from \"react\";\r\nimport { useTheme } from \"../theme\";\r\nimport { THEME } from \"../models\";\r\n\r\nexport interface IAppHeaderLogo {\r\n width: number;\r\n height: number;\r\n}\r\n\r\nexport const AppHeaderLogo = ({ width, height }: IAppHeaderLogo) => {\r\n const [ theme ] = useTheme();\r\n\r\n if (theme == (\"light\" as THEME)) {\r\n return (\r\n \r\n );\r\n }\r\n return (\r\n \r\n );\r\n};\r\n","import styled from 'styled-components';\r\nimport SimpleBar from 'simplebar-react';\r\nimport 'simplebar/dist/simplebar.min.css';\r\n\r\nconst ScrollableView = styled(SimpleBar as any)`\r\n width: 100%;\r\n\theight: 100%;\r\n`\r\n\r\nexport default ScrollableView;\r\n","import React, { Component } from \"react\";\r\nimport { shallowEqual, useSelector, useDispatch } from 'react-redux';\r\nimport { Icon, Button } from \"@blueprintjs/core\";\r\nimport styled from 'styled-components';\r\nimport { useTheme } from \"../theme\";\r\nimport { ScrollableView } from './core';\r\n\r\nconst Wrapper = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n\theight: 100%;\r\n min-height: 350px;\r\n flex: 1;\r\n justify-content: center;\r\n align-items: center;\r\n`;\r\n\r\n\r\n\r\nconst Widget = React.memo(() => {\r\n const [ theme ] = useTheme();\r\n\r\n return \r\n \r\n \r\n \r\n ;\r\n});\r\n\r\nexport default Widget;\r\n","import * as React from 'react';\r\nimport { Component, useState, useEffect, memo } from \"react\";\r\nimport { Icon, Button, Card, Elevation, Dialog, AnchorButton, Classes, Intent, Text } from \"@blueprintjs/core\";\r\nimport styled from 'styled-components';\r\nimport { useTheme } from \"../../theme\";\r\nimport \"./style.css\";\r\nimport { Course } from '../../models';\r\n\r\ninterface CourseItemProps {\r\n onItemClick: (item: Course) => void,\r\n course: Course \r\n}\r\n\r\nconst CourseItem = memo(({ course, onItemClick }: CourseItemProps) => {\r\n\r\n const handleRegister = (event: any) => {\r\n window.open(`https://academy.fireant.vn/Courses/Enroll?courseId=${course.courseId}`, \"_blank\");\r\n event.stopPropagation();\r\n }\r\n\r\n return
\r\n onItemClick(course)}>\r\n {course.isOnline &&
\r\n {course.type == 0 ? \"HỌC ONLINE\" : \"HỘI THẢO ONLINE\"}\r\n
}\r\n {!course.isOnline &&
\r\n {course.type == 0 ? \"HỌC TẠI TRUNG TÂM\" : \"HỘI THẢO TẠI TRUNG TÂM\"}\r\n
}\r\n \r\n

{course.name}

\r\n

{course.description}

\r\n \r\n
\r\n
;\r\n});\r\n\r\nexport default CourseItem;\r\n","import React, { Component, useState, useEffect } from \"react\";\r\nimport { shallowEqual, useSelector, useDispatch } from 'react-redux';\r\nimport { Icon, Button, Card, Elevation, Dialog, AnchorButton, Classes, Intent, Callout, Text, NonIdealState, Spinner } from \"@blueprintjs/core\";\r\nimport styled from 'styled-components';\r\nimport { useTheme } from \"../../theme\";\r\nimport { ScrollableView } from '../core';\r\nimport { ApplicationState, actionCreators } from \"../../store\";\r\nimport * as Selectors from '../../store/selectors';\r\nimport \"./style.css\";\r\nimport { Route, useRouteMatch, useHistory, useParams } from 'react-router';\r\nimport { getCourses } from '../../api';\r\nimport CourseItem from './CourseItem';\r\nimport CourseDetail from './CourseDetail';\r\nimport { Course } from \"../../models\";\r\n\r\ninterface CoursesProps {\r\n courseType: 0 | 1\r\n}\r\nconst Courses = React.memo(({ courseType }: CoursesProps) => {\r\n const dispatch = useDispatch();\r\n const history = useHistory();\r\n const requestingCourses = useSelector(Selectors.requestingCoursesSelector);\r\n const courses = useSelector((state: ApplicationState) =>\r\n Selectors.coursesByTypeSelector(state, courseType)\r\n );\r\n\r\n useEffect(() => {\r\n console.log(courseType);\r\n dispatch(actionCreators.requestCourses(courseType));\r\n }, []);\r\n\r\n const goCourseDetail = (course: Course) => {\r\n if (course.type == 0) {\r\n history.push(`/opening/courses/${course.courseId}`);\r\n }\r\n else if (course.type == 1) {\r\n history.push(`/opening/seminars/${course.courseId}`);\r\n }\r\n }\r\n\r\n let noContentText = \"\";\r\n\r\n if (courseType == 0) {\r\n noContentText = \"Hiện không có khóa học nào đang khai giảng. Hãy theo dõi để đăng ký các khóa học hữu ích của FireAnt.\"\r\n }\r\n else if (courseType == 1) {\r\n noContentText = \"Hiện không có hội thảo nào sắp diễn ra. Hãy theo dõi để đăng ký tham gia các hội thảo hữu ích của FireAnt.\"\r\n }\r\n\r\n return \r\n\r\n {courses &&
\r\n
\r\n {courses.map(course => )}\r\n
\r\n
}\r\n\r\n {!requestingCourses && (!courses || courses.length == 0) && }\r\n\r\n {requestingCourses && (!courses || courses.length == 0) && }\r\n
;\r\n});\r\n\r\nconst Wrapper = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n\theight: 100%;\r\n min-height: 300px;\r\n flex: 1;\r\n justify-content: center;\r\n align-items: center;\r\n`;\r\n\r\nexport default Courses;\r\n","import * as React from 'react';\r\nimport { Component, useState, useEffect, memo } from \"react\";\r\nimport { Icon, Button, Card, Elevation, Dialog, AnchorButton, Classes, Intent, Text } from \"@blueprintjs/core\";\r\nimport styled from 'styled-components';\r\nimport { useTheme } from \"../../theme\";\r\nimport \"./style.css\";\r\nimport { Class } from '../../models';\r\n\r\ninterface ClassItemProps {\r\n onItemClick: (item: Class) => void,\r\n theClass: Class \r\n}\r\n\r\nconst ClassItem = memo(({ theClass, onItemClick }: ClassItemProps) => {\r\n\r\n return
\r\n onItemClick(theClass)}>\r\n {theClass.course.isOnline &&
\r\n {theClass.course.type == 0 ? \"HỌC ONLINE\" : \"HỘI THẢO ONLINE\"}\r\n
}\r\n {!theClass.course.isOnline &&
\r\n {theClass.course.type == 0 ? \"HỌC TẠI TRUNG TÂM\" : \"HỘI THẢO TẠI TRUNG TÂM\"}\r\n
}\r\n \r\n
{theClass.course.name}
\r\n

{theClass.course.description}

\r\n \r\n
\r\n
;\r\n});\r\n\r\nexport default ClassItem;\r\n","import * as React from 'react';\r\nimport * as Oidc from 'oidc-client';\r\nimport { useState, useEffect, memo } from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useHistory, useParams, Redirect, useLocation } from 'react-router';\r\nimport { Dialog, Classes, Text, Button } from '@blueprintjs/core';\r\nimport { actionCreators } from '../store';\r\nimport { action } from '@storybook/addon-actions';\r\nimport * as Selectors from '../store/selectors';\r\nimport { currentStore } from '../store';\r\n\r\nconst mgr = (function () {\r\n let settings:any = null;\r\n if (process.env.NODE_ENV == 'development') {\r\n settings = {\r\n authority: 'https://accounts.fireant.vn',\r\n client_id: 'fireant.tradestation.local',\r\n redirect_uri: 'http://localhost:3000/signin-callback',\r\n post_logout_redirect_uri: 'http://localhost:3000/signout-callback',\r\n response_type: 'id_token token',\r\n scope: [\"openid\", \"profile\", \"roles\", \"email\", \"accounts-read\", \"accounts-write\", \"orders-read\", \"orders-write\", \"companies-read\", \"individuals-read\", \"finance-read\", \"posts-write\", \"posts-read\", \"symbols-read\", \"user-data-read\", \"user-data-write\", \"users-read\", \"search\", \"academy-read\", \"academy-write\", \"blog-read\", \"investopedia-read\"].join(\" \"),\r\n\r\n popup_redirect_uri: 'http://localhost:3000/signin-callback',\r\n popup_post_logout_redirect_uri: 'http://localhost:3000/signout-callback',\r\n\r\n silent_redirect_uri: 'http://localhost:3000/silent-renew-callback',\r\n automaticSilentRenew: true,\r\n filterProtocolClaims: true,\r\n //loadUserInfo: true,\r\n userStore: new Oidc.WebStorageStateStore({ store: localStorage })\r\n };\r\n }\r\n else {\r\n settings = {\r\n authority: 'https://accounts.fireant.vn',\r\n client_id: 'fireant.learning',\r\n redirect_uri: 'https://learning.fireant.vn/signin-callback',\r\n post_logout_redirect_uri: 'https://learning.fireant.vn/signout-callback',\r\n response_type: 'id_token token',\r\n scope: [\"openid\", \"profile\", \"roles\", \"email\", \"accounts-read\", \"accounts-write\", \"orders-read\", \"orders-write\", \"companies-read\", \"individuals-read\", \"finance-read\", \"posts-write\", \"posts-read\", \"symbols-read\", \"user-data-read\", \"user-data-write\", \"users-read\", \"search\", \"academy-read\", \"academy-write\", \"blog-read\", \"investopedia-read\"].join(\" \"),\r\n\r\n popup_redirect_uri: 'https://learning.fireant.vn/signin-callback',\r\n popup_post_logout_redirect_uri: 'https://learning.fireant.vn/signout-callback',\r\n\r\n silent_redirect_uri: 'https://learning.fireant.vn/silent-renew-callback',\r\n automaticSilentRenew: true,\r\n filterProtocolClaims: true,\r\n loadUserInfo: true,\r\n userStore: new Oidc.WebStorageStateStore({ store: localStorage })\r\n };\r\n }\r\n\r\n const mgr = new Oidc.UserManager(settings);\r\n\r\n mgr.getUser().then(user => {\r\n if (currentStore && user) {\r\n currentStore.dispatch(actionCreators.saveAuthenticatedUser(user));\r\n }\r\n });\r\n\r\n mgr.events.addSilentRenewError(function (e) {\r\n console.log(\"silent renew error\", e.message);\r\n });\r\n\r\n mgr.events.addAccessTokenExpiring(() => {\r\n console.log(\"token expiring\");\r\n });\r\n\r\n mgr.events.addAccessTokenExpired(() => {\r\n console.log('token expired');\r\n mgr.removeUser();\r\n if (currentStore) {\r\n currentStore.dispatch(actionCreators.removeAuthenticatedUser());\r\n }\r\n });\r\n\r\n mgr.events.addUserLoaded((user) => {\r\n if (currentStore) {\r\n currentStore.dispatch(actionCreators.saveAuthenticatedUser(user));\r\n }\r\n });\r\n\r\n mgr.events.addUserUnloaded(() => {\r\n if (currentStore) {\r\n currentStore.dispatch(actionCreators.removeAuthenticatedUser());\r\n }\r\n });\r\n\r\n return mgr;\r\n})();\r\n\r\nconst SignInCallback = () => {\r\n mgr.signinCallback().catch(function (err) {\r\n console.log(err);\r\n });\r\n\r\n return null;\r\n}\r\n\r\nconst SilentRenewCallback = () => {\r\n mgr.signinSilentCallback();\r\n return null;\r\n}\r\n\r\nconst SignOutCallback = () => {\r\n mgr.signoutPopupCallback(false);\r\n return null;\r\n}\r\n\r\nconst Login = memo(() => {\r\n const history = useHistory();\r\n const location = useLocation();\r\n const [user, roles, signIn] = useAuth();\r\n\r\n const { returnUrl } = location.state as any;\r\n\r\n useEffect(() => {\r\n }, []);\r\n\r\n const goBack = () => {\r\n history.goBack();\r\n }\r\n\r\n if (!user || user.expired) {\r\n return \r\n
\r\n Bạn cần đăng nhập để truy cập nội dung này. Bạn có muốn đăng nhập luôn không?\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n\r\n
\r\n ;\r\n }\r\n\r\n return ;\r\n});\r\n\r\n\r\nconst useAuth = (): [Oidc.User | null | undefined, string[], () => void, () => void] => {\r\n const user = useSelector(Selectors.authenticatedUserSelector);\r\n const roles = useSelector(Selectors.rolesSelector);\r\n\r\n const signIn = () => {\r\n mgr.signinPopup().then((u) => {\r\n console.log(u);\r\n }).catch((err) => {\r\n console.log(err);\r\n });\r\n }\r\n\r\n const signOut = () => {\r\n mgr.signoutPopup().then(() => {\r\n }).catch(function (err) {\r\n console.log(err);\r\n });\r\n }\r\n\r\n return [user, roles, signIn, signOut];\r\n}\r\n\r\nexport { useAuth, SignInCallback, SignOutCallback, SilentRenewCallback, Login };","import * as React from 'react';\r\nimport { Component, useState, useEffect, memo } from \"react\";\r\nimport { Icon, Button, Card, Elevation, Dialog, AnchorButton, Classes, Intent, Text, Tabs, Tab, Callout, Collapse, Pre } from \"@blueprintjs/core\";\r\nimport styled from 'styled-components';\r\nimport { useTheme } from \"../../theme\";\r\nimport \"./style.css\";\r\nimport { Class, Schedule, Course, Lesson } from '../../models';\r\nimport { useHistory, useParams, useLocation } from 'react-router';\r\nimport { useSelector, useDispatch } from 'react-redux';\r\nimport * as Selectors from '../../store/selectors';\r\nimport { ApplicationState, actionCreators } from '../../store';\r\nimport moment from 'moment';\r\nimport { useAuth } from '../../auth';\r\n\r\ninterface ClassDetailProps {\r\n classType: 0 | 1;\r\n}\r\n\r\nconst ClassDetail = memo(({classType} : ClassDetailProps) => {\r\n const history = useHistory();\r\n const dispatch = useDispatch();\r\n const { classId } = useParams();\r\n\r\n const theClass = useSelector((state: ApplicationState) =>\r\n Selectors.classSelector(state, classType, parseInt(classId))\r\n );\r\n\r\n const schedules = useSelector((state: ApplicationState) =>\r\n Selectors.schedulesInClassSelector(state, parseInt(classId))\r\n );\r\n\r\n useEffect(() => {\r\n dispatch(actionCreators.requestSchedules(parseInt(classId)));\r\n }, []);\r\n\r\n const goBack = () => {\r\n history.goBack();\r\n }\r\n\r\n if (theClass) {\r\n let hasNextSchedule = false;\r\n let title = theClass.course.type == 0 ? `Lớp ${theClass.name}-${theClass.course.name}` : theClass.course.name;\r\n return \r\n {schedules &&
\r\n {schedules.map((schedule, index) => {\r\n let isNextSchedule = false;\r\n if (!hasNextSchedule && (schedule.status == 0 || schedule.status == 1)) {\r\n hasNextSchedule = true;\r\n isNextSchedule = true;\r\n }\r\n return \r\n })}\r\n
}\r\n ;\r\n }\r\n return null;\r\n});\r\n\r\ninterface ScheduleItemProps {\r\n theClass: Class,\r\n index: number,\r\n isNextSchedule: boolean,\r\n isLastSchedule: boolean,\r\n schedule: Schedule\r\n}\r\n\r\nconst CAN_JOIN_IN_SECONDS = 1800;\r\nconst DISPLAY_TIMELEFT_IN_SECONDS = 3600 * 5;\r\n\r\nconst padNumber = (num: number) => {\r\n var s = \"0\" + num;\r\n return s.substr(s.length - 2);\r\n};\r\n\r\nconst calculateTimeLeft = (fromTime: Date) => {\r\n const now = moment(new Date());\r\n const time = moment(fromTime);\r\n\r\n const duration = moment.duration(time.diff(now));\r\n const seconds = Math.round(duration.asSeconds());\r\n\r\n return seconds;\r\n}\r\n\r\nconst ScheduleItem = ({ theClass, index, isNextSchedule, isLastSchedule, schedule }: ScheduleItemProps) => {\r\n const [isOpen, setIsOpen] = useState(isNextSchedule);\r\n const history = useHistory();\r\n const [user, roles] = useAuth();\r\n const isTeacher = roles.includes('Teacher');\r\n\r\n const [secondsLeft, setSecondsLeft] = useState(() => {\r\n if (isNextSchedule) {\r\n return calculateTimeLeft(schedule.time)\r\n }\r\n\r\n return -1;\r\n });\r\n\r\n\r\n useEffect(() => {\r\n let interval:any = null;\r\n if (isNextSchedule) {\r\n interval = setInterval(() => {\r\n const seconds = calculateTimeLeft(schedule.time);\r\n\r\n if (seconds < DISPLAY_TIMELEFT_IN_SECONDS) {\r\n setSecondsLeft(seconds);\r\n }\r\n\r\n }, 1000);\r\n }\r\n\r\n return () => {\r\n if (interval) {\r\n clearInterval(interval);\r\n }\r\n }\r\n }, []);\r\n\r\n const handleClick = () => {\r\n setIsOpen(!isOpen);\r\n }\r\n\r\n const handleJoinClass = () => {\r\n if (secondsLeft < CAN_JOIN_IN_SECONDS) { // Can join before 30 min\r\n history.push('/classes/1/join', { classId: schedule.classId, name: user?.profile.full_name, role: isTeacher ? 1 : 0, returnUrl: theClass.course.type == 0 ? '/classes' : '/myseminars' });\r\n }\r\n }\r\n\r\n return
\r\n \r\n \r\n \r\n {schedule.lessons.map(lesson => )}\r\n {theClass.classId != 10 && theClass.course.isOnline && isNextSchedule &&
\r\n \r\n
}\r\n
\r\n
\r\n
;\r\n}\r\n\r\ninterface LessonItemProps {\r\n schedule: Schedule,\r\n lesson: Lesson\r\n}\r\n\r\nconst LessonItem = ({ schedule, lesson }: LessonItemProps) => {\r\n const history = useHistory();\r\n\r\n const handleLessonClick = () => {\r\n if ((schedule.status == 1 || schedule.status == 2) && lesson.videoUrl) {\r\n history.push(`/classes/${schedule.classId}/lessons/${lesson.lessonId}`, { url: lesson.videoUrl });\r\n }\r\n }\r\n\r\n return
\r\n \r\n
;\r\n}\r\n\r\n\r\nexport default ClassDetail;\r\n","import React, { Component, useState, useEffect } from \"react\";\r\nimport { shallowEqual, useSelector, useDispatch } from 'react-redux';\r\nimport { Icon, Button, Card, Elevation, Dialog, AnchorButton, Intent, NonIdealState, Callout, Spinner } from \"@blueprintjs/core\";\r\nimport styled from 'styled-components';\r\nimport { useTheme } from \"../../theme\";\r\nimport { ScrollableView } from '../core';\r\nimport { ApplicationState, actionCreators } from \"../../store\";\r\nimport * as Selectors from '../../store/selectors';\r\nimport \"./style.css\";\r\nimport { Route, useRouteMatch, useHistory, useParams } from 'react-router';\r\nimport ClassItem from './ClassItem';\r\nimport ClassDetail from './ClassDetail';\r\nimport { Class } from \"../../models\";\r\nimport { useAuth } from \"../../auth\";\r\n\r\ninterface ClassesProps {\r\n classType: 0 | 1,\r\n type: number\r\n}\r\n\r\nconst Classes = React.memo(({ classType, type }: ClassesProps) => {\r\n const dispatch = useDispatch();\r\n const history = useHistory();\r\n const [user, roles] = useAuth();\r\n const requestingClasses = useSelector(Selectors.requestingClassesSelector);\r\n\r\n let classes: Class[] | undefined = [];\r\n\r\n if (type == 0) {\r\n classes = useSelector((state: ApplicationState) =>\r\n Selectors.classesByTypeSelector(state, classType)\r\n );\r\n }\r\n else if (type == 1) {\r\n classes = useSelector((state: ApplicationState) =>\r\n Selectors.upcommingClassesSelector(state, classType)\r\n );\r\n }\r\n else if (type == 2) {\r\n classes = useSelector((state: ApplicationState) =>\r\n Selectors.endedClassesSelector(state, classType)\r\n );\r\n }\r\n\r\n useEffect(() => {\r\n if (user) {\r\n if (roles.includes('Teacher')) {\r\n dispatch(actionCreators.requestOwnedClasses(classType));\r\n }\r\n else {\r\n dispatch(actionCreators.requestEnrolledClasses(classType));\r\n }\r\n }\r\n }, []);\r\n\r\n const goClassDetail = (theClass: Class) => {\r\n if (theClass.course.type == 0) {\r\n history.push(`/classes/${theClass.classId}`);\r\n }\r\n else {\r\n history.push(`/myseminars/${theClass.classId}`);\r\n }\r\n }\r\n\r\n let noContentText = \"\";\r\n\r\n if (classType == 0) {\r\n if (type == 1) {\r\n noContentText = \"Bạn hiện tại không có lớp học nào đang diễn ra. Hãy đăng ký các khóa học đang khai giảng của FireAnt.\"\r\n }\r\n else if (type == 2) {\r\n noContentText = \"Bạn chưa hoàn thành lớp học nào tại FireAnt.\"\r\n }\r\n }\r\n else if (classType == 1){\r\n if (type == 1) {\r\n noContentText = \"Bạn chưa đăng ký tham gia hội thảo nào sắp tới. Hãy đăng ký tham gia các hội thảo đang được FireAnt tổ chức.\"\r\n }\r\n }\r\n\r\n return \r\n \r\n \r\n \r\n \r\n \r\n \r\n {classes && classes.length > 0 &&
\r\n
\r\n {classes.map(theClass => )}\r\n
\r\n
}\r\n\r\n {!requestingClasses && (!classes || classes.length == 0) && }\r\n\r\n {requestingClasses && (!classes || classes.length == 0) && }\r\n
;\r\n});\r\n\r\nconst Wrapper = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n\theight: 100%;\r\n min-height: 300px;\r\n flex: 1;\r\n justify-content: center;\r\n align-items: center;\r\n`;\r\n\r\n\r\nexport default Classes;\r\n","import * as React from 'react';\r\nimport { useEffect, memo } from 'react';\r\nimport { joinClassMeeting, startClassMeeting } from '../../api';\r\nimport { useParams, useLocation, useHistory } from 'react-router';\r\n\r\nconst JoinClass = memo(() => {\r\n const location = useLocation();\r\n const history = useHistory();\r\n\r\n useEffect(() => {\r\n const { classId, name, role, returnUrl} = location.state as any;\r\n\r\n if (role == 0) {\r\n joinClassMeeting(classId, name, returnUrl);\r\n }\r\n else {\r\n startClassMeeting(classId, name, returnUrl);\r\n }\r\n\r\n let zoomElement = document.getElementById(\"zmmtg-root\");\r\n\r\n if (zoomElement) {\r\n zoomElement.style.display = \"block\";\r\n }\r\n\r\n return () => {\r\n if (zoomElement) {\r\n zoomElement.style.display = \"none\";\r\n }\r\n\r\n };\r\n }, []);\r\n\r\n return null;\r\n});\r\n\r\nexport default JoinClass;","import * as React from 'react';\r\nimport { useEffect, memo } from 'react';\r\nimport { useParams, useLocation, useHistory } from 'react-router';\r\nimport styled from 'styled-components';\r\n\r\nconst Presentation = styled.iframe`\r\n width: 100%;\r\n height: 100%;\r\n margin: 0;\r\n`;\r\n\r\nconst Slides = memo(() => {\r\n const location = useLocation();\r\n\r\n const { url } = location.state as any;\r\n\r\n if (url) {\r\n return ;\r\n }\r\n\r\n return null;\r\n});\r\n\r\nexport default Slides;","import echarts from 'echarts';\n\nvar contrastColor = '#eee';\nvar axisCommon = function () {\n return {\n axisLine: {\n lineStyle: {\n color: contrastColor\n }\n },\n axisTick: {\n lineStyle: {\n color: contrastColor\n }\n },\n axisLabel: {\n textStyle: {\n color: contrastColor\n }\n },\n splitLine: {\n lineStyle: {\n type: 'dashed',\n color: '#aaa'\n }\n },\n splitArea: {\n areaStyle: {\n color: contrastColor\n }\n }\n };\n};\n\nvar colorPalette = ['#dd6b66', '#759aa0', '#e69d87', '#8dc1a9', '#ea7e53', '#eedd78', '#73a373', '#73b9bc', '#7289ab', '#91ca8c', '#f49f42'];\nvar theme = {\n color: colorPalette,\n tooltip: {\n axisPointer: {\n label: {\n color: '#111'\n },\n lineStyle: {\n color: contrastColor\n },\n crossStyle: {\n color: contrastColor\n }\n }\n },\n legend: {\n textStyle: {\n color: contrastColor\n }\n },\n textStyle: {\n color: contrastColor\n },\n title: {\n textStyle: {\n color: contrastColor\n }\n },\n toolbox: {\n iconStyle: {\n normal: {\n borderColor: contrastColor\n }\n }\n },\n dataZoom: {\n textStyle: {\n color: contrastColor\n },\n fillerColor: 'rgba(0, 0, 0, 0.2)',\n dataBackground: {\n lineStyle: {\n color: 'white'\n },\n areaStyle: {\n color: 'rgba(255, 255, 255, 0.3)'\n }\n }\n },\n timeline: {\n lineStyle: {\n color: contrastColor\n },\n itemStyle: {\n normal: {\n color: colorPalette[1]\n }\n },\n label: {\n normal: {\n textStyle: {\n color: contrastColor\n }\n }\n },\n controlStyle: {\n normal: {\n color: contrastColor,\n borderColor: contrastColor\n }\n }\n },\n timeAxis: axisCommon(),\n logAxis: axisCommon(),\n valueAxis: axisCommon(),\n categoryAxis: axisCommon(),\n\n line: {\n symbol: 'circle'\n },\n graph: {\n color: colorPalette\n },\n gauge: {\n title: {\n textStyle: {\n color: contrastColor\n }\n }\n },\n candlestick: {\n itemStyle: {\n normal: {\n color: '#FD1050',\n color0: '#0CF49B',\n borderColor: '#FD1050',\n borderColor0: '#0CF49B'\n }\n }\n }\n};\ntheme.categoryAxis.splitLine.show = false;\necharts.registerTheme('dark', theme);\n","import React, { Component } from \"react\";\r\nimport { Icon, Button, ButtonGroup, IconName, Position, Popover, IProps, Menu, MenuDivider, MenuItem } from \"@blueprintjs/core\";\r\nimport styled from 'styled-components';\r\nimport { useTheme } from \"../../../theme\";\r\nimport { THEME } from \"../../../models\";\r\nimport ScrollableView from '../ui/ScrollableView';\r\nimport './dark';\r\nimport ReactEcharts from 'echarts-for-react';\r\n\r\n\r\nvar upColor = '#ec0000';\r\nvar upBorderColor = '#8A0000';\r\nvar downColor = '#00da3c';\r\nvar downBorderColor = '#008F28';\r\n\r\n// 数据意义:开盘(open),收盘(close),最低(lowest),最高(highest)\r\nvar data0 = splitData([\r\n ['2013/1/24', 2320.26, 2320.26, 2287.3, 2362.94],\r\n ['2013/1/25', 2300, 2291.3, 2288.26, 2308.38],\r\n ['2013/1/28', 2295.35, 2346.5, 2295.35, 2346.92],\r\n ['2013/1/29', 2347.22, 2358.98, 2337.35, 2363.8],\r\n ['2013/1/30', 2360.75, 2382.48, 2347.89, 2383.76],\r\n ['2013/1/31', 2383.43, 2385.42, 2371.23, 2391.82],\r\n ['2013/2/1', 2377.41, 2419.02, 2369.57, 2421.15],\r\n ['2013/2/4', 2425.92, 2428.15, 2417.58, 2440.38],\r\n ['2013/2/5', 2411, 2433.13, 2403.3, 2437.42],\r\n ['2013/2/6', 2432.68, 2434.48, 2427.7, 2441.73],\r\n ['2013/2/7', 2430.69, 2418.53, 2394.22, 2433.89],\r\n ['2013/2/8', 2416.62, 2432.4, 2414.4, 2443.03],\r\n ['2013/2/18', 2441.91, 2421.56, 2415.43, 2444.8],\r\n ['2013/2/19', 2420.26, 2382.91, 2373.53, 2427.07],\r\n ['2013/2/20', 2383.49, 2397.18, 2370.61, 2397.94],\r\n ['2013/2/21', 2378.82, 2325.95, 2309.17, 2378.82],\r\n ['2013/2/22', 2322.94, 2314.16, 2308.76, 2330.88],\r\n ['2013/2/25', 2320.62, 2325.82, 2315.01, 2338.78],\r\n ['2013/2/26', 2313.74, 2293.34, 2289.89, 2340.71],\r\n ['2013/2/27', 2297.77, 2313.22, 2292.03, 2324.63],\r\n ['2013/2/28', 2322.32, 2365.59, 2308.92, 2366.16],\r\n ['2013/3/1', 2364.54, 2359.51, 2330.86, 2369.65],\r\n ['2013/3/4', 2332.08, 2273.4, 2259.25, 2333.54],\r\n ['2013/3/5', 2274.81, 2326.31, 2270.1, 2328.14],\r\n ['2013/3/6', 2333.61, 2347.18, 2321.6, 2351.44],\r\n ['2013/3/7', 2340.44, 2324.29, 2304.27, 2352.02],\r\n ['2013/3/8', 2326.42, 2318.61, 2314.59, 2333.67],\r\n ['2013/3/11', 2314.68, 2310.59, 2296.58, 2320.96],\r\n ['2013/3/12', 2309.16, 2286.6, 2264.83, 2333.29],\r\n ['2013/3/13', 2282.17, 2263.97, 2253.25, 2286.33],\r\n ['2013/3/14', 2255.77, 2270.28, 2253.31, 2276.22],\r\n ['2013/3/15', 2269.31, 2278.4, 2250, 2312.08],\r\n ['2013/3/18', 2267.29, 2240.02, 2239.21, 2276.05],\r\n ['2013/3/19', 2244.26, 2257.43, 2232.02, 2261.31],\r\n ['2013/3/20', 2257.74, 2317.37, 2257.42, 2317.86],\r\n ['2013/3/21', 2318.21, 2324.24, 2311.6, 2330.81],\r\n ['2013/3/22', 2321.4, 2328.28, 2314.97, 2332],\r\n ['2013/3/25', 2334.74, 2326.72, 2319.91, 2344.89],\r\n ['2013/3/26', 2318.58, 2297.67, 2281.12, 2319.99],\r\n ['2013/3/27', 2299.38, 2301.26, 2289, 2323.48],\r\n ['2013/3/28', 2273.55, 2236.3, 2232.91, 2273.55],\r\n ['2013/3/29', 2238.49, 2236.62, 2228.81, 2246.87],\r\n ['2013/4/1', 2229.46, 2234.4, 2227.31, 2243.95],\r\n ['2013/4/2', 2234.9, 2227.74, 2220.44, 2253.42],\r\n ['2013/4/3', 2232.69, 2225.29, 2217.25, 2241.34],\r\n ['2013/4/8', 2196.24, 2211.59, 2180.67, 2212.59],\r\n ['2013/4/9', 2215.47, 2225.77, 2215.47, 2234.73],\r\n ['2013/4/10', 2224.93, 2226.13, 2212.56, 2233.04],\r\n ['2013/4/11', 2236.98, 2219.55, 2217.26, 2242.48],\r\n ['2013/4/12', 2218.09, 2206.78, 2204.44, 2226.26],\r\n ['2013/4/15', 2199.91, 2181.94, 2177.39, 2204.99],\r\n ['2013/4/16', 2169.63, 2194.85, 2165.78, 2196.43],\r\n ['2013/4/17', 2195.03, 2193.8, 2178.47, 2197.51],\r\n ['2013/4/18', 2181.82, 2197.6, 2175.44, 2206.03],\r\n ['2013/4/19', 2201.12, 2244.64, 2200.58, 2250.11],\r\n ['2013/4/22', 2236.4, 2242.17, 2232.26, 2245.12],\r\n ['2013/4/23', 2242.62, 2184.54, 2182.81, 2242.62],\r\n ['2013/4/24', 2187.35, 2218.32, 2184.11, 2226.12],\r\n ['2013/4/25', 2213.19, 2199.31, 2191.85, 2224.63],\r\n ['2013/4/26', 2203.89, 2177.91, 2173.86, 2210.58],\r\n ['2013/5/2', 2170.78, 2174.12, 2161.14, 2179.65],\r\n ['2013/5/3', 2179.05, 2205.5, 2179.05, 2222.81],\r\n ['2013/5/6', 2212.5, 2231.17, 2212.5, 2236.07],\r\n ['2013/5/7', 2227.86, 2235.57, 2219.44, 2240.26],\r\n ['2013/5/8', 2242.39, 2246.3, 2235.42, 2255.21],\r\n ['2013/5/9', 2246.96, 2232.97, 2221.38, 2247.86],\r\n ['2013/5/10', 2228.82, 2246.83, 2225.81, 2247.67],\r\n ['2013/5/13', 2247.68, 2241.92, 2231.36, 2250.85],\r\n ['2013/5/14', 2238.9, 2217.01, 2205.87, 2239.93],\r\n ['2013/5/15', 2217.09, 2224.8, 2213.58, 2225.19],\r\n ['2013/5/16', 2221.34, 2251.81, 2210.77, 2252.87],\r\n ['2013/5/17', 2249.81, 2282.87, 2248.41, 2288.09],\r\n ['2013/5/20', 2286.33, 2299.99, 2281.9, 2309.39],\r\n ['2013/5/21', 2297.11, 2305.11, 2290.12, 2305.3],\r\n ['2013/5/22', 2303.75, 2302.4, 2292.43, 2314.18],\r\n ['2013/5/23', 2293.81, 2275.67, 2274.1, 2304.95],\r\n ['2013/5/24', 2281.45, 2288.53, 2270.25, 2292.59],\r\n ['2013/5/27', 2286.66, 2293.08, 2283.94, 2301.7],\r\n ['2013/5/28', 2293.4, 2321.32, 2281.47, 2322.1],\r\n ['2013/5/29', 2323.54, 2324.02, 2321.17, 2334.33],\r\n ['2013/5/30', 2316.25, 2317.75, 2310.49, 2325.72],\r\n ['2013/5/31', 2320.74, 2300.59, 2299.37, 2325.53],\r\n ['2013/6/3', 2300.21, 2299.25, 2294.11, 2313.43],\r\n ['2013/6/4', 2297.1, 2272.42, 2264.76, 2297.1],\r\n ['2013/6/5', 2270.71, 2270.93, 2260.87, 2276.86],\r\n ['2013/6/6', 2264.43, 2242.11, 2240.07, 2266.69],\r\n ['2013/6/7', 2242.26, 2210.9, 2205.07, 2250.63],\r\n ['2013/6/13', 2190.1, 2148.35, 2126.22, 2190.1]\r\n]);\r\n\r\n\r\nfunction splitData(rawData: any[]) {\r\n var categoryData = [];\r\n var values = []\r\n for (var i = 0; i < rawData.length; i++) {\r\n categoryData.push(rawData[i].splice(0, 1)[0]);\r\n values.push(rawData[i])\r\n }\r\n return {\r\n categoryData: categoryData,\r\n values: values\r\n };\r\n}\r\n\r\nfunction calculateMA(dayCount: number) {\r\n var result = [];\r\n for (var i = 0, len = data0.values.length; i < len; i++) {\r\n if (i < dayCount) {\r\n result.push('-');\r\n continue;\r\n }\r\n var sum = 0;\r\n for (var j = 0; j < dayCount; j++) {\r\n sum += data0.values[i - j][1];\r\n }\r\n result.push(sum / dayCount);\r\n }\r\n return result;\r\n}\r\n\r\n\r\n\r\nvar option = {\r\n title: {\r\n left: 0\r\n },\r\n tooltip: {\r\n axisPointer: {\r\n type: 'cross',\r\n }\r\n },\r\n legend: {\r\n top: 10,\r\n data: ['日K', 'MA5', 'MA10', 'MA20', 'MA30']\r\n },\r\n grid: {\r\n left: '8%',\r\n right: '8%',\r\n bottom: '15%',\r\n show: true,\r\n backgroundColor: 'transparent',\r\n },\r\n xAxis: {\r\n type: 'category',\r\n data: data0.categoryData,\r\n scale: true,\r\n boundaryGap: false,\r\n axisLine: { onZero: false },\r\n splitLine: { show: false },\r\n splitNumber: 20,\r\n min: 'dataMin',\r\n max: 'dataMax'\r\n },\r\n yAxis: {\r\n scale: true,\r\n\r\n },\r\n dataZoom: [\r\n {\r\n type: 'inside',\r\n start: 20,\r\n end: 100\r\n },\r\n {\r\n show: true,\r\n type: 'slider',\r\n top: '90%',\r\n start: 20,\r\n end: 100,\r\n\r\n }\r\n ],\r\n series: [\r\n {\r\n name: '日K',\r\n type: 'candlestick',\r\n data: data0.values,\r\n itemStyle: {\r\n color: upColor,\r\n color0: downColor,\r\n borderColor: upBorderColor,\r\n borderColor0: downBorderColor\r\n },\r\n markPoint: {\r\n label: {\r\n normal: {\r\n formatter: function (param: any) {\r\n return param != null ? Math.round(param.value) : '';\r\n }\r\n }\r\n },\r\n data: [\r\n {\r\n name: 'XX标点',\r\n coord: ['2013/5/31', 2300],\r\n value: 2300,\r\n itemStyle: {\r\n color: 'rgb(41,60,85)'\r\n }\r\n },\r\n {\r\n name: 'highest value',\r\n type: 'max',\r\n valueDim: 'highest'\r\n },\r\n {\r\n name: 'lowest value',\r\n type: 'min',\r\n valueDim: 'lowest'\r\n },\r\n {\r\n name: 'average value on close',\r\n type: 'average',\r\n valueDim: 'close'\r\n }\r\n ],\r\n tooltip: {\r\n formatter: function (param: any) {\r\n return param.name + '
' + (param.data.coord || '');\r\n }\r\n }\r\n },\r\n markLine: {\r\n symbol: ['none', 'none'],\r\n data: [\r\n [\r\n {\r\n name: 'from lowest to highest',\r\n type: 'min',\r\n valueDim: 'lowest',\r\n symbol: 'circle',\r\n symbolSize: 10,\r\n label: {\r\n show: false\r\n },\r\n emphasis: {\r\n label: {\r\n show: false\r\n }\r\n }\r\n },\r\n {\r\n type: 'max',\r\n valueDim: 'highest',\r\n symbol: 'circle',\r\n symbolSize: 10,\r\n label: {\r\n show: false\r\n },\r\n emphasis: {\r\n label: {\r\n show: false\r\n }\r\n }\r\n }\r\n ],\r\n {\r\n name: 'min line on close',\r\n type: 'min',\r\n valueDim: 'close'\r\n },\r\n {\r\n name: 'max line on close',\r\n type: 'max',\r\n valueDim: 'close'\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n name: 'MA5',\r\n type: 'line',\r\n data: calculateMA(5),\r\n smooth: true,\r\n lineStyle: {\r\n opacity: 0.5\r\n }\r\n },\r\n {\r\n name: 'MA10',\r\n type: 'line',\r\n data: calculateMA(10),\r\n smooth: true,\r\n lineStyle: {\r\n opacity: 0.5\r\n }\r\n },\r\n {\r\n name: 'MA20',\r\n type: 'line',\r\n data: calculateMA(20),\r\n smooth: true,\r\n lineStyle: {\r\n opacity: 0.5\r\n }\r\n },\r\n {\r\n name: 'MA30',\r\n type: 'line',\r\n data: calculateMA(30),\r\n smooth: true,\r\n lineStyle: {\r\n opacity: 0.5\r\n }\r\n },\r\n\r\n ]\r\n};\r\n\r\nconst Wrapper = styled.div`\r\n height: 100%, width: 100%\r\n`;\r\n\r\ninterface IFileMenuProps extends IProps {\r\n shouldDismissPopover?: boolean;\r\n}\r\n\r\nconst FileMenu: React.SFC = props => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n);\r\n\r\nconst Widget = React.memo(() => {\r\n const [ theme ] = useTheme();\r\n\r\n const renderButton = (text: string, iconName: IconName) => {\r\n const rightIconName: IconName = \"caret-down\";\r\n return(\r\n } position={Position.BOTTOM_LEFT } >\r\n \r\n \r\n \r\n ;\r\n }\r\n return null;\r\n});\r\n\r\n\r\ninterface IntroductionPanelProps {\r\n course: Course | undefined\r\n}\r\nconst Padding = styled.div`padding: 5px`;\r\n\r\nconst IntroductionPanel = ({ course }: IntroductionPanelProps) => {\r\n if (course) {\r\n return \r\n

Mục tiêu

\r\n \r\n
\r\n \r\n \r\n {course.benefit && course.benefit.length > 0 && <>

Quyền lợi

\r\n \r\n
\r\n \r\n }\r\n {course.teachers && <>\r\n

{course.type == 0 ? \"Giảng viên\" : \"Diễn giả\"}

\r\n \r\n }\r\n ;\r\n }\r\n\r\n return null;\r\n}\r\n\r\ninterface ContentPanelProps {\r\n lessons: Lesson[] | undefined\r\n}\r\n\r\nconst ContentPanel = ({ lessons }: ContentPanelProps) => {\r\n if (lessons) {\r\n return
\r\n {lessons.map(lesson => )}\r\n
;\r\n }\r\n\r\n return null;\r\n}\r\n\r\ninterface LessonItemProps {\r\n lesson: Lesson\r\n}\r\n\r\nconst LessonItem = ({ lesson }: LessonItemProps) => {\r\n const [isOpen, setIsOpen] = useState(false);\r\n\r\n const handleClick = () => {\r\n setIsOpen(!isOpen);\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\ninterface TeachersProps {\r\n course: Course,\r\n teachers: Teacher[]\r\n}\r\n\r\nconst Teachers = ({ course, teachers }: TeachersProps) => {\r\n const getGenderName = (gender: number) => {\r\n switch (gender) {\r\n case 0:\r\n return \"Ông\";\r\n\r\n case 1:\r\n return \"Bà\";\r\n\r\n default:\r\n return \"\";\r\n }\r\n }\r\n\r\n const getRoleName = (roleId: number) => {\r\n if (course.type == 1) {\r\n return \"\";\r\n }\r\n\r\n switch (roleId) {\r\n case 1:\r\n return \" - Giảng viên chính\";\r\n\r\n default:\r\n return \" - Trợ giảng\";\r\n }\r\n }\r\n\r\n if (teachers) {\r\n return
\r\n {teachers.map(teacher => (\r\n
\r\n
\r\n \r\n
\r\n
\r\n

{getGenderName(teacher.gender)} {teacher.name}{getRoleName(teacher.roleId)}

\r\n \r\n
\r\n \r\n
\r\n
\r\n ))}\r\n
;\r\n\r\n }\r\n\r\n return null;\r\n}\r\n\r\ninterface MethodologyPanelProps {\r\n course: Course\r\n}\r\n\r\n//const courseIntroduction = '

Khóa học Online của FireAnt được thiết kế sử dụng nền tảng công nghệ hiện đại, giúp cho học viên có thể dễ dàng tiếp cận nội dung học tập trực tuyến trên máy tính, điện thoại hoặc máy tính bảng.

Học viên tương tác trực tiếp với giảng viên trên phần mềm FireAnt Learning. Giảng viên hướng dẫn các thao tác trực tiếp và học viên có thể dễ dàng theo dõi và làm theo.

Để học trực tuyến trên máy tính, học viên truy cập địa chỉ learning.fireant.vn, chọn chức năng Vào lớp học:.



Học viên có thể học ngay trên điện thoại, máy tính bảng bằng cách cài phần mềm FireAnt Mobile trên các chợ Apple StoreAndroid Market, và sử dụng chức năng Học tập trực tuyến trên phần mềm:

';\r\n//const courseIntroduction = '

Khóa học được tổ chức tại hệ thống trung tâm của FireAnt Academy. Trung tâm được đầu tư cơ sở vật chất hiện đại, môi trường gần gũi, thân thiện giúp học viên dễ dàng tương tác trực tiếp với giảng viên.

Học viên có thể trực tiếp trải nghiệm các phần mềm hỗ trợ đầu tư tốt nhất trên thị trường do FireAnt phát triển, hoặc các phần mềm phân tích trên thế giới đang được giới đầu tư quan tâm.

';\r\n\r\nconst MethodologyPanel = ({ course }: MethodologyPanelProps) => {\r\n return \r\n
\r\n ;\r\n}\r\n\r\nexport default CourseDetail;\r\n","import { Divider, Alignment, Button, Classes, Menu, MenuDivider, MenuItem, Navbar, NavbarDivider, NavbarGroup, NavbarHeading, Popover, Position } from \"@blueprintjs/core\";\r\nimport * as React from \"react\";\r\nimport { useTheme } from \"../../theme\";\r\nimport { THEME } from \"../../models\";\r\nimport { useAuth } from \"../../auth\";\r\nimport styled from 'styled-components';\r\n\r\nconst UserAvatarContainer = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n\twidth: 100%;\r\n flex: 1;\r\n justify-content: center;\r\n align-items: center;\r\n padding: 15px;\r\n`;\r\n\r\nconst UserAvatar = styled.img`\r\n width: 60px;\r\n height: 60px;\r\n border-radius: 30px;\r\n`;\r\n\r\nconst UserMenu = () => {\r\n const [theme, setTheme] = useTheme();\r\n const [user, roles, signIn, signOut] = useAuth();\r\n\r\n const switchTheme = React.useCallback(() => {\r\n if (theme === (\"light\" as THEME)) {\r\n document.body.classList.add(\"bp3-dark\");\r\n } else {\r\n document.body.classList.remove(\"bp3-dark\");\r\n }\r\n setTheme(theme === (\"dark\" as THEME) ? (\"light\" as THEME) : (\"dark\" as THEME));\r\n\r\n }, [theme]);\r\n\r\n const viewSettings = () => {\r\n window.location.href = \"https://myaccount.fireant.vn\";\r\n }\r\n\r\n const viewProfile = () => {\r\n window.location.href = \"https://myaccount.fireant.vn\";\r\n }\r\n\r\n if (user == null) {\r\n return
\r\n }\r\n position={Position.BOTTOM_RIGHT}\r\n minimal={true}>\r\n