yuto-oweseek 4 лет назад
Родитель
Сommit
df990f10c6

+ 0 - 1
packages/app/resource/locales/en_US/translation.json

@@ -463,7 +463,6 @@
   "modal_resolve_conflict": {
   "modal_resolve_conflict": {
     "file_conflicting_with_newer_remote": "This file is conflicting with newer remote file",
     "file_conflicting_with_newer_remote": "This file is conflicting with newer remote file",
     "resolve_conflict_message": "Please select page body",
     "resolve_conflict_message": "Please select page body",
-    "reload": "Reload",
     "resolve_conflict": "Resolve Conflict",
     "resolve_conflict": "Resolve Conflict",
     "resolve_and_save" : "Resolve and save",
     "resolve_and_save" : "Resolve and save",
     "select_revision" : "Select {{revision}}",
     "select_revision" : "Select {{revision}}",

+ 0 - 1
packages/app/resource/locales/ja_JP/translation.json

@@ -463,7 +463,6 @@
   "modal_resolve_conflict": {
   "modal_resolve_conflict": {
     "file_conflicting_with_newer_remote": "サーバー側の新しいファイルと衝突します。",
     "file_conflicting_with_newer_remote": "サーバー側の新しいファイルと衝突します。",
     "resolve_conflict_message": "ページ本文を選んでください",
     "resolve_conflict_message": "ページ本文を選んでください",
-    "reload": "再読み込み",
     "resolve_conflict": "衝突を解消",
     "resolve_conflict": "衝突を解消",
     "resolve_and_save" : "解消し保存する",
     "resolve_and_save" : "解消し保存する",
     "select_revision" : "{{revision}}にする",
     "select_revision" : "{{revision}}にする",

+ 0 - 1
packages/app/resource/locales/zh_CN/translation.json

@@ -441,7 +441,6 @@
   "modal_resolve_conflict": {
   "modal_resolve_conflict": {
     "file_conflicting_with_newer_remote": "此文件与较新的远程文件冲突",
     "file_conflicting_with_newer_remote": "此文件与较新的远程文件冲突",
     "resolve_conflict_message": "选择页面正文",
     "resolve_conflict_message": "选择页面正文",
-    "reload": "重新加载",
     "resolve_conflict": "解决冲突",
     "resolve_conflict": "解决冲突",
     "resolve_and_save" : "解决冲突并保存",
     "resolve_and_save" : "解决冲突并保存",
     "select_revision" : "选择{{revision}}",
     "select_revision" : "选择{{revision}}",

+ 3 - 4
packages/app/src/client/services/PageContainer.js

@@ -4,6 +4,8 @@ import { Container } from 'unstated';
 import * as entities from 'entities';
 import * as entities from 'entities';
 import * as toastr from 'toastr';
 import * as toastr from 'toastr';
 import { pagePathUtils } from '@growi/core';
 import { pagePathUtils } from '@growi/core';
+
+import { apiPost } from '../util/apiv1-client';
 import loggerFactory from '~/utils/logger';
 import loggerFactory from '~/utils/logger';
 import { toastError } from '../util/apiNotification';
 import { toastError } from '../util/apiNotification';
 
 
@@ -672,10 +674,7 @@ export default class PageContainer extends Container {
       body: markdown,
       body: markdown,
     });
     });
 
 
-    const res = await this.appContainer.apiPost('/pages.update', params);
-    if (!res.ok) {
-      throw new Error(res.error);
-    }
+    const res = await apiPost('/pages.update', params);
 
 
     const editorContainer = this.appContainer.getContainer('EditorContainer');
     const editorContainer = this.appContainer.getContainer('EditorContainer');
     editorContainer.clearDraft(path);
     editorContainer.clearDraft(path);

+ 6 - 2
packages/app/src/client/util/apiv1-client.ts

@@ -17,11 +17,15 @@ class Apiv1ErrorHandler extends Error {
 
 
   code;
   code;
 
 
-  constructor(message = '', code = '') {
+  data;
+
+  constructor(message = '', code = '', data = '') {
     super();
     super();
 
 
     this.message = message;
     this.message = message;
     this.code = code;
     this.code = code;
+    this.data = data;
+
   }
   }
 
 
 }
 }
@@ -35,7 +39,7 @@ export async function apiRequest(method: string, path: string, params: unknown):
 
 
   // Return error code if code is exist
   // Return error code if code is exist
   if (res.data.code != null) {
   if (res.data.code != null) {
-    const error = new Apiv1ErrorHandler(res.data.error, res.data.code);
+    const error = new Apiv1ErrorHandler(res.data.error, res.data.code, res.data.data);
     throw error;
     throw error;
   }
   }
 
 

+ 7 - 4
packages/app/src/components/PageEditor/ConflictDiffModal.tsx

@@ -5,15 +5,17 @@ import {
 } from 'reactstrap';
 } from 'reactstrap';
 import { parseISO, format } from 'date-fns';
 import { parseISO, format } from 'date-fns';
 import { useTranslation } from 'react-i18next';
 import { useTranslation } from 'react-i18next';
-import { UnControlled as CodeMirror } from 'react-codemirror2';
+// TODO: consider whether to use codemirrorEditor
+import { UnControlled as CodeMirrorAny } from 'react-codemirror2';
 import PageContainer from '../../client/services/PageContainer';
 import PageContainer from '../../client/services/PageContainer';
 import EditorContainer from '../../client/services/EditorContainer';
 import EditorContainer from '../../client/services/EditorContainer';
 
 
 require('codemirror/mode/htmlmixed/htmlmixed');
 require('codemirror/mode/htmlmixed/htmlmixed');
-
-
 const DMP = require('diff_match_patch');
 const DMP = require('diff_match_patch');
 
 
+// avoid typescript type error
+const CodeMirror:any = CodeMirrorAny;
+
 Object.keys(DMP).forEach((key) => { window[key] = DMP[key] });
 Object.keys(DMP).forEach((key) => { window[key] = DMP[key] });
 
 
 type ConflictDiffModalProps = {
 type ConflictDiffModalProps = {
@@ -25,7 +27,7 @@ type ConflictDiffModalProps = {
 
 
 export const ConflictDiffModal: FC<ConflictDiffModalProps> = (props) => {
 export const ConflictDiffModal: FC<ConflictDiffModalProps> = (props) => {
   const { t } = useTranslation('');
   const { t } = useTranslation('');
-  const resolvedRevision = useRef<string>(t('modal_resolve_conflict.resolve_conflict_message'));
+  const resolvedRevision = useRef<string>('');
   const [isRevisionselected, setIsRevisionSelected] = useState<boolean>(false);
   const [isRevisionselected, setIsRevisionSelected] = useState<boolean>(false);
 
 
   const { pageContainer, editorContainer } = props;
   const { pageContainer, editorContainer } = props;
@@ -169,6 +171,7 @@ export const ConflictDiffModal: FC<ConflictDiffModalProps> = (props) => {
                     lineNumbers: true,
                     lineNumbers: true,
                     tabSize: 2,
                     tabSize: 2,
                     indentUnit: 2,
                     indentUnit: 2,
+                    placeholder: t('modal_resolve_conflict.resolve_conflict_message'),
                   }}
                   }}
                   onChange={(editor, data, pageBody) => {
                   onChange={(editor, data, pageBody) => {
                     if (pageBody === '') setIsRevisionSelected(false);
                     if (pageBody === '') setIsRevisionSelected(false);

+ 2 - 2
packages/app/src/components/PageStatusAlert.jsx

@@ -59,9 +59,9 @@ class PageStatusAlert extends React.Component {
         {t('modal_resolve_conflict.file_conflicting_with_newer_remote')}
         {t('modal_resolve_conflict.file_conflicting_with_newer_remote')}
       </>,
       </>,
       <>
       <>
-        <button type="button" onClick={() => { window.location.href = pageContainer.state.path }} className="btn btn-outline-white mr-4">
+        <button type="button" onClick={() => this.refreshPage()} className="btn btn-outline-white mr-4">
           <i className="icon-fw icon-reload mr-1"></i>
           <i className="icon-fw icon-reload mr-1"></i>
-          {t('modal_resolve_conflict.reload')}
+          {t('Load latest')}
         </button>
         </button>
         <button type="button" onClick={() => pageContainer.setState({ isConflictDiffModalOpen: true })} className="btn btn-outline-white">
         <button type="button" onClick={() => pageContainer.setState({ isConflictDiffModalOpen: true })} className="btn btn-outline-white">
           <i className="fa fa-fw fa-file-text-o mr-1"></i>
           <i className="fa fa-fw fa-file-text-o mr-1"></i>