diff --git a/frontend/config/webpack.config.prod.js b/frontend/config/webpack.config.prod.js index a86e0fcb8f..7098ff43a8 100644 --- a/frontend/config/webpack.config.prod.js +++ b/frontend/config/webpack.config.prod.js @@ -63,6 +63,7 @@ module.exports = { repoview: [require.resolve('./polyfills'), paths.appSrc + "/repo-wiki-mode.js"], dashboard: [require.resolve('./polyfills'), paths.appSrc + "/dashboard.js"], fileHistory: [require.resolve('./polyfills'), paths.appSrc + "/file-history.js"], + drafts: [require.resolve('./polyfills'), paths.appSrc + "/drafts.js"], }, output: { diff --git a/frontend/package-lock.json b/frontend/package-lock.json index ae53b14914..179071a918 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -5,10 +5,11 @@ "requires": true, "dependencies": { "@seafile/seafile-editor": { - "version": "0.1.16", - "resolved": "https://registry.npmjs.org/@seafile/seafile-editor/-/seafile-editor-0.1.16.tgz", - "integrity": "sha512-hfIWndf0eVm+JdH2tMpIynVwCCp8XFuTw3SUFs1X2n1AhAQaOyNu57t+bs0FUxRu00Pmm+EKWDYhWFQpWssl3Q==", + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@seafile/seafile-editor/-/seafile-editor-0.1.19.tgz", + "integrity": "sha512-yh98j9tfHk8oq7mWqFb5M+iqeqzCCMVzh9DnQy2SRxhFeHdNw/qZolylsbDh9JHUm6vyHp1V3SjAw/QSOxvmUQ==", "requires": { + "@seafile/slate-react": "0.1.2", "autoprefixer": "7.1.6", "case-sensitive-paths-webpack-plugin": "2.1.1", "chalk": "1.1.3", @@ -18,14 +19,21 @@ "dayjs": "1.6.2", "deep-equal": "1.0.1", "deepmerge": "2.1.0", + "detect-indent": "4.0.0", + "detect-newline": "2.1.0", "dotenv": "4.0.0", "dotenv-expand": "4.2.0", + "ends-with": "0.2.0", "extract-text-webpack-plugin": "3.0.2", "file-loader": "1.1.5", "fs-extra": "3.0.1", "hast-util-sanitize": "1.1.2", "html-webpack-plugin": "2.29.0", "immutable": "3.8.2", + "is-data-uri": "0.1.0", + "is-hotkey": "0.1.3", + "is-image": "2.0.0", + "is-url": "1.2.4", "lodash": "4.17.5", "mdast-util-definitions": "1.2.2", "object-assign": "4.1.1", @@ -48,18 +56,12 @@ "remark-parse": "5.0.0", "remark-rehype": "3.0.0", "remark-slug": "5.0.0", - "seafile-js": "0.2.14", + "seafile-js": "0.2.15", "seafile-ui": "0.1.10", - "slate": "0.34.2", - "slate-drop-or-paste-images": "0.8.3", - "slate-edit-blockquote": "0.6.1", - "slate-edit-code": "0.15.5", - "slate-edit-list": "0.11.3", - "slate-edit-table": "0.15.2", - "slate-hotkeys": "0.1.4", - "slate-html-serializer": "0.6.32", - "slate-react": "0.12.11", - "slate-trailing-block": "0.5.0", + "slate": "0.40.2", + "slate-hotkeys": "0.2.3", + "slate-html-serializer": "0.7.2", + "slate-schema-violations": "0.1.39", "socket.io-client": "2.1.1", "style-loader": "0.19.0", "toggle-selection": "1.0.6", @@ -71,15 +73,6 @@ "xtend": "4.0.1" }, "dependencies": { - "prop-types": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", - "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", - "requires": { - "loose-envify": "1.3.1", - "object-assign": "4.1.1" - } - }, "reactstrap": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/reactstrap/-/reactstrap-5.0.0.tgz", @@ -96,6 +89,42 @@ } } }, + "@seafile/slate-react": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@seafile/slate-react/-/slate-react-0.1.2.tgz", + "integrity": "sha512-ZMcGfUixuraVYsCKR4xPVQxI9EYFxZ5U6uTAxcL4+k+G6QT76U6xnScuJmMUF/uNErfuJKakKl+gFnkrhsSVcA==", + "requires": { + "debug": "3.2.5", + "get-window": "1.1.2", + "is-window": "1.0.2", + "lodash": "4.17.5", + "memoize-one": "4.0.2", + "prop-types": "15.6.2", + "react-immutable-proptypes": "2.1.0", + "selection-is-backward": "1.0.0", + "slate-base64-serializer": "0.2.63", + "slate-dev-environment": "0.2.0", + "slate-dev-warning": "0.0.1", + "slate-hotkeys": "0.2.3", + "slate-plain-serializer": "0.6.2", + "slate-prop-types": "0.4.61" + }, + "dependencies": { + "debug": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", + "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", + "requires": { + "ms": "2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, "@types/node": { "version": "10.0.4", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.0.4.tgz", @@ -474,7 +503,7 @@ "resolved": "http://registry.npmjs.org/axios/-/axios-0.18.0.tgz", "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=", "requires": { - "follow-redirects": "1.5.7", + "follow-redirects": "1.5.8", "is-buffer": "1.1.6" } }, @@ -4166,9 +4195,9 @@ "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=" }, "follow-redirects": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.7.tgz", - "integrity": "sha512-NONJVIFiX7Z8k2WxfqBjtwqMifx7X42ORLFrOZ2LTKGj71G3C0kfdyTqGqr8fx5zSX6Foo/D95dgGWbPUiwnew==", + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.8.tgz", + "integrity": "sha512-sy1mXPmv7kLAMKW/8XofG7o9T+6gAjzdZK4AJF6ryqQYUa/hnzgiypoeUecZ53x7XiqKNEpNqLtS97MshW2nxg==", "requires": { "debug": "3.1.0" }, @@ -5716,11 +5745,6 @@ "resolved": "https://registry.npmjs.org/image-extensions/-/image-extensions-1.1.0.tgz", "integrity": "sha1-uOa/YDnfAFbjM1AqALZjejEF2JQ=" }, - "image-to-data-uri": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/image-to-data-uri/-/image-to-data-uri-1.1.0.tgz", - "integrity": "sha1-I/nX8XtlYspqgUXpd5yaFmuCn24=" - }, "immutable": { "version": "3.8.2", "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", @@ -5968,11 +5992,6 @@ "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" }, - "is-empty": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-empty/-/is-empty-1.2.0.tgz", - "integrity": "sha1-3pu1snhzigWgsJpX4ftNSjQan2s=" - }, "is-equal-shallow": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", @@ -6023,9 +6042,9 @@ "integrity": "sha512-wB5PP/lwpaN5zNT1vjHxYFBxiq5zvUZiv8696eB5OmeCRCgNIzb3cMJjRhogSQXe8LLDKOzzlFfGlMaWnc4emQ==" }, "is-image": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-image/-/is-image-1.0.1.tgz", - "integrity": "sha1-b9UadSoaERUG0GDZUhGLC5ibQm4=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-image/-/is-image-2.0.0.tgz", + "integrity": "sha1-RUyVaVeN4xhpNx+/rqSVj0YbPgw=", "requires": { "image-extensions": "1.1.0" } @@ -6763,11 +6782,6 @@ "resolved": "https://registry.npmjs.org/kebab-case/-/kebab-case-1.0.0.tgz", "integrity": "sha1-P55JkK3K0MaGwOcB92RYaPdfkes=" }, - "keycode": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.0.tgz", - "integrity": "sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ=" - }, "killable": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.0.tgz", @@ -7306,6 +7320,11 @@ "mimic-fn": "1.2.0" } }, + "memoize-one": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-4.0.2.tgz", + "integrity": "sha512-ucx2DmXTeZTsS4GPPUZCbULAN7kdPT1G+H49Y34JjbQ5ESc6OGhVxKvb1iKhr9v19ZB9OtnHwNnhUnNR/7Wteg==" + }, "memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", @@ -9626,14 +9645,6 @@ "prop-types": "15.6.2" } }, - "react-portal": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/react-portal/-/react-portal-3.2.0.tgz", - "integrity": "sha512-avb1FreAZAVCvNNyS2dCpxZiPYPJnAasHYPxdVBTROgNFeI+KSb+OoMHNsC1GbDawESCriPwCX+qKua6WSPIFw==", - "requires": { - "prop-types": "15.6.2" - } - }, "react-proxy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/react-proxy/-/react-proxy-1.1.8.tgz", @@ -10327,9 +10338,9 @@ } }, "seafile-js": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/seafile-js/-/seafile-js-0.2.14.tgz", - "integrity": "sha512-iWk+oB9bBroOGq6hLWnePgF14+OTcG+F9ADPNkqTjolMstKzoNfPFFHTAxqNmengwEEtD44stsMkcZxOyHGBXw==", + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/seafile-js/-/seafile-js-0.2.15.tgz", + "integrity": "sha512-eVRCpjjCi6p0lXM7w2AMUAdmkvOAAx29iiKxzrYQ2QicZIZ2V6zxxN3CODAFHU3Z+rAItJbsZV6kqmAWd+Hq8A==", "requires": { "axios": "0.18.0", "form-data": "2.3.2" @@ -10515,28 +10526,31 @@ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" }, "slate": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/slate/-/slate-0.34.2.tgz", - "integrity": "sha1-+vddKV5E2LQ88uFBaPekNFeinGc=", + "version": "0.40.2", + "resolved": "https://registry.npmjs.org/slate/-/slate-0.40.2.tgz", + "integrity": "sha512-STxC+TGQMinfFoRZuT1/cdExkqCKwgYpdDNEK6tAxS8F/A6lYzgH0J3rtWQH1ePPtZSEIPcqsroFWXVUTAZG6w==", "requires": { - "debug": "3.1.0", + "debug": "3.2.5", "direction": "0.1.5", "esrever": "0.2.0", - "is-empty": "1.2.0", "is-plain-object": "2.0.4", "lodash": "4.17.5", - "slate-dev-logger": "0.1.43", - "slate-schema-violations": "0.1.39", + "slate-dev-warning": "0.0.1", "type-of": "2.0.1" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", + "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", "requires": { - "ms": "2.0.0" + "ms": "2.1.1" } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" } } }, @@ -10549,130 +10563,50 @@ } }, "slate-dev-environment": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/slate-dev-environment/-/slate-dev-environment-0.1.6.tgz", - "integrity": "sha512-DDeNzcpBvdEtPmuLrpPtrth7vnK693fgxzwS6FACu3oMBoXjh0qcJWVBktecPJXJDxcTVkWUpt0dPhfXLMIkWQ==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/slate-dev-environment/-/slate-dev-environment-0.2.0.tgz", + "integrity": "sha512-xxh3ThUSHYDwRUaywRQeOySJFI1kU4mYw9uDUbjk3VTpt0BHCFufHkCU5f22U8HyP7b2nDVFwfyXg1Q0o+Ksag==", "requires": { "is-in-browser": "1.1.3" } }, - "slate-dev-logger": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/slate-dev-logger/-/slate-dev-logger-0.1.43.tgz", - "integrity": "sha512-GkcPMGzmPVm85AL+jaKnzhIA0UH9ktQDEIDM+FuQtz+TAPcpPCQiRAaZ6I2p2uD0Hq9bImhKSCtHIa0qRxiVGw==" - }, - "slate-drop-or-paste-images": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/slate-drop-or-paste-images/-/slate-drop-or-paste-images-0.8.3.tgz", - "integrity": "sha512-XFXxcdzKLO7gc5sHoOV7ZSMRaiPFXIYF5LIQdLeuVSSsJ015NBC7hJrENzqRFJ5kWH/KQQdE8IEcY5vOGfq8wg==", - "requires": { - "es6-promise": "4.2.4", - "image-to-data-uri": "1.1.0", - "is-data-uri": "0.1.0", - "is-image": "1.0.1", - "is-url": "1.2.4", - "slate-dev-logger": "0.1.43" - } - }, - "slate-edit-blockquote": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/slate-edit-blockquote/-/slate-edit-blockquote-0.6.1.tgz", - "integrity": "sha512-gPeJvnXEu/eEDhJARWns/vGok+1b0OmpwrnlHXHDyEmnBDLEYY+W5HTH2i1ZXUZQ/8QHLE0NPhYjS1A4AAm2+w==" - }, - "slate-edit-code": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/slate-edit-code/-/slate-edit-code-0.15.5.tgz", - "integrity": "sha512-+Nd6AGPYtYSe87l16cHSnhXF4CPW7n6f4KoxL+dDhf1KQkP1dXGSgAFJlZmOJJp9dQexPbB0mxTu2TPKB9W2MA==", - "requires": { - "detect-indent": "4.0.0", - "detect-newline": "2.1.0", - "ends-with": "0.2.0", - "is-hotkey": "0.1.3" - } - }, - "slate-edit-list": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/slate-edit-list/-/slate-edit-list-0.11.3.tgz", - "integrity": "sha512-nqaiYYppezMmbsh+JN6vqZl2EexiUTJWwCzJVas8cv+WeRtRmuysn94LKF2VdLIxLmNAe/ZfliIkW9uC/NdO6w==" - }, - "slate-edit-table": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/slate-edit-table/-/slate-edit-table-0.15.2.tgz", - "integrity": "sha1-8mtnRRtQf5NhBhUfVaC/+9vKAhM=" + "slate-dev-warning": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/slate-dev-warning/-/slate-dev-warning-0.0.1.tgz", + "integrity": "sha512-QdXa+qmOG46VrTfnzn2gUVzs1WiO3Q+zCv3XomzMNGdgAJjCgHBs3jaeQD845h15loS3OJ181gCNAkB3dby6Hw==" }, "slate-hotkeys": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/slate-hotkeys/-/slate-hotkeys-0.1.4.tgz", - "integrity": "sha1-WxCyoXiv/GCCf5KE1MCl1+UEH/4=", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/slate-hotkeys/-/slate-hotkeys-0.2.3.tgz", + "integrity": "sha512-2Ptajlcbc0m+Pt5i/cWp0uKVSjj0VYbKcS+60Dmx5r7HunYhFBi92g3qwQ162uvb6rWenOFVHHYTrf8SiExoZg==", "requires": { "is-hotkey": "0.1.3", - "slate-dev-environment": "0.1.6" + "slate-dev-environment": "0.2.0" } }, "slate-html-serializer": { - "version": "0.6.32", - "resolved": "https://registry.npmjs.org/slate-html-serializer/-/slate-html-serializer-0.6.32.tgz", - "integrity": "sha512-x1RP1R2HMaVFflk9UXiuepcbN4wMoJRv0VWtxFw8efGNFmJfNBWME4iXAy6GNFRV0rRPlG3xCuQv2wHZ/+JMYw==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/slate-html-serializer/-/slate-html-serializer-0.7.2.tgz", + "integrity": "sha512-UpF3tnEEzdvQKQWvRPqnkKftoBG7efDkNCjaoa7p4yCPav/RstCAm9AwhdINGsKDcYgPt9RXvhpe6r7iu/KQQQ==", "requires": { - "slate-dev-logger": "0.1.43", "type-of": "2.0.1" } }, "slate-plain-serializer": { - "version": "0.5.41", - "resolved": "https://registry.npmjs.org/slate-plain-serializer/-/slate-plain-serializer-0.5.41.tgz", - "integrity": "sha512-KPC2T5PT29JN7uxpmpg/xIGO1YjNmpTfghkGsUKBx7HHYjGe5c9jEApolTvzNy3F3w+wGQNsiT+aN6dn9m6sFA==", - "requires": { - "slate-dev-logger": "0.1.43" - } + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/slate-plain-serializer/-/slate-plain-serializer-0.6.2.tgz", + "integrity": "sha512-zig2hZE5oTVJ4wM1/RoNBSYkQSNh2cliD4XxSo9X2kxKKtGcWfGMyINdShn5tARtbiUMSFrYLTjmqUsojQvEMA==" }, "slate-prop-types": { "version": "0.4.61", "resolved": "https://registry.npmjs.org/slate-prop-types/-/slate-prop-types-0.4.61.tgz", "integrity": "sha512-qhm4jbhQnVsxnizzXp6Hzb5d6zxFnAoYBnxKmE/tmv9QVkZs9ldur1YIROutTm418/9FpLe6bATrLhqeGHYalw==" }, - "slate-react": { - "version": "0.12.11", - "resolved": "https://registry.npmjs.org/slate-react/-/slate-react-0.12.11.tgz", - "integrity": "sha1-bYPmBGNHBHV2kKV9vWqrKCqWStM=", - "requires": { - "debug": "3.1.0", - "get-window": "1.1.2", - "is-window": "1.0.2", - "keycode": "2.2.0", - "lodash": "4.17.5", - "prop-types": "15.6.2", - "react-immutable-proptypes": "2.1.0", - "react-portal": "3.2.0", - "selection-is-backward": "1.0.0", - "slate-base64-serializer": "0.2.63", - "slate-dev-environment": "0.1.6", - "slate-dev-logger": "0.1.43", - "slate-hotkeys": "0.1.4", - "slate-plain-serializer": "0.5.41", - "slate-prop-types": "0.4.61" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - } - } - }, "slate-schema-violations": { "version": "0.1.39", "resolved": "https://registry.npmjs.org/slate-schema-violations/-/slate-schema-violations-0.1.39.tgz", "integrity": "sha512-SNRoV9Ii5UqjNqAKcIw7aAOMwgI45zsn86ue2n8NVLNOCe3fUI35cjq6l3fdvmRYw4X/GcZqzhpQsizHD3ts6A==" }, - "slate-trailing-block": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/slate-trailing-block/-/slate-trailing-block-0.5.0.tgz", - "integrity": "sha512-CrN+bBzo//CRwcVyIBaWSKyi7yiYjcc8wIKoiqpIbXDEUHEF++NCO8zr/j5PzelzqltTj9tg4n18d/f1/SLfLQ==" - }, "slice-ansi": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index 6c58f7096f..94b52e9f20 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -3,7 +3,7 @@ "version": "0.1.0", "private": true, "dependencies": { - "@seafile/seafile-editor": "^0.1.16", + "@seafile/seafile-editor": "^0.1.19", "autoprefixer": "7.1.6", "chalk": "1.1.3", "css-loader": "0.28.7", @@ -44,7 +44,7 @@ "remark-parse": "^5.0.0", "remark-rehype": "^3.0.0", "remark-slug": "^5.0.0", - "seafile-js": "^0.2.14", + "seafile-js": "^0.2.15", "seafile-ui": "^0.1.10", "sw-precache-webpack-plugin": "0.11.4", "unified": "^6.1.6", diff --git a/frontend/src/components/account.js b/frontend/src/components/account.js index 4959445526..cab85fc0b3 100644 --- a/frontend/src/components/account.js +++ b/frontend/src/components/account.js @@ -3,8 +3,7 @@ import ReactDOM from 'react-dom'; import { keyCodes, bytesToSize } from './utils'; import editorUtilities from '../utils/editor-utilties'; -const siteRoot = window.app.config.siteRoot; -const gettext = window.gettext; +import { siteRoot, gettext } from './constants'; class Account extends Component { constructor(props) { diff --git a/frontend/src/components/constance.js b/frontend/src/components/constants.js similarity index 92% rename from frontend/src/components/constance.js rename to frontend/src/components/constants.js index 5284c45fd6..88dc36b69a 100644 --- a/frontend/src/components/constance.js +++ b/frontend/src/components/constants.js @@ -16,6 +16,8 @@ export const slug = window.wiki ? window.wiki.config.slug : ''; export const repoID = window.wiki ? window.wiki.config.repoId : ''; export const serviceUrl = window.wiki ? window.wiki.config.serviceUrl : ''; export const initialFilePath = window.wiki ? window.wiki.config.initial_file_path : ''; +export const permission = window.wiki ? window.wiki.config.permission : ''; + // file history export const PER_PAGE = 25; diff --git a/frontend/src/components/files-activities.js b/frontend/src/components/files-activities.js index 0374c2fbcf..ab0fdca199 100644 --- a/frontend/src/components/files-activities.js +++ b/frontend/src/components/files-activities.js @@ -1,13 +1,13 @@ import React, { Component } from 'react'; +import { seafileAPI } from '../utils/seafile-api'; +import { gettext, siteRoot } from './constants'; -const gettext = window.gettext; -const siteRoot = window.app.config.siteRoot; const per_page = 25; // default class FileActivitiesContent extends Component { render() { - const {loading, error_msg, events} = this.props.data; + let {loading, error_msg, items, has_more} = this.props.data; if (loading) { return ; } else if (error_msg) { @@ -25,10 +25,10 @@ class FileActivitiesContent extends Component {
{events.error_msg}
: ''} + {has_more ? : ''} + {error_msg ?{error_msg}
: ''} ); } @@ -167,7 +167,10 @@ class FilesActivities extends Component { this.state = { loading: true, error_msg: '', - events: {} + events: {}, + items: [], + page: 1, + has_more: false }; this.handleScroll = this.handleScroll.bind(this); @@ -175,7 +178,7 @@ class FilesActivities extends Component { componentDidMount() { const pageNum = 1 - this.props.seafileAPI.listActivities(pageNum) + seafileAPI.listActivities(pageNum) .then(res => { // not logged in if (res.status == 403) { @@ -187,41 +190,42 @@ class FilesActivities extends Component { // {"events":[...]} this.setState({ loading: false, - events: { - page: 1, - items: res.data.events, - has_more: res.data.events.length == per_page ? true : false - } + items: res.data.events, + has_more: res.data.events.length == '0' ? false : true }); } }); } getMore() { - const pageNum = this.state.events.page + 1; - this.props.seafileAPI.getActivities(pageNum) - .then(res => { - this.setState(function(prevState, props) { - let events = prevState.events; - if (res.status == 403) { // log out - events.error_msg = gettext("Permission denied"); - events.has_more = false; + const pageNum = this.state.page + 1; + this.setState({ + page: pageNum + }) + seafileAPI.listActivities(pageNum) + .then(res => { + if (res.status == 403) { + this.setState({ + loading: false, + error_msg: gettext("Permission denied") + }); + } else { + // {"events":[...]} + this.setState({ + loading: false, + items: [...this.state.items, ...res.data.events], + has_more: res.data.events.length == '0' ? false : true + }); } - if (res.ok) { - events.page += 1; - events.items = events.items.concat(res.data.events); - events.has_more = res.data.events.length == per_page ? true : false; - } - return {events: events}; }); - }); } - handleScroll(e) { - let $el = e.target; - if (this.state.events.has_more && - $el.scrollTop > 0 && - $el.clientHeight + $el.scrollTop == $el.scrollHeight) { // scroll to the bottom + handleScroll(event) { + const clientHeight = event.target.clientHeight; + const scrollHeight = event.target.scrollHeight; + const scrollTop = event.target.scrollTop; + const isBottom = (clientHeight + scrollTop + 1 >= scrollHeight); + if (this.state.has_more && isBottom) { // scroll to the bottom this.getMore(); } } diff --git a/frontend/src/components/history-list-view/history-list-item.js b/frontend/src/components/history-list-view/history-list-item.js index cc2bafb796..78c54f1273 100644 --- a/frontend/src/components/history-list-view/history-list-item.js +++ b/frontend/src/components/history-list-view/history-list-item.js @@ -49,7 +49,8 @@ class HistoryListItem extends React.Component { render() { let item = this.props.item; - let time = moment(item.ctime).format('MMMDo Ah:mm'); + let offset = moment.parseZone(item.ctime).utcOffset(); + let time = moment(item.ctime).add(offset,'m').format('MMMDo Ah:mm'); let isHigtlightItem = false; if (this.props.item && this.props.currentItem) { isHigtlightItem = this.props.item.commit_id === this.props.currentItem.commit_id; diff --git a/frontend/src/components/history-list-view/history-list-menu.js b/frontend/src/components/history-list-view/history-list-menu.js index 02bebc11d7..bf80a983b3 100644 --- a/frontend/src/components/history-list-view/history-list-menu.js +++ b/frontend/src/components/history-list-view/history-list-menu.js @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { gettext, filePath } from '../constance'; +import { gettext, filePath } from '../constants'; import URLDecorator from '../../utils/url-decorator'; const propTypes = { diff --git a/frontend/src/components/list-view/list-item.js b/frontend/src/components/list-view/list-item.js index 1b856d7598..40f22fd2c3 100644 --- a/frontend/src/components/list-view/list-item.js +++ b/frontend/src/components/list-view/list-item.js @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { siteRoot, lang } from '../constance'; +import { siteRoot, lang } from '../constants'; import NodeMenuControl from '../menu-component/node-menu-control'; import moment from 'moment'; diff --git a/frontend/src/components/list-view/list-menu.js b/frontend/src/components/list-view/list-menu.js index 093d0b85ac..1246f80468 100644 --- a/frontend/src/components/list-view/list-menu.js +++ b/frontend/src/components/list-view/list-menu.js @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { gettext } from '../constance'; +import { gettext } from '../constants'; const propTypes = { isMenuShow: PropTypes.bool.isRequired, diff --git a/frontend/src/components/list-view/list-view.js b/frontend/src/components/list-view/list-view.js index a4e177916a..24a242ed0f 100644 --- a/frontend/src/components/list-view/list-view.js +++ b/frontend/src/components/list-view/list-view.js @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { gettext } from '../constance'; +import { gettext } from '../constants'; import ListItem from './list-item'; const propTypes = { diff --git a/frontend/src/components/main-side-nav.js b/frontend/src/components/main-side-nav.js index 3a8844e4a7..06b4d36ac9 100644 --- a/frontend/src/components/main-side-nav.js +++ b/frontend/src/components/main-side-nav.js @@ -1,6 +1,6 @@ import React from 'react'; -const siteRoot = window.app.config.siteRoot; -const serverRoot = window.app.config.serverRoot; +import { siteRoot } from './constants'; +import { seafileAPI } from '../utils/seafile-api'; class MainSideNav extends React.Component { constructor(props) { @@ -32,7 +32,7 @@ class MainSideNav extends React.Component { loadGroups = () => { let _this = this; - this.props.seafileAPI.listGroups().then(res =>{ + seafileAPI.listGroups().then(res =>{ let data = res.data.groups; this.groupsHeight = (data.length + 1) * _this.listHeight; _this.setState({ @@ -94,9 +94,9 @@ class MainSideNav extends React.Component {