1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-08-01 23:38:37 +00:00

Update tmp (#2373)

* fix file history time

* change activities url to dashboard

* remove serverRoot from dashboard

* fix api name

* Repair some components are not display

* fix code style

* rename file

* init seafileAPI

* update search

* update seafile-editor seafile-js

* debug rebase

* fix activities loading

* fix drafts css

* add permission
This commit is contained in:
C_Q 2018-09-18 10:11:37 +08:00 committed by Daniel Pan
parent 180f388af1
commit 3d165ec733
35 changed files with 236 additions and 276 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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 <span className="loading-icon loading-tip"></span>;
} else if (error_msg) {
@ -25,10 +25,10 @@ class FileActivitiesContent extends Component {
<th width="20%">{gettext("Time")}</th>
</tr>
</thead>
<TableBody items={events.items} />
<TableBody items={items} />
</table>
{events.has_more ? <span className="loading-icon loading-tip"></span> : ''}
{events.error_msg ? <p className="error text-center">{events.error_msg}</p> : ''}
{has_more ? <span className="loading-icon loading-tip"></span> : ''}
{error_msg ? <p className="error text-center">{error_msg}</p> : ''}
</React.Fragment>
);
}
@ -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();
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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 {
<div className="side-nav-con">
<h3 className="sf-heading">Files</h3>
<ul className="side-tabnav-tabs">
<li className="tab"><a href={siteRoot + '#my-libs'} className="ellipsis" title="My Libraries"><span className="sf2-icon-user" aria-hidden="true"></span>My Libraries</a></li>
<li className="tab"><a href={serverRoot + siteRoot + '#shared-libs/'} className="ellipsis" title="Shared with me"><span className="sf2-icon-share" aria-hidden="true"></span>Shared with me</a></li>
<li className="tab"><a href={serverRoot + siteRoot + '#org/'} className="ellipsis" title="Shared with all"><span className="sf2-icon-organization" aria-hidden="true"></span>Shared with all</a></li>
<li className="tab"><a href={ siteRoot + '#my-libs' } className="ellipsis" title="My Libraries"><span className="sf2-icon-user" aria-hidden="true"></span>My Libraries</a></li>
<li className="tab"><a href={ siteRoot + '#shared-libs/'} className="ellipsis" title="Shared with me"><span className="sf2-icon-share" aria-hidden="true"></span>Shared with me</a></li>
<li className="tab"><a href={ siteRoot + '#org/' } className="ellipsis" title="Shared with all"><span className="sf2-icon-organization" aria-hidden="true"></span>Shared with all</a></li>
<li className="tab" id="group-nav">
<a className="ellipsis user-select-no" title="Shared with groups" onClick={this.grpsExtend}><span className={`toggle-icon float-right fas ${this.state.groupsExtended ?'fa-caret-down':'icon-caret-left'}`} aria-hidden="true"></span><span className="sf2-icon-group" aria-hidden="true"></span>Shared with groups</a>
{this.renderSharedGroups()}

View File

@ -1,5 +1,5 @@
import React from 'react';
import { seafileAPI } from '../utils/seafile-api';
const gettext = window.gettext;
class Notification extends React.Component {
@ -21,12 +21,12 @@ class Notification extends React.Component {
}
if (this.state.showNotice) {
this.props.seafileAPI.updateNotifications()
seafileAPI.updateNotifications()
}
}
loadNotices = () => {
this.props.seafileAPI.listPopupNotices().then(res => {
seafileAPI.listPopupNotices().then(res => {
this.setState({
notice_html: res.data.notice_html
})

View File

@ -4,7 +4,7 @@ class SearchResultItem extends React.Component {
onClickHandler = () => {
var item = this.props.item;
this.props.onItemClickHandler(item.link);
this.props.onItemClickHandler(item);
}
render() {
@ -19,4 +19,4 @@ class SearchResultItem extends React.Component {
}
}
export default SearchResultItem;
export default SearchResultItem;

View File

@ -1,5 +1,5 @@
import React, { Component } from 'react';
import { gettext, repoID } from './constance';
import { gettext, repoID } from './constants';
import SearchResultItem from './search-result-item';
import editorUtilities from '../utils/editor-utilties';
@ -32,9 +32,9 @@ class Search extends Component {
this.resetToDefault();
}
onItemClickHandler = (path) => {
onItemClickHandler = (item) => {
this.resetToDefault();
this.props.onSearchedClick(path);
this.props.onSearchedClick(item);
}
onChangeHandler = (event) => {
@ -56,10 +56,10 @@ class Search extends Component {
let queryData = {
q: newValue,
search_repo: repoID,
search_ftypes: 'custom',
ftype: 'Markdown',
input_fexts: 'md'
search_repo: repoID ? repoID : 'all',
search_ftypes: repoID ? 'custom' : 'all',
ftype: repoID ? 'Markdown' : '',
input_fexts: repoID ? 'md' : ''
}
if (this.timer) {
@ -134,7 +134,8 @@ class Search extends Component {
items[i] = {};
items[i]['index'] = [i];
items[i]['name'] = data[i].name;
items[i]['link'] = data[i].fullpath;
items[i]['path'] = data[i].fullpath;
items[i]['repo_id'] = data[i].repo_id;
items[i]['link_content'] = decodeURI(data[i].fullpath).substring(1);
items[i]['content'] = data[i].content_highlight;
}

View File

@ -1,5 +1,5 @@
import React, { Component } from 'react';
import { serviceUrl } from '../constance';
import { serviceUrl } from '../constants';
class TreeDirList extends React.Component {
constructor(props) {
@ -30,4 +30,4 @@ class TreeDirList extends React.Component {
}
}
export default TreeDirList;
export default TreeDirList;

View File

@ -1,6 +1,6 @@
import React from 'react';
import MenuControl from '../menu-component/node-menu-control';
import { permission } from '../constance';
import { permission } from '../constants';
function sortByType(a, b) {
if (a.type == "dir" && b.type != "dir") {

View File

@ -24,4 +24,6 @@
.main-panel-center {
flex: 1;
display: flex;
flex-direction: column;
}

View File

@ -2,23 +2,18 @@ import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import SidePanel from './pages/dashboard/side-panel';
import MainPanel from './pages/dashboard/main-panel';
import Account from './components/account';
import Search from './components/search';
import Notification from './components/notification';
import { SeafileAPI } from 'seafile-js';
import cookie from 'react-cookies';
import { isPro, gettext, siteRoot } from './components/constants';
import 'seafile-ui';
import './assets/css/fa-solid.css';
import './assets/css/fa-regular.css';
import './assets/css/fontawesome.css';
import './css/dashboard.css';
import './css/search.css';
const siteRoot = window.app.config.siteRoot;
let seafileAPI = new SeafileAPI();
let xcsrfHeaders = cookie.load('sfcsrftoken');
seafileAPI.initForSeahubUsage({ siteRoot, xcsrfHeaders });
class DashBoard extends Component {
@ -34,14 +29,27 @@ class DashBoard extends Component {
isOpen: !this.state.isOpen,
})
}
onSearchedClick = (item) => {
let str = item.path.substr(item.path.length-1, 1);
if (str === '/'){
window.location.href= siteRoot + '#common/lib/' + item.repo_id + item.path;
} else {
window.location.href= siteRoot + 'lib/' + item.repo_id + '/file' + item.path;
}
}
render() {
return (
<div id="main">
<SidePanel isOpen={this.state.isOpen} toggleClose={this.isOpen} seafileAPI={seafileAPI}/>
<MainPanel isOpen={this.isOpen} seafileAPI={seafileAPI} >
<Notification seafileAPI={seafileAPI} />
<Account seafileAPI={seafileAPI}/>
<SidePanel isOpen={this.state.isOpen} toggleClose={this.isOpen} />
<MainPanel isOpen={this.isOpen}>
{isPro && <Search onSearchedClick={this.onSearchedClick}
placeholder={gettext("Search files")}
/>
}
<Notification />
<Account />
</MainPanel>
</div>
)

View File

@ -1,7 +1,7 @@
import React from 'react';
import ReactDOM from 'react-dom';
import editUtilties from './utils/editor-utilties';
import { filePath } from './components/constance';
import { filePath } from './components/constants';
import URLDecorator from './utils/url-decorator';
import { processor } from '@seafile/seafile-editor/src/lib/seafile-markdown2html';
import SidePanel from './pages/file-history/side-panel';

View File

@ -21,7 +21,7 @@ class MainPanel extends Component {
{children}
</div>
</div>
<FilesActivities seafileAPI={this.props.seafileAPI} />
<FilesActivities />
</div>
)
}

View File

@ -2,13 +2,7 @@ import React, { Component } from 'react';
import SideNavFooter from '../../components/side-nav-footer';
import MainSideNav from '../../components/main-side-nav';
const siteRoot = window.app.config.siteRoot;
const serverRoot = window.app.config.serverRoot;
const logoPath = window.app.config.logoPath;
const mediaUrl = window.app.config.mediaUrl;
const siteTitle = window.app.config.siteTitle;
const logoWidth = window.app.config.logoWidth;
const logoHeight = window.app.config.logoHeight;
import { siteRoot, logoPath, mediaUrl, siteTitle, logoWidth, logoHeight } from '../../components/constants';
class SidePanel extends Component {
@ -21,7 +15,7 @@ class SidePanel extends Component {
</a>
<a href="#" title="Close" aria-label="Close" onClick={this.props.toggleClose} className="sf2-icon-x1 sf-popover-close side-panel-close op-icon d-md-none "></a>
</div>
<MainSideNav seafileAPI={this.props.seafileAPI}/>
<MainSideNav />
<SideNavFooter />
</div>
)

View File

@ -1,6 +1,6 @@
import React from 'react';
import PropTypes from 'prop-types';
import { gettext } from '../../components/constance';
import { gettext } from '../../components/constants';
import Loading from '../../components/loading';
import Account from '../../components/account';
import { seafileAPI } from '../../utils/editor-utilties';

View File

@ -2,6 +2,8 @@ import React from 'react';
import PropTypes from 'prop-types';
import Prism from 'prismjs';
import Loading from '../../components/loading';
import Account from '../../components/account';
import Notification from '../../components/notification';
import '../../css/initial-style.css';
require('@seafile/seafile-editor/src/lib/code-hight-package');
@ -21,7 +23,10 @@ class MainPanel extends React.Component {
return (
<div className="main-panel viewer">
<div className="main-panel-north">
<div className="history-heading"></div>
<div className="history-heading">
<Notification />
<Account />
</div>
</div>
<div className="main-panel-center history-viewer-contanier">
<div className="content-viewer">

View File

@ -1,6 +1,6 @@
import React from 'react';
import PropTypes from 'prop-types';
import { gettext, PER_PAGE, filePath, fileName } from '../../components/constance';
import { gettext, PER_PAGE, filePath, fileName } from '../../components/constants';
import editUtilties from '../../utils/editor-utilties';
import Loading from '../../components/loading';
import HistoryListView from '../../components/history-list-view/history-list-view';

View File

@ -1,7 +1,8 @@
import React, { Component } from 'react';
import { gettext, repoID, serviceUrl, slug, siteRoot, isPro } from '../../components/constance';
import { gettext, repoID, serviceUrl, slug, siteRoot, isPro, permission } from '../../components/constants';
import Search from '../../components/search';
import Account from '../../components/account';
import Notification from '../../components/notification';
import MarkdownViewer from '../../components/markdown-viewer';
import TreeDirView from '../../components/tree-dir-view/tree-dir-view';
@ -51,7 +52,7 @@ class MainPanel extends Component {
<div className="main-panel-top panel-top">
<span className="sf2-icon-menu side-nav-toggle hidden-md-up d-md-none" title="Side Nav Menu" onClick={this.onMenuClick}></span>
<div className="wiki-page-ops">
{ this.props.permission === 'rw' &&
{ permission &&
<a className="btn btn-secondary btn-topbar" title="Edit File" onClick={this.onEditClick}>{gettext("Edit")}</a>
}
<a className="btn btn-secondary btn-topbar sf2-icon-list-view" id='list' title={gettext("List")} onClick={this.switchViewMode}></a>
@ -59,10 +60,11 @@ class MainPanel extends Component {
</div>
<div className="common-toolbar">
{isPro && <Search onSearchedClick={this.props.onSearchedClick}
placeholder={gettext("Search files in this wiki")}
placeholder={gettext("Search files in this library")}
/>
}
<Account />
<Notification />
<Account />
</div>
</div>
<div className="cur-view-main">

View File

@ -1,6 +1,6 @@
import React, { Component } from 'react';
import TreeView from '../../components/tree-view/tree-view';
import { siteRoot, logoPath, mediaUrl, siteTitle, logoWidth, logoHeight } from '../../components/constance';
import { siteRoot, logoPath, mediaUrl, siteTitle, logoWidth, logoHeight } from '../../components/constants';
import NodeMenu from '../../components/menu-component/node-menu';
import MenuControl from '../../components/menu-component/node-menu-control';
import Delete from '../../components/menu-component/menu-dialog/delete-dialog';

View File

@ -1,7 +1,8 @@
import React, { Component } from 'react';
import { gettext, repoID, serviceUrl, slug, siteRoot, isPro } from '../../components/constance';
import { gettext, repoID, serviceUrl, slug, siteRoot, isPro } from '../../components/constants';
import Search from '../../components/search';
import Account from '../../components/account';
import Notification from '../../components/notification';
import MarkdownViewer from '../../components/markdown-viewer';
import TreeDirView from '../../components/tree-dir-view/tree-dir-view';
@ -53,6 +54,7 @@ class MainPanel extends Component {
placeholder={gettext("Search files in this wiki")}
/>
}
<Notification />
<Account />
</div>
</div>

View File

@ -1,6 +1,6 @@
import React, { Component } from 'react';
import TreeView from '../../components/tree-view/tree-view';
import { siteRoot, logoPath, mediaUrl, siteTitle, logoWidth, logoHeight } from '../../components/constance';
import { siteRoot, logoPath, mediaUrl, siteTitle, logoWidth, logoHeight } from '../../components/constants';
import NodeMenu from '../../components/menu-component/node-menu';
import MenuControl from '../../components/menu-component/node-menu-control';
import Delete from '../../components/menu-component/menu-dialog/delete-dialog';

View File

@ -1,12 +1,12 @@
import React, { Component } from 'react';
import cookie from 'react-cookies';
import ReactDOM from 'react-dom';
import SidePanel from './pages/repo-wiki-mode/side-panel';
import MainPanel from './pages/repo-wiki-mode/main-panel';
import moment from 'moment';
import { slug, repoID, serviceUrl, initialFilePath } from './components/constance';
import { slug, repoID, serviceUrl, initialFilePath } from './components/constants';
import editorUtilities from './utils/editor-utilties';
import { seafileAPI } from './utils/editor-utilties';
import { seafileAPI } from './utils/seafile-api';
import cookie from 'react-cookies';
import Node from './components/tree-view/node'
import Tree from './components/tree-view/tree'
import 'seafile-ui';
@ -149,7 +149,8 @@ class Wiki extends Component {
}
}
onSearchedClick = (path) => {
onSearchedClick = (item) => {
let path = item.path;
if (this.state.currentFilePath !== path) {
this.initMainPanelData(path);

View File

@ -1,10 +1,5 @@
import { slug, repoID, siteRoot, historyRepoID } from '../components/constance';
import { SeafileAPI } from 'seafile-js';
import cookie from 'react-cookies';
let seafileAPI = new SeafileAPI();
let xcsrfHeaders = cookie.load('sfcsrftoken');
seafileAPI.initForSeahubUsage({ siteRoot, xcsrfHeaders });
import { slug, repoID, siteRoot, historyRepoID } from '../components/constants';
import { seafileAPI } from './seafile-api';
class EditorUtilities {
@ -114,4 +109,3 @@ class EditorUtilities {
const editorUtilities = new EditorUtilities();
export default editorUtilities;
export { seafileAPI };

View File

@ -0,0 +1,9 @@
import cookie from 'react-cookies';
import { SeafileAPI } from 'seafile-js';
import { siteRoot } from '../components/constants';
let seafileAPI = new SeafileAPI();
let xcsrfHeaders = cookie.load('sfcsrftoken');
seafileAPI.initForSeahubUsage({ siteRoot, xcsrfHeaders });
export { seafileAPI };

View File

@ -3,7 +3,7 @@ import ReactDOM from 'react-dom';
import SidePanel from './pages/wiki/side-panel';
import MainPanel from './pages/wiki/main-panel';
import moment from 'moment';
import { slug, repoID, serviceUrl, initialFilePath } from './components/constance';
import { slug, repoID, serviceUrl, initialFilePath } from './components/constants';
import editorUtilities from './utils/editor-utilties';
import Node from './components/tree-view/node'
import Tree from './components/tree-view/tree'
@ -112,7 +112,8 @@ class Wiki extends Component {
}
}
onSearchedClick = (path) => {
onSearchedClick = (item) => {
let path = item.path;
if (this.state.currentFilePath !== path) {
this.initMainPanelData(path);

View File

@ -40,7 +40,7 @@
<ul class="side-tabnav-tabs">
<li class="tab"><a href="{{ SITE_ROOT }}#starred/"><span class="sf2-icon-star" aria-hidden="true"></span>{% trans "Favorites" %}</a></li>
{% if events_enabled %}
<li class="tab"><a href="{{ SITE_ROOT }}#activities/"><span class="sf2-icon-clock" aria-hidden="true"></span>{% trans "Activities" %}</a></li>
<li class="tab"><a href="{{ SITE_ROOT }}dashboard/"><span class="sf2-icon-clock" aria-hidden="true"></span>{% trans "Activities" %}</a></li>
{% endif %}
{% for mod in request.user.mods_enabled %}
{% if mod == 'personal wiki' %}

View File

@ -1531,7 +1531,7 @@
</li>
{% if events_enabled %}
<li class="tab<% if (cur_tab == 'activities') { %> tab-cur<% } %>">
<a href="{{ SITE_ROOT }}#activities/"><span aria-hidden="true" class="sf2-icon-clock"></span>{% trans "Activities" %}</a>
<a href="{{ SITE_ROOT }}dashboard/"><span aria-hidden="true" class="sf2-icon-clock"></span>{% trans "Activities" %}</a>
</li>
{% endif %}