diff --git a/frontend/src/pages/wiki2/index.js b/frontend/src/pages/wiki2/index.js index 24777ce6f3f..a7cdf66df0f 100644 --- a/frontend/src/pages/wiki2/index.js +++ b/frontend/src/pages/wiki2/index.js @@ -4,7 +4,8 @@ import MediaQuery from 'react-responsive'; import { Modal } from 'reactstrap'; import { Utils } from '../../utils/utils'; import wikiAPI from '../../utils/wiki-api'; -import { slug, wikiId, siteRoot, initialPath, isDir, sharedToken, hasIndex, lang, isWiki2, gettext } from '../../utils/constants'; +import SDocServerApi from '../../utils/sdoc-server-api'; +import { slug, wikiId, siteRoot, initialPath, isDir, sharedToken, hasIndex, lang, isWiki2, seadocServerUrl } from '../../utils/constants'; import Dirent from '../../models/dirent'; import WikiConfig from './models/wiki-config'; import TreeNode from '../../components/tree-view/tree-node'; @@ -33,7 +34,7 @@ class Wiki extends Component { isViewFile: true, isDataLoading: false, direntList: [], - content: '', + editorContent: {}, permission: '', lastModified: '', latestContributor: '', @@ -47,7 +48,6 @@ class Wiki extends Component { config: new WikiConfig({}), repoId: '', seadoc_access_token: '', - docUuid: '', assets_url: '', }; @@ -200,24 +200,41 @@ class Wiki extends Component { window.history.pushState({ url: fileUrl, path: dirPath }, dirPath, fileUrl); }; + getSdocFileContent = (docUuid, accessToken) => { + const config = { + docUuid, + sdocServer: seadocServerUrl, + accessToken, + }; + const sdocServerApi = new SDocServerApi(config); + sdocServerApi.getDocContent().then(res => { + this.setState({ + isDataLoading: false, + editorContent: res.data, + }); + }).catch(error => { + let errorMsg = Utils.getErrorMsg(error); + toaster.danger(errorMsg); + }); + }; + showFile = (filePath) => { this.setState({ isDataLoading: true, }); - this.removePythonWrapper(); wikiAPI.getWiki2FileContent(wikiId, filePath).then(res => { - let data = res.data; + const { permission, last_modified, latest_contributor, seadoc_access_token, assets_url } = res.data; this.setState({ - isDataLoading: false, - content: data.content, - permission: data.permission, - lastModified: moment.unix(data.last_modified).fromNow(), - latestContributor: data.latest_contributor, - seadoc_access_token: data.seadoc_access_token, - assets_url: data.assets_url, + permission, + lastModified: moment.unix(last_modified).fromNow(), + latestContributor: latest_contributor, + seadoc_access_token, + assets_url, isViewFile: true, path: filePath, }); + const docUuid = assets_url.slice(assets_url.lastIndexOf('/') + 1); + this.getSdocFileContent(docUuid, seadoc_access_token); }).catch(error => { let errorMsg = Utils.getErrorMsg(error); toaster.danger(errorMsg); @@ -541,6 +558,36 @@ class Wiki extends Component { node.addChildren(nodeList); }; + showPage = (pageId, filePath) => { + this.setState({ + isDataLoading: true, + }); + + this.removePythonWrapper(); + wikiAPI.getWiki2Page(wikiId, pageId).then(res => { + const { permission, last_modified, latest_contributor, seadoc_access_token, assets_url } = res.data; + this.setState({ + permission, + lastModified: moment.unix(last_modified).fromNow(), + latestContributor: latest_contributor, + seadoc_access_token, + assets_url, + isViewFile: true, + path: filePath, + }); + const docUuid = assets_url.slice(assets_url.lastIndexOf('/') + 1); + this.getSdocFileContent(docUuid, seadoc_access_token); + }).catch(error => { + let errorMsg = Utils.getErrorMsg(error); + toaster.danger(errorMsg); + }); + + const params = new URLSearchParams(window.location.search); + params.set('page_id', pageId); + const fileUrl = `${siteRoot}${this.handlePath()}${wikiId}/?${params.toString()}`; + window.history.pushState({ url: fileUrl, path: filePath }, filePath, fileUrl); + }; + setCurrentPage = (pageId, callback) => { const { currentPageId, config } = this.state; if (pageId === currentPageId) { @@ -552,7 +599,7 @@ class Wiki extends Component { const path = currentPage.path; if (Utils.isMarkdownFile(path) || Utils.isSdocFile(path)) { if (path !== this.state.path) { - this.showFile(path); + this.showPage(pageId, path); } this.onCloseSide(); } else { @@ -602,7 +649,7 @@ class Wiki extends Component { pathExist={this.state.pathExist} isViewFile={this.state.isViewFile} isDataLoading={this.state.isDataLoading} - content={this.state.content} + editorContent={this.state.editorContent} permission={this.state.permission} lastModified={this.state.lastModified} latestContributor={this.state.latestContributor} diff --git a/frontend/src/pages/wiki2/main-panel.js b/frontend/src/pages/wiki2/main-panel.js index 6bea21095c6..72628f11116 100644 --- a/frontend/src/pages/wiki2/main-panel.js +++ b/frontend/src/pages/wiki2/main-panel.js @@ -12,7 +12,7 @@ const propTypes = { pathExist: PropTypes.bool.isRequired, isViewFile: PropTypes.bool.isRequired, isDataLoading: PropTypes.bool.isRequired, - content: PropTypes.string, + editorContent: PropTypes.object, permission: PropTypes.string, lastModified: PropTypes.string, latestContributor: PropTypes.string, @@ -103,13 +103,11 @@ class MainPanel extends Component { render() { const errMessage = (
{gettext('Folder does not exist.')}
); - const { content, permission, pathExist, isDataLoading, isViewFile } = this.props; + const { permission, pathExist, isDataLoading, isViewFile } = this.props; const isViewingFile = pathExist && !isDataLoading && isViewFile; - const editorContent = content && JSON.parse(content); const isReadOnly = !(permission === 'rw'); return (
-
{this.props.content}
} {isViewingFile && Utils.isSdocFile(this.props.path) && ( [a-f0-9]{32})/$', AdminInvitation.as_view(), name='api-v2.1-admin-invitation'), - re_path(r'^wikis/(?P[^/]+)/(?P.*)$', wiki_view, name='wiki'), + re_path(r'^wikis/(?P[^/]+)/$', wiki_view, name='wiki'), path('avatar/', include('seahub.avatar.urls')), path('notice/', include('seahub.notifications.urls')), diff --git a/seahub/wiki2/views.py b/seahub/wiki2/views.py index b55e0dc8852..d105ad73b4b 100644 --- a/seahub/wiki2/views.py +++ b/seahub/wiki2/views.py @@ -18,7 +18,7 @@ from seahub.utils.file_types import IMAGE, SEADOC from seahub.seadoc.utils import get_seadoc_file_uuid, gen_seadoc_access_token from seahub.auth.decorators import login_required -from seahub.wiki2.utils import can_edit_wiki, check_wiki_permission +from seahub.wiki2.utils import can_edit_wiki, check_wiki_permission, get_wiki_config from seahub.utils.file_op import check_file_lock, ONLINE_OFFICE_LOCK_OWNER, if_locked_by_online_office from seahub.utils.repo import parse_repo_perm @@ -29,41 +29,35 @@ @login_required -def wiki_view(request, wiki_id, file_path): +def wiki_view(request, wiki_id): """ edit wiki page. for wiki2 """ # get wiki object or 404 wiki = get_object_or_404(Wiki, id=wiki_id) - file_path = "/" + file_path + + page_id = request.GET.get('page_id') + file_path = '' + + if page_id: + wiki_config = get_wiki_config(wiki.repo_id, request.user.username) + pages = wiki_config.get('pages', []) + page_info = next(filter(lambda t: t['id'] == page_id, pages), {}) + file_path = page_info.get('path', '') + + is_page = False + if file_path: + is_page = True # perm check req_user = request.user.username if not check_wiki_permission(wiki, req_user): return render_permission_error(request, 'Permission denied.') - permission = check_folder_permission(request, wiki.repo_id, '/') - if not permission: - return render_permission_error(request, 'Permission denied.') - - is_dir = None - file_id = seafile_api.get_file_id_by_path(wiki.repo_id, file_path) - if file_id: - is_dir = False - - dir_id = seafile_api.get_dir_id_by_path(wiki.repo_id, file_path) - if dir_id: - is_dir = True - - outlines = [] latest_contributor = '' last_modified = 0 - assets_url = '' - seadoc_access_token = '' file_type, ext = get_file_type_and_ext(posixpath.basename(file_path)) repo = seafile_api.get_repo(wiki.repo_id) - if is_dir is False and file_type == SEADOC: - file_uuid = get_seadoc_file_uuid(repo, file_path) - assets_url = '/api/v2.1/seadoc/download-image/' + file_uuid + if is_page and file_type == SEADOC: try: dirent = seafile_api.get_dirent_by_path(wiki.repo_id, file_path) if dirent: @@ -71,23 +65,13 @@ def wiki_view(request, wiki_id, file_path): except Exception as e: logger.warning(e) - filename = os.path.basename(file_path) - seadoc_access_token = gen_seadoc_access_token(file_uuid, filename, req_user, permission=permission) - last_modified = datetime.fromtimestamp(last_modified) return render(request, "wiki/wiki_edit.html", { "wiki": wiki, - "repo_name": repo.name if repo else '', "file_path": file_path, - "filename": os.path.splitext(os.path.basename(file_path))[0], - "outlines": outlines, + "repo_name": repo.name if repo else '', "modifier": latest_contributor, "modify_time": last_modified, - "repo_id": wiki.repo_id, - "is_dir": is_dir, - "assets_url": assets_url, - "seadoc_server_url": SEADOC_SERVER_URL, - "seadoc_access_token": seadoc_access_token, - "permission": permission, + "seadoc_server_url": SEADOC_SERVER_URL })