diff --git a/.gitignore b/.gitignore index 9a82a1138..79d23d759 100644 --- a/.gitignore +++ b/.gitignore @@ -86,3 +86,4 @@ typings/ .DS_Store .idea/* +.forgeplus-react.sublime-workspace diff --git a/build.tar.gz b/build.tar.gz new file mode 100644 index 000000000..1131b78ab Binary files /dev/null and b/build.tar.gz differ diff --git a/forgeplus-react.sublime-workspace b/forgeplus-react.sublime-workspace new file mode 100644 index 000000000..08ec48f4e --- /dev/null +++ b/forgeplus-react.sublime-workspace @@ -0,0 +1,317 @@ +{ + "auto_complete": + { + "selected_items": + [ + [ + "samp", + "samp2_method" + ], + [ + "modu", + "module_method" + ], + [ + "cu", + "currentTerm" + ], + [ + "req", + "requestVote" + ], + [ + "reque", + "RequestVote" + ], + [ + "App", + "AppendEntries" + ], + [ + "hea", + "heartBeatInterval" + ], + [ + "time", + "timeOut" + ], + [ + "ele", + "electionTimeout" + ], + [ + "R", + "Raft" + ], + [ + "vote", + "votedFor" + ], + [ + "Ra", + "RaftState" + ], + [ + "is", + "isleader" + ] + ] + }, + "buffers": + [ + { + "file": "src/redux/actions/actionTypes.js", + "settings": + { + "buffer_size": 5688, + "encoding": "UTF-8", + "line_ending": "Unix" + } + } + ], + "build_system": "", + "build_system_choices": + [ + ], + "build_varint": "", + "command_palette": + { + "height": 0.0, + "last_filter": "", + "selected_items": + [ + ], + "width": 0.0 + }, + "console": + { + "height": 171.0, + "history": + [ + "ls" + ] + }, + "distraction_free": + { + "menu_visible": true, + "show_minimap": false, + "show_open_files": false, + "show_tabs": false, + "side_bar_visible": false, + "status_bar_visible": false + }, + "expanded_folders": + [ + "/home/qyzh/new_trustie/forgeplus-react" + ], + "file_history": + [ + "/home/qyzh/OSS/forgeplus/app/models/user.rb", + "/home/qyzh/OSS/forgeplus/db/structure.sql", + "/home/qyzh/OSS/forgeplus/app/controllers/settings_controller.rb", + "/home/qyzh/OSS/forgeplus/app/controllers/application_controller.rb", + "/home/qyzh/OSS/Trustie/app/controllers/projects_controller.rb", + "/home/qyzh/temp.sh", + "/home/qyzh/OSS/Trustie/Gemfile", + "/home/qyzh/.npm/_logs/2020-06-07T02_42_06_886Z-debug.log", + "/home/qyzh/OSS/forgeplus/app/controllers/users_controller.rb", + "/home/qyzh/OSS/forgeplus/app/controllers/accounts_controller.rb", + "/home/qyzh/custom/conf/app.ini", + "/home/qyzh/OSS/Trustie_old/Gemfile.lock", + "/home/qyzh/OSS/Trustie/Gemfile.lock", + "/home/qyzh/ruby_study/test.rb", + "/home/qyzh/RubymineProjects/myblog/app/controller/users_controller.rb", + "/home/qyzh/OSS/forgeplus/app/libs/limit_forbid_control.rb", + "/home/qyzh/OSS/forgeplus/log/development.log", + "/home/qyzh/NJU-DisSys-2017/src/raft/raft.go", + "/home/qyzh/OSS/forgeplus/config/application.rb", + "/home/qyzh/RubymineProjects/demo/app/helpers/welcome_helper.rb", + "/home/qyzh/RubymineProjects/demo/app/controllers/welcome_controller.rb", + "/home/qyzh/RubymineProjects/demo/config/routes.rb", + "/home/qyzh/RubymineProjects/demo/app/views/welcome/index.html.erb", + "/home/qyzh/trustie/Gemfile", + "/home/qyzh/trustie/Gemfile.lock", + "/home/qyzh/ruby_study/test", + "/home/qyzh/NJU-DisSys-2017/src/labrpc/test_test.go", + "/home/qyzh/NJU-DisSys-2017/src/labrpc/labrpc.go", + "/home/qyzh/NJU-DisSys-2017/src/raft/test_test.go", + "/home/qyzh/NJU-DisSys-2017/src/raft/persister.go", + "/home/qyzh/NJU-DisSys-2017/src/raft/util.go", + "/home/qyzh/NJU-DisSys-2017/src/raft/config.go" + ], + "find": + { + "height": 29.0 + }, + "find_in_files": + { + "height": 0.0, + "where_history": + [ + ] + }, + "find_state": + { + "case_sensitive": true, + "find_history": + [ + "current_user", + "user_set", + "login", + "platform", + "Platform不包含于列表中", + "find_by_", + "find_by", + "3.2.22", + "bug", + "persister", + "currentTerm", + "currentTern", + "term", + "your", + "electionInterval", + "your", + "if", + "your", + "Persister", + "make", + "Your code here", + "Call", + "labrpc", + "main" + ], + "highlight": true, + "in_selection": false, + "preserve_case": false, + "regex": false, + "replace_history": + [ + ], + "reverse": false, + "show_context": true, + "use_buffer2": true, + "whole_word": false, + "wrap": true + }, + "groups": + [ + { + "selected": 0, + "sheets": + [ + { + "buffer": 0, + "file": "src/redux/actions/actionTypes.js", + "semi_transient": false, + "settings": + { + "buffer_size": 5688, + "regions": + { + }, + "selection": + [ + [ + 0, + 0 + ] + ], + "settings": + { + "syntax": "Packages/JavaScript/JavaScript.sublime-syntax", + "tab_size": 2, + "translate_tabs_to_spaces": true + }, + "translation.x": 0.0, + "translation.y": 0.0, + "zoom_level": 1.0 + }, + "stack_index": 0, + "type": "text" + } + ] + } + ], + "incremental_find": + { + "height": 29.0 + }, + "input": + { + "height": 0.0 + }, + "layout": + { + "cells": + [ + [ + 0, + 0, + 1, + 1 + ] + ], + "cols": + [ + 0.0, + 1.0 + ], + "rows": + [ + 0.0, + 1.0 + ] + }, + "menu_visible": true, + "output.find_results": + { + "height": 0.0 + }, + "pinned_build_system": "", + "project": "forgeplus-react.sublime-project", + "replace": + { + "height": 54.0 + }, + "save_all_on_build": true, + "select_file": + { + "height": 0.0, + "last_filter": "", + "selected_items": + [ + ], + "width": 0.0 + }, + "select_project": + { + "height": 0.0, + "last_filter": "", + "selected_items": + [ + ], + "width": 0.0 + }, + "select_symbol": + { + "height": 0.0, + "last_filter": "", + "selected_items": + [ + ], + "width": 0.0 + }, + "selected_group": 0, + "settings": + { + }, + "show_minimap": true, + "show_open_files": false, + "show_tabs": true, + "side_bar_visible": true, + "side_bar_width": 288.0, + "status_bar_visible": true, + "template_settings": + { + } +} diff --git a/package-lock.json b/package-lock.json index 55cb63549..0c961a831 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,6 +21,11 @@ "warning": "^4.0.3" } }, + "@ant-design/css-animation": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@ant-design/css-animation/-/css-animation-1.7.3.tgz", + "integrity": "sha512-LrX0OGZtW+W6iLnTAqnTaoIsRelYeuLZWsrmBJFUXDALQphPsN8cE5DCsmoSlL0QYb94BQxINiuS70Ar/8BNgA==" + }, "@ant-design/icons": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-2.1.1.tgz", @@ -380,22 +385,21 @@ "resolved": "https://registry.npmjs.org/@novnc/novnc/-/novnc-1.1.0.tgz", "integrity": "sha512-W90Q79EuCYT++39aT/VKGyk7hUt2gPN3rN+ifPUvY4rdjgZlfwdCg9q7yzj04hke/zgdHsbXFfyFijBvrRuU5A==" }, + "@reach/observe-rect": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@reach/observe-rect/-/observe-rect-1.2.0.tgz", + "integrity": "sha512-Ba7HmkFgfQxZqqaeIWWkNK0rEhpxVQHIoVyW1YDSkGsGIXzcaW4deC8B0pZrNSSyLTdIk7y+5olKt5+g0GmFIQ==" + }, "@types/anymatch": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==" }, - "@types/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==" - }, "@types/glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", - "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", "requires": { - "@types/events": "*", "@types/minimatch": "*", "@types/node": "*" } @@ -1238,12 +1242,18 @@ "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" }, "axios": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz", - "integrity": "sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==", + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", "requires": { - "follow-redirects": "1.5.10", - "is-buffer": "^2.0.2" + "follow-redirects": "^1.10.0" + }, + "dependencies": { + "follow-redirects": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", + "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==" + } } }, "axobject-query": { @@ -1323,7 +1333,7 @@ "babel-core": { "version": "6.26.0", "resolved": "https://registry.npm.taobao.org/babel-core/download/babel-core-6.26.0.tgz", - "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", + "integrity": "sha512-FSiqfr4SYrH5Zv5KgWahyY99VC+Aod1ioMRNvL1lPS4WTUqvPAdYo7ioWEhDHEDqZADapbJZMX0sBuRsc93bDQ==", "requires": { "babel-code-frame": "^6.26.0", "babel-generator": "^6.26.0", @@ -2044,7 +2054,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", - "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", + "integrity": "sha512-cpGMVC1vt/772y3jx1gwSaTitQVZuFDlllgreMsZ+rTYC6jlYXRyf5FQOgSnckOiA5QmzbXTyBY2A5AmZXF1fA==", "requires": { "babel-runtime": "^6.22.0" } @@ -2165,7 +2175,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", - "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", + "integrity": "sha512-phQe3bElbgF887UM0Dhz55d22ob8czTL1kbhZFwpCE6+R/X9kHktfwmx9JZb+bBSVRGphP5tZ9oWhVhlgjrX3Q==", "requires": { "babel-plugin-syntax-jsx": "^6.3.13", "babel-plugin-transform-react-display-name": "^6.23.0", @@ -2767,9 +2777,9 @@ }, "dependencies": { "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true } } @@ -3490,9 +3500,9 @@ "integrity": "sha1-RocMyMGlDQm61TmzOpg9vUqjSx4=" }, "codemirror": { - "version": "5.53.2", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.53.2.tgz", - "integrity": "sha512-wvSQKS4E+P8Fxn/AQ+tQtJnF1qH5UOlxtugFLpubEZ5jcdH2iXTVinb+Xc/4QjshuOxRm4fUsU2QPF1JJKiyXA==" + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.61.0.tgz", + "integrity": "sha512-D3wYH90tYY1BsKlUe0oNj2JAhQ9TepkD51auk3N7q+4uz7A/cgJ5JsWHreT0PqieW1QhOuqxQ2reCXV1YXzecg==" }, "collection-visit": { "version": "1.0.0", @@ -3836,11 +3846,10 @@ } }, "create-react-class": { - "version": "15.6.3", - "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.3.tgz", - "integrity": "sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg==", + "version": "15.7.0", + "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.7.0.tgz", + "integrity": "sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng==", "requires": { - "fbjs": "^0.8.9", "loose-envify": "^1.3.1", "object-assign": "^4.1.1" } @@ -4400,11 +4409,47 @@ "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", "dev": true }, + "d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "requires": { + "internmap": "^1.0.0" + } + }, + "d3-collection": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", + "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" + }, "d3-color": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" }, + "d3-contour": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", + "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", + "requires": { + "d3-array": "^1.1.1" + }, + "dependencies": { + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + } + } + }, + "d3-delaunay": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-5.3.0.tgz", + "integrity": "sha512-amALSrOllWVLaHTnDLHwMIiz0d1bBu9gZXd1FiLfXf8sHcX9jrcj81TVZOqD4UX7MgBZZ07c8GxzEgBpJqc74w==", + "requires": { + "delaunator": "4" + } + }, "d3-dispatch": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", @@ -4415,6 +4460,36 @@ "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.6.tgz", "integrity": "sha512-SZ/lVU7LRXafqp7XtIcBdxnWl8yyLpgOmzAk0mWBI9gXNzLDx5ybZgnRbH9dN/yY5tzVBqCQ9avltSnqVwessQ==" }, + "d3-format": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-2.0.0.tgz", + "integrity": "sha512-Ab3S6XuE/Q+flY96HXT0jOXcM4EAClYFnRGY5zsjRGNy6qCYrQsMffs7cV5Q9xejb35zxW5hf/guKw34kvIKsA==" + }, + "d3-geo": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz", + "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==", + "requires": { + "d3-array": "1" + }, + "dependencies": { + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + } + } + }, + "d3-hexbin": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/d3-hexbin/-/d3-hexbin-0.2.2.tgz", + "integrity": "sha1-nFg32s/UcasFM3qeke8Qv8T5iDE=" + }, + "d3-hierarchy": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", + "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" + }, "d3-interpolate": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.1.6.tgz", @@ -4423,11 +4498,79 @@ "d3-color": "1" } }, + "d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "d3-sankey": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.7.1.tgz", + "integrity": "sha1-0imDImj8aaf+yEgD6WwiVqYUxSE=", + "requires": { + "d3-array": "1", + "d3-collection": "1", + "d3-shape": "^1.2.0" + }, + "dependencies": { + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + } + } + }, + "d3-scale": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.3.0.tgz", + "integrity": "sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ==", + "requires": { + "d3-array": "^2.3.0", + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "^2.1.1", + "d3-time-format": "2 - 3" + }, + "dependencies": { + "d3-interpolate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-2.0.1.tgz", + "integrity": "sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==", + "requires": { + "d3-color": "1 - 2" + } + } + } + }, "d3-selection": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.1.tgz", "integrity": "sha512-BTIbRjv/m5rcVTfBs4AMBLKs4x8XaaLkwm28KWu9S2vKNqXkXt2AH2Qf0sdPZHjFxcWg/YL53zcqAz+3g4/7PA==" }, + "d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "requires": { + "d3-path": "1" + } + }, + "d3-time": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-2.1.1.tgz", + "integrity": "sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==", + "requires": { + "d3-array": "2" + } + }, + "d3-time-format": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-3.0.0.tgz", + "integrity": "sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag==", + "requires": { + "d3-time": "1 - 2" + } + }, "d3-timer": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", @@ -4446,6 +4589,11 @@ "d3-timer": "1" } }, + "d3-voronoi": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", + "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" + }, "damerau-levenshtein": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", @@ -4697,6 +4845,11 @@ } } }, + "delaunator": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-4.0.1.tgz", + "integrity": "sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag==" + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -4981,9 +5134,9 @@ } }, "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", + "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", "requires": { "is-obj": "^1.0.0" } @@ -5082,18 +5235,26 @@ "integrity": "sha512-vhGNxT87PdZA6Ak4E0QhArwGzNcSPUwSN7n9wCFLeBlY2NNuuiwguQuQIp7P5oB65PLJ892yKcHiqz1xLWeiug==" }, "elliptic": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", - "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "dev": true, "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", + "bn.js": "^4.11.9", + "brorand": "^1.1.0", "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } } }, "emoji-regex": { @@ -7924,9 +8085,9 @@ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" }, "handlebars": { - "version": "4.7.6", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", - "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", "requires": { "minimist": "^1.2.5", "neo-async": "^2.6.0", @@ -7936,13 +8097,10 @@ }, "dependencies": { "uglify-js": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.9.1.tgz", - "integrity": "sha512-JUPoL1jHsc9fOjVFHdQIhqEEJsQvfKDjlubcCilu8U26uZ73qOg8VsN8O1jbuei44ZPlwL7kmbAdM4tzaUvqnA==", - "optional": true, - "requires": { - "commander": "~2.20.3" - } + "version": "3.13.6", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.6.tgz", + "integrity": "sha512-rRprLwl8RVaS+Qvx3Wh5hPfPBn9++G6xkGlUupya0s5aDmNjI7z3lnRLB3u7sN4OmbB0pWgzhM9BEJyiWAwtAA==", + "optional": true }, "wordwrap": { "version": "1.0.0", @@ -8169,6 +8327,11 @@ "minimalistic-crypto-utils": "^1.0.1" } }, + "hoek": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", + "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==" + }, "hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -8201,9 +8364,9 @@ "dev": true }, "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" }, "hpack.js": { "version": "2.1.6", @@ -8338,15 +8501,10 @@ } } }, - "http-parser-js": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", - "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=" - }, "http-proxy": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", - "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "requires": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -8354,9 +8512,9 @@ }, "dependencies": { "eventemitter3": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", - "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==" + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" } } }, @@ -8901,9 +9059,9 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "inquirer": { "version": "3.3.0", @@ -8965,6 +9123,11 @@ "ipaddr.js": "^1.9.0" } }, + "internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" + }, "interpret": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", @@ -9029,11 +9192,6 @@ "binary-extensions": "^1.0.0" } }, - "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" - }, "is-builtin-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", @@ -10281,9 +10439,9 @@ } }, "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "lodash-es": { "version": "4.17.15", @@ -11018,9 +11176,9 @@ } }, "node-forge": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", - "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==" + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" }, "node-gyp": { "version": "3.8.0", @@ -11817,19 +11975,19 @@ "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" }, "portfinder": { - "version": "1.0.25", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", - "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==", + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", "requires": { "async": "^2.6.2", "debug": "^3.1.1", - "mkdirp": "^0.5.1" + "mkdirp": "^0.5.5" }, "dependencies": { "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "requires": { "ms": "^2.1.1" } @@ -14049,9 +14207,9 @@ "dev": true }, "querystringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", - "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" }, "quill": { "version": "1.3.7", @@ -14579,18 +14737,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.npmjs.org/rc-animate/-/rc-animate-3.1.1.tgz", + "integrity": "sha512-8wg2Zg3EETy0k/9kYuis30NJNQg1D6/WSQwnCiz6SvyxQXNet/rVraRz3bPngwY6rcU2nlRvoShiYOorXyF7Sg==", "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" } }, "warning": { @@ -14650,18 +14804,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.npmjs.org/rc-animate/-/rc-animate-3.1.1.tgz", + "integrity": "sha512-8wg2Zg3EETy0k/9kYuis30NJNQg1D6/WSQwnCiz6SvyxQXNet/rVraRz3bPngwY6rcU2nlRvoShiYOorXyF7Sg==", "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" } } } @@ -14730,6 +14880,18 @@ "tiny-invariant": "^1.0.4" } }, + "react-charts": { + "version": "2.0.0-beta.7", + "resolved": "https://registry.npmjs.org/react-charts/-/react-charts-2.0.0-beta.7.tgz", + "integrity": "sha512-iUspg9rnx7kD0H/wsK67HNUioOgKgJ8WRXr/Tk3EGP2qcFb9Vo7pjDk4oz1jH12TC+mqL+HFxNYraMkhWd6CUw==", + "requires": { + "@reach/observe-rect": "^1.1.0", + "d3-delaunay": "^5.2.1", + "d3-scale": "^3.2.1", + "d3-shape": "^1.3.7", + "d3-voronoi": "^1.1.2" + } + }, "react-codemirror": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/react-codemirror/-/react-codemirror-1.0.0.tgz", @@ -15133,6 +15295,23 @@ "prop-types": "^15.7.2" } }, + "react-motion": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/react-motion/-/react-motion-0.5.2.tgz", + "integrity": "sha512-9q3YAvHoUiWlP3cK0v+w1N5Z23HXMj4IF4YuvjvWegWqNPfLXsOBE/V7UvQGpXxHFKRQQcNcVQE31g9SB/6qgQ==", + "requires": { + "performance-now": "^0.2.0", + "prop-types": "^15.5.8", + "raf": "^3.1.0" + }, + "dependencies": { + "performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" + } + } + }, "react-onclickoutside": { "version": "6.9.0", "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.9.0.tgz", @@ -15141,7 +15320,7 @@ "react-player": { "version": "1.15.3", "resolved": "https://registry.npm.taobao.org/react-player/download/react-player-1.15.3.tgz", - "integrity": "sha1-0AzxRfnIYYTLCgcaH7+Oy3tomH8=", + "integrity": "sha512-8fc0R1AipFIy7l4lKgnIg+gMU2IY32ZMxxBlINjXAq/YnN3HUP3hOaE+aQ0lQv+a1/MMZgbekWD86ZGDO7kB8g==", "requires": { "deepmerge": "^4.0.0", "load-script": "^1.0.0", @@ -15187,7 +15366,7 @@ "react-resizable": { "version": "1.10.1", "resolved": "https://registry.npm.taobao.org/react-resizable/download/react-resizable-1.10.1.tgz", - "integrity": "sha1-8MLPHYOzRwuHZ2zm1rArvj9NjNQ=", + "integrity": "sha512-Jd/bKOKx6+19NwC4/aMLRu/J9/krfxlDnElP41Oc+oLiUWs/zwV1S9yBfBZRnqAwQb6vQ/HRSk3bsSWGSgVbpw==", "requires": { "prop-types": "15.x", "react-draggable": "^4.0.3" @@ -15326,6 +15505,70 @@ } } }, + "react-vis": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/react-vis/-/react-vis-1.11.7.tgz", + "integrity": "sha512-vJqS12l/6RHeSq8DVl4PzX0j8iPgbT8H8PtgTRsimKsBNcPjPseO4RICw1FUPrwj8MPrrna34LBtzyC4ATd5Ow==", + "requires": { + "d3-array": "^1.2.0", + "d3-collection": "^1.0.3", + "d3-color": "^1.0.3", + "d3-contour": "^1.1.0", + "d3-format": "^1.2.0", + "d3-geo": "^1.6.4", + "d3-hexbin": "^0.2.2", + "d3-hierarchy": "^1.1.4", + "d3-interpolate": "^1.1.4", + "d3-sankey": "^0.7.1", + "d3-scale": "^1.0.5", + "d3-shape": "^1.1.0", + "d3-voronoi": "^1.1.2", + "deep-equal": "^1.0.1", + "global": "^4.3.1", + "hoek": "4.2.1", + "prop-types": "^15.5.8", + "react-motion": "^0.5.2" + }, + "dependencies": { + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "d3-format": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", + "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==" + }, + "d3-scale": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.7.tgz", + "integrity": "sha512-KvU92czp2/qse5tUfGms6Kjig0AhHOwkzXG0+PqIJB3ke0WUv088AHMZI0OssO9NCkXt4RP8yju9rpH8aGB7Lw==", + "requires": { + "d3-array": "^1.2.0", + "d3-collection": "1", + "d3-color": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" + } + }, + "d3-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", + "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + }, + "d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "requires": { + "d3-time": "1" + } + } + } + }, "react-zmage": { "version": "0.8.5-beta.31", "resolved": "https://registry.npmjs.org/react-zmage/-/react-zmage-0.8.5-beta.31.tgz", @@ -16471,11 +16714,11 @@ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" }, "selfsigned": { - "version": "1.10.7", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", - "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", + "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", "requires": { - "node-forge": "0.9.0" + "node-forge": "^0.10.0" } }, "semver": { @@ -16815,9 +17058,9 @@ } }, "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" }, "yargs": { "version": "14.2.3", @@ -17135,12 +17378,13 @@ } }, "sockjs": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", - "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", + "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", "requires": { "faye-websocket": "^0.10.0", - "uuid": "^3.0.1" + "uuid": "^3.4.0", + "websocket-driver": "0.6.5" } }, "sockjs-client": { @@ -17157,9 +17401,9 @@ }, "dependencies": { "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "requires": { "ms": "^2.1.1" } @@ -17270,11 +17514,11 @@ }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "ms": { @@ -17298,11 +17542,11 @@ }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "ms": { @@ -18131,10 +18375,13 @@ "dev": true }, "serialize-javascript": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.0.0.tgz", - "integrity": "sha512-skZcHYw2vEX4bw90nAr2iTTsz6x2SrHEnfxgKYmZlvJYBEZrvbKtobJWlQ20zczKb3bsHHXXTYt48zBA7ni9cw==", - "dev": true + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", + "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } }, "ssri": { "version": "7.1.0", @@ -18410,9 +18657,9 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "ua-parser-js": { - "version": "0.7.21", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz", - "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==" + "version": "0.7.28", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz", + "integrity": "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==" }, "uglify-js": { "version": "2.8.29", @@ -18613,9 +18860,9 @@ } }, "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true }, "yallist": { @@ -18779,9 +19026,9 @@ } }, "urijs": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.2.tgz", - "integrity": "sha512-s/UIq9ap4JPZ7H1EB5ULo/aOUbWqfDi7FKzMC2Nz+0Si8GiT1rIEaprt8hy3Vy2Ex2aJPpOQv4P4DuOZ+K1c6w==" + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.6.tgz", + "integrity": "sha512-eSXsXZ2jLvGWeLYlQA3Gh36BcjF+0amo92+wHPyN1mdR8Nxf75fuEuYTd9c0a+m/vhCjRK0ESlE9YNLW+E1VEw==" }, "urix": { "version": "0.1.0", @@ -18846,9 +19093,9 @@ } }, "url-parse": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", - "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", + "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", "requires": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -19856,9 +20103,9 @@ } }, "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" }, "yargs": { "version": "13.2.4", @@ -19902,16 +20149,16 @@ }, "dependencies": { "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" } } }, "webpack-dev-server": { - "version": "3.10.3", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.3.tgz", - "integrity": "sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", + "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", "requires": { "ansi-html": "0.0.7", "bonjour": "^3.5.0", @@ -19921,37 +20168,37 @@ "debug": "^4.1.1", "del": "^4.1.1", "express": "^4.17.1", - "html-entities": "^1.2.1", + "html-entities": "^1.3.1", "http-proxy-middleware": "0.19.1", "import-local": "^2.0.0", "internal-ip": "^4.3.0", "ip": "^1.1.5", "is-absolute-url": "^3.0.3", "killable": "^1.0.1", - "loglevel": "^1.6.6", + "loglevel": "^1.6.8", "opn": "^5.5.0", "p-retry": "^3.0.1", - "portfinder": "^1.0.25", + "portfinder": "^1.0.26", "schema-utils": "^1.0.0", "selfsigned": "^1.10.7", "semver": "^6.3.0", "serve-index": "^1.9.1", - "sockjs": "0.3.19", + "sockjs": "0.3.20", "sockjs-client": "1.4.0", - "spdy": "^4.0.1", + "spdy": "^4.0.2", "strip-ansi": "^3.0.1", "supports-color": "^6.1.0", "url": "^0.11.0", "webpack-dev-middleware": "^3.7.2", "webpack-log": "^2.0.0", "ws": "^6.2.1", - "yargs": "12.0.5" + "yargs": "^13.3.2" }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, "camelcase": { "version": "5.3.1", @@ -19959,50 +20206,31 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" }, "dependencies": { "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^4.1.0" } } } }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "del": { @@ -20019,19 +20247,10 @@ "rimraf": "^2.6.3" } }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" }, "find-up": { "version": "3.0.0", @@ -20041,13 +20260,10 @@ "locate-path": "^3.0.0" } }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "globby": { "version": "6.1.0", @@ -20068,11 +20284,6 @@ } } }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" - }, "is-path-cwd": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", @@ -20094,14 +20305,6 @@ "path-is-inside": "^1.0.2" } }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "requires": { - "invert-kv": "^2.0.0" - } - }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -20116,16 +20319,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -20157,6 +20350,11 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", @@ -20172,6 +20370,26 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "dependencies": { + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", @@ -20185,6 +20403,26 @@ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, "ws": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", @@ -20193,29 +20431,32 @@ "async-limiter": "~1.0.0" } }, + "y18n": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==" + }, "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", + "cliui": "^5.0.0", "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", + "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^2.0.0", + "string-width": "^3.0.0", "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" } }, "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" @@ -20265,19 +20506,17 @@ } }, "websocket-driver": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", - "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", + "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", "requires": { - "http-parser-js": ">=0.4.0 <0.4.11", - "safe-buffer": ">=5.1.0", "websocket-extensions": ">=0.1.1" } }, "websocket-extensions": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==" + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" }, "webworkify": { "version": "1.5.0", diff --git a/package.json b/package.json index 42d6722cf..a44c24755 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "antd": "^3.26.15", "array-flatten": "^2.1.2", "autoprefixer": "7.1.6", - "axios": "^0.18.1", + "axios": "^0.21.1", "babel-eslint": "7.2.3", "babel-jest": "20.0.3", "babel-loader": "7.1.2", @@ -23,7 +23,7 @@ "classnames": "^2.2.5", "clipboard": "^2.0.6", "code-prettify": "^0.1.0", - "codemirror": "^5.53.0", + "codemirror": "^5.61.0", "connected-react-router": "4.4.1", "css-loader": "^3.5.2", "dotenv": "4.0.0", @@ -46,7 +46,7 @@ "jest": "20.0.4", "js-base64": "^2.5.2", "katex": "^0.11.1", - "lodash": "^4.17.15", + "lodash": "^4.17.21", "loglevel": "^1.6.8", "marked": "^1.0.0", "material-ui": "^1.0.0-beta.40", @@ -74,6 +74,7 @@ "rc-upload": "^2.9.4", "react": "^16.13.1", "react-beautiful-dnd": "^10.0.4", + "react-charts": "^2.0.0-beta.7", "react-codemirror": "^1.0.0", "react-codemirror2": "^6.0.1", "react-color": "^2.18.0", @@ -93,6 +94,7 @@ "react-router-dom": "^4.2.2", "react-split-pane": "^0.1.91", "react-url-query": "^1.5.0", + "react-vis": "^1.11.7", "react-zmage": "^0.8.5-beta.31", "redux": "^4.0.5", "redux-thunk": "2.3.0", @@ -107,7 +109,7 @@ "sw-precache-webpack-plugin": "0.11.4", "url-loader": "0.6.2", "webpack-cli": "^3.3.11", - "webpack-dev-server": "^3.10.3", + "webpack-dev-server": "^3.11.0", "webpack-manifest-plugin": "^2.2.0", "whatwg-fetch": "2.0.3", "wrap-md-editor": "^0.2.20" diff --git a/src/App.js b/src/App.js index 13623f569..d488d3315 100644 --- a/src/App.js +++ b/src/App.js @@ -24,6 +24,7 @@ import { SnackbarHOC } from 'educoder' import { initAxiosInterceptors } from './AppConfig' import { Provider } from 'react-redux'; import configureStore from './redux/stores/configureStore'; +import { load } from 'react-cookies'; const store = configureStore(); window.marked = marked; const theme = createMuiTheme({ @@ -70,6 +71,16 @@ const OrganizeIndex = Loadable({ loader: () => import('./forge/Team/Index'), loading: Loading, }) +// Sponsor +const Sponsor = Loadable({ + loader: () => import('./forge/sponsor/Sponsor'), + loading: Loading, +}) +// Sponsor Confirmation +const SponsorConfirmation = Loadable({ + loader: () => import('./forge/sponsor/SponsorConfirmation'), + loading: Loading, +}) const EducoderLogin = Loadable({ loader: () => import('./modules/login/EducoderLogin'), loading: Loading, @@ -260,7 +271,17 @@ class App extends Component { (props) => { return () } - }> + }> + () + }> + + () + }> + ( diff --git a/src/AppConfig.js b/src/AppConfig.js index a369d843b..24b0e97d2 100644 --- a/src/AppConfig.js +++ b/src/AppConfig.js @@ -56,9 +56,10 @@ window._debugType = debugType; export function initAxiosInterceptors(props) { initOnlineOfflineListener() // TODO 避免重复的请求 https://github.com/axios/axios#cancellation - var - proxy = "http://localhost:3000"; - proxy = "https://testforgeplus.trustie.net"; + var + // proxy = "http://172.27.144.138:3000/" + proxy = "http://localhost:3000" + // proxy = "https://testforgeplus.trustie.net" const requestMap = {}; window.setfalseInRequestMap = function (keyName) { diff --git a/src/forge/Version/UpdateVersion.js b/src/forge/Version/UpdateVersion.js new file mode 100644 index 000000000..d9eebeddd --- /dev/null +++ b/src/forge/Version/UpdateVersion.js @@ -0,0 +1,191 @@ +import React , { Component } from "react"; +import { Form , Input , Select,Divider,Button,Checkbox,Dropdown,Menu} from 'antd'; +import {Link} from 'react-router-dom'; + +import UploadComponent from '../Upload/Index'; +import '../Order/order.css'; +import './version.css'; + +import axios from 'axios'; + +const Option = Select.Option; +const TextArea = Input.TextArea; +class NewVersion extends Component{ + constructor(props){ + super(props); + this.state={ + branch_name:"", + issue_tag_ids:"", + fixed_version_id:"", + issue_chosen:undefined, + fileList:undefined, + ischeck:undefined, + pull:undefined, + tag_name:'', + data:undefined + } + } + + componentDidMount=()=>{ + this.getSelectList(); + } + + getSelectList=()=>{ + const { projectsId,versionId} = this.props.match.params; + const url = `/projects/${projectsId}/version_releases/${versionId}/edit.json`; + axios.get(url).then((result)=>{ + if(result){ + this.setState({ + data:result.data, + pull:result.data.target_commitish + }) + } + }).catch((error)=>{ + console.log(error); + }) + } + + + //delete + deleteversion=()=>{ + const { projectsId , versionId} = this.props.match.params; + const url = `/projects/${projectsId}/version_releases/${versionId}.json`; + axios.delete(url,{ data: { + project_id: projectsId, + id:versionId + } + }).then((result)=>{ + if(result){ + this.props.history.push(`/projects/${projectsId}/version`); + + } + }).catch((error)=>{ + console.log(error); + }) + } + + // 创建 + handleSubmit=()=>{ + this.props.form.validateFieldsAndScroll((err, values) => { + if(!err){ + const { projectsId,versionId} = this.props.match.params; + const { pull,ischeck } = this.state; + const url = `/projects/${projectsId}/version_releases/${versionId}.json`; + // if(values.issue_type==="普通"){ + // values.issue_type="1" + // } + axios.put(url,{ + ...values, + tag_name:this.state.data&&this.state.data.tag_name, + draft:false, + prerelease:ischeck, + target_commitish:pull + }).then(result=>{ + if(result){ + this.props.history.push(`/projects/${projectsId}/version`); + } + }).catch(error=>{ + console.log(error); + }) + + } + }) + } + + RedieonChange=(e)=>{ + this.setState({ + ischeck:e.target.checked + }) + } + Preservation=()=>{ + alert(this.state.data.tag_name) + } + + renderMenu =(array,id)=>{ + return( + + { + array && array.length > 0 && array.map((item,key)=>{ + return( + this.getOption(item)}>{item} + ) + }) + } + + ) + } + + getOption=(name)=>{ + this.setState({ + pull:name + }) + + } + + changmodelname=(e)=>{ + this.setState({ + tag_name:e.target.value + }) + } + + render(){ + const { getFieldDecorator } = this.props.form; + const { projectsId } = this.props.match.params; + return( +
+
+

发布新版

+
版本发布组织项目的版本。
+ +
+ {this.state.data&&this.state.data.tag_name}@{this.state.data&&this.state.data.target_commitish} +
+
+
+

标题

+
+ + {getFieldDecorator('name', { + rules: [{ + required: true, message: '请输入标题' + }], + initialValue:this.state.data&&this.state.data.name + + })( + + )} + +
+

内容

+ + {getFieldDecorator('body', { + rules: [{ + required: true, message: '请输入描述内容' + }], + initialValue:this.state.data&&this.state.data.body + })( + + )} + + + ) + } +} +); + +class Sponsor extends Component { + + constructor(props) { + super(props); + this.state = { + isSpin: false, + user: undefined, + description: undefined, + sponsors: undefined, + edit: false, + tiers: [], + }; + } + + componentDidMount = () => { + this.fetchUser(); + this.fetchData(); + }; + + fetchUser = () => { + this.setState({ + isSpin: true, + }); + const { current_user } = this.props; + const { username } = this.props.match.params; + + let url = `/users/${username || (current_user && current_user.login)}.json`; + axios + .get(url) + .then((result) => { + // TODO: 在这里添加了对用户自我介绍的处理,前后端交互实现后需要删掉 + // result.data.description = tempDesc; + this.setState({ + user: result.data, + isSpin: false, + }, () => {this.fetchSponsors()}); + // console.log(result.data); + }) + .catch((error) => { + console.log(error); + this.setState({ + isSpin: false, + }); + }); + }; + + fetchSponsors = () => { + // console.log("fetch sponsors"); + const user_id = this.state.user.user_id; + + let url = `/sponsorships/sponsored.json`; + + axios.get(url, {params: {id: user_id}}) + .then((result) => { + // console.log(result); + this.setState({ + sponsors: result.data.sponsorships, + isSpin: false, + }) + }) + .catch((error) => { + console.log(error); + this.setState({ + isSpin: false, + }); + }); + // this.setState({ + // sponsors: tempData, + // displayList: tempData, + // }) + // this.setState({ + // sponsors: tempSponsors, + // }); + } + + fetchData = () => { + let url = `/sponsor_tiers.json`; + const user_login = this.props.match.params.username; + axios + .get(url, {params:{login: user_login}}) + .then((result) => { + // console.log(result.data); + // console.log(tempData) + this.setState({ + tiers: result.data + }); + }) + .catch((error) => { + console.log(error); + }) + } + + editDescription = () => { + this.setState({ + edit: true, + }); + } + + cancelEdit = () => { + this.setState({ + edit: false, + }) + } + + confirmEdit = () => { + //TODO: 增加和后端交互 + let value = this.formRef.getItemsValue().description; + // console.log(value); + let user = this.state.user; + let url = `/users/${user.user_id}/update_description.json` + axios.put(url, {description: value}) + .then((result) => { + user.description = value; + this.setState({ + user: user, + edit: false + }) + this.props.showNotification("修改成功") + }) + .catch(error => { + console.log(error); + this.props.showNotification("修改失败") + }) + + + // if (user){ + // user.description = value; + // } + // this.setState({ + // user: user, + // edit: false, + // }); + } + + visitorTemplate = () => { + const user = this.state.user; + return ( +
+ {user && user.description? + (

{user.description}

):(

暂无自我介绍

)} +
+ ); + } + + manageTemplate = () => { + const user = this.state.user; + return ( +
+
+ this.editDescription()}> +
+ {user && user.description? (
{user.description}
):(
暂无自我介绍
)} +
+ ); + } + + editTemplate = () => { + const user = this.state.user; + return ( +
+ this.formRef = form} + /> + + +
+ ); + } + + sponsorList(){ + const {sponsors} = this.state; + const sponsorList = (sponsors && sponsors.length>0 ? sponsors.map((item, key)=>{ + return ( + + + ); + }) + :"") + return (

{sponsorList}

); + } + + render(){ + const { current_user} = this.props; + const { user, isSpin, tiers} = this.state; + const sponsorList = this.sponsorList(); + // console.log(tiers); + + var content = ""; + if (current_user && user && user.login !== current_user.login){ + content = this.visitorTemplate(); + } + else if(current_user && user && user.login === current_user.login && this.state.edit){ + content = this.editTemplate(); + } + else if(current_user && user && user.login === current_user.login && !this.state.edit){ + content = this.manageTemplate(); + } + + return ( +
+ +
+
+
+
成为{user && user.username}的赞助者吧
+
+ {user && user.user_identity && ( +
+ {user && user.user_identity} +
+ )} +
+ + {content} + +
+ 赞助者: + {sponsorList} +
+
+ +
+ {/*
+ {content} +
+
+ 赞助者: + {sponsorList} +
*/} +
+
+
+ + +
+
+
+
+ ); + + } + +} + +export default withRouter( + ImageLayerOfCommentHOC({ + imgSelector: ".imageLayerParent img, .imageLayerParent .imageTarget", + parentSelector: ".newMain", + })(CNotificationHOC()(SnackbarHOC()(TPMIndexHOC(Sponsor)))) + ); + \ No newline at end of file diff --git a/src/forge/sponsor/SponsorConfirmation.js b/src/forge/sponsor/SponsorConfirmation.js new file mode 100644 index 000000000..07a0aa3d2 --- /dev/null +++ b/src/forge/sponsor/SponsorConfirmation.js @@ -0,0 +1,325 @@ +import React, { Component } from "react"; +import { Link } from "react-router-dom"; +import { Avatar, Tag, Button, Spin, Input, Divider, Form, Radio, Alert, message, Modal} from "antd"; +import { Route, Switch } from "react-router-dom"; +import { withRouter } from "react-router"; + +import { SnackbarHOC } from "educoder"; +import { CNotificationHOC } from "../../modules/courses/common/CNotificationHOC"; +import { TPMIndexHOC } from "../../modules/tpm/TPMIndexHOC"; + +import axios from "axios"; +import { getImageUrl } from "educoder"; + +import Loadable from "react-loadable"; +import Loading from "../../Loading"; +import { ImageLayerOfCommentHOC } from "../../modules/page/layers/ImageLayerOfCommentHOC"; + +import "../users/new_user.css"; +import "../css/index.scss"; +import '../users/Index.scss'; +import "./sponsor.css"; +import { submitUserCode } from "../../redux/actions/ojForUser"; + +const tempData = {amount:100, description: "如果您更加慷慨的话就选择这个"}; +const tempBalance = 999; +const FormItem = Form.Item; +const { confirm } = Modal; + +const SponsorConfirmation = Form.create()( +class extends Component{ + + constructor(props) { + super(props); + this.state = { + isSpin: false, + user: undefined, + tier: undefined, + single: false, + balance: undefined, + is_sponsoring: false, + visible: false, + sponsorship_id: undefined, + }; + } + + componentDidMount = () => { + this.fetchUser(); + this.fetchTierInformation(); + this.fetchBalance(); + // this.fetchData(); + }; + + //组件刚刚挂载时,TPMINDEXHOC还没从后端获取current_user,需要在获取后,再使用current_user的内容 + componentWillReceiveProps = () => { + if (this.props.current_user) + this.fetchBalance(); + } + + fetchUser = () => { + this.setState({ + isSpin: true, + }); + const { current_user } = this.props; + const { username } = this.props.match.params; + + let url = `/users/${username || (current_user && current_user.login)}.json`; + axios + .get(url) + .then((result) => { + this.setState({ + user: result.data, + isSpin: false, + }); + }) + .catch((error) => { + console.log(error); + this.setState({ + isSpin: false, + }); + }); + }; + + fetchTierInformation = () => { + const { current_user } = this.props; + const { username, tier_id } = this.props.match.params; + let url = `/sponsor_tiers/${tier_id}.json`; + axios + .get(url) + .then((result) => { + this.setState({ + tier: result.data.tier, + is_sponsoring: result.data.is_sponsoring, + sponsorship_id: result.data.sponsorship_id, + }) + }) + .catch((error) => { + console.log(error); + this.setState({ + isSpin: false, + }); + }); + } + + fetchBalance = () => { + const { current_user } = this.props; + let url = `/wallets/balance.json`; + if (current_user){ + axios + .get(url, {params: {id: current_user.user_id}}) + .then((result) => { + this.setState({ + balance: result.data.balance, + }) + }) + .catch((error) => { + console.log(error); + this.setState({ + isSpin: false, + }); + }); + } + } + + reSelect = () => { + const {user} = this.state; + this.setState({ + route_type: undefined + }) + this.props.history.push(`/sponsor/${user && user.login}`) + } + + changeSingle = (e) => { + + this.setState({ + single: e.target.value + }) + } + + updateSponsorship = () => { + const value = this.props.form.getFieldsValue(); + const {tier, user, sponsorship_id} = this.state; + const {current_user} = this.props; + let url = `/sponsorships/${sponsorship_id}.json`; + axios.put(url, { + amount: tier.tier, + visible: value.visible + }) + .then((result) => { + if (result && result.data.status == 1) + this.props.showNotification(result.data.message); + }) + .catch((error) => { + console.log(error); + }) + } + + submit = () => { + const value = this.props.form.getFieldsValue(); + const {tier, user} = this.state; + const {current_user} = this.props; + // console.log(value); + let url = `/sponsorships.json`; + axios.post(url, { + amount: tier.tier, + visible: value.visible, + single: value.single, + developer_id: user.user_id, + }) + .then((result) => { + // console.log(result); + if (result && result.data.status == 1) + this.props.showNotification(result.data.message); + }) + .catch((error) => { + console.log(error); + }) + } + + handleCancel = e => { + this.setState({ + visible: false, + }); + }; + + showModal = () => { + this.setState({ + visible: true, + }); + }; + + showConfirm = () => { + const {user} = this.state; + const fun = this.state.is_sponsoring?this.updateSponsorship:this.submit; + let text = this.state.is_sponsoring?`确认要修改对 ${user && user.username} 的赞助吗?若修改金额,将在下次自动扣款生效。` + :`确认要赞助 ${user && user.username} 吗?`; + confirm({ + // title: '确认赞助', + // icon: , + content: text, + onOk() { + fun() + }, + onCancel() { + + }, + }); + } + + render(){ + const {tier_id, username} = this.props.match.params; + const {current_user, form} = this.props; + const {user, isSpin, tier, balance, is_sponsoring, single} = this.state; + const {getFieldDecorator} = form; + + const current_username = current_user && current_user.username; + const alert_text = this.state.single? `您选择了单次付费,本次扣除${tier && tier.tier}硬币` + :`您选择了按月付费,每月20日将扣除${tier && tier.tier}硬币`; + + // console.log("sponsoring", is_sponsoring); + // console.log("tier: ", tier); + // console.log("current user", current_user); + + const radioStyle = { + display: 'block', + height: '30px', + lineHeight: '30px', + }; + + return ( +
+ +
+
+
+

+ + 赞助{user && user.username}/赞助等级确认 +

+

+ 赞助者为 + + {current_user && current_user.username} +

+ +

所选赞助等级

+

{tier && tier.tier}硬币

+

{tier && tier.description}

+ +
+
+ +
+
+
+ + {getFieldDecorator(`single`,{ + rules: [{ + required: true + }], + initialValue: single + })( + this.changeSingle(e)} disabled={is_sponsoring}> + 单次付费 + 按月支付 + + )} + +

本次支付金额{tier && tier.tier}硬币

+

{this.state.single? "单次付费": "即日起-次月20日"}

+ + +
支付信息
+
+
+ +
+
+
{current_user && current_user.username}
+
硬币余额{balance}
+
+
+ + + 赞助关系可见性 + + {getFieldDecorator(`visible`,{ + rules: [{ + required: true + }], + initialValue: 1 + })( + + 所有人可见 + 私密 + + )} + + + +
+
+
+
+
+ ); + } +}); + + +export default withRouter( + ImageLayerOfCommentHOC({ + imgSelector: ".imageLayerParent img, .imageLayerParent .imageTarget", + parentSelector: ".newMain", + })(CNotificationHOC()(SnackbarHOC()(TPMIndexHOC(SponsorConfirmation)))) + ); + \ No newline at end of file diff --git a/src/forge/sponsor/sponsor.css b/src/forge/sponsor/sponsor.css new file mode 100644 index 000000000..beeb07fba --- /dev/null +++ b/src/forge/sponsor/sponsor.css @@ -0,0 +1,80 @@ +.sponsor-page-left{ + width: 65%; + padding-right: 20px; + box-sizing: border-box; + margin-bottom: 20px; +} + +.sponsor-page-right{ + width: 35%; + padding-right: 20px; + box-sizing: border-box; + margin-bottom: 20px; +} + +.sponsor-page-sponsors{ + width: 50px; + height: 50px; + border-radius: 50%; + margin-right: 11px; +} + +.sponsor-confirmation-left{ + width: 35%; + padding-right: 20px; + box-sizing: border-box; + margin-bottom: 20px; +} + +.sponsor-confirmation-right{ + width: 65%; + padding-right: 20px; + box-sizing: border-box; + margin-bottom: 20px; +} + +.sponsor-inline{ + display: inline-block; +} + +.tier-Item:last-child{ + border-bottom: none !important; + } + +.tier-Item{ + border-bottom:1px solid rgba(238,238,238,1); + padding:9px 12px; +} + + +.right{ + float: right +} + +.btn-border-5{ + border-radius: 5px; +} + +.description-edit{ + min-height:28px; + border:true; +} + +.tier-title{ + font-size: 16px; + font-weight: 600; +} + +.mr10{ + margin-right: 10px; +} + +.confirm-btn{ + width: 100%; + border-radius: 5px; +} + +.sponsor-item-btn{ + display: flex; + flex-direction: column; +} \ No newline at end of file diff --git a/src/forge/sponsor/sponsor_tier_item.js b/src/forge/sponsor/sponsor_tier_item.js new file mode 100644 index 000000000..35e4072ab --- /dev/null +++ b/src/forge/sponsor/sponsor_tier_item.js @@ -0,0 +1,422 @@ +import React, { Component } from "react"; +import { Link } from "react-router-dom"; +import { Avatar, Tag, Button, Spin, Icon, Modal, Input, Form, message, Popconfirm, Divider, InputNumber} from "antd"; +import { Route, Switch } from "react-router-dom"; +import { withRouter } from "react-router"; +// import { EditOutlined } from "@ant-design/icons"; + +import { SnackbarHOC } from "educoder"; +import { CNotificationHOC } from "../../modules/courses/common/CNotificationHOC"; +import { TPMIndexHOC } from "../../modules/tpm/TPMIndexHOC"; + +import axios from "axios"; +import { getImageUrl } from "educoder"; + +import Loadable from "react-loadable"; +import Loading from "../../Loading"; +import { ImageLayerOfCommentHOC } from "../../modules/page/layers/ImageLayerOfCommentHOC"; + +import "../users/new_user.css"; +import "../css/index.scss"; +import '../users/Index.scss'; +import "./sponsor.css"; +import "../Main/list.css"; +import Item from "antd/lib/list/Item"; + +const FormItem = Form.Item; + +const EditTierForm = Form.create()( +class extends Component{ + getItemsValue = ()=>{ + const val= this.props.form.getFieldsValue(); // 获取from表单的值 + return val; + } + render(){ + + const { form, initValue1, initValue2, initValueList } = this.props; + const { getFieldDecorator } = form; // 校验控件 + return( +
+ + {getFieldDecorator(`tier`,{ + rules: [{ + message: '请输入数字!', + pattern: /^[0-9]+$/, + required: true + }], + initialValue: initValue1 ? initValue1 : undefined + })( + + )} + + + {getFieldDecorator(`description`,{ + rules: [{ + message: '必填字段!', + required: true, + }, { + max: 255, + message: "长度不能超过255个字符" + }], + initialValue: initValue2 ? initValue2 : undefined + })( + + )} + +
+ ) + } + +}); + +class SponsorTierItem extends Component{ + constructor(props) { + super(props) + + var edit = new Array(); + if (props.tiers){ + for(var i=0; i { + + } + + // 如果服务器较慢,组件会先被挂载,此时父组件传来的props数据是空的,但是获得数据后,有新的props,需要更新。 + // 如果用户点击了修改自我描述等父组件的方法,父组件会重新渲染,这个方法又会被调用,有可能原有的编辑框会丢失。 + // 因此先判断一下父组件传过来的数据是否有变化。没有变化则不需要修改state + componentWillReceiveProps = () => { + if (this.props.tiers !== this.state.tiers){ + var edit = new Array(); + for(var i=0; i { + let url = `/sponsor_tiers.json`; + axios + .get(url) + .then((result) => { + console.log(result.data); + // console.log(tempData); + var edit = new Array(); + for(var i=0; i { + console.log(error); + }) + } + + fetchUser = () => { + this.setState({ + isSpin: true, + }); + const { current_user } = this.props; + const { username } = this.props.match.params; + + let url = `/users/${username || (current_user && current_user.login)}.json`; + axios + .get(url) + .then((result) => { + this.setState({ + user: result.data, + isSpin: false, + }); + }) + .catch((error) => { + console.log(error); + this.setState({ + isSpin: false, + }); + }); + }; + + editTier = (item, key, e) => { + var edit = this.state.edit; + + var editing = false; + for(var i=0; i { + let url; + try { + const values = await this.formRef.props.form.validateFields(); + // console.log('Success:', values); + } catch (errorInfo) { + this.props.showNotification('提交失败,数据不合法'); + return false; + } + let values = this.formRef.getItemsValue(); + // console.log(this.formRef); + const {current_user} = this.props; + if (this.state.new_tier == key){ + console.log("new tier"); + url = `/sponsor_tiers.json`; + axios + .post(url, { + ...values, + user_id: current_user.user_id + }) + .then((result) => { + var {tiers, edit} = this.state; + tiers[key] = result.data.tier; + edit[key] = false; + this.setState({ + tiers: tiers, + edit: edit, + new_tier: undefined + }) + // message.success("新增成功"); + this.props.showNotification(`新增成功!`); + }) + .catch((error) => { + console.log(error); + this.props.showNotification("新增失败"); + }) + } + else{ + url = `/sponsor_tiers/${item.id}.json` + axios + .put(url, { + ...values, + }) + .then((result) => { + var {tiers, edit} = this.state; + tiers[key] = result.data.tier; + edit[key] = false; + this.setState({ + tiers: tiers, + edit: edit, + new_tier: undefined + }) + // message.success("修改成功"); + this.props.showNotification(`修改成功!`); + }) + .catch((error) => { + console.log(error); + this.props.showNotification("修改失败"); + }) + } + + + // TODO: 在此处加入对后端的修改请求 + + // TODO: 修改的请求实现 + } + + cancelEdit = (item, key, e) => { + let {tiers, edit, new_tier} = this.state; + if (new_tier){ + tiers.pop(); + edit.pop(); + } + else { + edit[key] = false; + } + this.setState({ + tiers: tiers, + edit: edit, + new_tier: undefined + }) + } + + newTier = () => { + if (this.state.new_tier !== undefined){ + this.props.showNotification("请先完成当前编辑") + return; + } + + let {tiers, edit} = this.state; + tiers.push({tier: 1, description: ""}) + edit.push(true); + this.setState({ + tiers: tiers, + edit: edit, + new_tier: tiers.length - 1, + }) + } + + deleteTier = (item, key, e) => { + // TODO: 此处向后端发送请求删除 + let {tiers, edit} = this.state; + + let url = `/sponsor_tiers/${item.id}.json`; + + axios + .delete(url) + .then((result) => { + tiers.splice(key, 1) + edit.splice(key, 1) + this.setState({ + tiers: tiers, + edit: edit, + }) + this.props.showNotification("删除成功"); + }) + .catch((error) => { + console.log(error); + this.props.showNotification("删除失败"); + }) + } + + toConformation = (item, key, e) => { + const {user} = this.props; + this.setState({ + route_type: undefined + }) + this.props.history.push(`/sponsor_confirmation/${user && user.login}/${item.id}`) + } + + visitorTemplate = (item, key) => { + return ( +
    + +
    + {item.tier}  硬币 + +
    +
    + {item.description} +
    +
+ ); + } + + manageTemplate = (item, key) => { + return ( +
+
+ {item.tier}  硬币 + + this.deleteTier(item, key, e)} + // onCancel={cancel} + okText="是" + cancelText="否" + > + + + + this.editTier(item, key, e)}> + +
+
+ {item.description} + +
+
+ ); + } + + editTemplate = (item, key) => { + return ( +
+ this.formRef = form} + /> + + +
+ ); + } + + render() { + const {tiers} = this.state; + const { current_user} = this.props; + const {user} = this.props; + + // console.log("item state tiers:", tiers); + // console.log("item props tiers:", this.props.tiers); + + const renderList = ( + tiers && tiers.length > 0 ? tiers.map((item, key) => { + const tier = this.state.edit[key]? ():item.tier; + const description = this.state.edit[key]? ():item.description; + + var content = ""; + if (current_user && user && user.login !== current_user.login){ + content = this.visitorTemplate(item, key); + } + else if(current_user && user && user.login === current_user.login && this.state.edit[key]){ + content = this.editTemplate(item, key); + } + else if(current_user && user && user.login === current_user.login && !this.state.edit[key]){ + content = this.manageTemplate(item, key); + } + + // return ( + //
    + + //
    + // 金额:{amount} + // {current_user && user && user.login === current_user.login ? + // // ( this.editTier(item)}/> + // ( this.editTier(item, key, e)}>): + // } + //
    + //
    + // 描述:{description} + // {current_user && user && user.login === current_user.login ? + // ():""} + //
    + //
+ + // ) + return content; + }) : "" + ); + return ( +
+
+

选择您的赞助等级

+ {/* */} + {renderList} +
+ {current_user && user && user.login === current_user.login ? + ( ): + "" + } +
+ ) + } +} + + +export default SponsorTierItem; \ No newline at end of file diff --git a/src/forge/users/Infos.js b/src/forge/users/Infos.js index b88cd5a82..dd5d18010 100644 --- a/src/forge/users/Infos.js +++ b/src/forge/users/Infos.js @@ -45,6 +45,19 @@ const UndoEvents = Loadable({ loader: () => import("./undo_events"), loading: Loading, }) +const Wallet = Loadable({ + loader: () => import("./sponsor/wallet"), + loading: Loading, +}); +const SponsorManagement = Loadable({ + loader: () => import("./sponsor/SponsorManagement"), + loading: Loading, +}); +const SponsorDataCharts = Loadable({ + loader: () => import("./sponsor/communityData"), + loading: Loading, +}); + class Infos extends Component { constructor(props) { super(props); @@ -52,7 +65,10 @@ class Infos extends Component { isSpin: false, user: undefined, project_type: undefined, - route_type: undefined + route_type: undefined, + c: undefined, + sponsor_management: undefined, + choose_chart: undefined, }; } @@ -87,7 +103,10 @@ class Infos extends Component { change_project_type = (type) => { const {user} = this.state this.setState({ - project_type: type , + project_type: type, + choose_wallet: false, + sponsor_management: undefined, + choose_chart: undefined, route_type: undefined }) let url = `/users/${user && user.login}` @@ -129,10 +148,63 @@ class Infos extends Component { this.props.history.push(`/users/${user && user.login}/organizes`) } + sponsor_link = () => { + const {user} = this.state + this.setState({ + route_type: undefined + }) + this.props.history.push(`/sponsor/${user && user.login}`) + } + + sponsor_management_link = () => { + const {user} = this.state + this.setState({ + route_type: undefined, + sponsor_management: true, + project_type: undefined, + choose_wallet: undefined, + choose_chart: undefined, + }) + this.props.history.push(`/users/${user && user.login}/sponsor_management`) + } + + wallet_link = () => { + const {user} = this.state + this.setState({ + project_type: undefined, + choose_wallet: true, + route_type: undefined, + sponsor_management: undefined, + choose_chart: undefined, + }) + this.props.history.push(`/users/${user && user.login}/wallet`) + } + + sponsor_setting_link = () => { + const {user} = this.state + this.setState({ + route_type: undefined + }) + this.props.history.push(`/users/${user && user.login}/sponsor_setting`) + } + + sponsor_statistic = () => { + const {user} = this.state + this.setState({ + project_type: undefined, + choose_wallet: undefined, + route_type: undefined, + sponsor_management: undefined, + choose_chart: true + }) + this.props.history.push(`/users/${user && user.login}/sponsor_community_data`) + } render() { const { current_user, mygetHelmetapi } = this.props; - const { user, isSpin, project_type, route_type } = this.state; + const { user, isSpin, project_type, route_type, choose_wallet, choose_chart, sponsor_management } = this.state; + // console.log("current", current_user) + // console.log("user", user) return (
@@ -155,10 +227,10 @@ class Infos extends Component {
{user && current_user && user.login === current_user.login && ( -
+
+ +
+ )} {current_user && user && user.login !== current_user.login && (
@@ -180,6 +261,13 @@ class Infos extends Component { fontClass={"font-14 ml5"} starText={"关注TA"} /> +
)}
@@ -291,7 +379,56 @@ class Infos extends Component {

-
*/} +
*/} + {current_user && user && user.login == current_user.login && ( + +
+
    +
  • + + 赞助管理 + +
  • +
  • this.wallet_link()}> +

    + 我的钱包 + + {/* {user && user.common_projects_count} */} + +

    +
  • +
  • this.sponsor_management_link()}> +

    + 赞助管理 + + {/* {user && user.sync_mirror_projects_count} */} + +

    +
  • +
+
+ )} + + {current_user && user && user.login == current_user.login && current_user.admin &&( + +
+
    +
  • + + 社区统计信息 + +
  • +
  • this.sponsor_statistic()}> +

    + 赞助信息统计 + + {/* {user && user.common_projects_count} */} + +

    +
  • +
+
+ )}
{user && ( @@ -309,6 +446,24 @@ class Infos extends Component { return ; }} > + { + return ; + }} + > + { + return ; + }} + > + { + return ; + }} + > { diff --git a/src/forge/users/new_user.css b/src/forge/users/new_user.css index fc914e7d6..31c76b47c 100644 --- a/src/forge/users/new_user.css +++ b/src/forge/users/new_user.css @@ -28,10 +28,15 @@ .mt-n15{margin-top: -15px;} .position-relative{position: relative;} .mr-5{margin-right: 5px;} +.mt-5{margin-top: 5px;} +.ml-5{margin-left: 5px;} a.text-button-grey{ color: rgba(0, 0, 0, 0.65) } -.user-info-star-button{margin: 20px 50px 0 50px} +.user-info-star-button{ + display: flex; + margin: 20px 20px 0 20px +} .list-l-p{ width: 100%; display: -ms-flexbox; diff --git a/src/forge/users/sponsor/CoinChangeItem.js b/src/forge/users/sponsor/CoinChangeItem.js new file mode 100644 index 000000000..820aa8f4e --- /dev/null +++ b/src/forge/users/sponsor/CoinChangeItem.js @@ -0,0 +1,45 @@ +import React, { Component } from 'react'; +import { Tooltip } from 'antd'; +import '../../css/index.scss' +import '../../Main/list.css'; + +class CoinChangeItem extends Component { + TurnToDetail = (login, url) => { + this.props.history.push({ + pathname: url, + state: login + }) + } + render() { + const { coinChanges, current_user } = this.props; + const renderList = ( + coinChanges && coinChanges.length > 0 ? coinChanges.map((item, key) => { + let url = current_user && item.to_user_login == current_user.login? `/users/${item.from_user_login}`:`/users/${item.to_user_login}`; + return ( +
+
+

金额:{current_user && item.to_user_login == current_user.login? "收入":"支出"}{item.amount}硬币

+

变动原因:{item.reason}

+ {/*

备注:{item.description}

*/} + +
+ + {item.date} + {current_user && item.to_user_login == current_user.login? + ({item.from_user}): + ({item.to_user})} + +
+
+
+ ) + }) : "" + ) + return ( +
+ {renderList} +
+ ) + } +} +export default CoinChangeItem; \ No newline at end of file diff --git a/src/forge/users/sponsor/SponsorManagement.js b/src/forge/users/sponsor/SponsorManagement.js new file mode 100644 index 000000000..5848c8d97 --- /dev/null +++ b/src/forge/users/sponsor/SponsorManagement.js @@ -0,0 +1,309 @@ +import React, { Component } from "react"; +import { Link } from "react-router-dom"; +import { Menu, Input, Spin, Pagination, Popover, Button, Divider } from "antd"; +import SponsorBarCharts from "./charts/sponsorBarChart"; +import SponsorPieCharts from "./charts/sponsorPieChart"; + +import axios from "axios"; +import CoinChangeItem from "./CoinChangeItem"; +import Nodata from "../../Nodata"; +import img_array from "../../Images/array.png"; +import SponsorList from "./sponsor_list"; +import "../../sponsor/sponsor.css"; + +// import "../new_user.css"; +// const Search = Input.Search; + +// const tempData = [ +// {image_url: "avatars/User/b", username: "万山川", user_id: 1369, visible: true, sponsor: false, login:"alpc104", start_time: "2020-08-01", stop_time: "-", amount: 100}, +// {image_url: "avatars/User/b", username: "万山川", user_id: 1369, visible: true, sponsor: true, login:"alpc104", start_time: "2020-08-01", stop_time: "-", amount: 100}, +// {image_url: "avatars/User/b", username: "万山川", user_id: 1369, visible: false, sponsor: false, login:"alpc104", start_time: "2020-08-01", stop_time: "-", amount: 100}, +// {image_url: "avatars/User/b", username: "万山川", user_id: 1369, visible: false, sponsor: true, login:"alpc104", start_time: "2020-08-01", stop_time: "-", amount: 100}, +// {image_url: "avatars/User/b", username: "万山川", user_id: 1369, visible: false, sponsor: false, login:"alpc104", start_time: "2020-08-01", stop_time: "-", amount: 100}, +// {image_url: "avatars/User/b", username: "万山川", user_id: 1369, visible: false, sponsor: false, login:"alpc104", start_time: "2020-08-01", stop_time: "2020-09-05", amount: 100}, +// {image_url: "avatars/User/b", username: "万山川", user_id: 1369, visible: false, sponsor: true, login:"alpc104", start_time: "2020-08-01", stop_time: "2020-09-05", amount: 100}, +// {image_url: "avatars/User/b", username: "万山川", user_id: 1369, visible: false, sponsor: false, login:"alpc104", start_time: "2020-08-01", stop_time: "2020-09-05", amount: 100}, +// {image_url: "avatars/User/b", username: "万山川", user_id: 1369, visible: false, sponsor: false, login:"alpc104", start_time: "2020-08-01", stop_time: "2020-09-05", amount: 100}, +// {image_url: "avatars/User/b", username: "万山川", user_id: 1369, visible: false, sponsor: false, login:"alpc104", start_time: "2020-08-01", stop_time: "2020-09-05", amount: 100}, +// {image_url: "avatars/User/b", username: "万山川", user_id: 1369, visible: false, sponsor: false, login:"alpc104", start_time: "2020-08-01", stop_time: "2020-09-05", amount: 100}, +// ]; + + +class SponsorManagement extends Component{ + + constructor(props) { + super(props); + this.state = { + page: 1, + limit: 15, + sort_by: undefined, + totalCount: undefined, + isSpin: false, + total: undefined, + category: "sponsoring", + is_sponsor: false, + sponsors: undefined, + displayList: undefined, + chartsData: {income:[], outcome:[]}, + }; + } + + changeCategory = (cate) => { + this.setState({ + category: cate.target.value, + page: 1, + }, ()=>{ + if(this.state.category === "chart") + this.get_chart_data(); + else + this.get_sponsors(); + }); + // if(cate.target.value === "chart"){ + // this.setState({ + // category: cate.target.value, + // page: 1, + // }); + // } + // else{ + // this.setState({ + // category: cate.target.value, + // page: 1, + // }, ()=>{this.get_sponsors();}); + // } + }; + + componentDidMount = () => { + this.get_sponsors(); + } + + get_chart_data = () => { + this.setState({ + isSpin: true + }) + + let url = `/wallets/balance_chart.json`; + const {current_user} = this.props; + let user_id = current_user && current_user.user_id; + if (current_user){ + axios.get(url, { + params: { + id: user_id, + sponsor: true, + }}) + .then((result) => { + this.setState({ + chartsData: result.data, + isSpin: false, + }) + }) + .catch((error) => { + console.log(error); + this.setState({ + isSpin: false, + }); + }); + } + }; + + get_sponsors = ()=>{ + const user_id = this.props.current_user.user_id; + + let url = this.state.is_sponsor? `sponsoring`:`sponsored`; + url = this.state.category === "stopped"? `stopped_` + url: url; + url = `/sponsorships/` + url + `.json`; + + const {page, limit} = this.state; + this.setState({ + isSpin: true + }) + axios.get(url, { + params: { + id: user_id, + page: page, + limit: limit, + }}) + .then((result) => { + // console.log(result); + this.setState({ + displayList: result.data.sponsorships, + total: result.data.count, + isSpin: false, + }) + }) + .catch((error) => { + console.log(error); + this.setState({ + isSpin: false, + }); + }); + // this.setState({ + // sponsors: tempData, + // displayList: tempData, + // }) + } + + //切换页数 + changePage = (page) => { + this.setState({ + page: page + }, ()=>{this.get_sponsors()}) + }; + + // 排序 + ChangeSoryBy = (e) => { + console.log(e.key) + }; + + changeSearchValue = (e) => { + this.setState({ + search: e.target.value, + }); + }; + + menu =()=> ( + + 时间从近到远排序 + 时间从远到近排序 + + ); + + category_button=(category)=>{ + const { current_user, user } = this.props; + const button_lists = + user && current_user && user.login === current_user.login + ? [ + { type: "sponsoring", name: "赞助中" }, + { type: "stopped", name: "已终止" }, + { type: "chart", name: "统计图表" }, + ] + : + []; + + let list = button_lists.map((item, key) => { + return ( + + + + ); + }) + return list; + } + + changeStatus=(check_is_sponsor, e)=>{ + // const {is_sponsor} = this.state + // const new_is_sponsor = is_sponsor === check_is_sponsor ? undefined : check_is_sponsor + // this.state.is_sponsor = check_is_sponsor; + this.setState({ + is_sponsor: check_is_sponsor, + page: 1, + }, ()=>{ + if(this.state.category === "chart") + this.get_chart_data(); + else + this.get_sponsors(); + }); + } + + render() { + const { current_user, user } = this.props; + const { category , is_sponsor, sponsors, displayList, chartsData} = this.state; + const {isSpin, total, search, limit, page }= this.state; + // console.log(displayList); + const sponsorList = displayList && displayList.length > 0 ? + + : + + + const chartComponent =
+

七天内赞助{this.state.is_sponsor?"支出":"收入"}图

+ + {/*

七天内赞助{this.state.is_sponsor?"支出":"收入"}图

+ */} +
+ + const displayComponent = category==="chart"?chartComponent + : + sponsorList; + + return ( + //
+ + {/*
*/} + {/* */} + {/* */} + {/*
*/} +
+
{this.category_button(category)}
+ { + user && current_user && user.login === current_user.login ? +
+ this.changeStatus(true, e)}>我赞助的 + { + !is_sponsor ? ():"" + } + this.changeStatus(false, e)}>赞助我的 +
+ :"" + } +
+ {user && current_user && user.login === current_user.login? + displayComponent: + } + { + total && total > limit && category!="chart"? +
+ +
+ : + "" + } +
+ //
+ ); + } +}; + +export default SponsorManagement; \ No newline at end of file diff --git a/src/forge/users/sponsor/charts/coinChangeCharts.js b/src/forge/users/sponsor/charts/coinChangeCharts.js new file mode 100644 index 000000000..b31919881 --- /dev/null +++ b/src/forge/users/sponsor/charts/coinChangeCharts.js @@ -0,0 +1,77 @@ +import React, { Component } from 'react'; +import {XYPlot, VerticalBarSeries, VerticalGridLines, HorizontalGridLines, XAxis, YAxis, Crosshair, DiscreteColorLegend} from 'react-vis'; +// import DiscreteColorLegend from 'legends/discrete-color-legend'; +import "./style.scss"; + +// const ONE_DAY = 86400000; +// const d = new Date().getTime()-ONE_DAY*7; + +// const data = [ +// {x: new Date(d+ONE_DAY).toLocaleDateString(), y: 8}, +// {x: new Date(d+ONE_DAY*2).toLocaleDateString(), y: 5}, +// {x: new Date(d+ONE_DAY*3).toLocaleDateString(), y: 4}, +// {x: new Date(d+ONE_DAY*4).toLocaleDateString(), y: 9}, +// {x: new Date(d+ONE_DAY*5).toLocaleDateString(), y: 2}, +// {x: new Date(d+ONE_DAY*6).toLocaleDateString(), y: 7}, +// {x: new Date(d+ONE_DAY*7).toLocaleDateString(), y: 2}, +// ]; + +// const data2 = [ +// {x: new Date(d+ONE_DAY).toLocaleDateString(), y: 2}, +// {x: new Date(d+ONE_DAY*2).toLocaleDateString(), y: 3}, +// {x: new Date(d+ONE_DAY*3).toLocaleDateString(), y: 1}, +// {x: new Date(d+ONE_DAY*4).toLocaleDateString(), y: 5}, +// {x: new Date(d+ONE_DAY*5).toLocaleDateString(), y: 4}, +// {x: new Date(d+ONE_DAY*6).toLocaleDateString(), y: 0}, +// {x: new Date(d+ONE_DAY*7).toLocaleDateString(), y: 2}, +// ]; + +const ITEMS = [ + {title: '收入', strokeWidth: 13}, + {title: '支出', strokeWidth: 13} +]; + +class CoinChangeCharts extends Component { + constructor(props) { + super(props); + this.state = { + crosshairValues: [] + }; + // console.log(this.props); + } + + render() { + const {chartsData} = this.props; + if(chartsData == undefined){ + return (
); + } + var max = 0; + for(var i=0; i + + + + + + + + + + +
+ ); + } +} + +export default CoinChangeCharts; diff --git a/src/forge/users/sponsor/charts/sponsorBarChart.js b/src/forge/users/sponsor/charts/sponsorBarChart.js new file mode 100644 index 000000000..90494c688 --- /dev/null +++ b/src/forge/users/sponsor/charts/sponsorBarChart.js @@ -0,0 +1,79 @@ +import React, { Component } from 'react'; +import {XYPlot, VerticalBarSeries, VerticalGridLines, HorizontalGridLines, XAxis, YAxis, Crosshair, DiscreteColorLegend} from 'react-vis'; +// import DiscreteColorLegend from 'legends/discrete-color-legend'; +import "./style.scss"; + +const ONE_DAY = 86400000; +const d = new Date().getTime()-ONE_DAY*7; + +const data = [ + {x: new Date(d+ONE_DAY).toLocaleDateString(), y: 6}, + {x: new Date(d+ONE_DAY*2).toLocaleDateString(), y: 3}, + {x: new Date(d+ONE_DAY*3).toLocaleDateString(), y: 2}, + {x: new Date(d+ONE_DAY*4).toLocaleDateString(), y: 7}, + {x: new Date(d+ONE_DAY*5).toLocaleDateString(), y: 0}, + {x: new Date(d+ONE_DAY*6).toLocaleDateString(), y: 5}, + {x: new Date(d+ONE_DAY*7).toLocaleDateString(), y: 0}, +]; + +const data2 = [ + {x: new Date(d+ONE_DAY).toLocaleDateString(), y: 3}, + {x: new Date(d+ONE_DAY*2).toLocaleDateString(), y: 4}, + {x: new Date(d+ONE_DAY*3).toLocaleDateString(), y: 2}, + {x: new Date(d+ONE_DAY*4).toLocaleDateString(), y: 6}, + {x: new Date(d+ONE_DAY*5).toLocaleDateString(), y: 5}, + {x: new Date(d+ONE_DAY*6).toLocaleDateString(), y: 1}, + {x: new Date(d+ONE_DAY*7).toLocaleDateString(), y: 3}, +]; + +const ITEMS = [ + {title: '收入', strokeWidth: 13}, + {title: '支出', strokeWidth: 13} +]; + +class SponsorBarCharts extends Component { + constructor(props) { + super(props); + this.state = { + crosshairValues: [] + }; + console.log(this.props) + } + + componentWillReceiveProps = () => { + this.setState({ + crosshairValues: [] + }) + } + + render() { + const chartsData = this.props.is_sponsor?this.props.data.outcome:this.props.data.income; + var max = 0; + for(var i=0; i + {/* */} + + + + + + + + +
+ ); + } +} + +export default SponsorBarCharts; \ No newline at end of file diff --git a/src/forge/users/sponsor/charts/sponsorPieChart.js b/src/forge/users/sponsor/charts/sponsorPieChart.js new file mode 100644 index 000000000..82a15f612 --- /dev/null +++ b/src/forge/users/sponsor/charts/sponsorPieChart.js @@ -0,0 +1,70 @@ +import React, { Component } from 'react'; +import {FlexibleXYPlot, RadialChart, VerticalGridLines, HorizontalGridLines, XAxis, YAxis, Crosshair, DiscreteColorLegend} from 'react-vis'; +// import DiscreteColorLegend from 'legends/discrete-color-legend'; +import "./style.scss"; + +const data = [ + {label: "张三", angle: 1}, + {label: "李四", angle: 2}, + {label: "王五", angle: 5}, + {label: "赵六", angle: 3}, +]; + +const data2 = [ + {label: "张三", angle: 2}, + {label: "林磊", angle: 1}, + {label: "赵辉", angle: 4}, +]; + +const ITEMS = [ + {title: '收入', color: 'powderblue', strokeWidth: 13}, + {title: '支出', color: 'powderblue', strokeWidth: 13} +]; + +class SponsorPieCharts extends Component { + constructor(props) { + super(props); + this.state = { + crosshairValues: [] + }; + } + + componentWillReceiveProps = () => { + this.setState({ + crosshairValues: [] + }) + } + + render() { + const DATA = this.props.is_sponsor?data2:data; + // const DATA = [{angle: 1}, {angle: 5}, {angle: 2}] + + return ( +
+ {/* */} + {/* */} + {/* + + + */} + + + {/* */} +
+ ); + } +} + +export default SponsorPieCharts; \ No newline at end of file diff --git a/src/forge/users/sponsor/charts/style.scss b/src/forge/users/sponsor/charts/style.scss new file mode 100644 index 000000000..79f09ff3c --- /dev/null +++ b/src/forge/users/sponsor/charts/style.scss @@ -0,0 +1,5 @@ +@import "react-vis/dist/styles/plot.scss"; +@import "react-vis/dist/styles/examples.scss"; +@import "react-vis/dist/styles/legends.scss"; +@import "react-vis/dist/styles/radial-chart.scss"; +@import "react-vis/dist/styles/treemap.scss"; \ No newline at end of file diff --git a/src/forge/users/sponsor/communityData.js b/src/forge/users/sponsor/communityData.js new file mode 100644 index 000000000..53d4124c7 --- /dev/null +++ b/src/forge/users/sponsor/communityData.js @@ -0,0 +1,133 @@ +import React, { Component } from 'react'; +import {XYPlot, VerticalBarSeries, LineSeries, VerticalGridLines, HorizontalGridLines, XAxis, YAxis, Crosshair, DiscreteColorLegend} from 'react-vis'; +// import DiscreteColorLegend from 'legends/discrete-color-legend'; +import "./charts/style.scss"; +import "../../Main/list.css"; +import "../../UsersList/list.css"; +import "../../sponsor/sponsor.css"; +import "../new_user.css" +import axios from "axios"; +import { isSupported } from 'clipboard'; + +const ITEMS = [ + {title: '资助者数量', strokeWidth: 13}, + {title: '受资助人数', strokeWidth: 13}, +]; + +class SponsorDataCharts extends Component { + constructor(props) { + super(props); + this.state = { + crosshairValues: [], + sponsor: [], + sponsored: [], + nums: [], + }; + } + + componentDidMount = () => { + this.get_chart_data(); + } + + get_chart_data = () => { + this.setState({ + isSpin: true + }) + + let url = `/sponsorships/community_data.json`; + axios.get(url) + .then((result) => { + this.setState({ + sponsor: result.data.sponsor, + sponsored: result.data.sponsored, + isSpin: false, + }) + }) + .catch((error) => { + console.log(error); + this.setState({ + isSpin: false, + }); + }); + + url = `/wallets/community_data.json`; + axios.get(url) + .then((result) => { + this.setState({ + nums: result.data, + isSpin: false, + }) + }) + .catch((error) => { + console.log(error); + this.setState({ + isSpin: false, + }); + }); + }; + + componentWillReceiveProps = () => { + this.setState({ + crosshairValues: [] + }) + } + + render() { + // const DATA = this.props.is_sponsor?data2:data; + const {sponsor, sponsored, nums} = this.state; + var max1 = 0; + for(var i=0; i +

