{"version":3,"sources":["components/context-menu/globalEventListener.js","components/context-menu/context-menu.js","components/dropdown-menu/item-dropdown-menu.js","components/index-viewer.js","pages/wiki/side-panel.js","components/wiki-dir-list-view/wiki-dir-list-item.js","components/wiki-dir-list-view/wiki-dir-list-view.js","pages/wiki/main-panel.js","wiki.js","components/wiki-markdown-viewer.js","components/tree-view/tree-node-view.js","components/tree-view/tree-view.js","components/context-menu/actions.js","components/context-menu/helpers.js"],"names":["handleShowEvent","event","id","callbacks","hasOwnProp","show","handleHideEvent","hide","register","showCallback","hideCallback","uniqueId","unregister","this","canUseDOM","window","addEventListener","MENU_SHOW","MENU_HIDE","ContextMenu","props","registerHandlers","document","handleOutsideClick","handleHide","handleKeyNavigation","unregisterHandlers","removeEventListener","handleShow","e","detail","state","isVisible","position","x","y","currentObject","menuList","setState","callIfExists","onShowMenu","onHideMenu","menu","contains","target","hideMenu","handleMouseLeave","preventDefault","hideOnLeave","handleContextMenu","keyCode","getMenuPosition","menuStyles","top","left","innerWidth","innerHeight","rect","getBoundingClientRect","height","width","getRTLMenuPosition","onMenuItemClick","stopPropagation","operation","Utils","getEventData","onContextMenu","listenId","listener","wrapper","requestAnimationFrame","setTimeout","rtl","style","opacity","pointerEvents","role","className","display","ref","map","menuItem","index","data-operation","key","onClick","value","React","Component","ItemDropdownMenu","isItemMenuShow","unfreezeItem","onDropdownToggleKeyDown","onDropdownToggleClick","toggleOperationMenu","freezeItem","onMenuItemKeyDown","item","isHandleContextMenuEvent","listenerId","getMenuList","nextProps","name","toggleClass","tagName","length","isOpen","toggle","data-toggle","title","gettext","aria-label","aria-expanded","onKeyDown","divider","tag","tabIndex","defaultProps","TreeNode","href","parentNode","children","nodeList","forEach","node","setParent","IndexContentViewer","bindClickEvent","links","querySelectorAll","link","onLinkClick","removeClickEvent","currentPath","getAttribute","getLink","changeInlineNode","url","type","isPublicWiki","data","src","RegExp","serviceURL","repoID","test","indexOf","index2","imagePath","substring","slug","isInternalMarkdownLink","path","getPathFromInternalMarkdownLink","isInternalDirLink","getPathFromInternalDirLink","getRootNode","deserialize","indexContent","changeMarkdownNodes","treeRoot","transSlateToTree","setNodePath","parentNodePath","child","slateNodes","parentTreeNode","treeNodes","slateNode","transParagraph","paragraphNode","treeNode","listNode","addChildren","linkNode","textNode","text","FolderItem","toggleExpanded","expanded","renderLink","data-path","Fragment","SidePanel","renderIndexView","renderTreeView","treeData","isNodeMenuShow","onNodeClick","onNodeCollapse","onNodeExpanded","closeSideBar","onCloseSidePanel","onCloseSide","isTreeDataLoading","indexNode","username","permission","siteRoot","WikiDirListItem","onMouseEnter","highlight","onMouseLeave","onDirentClick","dirent","joinPath","iconUrl","getDirentIcon","isDesktop","alt","size","mtime_relative","WikiDirListView","direntList","MainPanel","onMenuClick","onEditClick","open","onMainNavBarClick","renderNavPath","paths","split","nodePath","onSearchedClick","searchPlaceholder","errMessage","isViewingFile","pathExist","isDataLoading","isViewFile","content","isPro","isPublic","placeholder","markdownContent","isFileLoading","lastModified","latestContributor","isWiki","Wiki","loadWikiData","initialPath","loadSidePanel","isDir","showDir","fileUrl","encodePath","history","pushState","showFile","hasIndex","loadIndexNode","loadNodeAndParentsByPath","seafileAPI","listWikiDir","then","res","tree","addFirstResponseListToNode","dirent_list","root","getNodeByPath","indexPath","getWikiFileContent","catch","isLoadFailed","dirPath","loadDirentList","filePath","moment","unix","last_modified","fromNow","latest_contributor","hash","location","replaceState","Dirent","filter","toLowerCase","sortDirents","loadTreeNodeByPath","clone","isLoaded","isExpanded","currentNode","addResponseListToNode","isMarkdownFile","getDirName","results","i","object","parent_dir","push","isWikiInternalMarkdownLink","getPathFromWikiInternalMarkdownLink","isWikiInternalDirLink","getPathFromWikiInternalDirLink","onpopstate","is_dir","slice","getPaths","treeHelper","expandNode","sharedToken","direntPath","w","collapseNode","list","buildTree","homePath","query","contentClassName","ReactDOM","render","getElementById","contentClass","WikiMarkdownViewer","getTitlesInfo","titlesInfo","headingList","offsetTop","onScrollHandler","activeTitleIndex","contentScrollTop","markdownContainer","current","scrollTop","titlesLength","originalPath","lastIndexOf","pathNormalize","isInternalFileLink","replace","match","p1","p2","p3","modifyValueBeforeRender","renderMarkdown","isTOCShow","showTOC","scriptSource","mediaUrl","createRef","onScroll","bind","MarkdownViewer","TreeNodeView","isItemFreezed","isShowOperationMenu","isHighlight","onMouseOver","getUserPermission","isCustomPermission","customPermission","canPreview","preview","canModify","modify","onLoadToggle","onNodeDragStart","isIEBrower","canDrag","onNodeDragEnter","isNodeDropShow","onNodeDragMove","onNodeDragLeave","onNodeDrop","onItemMouseDown","button","onItemContextMenu","handleContextClick","getNodeTypeAndIcon","icon","suffix","calculateMenuList","NEW_FOLDER","TextTranslation","NEW_FILE","COPY","MOVE","RENAME","DELETE","OPEN_VIA_CLIENT","userPerm","canDelete","delete","canCopy","copy","renderChildren","paddingLeft","hasChildren","hlClass","onMouseDown","draggable","onDragStart","onDragEnter","onDragLeave","onDragOver","onDrop","TreeView","onItemMove","repo","selectedPath","dragStartNodeData","nodeDirent","nodeParentPath","nodeRootPath","JSON","stringify","dataTransfer","effectAllowed","setData","canDrop","persist","isTreeViewDropTipShow","dropEffect","files","getData","parse","dropNodeData","Array","isArray","onMoveItems","currentRepoInfo","onItemsMove","includes","destRepo","destDirentPath","direntPaths","some","clientX","touches","pageX","clientY","pageY","posX","posY","showMenuConfig","showMenu","dispatchGlobalEvent","eventName","opts","CustomEvent","createEvent","initCustomEvent","dispatchEvent","assign","store","func","args","obj","prop","Object","prototype","hasOwnProperty","call","Math","random","toString","Boolean","createElement"],"mappings":"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","file":"static/js/wiki.chunk.js","sourcesContent":["import { MENU_SHOW, MENU_HIDE } from './actions';\nimport { uniqueId, hasOwnProp, canUseDOM } from './helpers';\n\nclass GlobalEventListener {\n\n constructor() {\n this.callbacks = {};\n\n if (canUseDOM) {\n window.addEventListener(MENU_SHOW, this.handleShowEvent);\n window.addEventListener(MENU_HIDE, this.handleHideEvent);\n }\n }\n\n handleShowEvent = (event) => {\n for (const id in this.callbacks) {\n if (hasOwnProp(this.callbacks, id)) this.callbacks[id].show(event);\n }\n }\n\n handleHideEvent = (event) => {\n for (const id in this.callbacks) {\n if (hasOwnProp(this.callbacks, id)) this.callbacks[id].hide(event);\n }\n }\n\n register = (showCallback, hideCallback) => {\n const id = uniqueId();\n\n this.callbacks[id] = {\n show: showCallback,\n hide: hideCallback\n };\n\n return id;\n }\n\n unregister = (id) => {\n if (id && this.callbacks[id]) {\n delete this.callbacks[id];\n }\n }\n}\n\nexport default new GlobalEventListener();\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport listener from './globalEventListener';\nimport { hideMenu } from './actions';\nimport { callIfExists } from './helpers';\nimport { Utils } from '../../utils/utils';\n\nconst propTypes = {\n id: PropTypes.string.isRequired,\n rtl: PropTypes.bool,\n onMenuItemClick: PropTypes.func.isRequired,\n onShowMenu: PropTypes.func,\n onHideMenu: PropTypes.func,\n};\n\nclass ContextMenu extends React.Component {\n\n constructor(props) {\n super(props);\n\n this.state = {\n x: 0,\n y: 0,\n isVisible: false,\n currentObject: null,\n menuList: [],\n };\n }\n\n componentDidMount() {\n this.listenId = listener.register(this.handleShow, this.handleHide);\n }\n\n componentDidUpdate () {\n if (this.state.isVisible) {\n const wrapper = window.requestAnimationFrame || setTimeout;\n\n wrapper(() => {\n const { x, y } = this.state;\n const { top, left } = this.props.rtl ? this.getRTLMenuPosition(x, y) : this.getMenuPosition(x, y);\n\n wrapper(() => {\n if (!this.menu) return;\n this.menu.style.top = `${top}px`;\n this.menu.style.left = `${left}px`;\n this.menu.style.opacity = 1;\n this.menu.style.pointerEvents = 'auto';\n });\n });\n } else {\n if (!this.menu) return;\n this.menu.style.opacity = 0;\n this.menu.style.pointerEvents = 'none';\n }\n }\n\n componentWillUnmount() {\n if (this.listenId) {\n listener.unregister(this.listenId);\n }\n\n this.unregisterHandlers();\n }\n\n registerHandlers = () => {\n document.addEventListener('mousedown', this.handleOutsideClick);\n document.addEventListener('touchstart', this.handleOutsideClick);\n document.addEventListener('scroll', this.handleHide);\n document.addEventListener('contextmenu', this.handleHide);\n document.addEventListener('keydown', this.handleKeyNavigation);\n window.addEventListener('resize', this.handleHide);\n }\n\n unregisterHandlers = () => {\n document.removeEventListener('mousedown', this.handleOutsideClick);\n document.removeEventListener('touchstart', this.handleOutsideClick);\n document.removeEventListener('scroll', this.handleHide);\n document.removeEventListener('contextmenu', this.handleHide);\n document.removeEventListener('keydown', this.handleKeyNavigation);\n window.removeEventListener('resize', this.handleHide);\n }\n\n handleShow = (e) => {\n if (e.detail.id !== this.props.id || this.state.isVisible) return;\n\n const { x, y } = e.detail.position;\n const { currentObject, menuList} = e.detail;\n\n this.setState({ isVisible: true, x, y, currentObject, menuList });\n this.registerHandlers();\n callIfExists(this.props.onShowMenu, e);\n }\n\n handleHide = (e) => {\n if (this.state.isVisible && (!e.detail || !e.detail.id || e.detail.id === this.props.id)) {\n this.unregisterHandlers();\n this.setState({ isVisible: false});\n callIfExists(this.props.onHideMenu, e);\n }\n }\n\n handleOutsideClick = (e) => {\n if (!this.menu.contains(e.target)) hideMenu();\n }\n\n handleMouseLeave = (event) => {\n event.preventDefault();\n\n if (this.props.hideOnLeave) hideMenu();\n }\n\n handleContextMenu = (e) => {\n this.handleHide(e);\n }\n\n handleKeyNavigation = (e) => {\n if (this.state.isVisible === false) {\n return;\n }\n e.preventDefault();\n this.hideMenu(e);\n }\n\n hideMenu = (e) => {\n if (e.keyCode === 27 || e.keyCode === 13) { // ECS or enter\n hideMenu();\n }\n }\n\n getMenuPosition = (x = 0, y = 0) => {\n let menuStyles = {\n top: y,\n left: x\n };\n\n if (!this.menu) return menuStyles;\n\n const { innerWidth, innerHeight } = window;\n const rect = this.menu.getBoundingClientRect();\n\n if (y + rect.height > innerHeight) {\n menuStyles.top -= rect.height;\n }\n\n if (x + rect.width > innerWidth) {\n menuStyles.left -= rect.width;\n }\n\n if (menuStyles.top < 0) {\n menuStyles.top = rect.height < innerHeight ? (innerHeight - rect.height) / 2 : 0;\n }\n\n if (menuStyles.left < 0) {\n menuStyles.left = rect.width < innerWidth ? (innerWidth - rect.width) / 2 : 0;\n }\n\n return menuStyles;\n }\n\n getRTLMenuPosition = (x = 0, y = 0) => {\n let menuStyles = {\n top: y,\n left: x\n };\n\n if (!this.menu) return menuStyles;\n\n const { innerWidth, innerHeight } = window;\n const rect = this.menu.getBoundingClientRect();\n\n // Try to position the menu on the left side of the cursor\n menuStyles.left = x - rect.width;\n\n if (y + rect.height > innerHeight) {\n menuStyles.top -= rect.height;\n }\n\n if (menuStyles.left < 0) {\n menuStyles.left += rect.width;\n }\n\n if (menuStyles.top < 0) {\n menuStyles.top = rect.height < innerHeight ? (innerHeight - rect.height) / 2 : 0;\n }\n\n if (menuStyles.left + rect.width > innerWidth) {\n menuStyles.left = rect.width < innerWidth ? (innerWidth - rect.width) / 2 : 0;\n }\n\n return menuStyles;\n }\n\n\n onMenuItemClick = (event) => {\n event.stopPropagation();\n let operation = Utils.getEventData(event, 'operation');\n let currentObject = this.state.currentObject;\n this.props.onMenuItemClick(operation, currentObject, event);\n }\n\n onContextMenu = (event) => {\n event.stopPropagation();\n }\n\n render() {\n const inlineStyle = { position: 'fixed', opacity: 0, pointerEvents: 'none', display: 'block' };\n return (\n
{ this.menu = menu; }}>\n {this.state.menuList.map((menuItem, index) => {\n if (menuItem === 'Divider') {\n return
;\n } else {\n return (\n \n {menuItem.value}\n \n );\n }\n })}\n
\n );\n }\n}\n\nContextMenu.propTypes = propTypes;\n\nexport default ContextMenu;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport listener from '../context-menu/globalEventListener';\nimport { Dropdown, ButtonDropdown, DropdownMenu, DropdownToggle, DropdownItem } from 'reactstrap';\nimport { gettext } from '../../utils/constants';\nimport { Utils } from '../../utils/utils';\n\nconst propTypes = {\n tagName: PropTypes.string,\n item: PropTypes.object.isRequired,\n toggleClass: PropTypes.string,\n isHandleContextMenuEvent: PropTypes.bool,\n getMenuList: PropTypes.func.isRequired,\n onMenuItemClick: PropTypes.func.isRequired,\n freezeItem: PropTypes.func,\n unfreezeItem: PropTypes.func,\n};\n\nclass ItemDropdownMenu extends React.Component {\n\n static defaultProps = {\n isHandleContextMenuEvent: true,\n toggleClass: 'sf2-icon-caret-down'\n };\n\n constructor(props) {\n super(props);\n this.state = {\n menuList: [],\n isItemMenuShow: false,\n };\n }\n\n componentDidMount() {\n if (this.props.isHandleContextMenuEvent) {\n this.listenerId = listener.register(this.onShowMenu, this.onHideMenu);\n }\n let { item } = this.props;\n let menuList = this.props.getMenuList(item);\n this.setState({menuList: menuList});\n }\n\n componentWillReceiveProps(nextProps) { // for toolbar item operation\n let { item } = nextProps;\n if (item.name !== this.props.item.name) {\n let menuList = this.props.getMenuList(item);\n this.setState({menuList: menuList});\n }\n }\n\n componentWillUnmount() {\n if (this.props.isHandleContextMenuEvent && this.listenerId) {\n listener.unregister(this.listenerId);\n }\n }\n\n onShowMenu = () => {\n // nothing todo\n }\n\n onHideMenu = () => {\n if (this.state.isItemMenuShow) {\n this.setState({isItemMenuShow: false});\n if (typeof(this.props.unfreezeItem) === 'function') {\n this.props.unfreezeItem();\n }\n }\n }\n\n onDropdownToggleKeyDown = (e) => {\n if (e.key == 'Enter' || e.key == 'Space') {\n this.onDropdownToggleClick(e);\n }\n }\n\n onDropdownToggleClick = (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n this.toggleOperationMenu();\n }\n\n toggleOperationMenu = () => {\n this.setState(\n {isItemMenuShow: !this.state.isItemMenuShow},\n () => {\n if (this.state.isItemMenuShow && typeof(this.props.freezeItem) === 'function') {\n this.props.freezeItem();\n } else if (!this.state.isItemMenuShow && typeof(this.props.unfreezeItem) === 'function') {\n this.props.unfreezeItem();\n }\n }\n );\n }\n\n onMenuItemKeyDown = (e) => {\n if (e.key == 'Enter' || e.key == 'Space') {\n this.onMenuItemClick(e);\n }\n }\n\n onMenuItemClick = (event) => {\n let operation = Utils.getEventData(event, 'toggle');\n let item = this.props.item;\n this.props.onMenuItemClick(operation, event, item);\n }\n\n render() {\n let menuList = this.state.menuList;\n let { toggleClass, tagName } = this.props;\n toggleClass = 'sf-dropdown-toggle ' + toggleClass;\n\n if (!menuList.length) {\n return '';\n }\n\n if (tagName && tagName === 'button') {\n return (\n \n \n \n \n {menuList.map((menuItem, index) => {\n if (menuItem === 'Divider') {\n return ;\n } else {\n return (\n {menuItem.value}\n );\n }\n })}\n \n \n );\n }\n\n return (\n \n \n \n {menuList.map((menuItem, index) => {\n if (menuItem === 'Divider') {\n return ;\n } else {\n return (\n {menuItem.value}\n );\n }\n })}\n \n \n );\n }\n}\n\nItemDropdownMenu.propTypes = propTypes;\n\nexport default ItemDropdownMenu;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { repoID, slug, serviceURL, isPublicWiki } from '../utils/constants';\nimport { Utils } from '../utils/utils';\nimport { deserialize } from '@seafile/seafile-editor';\nimport'../css/index-viewer.css';\n\nconst viewerPropTypes = {\n indexContent: PropTypes.string.isRequired,\n onLinkClick: PropTypes.func.isRequired,\n};\n\nclass TreeNode {\n\n constructor({ name, href, parentNode }) {\n this.name = name;\n this.href = href;\n this.parentNode = parentNode || null;\n this.children = [];\n }\n\n setParent(parentNode) {\n this.parentNode = parentNode;\n }\n\n addChildren(nodeList) {\n nodeList.forEach((node) => {\n node.setParent(this);\n });\n this.children = nodeList;\n }\n}\n\nclass IndexContentViewer extends React.Component {\n\n constructor(props) {\n super(props);\n this.links = [];\n this.treeRoot = new TreeNode({ name: '', href: '' });\n this.state = {\n currentPath: '',\n };\n }\n\n componentWillMount() {\n this.getRootNode();\n }\n\n componentDidMount() {\n this.bindClickEvent();\n }\n\n componentWillReceiveProps() {\n this.removeClickEvent();\n }\n\n componentDidUpdate() {\n this.bindClickEvent();\n }\n\n componentWillUnmount() {\n this.removeClickEvent();\n }\n\n bindClickEvent = () => {\n const contentClass = 'wiki-nav-content';\n this.links = document.querySelectorAll(`.${contentClass} a`);\n this.links.forEach(link => {\n link.addEventListener('click', this.onLinkClick);\n });\n }\n\n removeClickEvent = () => {\n this.links.forEach(link => {\n link.removeEventListener('click', this.onLinkClick);\n });\n }\n\n onLinkClick = (event) => {\n event.preventDefault();\n const currentPath = event.target.getAttribute('data-path');\n if (currentPath === this.state.currentPath) {\n return;\n } else if (currentPath) {\n this.setState({ currentPath: currentPath });\n }\n const link = this.getLink(event.target);\n if (link) this.props.onLinkClick(link);\n }\n\n getLink = (node) => {\n const tagName = node.tagName;\n if (!tagName || tagName === 'HTML') return;\n if (tagName === 'A') {\n return node.href;\n } else {\n return this.getLink(node.parentNode);\n }\n }\n\n changeInlineNode = (item) => {\n if (item.type == 'link' || item.type === 'image') {\n let url;\n\n // change image url\n if (item.type == 'image' && isPublicWiki) {\n url = item.data.src;\n const re = new RegExp(serviceURL + '/lib/' + repoID +'/file.*raw=1');\n // different repo\n if (!re.test(url)) {\n return;\n }\n // get image path\n let index = url.indexOf('/file');\n let index2 = url.indexOf('?');\n const imagePath = url.substring(index + 5, index2);\n // replace url\n item.data.src = serviceURL + '/view-image-via-public-wiki/?slug=' + slug + '&path=' + imagePath;\n }\n\n else if (item.type == 'link') {\n url = item.data.href;\n /* eslint-disable */\n let expression = /((([A-Za-z]{3,9}:(?:\\/\\/)?)(?:[\\-;:&=\\+\\$,\\w]+@)?[A-Za-z0-9\\.\\-]+|(?:www\\.|[\\-;:&=\\+\\$,\\w]+@)[A-Za-z0-9\\.\\-]+)((?:\\/[\\+~%\\/\\.\\w\\-_]*)?\\??(?:[\\-\\+=&;%@\\.\\w_]*)#?(?:[\\.\\!\\/\\\\\\w]*))?)/\n /* eslint-enable */\n let re = new RegExp(expression);\n\n // Solving relative paths\n if (!re.test(url)) {\n item.data.href = serviceURL + '/published/' + slug + '/' + url;\n }\n // change file url\n else if (Utils.isInternalMarkdownLink(url, repoID)) {\n let path = Utils.getPathFromInternalMarkdownLink(url, repoID);\n // replace url\n item.data.href = serviceURL + '/published/' + slug + path;\n }\n // change dir url\n else if (Utils.isInternalDirLink(url, repoID)) {\n let path = Utils.getPathFromInternalDirLink(url, repoID);\n // replace url\n item.data.href = serviceURL + '/published/' + slug + path;\n }\n }\n }\n\n return item;\n }\n\n getRootNode = () => {\n let value = deserialize(this.props.indexContent);\n const newNodes = Utils.changeMarkdownNodes(value, this.changeInlineNode);\n newNodes.map((node) => {\n if (node.type === 'unordered_list' || node.type === 'ordered_list') {\n let treeRoot = this.transSlateToTree(node.children, this.treeRoot);\n this.setNodePath(treeRoot, '/');\n this.treeRoot = treeRoot;\n }\n });\n }\n\n setNodePath = (node, parentNodePath) => {\n let name = node.name;\n let path = parentNodePath === '/' ? parentNodePath + name : parentNodePath + '/' + name;\n node.path = path;\n if (node.children.length > 0) {\n node.children.map(child => {\n this.setNodePath(child, path);\n });\n }\n }\n\n // slateNodes is list items of an unordered list or ordered list, translate them to treeNode and add to parentTreeNode\n transSlateToTree = (slateNodes, parentTreeNode) => {\n let treeNodes = slateNodes.map((slateNode) => {\n // item has children(unordered list)\n if (slateNode.children.length === 2 && (slateNode.children[1].type === 'unordered_list' || slateNode.children[1].type === 'ordered_list')) {\n // slateNode.nodes[0] is paragraph, create TreeNode, set name and href\n const paragraphNode = slateNode.children[0];\n const treeNode = this.transParagraph(paragraphNode);\n // slateNode.nodes[1] is list, set it as TreeNode's children\n const listNode = slateNode.children[1];\n // Add sub list items to the tree node\n return this.transSlateToTree(listNode.children, treeNode);\n } else {\n // item doesn't have children list\n if (slateNode.children[0] && (slateNode.children[0].type === 'paragraph')) {\n return this.transParagraph(slateNode.children[0]);\n } else {\n // list item contain table/code_block/blockqupta\n return new TreeNode({ name: '', href: '' });\n }\n }\n });\n parentTreeNode.addChildren(treeNodes);\n return parentTreeNode;\n }\n\n // translate slate_paragraph_node to treeNode\n transParagraph = (paragraphNode) => {\n let treeNode;\n if (paragraphNode.children[1] && paragraphNode.children[1].type === 'link') {\n // paragraph node is a link node\n const linkNode = paragraphNode.children[1];\n const textNode = linkNode.children[0];\n let name = textNode ? textNode.text : '';\n treeNode = new TreeNode({ name: name, href: linkNode.data.href });\n } else if (paragraphNode.children[0]) {\n // paragraph first child node is a text node, then get node name\n const textNode = paragraphNode.children[0];\n let name = textNode.text ? textNode.text : '';\n treeNode = new TreeNode({ name: name, href: '' });\n } else {\n treeNode = new TreeNode({ name: '', href: '' });\n }\n return treeNode;\n }\n\n render() {\n return (\n
\n \n
\n );\n }\n}\n\nIndexContentViewer.propTypes = viewerPropTypes;\n\nconst FolderItemPropTypes = {\n node: PropTypes.object.isRequired,\n bindClickEvent: PropTypes.func.isRequired,\n currentPath: PropTypes.string,\n};\n\nclass FolderItem extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n expanded: false\n };\n }\n\n toggleExpanded = () => {\n this.setState({ expanded: !this.state.expanded }, () => {\n if (this.state.expanded) this.props.bindClickEvent();\n });\n }\n\n renderLink = ({ href, name, path }) => {\n const className = `wiki-nav-content ${path === this.props.currentPath ? 'wiki-nav-content-highlight' : ''}`;\n if (href && name) {\n return
{name}
;\n } else if (name) {\n return
{name}
;\n } else {\n return null;\n }\n }\n\n componentDidMount() {\n if (this.props.node && !this.props.node.parentNode) {\n this.setState({ expanded: true }, () => {\n this.props.bindClickEvent();\n });\n }\n }\n\n render() {\n const { node } = this.props;\n if (node.children.length > 0) {\n return (\n \n {node.parentNode &&\n \n \n {this.state.expanded ? : }\n \n {this.renderLink(node)}\n \n }\n {this.state.expanded && node.children.map((child, index) => {\n return (\n
\n \n
\n );\n })}\n
\n );\n } else {\n return this.renderLink(node);\n }\n }\n}\n\nFolderItem.propTypes = FolderItemPropTypes;\n\nexport default IndexContentViewer;\n","import React, { Component, Fragment } from 'react';\nimport PropTypes from 'prop-types';\nimport { gettext, siteRoot, repoID, slug, username, permission } from '../../utils/constants';\nimport Logo from '../../components/logo';\nimport Loading from '../../components/loading';\nimport TreeView from '../../components/tree-view/tree-view';\nimport IndexContentViewer from '../../components/index-viewer';\n\nconst propTypes = {\n closeSideBar: PropTypes.bool.isRequired,\n isTreeDataLoading: PropTypes.bool.isRequired,\n treeData: PropTypes.object.isRequired,\n indexNode: PropTypes.object,\n indexContent: PropTypes.string.isRequired,\n currentPath: PropTypes.string.isRequired,\n onCloseSide: PropTypes.func.isRequired,\n onNodeClick: PropTypes.func.isRequired,\n onNodeCollapse: PropTypes.func.isRequired,\n onNodeExpanded: PropTypes.func.isRequired,\n onLinkClick: PropTypes.func.isRequired,\n};\n\nclass SidePanel extends Component {\n\n constructor(props) {\n super(props);\n this.isNodeMenuShow = false;\n }\n\n renderIndexView = () => {\n return (\n \n

\n {gettext('Contents')}\n

\n
\n \n
\n
\n );\n }\n\n renderTreeView = () => {\n return (\n \n

{gettext('Contents')}

\n
\n {this.props.treeData && (\n \n )}\n
\n
\n );\n }\n\n render() {\n return (\n
\n
\n \n
\n
\n {this.props.isTreeDataLoading && }\n {!this.props.isTreeDataLoading && this.props.indexNode && this.renderIndexView() }\n {!this.props.isTreeDataLoading && !this.props.indexNode && this.renderTreeView() }\n {(username && permission) &&
{gettext('Go to Library')}
}\n
\n
\n );\n }\n}\n\nSidePanel.propTypes = propTypes;\n\nexport default SidePanel;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { siteRoot } from '../../utils/constants';\nimport { Utils } from '../../utils/utils';\n\nconst propTypes = {\n path: PropTypes.string.isRequired,\n dirent: PropTypes.object.isRequired,\n onDirentClick: PropTypes.func.isRequired,\n};\n\nclass WikiDirListItem extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n highlight: false,\n };\n }\n\n onMouseEnter = () => {\n this.setState({highlight: true});\n }\n\n onMouseLeave = () => {\n this.setState({highlight: false});\n }\n\n onContextMenu = (event) => {\n event.preventDefault();\n event.stopPropagation();\n }\n\n onDirentClick = (e) => {\n e.preventDefault();\n this.props.onDirentClick(this.props.dirent);\n }\n\n render() {\n let { path, dirent } = this.props;\n let href = siteRoot + 'published' + Utils.joinPath(path, dirent.name);\n let iconUrl = Utils.getDirentIcon(dirent);\n\n const isDesktop = Utils.isDesktop();\n return isDesktop ? (\n \n \n \"\"\n \n \n {dirent.name}\n \n {dirent.size}\n {dirent.mtime_relative}\n \n ) : (\n \n \n \"\"\n \n \n {dirent.name}\n
\n {dirent.size}\n {dirent.mtime_relative}\n \n \n );\n }\n}\n\nWikiDirListItem.propTypes = propTypes;\n\nexport default WikiDirListItem;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { gettext } from '../../utils/constants';\nimport { Utils } from '../../utils/utils';\nimport WikiDirListItem from './wiki-dir-list-item';\n\nconst propTypes = {\n path: PropTypes.string.isRequired,\n direntList: PropTypes.array.isRequired,\n onDirentClick: PropTypes.func.isRequired,\n};\n\nclass WikiDirListView extends React.Component {\n\n render() {\n const isDesktop = Utils.isDesktop();\n return (\n \n \n {isDesktop ? (\n \n \n \n \n \n \n ) : (\n \n \n \n \n )}\n \n \n {this.props.direntList.length !== 0 && this.props.direntList.map((dirent, index) => {\n return (\n \n );\n })}\n \n
{gettext('Name')}{gettext('Size')}{gettext('Last Update')}
\n );\n }\n}\n\nWikiDirListView.propTypes = propTypes;\n\nexport default WikiDirListView;\n","import React, { Component, Fragment } from 'react';\nimport PropTypes from 'prop-types';\nimport { gettext, repoID, slug, siteRoot, username, isPro } from '../../utils/constants';\nimport WikiMarkdownViewer from '../../components/wiki-markdown-viewer';\nimport WikiDirListView from '../../components/wiki-dir-list-view/wiki-dir-list-view';\nimport Loading from '../../components/loading';\nimport { Utils } from '../../utils/utils';\nimport Search from '../../components/search/search';\nimport Notification from '../../components/common/notification';\nimport Account from '../../components/common/account';\n\nconst propTypes = {\n path: PropTypes.string.isRequired,\n pathExist: PropTypes.bool.isRequired,\n isViewFile: PropTypes.bool.isRequired,\n isDataLoading: PropTypes.bool.isRequired,\n content: PropTypes.string,\n permission: PropTypes.string,\n lastModified: PropTypes.string,\n latestContributor: PropTypes.string,\n direntList: PropTypes.array.isRequired,\n onMenuClick: PropTypes.func.isRequired,\n onSearchedClick: PropTypes.func.isRequired,\n onMainNavBarClick: PropTypes.func.isRequired,\n onDirentClick: PropTypes.func.isRequired,\n onLinkClick: PropTypes.func.isRequired,\n};\n\nclass MainPanel extends Component {\n\n onMenuClick = () => {\n this.props.onMenuClick();\n }\n\n onEditClick = (e) => {\n e.preventDefault();\n let url = siteRoot + 'lib/' + repoID + '/file' + this.props.path + '?mode=edit';\n window.open(url);\n }\n\n onMainNavBarClick = (e) => {\n let path = Utils.getEventData(e, 'path');\n this.props.onMainNavBarClick(path);\n }\n\n renderNavPath = () => {\n let paths = this.props.path.split('/');\n let nodePath = '';\n let pathElem = paths.map((item, index) => {\n if (item === '') {\n return;\n }\n if (index === (paths.length - 1)) {\n return (\n \n /\n {item}\n \n );\n } else {\n nodePath += '/' + item;\n return (\n \n /\n \n {item}\n \n \n );\n }\n });\n return pathElem;\n }\n\n\n render() {\n let { onSearchedClick, permission } = this.props;\n let searchPlaceholder = gettext('Search files in this library');\n const errMessage = (
{gettext('Folder does not exist.')}
);\n\n const isViewingFile = this.props.pathExist && !this.props.isDataLoading && this.props.isViewFile;\n return (\n
\n
{this.props.content}
\n
\n {!username &&\n \n
\n \n
\n
\n {isPro && (\n \n )}\n
\n
\n }\n {username && (\n \n
\n \n {this.props.permission == 'rw' && (\n Utils.isDesktop() ?\n :\n \n )}\n
\n
\n {isPro && (\n \n )}\n \n \n
\n
\n )}\n
\n
\n
\n
\n {slug}\n {this.renderNavPath()}\n
\n
\n
\n {!this.props.pathExist && errMessage}\n {this.props.pathExist && this.props.isDataLoading && }\n {isViewingFile && (\n \n )}\n {(!this.props.isDataLoading && !this.props.isViewFile) && (\n \n )}\n
\n
\n
\n );\n }\n}\n\nMainPanel.propTypes = propTypes;\n\nexport default MainPanel;\n","import React, { Component } from 'react';\nimport ReactDOM from 'react-dom';\nimport moment from 'moment';\nimport MediaQuery from 'react-responsive';\nimport { Modal } from 'reactstrap';\nimport { slug, siteRoot, initialPath, isDir, sharedToken, hasIndex } from './utils/constants';\nimport { Utils } from './utils/utils';\nimport { seafileAPI } from './utils/seafile-api';\nimport Dirent from './models/dirent';\nimport TreeNode from './components/tree-view/tree-node';\nimport treeHelper from './components/tree-view/tree-helper';\nimport SidePanel from './pages/wiki/side-panel';\nimport MainPanel from './pages/wiki/main-panel';\n\nimport './css/layout.css';\nimport './css/side-panel.css';\nimport './css/wiki.css';\nimport './css/toolbar.css';\nimport './css/search.css';\n\n\nclass Wiki extends Component {\n constructor(props) {\n super(props);\n this.state = {\n path: '',\n pathExist: true,\n closeSideBar: false,\n isViewFile: true,\n isDataLoading: true,\n direntList: [],\n content: '',\n permission: '',\n lastModified: '',\n latestContributor: '',\n isTreeDataLoading: true,\n treeData: treeHelper.buildTree(),\n currentNode: null,\n indexNode: null,\n indexContent: '',\n };\n\n window.onpopstate = this.onpopstate;\n this.indexPath = '/index.md';\n this.homePath = '/home.md';\n }\n\n componentWillMount() {\n if (!Utils.isDesktop()) {\n this.setState({ closeSideBar: true });\n }\n }\n\n componentDidMount() {\n this.loadWikiData(initialPath);\n }\n\n loadWikiData = (initialPath) => {\n this.loadSidePanel(initialPath);\n\n if (isDir === 'None') {\n if (initialPath === '/home.md') {\n this.showDir('/');\n } else {\n this.setState({pathExist: false});\n let fileUrl = siteRoot + 'published/' + slug + Utils.encodePath(initialPath);\n window.history.pushState({url: fileUrl, path: initialPath}, initialPath, fileUrl);\n }\n } else if (isDir === 'True') {\n this.showDir(initialPath);\n } else if (isDir === 'False') {\n this.showFile(initialPath);\n }\n }\n\n loadSidePanel = (initialPath) => {\n if (hasIndex) {\n this.loadIndexNode();\n } else {\n if (isDir === 'None') {\n initialPath = '/';\n this.loadNodeAndParentsByPath('/');\n } else {\n this.loadNodeAndParentsByPath(initialPath);\n }\n }\n\n }\n\n loadIndexNode = () => {\n seafileAPI.listWikiDir(slug, '/').then(res => {\n let tree = this.state.treeData;\n this.addFirstResponseListToNode(res.data.dirent_list, tree.root);\n let indexNode = tree.getNodeByPath(this.indexPath);\n seafileAPI.getWikiFileContent(slug, indexNode.path).then(res => {\n this.setState({\n treeData: tree,\n indexNode: indexNode,\n indexContent: res.data.content,\n isTreeDataLoading: false,\n });\n });\n }).catch(() => {\n this.setState({isLoadFailed: true});\n });\n }\n\n showDir = (dirPath) => {\n this.loadDirentList(dirPath);\n\n // update location url\n let fileUrl = siteRoot + 'published/' + slug + Utils.encodePath(dirPath);\n window.history.pushState({url: fileUrl, path: dirPath}, dirPath, fileUrl);\n }\n\n showFile = (filePath) => {\n this.setState({\n isDataLoading: true,\n isViewFile: true,\n path: filePath,\n });\n\n seafileAPI.getWikiFileContent(slug, filePath).then(res => {\n let data = res.data;\n this.setState({\n isDataLoading: false,\n content: data.content,\n permission: data.permission,\n lastModified: moment.unix(data.last_modified).fromNow(),\n latestContributor: data.latest_contributor,\n });\n });\n\n const hash = window.location.hash;\n let fileUrl = siteRoot + 'published/' + slug + Utils.encodePath(filePath) + hash;\n if (filePath === '/home.md') {\n window.history.replaceState({url: fileUrl, path: filePath}, filePath, fileUrl);\n } else {\n window.history.pushState({url: fileUrl, path: filePath}, filePath, fileUrl);\n }\n }\n\n loadDirentList = (dirPath) => {\n this.setState({isDataLoading: true});\n seafileAPI.listWikiDir(slug, dirPath).then(res => {\n let direntList = res.data.dirent_list.map(item => {\n let dirent = new Dirent(item);\n return dirent;\n });\n if (dirPath === '/') {\n direntList = direntList.filter(item => {\n if (item.type === 'dir') {\n let name = item.name.toLowerCase();\n return name !== 'drafts' && name !== 'images' && name !== 'downloads';\n }\n return true;\n });\n }\n direntList = Utils.sortDirents(direntList, 'name', 'asc');\n this.setState({\n path: dirPath,\n isViewFile: false,\n direntList: direntList,\n isDataLoading: false,\n });\n }).catch(() => {\n this.setState({isLoadFailed: true});\n });\n }\n\n loadTreeNodeByPath = (path) => {\n let tree = this.state.treeData.clone();\n let node = tree.getNodeByPath(path);\n if (!node.isLoaded) {\n seafileAPI.listWikiDir(slug, node.path).then(res => {\n this.addResponseListToNode(res.data.dirent_list, node);\n let parentNode = tree.getNodeByPath(node.parentNode.path);\n parentNode.isExpanded = true;\n this.setState({\n treeData: tree,\n currentNode: node\n });\n });\n } else {\n let parentNode = tree.getNodeByPath(node.parentNode.path);\n parentNode.isExpanded = true;\n this.setState({treeData: tree, currentNode: node}); //tree\n }\n }\n\n loadNodeAndParentsByPath = (path) => {\n let tree = this.state.treeData.clone();\n if (Utils.isMarkdownFile(path)) {\n path = Utils.getDirName(path);\n }\n seafileAPI.listWikiDir(slug, path, true).then(res => {\n let direntList = res.data.dirent_list;\n let results = {};\n for (let i = 0; i < direntList.length; i++) {\n let object = direntList[i];\n let key = object.parent_dir;\n if (!results[key]) {\n results[key] = [];\n }\n results[key].push(object);\n }\n for (let key in results) {\n let node = tree.getNodeByPath(key);\n if (!node.isLoaded && node.path === '/') {\n this.addFirstResponseListToNode(results[key], node);\n } else if (!node.isLoaded) {\n this.addResponseListToNode(results[key], node);\n }\n }\n this.setState({\n isTreeDataLoading: false,\n treeData: tree\n });\n }).catch(() => {\n this.setState({isLoadFailed: true});\n });\n }\n\n onLinkClick = (link) => {\n const url = link;\n if (Utils.isWikiInternalMarkdownLink(url, slug)) {\n let path = Utils.getPathFromWikiInternalMarkdownLink(url, slug);\n this.showFile(path);\n } else if (Utils.isWikiInternalDirLink(url, slug)) {\n let path = Utils.getPathFromWikiInternalDirLink(url, slug);\n this.showDir(path);\n } else {\n window.location.href = url;\n }\n if (!this.state.closeSideBar) {\n this.setState({ closeSideBar: true });\n }\n }\n\n onpopstate = (event) => {\n if (event.state && event.state.path) {\n let path = event.state.path;\n if (Utils.isMarkdownFile(path)) {\n this.showFile(path);\n } else {\n this.loadDirentList(path);\n this.setState({\n path: path,\n isViewFile: false\n });\n }\n }\n }\n\n onSearchedClick = (item) => {\n let path = item.is_dir ? item.path.slice(0, item.path.length - 1) : item.path;\n if (this.state.currentPath === path) {\n return;\n }\n\n // load sidePanel\n let index = -1;\n let paths = Utils.getPaths(path);\n for (let i = 0; i < paths.length; i++) {\n let node = this.state.treeData.getNodeByPath(node);\n if (!node) {\n index = i;\n break;\n }\n }\n if (index === -1) { // all the data has been loaded already.\n let tree = this.state.treeData.clone();\n let node = tree.getNodeByPath(item.path);\n treeHelper.expandNode(node);\n this.setState({treeData: tree});\n } else {\n this.loadNodeAndParentsByPath(path);\n }\n\n // load mainPanel\n if (item.is_dir) {\n this.showDir(path);\n } else {\n if (Utils.isMarkdownFile(path)) {\n this.showFile(path);\n } else {\n let url = siteRoot + 'd/' + sharedToken + '/files/?p=' + Utils.encodePath(path);\n let newWindow = window.open('about:blank');\n newWindow.location.href = url;\n }\n }\n }\n\n onMenuClick = () => {\n this.setState({closeSideBar: !this.state.closeSideBar});\n }\n\n onMainNavBarClick = (nodePath) => {\n let tree = this.state.treeData.clone();\n let node = tree.getNodeByPath(nodePath);\n tree.expandNode(node);\n this.setState({treeData: tree, currentNode: node});\n this.showDir(node.path);\n }\n\n onDirentClick = (dirent) => {\n let direntPath = Utils.joinPath(this.state.path, dirent.name);\n if (dirent.isDir()) { // is dir\n this.loadTreeNodeByPath(direntPath);\n this.showDir(direntPath);\n } else { // is file\n if (Utils.isMarkdownFile(direntPath)) {\n this.showFile(direntPath);\n } else {\n const w=window.open('about:blank');\n const url = siteRoot + 'd/' + sharedToken + '/files/?p=' + Utils.encodePath(direntPath);\n w.location.href = url;\n }\n }\n }\n\n onCloseSide = () => {\n this.setState({closeSideBar: !this.state.closeSideBar});\n }\n\n onNodeClick = (node) => {\n if (!this.state.pathExist) {\n this.setState({pathExist: true});\n }\n\n if (node.object.isDir()) {\n if (!node.isLoaded) {\n let tree = this.state.treeData.clone();\n node = tree.getNodeByPath(node.path);\n seafileAPI.listWikiDir(slug, node.path).then(res => {\n this.addResponseListToNode(res.data.dirent_list, node);\n tree.collapseNode(node);\n this.setState({treeData: tree});\n });\n }\n if (node.path === this.state.path) {\n if (node.isExpanded) {\n let tree = treeHelper.collapseNode(this.state.treeData, node);\n this.setState({treeData: tree});\n } else {\n let tree = this.state.treeData.clone();\n node = tree.getNodeByPath(node.path);\n tree.expandNode(node);\n this.setState({treeData: tree});\n }\n }\n }\n\n if (node.path === this.state.path ) {\n return;\n }\n\n if (node.object.isDir()) { // isDir\n this.showDir(node.path);\n } else {\n if (Utils.isMarkdownFile(node.path)) {\n if (node.path !== this.state.path) {\n this.showFile(node.path);\n }\n this.onCloseSide();\n } else {\n const w = window.open('about:blank');\n const url = siteRoot + 'd/' + sharedToken + '/files/?p=' + Utils.encodePath(node.path);\n w.location.href = url;\n }\n }\n }\n\n onNodeCollapse = (node) => {\n let tree = treeHelper.collapseNode(this.state.treeData, node);\n this.setState({treeData: tree});\n }\n\n onNodeExpanded = (node) => {\n let tree = this.state.treeData.clone();\n node = tree.getNodeByPath(node.path);\n if (!node.isLoaded) {\n seafileAPI.listWikiDir(slug, node.path).then(res => {\n this.addResponseListToNode(res.data.dirent_list, node);\n this.setState({treeData: tree});\n });\n } else {\n tree.expandNode(node);\n this.setState({treeData: tree});\n }\n }\n\n addFirstResponseListToNode = (list, node) => {\n node.isLoaded = true;\n node.isExpanded = true;\n let direntList = list.map(item => {\n return new Dirent(item);\n });\n direntList = direntList.filter(item => {\n if (item.type === 'dir') {\n let name = item.name.toLowerCase();\n return name !== 'drafts' && name !== 'images' && name !== 'downloads';\n }\n return true;\n });\n direntList = Utils.sortDirents(direntList, 'name', 'asc');\n\n let nodeList = direntList.map(object => {\n return new TreeNode({object});\n });\n node.addChildren(nodeList);\n }\n\n addResponseListToNode = (list, node) => {\n node.isLoaded = true;\n node.isExpanded = true;\n let direntList = list.map(item => {\n return new Dirent(item);\n });\n direntList = Utils.sortDirents(direntList, 'name', 'asc');\n\n let nodeList = direntList.map(object => {\n return new TreeNode({object});\n });\n node.addChildren(nodeList);\n }\n\n render() {\n return (\n
\n \n \n \n \n \n
\n );\n }\n}\n\nReactDOM.render (\n ,\n document.getElementById('wrapper')\n);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { MarkdownViewer } from '@seafile/seafile-editor';\nimport { gettext, repoID, slug, serviceURL, isPublicWiki, sharedToken, mediaUrl } from '../utils/constants';\nimport Loading from './loading';\nimport { Utils } from '../utils/utils';\n\nconst propTypes = {\n children: PropTypes.object,\n isFileLoading: PropTypes.bool.isRequired,\n markdownContent: PropTypes.string.isRequired,\n latestContributor: PropTypes.string.isRequired,\n lastModified: PropTypes.string.isRequired,\n onLinkClick: PropTypes.func.isRequired,\n isWiki: PropTypes.bool,\n isTOCShow: PropTypes.bool,\n // for dir-column-file component(import repoID is undefined)\n repoID: PropTypes.string,\n path: PropTypes.string,\n};\n\nconst contentClass = 'wiki-page-content';\n\nclass WikiMarkdownViewer extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n activeTitleIndex: 0,\n };\n this.markdownContainer = React.createRef();\n this.links = [];\n this.titlesInfo = [];\n }\n\n componentDidMount() {\n // Bind event when first loaded\n this.links = document.querySelectorAll(`.${contentClass} a`);\n this.links.forEach(link => {\n link.addEventListener('click', this.onLinkClick);\n });\n\n this.getTitlesInfo();\n }\n\n componentWillReceiveProps(nextProps) {\n if (this.props.markdownContent === nextProps.markdownContent) {\n return;\n }\n // Unbound event when updating\n this.links.forEach(link => {\n link.removeEventListener('click', this.onLinkClick);\n });\n }\n\n componentDidUpdate() {\n // Update completed, rebind event\n this.links = document.querySelectorAll(`.${contentClass} a`);\n this.links.forEach(link => {\n link.addEventListener('click', this.onLinkClick);\n });\n if (this.titlesInfo.length === 0) {\n this.getTitlesInfo();\n }\n }\n\n componentWillUnmount() {\n // Unbound events when the component is destroyed\n this.links.forEach(link => {\n link.removeEventListener('click', this.onLinkClick);\n });\n }\n\n getTitlesInfo = () => {\n let titlesInfo = [];\n let headingList = document.querySelectorAll('h2[id^=\"user-content\"], h3[id^=\"user-content\"]');\n for (let i = 0; i < headingList.length; i++) {\n titlesInfo.push(headingList[i].offsetTop);\n }\n this.titlesInfo = titlesInfo;\n }\n\n onLinkClick = (event) => {\n event.preventDefault();\n event.stopPropagation();\n let link = '';\n if (event.target.tagName !== 'A') {\n let target = event.target.parentNode;\n while (target.tagName !== 'A') {\n target = target.parentNode;\n }\n link = target.href;\n } else {\n link = event.target.href;\n }\n this.props.onLinkClick(link);\n }\n\n onScrollHandler = () => {\n const contentScrollTop = this.markdownContainer.current.scrollTop + 180;\n let titlesLength = this.titlesInfo.length;\n let activeTitleIndex;\n if (contentScrollTop <= this.titlesInfo[0]) {\n activeTitleIndex = 0;\n this.setState({activeTitleIndex: activeTitleIndex});\n return;\n }\n if (contentScrollTop > this.titlesInfo[titlesLength - 1]) {\n activeTitleIndex = this.titlesInfo.length - 1;\n this.setState({activeTitleIndex: activeTitleIndex});\n return;\n }\n for (let i = 0; i < titlesLength; i++) {\n if (contentScrollTop > this.titlesInfo[i]) {\n continue;\n } else {\n activeTitleIndex = i - 1;\n break;\n }\n }\n this.setState({activeTitleIndex: activeTitleIndex});\n }\n\n changeInlineNode = (item) => {\n let url, imagePath;\n\n if (item.type == 'image' && isPublicWiki) { // change image url\n url = item.data.src;\n const re = new RegExp(serviceURL + '/lib/' + repoID +'/file.*raw=1');\n // different repo\n if (re.test(url)) {\n // get image path\n let index = url.indexOf('/file');\n let index2 = url.indexOf('?');\n imagePath = url.substring(index + 5, index2);\n } else if (/^\\.\\.\\/*/.test(url) || /^\\.\\/*/.test(url)) {\n const path = this.props.path;\n const originalPath = path.slice(0, path.lastIndexOf('/')) + '/' + url;\n imagePath = Utils.pathNormalize(originalPath);\n } else {\n return;\n }\n item.data.src = serviceURL + '/view-image-via-public-wiki/?slug=' + slug + '&path=' + imagePath;\n } else if (item.type == 'link') { // change link url\n url = item.data.href;\n if (Utils.isInternalFileLink(url, repoID)) { // change file url\n if (Utils.isInternalMarkdownLink(url, repoID)) {\n let path = Utils.getPathFromInternalMarkdownLink(url, repoID);\n // replace url\n item.data.href = serviceURL + '/published/' + slug + path;\n } else {\n item.data.href = url.replace(/(.*)lib\\/([-0-9a-f]{36})\\/file(.*)/g, (match, p1, p2, p3) => {\n return `${p1}d/${sharedToken}/files/?p=${p3}&dl=1`;\n });\n }\n } else if (Utils.isInternalDirLink(url, repoID)) { // change dir url\n let path = Utils.getPathFromInternalDirLink(url, repoID);\n // replace url\n item.data.href = serviceURL + '/published/' + slug + path;\n }\n }\n\n return item;\n }\n\n modifyValueBeforeRender = (value) => {\n let newNodes = Utils.changeMarkdownNodes(value, this.changeInlineNode);\n return newNodes;\n }\n\n renderMarkdown = () => {\n let isTOCShow = true;\n if (this.props.isTOCShow === false) {\n isTOCShow = false;\n }\n if (this.props.isWiki) {\n return (\n \n );\n }\n\n return (\n \n );\n }\n\n render() {\n if (this.props.isFileLoading) {\n return ;\n }\n // In dir-column-file repoID is one of props, width is 100%; In wiki-viewer repoID is not props, width isn't 100%\n let contentClassName = `${this.props.repoID ? contentClass + ' w-100' : contentClass}`;\n return (\n
\n
\n {this.props.children}\n {this.renderMarkdown()}\n

{gettext('Last modified by')} {this.props.latestContributor}, {this.props.lastModified}

\n
\n
\n );\n }\n}\n\nconst defaultProps = {\n isWiki: false,\n};\n\nWikiMarkdownViewer.propTypes = propTypes;\nMarkdownViewer.defaultProps = defaultProps;\n\nexport default WikiMarkdownViewer;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { permission } from '../../utils/constants';\nimport TextTranslation from '../../utils/text-translation';\nimport ItemDropdownMenu from '../dropdown-menu/item-dropdown-menu';\nimport { Utils } from '../../utils/utils';\n\nconst propTypes = {\n userPerm: PropTypes.string,\n node: PropTypes.object.isRequired,\n currentPath: PropTypes.string.isRequired,\n paddingLeft: PropTypes.number.isRequired,\n isNodeMenuShow: PropTypes.bool.isRequired,\n isItemFreezed: PropTypes.bool.isRequired,\n onNodeClick: PropTypes.func.isRequired,\n onNodeExpanded: PropTypes.func.isRequired,\n onNodeCollapse: PropTypes.func.isRequired,\n onNodeDragStart: PropTypes.func.isRequired,\n freezeItem: PropTypes.func.isRequired,\n unfreezeItem: PropTypes.func.isRequired,\n onMenuItemClick: PropTypes.func,\n onNodeDragMove: PropTypes.func,\n onNodeDrop: PropTypes.func,\n handleContextClick: PropTypes.func.isRequired,\n onNodeDragEnter: PropTypes.func.isRequired,\n onNodeDragLeave:PropTypes.func.isRequired,\n};\n\nclass TreeNodeView extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n isHighlight: false,\n isShowOperationMenu: false,\n isNodeDropShow: false,\n };\n const { userPerm } = props;\n this.canDrag = userPerm === 'rw';\n const { isCustomPermission, customPermission } = Utils.getUserPermission(userPerm);\n if (isCustomPermission) {\n const { modify } = customPermission.permission;\n this.canDrag = modify;\n }\n }\n\n componentWillReceiveProps(nextProps) {\n if (!nextProps.isItemFreezed) {\n this.setState({\n isShowOperationMenu: false,\n isHighlight: false,\n });\n }\n }\n\n onMouseEnter = () => {\n if (!this.props.isItemFreezed) {\n this.setState({\n isShowOperationMenu: true,\n isHighlight: true,\n });\n }\n }\n\n onMouseOver = () => {\n if (!this.props.isItemFreezed) {\n this.setState({\n isShowOperationMenu: true,\n isHighlight: true,\n });\n }\n }\n\n onMouseLeave = () => {\n if (!this.props.isItemFreezed) {\n this.setState({\n isShowOperationMenu: false,\n isHighlight: false,\n });\n }\n }\n\n onNodeClick = () => {\n const { node } = this.props;\n const { object } = node;\n if (object.isDir()) {\n this.props.onNodeClick(this.props.node);\n return;\n }\n const { isCustomPermission, customPermission } = Utils.getUserPermission(object.permission);\n if (isCustomPermission) {\n const { preview: canPreview, modify: canModify } = customPermission.permission;\n if (!canPreview && !canModify) return;\n } \n this.props.onNodeClick(this.props.node);\n }\n\n onLoadToggle = (e) => {\n e.stopPropagation();\n let { node } = this.props;\n if (node.isExpanded) {\n this.props.onNodeCollapse(node);\n } else {\n this.props.onNodeExpanded(node);\n }\n }\n\n onNodeDragStart = (e) => {\n if (Utils.isIEBrower() || !this.canDrag) {\n return false;\n }\n this.props.onNodeDragStart(e, this.props.node);\n }\n\n onNodeDragEnter = (e) => {\n if (Utils.isIEBrower() || !this.canDrag) {\n return false;\n }\n if (this.props.node.object.type === 'dir') {\n this.setState({isNodeDropShow: true});\n }\n this.props.onNodeDragEnter(e, this.props.node);\n }\n\n onNodeDragMove = (e) => {\n if (Utils.isIEBrower() || !this.canDrag) {\n return false;\n }\n this.props.onNodeDragMove(e);\n }\n\n onNodeDragLeave = (e) => {\n if (Utils.isIEBrower() || !this.canDrag) {\n return false;\n }\n this.setState({isNodeDropShow: false});\n this.props.onNodeDragLeave(e, this.props.node);\n }\n\n onNodeDrop = (e) => {\n if (Utils.isIEBrower() || !this.canDrag) {\n return false;\n }\n e.stopPropagation();\n this.setState({isNodeDropShow: false});\n this.props.onNodeDrop(e, this.props.node);\n }\n\n unfreezeItem = () => {\n this.setState({isShowOperationMenu: false});\n this.props.unfreezeItem();\n }\n\n onMenuItemClick = (operation, event, node) => {\n this.props.onMenuItemClick(operation, node);\n }\n\n onItemMouseDown = (event) => {\n event.stopPropagation();\n if (event.button === 2) {\n return;\n }\n }\n\n onItemContextMenu = (event) => {\n this.handleContextClick(event);\n }\n\n handleContextClick = (event) => {\n this.props.handleContextClick(event, this.props.node);\n this.setState({isShowOperationMenu: false});\n }\n\n getNodeTypeAndIcon = () => {\n let { node } = this.props;\n let icon = '';\n let type = '';\n if (node.object.type === 'dir') {\n icon = ;\n type = 'dir';\n } else {\n let index = node.object.name.lastIndexOf('.');\n if (index === -1) {\n icon = ;\n type = 'file';\n } else {\n let suffix = node.object.name.slice(index).toLowerCase();\n if (suffix === '.png' || suffix === '.jpg' || suffix === '.jpeg' || suffix === '.gif' || suffix === '.bmp') {\n icon = ;\n type = 'image';\n }\n else if (suffix === '.md' || suffix === '.markdown') {\n icon = ;\n type = 'file';\n }\n else {\n icon = ;\n type = 'file';\n }\n }\n }\n return {icon, type};\n }\n\n calculateMenuList = (node) => {\n let { NEW_FOLDER, NEW_FILE, COPY, MOVE, RENAME, DELETE, OPEN_VIA_CLIENT} = TextTranslation;\n\n let menuList = [RENAME, DELETE, COPY, MOVE, OPEN_VIA_CLIENT];\n if (node.object.type === 'dir') {\n menuList = [NEW_FOLDER, NEW_FILE, COPY, MOVE, RENAME, DELETE];\n }\n\n const { userPerm } = this.props;\n const { isCustomPermission, customPermission } = Utils.getUserPermission(userPerm);\n if (!isCustomPermission) {\n return menuList;\n }\n\n menuList = [];\n const { modify: canModify, delete: canDelete, copy: canCopy } = customPermission.permission;\n if (node.object.type === 'dir') { \n canModify && menuList.push(NEW_FOLDER, NEW_FILE);\n }\n \n canCopy && menuList.push(COPY);\n canModify && menuList.push(MOVE, RENAME);\n canDelete && menuList.push(DELETE);\n\n if (node.object.type !== 'dir') { \n menuList.push(OPEN_VIA_CLIENT);\n }\n\n return menuList;\n }\n\n renderChildren = () => {\n let { node, paddingLeft } = this.props;\n if (!node.hasChildren()) {\n return '';\n }\n return (\n
\n {node.children.map(item => {\n return (\n \n );\n })}\n
\n );\n }\n\n render() {\n let { currentPath, node, isNodeMenuShow, userPerm } = this.props;\n let { type, icon } = this.getNodeTypeAndIcon();\n let hlClass = this.state.isHighlight ? 'tree-node-inner-hover ' : '';\n if (node.path === currentPath) {\n hlClass = 'tree-node-hight-light';\n }\n\n const { isCustomPermission } = Utils.getUserPermission(userPerm)\n return (\n
\n \n
{node.object.name}
\n
\n {type === 'dir' && (!node.isLoaded || (node.isLoaded && node.hasChildren())) && (\n e.stopPropagation()}\n onClick={this.onLoadToggle}\n >\n )}\n {icon}\n
\n {isNodeMenuShow && (\n
\n {((userPerm === 'rw' || permission || isCustomPermission) && this.state.isShowOperationMenu) && (\n \n )}\n
\n )}\n
\n {node.isExpanded && this.renderChildren()}\n \n );\n }\n}\n\nTreeNodeView.propTypes = propTypes;\n\nexport default TreeNodeView;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport TextTranslation from '../../utils/text-translation';\nimport TreeNodeView from './tree-node-view';\nimport ContextMenu from '../context-menu/context-menu';\nimport { hideMenu, showMenu } from '../context-menu/actions';\nimport { Utils } from '../../utils/utils';\n\nconst propTypes = {\n userPerm: PropTypes.string,\n isNodeMenuShow: PropTypes.bool.isRequired,\n treeData: PropTypes.object.isRequired,\n currentPath: PropTypes.string.isRequired,\n onMenuItemClick: PropTypes.func,\n onNodeClick: PropTypes.func.isRequired,\n onNodeExpanded: PropTypes.func.isRequired,\n onNodeCollapse: PropTypes.func.isRequired,\n onItemMove: PropTypes.func,\n currentRepoInfo: PropTypes.object,\n selectedDirentList: PropTypes.array,\n onItemsMove: PropTypes.func,\n};\n\nconst PADDING_LEFT = 20;\n\nclass TreeView extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n isItemFreezed: false,\n isTreeViewDropTipShow: false,\n };\n const { userPerm } = props;\n this.canDrop = userPerm === 'rw';\n const { isCustomPermission, customPermission } = Utils.getUserPermission(userPerm);\n if (isCustomPermission) {\n const { modify } = customPermission.permission;\n this.canDrop = modify;\n }\n }\n\n onItemMove = (repo, dirent, selectedPath, currentPath) => {\n this.props.onItemMove(repo, dirent, selectedPath, currentPath);\n }\n\n onNodeDragStart = (e, node) => {\n if (Utils.isIEBrower()) {\n return false;\n }\n let dragStartNodeData = {nodeDirent: node.object, nodeParentPath: node.parentNode.path, nodeRootPath: node.path};\n dragStartNodeData = JSON.stringify(dragStartNodeData);\n\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('applicaiton/drag-item-info', dragStartNodeData);\n }\n\n onNodeDragEnter = (e, node) => {\n if (Utils.isIEBrower() || !this.canDrop) {\n return false;\n }\n e.persist();\n if (e.target.className === 'tree-view tree ') {\n this.setState({\n isTreeViewDropTipShow: true,\n });\n }\n }\n\n onNodeDragMove = (e) => {\n if (Utils.isIEBrower() || !this.canDrop) {\n return false;\n }\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n }\n\n onNodeDragLeave = (e, node) => {\n if (Utils.isIEBrower() || !this.canDrop) {\n return false;\n }\n if (e.target.className === 'tree-view tree tree-view-drop') {\n this.setState({\n isTreeViewDropTipShow: false,\n });\n }\n }\n\n onNodeDrop = (e, node) => {\n if (Utils.isIEBrower() || !this.canDrop) {\n return false;\n }\n if (e.dataTransfer.files.length) { // uploaded files\n return;\n }\n let dragStartNodeData = e.dataTransfer.getData('applicaiton/drag-item-info');\n dragStartNodeData = JSON.parse(dragStartNodeData);\n\n let {nodeDirent, nodeParentPath, nodeRootPath} = dragStartNodeData;\n let dropNodeData = node;\n\n if (Array.isArray(dragStartNodeData)) { //move items\n if (!dropNodeData) { //move items to root\n if (dragStartNodeData[0].nodeParentPath === '/') {\n this.setState({isTreeViewDropTipShow: false});\n return;\n }\n this.props.onItemsMove(this.props.currentRepoInfo, '/');\n this.setState({isTreeViewDropTipShow: false});\n return;\n }\n this.onMoveItems(dragStartNodeData, dropNodeData, this.props.currentRepoInfo, dropNodeData.path);\n return;\n }\n\n if (!dropNodeData) {\n if (nodeParentPath === '/') {\n this.setState({isTreeViewDropTipShow: false});\n return;\n }\n this.onItemMove(this.props.currentRepoInfo, nodeDirent, '/', nodeParentPath);\n this.setState({isTreeViewDropTipShow: false});\n return;\n }\n\n if (dropNodeData.object.type !== 'dir') {\n return;\n }\n\n if (nodeParentPath === dropNodeData.path) {\n return;\n }\n\n // copy the dirent to itself. eg: A/B -> A/B\n if (nodeParentPath === dropNodeData.parentNode.path) {\n if (dropNodeData.object.name === nodeDirent.name) {\n return;\n }\n }\n\n // copy the dirent to it's child. eg: A/B -> A/B/C\n if (dropNodeData.object.type === 'dir' && nodeDirent.type === 'dir') {\n if (dropNodeData.parentNode.path !== nodeParentPath) {\n let paths = Utils.getPaths(dropNodeData.path);\n if (paths.includes(nodeRootPath)) {\n return;\n }\n }\n }\n\n this.onItemMove(this.props.currentRepoInfo, nodeDirent, dropNodeData.path, nodeParentPath);\n }\n\n onMoveItems = (dragStartNodeData, dropNodeData, destRepo, destDirentPath) => {\n let direntPaths = [];\n let paths = Utils.getPaths(destDirentPath);\n dragStartNodeData.forEach(dirent => {\n let path = dirent.nodeRootPath;\n direntPaths.push(path);\n });\n\n if (dropNodeData.object.type !== 'dir') {\n return;\n }\n\n // move dirents to one of them. eg: A/B, A/C -> A/B\n if (direntPaths.some(direntPath => { return direntPath === destDirentPath;})) {\n return;\n }\n\n // move dirents to current path\n if (dragStartNodeData[0].nodeParentPath && dragStartNodeData[0].nodeParentPath === dropNodeData.path ) {\n return;\n }\n\n // move dirents to one of their child. eg: A/B, A/D -> A/B/C\n let isChildPath = direntPaths.some(direntPath => {\n return paths.includes(direntPath);\n });\n if (isChildPath) {\n return;\n }\n\n this.props.onItemsMove(destRepo, destDirentPath);\n }\n\n freezeItem = () => {\n this.setState({isItemFreezed: true});\n }\n\n unfreezeItem = () => {\n this.setState({isItemFreezed: false});\n }\n\n onMenuItemClick = (operation, node) => {\n this.props.onMenuItemClick(operation, node);\n hideMenu();\n }\n\n onMouseDown = (event) => {\n event.stopPropagation();\n if (event.button === 2) {\n return;\n }\n }\n\n onContextMenu = (event) => {\n event.preventDefault();\n\n let currentRepoInfo = this.props.currentRepoInfo;\n if (currentRepoInfo.permission !== 'admin' && currentRepoInfo.permission !== 'rw') {\n return '';\n }\n this.handleContextClick(event);\n }\n\n handleContextClick = (event, node) => {\n event.preventDefault();\n event.stopPropagation();\n\n if (!this.props.isNodeMenuShow) {\n return;\n }\n\n let x = event.clientX || (event.touches && event.touches[0].pageX);\n let y = event.clientY || (event.touches && event.touches[0].pageY);\n\n if (this.props.posX) {\n x -= this.props.posX;\n }\n if (this.props.posY) {\n y -= this.props.posY;\n }\n\n hideMenu();\n\n let menuList = this.getMenuList(node);\n\n let showMenuConfig = {\n id: 'tree-node-contextmenu',\n position: { x, y },\n target: event.target,\n currentObject: node,\n menuList: menuList,\n };\n\n showMenu(showMenuConfig);\n }\n\n getMenuList = (node) => {\n let menuList = [];\n\n let { NEW_FOLDER, NEW_FILE, COPY, MOVE, RENAME, DELETE, OPEN_VIA_CLIENT } = TextTranslation;\n\n if (!node) {\n return [NEW_FOLDER, NEW_FILE];\n }\n\n if (node.object.type === 'dir') {\n menuList = [NEW_FOLDER, NEW_FILE, COPY, MOVE, RENAME, DELETE];\n } else {\n menuList = [RENAME, DELETE, COPY, MOVE, OPEN_VIA_CLIENT];\n }\n\n const { userPerm } = this.props;\n const { isCustomPermission, customPermission } = Utils.getUserPermission(userPerm);\n if (!isCustomPermission) {\n return menuList;\n }\n\n menuList = [];\n\n const { modify: canModify, delete: canDelete, copy: canCopy } = customPermission.permission;\n if (!node) {\n canModify && menuList.push(NEW_FOLDER, NEW_FILE);\n return menuList;\n }\n\n if (node.object.type === 'dir') { \n canModify && menuList.push(NEW_FOLDER, NEW_FILE);\n }\n \n canCopy && menuList.push(COPY);\n canModify && menuList.push(MOVE, RENAME);\n canDelete && menuList.push(DELETE);\n\n if (node.object.type !== 'dir') { \n menuList.push(OPEN_VIA_CLIENT);\n }\n\n return menuList;\n }\n\n onShowMenu = () => {\n this.freezeItem();\n }\n\n onHideMenu = () => {\n this.unfreezeItem();\n }\n\n render() {\n return (\n \n \n \n \n );\n }\n}\n\nTreeView.propTypes = propTypes;\n\nexport default TreeView;\n","import assign from 'object-assign';\n\nimport { store } from './helpers';\n\nexport const MENU_SHOW = 'REACT_CONTEXTMENU_SHOW';\nexport const MENU_HIDE = 'REACT_CONTEXTMENU_HIDE';\n\n\nexport function dispatchGlobalEvent(eventName, opts, target = window) {\n // Compatibale with IE\n // @see http://stackoverflow.com/questions/26596123/internet-explorer-9-10-11-event-constructor-doesnt-work\n let event;\n\n if (typeof window.CustomEvent === 'function') {\n event = new window.CustomEvent(eventName, { detail: opts });\n } else {\n event = document.createEvent('CustomEvent');\n event.initCustomEvent(eventName, false, true, opts);\n }\n\n if (target) {\n target.dispatchEvent(event);\n assign(store, opts);\n }\n}\n\nexport function showMenu(opts = {}, target) {\n dispatchGlobalEvent(MENU_SHOW, assign({}, opts, { type: MENU_SHOW }), target);\n}\n\nexport function hideMenu(opts = {}, target) {\n dispatchGlobalEvent(MENU_HIDE, assign({}, opts, { type: MENU_HIDE }), target);\n}\n","export function callIfExists(func, ...args) {\n return (typeof func === 'function') && func(...args);\n}\n\nexport function hasOwnProp(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nexport function uniqueId() {\n return Math.random().toString(36).substring(7);\n}\n\nexport const store = {};\n\nexport const canUseDOM = Boolean(\n typeof window !== 'undefined' && window.document && window.document.createElement\n);\n"],"sourceRoot":""}