@seafile/sdoc-editor 0.1.153 → 0.1.154-beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/api/seafile-api.js +23 -10
  2. package/dist/basic-sdk/constants/index.js +25 -1
  3. package/dist/basic-sdk/editor/common-editor.js +50 -0
  4. package/dist/basic-sdk/editor/index.css +29 -0
  5. package/dist/basic-sdk/editor/index.js +129 -0
  6. package/dist/basic-sdk/{slate-editor.js → editor/slate-editor.js} +21 -16
  7. package/dist/basic-sdk/extension/constants/diff-view.js +14 -0
  8. package/dist/basic-sdk/extension/constants/element-type.js +2 -21
  9. package/dist/basic-sdk/extension/constants/index.js +8 -229
  10. package/dist/basic-sdk/extension/constants/menus-config.js +234 -0
  11. package/dist/basic-sdk/extension/core/transforms/replace-node-children.js +26 -0
  12. package/dist/basic-sdk/extension/plugins/markdown/plugin.js +7 -7
  13. package/dist/basic-sdk/extension/plugins/table/constants/index.js +5 -1
  14. package/dist/basic-sdk/extension/plugins/table/render/render-cell.js +2 -3
  15. package/dist/basic-sdk/extension/plugins/text-align/helpers.js +3 -3
  16. package/dist/basic-sdk/extension/plugins/text-style/menu/index.js +4 -4
  17. package/dist/basic-sdk/extension/render/render-element.js +221 -1
  18. package/dist/basic-sdk/socket/helpers.js +2 -0
  19. package/dist/basic-sdk/socket/socket-client.js +58 -0
  20. package/dist/basic-sdk/socket/socket-manager.js +34 -2
  21. package/dist/basic-sdk/socket/with-socket-io.js +35 -12
  22. package/dist/basic-sdk/utils/diff.js +4 -3
  23. package/dist/basic-sdk/utils/rebase.js +193 -0
  24. package/dist/basic-sdk/views/diff-viewer.js +3 -1
  25. package/dist/basic-sdk/views/viewer.js +9 -12
  26. package/dist/components/doc-operations/index.js +4 -2
  27. package/dist/components/doc-operations/revision-operations/index.js +5 -2
  28. package/dist/components/doc-operations/revision-operations/publish-button.js +6 -13
  29. package/dist/components/tip-dialog/index.js +48 -0
  30. package/dist/components/tip-dialog/tip-content.js +47 -0
  31. package/dist/constants/index.js +26 -2
  32. package/dist/context.js +37 -9
  33. package/dist/pages/simple-editor.js +253 -84
  34. package/package.json +1 -1
  35. package/public/locales/en/sdoc-editor.json +11 -1
  36. package/public/locales/zh_CN/sdoc-editor.json +10 -1
  37. package/dist/basic-sdk/editor.js +0 -105