平台资助者/受资助人数

+ + + + + + + + + +

平台资助交易数量

+ + + + + + + + + ); + } +} + +export default SponsorDataCharts; \ No newline at end of file diff --git a/src/forge/users/sponsor/sponsor_list.js b/src/forge/users/sponsor/sponsor_list.js new file mode 100644 index 000000000..2e6bb5b2c --- /dev/null +++ b/src/forge/users/sponsor/sponsor_list.js @@ -0,0 +1,103 @@ +import React, { Component } from "react"; +import { getImageUrl } from "educoder"; +import FocusButton from "../../UsersList/focus_button"; +import { Button, message, Popconfirm } from "antd"; +import "../../Main/list.css"; +import "../../UsersList/list.css"; +import "../../sponsor/sponsor.css"; +import "../new_user.css" +import axios from "axios"; +import { Link } from "react-router-dom"; +class SponsorList extends Component { + + stop_sponsorship = (item, key, e)=>{ + + // console.log("before: ", this.state.users); + let url = `/sponsorships/${item.id}.json`; + axios.delete(url) + .then((result) => { + console.log(result); + // this.props.showNotification("终止成功") + if(result && result.data.status == 1){ + this.props.showNotification(result.data.message); + this.props.rerender(); + } + }) + .catch((error) => { + console.log(error); + this.props.showNotification("失败"); + }) + } + + to_sponsor_page = (item, key, e) => { + this.props.history.push(`/sponsor/${item.login}`); + } + + renderList = (users, userClass, current_user) => { + + if (users && users.length > 0) { + return users.map((item, key) => { + // console.log(item); + return ( +
+ {/*
+ + + +
*/} + + + +
+ {item && item.username} +
+ 金额:{item.amount}硬币 + 累计金额:{item.accumulate}硬币 +
+ +
+ + {item.start_time} - {item.stop_time? item.stop_time:"现在"} + + +
+
+
+ {item.stop_time? "":( + this.stop_sponsorship(item, key, e)} + // onCancel={cancel} + okText="是" + cancelText="否" + > + + + )} + {!item.stop_time && item.sponsor_id==current_user.user_id? ( + + ):""} +
+
+ ); + }); + } else{ + return null; + } + } + render() { + const { users, userClass, current_user } = this.props; + return ( +
{this.renderList(users, userClass, current_user)}
+ + ); + } +} + +export default SponsorList; diff --git a/src/forge/users/sponsor/wallet.js b/src/forge/users/sponsor/wallet.js new file mode 100644 index 000000000..992d8a8d3 --- /dev/null +++ b/src/forge/users/sponsor/wallet.js @@ -0,0 +1,272 @@ +import React, { Component } from "react"; +import { Link } from "react-router-dom"; +import { Menu, Input, Spin, Pagination, Popover, Button, Divider } from "antd"; + +import axios from "axios"; +import CoinChangeItem from "./CoinChangeItem"; +import Nodata from "../../Nodata"; +import img_array from "../../Images/array.png"; +import CoinChangeCharts from "./charts/coinChangeCharts"; +const Search = Input.Search; + +const tempData = [ + {amount: -3, description: "des", reasons: "no reason", to_user: "串串", date: "2016年1月5日"}, + {amount: 3, description: "des", reasons: "no reason", to_user: "串串", date: "2016年1月5日"}, + {amount: -3, description: "des", reasons: "no reason", to_user: "串", date: "2016年1月5日"}, + {amount: 3, description: "des", reasons: "no reason", to_user: "串串", date: "2016年1月5日"}, + {amount: -3, description: "des", reasons: "no reason", to_user: "串串", date: "2016年1月5日"}, + {amount: 3, description: "des", reasons: "no reason", to_user: "串串", date: "2016年1月5日"}, + {amount: -3, description: "des", reasons: "no reason", to_user: "串串", date: "2016年1月5日"}, + {amount: 3, description: "des", reasons: "no reason", to_user: "串串", date: "2016年1月5日"}, + {amount: -3, description: "des", reasons: "no reason", to_user: "串串", date: "2016年1月5日"} +]; + +class Wallet extends Component { + constructor(props) { + super(props); + this.state = { + page: 1, + limit: 10, + sort_by: "desc", + isSpin: false, + coinChangeList: undefined, + displayList: undefined, + total: undefined, + category: "all", + balance: 50, + saerch: undefined, + chartsData: {income:[], outcome:[]}, + }; + } + + componentDidMount = () => { + this.get_coin_changes(); + }; + + componentDidUpdate = () => { + // this.get_coin_changes() + }; + + componentWillReceiveProps = () => { + if (this.props.current_user) + this.get_coin_changes(); + } + + get_chart_data = () => { + this.setState({ + isSpin: true + }) + + let url = `/wallets/balance_chart.json`; + const {current_user} = this.props; + let user_id = current_user && current_user.user_id; + if (current_user){ + axios.get(url, { + params: { + id: user_id, + }}) + .then((result) => { + this.setState({ + chartsData: result.data, + isSpin: false, + }) + }) + .catch((error) => { + console.log(error); + this.setState({ + isSpin: false, + }); + }); + } + }; + + get_coin_changes = () => { + this.setState({ + isSpin: true + }) + + let url = `/wallets/coin_changes.json`; + const {category, sort_by, page, limit} = this.state; + const {current_user} = this.props; + let user_id = current_user && current_user.user_id; + if (current_user){ + axios.get(url, { + params: { + id: user_id, + category: category, + sort_direction: sort_by, + page: page, + limit: limit, + }}) + .then((result) => { + // console.log(result); + this.setState({ + coinChangeList: result.data.coin_changes, + displayList: result.data.coin_changes, + total: result.data.count, + balance: result.data.balance, + isSpin: false, + }) + }) + .catch((error) => { + console.log(error); + this.setState({ + isSpin: false, + }); + }); + } + }; + + changeCategory = (cate) => { + if(cate.target.value == "charts"){ + // console.log("charts"); + this.setState({ + category: cate.target.value, + page: 1, + }, ()=> {this.get_chart_data();}); + return ; + } + else{ + this.setState({ + category: cate.target.value, + page: 1, + }, ()=> {this.get_coin_changes();}); + } + }; + + //切换页数 + changePage = (page) => { + this.setState({ + page: page + }, ()=>{this.get_coin_changes();}) + }; + + // 排序 + ChangeSoryBy = (e) => { + this.setState({ + sort_by: e.key, + page: 1, + }, ()=>{this.get_coin_changes();}) + // this.get_coin_changes(); + console.log(e.key); + }; + + changeSearchValue = (e) => { + this.setState({ + search: e.target.value, + }); + }; + + menu =()=> ( + + 时间从近到远排序 + 时间从远到近排序 + + ); + + category_button=(category)=>{ + const { current_user, user } = this.props; + const button_lists = + user && current_user && user.login === current_user.login + ? [ + { type: "all", name: "所有" }, + { type: "income", name: "收入" }, + { type: "outcome", name: "支出" }, + { type: "charts", name: "查看统计" }, + ] + : + []; + + let list = button_lists.map((item, key) => { + return ( + + + + ); + }) + return list; + } + + render() { + const { current_user, user } = this.props; + const { category , sort_by, chartsData } = this.state; + const { displayList, coinChangeList, isSpin, total, search, limit, page, balance} = this.state; + + const coinChangeItem = displayList && displayList.length > 0 ? + : + ; + + const displayComponent = + category === "charts"? + : + coinChangeItem; + + return ( + +
+ {/* */} + +
+
余额:{balance}
+
+
{this.category_button(category)}
+ +
+ {user && current_user && user.login === current_user.login? + displayComponent + : + + } + { + total && total > limit && category != "charts"? +
+ +
+ : + "" + } +
+ ); + } +} +export default Wallet; diff --git a/src/modules/user/LoginRegisterComponent.js b/src/modules/user/LoginRegisterComponent.js index db369458b..8dc05405e 100644 --- a/src/modules/user/LoginRegisterComponent.js +++ b/src/modules/user/LoginRegisterComponent.js @@ -475,10 +475,12 @@ class LoginRegisterComponent extends Component { if (this.state.codes === undefined || this.state.codes == ""||this.state.codes.length===0) { // this.openNotification(`请输入验证码`,2); - this.setState({ - Phonenumberisnotcosyzm:"验证码不能为空", - }) - return + /***** + // this.setState({ + // Phonenumberisnotcosyzm:"验证码不能为空", + // }) + // return + ******/ } else if (this.state.passwords === undefined || this.state.passwords == "" ||this.state.passwords.length===0) { this.setState({ Phonenumberisnotcosymmm:"密码不能为空", @@ -503,16 +505,18 @@ class LoginRegisterComponent extends Component { if(this.props.weixinlogin){ url= '/weapps/register.json'; }else{ - url = "/accounts/register.json"; + url = "/accounts/remote_register.json"; } axios.post(url, { - login: this.state.logins, + // login: this.state.logins, + email: this.state.logins, password: this.state.passwords, - code: this.state.codes, + username: this.state.codes, + platform: "forge" }).then((result) => { if(result){ - if(result.data.status===-2){ + if(result.data.status!=0){ if(result.data.message==="验证码不正确"){ this.setState({ Phonenumberisnotcosyzm:"验证码不正确", @@ -1181,12 +1185,12 @@ class LoginRegisterComponent extends Component { onfocus="this.removeAttribute('readonly')" style={{ width:'210px', height:'38px', - }} placeholder="请输入验证码" + }} placeholder="请输入用户名" onChange={this.codesonChange} value={codes} > - { + {/* { getverificationcodes === undefined ? @@ -1196,7 +1200,7 @@ class LoginRegisterComponent extends Component { : - } + } */}