1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-20 02:48:51 +00:00

convert markdown and sdoc (#5636)

This commit is contained in:
JoinTyang
2023-09-14 14:36:58 +08:00
committed by GitHub
parent 34a7318725
commit e7d32fd4d6
15 changed files with 208 additions and 8 deletions

View File

@@ -57,6 +57,7 @@ const propTypes = {
onItemRename: PropTypes.func.isRequired,
onItemMove: PropTypes.func.isRequired,
onItemCopy: PropTypes.func.isRequired,
onItemConvert: PropTypes.func.isRequired,
onDirentClick: PropTypes.func.isRequired,
isAllItemSelected: PropTypes.bool.isRequired,
onAllItemSelected: PropTypes.func.isRequired,
@@ -217,6 +218,7 @@ class DirColumnView extends React.Component {
onItemRename={this.props.onItemRename}
onItemMove={this.props.onItemMove}
onItemCopy={this.props.onItemCopy}
onItemConvert={this.props.onItemConvert}
onDirentClick={this.props.onDirentClick}
updateDirent={this.props.updateDirent}
isAllItemSelected={this.props.isAllItemSelected}

View File

@@ -19,6 +19,7 @@ const propTypes = {
onItemDelete: PropTypes.func.isRequired,
onItemMove: PropTypes.func.isRequired,
onItemCopy: PropTypes.func.isRequired,
onItemConvert: PropTypes.func.isRequired,
onRenameNode: PropTypes.func.isRequired,
isGroupOwnedRepo: PropTypes.bool.isRequired,
userPerm: PropTypes.string,
@@ -73,6 +74,7 @@ class DirGridView extends React.Component {
onItemDelete={this.props.onItemDelete}
onItemMove={this.props.onItemMove}
onItemCopy={this.props.onItemCopy}
onItemConvert={this.props.onItemConvert}
isDirentListLoading={this.props.isDirentListLoading}
updateDirent={this.props.updateDirent}
onRenameNode={this.props.onRenameNode}

View File

@@ -36,6 +36,7 @@ const propTypes = {
selectedDirentList: PropTypes.array.isRequired,
onItemsMove: PropTypes.func.isRequired,
onItemsCopy: PropTypes.func.isRequired,
onItemConvert: PropTypes.func.isRequired,
onItemsDelete: PropTypes.func.isRequired,
onFileTagChanged: PropTypes.func,
showDirentDetail: PropTypes.func.isRequired,
@@ -96,6 +97,7 @@ class DirListView extends React.Component {
selectedDirentList={this.props.selectedDirentList}
onItemsMove={this.props.onItemsMove}
onItemsCopy={this.props.onItemsCopy}
onItemConvert={this.props.onItemConvert}
onItemsDelete={this.props.onItemsDelete}
onAddFile={this.props.onAddFile}
onAddFolder={this.props.onAddFolder}

View File

@@ -33,6 +33,7 @@ const propTypes = {
onAddFile: PropTypes.func,
onItemDelete: PropTypes.func,
onItemCopy: PropTypes.func.isRequired,
onItemConvert: PropTypes.func.isRequired,
onItemMove: PropTypes.func.isRequired,
onRenameNode: PropTypes.func.isRequired,
onItemClick: PropTypes.func.isRequired,
@@ -115,6 +116,11 @@ class DirentGridView extends React.Component {
this.props.onItemDelete(currentObject);
};
onItemConvert = (currentObject, e, dstType) => {
e.nativeEvent.stopImmediatePropagation(); //for document event
this.props.onItemConvert(currentObject, dstType);
}
onMenuItemClick = (operation, currentObject, event) => {
hideMenu();
switch(operation) {
@@ -136,6 +142,12 @@ class DirentGridView extends React.Component {
case 'Copy':
this.onItemCopyToggle();
break;
case 'Convert to Markdown':
this.onItemConvert(currentObject, event, 'markdown');
break;
case 'Convert to sdoc':
this.onItemConvert(currentObject, event, 'sdoc');
break;
case 'Tags':
this.onEditFileTagToggle();
break;

View File

@@ -35,6 +35,7 @@ const propTypes = {
onItemRename: PropTypes.func.isRequired,
onItemMove: PropTypes.func.isRequired,
onItemCopy: PropTypes.func.isRequired,
onItemConvert: PropTypes.func.isRequired,
onDirentClick: PropTypes.func.isRequired,
updateDirent: PropTypes.func.isRequired,
showImagePopup: PropTypes.func.isRequired,
@@ -268,6 +269,12 @@ class DirentListItem extends React.Component {
case 'Lock':
this.onLockItem();
break;
case 'Convert to Markdown':
this.onItemConvert(event, 'markdown');
break;
case 'Convert to sdoc':
this.onItemConvert(event, 'sdoc');
break;
case 'Mark as draft':
this.onMarkAsDraft();
break;
@@ -299,6 +306,12 @@ class DirentListItem extends React.Component {
}
};
onItemConvert = (e, dstType)=> {
e.preventDefault();
e.nativeEvent.stopImmediatePropagation(); //for document event
this.props.onItemConvert(this.props.dirent, dstType);
}
onEditFileTagToggle = () => {
this.setState({
isEditFileTagShow: !this.state.isEditFileTagShow

View File

@@ -42,6 +42,7 @@ const propTypes = {
selectedDirentList: PropTypes.array.isRequired,
onItemsMove: PropTypes.func.isRequired,
onItemsCopy: PropTypes.func.isRequired,
onItemConvert: PropTypes.func.isRequired,
onItemsDelete: PropTypes.func.isRequired,
onFileTagChanged: PropTypes.func,
enableDirPrivateShare: PropTypes.bool.isRequired,
@@ -620,6 +621,7 @@ class DirentListView extends React.Component {
onItemRename={this.onItemRename}
onItemMove={this.props.onItemMove}
onItemCopy={this.props.onItemCopy}
onItemConvert={this.props.onItemConvert}
updateDirent={this.props.updateDirent}
isItemFreezed={this.state.isItemFreezed}
freezeItem={this.freezeItem}

View File

@@ -69,6 +69,7 @@ const propTypes = {
onItemCopy: PropTypes.func.isRequired,
onAddFolder: PropTypes.func.isRequired,
onAddFile: PropTypes.func.isRequired,
onItemConvert: PropTypes.func.isRequired,
onFileTagChanged: PropTypes.func.isRequired,
isDirentSelected: PropTypes.bool.isRequired,
isAllDirentSelected: PropTypes.bool.isRequired,
@@ -229,6 +230,7 @@ class LibContentContainer extends React.Component {
onItemRename={this.props.onItemRename}
onItemMove={this.onItemMove}
onItemCopy={this.props.onItemCopy}
onItemConvert={this.props.onItemConvert}
onDirentClick={this.onDirentClick}
updateDirent={this.props.updateDirent}
isAllItemSelected={this.props.isAllDirentSelected}
@@ -264,6 +266,7 @@ class LibContentContainer extends React.Component {
onItemDelete={this.props.onItemDelete}
onItemMove={this.onItemMove}
onItemCopy={this.props.onItemCopy}
onItemConvert={this.props.onItemConvert}
updateDirent={this.props.updateDirent}
onAddFolder={this.props.onAddFolder}
showDirentDetail={this.props.showDirentDetail}
@@ -322,6 +325,7 @@ class LibContentContainer extends React.Component {
onItemRename={this.props.onItemRename}
onItemMove={this.onItemMove}
onItemCopy={this.props.onItemCopy}
onItemConvert={this.props.onItemConvert}
onDirentClick={this.onDirentClick}
updateDirent={this.props.updateDirent}
isAllItemSelected={this.props.isAllDirentSelected}

View File

@@ -1236,6 +1236,32 @@ class LibContentView extends React.Component {
});
};
onConvertItem = (dirent, dstType) => {
let path = Utils.joinPath(this.state.path, dirent.name);
let repoID = this.props.repoID;
seafileAPI.convertFile(repoID, path, dstType).then((res) => {
let objName = res.data.obj_name;
let parentDir = res.data.parent_dir;
let file_size = res.data.size;
path = parentDir + '/' + objName;
let name = Utils.getFileName(path);
let parentPath = Utils.getDirName(path);
if (this.state.currentMode === 'column') {
this.updateMoveCopyTreeNode(parentPath);
}
this.loadDirentList(this.state.path);
}).catch((error) => {
let errMessage = Utils.getErrorMsg(error);
if (errMessage === gettext('Error')) {
let name = Utils.getFileName(path);
errMessage = gettext('Renaming {name} failed').replace('{name}', name);
}
toaster.danger(errMessage);
});
}
onDirentClick = (dirent) => {
let direntList = this.state.direntList.map(dirent => {
dirent.isSelected = false;
@@ -2025,6 +2051,7 @@ class LibContentView extends React.Component {
onItemRename={this.onMainPanelItemRename}
onItemMove={this.onMoveItem}
onItemCopy={this.onCopyItem}
onItemConvert={this.onConvertItem}
onAddFolder={this.onAddFolder}
onAddFile={this.onAddFile}
onFileTagChanged={this.onFileTagChanged}

View File

@@ -16,6 +16,8 @@ const TextTranslation = {
'OPEN_VIA_CLIENT' : {key : 'Open via Client', value : gettext('Open via Client')},
'LOCK' : {key : 'Lock', value : gettext('Lock')},
'UNLOCK' : {key : 'Unlock', value : gettext('Unlock')},
'CONVERT_TO_MARKDOWN' : {key : 'Convert to Markdown', value : gettext('Convert to Markdown')},
'CONVERT_TO_SDOC' : {key : 'Convert to sdoc', value : gettext('Convert to sdoc')},
'MARK_AS_DRAFT' : {key : 'Mark as draft', value : gettext('Mark as draft')},
'UNMARK_AS_DRAFT' : {key : 'Unmark as draft', value : gettext('Unmark as draft')},
'COMMENT' : {key : 'Comment', value : gettext('Comment')},

View File

@@ -1,4 +1,4 @@
import { mediaUrl, gettext, serviceURL, siteRoot, isPro, fileAuditEnabled, canGenerateShareLink, canGenerateUploadLink, shareLinkPasswordMinLength, username, folderPermEnabled, onlyofficeConverterExtensions, enableOnlyoffice } from './constants';
import { mediaUrl, gettext, serviceURL, siteRoot, isPro, fileAuditEnabled, canGenerateShareLink, canGenerateUploadLink, shareLinkPasswordMinLength, username, folderPermEnabled, onlyofficeConverterExtensions, enableOnlyoffice, enableSeadoc } from './constants';
import TextTranslation from './text-translation';
import React from 'react';
import toaster from '../components/toast';
@@ -528,7 +528,7 @@ export const Utils = {
getFileOperationList: function(isRepoOwner, currentRepoInfo, dirent, isContextmenu) {
let list = [];
const { SHARE, DOWNLOAD, DELETE, RENAME, MOVE, COPY, TAGS, UNLOCK, LOCK, MARK_AS_DRAFT, UNMARK_AS_DRAFT,
HISTORY, ACCESS_LOG, PROPERTIES, OPEN_VIA_CLIENT, ONLYOFFICE_CONVERT } = TextTranslation;
HISTORY, ACCESS_LOG, PROPERTIES, OPEN_VIA_CLIENT, ONLYOFFICE_CONVERT, CONVERT_TO_MARKDOWN, CONVERT_TO_SDOC } = TextTranslation;
const permission = dirent.permission;
const { isCustomPermission, customPermission } = Utils.getUserPermission(permission);
@@ -595,6 +595,19 @@ export const Utils = {
}
list.push('Divider');
}
if ((permission == 'rw' || permission == 'cloud-edit') && enableSeadoc) {
if (dirent.name.endsWith('.md')) {
list.push(CONVERT_TO_SDOC);
}
if (dirent.name.endsWith('.sdoc')) {
list.push(CONVERT_TO_MARKDOWN);
}
}
if (permission == 'rw') {
if (Utils.isSdocFile(dirent.name)) {
if (dirent.is_sdoc_draft) {
list.push(UNMARK_AS_DRAFT);
@@ -602,6 +615,7 @@ export const Utils = {
list.push(MARK_AS_DRAFT);
}
}
list.push('Divider');
/*
if (enableFileComment) {
list.push(COMMENT);