mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-18 00:00:00 +00:00
Wiki publish (#6512)
* add wiki publish publish wiki permission optimize code * optimize code * optimize code * update * Update wiki2.py * Update wiki2.py * Update urls.py * Update wiki_publish.html --------- Co-authored-by: 孙永强 <11704063+s-yongqiang@user.noreply.gitee.com> Co-authored-by: r350178982 <32759763+r350178982@users.noreply.github.com>
This commit is contained in:
@@ -5,7 +5,7 @@ import { Modal } from 'reactstrap';
|
||||
import { Utils } from '../../utils/utils';
|
||||
import wikiAPI from '../../utils/wiki-api';
|
||||
import SDocServerApi from '../../utils/sdoc-server-api';
|
||||
import { wikiId, siteRoot, lang, isWiki2, seadocServerUrl, gettext } from '../../utils/constants';
|
||||
import { wikiId, siteRoot, lang, isWiki2, seadocServerUrl, gettext, wikiPermission } from '../../utils/constants';
|
||||
import WikiConfig from './models/wiki-config';
|
||||
import toaster from '../../components/toast';
|
||||
import SidePanel from './side-panel';
|
||||
@@ -53,11 +53,21 @@ class Wiki extends Component {
|
||||
}
|
||||
|
||||
handlePath = () => {
|
||||
const custom_url = window.location.pathname.substring(1);
|
||||
if (custom_url.includes('wiki/publish')) {
|
||||
return custom_url;
|
||||
}
|
||||
|
||||
return isWiki2 ? 'wikis/' : 'published/';
|
||||
};
|
||||
|
||||
getWikiConfig = () => {
|
||||
wikiAPI.getWiki2Config(wikiId).then(res => {
|
||||
let wikiAPIConfig;
|
||||
if (wikiPermission === 'public') {
|
||||
wikiAPIConfig = wikiAPI.getWiki2PublishConfig(wikiId);
|
||||
} else {
|
||||
wikiAPIConfig = wikiAPI.getWiki2Config(wikiId);
|
||||
}
|
||||
wikiAPIConfig.then(res => {
|
||||
const { wiki_config, repo_id, id: wikiRepoId } = res.data.wiki;
|
||||
const config = new WikiConfig(wiki_config || {});
|
||||
this.setState({
|
||||
@@ -137,7 +147,13 @@ class Wiki extends Component {
|
||||
this.setState({
|
||||
isDataLoading: true,
|
||||
});
|
||||
wikiAPI.getWiki2Page(wikiId, pageId).then(res => {
|
||||
let getWikiPage;
|
||||
if (wikiPermission === 'public') {
|
||||
getWikiPage = wikiAPI.getWiki2PublishPage(wikiId, pageId);
|
||||
} else {
|
||||
getWikiPage = wikiAPI.getWiki2Page(wikiId, pageId);
|
||||
}
|
||||
getWikiPage.then(res => {
|
||||
const { permission, seadoc_access_token, assets_url } = res.data;
|
||||
this.setState({
|
||||
permission,
|
||||
@@ -154,7 +170,10 @@ class Wiki extends Component {
|
||||
|
||||
const params = new URLSearchParams(window.location.search);
|
||||
params.set('page_id', pageId);
|
||||
const fileUrl = `${siteRoot}${this.handlePath()}${wikiId}/?${params.toString()}`;
|
||||
let fileUrl = `${siteRoot}${this.handlePath()}${wikiId}/?${params.toString()}`;
|
||||
if (this.handlePath().includes('wiki/publish')) {
|
||||
fileUrl = `${siteRoot}${this.handlePath()}?${params.toString()}`;
|
||||
}
|
||||
window.history.pushState({ url: fileUrl, path: filePath }, filePath, fileUrl);
|
||||
};
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
import React, { Component } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { SdocWikiEditor } from '@seafile/sdoc-editor';
|
||||
import { gettext, username } from '../../utils/constants';
|
||||
import { gettext, username, wikiPermission } from '../../utils/constants';
|
||||
import Loading from '../../components/loading';
|
||||
import { Utils } from '../../utils/utils';
|
||||
import Account from '../../components/common/account';
|
||||
@@ -69,7 +69,7 @@ class MainPanel extends Component {
|
||||
currentPageId={this.props.currentPageId}
|
||||
currentPageConfig={currentPageConfig}
|
||||
/>
|
||||
{username && <Account />}
|
||||
{username && wikiPermission !== 'public' && <Account />}
|
||||
</div>
|
||||
<div className="main-panel-center">
|
||||
<div className={`cur-view-content ${isViewingFile ? 'o-hidden' : ''}`}>
|
||||
|
@@ -2,7 +2,7 @@ import React, { Component } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import deepCopy from 'deep-copy';
|
||||
import { UncontrolledTooltip } from 'reactstrap';
|
||||
import { gettext, isWiki2, wikiId } from '../../utils/constants';
|
||||
import { gettext, isWiki2, wikiId, wikiPermission } from '../../utils/constants';
|
||||
import toaster from '../../components/toast';
|
||||
import Loading from '../../components/loading';
|
||||
import WikiNav from './wiki-nav/index';
|
||||
@@ -160,12 +160,16 @@ class SidePanel extends Component {
|
||||
<div className={`wiki2-side-panel${this.props.closeSideBar ? '' : ' left-zero'}`}>
|
||||
<div className="wiki2-side-panel-top">
|
||||
<h4 className="text-truncate ml-0 mb-0" title={repoName}>{repoName}</h4>
|
||||
<div id='wiki-add-new-page' className='add-new-page' onClick={this.handleAddNewPage.bind(true)}>
|
||||
<i className='sf3-font sf3-font-new-page'></i>
|
||||
</div>
|
||||
<UncontrolledTooltip className='wiki-new-page-tooltip' target="wiki-add-new-page">
|
||||
{gettext('New page')}
|
||||
</UncontrolledTooltip>
|
||||
{wikiPermission !== 'public' &&
|
||||
<div>
|
||||
<div id='wiki-add-new-page' className='add-new-page' onClick={this.handleAddNewPage.bind(true)}>
|
||||
<i className='sf3-font sf3-font-new-page'></i>
|
||||
</div>
|
||||
<UncontrolledTooltip className='wiki-new-page-tooltip' target="wiki-add-new-page">
|
||||
{gettext('New page')}
|
||||
</UncontrolledTooltip>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
<div className="wiki2-side-nav">
|
||||
{isLoading ? <Loading/> : this.renderWikiNav()}
|
||||
@@ -178,6 +182,9 @@ class SidePanel extends Component {
|
||||
getWikiConfig={this.props.getWikiConfig}
|
||||
/>
|
||||
)}
|
||||
{wikiPermission !== 'public' &&
|
||||
<WikiExternalOperations onAddWikiPage={this.handleAddNewPage.bind(false)} />
|
||||
}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
@@ -5,7 +5,7 @@ import NameEditPopover from '../../common/name-edit-popover';
|
||||
import NavItemIcon from '../../common/nav-item-icon';
|
||||
import PageDropdownMenu from './page-dropdownmenu';
|
||||
import DeleteDialog from '../../common/delete-dialog';
|
||||
import { gettext } from '../../../../utils/constants';
|
||||
import { gettext, wikiPermission } from '../../../../utils/constants';
|
||||
import AddNewPageDialog from '../add-new-page-dialog';
|
||||
import Icon from '../../../../components/icon';
|
||||
import DraggedPageItem from './dragged-page-item';
|
||||
@@ -225,7 +225,7 @@ class PageItem extends Component {
|
||||
</div>
|
||||
</div>
|
||||
<div className="d-flex">
|
||||
{isEditMode &&
|
||||
{isEditMode && wikiPermission !== 'public' &&
|
||||
<>
|
||||
<div className="more-wiki-page-operation" onClick={this.toggleDropdown}>
|
||||
<Icon symbol={'more-level'} />
|
||||
|
@@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
|
||||
import { DropTarget, DragLayer } from 'react-dnd';
|
||||
import html5DragDropContext from './html5DragDropContext';
|
||||
import DraggedPageItem from './pages/dragged-page-item';
|
||||
import { repoID, gettext } from '../../../utils/constants';
|
||||
import { repoID, gettext, wikiPermission } from '../../../utils/constants';
|
||||
|
||||
import '../css/wiki-nav.css';
|
||||
|
||||
@@ -108,10 +108,12 @@ class WikiNav extends Component {
|
||||
{navigation.map((item, index) => {
|
||||
return this.renderPage(item, index, pages.length, isOnlyOnePage, id_page_map, layerDragProps);
|
||||
})}
|
||||
<div className='wiki2-trash' onClick={this.props.toggelTrashDialog}>
|
||||
<span className="sf3-font-trash sf3-font mr-2"></span>
|
||||
<span>{gettext('Trash')}</span>
|
||||
</div>
|
||||
{wikiPermission !== 'public' &&
|
||||
<div className='wiki2-trash' onClick={this.props.toggelTrashDialog}>
|
||||
<span className="sf3-font-recycle1 sf3-font mr-2"></span>
|
||||
<span>{gettext('Trash')}</span>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
);
|
||||
});
|
||||
|
@@ -2,7 +2,7 @@ import React, { useCallback, useRef, useState } from 'react';
|
||||
import { UncontrolledPopover } from 'reactstrap';
|
||||
import classNames from 'classnames';
|
||||
import PropTypes from 'prop-types';
|
||||
import { gettext } from '../../../utils/constants';
|
||||
import { gettext, wikiPermission } from '../../../utils/constants';
|
||||
import { WIKI_COVER_LIST } from '../constant';
|
||||
|
||||
import './page-cover.css';
|
||||
@@ -52,29 +52,33 @@ function PageCover({ currentPageConfig, onUpdatePage }) {
|
||||
<div id="wiki-page-cover" className='wiki-page-cover' onMouseEnter={onMouseEnter} onMouseLeave={onMouseLeave}>
|
||||
<img className='wiki-page-cover__img' alt={gettext('Cover')} src={getCoverImgUrl(currentPageConfig.cover_img_url)} />
|
||||
<div className={classNames('wiki-page-cover__controller', { show: isShowCoverController })}>
|
||||
<div className='wiki-cover-controller-btn' id='wiki-change-cover-btn'>{gettext('Change cover')}</div>
|
||||
{wikiPermission !== 'public' &&
|
||||
<div className='wiki-cover-controller-btn' id='wiki-change-cover-btn'>{gettext('Change cover')}</div>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
<UncontrolledPopover
|
||||
ref={popoverRef}
|
||||
flip
|
||||
target="wiki-change-cover-btn"
|
||||
placement="bottom"
|
||||
hideArrow={true}
|
||||
popperClassName='wiki-page-cover-popover'
|
||||
innerClassName='wiki-page-cover-panel wiki-page-panel'
|
||||
trigger="legacy"
|
||||
>
|
||||
<div className='wiki-page-cover-panel__header popover-header'>
|
||||
<span>{gettext('Gallery')}</span>
|
||||
<span onClick={removeCoverImage} className='wiki-remove-icon-btn'>{gettext('Remove')}</span>
|
||||
</div>
|
||||
<div className='wiki-page-cover-panel__body popover-body'>
|
||||
{WIKI_COVER_LIST.map(imgName => (
|
||||
<img key={imgName} onClick={updateCoverImage.bind(null, imgName)} className='wiki-cover-gallery-img' alt={gettext('Cover')} src={getCoverImgUrl(`${imgName}`)} />
|
||||
))}
|
||||
</div>
|
||||
</UncontrolledPopover>
|
||||
{wikiPermission !== 'public' &&
|
||||
<UncontrolledPopover
|
||||
ref={popoverRef}
|
||||
flip
|
||||
target="wiki-change-cover-btn"
|
||||
placement="bottom"
|
||||
hideArrow={true}
|
||||
popperClassName='wiki-page-cover-popover'
|
||||
innerClassName='wiki-page-cover-panel wiki-page-panel'
|
||||
trigger="legacy"
|
||||
>
|
||||
<div className='wiki-page-cover-panel__header popover-header'>
|
||||
<span>{gettext('Gallery')}</span>
|
||||
<span onClick={removeCoverImage} className='wiki-remove-icon-btn'>{gettext('Remove')}</span>
|
||||
</div>
|
||||
<div className='wiki-page-cover-panel__body popover-body'>
|
||||
{WIKI_COVER_LIST.map(imgName => (
|
||||
<img key={imgName} onClick={updateCoverImage.bind(null, imgName)} className='wiki-cover-gallery-img' alt={gettext('Cover')} src={getCoverImgUrl(`${imgName}`)} />
|
||||
))}
|
||||
</div>
|
||||
</UncontrolledPopover>
|
||||
}
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
@@ -3,7 +3,7 @@ import { UncontrolledPopover } from 'reactstrap';
|
||||
import classNames from 'classnames';
|
||||
import Picker from '@emoji-mart/react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { gettext } from '../../../utils/constants';
|
||||
import { gettext, wikiPermission } from '../../../utils/constants';
|
||||
import { data } from './../utils/emoji-utils';
|
||||
|
||||
const PageIcon = ({ currentPageConfig, onUpdatePage }) => {
|
||||
@@ -27,32 +27,34 @@ const PageIcon = ({ currentPageConfig, onUpdatePage }) => {
|
||||
<span>{currentPageConfig.icon}</span>
|
||||
</div>
|
||||
</div>
|
||||
<UncontrolledPopover
|
||||
ref={popoverRef}
|
||||
flip
|
||||
target="wiki-page-icon-container"
|
||||
placement="bottom"
|
||||
hideArrow={true}
|
||||
popperClassName='wiki-page-icon-popover'
|
||||
innerClassName='wiki-page-icon-panel wiki-page-panel'
|
||||
trigger="legacy"
|
||||
>
|
||||
<div className='wiki-page-icon-panel__header popover-header'>
|
||||
<span>{gettext('Emojis')}</span>
|
||||
<span onClick={handleIconRemove} className='wiki-remove-icon-btn'>{gettext('Remove')}</span>
|
||||
</div>
|
||||
<div className='wiki-page-icon-panel__body popover-body'>
|
||||
<Picker
|
||||
data={data}
|
||||
onEmojiSelect={(emoji) => handleSetIcon(emoji.native)}
|
||||
previewPosition="none"
|
||||
skinTonePosition="none"
|
||||
locale={window.seafile.lang.slice(0, 2)}
|
||||
maxFrequentRows={2}
|
||||
theme="light"
|
||||
/>
|
||||
</div>
|
||||
</UncontrolledPopover>
|
||||
{wikiPermission !== 'public' &&
|
||||
<UncontrolledPopover
|
||||
ref={popoverRef}
|
||||
flip
|
||||
target="wiki-page-icon-container"
|
||||
placement="bottom"
|
||||
hideArrow={true}
|
||||
popperClassName='wiki-page-icon-popover'
|
||||
innerClassName='wiki-page-icon-panel wiki-page-panel'
|
||||
trigger="legacy"
|
||||
>
|
||||
<div className='wiki-page-icon-panel__header popover-header'>
|
||||
<span>{gettext('Emojis')}</span>
|
||||
<span onClick={handleIconRemove} className='wiki-remove-icon-btn'>{gettext('Remove')}</span>
|
||||
</div>
|
||||
<div className='wiki-page-icon-panel__body popover-body'>
|
||||
<Picker
|
||||
data={data}
|
||||
onEmojiSelect={(emoji) => handleSetIcon(emoji.native)}
|
||||
previewPosition="none"
|
||||
skinTonePosition="none"
|
||||
locale={window.seafile.lang.slice(0, 2)}
|
||||
maxFrequentRows={2}
|
||||
theme="light"
|
||||
/>
|
||||
</div>
|
||||
</UncontrolledPopover>
|
||||
}
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
@@ -1,6 +1,7 @@
|
||||
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { throttle } from '../utils';
|
||||
import { wikiPermission } from '../../../utils/constants';
|
||||
|
||||
function PageTitleEditor({ isUpdateBySide, currentPageConfig, onUpdatePage }) {
|
||||
|
||||
@@ -87,18 +88,28 @@ function PageTitleEditor({ isUpdateBySide, currentPageConfig, onUpdatePage }) {
|
||||
|
||||
|
||||
return (
|
||||
<div
|
||||
className='wiki-sdoc-title'
|
||||
contentEditable
|
||||
suppressContentEditableWarning
|
||||
ref={contentEditableRef}
|
||||
onInput={handleInput}
|
||||
onKeyDown={onKeyDown}
|
||||
onCompositionStart={onCompositionStart}
|
||||
onCompositionEnd={onCompositionEnd}
|
||||
>
|
||||
{pageName}
|
||||
<div>
|
||||
{wikiPermission === 'public' ?
|
||||
<div
|
||||
className='wiki-sdoc-title'
|
||||
>
|
||||
{pageName}
|
||||
</div> :
|
||||
<div
|
||||
className='wiki-sdoc-title'
|
||||
contentEditable
|
||||
suppressContentEditableWarning
|
||||
ref={contentEditableRef}
|
||||
onInput={handleInput}
|
||||
onKeyDown={onKeyDown}
|
||||
onCompositionStart={onCompositionStart}
|
||||
onCompositionEnd={onCompositionEnd}
|
||||
>
|
||||
{pageName}
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
|
||||
);
|
||||
}
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
import React, { useCallback, useEffect, useState } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import classnames from 'classnames';
|
||||
import { gettext } from '../../../utils/constants';
|
||||
import { gettext, wikiPermission } from '../../../utils/constants';
|
||||
import { WIKI_COVER_LIST } from '../constant';
|
||||
import PageIcon from './page-icon';
|
||||
import { generateARandomEmoji, generateEmojiIcon } from '../utils/emoji-utils';
|
||||
@@ -56,13 +56,13 @@ const PageTitle = ({ isUpdateBySide, currentPageConfig, onUpdatePage }) => {
|
||||
<PageIcon currentPageConfig={currentPageConfig} onUpdatePage={onUpdatePage} />
|
||||
)}
|
||||
<div className={classnames('wiki-page-controller', { 'show': isShowController })}>
|
||||
{!currentPageConfig.icon && (
|
||||
{!currentPageConfig.icon && wikiPermission !== 'public' && (
|
||||
<div className='wiki-page-controller-item' onClick={handleAddIcon}>
|
||||
<i className='sf3-font sf3-font-icon'></i>
|
||||
<span className='text'>{gettext('Add icon')}</span>
|
||||
</div>
|
||||
)}
|
||||
{!currentPageConfig.cover_img_url && (
|
||||
{!currentPageConfig.cover_img_url && wikiPermission !== 'public' && (
|
||||
<div className='wiki-page-controller-item' onClick={handleAddCover}>
|
||||
<i className='sf3-font sf3-font-image'></i>
|
||||
<span className='text'>{gettext('Add cover')}</span>
|
||||
|
Reference in New Issue
Block a user