diff --git a/package-lock.json b/package-lock.json
index 2080b663..69d6155f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,35 +1,40 @@
{
- "name": "educoder",
- "version": "0.1.0",
+ "name": "forge",
+ "version": "3.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@ant-design/colors": {
"version": "3.2.2",
- "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-3.2.2.tgz",
- "integrity": "sha512-YKgNbG2dlzqMhA9NtI3/pbY16m3Yl/EeWBRa+lB1X1YaYxHrxNexiQYCLTWO/uDvAjLFMEDU+zR901waBtMtjQ==",
+ "resolved": "https://registry.npm.taobao.org/@ant-design/colors/download/@ant-design/colors-3.2.2.tgz?cache=0&sync_timestamp=1612935637470&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40ant-design%2Fcolors%2Fdownload%2F%40ant-design%2Fcolors-3.2.2.tgz",
+ "integrity": "sha1-WtQ9YZ6RHzSI66wwPWBuZqhCOQM=",
"requires": {
"tinycolor2": "^1.4.1"
}
},
"@ant-design/create-react-context": {
"version": "0.2.5",
- "resolved": "https://registry.npmjs.org/@ant-design/create-react-context/-/create-react-context-0.2.5.tgz",
- "integrity": "sha512-1rMAa4qgP2lfl/QBH9i78+Gjxtj9FTMpMyDGZsEBW5Kih72EuUo9958mV8PgpRkh4uwPSQ7vVZWXeyNZXVAFDg==",
+ "resolved": "https://registry.npm.taobao.org/@ant-design/create-react-context/download/@ant-design/create-react-context-0.2.5.tgz",
+ "integrity": "sha1-9fWpFjtHcgl3EoNzl60w4i55+Fg=",
"requires": {
"gud": "^1.0.0",
"warning": "^4.0.3"
}
},
+ "@ant-design/css-animation": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npm.taobao.org/@ant-design/css-animation/download/@ant-design/css-animation-1.7.3.tgz?cache=0&sync_timestamp=1596106749762&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40ant-design%2Fcss-animation%2Fdownload%2F%40ant-design%2Fcss-animation-1.7.3.tgz",
+ "integrity": "sha1-YKHJcAFOhrKPlAUQ1p5QPkKPETY="
+ },
"@ant-design/icons": {
"version": "2.1.1",
- "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-2.1.1.tgz",
- "integrity": "sha512-jCH+k2Vjlno4YWl6g535nHR09PwCEmTBKAG6VqF+rhkrSPRLfgpU2maagwbZPLjaHuU5Jd1DFQ2KJpQuI6uG8w=="
+ "resolved": "https://registry.npm.taobao.org/@ant-design/icons/download/@ant-design/icons-2.1.1.tgz",
+ "integrity": "sha1-e5wI3/1PXUHbZn2dvl4BB9C9mko="
},
"@ant-design/icons-react": {
"version": "2.0.1",
- "resolved": "https://registry.npmjs.org/@ant-design/icons-react/-/icons-react-2.0.1.tgz",
- "integrity": "sha512-r1QfoltMuruJZqdiKcbPim3d8LNsVPB733U0gZEUSxBLuqilwsW28K2rCTWSMTjmFX7Mfpf+v/wdiFe/XCqThw==",
+ "resolved": "https://registry.npm.taobao.org/@ant-design/icons-react/download/@ant-design/icons-react-2.0.1.tgz",
+ "integrity": "sha1-F6JRNXGrMXrKKSfljOol3THlNvs=",
"requires": {
"@ant-design/colors": "^3.1.0",
"babel-runtime": "^6.26.0"
@@ -446,8 +451,8 @@
},
"@types/react-slick": {
"version": "0.23.4",
- "resolved": "https://registry.npmjs.org/@types/react-slick/-/react-slick-0.23.4.tgz",
- "integrity": "sha512-vXoIy4GUfB7/YgqubR4H7RALo+pRdMYCeLgWwV3MPwl5pggTlEkFBTF19R7u+LJc85uMqC7RfsbkqPLMQ4ab+A==",
+ "resolved": "https://registry.npm.taobao.org/@types/react-slick/download/@types/react-slick-0.23.4.tgz",
+ "integrity": "sha1-yX4qnn49GTPGhZO46CdS+rHozlM=",
"requires": {
"@types/react": "*"
}
@@ -863,9 +868,9 @@
}
},
"antd": {
- "version": "3.26.16",
- "resolved": "https://registry.npmjs.org/antd/-/antd-3.26.16.tgz",
- "integrity": "sha512-EYRwlEf8FCPCVRk5yDcgjSZOC0exu+m75SwlSQU+Mh17f9wGhLeL2/DV7/Sra1r+BZlfiahFdkgrLY7UgMMBEQ==",
+ "version": "3.26.20",
+ "resolved": "https://registry.nlark.com/antd/download/antd-3.26.20.tgz",
+ "integrity": "sha1-8/Vw76qllQoUSULyHrKqqgiOlAc=",
"requires": {
"@ant-design/create-react-context": "^0.2.4",
"@ant-design/icons": "~2.1.1",
@@ -925,16 +930,16 @@
"dependencies": {
"raf": {
"version": "3.4.1",
- "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz",
- "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
+ "resolved": "https://registry.npm.taobao.org/raf/download/raf-3.4.1.tgz",
+ "integrity": "sha1-B0LpmkplUvRF1z4+4DKK8P8e3jk=",
"requires": {
"performance-now": "^2.1.0"
}
},
"rc-pagination": {
- "version": "1.20.14",
- "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-1.20.14.tgz",
- "integrity": "sha512-sNKwbFrxiqATqcIIShfrFs8BT03n4UUwTAMYae+JhHTmILQmXdvimEnZbVuWcno6G02DAJcLrFpmkn1h2tmEJw==",
+ "version": "1.20.15",
+ "resolved": "https://registry.npm.taobao.org/rc-pagination/download/rc-pagination-1.20.15.tgz",
+ "integrity": "sha1-zLTNDpvU5H9y8p6kMsA1C/ez2Ac=",
"requires": {
"babel-runtime": "6.x",
"classnames": "^2.2.6",
@@ -944,8 +949,8 @@
},
"rc-rate": {
"version": "2.5.1",
- "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.5.1.tgz",
- "integrity": "sha512-3iJkNJT8xlHklPCdeZtUZmJmRVUbr6AHRlfSsztfYTXVlHrv2TcPn3XkHsH+12j812WVB7gvilS2j3+ffjUHXg==",
+ "resolved": "https://registry.npm.taobao.org/rc-rate/download/rc-rate-2.5.1.tgz?cache=0&sync_timestamp=1605573559401&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frc-rate%2Fdownload%2Frc-rate-2.5.1.tgz",
+ "integrity": "sha1-Vfxf0j6p3MciULmoiYA0efSEKWE=",
"requires": {
"classnames": "^2.2.5",
"prop-types": "^15.5.8",
@@ -955,8 +960,8 @@
},
"rc-select": {
"version": "9.2.3",
- "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-9.2.3.tgz",
- "integrity": "sha512-WhswxOMWiNnkXRbxyrj0kiIvyCfo/BaRPaYbsDetSIAU2yEDwKHF798blCP5u86KLOBKBvtxWLFCkSsQw1so5w==",
+ "resolved": "https://registry.nlark.com/rc-select/download/rc-select-9.2.3.tgz?cache=0&sync_timestamp=1618886345948&other_urls=https%3A%2F%2Fregistry.nlark.com%2Frc-select%2Fdownload%2Frc-select-9.2.3.tgz",
+ "integrity": "sha1-ZDQOLW72TovDz8b0aP/ShiVYmsI=",
"requires": {
"babel-runtime": "^6.23.0",
"classnames": "2.x",
@@ -974,8 +979,8 @@
},
"rc-tree": {
"version": "2.1.4",
- "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-2.1.4.tgz",
- "integrity": "sha512-Xey794Iavgs8YldFlXcZLOhfcIhlX5Oz/yfKufknBXf2AlZCOkc7aHqSM9uTF7fBPtTGPhPxNEfOqHfY7b7xng==",
+ "resolved": "https://registry.npm.taobao.org/rc-tree/download/rc-tree-2.1.4.tgz?cache=0&sync_timestamp=1615350038621&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frc-tree%2Fdownload%2Frc-tree-2.1.4.tgz",
+ "integrity": "sha1-73WfPnmaIbQ8Hs+ceU6hwU5wtZs=",
"requires": {
"@ant-design/create-react-context": "^0.2.4",
"classnames": "2.x",
@@ -985,6 +990,18 @@
"react-lifecycles-compat": "^3.0.4",
"warning": "^4.0.3"
}
+ },
+ "react-slick": {
+ "version": "0.25.2",
+ "resolved": "https://registry.nlark.com/react-slick/download/react-slick-0.25.2.tgz",
+ "integrity": "sha1-VjMbZ9R9i8/i3OtqyrHI/VvR9rw=",
+ "requires": {
+ "classnames": "^2.2.5",
+ "enquire.js": "^2.1.6",
+ "json2mq": "^0.2.0",
+ "lodash.debounce": "^4.0.8",
+ "resize-observer-polyfill": "^1.5.0"
+ }
}
}
},
@@ -1083,8 +1100,8 @@
},
"array-tree-filter": {
"version": "2.1.0",
- "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz",
- "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw=="
+ "resolved": "https://registry.npm.taobao.org/array-tree-filter/download/array-tree-filter-2.1.0.tgz",
+ "integrity": "sha1-hzrAD+yDdJ8lWsjdCDgUtPYykZA="
},
"array-union": {
"version": "1.0.2",
@@ -1256,7 +1273,7 @@
},
"babel-cli": {
"version": "6.26.0",
- "resolved": "https://registry.npm.taobao.org/babel-cli/download/babel-cli-6.26.0.tgz",
+ "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz",
"integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=",
"dev": true,
"requires": {
@@ -1279,7 +1296,7 @@
"dependencies": {
"chokidar": {
"version": "1.7.0",
- "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-1.7.0.tgz?cache=0&sync_timestamp=1602585438968&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-1.7.0.tgz",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
"integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
"dev": true,
"optional": true,
@@ -1297,7 +1314,7 @@
},
"source-map": {
"version": "0.5.7",
- "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
"dev": true
}
@@ -1396,7 +1413,7 @@
},
"babel-helper-bindify-decorators": {
"version": "6.24.1",
- "resolved": "https://registry.npm.taobao.org/babel-helper-bindify-decorators/download/babel-helper-bindify-decorators-6.24.1.tgz",
+ "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz",
"integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=",
"dev": true,
"requires": {
@@ -1459,7 +1476,7 @@
},
"babel-helper-explode-class": {
"version": "6.24.1",
- "resolved": "https://registry.npm.taobao.org/babel-helper-explode-class/download/babel-helper-explode-class-6.24.1.tgz",
+ "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz",
"integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=",
"dev": true,
"requires": {
@@ -1659,7 +1676,7 @@
},
"babel-plugin-syntax-async-generators": {
"version": "6.13.0",
- "resolved": "https://registry.npm.taobao.org/babel-plugin-syntax-async-generators/download/babel-plugin-syntax-async-generators-6.13.0.tgz",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz",
"integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=",
"dev": true
},
@@ -1670,7 +1687,7 @@
},
"babel-plugin-syntax-decorators": {
"version": "6.13.0",
- "resolved": "https://registry.npm.taobao.org/babel-plugin-syntax-decorators/download/babel-plugin-syntax-decorators-6.13.0.tgz",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz",
"integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=",
"dev": true
},
@@ -1706,7 +1723,7 @@
},
"babel-plugin-transform-async-generator-functions": {
"version": "6.24.1",
- "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-async-generator-functions/download/babel-plugin-transform-async-generator-functions-6.24.1.tgz",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz",
"integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=",
"dev": true,
"requires": {
@@ -1738,7 +1755,7 @@
},
"babel-plugin-transform-decorators": {
"version": "6.24.1",
- "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-decorators/download/babel-plugin-transform-decorators-6.24.1.tgz",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz",
"integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=",
"dev": true,
"requires": {
@@ -2043,7 +2060,7 @@
},
"babel-plugin-transform-runtime": {
"version": "6.23.0",
- "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-runtime/download/babel-plugin-transform-runtime-6.23.0.tgz",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz",
"integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=",
"requires": {
"babel-runtime": "^6.22.0"
@@ -2060,9 +2077,8 @@
},
"babel-polyfill": {
"version": "6.26.0",
- "resolved": "https://registry.npm.taobao.org/babel-polyfill/download/babel-polyfill-6.26.0.tgz",
+ "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz",
"integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=",
- "dev": true,
"requires": {
"babel-runtime": "^6.26.0",
"core-js": "^2.5.0",
@@ -2071,9 +2087,8 @@
"dependencies": {
"regenerator-runtime": {
"version": "0.10.5",
- "resolved": "https://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.10.5.tgz?cache=0&sync_timestamp=1595456367497&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregenerator-runtime%2Fdownload%2Fregenerator-runtime-0.10.5.tgz",
- "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=",
- "dev": true
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
+ "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg="
}
}
},
@@ -2116,7 +2131,7 @@
},
"babel-preset-es2015": {
"version": "6.24.1",
- "resolved": "https://registry.npm.taobao.org/babel-preset-es2015/download/babel-preset-es2015-6.24.1.tgz",
+ "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz",
"integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=",
"dev": true,
"requires": {
@@ -2164,7 +2179,7 @@
},
"babel-preset-react": {
"version": "6.24.1",
- "resolved": "https://registry.npm.taobao.org/babel-preset-react/download/babel-preset-react-6.24.1.tgz",
+ "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz",
"integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=",
"requires": {
"babel-plugin-syntax-jsx": "^6.3.13",
@@ -2197,7 +2212,7 @@
},
"babel-preset-stage-2": {
"version": "6.24.1",
- "resolved": "https://registry.npm.taobao.org/babel-preset-stage-2/download/babel-preset-stage-2-6.24.1.tgz",
+ "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz",
"integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=",
"dev": true,
"requires": {
@@ -2209,7 +2224,7 @@
},
"babel-preset-stage-3": {
"version": "6.24.1",
- "resolved": "https://registry.npm.taobao.org/babel-preset-stage-3/download/babel-preset-stage-3-6.24.1.tgz",
+ "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz",
"integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=",
"dev": true,
"requires": {
@@ -2362,6 +2377,12 @@
}
}
},
+ "base16": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npm.taobao.org/base16/download/base16-1.0.0.tgz",
+ "integrity": "sha1-4pf2DX7BAUp6lxo568ipjAtoHnA=",
+ "dev": true
+ },
"base64-js": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
@@ -3486,7 +3507,7 @@
},
"code-prettify": {
"version": "0.1.0",
- "resolved": "https://registry.npm.taobao.org/code-prettify/download/code-prettify-0.1.0.tgz",
+ "resolved": "https://registry.npmjs.org/code-prettify/-/code-prettify-0.1.0.tgz",
"integrity": "sha1-RocMyMGlDQm61TmzOpg9vUqjSx4="
},
"codemirror": {
@@ -3760,8 +3781,8 @@
},
"copy-to-clipboard": {
"version": "3.3.1",
- "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz",
- "integrity": "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==",
+ "resolved": "https://registry.npm.taobao.org/copy-to-clipboard/download/copy-to-clipboard-3.3.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcopy-to-clipboard%2Fdownload%2Fcopy-to-clipboard-3.3.1.tgz",
+ "integrity": "sha1-EVqhqZmP+rYZb5MHatbaO5E2Yq4=",
"requires": {
"toggle-selection": "^1.0.6"
}
@@ -3854,6 +3875,23 @@
"warning": "^4.0.3"
}
},
+ "cross-fetch": {
+ "version": "3.1.4",
+ "resolved": "https://registry.nlark.com/cross-fetch/download/cross-fetch-3.1.4.tgz",
+ "integrity": "sha1-lyPzo6JHv4uJA586OAqSROj6Lzk=",
+ "dev": true,
+ "requires": {
+ "node-fetch": "2.6.1"
+ },
+ "dependencies": {
+ "node-fetch": {
+ "version": "2.6.1",
+ "resolved": "https://registry.nlark.com/node-fetch/download/node-fetch-2.6.1.tgz?cache=0&sync_timestamp=1626684741221&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fnode-fetch%2Fdownload%2Fnode-fetch-2.6.1.tgz",
+ "integrity": "sha1-BFvTI2Mfdu0uK1VXM5RBa2OaAFI=",
+ "dev": true
+ }
+ }
+ },
"cross-spawn": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
@@ -3888,11 +3926,6 @@
"randomfill": "^1.0.3"
}
},
- "crypto-js": {
- "version": "4.0.0",
- "resolved": "https://registry.npm.taobao.org/crypto-js/download/crypto-js-4.0.0.tgz",
- "integrity": "sha1-KQSrJnep0EKFai6i74DekuSjbcw="
- },
"crypto-random-string": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz",
@@ -5018,8 +5051,8 @@
},
"draft-js": {
"version": "0.10.5",
- "resolved": "https://registry.npmjs.org/draft-js/-/draft-js-0.10.5.tgz",
- "integrity": "sha512-LE6jSCV9nkPhfVX2ggcRLA4FKs6zWq9ceuO/88BpXdNCS7mjRTgs0NsV6piUCJX9YxMsB9An33wnkMmU2sD2Zg==",
+ "resolved": "https://registry.npm.taobao.org/draft-js/download/draft-js-0.10.5.tgz",
+ "integrity": "sha1-v6m+sBj+BTPbsI1mdcNxprCPp0I=",
"requires": {
"fbjs": "^0.8.15",
"immutable": "~3.7.4",
@@ -6204,6 +6237,41 @@
"bser": "2.1.1"
}
},
+ "fbemitter": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npm.taobao.org/fbemitter/download/fbemitter-3.0.0.tgz",
+ "integrity": "sha1-ALKhr1QRJUqrQWzXX55iib7kv/M=",
+ "dev": true,
+ "requires": {
+ "fbjs": "^3.0.0"
+ },
+ "dependencies": {
+ "fbjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npm.taobao.org/fbjs/download/fbjs-3.0.0.tgz?cache=0&sync_timestamp=1602048313843&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffbjs%2Fdownload%2Ffbjs-3.0.0.tgz",
+ "integrity": "sha1-CQcGf7P1enj0XZXx6s/8rNYjwWU=",
+ "dev": true,
+ "requires": {
+ "cross-fetch": "^3.0.4",
+ "fbjs-css-vars": "^1.0.0",
+ "loose-envify": "^1.0.0",
+ "object-assign": "^4.1.0",
+ "promise": "^7.1.1",
+ "setimmediate": "^1.0.5",
+ "ua-parser-js": "^0.7.18"
+ }
+ },
+ "promise": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npm.taobao.org/promise/download/promise-7.3.1.tgz",
+ "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=",
+ "dev": true,
+ "requires": {
+ "asap": "~2.0.3"
+ }
+ }
+ }
+ },
"fbjs": {
"version": "0.8.17",
"resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz",
@@ -6233,6 +6301,12 @@
}
}
},
+ "fbjs-css-vars": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npm.taobao.org/fbjs-css-vars/download/fbjs-css-vars-1.0.2.tgz",
+ "integrity": "sha1-IWVRE2rgL+JVkyw+yHdfGOLAeLg=",
+ "dev": true
+ },
"fecha": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz",
@@ -6677,6 +6751,42 @@
"readable-stream": "^2.3.6"
}
},
+ "flux": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npm.taobao.org/flux/download/flux-4.0.1.tgz",
+ "integrity": "sha1-eENQKwKEHUqqU0rws3MDSh917lw=",
+ "dev": true,
+ "requires": {
+ "fbemitter": "^3.0.0",
+ "fbjs": "^3.0.0"
+ },
+ "dependencies": {
+ "fbjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npm.taobao.org/fbjs/download/fbjs-3.0.0.tgz?cache=0&sync_timestamp=1602048313843&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffbjs%2Fdownload%2Ffbjs-3.0.0.tgz",
+ "integrity": "sha1-CQcGf7P1enj0XZXx6s/8rNYjwWU=",
+ "dev": true,
+ "requires": {
+ "cross-fetch": "^3.0.4",
+ "fbjs-css-vars": "^1.0.0",
+ "loose-envify": "^1.0.0",
+ "object-assign": "^4.1.0",
+ "promise": "^7.1.1",
+ "setimmediate": "^1.0.5",
+ "ua-parser-js": "^0.7.18"
+ }
+ },
+ "promise": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npm.taobao.org/promise/download/promise-7.3.1.tgz",
+ "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=",
+ "dev": true,
+ "requires": {
+ "asap": "~2.0.3"
+ }
+ }
+ }
+ },
"flv.js": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/flv.js/-/flv.js-1.5.0.tgz",
@@ -9185,9 +9295,9 @@
}
},
"is-mobile": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-2.2.1.tgz",
- "integrity": "sha512-6zELsfVFr326eq2CI53yvqq6YBanOxKBybwDT+MbMS2laBnK6Ez8m5XHSuTQQbnKRfpDzCod1CMWW5q3wZYMvA=="
+ "version": "2.2.2",
+ "resolved": "https://registry.nlark.com/is-mobile/download/is-mobile-2.2.2.tgz",
+ "integrity": "sha1-9snF1Q7gElTOBec5vdg18e1OmVQ="
},
"is-npm": {
"version": "1.0.0",
@@ -10320,6 +10430,12 @@
"resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz",
"integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU="
},
+ "lodash.curry": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npm.taobao.org/lodash.curry/download/lodash.curry-4.1.1.tgz",
+ "integrity": "sha1-JI42By7ekGUB11lmIAqG2riyMXA=",
+ "dev": true
+ },
"lodash.debounce": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
@@ -10330,6 +10446,12 @@
"resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
"integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw="
},
+ "lodash.flow": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npm.taobao.org/lodash.flow/download/lodash.flow-3.5.0.tgz",
+ "integrity": "sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o=",
+ "dev": true
+ },
"lodash.isequal": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
@@ -11419,8 +11541,8 @@
},
"omit.js": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/omit.js/-/omit.js-1.0.2.tgz",
- "integrity": "sha512-/QPc6G2NS+8d4L/cQhbk6Yit1WTB6Us2g84A7A/1+w9d/eRGHyEqC5kkQtHVoHZ5NFWGG7tUGgrhVZwgZanKrQ==",
+ "resolved": "https://registry.npm.taobao.org/omit.js/download/omit.js-1.0.2.tgz",
+ "integrity": "sha1-kaFPDrqEBm36AVvzDkdMR/MLyFg=",
"requires": {
"babel-runtime": "^6.23.0"
}
@@ -11551,7 +11673,7 @@
},
"output-file-sync": {
"version": "1.1.2",
- "resolved": "https://registry.npm.taobao.org/output-file-sync/download/output-file-sync-1.1.2.tgz",
+ "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz",
"integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=",
"dev": true,
"requires": {
@@ -13960,6 +14082,12 @@
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
},
+ "pure-color": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npm.taobao.org/pure-color/download/pure-color-1.3.0.tgz",
+ "integrity": "sha1-H+Bk+wrIUfDeYTIKi/eWg2Qi8z4=",
+ "dev": true
+ },
"purgecss": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/purgecss/-/purgecss-2.1.2.tgz",
@@ -14223,9 +14351,9 @@
}
},
"rc-calendar": {
- "version": "9.15.10",
- "resolved": "https://registry.npmjs.org/rc-calendar/-/rc-calendar-9.15.10.tgz",
- "integrity": "sha512-xh1A3rYejKskAvkjnd9BcHXFbBnAYsHMGHBdtoAkbwp43B6yEieNL0g0Tzz8s1gApDZV2j5vF1jJ9IIpPYFNLw==",
+ "version": "9.15.11",
+ "resolved": "https://registry.npm.taobao.org/rc-calendar/download/rc-calendar-9.15.11.tgz",
+ "integrity": "sha1-zh5eqOTXdDW+ZqjHfbEvHw+aNF8=",
"requires": {
"babel-runtime": "6.x",
"classnames": "2.x",
@@ -14238,8 +14366,8 @@
},
"rc-cascader": {
"version": "0.17.5",
- "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-0.17.5.tgz",
- "integrity": "sha512-WYMVcxU0+Lj+xLr4YYH0+yXODumvNXDcVEs5i7L1mtpWwYkubPV/zbQpn+jGKFCIW/hOhjkU4J1db8/P/UKE7A==",
+ "resolved": "https://registry.npm.taobao.org/rc-cascader/download/rc-cascader-0.17.5.tgz?cache=0&sync_timestamp=1610107054432&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frc-cascader%2Fdownload%2Frc-cascader-0.17.5.tgz",
+ "integrity": "sha1-T96R0jt2CMQgJjw47unAaH+A99w=",
"requires": {
"array-tree-filter": "^2.1.0",
"prop-types": "^15.5.8",
@@ -14252,8 +14380,8 @@
},
"rc-checkbox": {
"version": "2.1.8",
- "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-2.1.8.tgz",
- "integrity": "sha512-6qOgh0/by0nVNASx6LZnhRTy17Etcgav+IrI7kL9V9kcDZ/g7K14JFlqrtJ3NjDq/Kyn+BPI1st1XvbkhfaJeg==",
+ "resolved": "https://registry.npm.taobao.org/rc-checkbox/download/rc-checkbox-2.1.8.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frc-checkbox%2Fdownload%2Frc-checkbox-2.1.8.tgz",
+ "integrity": "sha1-7t2e+cLzr1s7jlzeUlSqia0aiAo=",
"requires": {
"babel-runtime": "^6.23.0",
"classnames": "2.x",
@@ -14263,8 +14391,8 @@
},
"rc-collapse": {
"version": "1.11.8",
- "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-1.11.8.tgz",
- "integrity": "sha512-8EhfPyScTYljkbRuIoHniSwZagD5UPpZ3CToYgoNYWC85L2qCbPYF7+OaC713FOrIkp6NbfNqXsITNxmDAmxog==",
+ "resolved": "https://registry.npm.taobao.org/rc-collapse/download/rc-collapse-1.11.8.tgz?cache=0&sync_timestamp=1606217065785&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frc-collapse%2Fdownload%2Frc-collapse-1.11.8.tgz",
+ "integrity": "sha1-ZqQAidRpUZ6UJACasckn4hQEHYA=",
"requires": {
"classnames": "2.x",
"css-animation": "1.x",
@@ -14277,8 +14405,8 @@
},
"rc-dialog": {
"version": "7.6.1",
- "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-7.6.1.tgz",
- "integrity": "sha512-KUKf+2eZ4YL+lnXMG3hR4ZtIhC9glfH27NtTVz3gcoDIPAf3uUvaXVRNoDCiSi+OGKLyIb/b6EoidFh6nQC5Wg==",
+ "resolved": "https://registry.npm.taobao.org/rc-dialog/download/rc-dialog-7.6.1.tgz?cache=0&sync_timestamp=1614949683544&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frc-dialog%2Fdownload%2Frc-dialog-7.6.1.tgz",
+ "integrity": "sha1-EVRczAuUWTT6dgeXJuDYU+UtcF8=",
"requires": {
"babel-runtime": "6.x",
"rc-animate": "2.x",
@@ -14287,8 +14415,8 @@
},
"rc-drawer": {
"version": "3.1.3",
- "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-3.1.3.tgz",
- "integrity": "sha512-2z+RdxmzXyZde/1OhVMfDR1e/GBswFeWSZ7FS3Fdd0qhgVdpV1wSzILzzxRaT481ItB5hOV+e8pZT07vdJE8kg==",
+ "resolved": "https://registry.npm.taobao.org/rc-drawer/download/rc-drawer-3.1.3.tgz?cache=0&sync_timestamp=1614159639291&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frc-drawer%2Fdownload%2Frc-drawer-3.1.3.tgz",
+ "integrity": "sha1-y8sE1MB/C2by7OEdhH9KG9gOoLc=",
"requires": {
"classnames": "^2.2.6",
"rc-util": "^4.16.1",
@@ -14297,8 +14425,8 @@
},
"rc-dropdown": {
"version": "2.4.1",
- "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-2.4.1.tgz",
- "integrity": "sha512-p0XYn0wrOpAZ2fUGE6YJ6U8JBNc5ASijznZ6dkojdaEfQJAeZtV9KMEewhxkVlxGSbbdXe10ptjBlTEW9vEwEg==",
+ "resolved": "https://registry.npm.taobao.org/rc-dropdown/download/rc-dropdown-2.4.1.tgz?cache=0&sync_timestamp=1600332782526&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frc-dropdown%2Fdownload%2Frc-dropdown-2.4.1.tgz",
+ "integrity": "sha1-qu9us6UVLN2ZgolcKnjZtfBGzew=",
"requires": {
"babel-runtime": "^6.26.0",
"classnames": "^2.2.6",
@@ -14309,8 +14437,8 @@
},
"rc-editor-core": {
"version": "0.8.10",
- "resolved": "https://registry.npmjs.org/rc-editor-core/-/rc-editor-core-0.8.10.tgz",
- "integrity": "sha512-T3aHpeMCIYA1sdAI7ynHHjXy5fqp83uPlD68ovZ0oClTSc3tbHmyCxXlA+Ti4YgmcpCYv7avF6a+TIbAka53kw==",
+ "resolved": "https://registry.npm.taobao.org/rc-editor-core/download/rc-editor-core-0.8.10.tgz",
+ "integrity": "sha1-byFbxd+cM/+p9sWzDKc6favoq3w=",
"requires": {
"babel-runtime": "^6.26.0",
"classnames": "^2.2.5",
@@ -14323,8 +14451,8 @@
},
"rc-editor-mention": {
"version": "1.1.13",
- "resolved": "https://registry.npmjs.org/rc-editor-mention/-/rc-editor-mention-1.1.13.tgz",
- "integrity": "sha512-3AOmGir91Fi2ogfRRaXLtqlNuIwQpvla7oUnGHS1+3eo7b+fUp5IlKcagqtwUBB5oDNofoySXkLBxzWvSYNp/Q==",
+ "resolved": "https://registry.npm.taobao.org/rc-editor-mention/download/rc-editor-mention-1.1.13.tgz",
+ "integrity": "sha1-nxyrEGX4awFSOEAyF5DCqxKsXos=",
"requires": {
"babel-runtime": "^6.23.0",
"classnames": "^2.2.5",
@@ -14352,9 +14480,9 @@
}
},
"rc-hammerjs": {
- "version": "0.6.9",
- "resolved": "https://registry.npmjs.org/rc-hammerjs/-/rc-hammerjs-0.6.9.tgz",
- "integrity": "sha512-4llgWO3RgLyVbEqUdGsDfzUDqklRlQW5VEhE3x35IvhV+w//VPRG34SBavK3D2mD/UaLKaohgU41V4agiftC8g==",
+ "version": "0.6.10",
+ "resolved": "https://registry.npm.taobao.org/rc-hammerjs/download/rc-hammerjs-0.6.10.tgz",
+ "integrity": "sha1-GDGjvY8hmXAL/MWtayCjVjCuteA=",
"requires": {
"babel-runtime": "6.x",
"hammerjs": "^2.0.8",
@@ -14362,9 +14490,9 @@
}
},
"rc-input-number": {
- "version": "4.5.6",
- "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-4.5.6.tgz",
- "integrity": "sha512-AXbL4gtQ1mSQnu6v/JtMv3UbGRCzLvQznmf0a7U/SAtZ8+dCEAqD4JpJhkjv73Wog53eRYhw4l7ApdXflc9ymg==",
+ "version": "4.5.9",
+ "resolved": "https://registry.nlark.com/rc-input-number/download/rc-input-number-4.5.9.tgz?cache=0&sync_timestamp=1619578110950&other_urls=https%3A%2F%2Fregistry.nlark.com%2Frc-input-number%2Fdownload%2Frc-input-number-4.5.9.tgz",
+ "integrity": "sha1-HL9zXiT+I8TrmkMBAxcguV8qPj0=",
"requires": {
"babel-runtime": "6.x",
"classnames": "^2.2.0",
@@ -14375,8 +14503,8 @@
},
"rc-mentions": {
"version": "0.4.2",
- "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-0.4.2.tgz",
- "integrity": "sha512-DTZurQzacLXOfVuiHydGzqkq7cFMHXF18l2jZ9PhWUn2cqvOSY3W4osN0Pq29AOMOBpcxdZCzgc7Lb0r/bgkDw==",
+ "resolved": "https://registry.npm.taobao.org/rc-mentions/download/rc-mentions-0.4.2.tgz?cache=0&sync_timestamp=1610510822768&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frc-mentions%2Fdownload%2Frc-mentions-0.4.2.tgz",
+ "integrity": "sha1-wYq3Ae+55LdbOFGgwNLdaYZA4kY=",
"requires": {
"@ant-design/create-react-context": "^0.2.4",
"classnames": "^2.2.6",
@@ -14404,8 +14532,8 @@
},
"rc-notification": {
"version": "3.3.1",
- "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-3.3.1.tgz",
- "integrity": "sha512-U5+f4BmBVfMSf3OHSLyRagsJ74yKwlrQAtbbL5ijoA0F2C60BufwnOcHG18tVprd7iaIjzZt1TKMmQSYSvgrig==",
+ "resolved": "https://registry.npm.taobao.org/rc-notification/download/rc-notification-3.3.1.tgz?cache=0&sync_timestamp=1614675471156&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frc-notification%2Fdownload%2Frc-notification-3.3.1.tgz",
+ "integrity": "sha1-C6o+cPjUCrAVzo+njCYMSQ/HvrQ=",
"requires": {
"babel-runtime": "6.x",
"classnames": "2.x",
@@ -14426,9 +14554,9 @@
}
},
"rc-progress": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-2.5.2.tgz",
- "integrity": "sha512-ajI+MJkbBz9zYDuE9GQsY5gsyqPF7HFioZEDZ9Fmc+ebNZoiSeSJsTJImPFCg0dW/5WiRGUy2F69SX1aPtSJgA==",
+ "version": "2.5.3",
+ "resolved": "https://registry.npm.taobao.org/rc-progress/download/rc-progress-2.5.3.tgz",
+ "integrity": "sha1-APAblb2+GFbTpfgiQgUZAui3qOc=",
"requires": {
"babel-runtime": "6.x",
"prop-types": "^15.5.8"
@@ -14445,8 +14573,8 @@
},
"rc-resize-observer": {
"version": "0.1.3",
- "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-0.1.3.tgz",
- "integrity": "sha512-uzOQEwx83xdQSFOkOAM7x7GHIQKYnrDV4dWxtCxyG1BS1pkfJ4EvDeMfsvAJHSYkQXVBu+sgRHGbRtLG3qiuUg==",
+ "resolved": "https://registry.npm.taobao.org/rc-resize-observer/download/rc-resize-observer-0.1.3.tgz?cache=0&sync_timestamp=1608864858155&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frc-resize-observer%2Fdownload%2Frc-resize-observer-0.1.3.tgz",
+ "integrity": "sha1-CXGR+cOrGG7ZB7VTum71Zd8Rwkk=",
"requires": {
"classnames": "^2.2.1",
"rc-util": "^4.13.0",
@@ -14474,8 +14602,8 @@
},
"rc-slider": {
"version": "8.7.1",
- "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-8.7.1.tgz",
- "integrity": "sha512-WMT5mRFUEcrLWwTxsyS8jYmlaMsTVCZIGENLikHsNv+tE8ThU2lCoPfi/xFNUfJFNFSBFP3MwPez9ZsJmNp13g==",
+ "resolved": "https://registry.npm.taobao.org/rc-slider/download/rc-slider-8.7.1.tgz?cache=0&sync_timestamp=1616675519253&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frc-slider%2Fdownload%2Frc-slider-8.7.1.tgz",
+ "integrity": "sha1-ntBzYtyTSJo45lSyG4EirXD9PEI=",
"requires": {
"babel-runtime": "6.x",
"classnames": "^2.2.5",
@@ -14489,8 +14617,8 @@
},
"rc-steps": {
"version": "3.5.0",
- "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-3.5.0.tgz",
- "integrity": "sha512-2Vkkrpa7PZbg7qPsqTNzVDov4u78cmxofjjnIHiGB9+9rqKS8oTLPzbW2uiWDr3Lk+yGwh8rbpGO1E6VAgBCOg==",
+ "resolved": "https://registry.npm.taobao.org/rc-steps/download/rc-steps-3.5.0.tgz",
+ "integrity": "sha1-NrKn8fSZB7DZA2OISxhiPK+ftgA=",
"requires": {
"babel-runtime": "^6.23.0",
"classnames": "^2.2.3",
@@ -14499,9 +14627,9 @@
}
},
"rc-switch": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-1.9.0.tgz",
- "integrity": "sha512-Isas+egaK6qSk64jaEw4GgPStY4umYDbT7ZY93bZF1Af+b/JEsKsJdNOU2qG3WI0Z6tXo2DDq0kJCv8Yhu0zww==",
+ "version": "1.9.2",
+ "resolved": "https://registry.npm.taobao.org/rc-switch/download/rc-switch-1.9.2.tgz?cache=0&sync_timestamp=1603791200779&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frc-switch%2Fdownload%2Frc-switch-1.9.2.tgz",
+ "integrity": "sha1-eSHHZkEf6aZCZRDDQpAi1rpN/eI=",
"requires": {
"classnames": "^2.2.1",
"prop-types": "^15.5.6",
@@ -14510,8 +14638,8 @@
},
"rc-table": {
"version": "6.10.15",
- "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-6.10.15.tgz",
- "integrity": "sha512-LAr0M/gqt+irOjvPNBLApmQ0CUHNOfKsEBhu1uIuB3OlN1ynA9z+sdoTQyNd9+8NSl0MYnQOOfhtLChAY7nU0A==",
+ "resolved": "https://registry.nlark.com/rc-table/download/rc-table-6.10.15.tgz",
+ "integrity": "sha1-GB9McMT9dPZX7o8jGW5+sIoDZco=",
"requires": {
"classnames": "^2.2.5",
"component-classes": "^1.2.6",
@@ -14525,8 +14653,8 @@
},
"rc-tabs": {
"version": "9.7.0",
- "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-9.7.0.tgz",
- "integrity": "sha512-kvmgp8/MfLzFZ06hWHignqomFQ5nF7BqKr5O1FfhE4VKsGrep52YSF/1MvS5oe0NPcI9XGNS2p751C5v6cYDpQ==",
+ "resolved": "https://registry.npm.taobao.org/rc-tabs/download/rc-tabs-9.7.0.tgz?cache=0&sync_timestamp=1608866453009&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frc-tabs%2Fdownload%2Frc-tabs-9.7.0.tgz",
+ "integrity": "sha1-rglpW+9ZY9bmTnvBBSHHbf3YRIs=",
"requires": {
"@ant-design/create-react-context": "^0.2.4",
"babel-runtime": "6.x",
@@ -14543,8 +14671,8 @@
"dependencies": {
"raf": {
"version": "3.4.1",
- "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz",
- "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
+ "resolved": "https://registry.npm.taobao.org/raf/download/raf-3.4.1.tgz",
+ "integrity": "sha1-B0LpmkplUvRF1z4+4DKK8P8e3jk=",
"requires": {
"performance-now": "^2.1.0"
}
@@ -14553,8 +14681,8 @@
},
"rc-time-picker": {
"version": "3.7.3",
- "resolved": "https://registry.npmjs.org/rc-time-picker/-/rc-time-picker-3.7.3.tgz",
- "integrity": "sha512-Lv1Mvzp9fRXhXEnRLO4nW6GLNxUkfAZ3RsiIBsWjGjXXvMNjdr4BX/ayElHAFK0DoJqOhm7c5tjmIYpEOwcUXg==",
+ "resolved": "https://registry.npm.taobao.org/rc-time-picker/download/rc-time-picker-3.7.3.tgz?cache=0&sync_timestamp=1576572941972&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frc-time-picker%2Fdownload%2Frc-time-picker-3.7.3.tgz",
+ "integrity": "sha1-ZajekECTJQrpyCsCpJBeD5leI+I=",
"requires": {
"classnames": "2.x",
"moment": "2.x",
@@ -14566,8 +14694,8 @@
"dependencies": {
"raf": {
"version": "3.4.1",
- "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz",
- "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
+ "resolved": "https://registry.npm.taobao.org/raf/download/raf-3.4.1.tgz",
+ "integrity": "sha1-B0LpmkplUvRF1z4+4DKK8P8e3jk=",
"requires": {
"performance-now": "^2.1.0"
}
@@ -14576,8 +14704,8 @@
},
"rc-tooltip": {
"version": "3.7.3",
- "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-3.7.3.tgz",
- "integrity": "sha512-dE2ibukxxkrde7wH9W8ozHKUO4aQnPZ6qBHtrTH9LoO836PjDdiaWO73fgPB05VfJs9FbZdmGPVEbXCeOP99Ww==",
+ "resolved": "https://registry.npm.taobao.org/rc-tooltip/download/rc-tooltip-3.7.3.tgz?cache=0&sync_timestamp=1614588684791&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frc-tooltip%2Fdownload%2Frc-tooltip-3.7.3.tgz",
+ "integrity": "sha1-KArsavyqROjf8EgPuv+eh/wArsw=",
"requires": {
"babel-runtime": "6.x",
"prop-types": "^15.5.8",
@@ -14625,8 +14753,8 @@
},
"rc-tree-select": {
"version": "2.9.4",
- "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-2.9.4.tgz",
- "integrity": "sha512-0HQkXAN4XbfBW20CZYh3G+V+VMrjX42XRtDCpyv6PDUm5vikC0Ob682ZBCVS97Ww2a5Hf6Ajmu0ahWEdIEpwhg==",
+ "resolved": "https://registry.nlark.com/rc-tree-select/download/rc-tree-select-2.9.4.tgz",
+ "integrity": "sha1-aqeU4fDmXGbEBqoKKg50/QpVewk=",
"requires": {
"classnames": "^2.2.1",
"dom-scroll-into-view": "^1.2.1",
@@ -14643,8 +14771,8 @@
"dependencies": {
"rc-tree": {
"version": "2.1.4",
- "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-2.1.4.tgz",
- "integrity": "sha512-Xey794Iavgs8YldFlXcZLOhfcIhlX5Oz/yfKufknBXf2AlZCOkc7aHqSM9uTF7fBPtTGPhPxNEfOqHfY7b7xng==",
+ "resolved": "https://registry.npm.taobao.org/rc-tree/download/rc-tree-2.1.4.tgz?cache=0&sync_timestamp=1615350038621&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frc-tree%2Fdownload%2Frc-tree-2.1.4.tgz",
+ "integrity": "sha1-73WfPnmaIbQ8Hs+ceU6hwU5wtZs=",
"requires": {
"@ant-design/create-react-context": "^0.2.4",
"classnames": "2.x",
@@ -14657,8 +14785,8 @@
},
"rc-trigger": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-3.0.0.tgz",
- "integrity": "sha512-hQxbbJpo23E2QnYczfq3Ec5J5tVl2mUDhkqxrEsQAqk16HfADQg+iKNWzEYXyERSncdxfnzYuaBgy764mNRzTA==",
+ "resolved": "https://registry.nlark.com/rc-trigger/download/rc-trigger-3.0.0.tgz?cache=0&sync_timestamp=1619590696046&other_urls=https%3A%2F%2Fregistry.nlark.com%2Frc-trigger%2Fdownload%2Frc-trigger-3.0.0.tgz",
+ "integrity": "sha1-9tmx2oomsrLR2RKgaHbBpIb1mA8=",
"requires": {
"babel-runtime": "6.x",
"classnames": "^2.2.6",
@@ -14670,18 +14798,14 @@
},
"dependencies": {
"rc-animate": {
- "version": "3.0.0-rc.6",
- "resolved": "https://registry.npmjs.org/rc-animate/-/rc-animate-3.0.0-rc.6.tgz",
- "integrity": "sha512-oBLPpiT6Q4t6YvD/pkLcmofBP1p01TX0Otse8Q4+Mxt8J+VSDflLZGIgf62EwkvRwsQUkLPjZVFBsldnPKLzjg==",
+ "version": "3.1.1",
+ "resolved": "https://registry.npm.taobao.org/rc-animate/download/rc-animate-3.1.1.tgz?cache=0&sync_timestamp=1601018005635&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frc-animate%2Fdownload%2Frc-animate-3.1.1.tgz",
+ "integrity": "sha1-3v3YY/VoFsIiU05Nxo/t3s0IE4Y=",
"requires": {
- "babel-runtime": "6.x",
- "classnames": "^2.2.5",
- "component-classes": "^1.2.6",
- "fbjs": "^0.8.16",
- "prop-types": "15.x",
+ "@ant-design/css-animation": "^1.7.2",
+ "classnames": "^2.2.6",
"raf": "^3.4.0",
- "rc-util": "^4.5.0",
- "react-lifecycles-compat": "^3.0.4"
+ "rc-util": "^4.15.3"
}
}
}
@@ -14735,6 +14859,18 @@
"prop-types": "^15.6.2"
}
},
+ "react-base16-styling": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npm.taobao.org/react-base16-styling/download/react-base16-styling-0.6.0.tgz",
+ "integrity": "sha1-7yFW1mz0E5aVyKFniGy2nqZgeSw=",
+ "dev": true,
+ "requires": {
+ "base16": "^1.0.0",
+ "lodash.curry": "^4.0.1",
+ "lodash.flow": "^3.3.0",
+ "pure-color": "^1.2.0"
+ }
+ },
"react-beautiful-dnd": {
"version": "10.1.1",
"resolved": "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-10.1.1.tgz",
@@ -15100,6 +15236,18 @@
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
},
+ "react-json-view": {
+ "version": "1.21.3",
+ "resolved": "https://registry.npm.taobao.org/react-json-view/download/react-json-view-1.21.3.tgz",
+ "integrity": "sha1-8YQgnujxvzdPsMQbCBPP9UVJxHU=",
+ "dev": true,
+ "requires": {
+ "flux": "^4.0.1",
+ "react-base16-styling": "^0.6.0",
+ "react-lifecycles-compat": "^3.0.4",
+ "react-textarea-autosize": "^8.3.2"
+ }
+ },
"react-jss": {
"version": "8.6.1",
"resolved": "https://registry.npmjs.org/react-jss/-/react-jss-8.6.1.tgz",
@@ -15120,9 +15268,9 @@
}
},
"react-lazy-load": {
- "version": "3.0.13",
- "resolved": "https://registry.npmjs.org/react-lazy-load/-/react-lazy-load-3.0.13.tgz",
- "integrity": "sha1-OwqS0zbUPT8Nc8vm81sXBQsIuCQ=",
+ "version": "3.1.13",
+ "resolved": "https://registry.npm.taobao.org/react-lazy-load/download/react-lazy-load-3.1.13.tgz?cache=0&sync_timestamp=1593654792284&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freact-lazy-load%2Fdownload%2Freact-lazy-load-3.1.13.tgz",
+ "integrity": "sha1-I2lD92twhMyEWHFtljKhyYU+pc0=",
"requires": {
"eventlistener": "0.0.1",
"lodash.debounce": "^4.0.0",
@@ -15259,9 +15407,9 @@
}
},
"react-slick": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/react-slick/-/react-slick-0.25.2.tgz",
- "integrity": "sha512-8MNH/NFX/R7zF6W/w+FS5VXNyDusF+XDW1OU0SzODEU7wqYB+ZTGAiNJ++zVNAVqCAHdyCybScaUB+FCZOmBBw==",
+ "version": "0.28.1",
+ "resolved": "https://registry.nlark.com/react-slick/download/react-slick-0.28.1.tgz",
+ "integrity": "sha1-EsGNmRtZQy35w3V7pUCiJ7P7hbk=",
"requires": {
"classnames": "^2.2.5",
"enquire.js": "^2.1.6",
@@ -15288,6 +15436,34 @@
"prop-types": "^15.5.4"
}
},
+ "react-textarea-autosize": {
+ "version": "8.3.3",
+ "resolved": "https://registry.nlark.com/react-textarea-autosize/download/react-textarea-autosize-8.3.3.tgz?cache=0&sync_timestamp=1622628433420&other_urls=https%3A%2F%2Fregistry.nlark.com%2Freact-textarea-autosize%2Fdownload%2Freact-textarea-autosize-8.3.3.tgz",
+ "integrity": "sha1-9wkTlFNp2kU/1VTBaPa6rNH6BNg=",
+ "dev": true,
+ "requires": {
+ "@babel/runtime": "^7.10.2",
+ "use-composed-ref": "^1.0.0",
+ "use-latest": "^1.0.0"
+ },
+ "dependencies": {
+ "@babel/runtime": {
+ "version": "7.14.8",
+ "resolved": "https://registry.nlark.com/@babel/runtime/download/@babel/runtime-7.14.8.tgz",
+ "integrity": "sha1-cRmlb0IQGIUmlCkLn5FICXORtEY=",
+ "dev": true,
+ "requires": {
+ "regenerator-runtime": "^0.13.4"
+ }
+ },
+ "regenerator-runtime": {
+ "version": "0.13.9",
+ "resolved": "https://registry.nlark.com/regenerator-runtime/download/regenerator-runtime-0.13.9.tgz?cache=0&sync_timestamp=1626993001371&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fregenerator-runtime%2Fdownload%2Fregenerator-runtime-0.13.9.tgz",
+ "integrity": "sha1-iSV0Kpj/2QgUmI11Zq0wyjsmO1I=",
+ "dev": true
+ }
+ }
+ },
"react-transition-group": {
"version": "2.9.0",
"resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz",
@@ -16105,8 +16281,8 @@
},
"rmc-feedback": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/rmc-feedback/-/rmc-feedback-2.0.0.tgz",
- "integrity": "sha512-5PWOGOW7VXks/l3JzlOU9NIxRpuaSS8d9zA3UULUCuTKnpwBHNvv1jSJzxgbbCQeYzROWUpgKI4za3X4C/mKmQ==",
+ "resolved": "https://registry.npm.taobao.org/rmc-feedback/download/rmc-feedback-2.0.0.tgz",
+ "integrity": "sha1-y8bLOuY8emNe7w4l5PuvWsNm7qo=",
"requires": {
"babel-runtime": "6.x",
"classnames": "^2.2.5"
@@ -16689,8 +16865,8 @@
},
"shallow-equal": {
"version": "1.2.1",
- "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz",
- "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA=="
+ "resolved": "https://registry.npm.taobao.org/shallow-equal/download/shallow-equal-1.2.1.tgz",
+ "integrity": "sha1-TBar+lYEOqINBQMk76aJQLDaedo="
},
"shallowequal": {
"version": "1.1.0",
@@ -17044,6 +17220,11 @@
"is-fullwidth-code-point": "^2.0.0"
}
},
+ "slick-carousel": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npm.taobao.org/slick-carousel/download/slick-carousel-1.8.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fslick-carousel%2Fdownload%2Fslick-carousel-1.8.1.tgz",
+ "integrity": "sha1-pL+ykBSIe7Zs5Si5C9DNomLMj40="
+ },
"snapdragon": {
"version": "0.8.2",
"resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
@@ -18378,6 +18559,12 @@
"integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==",
"dev": true
},
+ "ts-essentials": {
+ "version": "2.0.12",
+ "resolved": "https://registry.nlark.com/ts-essentials/download/ts-essentials-2.0.12.tgz",
+ "integrity": "sha1-yTA/PXT3X6dSjD1JuA4ImrCdh0U=",
+ "dev": true
+ },
"tslib": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz",
@@ -18887,9 +19074,33 @@
"resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
"integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ=="
},
+ "use-composed-ref": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npm.taobao.org/use-composed-ref/download/use-composed-ref-1.1.0.tgz",
+ "integrity": "sha1-kiDk6UqXt7AtfSfq6rCzcDRDi7w=",
+ "dev": true,
+ "requires": {
+ "ts-essentials": "^2.0.3"
+ }
+ },
+ "use-isomorphic-layout-effect": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npm.taobao.org/use-isomorphic-layout-effect/download/use-isomorphic-layout-effect-1.1.1.tgz",
+ "integrity": "sha1-e7ZYkXDNKYehUgQvkIT57/t1wiU=",
+ "dev": true
+ },
+ "use-latest": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npm.taobao.org/use-latest/download/use-latest-1.2.0.tgz",
+ "integrity": "sha1-pE9lcrgojgly7EEb3QhAraNm8jI=",
+ "dev": true,
+ "requires": {
+ "use-isomorphic-layout-effect": "^1.0.0"
+ }
+ },
"user-home": {
"version": "1.1.1",
- "resolved": "https://registry.npm.taobao.org/user-home/download/user-home-1.1.1.tgz",
+ "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz",
"integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=",
"dev": true
},
@@ -18946,7 +19157,7 @@
},
"v8flags": {
"version": "2.1.1",
- "resolved": "https://registry.npm.taobao.org/v8flags/download/v8flags-2.1.1.tgz?cache=0&sync_timestamp=1590964281452&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fv8flags%2Fdownload%2Fv8flags-2.1.1.tgz",
+ "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz",
"integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=",
"dev": true,
"requires": {
@@ -20490,6 +20701,16 @@
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
"dev": true
},
+ "xterm": {
+ "version": "4.8.1",
+ "resolved": "https://registry.npm.taobao.org/xterm/download/xterm-4.8.1.tgz",
+ "integrity": "sha1-FVoXKaQ+Gom0BlJOIsVjQznjnKE="
+ },
+ "xterm-addon-fit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npm.taobao.org/xterm-addon-fit/download/xterm-addon-fit-0.4.0.tgz",
+ "integrity": "sha1-BuDF0KaqrPsAnvVl76HIHpPZAZM="
+ },
"y18n": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
diff --git a/public/css/iconfont.css b/public/css/iconfont.css
index 32cb789a..57f748d6 100644
--- a/public/css/iconfont.css
+++ b/public/css/iconfont.css
@@ -1,8 +1,8 @@
@font-face {
font-family: "iconfont"; /* Project id 2340181 */
- src: url('iconfont.woff2?t=1625800786751') format('woff2'),
- url('iconfont.woff?t=1625800786751') format('woff'),
- url('iconfont.ttf?t=1625800786751') format('truetype');
+ src: url('iconfont.woff2?t=1630045103946') format('woff2'),
+ url('iconfont.woff?t=1630045103946') format('woff'),
+ url('iconfont.ttf?t=1630045103946') format('truetype');
}
.iconfont {
@@ -13,6 +13,334 @@
-moz-osx-font-smoothing: grayscale;
}
+.icon-xinshouzhiyin:before {
+ content: "\e8e4";
+}
+
+.icon-xinjianxiangmu:before {
+ content: "\e8e6";
+}
+
+.icon-jiaruketang1:before {
+ content: "\e8e9";
+}
+
+.icon-xiangmugonggao:before {
+ content: "\e8c2";
+}
+
+.icon-chengguo:before {
+ content: "\e8c3";
+}
+
+.icon-chengjiaogonggao:before {
+ content: "\e8c0";
+}
+
+.icon-jishuzichan:before {
+ content: "\e8c1";
+}
+
+.icon-feibiaogonggao:before {
+ content: "\e8bc";
+}
+
+.icon-zhongbiaogonggao:before {
+ content: "\e8bd";
+}
+
+.icon-gengzhenggonggao:before {
+ content: "\e8be";
+}
+
+.icon-zhaobiaogonggao:before {
+ content: "\e8bf";
+}
+
+.icon-wenjian6:before {
+ content: "\e8ba";
+}
+
+.icon-wenjianjia4:before {
+ content: "\e8bb";
+}
+
+.icon-quxiaoguanzhu:before {
+ content: "\e89a";
+}
+
+.icon-dianzan_icon:before {
+ content: "\e8a2";
+}
+
+.icon-wenjian5:before {
+ content: "\e896";
+}
+
+.icon-wenjianjia3:before {
+ content: "\e8a9";
+}
+
+.icon-fuzhiicon:before {
+ content: "\e886";
+}
+
+.icon-zhuye-fill:before {
+ content: "\e876";
+}
+
+.icon-daimakuicon:before {
+ content: "\e884";
+}
+
+.icon-xinjian2:before {
+ content: "\e8b0";
+}
+
+.icon-xieyiicon:before {
+ content: "\e870";
+}
+
+.icon-neicunicon:before {
+ content: "\e891";
+}
+
+.icon-zishuwenjian_icon:before {
+ content: "\e8a6";
+}
+
+.icon-biaoqianicon:before {
+ content: "\e882";
+}
+
+.icon-a-bianji:before {
+ content: "\e883";
+}
+
+.icon-cangkushezhiicon:before {
+ content: "\e885";
+}
+
+.icon-lianjieicon:before {
+ content: "\e887";
+}
+
+.icon-hebingqingqiuicon:before {
+ content: "\e888";
+}
+
+.icon-lichengbeiicon:before {
+ content: "\e889";
+}
+
+.icon-gongzuoliuicon:before {
+ content: "\e88a";
+}
+
+.icon-dongtaiicon:before {
+ content: "\e88b";
+}
+
+.icon-morendianzan_icon:before {
+ content: "\e88e";
+}
+
+.icon-muluicon:before {
+ content: "\e894";
+}
+
+.icon-a-shezhi:before {
+ content: "\e899";
+}
+
+.icon-tijiaoicon:before {
+ content: "\e89e";
+}
+
+.icon-morenguanzhu_ICON:before {
+ content: "\e89f";
+}
+
+.icon-xialaanniu1:before {
+ content: "\e8a4";
+}
+
+.icon-zuohuaicon:before {
+ content: "\e8b5";
+}
+
+.icon-master_icon:before {
+ content: "\e8b6";
+}
+
+.icon-morenfuke_icon:before {
+ content: "\e8b7";
+}
+
+.icon-a-wikiicon:before {
+ content: "\e8b8";
+}
+
+.icon-yixiuicon:before {
+ content: "\e8b9";
+}
+
+.icon-suofang:before {
+ content: "\e87f";
+}
+
+.icon-fangdaicon:before {
+ content: "\e881";
+}
+
+.icon-sousuo_icon1:before {
+ content: "\e873";
+}
+
+.icon-huanying_icon:before {
+ content: "\e878";
+}
+
+.icon-wenjianjia2:before {
+ content: "\e879";
+}
+
+.icon-shanchuicon1:before {
+ content: "\e87a";
+}
+
+.icon-qingqiuicon:before {
+ content: "\e871";
+}
+
+.icon-xiangyingicon:before {
+ content: "\e87c";
+}
+
+.icon-duoxuanxuanzhong:before {
+ content: "\e88f";
+}
+
+.icon-cuowuicon:before {
+ content: "\e890";
+}
+
+.icon-chenggongicon:before {
+ content: "\e892";
+}
+
+.icon-weixuanzhongxiangyingicon:before {
+ content: "\e893";
+}
+
+.icon-bitianicon:before {
+ content: "\e895";
+}
+
+.icon-weixuanzhongxiangmubiaoqianicon:before {
+ content: "\e897";
+}
+
+.icon-liebiaoicon:before {
+ content: "\e898";
+}
+
+.icon-weixuanzhongqingqiuicon:before {
+ content: "\e89b";
+}
+
+.icon-xiezuozheguanliicon:before {
+ content: "\e8a1";
+}
+
+.icon-xuanzhongfenzhiicon:before {
+ content: "\e8a3";
+}
+
+.icon-xuanzhongjibenshezhiicon:before {
+ content: "\e8a5";
+}
+
+.icon-xuanzhongxiangmubiaoqianicon:before {
+ content: "\e8aa";
+}
+
+.icon-a-xuanzhongwebhookicon:before {
+ content: "\e8af";
+}
+
+.icon-shanchu_tc_icon:before {
+ content: "\e88c";
+}
+
+.icon-wiki_icon:before {
+ content: "\e88d";
+}
+
+.icon-daorumoban_icon:before {
+ content: "\e86f";
+}
+
+.icon-cuowu:before {
+ content: "\e872";
+}
+
+.icon-gengduo_icon:before {
+ content: "\e874";
+}
+
+.icon-fucengguanbi_icon:before {
+ content: "\e875";
+}
+
+.icon-shanchuicon:before {
+ content: "\e877";
+}
+
+.icon-sousuo_shanchuicon:before {
+ content: "\e87b";
+}
+
+.icon-sousuo_icon:before {
+ content: "\e87d";
+}
+
+.icon-wendangyulan_icon:before {
+ content: "\e87e";
+}
+
+.icon-xialaanniu:before {
+ content: "\e880";
+}
+
+.icon-erciqueren_icon:before {
+ content: "\e867";
+}
+
+.icon-xuanzhongssh_icon:before {
+ content: "\e868";
+}
+
+.icon-weixuanzhonganquanshezhi_icon:before {
+ content: "\e869";
+}
+
+.icon-weixuanzhongssh_icon:before {
+ content: "\e86a";
+}
+
+.icon-xuanzhonganquanshezhi_icon:before {
+ content: "\e86b";
+}
+
+.icon-shanchu_icon:before {
+ content: "\e86c";
+}
+
+.icon-liebiaossh_icon:before {
+ content: "\e86e";
+}
+
.icon-file-submodule:before {
content: "\e866";
}
diff --git a/public/css/iconfont.js b/public/css/iconfont.js
index c4fb710f..495187e3 100644
--- a/public/css/iconfont.js
+++ b/public/css/iconfont.js
@@ -1 +1 @@
-!function(c){var l,a,h,i,o,z,t='',p=(p=document.getElementsByTagName("script"))[p.length-1].getAttribute("data-injectcss");if(p&&!c.__iconfont__svg__cssinject__){c.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(c){console&&console.log(c)}}function v(){o||(o=!0,h())}l=function(){var c,l,a;(a=document.createElement("div")).innerHTML=t,t=null,(l=a.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",c=l,(a=document.body).firstChild?(l=a.firstChild).parentNode.insertBefore(c,l):a.appendChild(c))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(l,0):(a=function(){document.removeEventListener("DOMContentLoaded",a,!1),l()},document.addEventListener("DOMContentLoaded",a,!1)):document.attachEvent&&(h=l,i=c.document,o=!1,(z=function(){try{i.documentElement.doScroll("left")}catch(c){return void setTimeout(z,50)}v()})(),i.onreadystatechange=function(){"complete"==i.readyState&&(i.onreadystatechange=null,v())})}(window);
\ No newline at end of file
+!function(c){var l,a,h,i,o,z='',t=(t=document.getElementsByTagName("script"))[t.length-1].getAttribute("data-injectcss"),p=function(c,l){l.parentNode.insertBefore(c,l)};if(t&&!c.__iconfont__svg__cssinject__){c.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(c){console&&console.log(c)}}function v(){o||(o=!0,h())}function m(){try{i.documentElement.doScroll("left")}catch(c){return void setTimeout(m,50)}v()}l=function(){var c,l;(l=document.createElement("div")).innerHTML=z,z=null,(c=l.getElementsByTagName("svg")[0])&&(c.setAttribute("aria-hidden","true"),c.style.position="absolute",c.style.width=0,c.style.height=0,c.style.overflow="hidden",l=c,(c=document.body).firstChild?p(l,c.firstChild):c.appendChild(l))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(l,0):(a=function(){document.removeEventListener("DOMContentLoaded",a,!1),l()},document.addEventListener("DOMContentLoaded",a,!1)):document.attachEvent&&(h=l,i=c.document,o=!1,m(),i.onreadystatechange=function(){"complete"==i.readyState&&(i.onreadystatechange=null,v())})}(window);
\ No newline at end of file
diff --git a/public/css/iconfont.json b/public/css/iconfont.json
index 43c5fbfb..c15274fb 100644
--- a/public/css/iconfont.json
+++ b/public/css/iconfont.json
@@ -5,6 +5,580 @@
"css_prefix_text": "icon-",
"description": "",
"glyphs": [
+ {
+ "icon_id": "23655968",
+ "name": "新手指引",
+ "font_class": "xinshouzhiyin",
+ "unicode": "e8e4",
+ "unicode_decimal": 59620
+ },
+ {
+ "icon_id": "23655969",
+ "name": "新建项目",
+ "font_class": "xinjianxiangmu",
+ "unicode": "e8e6",
+ "unicode_decimal": 59622
+ },
+ {
+ "icon_id": "23658111",
+ "name": "加入课堂",
+ "font_class": "jiaruketang1",
+ "unicode": "e8e9",
+ "unicode_decimal": 59625
+ },
+ {
+ "icon_id": "23791639",
+ "name": "项目公告",
+ "font_class": "xiangmugonggao",
+ "unicode": "e8c2",
+ "unicode_decimal": 59586
+ },
+ {
+ "icon_id": "23791640",
+ "name": "成果",
+ "font_class": "chengguo",
+ "unicode": "e8c3",
+ "unicode_decimal": 59587
+ },
+ {
+ "icon_id": "23791410",
+ "name": "成交公告",
+ "font_class": "chengjiaogonggao",
+ "unicode": "e8c0",
+ "unicode_decimal": 59584
+ },
+ {
+ "icon_id": "23791411",
+ "name": "技术资产",
+ "font_class": "jishuzichan",
+ "unicode": "e8c1",
+ "unicode_decimal": 59585
+ },
+ {
+ "icon_id": "23790928",
+ "name": "废标公告",
+ "font_class": "feibiaogonggao",
+ "unicode": "e8bc",
+ "unicode_decimal": 59580
+ },
+ {
+ "icon_id": "23790929",
+ "name": "中标公告",
+ "font_class": "zhongbiaogonggao",
+ "unicode": "e8bd",
+ "unicode_decimal": 59581
+ },
+ {
+ "icon_id": "23790930",
+ "name": "更正公告",
+ "font_class": "gengzhenggonggao",
+ "unicode": "e8be",
+ "unicode_decimal": 59582
+ },
+ {
+ "icon_id": "23790931",
+ "name": "招标公告",
+ "font_class": "zhaobiaogonggao",
+ "unicode": "e8bf",
+ "unicode_decimal": 59583
+ },
+ {
+ "icon_id": "23732532",
+ "name": "文件",
+ "font_class": "wenjian6",
+ "unicode": "e8ba",
+ "unicode_decimal": 59578
+ },
+ {
+ "icon_id": "23732533",
+ "name": "文件夹",
+ "font_class": "wenjianjia4",
+ "unicode": "e8bb",
+ "unicode_decimal": 59579
+ },
+ {
+ "icon_id": "23642443",
+ "name": "取消关注",
+ "font_class": "quxiaoguanzhu",
+ "unicode": "e89a",
+ "unicode_decimal": 59546
+ },
+ {
+ "icon_id": "23642444",
+ "name": "点赞_icon",
+ "font_class": "dianzan_icon",
+ "unicode": "e8a2",
+ "unicode_decimal": 59554
+ },
+ {
+ "icon_id": "23639530",
+ "name": "文件",
+ "font_class": "wenjian5",
+ "unicode": "e896",
+ "unicode_decimal": 59542
+ },
+ {
+ "icon_id": "23639533",
+ "name": "文件夹",
+ "font_class": "wenjianjia3",
+ "unicode": "e8a9",
+ "unicode_decimal": 59561
+ },
+ {
+ "icon_id": "23639440",
+ "name": "复制icon",
+ "font_class": "fuzhiicon",
+ "unicode": "e886",
+ "unicode_decimal": 59526
+ },
+ {
+ "icon_id": "23639422",
+ "name": "主页-fill",
+ "font_class": "zhuye-fill",
+ "unicode": "e876",
+ "unicode_decimal": 59510
+ },
+ {
+ "icon_id": "23639423",
+ "name": "代码库icon",
+ "font_class": "daimakuicon",
+ "unicode": "e884",
+ "unicode_decimal": 59524
+ },
+ {
+ "icon_id": "23572260",
+ "name": "新建",
+ "font_class": "xinjian2",
+ "unicode": "e8b0",
+ "unicode_decimal": 59568
+ },
+ {
+ "icon_id": "23567674",
+ "name": "协议icon",
+ "font_class": "xieyiicon",
+ "unicode": "e870",
+ "unicode_decimal": 59504
+ },
+ {
+ "icon_id": "23567675",
+ "name": "内存icon",
+ "font_class": "neicunicon",
+ "unicode": "e891",
+ "unicode_decimal": 59537
+ },
+ {
+ "icon_id": "23567676",
+ "name": "自述文件_icon",
+ "font_class": "zishuwenjian_icon",
+ "unicode": "e8a6",
+ "unicode_decimal": 59558
+ },
+ {
+ "icon_id": "23472253",
+ "name": "标签icon",
+ "font_class": "biaoqianicon",
+ "unicode": "e882",
+ "unicode_decimal": 59522
+ },
+ {
+ "icon_id": "23472254",
+ "name": "编 辑",
+ "font_class": "a-bianji",
+ "unicode": "e883",
+ "unicode_decimal": 59523
+ },
+ {
+ "icon_id": "23472256",
+ "name": "仓库设置icon",
+ "font_class": "cangkushezhiicon",
+ "unicode": "e885",
+ "unicode_decimal": 59525
+ },
+ {
+ "icon_id": "23472258",
+ "name": "链接icon",
+ "font_class": "lianjieicon",
+ "unicode": "e887",
+ "unicode_decimal": 59527
+ },
+ {
+ "icon_id": "23472259",
+ "name": "合并请求icon",
+ "font_class": "hebingqingqiuicon",
+ "unicode": "e888",
+ "unicode_decimal": 59528
+ },
+ {
+ "icon_id": "23472260",
+ "name": "里程碑icon",
+ "font_class": "lichengbeiicon",
+ "unicode": "e889",
+ "unicode_decimal": 59529
+ },
+ {
+ "icon_id": "23472261",
+ "name": "工作流icon",
+ "font_class": "gongzuoliuicon",
+ "unicode": "e88a",
+ "unicode_decimal": 59530
+ },
+ {
+ "icon_id": "23472262",
+ "name": "动态icon",
+ "font_class": "dongtaiicon",
+ "unicode": "e88b",
+ "unicode_decimal": 59531
+ },
+ {
+ "icon_id": "23472263",
+ "name": "默认点赞_icon",
+ "font_class": "morendianzan_icon",
+ "unicode": "e88e",
+ "unicode_decimal": 59534
+ },
+ {
+ "icon_id": "23472265",
+ "name": "目录icon",
+ "font_class": "muluicon",
+ "unicode": "e894",
+ "unicode_decimal": 59540
+ },
+ {
+ "icon_id": "23472267",
+ "name": "设 置",
+ "font_class": "a-shezhi",
+ "unicode": "e899",
+ "unicode_decimal": 59545
+ },
+ {
+ "icon_id": "23472269",
+ "name": "提交icon",
+ "font_class": "tijiaoicon",
+ "unicode": "e89e",
+ "unicode_decimal": 59550
+ },
+ {
+ "icon_id": "23472270",
+ "name": "默认关注_ICON",
+ "font_class": "morenguanzhu_ICON",
+ "unicode": "e89f",
+ "unicode_decimal": 59551
+ },
+ {
+ "icon_id": "23472272",
+ "name": "下拉按钮",
+ "font_class": "xialaanniu1",
+ "unicode": "e8a4",
+ "unicode_decimal": 59556
+ },
+ {
+ "icon_id": "23472276",
+ "name": "左滑icon",
+ "font_class": "zuohuaicon",
+ "unicode": "e8b5",
+ "unicode_decimal": 59573
+ },
+ {
+ "icon_id": "23472277",
+ "name": "master_icon",
+ "font_class": "master_icon",
+ "unicode": "e8b6",
+ "unicode_decimal": 59574
+ },
+ {
+ "icon_id": "23472278",
+ "name": "默认复刻_icon",
+ "font_class": "morenfuke_icon",
+ "unicode": "e8b7",
+ "unicode_decimal": 59575
+ },
+ {
+ "icon_id": "23472279",
+ "name": "wiki icon",
+ "font_class": "a-wikiicon",
+ "unicode": "e8b8",
+ "unicode_decimal": 59576
+ },
+ {
+ "icon_id": "23472280",
+ "name": "易修icon",
+ "font_class": "yixiuicon",
+ "unicode": "e8b9",
+ "unicode_decimal": 59577
+ },
+ {
+ "icon_id": "23436350",
+ "name": "缩放",
+ "font_class": "suofang",
+ "unicode": "e87f",
+ "unicode_decimal": 59519
+ },
+ {
+ "icon_id": "23436351",
+ "name": "放大icon",
+ "font_class": "fangdaicon",
+ "unicode": "e881",
+ "unicode_decimal": 59521
+ },
+ {
+ "icon_id": "23384231",
+ "name": "搜索_icon",
+ "font_class": "sousuo_icon1",
+ "unicode": "e873",
+ "unicode_decimal": 59507
+ },
+ {
+ "icon_id": "23384232",
+ "name": "欢迎_icon",
+ "font_class": "huanying_icon",
+ "unicode": "e878",
+ "unicode_decimal": 59512
+ },
+ {
+ "icon_id": "23384233",
+ "name": "文件夹",
+ "font_class": "wenjianjia2",
+ "unicode": "e879",
+ "unicode_decimal": 59513
+ },
+ {
+ "icon_id": "23384234",
+ "name": "删除icon",
+ "font_class": "shanchuicon1",
+ "unicode": "e87a",
+ "unicode_decimal": 59514
+ },
+ {
+ "icon_id": "23261798",
+ "name": "请求icon",
+ "font_class": "qingqiuicon",
+ "unicode": "e871",
+ "unicode_decimal": 59505
+ },
+ {
+ "icon_id": "23261799",
+ "name": "响应icon",
+ "font_class": "xiangyingicon",
+ "unicode": "e87c",
+ "unicode_decimal": 59516
+ },
+ {
+ "icon_id": "23144143",
+ "name": "多选选中",
+ "font_class": "duoxuanxuanzhong",
+ "unicode": "e88f",
+ "unicode_decimal": 59535
+ },
+ {
+ "icon_id": "23144144",
+ "name": "错误icon",
+ "font_class": "cuowuicon",
+ "unicode": "e890",
+ "unicode_decimal": 59536
+ },
+ {
+ "icon_id": "23144146",
+ "name": "成功icon",
+ "font_class": "chenggongicon",
+ "unicode": "e892",
+ "unicode_decimal": 59538
+ },
+ {
+ "icon_id": "23144147",
+ "name": "未选中响应icon",
+ "font_class": "weixuanzhongxiangyingicon",
+ "unicode": "e893",
+ "unicode_decimal": 59539
+ },
+ {
+ "icon_id": "23144149",
+ "name": "必填icon",
+ "font_class": "bitianicon",
+ "unicode": "e895",
+ "unicode_decimal": 59541
+ },
+ {
+ "icon_id": "23144151",
+ "name": "未选中项目标签icon",
+ "font_class": "weixuanzhongxiangmubiaoqianicon",
+ "unicode": "e897",
+ "unicode_decimal": 59543
+ },
+ {
+ "icon_id": "23144152",
+ "name": "列表icon",
+ "font_class": "liebiaoicon",
+ "unicode": "e898",
+ "unicode_decimal": 59544
+ },
+ {
+ "icon_id": "23144155",
+ "name": "未选中请求icon",
+ "font_class": "weixuanzhongqingqiuicon",
+ "unicode": "e89b",
+ "unicode_decimal": 59547
+ },
+ {
+ "icon_id": "23144158",
+ "name": "协作者管理icon",
+ "font_class": "xiezuozheguanliicon",
+ "unicode": "e8a1",
+ "unicode_decimal": 59553
+ },
+ {
+ "icon_id": "23144160",
+ "name": "选中分支icon",
+ "font_class": "xuanzhongfenzhiicon",
+ "unicode": "e8a3",
+ "unicode_decimal": 59555
+ },
+ {
+ "icon_id": "23144162",
+ "name": "选中基本设置icon",
+ "font_class": "xuanzhongjibenshezhiicon",
+ "unicode": "e8a5",
+ "unicode_decimal": 59557
+ },
+ {
+ "icon_id": "23144165",
+ "name": "选中项目标签icon",
+ "font_class": "xuanzhongxiangmubiaoqianicon",
+ "unicode": "e8aa",
+ "unicode_decimal": 59562
+ },
+ {
+ "icon_id": "23144167",
+ "name": "选中webhook icon",
+ "font_class": "a-xuanzhongwebhookicon",
+ "unicode": "e8af",
+ "unicode_decimal": 59567
+ },
+ {
+ "icon_id": "23046290",
+ "name": "shanchu_tc_icon",
+ "font_class": "shanchu_tc_icon",
+ "unicode": "e88c",
+ "unicode_decimal": 59532
+ },
+ {
+ "icon_id": "23046293",
+ "name": "wiki_icon",
+ "font_class": "wiki_icon",
+ "unicode": "e88d",
+ "unicode_decimal": 59533
+ },
+ {
+ "icon_id": "23046244",
+ "name": "导入模版_icon",
+ "font_class": "daorumoban_icon",
+ "unicode": "e86f",
+ "unicode_decimal": 59503
+ },
+ {
+ "icon_id": "23046252",
+ "name": "错误",
+ "font_class": "cuowu",
+ "unicode": "e872",
+ "unicode_decimal": 59506
+ },
+ {
+ "icon_id": "23046255",
+ "name": "更多_icon",
+ "font_class": "gengduo_icon",
+ "unicode": "e874",
+ "unicode_decimal": 59508
+ },
+ {
+ "icon_id": "23046258",
+ "name": "复层关闭_icon",
+ "font_class": "fucengguanbi_icon",
+ "unicode": "e875",
+ "unicode_decimal": 59509
+ },
+ {
+ "icon_id": "23046268",
+ "name": "删除icon",
+ "font_class": "shanchuicon",
+ "unicode": "e877",
+ "unicode_decimal": 59511
+ },
+ {
+ "icon_id": "23046273",
+ "name": "搜索_删除icon",
+ "font_class": "sousuo_shanchuicon",
+ "unicode": "e87b",
+ "unicode_decimal": 59515
+ },
+ {
+ "icon_id": "23046275",
+ "name": "搜索_icon",
+ "font_class": "sousuo_icon",
+ "unicode": "e87d",
+ "unicode_decimal": 59517
+ },
+ {
+ "icon_id": "23046276",
+ "name": "文档预览_icon",
+ "font_class": "wendangyulan_icon",
+ "unicode": "e87e",
+ "unicode_decimal": 59518
+ },
+ {
+ "icon_id": "23046278",
+ "name": "下拉按钮",
+ "font_class": "xialaanniu",
+ "unicode": "e880",
+ "unicode_decimal": 59520
+ },
+ {
+ "icon_id": "22906287",
+ "name": "二次确认_icon",
+ "font_class": "erciqueren_icon",
+ "unicode": "e867",
+ "unicode_decimal": 59495
+ },
+ {
+ "icon_id": "22906288",
+ "name": "选中ssh_icon",
+ "font_class": "xuanzhongssh_icon",
+ "unicode": "e868",
+ "unicode_decimal": 59496
+ },
+ {
+ "icon_id": "22906289",
+ "name": "未选中安全设置_icon",
+ "font_class": "weixuanzhonganquanshezhi_icon",
+ "unicode": "e869",
+ "unicode_decimal": 59497
+ },
+ {
+ "icon_id": "22906290",
+ "name": "未选中ssh_icon",
+ "font_class": "weixuanzhongssh_icon",
+ "unicode": "e86a",
+ "unicode_decimal": 59498
+ },
+ {
+ "icon_id": "22906291",
+ "name": "选中安全设置_icon",
+ "font_class": "xuanzhonganquanshezhi_icon",
+ "unicode": "e86b",
+ "unicode_decimal": 59499
+ },
+ {
+ "icon_id": "22906292",
+ "name": "删除_icon",
+ "font_class": "shanchu_icon",
+ "unicode": "e86c",
+ "unicode_decimal": 59500
+ },
+ {
+ "icon_id": "22906293",
+ "name": "列表ssh_icon",
+ "font_class": "liebiaossh_icon",
+ "unicode": "e86e",
+ "unicode_decimal": 59502
+ },
{
"icon_id": "17575494",
"name": "file-submodule",
diff --git a/public/css/iconfont.ttf b/public/css/iconfont.ttf
index 96f61dcb..5247164d 100644
Binary files a/public/css/iconfont.ttf and b/public/css/iconfont.ttf differ
diff --git a/public/css/iconfont.woff b/public/css/iconfont.woff
index 67761f2c..6557e282 100644
Binary files a/public/css/iconfont.woff and b/public/css/iconfont.woff differ
diff --git a/public/css/iconfont.woff2 b/public/css/iconfont.woff2
index ca08e83e..78b84328 100644
Binary files a/public/css/iconfont.woff2 and b/public/css/iconfont.woff2 differ
diff --git a/src/App.css b/src/App.css
index 205c64f7..8d916d39 100644
--- a/src/App.css
+++ b/src/App.css
@@ -60,12 +60,13 @@ body {
.ant-progress-textno {
color: #f5222d;
}
-
+.CodeMirror pre.CodeMirror-line{
+ font-size: 16px!important;
+}
/* md多空格 */
.markdown-body p {
margin:10px 0px!important;
font-size: 16px !important;
- line-height: 2 !important;
white-space: pre-wrap;
}
@@ -87,6 +88,10 @@ body {
border-left: 1px solid rgb(221, 221, 221);
/* 某些情况下,被cm盖住了 */
z-index: 99;
+ padding:8px 8px 50px;
+}
+.editormd-preview .markdown-body{
+ padding:0px !important;
}
/* 图片点击放大的场景,隐藏图片链接 */
diff --git a/src/App.js b/src/App.js
index 77f5a53d..8bbe9981 100644
--- a/src/App.js
+++ b/src/App.js
@@ -73,11 +73,16 @@ const EducoderLogin = Loadable({
loader: () => import('./modules/login/EducoderLogin'),
loading: Loading,
})
+// const Search = Loadable({
+// loader: () => import('./search/SearchPage'),
+// loading: Loading,
+// })
+// const WikiPreview = Loadable({
+// loader: () => import('./forge/Wiki/Preview'),
+// loading: Loading,
+// })
+
-const ProjectIndex = Loadable({
- loader: () => import("./forge/Main/Index"),
- loading: Loading,
-});
class App extends Component {
constructor(props) {
super(props);
@@ -190,9 +195,16 @@ class App extends Component {
this.Modifyloginvalue()}>
-
+
+ {/* wiki预览 */}
+ {/* {
+ return ()
+ }
+ } /> */}
+
{/*项目*/}
{/*404*/}
+
+ {/* 查询 */}
+ {/* */}
+
+
{/* 个人主页 */}
{
+ return beforeText;
+ });
+
+ // 复制链接
+ const copyUrl = useCallback(() => {
+ let inputDom = document.getElementById(inputId);
+ if (!inputDom) {
+ console.error("您的CopyTool未设置正确的inputId");
+ return;
+ }
+ inputDom.select();
+ if (document.execCommand('copy')) {
+ document.execCommand('copy');
+ }
+ setTitle(afterText);
+ inputDom.blur();
+ }, []);
+
+ return (
+ { setTitle(beforeText) }}
+ >
+
+
+ );
+}
+
+
+export default memo(CopyTool);
\ No newline at end of file
diff --git a/src/forge/Component/EAccount.scss b/src/forge/Component/EAccount.scss
index 6f0bb97f..4bcd6b91 100644
--- a/src/forge/Component/EAccount.scss
+++ b/src/forge/Component/EAccount.scss
@@ -1,8 +1,8 @@
.ant-modal-mask{
- z-index: 10000;
+ z-index: 1001;
}
.ant-modal-wrap{
- z-index: 10001;
+ z-index: 1002;
.ant-form-explain{
position: absolute;
}
diff --git a/src/forge/Component/Releases.jsx b/src/forge/Component/Releases.jsx
index 67c3b47a..80328ef9 100644
--- a/src/forge/Component/Releases.jsx
+++ b/src/forge/Component/Releases.jsx
@@ -2,7 +2,7 @@ import React from 'react';
import { AlignCenter , AlignTop , FlexAJ } from '../Component/layout';
import { Link } from 'react-router-dom';
-function Releases({owner,projectsId,releaseVersions}){
+function Releases({owner,projectsId,releaseVersions , baseOperate , projectType}){
return(
@@ -10,10 +10,10 @@ function Releases({owner,projectsId,releaseVersions}){
发行版
{ releaseVersions && releaseVersions.total_count > 0 && {releaseVersions.total_count}}
- { releaseVersions && releaseVersions.total_count > 0 ?
+ { (releaseVersions && releaseVersions.total_count > 0) || projectType ===2 ?
全部
:
-
新建
+ baseOperate &&
新建
}
{
diff --git a/src/forge/Component/SearchUser.jsx b/src/forge/Component/SearchUser.jsx
index 0203d24f..79d23fb6 100644
--- a/src/forge/Component/SearchUser.jsx
+++ b/src/forge/Component/SearchUser.jsx
@@ -1,45 +1,49 @@
-import React , { useState } from 'react';
+import React , { useState , useEffect } from 'react';
import { AutoComplete } from 'antd';
import { getImageUrl } from "educoder";
import axios from 'axios';
const Option = AutoComplete.Option;
-export default ({ getUser })=>{
+export default ({ getUser , placeholder, width ,value })=>{
+ const [ source , setSource ] = useState(undefined);
const [ searchKey , setSearchKey ] = useState(undefined);
- const [ userDataSource , setUserDataSource ] = useState(undefined);
+
+ useEffect(()=>{
+ if(!value){
+ setSearchKey(undefined);
+ }
+ },[value])
+
+ useEffect(()=>{
+ getUserList();
+ },[searchKey])
function getUserList(e){
const url = `/users/list.json`;
axios.get(url, {
params: {
- search: e,
+ search: searchKey,
},
- })
- .then((result) => {
+ }).then((result) => {
if (result) {
- setUserDataSource(result.data.users);
+ sourceOptions(result.data.users);
}
})
.catch((error) => {
console.log(error);
});
};
-
- function changeInputUser(value){
- setSearchKey(value);
- getUserList(value);
- }
- function selectInputUser(id, option){
- setSearchKey(option.props.value);
- getUserList(option.props.value);
- getUser && getUser(id);
- }
- const source =
- userDataSource && userDataSource.map((item, key) => {
+ function sourceOptions(userDataSource){
+ const s = userDataSource && userDataSource.map((item, key) => {
return (
-
);
});
+ setSource(s);
+ }
+
+ function changeInputUser(e){
+ setSearchKey(e);
+ };
+
+ // 选择用户
+ function selectInputUser(e, option){
+ setSearchKey(option.props.name);
+ getUser(option.props.login);
+ };
+
return(
-
+
+
trigger.parentNode}
+ dataSource={source}
+ value={searchKey}
+ style={{ width: width || 300 }}
+ onChange={changeInputUser}
+ onSelect={selectInputUser}
+ placeholder={placeholder || "搜索需要添加的用户..."}
+ allowClear
+ />
+
)
}
\ No newline at end of file
diff --git a/src/forge/Divert/DivertModal.jsx b/src/forge/Divert/DivertModal.jsx
index dd947501..68530a96 100644
--- a/src/forge/Divert/DivertModal.jsx
+++ b/src/forge/Divert/DivertModal.jsx
@@ -20,13 +20,6 @@ function DivertModal({form , visible , onSuccess , onCancel,owner,repo}){
if(owner && repo && visible===true){
getTeam();
}
- if(!visible){
- setFieldsValue({
- owner_name:undefined,
- identifier:undefined
- })
- setValue(undefined)
- }
},[repo,owner,visible])
function getTeam(){
@@ -48,7 +41,7 @@ function DivertModal({form , visible , onSuccess , onCancel,owner,repo}){
...values
}).then(result=>{
if(result){
- onSuccess(result.data && result.data.owner);
+ onSuccess();
}
}).catch(error=>{})
}
@@ -104,7 +97,7 @@ function DivertModal({form , visible , onSuccess , onCancel,owner,repo}){
:
- - 仓库仅可以转移到您已经加入的组织中,不可以转移到未加入的组织中
+ - 仓库仅可以转移到您具有管理权限的组织中
- 涉及到仓库改名操作,请提前做好仓库备份并且在转移后对本地仓库的remote进行修改
- 转移仓库到组织后,你和组织创建者/管理员同时拥有对该仓库的管理操作
@@ -126,7 +119,6 @@ function DivertModal({form , visible , onSuccess , onCancel,owner,repo}){
{getFieldDecorator("owner_name",{
rules:[{required:true,message:"请输入目标用户名"}]
})(
- //
)}
@@ -152,20 +144,21 @@ function DivertModal({form , visible , onSuccess , onCancel,owner,repo}){
}
-
+
{getFieldDecorator("identifier",
{
rules:[
- {required:true,message:"请输入仓库名称"},
+ {required:true,message:"请输入仓库标识"},
{
validator:checkIdentifier
}
]
}
)(
-
+
)}
+ 请输入当前项目的标识:{repo}进行确认!
diff --git a/src/forge/Divert/Index.scss b/src/forge/Divert/Index.scss
new file mode 100644
index 00000000..0a39e4e2
--- /dev/null
+++ b/src/forge/Divert/Index.scss
@@ -0,0 +1,12 @@
+.diverModal{
+ .descUl{
+ background-color: #fffae6;
+ border-radius: 4px;
+ padding:10px 15px;
+ color: #efc16b;
+ border:1px solid #efc16b;
+ }
+ .ant-form-item-required::before{
+ content: "";
+ }
+}
\ No newline at end of file
diff --git a/src/forge/Main/CoderDepot.jsx b/src/forge/Main/CoderDepot.jsx
index 3676fa1a..713347da 100644
--- a/src/forge/Main/CoderDepot.jsx
+++ b/src/forge/Main/CoderDepot.jsx
@@ -63,6 +63,8 @@ function CoderDepot(props){
const [ readme , setReadme ] = useState(undefined);
const [ defaultBranch , setDefaultBranch ] = useState(undefined);
const [ editReadme , setEditReadme ] = useState(false);
+ const [ pullsFlag , setPullsFlag ] = useState(true);
+ const [ issuesFlag , setIssuesFlag ] = useState(true);
const owner = props.match.params.owner;
const projectsId = props.match.params.projectsId;
@@ -70,6 +72,22 @@ function CoderDepot(props){
branchName = returnbar(branchName);
const details = props.projectDetail;
let pathname = props.history.location.pathname;
+
+ const { bannerList } = props;
+
+ useEffect(()=>{
+ if(bannerList && bannerList.length>0){
+ let a = bannerList.filter(i=>i.menu_name === "pulls");
+ let i = bannerList.filter(i=>i.menu_name === "issues");
+ if(a && a.length === 0){
+ setPullsFlag(false);
+ }
+ if(i && i.length === 0){
+ setIssuesFlag(false);
+ }
+ }
+ },[bannerList])
+
useEffect(()=>{
if(details){
@@ -129,6 +147,7 @@ function CoderDepot(props){
setReadme(result.data.readme);
setEditReadme(false);
setHide(true);
+ console.log("dddd:",result.data.entries);
}
setTimeout(function(){setIsSpin(false);},500);
}).catch(error=>{setIsSpin(false);})
@@ -282,6 +301,7 @@ function CoderDepot(props){
const mdFlag = n && n.substring(n.length-3,n.length) === ".md";
const { current_user } = props;
+ const baseOperate = projectDetail && projectDetail.permission && projectDetail.permission !=="Reporter";
const fileOperate = type === "dir" && projectDetail && projectDetail.type !== 2 && ((projectDetail.permission && projectDetail.permission !=="Reporter") || (current_user && current_user.admin));
return(
@@ -344,13 +364,19 @@ function CoderDepot(props){
-
+ {
+ baseOperate && ((projectDetail.type !== 2 && pullsFlag) || issuesFlag )&&
+
+ }
{ fileOperate &&
@@ -363,7 +389,7 @@ function CoderDepot(props){
{
- dirInfo || fileInfo ?
+ (dirInfo && dirInfo.length>0) || fileInfo ?
{
lastCommit &&
@@ -375,7 +401,9 @@ function CoderDepot(props){
{ hideBtn && changeHide(hide)}> }
{lastCommit && lastCommit.time_from_now}
- { commitCount ? {commitCount}次提交:"" }
+ { commitCount ?
+ {commitCount}次提交
+ :"" }
}
@@ -419,7 +447,7 @@ function CoderDepot(props){
: ""
}
{
- (dirInfo && dirInfo.length === 0) && (fileInfo && fileInfo.length === 0) ? :""
+ (dirInfo && dirInfo.length === 0) && !fileInfo ? :""
}
{/* readme文件显示(显示文件详情时不显示readme文件) */}
{ dirInfo && (readme && readme.content) ? :"" }
@@ -469,7 +497,7 @@ function CoderDepot(props){
}
{/* 发布 */}
@@ -477,16 +505,23 @@ function CoderDepot(props){
projectDetail && projectDetail.release_versions &&
-
+
}
{/* 贡献者 */}
{
- projectDetail && projectDetail.contributors &&
+ projectDetail && projectDetail.contributors && projectDetail.contributors.length >0 &&
}
{/* 语言 */}
- { projectDetail && projectDetail.languages &&
+ { projectDetail && projectDetail.languages && projectDetail.languages.length >0 &&
diff --git a/src/forge/Main/CoderRootBranch.js b/src/forge/Main/CoderRootBranch.js
index 6299adaf..8ccc5aa4 100644
--- a/src/forge/Main/CoderRootBranch.js
+++ b/src/forge/Main/CoderRootBranch.js
@@ -17,7 +17,7 @@ export default ((props)=>{
const [ isSpin , setIsSpin ] =useState(true);
const { projectsId , owner } = props.match.params;
-
+ const { isManager , isDeveloper , projectDetail } = props;
useEffect(()=>{
getBranchs(projectsId, owner);
},[projectsId])
@@ -46,7 +46,10 @@ export default ((props)=>{
- 创建合并请求
+ {
+ (isManager || isDeveloper) && (projectDetail && projectDetail.type!==2) &&
+ 创建合并请求
+ }
@@ -70,6 +73,7 @@ export default ((props)=>{
TAR.GZ
)
+
return(
diff --git a/src/forge/Main/CoderRootCommit.js b/src/forge/Main/CoderRootCommit.js
index dec0c26a..8932c8b7 100644
--- a/src/forge/Main/CoderRootCommit.js
+++ b/src/forge/Main/CoderRootCommit.js
@@ -9,6 +9,12 @@ import Nodata from '../Nodata';
import axios from 'axios';
import {Link} from "react-router-dom";
+function returnbar(str){
+ if(str && str.length>0 && str.indexOf("%2F")>-1){
+ return str.replaceAll('%2F','/');
+ }
+ return str;
+}
class CoderRootCommit extends Component{
constructor(props){
super(props)
@@ -57,11 +63,12 @@ class CoderRootCommit extends Component{
this.setState({
isSpining:true
})
+ console.log(returnbar(branch));
const { projectsId , owner } = this.props.match.params;
const url = `/${owner}/${projectsId}/commits.json`;
axios.get(url,{
params:{
- sha:branch,
+ sha:returnbar(branch),
page,
limit
}
@@ -106,7 +113,7 @@ class CoderRootCommit extends Component{
const { commitDatas , dataCount , limit , page , isSpining , branchList } = this.state;
const { projectDetail, commit_class , defaultBranch } = this.props;
const { projectsId , owner , branchName } = this.props.match.params;
- let branch = branchName || defaultBranch;
+ let branch = returnbar(branchName || defaultBranch);
return(
diff --git a/src/forge/Main/CoderRootIndex.js b/src/forge/Main/CoderRootIndex.js
index ceff9d9f..84ab94d3 100644
--- a/src/forge/Main/CoderRootIndex.js
+++ b/src/forge/Main/CoderRootIndex.js
@@ -102,6 +102,11 @@ class CoderRootIndex extends Component{
(props) => (
)
}
>
+
()
+ }
+ >
()
diff --git a/src/forge/Main/Detail.js b/src/forge/Main/Detail.js
index 112e8cf5..d84211ac 100644
--- a/src/forge/Main/Detail.js
+++ b/src/forge/Main/Detail.js
@@ -1,7 +1,7 @@
import React, { Component } from 'react';
-import { Spin, Tooltip , Button } from 'antd';
+import { Spin, Tooltip, Button } from 'antd';
import { Link, Route, Switch } from 'react-router-dom';
-import { Content , AlignTop } from '../Component/layout';
+import { Content, AlignTop } from '../Component/layout';
import DetailBanner from './sub/DetailBanner';
import '../css/index.scss'
import './list.css';
@@ -103,12 +103,12 @@ const Contribute = Loadable({
})
const CoderRootCommit = Loadable({
- loader: () => import('./CoderRootCommit'),
- loading: Loading,
+ loader: () => import('./CoderRootCommit'),
+ loading: Loading,
})
const CoderDepot = Loadable({
- loader: () => import('./CoderDepot'),
- loading: Loading,
+ loader: () => import('./CoderDepot'),
+ loading: Loading,
})
const TrendsIndex = Loadable({
@@ -127,30 +127,40 @@ const Source = Loadable({
const DevIndex = Loadable({
loader: () => import('../DevOps/Index'),
loading: Loading,
-})
+});
+const Wiki = Loadable({
+ loader: () => import('../Wiki/Index'),
+ loading: Loading,
+});
+const WikiEdit = Loadable({
+ loader: () => import('../Wiki/EditWiki'),
+ loading: Loading,
+});
/**
* permission:Manager:管理员,Reporter:报告人员(只有读取权限),Developer:开发人员(除不能设置仓库信息外)
*/
-function checkPathname(projectsId,owner,pathname){
+function checkPathname(projectsId, owner, pathname) {
let name = "";
- if(pathname && pathname !== `/projects/${owner}/${projectsId}`){
+ if (pathname && pathname !== `/projects/${owner}/${projectsId}`) {
let url = pathname.split(`/projects/${owner}/${projectsId}`)[1];
- if(url.indexOf("/about")>-1){
- name="about"
- }else if(url.indexOf("/issues")>-1 ||url.indexOf("Milepost") > 0){
+ if (url.indexOf("/about") > -1) {
+ name = "about"
+ } else if (url.indexOf("/issues") > -1 || url.indexOf("Milepost") > 0) {
name = "issues";
- }else if(url.indexOf("/pulls")>-1){
- name="pulls"
- }else if(url.indexOf("/milestones")>-1){
- name="milestones"
- }else if(url.indexOf("/activity")>-1){
- name="activity"
- }else if(url.indexOf("/setting")>-1){
- name="setting"
- }else if(url.indexOf(`/devops`)>-1){
- name="devops"
- }else if(url.indexOf(`/source`)>-1){
- name="source"
+ } else if (url.indexOf("/pulls") > -1) {
+ name = "pulls"
+ } else if (url.indexOf("/milestones") > -1) {
+ name = "milestones"
+ } else if (url.indexOf("/activity") > -1) {
+ name = "activity"
+ } else if (url.indexOf("/setting") > -1) {
+ name = "setting"
+ } else if (url.indexOf(`/devops`) > -1) {
+ name = "devops"
+ } else if (url.indexOf(`/source`) > -1) {
+ name = "source"
+ } else if (url.indexOf(`/wiki`) > -1) {
+ name = "wiki"
}
}
return name;
@@ -173,15 +183,15 @@ class Detail extends Component {
branchs: undefined,
branchList: undefined,
project: null,
- firstSync:false,
- secondSync:false,
- open_devops:false,
- forkSpin:false,
+ firstSync: false,
+ secondSync: false,
+ open_devops: false,
+ forkSpin: false,
// 默认分支
- defaultBranch:undefined,
+ defaultBranch: undefined,
// 非本平台项目
- platform:false
+ platform: false
}
}
@@ -198,36 +208,38 @@ class Detail extends Component {
}
getProject = (num) => {
- const { projectsId , owner } = this.props.match.params;
+ const { projectsId, owner } = this.props.match.params;
const url = `/${owner}/${projectsId}/simple.json`;
axios.get(url).then((result) => {
if (result && result.data) {
this.setState({
project: result.data,
- open_devops:result.data.open_devops,
- platform:result.data.platform && result.data.platform !== 'educoder'
+ open_devops: result.data.open_devops,
+ platform: result.data.platform && result.data.platform !== 'educoder'
})
if (result.data.type !== 0 && result.data.mirror_status === 1) {
console.log("--------start channel --------");
// 是镜像项目,且未完成迁移
this.canvasChannel();
- if(num){
+ if (num) {
this.setState({
- secondSync:true,
- firsrtSync:false
+ secondSync: true,
+ firstSync: false
})
- }else{
+ } else {
this.setState({
- firstSync:true,
- secondSync:false
+ firstSync: true,
+ secondSync: false
})
}
- }else{
+ } else if (result.data.mirror_status === 2) {
+ this.deleteProjectBack();
+ } else {
this.getDetail();
this.setState({
- firsrtSync:false,
- secondSync:false
+ firstSync: false,
+ secondSync: false
})
}
}
@@ -235,9 +247,9 @@ class Detail extends Component {
}
// 工作流激活后修改状态
- changeOpenDevops=(flag)=>{
+ changeOpenDevops = (flag) => {
this.setState({
- open_devops:flag
+ open_devops: flag
})
}
canvasChannel = () => {
@@ -247,7 +259,7 @@ class Detail extends Component {
var cable = actioncable.createConsumer(`wss://${name}/cable`);
this.canvasChannel1 = cable.subscriptions.create({
channel: `MirrorProjectChannel`,
- id: project && project.identifier
+ id: project && project.id
}, {
connected: () => {
console.log("###### channel connected! ######");
@@ -255,16 +267,41 @@ class Detail extends Component {
disconnected: () => { },
received: data => {
console.log(`###### ---received data--- ######`);
+ console.log(data);
if (data) {
+ if ( data.project && data.project.mirror_status === 2) {
+ this.deleteProjectBack();
+ }
this.getDetail();
+ this.setState({
+ firstSync: false,
+ secondSync: false
+ });
cable.subscriptions.consumer.disconnect();
}
}
})
}
+ deleteProjectBack = () => {
+ const { history } = this.props;
+ const { projectsId, owner } = this.props.match.params;
+ axios.delete(`/${owner}/${projectsId}.json`).then(res => {
+ let hash = '/projects/mirror/new';
+ if (res && res.data) {
+ history.push({
+ pathname: hash,
+ mirror_status: 2
+ });
+ }
+ else {
+ window.location.hash = hash;
+ }
+ });
+ }
+
getDetail = () => {
- const { projectsId , owner } = this.props.match.params;
+ const { projectsId, owner } = this.props.match.params;
this.getBanner();
const url = `/${owner}/${projectsId}/detail.json`;
axios.get(url).then((result) => {
@@ -281,29 +318,29 @@ class Detail extends Component {
watchers_count: result.data.watchers_count,
praises_count: result.data.praises_count,
forked_count: result.data.forked_count,
- defaultBranch:result.data.default_branch
+ defaultBranch: result.data.default_branch
})
}
}).catch((error) => { })
}
// 获取动态导航栏菜单
- getBanner(){
- const { projectsId , owner } = this.props.match.params;
+ getBanner() {
+ const { projectsId, owner } = this.props.match.params;
const url = `/${owner}/${projectsId}/menu_list.json`;
- axios.get(url).then(result=>{
- if(result){
+ axios.get(url).then(result => {
+ if (result) {
this.setState({
- bannerList:result.data
+ bannerList: result.data
})
}
- }).catch(error=>{})
+ }).catch(error => { })
}
// 关注和取消关注
focusFunc = (flag) => {
const { platform } = this.state;
- if(!platform)return;
+ if (!platform) return;
const { project_id } = this.state;
axios({
@@ -318,15 +355,15 @@ class Detail extends Component {
this.setWatchersCount(result.data.watchers_count, result.data.watched);
}
})
- .catch(error => {
- console.log(error);
- });
+ .catch(error => {
+ console.log(error);
+ });
}
// 点赞和取消点赞
pariseFunc = (flag) => {
const { platform } = this.state;
- if(!platform)return;
+ if (!platform) return;
const { project_id } = this.state;
axios({
method: flag ? 'delete' : 'post',
@@ -336,9 +373,9 @@ class Detail extends Component {
this.setPraisesCount(result.data.praises_count, result.data.praised)
}
})
- .catch(error => {
- console.log(error);
- });
+ .catch(error => {
+ console.log(error);
+ });
}
setWatchersCount = (count, is_watched) => {
@@ -365,7 +402,7 @@ class Detail extends Component {
return;
}
this.setState({
- forkSpin:true
+ forkSpin: true
})
const { projectsId , owner } = this.props.match.params;
const url = `/${owner}/${projectsId}/forks.json`;
@@ -375,11 +412,11 @@ class Detail extends Component {
this.props.showNotification(result.data.message);
}
this.setState({
- forkSpin:false
+ forkSpin: false
})
}).catch(error => {
this.setState({
- forkSpin:false
+ forkSpin: false
})
})
}
@@ -387,8 +424,8 @@ class Detail extends Component {
// 同步镜像
synchronismMirror = () => {
const { platform } = this.state;
- if(!platform)return;
- const { projectsId , owner } = this.props.match.params;
+ if (!platform) return;
+ const { projectsId, owner } = this.props.match.params;
const url = `/${owner}/${projectsId}/sync_mirror.json`;
axios.post(url).then(result => {
if (result && result.data && result.data.status === 0) {
@@ -402,326 +439,344 @@ class Detail extends Component {
})
}
- textFunc = (forked_from_project_id,fork_info)=>{
+ textFunc = (forked_from_project_id, fork_info) => {
let type = fork_info && fork_info.fork_project_user_type;
return forked_from_project_id && fork_info ?
复刻自
- {fork_info.fork_project_user_name}
+ {fork_info.fork_project_user_name}
/
- {fork_info.fork_form_name}
+ {fork_info.fork_form_name}
: ""
}
-
+
render() {
- const { projectDetail, watchers_count, praises_count,
- forked_count, firstSync , secondSync ,
- isManager, watched, praised,
- project , open_devops , platform , defaultBranch , bannerList , forkSpin } = this.state;
+ const { projectDetail, watchers_count, praises_count,
+ forked_count, firstSync, secondSync,
+ isManager, watched, praised,
+ project, open_devops, platform, defaultBranch, bannerList, forkSpin } = this.state;
const url = this.props.history.location.pathname;
const urlArr = url.split("/");
const urlFlag = (urlArr.length === 3);
- const { projectsId , owner } = this.props.match.params;
+ const { projectsId, owner } = this.props.match.params;
const { current_user } = this.props;
- let pathname = checkPathname(projectsId,owner,url);
+ let pathname = checkPathname(projectsId, owner, url);
const { state } = this.props.history.location;
-
+
const common = {
getDetail: this.getDetail,
- changeOpenDevops:this.changeOpenDevops,
+ changeOpenDevops: this.changeOpenDevops,
defaultBranch
}
return (
-
+
{project && project.author &&
- {project.author.name}
+ {project.author.name}
}
/
- {project && project.name}
+ {projectDetail && projectDetail.name}
- { projectDetail && projectDetail.private && 私有}
+ {projectDetail && projectDetail.private && 私有}
{
projectDetail && projectDetail.forked_from_project_id && projectDetail.fork_info ?
- this.textFunc(projectDetail.forked_from_project_id,projectDetail.fork_info)
- :""
+ this.textFunc(projectDetail.forked_from_project_id, projectDetail.fork_info)
+ : ""
}
{
- projectDetail && projectDetail.type && projectDetail.type !== 0 ?
-
镜像自 {projectDetail.mirror_url}
- :""
+ projectDetail && projectDetail.type && projectDetail.type !== 0 ?
+
镜像自 {projectDetail.mirror_url}
+ : ""
}
{
firstSync ? "" :
-
+
}
{
firstSync ?
-
-
-
- :
-
-
- {/* 资源 */}
- ()
- }
- >
- {/* 主页 */}
- ()
- }
- >
- {/* 工作流 */}
- ()
- }
- >
- {/* 标签列表 */}
- ()
- }
- >
- {/* 仓库设置 */}
- ()
- }
- >
- {/* 任务详情 */}
- ()
- }
- >
- {/*修改里程碑*/}
- ()
- }
- >
- {/* 新建里程碑 */}
- ()
- }
- >
- {/*里程碑详情*/}
- ()
- }
- >
- {/* 里程碑 */}
- ()
- }
- >
- {/* 里程碑页面新建任务 */}
- ()
- }
- >
- {/* 新建任务 */}
- ()
- }
- >
- {/* 修改详情 */}
- ()
- }
- >
- {/* 复制详情 */}
- ()
- }
- >
- {/* 动态 */}
- ()
- }
- >
- {/* 代码Index */}
- ()
- }
- >
- {/* 新建合并请求 */}
- ()
- }
- >
- ()
- }
- >
- ()
- }
- >
- ()
- }
- >
- ()
- }
- >
+
+
+
+ :
+
+
+ {/* 资源 */}
+ ()
+ }
+ >
+ {/* 主页 */}
+ ()
+ }
+ >
+ {/* wiki新增文件 */}
+ ()
+ }
+ >
+ {/* wiki编辑文件 */}
+ ()
+ }
+ >
+ {/* wiki */}
+ ()
+ }
+ >
+ {/* 工作流 */}
+ ()
+ }
+ >
+ {/* 标签列表 */}
+ ()
+ }
+ >
+ {/* 仓库设置 */}
+ ()
+ }
+ >
+ {/* 任务详情 */}
+ ()
+ }
+ >
+ {/*修改里程碑*/}
+ ()
+ }
+ >
+ {/* 新建里程碑 */}
+ ()
+ }
+ >
+ {/*里程碑详情*/}
+ ()
+ }
+ >
+ {/* 里程碑 */}
+ ()
+ }
+ >
+ {/* 里程碑页面新建任务 */}
+ ()
+ }
+ >
+ {/* 新建任务 */}
+ ()
+ }
+ >
+ {/* 修改详情 */}
+ ()
+ }
+ >
+ {/* 复制详情 */}
+ ()
+ }
+ >
+ {/* 动态 */}
+ ()
+ }
+ >
+ {/* 代码Index */}
+ ()
+ }
+ >
+ {/* 新建合并请求 */}
+ ()
+ }
+ >
+ ()
+ }
+ >
+ ()
+ }
+ >
+ ()
+ }
+ >
+ ()
+ }
+ >
- ()
- }
- >
- ()
- }
- >
- ()
- }
- >
- ()
- }
- >
- {/* 贡献者列表 */}
- ()
- }
- >
+ ()
+ }
+ >
+ ()
+ }
+ >
+ ()
+ }
+ >
+ ()
+ }
+ >
+ {/* 贡献者列表 */}
+ ()
+ }
+ >
- {/* 代码库----详情页面 */}
- ()
- }
- >
- ()
- }
- >
- ()
- }
- >
- ()
- }
- >
-
-
+ {/* 代码库----详情页面 */}
+ ()
+ }
+ >
+ ()
+ }
+ >
+ ()
+ }
+ >
+ ()
+ }
+ >
+
+
}
)
diff --git a/src/forge/Main/Index.js b/src/forge/Main/Index.js
index 3b40e392..6cdd6bd3 100644
--- a/src/forge/Main/Index.js
+++ b/src/forge/Main/Index.js
@@ -276,15 +276,18 @@ class Index extends Component {
-
-
-
+
+
+
+ 新手指引
+
{
diff --git a/src/forge/Main/list.css b/src/forge/Main/list.css
index 32a69974..91c11cb0 100644
--- a/src/forge/Main/list.css
+++ b/src/forge/Main/list.css
@@ -43,13 +43,26 @@
margin-top: -6px;
margin-bottom: 2px!important;
}
-.bannerBox .ant-btn{
- margin-top: 30px;
- height: 40px;
- font-size: 16px;
- width: 120px;
+.bannerBox > a{
+ display: inline-block;
+ width: 104px;
+ height: 30px;
+ line-height: 28px;
+ text-align: center;
border-radius: 4px;
- margin-right: 40px;
+ border: 1px solid #666;
+ margin-right: 30px;
+ margin-top: 30px;
+ color: #fff;
+ cursor: pointer;
+}
+.bannerBox > a > i{
+ font-size: 14px!important;
+ display: inline-block;
+ margin-right: 10px;
+}
+.bannerBox > a > a{
+ color: #fff!important;
}
.ProjectListIndex{
width: 1200px;
diff --git a/src/forge/Main/sub/DetailBanner.jsx b/src/forge/Main/sub/DetailBanner.jsx
index f77294a1..6a7e89ee 100644
--- a/src/forge/Main/sub/DetailBanner.jsx
+++ b/src/forge/Main/sub/DetailBanner.jsx
@@ -22,9 +22,9 @@ function DetailBanner({ history,list , owner , projectsId , isManager , url , pa
menuName && menuName.length> 0 && projectDetail ?
{
- menuName.map((item,key)=>{
+ Array.isArray(menuName)&& menuName.map((item,key)=>{
return(
-
+
{
item.menu_name === "home" &&
-
@@ -65,6 +65,15 @@ function DetailBanner({ history,list , owner , projectsId , isManager , url , pa
:""
}
+ {/* {
+ item.menu_name === "wiki" &&
+ -
+
+
+ Wiki
+
+
+ } */}
{
item.menu_name === "devops" && platform ?
-
diff --git a/src/forge/Merge/MergeItem.js b/src/forge/Merge/MergeItem.js
index 5c08a61f..f21cc3f5 100644
--- a/src/forge/Merge/MergeItem.js
+++ b/src/forge/Merge/MergeItem.js
@@ -49,7 +49,7 @@ class MergeItem extends Component {
};
render() {
- const { issues, project_name, project_author_name , user_admin_or_member} = this.props;
+ const { issues, project_name, project_author_name , user_admin_or_developer} = this.props;
const { projectsId , owner } = this.props.match.params;
const { current_user } = this.props;
const renderList = () => {
@@ -183,7 +183,7 @@ class MergeItem extends Component {
) : (
""
)}
- {user_admin_or_member ? (
+ {user_admin_or_developer && item.pull_request_status === 0 ? (
})
-
+
),
diff --git a/src/forge/Merge/merge.js b/src/forge/Merge/merge.js
index c0c7e5ce..2b72cbee 100644
--- a/src/forge/Merge/merge.js
+++ b/src/forge/Merge/merge.js
@@ -4,7 +4,7 @@ import "./merge.css";
import "../Order/order.css";
import "../Order/index.scss";
import NoneData from "./no_data";
-import OrderItem from "./MergeItem";
+import MergeItem from "./MergeItem";
import './Index.scss';
import axios from "axios";
@@ -159,14 +159,10 @@ class merge extends Component {
this.getOption(e, id, name)}>
{name}
- {array &&
- array.length > 0 &&
- array.map((item, key) => {
+ {array && array.length > 0 && array.map((item, key) => {
return (
-
this.getOption(e, id, item.name)}
- >
+ ((!item.permission) || (item.permission && item.permission !== "Reporter")) &&
+ this.getOption(e, id, item.name)}>
{item.name}
);
@@ -259,7 +255,7 @@ class merge extends Component {
/>
{
- data && data.user_admin_or_member &&
+ data && data.user_admin_or_developer &&
this.checkOperation()}>
+ 新建合并请求
@@ -391,7 +387,7 @@ class merge extends Component {
{data && data.search_count && data.search_count > 0 ? (
-
+ user_admin_or_developer={data && data.user_admin_or_developer}
+ >
):""}
{search_count > select_params.limit ? (
diff --git a/src/forge/Merge/merge_form.js b/src/forge/Merge/merge_form.js
index 1c75a9f9..3481cc8f 100644
--- a/src/forge/Merge/merge_form.js
+++ b/src/forge/Merge/merge_form.js
@@ -264,7 +264,7 @@ class MergeForm extends Component {
},
],
initialValue: title,
- })()}
+ })()}
)}
-
-
-
- 必须审查代码
-
-
- 合并后删除提交分支
-
-
- 合并后关闭提到的任务
-
-
-
+ {/*
+ {getFieldDecorator("checkbox-group")(
+
+
+ 必须审查代码
+
+
+ 合并后删除提交分支
+
+
+ 合并后关闭提到的任务
+
+
+ )}
+ */}
diff --git a/src/forge/New/Index.js b/src/forge/New/Index.js
index b38b4396..7a314f67 100644
--- a/src/forge/New/Index.js
+++ b/src/forge/New/Index.js
@@ -1,6 +1,6 @@
import React, { Component } from 'react';
import { Link } from 'react-router-dom';
-import { Input , Form , Select , Checkbox , Button , Spin , AutoComplete } from 'antd';
+import { Input , Form , Select , Checkbox , Button , Spin , AutoComplete, Modal } from 'antd';
import { Base64 } from 'js-base64';
import '../css/index.scss';
@@ -62,6 +62,8 @@ class Index extends Component {
this.getGitignore();
// 获取开源许可证
this.getLicenses();
+ //判断是否为删除新建项目失败后返回,并执行对应逻辑
+ this.isDeleteProjectBack();
}
componentDidUpdate=(prevPros)=>{
if(prevPros && this.props && !this.props.checkIfLogin()){
@@ -73,6 +75,7 @@ class Index extends Component {
getOwner=()=>{
const { OIdentifier } = this.props.match.params;
const { user_id } = this.props && this.props.current_user;
+
const url = `/owners.json`;
axios.get(url).then(result=>{
if(result && result.data){
@@ -81,16 +84,13 @@ class Index extends Component {
OwnerList: owner,
})
if(OIdentifier){
- owner = owner.filter(item=>item.name === OIdentifier);
- this.props.form.setFieldsValue({
- user_id:OIdentifier
- })
+ owner = owner.filter(item=>item.login === OIdentifier);
}else if(user_id){
owner = owner.filter(item=>item.id === user_id);
- this.props.form.setFieldsValue({
- user_id:owner && owner[0].name
- })
}
+ this.props.form.setFieldsValue({
+ user_id:owner && owner[0].name
+ })
owner && this.setState({
owners_id:owner[0].id,
owners_name:owner[0].name
@@ -148,6 +148,31 @@ class Index extends Component {
}).catch((error) => { })
}
+ isDeleteProjectBack = () => {
+ let mirror_status = this.props.history.location.mirror_status;
+ if (mirror_status === 2 && sessionStorage.newProjectValue) {
+ Modal.warning({
+ title: '警告',
+ content: '镜像项目创建失败!请按操作规范重新创建项目!',
+ });
+ let newProjectValue = JSON.parse(sessionStorage.newProjectValue);
+ if (newProjectValue) {
+ this.setState({
+ project_language_id: newProjectValue.project_language_id,
+ project_category_id: newProjectValue.project_category_id,
+ license_id: newProjectValue.license_id,
+ ignore_id: newProjectValue.ignore_id
+ });
+ delete newProjectValue.project_language_id;
+ delete newProjectValue.project_category_id;
+ delete newProjectValue.license_id;
+ delete newProjectValue.ignore_id;
+ this.props.form.setFieldsValue(newProjectValue);
+ }
+
+ }
+ }
+
// 设置option
setOptionsList = (data, _head, name) => {
if (data && data.length > 0) {
@@ -176,6 +201,8 @@ class Index extends Component {
const { project_language_id, project_category_id, license_id, ignore_id , owners_id , owners_name } = this.state;
const decoderPass = Base64.encode(values.password);
const url = (projectsType && projectsType === "mirror") ? "/projects/migrate.json" : "/projects.json";
+ // 新建项目的时候,暂存数据,如果失败,返回的时候可以重新赋值
+ sessionStorage.newProjectValue=JSON.stringify({...values,project_language_id,project_category_id,license_id,ignore_id});
axios.post(url, {
...values,
auth_password:decoderPass,
@@ -185,14 +212,12 @@ class Index extends Component {
ignore_id,
user_id:owners_id
}).then((result) => {
- if (result) {
- if (result.data.id) {
- this.setState({
- isSpin: false
- })
- this.props.showNotification(`${projectsType && projectsType === "mirror" ? "镜像" : "托管"}项目创建成功!`);
- this.props.history.push(`/projects/${result.data.login}/${result.data.identifier}`);
- }
+ if (result && result.data.id) {
+ this.setState({
+ isSpin: false
+ })
+ projectsType && projectsType !== "mirror" && this.props.showNotification(`托管项目创建成功!`);
+ this.props.history.push(`/projects/${result.data.login}/${result.data.identifier}`);
}
}).catch((error) => {
this.setState({
@@ -342,7 +367,9 @@ class Index extends Component {
{
projectsType && projectsType === "mirror" &&
- 需要授权验证
+
+ 需要授权验证
+ 如果源项目为公有仓库,禁止填写用户名密码。如果源项目为私有仓库,则必须填写正确的用户名和密码!
{
mirrorCheck &&
diff --git a/src/forge/Notice/Index.jsx b/src/forge/Notice/Index.jsx
index 94c63804..c93ec8f2 100644
--- a/src/forge/Notice/Index.jsx
+++ b/src/forge/Notice/Index.jsx
@@ -22,6 +22,7 @@ function Index(props){
const username = props.match.params.username;
const pathname = props.history.location.pathname;
const user = props.user;
+ const undo_messages = props.undo_messages;
const [ menu , setMenu ] = useState("notify");
const [ messagesCount , setMessagesCount ] = useState(0);
@@ -72,7 +73,7 @@ function Index(props){
if(type==="apply"){
setApplyCount(applyCount-count);
}else if(type==="undo"){
- setTransferCount(applyCount-count);
+ setTransferCount(transferCount-count);
}else{
setMessagesCount(0);
c = messagesCount;
diff --git a/src/forge/Notice/Notify.jsx b/src/forge/Notice/Notify.jsx
index 761366d3..b3d338de 100644
--- a/src/forge/Notice/Notify.jsx
+++ b/src/forge/Notice/Notify.jsx
@@ -14,8 +14,24 @@ function Notify(props){
const [ isSpin , setIsSpin ] = useState(true);
useEffect(()=>{
- props && props.deleteEvent("notify",0);
- },[])
+ if(username){
+ getList();
+ }
+ },[username,page])
+
+ function getList(){
+ const url = `/users/${username}/applied_messages.json`;
+ Axios.get(url,{
+ params:{
+ page,per_page:limit
+ }
+ }).then(result=>{
+ if(result){
+ setList(result.data.applied_messages);
+ setTotal(result.data.total_count);
+ }
+ }).catch(error=>{})
+ }
useEffect(()=>{
if(username){
diff --git a/src/forge/Notice/UndoEvent.jsx b/src/forge/Notice/UndoEvent.jsx
index c8c579dc..6d13e706 100644
--- a/src/forge/Notice/UndoEvent.jsx
+++ b/src/forge/Notice/UndoEvent.jsx
@@ -14,6 +14,7 @@ function UndoEvent(props){
const [ total , setTotal ] = useState(0);
const [ isSpin , setIsSpin ] = useState(true);
+
useEffect(()=>{
if(username){
setIsSpin(true);
@@ -69,15 +70,14 @@ function UndoEvent(props){
list.map((i,k)=>{
return(
-
-
+
{i.user && i.user.name}
{i.time_ago}
- 请求将仓库【{i.project && i.project.name}】
- 转移给【{i.owner && i.owner.name}】,是否接受?
+ 请求将仓库转移给【{i.owner && i.owner.name}】,是否接受?
{
i.status === "common" &&
@@ -93,7 +93,7 @@ function UndoEvent(props){
i.status === "canceled" && 对方已取消转移
}
{
- i.status === "accepted" && 已接受
+ i.status === "accept" && 已接受
}
{
i.status === "refused" && 已拒绝
diff --git a/src/forge/Order/Milepost.js b/src/forge/Order/Milepost.js
index d87bfe0b..ede2d314 100644
--- a/src/forge/Order/Milepost.js
+++ b/src/forge/Order/Milepost.js
@@ -154,10 +154,10 @@ class Milepost extends Component {
const { projectsId , owner } = this.props.match.params;
const menu = (
diff --git a/src/forge/Order/UpdateMilepost.js b/src/forge/Order/UpdateMilepost.js
index 49a2b8d3..88a73033 100644
--- a/src/forge/Order/UpdateMilepost.js
+++ b/src/forge/Order/UpdateMilepost.js
@@ -180,8 +180,8 @@ class UpdateMilepost extends Component {
onTypeChange(e.target.value)} value={type}>
-
-
+
+
diff --git a/src/forge/Order/newMilepost.js b/src/forge/Order/newMilepost.js
index 5d7b090f..b9513212 100644
--- a/src/forge/Order/newMilepost.js
+++ b/src/forge/Order/newMilepost.js
@@ -102,7 +102,7 @@ class NewMilepost extends Component {
required: true, message: '请输入标题'
}],
})(
-
+
)}
@@ -113,7 +113,7 @@ class NewMilepost extends Component {
required: true, message: '请输入描述内容'
}],
})(
-
+
)}
diff --git a/src/forge/Order/order_form.js b/src/forge/Order/order_form.js
index 45433631..b6f065b2 100644
--- a/src/forge/Order/order_form.js
+++ b/src/forge/Order/order_form.js
@@ -92,10 +92,10 @@ class order_form extends Component {
const url = `/${owner}/${projectsId}/issues/new.json`;
axios.get(url).then((result) => {
- if (result) {
+ if (result && result.data) {
this.setState({
issue_chosen: result.data.issue_chosen,
- branches: result.data.branches,
+ branches: result.data.issue_chosen.branches,
isSpin:false
});
diff --git a/src/forge/Settings/Branch.js b/src/forge/Settings/Branch.js
index d0a235d8..d345f0fc 100644
--- a/src/forge/Settings/Branch.js
+++ b/src/forge/Settings/Branch.js
@@ -23,6 +23,7 @@ export default ((props)=>{
const [ page , setPage ] = useState(1);
let defaultBranch = props.defaultBranch;
+
useEffect(()=>{
if(defaultBranch){
setBranch(defaultBranch);
@@ -76,6 +77,8 @@ export default ((props)=>{
.then((result) => {
if (result) {
props.showNotification(`分支设置成功!`);
+ const { getDetail } = props;
+ getDetail && getDetail();
}
})
.catch((error) => {
@@ -95,7 +98,7 @@ export default ((props)=>{
return(
- 分支设置
+ 分支设置
默认分支
diff --git a/src/forge/Settings/Collaborator.js b/src/forge/Settings/Collaborator.js
index 0b94eee5..0a50cae1 100644
--- a/src/forge/Settings/Collaborator.js
+++ b/src/forge/Settings/Collaborator.js
@@ -1,4 +1,4 @@
-import React, { useState } from "react";
+import React, { useState , useRef } from "react";
import {WhiteBack} from '../Component/layout';
import AddMember from '../Component/AddMember';
import AddGroup from '../Component/AddGroup';
@@ -8,9 +8,11 @@ import Group from './CollaboratorGroup';
function Collaborator(props){
const [ nav , setNav] = useState("1");
const [ newId , setNewId] = useState(undefined);
+ const [ addOperation , setAddOperation] = useState(true);
const [ newGroupId , setNewGroupId] = useState(undefined);
const {projectsId ,owner} = props.match.params;
+
const author = props && props.projectDetail && props.projectDetail.author;
function getID(id){
@@ -19,6 +21,7 @@ function Collaborator(props){
function getGroupID(id){
setNewGroupId(id);
}
+
return (
@@ -27,15 +30,17 @@ function Collaborator(props){
author && author.type === "Organization" ?
{setNav("1");setNewId(undefined)}}>协作者管理
- {setNav("2");setNewId(undefined)}}>团队管理
+ {setNav("2");setNewId(undefined);setNewGroupId(undefined)}}>团队管理
:
协作者管理
}
{
- nav === "1" ?
+ nav === "1" &&
- :
+ }
+ {
+ (nav !== "1" && addOperation) &&
}
@@ -44,7 +49,7 @@ function Collaborator(props){
nav === "1" ?
:
-
+
}
diff --git a/src/forge/Settings/CollaboratorGroup.jsx b/src/forge/Settings/CollaboratorGroup.jsx
index c6ab6ffb..4836d3e6 100644
--- a/src/forge/Settings/CollaboratorGroup.jsx
+++ b/src/forge/Settings/CollaboratorGroup.jsx
@@ -10,7 +10,7 @@ const roles = {
read: "报告者",
};
const limit = 15;
-function CollaboratorGroup({ newGroupId, owner, projectsId }) {
+function CollaboratorGroup({ newGroupId, owner, projectsId , setAddOperation }) {
const [list, setList] = useState(undefined);
const [isSpin, setIsSpin] = useState(true);
const [page, setPage] = useState(1);
@@ -34,6 +34,7 @@ function CollaboratorGroup({ newGroupId, owner, projectsId }) {
setList(result.data.teams);
setTotal(result.data.total_count);
setIsSpin(false);
+ setAddOperation(result.data.can_add);
}
})
.catch((error) => {});
@@ -47,16 +48,15 @@ function CollaboratorGroup({ newGroupId, owner, projectsId }) {
// 添加团队
function addGroup(id) {
const url = `/${owner}/${projectsId}/teams.json`;
- axios
- .post(url, {
- team_id: id,
- })
- .then((result) => {
- if (result && result.data) {
- getData();
- }
- })
- .catch((error) => {});
+ axios.post(url, {
+ team_id: id,
+ })
+ .then((result) => {
+ if (result && result.data) {
+ getData();
+ }
+ })
+ .catch((error) => {});
}
// 删除团队
@@ -77,7 +77,11 @@ function CollaboratorGroup({ newGroupId, owner, projectsId }) {
title: "团队名",
dataIndex: "name",
render: (value, item) => {
- return {value};
+ if(item.is_admin || item.is_member){
+ return {value};
+ }else{
+ return {value};
+ }
},
},
{
diff --git a/src/forge/Settings/CollaboratorMember.jsx b/src/forge/Settings/CollaboratorMember.jsx
index 86459d87..1104a864 100644
--- a/src/forge/Settings/CollaboratorMember.jsx
+++ b/src/forge/Settings/CollaboratorMember.jsx
@@ -58,8 +58,12 @@ function CollaboratorMember({projectsId,owner,project_id,author,showNotification
})
.then((result) => {
if (result) {
- setListData(result.data.members);
- setTotal(result.data.total_count);
+ if(page > 1 && ( listData && listData.length === 1)){
+ setPage(page-1);
+ }else{
+ setListData(result.data.members);
+ setTotal(result.data.total_count);
+ }
setIsSpin(false);
}
})
diff --git a/src/forge/Settings/ManageWebNew.jsx b/src/forge/Settings/ManageWebNew.jsx
index f58d5cc7..64c52e17 100644
--- a/src/forge/Settings/ManageWebNew.jsx
+++ b/src/forge/Settings/ManageWebNew.jsx
@@ -80,7 +80,7 @@ export default Form.create()(
[],
)}
- 推送、创建,删除分支事件白名单,支持匹配符。如果为空或者 *,所有分支的事件均被触发。
语法参见 github.com/gobwas/glob 。示例: Master, ${'{master,release*}'}。
+ 推送、创建,删除分支事件白名单,支持匹配符。如果为空或者 *,所有分支的事件均被触发。
语法参见 github.com/gobwas/glob 。示例: Master, ${'{master,release*}'}。
{helper(
"",
"active",
diff --git a/src/forge/Settings/Setting.js b/src/forge/Settings/Setting.js
index 5b4f07c2..034bd071 100644
--- a/src/forge/Settings/Setting.js
+++ b/src/forge/Settings/Setting.js
@@ -2,6 +2,7 @@ import React, { Component } from "react";
import { Form, Input, Checkbox, Select , Spin } from "antd";
import Title from '../Component/Title';
import {WhiteBack} from '../Component/layout';
+import DivertModal from '../Divert/DivertModal';
import axios from "axios";
import "./setting.scss";
const { TextArea } = Input;
@@ -12,6 +13,7 @@ const menu = [
{name:"代码库",index:"code"},
{name:"易修 (Issue)",index:"issues"},
{name:"合并请求",index:"pulls"},
+ // {name:"Wiki",index:"wiki"},
{name:"工作流(beta版)",index:"devops"},
// {name:"资源库",index:"resources"},
{name:"里程碑",index:"versions"},
@@ -28,7 +30,8 @@ class Setting extends Component {
project_units:['home',"activity","code"],
divertVisible:false,
is_transfering:undefined,
- projectName:undefined
+ projectName:undefined,
+ permission:undefined
};
}
@@ -78,7 +81,9 @@ class Setting extends Component {
projectName:result.data.project_name,
private_check: result.data.private,
loading:false,
- project_units:units
+ project_units:units,
+ is_transfering:result.data.is_transfering,
+ permission:result.data.permission
});
}
})
@@ -192,16 +197,57 @@ class Setting extends Component {
});
};
+ // 转移仓库
+ DivertProject=()=>{
+ this.setState({
+ divertVisible:true
+ })
+ }
+ // 取消仓库转移
+ CancelDivertProject=()=>{
+ this.props.confirm({
+ content: "是否确认取消将此项目转移给他人?",
+ onOk: () => {
+ const { projectsId , owner } = this.props.match.params;
+ const url = `/${owner}/${projectsId}/applied_transfer_projects/cancel.json`;
+ axios.post(url).then(result=>{
+ if(result && result.data){
+ this.setState({
+ is_transfering:false
+ })
+ }
+ }).catch(error=>{})
+ },
+ });
+
+ }
+ // 确定转移仓库
+ onSuccess=()=>{
+ this.setState({
+ is_transfering:true,
+ divertVisible:false
+ })
+ }
+
render() {
const { getFieldDecorator } = this.props.form;
const { projectDetail } = this.props;
+ const { projectsId , owner } = this.props.match.params;
- const { CategoryList, LanguageList, private_check ,loading } = this.state;
let mirror = projectDetail && projectDetail.mirror;
let type = projectDetail && projectDetail.type;
const forked_from_project_id = this.props && this.props.projectDetail && this.props.projectDetail.forked_from_project_id;
+
+ const { CategoryList, LanguageList, private_check ,loading , divertVisible , permission , is_transfering } = this.state;
return (
+
{this.setState({divertVisible:false})}}
+ />
基本设置
@@ -293,23 +339,41 @@ class Setting extends Component {
{/* 镜像设置部分,暂无接口,先不显示 */}
{/* */}
-
-
-
危险操作区
-
+ {
+ permission && (permission === "Admin" || permission === "Owner")?
+
-
删除本仓库
-
- 删除仓库是永久性的,
- 无法撤消,且删除后,与仓库关联的项目/任务/合并请求/版本发布等,均会被删除
-
+
危险操作区
+
+
+
转移仓库
+
+ 将此仓库转移给其他用户或组织
+
+
+ {
+ is_transfering ?
+
取消转移
+ :
+
转移
+ }
+
+
+
+
删除本仓库
+
+ 删除仓库是永久性的,
+ 无法撤消,且删除后,与仓库关联的项目/任务/合并请求/版本发布等,均会被删除
+
+
+
+ 删除本仓库
+
+
-
- 删除本仓库
-
-
-
-
+
+ :""
+ }
);
diff --git a/src/forge/Settings/Webhooks/New.jsx b/src/forge/Settings/Webhooks/New.jsx
new file mode 100644
index 00000000..0dedaa83
--- /dev/null
+++ b/src/forge/Settings/Webhooks/New.jsx
@@ -0,0 +1,337 @@
+import React , { forwardRef, useEffect, useState } from 'react';
+import { Form , Input , Button , Select , Radio , Checkbox } from 'antd';
+import { Banner } from '../../Component/layout';
+import { Link } from 'react-router-dom';
+import axios from 'axios';
+import PushHistory from './sub/PushHistory';
+import DeleteBox from '../../Component/DeleteModal/Index';
+import './Index.scss';
+
+// ,"issue_assign","issue_label","issue_milestone","issue_comment","issue_only","fork",
+//"pull_request_milestone","pull_request_sync","pull_request_comment","repository","pull_request_label"
+const eventArray = [
+ "create","delete","push","pull_request_assign","pull_request_review","pull_request_only"
+]
+function New({ form , match , showNotification , history }) {
+ const [ httpValue , setHttpValue ] = useState("POST");
+ const [ posthttpValue , setPostHttpValue ] = useState("json");
+ const [ condition , setCondition ] = useState("push");
+ const [ event , setEvent ] = useState(["push"]);
+ const [ visible , setVisible ] = useState(false);
+ const [ data , setData ] = useState(undefined);
+ const [ eventFlag , setEventFlag ] = useState(false);
+
+ const { getFieldDecorator, validateFields , setFieldsValue } = form;
+ const { id , owner , projectsId } = match.params;
+
+ function compareArray(params) {
+ if(params && params.length > 0){
+ if(params.length === 1 && params[0] === "push"){
+ setEvent(['push']);
+ return "push";
+ }else if(params.length === eventArray.length){
+ setEvent(eventArray);
+ return "all";
+ }else{
+ setEvent([]);
+ return "forevent";
+ }
+ }
+ }
+
+ useEffect(()=>{
+ if(id){
+ Init();
+ }else{
+ let e = compareArray(event);
+ setCondition(e);
+ setFieldsValue({
+ url:"",
+ secret:"",
+ http_method:httpValue,
+ content_type:posthttpValue,
+ eventCondition:condition,
+ event:event,
+ branch_filter:"*",
+ active:true
+ })
+ }
+ },[id])
+
+ function Init() {
+ const url = `/${owner}/${projectsId}/webhooks/${id}/edit.json`;
+ axios.get(url).then(result=>{
+ if(result){
+ let e = compareArray(result.data.events);
+ setFieldsValue({
+ ...result.data,
+ eventCondition:e,
+ active:result.data.is_active
+ })
+ setData(result.data);
+ setHttpValue(result.data.http_method);
+ setCondition(e);
+ setEvent(result.data.events);
+ }
+ }).catch(error=>{})
+ }
+
+ function changeHTTP(value) {
+ setHttpValue(value);
+ }
+
+ function changeCondition(e) {
+ setCondition(e.target.value);
+ if(e.target.value === "push"){
+ setEvent(["push"])
+ }else if(e.target.value === "all"){
+ setEvent(eventArray)
+ }else{
+ setEvent([])
+ }
+ }
+
+ function submit() {
+ validateFields((error,values)=>{
+ if(!error){
+ if(values.eventCondition === "forevent" && event.length === 0){
+ setEventFlag(true);
+ return;
+ }
+ let e = values.eventCondition === "push" ? ['push'] : values.eventCondition === "all" ? eventArray : event;
+
+ if(id){
+ // 编辑
+ const url = `/${owner}/${projectsId}/webhooks/${id}.json`;
+ axios.patch(url,{
+ webhook:{
+ ...values,
+ events:e
+ }
+ }).then(result=>{
+ if(result){
+ showNotification("webhook更新成功!");
+ history.push(`/projects/${owner}/${projectsId}/setting/webhooks`);
+ }
+ }).catch(error=>{})
+ }else{
+ // 保存
+ const url = `/${owner}/${projectsId}/webhooks.json`;
+ axios.post(url,{
+ webhook:{
+ ...values,
+ events:e
+ }
+ }).then(result=>{
+ if(result && result.data && result.data.id){
+ showNotification("webhook新建成功!");
+ history.push(`/projects/${owner}/${projectsId}/setting/webhooks`);
+ }
+ }).catch(error=>{})
+ }
+
+ }
+ })
+ }
+
+ function checkAddr(rule, value, callback) {
+ let reg = /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/;
+ if(!value){
+ callback();
+ }
+ if (!reg.test(value)){
+ callback("请输入有效的URL");
+ }
+ callback();
+ }
+
+ function deleteFunc() {
+ if(id){
+ setVisible(true);
+ }
+ }
+
+ function onSuccess() {
+ if(id){
+ const url = `/${owner}/${projectsId}/webhooks/${id}.json`;
+ axios.delete(url).then(result=>{
+ if(result){
+ showNotification("webhook删除成功!");
+ history.push(`/projects/${owner}/${projectsId}/setting/webhooks`);
+ }
+ }).catch(error=>{})
+ }
+ }
+
+ const radioStyle = {
+ display: 'block',
+ height: '30px',
+ lineHeight: '30px',
+ };
+
+ return(
+
+
setVisible(false)}
+ onSuccess={onSuccess}
+ title="删除Webhook"
+ content="您确定要删除此Webhook吗?"
+ subTitle={`删除后未来事件将不会推送至此Webhook地址:${data && data.url}`}
+ />
+
+ Webhooks
+
+ {id ? "更新" : "添加"}Webhook
+
+
+
当webhook被触发时,我们将向以下URL发送通知,包括已选择事件的详细信息。更多信息可查阅webhooks指南。
+
+ {getFieldDecorator("url",{
+ rules:[
+ {required:true,message:"请输入目标URL"},
+ {
+ validator:checkAddr
+ }
+ ]
+ })(
+
+ )}
+
+
+ {getFieldDecorator("secret",{
+ rules:[]
+ })(
+
+ )}
+
+
+ {getFieldDecorator("http_method",{
+ rules:[]
+ })(
+
+ )}
+
+
+ {getFieldDecorator("content_type",{
+ rules:[]
+ })(
+
+ )}
+
+
+ {getFieldDecorator("eventCondition",{
+ rules:[]
+ })(
+
+ 只是push事件
+ 所有事件
+ 自定义事件
+
+ )}
+
+
+
{setEvent(e)}}>
+ 代码库事件
+
+
+ 推送
+ git推送到存储库
+
+ {/*
+ 代码库
+ 创建或删除代码库
+ */}
+
+ 创建
+ 创建分支或标签
+
+
+ 删除
+ 删除分支或标签
+
+
+ 合并请求事件
+
+
+ 合并请求
+ 合并请求被打开、被关闭、被重新打开或被编辑
+
+
+ 合并请求分配
+ 合并请求被分配或取消分配
+
+ {/*
+ 合并请求收入里程碑
+ 合并请求被记录或取消记录于里程碑中
+ */}
+ {/*
+ 合并请求被评论
+ 合并请求评论被创建、编辑或删除
+ */}
+ {/*
+ 合并请求标签
+ 合并请求的标签被更新或清除
+ */}
+
+ 合并请求审查
+ 合并请求被批准、拒绝或提出审查意见,审查人员的修改,审查线程已解决或未解决
+
+ {/*
+ 合并请求被同步
+ 合并请求被同步
+ */}
+
+
+ { eventFlag &&
请选择自定义事件!}
+
+
推送、创建,删除分支事件的分支白名单,使用 glob 模式匹配指定。若为空或 *,则将报告所有分支的事件。语法文档见github.com/gobwas/glob。示例:master,{'{'}master,release*{'}'}。}
+ colon={false}
+ style={{marginTop:'15px'}}
+ >
+ {getFieldDecorator("branch_filter",{
+ rules:[]
+ })(
+
+ )}
+
+
+ {getFieldDecorator("active",{
+ valuePropName:"checked"
+ })(
+ 激活激活后触发事件的信息将发送到此Webhook地址
+ )}
+
+
+
+ {
+ id &&
+ }
+
+
+ { id && }
+
+ )
+}
+export default Form.create()(forwardRef(New));
\ No newline at end of file
diff --git a/src/forge/Settings/new_tags.js b/src/forge/Settings/new_tags.js
index d0affbc8..bc763f9c 100644
--- a/src/forge/Settings/new_tags.js
+++ b/src/forge/Settings/new_tags.js
@@ -445,7 +445,7 @@ class NewTags extends Component {
message: "请填写标签名字",
},
],
- })()}
+ })()}
@@ -507,8 +507,8 @@ class NewTags extends Component {
>
{
+ setFieldsValue({
+ authorize:"read",
+ includes_all_project:0
+ })
+ },[])
+
useEffect(() => {
if (GroupDetail) {
setOnwers(GroupDetail.authorize === "owner");
+ setAuth(GroupDetail.authorize);
setCheckBox(GroupDetail.can_create_org_project)
setSwtichBox(GroupDetail.units)
setFieldsValue({
- ...GroupDetail
+ ...GroupDetail,
+ includes_all_project:GroupDetail.includes_all_project ? 1 :0
})
setDescNum(GroupDetail.description ? GroupDetail.description.length : 0);
}
@@ -50,6 +61,7 @@ export default Form.create()(
setSwtichBoxPull(switch_checked("pulls"))
setSwtichBoxIssue(switch_checked("issues"))
setSwtichBoxRelease(switch_checked("releases"))
+ setSwtichBoxWiki(switch_checked("wiki"))
}
}, [switch_box])
@@ -68,11 +80,13 @@ export default Form.create()(
setIsSpin(true)
validateFields((error, values) => {
if (!error) {
- values.unit_types = switch_box
+ // values.unit_types = switch_box
+ values.unit_types = ['code','pulls','issues','releases','wiki'];
if (groupId) { // 表示编辑,否则为新建
const url = `/organizations/${OIdentifier}/teams/${groupId}.json`;
axios.put(url, {
- ...values
+ ...values,
+ includes_all_project:values.includes_all_project === 1?true:false
}).then(result => {
if (result && result.data) {
showNotification("基本设置更新成功!");
@@ -82,7 +96,8 @@ export default Form.create()(
} else {
const url = `/organizations/${OIdentifier}/teams.json`;
axios.post(url, {
- ...values
+ ...values,
+ includes_all_project:values.includes_all_project === 1?true:false
}).then(result => {
if (result && result.data) {
showNotification("团队创建成功!");
@@ -132,6 +147,11 @@ export default Form.create()(
setSwtichBoxRelease(checked)
}
+ function switch_wiki_types(checked, event) {
+ switch_unit_types(checked, "wiki");
+ setSwtichBoxWiki(checked);
+ }
+
function cancelEdit(){
if(groupId){
history.push(`/organize/${OIdentifier}/group/${groupId}`);
@@ -140,6 +160,9 @@ export default Form.create()(
}
}
+ function changeAuth(params) {
+ setAuth(params.target.value)
+ }
function checkname(rule, value, callback){
if(!value){
@@ -192,8 +215,8 @@ export default Form.create()(
"includes_all_project",
[],
- 指定项目(团队成员将只能访问添加到团队的项目。 选择此项 将不会 自动删除已经添加的项目)
- 所有项目(团队可以访问所有项目。选择此选项将 添加所有现有的 项目到指定团队)
+ 指定项目(团队成员将只能访问添加到团队的项目。 选择此项 将不会 自动删除已经添加的项目)
+ 所有项目(团队可以访问所有项目。选择此选项将 添加所有现有的 项目到指定团队)
, false, 0,onwers ? "hide":""
)}
{helper(
@@ -202,37 +225,42 @@ export default Form.create()(
[],
新建项目(成员可以在组织中新建项目。创建者将自动获得新建的项目的管理员权限), false, 20,onwers ? "hide":""
)}
- {/* {helper(
+ {helper(
'版本库权限:',
"authorize",
[],
-
+
读取权限(成员可以查看和克隆团队项目)
写入权限(成员可以查看和推送提交到团队项目)
管理员权限(成员可以拉取和推送到团队项目同时可以添加协作者)
, false, 20,onwers ? "hide":""
- )} */}
+ )}
- {/* 允许访问项目单元:
-
-
- 代码库(查看源码、文件、提交和分支)
-
-
-
- 任务(组织 bug 报告、任务和里程碑)
-
-
-
- 合并请求(启用合并请求和代码评审)
-
-
-
- 版本发布(跟踪项目版本和下载)
-
- */}
+ {/*
+
允许访问项目单元:
+
+
+ 代码库(查看源码、文件、提交和分支)
+
+
+
+ 任务(组织 bug 报告、任务和里程碑)
+
+
+
+ 合并请求(启用合并请求和代码评审)
+
+
+
+ 版本发布(跟踪项目版本和下载)
+
+
+
+ wiki(编辑此仓库的相关文档说明)
+
+
*/}
- cancelEdit()}>取消
+ cancelEdit()}>取消
diff --git a/src/forge/Team/Index.scss b/src/forge/Team/Index.scss
index a046f99d..11237973 100644
--- a/src/forge/Team/Index.scss
+++ b/src/forge/Team/Index.scss
@@ -368,5 +368,5 @@
}
}
.hide{
- display: hidden;
+ display: none;
}
\ No newline at end of file
diff --git a/src/forge/Team/List.jsx b/src/forge/Team/List.jsx
index b43fb75d..8cf96587 100644
--- a/src/forge/Team/List.jsx
+++ b/src/forge/Team/List.jsx
@@ -75,7 +75,7 @@ function List(props){
- { organizeDetail && organizeDetail.is_admin ?
+ { organizeDetail && organizeDetail.can_create_project ?
+ 新建项目
diff --git a/src/forge/Team/RightBox.jsx b/src/forge/Team/RightBox.jsx
index 0603a454..daa339f2 100644
--- a/src/forge/Team/RightBox.jsx
+++ b/src/forge/Team/RightBox.jsx
@@ -97,7 +97,12 @@ function RightBox({ OIdentifier , history , admin }) {
return(
-
{item.name}
+ {
+ (item.is_admin || item.is_member) ?
+
{item.name}
+ :
+
{item.name}
+ }
{item.num_users}名成员
{item.num_projects}个仓库
diff --git a/src/forge/Team/Setting/TeamSettingCommon.jsx b/src/forge/Team/Setting/TeamSettingCommon.jsx
index 5be03db0..e52361ad 100644
--- a/src/forge/Team/Setting/TeamSettingCommon.jsx
+++ b/src/forge/Team/Setting/TeamSettingCommon.jsx
@@ -168,7 +168,7 @@ export default Form.create()(
'权限:',
"repo_admin_change_team_access",
[],
- 仓库管理员可以添加或移除团队的访问权限,false,true
+ 项目管理员可以添加或移除团队的访问权限,false,true
)}
{helper(
diff --git a/src/forge/Team/TeamGroupItems.jsx b/src/forge/Team/TeamGroupItems.jsx
index e96a310d..f3f5b876 100644
--- a/src/forge/Team/TeamGroupItems.jsx
+++ b/src/forge/Team/TeamGroupItems.jsx
@@ -75,7 +75,12 @@ function TeamGroupItems({organizeDetail,limit, count , history}){
return(
- {item.nickname}
+ {
+ (item.is_admin || item.is_member) ?
+ {item.nickname}
+ :
+ {item.nickname}
+ }
{ item.is_admin && item.authorize!=="owner" && disMissGroup(item.id)}>解散团队}
{ item.is_member && }
diff --git a/src/forge/Version/version.js b/src/forge/Version/version.js
index 99223e1d..6f81b77c 100644
--- a/src/forge/Version/version.js
+++ b/src/forge/Version/version.js
@@ -58,6 +58,9 @@ class version extends Component {
renderList = (releases) => {
const { projectsId , owner } = this.props.match.params;
+ const { isManager , isDeveloper } = this.props;
+ const type = this.props.projectDetail && this.props.projectDetail.type;
+
if (releases && releases.length > 0) {
return (
releases.map((item, key) => {
@@ -74,7 +77,10 @@ class version extends Component {
{item.name}
- (编辑)
+ {
+ (isManager || isDeveloper) && type !==2 &&
+ (编辑)
+ }
this.showBody(key,item.bodyshow)}>
@@ -100,14 +106,14 @@ class version extends Component {
render() {
const { projectsId ,owner } = this.props.match.params;
- const { data , releases , isSpin } = this.state
-
+ const { data , releases , isSpin } = this.state;
+ const type = this.props.projectDetail && this.props.projectDetail.type;
return (
版本发布
{
- data && data.user_permission ?
+ data && data.user_permission && type !== 2 ?
+ 发布新版
: ''
}
diff --git a/src/forge/Wiki/EditWiki.jsx b/src/forge/Wiki/EditWiki.jsx
new file mode 100644
index 00000000..ae30b446
--- /dev/null
+++ b/src/forge/Wiki/EditWiki.jsx
@@ -0,0 +1,223 @@
+import React, { useEffect, useCallback, useState } from 'react';
+import { Button, Checkbox, Form, Icon, Radio, Input, message } from 'antd';
+import MDEditor from "../../modules/tpm/challengesnew/tpm-md-editor";
+import DelModal from './components/ModalFun';
+import { weekModal, monthModal } from './components/config';
+import { getWiki, wikiPages, addWiki, updateWiki } from './api';
+import './Index.scss';
+
+
+export default Form.create()(({ form, history, showNotification, projectDetail, match, project }) => {
+ // const permission = projectDetail && projectDetail.permission !== "Reporter";
+ const permission = projectDetail && projectDetail.permission && projectDetail.permission !== "Reporter";
+
+ const { getFieldDecorator, validateFields, setFieldsValue } = form;
+ const [fileArrInit, setFileArrInit] = useState(null);
+ let projectsId = match.params.projectsId;
+ let owner = match.params.owner;
+
+ let wikiName = history.location.pathname.split('/').pop();
+ if (wikiName === 'add') {
+ wikiName = '';
+ }
+
+ const [content, setContent] = useState(undefined);
+ const [modal, setModal] = useState(false);
+ const [modalType, setModalType] = useState();
+
+
+ useEffect(() => {
+ wikiName && project && getWiki({
+ owner,
+ repo: projectsId,
+ pagename: wikiName,
+ projectId: project.id
+ }).then(res => {
+ if (res && res.data) {
+ setContent(res.data.md_content);
+ setFieldsValue({
+ name: res.data.name,
+ content: res.data.md_content,
+ });
+ }
+ });
+ }, [owner, wikiName]);
+
+ // 加载wiki列表
+ useEffect(() => {
+ project && wikiPages({
+ owner: owner,
+ repo: projectsId,
+ projectId: project.id
+ }).then(res => {
+ if (res && res.message === "200" && Array.isArray(res.data)) {
+ setFileArrInit(res.data);
+ } else {
+ setFileArrInit([]);
+ }
+ });
+ }, [project]);
+
+ const helper = useCallback(
+ (label, name, rules, widget, initialValue, rightComponent) => (
+
+ {getFieldDecorator(name, { rules, initialValue, validateFirst: true, })(widget)}
+ {rightComponent}
+
+ ), []);
+
+
+ function onContentChange(value) {
+ setContent(value);
+ setFieldsValue({
+ content: value
+ });
+ };
+
+ // 保存wiki文件,包括新增和修改
+ function saveFile() {
+ validateFields((err, values) => {
+ if (!err) {
+ let regEn = /[\[\]`\/:*?''<>|%-+_]/g;
+ if (regEn.test(values.name)) {
+ message.error('文件名不能有特殊字符');
+ return;
+ }
+ if (wikiName) {
+ updateWiki({
+ owner,
+ repo: projectsId,
+ projectId: project.id,
+ pagename: wikiName,
+ ...values,
+ commit_message: '',
+ }).then(res => dealRes(res));
+ } else {
+ if (Array.isArray(fileArrInit)) {
+ for (const item of fileArrInit) {
+ if (item.name === values.name) {
+ message.error('不能与已有文件标题相同');
+ return false;
+ }
+ }
+ }
+ addWiki({
+ owner,
+ repo: projectsId,
+ projectId: project.id,
+ pagename: values.name,
+ ...values,
+ commit_message: '',
+ }).then(res => dealRes(res));
+ }
+ }
+ })
+ }
+
+ function dealRes(res) {
+ if (res && res.message === "200") {
+ showNotification("操作成功");
+ goBack();
+ } else if (res && res.message === "500") {
+ message.error('请检查格式是否正确或文件名是否重复');
+ } else {
+ showNotification(res.message || "操作失败");
+ }
+ }
+
+ function goBack() {
+ history.push(`/projects/${owner}/${projectsId}/wiki`);
+ }
+
+ function changeModal(e) {
+ setModal(e.target.checked);
+ if (!e.target.checked) {
+ setModalType();
+ }
+ }
+
+ function changeModalType(e) {
+ let value = e.target.value;
+ if (!content) {
+ setModalContent(value);
+ return;
+ }
+ DelModal({
+ title: '添加模版',
+ contentTitle: `您确定要添加“${value}”模板吗`,
+ content: `此操作会将“${value}”模板替换编辑栏内所有内容,请确认以防文件的丢失`,
+ okText: '确认添加',
+ onOk: () => {
+ setModalType(value);
+ setModal(true);
+ setModalContent(value);
+ }
+ });
+ }
+
+ function setModalContent(value) {
+ if (value === '周报') {
+ setContent(weekModal);
+ setFieldsValue({
+ content: weekModal
+ });
+ } else if (value === '月报') {
+ setContent(monthModal);
+ setFieldsValue({
+ content: monthModal
+ });
+ }
+ }
+
+
+ return (
+
+
+ Wiki 编辑页面
+
+
+
+
标题
+ {helper(
+ "",
+ "name",
+ [
+ { required: true, message: "请输入标题" },
+ // { pattern: /[^`\[\]\/:*?''<>|%-+_]/g, message: '不允许部分特殊字符' }
+ ],
+
+ )}
+
+
+
+ {getFieldDecorator('content', {
+ rules: [{ required: true, message: "请输入wiki内容" }],
+ validateFirst: true
+ })()}
+
+
+ 添加模版
+
+
+ 周报
+ 月报
+
+
+
+
+ {permission &&
}
+
+
+ )
+})
\ No newline at end of file
diff --git a/src/forge/Wiki/Index.jsx b/src/forge/Wiki/Index.jsx
new file mode 100644
index 00000000..c27879b2
--- /dev/null
+++ b/src/forge/Wiki/Index.jsx
@@ -0,0 +1,283 @@
+import React, { useEffect, useCallback, useState } from 'react';
+import { Button, Dropdown, Icon, Input, Menu, Tooltip, Select, Upload, message, Spin } from 'antd';
+import { getImageUrl, timeAgo } from 'educoder';
+import cookie from 'react-cookies';
+import CopyTool from '../Component/CopyTool';
+import DelModal from './components/ModalFun';
+import Welcome from './Welcome';
+import { wikiPages, getWiki, deleteWiki } from './api';
+import { httpUrl, TokenKey } from './fetch';
+import './Index.scss';
+import { isArray } from 'lodash';
+const Search = Input.Search;
+const InputGroup = Input.Group;
+const { Option } = Select;
+
+export default (props) => {
+ const { match, history, showNotification, project, projectDetail } = props;
+ const permission = projectDetail && projectDetail.permission && projectDetail.permission !== "Reporter";
+
+ let projectsId = match.params.projectsId;
+ let owner = match.params.owner;
+
+ const [fileArrInit, setFileArrInit] = useState(null);
+ const [checkItem, setCheckItem] = useState({});
+ const [itemDetail, setItemDetail] = useState({});
+
+ const [fileArr, setFileArr] = useState([]);
+ const [reload, setReload] = useState();
+
+ const [urlType, setUrlType] = useState('HTTPS');
+
+ // 加载wiki列表
+ useEffect(() => {
+ project && wikiPages({
+ owner: owner,
+ repo: projectsId,
+ projectId: project.id
+ }).then(res => {
+ if (res && res.message === "200" && isArray(res.data)) {
+ setFileArr(res.data);
+ setFileArrInit(res.data);
+ if (res.data.length) {
+ setCheckItem(res.data[0]);
+ };
+ } else {
+ setFileArr([]);
+ setFileArrInit([]);
+ }
+ });
+ }, [project, reload])
+
+ // 加载单个wiki详情,参数尽量用驼峰,此处由于后端太麻烦所以不标准
+ useEffect(() => {
+ project && checkItem.name && getWiki({
+ owner: owner,
+ repo: projectsId,
+ pagename: checkItem.name,
+ projectId: project.id
+ }).then(res => {
+ if (res && res.message === "200") {
+ setItemDetail(res.data);
+ } else {
+ showNotification("加载失败")
+ }
+ });
+ }, [project, checkItem]);
+
+ function changeSearchValue(e) {
+ let value = e.target.value;
+ let newFileArr = [];
+ for (const item of fileArrInit) {
+ if (item.name.indexOf(value) > -1) {
+ newFileArr.push(item);
+ }
+ }
+ setFileArr(newFileArr);
+ }
+
+ // 删除wiki模态框
+ function deleteFileModal(e, item) {
+ e.stopPropagation();
+ DelModal({
+ title: '删除页面',
+ contentTitle: `您确定要删除“${item.name}”此页面吗?`,
+ content: '此操作将删除该页面,请进行确认以防文件的丢失',
+ onOk: () => {
+ deleteWiki({
+ owner: owner,
+ repo: projectsId,
+ pagename: item.name,
+ projectId: project.id
+ }).then(res => {
+ if (res && res.message === "200") {
+ message.success('删除成功');
+ setReload(Math.random());
+ } else {
+ message.error('删除失败');
+ }
+ });
+ }
+ });
+ }
+
+
+ function goUser(login) {
+ window.location.href = `/users/${login}`;
+ }
+
+ function addFile() {
+ history.push(`/projects/${owner}/${projectsId}/wiki/add`);
+ }
+
+ function goEdit() {
+ history.push(`/projects/${owner}/${projectsId}/wiki/edit/${encodeURI(checkItem.name)}`);
+ }
+
+ function preview() {
+ window.open(`/projects/${owner}/${projectsId}/wiki/preview/${encodeURI(project.name)}/${project.id}`);
+ }
+
+ // 支持 Markdown,Html,Pdf格式文件
+ const menu = (
+
+ );
+
+ function downloadWiki(type) {
+ window.open(`${httpUrl}/api/wikiExport/wikiExport-wrapper?repoName=${projectsId}&owner=${owner}&type=${type}&projectName=${project.name}&projectId=${project.id}`);
+ }
+
+ function beforeUpload(file) {
+ if (!['md', 'txt'].includes(file.name.split('.').pop())) {
+ message.error('只能上传md、txt文件');
+ return false;
+ }
+
+ let regEn = /[\[\]`\/:*?''<>|%-+_]/g;
+ if (regEn.test(file.name)) {
+ message.error('文件名不能有特殊字符');
+ return;
+ }
+
+ for (const item of fileArrInit) {
+ if (item.name === file.name) {
+ message.error('不能上传与已有文件相同文件名的文件');
+ return false;
+ }
+ }
+ const isLt100M = file.size / 1024 / 1024 < 100;
+ if (!isLt100M) {
+ showNotification(`文件大小必须小于${100}MB!`);
+ }
+ return isLt100M;
+ }
+
+ const uploadProps = {
+ name: 'multipartFile',
+ withCredentials: true,
+ action: `${httpUrl}/api/wikiExport/uploadWiki/${owner}/${projectsId}/${project && project.id}`, //?token=${sessionStorage.taskToken}
+ showUploadList: false,
+ headers: {
+ Authorization: cookie.load(TokenKey) || sessionStorage.taskToken,
+ },
+ beforeUpload: beforeUpload,
+ onChange(info) {
+ if (info.file.status === 'uploading') {
+ console.log(info.file, info.fileList);
+ }
+ if (info.file.status === 'done') {
+ if (info.file.response.message === '200') {
+ message.success(`${info.file.name} 上传成功`);
+ setReload(Math.random());
+ } else if (info.file.response.message === '500') {
+ let data = JSON.parse(info.file.response.data);
+ message.error(data && data.message ? data.message : '文件上传失败');
+ } else {
+ message.error('文件上传失败');
+ }
+ } else if (info.file.status === 'error') {
+ message.error(`${info.file.name} 上传失败`);
+ }
+ },
+ };
+
+ return (
+ < Spin spinning={!fileArrInit} className="opacitySpin">
+ {fileArrInit && fileArrInit.length ?
+
+
+
+
+ {
+ permission ?
+
+ : "Wiki文档"
+ }
+
+
+ {
+ permission &&
+
+
+
+
+
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {
+ fileArr.map(item => {
+ return
+
{ setCheckItem(item) }}>
+
+
+ {item.name}
+
+ {permission &&
{ deleteFileModal(e, item) }}>}
+
+
+ })
+ }
+
+
+
+ {checkItem.wiki_clone_link &&
+
+
+
+ }
+
+
+
+
+
+
+
{checkItem.name}
+
{ checkItem.commit && goUser(checkItem.commit.author.name) }}>
+ {itemDetail.image_url &&
}
+ {itemDetail.userName}
+
+
上次修改于{checkItem.commit && timeAgo(checkItem.commit.author.when)}
+
+ {permission &&
}
+
+
+
+
+
+
+ :
+
+ }
+
+ )
+}
diff --git a/src/forge/Wiki/Index.scss b/src/forge/Wiki/Index.scss
new file mode 100644
index 00000000..e40de299
--- /dev/null
+++ b/src/forge/Wiki/Index.scss
@@ -0,0 +1,381 @@
+$wikiColor: #466aff;
+$primaryBtnHover: #6482ff;
+body {
+ width: 100% !important;
+}
+.ant-spin-nested-loading > div > .ant-spin.opacitySpin{
+ max-height: 100vh;
+ background: rgba(255,255,255,1);
+}
+.wiki-main {
+ width: 1200px;
+ min-height: 400px;
+ margin: 20px auto;
+
+ .ant-btn-primary {
+ background-color: $wikiColor;
+ border-color: $wikiColor;
+ &:hover,
+ &:focus,
+ &:active {
+ background-color: $primaryBtnHover;
+ }
+ }
+
+ .ant-btn-default:hover,
+ .ant-btn-default:active,
+ .ant-btn-default:focus {
+ background: #f3f4f6;
+ color: #333;
+ border-color: #d0d0d0;
+ }
+
+ .wiki-head {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 0 20px;
+ height: 64px;
+ background: #fafcff;
+ box-shadow: 0px 1px 4px 0px rgba(0, 0, 0, 0.13);
+ border-radius: 4px;
+ border-bottom-left-radius: 0;
+ .ant-btn .anticon {
+ margin: 0 -3px 0 0;
+ }
+ }
+
+ .head-title {
+ font-size: 20px;
+ color: #05101a;
+ line-height: 30px;
+ font-weight: 500;
+
+ .anticon-right {
+ color: #666;
+ font-size: 0.9rem;
+ }
+ }
+
+ .back-wiki {
+ color: $wikiColor;
+ cursor: pointer;
+ &:hover {
+ color: $primaryBtnHover;
+ }
+ }
+
+ .head-log-middle {
+ width: 3rem;
+ height: 3rem;
+ margin-right: 0.35rem;
+ border-radius: 50%;
+ }
+
+ .head-log-small {
+ width: 1.25rem;
+ height: 1.25rem;
+ margin-right: 0.35rem;
+ border-radius: 50%;
+ }
+
+ .user-box {
+ font-size: 12px;
+ font-family: "PingFangSC-Medium";
+ color: $wikiColor;
+ cursor: pointer;
+ &:hover {
+ color: $primaryBtnHover;
+ }
+ .head-log-small {
+ position: relative;
+ top: -2px;
+ }
+ }
+
+ .time-ago {
+ font-size: 12px;
+ color: #333;
+ letter-spacing: 0;
+ line-height: 17px;
+ font-weight: 400;
+ font-family: "PingFangSC-Regular";
+ }
+
+ .has-error .ant-form-explain,
+ .has-error .ant-form-split {
+ position: absolute;
+ }
+ .wiki-nav {
+ max-height: 60vh;
+ .wiki-search {
+ padding: 0 14px;
+ .ant-input {
+ padding-left: 30px;
+ }
+ .ant-input-suffix {
+ left: 26px;
+ right: auto;
+ }
+ &:hover .ant-input,
+ &:focus .ant-input {
+ border-color: $wikiColor !important;
+ }
+ }
+ }
+
+ .wiki-nav-parent {
+ width: 260px;
+ flex: none;
+ }
+
+ .ant-form-item-children .ant-input:hover {
+ border-color: $wikiColor !important;
+ }
+
+ .ant-checkbox-checked .ant-checkbox-inner {
+ background-color: $wikiColor;
+ border-color: $wikiColor;
+ }
+ .ant-radio-checked .ant-radio-inner,
+ .ant-radio-checked::after {
+ border-color: $wikiColor;
+ }
+
+ .ant-radio-inner::after {
+ background-color: $wikiColor;
+ }
+
+ .ant-radio-group {
+ display: block;
+ margin: 10px 0 0 30px;
+ }
+
+ .ant-radio-wrapper:hover .ant-radio,
+ .ant-radio:hover .ant-radio-inner,
+ .ant-radio-input:focus + .ant-radio-inner {
+ border-color: $wikiColor;
+ }
+}
+
+#wikiUrl:focus {
+ border-right: 1px solid #d9d9d9 !important;
+}
+
+.wiki-body {
+ display: flex;
+}
+
+.wiki-content {
+ flex: auto;
+ width: 75%;
+}
+
+.wiki-content-detail {
+ padding: 0 20px;
+ word-break: break-all;
+}
+
+.ant-input-group.ant-input-group-compact.copy-url {
+ display: flex;
+ margin-top: 20px;
+ .ant-select-selection__rendered {
+ margin: 0 14px 0 5px;
+ width: 3rem;
+ font-size: 12px;
+ }
+ .ant-select-arrow {
+ right: 4px;
+ }
+ .ant-input {
+ font-size: 12px;
+ font-family: "PingFangSC-Regular";
+ color: #666;
+ letter-spacing: 0;
+ font-weight: 400;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ word-break: break-all;
+ }
+
+ .copy-wiki {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ padding: 0 5px;
+ background: #fff;
+ font-size: 1rem !important;
+ border: 1px solid #d9d9d9;
+ border-left: 0;
+ color: $wikiColor;
+ cursor: pointer;
+ }
+}
+
+.wiki-url-type {
+ .ant-select-dropdown-menu-item {
+ font-size: 12px;
+ }
+}
+
+.wiki-nav {
+ min-height: 300px;
+ padding: 20px 0;
+ background: #ffffff;
+ border: 1px solid rgba(153, 153, 153, 0.22);
+ overflow-y: scroll;
+ flex: none;
+ color: #333;
+}
+
+.wiki-nav-title {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ height: 50px;
+ padding: 0 10px 0 10px;
+ font-size: 14px;
+ letter-spacing: 0;
+ font-weight: 400;
+ font-family: "PingFangSC-Regular";
+ border-bottom: 1px solid #eee;
+ line-height: 16px;
+ cursor: pointer;
+
+ .delete-title-icon {
+ display: none;
+ }
+
+ &:hover {
+ background-color: #fbfbfb;
+ .delete-title-icon {
+ display: inline-block;
+ }
+ }
+}
+
+.wiki-nav-title-parent {
+ padding: 0 14px;
+ &:hover {
+ background: #fbfbfb;
+ }
+}
+
+.wiki-nav-title.active {
+ color: $wikiColor;
+}
+
+.wiki-content-head {
+ margin: 20px 0 20px 20px;
+ padding: 0 20px 20px 0;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ border-bottom: 1px solid #eee;
+}
+
+.wiki-content-head-left {
+ width: 90%;
+}
+
+.nav-title-left {
+ display: inline-flex;
+ max-width: 90%;
+ svg {
+ margin-right: 0.5rem;
+ flex: none;
+ }
+ .nav-title-left-text {
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ }
+}
+
+.wiki-detail-title {
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+}
+// 预览页面样式文件
+.wiki-preview {
+ overflow-y: scroll;
+ height: 100%;
+ .wiki-body {
+ width: 90%;
+ }
+ .ant-btn-primary {
+ background-color: $wikiColor;
+ border-color: $wikiColor;
+ &:hover,
+ &:focus,
+ &:active {
+ background-color: $primaryBtnHover;
+ }
+ }
+ .preview-head {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 0 12rem 0 2rem;
+ width: 100%;
+ height: 80px;
+ background: rgb(39, 47, 76);
+ color: #fff;
+ }
+
+ .preview-head-left {
+ display: inline-flex;
+ align-items: center;
+ font-size: 24px;
+ cursor: pointer;
+
+ .icon-wendangyulan_icon {
+ font-size: 24px !important;
+ font-weight: 700;
+ }
+ }
+
+ .preview-head-right {
+ display: flex;
+
+ .copy-url {
+ margin-top: 0;
+ }
+ .copy-desc {
+ width: 6rem;
+ padding-top: 1px;
+ }
+ }
+
+ .wiki-nav-title {
+ padding: 0 10px 0 40px;
+ }
+ .wiki-nav-title.active {
+ background-color: #f3f4f6;
+ }
+
+ .wiki-content-head {
+ padding: 10px 20px 10px 20px;
+ }
+
+ .wiki-nav {
+ padding: 20px 0;
+ width: 20vw;
+ border-bottom: 0;
+ height: 80vh;
+ }
+ .wiki-content-detail {
+ padding: 0 40px;
+ img {
+ max-width: 100%;
+ }
+ }
+
+ .ant-btn:hover {
+ background: #f3f4f6;
+ color: #333;
+ border-color: #d0d0d0;
+ }
+}
diff --git a/src/forge/Wiki/Preview.jsx b/src/forge/Wiki/Preview.jsx
new file mode 100644
index 00000000..e7c6a623
--- /dev/null
+++ b/src/forge/Wiki/Preview.jsx
@@ -0,0 +1,146 @@
+import React, { useEffect, useCallback, useState } from 'react';
+import { Input, Button, Select, Dropdown, Icon, Menu, message } from 'antd';
+import CopyTool from '../Component/CopyTool';
+import { wikiPages, getWiki, } from './api';
+import { httpUrl } from './fetch';
+import './Index.scss';
+const InputGroup = Input.Group;
+const { Option } = Select;
+
+export default (props) => {
+
+ const { match, history, showNotification, project, projectDetail } = props;
+ const permission = projectDetail && projectDetail.permission && projectDetail.permission !== "Reporter";
+
+ let projectsId = match.params.projectsId;
+ let owner = match.params.owner;
+
+ let projectName = match.params.projectName;
+ let projectId = match.params.projectId;
+
+ console.log('projectName:');
+ console.log(projectName);
+
+ const [checkItem, setCheckItem] = useState({});
+ const [itemDetail, setItemDetail] = useState({});
+
+ const [fileArr, setFileArr] = useState([]);
+ const [urlType, setUrlType] = useState('HTTPS');
+
+ useEffect(() => {
+ projectsId && wikiPages({
+ owner: owner,
+ repo: projectsId,
+ projectId: projectId,
+ }).then(res => {
+ if (res && res.message === "200") {
+ setFileArr(res.data);
+ if (res.data.length) {
+ setCheckItem(res.data[0]);
+ };
+ } else {
+ showNotification("加载失败")
+ }
+ });
+ }, [project])
+
+
+ useEffect(() => {
+ projectsId && checkItem.name && getWiki({
+ owner: owner,
+ repo: projectsId,
+ pagename: checkItem.name,
+ projectId: projectId,
+ }).then(res => {
+ if (res && res.message === "200") {
+ setItemDetail(res.data);
+ } else {
+ showNotification("加载失败")
+ }
+ });
+ }, [project, checkItem]);
+
+ function goEdit() {
+ history.push(`/projects/${owner}/${projectsId}/wiki/edit/${checkItem.name}`);
+ }
+
+ function goBack() {
+ history.push(`/projects/${owner}/${projectsId}/wiki`);
+ }
+
+ // 支持 Markdown,Html,Pdf格式文件
+ const menu = (
+
+ );
+
+ function downloadWiki(type) {
+ window.open(`${httpUrl}/api/wikiExport/wikiExport-wrapper?repoName=${projectsId}&owner=${owner}&type=${type}&projectName=${projectName}&projectId=${projectId}`);
+ }
+
+
+ return (
+
+
+
+
+ {projectName}
+
+
+ 克隆地址
+ {
+ checkItem.wiki_clone_link &&
+
+
+
+
+ }
+
+
+
+
+
+
+
+
+
+
+ {
+ fileArr.map(item => {
+ return
{ setCheckItem(item) }}>
+
+
+ {item.name}
+
+
+ })
+ }
+
+
+
+
+
+
{checkItem.name}
+ {permission && }
+
+
+
+
+
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/src/forge/Wiki/Welcome/index.jsx b/src/forge/Wiki/Welcome/index.jsx
new file mode 100644
index 00000000..78cd34e4
--- /dev/null
+++ b/src/forge/Wiki/Welcome/index.jsx
@@ -0,0 +1,50 @@
+import React from 'react';
+import { Button } from 'antd';
+// import { addWiki } from '../api';
+import './index.scss';
+
+export default ({ project, isManager, history, showNotification, match, reloadList }) => {
+
+ let projectsId = match.params.projectsId;
+ let owner = match.params.owner;
+
+ // function addFile() {
+ // addWiki({
+ // owner,
+ // repo: projectsId,
+ // pagename: 'Home',
+ // name: 'Home',
+ // content: 'Welcome to the wiki!',
+ // commit_message: '',
+ // }).then(res => {
+ // if (res.message === "200") {
+ // reloadList(Math.random());
+ // showNotification("创建成功");
+ // } else {
+ // showNotification("创建失败");
+ // }
+ // });
+ // }
+
+ function addFile() {
+ history.push(`/projects/${owner}/${projectsId}/wiki/add`);
+ }
+
+ return (
+
+
+
欢迎使用
+
+ {project && project.name}
+
+ Wiki
+
Wiki主要是您项目的产品设计、文档描述、注释等等
+
+
+ {
+ isManager ?
+ :
该项目暂时没有创建Wiki
+ }
+
+ )
+}
\ No newline at end of file
diff --git a/src/forge/Wiki/Welcome/index.scss b/src/forge/Wiki/Welcome/index.scss
new file mode 100644
index 00000000..b931fa62
--- /dev/null
+++ b/src/forge/Wiki/Welcome/index.scss
@@ -0,0 +1,55 @@
+.welcome-main {
+ display: flex;
+ flex-flow: column nowrap;
+ justify-content: center;
+ align-items: center;
+ width: 1200px;
+ min-height: 400px;
+ padding: 20px;
+ margin: 20px auto;
+ background: rgba(250, 252, 255, 1);
+ font-family: "PingFangSC-Medium";
+ border-radius: 4px;
+ border: 1px solid rgba(42, 97, 255, 0.23);
+
+ .icon-huanying_icon {
+ font-size: 48px !important;
+ font-weight: 700;
+ }
+
+ .welcome-title {
+ display: inline-flex;
+ align-items: center;
+ margin: 10px 0;
+ font-size: 26px;
+ color: #333333;
+ font-weight: 500;
+ }
+
+ .wiki-title {
+ display: inline-block;
+ max-width: 20em;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+
+ .welcome-content {
+ font-size: 14px;
+ color: #333333;
+ font-weight: 400;
+ }
+
+ .wiki-line {
+ margin: 50px 0 40px;
+ width: 400px;
+ height: 1px;
+ background: #eeeeee;
+ }
+
+ .welcome-des {
+ font-size: 16px;
+ color: #333333;
+ font-weight: 500;
+ }
+}
diff --git a/src/forge/Wiki/api.js b/src/forge/Wiki/api.js
new file mode 100644
index 00000000..35338322
--- /dev/null
+++ b/src/forge/Wiki/api.js
@@ -0,0 +1,48 @@
+import fetch from './fetch';
+// import { notification } from 'antd';
+
+// 获取wiki列表
+export function wikiPages(params) {
+ return fetch({
+ url: '/api/wiki/wikiPages',
+ method: 'get',
+ params
+ });
+}
+
+// 获取单个wiki
+export function getWiki(params) {
+ return fetch({
+ url: '/api/wiki/getWiki',
+ method: 'get',
+ params
+ });
+}
+
+//新增wiki
+export function addWiki(data) {
+ return fetch({
+ url: '/api/wiki/createWiki',
+ method: 'post',
+ data: data
+ });
+}
+
+//更新wiki
+export function updateWiki(data) {
+ return fetch({
+ url: '/api/wiki/updateWiki',
+ method: 'PUT',
+ data: data
+ });
+}
+
+//删除wiki
+export function deleteWiki(data) {
+ return fetch({
+ url: '/api/wiki/deleteWiki',
+ method: 'DELETE',
+ data,
+ });
+}
+
diff --git a/src/forge/Wiki/components/FolderTree/index.js b/src/forge/Wiki/components/FolderTree/index.js
new file mode 100644
index 00000000..bbcdb390
--- /dev/null
+++ b/src/forge/Wiki/components/FolderTree/index.js
@@ -0,0 +1,244 @@
+import * as React from 'react';
+import classNames from 'classnames';
+import { Icon, Tree } from 'antd';
+import omit from 'omit.js';
+import debounce from 'lodash/debounce';
+import { conductExpandParent, convertTreeToEntities } from 'rc-tree/lib/util';
+import { polyfill } from 'react-lifecycles-compat';
+import { ConfigConsumer } from '../../../../../node_modules/antd/lib/config-provider';
+import {
+ calcRangeKeys,
+ getFullKeyList,
+ convertDirectoryKeysToNodes,
+ getFullKeyListByTreeData,
+} from '../../../../../node_modules/antd/lib/tree/util';
+
+import { FolderSvg, FolderExpandSvg, FileSvg } from '../../Svg';
+import './index.scss';
+
+
+function getIcon(props) {
+ // console.log(props);
+ // console.log(props.expanded);
+ const { isLeaf, expanded ,selected} = props;
+ if (isLeaf) {
+ return
;
+ }
+ return expanded ?
:
+ // return
+}
+
+class DirectoryTree extends React.Component {
+ static defaultProps = {
+ showIcon: true,
+ expandAction: 'click',
+ };
+
+ static getDerivedStateFromProps(nextProps) {
+ const newState = {};
+ if ('expandedKeys' in nextProps) {
+ newState.expandedKeys = nextProps.expandedKeys;
+ }
+ if ('selectedKeys' in nextProps) {
+ newState.selectedKeys = nextProps.selectedKeys;
+ }
+ return newState;
+ }
+
+ // state: DirectoryTreeState;
+
+ // tree: Tree;
+
+ // onDebounceExpand: (event: React.MouseEvent, node: AntTreeNode) => void;
+
+ // Shift click usage
+ // lastSelectedKey?: string;
+
+ // cachedSelectedKeys?: string[];
+
+ constructor(props) {
+ super(props);
+
+ const {
+ defaultExpandAll,
+ defaultExpandParent,
+ expandedKeys,
+ defaultExpandedKeys,
+ children,
+ } = props;
+ const { keyEntities } = convertTreeToEntities(children);
+
+ // Selected keys
+ this.state = {
+ selectedKeys: props.selectedKeys || props.defaultSelectedKeys || [],
+ };
+
+ // Expanded keys
+ if (defaultExpandAll) {
+ if (props.treeData) {
+ this.state.expandedKeys = getFullKeyListByTreeData(props.treeData);
+ } else {
+ this.state.expandedKeys = getFullKeyList(props.children);
+ }
+ } else if (defaultExpandParent) {
+ this.state.expandedKeys = conductExpandParent(
+ expandedKeys || defaultExpandedKeys,
+ keyEntities,
+ );
+ } else {
+ this.state.expandedKeys = expandedKeys || defaultExpandedKeys;
+ }
+
+ this.onDebounceExpand = debounce(this.expandFolderNode, 200, {
+ leading: true,
+ });
+ }
+
+ onExpand = (expandedKeys, info) => {
+ const { onExpand } = this.props;
+
+ this.setUncontrolledState({ expandedKeys });
+
+ // Call origin function
+ if (onExpand) {
+ return onExpand(expandedKeys, info);
+ }
+
+ return undefined;
+ };
+
+ onClick = (event, node) => {
+ const { onClick, expandAction } = this.props;
+
+ // Expand the tree
+ if (expandAction === 'click') {
+ this.onDebounceExpand(event, node);
+ }
+
+ if (onClick) {
+ onClick(event, node);
+ }
+ };
+
+ onDoubleClick = (event, node) => {
+ const { onDoubleClick, expandAction } = this.props;
+
+ // Expand the tree
+ if (expandAction === 'doubleClick') {
+ this.onDebounceExpand(event, node);
+ }
+
+ if (onDoubleClick) {
+ onDoubleClick(event, node);
+ }
+ };
+
+ onSelect = (keys, event) => {
+ const { onSelect, multiple, children } = this.props;
+ const { expandedKeys = [] } = this.state;
+ const { node, nativeEvent } = event;
+ const { eventKey = '' } = node.props;
+
+ const newState = {};
+
+ // We need wrap this event since some value is not same
+ const newEvent = {
+ ...event,
+ selected: true, // Directory selected always true
+ };
+
+ // Windows / Mac single pick
+ const ctrlPick = nativeEvent.ctrlKey || nativeEvent.metaKey;
+ const shiftPick = nativeEvent.shiftKey;
+
+ // Generate new selected keys
+ let newSelectedKeys;
+ if (multiple && ctrlPick) {
+ // Control click
+ newSelectedKeys = keys;
+ this.lastSelectedKey = eventKey;
+ this.cachedSelectedKeys = newSelectedKeys;
+ newEvent.selectedNodes = convertDirectoryKeysToNodes(children, newSelectedKeys);
+ } else if (multiple && shiftPick) {
+ // Shift click
+ newSelectedKeys = Array.from(
+ new Set([
+ ...(this.cachedSelectedKeys || []),
+ ...calcRangeKeys(children, expandedKeys, eventKey, this.lastSelectedKey),
+ ]),
+ );
+ newEvent.selectedNodes = convertDirectoryKeysToNodes(children, newSelectedKeys);
+ } else {
+ // Single click
+ newSelectedKeys = [eventKey];
+ this.lastSelectedKey = eventKey;
+ this.cachedSelectedKeys = newSelectedKeys;
+ newEvent.selectedNodes = [event.node];
+ }
+ newState.selectedKeys = newSelectedKeys;
+
+ if (onSelect) {
+ onSelect(newSelectedKeys, newEvent);
+ }
+
+ this.setUncontrolledState(newState);
+ };
+
+ setTreeRef = (node) => {
+ this.tree = node;
+ };
+
+ expandFolderNode = (event, node) => {
+ const { isLeaf } = node.props;
+
+ if (isLeaf || event.shiftKey || event.metaKey || event.ctrlKey) {
+ return;
+ }
+
+ // Get internal rc-tree
+ const internalTree = this.tree.tree;
+
+ // Call internal rc-tree expand function
+ // https://github.com/ant-design/ant-design/issues/12567
+ internalTree.onNodeExpand(event, node);
+ };
+
+ setUncontrolledState = (state) => {
+ const newState = omit(state, Object.keys(this.props));
+ if (Object.keys(newState).length) {
+ this.setState(newState);
+ }
+ };
+
+ renderDirectoryTree = ({ getPrefixCls }) => {
+ const { prefixCls: customizePrefixCls, className, ...props } = this.props;
+ const { expandedKeys, selectedKeys } = this.state;
+
+ const prefixCls = getPrefixCls('tree', customizePrefixCls);
+ const connectClassName = classNames(`${prefixCls}-directory`, className);
+
+ return (
+
+ );
+ };
+
+ render() {
+ return {this.renderDirectoryTree};
+ }
+}
+
+polyfill(DirectoryTree);
+
+export default DirectoryTree;
diff --git a/src/forge/Wiki/components/FolderTree/index.scss b/src/forge/Wiki/components/FolderTree/index.scss
new file mode 100644
index 00000000..f74cfaf9
--- /dev/null
+++ b/src/forge/Wiki/components/FolderTree/index.scss
@@ -0,0 +1,61 @@
+.hide-file-icon.ant-tree.ant-tree-directory {
+ li span.ant-tree-switcher {
+ display: none !important;
+ }
+
+ // li[role="treeitem"]:hover > span.ant-tree-switcher,
+ // li.ant-tree-treenode-selected > span.ant-tree-switcher {
+ // z-index: 1000;
+ // display: inline-block !important;
+ // }
+
+ .ant-tree-node-content-wrapper{
+ display: inline-flex;
+ width: 100%;
+ }
+
+ .tree-title-icon{
+ display: none;
+ }
+
+ .ant-tree-node-content-wrapper:hover .tree-title-icon{
+ transition: all 0.3s;
+ display: inline-block;
+ }
+
+ &.ant-tree.ant-tree-directory
+ > li.ant-tree-treenode-selected
+ > span.ant-tree-node-content-wrapper::before,
+ &.ant-tree.ant-tree-directory
+ .ant-tree-child-tree
+ > li.ant-tree-treenode-selected
+ > span.ant-tree-node-content-wrapper::before {
+ background: #fff;
+ margin-top: -3px;
+ }
+
+ &.ant-tree.ant-tree-directory > li span.ant-tree-node-content-wrapper::before,
+ &.ant-tree.ant-tree-directory
+ .ant-tree-child-tree
+ > li
+ span.ant-tree-node-content-wrapper::before {
+ margin-top: -3px;
+ }
+
+ > li span.ant-tree-node-content-wrapper.ant-tree-node-selected,
+ .ant-tree-child-tree
+ > li
+ span.ant-tree-node-content-wrapper.ant-tree-node-selected {
+ color: #2a61ff;
+ }
+
+
+
+ .ant-tree-title{
+ display: inline-flex;
+ justify-content:space-between;
+ flex: auto;
+ }
+}
+
+
diff --git a/src/forge/Wiki/components/Login/index.jsx b/src/forge/Wiki/components/Login/index.jsx
new file mode 100644
index 00000000..abfa5295
--- /dev/null
+++ b/src/forge/Wiki/components/Login/index.jsx
@@ -0,0 +1,40 @@
+import React, { useState } from 'react';
+import * as ReactDOM from 'react-dom';
+import LoginDialog from '../../../../modules/login/LoginDialog';
+
+// 使用函数调用登录组件
+export default function Login(props) {
+ const div = document.createElement('div');
+ document.body.appendChild(div);
+
+ function destroy() {
+ const unmountResult = ReactDOM.unmountComponentAtNode(div);
+ if (unmountResult && div.parentNode) {
+ div.parentNode.removeChild(div);
+ }
+ }
+
+ function render() {
+ setTimeout(() => {
+ ReactDOM.render(
+
+ ,
+ div,
+ );
+ });
+ }
+
+ render();
+}
+
+function MyLoginDialog({afterClose}) {
+ const [isRender, setIsRender] = useState(true);
+ return (
+ {setIsRender(false);afterClose()}}
+ />
+ )
+}
+
+
diff --git a/src/forge/Wiki/components/ModalFun/index.jsx b/src/forge/Wiki/components/ModalFun/index.jsx
new file mode 100644
index 00000000..d9a62e8f
--- /dev/null
+++ b/src/forge/Wiki/components/ModalFun/index.jsx
@@ -0,0 +1,117 @@
+/* eslint-disable react/jsx-no-duplicate-props */
+import React, { useState } from 'react';
+import * as ReactDOM from 'react-dom';
+import { Modal, Button } from 'antd';
+import './index.scss';
+
+InitModal.defaultProps = {
+ okText: '确认', //确定按钮的文字
+ cancelText: '取消', //取消按钮的文字
+ className: '', //
+ inputId: 'copyText', //要复制的文本的ID
+};
+
+// 使用函数调用删除组件
+export default function DelModal(props) {
+ renderModal({ ...props, type: 'delete' })
+}
+
+// 使用函数调用选择模态框组件
+export function Confirm(props) {
+ renderModal({ ...props, type: 'confirm' })
+}
+
+function renderModal(props) {
+ const { type, afterClose } = props;
+ const div = document.createElement('div');
+ document.body.appendChild(div);
+
+ function destroy() {
+ afterClose && afterClose();
+ const unmountResult = ReactDOM.unmountComponentAtNode(div);
+ if (unmountResult && div.parentNode) {
+ div.parentNode.removeChild(div);
+ }
+ }
+
+ function modalType(type) {
+ if (type === 'delete') {
+ return
+
+ {props.contentTitle}
+ }
+ />
+ } else if (type === 'confirm') {
+ return
+ } else {
+ return
+ }
+ }
+
+ function render() {
+ setTimeout(() => {
+ ReactDOM.render(
+ modalType(type),
+ div,
+ );
+ });
+ }
+ render();
+}
+
+// 选择模态框组件
+function InitModal({
+ onCancel,
+ onOk,
+ title,
+ contentTitle,
+ content,
+ okText,
+ cancelText,
+ afterClose,
+ className,
+}) {
+
+ const [visible, setVisible] = useState(true);
+
+ function onCancelModal() {
+ setVisible(false);
+ onCancel && onCancel()
+ }
+
+ function onSuccess() {
+ setVisible(false);
+ onOk && onOk();
+ }
+
+ return (
+
+ {cancelText}
+ ,
+ ,
+ ]}
+ >
+
+ {contentTitle &&
{contentTitle}
}
+
{content}
+
+
+ )
+}
diff --git a/src/forge/Wiki/components/ModalFun/index.scss b/src/forge/Wiki/components/ModalFun/index.scss
new file mode 100644
index 00000000..24f7b021
--- /dev/null
+++ b/src/forge/Wiki/components/ModalFun/index.scss
@@ -0,0 +1,63 @@
+.myself-modal {
+ .ant-modal-header {
+ padding: 9px 24px;
+ background: #f8f8f8;
+ border-bottom: 1px solid #eee;
+ }
+ .ant-modal-title {
+ text-align: left;
+ }
+ .ant-modal-close {
+ top: 0px !important;
+ }
+ .ant-modal-close-x {
+ font-size: 24px;
+ }
+ .ant-modal-body {
+ text-align: center;
+ }
+ .content-title {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ margin: 2rem 0 1rem !important;
+ font-size: 16px;
+ color: #333;
+ letter-spacing: 0;
+ line-height: 29px;
+ font-weight: 400;
+ }
+ .red-circle {
+ align-self: flex-start;
+ color: #ca0002;
+ font-size: 1.5rem !important;
+ }
+ .content-descibe {
+ font-size: 14px;
+ color: #666;
+ line-height: 33px;
+ font-weight: 400;
+ }
+ .ant-modal-footer {
+ padding: 2rem 0;
+ text-align: center;
+ border: 0;
+ .ant-btn {
+ width: 6rem;
+ }
+ }
+ .foot-submit {
+ margin-left: 3rem;
+ color: #df0002;
+ &:hover {
+ border-color: #df0002;
+ }
+ }
+ .ant-btn-default:hover,
+ .ant-btn-default:active,
+ .ant-btn-default:focus {
+ background: #f3f4f6;
+ color: #333;
+ border-color: #d0d0d0;
+ }
+}
\ No newline at end of file
diff --git a/src/forge/Wiki/components/config.js b/src/forge/Wiki/components/config.js
new file mode 100644
index 00000000..bda41339
--- /dev/null
+++ b/src/forge/Wiki/components/config.js
@@ -0,0 +1,29 @@
+import { httpUrl } from '../fetch';
+
+export const editorConfig = {
+ placeholder: '请输入',
+ uploadImgServer: httpUrl + '/busiAttachments/upload',
+ uploadFileName: 'file',
+ uploadImgHeaders: {
+ 'X-Requested-With': 'XMLHttpRequest'
+ },
+ excludeMenus: [
+ 'list',
+ 'todo',
+ 'emoticon',
+ 'video'
+ ],
+ uploadImgHooks: {
+ // 图片上传并返回了结果,想要自己把图片插入到编辑器中
+ customInsert: function (insertImgFn, result) {
+ // insertImgFn 可把图片插入到编辑器,传入图片 src ,执行函数即可
+ if (result && result.data && result.data.id) {
+ insertImgFn(`${httpUrl}/busiAttachments/view/${result.data.id}`);
+ }
+ }
+ },
+}
+
+
+export const weekModal="| 工作项目 | 本周工作计划 | 本周完成情况 |下周计划 | 待协同事项 |\n| ------------ | ------------ | ------------ | ------------ | ------------ |\n| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n\n 备注:";
+export const monthModal="|工作项目 | 工作内容 | 项目进度情况 | 问题列表及解决方案| 下月工作计划 | 遗留未解决的问题 |\n| ------------ | ------------ | ------------ | ------------ | ------------ | ------------ |\n| | | | | | |\n| | | | | | |\n| | | | | | |\n| | | | | | |\n\n 月度总结:";
diff --git a/src/forge/Wiki/fetch.js b/src/forge/Wiki/fetch.js
new file mode 100644
index 00000000..9f0e6901
--- /dev/null
+++ b/src/forge/Wiki/fetch.js
@@ -0,0 +1,106 @@
+import { notification ,message} from 'antd';
+import axios from 'axios';
+import cookie from 'react-cookies';
+import Login from './components/Login';
+
+let actionUrl = '';
+if (window.location.href.indexOf('localhost') > -1) {
+ // actionUrl = 'http://117.50.100.12:8008';
+ // actionUrl = 'http://192.168.31.74:8081';
+ actionUrl = "https://test-search.trustie.net";
+} else if(window.location.href.indexOf('testforgeplus')>-1){
+ actionUrl = "https://test-search.trustie.net";
+ // actionUrl = 'https://testforgeplus.trustie.net';
+ axios.defaults.withCredentials = true;
+}else if (window.location.href.indexOf('forgeplus') > -1) {
+ actionUrl = "https://wiki-api.trustie.net";
+ axios.defaults.withCredentials = true;
+}
+
+export const httpUrl = actionUrl;
+export const TokenKey = 'autologin_trustie';
+
+// 创建axios实例
+const service = axios.create({
+ baseURL: httpUrl,
+ timeout: 10000, // 请求超时时间
+});
+
+// request拦截器
+service.interceptors.request.use(config => {
+ if (cookie.load(TokenKey)) {
+ console.log(cookie.load(TokenKey));
+ config.headers['Authorization'] = cookie.load(TokenKey); // 让每个请求携带自定义token 请根据实际情况自行修改
+ }
+ if (window.location.port === "3007") {
+ // 模拟token为登录用户
+ const taskToken = sessionStorage.taskToken;
+ if (config.url.indexOf('?') === -1) {
+ config.url = `${config.url}?token=${taskToken}`;
+ } else {
+ config.url = `${config.url}&token=${taskToken}`;
+ }
+ }
+ return config;
+}, error => {
+ // Do something with request error
+ console.log(error); // for debug
+ // Promise.reject(error);
+});
+// respone拦截器
+service.interceptors.response.use(
+ response => {
+ const res = response||{};
+ if (res.status === 400) {
+ message.error(res.data.message || '操作失败');
+ return Promise.reject('error');
+ }
+ if (res.status === 401) {
+ message.error(res.data.message || '登录信息已过期');
+ return Promise.reject('error');
+ }
+ if (res.status === 403) {
+ message.error(res.data.message || '无权限!');
+ return Promise.reject('error');
+ }
+ if (res.status === 40001) {
+ notification.open({
+ message: "提示",
+ description: '账户或密码错误!',
+ });
+ return Promise.reject('error');
+ }
+ if (response.status !== 200 && res.status !== 200) {
+ notification.open({
+ message: "提示",
+ description: res.message,
+ });
+ } else {
+ return response.data;
+ }
+ },
+ error => {
+ console.log(error);
+ let res = error.response||{};
+ if (res.status === 400) {
+ message.error(res.data.message || '操作失败');
+ return Promise.reject('error');
+ }
+ if (res.status === 401) {
+ message.error(res.data.message || '登录信息已过期');
+ Login();
+ return Promise.reject('error');
+ }
+ if (res.status === 403) {
+ message.error(res.data.message || '无权限!');
+ return Promise.reject('error');
+ }
+ notification.open({
+ message: "提示",
+ description: error.message,
+ });
+ return Promise.reject(error);
+ }
+);
+
+export default service;
diff --git a/src/forge/users/Index.scss b/src/forge/users/Index.scss
index b087fa2f..3595aa84 100644
--- a/src/forge/users/Index.scss
+++ b/src/forge/users/Index.scss
@@ -105,6 +105,7 @@ $flex:flex;
word-break: break-all;
text-align: justify;
font-size: 16px;
+ text-align: center;
}
.focusBox,.infoBox{
width: 100%!important;
diff --git a/src/forge/users/Infos.js b/src/forge/users/Infos.js
index a588cb8b..abff899d 100644
--- a/src/forge/users/Infos.js
+++ b/src/forge/users/Infos.js
@@ -194,7 +194,7 @@ class Infos extends Component {
render() {
const { current_user } = this.props;
const { username } = this.props.match.params;
- const { user, isSpin, route_type , undo_events , menuKey } = this.state;
+ const { user, isSpin, route_type , undo_events , menuKey , project_type } = this.state;
return (
@@ -276,6 +276,97 @@ class Infos extends Component {
}
+ {current_user && user && user.login === current_user.login ? (
+
+
+
-
+
this.undo_link()}>
+
+
+ 待办事项
+
+
+ {user.undo_events}
+
+
+
+
+
+ ):""}
+
+
+
+ - this.change_project_type(undefined)}>
+
+ 项目类型
+
+
+ - this.change_project_type("common")}>
+
+ 开源托管项目
+
+ {user && user.common_projects_count}
+
+
+
+ - this.change_project_type("mirror")}>
+
+ 开源镜像项目
+
+ {user && user.mirror_projects_count}
+
+
+
+ - this.change_project_type("sync_mirror")}>
+
+ 镜像托管项目
+
+ {user && user.sync_mirror_projects_count}
+
+
+
+
+
+ {
+ current_user && current_user.login && current_user.login === username &&
+
+ }
+
+
+
-
+
this.organize_link()} >
+
+
+ 组织
+
+
+ {user && user.user_org_count}
+
+
+
+
+
{ !route_type && menuKey &&
diff --git a/src/forge/users/Team.jsx b/src/forge/users/Team.jsx
index 9378106e..bf401d2c 100644
--- a/src/forge/users/Team.jsx
+++ b/src/forge/users/Team.jsx
@@ -5,6 +5,7 @@ import Search from '../Component/Search';
import Item from './Team-item';
import Nodata from '../Nodata';
import axios from 'axios';
+import { Link } from 'react-router-dom';
const limit = 15;
function Team(props){
@@ -14,7 +15,7 @@ function Team(props){
const [ sort_direction , setSort_direction ] = useState("asc");
const [ sort_by ,setSort_by ] = useState("created_at");
const [ search ,setSearch ] = useState(undefined);
-
+ const { checkIfLogin , showLoginDialog } = props;
const { username } = props.match.params;
useEffect(()=>{
if(username){
@@ -47,14 +48,6 @@ function Team(props){
)
- function newFunc() {
- const { checkIfLogin , showLoginDialog } = props;
- if(checkIfLogin()){
- props.history.push(`/organize/new`);
- }else{
- showLoginDialog && showLoginDialog();
- }
- }
return(
@@ -62,7 +55,10 @@ function Team(props){
setSearch(e.target.value)} placeholder="请输入组织名称关键字进行搜索" onSearch={onSearch}/>
- 新建组织
+ {
+ checkIfLogin() &&
+ 新建组织
+ }
排序
diff --git a/src/forge/users/undo_events.js b/src/forge/users/undo_events.js
deleted file mode 100644
index cea2792a..00000000
--- a/src/forge/users/undo_events.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import React, { Component } from "react";
-import Nodata from "../Nodata";
-class UndoEvents extends Component {
-
- render() {
- return (
-
- );
- }
-}
-export default UndoEvents;
diff --git a/src/index.css b/src/index.css
index 658577e5..e58df61f 100644
--- a/src/index.css
+++ b/src/index.css
@@ -41,9 +41,6 @@
z-index: 1000 !important;
}
-.markdown-body p {
- margin: 0 !important
-}
.markdown-body img{
cursor: pointer;
}