1
0
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:
awu0403
2024-09-12 14:32:00 +08:00
committed by GitHub
parent de576a7237
commit ac37e9dc31
20 changed files with 700 additions and 110 deletions

View File

@@ -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);
};

View File

@@ -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' : ''}`}>

View File

@@ -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>
);
}

View File

@@ -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'} />

View File

@@ -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>
);
});

View File

@@ -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>
}
</>
);
}

View File

@@ -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>
}
</>
);
};

View File

@@ -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>
);
}

View File

@@ -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>