@@ -0,0 +1,47 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import React, { useEffect, useState } from 'react';
3
+ import PropTypes from 'prop-types';
4
+ import { useTranslation } from 'react-i18next';
5
+ import { TIP_TYPE, TIP_CONTENT } from '../../constants';
6
+ import context from '../../context';
7
+ var TipContent = function TipContent(_ref) {
8
+ var tipType = _ref.tipType;
9
+ var _useState = useState(3),
10
+ _useState2 = _slicedToArray(_useState, 2),
11
+ time = _useState2[0],
12
+ setTime = _useState2[1];
13
+ useEffect(function () {
14
+ if (tipType === TIP_TYPE.HAS_BEEN_PUBLISHED) {
15
+ var _time = 3;
16
+ var timer = setInterval(function () {
17
+ _time--;
18
+ setTime(_time);
19
+ if (_time === 0) {
20
+ clearInterval(timer);
21
+ timer = null;
22
+ }
23
+ }, 1000);
24
+ return function () {
25
+ timer && clearInterval(timer);
26
+ };
27
+ }
28
+ }, [tipType]);
29
+ useEffect(function () {
30
+ if (time === 0) {
31
+ var originFileURL = context.getSetting('originFileURL');
32
+ window.location.href = originFileURL;
33
+ }
34
+ }, [time]);
35
+ var _useTranslation = useTranslation(),
36
+ t = _useTranslation.t;
37
+ if (tipType === TIP_TYPE.HAS_BEEN_PUBLISHED) {
38
+ return /*#__PURE__*/React.createElement(React.Fragment, null, t(TIP_CONTENT[tipType], {
39
+ time: time
40
+ }));
41
+ }
42
+ return /*#__PURE__*/React.createElement(React.Fragment, null, t(TIP_CONTENT[tipType]));
43
+ };
44
+ TipContent.propTypes = {
45
+ tipType: PropTypes.string
46
+ };
47
+ export default TipContent;
@@ -1,6 +1,30 @@
1
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
+ var _TIP_TITLE, _TIP_CONTENT;
1
3
  export var EXTERNAL_EVENT = {
2
4
  INTERNAL_LINK_CLICK: 'internal_link_click',
3
5
  TOGGLE_STAR: 'toggle_star',
4
6
  UNMARK_AS_DRAFT: 'unmark_as_draft',
5
- SHARE_SDOC: 'share_sdoc'
6
- };
7
+ SHARE_SDOC: 'share_sdoc',
8
+ PUBLISH_DOCUMENT: 'publish_document',
9
+ PUBLISH_DOCUMENT_ERROR: 'publish_document_error',
10
+ DOCUMENT_REPLACED: 'document_replaced',
11
+ DOCUMENT_REPLACED_ERROR: 'document_replaced_error',
12
+ REMOVE_DOCUMENT: 'remove_document',
13
+ REMOVE_DOCUMENT_ERROR: 'remove_document_error'
14
+ };
15
+ export var MODE = {
16
+ DIFF_VIEWER: 'diff_viewer',
17
+ VIEWER: 'viewer',
18
+ EDITOR: 'editor'
19
+ };
20
+ export var TIP_TYPE = {
21
+ DELETE_NO_CHANGES_REVISION: 'delete_no_changes_revision',
22
+ MERGE: 'merge',
23
+ HAS_CONFLICT_BEFORE_PUBLISH: 'has_conflict_before_publish',
24
+ HAS_BEEN_PUBLISHED: 'has_been_published',
25
+ HAS_BEEN_REPLACED: 'has_been_merge',
26
+ HAS_CONFLICT_BEFORE_VIEW_CHANGES: 'has_conflict_before_view_changes',
27
+ HAS_BEEN_REMOVED: 'has_been_removed'
28
+ };
29
+ export var TIP_TITLE = (_TIP_TITLE = {}, _defineProperty(_TIP_TITLE, TIP_TYPE.DELETE_NO_CHANGES_REVISION, 'Tip'), _defineProperty(_TIP_TITLE, TIP_TYPE.MERGE, 'Tip'), _defineProperty(_TIP_TITLE, TIP_TYPE.HAS_CONFLICT_BEFORE_PUBLISH, 'Tip'), _defineProperty(_TIP_TITLE, TIP_TYPE.HAS_BEEN_PUBLISHED, 'Tip'), _defineProperty(_TIP_TITLE, TIP_TYPE.HAS_BEEN_REPLACED, 'Tip'), _defineProperty(_TIP_TITLE, TIP_TYPE.HAS_CONFLICT_BEFORE_VIEW_CHANGES, 'Tip'), _defineProperty(_TIP_TITLE, TIP_TYPE.HAS_BEEN_REMOVED, 'Tip'), _TIP_TITLE);
30
+ export var TIP_CONTENT = (_TIP_CONTENT = {}, _defineProperty(_TIP_CONTENT, TIP_TYPE.DELETE_NO_CHANGES_REVISION, 'Rebase_delete_no_change_revision_tip'), _defineProperty(_TIP_CONTENT, TIP_TYPE.MERGE, 'Merge_tip'), _defineProperty(_TIP_CONTENT, TIP_TYPE.HAS_CONFLICT_BEFORE_PUBLISH, 'Has_conflict_before_publish_tip'), _defineProperty(_TIP_CONTENT, TIP_TYPE.HAS_BEEN_PUBLISHED, 'Has_been_published_tip'), _defineProperty(_TIP_CONTENT, TIP_TYPE.HAS_BEEN_REPLACED, 'Has_been_replaced_tip'), _defineProperty(_TIP_CONTENT, TIP_TYPE.HAS_CONFLICT_BEFORE_VIEW_CHANGES, 'Has_conflict_before_view_changes_tip'), _defineProperty(_TIP_CONTENT, TIP_TYPE.HAS_BEEN_REMOVED, 'Has_been_removed_tip'), _TIP_CONTENT);
package/dist/context.js CHANGED
@@ -9,6 +9,13 @@ var Context = /*#__PURE__*/function () {
9
9
  _classCallCheck(this, Context);
10
10
  this.initSettings = function () {
11
11
  _this.settings = window.seafile ? window.seafile : window.seafileConfig;
12
+ if (_this.settings['isSdocRevision']) {
13
+ var repoID = _this.getSetting('repoID');
14
+ var siteRoot = _this.getSetting('siteRoot');
15
+ var originFilePath = _this.getSetting('originFilePath');
16
+ var originFileURL = "".concat(siteRoot, "lib/").concat(repoID, "/file").concat(originFilePath);
17
+ _this.settings['originFileURL'] = originFileURL;
18
+ }
12
19
  };
13
20
  this.uploadLocalImage = function (imageFile) {
14
21
  var docUuid = _this.getSetting('docUuid');
@@ -45,6 +52,13 @@ var Context = /*#__PURE__*/function () {
45
52
  if (this.settings[key] === false) return this.settings[key];
46
53
  return this.settings[key] || '';
47
54
  }
55
+ }, {
56
+ key: "updateSettings",
57
+ value: function updateSettings(update) {
58
+ for (var key in update) {
59
+ this.settings[key] = update[key];
60
+ }
61
+ }
48
62
  }, {
49
63
  key: "getViewConfig",
50
64
  value: function getViewConfig() {
@@ -154,16 +168,10 @@ var Context = /*#__PURE__*/function () {
154
168
  return this.api.startRevise(repoID, fileUuid, filePath);
155
169
  }
156
170
  }, {
157
- key: "publishSdocRevision",
158
- value: function publishSdocRevision() {
171
+ key: "getSeadocOriginFileContentDownloadLink",
172
+ value: function getSeadocOriginFileContentDownloadLink() {
159
173
  var docUuid = this.getSetting('docUuid');
160
- return this.api.sdocPublishRevision(docUuid);
161
- }
162
- }, {
163
- key: "getSeadocRevisionDownloadLinks",
164
- value: function getSeadocRevisionDownloadLinks() {
165
- var docUuid = this.getSetting('docUuid');
166
- return this.api.getSeadocRevisionDownloadLinks(docUuid);
174
+ return this.api.getSeadocOriginFileContentDownloadLink(docUuid);
167
175
  }
168
176
  }, {
169
177
  key: "getSdocRevisionsCount",
@@ -177,6 +185,26 @@ var Context = /*#__PURE__*/function () {
177
185
  var docUuid = this.getSetting('docUuid');
178
186
  return this.api.getSdocRevisions(docUuid, page, perPage);
179
187
  }
188
+ }, {
189
+ key: "updateSdocRevision",
190
+ value: function updateSdocRevision() {
191
+ var docUuid = this.getSetting('docUuid');
192
+ return this.api.updateSdocRevision(docUuid);
193
+ }
194
+ }, {
195
+ key: "deleteSdocRevision",
196
+ value: function deleteSdocRevision() {
197
+ var docUuid = this.getSetting('docUuid');
198
+ return this.api.deleteSdocRevision(docUuid);
199
+ }
200
+ }, {
201
+ key: "getRevisionBasicVersionContent",
202
+ value: function getRevisionBasicVersionContent() {
203
+ var docUuid = this.getSetting('docUuid');
204
+ return this.api.getRevisionBasicVersionContent(docUuid);
205
+ }
206
+
207
+ // local files
180
208
  }, {
181
209
  key: "getSdocLocalFiles",
182
210
  value: function getSdocLocalFiles(p, type) {
@@ -1,9 +1,8 @@
1
- import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
1
+ import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
2
2
  import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
3
+ function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == typeof h && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(typeof e + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
3
4
  import React, { useCallback, useEffect, useRef, useState } from 'react';
4
5
  import { withTranslation } from 'react-i18next';
5
- import deepCopy from 'deep-copy';
6
- import { SDocEditor, DiffViewer } from '../basic-sdk';
7
6
  import Loading from '../components/loading';
8
7
  import DocInfo from '../components/doc-info';
9
8
  import DocOperations from '../components/doc-operations';
@@ -11,49 +10,126 @@ import Layout, { Header, Content } from '../layout';
11
10
  import { generateDefaultDocContent } from '../utils';
12
11
  import context from '../context';
13
12
  import ErrorBoundary from './error-boundary';
13
+ import TipDialog from '../components/tip-dialog';
14
+ import { EXTERNAL_EVENT, MODE, TIP_TYPE } from '../constants';
15
+ import { getRebase, hasConflict } from '../basic-sdk/utils/rebase';
16
+ import toaster from '../components/toast';
17
+ import { EventBus, SDocEditor } from '../basic-sdk';
14
18
  import '../assets/css/simple-editor.css';
15
19
  var SimpleEditor = function SimpleEditor(_ref) {
16
20
  var isStarred = _ref.isStarred,
17
21
  isDraft = _ref.isDraft,
18
22
  t = _ref.t;
23
+ context.initApi();
19
24
  var editorRef = useRef(null);
20
25
  var _useState = useState(true),
21
26
  _useState2 = _slicedToArray(_useState, 2),
22
- isFirstLoad = _useState2[0],
23
- setFirstLoad = _useState2[1];
24
- var _useState3 = useState(true),
27
+ isLoadingSdoc = _useState2[0],
28
+ setLoadingSdoc = _useState2[1];
29
+ var _useState3 = useState(''),
25
30
  _useState4 = _slicedToArray(_useState3, 2),
26
- isLoadingSdoc = _useState4[0],
27
- setLoadingSdoc = _useState4[1];
28
- var _useState5 = useState(''),
31
+ errorMessage = _useState4[0],
32
+ setErrorMessage = _useState4[1];
33
+ var _useState5 = useState(false),
29
34
  _useState6 = _slicedToArray(_useState5, 2),
30
- errorMessage = _useState6[0],
31
- setErrorMessage = _useState6[1];
32
- var _useState7 = useState(false),
35
+ isShowChanges = _useState6[0],
36
+ setShowChanges = _useState6[1];
37
+ var _useState7 = useState(null),
33
38
  _useState8 = _slicedToArray(_useState7, 2),
34
- isShowChanges = _useState8[0],
35
- setShowChanges = _useState8[1];
36
- var _useState9 = useState(null),
39
+ document = _useState8[0],
40
+ setDocument = _useState8[1];
41
+ var _useState9 = useState(MODE.EDITOR),
37
42
  _useState10 = _slicedToArray(_useState9, 2),
38
- document = _useState10[0],
39
- setDocument = _useState10[1];
40
- var _useState11 = useState(null),
43
+ mode = _useState10[0],
44
+ setMode = _useState10[1];
45
+ var _useState11 = useState([]),
41
46
  _useState12 = _slicedToArray(_useState11, 2),
42
- currentContent = _useState12[0],
43
- setCurrentContent = _useState12[1];
44
- var _useState13 = useState(null),
47
+ changes = _useState12[0],
48
+ setChanges = _useState12[1];
49
+ var _useState13 = useState(false),
45
50
  _useState14 = _slicedToArray(_useState13, 2),
46
- lastContent = _useState14[0],
47
- setLastContent = _useState14[1];
51
+ showTip = _useState14[0],
52
+ setShowTip = _useState14[1];
53
+ var _useState15 = useState(''),
54
+ _useState16 = _slicedToArray(_useState15, 2),
55
+ tipType = _useState16[0],
56
+ setTipType = _useState16[1];
57
+ var _useState17 = useState([]),
58
+ _useState18 = _slicedToArray(_useState17, 2),
59
+ mergeValue = _useState18[0],
60
+ setMergeValue = _useState18[1];
61
+ useEffect(function () {
62
+ loadDocument(function (document) {
63
+ setDocument(document);
64
+ setLoadingSdoc(false);
65
+ }, function (errorMessage) {
66
+ setErrorMessage(errorMessage);
67
+ setDocument(null);
68
+ setLoadingSdoc(false);
69
+ }, function () {
70
+ setLoadingSdoc(true);
71
+ });
72
+
73
+ // eslint-disable-next-line react-hooks/exhaustive-deps
74
+ }, []);
75
+
76
+ // useMount: reset title
48
77
  useEffect(function () {
49
- context.initApi();
50
- initDocumentData(true);
78
+ var isSdocRevision = context.getSetting('isSdocRevision');
79
+ var originFilename = context.getSetting('originFilename');
80
+ if (isSdocRevision) {
81
+ window.document.getElementsByTagName('title')[0].innerText = "".concat(t('Revision'), " - ").concat(originFilename);
82
+ }
51
83
 
52
84
  // eslint-disable-next-line react-hooks/exhaustive-deps
53
85
  }, []);
54
- var initDocumentData = useCallback(function (isFirstLoad) {
55
- setShowChanges(false);
56
- setLoadingSdoc(true);
86
+ var onDocumentReplaced = useCallback(function () {
87
+ setTipType(TIP_TYPE.HAS_BEEN_REPLACED);
88
+ setShowTip(true);
89
+
90
+ // eslint-disable-next-line react-hooks/exhaustive-deps
91
+ }, [editorRef]);
92
+ var hasPublishRevision = useCallback(function () {
93
+ setTipType(TIP_TYPE.HAS_BEEN_PUBLISHED);
94
+ setShowTip(true);
95
+
96
+ // eslint-disable-next-line react-hooks/exhaustive-deps
97
+ }, [editorRef]);
98
+ var onDocumentReplacedError = useCallback(function () {
99
+ toaster.danger(t('Error'));
100
+
101
+ // eslint-disable-next-line react-hooks/exhaustive-deps
102
+ }, []);
103
+ var publishDocumentError = useCallback(function () {
104
+ toaster.danger(t('Error'));
105
+
106
+ // eslint-disable-next-line react-hooks/exhaustive-deps
107
+ }, []);
108
+ var onDocumentRemoved = useCallback(function () {
109
+ setTipType(TIP_TYPE.HAS_BEEN_REMOVED);
110
+ setShowTip(true);
111
+
112
+ // eslint-disable-next-line react-hooks/exhaustive-deps
113
+ }, []);
114
+ useEffect(function () {
115
+ var eventBus = EventBus.getInstance();
116
+ var unsubscribeMergeDocument = eventBus.subscribe(EXTERNAL_EVENT.DOCUMENT_REPLACED, onDocumentReplaced);
117
+ var unsubscribePublishDocument = eventBus.subscribe(EXTERNAL_EVENT.PUBLISH_DOCUMENT, hasPublishRevision);
118
+ var unsubscribeMergeDocumentError = eventBus.subscribe(EXTERNAL_EVENT.DOCUMENT_REPLACED_ERROR, onDocumentReplacedError);
119
+ var unsubscribePublishDocumentError = eventBus.subscribe(EXTERNAL_EVENT.PUBLISH_DOCUMENT_ERROR, publishDocumentError);
120
+ var unsubscribeRemoveDocument = eventBus.subscribe(EXTERNAL_EVENT.REMOVE_DOCUMENT, onDocumentRemoved);
121
+ return function () {
122
+ unsubscribeMergeDocument();
123
+ unsubscribePublishDocument();
124
+ unsubscribeMergeDocumentError();
125
+ unsubscribePublishDocumentError();
126
+ unsubscribeRemoveDocument();
127
+ };
128
+
129
+ // eslint-disable-next-line react-hooks/exhaustive-deps
130
+ }, []);
131
+ var loadDocument = useCallback(function (successCallback, errorCallback, callback) {
132
+ callback && callback();
57
133
  context.getFileContent().then(function (res) {
58
134
  var result = res.data || generateDefaultDocContent();
59
135
  if (result && !result.children) {
@@ -63,74 +139,174 @@ var SimpleEditor = function SimpleEditor(_ref) {
63
139
  cursors: result.cursors || {}
64
140
  };
65
141
  }
66
- setDocument(result);
67
- setLoadingSdoc(false);
68
- isFirstLoad && setFirstLoad(false);
142
+ successCallback && successCallback(result);
69
143
  }).catch(function (error) {
70
144
  // eslint-disable-next-line
71
145
  console.log(error);
72
- setErrorMessage('Load_doc_content_error');
146
+ var errorMessage = 'Load_doc_content_error';
73
147
  if (error && error.response) {
74
148
  var _ref2 = error.response.data || {},
75
149
  error_type = _ref2.error_type;
76
150
  if (error_type === 'content_invalid') {
77
- setErrorMessage('Sdoc_format_invalid');
151
+ errorMessage = 'Sdoc_format_invalid';
78
152
  }
79
153
  }
80
- setDocument(null);
81
- setLoadingSdoc(false);
154
+ errorCallback && errorCallback(errorMessage);
82
155
  });
83
-
84
- // eslint-disable-next-line react-hooks/exhaustive-deps
85
156
  }, []);
86
- var initChangesData = useCallback(function () {
87
- setShowChanges(true);
88
- setLoadingSdoc(true);
89
- context.getSeadocRevisionDownloadLinks().then(function (res) {
90
- var originFileDownloadLink = res.data.origin_file_download_link;
157
+ var setDiffContent = useCallback(function () {
158
+ context.getSeadocOriginFileContentDownloadLink().then(function (res) {
159
+ var originFileDownloadLink = res.data.download_link;
91
160
  return fetch(originFileDownloadLink);
92
161
  }).then(function (res) {
93
162
  return res.json();
94
163
  }).then(function (originContent) {
95
- setLastContent(originContent);
96
- setErrorMessage(null);
97
- setLoadingSdoc(false);
164
+ editorRef.current.setDiffContent(originContent);
165
+ editorRef.current.setLoading(false);
98
166
  }).catch(function (error) {
99
- setErrorMessage('Load_doc_content_error');
100
- setLoadingSdoc(false);
167
+ console.log('error');
101
168
  });
102
-
103
- // eslint-disable-next-line react-hooks/exhaustive-deps
104
- }, [document]);
169
+ }, []);
105
170
  var toggleViewChanges = useCallback(function (isShowChanges) {
106
- if (isShowChanges) {
107
- var newestValue = editorRef.current.getValue();
108
- setCurrentContent(deepCopy(_objectSpread(_objectSpread({}, document), {}, {
109
- children: newestValue
110
- })));
171
+ var revisionContent = editorRef.current.getSlateValue();
172
+ if (isShowChanges && hasConflict(revisionContent.children)) {
173
+ setTipType(TIP_TYPE.HAS_CONFLICT_BEFORE_VIEW_CHANGES);
174
+ setShowTip(true);
175
+ return;
111
176
  }
112
- if (isShowChanges) {
113
- initChangesData();
177
+ editorRef.current.setLoading(true);
178
+ setShowChanges(isShowChanges);
179
+ var mode = isShowChanges ? MODE.DIFF_VIEWER : MODE.EDITOR;
180
+ setMode(mode);
181
+ editorRef.current.setEditorMode(mode);
182
+ if (!isShowChanges) {
183
+ loadDocument(function (document) {
184
+ setDocument(document);
185
+ editorRef.current.setSlateValue(document);
186
+ editorRef.current.setLoading(false);
187
+ }, function (errorMessage) {
188
+ setErrorMessage(errorMessage);
189
+ editorRef.current.setLoading(false);
190
+ });
114
191
  return;
115
192
  }
116
- setChanges([]);
117
- initDocumentData(false);
193
+ setDiffContent();
118
194
 
119
195
  // eslint-disable-next-line react-hooks/exhaustive-deps
120
- }, [document]);
121
- var _useState15 = useState([]),
122
- _useState16 = _slicedToArray(_useState15, 2),
123
- changes = _useState16[0],
124
- setChanges = _useState16[1];
196
+ }, [document, editorRef.current]);
197
+ var publishRevision = useCallback( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
198
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
199
+ while (1) switch (_context.prev = _context.next) {
200
+ case 0:
201
+ loadDocument(function (document) {
202
+ var revisionContent = document;
203
+ if (hasConflict(revisionContent.children)) {
204
+ setTipType(TIP_TYPE.HAS_CONFLICT_BEFORE_PUBLISH);
205
+ setShowTip(true);
206
+ return;
207
+ }
208
+ var originDocName = context.getSetting('originFilename');
209
+ var originDocUuid = context.getSetting('originDocUuid');
210
+ var basicContent;
211
+ var masterContent;
212
+ context.getRevisionBasicVersionContent().then(function (res) {
213
+ var basicVersionContentString = res.data.content; // commit content
214
+ basicContent = JSON.parse(basicVersionContentString);
215
+ return context.getSeadocOriginFileContentDownloadLink();
216
+ }).then(function (res) {
217
+ var originFileDownloadLink = res.data.download_link;
218
+ return fetch(originFileDownloadLink);
219
+ }).then(function (res) {
220
+ return res.json();
221
+ }).then(function (content) {
222
+ masterContent = content;
223
+ var _getRebase = getRebase(masterContent, basicContent, revisionContent),
224
+ canMerge = _getRebase.canMerge,
225
+ isNeedReplaceMaster = _getRebase.isNeedReplaceMaster,
226
+ value = _getRebase.value;
227
+ if (canMerge && isNeedReplaceMaster) {
228
+ editorRef.current.publishDocument(originDocUuid, originDocName, function (success) {
229
+ if (success) {
230
+ setTipType(TIP_TYPE.HAS_BEEN_PUBLISHED);
231
+ setShowTip(true);
232
+ } else {
233
+ toaster.danger(t('Error'));
234
+ }
235
+ });
236
+ return;
237
+ }
238
+ if (canMerge && !isNeedReplaceMaster) {
239
+ setTipType(TIP_TYPE.DELETE_NO_CHANGES_REVISION);
240
+ setShowTip(true);
241
+ return;
242
+ }
243
+ setMergeValue(value);
244
+ setTipType(TIP_TYPE.MERGE);
245
+ setShowTip(true);
246
+ }).catch(function (error) {
247
+ toaster.danger(t('Error'));
248
+ });
249
+ }, function (errorMessage) {
250
+ toaster.danger(t(errorMessage));
251
+ });
252
+
253
+ // eslint-disable-next-line react-hooks/exhaustive-deps
254
+ case 1:
255
+ case "end":
256
+ return _context.stop();
257
+ }
258
+ }, _callee);
259
+ })), [isShowChanges, mode]);
125
260
  var setDiffChanges = useCallback(function (diff) {
126
261
  setChanges(diff.changes);
127
262
 
128
263
  // eslint-disable-next-line react-hooks/exhaustive-deps
129
264
  }, [isShowChanges]);
130
- if (isFirstLoad && !errorMessage) {
265
+ var jumpToURL = useCallback(function (url) {
266
+ window.location.href = url;
267
+ }, []);
268
+ var closeTip = useCallback(function () {
269
+ setShowTip(false);
270
+
271
+ // eslint-disable-next-line react-hooks/exhaustive-deps
272
+ }, [tipType]);
273
+ var tipSubmit = useCallback(function () {
274
+ if (tipType === TIP_TYPE.DELETE_NO_CHANGES_REVISION) {
275
+ context.deleteSdocRevision().then(function (res) {
276
+ setShowTip(false);
277
+ var originFileURL = context.getSetting('originFileURL');
278
+ jumpToURL(originFileURL);
279
+ }).catch(function (error) {
280
+ toaster.danger(t('Error'));
281
+ });
282
+ return;
283
+ }
284
+ if (tipType === TIP_TYPE.MERGE) {
285
+ context.updateSdocRevision().then(function (res) {
286
+ var origin_file_version = res.data.origin_file_version;
287
+ context.updateSettings({
288
+ 'originFileVersion': origin_file_version
289
+ });
290
+ editorRef.current.replaceDocument(mergeValue);
291
+ editorRef.current.setLoading(true);
292
+ editorRef.current.setSlateValue(mergeValue);
293
+ setMode(MODE.EDITOR);
294
+ editorRef.current.setEditorMode(MODE.EDITOR);
295
+ editorRef.current.setLoading(false);
296
+ setShowTip(false);
297
+ }).catch(function (error) {
298
+ toaster.danger(t('Error'));
299
+ });
300
+ return;
301
+ }
302
+ setShowTip(false);
303
+
304
+ // eslint-disable-next-line react-hooks/exhaustive-deps
305
+ }, [tipType, mergeValue, editorRef.current]);
306
+ if (isLoadingSdoc) {
131
307
  return /*#__PURE__*/React.createElement(Loading, null);
132
308
  }
133
- if (isFirstLoad && errorMessage) {
309
+ if (errorMessage) {
134
310
  return /*#__PURE__*/React.createElement("div", {
135
311
  className: "error-page"
136
312
  }, /*#__PURE__*/React.createElement("div", {
@@ -144,24 +320,17 @@ var SimpleEditor = function SimpleEditor(_ref) {
144
320
  }), /*#__PURE__*/React.createElement(DocOperations, {
145
321
  isShowChanges: isShowChanges,
146
322
  changes: changes,
147
- toggleViewChanges: toggleViewChanges
148
- })), /*#__PURE__*/React.createElement(Content, null, isLoadingSdoc && /*#__PURE__*/React.createElement("div", {
149
- className: "w-100 h-100 d-flex align-items-center justify-content-center"
150
- }, /*#__PURE__*/React.createElement(Loading, null)), !isLoadingSdoc && errorMessage && /*#__PURE__*/React.createElement("div", {
151
- className: "error-page"
152
- }, /*#__PURE__*/React.createElement("div", {
153
- className: "error-tip"
154
- }, t(errorMessage))), !isLoadingSdoc && !errorMessage && /*#__PURE__*/React.createElement(React.Fragment, null, isShowChanges ? /*#__PURE__*/React.createElement(DiffViewer, {
155
- showToolbar: true,
156
- showOutline: true,
157
- currentContent: currentContent,
158
- lastContent: lastContent,
159
- didMountCallback: setDiffChanges
160
- }) : /*#__PURE__*/React.createElement(SDocEditor, {
161
- config: context.getEditorConfig(),
162
- document: document,
323
+ toggleViewChanges: toggleViewChanges,
324
+ publishRevision: publishRevision
325
+ })), /*#__PURE__*/React.createElement(Content, null, /*#__PURE__*/React.createElement(SDocEditor, {
163
326
  ref: editorRef,
164
- isOpenSocket: context.getSetting('isOpenSocket')
165
- })))));
327
+ document: document,
328
+ mode: mode,
329
+ setDiffChanges: setDiffChanges
330
+ }))), showTip && /*#__PURE__*/React.createElement(TipDialog, {
331
+ toggle: closeTip,
332
+ submit: tipSubmit,
333
+ tipType: tipType
334
+ }));
166
335
  };
167
336
  export default withTranslation('sdoc-editor')(SimpleEditor);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seafile/sdoc-editor",
3
- "version": "0.1.153",
3
+ "version": "0.1.154beta1",
4
4
  "private": false,
5
5
  "description": "This is a sdoc editor",
6
6
  "main": "dist/index.js",
@@ -364,5 +364,15 @@
364
364
  "Title": "Title",
365
365
  "Subtitle": "Subtitle",
366
366
  "Link_sdoc": "Link sdoc",
367
- "Link_file": "Link file"
367
+ "Link_file": "Link file",
368
+ "Keep_my_modification": "Keep my modification",
369
+ "Keep_other_modification": "Keep other's modification",
370
+ "Keep_both_modification": "Keep my modification",
371
+ "Tip": "Tip",
372
+ "Rebase_delete_no_change_revision_tip": "Revision has not made any change compared to original document. Do you want to delete this revision?",
373
+ "Has_been_replaced_tip": "Document content has been replaced. Please refresh the page.",
374
+ "Has_been_published_tip": "Revision has been published, Automatically jump to source content after {{ time }} seconds.",
375
+ "Has_conflict_before_publish_tip": "There are conflicts in the document, please resolve it before publishing!",
376
+ "Merge_tip": "There are conflicts in the documents. Do you want to merge them?",
377
+ "Has_conflict_before_view_changes_tip": "There are conflicts in the document. Please resolve the conflict before viewing the changes!"
368
378
  }
@@ -363,5 +363,14 @@
363
363
  "No_changes": "没有变化",
364
364
  "Title": "标题",
365
365
  "Subtitle": "副标题",
366
- "Link_sdoc": "链接 sdoc"
366
+ "Link_sdoc": "链接 sdoc",
367
+ "Keep_my_modification": "保留我的更改",
368
+ "Keep_other_modification": "保留其他的更改",
369
+ "Keep_both_modification": "保留两个更改",
370
+ "Rebase_delete_no_change_revision_tip": "修订改没有更改,是否删除修订稿?",
371
+ "Has_been_replaced_tip": "文档内容已经被替换,请刷新页面。",
372
+ "Has_been_published_tip": "修订稿已经发布了,{{ time }} 秒后自动跳转到源文件。",
373
+ "Has_conflict_before_publish_tip": "文档有冲突,请解决冲突后再发布!",
374
+ "Merge_tip": "文档有冲突,是否合并?",
375
+ "Has_conflict_before_view_changes_tip": "文档有冲突,请解决冲突后再查看更改!"
367
376
  }